{"total_rows":13314,"offset":0,"rows":[
{"id":"0x21","key":"0x21","value":{"rev":"3-0e422a52b4902ef18228b4443d0da70b"},"doc":{"_id":"0x21","_rev":"3-0e422a52b4902ef18228b4443d0da70b","name":"0x21","description":"0x21 === `!`","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"0x21","version":"0.0.1","description":"0x21 === `!`","keywords":["0x21","!","bang"],"author":{"name":"cfddream","email":"cfddream@gmail.com","url":"http://kissdry.com/"},"license":"MIT","repository":{},"scripts":{},"dependencies":{},"devDependencies":{},"_id":"0x21@0.0.1","dist":{"shasum":"9f3a1288040c3b46185cfbece5354f637dd57d01","tarball":"http://registry.npmjs.org/0x21/-/0x21-0.0.1.tgz"},"readme":"","maintainers":[{"name":"cfddream","email":"cfddream@gmail.com"}]}},"readme":"","maintainers":[{"name":"cfddream","email":"cfddream@gmail.com"}],"time":{"modified":"2012-07-14T10:34:02.401Z","created":"2012-07-14T10:33:57.485Z","0.0.1":"2012-07-14T10:34:02.401Z"},"author":{"name":"cfddream","email":"cfddream@gmail.com","url":"http://kissdry.com/"},"repository":{},"_attachments":{"0x21-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-w+yrlYHmf+Q+qQ2Fk1R/2Q==","length":288,"stub":true}}}},
{"id":"0x23","key":"0x23","value":{"rev":"3-d7b130f651916edf701aaf6961146a8b"},"doc":{"_id":"0x23","_rev":"3-d7b130f651916edf701aaf6961146a8b","name":"0x23","description":"0x23 === `#`","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"0x23","version":"0.0.1","description":"0x23 === `#`","keywords":["0x23","#","hash"],"author":{"name":"cfddream","email":"cfddream@gmail.com","url":"http://kissdry.com/"},"license":"MIT","repository":{},"scripts":{},"dependencies":{},"devDependencies":{},"_id":"0x23@0.0.1","dist":{"shasum":"f09bdb082fd189cbe72105d3e7f7a8ac1a57bf52","tarball":"http://registry.npmjs.org/0x23/-/0x23-0.0.1.tgz"},"readme":"","maintainers":[{"name":"cfddream","email":"cfddream@gmail.com"}]}},"readme":"","maintainers":[{"name":"cfddream","email":"cfddream@gmail.com"}],"time":{"modified":"2012-07-14T10:32:31.006Z","created":"2012-07-14T10:32:26.239Z","0.0.1":"2012-07-14T10:32:31.006Z"},"author":{"name":"cfddream","email":"cfddream@gmail.com","url":"http://kissdry.com/"},"repository":{},"_attachments":{"0x23-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9iCT5BJKeAjD5AruzUoeZQ==","length":289,"stub":true}}}},
{"id":"163","key":"163","value":{"rev":"3-4b4abf47813944b1f51b883c45f6a1c9"},"doc":{"_id":"163","_rev":"3-4b4abf47813944b1f51b883c45f6a1c9","name":"163","description":"hi baidu","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"163","version":"0.0.0","description":"hi baidu","main":"index.js","repository":"","author":"","license":"BSD","readme":"hi baidu\n","_id":"163@0.0.0","dist":{"shasum":"a8a85f11c6e01a7b45c1d8e0d7823f830bc766b2","tarball":"http://registry.npmjs.org/163/-/163-0.0.0.tgz"},"maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}]}},"readme":"hi baidu\n","maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}],"time":{"modified":"2012-08-10T01:48:25.287Z","created":"2012-08-10T01:48:16.891Z","0.0.0":"2012-08-10T01:48:25.287Z"},"_attachments":{"163-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9evVT1IdL6rY4O7D9yteIQ==","length":253,"stub":true}}}},
{"id":"2","key":"2","value":{"rev":"3-29bbce00b94f24702b67b9f0d333d90e"},"doc":{"_id":"2","_rev":"3-29bbce00b94f24702b67b9f0d333d90e","name":"2","description":"hello er","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"2","version":"0.0.1","description":"hello er","_id":"2@0.0.1","readme":"ERROR: No README.md file found!","dist":{"shasum":"8922d8c1103b9b2e0b9a54df1f5b5cf9104ad5b8","tarball":"http://registry.npmjs.org/2/-/2-0.0.1.tgz"},"maintainers":[{"name":"errorrik","email":"errorrik@gmail.com"}]}},"readme":"ERROR: No README.md file found!","maintainers":[{"name":"errorrik","email":"errorrik@gmail.com"}],"time":{"modified":"2012-08-10T06:44:10.359Z","created":"2012-08-10T06:44:00.798Z","0.0.1":"2012-08-10T06:44:10.359Z"},"_attachments":{"2-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-E6AepMikY7nBIfYy1wFDGg==","length":165,"stub":true}}}},
{"id":"27bslash6-module","key":"27bslash6-module","value":{"rev":"5-5066893a82afccf25d0f43ed04c602d4"},"doc":{"_id":"27bslash6-module","_rev":"5-5066893a82afccf25d0f43ed04c602d4","name":"27bslash6-module","description":"just a dump module used for infrastructure tests","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"27bslash6-module","author":{"name":"Frank Seeger","email":"frnksgr@gmail.com"},"description":"just a dump module used for infrastructure tests","version":"0.0.1","main":"main.js","engines":{"node":"*"},"dependencies":{},"repository":{"url":"https://github.com/frnksgr/27bslash6-module"},"_npmUser":{"name":"frnksgr","email":"frnksgr@gmail.com"},"_id":"27bslash6-module@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6ec590fe0f879860fa999d5877184029939f961b","tarball":"http://registry.npmjs.org/27bslash6-module/-/27bslash6-module-0.0.1.tgz"},"maintainers":[{"name":"frnksgr","email":"frnksgr@gmail.com"}]},"0.0.2":{"name":"27bslash6-module","author":{"name":"Frank Seeger","email":"frnksgr@gmail.com"},"description":"just a dump module used for infrastructure tests","version":"0.0.2","main":"main.js","engines":{"node":"*"},"dependencies":{},"repository":{"type":"git","url":"git://github.com/frnksgr/27bslash6-module.git"},"_npmUser":{"name":"frnksgr","email":"frnksgr@gmail.com"},"_id":"27bslash6-module@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"76245a0df6d4e1a30cf79512cb75c32d24733136","tarball":"http://registry.npmjs.org/27bslash6-module/-/27bslash6-module-0.0.2.tgz"},"maintainers":[{"name":"frnksgr","email":"frnksgr@gmail.com"}]}},"readme":"27bslash6 module\n================\n\na dump module for a dump project\n\n","maintainers":[{"name":"frnksgr","email":"frnksgr@gmail.com"}],"time":{"modified":"2012-05-22T13:52:30.846Z","created":"2012-05-22T13:16:05.482Z","0.0.1":"2012-05-22T13:16:07.260Z","0.0.2":"2012-05-22T13:52:30.846Z"},"author":{"name":"Frank Seeger","email":"frnksgr@gmail.com"},"repository":{"type":"git","url":"git://github.com/frnksgr/27bslash6-module.git"},"_attachments":{"27bslash6-module-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qUKRbvUqhSzHLT5gE2Cq2w==","length":452,"stub":true},"27bslash6-module-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UQbPWx7cmomHn/t8fUw86g==","length":441,"stub":true}}}},
{"id":"2co","key":"2co","value":{"rev":"29-bdd7d5af5e1c215f9f57cdc3de5ae483"},"doc":{"_id":"2co","_rev":"29-bdd7d5af5e1c215f9f57cdc3de5ae483","name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","dist-tags":{"latest":"0.0.3f"},"versions":{"0.0.1":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.1","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","test":"test"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0e67a85c122344c717441a95ca3314539016da76","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.1.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.2":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.2","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6c3c67b8453fffb4cf3fb1cac63e7f41dd6c10d1","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.2.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.3a":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.3a","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.3a","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3f38358f6b368c38dbe75c12b47ac0f82744cbb9","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.3a.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.3b":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.3b","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.3b","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"02780dfa68b55c2ad06211258091d6ac0a6f3a97","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.3b.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.3c":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.3c","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.3c","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1051c9e385911e927d06a9b27d6b938f22a3b1d4","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.3c.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.3d":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.3d","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.3d","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5571396a65bba6b6e741c5645cabb961bc3ca988","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.3d.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.3e":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.3e","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.3e","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9f339f6147cc83d532e276b24d290958b2b6a0d9","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.3e.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]},"0.0.3f":{"name":"2co","description":"Module that will provide nodejs adapters for 2checkout API payment gateway","version":"0.0.3f","homepage":"https://github.com/biggora/2co/","repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"keywords":["payments","2checkout","adapter","gateway"],"main":"./index.js","directories":{"lib":"lib","tests":"tests"},"engines":{"node":">=0.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"biggora","email":"aleksej@gordejev.lv"},"_id":"2co@0.0.3f","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"47fe30ef48ab3eb8f238c4aa0ae2564dc3e9c376","tarball":"http://registry.npmjs.org/2co/-/2co-0.0.3f.tgz"},"maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}]}},"readme":"# 2CO\r\n2CO is the module that will provide nodejs\r\nadapters for [2checkout](http://www.2checkout.com/documentation/api/) API payment gateway.\r\n\r\n## Usage overview\r\n\r\n### Example list_products method\r\n\r\nThe list_products call is used to retrieve list of all products in account.\r\n\r\n    var checkout = require(\"2co\");\r\n\r\n    /* Filter list results on product ID. Optional. */\r\n    var product = {\r\n         vendor_product_id:'your product id'\r\n    };\r\n\r\n    checkout.setAuth('USERNAME','PASSWORD');\r\n    checkout.exec('list_products',product);\r\n\r\n    checkout.on('data',function(data){\r\n       console.log(data);\r\n    });\r\n\r\n    checkout.on('error',function(error){\r\n       console.log(error);\r\n    });\r\n\r\n## Author\r\n\r\nAleksej Gordejev (aleksej@gordejev.lv). Development was sponsored by [Etvnet](http://etvnet.com/).\r\n\r\n## License\r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2012 Aleksej Gordejev <aleksej@gordejev.lv>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"biggora","email":"aleksej@gordejev.lv"}],"time":{"modified":"2012-04-02T10:44:57.138Z","created":"2012-03-17T18:04:44.765Z","0.0.1":"2012-03-17T18:04:47.520Z","0.0.2":"2012-03-17T20:40:55.814Z","0.0.3a":"2012-03-18T10:05:50.018Z","0.0.3b":"2012-03-18T13:18:46.051Z","0.0.3c":"2012-03-18T13:25:39.669Z","0.0.3d":"2012-03-18T15:45:41.276Z","0.0.3e":"2012-03-24T17:05:56.997Z","0.0.3f":"2012-04-02T10:44:57.138Z"},"author":{"name":"Aleksej Gordejev","email":"aleksej@gordejev.lv","url":"https://github.com/biggora/"},"repository":{"type":"git","url":"git://github.com/biggora/2co.git"},"_attachments":{"2co-0.0.3f.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-8gpVxHcQkMsU9KzrOg0HWA==","length":6203,"stub":true},"2co-0.0.3e.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-oIGO0W+fai9iTuVQZ1RgHg==","length":6095,"stub":true},"2co-0.0.3d.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-+75kozay0wc72kHJxIYb7Q==","length":5915,"stub":true},"2co-0.0.3c.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-cZswlmIl+FQh7vHFhQsiTA==","length":5886,"stub":true},"2co-0.0.3b.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-L6BOxWfP9aPr8Y8Jb/w9Eg==","length":5885,"stub":true},"2co-0.0.3a.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-HmM0iQamkSczXUYFq+nESQ==","length":5743,"stub":true},"2co-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-KMAcsxw4JlurmoaeWhZSLQ==","length":4954,"stub":true},"2co-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xrTDfrCqCDcdhFa0G2H8zw==","length":5816,"stub":true}}}},
{"id":"2csv","key":"2csv","value":{"rev":"7-6c79e9b7500756e20a2b41ca43e2e445"},"doc":{"_id":"2csv","_rev":"7-6c79e9b7500756e20a2b41ca43e2e445","name":"2csv","description":"A pluggable file format converter into Comma-Separated Values (CSV)","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"2csv","description":"A pluggable file format converter into Comma-Separated Values (CSV)","version":"0.1.0","homepage":"https://github.com/csvplot/2csv","repository":{"type":"git","url":"git://github.com/csvplot/2csv.git"},"bugs":{"name":"http://github.com/csvplot/2csv/issues"},"author":{"name":"David Ellis","email":"d.f.ellis@ieee.org","url":"http://dfellis.posterous.com"},"main":"lib/2csv.js","dependencies":{"commander":"*","async":"*"},"devDependencies":{"expresso":">=0.8.1"},"engines":{"node":"*"},"bin":{"2csv":"bin/2csv.js","2csv-register":"bin/2csv-register.js"},"preferGlobal":true,"scripts":{"test":"expresso test/test.js"},"_npmUser":{"name":"dfellis","email":"d.f.ellis@ieee.org"},"_id":"2csv@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"6a4358ece766f07c81c9b34efa7d5038db5807bb","tarball":"http://registry.npmjs.org/2csv/-/2csv-0.1.0.tgz"},"maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}]},"0.1.1":{"name":"2csv","description":"A pluggable file format converter into Comma-Separated Values (CSV)","version":"0.1.1","homepage":"https://github.com/csvplot/2csv","repository":{"type":"git","url":"git://github.com/csvplot/2csv.git"},"bugs":{"name":"http://github.com/csvplot/2csv/issues"},"author":{"name":"David Ellis","email":"d.f.ellis@ieee.org","url":"http://dfellis.posterous.com"},"main":"lib/2csv.js","dependencies":{"commander":"*","async":"*"},"devDependencies":{"expresso":">=0.8.1"},"engines":{"node":"*"},"bin":{"2csv":"bin/2csv.js","2csv-register":"bin/2csv-register.js"},"preferGlobal":true,"scripts":{"test":"expresso test/test.js"},"_npmUser":{"name":"dfellis","email":"d.f.ellis@ieee.org"},"_id":"2csv@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"1ea66e444077b1e0711d0e9ba0e8d70f4d7a241d","tarball":"http://registry.npmjs.org/2csv/-/2csv-0.1.1.tgz"},"maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}]},"0.1.2":{"name":"2csv","description":"A pluggable file format converter into Comma-Separated Values (CSV)","version":"0.1.2","homepage":"https://github.com/csvplot/2csv","repository":{"type":"git","url":"git://github.com/csvplot/2csv.git"},"bugs":"http://github.com/csvplot/2csv/issues","author":{"name":"David Ellis","email":"d.f.ellis@ieee.org","url":"http://dfellis.posterous.com"},"main":"lib/2csv.js","dependencies":{"commander":"*","async":"*"},"devDependencies":{"expresso":">=0.8.1"},"engines":{"node":"*"},"bin":{"2csv":"bin/2csv.js","2csv-register":"bin/2csv-register.js"},"preferGlobal":true,"scripts":{"test":"expresso test/test.js"},"readme":"","_id":"2csv@0.1.2","dist":{"shasum":"de73396c8e622c27887dced2408c6ad4d37113f6","tarball":"http://registry.npmjs.org/2csv/-/2csv-0.1.2.tgz"},"maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}]}},"readme":null,"maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}],"time":{"modified":"2012-07-13T02:45:06.653Z","created":"2011-12-18T19:15:28.837Z","0.1.0":"2011-12-18T19:15:37.446Z","0.1.1":"2011-12-19T01:01:24.193Z","0.1.2":"2012-07-13T02:45:06.653Z"},"author":{"name":"David Ellis","email":"d.f.ellis@ieee.org","url":"http://dfellis.posterous.com"},"repository":{"type":"git","url":"git://github.com/csvplot/2csv.git"},"_attachments":{"2csv-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QO+oMHFsbbBVew/dzi5qAA==","length":6333,"stub":true},"2csv-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ttd69Vv+P8RL0f17ixNCpQ==","length":5857,"stub":true},"2csv-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sakIMEGT/PDZz2A7BzU8CA==","length":5073,"stub":true}}}},
{"id":"2kenizer","key":"2kenizer","value":{"rev":"33-2b6a4857429b5d8d9991f1b088e916e7"},"doc":{"_id":"2kenizer","_rev":"33-2b6a4857429b5d8d9991f1b088e916e7","name":"2kenizer","description":"efficient tokenizer","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"2kenizer","description":"Efficient tokenizer","version":"0.0.1","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b694cbb82c0498bdad31c22a29a4bb1d11b4866a","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.1.tgz"},"maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.0.2":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.2","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5e6eae742fa0d85255a7e9359baed8bdff43e9cc","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.2.tgz"},"maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.0.3":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.3","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"103b5bb41dfde30d3ecb127a379ba67f0761601b","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.3.tgz"},"maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.0.4":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.4","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"043e6a596caa1d6b3fc9307703badecb5de6569b","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.4.tgz"},"maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.0.5":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.5","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"be476ef0a45fbd12f0e5621997d087ab2cb65d01","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.5.tgz"},"maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.0.6":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.6","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2d38b48b3f4741cd248c6a37c7ec8bfd1e4c0293","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.6.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.0.7":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.7","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"664dab3984b0ec43c5e58c5205d19ac87dbc69e7","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.7.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.1.0":{"name":"2kenizer","description":"efficient tokenizer","version":"0.1.0","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fd8acc780cad9e210d7f0d119e8098798e00dc07","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.1.0.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.1.1":{"name":"2kenizer","description":"efficient tokenizer","version":"0.1.1","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"43ab1cb3fe9fa316615788bb0ed855be1049b140","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.1.1.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.1.2":{"name":"2kenizer","description":"efficient tokenizer","version":"0.1.2","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"},{"type":"git","url":"git@bitbucket.org:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"298f995900456f2fa61c3662be0a8af4712197bf","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.1.2.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.1.3":{"name":"2kenizer","description":"efficient tokenizer","version":"0.1.3","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"},{"type":"git","url":"git@bitbucket.org:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9aa8d328b555e8aa93ead8af78d208c22520ae6e","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.1.3.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.1.4":{"name":"2kenizer","description":"efficient tokenizer","version":"0.1.4","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"},{"type":"git","url":"git@bitbucket.org:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"64b53a89784d49dd8b4701aba209702d8f60f33d","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.1.4.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"directories":{}},"0.1.5":{"name":"2kenizer","description":"efficient tokenizer","version":"0.1.5","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:elmerbulthuis/2kenizer.git"},{"type":"git","url":"git@bitbucket.org:elmerbulthuis/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"430f366488db87bbad453c8332e2c1c64fb6c669","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.1.5.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}]},"0.0.8":{"name":"2kenizer","description":"efficient tokenizer","version":"0.0.8","author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"repositories":[{"type":"git","url":"git@github.com:LuvDaSun/2kenizer.git"}],"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"},"_id":"2kenizer@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"92fc8719e9deb072bb5d7f5600079c08bcb5c432","tarball":"http://registry.npmjs.org/2kenizer/-/2kenizer-0.0.8.tgz"},"readme":"","maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}]}},"maintainers":[{"name":"elmerbulthuis","email":"elmerbulthuis@gmail.com"}],"time":{"modified":"2012-07-09T07:50:25.476Z","created":"2011-10-31T11:32:42.457Z","0.0.1":"2011-10-31T11:32:44.092Z","0.0.2":"2011-11-02T18:10:30.952Z","0.0.3":"2011-11-16T03:33:23.068Z","0.0.4":"2011-12-15T13:06:01.781Z","0.0.5":"2011-12-15T13:21:04.948Z","0.0.6":"2011-12-28T15:44:57.262Z","0.0.7":"2012-03-17T23:39:14.368Z","0.1.0":"2012-04-13T21:31:06.682Z","0.1.1":"2012-04-17T07:20:07.637Z","0.1.2":"2012-04-18T10:20:51.457Z","0.1.3":"2012-04-20T18:21:46.354Z","0.1.4":"2012-04-24T11:25:02.019Z","0.1.5":"2012-07-09T06:55:33.445Z","0.0.8":"2012-07-09T07:50:25.476Z"},"author":{"name":"Elmer Bulthuis","email":"elmerbulthuis@gmail.com"},"_attachments":{"2kenizer-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-EHKgXuwHxGuD7JTeJef6yw==","length":4635,"stub":true},"2kenizer-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-dz1eXHdg+3q+3zAx1hM/bA==","length":3070,"stub":true},"2kenizer-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-BuaP0O+Ud1zJbWkoOTHSLw==","length":3067,"stub":true},"2kenizer-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-z43WoJl6sIZRWaR55A/Kpw==","length":2662,"stub":true},"2kenizer-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-5VsIVuwUIgtYk1uKbYTbgg==","length":2642,"stub":true},"2kenizer-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-5Cvwpgl9zBb4ZD6tt5oowA==","length":2617,"stub":true},"2kenizer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-XYONc2Z0Cuv45eKTpKKhAQ==","length":2657,"stub":true},"2kenizer-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-DC3JHUT51i3uZ5Z8Et25mQ==","length":4605,"stub":true},"2kenizer-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-sk3H4/hIBZhzu1xEf0tW/A==","length":4621,"stub":true},"2kenizer-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hqjvnj7627Dq4NZBN/r4DQ==","length":3069,"stub":true},"2kenizer-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-00wHhV/8VKs/7NHbNgPB2Q==","length":3073,"stub":true},"2kenizer-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-w3CyH+i36ibIAC1eGlZCIw==","length":2990,"stub":true},"2kenizer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TwssBX27jZ+sWHTWKXKJRg==","length":2835,"stub":true},"2kenizer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zN+4OuoBAo9cselqAxtswg==","length":2841,"stub":true}}}},
{"id":"360","key":"360","value":{"rev":"3-2d7a6b8e4d33204a6c464fb81b15b496"},"doc":{"_id":"360","_rev":"3-2d7a6b8e4d33204a6c464fb81b15b496","name":"360","description":"hi baidu","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"360","version":"0.0.0","description":"hi baidu","main":"index.js","repository":"","author":"","license":"BSD","readme":"hi baidu\n","_id":"360@0.0.0","dist":{"shasum":"a6cf145732851c70ced928c050b9eb7ae46411aa","tarball":"http://registry.npmjs.org/360/-/360-0.0.0.tgz"},"maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}]}},"readme":"hi baidu\n","maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}],"time":{"modified":"2012-08-10T01:47:46.775Z","created":"2012-08-10T01:47:35.266Z","0.0.0":"2012-08-10T01:47:46.775Z"},"_attachments":{"360-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nsw/xHa1fEESVE7ejE0NZg==","length":252,"stub":true}}}},
{"id":"3scale","key":"3scale","value":{"rev":"9-03186cba474f6cd16a3165756e114334"},"doc":{"_id":"3scale","_rev":"9-03186cba474f6cd16a3165756e114334","name":"3scale","description":"Client for 3Scale Networks API","dist-tags":{"latest":"0.3.3"},"versions":{"0.2.0":{"name":"3scale","description":"Client for 3Scale Networks API","version":"0.2.0","homepage":"http://www.3scale.net","repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"author":{"name":"3scale","email":"support@3scale.net"},"contributors":[{"name":"Carlos Villuendas","email":"carlosvillu@3scale.net"},{"name":"Michal Cichra","email":"michal@3scale.net"}],"main":"lib/index.js","bugs":{"url":"http://github.com/3scale/3scale_ws_api_for_nodejs/issues"},"keywords":["api","authorization","3scale","web"],"scripts":{"prepublish":"coffee --bare -o lib -c src","test":"vows test/* --spec"},"dependencies":{"libxmljs-easy":"*"},"devDependencies":{"coffee-script":"1.x","vows":"0.5.x"},"engines":{"node":"*"},"optionalDependencies":{},"_npmUser":{"name":"michal.3scale","email":"michal@3scale.net"},"_id":"3scale@0.2.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"55238ea05a98eb8da31d6e0cabe6b83ce7f6880c","tarball":"http://registry.npmjs.org/3scale/-/3scale-0.2.0.tgz"},"maintainers":[{"name":"michal.3scale","email":"michal@3scale.net"}]},"0.3.2":{"name":"3scale","description":"Client for 3Scale Networks API","version":"0.3.2","homepage":"http://www.3scale.net","repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"author":{"name":"3scale","email":"support@3scale.net"},"contributors":[{"name":"Carlos Villuendas","email":"carlosvillu@3scale.net"},{"name":"Michal Cichra","email":"michal@3scale.net"},{"name":"Daniel Stevens","email":"daniel.stevens@senicolabs.com"},{"name":"Joaquin Rivera","email":"joaquin@3scale.net","url":"joahking"}],"main":"lib/index.js","bugs":{"url":"http://github.com/3scale/3scale_ws_api_for_nodejs/issues"},"keywords":["api","authorization","3scale","web"],"scripts":{"prepublish":"coffee --bare -o lib -c src","test":"vows test/* --spec"},"directories":{"lib":"./lib"},"dependencies":{"libxmljs":"*","qs":"*"},"devDependencies":{"coffee-script":"1.x","vows":"0.5.x"},"engines":{"node":"0.8.x"},"optionalDependencies":{},"_npmUser":{"name":"michal.3scale","email":"michal@3scale.net"},"_id":"3scale@0.3.2","_engineSupported":false,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"3d4b27b6290b319108b8537d8507ac93c2ffc0ce","tarball":"http://registry.npmjs.org/3scale/-/3scale-0.3.2.tgz"},"maintainers":[{"name":"michal.3scale","email":"michal@3scale.net"}]},"0.3.3":{"name":"3scale","description":"Client for 3Scale Networks API","version":"0.3.3","homepage":"http://www.3scale.net","repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"author":{"name":"3scale","email":"support@3scale.net"},"contributors":[{"name":"Carlos Villuendas","email":"carlosvillu@3scale.net"},{"name":"Michal Cichra","email":"michal@3scale.net"},{"name":"Daniel Stevens","email":"daniel.stevens@senicolabs.com"},{"name":"Joaquin Rivera","email":"joaquin@3scale.net","url":"joahking"}],"main":"lib/index.js","bugs":{"url":"http://github.com/3scale/3scale_ws_api_for_nodejs/issues"},"keywords":["api","authorization","3scale","web"],"scripts":{"prepublish":"coffee --bare -o lib -c src","test":"vows test/* --spec"},"directories":{"lib":"./lib"},"dependencies":{"libxmljs":"*","qs":"*"},"devDependencies":{"coffee-script":"1.x","vows":"0.5.x"},"engines":{"node":"0.8.x"},"optionalDependencies":{},"readme":"# 3scale integration plugin for JavaScript/CoffeeScript/Node.js applications [![Build Status](https://secure.travis-ci.org/3scale/3scale_ws_api_for_nodejs.png?branch=master)](http://travis-ci.org/3scale/3scale_ws_api_for_nodejs)\n\n3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management.\nIncludes a configurable API dashboard and developer portal CMS.\nMore product stuff at http://www.3scale.net/, support information at http://support.3scale.net/.\n\n#### Requirements\n\n* libxml2 library\n\n#### Installation\n\nThe module is delivered through the package manager npm, so that the installation should be easy as: `npm install 3scale`\n\n#### Testing\n\nTo run tests: `vows test/* --spec`\n\nIn the root of the project.\n\n#### Usage\n\n    var Client = require('3scale').Client;\n\n    client = new Client(\"your provider key\");\n\n    client.authorize({app_id: \"your application id\", app_key: \"your application key\"}, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n    // Or for reports\n\n    var trans = [\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1}},\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1000}}\n                 ]\n\n    client.report(trans, function(response){\n      console.log(response);\n    });\n\n","_id":"3scale@0.3.3","dist":{"shasum":"a185638b23f9f497ef29a5c0357032186e1a6d81","tarball":"http://registry.npmjs.org/3scale/-/3scale-0.3.3.tgz"},"maintainers":[{"name":"michal.3scale","email":"michal@3scale.net"},{"name":"3scale","email":"support@3scale.net"}]}},"readme":"# 3scale integration plugin for JavaScript/CoffeeScript/Node.js applications\n\n3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management.\nIncludes a configurable API dashboard and developer portal CMS.\nMore product stuff at http://www.3scale.net/, support information at http://support.3scale.net/.\n\n#### Requirements\n\n* libxml2 library\n\n#### Installation\n\nThe module is delivered through the package manager npm, so that the installation should be easy as: `npm install 3scale`\n\n#### Testing\n\nTo run tests: `vows test/* --spec`\n\nIn the root of the project.\n\n#### Usage\n\n    var Client = require('3scale').Client;\n\n    client = new Client(\"your provider key\");\n\n    client.authorize({app_id: \"your application id\", app_key: \"your application key\"}, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n    // Or for reports\n\n    var trans = [\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1}},\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1000}}\n                 ]\n\n    client.report(trans, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n","maintainers":[{"name":"michal.3scale","email":"michal@3scale.net"},{"name":"3scale","email":"support@3scale.net"}],"time":{"modified":"2012-08-09T10:40:43.457Z","created":"2012-06-06T15:35:47.234Z","0.2.0":"2012-06-06T15:35:49.293Z","0.3.2":"2012-08-07T10:09:22.462Z","0.3.3":"2012-08-09T10:40:43.457Z"},"author":{"name":"3scale","email":"support@3scale.net"},"repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"users":{"michal.3scale":true},"_attachments":{"3scale-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-joaKASP8Kl1AbxpAS+yZLg==","length":7022,"stub":true},"3scale-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-er3TzBai+Zb++KdHac8Z2w==","length":5203,"stub":true},"3scale-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-MjDMjrRyE/QG5T8Lv5v9XA==","length":1766,"stub":true}}}},
{"id":"3scale-senico","key":"3scale-senico","value":{"rev":"5-f4ae309bf217b722d29459bb59545403"},"doc":{"_id":"3scale-senico","_rev":"5-f4ae309bf217b722d29459bb59545403","name":"3scale-senico","description":"Client for 3Scale Networks API","dist-tags":{"latest":"0.3.3"},"versions":{"0.3.2":{"name":"3scale-senico","description":"Client for 3Scale Networks API","version":"0.3.2","homepage":"http://www.3scale.net","repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"author":{"name":"3scale","email":"support@3scale.net"},"contributors":[{"name":"Carlos Villuendas","email":"carlosvillu@3scale.net"},{"name":"Michal Cichra","email":"michal@3scale.net"},{"name":"Daniel Stevens","email":"daniel.stevens@senicolabs.com"}],"main":"lib/index.js","bugs":{"url":"http://github.com/3scale/3scale_ws_api_for_nodejs/issues"},"keywords":["api","authorization","3scale","web"],"scripts":{"prepublish":"coffee --bare -o lib -c src","test":"vows test/* --spec"},"directories":{"lib":"./lib"},"dependencies":{"libxmljs":"*","qs":"*"},"devDependencies":{"coffee-script":"1.x","vows":"0.5.x"},"engines":{"node":"0.8.x"},"optionalDependencies":{},"readme":"# 3scale integration plugin for JavaScript/CoffeeScript/Node.js applications [![Build Status](https://secure.travis-ci.org/3scale/3scale_ws_api_for_nodejs.png?branch=master)](http://travis-ci.org/3scale/3scale_ws_api_for_nodejs)\n\n3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management.\nIncludes a configurable API dashboard and developer portal CMS.\nMore product stuff at http://www.3scale.net/, support information at http://support.3scale.net/.\n\n#### Requirements\n\n* libxml2 library\n\n#### Installation\n\nThe module is delivered through the package manager npm, so that the installation should be easy as: `npm install 3scale`\n\n#### Testing\n\nTo run tests: `vows test/* --spec`\n\nIn the root of the project.\n\n#### Usage\n\n    var Client = require('3scale').Client;\n\n    client = new Client(\"your provider key\");\n\n    client.authorize({app_id: \"your application id\", app_key: \"your application key\"}, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n    // Or for reports\n\n    var trans = [\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1}},\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1000}}\n                 ]\n\n    client.report(trans, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n","_id":"3scale-senico@0.3.2","dist":{"shasum":"67ceaec0f86d0b4ec91dddbc1e9f2161365ce3fc","tarball":"http://registry.npmjs.org/3scale-senico/-/3scale-senico-0.3.2.tgz"},"maintainers":[{"name":"senico","email":"daniel.stevens@senicolabs.com"}]},"0.3.3":{"name":"3scale-senico","description":"Client for 3Scale Networks API","version":"0.3.3","homepage":"http://www.3scale.net","repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"author":{"name":"3scale","email":"support@3scale.net"},"contributors":[{"name":"Carlos Villuendas","email":"carlosvillu@3scale.net"},{"name":"Michal Cichra","email":"michal@3scale.net"},{"name":"Daniel Stevens","email":"daniel.stevens@senicolabs.com"}],"main":"lib/index.js","bugs":{"url":"http://github.com/3scale/3scale_ws_api_for_nodejs/issues"},"keywords":["api","authorization","3scale","web"],"scripts":{"prepublish":"coffee --bare -o lib -c src","test":"vows test/* --spec"},"directories":{"lib":"./lib"},"dependencies":{"libxmljs":"*","qs":"*"},"devDependencies":{"coffee-script":"1.x","vows":"0.5.x"},"engines":{"node":"0.8.x"},"optionalDependencies":{},"readme":"# 3scale integration plugin for JavaScript/CoffeeScript/Node.js applications [![Build Status](https://secure.travis-ci.org/3scale/3scale_ws_api_for_nodejs.png?branch=master)](http://travis-ci.org/3scale/3scale_ws_api_for_nodejs)\n\n3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management.\nIncludes a configurable API dashboard and developer portal CMS.\nMore product stuff at http://www.3scale.net/, support information at http://support.3scale.net/.\n\n#### Requirements\n\n* libxml2 library\n\n#### Installation\n\nThe module is delivered through the package manager npm, so that the installation should be easy as: `npm install 3scale`\n\n#### Testing\n\nTo run tests: `vows test/* --spec`\n\nIn the root of the project.\n\n#### Usage\n\n    var Client = require('3scale').Client;\n\n    client = new Client(\"your provider key\");\n\n    client.authorize({app_id: \"your application id\", app_key: \"your application key\"}, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n    // Or for reports\n\n    var trans = [\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1}},\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1000}}\n                 ]\n\n    client.report(trans, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n","_id":"3scale-senico@0.3.3","dist":{"shasum":"83f4aff7ff67a7ebdd6f8cdd3c85120ff0645785","tarball":"http://registry.npmjs.org/3scale-senico/-/3scale-senico-0.3.3.tgz"},"maintainers":[{"name":"senico","email":"daniel.stevens@senicolabs.com"}]}},"readme":"# 3scale integration plugin for JavaScript/CoffeeScript/Node.js applications [![Build Status](https://secure.travis-ci.org/3scale/3scale_ws_api_for_nodejs.png?branch=master)](http://travis-ci.org/3scale/3scale_ws_api_for_nodejs)\n\n3scale is an API Infrastructure service which handles API Keys, Rate Limiting, Analytics, Billing Payments and Developer Management.\nIncludes a configurable API dashboard and developer portal CMS.\nMore product stuff at http://www.3scale.net/, support information at http://support.3scale.net/.\n\n#### Requirements\n\n* libxml2 library\n\n#### Installation\n\nThe module is delivered through the package manager npm, so that the installation should be easy as: `npm install 3scale`\n\n#### Testing\n\nTo run tests: `vows test/* --spec`\n\nIn the root of the project.\n\n#### Usage\n\n    var Client = require('3scale').Client;\n\n    client = new Client(\"your provider key\");\n\n    client.authorize({app_id: \"your application id\", app_key: \"your application key\"}, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n    // Or for reports\n\n    var trans = [\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1}},\n                  { \"app_id\": \"your application id\", \"usage\": {\"hits\": 1000}}\n                 ]\n\n    client.report(trans, function(response){\n      sys.log(sys.inspect(response));\n    });\n\n","maintainers":[{"name":"senico","email":"daniel.stevens@senicolabs.com"}],"time":{"modified":"2012-08-08T20:57:56.674Z","created":"2012-08-08T20:48:35.003Z","0.3.2":"2012-08-08T20:48:36.098Z","0.3.3":"2012-08-08T20:57:56.674Z"},"author":{"name":"3scale","email":"support@3scale.net"},"repository":{"type":"git","url":"git://github.com/3scale/3scale_ws_api_for_nodejs.git"},"_attachments":{"3scale-senico-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RqLWgtFIKKad/1FiNx+FEw==","length":6813,"stub":true},"3scale-senico-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GZIfsBV2PDdzryybp9Wq6A==","length":5188,"stub":true}}}},
{"id":"404project","key":"404project","value":{"rev":"31-7cad85b0782e61a179bf4d7d675ddbde"},"doc":{"_id":"404project","_rev":"31-7cad85b0782e61a179bf4d7d675ddbde","name":"404project","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"404project","version":"0.0.1","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["connect","security"],"repository":{"type":"git","url":"git@github.com:jolira/node-404project.git"},"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"bugs":{"email":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"404project@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"65ef46c5eb092734343623ee9d870cf58c53fe55","tarball":"http://registry.npmjs.org/404project/-/404project-0.0.1.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"directories":{}},"0.0.2":{"name":"404project","version":"0.0.2","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["connect","security"],"repository":{"type":"git","url":"git@github.com:jolira/node-404project.git"},"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"bugs":{"email":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"404project@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"84d98f08ddb691e4f590cde51bb8e0013b14e8f6","tarball":"http://registry.npmjs.org/404project/-/404project-0.0.2.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"directories":{}},"0.0.4":{"name":"404project","version":"0.0.4","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["security","http","https","connect","express"],"repository":{"type":"git","url":"git@github.com:jolira/node-404project.git"},"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"bugs":{"email":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"devDependencies":{"express":">= 2.5.3"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"404project@0.0.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"099b8e456b4b512231e8fef93545e19bf81ade79","tarball":"http://registry.npmjs.org/404project/-/404project-0.0.4.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"directories":{}},"0.0.5":{"name":"404project","version":"0.0.5","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["security","http","https","connect","express"],"repository":{"type":"git","url":"git@github.com:jolira/node-404project.git"},"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"bugs":{"email":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"devDependencies":{"express":">= 2.5.3"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"404project@0.0.5","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c5a73038e6fa13513d74ed23a84e7a122ce073e6","tarball":"http://registry.npmjs.org/404project/-/404project-0.0.5.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"directories":{}},"0.0.6":{"name":"404project","version":"0.0.6","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["security","http","https","connect","express"],"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"repository":{"url":"git://github.com/jolira/node-404project.git","type":"git"},"bugs":{"email":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"devDependencies":{"express":">= 2.5.3"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"404project@0.0.6","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d41bacacc88b7736f9691935e617aad8a32f5dc4","tarball":"http://registry.npmjs.org/404project/-/404project-0.0.6.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"directories":{}},"0.1.0":{"name":"404project","version":"0.1.0","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["security","http","https","connect","express"],"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"repository":{"url":"git://github.com/jolira/node-404project.git","type":"git"},"bugs":{"email":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"devDependencies":{"express":">= 2.5.3"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"404project@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"826c79f88d182716ead9c1b45c2126072821c2c3","tarball":"http://registry.npmjs.org/404project/-/404project-0.1.0.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.1.1":{"name":"404project","version":"0.1.1","description":"Report 404 errors to http://www.dshield.org/tools/404project.html","keywords":["security","http","https","connect","express"],"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"repository":{"url":"https://github.com/jolira/node-404project.git","type":"git"},"bugs":{"mail":"dev@jolira.com","url":"http://github.com/jolira/node-404project/issues"},"bin":{"404reporter":"./bin/404reporter"},"devDependencies":{"express":">= 2.5.3"},"scripts":{"prepublish":"npm prune"},"main":"index","engines":{"node":">= 0.4.0 < 0.9.0"},"readme":"node-404project\n=====================\n\nA simple client for reporting 404 server errors to the \"404 project\" at http://www.dshield.org/tools/404project.html.\n\nPlease see the instructions at http://www.dshield.org/tools/404project.html for creating an ISC account retrieving\nthe ISC ID and the Authentication key.\n\nInstallation\n---------------------\n\n```\nnpm install 404project\n```\n\nUsage\n---------------------\n\n### Express.js\n\nUsing as a plugin for express.js:\n\n```\nvar express = require(\"express\");\nvar reporter = require(\"404project\");\nvar myUserID = process.argv[2] || \"[Your ISC ID]\";\nvar myKey = process.argv[3] || \"[Your Authentication Key]\";\nvar app = express.createServer();\n\napp.use(reporter(myUserID, myKey));\napp.listen(3000);\n```\n\n### Connect.js\n\nThe same code also works for connect.js. Just replace\n\n```\nvar express = require(\"express\");\n```\n\nwith\n\n```\nvar express = require(\"connect\");\n```\n\n### Other Frameworks\n\nUsers of different frameworks can call the functionreturned by ``reporter(myUserID, myKey)`` directly using:\n\n```\n// ...\nvar report = reporter(myUserID, myKey);\n\nreport(request, response);\n// ...\n```\n\nor\n\n```\n// ...\nvar report = reporter(myUserID, myKey);\n\nreport(url, ip, ua, timestamp);\n// ...\n```\n\n### Command-Line Support\n\nThere is also a command-line tool:\n\n```\nbin/404reporter 036742670 aaaaaaaaaaaabbcccccccccccceeeeeeeeffffff \"http://www.jolira.com/__phpamdin\" 125.64.23.180 jakarta\n```\n\nDebugging\n---------------------\n\nIn case of error, dshield does not provide a terrific amount of debugging support, but an message is produced\nif the value ``404project`` is part of the ``NODE_DEBUG`` environment variable.\n\n```\nexport NODE_DEBUG=\"404project\"\n```\n\nThe library prints ``404project: OK`` if the data was submitted correctly and ``404project: ERROR`` if it did not.\nPlease double-check you ISC ID and the Authentication key in case you encounter problems.\n","_id":"404project@0.1.1","dist":{"shasum":"d7b057058c0999c1d4009860e57780933c9c659b","tarball":"http://registry.npmjs.org/404project/-/404project-0.1.1.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]}},"readme":"node-404project\n=====================\n\nA simple client for reporting 404 server errors to the \"404 project\" at http://www.dshield.org/tools/404project.html.\n\nInstallation\n---------------------\n\n```\nnpm install 404project\n```\n\nUsage\n---------------------\n\n```\nvar express = require('express');\n\n// the user id is usually a number, like 1234567\nvar myUserID='[Your ISC ID]';\nvar myKey='[Your Authentication Key]';\nvar reporter = require('404project').create(myUserID, myKey);\nvar app = module.exports = express.createServer();\n\napp.get(function(request, response) {\n    response.statusCode = 404;\n    response.end(\"<h1>not found</h1>\");\n    reporter.report404(request);\n});\n\napp.listen(3000);\n```\n","maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"time":{"modified":"2012-06-28T07:10:56.180Z","created":"2011-12-31T09:13:00.008Z","0.0.1":"2011-12-31T09:13:01.664Z","0.0.2":"2011-12-31T17:58:00.668Z","0.0.4":"2012-01-02T09:24:19.508Z","0.0.5":"2012-01-02T22:19:51.147Z","0.0.6":"2012-01-03T21:24:48.632Z","0.1.0":"2012-02-19T01:06:58.447Z","0.1.1":"2012-06-28T07:10:56.180Z"},"author":{"name":"Joachim Kainz","email":"jfk@jolira.com","url":"http://www.jolira.com"},"repository":{"url":"https://github.com/jolira/node-404project.git","type":"git"},"_attachments":{"404project-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-V97CBWrGNWSlc5XKyH3kzg==","length":4338,"stub":true},"404project-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-p5klWSktfr1HDCqUCBvmnw==","length":3564,"stub":true},"404project-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-RZZ2gzeM0cEzIDLlRTKbgQ==","length":3463,"stub":true},"404project-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-HmJptmh8oeyxUc3vCk/ZFg==","length":3203,"stub":true},"404project-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-dJKIH87C0HNmmG3kbW/ypA==","length":2917,"stub":true},"404project-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Jbw39QR/YLocr9TCrV/SUw==","length":2919,"stub":true},"404project-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AYIcni+b0eTFPJYuiyZN6g==","length":2860,"stub":true}}}},
{"id":"4chan","key":"4chan","value":{"rev":"7-c5505d93897d7d1c85ecc63a1ced485a"},"doc":{"_id":"4chan","_rev":"7-c5505d93897d7d1c85ecc63a1ced485a","name":"4chan","description":"4chan picture downloader","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Juraj Vitko","url":"ypocat.com"},"name":"4chan","description":"4chan picture downloader","keywords":["4chan","picture","downloader","utility","command line"],"version":"0.0.1","homepage":"http://github.com/ypocat/4chan","repository":{"type":"git","url":"git://github.com/ypocat/4chan.git"},"main":"4chan.js","directories":{},"bin":{"4chan":"./bin/4chan"},"engines":{"node":">= 0.6.0"},"dependencies":{"laeh2":"*","optimist":"*","request":"*","underscore":"*","utilz":"*","async-mini":"*"},"devDependencies":{},"licenses":[{"type":"MIT","url":"https://raw.github.com/ypocat/4chan/master/LICENSE"}],"_npmUser":{"name":"ypocat","email":"juraj.vitko@gmail.com"},"_id":"4chan@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"c6cc152c117185e90e134b8dddf3ac131722b48f","tarball":"http://registry.npmjs.org/4chan/-/4chan-0.0.1.tgz"},"maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}]},"0.0.2":{"author":{"name":"Juraj Vitko","url":"ypocat.com"},"name":"4chan","description":"4chan picture downloader","keywords":["4chan","picture","downloader","utility","command line"],"version":"0.0.2","homepage":"http://github.com/ypocat/4chan","repository":{"type":"git","url":"git://github.com/ypocat/4chan.git"},"main":"4chan.js","directories":{},"bin":{"4chan":"./bin/4chan"},"engines":{"node":">= 0.6.0"},"dependencies":{"laeh2":"*","optimist":"*","request":"*","underscore":"*","utilz":"*","async-mini":"*"},"devDependencies":{},"licenses":[{"type":"MIT","url":"https://raw.github.com/ypocat/4chan/master/LICENSE"}],"_npmUser":{"name":"ypocat","email":"juraj.vitko@gmail.com"},"_id":"4chan@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"28d3db9988b250e2ac46be3f0ca37c283ec5a9d5","tarball":"http://registry.npmjs.org/4chan/-/4chan-0.0.2.tgz"},"maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}]},"0.0.3":{"author":{"name":"Juraj Vitko","url":"ypocat.com"},"name":"4chan","description":"4chan picture downloader","keywords":["4chan","picture","downloader","utility","command line"],"version":"0.0.3","homepage":"http://github.com/ypocat/4chan","repository":{"type":"git","url":"git://github.com/ypocat/4chan.git"},"main":"4chan.js","directories":{},"bin":{"4chan":"./bin/4chan"},"engines":{"node":">= 0.6.0"},"dependencies":{"laeh2":"*","optimist":"*","request":"*","underscore":"*","utilz":"*","async-mini":"*"},"devDependencies":{},"licenses":[{"type":"MIT","url":"https://raw.github.com/ypocat/4chan/master/LICENSE"}],"readme":"# 4chan picture downloader\n\n## Usage\n\nInstall Node.js if you don't have it yet. Then from the command line:\n\t\n\t[sudo] npm install 4chan -g\n\nThen proceed as follows:\n\t\n\tmkdir directory\n\tcd directory\n\t4chan http://boards.4chan.org/o/res/6487606\n\nWhen the downloading finishes, the tool will keep monitoring the thread for new pictures, and download them as they appear, until the thread is removed. Press `Ctrl+C` to quit the tool. Use the option `-s` (`--single-shot`) to prevent this behavior and only donwload the existing images.\n\nCall the program with the `--help` option to see more options, like filtering based on image dimensions, gif/non-gif format, and categorization of images into landscape and portrait subdirectories for easier mobile viewing.\n\n## Warning\n\n4chan is an anonymous board and from time to time, on some of its forums (e.g. `/b/`), users upload illegal content, downloading of which may implicate you in a criminal investigation. Moderators of 4chan are promptly deleting such content from the forum, but when you download images in bulk, it may happen that this illegal content ends up on your harddrive.\nWhen the 4chan downloader tool, while checking for thread updates, registers that an image was deleted from the thread, it will attempt to delete it from your harddrive. This will of course not happen if you quit the tool prematurely using Ctrl+C.\nOn the unsafe forums, the safest way is to inspect the thread before you run the downloading tool, and only running the tool with the one-shot switch (`-s`).\n\n\n## License\n(The MIT License)\n\nCopyright (c) 2012 Juraj Vitko (http://ypocat.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"4chan@0.0.3","dist":{"shasum":"8e22ca247104bae6698fd4e9079eaaa393475222","tarball":"http://registry.npmjs.org/4chan/-/4chan-0.0.3.tgz"},"maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}]}},"readme":"# 4chan picture downloader\n\n## Usage\n\nInstall Node.js if you don't have it yet. Then from the command line:\n\t\n\t[sudo] npm install 4chan -g\n\nThen proceed as follows:\n\t\n\tmkdir directory\n\tcd directory\n\t4chan http://boards.4chan.org/o/res/6487606\n\nWhen the downloading finishes, the tool will keep monitoring the thread for new pictures, and download them as they appear, until the thread is removed. Press `Ctrl+C` to quit the tool. Use the option `-s` (--single-shot) to prevent this behavior and only donwload the existing images.\n\nCall the program with the `--help` option to see more options.\n\n## Warning\n\n4chan is an anonymous board and from time to time, on some of its forums (e.g. `/b/`), users upload illegal content, downloading of which may implicate you in a criminal investigation. Moderators of 4chan are promptly deleting such content from the forum, but when you download images in bulk, it may happen that this illegal content ends up on your harddrive.\nWhen the 4chan downloader tool, while checking for thread updates, registers that an image was deleted from the thread, it will attempt to delete it from your harddrive. This will of course not happen if you quit the tool prematurely using Ctrl+C.\nOn the unsafe forums, the safest way is to inspect the thread before you run the downloading tool, and only running the tool with the one-shot switch (`-s`).\n\n\n## License\n(The MIT License)\n\nCopyright (c) 2012 Juraj Vitko (http://ypocat.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}],"time":{"modified":"2012-07-21T12:26:06.736Z","created":"2012-07-04T16:21:02.049Z","0.0.1":"2012-07-04T16:21:04.080Z","0.0.2":"2012-07-08T08:47:02.501Z","0.0.3":"2012-07-21T12:26:06.736Z"},"author":{"name":"Juraj Vitko","url":"ypocat.com"},"repository":{"type":"git","url":"git://github.com/ypocat/4chan.git"},"_attachments":{"4chan-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-5cYJ5k6fsqixuzgqqsHunA==","length":4404,"stub":true},"4chan-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KG7l+5AyFZScBOTd8ALm6g==","length":4379,"stub":true},"4chan-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-I1jO4+W0gGju1PpH4NP2fw==","length":4264,"stub":true}}}},
{"id":"4sq","key":"4sq","value":{"rev":"3-fcf32bd5431c2b741472f54ca17ae632"},"doc":{"_id":"4sq","_rev":"3-fcf32bd5431c2b741472f54ca17ae632","name":"4sq","description":"Wrapper for the Foursquare API","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"4sq","version":"0.0.1","homepage":"http://github.com/meritt/node-4sq","author":{"name":"Alexey Simonenko","email":"alexey@simonenko.su"},"description":"Wrapper for the Foursquare API","keywords":["foursquare","4sq","api","wrapper"],"repository":{"type":"git","url":"git://github.com/meritt/node-4sq.git"},"main":"./lib/foursquare","engines":{"node":">=0.6.0 <0.7.0"},"dependencies":{"request":">=2.9.200"},"devDependencies":{"coffee-script":">=1.3.0","everyauth":">=0.2.32","express":">=2.5.9","ejs":">=0.7.1"},"_npmUser":{"name":"meritt","email":"alexey@simonenko.su"},"_id":"4sq@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"cfe226886d24de846fb26d3ca75c4f520bc23e99","tarball":"http://registry.npmjs.org/4sq/-/4sq-0.0.1.tgz"},"maintainers":[{"name":"meritt","email":"alexey@simonenko.su"}]}},"readme":"# 4sq\n\nA Node.JS wrapper for [Foursquare API](https://developer.foursquare.com/overview/).\n\nHow to use with JavaScript\n--------------------------\n\n```javascript\nvar foursquare = require('4sq');\n\nvar fsq = new foursquare({token: 'OAuth2 access_token'});\n\nfsq.checkins('self', {limit: 5}, function(error, data) {\n  if (error) {\n    throw new Error(error);\n  }\n\n  console.log(data);\n});\n```\n\nOr with CoffeeScript\n--------------------\n\n```coffeescript\nfoursquare = require '4sq'\n\nfsq = new foursquare token: 'OAuth2 access_token'\n\nfsq.checkins 'self', limit: 5, (error, data) ->\n  throw new Error error if error\n  console.log data\n```\n\nInstall with NPM\n----------------\n\n```\nnpm install 4sq\n```\n\nHow to retrieve Foursquare OAuth2 access_token\n------------------------------------------\n\nGrab latest source code and install all dev dependencies\n\n```\nnpm link\n```\n\nChange your host, client id, client secret in [examples/get-access-token.coffee](http://github.com/meritt/node-4sq/blob/master/examples/get-access-token.coffee) and after that run [examples/get-access-token.coffee](http://github.com/meritt/node-4sq/blob/master/examples/get-access-token.coffee)\n\n```\ncoffee examples/get-access-token.coffee\n```\n\nAPI\n---\n\n* user (*user id*, *params*, *callback*)\n* checkins (*user id*, *params*, *callback*)\n* badges (*user id*, *params*, *callback*)\n\nAuthor\n------\n\n* Alexey Simonenko, dwarfman@gmail.com","maintainers":[{"name":"meritt","email":"alexey@simonenko.su"}],"time":{"modified":"2012-06-10T20:30:12.717Z","created":"2012-06-10T20:30:10.765Z","0.0.1":"2012-06-10T20:30:12.717Z"},"author":{"name":"Alexey Simonenko","email":"alexey@simonenko.su"},"repository":{"type":"git","url":"git://github.com/meritt/node-4sq.git"},"_attachments":{"4sq-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-y5uZGe+G5Fdjk+f3Pjmy8A==","length":3214,"stub":true}}}},
{"id":"4web","key":"4web","value":{"rev":"33-b3ef5e2620dab6cf9e031f83e9ddfeeb"},"doc":{"_id":"4web","_rev":"33-b3ef5e2620dab6cf9e031f83e9ddfeeb","name":"4web","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","dist-tags":{"latest":"0.2.1"},"versions":{"0.0.1":{"name":"4web","version":"0.0.1","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","closure-compiler":">=0.1.1","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"bin":{"4web":"bin\\4web.js"},"dist":{"shasum":"92b6d7d4b463cc643bb7996fbc9f0df33de83d1e","tarball":"http://registry.npmjs.org/4web/-/4web-0.0.1.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.0.2":{"name":"4web","version":"0.0.2","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","closure-compiler":">=0.1.1","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"bin":{"4web":"bin\\4web.js"},"dist":{"shasum":"4e0f2ebc33dc794b5bd7998ae3a64adfd94c38d7","tarball":"http://registry.npmjs.org/4web/-/4web-0.0.2.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.0.3":{"name":"4web","version":"0.0.3","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","closure-compiler":">=0.1.1","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"bin":{"4web":"bin\\4web.js"},"dist":{"shasum":"96616e553f21c19253c8841c4c913723dc968a50","tarball":"http://registry.npmjs.org/4web/-/4web-0.0.3.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.0":{"name":"4web","version":"0.1.0","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","closure-compiler":">=0.1.1","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"bin":{"4web":"bin\\4web.js"},"dist":{"shasum":"33e5ab8f804b1fe9c591bdd4764e8cb7741cc199","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.0.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.1":{"name":"4web","version":"0.1.1","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","closure-compiler":">=0.1.1","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"bin":{"4web":"bin\\4web.js"},"dist":{"shasum":"0da12a6f5588f65b214a45da936e3abe6095bc86","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.1.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.2":{"name":"4web","version":"0.1.2","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"bin":{"4web":"bin\\4web.js"},"dist":{"shasum":"7b7b029ddb3c9375dda51085f265dd6d016a055b","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.2.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.3":{"name":"4web","version":"0.1.3","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","bin":{"4web":"./bin/4web.js","forweb":"./bin/4web.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"413b0f305d5118f6874dba0363deb316ef23c3c8","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.3.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.5":{"name":"4web","version":"0.1.5","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","bin":{"4web":"./bin/4web.js","forweb":"./bin/4web.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"27a295b71b710f855b0e993e55aff7de2743103a","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.5.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.6":{"name":"4web","version":"0.1.6","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","bin":{"4web":"./bin/4web.js","forweb":"./bin/4web.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"81181938589c222e539d0c9a4cbd9fba1e1a7d30","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.6.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.1.7":{"name":"4web","version":"0.1.7","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","bin":{"4web":"./bin/4web.js","forweb":"./bin/4web.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.1.7","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"826c85ca9dd7eb548cfd1c1e6649eec1ce23ce13","tarball":"http://registry.npmjs.org/4web/-/4web-0.1.7.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.2.0":{"name":"4web","version":"0.2.0","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","bin":{"4web":"./bin/4web.js","forweb":"./bin/4web.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"bc7fb0bc74f114400cabacc5ee7e027525a94aba","tarball":"http://registry.npmjs.org/4web/-/4web-0.2.0.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]},"0.2.1":{"name":"4web","version":"0.2.1","description":"NPM package that generates scripts from other NPM packages suitable for consumption in a web browser.","keywords":["browser","package","compile"],"bugs":{"name":"https://github.com/dschnare/4web/issues"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"directories":{"lib":"lib","bin":"bin"},"main":"./lib/main","bin":{"4web":"./bin/4web.js","forweb":"./bin/4web.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"dependencies":{"commander":">=0.6.1","gcc":"git://github.com/dschnare/gcc.git","jscat":">=0.0.2","semver":"*","npm":">=1.1.2"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dschnare","email":"schnare.d@gmail.com"},"_id":"4web@0.2.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"608e84065025a3b8be2f497dde536510720842b1","tarball":"http://registry.npmjs.org/4web/-/4web-0.2.1.tgz"},"maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}]}},"readme":"# Overview\r\n\r\n4web is a NPM package that generates scripts from other NPM packages suitable for browser consumption.\r\n4web takes all the `main` script files for each locally installed NPM package and copies them to a directory\r\nof your choice, then combines the scripts in a fashion sutiable for browser consumption. Finally, each script is compiled individually.\r\n\r\nWhy all this trouble you might ask? Well, 4web makes no assumptions as to how you consume your scripts\r\nin the browser, so it provides a source and minified version of the combined script that can be loaded into the browser as-is. As well, a source and minified version of each locally installed module that can be loaded with frameworks such as [requirejs](http://requirejs.org/) and [definejs](https://github.com/dschnare/definejs)is provided. In other words the scripts produced by 4web are suitable for old-school-style script includes and contemporary module frameworks.\r\n\r\n**NOTE:** To use a module framework in the browser it requires that all modules can be loaded in said framework (i.e. AMD or CommonJS).\r\n\r\n\r\n# Installation\r\n\r\nFirst install [Node](http://nodejs.org/#download). The latest version of Node comes with NPM. This command will install the 4web command-line utility globally to your NPM installation.\r\n\r\n\tnpm install git://github.com/dschnare/4web.git -g\r\n\r\n**WINDOWS:** When attempting to install on Windows you will have to run `npm` in your `git-bash` or `git-powershell` command window.\r\n\r\n# Uninstallation\r\n\r\n\tnpm uninstall 4web -g\r\n\r\n# Usage\r\n\r\n4web must be called from within your package root (i.e. the directory that contains your `npm_modules` directory).\r\n\r\n\tUsage: 4web [options] [command]\r\n\r\n  \tCommands:\r\n\r\n    \tbuild <dir>\r\n    \tBuilds a web-ready environment from compatible NPM packages.\r\n\r\n    \tclean <dir>\r\n    \tRemoves all compiled and source scripts copied to <dir>.\r\n\r\n  \tOptions:\r\n\r\n    \t-h, --help     output usage information\r\n    \t-V, --version  output the version number\r\n\r\n\r\n# Package Requirements\r\n\r\n4web will work on any NPM package that meets the following requirements:\r\n\r\n- No references to Node.\r\n- Must have the `main` property set in tha package.json to a valid module.\r\n- Must be installed locally, not globally.\r\n\r\nIn a nutshell, all packages 4web operates on **must** target the browser and **must** have a single `main` script.\r\n\r\n\r\n---\r\n\r\n\r\n## Example Scenario: Several packages already exist on NPM registry or GitHub.\r\n\r\nSay you're writing a module that provides some awesome new feature, but depends on several modules that exist on the NPM registry and GitHub.\r\n\r\n1. Create a `package.json` file describing your module as usual.\r\n\r\n\t\t// package.json\r\n\t\t{\r\n\t\t\t\"name\": \"awesome-module\",\r\n\t\t\t\"version\": \"0.0.1\",\r\n\t\t\t\"main\": \"main\",\r\n\t\t\t\"dependencies\": {\r\n\t\t\t\t\"module-on-npm-registry\": \">=0.1.0\",\r\n\t\t\t\t\"module-on-github\": \"git://github.com/user/repo-name.git\"\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n2. Write your module.\r\n\r\n\t\t// main.js\r\n\t\t(function (moduleOnNPM, moduleOnGitHub) {\r\n\t\t\t// Write the code that either:\r\n\t\t\t// a) loads dependencies via some module framework or\r\n\t\t\t// b) injects dependencies using globals\r\n\t\t}(window.MODULE_ON_NPM, window.MODULE_ON_GITHUB));\r\n\r\n3. When you're ready to deploy to the browser run 4web from your module's directory and sepcify where you'd like to have the scripts copied to. The directory specified will be created if it does not exist.\r\n\r\n\t\t4web build web/js\r\n\r\n4. Load the scripts in your HTML page.\r\n\r\nLoad the combined script.\r\nNOTE: Each module must support being loaded outside a module framework.\r\n\r\n\t// web/index.html\r\n\t<html>\r\n\t<head>\r\n\t\t<title>Test Page</title>\r\n\t\t<!-- The combined scripts contain this module and all its dependencies\r\n\t\t\tand all their dependencies in the proper order. -->\r\n\t\t<script type=\"text/javascirpt\" src=\"js/combined.min.js\"></script>\r\n\t</head>\r\n\t<body>\r\n\t\tAwesome!\r\n\t</body>\r\n\t</html>\r\n\r\nOr load the modules individually.\r\nNOTE: Each module must support being loaded outside a module framework.\r\n\r\n\t// web/inline-module-test.html\r\n\t<html>\r\n\t<head>\r\n\t\t<title>Inline Module Test Page</title>\r\n\t\t<!-- The include order is very important. You must include the modules in the\r\n\t\t\tcorrect order so that all dependencies are loaded first. This is what\r\n\t\t\tthe combined scripts do for you by combining all modules into a single file. -->\r\n\t\t<script type=\"text/javascirpt\" src=\"js/module-on-npm-registry.min.js\"></script>\r\n\t\t<script type=\"text/javascirpt\" src=\"js/module-on-github.min.js\"></script>\r\n\t\t<script type=\"text/javascirpt\" src=\"js/awesome-module.min.js\"></script>\r\n\t</head>\r\n\t<body>\r\n\t\tAwesome!\r\n\t</body>\r\n\t</html>\r\n\r\n\r\nOr load the modules using a module framework like requirejs.\r\n**NOTE:** All modules must adhere to the AMD secification.\r\n\r\n\t// web/module-test-requirejs.html\r\n\t<html>\r\n\t<head>\r\n\t\t<title>Module Test Page</title>\r\n\t\t<script type=\"text/javascirpt\"\r\n\t\t\tsrc=\"http://requirejs.org/docs/release/2.0.2/minified/require.js\"></script>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\trequire.config({\r\n\t\t\t\tbaseUrl: \"js\",\r\n\t\t\t\tpaths: {\r\n\t\t\t\t\t\"awesome-module\": \"awesome-module.min\",\r\n\t\t\t\t\t\"module-on-npm-registry\": \"module-on-npm-registry.min\",\r\n\t\t\t\t\t\"module-on-github\": \"module-on-github.min\"\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\trequire([\"awesome-module\"], function (awesome) {\r\n\t\t\t\tawesome.go();\r\n\t\t\t});\r\n\t\t</script>\r\n\t</head>\r\n\t<body>\r\n\t\tAwesome!\r\n\t</body>\r\n\t</html>\r\n\r\nOr load the modules using a module framework like definejs.\r\n**NOTE:** All modules must adhere to the AMD specification.\r\n\r\n\t// web/module-test-definejs.html\r\n\t<html>\r\n\t<head>\r\n\t\t<title>Module Test Page</title>\r\n\t\t<script type=\"text/javascirpt\"\r\n\t\t\tsrc=\"https://raw.github.com/dschnare/definejs/master/web/public/inc/scripts/define.min.js\">\r\n\t\t\t{\r\n\t\t\t\t\"main\": \"awesome-module\",\r\n\t\t\t\t\"config\": {\r\n\t\t\t\t\t\"baseUrl\": \"js\",\r\n\t\t\t\t\t\"paths\": {\r\n\t\t\t\t\t\t\"awesome-module\": \"awesome-module.min\",\r\n\t\t\t\t\t\t\"module-on-npm-registry\": \"module-on-npm-registry.min\",\r\n\t\t\t\t\t\t\"module-on-github\": \"module-on-github.min\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t</script>\r\n\t</head>\r\n\t<body>\r\n\t\tAwesome!\r\n\t</body>\r\n\t</html>\r\n\r\n\r\n## Example Scenario: Third-party, non-NPM friendly script.\r\n\r\nSay you you want to write a module that provides some cool feature, but depends on jQuery (or some other framework that is not a NPM module).\r\n\r\n1. Create a stub module for the framework in your local `npm_modules` directory.\r\n\r\n\t\t// npm_modules/jquery/package.json\r\n\t\t{\r\n\t\t\t\"name\": \"jquery\",\r\n\t\t\t\"version\": \"7.2.0\",\r\n\t\t\t\"main\": \"jquery\"\r\n\t\t}\r\n\r\n2. Copy the source version of jQuery to its module's directory.\r\n\r\n\t\t// npm_modules/jquery/jquery.js\r\n\t\t// The source code for jQuery.\r\n\r\n3. Add `jquery` as a dependency to your module you're writing.\r\n\r\n\t\t// package.json\r\n\t\t{\r\n\t\t\t\"name\": \"cool-module\",\r\n\t\t\t\"version\": \"0.0.1\",\r\n\t\t\t\"main\": \"main\",\r\n\t\t\t\"dependencies\": {\r\n\t\t\t\t\"jquery\": \"*\"\r\n\t\t\t}\r\n\t\t}\r\n\r\n4. When you're ready to deploy to the browser run 4web from your module's directory.\r\n\r\n\t\t4web build web/js\r\n\r\n5. Load the scripts in your HTML page.\r\n\r\nSee the example above for details on how to include the scripts.\r\n\r\n\r\n---\r\n\r\n\r\n# Compiling\r\n\r\nAll scripts are compiled using the Closure Compiler with the compilation level set to `SIMPLE_OPTIMIZATIONS`. The compilation level can be overridden with the following package.json property:\r\n\r\n\t{\r\n\t\t\"compilation_level\": \"SIMPLE_OPTIMIZATIONS | ADVANCED_OPTIMIZATIONS | WHITESPACE_ONLY\"\r\n\t}\r\n\r\nFor more details on what each compilation level peforms see the Closure Compiler [documentation](https://developers.google.com/closure/compiler/docs/compilation_levels).\r\n\r\n\r\n## Advanced Compiling and Exporting\r\n\r\nWhen compiling with the compilation level set to `ADVANCED_OPTIMIZATIONS` the compiler will rename all local symbols (i.e. objects, functions, properties and methods) in order to reduce file size. To avoid having properties and methods renamed for symbols to be exported you must explicitly export them.\r\n\r\nHere's an example of how to export your symbols:\r\n\r\n\t// module.js\r\n\t(function () {\r\n\t\tvar module = {};\r\n\r\n\t\t// Since the Closure Compiler does not rename strings\r\n\t\t// we leverage this to export symbols with a specific name.\r\n\t\tmodule[\"getMessage\"] = function () {\r\n\t\t\treturn \"Hello World!\";\r\n\t\t};\r\n\r\n\t\twindow[\"MODULE\"] = module;\r\n\t}());\r\n\r\nAll `array-access notation` properties will be optimized to `dot notation` automatically by the compiler.\r\n\r\n\r\n## Advanced Compiling and Externs\r\n\r\nSince the compiler will rename all local symbols to reduce file size you will have to declare what symbols are external to your module (i.e. exported by another module) so that the compiler does not rename them. Externals can be declared for a packge in its package.json file with the following property:\r\n\r\n\t{\r\n\t\t\"externs\": [\"path-to-externs/extern1.js\", \"path-to-externs/extern1.js\"]\r\n\t}\r\n\r\nThe `externs` property is an array containing scripts declaring externals used by your module. All scripts paths are relative to your packge root.\r\n\r\nHere's an example of externals at work.\r\n\r\n\t// package.json\r\n\t{\r\n\t\t\"name\": \"awesome-module\",\r\n\t\t\"version\": \"0.0.1\",\r\n\t\t\"main\": \"main\"\r\n\t\t\"compilation_level\": \"ADVANCED_OPTIMIZATIONS\",\r\n\t\t\"externs\": [\"externs/other-module.js\"],\r\n\t\t\"dependencies\": {\r\n\t\t\t\"other-module\": \"*\"\r\n\t\t}\r\n\t}\r\n\r\n\t// externs/other-module.js\r\n\tvar OTHER_MODULE = {\r\n\t\tgetMessage: function () {}\r\n\t};\r\n\r\n\t// main.js\r\n\t(function (other) {\r\n\r\n\t\t// The call to \"getMessage\" will be renamed\r\n\t\t// if we don't declare externs.\r\n\t\tconsole.log(other.getMessage());\r\n\r\n\t// The reference to \"OTHER_MODULE\" may be renamed\r\n\t// if we don't declare externs.\r\n\t}(window.OTHER_MODULE));\r\n\r\n\t/////////////\r\n\r\n\t// npm_modules/other-module/package.json\r\n\t//\r\n\t// (It's perfectly fine for this module to be compiled\r\n\t// in advanced mode because we don't have any dependencies\r\n\t// and we properly export our symbols)\r\n\t{\r\n\t\t\"name\": \"other-module\",\r\n\t\t\"version\": \"0.0.1\",\r\n\t\t\"main\": \"main\"\r\n\t\t\"compilation_level\": \"ADVANCED_OPTIMIZATIONS\"\r\n\t}\r\n\r\n\t// npm_modules/other-module/main.js\r\n\t(function () {\r\n\t\twindow[\"OTHER_MODULE\"] = {\r\n\t\t\t\"getMessage\": function () {\r\n\t\t\t\treturn \"Hello World!\";\r\n\t\t\t}\r\n\t\t};\r\n\t}());\r\n\r\nUsing this approach every module would have to declare the externs of its dependencies. This is true, but this can be avoided if all modules follow a simple rule in order to take part in advanced compilation. **Each module should declare and maintain their own interface for consumption as an externs declaration for other modules.** This is accomplished by using yet another new package.json property.\r\n\r\n\t{\r\n\t\t\"interface\": \"path-to-interface.js\"\r\n\t}\r\n\r\nBy having each module decalre their own interface, other modules will automatically include this interface file as part of their externs declarations. So the above example will look like this.\r\n\r\n\t// package.json\r\n\t//\r\n\t// (We don't list our interface because we don't have one in this case,\r\n\t// but we still want to be compiled in advanced mode. When compiling\r\n\t// in advanved mode all our dependency's interface files will be added\r\n\t// as externs for us automatically.)\r\n\t{\r\n\t\t\"name\": \"awesome-module\",\r\n\t\t\"version\": \"0.0.1\",\r\n\t\t\"main\": \"main\"\r\n\t\t\"compilation_level\": \"ADVANCED_OPTIMIZATIONS\",\r\n\t\t\"dependencies\": {\r\n\t\t\t\"other-module\": \"*\"\r\n\t\t}\r\n\t}\r\n\r\n\t// main.js\r\n\t(function (other) {\r\n\t\tconsole.log(other.getMessage());\r\n\t}(window.OTHER_MODULE));\r\n\r\n\t/////////////\r\n\r\n\t// npm_modules/other-module/package.json\r\n\t{\r\n\t\t\"name\": \"other-module\",\r\n\t\t\"version\": \"0.0.1\",\r\n\t\t\"main\": \"main\"\r\n\t\t\"interface\": \"interface.js\",\r\n\t\t\"compilation_level\": \"ADVANCED_OPTIMIZATIONS\"\r\n\t}\r\n\r\n\t// interface.js\r\n\tvar OTHER_MODULE = {\r\n\t\tgetMessage: function () {}\r\n\t};\r\n\r\n\t// npm_modules/other-module/main.js\r\n\t(function () {\r\n\t\twindow[\"OTHER_MODULE\"] = {\r\n\t\t\t\"getMessage\": function () {\r\n\t\t\t\treturn \"Hello World!\";\r\n\t\t\t}\r\n\t\t};\r\n\t}());\r\n\r\n\r\n# Summary of New package.json Properties\r\n\r\nTo set the compilation level you want your module to be compiled at.\r\n\r\n\t{\r\n\t\t\"compilation_level\": \"SIMPLE_OPTIMIZATIONS | ADVANCED_OPTIMIZATIONS | WHITESPACE_ONLY\"\r\n\t}\r\n\r\nTo declare external symbols used by your module (All paths are relative to your package root).\r\n\r\n\t{\r\n\t\t\"externs\": [\"path-to-externs/extern1.js\", \"path-to-externs/extern1.js\"]\r\n\t}\r\n\r\nTo declare your module's interface so it can be automatically declared as an extern for modules that depend on your module.\r\n\r\n\t{\r\n\t\t\"interface\": \"path-to-interface.js\"\r\n\t}","maintainers":[{"name":"dschnare","email":"schnare.d@gmail.com"}],"time":{"modified":"2012-07-22T20:01:32.265Z","created":"2012-06-26T22:49:40.074Z","0.0.1":"2012-06-26T22:49:41.589Z","0.0.2":"2012-06-27T00:14:21.885Z","0.0.3":"2012-06-27T01:08:55.476Z","0.1.0":"2012-06-28T02:15:49.888Z","0.1.1":"2012-06-28T03:03:20.933Z","0.1.2":"2012-06-28T23:04:34.033Z","0.1.3":"2012-06-29T01:15:32.070Z","0.1.5":"2012-06-29T13:31:28.091Z","0.1.6":"2012-06-29T14:06:07.090Z","0.1.7":"2012-07-11T01:47:35.807Z","0.2.0":"2012-07-22T19:53:51.966Z","0.2.1":"2012-07-22T20:01:32.265Z"},"author":{"name":"Darren Schnare","email":"schnare.d@gmail.com"},"repository":{"type":"git","url":"git://github.com/dschnare/4web.git"},"_attachments":{"4web-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-zWFOfPt1vBRjlOLfpEzmaQ==","length":8683,"stub":true},"4web-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-OMKgbD5ipE3Eo8caCCGE+g==","length":8681,"stub":true},"4web-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Ivhmp86uDhUJxyGI76U7yA==","length":8223,"stub":true},"4web-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ndZGNwPXKRno8tk3clytiQ==","length":8217,"stub":true},"4web-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-h7S51jeagNeScdtjxnAb9g==","length":8186,"stub":true},"4web-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-GqpNIaP5BkYrCIStZKCMoQ==","length":8700,"stub":true},"4web-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-0F+6xQfcG0yrqYZWH1eQFA==","length":8682,"stub":true},"4web-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-0nhDUOeJaZQ7IqZ78pus3g==","length":8685,"stub":true},"4web-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-YhJ8dTYNoqeVqIQbg+h22w==","length":8251,"stub":true},"4web-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-loykXSo+Kth0keswHYa37A==","length":8184,"stub":true},"4web-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3xTrn5fGpME1kS1ZUES5pw==","length":7999,"stub":true},"4web-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eVWfqVHZTTI4Q9zGFplrUQ==","length":7984,"stub":true}}}},
{"id":"500px","key":"500px","value":{"rev":"7-da9bdb6ddbe95234edfb1f31ea67d9eb"},"doc":{"_id":"500px","_rev":"7-da9bdb6ddbe95234edfb1f31ea67d9eb","name":"500px","description":"A wrapper for the 500px.com API","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.0":{"name":"500px","description":"A wrapper for the 500px.com API","keywords":["api","500px"],"version":"0.2.0","homepage":"http://github.com/ro-ka/node-500px","repository":{"type":"git","url":"git://github.com/ro-ka/node-500px.git"},"author":{"name":"Robert Katzki","email":"robert@katzki.de","url":"http://katzki.de/"},"main":"./lib/api500px.js","dependencies":{},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/ro-ka/node-500px/raw/master/LICENSE"}],"_npmUser":{"name":"roka","email":"robert@katzki.de"},"_id":"500px@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"0f26398e3f0d8619d79507fe69d86cfd32ae6044","tarball":"http://registry.npmjs.org/500px/-/500px-0.2.0.tgz"},"maintainers":[{"name":"roka","email":"robert@katzki.de"}]},"0.3.0":{"name":"500px","description":"A wrapper for the 500px.com API","keywords":["api","500px"],"version":"0.3.0","homepage":"http://github.com/ro-ka/node-500px","repository":{"type":"git","url":"git://github.com/ro-ka/node-500px.git"},"author":{"name":"Robert Katzki","email":"robert@katzki.de","url":"http://katzki.de/"},"main":"./lib/api500px.js","dependencies":{},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/ro-ka/node-500px/raw/master/LICENSE"}],"_npmUser":{"name":"roka","email":"robert@katzki.de"},"_id":"500px@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"b71a2caeec03b51cd8160db8edb1caef46a3bb3f","tarball":"http://registry.npmjs.org/500px/-/500px-0.3.0.tgz"},"maintainers":[{"name":"roka","email":"robert@katzki.de"}]},"0.3.1":{"name":"500px","description":"A wrapper for the 500px.com API","keywords":["api","500px"],"version":"0.3.1","homepage":"http://github.com/ro-ka/node-500px","repository":{"type":"git","url":"git://github.com/ro-ka/node-500px.git"},"author":{"name":"Robert Katzki","email":"robert@katzki.de","url":"http://katzki.de/"},"main":"./lib/api500px.js","scripts":{"test":"make test"},"dependencies":{},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/ro-ka/node-500px/raw/master/LICENSE"}],"_npmUser":{"name":"roka","email":"robert@katzki.de"},"_id":"500px@0.3.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e5adf004a281936529a12a78007bcfd2618032c4","tarball":"http://registry.npmjs.org/500px/-/500px-0.3.1.tgz"},"maintainers":[{"name":"roka","email":"robert@katzki.de"}]}},"readme":"# node-500px\n\nA wrapper for the [500px](http://500px.com) API. At the moment only the functions without Auth are supported. Check out the [500px API page](http://developers.500px.com/).\n\n## LICENSE\n\n(MIT License)\n\nCopyright (c) 2011 Robert Katzki <robert@katzki.de>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"roka","email":"robert@katzki.de"}],"time":{"modified":"2012-04-23T12:45:05.288Z","created":"2011-11-07T16:10:38.222Z","0.2.0":"2011-11-07T16:10:40.378Z","0.3.0":"2011-11-07T21:12:25.711Z","0.3.1":"2012-04-23T12:45:05.288Z"},"author":{"name":"Robert Katzki","email":"robert@katzki.de","url":"http://katzki.de/"},"repository":{"type":"git","url":"git://github.com/ro-ka/node-500px.git"},"_attachments":{"500px-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-dAru6BAxS/ldDN/4j1cGhQ==","length":2766,"stub":true},"500px-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CC2mmJMjKQeT4X9q9VscHg==","length":2730,"stub":true},"500px-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yGNHs3oQzZV86H+JxkAN7A==","length":2680,"stub":true}}}},
{"id":"7digital-api","key":"7digital-api","value":{"rev":"32-40fd41322b2e955ece1ec8491e6f2099"},"doc":{"_id":"7digital-api","_rev":"32-40fd41322b2e955ece1ec8491e6f2099","name":"7digital-api","description":"Simple 7digital API wrapper for nodeJS","dist-tags":{"latest":"0.4.3"},"versions":{"0.1.0":{"name":"7digital-api","version":"0.1.0","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"spec/specs.js"},"main":"main.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.0","jasmine-node":">= 1.0.0rc1","step":">=0.0.3","eyes":">=0.1.6"},"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"7digital-api@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"9ff77fbd7a93214723ad1e69320bdf2c37f954b1","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"7digital-api","version":"0.1.1","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"spec/specs.js"},"main":"main.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.0","jasmine-node":">= 1.0.0rc1","step":">=0.0.3","eyes":">=0.1.6"},"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"7digital-api@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"54ca235dfe6e5e53cb3d1e1c54ae2116114bde16","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.1.1.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}],"directories":{}},"0.2.0":{"name":"7digital-api","version":"0.2.0","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"spec/specs.js"},"main":"main.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.0","step":">=0.0.3","eyes":">=0.1.6","jessie":">=0.3.7"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"7digital-api@0.2.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ab01a54bd13b0e33f405a8a954468115a2ed8b16","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.2.0.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}],"directories":{}},"0.2.1":{"name":"7digital-api","version":"0.2.1","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"spec/specs.js"},"main":"main.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.0","step":">=0.0.3","eyes":">=0.1.6","jessie":">=0.3.7","winston":"0.3.5"},"devDependencies":{},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.2.1/package/package.json","wscript":false,"serverjs":false,"contributors":["Raoul Millais <raoul.millais@7digital.com> (http://www.raoulmillais.com)","Tony To <tony.to@7digital.com> (http://tonyto.es)"]},"_id":"7digital-api@0.2.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"81e6e3e2484910350c013d13647c5b75fcbd33ad","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.2.1.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}],"directories":{}},"0.3.0-alpha":{"name":"7digital-api","version":"0.3.0-alpha","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"jessie -f nested spec/"},"main":"index.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.5","step":">=0.0.3","eyes":">=0.1.6","winston":"0.3.5","underscore":"1.1.7"},"devDependencies":{"docco":"0.3.0","jessie":">=0.3.7","jshint":"0.3.0"},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.3.0-alpha/package/package.json","wscript":false,"serverjs":false,"contributors":["Raoul Millais <raoul.millais@7digital.com> (http://www.raoulmillais.com)","Tony To <tony.to@7digital.com> (http://tonyto.es)"]},"_id":"7digital-api@0.3.0-alpha","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"cffa05ed8092708c87f22ab1a0db5b5674aff9af","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.3.0-alpha.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}]},"0.3.1-alpha":{"name":"7digital-api","version":"0.3.1-alpha","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"jessie -f nested spec/"},"main":"index.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.5","step":">=0.0.3","eyes":">=0.1.6","winston":"0.3.5","underscore":"1.1.7"},"devDependencies":{"docco":"0.3.0","jessie":">=0.3.7","jshint":"0.3.0"},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.3.1-alpha/package/package.json","wscript":false,"serverjs":false,"contributors":["Raoul Millais <raoul.millais@7digital.com> (http://www.raoulmillais.com)","Tony To <tony.to@7digital.com> (http://tonyto.es)"]},"_id":"7digital-api@0.3.1-alpha","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"cb12edaf21089c7202e076d6bec91aa7eaa7d959","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.3.1-alpha.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}]},"0.4.0":{"name":"7digital-api","version":"0.4.0","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"jessie -f nested spec/"},"main":"index.js","dependencies":{"sax":"0.1.2","xml2js":">= 0.1.5","oauth":"0.9.5","step":">=0.0.3","eyes":">=0.1.6","winston":"0.3.5","underscore":"1.1.7"},"devDependencies":{"docco":"0.3.0","jessie":">=0.3.7","jshint":"0.3.0"},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmJsonOpts":{"file":"/home/raoul/.npm/7digital-api/0.4.0/package/package.json","wscript":false,"serverjs":false,"contributors":["Raoul Millais <raoul.millais@7digital.com> (http://www.raoulmillais.com)","Tony To <tony.to@7digital.com> (http://tonyto.es)"]},"_id":"7digital-api@0.4.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"7abe3c00b11bb971f2ccb26384eb546173f69901","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.4.0.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}]},"0.4.1":{"name":"7digital-api","version":"0.4.1","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"jessie -f nested spec/"},"main":"index.js","dependencies":{"sax":"0.1.2","xml2js":"git://github.com/raoulmillais/node-xml2js.git","oauth":"0.9.5","step":">=0.0.3","eyes":">=0.1.6","winston":"0.5.7","underscore":"1.1.7"},"devDependencies":{"docco":"0.3.0","jessie":"git://github.com/rodzyn/jessie.git","jshint":"0.3.0"},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmUser":{"name":"raoulmillais","email":"raoul@raoulmillais.com"},"_id":"7digital-api@0.4.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"109ac70bb2032e7369ef1fa97b60623ebe8f5f1f","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.4.1.tgz"},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}]},"0.4.2":{"name":"7digital-api","version":"0.4.2","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"jessie -f nested spec/"},"main":"index.js","dependencies":{"sax":"0.1.2","xml2js":">=0.1.13","oauth":"0.9.5","step":">=0.0.3","eyes":">=0.1.6","winston":"0.5.7","underscore":"1.1.7"},"devDependencies":{"coffee-script":">=1.2.0","docco":"0.3.0","jessie":"git://github.com/rodzyn/jessie.git","jshint":"0.3.0"},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmUser":{"name":"raoulmillais","email":"raoul@raoulmillais.com"},"_id":"7digital-api@0.4.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b717d5adc3a7e439d98884d3c67da81d47359bd2","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.4.2.tgz"},"readme":"Node.js API Wrapper\n===================\n\n![7digital](http://cdn.7static.com/static/img/logo/7digital-GB.gif)\n\nCurrent head build status:\n\n[![Build Status](http://travis-ci.org/raoulmillais/node-7digital-api.png)](http://travis-ci.org/raoulmillais/node-7digital-api)\n\nAbout 7digital\n==============\n\n7digital.com is an online music store operating in over 16 countries and offering more than 11 million high quality DRM free MP3s (320kbps) from all major labels and wide range of idependent labels and distributors. 7digital API will give you access to the full catalogue including high quality album art, 30s preview clips for all tracks, commissions on sales, integrated purchasing and full length streaming. More details at [developer.7digital.net](http://developer.7digital.net/)\n\nWHAT IS THIS?\n=============\n\nA serverside javascript wrapper round the 7digital API which returns the responses parsed\ninto JavaScript objects.  Full code documentation can be found [here](http://raoulmillais.github.com/node-7digital-api/api.html)\n\nINSTALLATION\n============\n\nThe easiest way to use this wrapper is to install it via [npm](http://npmjs.org/)\n\n    npm install 7digital-api\n\nor globally\n\n    sudo npm install -g 7digital-api\n\nThen you can install via npm as usual (for npm >=1.0)\n\n    npm install\n\nUSAGE\n=====\n\nSee the examples folder for examples of how to use this.  If you have included 7digital-api in\nyour dependencies in the package.json file, you can use the like so:\n\n    var api = require('7digital-api'),\n        artists = new api.Artists();\n    \n    artists.getReleases({ artistid: 1 }, function(err, data) {\n        console.dir(data);\n    });\n\nIf you need to supply your own config or want XML responses, you do so like this:\n\n    var api, artists;\n\n    api = require('7digital-api').configure({\n        format: 'XML',\n        oauthkey: 'MY_KEY_HERE',\n        oauthsecret: 'MY_SECRET_HERE',\n    });\n    \n    artists = new api.Artists();\n    \n    artists.getReleases({ artistid: 1 }, function(err, data) {\n\t    console.dir(data);\n    });\t\n\nSee oauth.js in the examples folder for an example of how to acquire an oauth\naccess token to access any of the protected endpoints.\n\n\n*The bundled OAuth module must be used in place of a standard OAuth wrapper*\n\n    require('7digital-api').oauth,\n\nThis is to ensure the tokens are correctly parsed from the XML response.\n\nSee [developer.7digital.net](http://developer.7digital.net/) for full details of the API\nendpoints and the parameters they accept.\n\nTo run the tests:\n\n    npm test\n","maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}]},"0.4.3":{"name":"7digital-api","version":"0.4.3","description":"Simple 7digital API wrapper for nodeJS","homepage":["https://github.com/raoulmillais/node-7digital-api"],"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"keywords":["api","nodejs","7digital"],"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"licenses":["MIT"],"engines":["node >= 0.4.1"],"scripts":{"test":"jessie -f nested spec/"},"main":"index.js","dependencies":{"sax":"0.1.2","xml2js":">=0.1.13","oauth":"0.9.5","step":">=0.0.3","eyes":">=0.1.6","winston":"0.5.7","underscore":"1.1.7"},"devDependencies":{"coffee-script":">=1.2.0","docco":"0.3.0","jessie":"git://github.com/rodzyn/jessie.git","jshint":"0.3.0"},"contributors":[{"name":"Raoul Millais","email":"raoul.millais@7digital.com","url":"http://www.raoulmillais.com"},{"name":"Tony To","email":"tony.to@7digital.com","url":"http://tonyto.es"}],"_npmUser":{"name":"raoulmillais","email":"raoul@raoulmillais.com"},"_id":"7digital-api@0.4.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"34b6e56c51adb57daaaeb422da7123db79c4651d","tarball":"http://registry.npmjs.org/7digital-api/-/7digital-api-0.4.3.tgz"},"readme":"Node.js API Wrapper\n===================\n\n![7digital](http://cdn.7static.com/static/img/logo/7digital-GB.gif)\n\nCurrent head build status:\n\n[![Build Status](http://travis-ci.org/raoulmillais/node-7digital-api.png)](http://travis-ci.org/raoulmillais/node-7digital-api)\n\nAbout 7digital\n==============\n\n7digital.com is an online music store operating in over 16 countries and offering more than 11 million high quality DRM free MP3s (320kbps) from all major labels and wide range of idependent labels and distributors. 7digital API will give you access to the full catalogue including high quality album art, 30s preview clips for all tracks, commissions on sales, integrated purchasing and full length streaming. More details at [developer.7digital.net](http://developer.7digital.net/)\n\nWHAT IS THIS?\n=============\n\nA serverside javascript wrapper round the 7digital API which returns the responses parsed\ninto JavaScript objects.  Full code documentation can be found [here](http://raoulmillais.github.com/node-7digital-api/api.html)\n\nINSTALLATION\n============\n\nThe easiest way to use this wrapper is to install it via [npm](http://npmjs.org/)\n\n    npm install 7digital-api\n\nor globally\n\n    sudo npm install -g 7digital-api\n\nThen you can install via npm as usual (for npm >=1.0)\n\n    npm install\n\nUSAGE\n=====\n\nSee the examples folder for examples of how to use this.  If you have included 7digital-api in\nyour dependencies in the package.json file, you can use the like so:\n\n    var api = require('7digital-api'),\n        artists = new api.Artists();\n    \n    artists.getReleases({ artistid: 1 }, function(err, data) {\n        console.dir(data);\n    });\n\nIf you need to supply your own config or want XML responses, you do so like this:\n\n    var api, artists;\n\n    api = require('7digital-api').configure({\n        format: 'XML',\n        oauthkey: 'MY_KEY_HERE',\n        oauthsecret: 'MY_SECRET_HERE',\n    });\n    \n    artists = new api.Artists();\n    \n    artists.getReleases({ artistid: 1 }, function(err, data) {\n\t    console.dir(data);\n    });\t\n\nSee oauth.js in the examples folder for an example of how to acquire an oauth\naccess token to access any of the protected endpoints.\n\n\n*The bundled OAuth module must be used in place of a standard OAuth wrapper*\n\n    require('7digital-api').oauth,\n\nThis is to ensure the tokens are correctly parsed from the XML response.\n\nSee [developer.7digital.net](http://developer.7digital.net/) for full details of the API\nendpoints and the parameters they accept.\n\nTo run the tests:\n\n    npm test\n","maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}]}},"maintainers":[{"name":"raoulmillais","email":"raoul@raoulmillais.com"}],"time":{"modified":"2011-12-21T16:39:12.744Z","created":"2011-06-30T16:13:35.010Z","0.1.0":"2011-06-30T16:13:35.460Z","0.1.1":"2011-08-03T07:57:13.071Z","0.2.0":"2011-08-10T07:18:32.563Z","0.2.1":"2011-08-10T13:06:53.191Z","0.3.0-alpha":"2011-09-06T10:57:52.403Z","0.3.1-alpha":"2011-09-06T11:52:42.736Z","0.4.0":"2011-10-21T16:43:22.389Z","0.4.1":"2011-12-16T14:29:00.527Z","0.4.2":"2011-12-21T15:46:34.070Z","0.4.3":"2011-12-21T16:39:12.744Z"},"author":{"name":"Raoul Millais","email":"raoul@raoulmillais.com","url":"http://www.raoulmillais.com/"},"repository":{"type":"git","url":"git://github.com/raoulmillais/node-7digital-api.git"},"users":{"raoulmillais":true,"henryoswald":true,"philbo":true,"antonydenyer":true},"_attachments":{"7digital-api-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-hdpxssEAq8ekQOWzQWG3+w==","length":17991,"stub":true},"7digital-api-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-H8obZ0VZyRnBCz2NG2yGAw==","length":17535,"stub":true},"7digital-api-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-wPWGdS6nbZB71hHFb7w59w==","length":31888,"stub":true},"7digital-api-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-mBk8aNDS47DZV4VSsplrsA==","length":32489,"stub":true},"7digital-api-0.3.1-alpha.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-CKjgndTA+spGjNMH4lzimA==","length":29836,"stub":true},"7digital-api-0.3.0-alpha.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-xr8qPH5Ws33XvyEyeyJz0g==","length":29399,"stub":true},"7digital-api-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-dry0Gi1p6cvpKbLvfkhh2w==","length":32116,"stub":true},"7digital-api-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mLbEWmT6Bqj/hC4BU7EFnQ==","length":51072,"stub":true},"7digital-api-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ff+1K88lonXsvcjcWmCjmQ==","length":51123,"stub":true},"7digital-api-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JboIICXyg7oeZ0uuESdlrw==","length":50808,"stub":true}}}},
{"id":"A","key":"A","value":{"rev":"3-30cab556999d4fc3eba608c222652bcf"},"doc":{"_id":"A","_rev":"3-30cab556999d4fc3eba608c222652bcf","name":"A","description":"Minimal promise implementation from the CommonJS Promises/A specification","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"A","version":"0.0.1","main":"lib/A.js","description":"Minimal promise implementation from the CommonJS Promises/A specification","keywords":["promise"],"homepage":"http://github.com/grahamlyons/A","repository":{"type":"git","url":"git://github.com/grahamlyons/A.git"},"devDependencies":{"litmus":">=0.4.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"grahamlyons","email":"graham@grahamlyons.com"},"_id":"A@0.0.1","dependencies":{"litmus":">=0.4.0"},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4528c21b00a87ac0aac55a8360f4f78aae3f135b","tarball":"http://registry.npmjs.org/A/-/A-0.0.1.tgz"},"readme":"","maintainers":[{"name":"grahamlyons","email":"graham@grahamlyons.com"}]}},"readme":"","maintainers":[{"name":"grahamlyons","email":"graham@grahamlyons.com"}],"time":{"modified":"2012-03-07T12:52:54.931Z","created":"2012-03-07T12:52:33.815Z","0.0.1":"2012-03-07T12:52:54.931Z"},"repository":{"type":"git","url":"git://github.com/grahamlyons/A.git"},"_attachments":{"A-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tOH5QdFrFfTazN/0m6Wd9w==","length":2904,"stub":true}}}},
{"id":"ABAValidator","key":"ABAValidator","value":{"rev":"17-0684d99323e4c084061b5231f62e7e1c"},"doc":{"_id":"ABAValidator","_rev":"17-0684d99323e4c084061b5231f62e7e1c","name":"ABAValidator","description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","dist-tags":{"latest":"1.0.4"},"versions":{"0.0.1":{"name":"ABAValidator","version":"0.0.1","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["ach","validation"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"60593b8dee12574d9d8db58262ae97367961854f","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-0.0.1.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"0.0.2":{"name":"ABAValidator","version":"0.0.2","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"390f7e3796df0287c6cb3b868985c188a44962fb","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-0.0.2.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"0.0.3":{"name":"ABAValidator","version":"0.0.3","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","homepage":"https://github.com/JamesEggers1/node-ABAValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"9ad8d98ee6276819417d0a0d6918918184a7082e","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-0.0.3.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.0":{"name":"ABAValidator","version":"1.0.0","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","homepage":"https://github.com/JamesEggers1/node-ABAValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"devDependencies":{"should":"*","mocha":"*"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@1.0.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"bcbbbb13c5074eb6a91d05d7bb5233676e00a779","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-1.0.0.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.1":{"name":"ABAValidator","version":"1.0.1","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","homepage":"https://github.com/JamesEggers1/node-ABAValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"mocha tests/aba-validation-tests.js -R spec"},"tags":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.0"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@1.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d8908853d7b061e2675ec322ebc7eb2b1256f809","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-1.0.1.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.2":{"name":"ABAValidator","version":"1.0.2","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","homepage":"https://github.com/JamesEggers1/node-ABAValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"mocha tests/aba-validation-tests.js -R spec"},"tags":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.1"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@1.0.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a95afc616a32d5fcd44341d757d1b05169608868","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-1.0.2.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.3":{"name":"ABAValidator","version":"1.0.3","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","homepage":"https://github.com/JamesEggers1/node-ABAValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"mocha tests/aba-validation-tests.js -R spec"},"keywords":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.1"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"ABAValidator@1.0.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8a174a1c71c3af67409c8da289e49c257f6879f5","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-1.0.3.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.4":{"name":"ABAValidator","version":"1.0.4","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A validation module for browsers and Node.js to validate an American Bankers Association Routing Number used in ACH payments.","homepage":"https://github.com/JamesEggers1/node-ABAValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"main":"./src/aba-validation","engines":{"node":"*"},"scripts":{"test":"mocha tests/aba-validation-tests.js -R spec","client-install":"node bin/client-install.js","install":"node bin/client-install-directions.js","update":"node bin/client-install-directions.js"},"keywords":["ach","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-ABAValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.1"},"readme":"ABAValidator  [![Build Status](https://secure.travis-ci.org/JamesEggers1/node-ABAValidator.png)](http://travis-ci.org/JamesEggers1/node-ABAValidator)\n=============\n\nThe American Bankers Association validation module provides a way of validating US-based Routing Number both on the client side in the user's browser as well as server side with Node.js.\n\n## Installation ##\n\n    npm install ABAValidator\n\n## Testing ##\n\nThe ABAValidator module has unit tests built around it than can be used to verify the package before usage.  The tests are written with the Mocha and Should modules and running the below command will import such.  \n\n    npm test ABAValidator\n\n## Usage ##\n\nOnce the package has been installed using `npm`, using the module is very simple.  At the moment, the module includes an `ABAValidator` object that exposes a single method, `validate`.  `validate` accepts a single string parameter that represents the routing number.\n\n#### Node.js ####\n\n```javascript\nvar aba = require(\"ABAValidator\").ABAValidator;\nvar is_valid = aba.validate(\"123123123\"); // should respond true.\n```\n\n## Using ABAValidator Client-Side ##\nIn addition to being usable as a Node.js module, the validator can also be used client-side in the user's web browser.  When you install `ABAValidator` using `npm`, instructions will appear how to install it for client-side JavaScript consumption.\n\nWhile you can copy the `aba-validation.js` file from the module's installation directory under `node_modles`, an automated script has been provided to assist you in this copy process and to make it more streamlined.  To do a client-side install, simply type the following `npm` command:\n\n    npm run-script ABAValidator client-install\n\nOnce you run that command, you'll be prompted to provide the path to which to install `aba-validation.js` for use by your client-side JavaScript.  At that point, you can reference the file in your html and JavaScript code as shown below.\n\n\n#### Html ####\n\n```html\n<script type=\"text/javascript\" src=\"path/to/aba-validation.js\"></script>\n```\n\n#### JavaScript ####\n\n```javascript\nvar aba = ABAValidator;\nvar is_valid = aba.validate(\"123123123\"); // should respond true.\n```\n\nBy default, the ABAValidator module places itself into the global scope in the browser.  If you would prefer to NOT have it be directly attached to the `window` object, you can add your own `namespace` at the top of the aba-validator.js file.\n\n## License (MIT) ##\n\nCopyright (c) 2012 James Eggers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"ABAValidator@1.0.4","dist":{"shasum":"140b3b5ef2adf0899be09775be86812c13ec76b1","tarball":"http://registry.npmjs.org/ABAValidator/-/ABAValidator-1.0.4.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]}},"readme":"ABAValidator\n=============\n\nThe American Bankers Association validation module provides a way of validating US-based Routing Number both on the client side in the user's browser as well as server side with Node.js.\n\n## Installation ##\n\n    npm install ABAValidator\n\n## Testing ##\n\nThe ABAValidator module has unit tests built around it than can be used to verify the package before usage.  The tests are written with the Mocha and Should modules and running the below command will import such.  \n\n    npm test ABAValidator\n\n## Node.js Usage ##\n\nTBD\n\n## Web Browser Usage ##\n\nTBD\n\n## License ##\n\nCopyright (c) 2012 James Eggers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}],"time":{"modified":"2012-08-08T01:41:14.068Z","created":"2012-05-29T18:54:34.092Z","0.0.1":"2012-05-29T18:54:35.164Z","0.0.2":"2012-05-29T20:54:08.933Z","0.0.3":"2012-05-29T20:56:53.069Z","1.0.0":"2012-06-17T00:43:56.423Z","1.0.1":"2012-06-24T02:31:34.514Z","1.0.2":"2012-06-26T14:04:19.245Z","1.0.3":"2012-07-02T19:46:31.697Z","1.0.4":"2012-08-08T01:41:14.068Z"},"author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"repository":{"type":"git","url":"git://github.com/JamesEggers1/node-ABAValidator.git"},"_attachments":{"ABAValidator-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-tQWDDhsCMr/yDm3U7uaZVg==","length":4152,"stub":true},"ABAValidator-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Z2AaguJV4rAjtTlAeuuTXA==","length":2715,"stub":true},"ABAValidator-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-GU6mXEclL+m7Bb2xeE78aA==","length":2622,"stub":true},"ABAValidator-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-p5HVKKpt7BCMtPDL83mpwA==","length":2615,"stub":true},"ABAValidator-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6plhZaOI4knLcg3dlrAf5Q==","length":2652,"stub":true},"ABAValidator-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yiBDfWb7y9k3jfiPel65VQ==","length":2601,"stub":true},"ABAValidator-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZM8RasnBwZeXPh3NSPt89w==","length":2589,"stub":true},"ABAValidator-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-e8pyjKJlwVey1CNCcOc8NQ==","length":2199,"stub":true}}}},
{"id":"AMD","key":"AMD","value":{"rev":"7-3b4305a9c786ab4c5ce611e7f0de0aca"},"doc":{"_id":"AMD","_rev":"7-3b4305a9c786ab4c5ce611e7f0de0aca","name":"AMD","description":"AMD (Asynchronous Module Definition) support for node.js, specifically define()","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"AMD","version":"0.0.1","description":"AMD (Asynchronous Module Definition) support for node.js, specifically define()","homepage":"http://github.com/CrabDude/amd","repository":{"type":"git","url":"git://github.com/CrabDude/amd.git"},"bugs":{"url":"http://github.com/CrabDude/AMD/issues"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com","url":"http://noderiety.com"},"main":"lib/amd","directories":{"lib":"./lib/"},"engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"keywords":["amd","define","module"],"dependencies":{},"devDependencies":{},"_id":"AMD@0.0.1","_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"8660dafff4dc66442e12c52784fbd0bc7ab90d05","tarball":"http://registry.npmjs.org/AMD/-/AMD-0.0.1.tgz"},"scripts":{}},"0.0.2":{"name":"AMD","version":"0.0.2","description":"AMD (Asynchronous Module Definition) support for node.js, specifically define()","homepage":"http://github.com/CrabDude/amd","repository":{"type":"git","url":"git://github.com/CrabDude/amd.git"},"bugs":{"url":"http://github.com/CrabDude/AMD/issues"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com","url":"http://noderiety.com"},"main":"lib/amd","directories":{"lib":"./lib/"},"engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"keywords":["amd","define","module"],"dependencies":{},"devDependencies":{},"_id":"AMD@0.0.2","_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"5bccc62ba64afc243381b100edc6f6e2928cb360","tarball":"http://registry.npmjs.org/AMD/-/AMD-0.0.2.tgz"},"scripts":{}},"0.0.3":{"name":"AMD","version":"0.0.3","description":"AMD (Asynchronous Module Definition) support for node.js, specifically define()","homepage":"http://github.com/CrabDude/amd","repository":{"type":"git","url":"git://github.com/CrabDude/amd.git"},"bugs":{"url":"http://github.com/CrabDude/AMD/issues"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com","url":"http://noderiety.com"},"main":"lib/amd","directories":{"lib":"./lib/"},"engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"keywords":["amd","define","module"],"dependencies":{},"devDependencies":{},"_id":"AMD@0.0.3","_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"9bbe8dd4dd4d3c84467414df934c70cf38fd9fea","tarball":"http://registry.npmjs.org/AMD/-/AMD-0.0.3.tgz"},"scripts":{}}},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"time":{"modified":"2011-07-26T17:51:36.481Z","created":"2011-07-26T17:19:40.537Z","0.0.1":"2011-07-26T17:20:01.236Z","0.0.2":"2011-07-26T17:47:45.617Z","0.0.3":"2011-07-26T17:51:36.481Z"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com","url":"http://noderiety.com"},"repository":{"type":"git","url":"git://github.com/CrabDude/amd.git"},"_attachments":{"AMD-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DTAmEDdW9JV1sbqCGBWP8Q==","length":1556,"stub":true},"AMD-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-g/jidVSD7TIpK/0X+xtIJw==","length":1556,"stub":true},"AMD-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Cm4Oi0y30PZBGQv8mSmJ/Q==","length":1378,"stub":true}}}},
{"id":"ANSIdom","key":"ANSIdom","value":{"rev":"3-b382a5812b98a476f11fa6b908449cb9"},"doc":{"_id":"ANSIdom","_rev":"3-b382a5812b98a476f11fa6b908449cb9","name":"ANSIdom","description":"a quick and dirty DOM implementation in ANSI escape codes","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"ANSIdom","version":"0.0.1","author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"description":"a quick and dirty DOM implementation in ANSI escape codes","main":"./lib/ANSIdom","repository":{"type":"git","url":"git://github.com/marak/ANSIdom.git"},"dependencies":{"jsdom":"0.2.x","colors":"*","charm":"*"},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"marak","email":"marak.squires@gmail.com"},"_id":"ANSIdom@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"ef7af1e6f60bc82f86ec6a7b37d211bb48d50cfd","tarball":"http://registry.npmjs.org/ANSIdom/-/ANSIdom-0.0.1.tgz"},"maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}]}},"maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2011-10-27T03:12:20.547Z","created":"2011-10-27T03:11:41.299Z","0.0.1":"2011-10-27T03:12:20.547Z"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"git://github.com/marak/ANSIdom.git"},"_attachments":{"ANSIdom-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q/D5AONGTXapD93krcUVFg==","length":30720,"stub":true}}}},
{"id":"APIConnect","key":"APIConnect","value":{"rev":"3-33fd818e45337fd71893b8a86cd60c1a"},"doc":{"_id":"APIConnect","_rev":"3-33fd818e45337fd71893b8a86cd60c1a","name":"APIConnect","description":"A simplified Javascript interface for working with APIs.","dist-tags":{"latest":"0.6.0"},"versions":{"0.6.0":{"name":"APIConnect","version":"0.6.0","description":"A simplified Javascript interface for working with APIs.","keywords":["api","rest","routing","cross-domain","ajax"],"homepage":"http://andrewplummer.github.com/APIConnect/","author":{"name":"Andrew Plummer"},"main":"./lib/main","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/andrewplummer/APIConnect.git"},"dependencies":{"request":">= 2.9.153","jquery-deferred":">= 0.2.0"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"l_andrew_l","email":"plummer.andrew@gmail.com"},"_id":"APIConnect@0.6.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"514d2b0d3f7e80c6de653f0aba413f31b5265dd2","tarball":"http://registry.npmjs.org/APIConnect/-/APIConnect-0.6.0.tgz"},"maintainers":[{"name":"l_andrew_l","email":"plummer.andrew@gmail.com"}]}},"readme":"# APIConnect\n\nThis class creates a very easy and intuitive way to interact with APIs,\nmost commonly those hosted on other domains.\n\nSetup:\n\n```\nvar twitter = new APIConnect();\ntwitter.domain('api.twitter.com');\ntwitter.get('statuses/home_timeline');\ntwitter.getHomeTimeline();\n\n> GET http://api.twitter.com/statuses/home_timeline.json\n```\n\nThe route `statuses/home_timeline` will be automatically set up and accessible through a camelized\nmethod name in the api object. Calling the route is as simple as calling the method.\n\nWhen making the call, the first object is `params`. This will most commonly be added to the end of\nthe query string, but in cases where the route contains params such as `tweets/:tweet_id`, it will\nbe placed here instead and removed from the query string.\n\nThe second object passed is an options hash. This will override any default params and also end up\nbeing passed to the AJAX lib, in this case jQuery. Any valid option for `jQuery.ajax` is allowed here.\nThis means that all the standard callbacks will work:\n\n```\ntwitter.getHomeTimeline({}, {\n  success: function() {\n    // Congratulations!\n  },\n  error: function() {\n    // Oh noeee... failure!\n  }\n});\n```\n\nAPI calls will also pass back jQuery deferred objects, so these can be used as well:\n\n```\ntwitter.getHomeTimeline().then(function() {\n  // You're done!\n});\n```\n\nAny route can be set up with any level of context. These contexts are always optional, and will only be\nadded if they exist when passed as params:\n\n```\ntwitter.get(':user/:list_id/members');\ntwitter.getMembers({ user: 'bob', list_id: 5 });\n\n> GET http://api.twitter.com/bob/5/members.json\n```\n\nTo connect routes, the 4 main HTTP verbs, \"GET\", \"POST\", \"PUT\", and \"DELETE\" are supported, and map to\nthe method names \"get\", \"create\", \"update\", and \"destroy\", respectively (note \"del\", which is a reserved\nkeyword):\n\n```\ntwitter.post(':user/:list_id/members');\ntwitter.del(':user/:list_id/members');\n\ntwitter.createMember({ user: 'bob', list_id: 5, member_name: 'harry' });\n\n> POST http://api.twitter.com/bob/5/members.json?member_name=harry\n\ntwitter.destroyMember({ user: 'bob', list_id: 5 });\n\n> DELETE http://api.twitter.com/bob/5/members.json\n```\n\n\"resource\" serves as a shortcut to all 4 HTTP verbs:\n\n\n```\ntwitter.resource('member');\n\ntwitter.getMember();     > GET     http://api.twitter.com/member.json\ntwitter.createMember();  > POST    http://api.twitter.com/member.json\ntwitter.updateMember();  > PUT     http://api.twitter.com/member.json\ntwitter.destroyMember(); > DELETE  http://api.twitter.com/member.json\n```\n\nIf a resource is a collection, passing `collection: true` in the options for \"resource\" will create standard\ncollection routes including an \"index\" method:\n\n\n```\ntwitter.resource('status', { collection: true });\n\ntwitter.getStatus();              > GET     http://api.twitter.com/status.json\ntwitter.getStatus({ id: 3});      > GET     http://api.twitter.com/status/3.json\ntwitter.createStatus();           > POST    http://api.twitter.com/status.json\ntwitter.updateStatus({ id: 3 });  > PUT     http://api.twitter.com/status/3.json\ntwitter.destroyStatus({ id: 3 }); > DELETE  http://api.twitter.com/status/3.json\n```\n\nIf a \"collection\" is omitted, it will attempt to be intelligently detected by the pluralization of the\nresource passed. In this case, pluralization of the methods will also use intelligent detection:\n\n```\ntwitter.resource('members');\n\ntwitter.getMembers();              > GET     http://api.twitter.com/members.json\ntwitter.getMembers({ id: 3});      > GET     http://api.twitter.com/members/3.json\ntwitter.createMembers();           > POST    http://api.twitter.com/members.json\ntwitter.updateMembers({ id: 3 });  > PUT     http://api.twitter.com/members/3.json\ntwitter.destroyMembers({ id: 3 }); > DELETE  http://api.twitter.com/members/3.json\n```\n\n\n\n... more docs to come!\n\n","maintainers":[{"name":"l_andrew_l","email":"plummer.andrew@gmail.com"}],"time":{"modified":"2012-03-21T14:44:35.838Z","created":"2012-03-21T14:44:33.073Z","0.6.0":"2012-03-21T14:44:35.838Z"},"author":{"name":"Andrew Plummer"},"repository":{"type":"git","url":"git://github.com/andrewplummer/APIConnect.git"},"_attachments":{"APIConnect-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Nyzrzo+CJqdmI4Zfo6Famw==","length":122941,"stub":true}}}},
{"id":"AQ","key":"AQ","value":{"rev":"5-46bf13e0198c8a85037a0a103f285d00"},"doc":{"_id":"AQ","_rev":"5-46bf13e0198c8a85037a0a103f285d00","name":"AQ","description":"App which automates QUnit tests","dist-tags":{"latest":"0.0.1"},"versions":{"1.0.0":{"name":"AQ","version":"1.0.0","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"MIT","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"AQ@1.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"316fc859159138bbb05df455ac8b841d24b489dc","tarball":"http://registry.npmjs.org/AQ/-/AQ-1.0.0.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]},"0.0.1":{"name":"AQ","version":"0.0.1","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"MIT","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"AQ@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"ae9c282e1d3be858351da5fb9c24abb7113ab4c1","tarball":"http://registry.npmjs.org/AQ/-/AQ-0.0.1.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]}},"readme":"Automate QUnit tests","maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}],"time":{"modified":"2012-04-26T03:20:17.914Z","created":"2012-04-26T03:17:25.164Z","1.0.0":"2012-04-26T03:17:27.233Z","0.0.1":"2012-04-26T03:20:17.914Z"},"author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"_attachments":{"AQ-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-oFmoI1/17RvqoqHAVAcoZw==","length":10240,"stub":true},"AQ-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vpiGQp4vys6JrKP9mnI5NA==","length":10240,"stub":true}}}},
{"id":"Accessor","key":"Accessor","value":{"rev":"7-0e1dd1c087444b7abb84d5d554cd5bae"},"doc":{"_id":"Accessor","_rev":"7-0e1dd1c087444b7abb84d5d554cd5bae","name":"Accessor","description":"A database wrapper, provide easy access to databases","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor","description":"A database wrapper, provide easy access to database without writing SQL code","version":"0.1.0","homepage":"https://github.com/bu/Accessor","repository":{"type":"git","url":"git://github.com/bu/Accessor.git"},"dependencies":{"mysql":"0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"54ccc3c86aa07e6c5b77a4545894140e51f23d86","tarball":"http://registry.npmjs.org/Accessor/-/Accessor-0.1.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.1.5":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor","description":"A database wrapper, provide easy access to database without writing SQL code","version":"0.1.5","homepage":"https://github.com/bu/Accessor","repository":{"type":"git","url":"git://github.com/bu/Accessor.git"},"dependencies":{"mysql":"0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor@0.1.5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"90f1f29141d0a33727fe7296b9335f2047891ed6","tarball":"http://registry.npmjs.org/Accessor/-/Accessor-0.1.5.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.2.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor","description":"A database wrapper, provide easy access to databases","version":"0.2.0","homepage":"https://github.com/bu/Accessor","repository":{"type":"git","url":"git://github.com/bu/Accessor.git"},"dependencies":{"Accessor_Singleton":">=0.1.0"},"devDependencies":{},"optionalDependencies":{"Accessor_Singleton":">=0.1.0"},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor@0.2.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"_from":"Accessor","dist":{"shasum":"955eb9973731cbcbeb38c3e107b1a4b1cfd8afc6","tarball":"http://registry.npmjs.org/Accessor/-/Accessor-0.2.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]}},"readme":"# Accessor 0.1.0\n\nA database wrapper, provide easy access to database without writing SQL code\n\n\n## Install & Setup\n\n1. Create a config directory under your application, e.g.\n   \n    \tbuGit/config/\n2. Then, create a database.js under config directory we just created, which contains like:\n\n\t\tvar databaseConfig = { \n    \t\tuser: \"YOUR_DATABASE_USER\",\n\t\t    password: \"YOUR_DATABASE_PASSWORD\",\n\t    \tdatabase: \"TARGET_DATABASE\",\n\t    \thost: \"localhost\",\n    \t\tport: 3306\n\t\t};\n\n\t\tmodule.exports = databaseConfig;\n\n3. Now, Accessor is ready to use.\n\n\n## Usage\n\n1. Require the Accessor module in your script\n\n\t\tvar Accessor = require(\"Accessor\");\n\n2. Place constructor where you need the Accessor\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_TABLE\");\n\n3. After initialization, Accessor will try to obtain the schema, and store it to verify  column existence while updating or creating.\n\n### Methods\n\n#### tester.select( {options}, callback(err, data, fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [\n\t\t\t\t[\"id\", \">\", 10],\n\t\t\t\t\"AND\",\n\t\t\t\t[\"email\",\"LIKE\",\"%@gmail.com\"]\n\t\t\t],\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields \t\t\n \n##### Note\n \nOptions may omit which retrieve all records, i.e.\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\ttester.select( function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\n#### tester.create( {dataObject}, callback(err, info) );\n\nInsert data record by given dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t} );\n\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we insert that to sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n\n#### tester.update( {options}, {updated_dataObject}, callback(err, info) );\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we update that in sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n\n#### tester.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\nLicensed under the MIT License\n\n### TODO\n\n* Check in where statement\n* Log\n","maintainers":[{"name":"bu","email":"bu@hax4.in"}],"time":{"modified":"2012-05-30T00:20:28.308Z","created":"2012-05-19T18:45:35.212Z","0.1.0":"2012-05-19T18:45:39.007Z","0.1.5":"2012-05-28T02:13:29.609Z","0.2.0":"2012-05-30T00:20:28.308Z"},"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"repository":{"type":"git","url":"git://github.com/bu/Accessor.git"},"_attachments":{"Accessor-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QBuzghaYUMik3Hatcrol6w==","length":2121,"stub":true},"Accessor-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ljHv9YUucIjkJXocUSFUfQ==","length":3298,"stub":true},"Accessor-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iy8jv2auKsMznvmdmsN0Mw==","length":3215,"stub":true}}}},
{"id":"Accessor_MongoDB","key":"Accessor_MongoDB","value":{"rev":"11-545bcf26bffd422155c0d8d56c01f167"},"doc":{"_id":"Accessor_MongoDB","_rev":"11-545bcf26bffd422155c0d8d56c01f167","name":"Accessor_MongoDB","description":"A MongoDB wrapper for Accessor database layer","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.1":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in"},"name":"Accessor_MongoDB","description":"A MongoDB wrapper for Accessor database layer","version":"0.1.1","homepage":"https://github.com/bu/Accessor_MongoDB","repository":{"url":"git://github.com/bu/Accessor_MongoDB.git"},"dependencies":{"mongodb":">=1.0.2","Accessor":">=0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_MongoDB@0.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"108a9982f162404ebe537d35f3e5c20fe0ea4db1","tarball":"http://registry.npmjs.org/Accessor_MongoDB/-/Accessor_MongoDB-0.1.1.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.1.2":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in"},"name":"Accessor_MongoDB","description":"A MongoDB wrapper for Accessor database layer","version":"0.1.2","homepage":"https://github.com/bu/Accessor_MongoDB","repository":{"url":"git://github.com/bu/Accessor_MongoDB.git"},"dependencies":{"mongodb":">=1.0.2","Accessor":">=0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_MongoDB@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2cd49a9b5fd2cede2a9a297fc25c4f3e2cf0dab5","tarball":"http://registry.npmjs.org/Accessor_MongoDB/-/Accessor_MongoDB-0.1.2.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.1.3":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in"},"name":"Accessor_MongoDB","description":"A MongoDB wrapper for Accessor database layer","version":"0.1.3","homepage":"https://github.com/bu/Accessor_MongoDB","repository":{"url":"git://github.com/bu/Accessor_MongoDB.git"},"dependencies":{"mongodb":">=1.0.2","Accessor":">=0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_MongoDB@0.1.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fb55f339f34a5b1d4c60ccbcedaf6410cf36f893","tarball":"http://registry.npmjs.org/Accessor_MongoDB/-/Accessor_MongoDB-0.1.3.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.2.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in"},"name":"Accessor_MongoDB","description":"A MongoDB wrapper for Accessor database layer","version":"0.2.0","homepage":"https://github.com/bu/Accessor_MongoDB","repository":{"url":"git://github.com/bu/Accessor_MongoDB.git"},"dependencies":{"mongodb":">=1.0.2","Accessor":">=0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# Accesor_MongoDB 0.1.3\n\nA wrapper for Access to connect with ease and flexiblity.\n\n---\n\n## Package Install\n\n1. Install via npm is a prefer way for users to obtain a copy of Access_MongoDB\n\t\t\n\t\tnpm install Accessor_MongoDB\n\n2. Create a config directory under your application directory, create a file called **databaseConfig.js** which may contains like this:\n\n\t\tvar databaseConfig = { \n\t\t\t// server\n\t\t\thost: \"localhost\",\n\t\t\t\n\t\t\tserver_options: {\n\t\t\t\tauto_reconnect: true,\n\t\t\t},  \n        \n        \t// database\n        \tname: \"ddns\",\n        \t\n        \tdb_options: {\n        \t\tnative_parser: true,\n        \t},  \n        };\n        \n        module.exports = databaseConfig;\n\n3. Now, Accessor_MongoDB is ready.\n\n## Usage\n\n1. Require the Accessor module in your script\n\n2. Place constructor where you need that. And don't forget to specify database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_COLLECTION\", \"MongoDB\");\n\n3. After initialization, Accessor will connect to MongoDB server.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data_fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tname: \"bu\"\n\t\t\t},\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t});\n\t\t\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields\n \n##### Note\n \nOptions may omit, which retrieve all records, i.e.\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\ttester.select( function(err, data) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t});\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\n\nInsert data record by given dataObject\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t});\n\n#### accessor.update( {options}, {dataObject}, callback(err, info) );\n\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","_id":"Accessor_MongoDB@0.2.0","dist":{"shasum":"35c84167a83dcc5e1679ec481956cb9ca23dc35f","tarball":"http://registry.npmjs.org/Accessor_MongoDB/-/Accessor_MongoDB-0.2.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.2.5":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in"},"name":"Accessor_MongoDB","description":"A MongoDB wrapper for Accessor database layer","version":"0.2.5","homepage":"https://github.com/bu/Accessor_MongoDB","repository":{"url":"git://github.com/bu/Accessor_MongoDB.git"},"dependencies":{"mongodb":">=1.0.2","Accessor":">=0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# Accesor_MongoDB 0.2.5\n\nA wrapper for Access to connect with ease and flexiblity.\n\n---\n\n## Package Install\n\n1. Install via npm is a prefer way for users to obtain a copy of Access_MongoDB\n\t\t\n\t\tnpm install Accessor_MongoDB\n\n2. Create a config directory under your application directory, create a file called **databaseConfig.js** which may contains like this:\n\n\t\tvar databaseConfig = { \n\t\t\t// server\n\t\t\thost: \"localhost\",\n\t\t\t\n\t\t\tserver_options: {\n\t\t\t\tauto_reconnect: true,\n\t\t\t},  \n        \n        \t// database\n        \tname: \"ddns\",\n        \t\n        \tdb_options: {\n        \t\tnative_parser: true,\n\t\t\t\t// if this set to true, you will need to compile the native bson module via npm install mongodb --mongodb:native\n        \t},  \n        };\n        \n        module.exports = databaseConfig;\n\n3. Now, Accessor_MongoDB is ready.\n\n## Usage\n\n1. Require the Accessor module in your script\n\n2. Place constructor where you need that. And don't forget to specify database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_COLLECTION\", \"MongoDB\");\n\n3. After initialization, Accessor will connect to MongoDB server.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data_fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tname: \"bu\"\n\t\t\t},\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\n\t\t\tsort: { name: 1 },\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t});\n\t\t\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields\n * distinct\n * count_only: true to return only countings\n \n##### Note\n \nOptions may omit, which retrieve all records, i.e.\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\ttester.select( function(err, data) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t});\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\n\nInsert data record by given dataObject\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t});\n\n#### accessor.update( {options}, {dataObject}, callback(err, info) );\n\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\nDespite it simple syntax, in fact, you could do more with it:\nIf given dataObject is wrapper in MongoDB operator, it will automaticlly use that mode to update.\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\t$unset: {\n\t\t\t\temail: 1\n\t\t\t}\n\t\t};\n\t\t\n\t\tvar options = { \n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t};\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","_id":"Accessor_MongoDB@0.2.5","dist":{"shasum":"78ab4481a3d1e35c878843a0ee13e3535f5673ea","tarball":"http://registry.npmjs.org/Accessor_MongoDB/-/Accessor_MongoDB-0.2.5.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]}},"readme":"# Accesor_MongoDB 0.1.1\n\nA wrapper for Access to connect with ease and flexiblity.\n\n---\n\n## Package Install\n\n1. Install via npm is a prefer way for users to obtain a copy of Access_MongoDB\n\t\t\n\t\tnpm install Accessor_MongoDB\n\n2. Create a config directory under your application directory, create a file called **database.js** which may contains like this:\n\n\t\tvar databaseConfig = { \n\t\t\t// server\n\t\t\thost: \"localhost\",\n\t\t\t\n\t\t\tserver_options: {\n\t\t\t\tauto_reconnect: true,\n\t\t\t},  \n        \n        \t// database\n        \tname: \"ddns\",\n        \t\n        \tdb_options: {\n        \t\tnative_parser: true,\n        \t},  \n        };\n        \n        module.exports = databaseConfig;\n\n3. Now, Accessor_MongoDB is ready.\n\n## Usage\n\n1. Require the Accessor module in your script\n\n2. Place constructor where you need that. And don't forget to specify database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_COLLECTION\", \"MongoDB\");\n\n3. After initialization, Accessor will connect to MongoDB server.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data_fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tname: \"bu\"\n\t\t\t},\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t});\n\t\t\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields\n \n##### Note\n \nOptions may omit, which retrieve all records, i.e.\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\ttester.select( function(err, data) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t});\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\n\nInsert data record by given dataObject\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t});\n\n#### accessor.update( {options}, {dataObject}, callback(err, info) );\n\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: {\n\t\t\t\tusername: \"bu\"\n\t\t\t}\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\tvar tester = Accessor(\"test_collection\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t});\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License","maintainers":[{"name":"bu","email":"bu@hax4.in"}],"time":{"modified":"2012-07-21T05:02:10.421Z","created":"2012-05-30T04:33:21.425Z","0.1.1":"2012-05-30T04:33:26.749Z","0.1.2":"2012-06-08T00:40:30.398Z","0.1.3":"2012-06-12T08:10:16.642Z","0.2.0":"2012-07-01T00:52:53.195Z","0.2.5":"2012-07-21T05:02:10.421Z"},"author":{"name":"Buwei Chiu","email":"bu@hax4.in"},"repository":{"url":"git://github.com/bu/Accessor_MongoDB.git"},"_attachments":{"Accessor_MongoDB-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-4CfCgDbhaNyQymuruXO0Cg==","length":3160,"stub":true},"Accessor_MongoDB-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-0mP3EWqRgzHPUWqTx3oQdw==","length":2802,"stub":true},"Accessor_MongoDB-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qg1dvj+AuBsRH5LkPoyANA==","length":2764,"stub":true},"Accessor_MongoDB-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hR4UtmI8S+DXxQ2hGKBYLQ==","length":2777,"stub":true},"Accessor_MongoDB-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ayh6h8w3mLc832keN9MTfg==","length":2842,"stub":true}}}},
{"id":"Accessor_MySQL","key":"Accessor_MySQL","value":{"rev":"13-ffac625b77494f9ef1a7a7ceb4605d5c"},"doc":{"_id":"Accessor_MySQL","_rev":"13-ffac625b77494f9ef1a7a7ceb4605d5c","name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","version":"0.1.0","homepage":"https://github.com/bu/Accessor_MySQL","repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"dependencies":{"Accessor":">=0.2.0","mysql":">=0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_MySQL@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2784eb1a42c30a649756879a0c930cc977e05932","tarball":"http://registry.npmjs.org/Accessor_MySQL/-/Accessor_MySQL-0.1.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.2.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","version":"0.2.0","homepage":"https://github.com/bu/Accessor_MySQL","repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"dependencies":{"Accessor":">=0.2.0","mysql":">=0.9.6","generic-pool":">=1.0.11"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_MySQL@0.2.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"497826db455b9ca1346ad0ff7b47a092f7023697","tarball":"http://registry.npmjs.org/Accessor_MySQL/-/Accessor_MySQL-0.2.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.2.1":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","version":"0.2.1","homepage":"https://github.com/bu/Accessor_MySQL","repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"dependencies":{"Accessor":">=0.2.0","mysql":">=0.9.6","generic-pool":">=1.0.11"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# Accessor_MySQL 0.1.0\n\nA MySQL database wrapper, provide easy access to database without writing SQL code\n\n\n## Install & Setup\n\n1. Install through npm, following command will do that:\n\n\t\tnpm install Accessor_MySQL\n\t\t\n2. Create a config directory under your application, and create a database.js under that, which may contain like:\n\n\t\tvar databaseConfig = { \n    \t\tuser: \"YOUR_DATABASE_USER\",\n\t\t    password: \"YOUR_DATABASE_PASSWORD\",\n\t    \tdatabase: \"TARGET_DATABASE\",\n\t    \thost: \"localhost\",\n    \t\tport: 3306\n\t\t};\n\n\t\tmodule.exports = databaseConfig;\n\n3. Now, Accessor_MySQL is ready to use.\n\n\n## Usage\n\n1. Require the Accessor module in your script\n\n\t\tvar Accessor = require(\"Accessor\");\n\n2. Place constructor where you need the Accessor. Do not forget to specify your database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_TABLE\", \"MySQL\");\n\n3. After initialization, Accessor will try to obtain the schema, and store it to verify  column existence while updating or creating.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data, fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [\n\t\t\t\t[\"id\", \">\", 10],\n\t\t\t\t\"AND\",\n\t\t\t\t[\"email\",\"LIKE\",\"%@gmail.com\"]\n\t\t\t],\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields \t\t\n \n##### Note\n \nOptions may omit which retrieve all records, i.e.\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\ttester.select( function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\nInsert data record by given dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t} );\n\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we insert that to sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n\n#### accessor.update( {options}, {updated_dataObject}, callback(err, info) );\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we update that in sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","_id":"Accessor_MySQL@0.2.1","dist":{"shasum":"bef16a1405b3f7b4d97c9f9045000352846704dd","tarball":"http://registry.npmjs.org/Accessor_MySQL/-/Accessor_MySQL-0.2.1.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.2.5":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","version":"0.2.5","homepage":"https://github.com/bu/Accessor_MySQL","repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"dependencies":{"Accessor":">=0.2.0","mysql":">=0.9.6","generic-pool":">=1.0.11"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# Accessor_MySQL 0.2.5\n\nA MySQL database wrapper, provide easy access to database without writing SQL code\n\n\n## Install & Setup\n\n1. Install through npm, following command will do that:\n\n\t\tnpm install Accessor_MySQL\n\t\t\n2. Create a config directory under your application, and create a database.js under that, which may contain like:\n\n\t\tvar databaseConfig = { \n    \t\tuser: \"YOUR_DATABASE_USER\",\n\t\t    password: \"YOUR_DATABASE_PASSWORD\",\n\t    \tdatabase: \"TARGET_DATABASE\",\n\t    \thost: \"localhost\",\n    \t\tport: 3306\n\t\t};\n\n\t\tmodule.exports = databaseConfig;\n\n3. Now, Accessor_MySQL is ready to use.\n\n\n## Usage\n\n1. Require the Accessor module in your script\n\n\t\tvar Accessor = require(\"Accessor\");\n\n2. Place constructor where you need the Accessor. Do not forget to specify your database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_TABLE\", \"MySQL\");\n\n3. After initialization, Accessor will try to obtain the schema, and store it to verify  column existence while updating or creating.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data, fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [\n\t\t\t\t[\"id\", \">\", 10],\n\t\t\t\t\"AND\",\n\t\t\t\t[\"email\",\"LIKE\",\"%@gmail.com\"]\n\t\t\t],\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields \t\t\n \n##### Note\n \nOptions may omit which retrieve all records, i.e.\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\ttester.select( function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\nInsert data record by given dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t} );\n\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we insert that to sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n\n#### accessor.update( {options}, {updated_dataObject}, callback(err, info) );\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we update that in sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","_id":"Accessor_MySQL@0.2.5","dist":{"shasum":"26f90ffc257218fd3386b646ae7bfa964b4793c3","tarball":"http://registry.npmjs.org/Accessor_MySQL/-/Accessor_MySQL-0.2.5.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.3.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","version":"0.3.0","homepage":"https://github.com/bu/Accessor_MySQL","repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"dependencies":{"Accessor":">=0.2.0","mysql":">=0.9.6","generic-pool":">=1.0.11"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"main":"index.js","keywords":["mysql","accessor","genericobject","observer"],"license":"MIT","readme":"# Accessor_MySQL 0.3.0\n\nA MySQL database wrapper, provide easy access to database without writing SQL code\n\n\n## Install & Setup\n\n1. Install through npm, following command will do that:\n\n\t\tnpm install Accessor_MySQL\n\t\t\n2. Create a config directory under your application, and create a database.js under that, which may contain like:\n\n\t\tvar databaseConfig = { \n    \t\tuser: \"YOUR_DATABASE_USER\",\n\t\t    password: \"YOUR_DATABASE_PASSWORD\",\n\t    \tdatabase: \"TARGET_DATABASE\",\n\t    \thost: \"localhost\",\n    \t\tport: 3306\n\t\t};\n\n\t\tmodule.exports = databaseConfig;\n\n3. Now, Accessor_MySQL is ready to use.\n\n\n## Usage\n\n1. Require the Accessor module in your script\n\n\t\tvar Accessor = require(\"Accessor\");\n\n2. Place constructor where you need the Accessor. Do not forget to specify your database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_TABLE\", \"MySQL\");\n\n3. After initialization, Accessor will try to obtain the schema, and store it to verify  column existence while updating or creating.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data, fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [\n\t\t\t\t[\"id\", \">\", 10],\n\t\t\t\t\"AND\",\n\t\t\t\t[\"email\",\"LIKE\",\"%@gmail.com\"]\n\t\t\t],\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields \t\t\n \n##### Note\n \nOptions may omit which retrieve all records, i.e.\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\ttester.select( function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\nInsert data record by given dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t} );\n\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we insert that to sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n\n#### accessor.update( {options}, {updated_dataObject}, callback(err, info) );\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we update that in sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n### Observer\n\nYou can register to some methods, that will notify when such things occured. (e.g. UPDATE)\n\n\n\t\t// following example will register a function that print out trigger event name\n\t\t\n\t\tvar Accessor = require(\"Accesor\");\n\t\t\n\t\tvar Log = Accessor(\"Log\", \"MySQL\");\n\t\t\n\t\t// methods can be register are SELECT, CREATE, UPDATE, REMOVE, INIT\n\t\tvar register_methods = [\"SELECT\", \"DELETE\", \"CREATE\", \"INIT\", \"UPDATE\"];\n\t\t\n\t\tLog.registerObserver(register_methods, function(event){\n\t\t\tconsole.log(event);\n\t\t});\n\t\t\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","_id":"Accessor_MySQL@0.3.0","dist":{"shasum":"cfca9add2c297ca6c1e77f2486abf10da93caeb1","tarball":"http://registry.npmjs.org/Accessor_MySQL/-/Accessor_MySQL-0.3.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.3.1":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"name":"Accessor_MySQL","description":"A MySQL database wrapper, provide easy access to database without writing SQL code","version":"0.3.1","homepage":"https://github.com/bu/Accessor_MySQL","repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"dependencies":{"Accessor":">=0.2.0","mysql":">=0.9.6","generic-pool":">=1.0.11"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"main":"index.js","keywords":["mysql","accessor","genericobject","observer"],"license":"MIT","readme":"# Accessor_MySQL 0.3.1\n\nA MySQL database wrapper, provide easy access to database without writing SQL code\n\n\n## Install & Setup\n\n1. Install through npm, following command will do that:\n\n\t\tnpm install Accessor_MySQL\n\t\t\n2. Create a config directory under your application, and create a database.js under that, which may contain like:\n\n\t\tvar databaseConfig = { \n    \t\tuser: \"YOUR_DATABASE_USER\",\n\t\t    password: \"YOUR_DATABASE_PASSWORD\",\n\t    \tdatabase: \"TARGET_DATABASE\",\n\t    \thost: \"localhost\",\n    \t\tport: 3306\n\t\t};\n\n\t\tmodule.exports = databaseConfig;\n\n3. Now, Accessor_MySQL is ready to use.\n\n\n## Usage\n\n1. Require the Accessor module in your script\n\n\t\tvar Accessor = require(\"Accessor\");\n\n2. Place constructor where you need the Accessor. Do not forget to specify your database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_TABLE\", \"MySQL\");\n\n3. After initialization, Accessor will try to obtain the schema, and store it to verify  column existence while updating or creating.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data, fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [\n\t\t\t\t[\"id\", \">\", 10],\n\t\t\t\t\"AND\",\n\t\t\t\t[\"email\",\"LIKE\",\"%@gmail.com\"]\n\t\t\t],\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields \t\t\n \n##### Note\n \nOptions may omit which retrieve all records, i.e.\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\ttester.select( function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\nInsert data record by given dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t} );\n\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we insert that to sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n\n#### accessor.update( {options}, {updated_dataObject}, callback(err, info) );\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we update that in sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n### Observer\n\nYou can register to some methods, that will notify when such things occured. (e.g. UPDATE)\n\n\n\t\t// following example will register a function that print out trigger event name\n\t\t\n\t\tvar Accessor = require(\"Accesor\");\n\t\t\n\t\tvar Log = Accessor(\"Log\", \"MySQL\");\n\t\t\n\t\t// methods can be register are SELECT, CREATE, UPDATE, REMOVE, INIT\n\t\tvar register_methods = [\"SELECT\", \"DELETE\", \"CREATE\", \"INIT\", \"UPDATE\"];\n\t\t\n\t\tLog.registerObserver(register_methods, function(event){\n\t\t\tconsole.log(event);\n\t\t});\n\t\t\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","_id":"Accessor_MySQL@0.3.1","dist":{"shasum":"d2d61db04873570304f7485aee3cd8223758b711","tarball":"http://registry.npmjs.org/Accessor_MySQL/-/Accessor_MySQL-0.3.1.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]}},"readme":"# Accessor_MySQL 0.1.0\n\nA MySQL database wrapper, provide easy access to database without writing SQL code\n\n\n## Install & Setup\n\n1. Install through npm, following command will do that:\n\n\t\tnpm install Accessor_MySQL\n\t\t\n2. Create a config directory under your application, and create a database.js under that, which may contain like:\n\n\t\tvar databaseConfig = { \n    \t\tuser: \"YOUR_DATABASE_USER\",\n\t\t    password: \"YOUR_DATABASE_PASSWORD\",\n\t    \tdatabase: \"TARGET_DATABASE\",\n\t    \thost: \"localhost\",\n    \t\tport: 3306\n\t\t};\n\n\t\tmodule.exports = databaseConfig;\n\n3. Now, Accessor_MySQL is ready to use.\n\n\n## Usage\n\n1. Require the Accessor module in your script\n\n\t\tvar Accessor = require(\"Accessor\");\n\n2. Place constructor where you need the Accessor. Do not forget to specify your database engine.\n\n\t\tvar tester = Accessor(\"YOUR_TARGET_TABLE\", \"MySQL\");\n\n3. After initialization, Accessor will try to obtain the schema, and store it to verify  column existence while updating or creating.\n\n### Methods\n\n#### accessor.select( {options}, callback(err, data, fields) );\n\nPerform a select query to obtain data, for example:\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [\n\t\t\t\t[\"id\", \">\", 10],\n\t\t\t\t\"AND\",\n\t\t\t\t[\"email\",\"LIKE\",\"%@gmail.com\"]\n\t\t\t],\n\t\t\t\n\t\t\tlimit: 100,\n\t\t\toffset: 50,\n\t\t\t\n\t\t\tfields: [\"name\"]\n\t\t};\n\t\t\n\t\ttester.select( options, function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\nCurrently, {options} has implements following attributes:\n \n * where\n * limit\n * offset\n * fields \t\t\n \n##### Note\n \nOptions may omit which retrieve all records, i.e.\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\ttester.select( function(err, data, fields) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn data;\n\t\t} );\n\n#### accessor.create( {dataObject}, callback(err, info) );\n\nInsert data record by given dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\tname: \"bu\",\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\ttester.create( dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.insertId;\n\t\t} );\n\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we insert that to sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n\n#### accessor.update( {options}, {updated_dataObject}, callback(err, info) );\n\nUpdate records filter by option.where with updated_dataObject\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* On above example, we give a non-exist column called \"nonSchemaColumn\" to Accessor, which may cause hangup if we update that in sql query.\n\n\tIndeed, Accessor will try to check each attribute and ignore them if not exists, and that should print *(on console)*\n\t\n\t\tWarning: nonSchemaColumn is not in database schema, and is not inserted into queryset\n\n* If options is omitted, it will update all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar dataObject = {\n\t\t\temail: \"bu@hax4.in\",\n\t\t\tnonSchemaColumn: \"test\"\n\t\t};\n\t\n\t\ttester.update( {}, dataObject, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n\n#### accessor.remove( {options}, callback(err, info) );\n\nRemove records filter by options.where\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\t\n\t\tvar options = {\n\t\t\twhere: [ \n\t\t\t\t[\"name\", \"=\", \"bu\"] \n\t\t\t],\n\t\t};\n\t\t\n\t\ttester.update( options, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\t\t\n##### Note\n\n* If options is omitted, it will remove all records. (due to no filter)\n\n\t\t// test_table schema: id, name, email\n\n\t\tvar tester = Accessor(\"test_table\");\n\t\n\t\ttester.remove( {}, function(err, info) {\n\t\t\tif(err) {\n\t\t\t\tthrow err;\n\t\t\t}\t\n\t\t\t\n\t\t\treturn info.affectedRows;\n\t\t} );\n\n### LICENSE\n\nCopyright (c) 2012 Buwei Chiu <bu@hax4.in>\n\nLicensed under the MIT License\n","maintainers":[{"name":"bu","email":"bu@hax4.in"}],"time":{"modified":"2012-08-02T18:17:28.494Z","created":"2012-05-30T16:21:02.923Z","0.1.0":"2012-05-30T16:21:10.687Z","0.2.0":"2012-06-24T17:48:30.144Z","0.2.1":"2012-07-09T18:00:45.293Z","0.2.5":"2012-07-22T15:39:27.299Z","0.3.0":"2012-08-02T18:12:51.060Z","0.3.1":"2012-08-02T18:17:28.494Z"},"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"https://github.com/bu/"},"repository":{"type":"git","url":"git://github.com/bu/Accessor_MySQL.git"},"_attachments":{"Accessor_MySQL-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-M2DwMN1dmF4zL1XBWWtMrA==","length":4699,"stub":true},"Accessor_MySQL-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uZk7Flcpn+2c7trUWWkhlA==","length":4706,"stub":true},"Accessor_MySQL-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RNvaAJtnVS50oUUd68Ffyw==","length":4187,"stub":true},"Accessor_MySQL-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-l+a8MYZkdNxMuKFi+DRHaw==","length":3360,"stub":true},"Accessor_MySQL-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3mFOGeiNRiUeh/nlOEuMZw==","length":3359,"stub":true},"Accessor_MySQL-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8Oy1OhEOfr6OJ4+tNVsepQ==","length":3295,"stub":true}}}},
{"id":"Accessor_Singleton","key":"Accessor_Singleton","value":{"rev":"7-007a68cdadf7ba2940ef7cfe6ca77708"},"doc":{"_id":"Accessor_Singleton","_rev":"7-007a68cdadf7ba2940ef7cfe6ca77708","name":"Accessor_Singleton","description":"A instance pool for Accessor module","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"http://bu.hax4.in/"},"name":"Accessor_Singleton","description":"A instance pool for Accessor module","version":"0.1.0","repository":{"url":"https://github.com/bu/Accessor_Singleton/"},"dependencies":{"Accessor":"0.1.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_Singleton@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0219de6e7b7c38cac57b866057f9e8c8cd618869","tarball":"http://registry.npmjs.org/Accessor_Singleton/-/Accessor_Singleton-0.1.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.1.1":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"http://bu.hax4.in/"},"name":"Accessor_Singleton","description":"A instance pool for Accessor module","version":"0.1.1","repository":{"url":"https://github.com/bu/Accessor_Singleton/"},"dependencies":{"Accessor":">=0.1.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_Singleton@0.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"_from":"Accessor_Singleton","dist":{"shasum":"511eb8d46592dd4059c7802b45bcd1463b15d998","tarball":"http://registry.npmjs.org/Accessor_Singleton/-/Accessor_Singleton-0.1.1.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]},"0.1.2":{"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"http://bu.hax4.in/"},"name":"Accessor_Singleton","description":"A instance pool for Accessor module","version":"0.1.2","repository":{"url":"https://github.com/bu/Accessor_Singleton/"},"dependencies":{"Accessor":">=0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bu","email":"bu@hax4.in"},"_id":"Accessor_Singleton@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"_from":"Accessor_Singleton","dist":{"shasum":"9e2945fdb86222df6d8afa1c197d2a9cb03a534c","tarball":"http://registry.npmjs.org/Accessor_Singleton/-/Accessor_Singleton-0.1.2.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]}},"readme":"Accessor_Singleton\n==================\n\nA instance pool for node.js Accessor module\n\nInstall\n=====================\n\n1. npm install Accessor_Singleton\n\nUsage\n====================\n\n1. Replace original module require statement from\n\n\tvar Accessor = require(\"Accessor\");\n\nto\n\t\n\tvar Accessor = require(\"Accessor_Singleton\")\n\n2. Then, everytime you call the Acessor, it will check if there had been an instance (avoid connnect to server everytime)\n","maintainers":[{"name":"bu","email":"bu@hax4.in"}],"time":{"modified":"2012-05-30T16:13:56.510Z","created":"2012-05-25T03:13:26.997Z","0.1.0":"2012-05-25T03:13:30.585Z","0.1.1":"2012-05-30T04:37:30.057Z","0.1.2":"2012-05-30T16:13:56.510Z"},"author":{"name":"Buwei Chiu","email":"bu@hax4.in","url":"http://bu.hax4.in/"},"repository":{"url":"https://github.com/bu/Accessor_Singleton/"},"_attachments":{"Accessor_Singleton-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3vZz1NS4WmOB53sOMwatPw==","length":764,"stub":true},"Accessor_Singleton-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TUCDuMMwaKaGYDIjUMZWlA==","length":759,"stub":true},"Accessor_Singleton-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rhe+9rB6wW281CbLUy0X8g==","length":665,"stub":true}}}},
{"id":"ArcusNode","key":"ArcusNode","value":{"rev":"3-2a8f3e80d95733f068c30aa7cec458f5"},"doc":{"_id":"ArcusNode","_rev":"3-2a8f3e80d95733f068c30aa7cec458f5","name":"ArcusNode","description":"A RTMFP Rendevouz Server For Peer Assisted Networking With Adobe Flash","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.4":{"name":"ArcusNode","version":"0.0.4","author":{"name":"arcusdev","email":"arcus.node@gmail.com"},"description":"A RTMFP Rendevouz Server For Peer Assisted Networking With Adobe Flash","main":"service","keywords":["rtmfp","flash","p2p","networking","rendezvouz","rtmp","RPC"],"directories":{"lib":"./lib","src":"./src"},"maintainers":[{"name":"fredvb","email":"fredericbochmann@gmail.com"}],"bugs":{"email":"arcus.node@gmail.com","url":"https://github.com/OpenRTMFP/ArcusNode/issues"},"engines":{"node":"0.5.2","npm":"1"},"licenses":[{"type":"GPL","url":"http://www.gnu.org/licenses/"}],"repositories":[{"type":"git","url":"http://github.com/OpenRTMFP/ArcusNode.git"}],"bundleDependencies":["node-logger"],"scripts":{"preinstall":"","install":"node-waf configure build","test":"node test.js","start":"node service.js"},"_npmJsonOpts":{"file":"/home/fred/.npm/ArcusNode/0.0.4/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"ArcusNode@0.0.4","dependencies":{},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"865db5cedd537af83a532db19b502d39b0b9054b","tarball":"http://registry.npmjs.org/ArcusNode/-/ArcusNode-0.0.4.tgz"}}},"maintainers":[{"name":"fredvb","email":"fredericbochmann@gmail.com"}],"time":{"modified":"2011-09-25T17:43:56.079Z","created":"2011-09-25T17:43:55.059Z","0.0.4":"2011-09-25T17:43:56.079Z"},"author":{"name":"arcusdev","email":"arcus.node@gmail.com"},"_attachments":{"ArcusNode-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bTnKOLSqwuw7CS6kB9jR5g==","length":98698,"stub":true}}}},
{"id":"ArgKit","key":"ArgKit","value":{"rev":"3-90f23ddcf3a215e974b5437dade66329"},"doc":{"_id":"ArgKit","_rev":"3-90f23ddcf3a215e974b5437dade66329","name":"ArgKit","description":"command line arguments extension (not yet working)","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"ArgKit","description":"command line arguments extension (not yet working)","version":"0.0.0","homepage":"https://github.com/beatak/ArgKit","repository":{"type":"git","url":"git://github.com/beatak/ArgKit.git"},"main":"lib/argkit.js","engines":{"node":"~0.5.8"},"dependencies":{"TypeCast":">= 0.0.5"},"devDependencies":{},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"ArgKit@0.0.0","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"4265b64908a30bee162ad346f66290648481146e","tarball":"http://registry.npmjs.org/ArgKit/-/ArgKit-0.0.0.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]}},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}],"time":{"modified":"2011-10-30T00:10:44.129Z","created":"2011-10-30T00:10:43.182Z","0.0.0":"2011-10-30T00:10:44.129Z"},"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"repository":{"type":"git","url":"git://github.com/beatak/ArgKit.git"},"_attachments":{"ArgKit-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VCltMjg78IU+ov/P7oUk7A==","length":10240,"stub":true}}}},
{"id":"AriesNode","key":"AriesNode","value":{"rev":"3-9d88392bca6582c5c54784927dbfdee6"},"doc":{"_id":"AriesNode","_rev":"3-9d88392bca6582c5c54784927dbfdee6","name":"AriesNode","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"AriesNode","author":{"name":"Eldar Djafarov","email":"djkojb@gmail.com"},"contributors":[{"name":"Eldar Djafarov","email":"djkojb@gmail.com"}],"version":"0.0.1","dependencies":{"log4js":"0.3.9","ClassLoader":"0.0.1","jsSourceCodeParser":"0.0.1","ejs":"0.4.3"},"scripts":{"start":"node ./main.js"},"bin":{"aries":"./main.js"},"main":"./main.js","config":{"port":"8080","host":"localhost"},"_npmJsonOpts":{"file":"/home/Dj/.npm/AriesNode/0.0.1/package/package.json","wscript":false,"serverjs":false,"contributors":false},"_id":"AriesNode@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"ef1a5d01a77ff32537009c2c43ccf14a99832672","tarball":"http://registry.npmjs.org/AriesNode/-/AriesNode-0.0.1.tgz"},"maintainers":[{"name":"edjafarov","email":"djkojb@gmail.com"}]}},"maintainers":[{"name":"edjafarov","email":"djkojb@gmail.com"}],"time":{"modified":"2011-09-16T20:42:06.115Z","created":"2011-09-16T20:42:05.312Z","0.0.1":"2011-09-16T20:42:06.115Z"},"author":{"name":"Eldar Djafarov","email":"djkojb@gmail.com"},"_attachments":{"AriesNode-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2ojC6ZWt25WDFaz1O3457g==","length":10353,"stub":true}}}},
{"id":"Array.prototype.forEachAsync","key":"Array.prototype.forEachAsync","value":{"rev":"3-85696441ba6bef77cc1e7de7b073110e"},"doc":{"_id":"Array.prototype.forEachAsync","_rev":"3-85696441ba6bef77cc1e7de7b073110e","name":"Array.prototype.forEachAsync","description":"The Array.prototype.forEachAsync module of FuturesJS (Ender.JS and Node.JS)","dist-tags":{"latest":"2.1.1"},"versions":{"2.1.1":{"name":"Array.prototype.forEachAsync","version":"2.1.1","description":"The Array.prototype.forEachAsync module of FuturesJS (Ender.JS and Node.JS)","homepage":"https://github.com/coolaj86/futures","keywords":["flow-control","async","asynchronous","futures","Array.prototype.forEachAsync","chain","step","util","browser"],"repository":{"type":"git","url":"git://github.com/coolaj86/futures.git"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"main":"Array.prototype.forEachAsync.js","directories":{"lib":"."},"dependencies":{"forEachAsync":">= 2.1.1"},"engines":{"node":"*","ender":">= 0.5.0"},"_npmJsonOpts":{"file":"/Users/coolaj86/.npm/Array.prototype.forEachAsync/2.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Array.prototype.forEachAsync@2.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"802f90252e66d0e2ca2520f3f3da2b3ba3bff45a","tarball":"http://registry.npmjs.org/Array.prototype.forEachAsync/-/Array.prototype.forEachAsync-2.1.1.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-13T20:37:56.470Z","created":"2011-07-13T20:37:56.108Z","2.1.1":"2011-07-13T20:37:56.471Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/futures.git"},"_attachments":{"Array.prototype.forEachAsync-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-d1c9/vitiq3bgjJkrx+1NQ==","length":620,"stub":true}}}},
{"id":"AssetPipeline","key":"AssetPipeline","value":{"rev":"3-67ef5c3d9970c9b82f8741fbee5fd17f"},"doc":{"_id":"AssetPipeline","_rev":"3-67ef5c3d9970c9b82f8741fbee5fd17f","name":"AssetPipeline","description":"Provides Assets","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"AssetPipeline","description":"Provides Assets","version":"0.0.1","author":{"name":"Mukari","email":"dev@mukari.com"},"dependencies":{"connect":"1.8.3","mime":"x.x.x","stylus":"x.x.x","coffee-script":"x.x.x","uglify-js":"x.x.x","traverse":"x.x.x","underscore":"1.2.3"},"devDependencies":{"mocha":"0.5.x","should":"0.3.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_id":"AssetPipeline@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"7a4a626ed7430c8a8fde6dff94801daf0786a0bf","tarball":"http://registry.npmjs.org/AssetPipeline/-/AssetPipeline-0.0.1.tgz"},"maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}]}},"readme":"AssetPipeline\n=============\n\n  Smashes, Caches, Slices, & Dices your static assets.\n\n  The asset pipeline is a simple middleware provider that serves static assets.\nIt has modules for file version caching, compiling things like coffeescript and\nstylus or sass, minifying, obfuscating, and appending scripts and stylesheets,\nslicing up the AST of javascript files, to remove sensitive code before it's\nsent to the client, etc.  And also can send notifications to the client when a\nfile changes (not implemented). Perhaps in order to dynamically reload stylesheets, scripts, or\nhtml templates.\n\n  The second part is a clientside component which creates a list of script/stylesheet\ntags and watches for changes from the server.\n\nExample\n=======\n\n```javascript\n  //adds all the files in app\n  AssetPipe.script()\n    .root(__dirname + \"../app/\")\n    .addFiles(__dirname + \"../app\")\n    .process(CompileCoffee)\n    .process(SliceSensitiveMethods)\n    .process(Modularize)\n    .process(Minify)\n\n```\n","maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}],"time":{"modified":"2012-04-13T10:43:02.298Z","created":"2012-04-13T10:43:01.495Z","0.0.1":"2012-04-13T10:43:02.298Z"},"author":{"name":"Mukari","email":"dev@mukari.com"},"_attachments":{"AssetPipeline-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TRaaax+szKxqDvs9Nrgb+A==","length":124408,"stub":true}}}},
{"id":"AsyncProxy","key":"AsyncProxy","value":{"rev":"5-c73931124b9b98404596a9be31edb48b"},"doc":{"_id":"AsyncProxy","_rev":"5-c73931124b9b98404596a9be31edb48b","name":"AsyncProxy","description":"asynchronous code helper.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"doublespout","email":"snoopyxdy@163.com","url":"http://snoopyxdy.blog.163.com"},"name":"AsyncProxy","description":"asynchronous code helper.","version":"0.1.0","homepage":"https://github.com/DoubleSpout/node.js---AsyncProxy","repository":{"type":"git","url":"git@github.com:DoubleSpout/node.js---AsyncProxy.git"},"main":"AsyncProxy.js","engines":{"node":"~0.6.6"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"doublespout","email":"snoopyxdy@163.com"},"_id":"AsyncProxy@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d19109d1bd8e6c22b5b04620a095cc725ec46760","tarball":"http://registry.npmjs.org/AsyncProxy/-/AsyncProxy-0.1.0.tgz"},"readme":"","maintainers":[{"name":"doublespout","email":"snoopyxdy@163.com"}]},"0.1.1":{"author":{"name":"DoubleSpout","email":"snoopyxdy@163.com","url":"http://snoopyxdy.blog.163.com"},"name":"AsyncProxy","description":"asynchronous code helper.","version":"0.1.1","homepage":"https://github.com/DoubleSpout/node.js---AsyncProxy","repository":{"type":"git","url":"git@github.com:DoubleSpout/node.js---AsyncProxy.git"},"main":"AsyncProxy.js","engines":{"node":"~0.6.6"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"doublespout","email":"snoopyxdy@163.com"},"_id":"AsyncProxy@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"75056cf679565fb7c53f9201b4550e1ca7a87dd6","tarball":"http://registry.npmjs.org/AsyncProxy/-/AsyncProxy-0.1.1.tgz"},"readme":"","maintainers":[{"name":"doublespout","email":"snoopyxdy@163.com"}]}},"readme":"","maintainers":[{"name":"doublespout","email":"snoopyxdy@163.com"}],"time":{"modified":"2012-02-20T03:33:50.003Z","created":"2012-01-20T06:23:08.487Z","0.1.0":"2012-01-20T06:23:13.684Z","0.1.1":"2012-02-20T03:33:50.003Z"},"author":{"name":"DoubleSpout","email":"snoopyxdy@163.com","url":"http://snoopyxdy.blog.163.com"},"repository":{"type":"git","url":"git@github.com:DoubleSpout/node.js---AsyncProxy.git"},"_attachments":{"AsyncProxy-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-aunYouGcmkq/zHsuDLVr+A==","length":2138,"stub":true},"AsyncProxy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XyMB5qspfFYqpHQ/TIokDQ==","length":2140,"stub":true}}}},
{"id":"Babel","key":"Babel","value":{"rev":"5-9d8370c6ac6fd9cd3d530f26a9379814"},"doc":{"_id":"Babel","_rev":"5-9d8370c6ac6fd9cd3d530f26a9379814","name":"Babel","description":"Babel puts a soft cushion between you all the cool new file formats being developed for node.js such as CoffeeScript, SASS, and Jade.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"name":"Babel","description":"Babel puts a soft cushion between you all the cool new file formats being developed for node.js such as CoffeeScript, SASS, and Jade.","version":"0.0.0","author":{"name":"Lucas Wojciechowski","email":"lucas@lucaswoj.com","url":"http://lucaswoj.com"},"main":"lib/babel","scripts":{"test":"cake test"},"engines":{"node":"*"},"dependencies":{"step":"0.0.x","underscore":"1.x.x"},"_id":"Babel@0.0.0","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.4.7","dist":{"shasum":"8ac956018f9ede34bce7d86291128b9ea99fec80","tarball":"http://registry.npmjs.org/Babel/-/Babel-0.0.0.tgz"}},"0.0.1":{"name":"Babel","description":"Babel puts a soft cushion between you all the cool new file formats being developed for node.js such as CoffeeScript, SASS, and Jade.","version":"0.0.1","author":{"name":"Lucas Wojciechowski","email":"lucas@lucaswoj.com","url":"http://lucaswoj.com"},"main":"src/babel","scripts":{"test":"cake test"},"engines":{"node":"*"},"dependencies":{"step":"0.0.x","underscore":"1.x.x"},"_id":"Babel@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.4.7","dist":{"shasum":"7dd676336ce7bdbbc59c13835dce4b0cc941f0d6","tarball":"http://registry.npmjs.org/Babel/-/Babel-0.0.1.tgz"}}},"maintainers":[{"name":"lucaswoj","email":"lucas@lucaswoj.com"}],"time":{"modified":"2011-06-30T01:01:26.455Z","created":"2011-06-02T00:00:22.723Z","0.0.0":"2011-06-02T00:00:22.954Z","0.0.1":"2011-06-30T01:01:26.455Z"},"author":{"name":"Lucas Wojciechowski","email":"lucas@lucaswoj.com","url":"http://lucaswoj.com"},"_attachments":{"Babel-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DOdQT3Nip1a+4grDv99xJw==","length":15196,"stub":true},"Babel-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ncy0JpT4a2Fb+V5ZPmNLFw==","length":13338,"stub":true}}}},
{"id":"Backbone.Aggregator","key":"Backbone.Aggregator","value":{"rev":"5-029e1e4b926b969d9f045fb58bd48c15"},"doc":{"_id":"Backbone.Aggregator","_rev":"5-029e1e4b926b969d9f045fb58bd48c15","name":"Backbone.Aggregator","description":"Provides a collection-like constructor that allows you create aggregators from different collections","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"Backbone.Aggregator","description":"Provides a collection-like constructor that allows you create aggregators from different collections","version":"0.0.2","author":{"name":"Pau ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Aggregator.git"},"devDependencies":{"backbone":"*","underscore":"*","mocha":"*"},"main":"./backbone.aggregator","_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"Backbone.Aggregator@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"10eec01af42f79bc28e26740660d057160d11d11","tarball":"http://registry.npmjs.org/Backbone.Aggregator/-/Backbone.Aggregator-0.0.2.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]},"0.0.3":{"name":"Backbone.Aggregator","description":"Provides a collection-like constructor that allows you create aggregators from different collections","version":"0.0.3","author":{"name":"Pau ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Aggregator.git"},"devDependencies":{"backbone":"*","underscore":"*","mocha":"*"},"main":"./backbone.aggregator","_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"Backbone.Aggregator@0.0.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"af82b2ec76db26c934ab08c9384221213acd5229","tarball":"http://registry.npmjs.org/Backbone.Aggregator/-/Backbone.Aggregator-0.0.3.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]}},"readme":"# Backbone.aggregator\n\nA collection that contains pointers to elements to other collections models.\n\n## Use case?\n\nHaving a polymorphic collection that just points to existant elements in your state.\n\nFor instance having a *Recent activities* that mixes *Tasks* and *Activities*,\nyou want to be sure that adding, deleting or changing a Task or Activity will\nupdate Recent Activities.\n\n## How does it work?\n\nThe API is almost the same as `Backbone.Collection`.\n\n  * You must specify which `collection` the model belongs.\n  * Each model must have a `type` attribute.\n  * The aggregator collection must implement the `collections` method. This will return a mapping of `type` and `collection`.\n  * If you want to `get` a model from the aggregator collection you must specify the type too.\n\n``` javascript\nModels.Task = Backbone.Model.extend({initialize: function () {\n  this.collection = tasks;\n}});\n\nModels.Activity = Backbone.Model.extend({initialize: function () {\n  this.collection = activities;\n}});\n\nCollections.Tasks = Backbone.Collection.extend({model: Models.Task});\nCollections.Activities = Backbone.Collection.extend({model: Models.Activity});\n\nCollections.Threads = Backbone.Aggregator.extend({\n  model: function (attr, opt) {\n    return new Models[attr.type](attr, opt);\n  }\n, collections: function () {\n    return {Task: tasks, Activity: activities};\n  }\n});\n\ntasks = new Collections.Tasks();\nactivities = new Collections.Activities();\nthreads = new Collections.Threads();\n```\n\n## Tests\n\nYou must have node installed in order to run the tests.\n\n```\nnpm install\nmake\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2010-2011 Pau Ramon <masylum@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"time":{"modified":"2011-11-25T12:10:00.138Z","created":"2011-11-25T11:50:13.092Z","0.0.2":"2011-11-25T11:50:15.102Z","0.0.3":"2011-11-25T12:10:00.138Z"},"author":{"name":"Pau ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Aggregator.git"},"_attachments":{"Backbone.Aggregator-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3rr6LebaR6aWVA7gPrgwtg==","length":10240,"stub":true},"Backbone.Aggregator-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dBo7JtM25lm3sbeP4jTKlg==","length":10240,"stub":true}}}},
{"id":"Backbone.Chosen","key":"Backbone.Chosen","value":{"rev":"9-214d503ebdf2470dfb7ab89896ff6402"},"doc":{"_id":"Backbone.Chosen","_rev":"9-214d503ebdf2470dfb7ab89896ff6402","name":"Backbone.Chosen","description":"One Collection different models, mapped easy via configuration","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"Backbone.Chosen","version":"0.1.0","description":"One Collection different models, mapped easy via configuration","homepage":"http://asciidisco.github.com/Backbone.Chosen/index.html","keywords":["backbone","plugin","model","collection","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Chosen.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Chosen"}],"lib":".","main":"backbone.chosen.js","devDependencies":{"grunt":"~0.3.x"},"dependencies":{"underscore":"~1.3.1","backbone":"0.9.x"},"_npmUser":{"name":"asciidisco","email":"public@asciidisco.com"},"_id":"Backbone.Chosen@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"83b3aa97526022d094827f7e28fe05a9d23a3403","tarball":"http://registry.npmjs.org/Backbone.Chosen/-/Backbone.Chosen-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"Backbone.Chosen","version":"0.1.1","description":"One Collection different models, mapped easy via configuration","homepage":"http://asciidisco.github.com/Backbone.Chosen/index.html","keywords":["backbone","plugin","model","collection","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Chosen.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Chosen"}],"lib":".","main":"backbone.chosen.js","devDependencies":{"grunt":"~0.3.x"},"dependencies":{"underscore":"~1.3.1","backbone":"0.9.x"},"_npmUser":{"name":"asciidisco","email":"public@asciidisco.com"},"_id":"Backbone.Chosen@0.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"2952dccf8c2035060fdc8624dc08972b06b631dc","tarball":"http://registry.npmjs.org/Backbone.Chosen/-/Backbone.Chosen-0.1.1.tgz"}}},"readme":"Backbone.Chosen\n===============\n\nOne Collection different models, mapped easy via configuration\n\n[![Build Status](https://secure.travis-ci.org/asciidisco/Backbone.Chosen.png?branch=master)](http://travis-ci.org/asciidisco/Backbone.Chosen)","maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"time":{"modified":"2012-05-22T11:48:00.613Z","created":"2012-05-21T20:50:02.421Z","0.1.0":"2012-05-21T20:50:03.993Z","0.1.1":"2012-05-22T11:48:00.613Z"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Chosen.git"},"_attachments":{"Backbone.Chosen-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-5jxrUKZAJRL3+d7Sdfjr7g==","length":7479381,"stub":true},"Backbone.Chosen-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FSJPmpv4DgwMYxejBAhOPw==","length":7476849,"stub":true}}}},
{"id":"Backbone.Marionette.Handlebars","key":"Backbone.Marionette.Handlebars","value":{"rev":"5-3b92e2c5ba114720060754c122dd8ec8"},"doc":{"_id":"Backbone.Marionette.Handlebars","_rev":"5-3b92e2c5ba114720060754c122dd8ec8","name":"Backbone.Marionette.Handlebars","description":"Spice up your Backbone.Marionette application with some Handlebars flavour","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"Backbone.Marionette.Handlebars","version":"0.1.0","description":"Spice up your Backbone.Marionette application with some Handlebars flavour","homepage":"http://asciidisco.github.com/Backbone.Marionette.Handlebars/index.html","keywords":["backbone","plugin","marionette","template","handlebars","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Marionette.Handlebars.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Marionette.Handlebars"}],"lib":".","main":"backbone.marionette.handlebars.js","devDependencies":{"grunt":"~0.3.x"},"dependencies":{"underscore":"~1.3.1","backbone":"0.9.x"},"_npmUser":{"name":"asciidisco","email":"public@asciidisco.com"},"_id":"Backbone.Marionette.Handlebars@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"190f15c73be0500f124ea259c416ec4fdf8d7ba6","tarball":"http://registry.npmjs.org/Backbone.Marionette.Handlebars/-/Backbone.Marionette.Handlebars-0.1.0.tgz"}},"0.2.0":{"name":"Backbone.Marionette.Handlebars","version":"0.2.0","description":"Spice up your Backbone.Marionette application with some Handlebars flavour","homepage":"http://asciidisco.github.com/Backbone.Marionette.Handlebars/index.html","keywords":["backbone","plugin","marionette","template","handlebars","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Marionette.Handlebars.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Marionette.Handlebars"}],"lib":".","main":"backbone.marionette.handlebars.js","devDependencies":{"grunt":">=0.3.9"},"dependencies":{"underscore":"~1.3.1","backbone":"0.9.x"},"_npmUser":{"name":"asciidisco","email":"public@asciidisco.com"},"_id":"Backbone.Marionette.Handlebars@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a0edb1c0c6de50a30339b1d31049f2770ede6fe6","tarball":"http://registry.npmjs.org/Backbone.Marionette.Handlebars/-/Backbone.Marionette.Handlebars-0.2.0.tgz"}}},"readme":"Backbone.Marionette.Handlebars\n==============================\n\nSpice up your [Backbone.Marionette](https://github.com/derickbailey/backbone.marionette) application with some [handlebars](https://github.com/wycats/handlebars.js/) flavour\n\nThis is a tiny library which overrides some of backbone.marionettes internal \ntemplate functions to make it compatible with handlebars templates.\n\nThis especially is very usefull if your using the amd version of marionette and \nAlex Sextons genius strike, the [require-handlebars-plugin](https://github.com/SlexAxton/require-handlebars-plugin).\nIf you don´t know any of this projects listed above, I highly recommend\nto check them out.\n\nCurrently i´ve only tested this within an requirejs based amd ecosystem,\nbut it should also be working within a commonjs or vanilla js based project. \nSee the usage section for more details.\n\n## Future Features\nCurrently the plugin does not support loading templates via XHR requests\non its own. Didn´t needed this by now, but support will be added in the future.\nSame for selector based template retrival like marionette does for templates,\nhold on, i will cover this in the future.\nAlso, writing unit tests (like i always do for my projects, and so should you ;))\nis smth. i would like to add as soon as possible.\n\n## Build Status, Project Page, Annotated Source & Tests\n[![Build Status](https://secure.travis-ci.org/asciidisco/Backbone.Marionette.Handlebars.png?branch=master)](http://travis-ci.org/asciidisco/Backbone.Marionette.Handlebars)<br /><br />\n[Project Page](http://asciidisco.github.com/Backbone.Marionette.Handlebars/index.html)<br />\n[Docs](http://asciidisco.github.com/Backbone.Marionette.Handlebars/docs/backbone.marionette.handlebars.html)<br />\n[NPM registry](http://search.npmjs.org/#/Backbone.Marionette.Handlebars)\n\n## Installation\n\n### Source Code And Downloads\n\nYou can download the raw source code from the \"src\" folder above, or grab one of the\nbuilds from the root directory. \n\nTo get the latest stable release, use these links which point to the 'master' branch's\nbuilds:\n\nDevelopment: [backbone.marionette.handlebars.js](https://raw.github.com/asciidisco/backbone.marionette.handlebars/master/backbone.marionette.handlebars.js)\nProduction: [backbone.marionette.handlebars.min.js](https://raw.github.com/asciidisco/backbone.marionette.handlebars/master/backbone.marionette.handlebars.min.js)\n\n### VOLO\n```shell\n$ volo add Backbone.Marionette.Handlebars\n```\n\n### NPM\n```shell\n$ npm install Backbone.Marionette.Handlebars\n```\n\n## Integration\nNote: This plugin is UMD compatible, you can use it in node, amd and vanilla js envs (hopefully, not tested, see the section below for more information)\n\n### Vanilla JS\n```html\n<script src=\"underscore.js\"></script>\n<script src=\"backbone.js\"></script>\n<script src=\"handlebars.js\"></script>\n<script src=\"backbone.marionette.js\"></script>\n<script src=\"backbone.marionette.handlebars.js\"></script>\n```\n\n### Node\n```javascript\nvar _ = require('underscore');\nvar Backbone = require('backbone');\nvar Marionette = require('backbone.marionette');\nvar MarionetteHandlebars = require('backbone.marionette.handlebars');\n```\n\n### AMD\n```javascript\ndefine(['underscore', 'backbone', 'backbone.marionette', 'backbone.marionette.handlebars'], function (_, Backbone, Marionette, MarionetteHandlebars) {\n});\n```\n\n## Usage\n\n### Use with SlexAxtons require-handlebars-plugin\n\nA simple example how to a handlebars template to your marionette view:\n\n```javascript\ndefine([\n    'jquery',\n    'underscore',\n    'backbone',      \n    'backbone.marionette',\n    'backbone/backbone.marionette.handlebars',          \n    'hbs!Template/category',       \n],\n    function ($, _, Backbone, Marionette, MarionetteHandlebars, categoryTpl) {\n        return Backbone.Marionette.ItemView.extend({\n\n            template: {\n                type: 'handlebars',\n                template: categoryTpl\n            }\n\n        });\n\n    });\n\n```\n\nPlease be aware of that the backbone.marionette.js file should be aliased\nas 'backbone.marionette' in the paths config for your require ecosystem.\n(Backbone.Marionette.Handlebars expects it to be referenced like this, when it requires it as\na dependency) \n\n### Use within a non amd ecosystem\n\nA simple example how to a handlebars template to your marionette view, when not using an amd loader:\n\n!Warning: This is not tesed, writing some unit tests to cover this use case is on my list ;)\n\n```javascript\nvar tmpl = \nvar MyView = Backbone.Marionette.ItemView.extend({\n    template: {\n        type: 'handlebars',\n        template: Handlebars.compile(tmpl)\n    }\n});\n\n\n```\n\nPlease be aware of that the backbone.marionette.js file should be aliased\nas 'backbone.marionette' in the paths config for your require ecosystem.\n(Backbone.Marionette.Handlebars expects it to be referenced like this, when it requires it as\na dependency) \n\n## Support\n\n### Help With Code And Questions\n\nIf you're interested in helping with code and questions, please\nsee the issues list and stack overflow tag here, you can also reach me on twitter:\n\n* [Github Issues](//github.com/asciidisco/backbone.marionette.handlebars/issues)\n* [StackOverflow Tag](http://stackoverflow.com/questions/tagged/backbone.marionette.handlebars)\n* [Twitter](http://twitter.com/asciidisco)\n\nIf you have an idea to improve Backbone.Chosen or want to report\na bug, please use the issues list.\n\n## Compatibility And Requirements\n\nTheses libraries are required for the use, development, testing and\ndocumentation of Backbone.Marionette.Handlebars.\n\n### Runtime Requirements\n\nBackbone.Marionette.Handlebars currently works with the following versions of these \nlibraries:\n\n* Backbone.Marionette v0.8.4\n* Backbone v0.9.2\n* Underscore v1.3.3\n* Handlebars v1.0.5beta\n\nBackbone.Marionette.Handlebars has not been tested against any other versions of these\nlibraries. You may or may not have success if you use a version other\nthan what it listed here.\n\n## Build Tools Used\n\nI use a number of tools to build, test and maintain Backbone.Marionette.Handlebars, including\nbut not limited to:\n\n### Grunt\n\nThe [Grunt](https://github.com/cowboy/grunt) project is used\nto generate the builds for Backbone.Marionette.Handlebars.\n\n### Travis CI\n\nBackbone.Marionette.Handlebars uses [Travis CI](http://travis-ci.org/) as a post commit hook,\nto ensure that it´s that the coding guidelines are passing using JSHint\n\n### Annotated Source Code\n\nI'm using [Docco](http://jashkenas.github.com/docco/) to generate the annotated source code.\n\n## Release Notes (Changlog)\n\n### v0.1.0\n+ Initial realease\n\n## Legal Foobarbaz (MIT License)\n\nCopyright (c) 2012 Sebastian Golasch, asciidisco\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"time":{"modified":"2012-07-10T10:11:35.156Z","created":"2012-05-24T15:10:30.942Z","0.1.0":"2012-05-24T15:10:32.405Z","0.2.0":"2012-07-10T10:11:35.156Z"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Marionette.Handlebars.git"},"_attachments":{"Backbone.Marionette.Handlebars-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1nEg4lCBYsSEkB6THEREYw==","length":5892,"stub":true},"Backbone.Marionette.Handlebars-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hAHSPJLIOi5WgiAp9OdJWg==","length":9915426,"stub":true}}}},
{"id":"Backbone.Mutators","key":"Backbone.Mutators","value":{"rev":"5-ff5f5b11e070107a51b4da1ebb000ffb"},"doc":{"_id":"Backbone.Mutators","_rev":"5-ff5f5b11e070107a51b4da1ebb000ffb","name":"Backbone.Mutators","description":"Backbone plugin to override getters and setters with logic","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"Backbone.Mutators","version":"0.1.0","description":"Backbone plugin to override getters and setters with logic","homepage":"http://asciidisco.github.com/Backbone.Mutators/index.html","keywords":["backbone","plugin","mutator","getter","setter","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Mutators.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Mutators"}],"lib":".","main":"backbone.mutators.js","devDependencies":{"qunit":">=0.2.x","nodelint":">=0.x.x","docco":">=0.x.x","coffee-script":">=0.x.x"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9.x"},"_npmJsonOpts":{"file":"/Users/sgolasch/.npm/Backbone.Mutators/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Backbone.Mutators@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"f60310007d9f10e18122d8eb089ad10e21ec1341","tarball":"http://registry.npmjs.org/Backbone.Mutators/-/Backbone.Mutators-0.1.0.tgz"},"scripts":{}},"0.3.0":{"name":"Backbone.Mutators","version":"0.3.0","description":"Backbone plugin to override getters and setters with logic","homepage":"http://asciidisco.github.com/Backbone.Mutators/index.html","keywords":["backbone","plugin","mutator","getter","setter","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Mutators.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Mutators"}],"lib":".","main":"backbone.mutators.js","devDependencies":{"grunt":"~0.3.x"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9.x"},"_npmUser":{"name":"asciidisco","email":"public@asciidisco.com"},"_id":"Backbone.Mutators@0.3.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5f88ef8473ee7b4de4f1e0cf4b274dc42d86e6b5","tarball":"http://registry.npmjs.org/Backbone.Mutators/-/Backbone.Mutators-0.3.0.tgz"},"readme":"## Backbone.Mutators\nBackbone plugin to override getters and setters with logic\n\n## Build Status, Project Page, Annotated Source & Tests\n[![Build Status](https://secure.travis-ci.org/asciidisco/Backbone.Mutators.png?branch=master)](http://travis-ci.org/asciidisco/Backbone.Mutators)<br /><br />\n[Project Page](http://asciidisco.github.com/Backbone.Mutators/index.html)<br />\n[Docs](http://asciidisco.github.com/Backbone.Mutators/docs/backbone.mutators.html)<br />\n[Tests](http://asciidisco.github.com/Backbone.Mutators/test/index.html)<br />\n[NPM registry](http://search.npmjs.org/#/Backbone.Mutators)\n\n## Introduction\nEver wanted Backbone to have getters and setters you can override with your own logic?\nYes?! Then Backbone.Mutators is the missing tool in your chain...\n\n## Installation\n\nThe plugin itself implements the Universal Module Definition (UMD).\nYou can use it with a CommonJS like loader, or with an AMD loader or via\nvanilla javascript.\n\nThe plugin has two dependencies, underscore.js and backbone.js\n\n### Dowload\nYou can directly download the \n[Development Version](https://raw.github.com/asciidisco/Backbone.Mutators/master/backbone.mutators.js)\nor the\n[Production Version](https://raw.github.com/asciidisco/Backbone.Mutators/master/backbone.mutators.min.js)\nfrom the root folder\n\n### VOLO\n```shell\n$ volo add Backbone.Mutators\n```\n\n### NPM\n```shell\n$ npm install Backbone.Mutators\n```\n\n## Integration\n\n### AMD\n```javascript\n// AMD\nrequire(['underscore', 'backbone', 'path/to/backbone.mutators'], function (_, Backbone, Mutators) {\n  /* Do stuff with Backbone here */\n});\n```\n\n### CommonJS\n```javascript\n// CommonJS\nvar _ = require('underscore');\nvar Backbone = require('backbone');\nvar Mutators = require('backbone.mutators');\n```\n\n### Vanilla JS\n```html\n<!-- Vanilla javascript -->\n<script src=\"path/to/underscore.js\"></script>\n<script src=\"path/to/backbone.js\"></script>\n<script src=\"path/to/backbone.mutators.js\"></script>\n<script>\n\tconsole.log(Backbone.Mutators); // Backbone and the Mutators property are globals\n</script>\n```\n\n## Usage\nSome lines of code explain more then thousand words...\n\n### Basic usage\n```javascript\n var User = Backbone.Model.extend({\n \t// Define mutator properties\n    mutators: {\n        fullname: function () {\n            return this.firstname + ' ' + this.lastname;\n        }\n    },\n    defaults: {\n    \tfirstname: 'Sugar',\n        lastname: 'Daddy'\n    }\n });\n\n var user = new User();\n // use get to get the 'mutated' value \n user.get('fullname') // 'Sugar Daddy'\n // serialize the model and see the 'mutated' value in the resulting JSON\n user.toJSON() // '{firstname: 'Sugar', lastname: 'Daddy', fullname: 'Sugar Daddy'}'\n```\n\n### Override getters\n```javascript\n var State = Backbone.Model.extend({\n \t// Define mutator properties\n    mutators: {\n        status: function () {\n            return this.status === true ? 'Workish' : 'Bad bad error';\n        }\n    },\n    defaults: {\n    \tstatus: true\n    }\n });\n\n var state = new State();\n // use get to get the 'mutated' value \n state.get('status') // 'Workish'\n // serialize the model and see the 'mutated' value in the resulting JSON\n state.toJSON() // '{status: 'Workish'}'\n```\n\n### Use setters\n```javascript\n var User = Backbone.Model.extend({\n \t// Define mutator properties\n    mutators: {\n        fullname: {\n\t\t\tset: function (key, value, options, set) {\n\t\t\t\tvar names = value.split(' ');\n\t\t\t\tthis.set('firstname', names[0], options);\n\t\t\t\tthis.set('lastname', names[1], options);\n\t\t\t},\n        \tget: function () {\n            \treturn this.firstname + ' ' + this.lastname;\n        \t}\n        }\n    },\n    defaults: {\n    \tfirstname: 'Sugar',\n        lastname: 'Daddy'\n    }\n });\n\n var user = new User();\n // use get to get the 'mutated' value \n user.set('fullname', 'Big Mama', {silent: true});\n // serialize the model and see the 'mutated' value in the resulting JSON\n user.get('fullname') // 'Big Mama'\n user.get('firstname'); // 'Big'\n user.get('lastname'); // 'Mama'\n```\n\n### Catch model events\n```javascript\n var User = Backbone.Model.extend({\n    // Define mutator properties\n    mutators: {\n        fullname: {\n            set: function (key, value, options, set) {\n                var names = value.split(' ');\n                this.set('firstname', names[0], options);\n                this.set('lastname', names[1], options);\n            },\n            get: function () {\n                return this.firstname + ' ' + this.lastname;\n            }\n        }\n    },\n    defaults: {\n        firstname: 'Sugar',\n        lastname: 'Daddy'\n    }\n });\n\n var user = new User();\n\n // bind mutator event\n user.bind('mutators:set:fullname', function () {\n    console.log('Somebody sets a full name');\n });\n\n // bind model events\n user.bind('change:firstname', function () {\n    console.log('Somebody changed the first name');\n });\n\n  // bind model events\n user.bind('change:lastname', function () {\n    console.log('Somebody changed the last name');\n });\n\n // use get to get the 'mutated' value \n user.set('fullname', 'Big Mama');\n \n // serialize the model and see the 'mutated' value in the resulting JSON\n user.get('fullname') // 'Big Mama'\n user.get('firstname'); // 'Big'\n user.get('lastname'); // 'Mama'\n```\n\n### Silence mutator events (while keeping the model events fired)\n```javascript\n var User = Backbone.Model.extend({\n    // Define mutator properties\n    mutators: {\n        fullname: {\n            set: function (key, value, options, set) {\n                var names = value.split(' ');\n                this.set('firstname', names[0], options);\n                this.set('lastname', names[1], options);\n            },\n            get: function () {\n                return this.firstname + ' ' + this.lastname;\n            }\n        }\n    },\n    defaults: {\n        firstname: 'Sugar',\n        lastname: 'Daddy'\n    }\n });\n\n var user = new User();\n\n // bind mutator event\n // will never be run\n user.bind('mutators:set:fullname', function () {\n    console.log('Somebody sets a full name');\n });\n\n // bind model events\n // will still run\n user.bind('change:firstname', function () {\n    console.log('Somebody changed the first name');\n });\n\n // bind model events\n // will still run\n user.bind('change:lastname', function () {\n    console.log('Somebody changed the last name');\n });\n\n // use get to get the 'mutated' value \n user.set('fullname', 'Big Mama', {mutators: {silence: true}});\n \n // serialize the model and see the 'mutated' value in the resulting JSON\n user.get('fullname') // 'Big Mama'\n user.get('firstname'); // 'Big'\n user.get('lastname'); // 'Mama'\n```\n\n### Use mutated setters and call the original setter within\n```javascript\n var Spicy = Backbone.Model.extend({\n    // Define mutator properties\n    mutators: {\n        fullname: {\n            set: function (key, value, options, set) {\n                // call the original setter with the lowercased value\n                set(key, value.toLowerCase(), options);\n            }\n        }\n    },\n    defaults: {\n        iAcceptOnlyLowercaseStuff: 'sugar'\n    }\n });\n\n var spicy = new Spicy();\n // use get to get the 'mutated' value \n spicy.set('iAcceptOnlyLowercaseStuff', 'SALT');\n spicy.get('iAcceptOnlyLowercaseStuff') // 'salt'\n```\n\n### Define multiple mutators\n```javascript\n var User = Backbone.Model.extend({\n \t// Define mutator properties\n    mutators: {\n        fullname: {\n\t\t\tset: function (key, value, options, set) {\n\t\t\t\tvar names = value.split(' ');\n\t\t\t\tthis.set('firstname', names[0], options);\n\t\t\t\tthis.set('lastname', names[1], options);\n\t\t\t}\n        \tget: function () {\n            \treturn this.firstname + ' ' + this.lastname;\n        \t}\n        },\n        password: function () {\n    \t\treturn md5(this.password);\n    \t}\n    },\n    defaults: {\n    \tfirstname: 'Sugar',\n        lastname: 'Daddy'\n    }\n });\n```\n\n## Further reading\nJames Brown ([@ibjhb](https://github.com/ibjhb/Exploring-Backbone.Mutators))\nhas written a blog article about Mutators ([Exploring Backbone.Mutators](http://ja.mesbrown.com/2012/03/exploring-backbone-mutators-plugin/))\n\n## Changelog\n\n### 0.3.0\n+ Removed the Cake based build process and moved to grunt\n+ Mutators now integrates itself to backbone, no more manual extending needed\n+ Added the {mutator: {silent: true}} option to prevent mutator set events from firering\n+ Added unit tests for the new features\n+ Moved from jslint to jshint\n+ Tweaked docs\n+ Removed not needed jquery and qunit-logging submodule / npm dependencies\n\n### 0.2.0\n+ Added the original Backbone.Model.set function as a fourth paramter for the mutated set\n+ Added a 'mutators:set:{{YOUR_MUTATOR_PROPERTY}}' event when setting mutated properties\n+ Added unit tests for the new features\n+ Extended/fixed documentation\n+ Added inline version tag [NOTE: Version 0.2.0 is fully backwards compatible]\n\n### 0.1.0\n+ Initial Release"}},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"time":{"modified":"2012-05-20T12:48:24.116Z","created":"2012-03-16T14:24:48.278Z","0.1.0":"2012-03-16T14:24:48.880Z","0.3.0":"2012-05-20T12:48:24.116Z"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Mutators.git"},"_attachments":{"Backbone.Mutators-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XhDmEzZdodOB1+NiihXDIg==","length":7027240,"stub":true},"Backbone.Mutators-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8+EIDJubCd7ZmYorjsQzpw==","length":7021257,"stub":true}}}},
{"id":"Backbone.Rpc","key":"Backbone.Rpc","value":{"rev":"3-deaf6d68073860297416d685be5ff46e"},"doc":{"_id":"Backbone.Rpc","_rev":"3-deaf6d68073860297416d685be5ff46e","name":"Backbone.Rpc","description":"Plugin for using backbone js with json-rpc instead of the native REST implementation","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Backbone.Rpc","version":"0.1.0","description":"Plugin for using backbone js with json-rpc instead of the native REST implementation","homepage":"http://asciidisco.github.com/Backbone.Rpc/index.html","keywords":["backbone","plugin","rpc","json","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Rpc.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Rpc"}],"lib":".","main":"backbone.rpc.js","devDependencies":{"qunit":">=0.2.x","sinon":">=1.3.x"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9.x","jquery":">=1.7.x"},"_npmJsonOpts":{"file":"/Users/sgolasch/.npm/Backbone.Rpc/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Backbone.Rpc@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"1376fe31c81fb44ad3f8cb52948011a7d47e5d7b","tarball":"http://registry.npmjs.org/Backbone.Rpc/-/Backbone.Rpc-0.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"time":{"modified":"2012-03-14T20:25:23.887Z","created":"2012-03-14T20:25:21.775Z","0.1.0":"2012-03-14T20:25:23.887Z"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Rpc.git"},"_attachments":{"Backbone.Rpc-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EH5se+9BKye5MiC4aMoFew==","length":7731216,"stub":true}}}},
{"id":"Backbone.Subset","key":"Backbone.Subset","value":{"rev":"7-3d5e32ff3224c352259817e40f2f1ec7"},"doc":{"_id":"Backbone.Subset","_rev":"7-3d5e32ff3224c352259817e40f2f1ec7","name":"Backbone.Subset","description":"Provides a collection-like constructor that allows you create a collection that is subset from a parent one","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"Backbone.Subset","description":"Provides a collection-like constructor that allows you create a collection that is subset from a parent one","version":"0.0.1","author":{"name":"Pau ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Subset.git"},"devDependencies":{"backbone":"*","underscore":"*","mocha":"*"},"main":"./backbone.subset","_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"Backbone.Subset@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3ce5e4322483e2c94a7f790ec22bc6c480f1fe61","tarball":"http://registry.npmjs.org/Backbone.Subset/-/Backbone.Subset-0.0.1.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]},"0.0.2":{"name":"Backbone.Subset","description":"Provides a collection-like constructor that allows you create a collection that is subset from a parent one","version":"0.0.2","author":{"name":"Pau ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Subset.git"},"devDependencies":{"backbone":"*","underscore":"*","mocha":"*"},"main":"./backbone.subset","_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"Backbone.Subset@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2ae967849dc68f476630eda7f397a19aa213d1ad","tarball":"http://registry.npmjs.org/Backbone.Subset/-/Backbone.Subset-0.0.2.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]},"0.0.3":{"name":"Backbone.Subset","description":"Provides a collection-like constructor that allows you create a collection that is subset from a parent one","version":"0.0.3","author":{"name":"Pau ramon","email":"masylum@gmail.com"},"contributors":[{"name":"Saimon Moore","email":"saimon@saimonmoore.net"},{"name":"Philip Roberts","email":"phil@latentflip.com"}],"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Subset.git"},"devDependencies":{"backbone":"0.5.3","underscore":"*","mocha":"*"},"main":"./backbone.subset","_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"Backbone.Subset@0.0.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"08d348e043b58d6ef11d4f5533f6a45403aee4ff","tarball":"http://registry.npmjs.org/Backbone.Subset/-/Backbone.Subset-0.0.3.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]}},"readme":"# Backbone.Subset\n\nA subset collection that contains pointers to models from a parent collection.\n\n## Use case?\n\nHaving a collection that represents only a subset of your models.\n\nFor instance having a *Archived tasks*, you want to be sure that adding, deleting\nor changing a *Task* will update that subset collection according to a given `sieve`\n\n## How does it work?\n\nThe API is almost the same as `Backbone.Collection`.\n\n  * You must implement a `parent` function that returns the collection the subset belongs.\n  * You must implement a `sieve` function that will be used to filter the parent collection.\n  * You can pass the option `{noparent: true}` on doing an `add` or a `remove` if you don't want this action to bubble to the parent collection.\n\n``` javascript\nModels.Task = Backbone.Model.extend({\n  initialize: function () {\n    this.collection = tasks;\n  }\n, isArchived: function () {\n    return this.get('archived');\n  }\n});\n\nCollections.Tasks = Backbone.Collection.extend({model: Models.Task});\nCollections.ArchivedTasks = Backbone.Subset.extend({\n  parent: function () {\n    return tasks;\n  }\n, sieve: function (task) {\n    return task.isArchived();\n  }\n});\n\ntasks = new Collections.Tasks();\narchivedTasks = new Collections.ArchivedTasks();\n\ntasks.reset([{archived: true}, {archived: false}]);\n\nassert.equal(task.length, 2);\nassert.equal(archivedTasks.length, 1);\n```\n\n## Tests\n\nYou must have node installed in order to run the tests.\n\n```\nnpm install\nmake\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2010-2011 Pau Ramon <masylum@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"time":{"modified":"2012-02-16T10:20:38.856Z","created":"2011-11-25T11:49:36.001Z","0.0.1":"2011-11-25T11:49:38.225Z","0.0.2":"2011-11-25T11:52:50.320Z","0.0.3":"2012-02-16T10:20:38.856Z"},"author":{"name":"Pau ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/Backbone.Subset.git"},"_attachments":{"Backbone.Subset-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-VdAbvxDySWrr6LLGrndTmg==","length":5799,"stub":true},"Backbone.Subset-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OsIAJKHmUOmZC2OGKh20TA==","length":10240,"stub":true},"Backbone.Subset-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-31bIFElG9t56zsPDPrUzVg==","length":10240,"stub":true}}}},
{"id":"Backbone.Utils","key":"Backbone.Utils","value":{"rev":"3-4a60e9ea0025690f6e7c9d738e1f43f7"},"doc":{"_id":"Backbone.Utils","_rev":"3-4a60e9ea0025690f6e7c9d738e1f43f7","name":"Backbone.Utils","description":"A few nice snippets around backbone that are not big enough to deserve their own plugin","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Backbone.Utils","version":"0.1.0","description":"A few nice snippets around backbone that are not big enough to deserve their own plugin","homepage":"http://asciidisco.github.com/Backbone.Utils/index.html","keywords":["backbone","plugin","model","collection","client","browser"],"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Utils.git"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/asciidisco/Backbone.Utils"}],"lib":".","main":"backbone.utils.js","devDependencies":{"grunt":"~0.3.x"},"dependencies":{"underscore":"~1.3.1","backbone":"0.9.x"},"_npmUser":{"name":"asciidisco","email":"public@asciidisco.com"},"_id":"Backbone.Utils@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"daa3aeb8e5ac63e2e2e5e558dd8d544ce3c97096","tarball":"http://registry.npmjs.org/Backbone.Utils/-/Backbone.Utils-0.1.0.tgz"}}},"readme":"Backbone.Utils\n==============\n\nA few nice snippets around backbone that are not big enough to deserve their own plugin\n\n[![Build Status](https://secure.travis-ci.org/asciidisco/Backbone.Utils.png?branch=master)](http://travis-ci.org/asciidisco/Backbone.Utils)","maintainers":[{"name":"asciidisco","email":"public@asciidisco.com"}],"time":{"modified":"2012-05-21T20:51:04.135Z","created":"2012-05-21T20:51:01.741Z","0.1.0":"2012-05-21T20:51:04.135Z"},"author":{"name":"Sebastian Golasch","email":"public@asciidisco.com"},"repository":{"type":"git","url":"git://github.com/asciidisco/Backbone.Utils.git"},"_attachments":{"Backbone.Utils-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LRCwmiJ26BXqsTm31/bJ3Q==","length":7476518,"stub":true}}}},
{"id":"Bag","key":"Bag","value":{"rev":"3-2e995848db8b2fa01a8b12b4f2866400"},"doc":{"_id":"Bag","_rev":"3-2e995848db8b2fa01a8b12b4f2866400","name":"Bag","description":"Use to add packages to a bag.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Bag","author":{"name":"A Gurha"},"version":"0.0.1","description":"Use to add packages to a bag.","dependencies":{"mocha":"*","should":"*","async":"*","semver":"*","underscore":"*"},"_npmUser":{"name":"agurha","email":"ankur.gurha@gmail.com"},"_id":"Bag@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"_from":"Bag@*","dist":{"shasum":"a9e5a9a70e83015f6b1ca62ec3456a2d13c6c474","tarball":"http://registry.npmjs.org/Bag/-/Bag-0.0.1.tgz"},"readme":"","maintainers":[{"name":"agurha","email":"ankur.gurha@gmail.com"}]}},"readme":"","maintainers":[{"name":"agurha","email":"ankur.gurha@gmail.com"}],"time":{"modified":"2012-05-08T15:53:14.959Z","created":"2012-05-08T15:53:13.894Z","0.0.1":"2012-05-08T15:53:14.959Z"},"author":{"name":"A Gurha"},"_attachments":{"Bag-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IPBgxPRA0D0ywqlWjz6EDg==","length":5225,"stub":true}}}},
{"id":"BandGravity","key":"BandGravity","value":{"rev":"3-274c1448aab7fdd50ade0aa07ca39e39"},"doc":{"_id":"BandGravity","_rev":"3-274c1448aab7fdd50ade0aa07ca39e39","name":"BandGravity","description":"BandGravity","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"BandGravity","preferGlobal":"false","version":"0.1.0","author":{"name":"Jason Byttow","email":"jason.byttow@builtbyaliens.com"},"description":"BandGravity","scripts":{"start":"node ./bin/http-server","test":"vows --spec --isolate"},"dependencies":{"coffee-script":">=1.3.x","coffeekup":">=0.3.x","express":">=2.0.x","stylus":">=0.2.x","mongodb":">=0.9"},"noAnalyze":true,"engine":{"node":">=0.6"},"_npmUser":{"name":"jasonbyttow","email":"jason.byttow@builtbyaliens.com"},"_id":"BandGravity@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1d36504aa65264d8a16708d8f31aaae76e3c51a6","tarball":"http://registry.npmjs.org/BandGravity/-/BandGravity-0.1.0.tgz"},"maintainers":[{"name":"jasonbyttow","email":"jason.byttow@builtbyaliens.com"}]}},"readme":"gravity\n=======","maintainers":[{"name":"jasonbyttow","email":"jason.byttow@builtbyaliens.com"}],"time":{"modified":"2012-04-25T23:30:01.506Z","created":"2012-04-25T23:30:00.230Z","0.1.0":"2012-04-25T23:30:01.506Z"},"author":{"name":"Jason Byttow","email":"jason.byttow@builtbyaliens.com"},"_attachments":{"BandGravity-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0cM539jGZnjeAr+T5AjyKg==","length":36555,"stub":true}}}},
{"id":"BarneyRubble","key":"BarneyRubble","value":{"rev":"3-aa73f10a542de560abf289d01d1f6152"},"doc":{"_id":"BarneyRubble","_rev":"3-aa73f10a542de560abf289d01d1f6152","name":"BarneyRubble","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"BarneyRubble","version":"1.0.0","email":"b@rubble.com","url":"http://barnyrubble.tumblr.com/","_npmUser":{"name":"badrinarayanan","email":"badri@badri123.com"},"_id":"BarneyRubble@1.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"557c63580237f3a633043a66c44fe012491f9666","tarball":"http://registry.npmjs.org/BarneyRubble/-/BarneyRubble-1.0.0.tgz"},"readme":"","maintainers":[{"name":"badrinarayanan","email":"badri@badri123.com"}]}},"readme":"","maintainers":[{"name":"badrinarayanan","email":"badri@badri123.com"}],"time":{"modified":"2012-05-05T09:54:38.094Z","created":"2012-05-05T09:54:32.235Z","1.0.0":"2012-05-05T09:54:38.094Z"},"_attachments":{"BarneyRubble-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OgNzNfqVAacnMLfTdoGcuw==","length":442,"stub":true}}}},
{"id":"Base64","key":"Base64","value":{"rev":"3-55968e3e2def2134c504bfae5f4e2594"},"doc":{"_id":"Base64","_rev":"3-55968e3e2def2134c504bfae5f4e2594","name":"Base64","description":"window.btoa and window.atob polyfills","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Base64","version":"0.1.0","description":"window.btoa and window.atob polyfills","author":{"name":"David Chambers","email":"dc@hashify.me"},"licenses":[{"type":"WTFPL","url":"https://raw.github.com/davidchambers/Base64.js/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/davidchambers/Base64.js.git"},"bugs":{"name":"https://github.com/davidchambers/Base64.js/issues"},"devDependencies":{"coffee-script":"1.3.x","jessie":"0.4.x","uglify-js":"1.2.x"},"scripts":{"bytes":"node_modules/uglify-js/bin/uglifyjs base64.js | gzip -9f | wc -c","test":"node_modules/jessie/bin/jessie spec","uglify":"node_modules/uglify-js/bin/uglifyjs -o base64.min.js base64.js"},"_npmUser":{"name":"davidchambers","email":"dc@hashify.me"},"_id":"Base64@0.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"70f7e501d71d5d6944b1eed9f2169e5081558117","tarball":"http://registry.npmjs.org/Base64/-/Base64-0.1.0.tgz"},"maintainers":[{"name":"davidchambers","email":"dc@hashify.me"}]}},"readme":null,"maintainers":[{"name":"davidchambers","email":"dc@hashify.me"}],"time":{"modified":"2012-06-10T01:50:08.304Z","created":"2012-06-10T01:50:06.514Z","0.1.0":"2012-06-10T01:50:08.304Z"},"author":{"name":"David Chambers","email":"dc@hashify.me"},"repository":{"type":"git","url":"git://github.com/davidchambers/Base64.js.git"},"_attachments":{"Base64-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dwNZU+Ix2BvBGPUW+y0YEQ==","length":10240,"stub":true}}}},
{"id":"BetterRegExp","key":"BetterRegExp","value":{"rev":"9-d76f0b04f5e8cfe19397aca264a150fa"},"doc":{"_id":"BetterRegExp","_rev":"9-d76f0b04f5e8cfe19397aca264a150fa","name":"BetterRegExp","description":"Utility wrapper over RegExp","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"BetterRegExp","description":"Utility wrapper over RegExp","version":"0.0.1","homepage":"http://github.com/wearefractal/BetterRegExp","repository":{"type":"git","url":"git://github.com/wearefractal/BetterRegExp.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./index.js","dependencies":{"coffee-script":"*"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"mocha --compilers coffee:coffee-script"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/BetterRegExp/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"BetterRegExp@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b18197047f74a62ffae3b0f8ddaeb04afdfc3928","tarball":"http://registry.npmjs.org/BetterRegExp/-/BetterRegExp-0.0.1.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"directories":{}},"0.0.2":{"name":"BetterRegExp","description":"Utility wrapper over RegExp","version":"0.0.2","homepage":"http://github.com/wearefractal/BetterRegExp","repository":{"type":"git","url":"git://github.com/wearefractal/BetterRegExp.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./index.js","dependencies":{"coffee-script":"*"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"mocha --compilers coffee:coffee-script"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/BetterRegExp/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"BetterRegExp@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e8e8598efcb998ad8858fe89172773e2887496e0","tarball":"http://registry.npmjs.org/BetterRegExp/-/BetterRegExp-0.0.2.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]}},"readme":"![status](https://secure.travis-ci.org/wearefractal/BetterRegExp.png?branch=master)\n\n## Information\n\n<table>\n<tr> \n<td>Package</td><td>BetterRegExp</td>\n</tr>\n<tr>\n<td>Description</td>\n<td>Utility wrapper over RegExp</td>\n</tr>\n<tr>\n<td>Node Version</td>\n<td>>= 0.4</td>\n</tr>\n</table>\n\n## Usage\n\n### Constructor\n\n```coffee-script\nBetterRegExp = require \"BetterRegExp\"\n\n# Create from RegExp\nnew BetterRegExp /^\\s*\\d+\\s*$/gi\nnew BetterRegExp /^\\s*\\d+\\s*$/\nnew BetterRegExp /^\\s*\\d+\\s*$/, \"gi\"\n\n# Create from String\nnew BetterRegExp \"^\\s*\\d+\\s*$\", \"gi\"\nnew BetterRegExp \"^\\s*\\d+\\s*$\"\"\n```\n\n### Flags\n\n```coffee-script\npat = new BetterRegExp /^\\s*\\d+\\s*$/g\n\npat.addFlag('i') # Adding flags\npat.removeFlag('g') # Removing flags\npat.flags === 'i' # List flags\npat.addFlag('gm').removeFlag('i') # Chaining\n\n# There are aliases to help make chaining easier\npat.global() = pat.g() = pat.addFlag('g')\npat.ignoreCase() = pat.i() = pat.addFlag('i')\npat.multiline() = pat.m() = pat.addFlag('m')\npat.sticky() = pat.y() = pat.addFlag('y')\npat.extended() = pat.x() = pat.addFlag('x')\npat.g().i() = pat.addFlag('gi')\npat.i().m().x() = pat.addFlag('imx')\n```\n\n### Misc.\n\n```coffee-script\n# Escaping\nexp = BetterRegExp.escape \"test\"\npat = new BetterRegExp exp, \"g\"\n\n# Executing is the same\npat.exec \"test\"\n\n# Testing is the same\npat.match \"test\"\n```\n\n\n## LICENSE\n\n(MIT License)\n\nCopyright (c) 2012 Fractal <contact@wearefractal.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"time":{"modified":"2012-06-08T20:50:19.748Z","created":"2012-06-08T14:22:39.019Z","0.0.1":"2012-06-08T14:22:40.349Z","0.0.2":"2012-06-08T20:50:19.748Z"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"repository":{"type":"git","url":"git://github.com/wearefractal/BetterRegExp.git"},"_attachments":{"BetterRegExp-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-UgdaLqCwLY2sZVF00S0MDA==","length":3388,"stub":true},"BetterRegExp-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RQlmFY9LqfkW4fX51G58/Q==","length":3091,"stub":true}}}},
{"id":"BigInt","key":"BigInt","value":{"rev":"13-bf928ad560864b2dadb3f9d9ac0954ad"},"doc":{"_id":"BigInt","_rev":"13-bf928ad560864b2dadb3f9d9ac0954ad","name":"BigInt","description":"Big Integer Library in pure Javascript","dist-tags":{"latest":"5.4.5"},"versions":{"5.4.0":{"name":"BigInt","version":"5.4.0","description":"Big Integer Library in pure Javascript","keywords":["bigint"],"homepage":"http://www.leemon.com/crypto/BigInt.html","author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"files":["src/BigInt.js"],"main":"src/BigInt.js","repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"BigInt@5.4.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"71478abb526b45519b6153cf7a58faca17e94f86","tarball":"http://registry.npmjs.org/BigInt/-/BigInt-5.4.0.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"5.4.1":{"name":"BigInt","version":"5.4.1","description":"Big Integer Library in pure Javascript","keywords":["bigint"],"homepage":"http://www.leemon.com/crypto/BigInt.html","author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"files":["src/BigInt.js"],"main":"src/BigInt.js","repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"BigInt@5.4.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a9facce67157741cc409e17507c4e95ea04b8115","tarball":"http://registry.npmjs.org/BigInt/-/BigInt-5.4.1.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"5.4.2":{"name":"BigInt","version":"5.4.2","description":"Big Integer Library in pure Javascript","keywords":["bigint"],"homepage":"http://www.leemon.com/crypto/BigInt.html","author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"files":["src/BigInt.js"],"main":"src/BigInt.js","repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"BigInt@5.4.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"55968dec51c0f5c0f71cf37081cbabf490291d16","tarball":"http://registry.npmjs.org/BigInt/-/BigInt-5.4.2.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"5.4.3":{"name":"BigInt","version":"5.4.3","description":"Big Integer Library in pure Javascript","keywords":["bigint"],"homepage":"http://www.leemon.com/crypto/BigInt.html","author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"files":["src/BigInt.js"],"main":"src/BigInt.js","repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"BigInt@5.4.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"16f97971953d5bb93ce507f4a9917e2a0703aa92","tarball":"http://registry.npmjs.org/BigInt/-/BigInt-5.4.3.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"5.4.4":{"name":"BigInt","version":"5.4.4","description":"Big Integer Library in pure Javascript","keywords":["bigint"],"homepage":"http://www.leemon.com/crypto/BigInt.html","author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"files":["src/BigInt.js"],"main":"src/BigInt.js","repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"BigInt@5.4.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"1fb2065b56f9bae468fa839557433580badc3ad8","tarball":"http://registry.npmjs.org/BigInt/-/BigInt-5.4.4.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"5.4.5":{"name":"BigInt","version":"5.4.5","description":"Big Integer Library in pure Javascript","keywords":["bigint"],"homepage":"http://www.leemon.com/crypto/BigInt.html","author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"files":["src/BigInt.js"],"main":"src/BigInt.js","repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"BigInt@5.4.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"42e983979629a27ca824d8c35d2004d07732b11c","tarball":"http://registry.npmjs.org/BigInt/-/BigInt-5.4.5.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]}},"readme":null,"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}],"time":{"modified":"2011-12-14T22:29:18.784Z","created":"2011-12-14T18:20:56.281Z","5.4.0":"2011-12-14T18:20:57.875Z","5.4.1":"2011-12-14T18:25:47.754Z","5.4.2":"2011-12-14T22:12:10.756Z","5.4.3":"2011-12-14T22:25:42.827Z","5.4.4":"2011-12-14T22:26:59.221Z","5.4.5":"2011-12-14T22:29:18.784Z"},"author":{"name":"Leemon Baird","email":"Leemon@Leemon.com","url":"http://www.leemon.com/"},"repository":{"type":"git","url":"git://github.com/vjeux/BigInt.git"},"_attachments":{"BigInt-5.4.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-F4ub3hcwwzPXQG/NgnA2GA==","length":14606,"stub":true},"BigInt-5.4.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6La4IGyiuHsa0w8bhNva/g==","length":14631,"stub":true},"BigInt-5.4.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-GXGUao1iBflqYjc6kKuPwA==","length":14630,"stub":true},"BigInt-5.4.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-88f3zSguG8b3pEmQDabIeg==","length":14526,"stub":true},"BigInt-5.4.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XBukcnBEHC9ExHOQrh5ixw==","length":14509,"stub":true},"BigInt-5.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Fnq2gph9nUXjrPEMwdHA4A==","length":14506,"stub":true}}}},
{"id":"BinHeap","key":"BinHeap","value":{"rev":"11-cc1290fbfebfdf69d543630f909069aa"},"doc":{"_id":"BinHeap","_rev":"11-cc1290fbfebfdf69d543630f909069aa","name":"BinHeap","dist-tags":{"latest":"0.0.1-3"},"versions":{"0.0.1":{"name":"BinHeap","version":"0.0.1","_npmUser":{"name":"siyegen","email":"siyegen@gmail.com"},"_id":"BinHeap@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f1bf10213aa4530817def559631232d9071986d1","tarball":"http://registry.npmjs.org/BinHeap/-/BinHeap-0.0.1.tgz"},"readme":"","maintainers":[{"name":"siyegen","email":"siyegen@gmail.com"}],"directories":{}},"0.0.1-2":{"name":"BinHeap","version":"0.0.1-2","_npmUser":{"name":"siyegen","email":"siyegen@gmail.com"},"_id":"BinHeap@0.0.1-2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7dc1abf2a4e23439d9320cebdf170bf71f05d554","tarball":"http://registry.npmjs.org/BinHeap/-/BinHeap-0.0.1-2.tgz"},"readme":"","maintainers":[{"name":"siyegen","email":"siyegen@gmail.com"}],"directories":{}},"0.0.1-3":{"name":"BinHeap","version":"0.0.1-3","_npmUser":{"name":"siyegen","email":"siyegen@gmail.com"},"_id":"BinHeap@0.0.1-3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0037165491036a63a2a5ca5e512d40ced82efd6d","tarball":"http://registry.npmjs.org/BinHeap/-/BinHeap-0.0.1-3.tgz"},"readme":"","maintainers":[{"name":"siyegen","email":"siyegen@gmail.com"}],"directories":{}}},"readme":"","maintainers":[{"name":"siyegen","email":"siyegen@gmail.com"}],"time":{"modified":"2012-01-04T00:48:54.305Z","created":"2012-01-03T21:41:07.115Z","0.0.1":"2012-01-03T21:41:08.145Z","0.0.1-2":"2012-01-03T21:56:47.540Z","0.0.1-3":"2012-01-03T22:04:13.271Z","0.0.2":"2012-01-04T00:33:23.100Z"},"description":"Sample BinHeap","author":{"name":"Siyegen"},"repository":{"type":"git","url":"git://github.com/siyegen/node_binheap.git"},"_attachments":{"BinHeap-0.0.1-3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qaJnWsm9WYMD/vcj60De3Q==","length":1049,"stub":true},"BinHeap-0.0.1-2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gGTvX5TJRwVJLH2q1WXKgg==","length":1040,"stub":true},"BinHeap-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4LNFxlXpSWmnqWeL0SaseA==","length":944,"stub":true}}}},
{"id":"Birbal","key":"Birbal","value":{"rev":"7-56bb9e02a852eee75577eec1113d8db7"},"doc":{"_id":"Birbal","_rev":"7-56bb9e02a852eee75577eec1113d8db7","name":"Birbal","description":"Quick, simple routing","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"Birbal","version":"0.0.1","description":"Quick, simple routing","keywords":["routing","router","framework"],"author":{"name":"Dhaivat Pandya","email":"dhaivatpandya@gmail.com","url":"http://poincare101.blogspot.com"},"repository":{"type":"git","url":"git://github.com/poincare/Birbal.git"},"bugs":{"email":"dhaivatpandya@gmail.com","url":"http://github.com/poincare/Birbal/issues"},"directories":{"lib":"./"},"_npmUser":{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"},"_id":"Birbal@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"a3b01424e73bf0c2d16f635fc22f19d41142a313","tarball":"http://registry.npmjs.org/Birbal/-/Birbal-0.0.1.tgz"},"maintainers":[{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"}]},"0.0.2":{"name":"Birbal","version":"0.0.2","description":"Quick, simple routing","keywords":["routing","router","framework"],"author":{"name":"Dhaivat Pandya","email":"dhaivatpandya@gmail.com","url":"http://poincare101.blogspot.com"},"repository":{"type":"git","url":"git://github.com/poincare/Birbal.git"},"bugs":{"email":"dhaivatpandya@gmail.com","url":"http://github.com/poincare/Birbal/issues"},"directories":{"lib":"./"},"_npmUser":{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"},"_id":"Birbal@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"4af88f0b6e6b9f2b4cbb8593a3972b5ff8f649a9","tarball":"http://registry.npmjs.org/Birbal/-/Birbal-0.0.2.tgz"},"maintainers":[{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"}]},"0.0.3":{"name":"Birbal","version":"0.0.3","description":"Quick, simple routing","keywords":["routing","router","framework"],"author":{"name":"Dhaivat Pandya","email":"dhaivatpandya@gmail.com","url":"http://poincare101.blogspot.com"},"repository":{"type":"git","url":"git://github.com/poincare/Birbal.git"},"bugs":{"email":"dhaivatpandya@gmail.com","url":"http://github.com/poincare/Birbal/issues"},"directories":{"lib":"./lib"},"files":["./lib/Birbal.js"],"_npmUser":{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"},"_id":"Birbal@0.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"c1dcf624da8a615e4962329ef28befb939d03a95","tarball":"http://registry.npmjs.org/Birbal/-/Birbal-0.0.3.tgz"},"maintainers":[{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"}]}},"readme":"#Birbal\n\nA clever little framework for Node.js\n\n* Handles simple routing for you\n* Doesn't restrict you at all.\n\nInstall with:\n\n    npm install -g birbal\n\nHave fun!\n\nQuick example:\n    var akbar = require(\"Birbal\")\n    function hi() {\n        return \"Hello!\";\n    }\n\n    var routes = {\"/hi\":[hello, \"GET\"]}\n\n    akbar.Birbal();\n\nAwesome!\n\nHere's what coming really soon:\n\n* POST and GET variable access\n* Integration with Jade, Haml.JS and Moustache\n* Integration with Redis and MongoDB\n* Basically turning Birbal into a microframework\n\nWatch this project to keep in touch :) \n","maintainers":[{"name":"dhaivatpandya","email":"dhaivatpandya@gmail.com"}],"time":{"modified":"2011-12-17T16:51:29.668Z","created":"2011-12-16T23:29:38.245Z","0.0.1":"2011-12-16T23:29:39.784Z","0.0.2":"2011-12-17T16:45:29.083Z","0.0.3":"2011-12-17T16:51:29.668Z"},"author":{"name":"Dhaivat Pandya","email":"dhaivatpandya@gmail.com","url":"http://poincare101.blogspot.com"},"repository":{"type":"git","url":"git://github.com/poincare/Birbal.git"},"_attachments":{"Birbal-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4qAYBsrXHg4dUABogO38vg==","length":1308,"stub":true},"Birbal-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kAVJ+S1c9M84XTOTxKv5dg==","length":1632,"stub":true},"Birbal-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ENsDjTxE/LVFk/P9eThEXw==","length":1489,"stub":true}}}},
{"id":"Blaggie-System","key":"Blaggie-System","value":{"rev":"3-47782b1e5cbfa425170192799510e148"},"doc":{"_id":"Blaggie-System","_rev":"3-47782b1e5cbfa425170192799510e148","name":"Blaggie-System","description":"Blog in pieces","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Blaggie-System","description":"Blog in pieces","version":"0.1.0","author":{"name":"Jake Verbaten"},"dependencies":{"express":"2.4.4","validator":"0.2.7","dust":"0.3.0","node-uuid":"1.2.0","marked":"0.0.4","request":"2.0.3","traits":"0.4.0","watch":"0.3.2","less":"1.1.4","after":"0.1.0","buffertools":"1.0.3","connect-gzip":"0.1.0"},"devDependencies":{"vows":"0.5.10","should":"0.2.1","nodemon":"0.5.3","node-inspector":"0.1.9"},"_npmJsonOpts":{"file":"/home/CORPUSERS/10102009/.npm/Blaggie-System/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"Blaggie-System@0.1.0","scripts":{"start":"node server.js"},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"aa4542b0e5ba6e75d929ecd29dee6b58b3737a2d","tarball":"http://registry.npmjs.org/Blaggie-System/-/Blaggie-System-0.1.0.tgz"},"maintainers":[{"name":"10102009","email":"preethi.bhaskar@sonyericsson.com"}]}},"maintainers":[{"name":"10102009","email":"preethi.bhaskar@sonyericsson.com"}],"time":{"modified":"2011-08-23T00:14:00.304Z","created":"2011-08-23T00:13:59.877Z","0.1.0":"2011-08-23T00:14:00.304Z"},"author":{"name":"Jake Verbaten"},"_attachments":{"Blaggie-System-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lUJHr8SeY20H9LfrFdQQTw==","length":13307,"stub":true}}}},
{"id":"Blob","key":"Blob","value":{"rev":"3-cf5fb5d69da4dd00bc4f2be8870ca698"},"doc":{"_id":"Blob","_rev":"3-cf5fb5d69da4dd00bc4f2be8870ca698","name":"Blob","description":"HTML5 FileAPI `Blob` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"Blob","description":"HTML5 FileAPI `Blob` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","Blob"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"Blob.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/Blob/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Blob@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"485a6d9d54fd4dd74253e0c60af86fc66621e9df","tarball":"http://registry.npmjs.org/Blob/-/Blob-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T20:28:59.631Z","created":"2011-07-15T20:28:59.283Z","0.10.0":"2011-07-15T20:28:59.631Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"Blob-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-MXiz2scbA+y21tjXrDM0ig==","length":441,"stub":true}}}},
{"id":"BlobBuilder","key":"BlobBuilder","value":{"rev":"3-eb977ff1713a915384fac994f9d8fa7c"},"doc":{"_id":"BlobBuilder","_rev":"3-eb977ff1713a915384fac994f9d8fa7c","name":"BlobBuilder","description":"HTML5 FileAPI `BlobBuilder` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"BlobBuilder","description":"HTML5 FileAPI `BlobBuilder` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","BlobBuilder"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"BlobBuilder.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/BlobBuilder/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"BlobBuilder@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1c7312079315074d7bd8e8a8b1babf21d8fd914c","tarball":"http://registry.npmjs.org/BlobBuilder/-/BlobBuilder-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T20:28:38.582Z","created":"2011-07-15T20:28:38.198Z","0.10.0":"2011-07-15T20:28:38.582Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"BlobBuilder-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R6zLgAyAjaaCMp10mlY8eg==","length":457,"stub":true}}}},
{"id":"BlobBuilder-browser","key":"BlobBuilder-browser","value":{"rev":"3-20e1175019c8056832eec3619df2ca45"},"doc":{"_id":"BlobBuilder-browser","_rev":"3-20e1175019c8056832eec3619df2ca45","name":"BlobBuilder-browser","description":"returns either BlobBuilder, MozBlobBuilder, or WebKitBlobBuilder","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info/"},"name":"BlobBuilder-browser","provides":"BlobBuilder","description":"returns either BlobBuilder, MozBlobBuilder, or WebKitBlobBuilder","version":"1.0.0","repository":{"type":"git","url":"git://github.com/coolaj86/node-examples-js.git"},"main":"./blob-builder","engines":{"node":"*"},"browserDependencies":{},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"BlobBuilder-browser@1.0.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4b4a9fb636fe0801a0f74ccffbe5551023e3e7f0","tarball":"http://registry.npmjs.org/BlobBuilder-browser/-/BlobBuilder-browser-1.0.0.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2012-03-03T02:16:22.220Z","created":"2012-03-03T02:16:21.257Z","1.0.0":"2012-03-03T02:16:22.220Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info/"},"repository":{"type":"git","url":"git://github.com/coolaj86/node-examples-js.git"},"_attachments":{"BlobBuilder-browser-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uEMS0JGrtKXitmYYGHYU3Q==","length":449,"stub":true}}}},
{"id":"Blueprint-Sugar","key":"Blueprint-Sugar","value":{"rev":"3-056aacc81c5b0770ab52d4242bd4fd3e"},"doc":{"_id":"Blueprint-Sugar","_rev":"3-056aacc81c5b0770ab52d4242bd4fd3e","name":"Blueprint-Sugar","description":"A simple Sugar for Prototypal Inheritance","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.3":{"author":{"name":"Luis Couto","email":"couto@15minuteslate.net","url":"15minuteslate.net"},"name":"Blueprint-Sugar","description":"A simple Sugar for Prototypal Inheritance","version":"0.0.3","homepage":"http://github.com/Couto/Blueprint","keywords":["prototypal","sugar","blueprint"],"repository":{"type":"git","url":"git://github.com/Couto/Blueprint.git"},"main":"src/Blueprint.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"couto","email":"couto@15minuteslate.net"},"_id":"Blueprint-Sugar@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"b76002b28f63a7b637af37df8836c8923c16e022","tarball":"http://registry.npmjs.org/Blueprint-Sugar/-/Blueprint-Sugar-0.0.3.tgz"},"maintainers":[{"name":"couto","email":"couto@15minuteslate.net"}]}},"readme":null,"maintainers":[{"name":"couto","email":"couto@15minuteslate.net"}],"time":{"modified":"2012-03-02T19:58:00.433Z","created":"2012-03-02T19:57:58.673Z","0.0.3":"2012-03-02T19:58:00.433Z"},"author":{"name":"Luis Couto","email":"couto@15minuteslate.net","url":"15minuteslate.net"},"repository":{"type":"git","url":"git://github.com/Couto/Blueprint.git"},"_attachments":{"Blueprint-Sugar-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-o2mq6+Keaz1sBUTFoB6KuA==","length":55456,"stub":true}}}},
{"id":"Bmodule","key":"Bmodule","value":{"rev":"5-9ab3ba339fcc7643af9455a118f26970"},"doc":{"_id":"Bmodule","_rev":"5-9ab3ba339fcc7643af9455a118f26970","name":"Bmodule","description":"this is demo","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"gengbin","email":"gengbin.mail@gmail.com"},"name":"Bmodule","description":"This is demo module","version":"0.0.1","repository":{"url":""},"main":"demo.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"gengbin","email":"gengbin.mail@gmail.com"},"_id":"Bmodule@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"42949a92f56b7311974840dc1cc8fe949ec957a9","tarball":"http://registry.npmjs.org/Bmodule/-/Bmodule-0.0.1.tgz"},"maintainers":[{"name":"gengbin","email":"gengbin.mail@gmail.com"}]},"0.0.2":{"author":{"name":"gengbin"},"name":"Bmodule","description":"this is demo","version":"0.0.2","repository":{"url":""},"main":"demo.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"gengbin","email":"gengbin.mail@gmail.com"},"_id":"Bmodule@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"ec80c500da5c561ac0656ddcd815499db11c42f9","tarball":"http://registry.npmjs.org/Bmodule/-/Bmodule-0.0.2.tgz"},"maintainers":[{"name":"gengbin","email":"gengbin.mail@gmail.com"}]}},"readme":null,"maintainers":[{"name":"gengbin","email":"gengbin.mail@gmail.com"}],"time":{"modified":"2011-11-24T03:32:27.196Z","created":"2011-11-24T02:56:04.973Z","0.0.1":"2011-11-24T02:56:13.058Z","0.0.2":"2011-11-24T03:32:27.196Z"},"author":{"name":"gengbin"},"repository":{"url":""},"_attachments":{"Bmodule-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CwRjxHYJYp/yxtp3aYZ52A==","length":10240,"stub":true},"Bmodule-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mxwxhiLQzrpin6b6BXFftw==","length":10240,"stub":true}}}},
{"id":"Brocket","key":"Brocket","value":{"rev":"5-19335382de2b02e069fdb0bc4498851e"},"doc":{"_id":"Brocket","_rev":"5-19335382de2b02e069fdb0bc4498851e","name":"Brocket","description":"A self-hosting and self-extensible (meta)class system for JavaScript","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Dave Rolsky","email":"autarch@urth.org","url":"http://blog.urth.org"},"name":"Brocket","version":"0.0.1","description":"A self-hosting and self-extensible (meta)class system for JavaScript","homepage":"https://github.com/autarch/Brocket","bugs":{"name":"https://github.com/autarch/Brocket/issues"},"repository":{"type":"git","url":"git://github.com/autarch/Brocket.git"},"main":"./lib/Brocket.js","engines":{"node":"~0.6.2"},"dependencies":{"underscore":"*"},"devDependencies":{"coffee-script":"1.1.3","muffin":">= 0.2.6","tap":"*"},"scripts":{"prepublish":"cake build","postpublish":"cake clean","test":"cake build && cake test"},"_npmUser":{"name":"drolsky","email":"autarch@urth.org"},"_id":"Brocket@0.0.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"645ea451bc9ae9f23b4da37b6e9c8ff08e512ad6","tarball":"http://registry.npmjs.org/Brocket/-/Brocket-0.0.1.tgz"},"maintainers":[{"name":"drolsky","email":"autarch@urth.org"}]},"0.0.2":{"author":{"name":"Dave Rolsky","email":"autarch@urth.org","url":"http://blog.urth.org"},"name":"Brocket","version":"0.0.2","description":"A self-hosting and self-extensible (meta)class system for JavaScript","homepage":"https://github.com/autarch/Brocket","bugs":{"name":"https://github.com/autarch/Brocket/issues"},"repository":{"type":"git","url":"git://github.com/autarch/Brocket.git"},"main":"./lib/Brocket.js","engines":{"node":"~0.6.2"},"dependencies":{"underscore":"*"},"devDependencies":{"coffee-script":"1.1.3","muffin":">= 0.2.6","tap":"*"},"scripts":{"prepublish":"cake build","test":"cake test"},"_npmUser":{"name":"drolsky","email":"autarch@urth.org"},"_id":"Brocket@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"b9a01d6387e082b76f5d9da50f1384fdd7f39c8f","tarball":"http://registry.npmjs.org/Brocket/-/Brocket-0.0.2.tgz"},"maintainers":[{"name":"drolsky","email":"autarch@urth.org"}]}},"readme":"# Brocket - A self-hosting and self-extensible (meta)class system for Javascript\n\n## Install\n\n```bash\nnpm install Brocket\n```\n\nor for a global install\n\n```bash\nnpm install -g Brocket\n```\n\n## What is it?\n\nBrocket aims to make OO programming in JavaScript (or Coffeescript) easier and\nmore fun. It allows you to declare classes using a simple declarative DSL-ish\nsyntax.\n\nUnder the hood, Brocket is based on a powerful meta-model. Every aspect of\nBrocket is itself a class, providing powerful introspectiona nd extension\nfeatures.\n\nBrocket is a port of Perl's [Moose](http://moose.perl.org).\n\n### Alpha Warning\n\nThis is an early version of Brocket. A lot of it isn't done. In particular, it\nis not yet self-bootstrapping, so you cannot extend Brocket by using\nBrocket-based classes (this will be coming in the future), and it does not\nprovide any code generation features to make things faster.\n\nIn other words, it's incomplete and slow.\n\n## Synopsis\n\nCreating a class with Brocket:\n\n```javascript\nBrocket = require(\"Brocket\");\nPerson = Brocket.makeClass( \"Person\", function (B) {\n    B.has( \"firstName\", { access: \"ro\" } );\n    B.has( \"lastName\",  { access: \"ro\" } );\n    B.has( \"age\",       { access: \"ro\", default: 0 } );\n\n    B.method( \"greet\", function () {\n        console.log \"Hi, my name is \" + this.firstName() + \".\";\n    } );\n} );\n\nUser = Brocket.makeClass( \"User\", function (B) {\n    B.extends(Person);\n    B.has( \"username\",  { access: \"rw\" } );\n    B.has( \"password\",  { access: \"rw\" } );\n    B.has( \"lastLogin\", { access: \"rw\" } );\n\n    B.method( \"login\", function (password) {\n        if ( password != this.password() ) {\n            return false;\n        }\n\n        this.lastLogin( new Date );\n\n        return true;\n    } );\n} );\n\nbob = new User ( {\n    firstName: \"Bob\",\n    lastName:  \"Smith\",\n    username:  \"bob.smith\",\n    password:  \"password\"\n} );\n\nbob.greet()\n\nif ( bob.login(password) ) {\n    ....\n}\n```\n\nHere's a class example in CoffeeScript\n\n```coffeescript\nBrocket = require \"Brocket\"\nPerson = Brocket.makeClass \"Person\", (B) ->\n    B.has \"firstName\", access: \"ro\"\n    B.has \"lastName\",  access: \"ro\"\n    B.has \"age\",       access: \"ro\", default: 0\n\n    B.method \"greet\", ->\n        console.log \"Hi, my name is #{ @firstName() }.\"\n```\n","maintainers":[{"name":"drolsky","email":"autarch@urth.org"}],"time":{"modified":"2012-01-11T18:18:38.430Z","created":"2012-01-11T17:26:58.114Z","0.0.1":"2012-01-11T17:26:59.487Z","0.0.2":"2012-01-11T18:18:38.430Z"},"author":{"name":"Dave Rolsky","email":"autarch@urth.org","url":"http://blog.urth.org"},"repository":{"type":"git","url":"git://github.com/autarch/Brocket.git"},"_attachments":{"Brocket-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Wn8RZCi2NZhZg3NC25FILg==","length":29978,"stub":true},"Brocket-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-W1VeqoDe2WAsZJAHwQzwWw==","length":16009,"stub":true}}}},
{"id":"Buffer","key":"Buffer","value":{"rev":"3-549594b58e83d6d07bb219e73de558e5"},"doc":{"_id":"Buffer","_rev":"3-549594b58e83d6d07bb219e73de558e5","name":"Buffer","description":"API-compatible Node.JS Buffer for Ender.js (browser)","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"name":"Buffer","description":"API-compatible Node.JS Buffer for Ender.js (browser)","version":"0.0.0","repository":{"type":"git","url":"git://github.com/coolaj86/browser-buffer.git"},"main":"index.js","engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/coolaj86/.npm/Buffer/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Buffer@0.0.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"82cf8e986a2109ff6d1d6f1c436e47d07127aea4","tarball":"http://registry.npmjs.org/Buffer/-/Buffer-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-08-01T20:40:41.710Z","created":"2011-08-01T20:40:41.355Z","0.0.0":"2011-08-01T20:40:41.710Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/browser-buffer.git"},"_attachments":{"Buffer-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pzPKNvpJY0A+lKEgRYpjOw==","length":1276,"stub":true}}}},
{"id":"BufferList","key":"BufferList","value":{"rev":"3-474255f8a66c8b890f78c0e2e6cd19f0"},"doc":{"_id":"BufferList","_rev":"3-474255f8a66c8b890f78c0e2e6cd19f0","name":"BufferList","description":"handle multiple buffers in a sane way when waiting for indexOf and slices could be future dependent","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"BufferList","author":{"name":"bradleymeck"},"description":"handle multiple buffers in a sane way when waiting for indexOf and slices could be future dependent","version":"0.0.0","main":"lib/buffer-list.js","scripts":{"test":"vows test/*-test.js"},"_npmUser":{"name":"bradleymeck","email":"bradley.meck@gmail.com"},"_id":"BufferList@0.0.0","devDependencies":{"vows":"*"},"dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"aa432bed29a7bd068bf6ef7e0698bb0959deb316","tarball":"http://registry.npmjs.org/BufferList/-/BufferList-0.0.0.tgz"},"readme":"","maintainers":[{"name":"bradleymeck","email":"bradley.meck@gmail.com"}]}},"readme":"","maintainers":[{"name":"bradleymeck","email":"bradley.meck@gmail.com"}],"time":{"modified":"2012-02-04T23:43:15.439Z","created":"2012-02-04T23:43:14.160Z","0.0.0":"2012-02-04T23:43:15.439Z"},"author":{"name":"bradleymeck"},"_attachments":{"BufferList-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-z0zVWOfVtdKbyhPkHEcQqg==","length":2689,"stub":true}}}},
{"id":"ByteBuffer","key":"ByteBuffer","value":{"rev":"14-0f3b6184a88b371729813379e644ce38"},"doc":{"_id":"ByteBuffer","_rev":"14-0f3b6184a88b371729813379e644ce38","name":"ByteBuffer","description":"pack or unpack a byte array","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"ByteBuffer","description":"pack or unpack a byte array","homepage":"http://play175.github.com/ByteBuffer/","keywords":["Buffer","byte array","pack","unpack"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ByteBuffer.git"},"main":"ByteBuffer.js","version":"0.1.0","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ByteBuffer@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"9c6429172e53eebaab28fa0fd05d151eab3a0685","tarball":"http://registry.npmjs.org/ByteBuffer/-/ByteBuffer-0.1.0.tgz"},"maintainers":[{"name":"play175","email":"yoyo@play175.com"}]},"0.1.1":{"name":"ByteBuffer","description":"pack or unpack a byte array","homepage":"http://play175.github.com/ByteBuffer/","keywords":["Buffer","byte array","pack","unpack"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ByteBuffer.git"},"main":"ByteBuffer.js","version":"0.1.1","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ByteBuffer@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"fdee68fe64e048234ac38bfedbe771337969b558","tarball":"http://registry.npmjs.org/ByteBuffer/-/ByteBuffer-0.1.1.tgz"},"maintainers":[{"name":"play175","email":"yoyo@play175.com"}]},"0.1.2":{"name":"ByteBuffer","description":"pack or unpack a byte array","homepage":"http://play175.github.com/ByteBuffer/","keywords":["Buffer","byte array","pack","unpack"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ByteBuffer.git"},"main":"ByteBuffer.js","version":"0.1.2","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ByteBuffer@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"94b8de52f3f332578d2ca58335e9626d3e14e059","tarball":"http://registry.npmjs.org/ByteBuffer/-/ByteBuffer-0.1.2.tgz"},"maintainers":[{"name":"play175","email":"yoyo@play175.com"}]},"0.1.3":{"name":"ByteBuffer","description":"pack or unpack a byte array","homepage":"http://play175.github.com/ByteBuffer/","keywords":["Buffer","byte array","pack","unpack"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ByteBuffer.git"},"main":"ByteBuffer.js","version":"0.1.3","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ByteBuffer@0.1.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"35848c88e826ae6d62194cb304f3a8d892dd81ab","tarball":"http://registry.npmjs.org/ByteBuffer/-/ByteBuffer-0.1.3.tgz"},"maintainers":[{"name":"play175","email":"yoyo@play175.com"}]},"0.2.0":{"name":"ByteBuffer","description":"pack or unpack a byte array","homepage":"http://play175.github.com/ByteBuffer/","keywords":["Buffer","byte array","pack","unpack"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ByteBuffer.git"},"main":"ByteBuffer.js","version":"0.2.0","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ByteBuffer@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"29e26898f220ae8246abde630a4378cfe278f2c8","tarball":"http://registry.npmjs.org/ByteBuffer/-/ByteBuffer-0.2.0.tgz"},"maintainers":[{"name":"play175","email":"yoyo@play175.com"}]},"0.2.1":{"name":"ByteBuffer","description":"pack or unpack a byte array","homepage":"http://play175.github.com/ExBuffer/","keywords":["Buffer","byte array","pack","unpack"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ExBuffer.git"},"main":"ByteBuffer.js","version":"0.2.1","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ByteBuffer@0.2.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ef6aeb79b25281236a164abe2f74e6064995cea5","tarball":"http://registry.npmjs.org/ByteBuffer/-/ByteBuffer-0.2.1.tgz"},"maintainers":[{"name":"play175","email":"yoyo@play175.com"}]}},"readme":"nodejs版本的ByteBuffer和C++通信的利器！\r\n","maintainers":[{"name":"play175","email":"yoyo@play175.com"}],"time":{"modified":"2012-08-02T13:44:33.960Z","created":"2012-06-14T01:16:21.408Z","0.1.0":"2012-06-14T01:16:25.680Z","0.1.1":"2012-06-14T01:28:09.120Z","0.1.2":"2012-06-14T02:48:18.385Z","0.1.3":"2012-06-14T05:03:00.872Z","0.2.0":"2012-06-15T03:49:37.426Z","0.2.1":"2012-07-24T05:20:21.355Z"},"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ExBuffer.git"},"users":{"fgribreau":true},"_attachments":{"ByteBuffer-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-GeT5h1l6PGGTPn0OmFKGsg==","length":2502,"stub":true},"ByteBuffer-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-nK69mv1kivuhmsS1V+AJRw==","length":2372,"stub":true},"ByteBuffer-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-744TT+VLzZwzhZ+jiTL4SQ==","length":2074,"stub":true},"ByteBuffer-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oJ4xzBnYCn1fzlHqgWermg==","length":2049,"stub":true},"ByteBuffer-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-n3JoakDWLi/SMYASjG3srA==","length":1832,"stub":true},"ByteBuffer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZSz2rJribdB2fuLpbS34Cw==","length":1917,"stub":true}}}},
{"id":"CBuffer","key":"CBuffer","value":{"rev":"25-d1d18b34a83200578f3dc471a5d58aae"},"doc":{"_id":"CBuffer","_rev":"25-d1d18b34a83200578f3dc471a5d58aae","name":"CBuffer","description":"Circular Buffer JavaScript implementation","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"CBuffer","version":"0.0.1","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"37fdfe17c519c25291b7120e0f8cdbf7347b1419","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.1.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.2":{"name":"CBuffer","version":"0.0.2","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"/cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"070254e5f92fb13fb10537a21dc6f9babe5361b1","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.2.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.3":{"name":"CBuffer","version":"0.0.3","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"/cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7cae679a7b2173ac81fd07ed3ca7035c835e73c8","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.3.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.4":{"name":"CBuffer","version":"0.0.4","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"07664ed8b916a116077017406e6e751d760ed79f","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.4.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.5":{"name":"CBuffer","version":"0.0.5","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"602e800e82d85c9345752623b5a64fdb2a37fade","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.5.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.6":{"name":"CBuffer","version":"0.0.6","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.6","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"06058a50968883de93f62570a77098771cb22948","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.6.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.7":{"name":"CBuffer","version":"0.0.7","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.7","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fd8d8b1bd32ea16342a77153a50f89293a82b20d","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.7.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.8":{"name":"CBuffer","version":"0.0.8","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.8","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9f78aa2a05f3b0dd24df00793245cfc15bf9a53a","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.8.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.9":{"name":"CBuffer","version":"0.0.9","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.9","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d0a0165a2d17992fcee26cbbd88e849158de2dc1","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.9.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.0.10":{"name":"CBuffer","version":"0.0.10","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_npmUser":{"name":"trev.norris","email":"trev.norris@gmail.com"},"_id":"CBuffer@0.0.10","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e4f698ac67226e8c0a8378e4b39dae227acda5de","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.0.10.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.1.0":{"name":"CBuffer","version":"0.1.0","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"readme":"## JavaScript [Circular Buffer](http://en.wikipedia.org/wiki/Circular_buffer) Utility\n\nThe end goal of this project is to implement the entire JavaScript `Array.prototype`, and some\nadditional utility methods, as a circular buffer.\n\nAs JavaScript is used for more and more computationally intensive tasks, it's important to reduce\nexecution and garbage collection time. By using a circular buffer instead of a native array less\nextraneous data bits are generated that will need to be cleaned up later. So use of this library is\ntwo fold: First, if you need a circular buffer for the classical reasons (animation queue, video\nstreaming) this library can help you out. Second, if you know the maximum size of an array you'll be\nworking with, using CBuffer can drastically reduce the memory footprint of your application.\n\nWhile the entire `Array.prototype` API is on the roadmap, it's not all quite here. Below is the\ncurrently implemented API.\n\n\n### API\n\n#### Mutator Methods\n\n* pop()\n* push()\n* reverse()\n* rotateLeft(x)\n* rotateRight(x)\n* shift()\n* sort()\n* unshift()\n\n#### Accessor Methods\n\n* indexOf()\n* lastIndexOf()\n\n#### Iteration Methods\n\n* every()\n* forEach()\n* some()\n\n#### Utility Methods\n\n* empty()\n* first()\n* last()\n* get()\n* set()\n* toArray() - Return clean ordered array of buffer\n* overflow - Set to function and will be called when data is about to be overwritten\n","_id":"CBuffer@0.1.0","dist":{"shasum":"b15e8530175366e9b46be1ca8a1ccd81b51744d0","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.1.0.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]},"0.1.1":{"name":"CBuffer","version":"0.1.1","description":"Circular Buffer JavaScript implementation","homepage":"http://github.com/trevnorris/cbuffer","main":"./cbuffer.js","author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"vows":"0.6.x"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"readme":"## JavaScript [Circular Buffer](http://en.wikipedia.org/wiki/Circular_buffer) Utility\n\nThe end goal of this project is to implement the entire JavaScript `Array.prototype`, and some\nadditional utility methods, as a circular buffer.\n\nAs JavaScript is used for more and more computationally intensive tasks, it's important to reduce\nexecution and garbage collection time. By using a circular buffer instead of a native array less\nextraneous data bits are generated that will need to be cleaned up later. So use of this library is\ntwo fold: First, if you need a circular buffer for the classical reasons (animation queue, video\nstreaming) this library can help you out. Second, if you know the maximum size of an array you'll be\nworking with, using CBuffer can drastically reduce the memory footprint of your application.\n\nWhile the entire `Array.prototype` API is on the roadmap, it's not all quite here. Below is the\ncurrently implemented API.\n\n\n### API\n\n#### Mutator Methods\n\n* pop()\n* push()\n* reverse()\n* rotateLeft(x)\n* rotateRight(x)\n* shift()\n* sort()\n* unshift()\n\n#### Accessor Methods\n\n* indexOf()\n* lastIndexOf()\n\n#### Iteration Methods\n\n* every()\n* forEach()\n* some()\n\n#### Utility Methods\n\n* empty()\n* fill()\n* first()\n* last()\n* get()\n* set()\n* toArray() - Return clean ordered array of buffer\n* overflow - Set to function and will be called when data is about to be overwritten\n","_id":"CBuffer@0.1.1","dist":{"shasum":"4c2566e6b470b7c3c9ad8af6e4498196c8654514","tarball":"http://registry.npmjs.org/CBuffer/-/CBuffer-0.1.1.tgz"},"maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}]}},"readme":" ```\n _____ ______        __  __\n/  __ \\| ___ \\      / _|/ _|\n| /  \\/| |_/ /_   _| |_| |_ ___ _ __\n| |    | ___ \\ | | |  _|  _/ _ \\ '__|\n| \\__/\\| |_/ / |_| | | | ||  __/ |\n \\____/\\____/ \\__,_|_| |_| \\___|_|\n```\n\nJavaScript Circular Buffer Utility\n\nFor more information read [my blog post](http://blog.trevorjnorris.com/2012/03/javascript-circular-buffers/)\n","maintainers":[{"name":"trev.norris","email":"trev.norris@gmail.com"}],"time":{"modified":"2012-08-06T19:50:09.350Z","created":"2012-03-30T23:22:25.476Z","0.0.1":"2012-03-30T23:22:27.201Z","0.0.2":"2012-03-30T23:24:23.219Z","0.0.3":"2012-03-30T23:26:33.050Z","0.0.4":"2012-03-30T23:28:42.207Z","0.0.5":"2012-04-09T20:37:41.307Z","0.0.6":"2012-04-12T21:44:56.753Z","0.0.7":"2012-04-13T21:53:20.591Z","0.0.8":"2012-04-17T17:18:01.506Z","0.0.9":"2012-04-17T18:01:57.588Z","0.0.10":"2012-06-12T07:29:41.409Z","0.1.0":"2012-08-06T18:53:49.767Z","0.1.1":"2012-08-06T19:50:09.350Z"},"author":{"name":"Trevor Norris","email":"trev.norris@gmail.com","url":"http://trevorjnorris.com"},"repository":{"type":"git","url":"http ://github.com/trevnoris/cbuffer.git"},"_attachments":{"CBuffer-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-XEEm2HWnP48CYAi2oOq7Kw==","length":4680,"stub":true},"CBuffer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-SQsyieGsMmcuyCYzdRhJzg==","length":4741,"stub":true},"CBuffer-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-+4v1s+Ilgdp7WpSKryac/w==","length":4168,"stub":true},"CBuffer-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-i/JhOOgppnXXqpFAj2c4Zg==","length":3933,"stub":true},"CBuffer-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-UN+EfZs/zwLfzI+jQ69Sbw==","length":3921,"stub":true},"CBuffer-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-PnZw/FmlzibaoRxKLzoUhQ==","length":3805,"stub":true},"CBuffer-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-7p3huqdHaeIDwSmfnY/tjw==","length":3577,"stub":true},"CBuffer-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0MnPgjEO/ycE5c0z8NHhkQ==","length":1442,"stub":true},"CBuffer-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OIom+gbM4RYDAG73+oueuQ==","length":1321,"stub":true},"CBuffer-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8OpM13u7Dc8sQKVaroS5Lg==","length":1319,"stub":true},"CBuffer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OePraIMKHvjGNnaVGx1cwA==","length":1471,"stub":true},"CBuffer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gIb2rWWwPPosfkRPJyOx7A==","length":1462,"stub":true}}}},
{"id":"CLI-UI","key":"CLI-UI","value":{"rev":"5-5912625f27b4bdfb4d3eed16726c48a8"},"doc":{"_id":"CLI-UI","_rev":"5-5912625f27b4bdfb4d3eed16726c48a8","name":"CLI-UI","description":"A command-line based user interface library for node.js","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"CLI-UI","version":"0.1.0","description":"A command-line based user interface library for node.js","keyword":["CLI","UI","command","shebang"],"author":{"name":"Rodger Combs","email":"rodger.combs@gmail.com","url":"http://combsconnections.tk/"},"contributors":[],"main":"./main","repository":{"type":"git","url":"git://github.com/11rcombs/node-cli-ui.git"},"scripts":{},"config":{},"engines":{"node":">=0.4.8"},"dependencies":{},"devDependencies":{},"_id":"CLI-UI@0.1.0","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e7021965899455a31db67b6e2bd34d7e7317fd44","tarball":"http://registry.npmjs.org/CLI-UI/-/CLI-UI-0.1.0.tgz"}},"0.2.0":{"name":"CLI-UI","version":"0.2.0","description":"A command-line based user interface library for node.js","keyword":["CLI","UI","command","shebang"],"author":{"name":"Rodger Combs","email":"rodger.combs@gmail.com","url":"http://combsconnections.tk/"},"contributors":[],"main":"./main","repository":{"type":"git","url":"git://github.com/11rcombs/node-cli-ui.git"},"scripts":{},"config":{},"engines":{"node":">=0.4.8"},"dependencies":{},"devDependencies":{},"_id":"CLI-UI@0.2.0","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1981367918dcf24a3ef79b7d0c2b2a65d010d4c4","tarball":"http://registry.npmjs.org/CLI-UI/-/CLI-UI-0.2.0.tgz"}}},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"time":{"modified":"2011-06-01T19:35:23.745Z","created":"2011-06-01T14:20:14.093Z","0.1.0":"2011-06-01T14:20:14.357Z","0.2.0":"2011-06-01T19:35:23.745Z"},"author":{"name":"Rodger Combs","email":"rodger.combs@gmail.com","url":"http://combsconnections.tk/"},"repository":{"type":"git","url":"git://github.com/11rcombs/node-cli-ui.git"},"_attachments":{"CLI-UI-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-M4013ab4+alyBzD8jLDgcA==","length":1879,"stub":true},"CLI-UI-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vJhBOwreUw5pJ+ucj0wy9g==","length":1492,"stub":true}}}},
{"id":"CM1","key":"CM1","value":{"rev":"41-d07f930fd4e4f3fd1716fa57d6b79093"},"doc":{"_id":"CM1","_rev":"41-d07f930fd4e4f3fd1716fa57d6b79093","name":"CM1","description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","dist-tags":{"latest":"0.7.6"},"versions":{"0.0.1":{"name":"CM1","version":"0.0.1","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","files":["lib"],"devDependencies":{"browserify":"*","http-browserify":"*","jsdom":"*","nake":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0c8a7facb97c8ca1bd3a716322262f4b21cb1fd3","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.0.2":{"name":"CM1","version":"0.0.2","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","files":["lib"],"devDependencies":{"browserify":"*","http-browserify":"*","jsdom":"*","nake":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"31b39432200ef223cf7e297b69cc9c1129b2a611","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.0.3":{"name":"CM1","version":"0.0.3","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","http-browserify":"*","jsdom":"*","nake":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.0.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"34f132dba5f8cbd4b5d58a126dbae2bfabaf48f5","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.1.0":{"name":"CM1","version":"0.1.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","http-browserify":"*","jsdom":"*","nake":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"61607d49264c56f9e4691f59123a0c96cc698fda","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.2.0":{"name":"CM1","version":"0.2.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","coffeescript":"*","http-browserify":"*","jsdom":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.2.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"913186e0002e1be59ccc4c20a2b666eb60f3e7c1","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.2.1":{"name":"CM1","version":"0.2.1","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","coffeescript":"*","http-browserify":"*","jsdom":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.2.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"aedcfa06edd964dbab7f2097a7762a69a112fdb9","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.3.0":{"name":"CM1","version":"0.3.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","coffeescript":"*","http-browserify":"*","jsdom":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_id":"CM1@0.3.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b88ea48ee640f0d9e3383b370d5abd41db04da60","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.4.0":{"name":"CM1","version":"0.4.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","coffeescript":"*","http-browserify":"*","jsdom":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.4.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a09b12a071026583c83f5a147a95f0f18a827c47","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.4.0.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.5.0":{"name":"CM1","version":"0.5.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","jsdom":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.5.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"6f8c55b6395cab5e19a4d3e8b3bece969f6650ba","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.5.0.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.5.1":{"name":"CM1","version":"0.5.1","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","jsdom":"*","sinon":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.5.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"65c93c37d246a1e6ae7a25bcf20b76c39b2219b4","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.5.1.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.6.0":{"name":"CM1","version":"0.6.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"async":"*","browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","docco":"*","fakeweb":"*","jsdom":"*","sinon":"*","socket.io-client":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"dependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.6.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"5922a038b0fbc02fff8bb1e7c0d65b116637ab0f","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.6.0.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.6.1":{"name":"CM1","version":"0.6.1","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"async":"*","browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","docco":"*","fakeweb":"*","jsdom":"*","sinon":"*","socket.io-client":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"dependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.6.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"56b66e1e35726f7e44e3fdd51b75ad6959d139e7","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.6.1.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.6.2":{"name":"CM1","version":"0.6.2","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"async":"*","browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","docco":"*","fakeweb":"*","jsdom":"*","sinon":"*","socket.io-client":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"dependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.6.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"dfe853f377327639b622c592b2406e837b3ff718","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.6.2.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.0":{"name":"CM1","version":"0.7.0","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"async":"*","browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","docco":"*","fakeweb":"*","jsdom":"*","sinon":"*","socket.io-client":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"dependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"5ea428bd840f3f00bfe10315edced185ea0a4bf1","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.0.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.1":{"name":"CM1","version":"0.7.1","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","devDependencies":{"async":"*","browserify":"*","coffee-script":"*","dkastner-http-browserify":"*","docco":"*","fakeweb":"*","jsdom":"*","sinon":"*","socket.io-client":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"dependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3bfda81c52d014e9866e31f294398aba22e890b2","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.1.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.2":{"name":"CM1","version":"0.7.2","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","dependencies":{},"devDependencies":{"async":"*","browserify":"*","coffee-script":"*","http-browserify":"0.1.1","docco":"*","fakeweb":"*","jsdom":"*","replay":"*","sinon":"*","socket.io-client":"*","testling":"*","underscore":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"244a49a991432d8580bfb85f6442aca519952aed","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.2.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.3":{"name":"CM1","version":"0.7.3","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","dependencies":{},"devDependencies":{"async":"*","browserify":"*","coffee-script":"*","http-browserify":"0.1.1","docco":"*","fakeweb":"*","jsdom":"*","replay":"*","sinon":"*","socket.io-client":"*","testling":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"fc8adb2a88ef5bfef93aa9e891785b7eb493c8da","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.3.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.4":{"name":"CM1","version":"0.7.4","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","dependencies":{"JSON":"*","underscore":"*"},"devDependencies":{"async":"*","browserify":"*","coffee-script":"*","http-browserify":"0.1.1","docco":"*","fakeweb":"*","jsdom":"*","replay":"*","sinon":"*","socket.io-client":"*","testling":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.4","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4ede9f7b219e3ecb99548b489831c6b84b4e7f81","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.4.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.5":{"name":"CM1","version":"0.7.5","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","dependencies":{"JSON":"*","underscore":"*"},"devDependencies":{"async":"*","browserify":"*","coffee-script":"*","http-browserify":"0.1.1","docco":"*","jsdom":"*","replay":"*","sinon":"*","socket.io-client":"*","testling":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.5","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b310873c028300763741f6b377a1a1d8167995da","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.5.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]},"0.7.6":{"name":"CM1","version":"0.7.6","author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"description":"JavaScript API for Brighter Planet's CM1 carbon/impact calculation service","homepage":"http://github.com/brighterplanet/CM1.js","main":"lib/cm1.js","engine":"*","dependencies":{"JSON":"*","underscore":"*"},"devDependencies":{"async":"*","browserify":"*","coffee-script":"*","http-browserify":"git://github.com/dkastner/http-browserify.git","docco":"*","jsdom":"*","replay":"*","sinon":"*","socket.io-client":"*","testling":"*","vows":"*"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"engines":{"node":"*"},"_npmUser":{"name":"dkastner","email":"dkastner@gmail.com"},"_id":"CM1@0.7.6","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"970c9161f1eeeab1d592ad86ade4783387b6f2e3","tarball":"http://registry.npmjs.org/CM1/-/CM1-0.7.6.tgz"},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}]}},"maintainers":[{"name":"dkastner","email":"dkastner@gmail.com"}],"time":{"modified":"2012-05-02T22:10:32.879Z","created":"2011-08-25T00:16:32.234Z","0.0.1":"2011-08-25T00:16:32.816Z","0.0.2":"2011-08-25T20:08:12.883Z","0.0.3":"2011-08-25T20:38:35.787Z","0.1.0":"2011-09-02T15:48:19.802Z","0.2.0":"2011-09-02T17:40:10.608Z","0.2.1":"2011-09-08T02:17:40.300Z","0.3.0":"2011-09-12T03:03:54.724Z","0.4.0":"2011-10-25T14:13:52.945Z","0.5.0":"2011-10-31T19:00:17.626Z","0.5.1":"2011-10-31T19:29:37.599Z","0.6.0":"2011-11-09T21:07:19.982Z","0.6.1":"2011-11-10T19:53:34.493Z","0.6.2":"2011-11-10T19:57:56.430Z","0.7.0":"2012-03-05T21:05:36.511Z","0.7.1":"2012-03-08T20:24:19.932Z","0.7.2":"2012-03-27T00:03:38.153Z","0.7.3":"2012-03-27T21:30:58.104Z","0.7.4":"2012-03-27T21:33:52.245Z","0.7.5":"2012-03-29T14:05:23.438Z","0.7.6":"2012-05-02T22:10:32.879Z"},"author":{"name":"Derek Kastner","email":"dkastner@gmail.com"},"repository":{"type":"git","url":"git://github.com/brighterplanet/CM1.js.git"},"_attachments":{"CM1-0.7.6.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-0dYL+j0cpnrvqhuqcYUDUQ==","length":146281,"stub":true},"CM1-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-x7VEAmJyWxPFoMTQp82q3Q==","length":142333,"stub":true},"CM1-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-Mfx+NlJ/W5stCoR2AW5JCw==","length":138805,"stub":true},"CM1-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-tMPGWHTMntZOs7rl5O9FJA==","length":138808,"stub":true},"CM1-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-O3QSql/nRAM3tKgZCwUVWQ==","length":275207,"stub":true},"CM1-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-S9CA0QoNwSsRT4ejDVB3Gw==","length":25842,"stub":true},"CM1-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Y47madIUSWU+7VeE6SOjJA==","length":25819,"stub":true},"CM1-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-j9bwMG6oGfCz/rvCkP2LAQ==","length":61440,"stub":true},"CM1-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-fGL3KbAoX5L3p+r02S7FzQ==","length":61440,"stub":true},"CM1-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-XFL7hEfEcy6pEKu/N+D/vA==","length":51200,"stub":true},"CM1-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-8zCVy7S8k24b8UrXKHBwSw==","length":10240,"stub":true},"CM1-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-KMrwHBxaSUDxMMsjxakvQg==","length":10240,"stub":true},"CM1-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-cYp6lDfLxHXuFcsqHMpIWw==","length":10240,"stub":true},"CM1-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-mowgcea2FCrNm4C5oa1/rQ==","length":74672,"stub":true},"CM1-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-BfAtc/MW8k8IRn7xhmS3wQ==","length":74525,"stub":true},"CM1-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ubJGV4evidTuenPOcsSxcg==","length":74534,"stub":true},"CM1-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-yIZbgybFQ4dpil821P2Rig==","length":71358,"stub":true},"CM1-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2lwWS61xKL3Dm1TctvU4+w==","length":71380,"stub":true},"CM1-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2QP274sJD1eXohPhLlB2Xg==","length":76519,"stub":true},"CM1-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-E8eCA9J5Lqjmmk+NyXyaYg==","length":71161,"stub":true}}}},
{"id":"COFFEENODE","key":"COFFEENODE","value":{"rev":"5-23f3f1549894816724c0dcd6ca10e56c"},"doc":{"_id":"COFFEENODE","_rev":"5-23f3f1549894816724c0dcd6ca10e56c","name":"COFFEENODE","description":"(=FOR THE TIME BEING, AN EMPTY TEST PACKAGE=) An application basework. Visit http://github.com/loveencounterflow to see what's going on.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"COFFEENODE","version":"0.0.1","description":"An application basework. Visit http://github.com/loveencounterflow to see what's going on.","author":{"name":"loveencounterflow","email":"paragate@gmx.net"},"repository":{"type":"git","url":"git://github.com/loveencounterflow/COFFEENODE.git"},"main":"./main.coffee","engines":{"node":">= 0.4.0"},"keywords":["signals"],"_npmUser":{"name":"loveencounterflow","email":"paragate@gmx.net"},"_id":"COFFEENODE@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"ee0b45d2d23389f2fa31c3ebe805a8b725d8ef75","tarball":"http://registry.npmjs.org/COFFEENODE/-/COFFEENODE-0.0.1.tgz"},"maintainers":[{"name":"loveencounterflow","email":"paragate@gmx.net"}]},"0.0.2":{"name":"COFFEENODE","version":"0.0.2","description":"(=FOR THE TIME BEING, AN EMPTY TEST PACKAGE=) An application basework. Visit http://github.com/loveencounterflow to see what's going on.","author":{"name":"loveencounterflow","email":"paragate@gmx.net"},"repository":{"type":"git","url":"git://github.com/loveencounterflow/COFFEENODE.git"},"main":"./main.coffee","engines":{"node":">= 0.4.0"},"keywords":["signals"],"_npmUser":{"name":"loveencounterflow","email":"paragate@gmx.net"},"_id":"COFFEENODE@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"46381ed22550dd1e1879253ec8725717d0d4992c","tarball":"http://registry.npmjs.org/COFFEENODE/-/COFFEENODE-0.0.2.tgz"},"maintainers":[{"name":"loveencounterflow","email":"paragate@gmx.net"}]}},"readme":null,"maintainers":[{"name":"loveencounterflow","email":"paragate@gmx.net"}],"time":{"modified":"2012-03-07T16:31:18.672Z","created":"2012-03-07T16:28:50.756Z","0.0.1":"2012-03-07T16:28:52.905Z","0.0.2":"2012-03-07T16:31:18.672Z"},"author":{"name":"loveencounterflow","email":"paragate@gmx.net"},"repository":{"type":"git","url":"git://github.com/loveencounterflow/COFFEENODE.git"},"_attachments":{"COFFEENODE-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GFWvTKxx/qz0E6k3txbG5Q==","length":549,"stub":true},"COFFEENODE-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tKyEM2hEGexzxBYyPBtwBQ==","length":507,"stub":true}}}},
{"id":"CSSMatrix","key":"CSSMatrix","value":{"rev":"3-2cb1ab1e62611e89dab7afd8f346a6a4"},"doc":{"_id":"CSSMatrix","_rev":"3-2cb1ab1e62611e89dab7afd8f346a6a4","name":"CSSMatrix","description":"A CSSMatrix shim for 3D tranformation matrices","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Arian Stolwijk"},"name":"CSSMatrix","description":"A CSSMatrix shim for 3D tranformation matrices","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arian/CSSMatrix.git"},"main":"CSSMatrix","scripts":{"test":"node CSSMatrixTest.js"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"CSSMatrix@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d54421a152e226f01ae065a213d7d0aa22e9335d","tarball":"http://registry.npmjs.org/CSSMatrix/-/CSSMatrix-0.0.1.tgz"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]}},"readme":"CSSMatrix\n=========\n\nThis is a CSSMatrix class as defined by the [w3c CSS3 3d Transforms](http://www.w3.org/TR/css3-3d-transforms/#cssmatrix-interface) specification.\n\n### Installation\n\n\tnpm install CSSMatrix\n\n### Usage\n\nIt should be compatible with documentation defined at [w3.org](http://www.w3.org/TR/css3-3d-transforms/#cssmatrix-interface) and at [WebKitCSSMatrix](https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html#//apple_ref/css/func/matrix3d) Safari documentation.\n\n__Methods:__\n\n- translate(x, y, z)\n- scale(x, y, z)\n- rotate(rx, ry, rz)\n- rotateAxisAngle(x, y, z, angle)\n- skewX(angle)\n- skewY(angle)\n- toString()\n- transform(tuple)\n- toFullString()\n\n__Properties:__\n\n- m11 to m44. m12 is the second element in the first row.\n\n## Warning\n\nRotating matrices might yield into wrong results or results inconsistent with WebKitCSSMatrix.\n","maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"time":{"modified":"2012-03-05T23:22:22.272Z","created":"2012-03-05T23:22:20.587Z","0.0.1":"2012-03-05T23:22:22.272Z"},"author":{"name":"Arian Stolwijk"},"repository":{"type":"git","url":"git://github.com/arian/CSSMatrix.git"},"_attachments":{"CSSMatrix-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bboOAMA5cR/pqdc5Z24jyg==","length":4220,"stub":true}}}},
{"id":"CSSselect","key":"CSSselect","value":{"rev":"21-6c0e7e5e5dadfa5a968939d1cf3938ac"},"doc":{"_id":"CSSselect","_rev":"21-6c0e7e5e5dadfa5a968939d1cf3938ac","name":"CSSselect","description":"a rtl CSS selector engine","dist-tags":{"latest":"0.2.4"},"versions":{"0.0.1":{"name":"CSSselect","version":"0.0.1","description":"a CSS selector parser in JS","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"scripts":{"test":"node tests/test.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e506bb88e73ffc408f2ba6d513b696a62157a4a5","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.0.1.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.1.0":{"name":"CSSselect","version":"0.1.0","description":"a CSS selector parser in JS","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"devDependencies":{"htmlparser2":">= 2.2.8"},"scripts":{"test":"node tests/test.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.1.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"895aaced2a5e0529b7b25619d37c114aaa01e4a4","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.1.0.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.1.1":{"name":"CSSselect","version":"0.1.1","description":"a CSS selector parser in JS","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"devDependencies":{"htmlparser2":">= 2.2.8","cheerio-soupselect":"*","sink-test":"*"},"scripts":{"test":"node tests/test.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.1.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"273997900f54a4d6205aa2dbac7173529b010cde","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.1.1.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.1.2":{"name":"CSSselect","version":"0.1.2","description":"a CSS selector parser in JS","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"devDependencies":{"htmlparser2":">= 2.2.8","cheerio-soupselect":"*","sink-test":"*"},"scripts":{"test":"node tests/test.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.1.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b96d64fc2f101d221580857c8f7e84d47fe5bf5c","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.1.2.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.2.1":{"name":"CSSselect","version":"0.2.1","description":"a rtl CSS selector engine","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"dependencies":{"CSSwhat":"0.x"},"devDependencies":{"htmlparser2":">= 2.2.8","cheerio-soupselect":"*","sink-test":"*"},"scripts":{"test":"node tests/test.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a31697077183be0d7956459c49c02d1c61381aaf","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.2.1.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.2.2":{"name":"CSSselect","version":"0.2.2","description":"a rtl CSS selector engine","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"dependencies":{"CSSwhat":"0.x"},"devDependencies":{"htmlparser2":">= 2.2.8","cheerio-soupselect":"*","sink-test":"*"},"scripts":{"test":"node tests/test.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e54ee8c058b88f7433b2929e2159172d529e7bbd","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.2.2.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.2.3":{"name":"CSSselect","version":"0.2.3","description":"a rtl CSS selector engine","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"dependencies":{"CSSwhat":"0.x"},"devDependencies":{"htmlparser2":">= 2.2.8","cheerio-soupselect":"*","mocha":"*","expect.js":"*"},"scripts":{"test":"mocha -u exports -R list tests/qwery"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"100e1c73340aa456437036a7c336fe32232cfc3f","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.2.3.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}],"directories":{}},"0.2.4":{"name":"CSSselect","version":"0.2.4","description":"a rtl CSS selector engine","author":{"name":"Felix Boehm","email":"me@feedic.com"},"keywords":["css","selector"],"main":"index.js","engine":"","repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"dependencies":{"CSSwhat":"0.x"},"devDependencies":{"htmlparser2":">= 2.2.8","cheerio-soupselect":"*","mocha":"*","expect.js":"*"},"scripts":{"test":"mocha -u exports -R list tests/qwery tests/nwmatcher/scotch.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSselect@0.2.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2af09fcc2a0ae54db37aeaff1c2bb26e816a4b20","tarball":"http://registry.npmjs.org/CSSselect/-/CSSselect-0.2.4.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]}},"readme":"##What?\n\nCSSselect is CSS selector parser. It returns a function that tests elements if they match a selector - checking needs to happen \"from the top\", like browser engines execute queries.\n\n##Why?\n\nJust take the following CSS query: `foo bar baz`. When the element named `baz` has like a billion children, every one of them needs to be checked if they match a query. Three times, to be precise, if run a CSS query from the start to the end (as e.g. JSDOM does). Yup, that's slow.\n\nThis library checks every element once. The more complex the query, the greater the benefit.\n\n##How?\n\n___TODO___\n\n##TODO\n\n1. The API needs to be improved\n2. Currently, only a specific type of DOM is supported\n    * All names (e.g. `parent` for the parent node) need to be changeable\n    * The returned function assumes that only element nodes are present. Other node types need to be supported.\n3. Documentation needs to be written","maintainers":[{"name":"feedic","email":"me@feedic.com"}],"time":{"modified":"2012-06-02T19:27:47.221Z","created":"2012-02-17T10:51:08.294Z","0.0.1":"2012-02-17T10:51:10.049Z","0.1.0":"2012-05-12T18:21:04.685Z","0.1.1":"2012-05-26T12:23:47.505Z","0.1.2":"2012-05-26T14:59:33.129Z","0.2.1":"2012-05-27T08:58:32.831Z","0.2.2":"2012-05-27T09:00:19.477Z","0.2.3":"2012-05-29T07:54:24.729Z","0.2.4":"2012-06-02T19:27:47.221Z"},"author":{"name":"Felix Boehm","email":"me@feedic.com"},"repository":{"type":"git","url":"git://github.com/fb55/cssselect.git"},"_attachments":{"CSSselect-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-nqLdpTD28rsaLbVrwtZd4w==","length":49156,"stub":true},"CSSselect-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Yea0Z1MqRN2IdddrlFfU/w==","length":41467,"stub":true},"CSSselect-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-KVfGI5Lx+s8mPWaAHsxtig==","length":42059,"stub":true},"CSSselect-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-u13pUWw2wrHva0R9LRnwlA==","length":42065,"stub":true},"CSSselect-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6TJL8RdHT75Nuv83VQaqgw==","length":42383,"stub":true},"CSSselect-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-D/+1I+iKlAOffeL7MK6veg==","length":42606,"stub":true},"CSSselect-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1RgL04YHBoKSbN39M+9Zuw==","length":5037,"stub":true},"CSSselect-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZRQOELzYXYGNbLU0Y9OxCQ==","length":3074,"stub":true}}}},
{"id":"CSSwhat","key":"CSSwhat","value":{"rev":"5-c4d0573fbcbe9ba50be22fe996472cc2"},"doc":{"_id":"CSSwhat","_rev":"5-c4d0573fbcbe9ba50be22fe996472cc2","name":"CSSwhat","description":"a CSS selector parser","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"author":{"name":"Felix Böhm","email":"me@feedic.com","url":"http://feedic.com"},"name":"CSSwhat","description":"a CSS selector parser","version":"0.0.0","repository":{"url":"https://github.com/FB55/CSSwhat"},"main":"/index.js","scripts":{"test":"node tests/test.js"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSwhat@0.0.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"04a340bff07f418af3a6b0fd2dd9398b68c238f3","tarball":"http://registry.npmjs.org/CSSwhat/-/CSSwhat-0.0.0.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]},"0.1.0":{"author":{"name":"Felix Böhm","email":"me@feedic.com","url":"http://feedic.com"},"name":"CSSwhat","description":"a CSS selector parser","version":"0.1.0","repository":{"url":"https://github.com/FB55/CSSwhat"},"main":"/index.js","scripts":{"test":"node tests/test.js"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"CSSwhat@0.1.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"1b6f85333181a425db09aa15e0564839ac2a0547","tarball":"http://registry.npmjs.org/CSSwhat/-/CSSwhat-0.1.0.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]}},"readme":"#CSSwhat\n\na CSS selector parser\n\n__// TODO__","maintainers":[{"name":"feedic","email":"me@feedic.com"}],"time":{"modified":"2012-06-05T18:02:06.590Z","created":"2012-05-27T08:24:28.692Z","0.0.0":"2012-05-27T08:24:30.617Z","0.1.0":"2012-06-05T18:02:06.590Z"},"author":{"name":"Felix Böhm","email":"me@feedic.com","url":"http://feedic.com"},"repository":{"url":"https://github.com/FB55/CSSwhat"},"_attachments":{"CSSwhat-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2tXx3D2l+zkw8l0ZUPNx8A==","length":2378,"stub":true},"CSSwhat-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OTgBRRxuq51gvDuZBcO0Ow==","length":1743,"stub":true}}}},
{"id":"CallbackRouter","key":"CallbackRouter","value":{"rev":"3-c3cd814ca0286f223858d7f0a6d5d464"},"doc":{"_id":"CallbackRouter","_rev":"3-c3cd814ca0286f223858d7f0a6d5d464","name":"CallbackRouter","description":"callback router","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"CallbackRouter","description":"callback router","version":"0.0.1","homepage":"http://github.com/wearefractal/CallbackRouter","repository":{"type":"git","url":"git://github.com/wearefractal/CallbackRouter.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./domain/CallbackRouter.agent.coffee","engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"*","rzr-util":"*"},"devDependencies":{"should":"*"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/CallbackRouter/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"CallbackRouter@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"37fa4868bdb42f2c0be6d655927b9c3f189dd879","tarball":"http://registry.npmjs.org/CallbackRouter/-/CallbackRouter-0.0.1.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]}},"readme":"**CallbackRouter** routes callbacks\n","maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"time":{"modified":"2011-12-13T02:26:34.385Z","created":"2011-12-13T02:26:29.920Z","0.0.1":"2011-12-13T02:26:34.385Z"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"repository":{"type":"git","url":"git://github.com/wearefractal/CallbackRouter.git"},"_attachments":{"CallbackRouter-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-j5+Gcgb0e2kZJ3xRZ6cr5Q==","length":1542,"stub":true}}}},
{"id":"Cap","key":"Cap","value":{"rev":"5-af4b170b15719b2da6e87384b47ca396"},"doc":{"_id":"Cap","_rev":"5-af4b170b15719b2da6e87384b47ca396","name":"Cap","description":"A language that compiles to JavaScript","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Cap","description":"A language that compiles to JavaScript","author":{"name":"Ben Gourley","email":"bn@grly.me","url":"http://bengourley.co.uk"},"version":"0.0.1","dependencies":{"commander":"0.6.0","uglify-js":"1.2.6","js-beautify-node":"1.0.0","async":"0.1.18"},"devDependencies":{"mocha":">0"},"bin":{"capc":"./bin/capc"},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/bengourley/Cap.git"},"main":"lib/env/node.js","scripts":{"test":"make test"},"_npmUser":{"name":"bengourley","email":"benleighgourley@gmail.com"},"_id":"Cap@0.0.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"b962888d411607330710c5e0cd837619db388ef2","tarball":"http://registry.npmjs.org/Cap/-/Cap-0.0.1.tgz"},"maintainers":[{"name":"bengourley","email":"benleighgourley@gmail.com"}]},"0.0.2":{"name":"Cap","description":"A language that compiles to JavaScript","author":{"name":"Ben Gourley","email":"bn@grly.me","url":"http://bengourley.co.uk"},"version":"0.0.2","dependencies":{"commander":"0.6.0","uglify-js":"1.2.6","js-beautify-node":"1.0.0","async":"0.1.18"},"devDependencies":{"mocha":">0"},"bin":{"capc":"./bin/capc"},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/bengourley/Cap.git"},"main":"lib/env/node.js","scripts":{"test":"make test"},"readme":"# Cap\n\nCap was my final year project for my BSc. It's a language that compiles to JavaScript, for use in the browser and node. It takes inspiration from JavaScript, CoffeeScript, Jade, Stylus, Python and ML. **The reason I'm open sourcing it is just for show. I wouldn't recommend using it in production, in fact, I'd definitely recommend not using it.** Feel free to try it out though, and I'm happy to help out if you get stuck with that.\n\n## Intro\n\nCap is a language built on top of Javascript. It aims to unify the underlying concepts of\nfunctional programming with an elegant and succint syntax.\n\n# Quickstart\n\nThe Cap compiler is implemented in [node](http://nodejs.org), get that first (pre-compiled binaries available for Win/Mac, Linux you have to build yourself). Node comes with the package manager `npm` which you can use to install the Cap compiler.\n\nThen:\n\n\tnpm install cap -g\n\nProvided you used the global flag `-g` and the path `/usr/local/bin` is in your path, `capc` should now be available. Verify by running `capc -h` which should print something similar to the following:\n\n\n    Usage: capc [options]\n\n    Options:\n\n      -h, --help             output usage information\n      -V, --version          output the version number\n      -t, --printtree        print the syntax tree instead of compiling (forces --print)\n      -p, --print            print the output instead of writing to file\n      -c, --compress         compress the output\n      -e, --targetenv <env>  specify the compilation target (defaults to node)\n      -f, --files <a,b..>    compile only the given files (comma separated list)\n\n    Examples:\n\n        $ capc\n\n      Recursively scans the current directory and\n      and compiles all the `.cap` files it finds\n\n        $ capc -e browser main\n\n      Recursively scans the current directory and\n      and compiles all the `.cap` files, bundling\n      them into a single file `main.browser.cap.js` with some\n      boilerplate code that will make it run in the\n      browser. Uses the given file as the program entry point\n\n        $ capc -e node -f example.cap\n\n      Compiles example.cap → example.cap.js for running in node\n\n### Syntax\n\n```\n\n# Assignment\ngreeting = 'Hello, World!'\n\n# Function calls\nconsole.log greeting\n\n# Literals\nmyObject = {}\n  keyOne = 1\n  keyTwo = 2\n  keyThree = 3\n\nmyArray = []\n  'one'\n  'two'\n  'three'\n\nmyFunction = |x|\n  # The last expression\n  # is implicitely returned\n  # from a function\n  x + x\n\n```\n\nI admit this is brief, so feel free to check out the full\nsyntax guide in report at http://bengourley.github.com/Cap/report.pdf.\n\n### Editor Syntax\n\nThere is a syntax mode for Textmate and SublimeText 2. It is located in `editor/Cap.tmLanguage`.","_id":"Cap@0.0.2","dist":{"shasum":"03a47d8d0dab4c53fee3be28895094e28701620e","tarball":"http://registry.npmjs.org/Cap/-/Cap-0.0.2.tgz"},"maintainers":[{"name":"bengourley","email":"benleighgourley@gmail.com"}]}},"readme":"# Cap\n\nA language that compiles to JavaScript, for use in the browser and node.\n\n## Intro\n\nCap is a language built on top of Javascript. It aims to unify the underlying concepts of\nfunctional programming with an elegant and succint syntax.\n\n# Quickstart\n\nThe Cap compiler is implemented in [node](http://nodejs.org), get that first (pre-compiled binaries available for Win/Mac, Linux you have to build yourself). Node comes with the package manager `npm` which you can use to install the Cap compiler.\n\nThen:\n\n\tnpm install cap -g\n\nProvided you used the global flag `-g` and the path `/usr/local/bin` is in your path, `capc` should now be available. Verify by running `capc -h` which should print something similar to the following:\n\n    Usage: capc [options] [source-file]\n\n    Options:\n\n      -h, --help       output usage information\n      -V, --version    output the version number\n      -p, --printtree  print the syntax tree instead of compiling\n\n### Editor Syntax\n\nThere is a syntax mode for Textmate and SublimeText 2. It is located in `editor/Cap.tmLanguage`.","maintainers":[{"name":"bengourley","email":"benleighgourley@gmail.com"}],"time":{"modified":"2012-08-10T17:28:47.870Z","created":"2012-04-14T16:27:18.229Z","0.0.1":"2012-04-14T16:27:19.844Z","0.0.2":"2012-08-10T17:28:47.870Z"},"author":{"name":"Ben Gourley","email":"bn@grly.me","url":"http://bengourley.co.uk"},"repository":{"type":"git","url":"git://github.com/bengourley/Cap.git"},"_attachments":{"Cap-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zkPq6fm7YiluH0Xy9UUvag==","length":66794,"stub":true},"Cap-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-d9e0tU1Fce0ijmHck44yJg==","length":65131,"stub":true}}}},
{"id":"Cashew","key":"Cashew","value":{"rev":"7-6a74dc51dbecc47d2c15bfb7d056a20f"},"doc":{"_id":"Cashew","_rev":"7-6a74dc51dbecc47d2c15bfb7d056a20f","name":"Cashew","description":"ID generator","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"Cashew","description":"ID generator","version":"0.0.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/cashew.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","structr":"*","malt":"*","jsdom":"*"},"main":"./lib/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/Cashew/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Cashew@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8ae6ba704379e4c1765c3cf00dd7b715344356ba","tarball":"http://registry.npmjs.org/Cashew/-/Cashew-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.2":{"name":"Cashew","description":"ID generator","version":"0.0.2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/cashew.git"},"dependencies":{"structr":"*"},"main":"./lib/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/Cashew/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Cashew@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c176b5d0cc5fb915a1c8a4736cd6b4cc72d5a77e","tarball":"http://registry.npmjs.org/Cashew/-/Cashew-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.3":{"name":"Cashew","description":"ID generator","version":"0.0.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/cashew.git"},"dependencies":{"structr":"*"},"main":"./lib/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/Cashew/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Cashew@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"832f74b50b72fbd064ed97f4da564c57e8434e59","tarball":"http://registry.npmjs.org/Cashew/-/Cashew-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2011-09-08T19:41:04.979Z","created":"2011-09-05T20:51:30.466Z","0.0.1":"2011-09-05T20:51:31.549Z","0.0.2":"2011-09-08T19:34:19.691Z","0.0.3":"2011-09-08T19:41:04.979Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/cashew.git"},"_attachments":{"Cashew-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-58Esz3kUK84C7M1QqHb4bw==","length":6592,"stub":true},"Cashew-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ULl2ps1sHg2AMZ55z4jFew==","length":6491,"stub":true},"Cashew-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6IrnyR+sZwF3Q0JSSqGPaQ==","length":6306,"stub":true}}}},
{"id":"Cat4D","key":"Cat4D","value":{"rev":"5-84d670566f32b102a4fb9cc33eb7708e"},"doc":{"_id":"Cat4D","_rev":"5-84d670566f32b102a4fb9cc33eb7708e","name":"Cat4D","description":"Cat4D Framework Implementation","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Cat4D","description":"Cat4D Framework Implementation","repository":{"type":"git","url":"git://github.com/Cat4D/Cat4D.git"},"main":"./lib/Cat4D.js","keywords":["Cat4D","dumb","cat"],"author":{"name":"Dumb Cat","email":"Cat@Dumb.Cat","url":"http://www.dumb.cat"},"version":"0.0.1","engines":{"node":">=0.6.1"},"dependencies":{},"noAnalyze":true,"subdomain":"Cat4D","scripts":{"start":"Cat4D"},"devDependencies":{},"optionalDependencies":{},"homepage":"http://www.dumb.cat","_npmUser":{"name":"Cat4D","email":"Cat@Dumb.Cat"},"_id":"Cat4D@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"09ddeed685398be048ada1d109bac039876c941e","tarball":"http://registry.npmjs.org/Cat4D/-/Cat4D-0.0.1.tgz"},"readme":"","maintainers":[{"name":"Cat4D","email":"Cat@Dumb.Cat"}]},"0.0.2":{"name":"Cat4D","description":"Cat4D Framework Implementation","repository":{"type":"git","url":"git://github.com/Cat4D/Cat4D.git"},"main":"./lib/Cat4D.js","keywords":["Cat4D","dumb","cat"],"author":{"name":"Dumb Cat","email":"Cat@Dumb.Cat","url":"http://www.dumb.cat"},"version":"0.0.2","engines":{"node":">=0.6.1"},"dependencies":{},"noAnalyze":true,"subdomain":"Cat4D","scripts":{"start":"Cat4D"},"devDependencies":{},"optionalDependencies":{},"homepage":"http://www.dumb.cat","_npmUser":{"name":"Cat4D","email":"Cat@Dumb.Cat"},"_id":"Cat4D@0.0.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"97e0b2e046a88960e169858874e6336af4592c3e","tarball":"http://registry.npmjs.org/Cat4D/-/Cat4D-0.0.2.tgz"},"readme":"","maintainers":[{"name":"Cat4D","email":"Cat@Dumb.Cat"}]}},"readme":"","maintainers":[{"name":"Cat4D","email":"Cat@Dumb.Cat"}],"time":{"modified":"2012-04-12T06:39:23.334Z","created":"2012-04-12T06:27:43.515Z","0.0.1":"2012-04-12T06:27:49.564Z","0.0.2":"2012-04-12T06:39:23.334Z"},"author":{"name":"Dumb Cat","email":"Cat@Dumb.Cat","url":"http://www.dumb.cat"},"repository":{"type":"git","url":"git://github.com/Cat4D/Cat4D.git"},"_attachments":{"Cat4D-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-oBmB+8l/H9OOds7ITlee0A==","length":464,"stub":true},"Cat4D-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vZwvw5x1aNzxWEuBcd22Nw==","length":640,"stub":true}}}},
{"id":"Chains","key":"Chains","value":{"rev":"13-0effbe35973f95b5d089e4529024402c"},"doc":{"_id":"Chains","_rev":"13-0effbe35973f95b5d089e4529024402c","name":"Chains","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.1":{"name":"Chains","version":"0.1.1","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","main":"chains.js","dependencies":{"theBasics":"0.1.5"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Chains@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"db4d9279791497129a93c318f66d34365dbaadde","tarball":"http://registry.npmjs.org/Chains/-/Chains-0.1.1.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.2":{"name":"Chains","version":"0.1.2","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","main":"chains.js","dependencies":{"theBasics":"0.1.5"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"de244215eb4d6c1cfb32864292d24040b4fc4432","tarball":"http://registry.npmjs.org/Chains/-/Chains-0.1.2.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Chains@0.1.2","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.3":{"name":"Chains","version":"0.1.3","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","main":"chains.js","dependencies":{"theBasics":"0.1.5"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"ec22cb7205741a0ab14ccf5de7cf6938ab2a263d","tarball":"http://registry.npmjs.org/Chains/-/Chains-0.1.3.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Chains@0.1.3","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.4":{"name":"Chains","version":"0.1.4","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","main":"chains.js","dependencies":{"theBasics":"0.1.7"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"792a745f8a440b595d0415e2958c71e0595a87bc","tarball":"http://registry.npmjs.org/Chains/-/Chains-0.1.4.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Chains@0.1.4","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.5":{"name":"Chains","version":"0.1.5","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","main":"chains.js","dependencies":{"theBasics":"0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"6152bf20173da29b887ff7487cf92419bef50b32","tarball":"http://registry.npmjs.org/Chains/-/Chains-0.1.5.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Chains@0.1.5","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.6":{"name":"Chains","version":"0.1.6","description":"Create a chain of several asynchronous methods where the next method is used as the callback of the previous method.","main":"chains.js","dependencies":{"theBasics":"0.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"27594c0dfb08b11225d2b151ab7afeae3428b500","tarball":"http://registry.npmjs.org/Chains/-/Chains-0.1.6.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Chains@0.1.6","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]}},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}],"time":{"modified":"2012-04-06T18:22:21.876Z","created":"2011-11-11T03:33:37.382Z","0.1.1":"2011-11-11T03:33:38.630Z","0.1.2":"2012-04-06T16:55:38.701Z","0.1.3":"2012-04-06T16:57:34.370Z","0.1.4":"2012-04-06T17:18:40.358Z","0.1.5":"2012-04-06T18:07:21.937Z","0.1.6":"2012-04-06T18:22:21.876Z"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_attachments":{"Chains-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-5j86IUo4F53Fu6WClJq8kw==","length":1737,"stub":true},"Chains-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0ciwEJy1SkYrkOlQDCz2Rg==","length":1735,"stub":true},"Chains-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-4XDCeFbed3YGmJw+3oG/fg==","length":1732,"stub":true},"Chains-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-bL1KOYA05GPBEPI6ZFj9rg==","length":1731,"stub":true},"Chains-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-s/yZQt1GP5hKiCNL/5bmGg==","length":1732,"stub":true},"Chains-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sQPYbZ017zZL91qmM3g3Lw==","length":1691,"stub":true}}}},
{"id":"ChartTime","key":"ChartTime","value":{"rev":"3-99f93169e2d1c99bd5629cd679e63880"},"doc":{"_id":"ChartTime","_rev":"3-99f93169e2d1c99bd5629cd679e63880","name":"ChartTime","description":"Hierarchical time-series axis for charts with knockouts for holidays, weekends, and lots of other conveniences.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"ChartTime","description":"Hierarchical time-series axis for charts with knockouts for holidays, weekends, and lots of other conveniences.","keywords":["charting","chart","infographics","date","time"],"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"version":"0.1.0","homepage":"https://github.com/lmaccherone/ChartTime","engines":{"node":">=0.4.10"},"dependencies":{"coffee-script":">=1.1.1"},"repository":{"type":"git","url":"git://github.com/lmaccherone/ChartTime.git"},"preferGlobal":true,"devDependencies":{"coffeedoctest":">=0.1.0"},"_npmUser":{"name":"lmaccherone","email":"Larry@Maccherone.com"},"_id":"ChartTime@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"7361a6d3e76d8a2151f5485e67932d3ffcfba228","tarball":"http://registry.npmjs.org/ChartTime/-/ChartTime-0.1.0.tgz"},"maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}]}},"readme":"# ChartTime #\n\nCopyright (c) 2012, Lawrence S. Maccherone, Jr.\n\n_Time axis creation/manipulation for charts_\n\n## Credits ##\n\nAuthors:\n\n* [Larry Maccherone](http://maccherone.com) (Larry @at@ Maccherone .dot. com)\n* Jennifer Maccherone\n\nRunning:\n\n* [timezoneJS](https://github.com/mde/timezone-js) - library for [tz](http://www.twinsun.com/tz/tz-link.htm) parsing\n* [Node.js](http://nodejs.org/)\n* [CoffeeScript](http://coffeescript.org/)\n\nDeveloping/Documenting:\n\n* [coffeedoc](https://github.com/lmaccherone/coffeedoc) (Larry Maccherone's fork) forked from [coffeedoc](https://github.com/omarkhan/coffeedoc)\n* [coffeedoctest](https://github.com/lmaccherone/coffeedoctest) (by Larry Maccherone)\n* [nodeunit](https://github.com/caolan/nodeunit)\n\n## Documentation and source code ##\n\n* [API Documentation](http://lmaccherone.github.com/ChartTime/docs/ChartTime.html)\n* [github.com/lmaccherone/ChartTime](https://github.com/lmaccherone/ChartTime)\n\n## Features ##\n\n* Generate the values for time series chart axis\n* Allows for custom granularities like release/iteration/iteration_day\n* Knockout weekends and holidays\n* Knockout non-work hours\n* Drill up and down granularity (coneceptually supported by ChartTime, consumed by Lumenize)\n* Work with precision around timezone differences\n* Month is 1-indexed instead of 0-indexed like Javascript's Date object\n* Date/Time math (add 3 months, subtract 2 weeks, etc.)\n* Tested\n* Documented\n\n## Granularity ##\n\nEach ChartTime object has a granularity. This means that you never have to\nworry about any bits lower than your specified granularity. A day has only\nyear, month, and day segments. You are never tempted to specify 11:59pm\nto specify the end of a day-long timebox.\n\nChartTime supports the following granularities:\n\n* `year`\n    * `month`\n        * `day`\n            * `hour`\n               * `minute`\n                   * `second`\n                       * `millisecond`\n    * `quarter` (but not quarter_month, day, etc.)\n    * `week` (ISO-8601 style week numbering)\n       * `week_day` (Monday = 1, Sunday = 7)\n\nAlso, you can define your own custom hierarchical granularities, for example...\n\n* `release`\n   * `iteration`\n      * `iteration_day`\n  \n## Timezone precision ##\n\nIt's very hard to do filtering and grouping of time-series data with timezone precision. \n\nFor instance, 11pm in California on December 25 (Christmas holiday) is 2am December 26 (not a holiday)\nin New York. This also happens to be 7am December 26 GMT. If you have an event that occurs at \n2011-12-26T07:00:00.000Z, then you need to decide what timezone to use as your context before you \ndecide if that event occured on Christmas day or not. It's not just holidays, where this can burn you.\nDeciding if a piece of work finished in one iteration versus another can make a difference for\nyou iteration metrics. The iteration metrics for a distributed team should look the same regardless\nof whether it was generated in New York versus Los Angeles... versus Bangalore.\n\nThe javascript Date object lets you work in either the local time or Zulu (GMT/UTC) time but it doesn't let you\ncontrol the timezone. Do you know the correct way to apply the timezone shift to a JavaScript Date Object? \nDo you know when Daylight Savings Time kicks in and New York is 4 hours shifted from GMT instead of 5? Will\nyou remember to do it perfectly every time it's needed in your code?\n\nIf you need this precision, ChartTime helps by clearly delineating the moment when you need to do \ntimezone manipulation... the moment you need to compare two or more dates. You can do all of your\nholiday/weekend knockout manipulation without regard to timezone and only consider the timezone\nupon comparison. \n\n## Month is 1-indexed as you would expect ##\n\nJavascript's date object uses 0 for January and 11 for December. ChartTime uses 1 for January and 12 for December...\nwhich is what ISO-8601 uses and what humans expect. Everyone who works with the javascript Date Object at one\npoint or another gets burned by this.\n\n## Week support ##\n\nChartTime follows ISO-8601 where ever it makes sense. Implications of using this ISO format (paraphrased info from wikipedia):\n\n* All weeks have 7 days (i.e. there are no fractional weeks).\n* Any given day falls into a single week which means that incrementing across the year boundary in week\n  granularity is without gaps or repeats.\n* Weeks are contained within a single year. (i.e. weeks are never spit over two years).\n* The above two implications also mean that we have to warp the boundaries of the year to accomplish this. In week\n  granularity dates may appear in a different year than you would expect and some years have 53 weeks.\n* The date directly tells the weekday.\n* All years start with a Monday and end with a Sunday.\n* Dates represented as yyyyWww-d can be sorted as strings.\n\n**In general, it just greatly simplifies the use of week granularity in a chart situation.**\n\nThe only real downside to this approach is that USA folks expect the week to start on Sunday. However, the ISO-8601 spec starts\neach week on Monday. Following ISO-8601, ChartTime uses 1 for Monday and 7 for Sunday which aligns with\nthe US standard for every day except Sunday. The US standard is to use 0 for Sunday.\n\n## Basic usage ##\n\n    {ChartTime, ChartTimeIterator, ChartTimeRange} = require('charttime')\n    \n    d1 = new ChartTime({granularity: 'day', year: 2011, month: 2, day: 28})\n    console.log(d1.toString())\n    # 2011-02-28\n    \nYou can use the string short-hand rather than spell out the segments seperately. The granularity\nis automatically inferred from how many segments you provide.\n\n    d2 = new ChartTime('2011-03-01')\n    console.log(d2.toString())\n    # 2011-03-01\n    \nIncrement/decrement and compare ChartTimes without regard to timezone\n\n    console.log(d1.$gte(d2)) \n    d1.increment()\n    console.log(d1.$eq(d2))\n    # false\n    # true\n\nDo math on them.\n    \n    d3 = d1.add(5)\n    console.log(d3.toString())\n    # 2011-03-06\n\nGet the day of the week.\n\n    console.log(d3.dowString())\n    # Sunday\n    \nSubtraction is just addition with negative numbers.\n\n    d3.addInPlace(-6)\n    console.log(d3.toString())\n    # 2011-02-28\n\nIf you start on the last day of a month, adding a month takes you to the last day of the next month, \neven if the number of days are different.\n    \n    d3.addInPlace(1, 'month')  \n    console.log(d3.toString())\n    # 2011-03-31\n    \nDeals well with year-granularity math and leap year complexity.\n\n    d4 = new ChartTime('2004-02-29')  # leap day\n    d4.addInPlace(1, 'year')  # adding a year takes us to a non-leap year\n    console.log(d4.toString())\n    # 2005-02-28\n    \nWeek granularity correctly wraps and deals with 53-week years.\n\n    w1 = new ChartTime('2004W53-6')\n    console.log(w1.inGranularity('day').toString())\n    # 2005-01-01\n    \nConvert between any of the standard granularities. Also converts custom granularities (not shown) to\nstandard granularities if you provide a `rataDieNumber()` function with your custom granularities.\n\n    d5 = new ChartTime('2005-01-01')  # goes the other direction also\n    console.log(d5.inGranularity('week_day').toString())\n    # 2004W53-6\n    \n    q1 = new ChartTime('2011Q3')\n    console.log(q1.inGranularity('millisecond').toString())\n    # 2011-07-01T00:00:00.000\n    \n## Timezones ##\n\nChartTime does timezone sensitive conversions. You must set the path to the tz files before doing any timezone sensitive comparisons.\n\n    ChartTime.setTZPath('../vendor/tz')\n    \n    console.log(new ChartTime('2011-01-01').getJSDate('America/New_York'))\n    # Sat, 01 Jan 2011 05:00:00 GMT\n    \n## Iterating over ranges skipping weekends (non-workdays), holidays and non-workhours ##\n\n    r = new ChartTimeRange({\n      start: new ChartTime('2011-01-02'),\n      pastEnd: new ChartTime('2011-01-07'),\n      workDays: 'Monday, Tuesday, Thursday, Friday',  # very strange work week\n      holidays: [\n        {month: 1, day: 1},  # Notice the lack of a year specification\n        {year: 2011, month: 1, day: 3}  # Got January 3 off also in 2011\n      ]\n    })\n    \nNow let's get an iterator over this range.\n    \n    i = r.getIterator('ChartTime')\n    \n    while i.hasNext()\n      console.log(i.next().toString()) \n           \n    # 2011-01-04\n    # 2011-01-06\n\n# ChartTime utils #\nCopyright (c) Lawrence S. Maccherone, Jr., 2012\n","maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}],"time":{"modified":"2012-01-29T19:23:54.488Z","created":"2012-01-29T19:23:33.923Z","0.1.0":"2012-01-29T19:23:54.488Z"},"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"repository":{"type":"git","url":"git://github.com/lmaccherone/ChartTime.git"},"_attachments":{"ChartTime-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-smYUHHVySOmoVK6g58mhyw==","length":332943,"stub":true}}}},
{"id":"ChuckNorrisException","key":"ChuckNorrisException","value":{"rev":"9-2b1282ac2b0b59e9bce96e1aa4c80671"},"doc":{"_id":"ChuckNorrisException","_rev":"9-2b1282ac2b0b59e9bce96e1aa4c80671","name":"ChuckNorrisException","description":"When in doubt, throw a ChuckNorrisException","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Cristiano Oliveira","email":"ocean.cris@gmail.com"},"name":"ChuckNorrisException","description":"When in doubt, throw a ChuckNorrisException","version":"0.1.0","repository":{"url":"https://github.com/criso/chucknorrisexception"},"engines":{"node":"~0.4.11"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"criso","email":"ocean.cris@gmail.com"},"_id":"ChuckNorrisException@0.1.0","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"871eadac2ae9625983907c9cf91e3e892aa6400f","tarball":"http://registry.npmjs.org/ChuckNorrisException/-/ChuckNorrisException-0.1.0.tgz"},"maintainers":[{"name":"criso","email":"ocean.cris@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Cristiano Oliveira","email":"ocean.cris@gmail.com"},"name":"ChuckNorrisException","description":"When in doubt, throw a ChuckNorrisException","version":"0.1.1","repository":{"url":"https://github.com/criso/chucknorrisexception"},"engines":{"node":"~0.4.11"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"criso","email":"ocean.cris@gmail.com"},"_id":"ChuckNorrisException@0.1.1","_engineSupported":false,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9047f60d9c0c682a95aad24295b4e738c05a0408","tarball":"http://registry.npmjs.org/ChuckNorrisException/-/ChuckNorrisException-0.1.1.tgz"},"maintainers":[{"name":"criso","email":"ocean.cris@gmail.com"}]}},"maintainers":[{"name":"criso","email":"ocean.cris@gmail.com"}],"time":{"modified":"2011-10-18T17:30:55.526Z","created":"2011-10-09T17:03:57.833Z","0.1.0":"2011-10-09T17:03:58.492Z","0.1.1":"2011-10-18T16:14:41.813Z"},"author":{"name":"Cristiano Oliveira","email":"ocean.cris@gmail.com"},"repository":{"url":"https://github.com/criso/chucknorrisexception"},"_attachments":{"ChuckNorrisException-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-430gxJByJyEhge7X2hn52Q==","length":1974,"stub":true},"ChuckNorrisException-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4Xo83BB2dQLw3zA7YvNyVA==","length":1892,"stub":true}}}},
{"id":"Class","key":"Class","value":{"rev":"9-8f8864c710eb3bbfd9222a0bc0c5a6ed"},"doc":{"_id":"Class","_rev":"9-8f8864c710eb3bbfd9222a0bc0c5a6ed","name":"Class","description":"Port of Prototype.js inheritance implementation for Node.js.","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"Class","author":{"name":"Firejune","url":"http://firejune.com/"},"version":"0.1.0","description":"Port of Prototype.js inheritance implementation for Node.js.","homepage":"http://github.com/firejune/class","keywords":["prototypejs","inheritance","implementation","class"],"main":"lib/class","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/firejune/class.git"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"bugs":{"url":"http://github.com/firejune/class/issues"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/var/www/.npm/Class/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Class@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3edeb3418f9d41e664f7f6c27154865bb9d15583","tarball":"http://registry.npmjs.org/Class/-/Class-0.1.0.tgz"},"maintainers":[{"name":"firejune","email":"to@firejune.com"}]},"0.1.1":{"name":"Class","author":{"name":"Firejune","url":"http://firejune.com/"},"version":"0.1.1","description":"Port of Prototype.js inheritance implementation for Node.js.","homepage":"http://github.com/firejune/class","keywords":["prototype","prototypejs","inheritance","implementation","class"],"main":"lib/class","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/firejune/class.git"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"bugs":{"url":"http://github.com/firejune/class/issues"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/var/www/.npm/Class/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Class@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ca483ec57c1ea255205ee9ba12ad17df0892e0d2","tarball":"http://registry.npmjs.org/Class/-/Class-0.1.1.tgz"},"maintainers":[{"name":"firejune","email":"to@firejune.com"}]},"0.1.2":{"name":"Class","author":{"name":"Firejune","url":"http://firejune.com/"},"version":"0.1.2","description":"Port of Prototype.js inheritance implementation for Node.js.","homepage":"http://github.com/firejune/class","keywords":["prototype","prototypejs","inheritance","implementation","class"],"main":"lib/class","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/firejune/class.git"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"firejune","email":"to@firejune.com"},"_id":"Class@0.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c6596a49cce844f8da02d2a26b665168145f92bb","tarball":"http://registry.npmjs.org/Class/-/Class-0.1.2.tgz"},"maintainers":[{"name":"firejune","email":"to@firejune.com"}]},"0.1.3":{"name":"Class","author":{"name":"Firejune","url":"http://firejune.com/"},"version":"0.1.3","description":"Port of Prototype.js inheritance implementation for Node.js.","homepage":"http://github.com/firejune/class","keywords":["prototype","prototypejs","inheritance","implementation","class"],"main":"lib/class","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/firejune/class.git"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"bugs":{"url":"http://github.com/firejune/class/issues"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"firejune","email":"to@firejune.com"},"_id":"Class@0.1.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b5b04e554497d029112ebb235cd1b31c8a3e97c0","tarball":"http://registry.npmjs.org/Class/-/Class-0.1.3.tgz"},"maintainers":[{"name":"firejune","email":"to@firejune.com"}]}},"maintainers":[{"name":"firejune","email":"to@firejune.com"}],"time":{"modified":"2011-10-19T03:18:38.135Z","created":"2011-09-10T02:46:49.442Z","0.1.0":"2011-09-10T02:46:53.813Z","0.1.1":"2011-09-10T12:21:31.597Z","0.1.2":"2011-10-19T03:09:49.145Z","0.1.3":"2011-10-19T03:18:38.135Z"},"author":{"name":"Firejune","url":"http://firejune.com/"},"repository":{"type":"git","url":"git://github.com/firejune/class.git"},"_attachments":{"Class-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1Ol1+7HkTk44rXLB3WBkdg==","length":2614,"stub":true},"Class-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-s3Q8zJnELwPgor3dMj2FJA==","length":2594,"stub":true},"Class-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-u2aesY7qnPz8apfyxXZN2w==","length":2613,"stub":true},"Class-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0j2vYH3kh6LKJTCNvwz0/g==","length":2612,"stub":true}}}},
{"id":"Classy","key":"Classy","value":{"rev":"3-94272490d9c6da141251b0f58351c920"},"doc":{"_id":"Classy","_rev":"3-94272490d9c6da141251b0f58351c920","name":"Classy","description":"Brings the MooTools 1.x Class sugar to Prime","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Arian Stolwijk","url":"http://github.com/arian"},"name":"Classy","description":"Brings the MooTools 1.x Class sugar to Prime","version":"0.0.1","main":"index","repository":{"type":"git","url":"git://github.com/arian/classy.git"},"license":"MIT","dependencies":{},"devDependencies":{"expect.js":"0.1","mocha":"1.0"},"optionalDependencies":{},"scripts":{"test":"./node_modules/mocha/bin/mocha tests.js"},"engines":{"node":"*"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Classy@0.0.1","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"a5985f28265d18245e76930a2ec2e9da86ebb6fa","tarball":"http://registry.npmjs.org/Classy/-/Classy-0.0.1.tgz"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]}},"readme":"Prime with Class\n================\n\nMake Prime Classy.\n\nIf you're used to MooTools 1.x Class, and think [prime](https://github.com/mootools/prime)\nis too basic? Classy will give you your familiar features:\n\n- Mixins (Implements)\n- .parent (Will wrap methods)\n- Will clone/reset objects and arrays in the prototype to prevent shared objects\n- Alias `Implements`, `Extends` and `initialize`\n- Tries to be compatible with the MooTools 1.x Class API.\n\nWrapping functions and reseting are not very elegant however.\nI would advice to use the basic `prime` wherever possible.\n\n### TODO\n\n- Implement `Class.Mutators`\n- Create another Classy implementation that will break 1.x API\n\t- I'd rather see a `.parent` without wrapping\n\t- Don't reset/clone objects\n\t- Create a nice packages with some nice additional goodies like:\n\t\t- Class.Bind (by @cpojer)\n\t\t- …\n\n","maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"time":{"modified":"2012-05-01T23:09:31.347Z","created":"2012-05-01T23:09:30.017Z","0.0.1":"2012-05-01T23:09:31.347Z"},"author":{"name":"Arian Stolwijk","url":"http://github.com/arian"},"repository":{"type":"git","url":"git://github.com/arian/classy.git"},"_attachments":{"Classy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oz/zD5d0/05ICKaoClME0Q==","length":4368,"stub":true}}}},
{"id":"ClearSilver","key":"ClearSilver","value":{"rev":"3-f3e54eb9ce64fc6a090186e61f15ed0b"},"doc":{"_id":"ClearSilver","_rev":"3-f3e54eb9ce64fc6a090186e61f15ed0b","name":"ClearSilver","description":"ClearSilver template engine bindings for node.js","dist-tags":{"latest":"0.5.0"},"versions":{"0.5.0":{"name":"ClearSilver","keywords":["template engine","ClearSilver"],"description":"ClearSilver template engine bindings for node.js","homepage":"http://github.com/mah0x211/node-clearsilver","version":"0.5.0","license":[{"type":"BSD"}],"main":"./lib/ClearSilver","directories":{"lib":"./lib"},"scripts":{"install":"./install.sh"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"http://github.com/mah0x211/node-clearsilver.git"},"bugs":{"url":"http://github.com/mah0x211/node-clearsilver/issues"},"_id":"ClearSilver@0.5.0","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"105e94cdd342dfea043a83a381e46e8a6fb1fa47","tarball":"http://registry.npmjs.org/ClearSilver/-/ClearSilver-0.5.0.tgz"}}},"maintainers":[{"name":"mah0x211","email":"mah0x211@gmail.com"}],"time":{"modified":"2011-03-23T02:01:53.248Z","created":"2011-03-23T02:01:52.489Z","0.5.0":"2011-03-23T02:01:53.248Z"},"repository":{"type":"git","url":"http://github.com/mah0x211/node-clearsilver.git"},"_attachments":{"ClearSilver-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LHZAc9xF1+ukzuzw2xYmRQ==","length":5863,"stub":true}}}},
{"id":"Cls","key":"Cls","value":{"rev":"3-527a0888aa710a8bc03d880b163b8019"},"doc":{"_id":"Cls","_rev":"3-527a0888aa710a8bc03d880b163b8019","name":"Cls","description":"Simple class abstraction in JavaScript","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Cls","description":"Simple class abstraction in JavaScript","version":"0.0.1","homepage":"http://github.com/alessioalex/Cls","author":{"name":"Alexandru Vladutu","email":"alexandru.vladutu@gmail.com"},"main":"./cls.js","keywords":["class","prototype","inheritance","oop"],"repository":{"type":"git","url":"git://github.com/alessioalex/Cls.git"},"engines":{"node":">= 0.4.0"},"devDependencies":{"mocha":"1.0.x","uglify-js":"1.2.x","jshint":"0.7.x"},"scripts":{"test":"node_modules/.bin/mocha -u qunit","build":"npm run-script jshint && node src/build.js","jshint":"node_modules/.bin/jshint src/cls.js"},"_npmUser":{"name":"alessioalex","email":"alexandru.vladutu@gmail.com"},"_id":"Cls@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"520395ed9d229e241d480d0216d2b6f11d6c2a83","tarball":"http://registry.npmjs.org/Cls/-/Cls-0.0.1.tgz"},"maintainers":[{"name":"alessioalex","email":"alexandru.vladutu@gmail.com"}]}},"readme":"Cls\n--------\nAn interface for classical object oriented programming in JavaScript.\n\nAPI\n---------\n<h3>Creating a class with Cls</h3>\n\n``` js\nvar Slideshow, sshow;\n\nSlideshow = Cls({\n  methods: {\n    constructor: function(slides, effect) {\n      this.slides = slides;\n      this.effect = effect;\n    },\n    goTo: function(slide) {\n      domSelector('#id').nextSlide(slide, this.effect);\n    }\n  },\n  statics: {\n    version: '0.0.1'\n  }\n});\n\nsshow = new Slideshow(['top_story', 'sport', 'politics'], 'fade');\n```\n\n<h3>Extending that class</h3>\n\n``` js\nvar MegaSlideshow, mshow;\n\nMegaSlideshow = Cls({\n  uber: Slideshow,\n  methods: {\n    goTo: function(slide) {\n      var that = this;\n\n      this.changePageTitle(slide, function() {\n        that.inherited('next');\n      });\n    }\n  }\n});\n```\n\n<h3>Mixins</h3>\n\nYou can override / add methods to a class/object (any object) using Cls.mixin(obj, { /* methods */ }):\n\n``` js\nvar laptop = {\n  os: 'OSX Lion',\n  processor: 'i5'\n};\n\nlaptop = Cls.mixin(laptop, { memory: '8GB', cores: 5 });\n```\n\nEnvironments\n------------\nYou can use Cls in the browser or in a Node.js app.\n\n<h3>In the browser</h3>\n\n``` html\n<script src=\"path/to/cls.js\"></script>\n<!-- Cls() is exposed as a global var -->\n\n<script type=\"text/javascript\">\n  var Foo = Cls({ ... });\n  ...\n</script>\n```\n\n<h3>Node.js</h3>\n\n``` js\nvar Cls = require('Cls');\n\nvar Foo = Cls({ ... });\n```\n\nInstall the Package!\n--------------------\nInstall the package with npm manually or by including the app into your package.json dependencies.\n\n    $ npm install Cls\n\n    // then, in your Node app\n    var Cls = require('Cls')\n\nDevelopers\n----------\n\n    $ npm install .\n    $ npm test\n    $ npm run-script build\n\nOnly edit the file `src/cls.js`.\nFor more examples check `test/tests.js`.\n\nWhy did I write this library?\n-----------------------------\n\n- prototype is a long word\n- People are used to classes from other languages\n- Although CoffeeScript's Class implementation is nice, if you have 10 files that use OOP the __extends function is defined 10 times\n- I don't like the functionality provided by most of the similar OOP libraries or I consider them bloated\n\nBonus - for CoffeeScript fans\n-----------------------------\n```js\nlog = console.log\nCls = require './cls'\n\nAnimal = Cls\n  methods:\n    constructor: (@name) ->\n\n    move: (meters) ->\n      log \"#{@name} moved #{meters} meters\"\n\n  statics:\n    types: ['vertebrates', 'invertebrates']\n\nSnake = Cls\n  uber: Animal\n  methods:\n    move: ->\n      log \"Slithering...\"\n      setTimeout =>\n        this.inherited 'move', [5]\n      , 300\n\nHorse = Cls\n  uber: Animal\n  methods:\n    move: ->\n      log \"Galloping...\"\n      args = arguments\n      setTimeout =>\n        this.inherited 'move', args\n      , 1500\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move(45)\n```\n","maintainers":[{"name":"alessioalex","email":"alexandru.vladutu@gmail.com"}],"time":{"modified":"2012-05-19T20:09:03.592Z","created":"2012-05-19T20:09:01.493Z","0.0.1":"2012-05-19T20:09:03.592Z"},"author":{"name":"Alexandru Vladutu","email":"alexandru.vladutu@gmail.com"},"repository":{"type":"git","url":"git://github.com/alessioalex/Cls.git"},"_attachments":{"Cls-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q1odxKLqXakKL5E29nl0bA==","length":4064,"stub":true}}}},
{"id":"Comments","key":"Comments","value":{"rev":"27-de4d410467cdb1c9cb1197d48fc0f937"},"doc":{"_id":"Comments","_rev":"27-de4d410467cdb1c9cb1197d48fc0f937","name":"Comments","description":"utilities for building a comment server for your website","dist-tags":{"latest":"0.5.1"},"versions":{"0.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"a wrapper for storing comments in mongodb","tags":["comment","discussion","blog"],"version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"comments.js","engines":{"node":">=0.4.0"},"dependencies":{"append":">=0.1.0","mongodb":">=0.9.6-19"},"_npmJsonOpts":{"file":"/home/paul/.npm/Comments/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Comments@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8a3ac2ec6cdf75e0d5400ac5ec38d7d190617de2","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.0.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"comments.js","engines":{"node":">=0.4.0"},"dependencies":{"append":">=0.1.0","sha1":">=0.0.0","mongodb":">=0.9.6"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0c80be48410e59dc9708c81cda81aa4a25219abc","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.1.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.1.1","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"comments.js","engines":{"node":">=0.4.0"},"dependencies":{"append":">=0.1.0","sha1":">=0.0.0","mongodb":">=0.9.6"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8e6ef6a3e411fa6ca9279741245337c91573bd8f","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.1.1.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.2.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"comments.js","engines":{"node":">=0.4.0"},"dependencies":{"append":">=0.1.0","sha1":">=0.0.0","mongodb":">=0.9.6"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"4774b1ed9adff4bcb4ee697e9ff76f0e31d1711e","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.2.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.3.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.3.0","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"comments.js","engines":{"node":">=0.4.0"},"dependencies":{"append":">=0.1.0","sha1":">=0.0.0","mongodb":">=0.9.6"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c50701b5fa759b27502b6304f20819c6a3d08cf6","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.3.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.4.0","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2","sha1":">=0.0.1"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.4.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"7b2dbb453379db8b8239b8730567e8138c9af46f","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.4.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.4.1","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2","sha1":">=0.0.1"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.4.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c0393c489acd0e5c6f833a16517506426160ef93","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.4.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.4.2","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2","sha1":">=0.0.1"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.4.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"217c4cc05b157eb2e12449deb33578ecd37251d4","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.4.2.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.4.3","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2","sha1":">=0.0.1"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.4.3","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"982b97e57120e9272e5f22f919d160c4cb753fbe","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.4.3.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.4":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.4.4","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2","sha1":">=0.0.1"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.4.4","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1ce1268a60136848e3c98c770d9fbb11bc95aa99","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.4.4.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.5":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.4.5","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2","sha1":">=0.0.1"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.4.5","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"c52000a167235acbd2c46753fcb13828123dbcac","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.4.5.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.5.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.5.0","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.5.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"68d3c2ff31c37473fabfd38ce95c6001c60d3a51","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.5.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.5.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"name":"Comments","description":"utilities for building a comment server for your website","tags":["comment","discussion","blog"],"version":"0.5.1","repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"bugs":{"url":"https://github.com/pvorb/node-comments/issues"},"main":"./comments.js","engines":{"node":">=0.4.0"},"dependencies":{"MD5":">=0.0.0","append":">=0.1.1","async":">=0.1.18","mongodb":">=0.9.9","pingback":">=0.0.2"},"licenses":[{"type":"MIT license","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Comments@0.5.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9016020e4618673fa288ba5db2f64a536af43869","tarball":"http://registry.npmjs.org/Comments/-/Comments-0.5.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-03-08T12:14:27.286Z","created":"2011-10-01T01:07:26.177Z","0.0.0":"2011-10-01T01:07:28.754Z","0.1.0":"2011-11-20T23:16:00.289Z","0.1.1":"2011-11-21T00:45:39.495Z","0.2.0":"2011-11-25T20:36:11.297Z","0.3.0":"2011-11-26T03:07:50.398Z","0.4.0":"2012-03-03T17:03:33.282Z","0.4.1":"2012-03-03T20:52:58.507Z","0.4.2":"2012-03-04T10:11:59.320Z","0.4.3":"2012-03-04T13:25:44.438Z","0.4.4":"2012-03-04T14:02:20.531Z","0.4.5":"2012-03-05T00:58:59.700Z","0.5.0":"2012-03-06T20:44:19.777Z","0.5.1":"2012-03-08T12:14:27.286Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-comments.git"},"_attachments":{"Comments-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-rk3vfxZqo3Zgt1Y+uN3YzQ==","length":5643,"stub":true},"Comments-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Scny5HYBtsmZeTw0OIhj2g==","length":5644,"stub":true},"Comments-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-5c2BAfmgWKY+0zVm2QdK7A==","length":5730,"stub":true},"Comments-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-L74Gl0+wKMT2zl3qw0TuDg==","length":5757,"stub":true},"Comments-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-qDr0VS86rrnABpncARLNtg==","length":5760,"stub":true},"Comments-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-4Z6T9NUUjBC4BIo6LjRuZA==","length":5705,"stub":true},"Comments-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Nvg4ErmQQ1RUk/QQD0qb6w==","length":5441,"stub":true},"Comments-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-xB35ezKmdH//oPTqovo+3A==","length":5451,"stub":true},"Comments-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MD0cCpN/rzINdW7vUp302w==","length":4662,"stub":true},"Comments-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OJRJWIt3ozdd/CFxLVnvMw==","length":4584,"stub":true},"Comments-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-X6Rq7ACMuJ2kbhtO4SLabA==","length":4557,"stub":true},"Comments-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6YGx9jRauTPzGLjRz9TP8w==","length":4558,"stub":true},"Comments-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7CJiNkzROZCuCXx3ntSRxw==","length":3467,"stub":true}}}},
{"id":"Company","key":"Company","value":{"rev":"3-1c3665803b99bab5ab4c730eed9b9564"},"doc":{"_id":"Company","_rev":"3-1c3665803b99bab5ab4c730eed9b9564","name":"Company","description":"Company is an implicitly-mediated component system for MooTools that helps in developing modular, component-based applications.","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"author":{"name":"Mark Obcena"},"name":"Company","description":"Company is an implicitly-mediated component system for MooTools that helps in developing modular, component-based applications.","version":"1.1.0","homepage":"http://code.keetology.com/company/","repository":{"type":"git","url":"git://github.com/keeto/company.git"},"main":"Source/Company.js","engines":{"node":"*"},"keywords":["event","events","mootools","observer","pubsub"],"bugs":{"url":"https://github.com/keeto/company/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/keeto/slab/master/LICENSE"}],"_npmUser":{"name":"GarrickCheung","email":"garrick@garrickcheung.com"},"_id":"Company@1.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"0517ccb270171eef0f2a8c7c5d8b6cfc3cd1d662","tarball":"http://registry.npmjs.org/Company/-/Company-1.1.0.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}]}},"readme":"Company\n=======\n\n**Company** is an implicitly-mediated component system for MooTools that helps in developing modular, component-based applications.\n\nCompany was developed as an advanced, alternative system to the basic event-based module systems described in the Keetology article, [Modules and Callbacks: Going Hollywood with MooTools][modules_and_callbacks]. It requires MooTools 1.3 Core and above.\n\nPlease refer to the API Docs and the Company Guide found in the `Docs` directory for more information on how to use Company and the features included. You can also checkout the `Examples` directory for sample usage of the system.\n\n\nProject Stuff\n-------------\n\n### Website\n\nhttp://code.keetology.com/company\n\n### Author and License\n\nMark \"Keeto\" Obcena <keetology.com>  \nCopyright 2011, MIT-style License\n\n\n[modules_and_callbacks]: http://keetology.com/blog/2010/10/01/modules-and-callbacks-going-hollywood-with-mootools\n","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"time":{"modified":"2012-06-12T07:14:39.436Z","created":"2012-06-12T07:14:38.118Z","1.1.0":"2012-06-12T07:14:39.436Z"},"author":{"name":"Mark Obcena"},"repository":{"type":"git","url":"git://github.com/keeto/company.git"},"_attachments":{"Company-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-K9acjY760o6CG05R152gSA==","length":120542,"stub":true}}}},
{"id":"Complex","key":"Complex","value":{"rev":"7-34c5db7541fbbcec1b80ddb3cf495d50"},"doc":{"_id":"Complex","_rev":"7-34c5db7541fbbcec1b80ddb3cf495d50","name":"Complex","description":"Do calculations with Complex numbers","dist-tags":{"latest":"3.0.0"},"versions":{"2.0.0":{"name":"Complex","homepage":"http://github.com/arian/Complex","version":"2.0.0","description":"Do calculations with Complex numbers","keywords":["Complex Numbers","Numbers","Math","Calculus"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":{"name":"https://github.com/arian/Complex/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/mootools/Base.git"}],"implements":["CommonJS/Packages/1.0","CommonJS/Modules/AsynchronousDefinition"],"directories":{"lib":"Source"},"main":"Source/Complex","icon":"https://github.com/arian/Complex/raw/master/wiki-complex.png","dependencies":{},"devDependencies":{},"_id":"Complex@2.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a2746e93b5806719bd37fa55806e30c22ee77e69","tarball":"http://registry.npmjs.org/Complex/-/Complex-2.0.0.tgz"},"scripts":{}},"2.0.1":{"name":"Complex","homepage":"http://github.com/arian/Complex","version":"2.0.1","description":"Do calculations with Complex numbers","keywords":["Complex Numbers","Numbers","Math","Calculus"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":{"name":"https://github.com/arian/Complex/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git://github.com/arian/Complex.git"},"implements":["CommonJS/Packages/1.0","CommonJS/Modules/AsynchronousDefinition"],"directories":{"lib":"Source"},"main":"Source/Complex","icon":"https://github.com/arian/Complex/raw/master/wiki-complex.png","dependencies":{"amd-loader":">=0.0.3"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Complex@2.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"496dbf9ca47a4156f034d8e098493e1b6aa1593c","tarball":"http://registry.npmjs.org/Complex/-/Complex-2.0.1.tgz"}},"3.0.0":{"name":"Complex","homepage":"http://github.com/arian/Complex","version":"3.0.0","description":"Do calculations with Complex numbers","keywords":["Complex Numbers","Numbers","Math","Calculus"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":"https://github.com/arian/Complex/issues","licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"http://github.com/arian/Complex"},"main":"lib/Complex","icon":"https://github.com/arian/Complex/raw/master/wiki-complex.png","devDependencies":{"mocha":"1.3","expect.js":"0.1","express":"3","wrapup":"0.9"},"readme":"Complex\n=======\n\nComplex is a additional Type to deal with Complex Numbers in JavaScript. It\nprovides several methods to add, multiply numbers as well as calculate the\nmagnitude and angle in the complex plane.\n\n![Screenshot](https://github.com/arian/Complex/raw/master/wiki-complex.png)\n\nNode\n----\n\nYou can get this package with NPM:\n\n    npm install Complex\n\n```js\nvar Complex = require('Complex');\nconsole.log(new Complex(3, 4).abs()); // 5\n```\n\nBrowser\n-------\n\nComplex can be built for the browser with [wrapup](https://github.com/kamicane/wrapup)\nor other tools that can generate browser JS from Node packages.\n\nTesting\n-------\n\nTesting is done with Mocha and Expect.js:\n\n\t# install dependencies\n\tnpm install\n\t# run the tests in node\n\t./node_modules/.bin/mocha test/Complex.js\n\nor testing in the browser:\n\n\t# install dependencies\n\tnpm install\n\t# run a small node server\n\tnode ./test/server.js\n\t# run tests\n\tgoogle-chrome http://localhost:3000\n\nAPI Documentation\n-----------------\n\n### Complex constructor:\n\n```js\nvar z = new Complex(real im);\n```\n\n#### Arguments:\n\n1. real (number) the real part of the number\n2. im (number) the imaginary part of the number\n\n\n### Function: Complex.from\n\nA in line function like Number.from.\n\n```js\nvar z = Complex.from(real[, im]);\n```\n\n#### Arguments:\n\n1. real (number) the real part of the number\n2. im (number, *optional*) the imaginary part of the number\n\nOr\n\n1. real (string) a string representation of the number, for example `1+4i`\n\n#### Examples:\n\n```js\nvar z = Complex.from(2, 4);\nvar z = Complex.from(5);\nvar z = Complex.from('2+5i');\n```\n\n\n### Function: Complex.fromPolar\n\nCreates a complex instance from a polar representation: `r*e^(phi*i) = r (cos(phi) + i sin(phi))`\n\n```js\nvar z = Complex.fromPolar(r, phi);\n```\n\n#### Arguments:\n\n1. r (number) the radius/magnitude of the number\n2. phi (number) the angle/phase of the number\n\n\n### Constant: Complex.i\n\nA instance of the imaginary unit `i`\n\n```js\nvar i = Complex.i;\n```\n\n\n### Constant: Complex.one\n\nA instance for the real number `1`\n\n```js\nvar one = Complex.one;\n```\n\n\n### Method: fromRect\n\nSets the real and imaginary properties a and b from `a + bi`\n\n```js\nmyComplex.fromRect(real, im);\n```\n\n#### Arguments:\n\n1. real (number) the real part of the number\n2. im (number) the imaginary part of the number\n\n\n### Method: fromPolar\n\nSets the a and b in `a + bi` from a polar representation.\n\n```js\nmyComplex.fromPolar(r, phi);\n```\n\n#### Arguments:\n\n1. r (number) the radius/magnitude of the number\n2. phi (number) the angle/phase of the number\n\n\n### Method: toPrecision\n\nSets the precision of the numbers. Similar to Number.prototype.toPrecision. Useful befor printing the number with the toString method.\n\n```js\nmyComplex.toPrecision(k);\n```\n\n#### Arguments:\n\n1. k (number) An integer specifying the number of significant digits\n\n\n### Method: toFixed\n\nFormats a number using fixed-point notation. Similar to Number.prototype.toFixed. Useful before printing the number with the toString method.\n\n```js\nmyComplex.toFixed(k);\n```\n\n#### Arguments:\n\n1. k (number) The number of digits to appear after the decimal point; this may be a value between 0 and 20, inclusive, and implementations may optionally support a larger range of values. If this argument is omitted, it is treated as 0\n\n\n### Method: finalize\n\nFinalizes the instance. The number will not change and any other method call will return a new instance.\nVery useful when a complex instance should stay constant. For example the Complex.i variable is a finalized instance.\n\n```js\nmyComplex.finalize();\n```\n\n\n### Method: magnitude\n\nCalculates the magnitude of the complex number\n\n```js\nmyComplex.magnitude();\n```\n\n#### Alias:\n\n- abs\n\n\n### Method: angle\n\nCalculates the angle with respect to the real axis, in radians.\n\n```js\nmyComplex.angle();\n```\n\n#### Aliases\n\n- arg\n- phase\n\n\n### Method: conjugate\n\nCalculates the conjugate of the complex number (multiplies the imaginary part with -1)\n\n```js\nmyComplex.conjugate();\n```\n\n\n### Method: negate\n\nNegates the number (multiplies both the real and imaginary part with -1)\n\n```js\nmyComplex.negate();\n```\n\n\n### Method: multiply\n\nMultiplies the number with a real or complex number\n\n```js\nmyComplex.multiply(z);\n```\n\n#### Arguments:\n\n1. z (number, complex) the number to multiply with\n\n#### Alias:\n\n- mult\n\n\n### Method: divide\n\nDivides the number by a real or complex number\n\n```js\nmyComplex.divide(z);\n```\n\n#### Arguments:\n\n1. z (number, complex) the number to divide by\n\n#### Alias:\n\n- div\n\n\n### Method: add\n\nAdds a real or complex number\n\n```js\nmyComplex.add(z);\n```\n\n#### Arguments:\n\n1. z (number, complex) the number to add\n\n\n### Method: subtract\n\nSubtracts a real or complex number\n\n```js\nmyComplex.subtract(z);\n```\n\n#### Arguments:\n\n1. z (number, complex) the number to subtract\n\n#### Alias:\n\n- sub\n\n\n### Method: pow\n\nReturns the base to the exponent\n\n```js\nmyComplex.pow(z);\n```\n\n#### Arguments:\n\n1. z (number, complex) the exponent\n\n\n### Method: sqrt\n\nReturns the square root\n\n```js\nmyComplex.sqrt();\n```\n\n\n### Method: log\n\nReturns the natural logarithm (base `E`)\n\n```js\nmyComplex.log([k]);\n```\n\n#### Arguments:\n\n1. k (number) the actual answer has a multiplicity (`ln(z) = ln|z| + arg(z)`) where arg(z) can return the same for different angles (every 2*pi), with this argument you can define which answer is required\n\n\n### Method: exp\n\nCalculates the `e^z` where the base is `E` and the exponential the complex number.\n\n```js\nmyComplex.exp();\n```\n\n\n### Method: sin\n\nCalculates the sine of the complex number\n\n```js\nmyComplex.sin();\n```\n\n\n### Method: cos\n\nCalculates the cosine of the complex number\n\n```js\nmyComplex.cos();\n```\n\n\n### Method: tan\n\nCalculates the tangent of the complex number\n\n```js\nmyComplex.tan();\n```\n\n\n### Method: sinh\n\nCalculates the hyperbolic sine of the complex number\n\n```js\nmyComplex.sinh();\n```\n\n\n### Method: cosh\n\nCalculates the hyperbolic cosine of the complex number\n\n```js\nmyComplex.cosh();\n```\n\n\n### Method: tanh\n\nCalculates the hyperbolic tangent of the complex number\n\n```js\nmyComplex.tanh();\n```\n\n\n### Method: clone\n\nReturns a new Complex instance with the same real and imaginary properties\n\n```js\nmyComplex.clone();\n```\n\n\n### Method: toString\n\nReturns a string representation of the complex number\n\n```js\nmyComplex.toString();\n```\n\n\n#### Examples:\n\n```js\nnew Complex(1, 2).toString(); // 1+2i\nnew Complex(0, 1).toString(); // i\nnew Complex(4, 0).toString(); // 4\nnew Complex(1, 1).toString(); // 1+i\n'my Complex Number is: ' + (new Complex(3, 5)); // 'my Complex Number is: 3+5i\n```\n\n\n### Method: Equals\n\nChecks if the real and imaginary components are equal to the passed in compelex components.\n\n```js\nmyComplex.equals(z);\n```\n\n### Arguments:\n\n1. z (number, complex) the complex number to compare with\n\n### Examples:\n\n```js\nnew Complex(1, 4).equals(new Complex(1, 4)); // true\nnew Complex(1, 3).equals(new Complex(1, 3)); // false\n```\n","_id":"Complex@3.0.0","dist":{"shasum":"f06a402d59baa3e68c7b3513840e1a70a3f8eabf","tarball":"http://registry.npmjs.org/Complex/-/Complex-3.0.0.tgz"}}},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"time":{"modified":"2012-08-13T11:40:39.778Z","created":"2011-09-27T21:02:54.212Z","2.0.0":"2011-09-27T21:02:55.038Z","2.0.1":"2012-02-01T01:20:30.086Z","3.0.0":"2012-08-13T11:40:39.778Z"},"author":{"name":"Arian Stolwijk"},"repository":{"type":"git","url":"http://github.com/arian/Complex"},"_attachments":{"Complex-3.0.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-VotnnVOunAVnEEzA1NGHFA==","length":8683,"stub":true},"Complex-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-W/nSj3WMrVnf74LP7Q4HHw==","length":2357834,"stub":true},"Complex-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i4r8yRjyVUJDyp+FbN18pg==","length":2361925,"stub":true}}}},
{"id":"CompoundSignal","key":"CompoundSignal","value":{"rev":"5-a0695c30fdaa3471246ef0cd6c8a476d"},"doc":{"_id":"CompoundSignal","_rev":"5-a0695c30fdaa3471246ef0cd6c8a476d","name":"CompoundSignal","description":"Special Signal that groups multiple Signals together and dispatches after all the group elements are dispatched.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"CompoundSignal","description":"Special Signal that groups multiple Signals together and dispatches after all the group elements are dispatched.","keywords":["js-signals","signals","pub/sub","event","publish","subscribe","observer","when","deferred","promises"],"homepage":"https://github.com/millermedeiros/CompoundSignal/","version":"0.1.0","author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com/"},"repository":{"type":"git","url":"git://github.com/millermedeiros/CompoundSignal.git"},"main":"src/CompoundSignal.js","bugs":{"url":"https://github.com/millermedeiros/CompoundSignal/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"signals":">=0.7.0"},"_npmUser":{"name":"millermedeiros","email":"miller@millermedeiros.com"},"_id":"CompoundSignal@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"89e9d41a5f99e36448ccc46f45af3be5ede5c10f","tarball":"http://registry.npmjs.org/CompoundSignal/-/CompoundSignal-0.1.0.tgz"},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}]},"0.2.0":{"name":"CompoundSignal","description":"Special Signal that groups multiple Signals together and dispatches after all the group elements are dispatched.","keywords":["js-signals","signals","pub/sub","event","publish","subscribe","observer","when","deferred","promises"],"homepage":"https://github.com/millermedeiros/CompoundSignal/","version":"0.2.0","author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com/"},"repository":{"type":"git","url":"git://github.com/millermedeiros/CompoundSignal.git"},"main":"src/CompoundSignal.js","bugs":{"url":"https://github.com/millermedeiros/CompoundSignal/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"signals":">=0.7.0"},"_npmUser":{"name":"millermedeiros","email":"miller@millermedeiros.com"},"_id":"CompoundSignal@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"fe7311f4ef9bc5a70a26e483d515d07988877314","tarball":"http://registry.npmjs.org/CompoundSignal/-/CompoundSignal-0.2.0.tgz"},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}]}},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}],"time":{"modified":"2012-02-04T04:43:56.978Z","created":"2011-11-02T04:32:10.715Z","0.1.0":"2011-11-02T04:32:12.658Z","0.2.0":"2012-02-04T04:43:56.978Z"},"author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com/"},"repository":{"type":"git","url":"git://github.com/millermedeiros/CompoundSignal.git"},"_attachments":{"CompoundSignal-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5gdVHk2wu5u66RQ1ZCcAGg==","length":25077,"stub":true},"CompoundSignal-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bvg+adPgbH+XNwGbXuTKKg==","length":30720,"stub":true}}}},
{"id":"Compress-CSS","key":"Compress-CSS","value":{"rev":"3-7030f9567a1c86451419f54215ee796b"},"doc":{"_id":"Compress-CSS","_rev":"3-7030f9567a1c86451419f54215ee796b","name":"Compress-CSS","description":"A simple command line CSS compressor","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Greg Davis","email":"antelope.buzkowski@gmail.com","url":"http://www.monsterworksdesign.com"},"name":"Compress-CSS","description":"A simple command line CSS compressor","version":"0.1.0","repository":{"type":"git","url":"git://github.com/antelopeb/Compress-CSS.git"},"main":"CSS_compress.js","engines":{"node":">=0.1.27"},"dependencies":{},"devDependencies":{},"bin":{"smallCSS":"./CSS_compress.js"},"_npmJsonOpts":{"file":"/Users/user/.npm/Compress-CSS/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Compress-CSS@0.1.0","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"db1b5dba8601969e5406c897bcf3b4a9e42d8a90","tarball":"http://registry.npmjs.org/Compress-CSS/-/Compress-CSS-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"seltzerpie","email":"antelope.buzkowski@gmail.com"}]}},"maintainers":[{"name":"seltzerpie","email":"antelope.buzkowski@gmail.com"}],"time":{"modified":"2012-04-04T04:06:14.160Z","created":"2012-04-04T04:06:13.530Z","0.1.0":"2012-04-04T04:06:14.160Z"},"author":{"name":"Greg Davis","email":"antelope.buzkowski@gmail.com","url":"http://www.monsterworksdesign.com"},"repository":{"type":"git","url":"git://github.com/antelopeb/Compress-CSS.git"},"_attachments":{"Compress-CSS-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qvbW91KzTFP/whJjjLmVzw==","length":2129,"stub":true}}}},
{"id":"Concur","key":"Concur","value":{"rev":"27-8b4c1aea223d1e8a46cfbc92aacc3192"},"doc":{"_id":"Concur","_rev":"27-8b4c1aea223d1e8a46cfbc92aacc3192","name":"Concur","description":"Sugar for JavaScript inheritance","dist-tags":{"latest":"0.2.3"},"versions":{"0.0.1":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.0.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["inheritance","sugar","OOP","extends"],"main":"concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"devDependencies":{"qunit":">= 0.2.9"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-3","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"7352414afcb8e37a3af5c82289994f7a760f9368","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.0.1.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.0.2":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.0.2","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["inheritance","sugar","OOP","extends"],"main":"concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"devDependencies":{"qunit":">= 0.2.9"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"23d53ffb35f3aaa62a9d2c1597b78b093e367856","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.0.2.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.1.0":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.1.0","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["inheritance","sugar","OOP","extend"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qunit":"0.2.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"64cfa6591fef98ea47aa821a6a43e96cfb5fb5c4","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.1.0.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.1.1":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.1.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["inheritance","sugar","OOP","extend"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qunit":"0.2.x","request":"2.9.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4ae6decbd5f65ac1f1ec461838b2d1d1252b13a9","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.1.1.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.1.2":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.1.2","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["inheritance","sugar","OOP","extend"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qunit":"0.2.x","buildumb":"0.0.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"928a419d36a45d8ba766f2948d291c3d50b36d0f","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.1.2.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.1.3":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.1.3","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","inheritance","sugar","meta","mixin"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qunit":"0.2.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"84545fc41c70ed79dd2c34150e222264d208cfba","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.1.3.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.1.4":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.1.4","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","inheritance","sugar","meta","mixin"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.1.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"f5e13894423002222743e69161ffa69b53768c67","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.1.4.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.2.0":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.2.0","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","inheritance","sugar","meta","mixin"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"07f5b672737398ee2597a5b8e0d592e8cf3e7635","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.2.0.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.2.1":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.2.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","inheritance","sugar","meta","mixin"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5efe69152b8598d065115f0d3175c1df4c2b9c15","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.2.1.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.2.2":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.2.2","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","inheritance","sugar","meta","mixin"],"main":"./lib/concur","repository":{"type":"git","url":"git://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"Concur@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5c68f7a3475278df1ab84d61e85975ee40740114","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.2.2.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"0.2.3":{"name":"Concur","description":"Sugar for JavaScript inheritance","version":"0.2.3","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","inheritance","sugar","meta","mixin"],"main":"./lib/concur","repository":{"type":"git","url":"http://github.com/insin/concur.git"},"dependencies":{"isomorph":"0.2.x"},"devDependencies":{"qqunit":"0.4.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"readme":"","_id":"Concur@0.2.3","dist":{"shasum":"e460628e99dc1b8aee5278f20129525c9b43ae13","tarball":"http://registry.npmjs.org/Concur/-/Concur-0.2.3.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]}},"readme":null,"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"time":{"modified":"2012-06-29T05:27:04.142Z","created":"2011-12-15T05:36:14.430Z","0.0.1":"2011-12-15T05:36:16.653Z","0.0.2":"2012-01-02T23:56:24.073Z","0.1.0":"2012-01-17T11:27:21.269Z","0.1.1":"2012-01-17T13:46:36.418Z","0.1.2":"2012-01-18T03:12:57.894Z","0.1.3":"2012-01-26T07:28:44.654Z","0.1.4":"2012-02-01T23:26:46.495Z","0.2.0":"2012-02-04T00:41:09.036Z","0.2.1":"2012-02-04T01:44:58.848Z","0.2.2":"2012-02-07T03:01:49.793Z","0.2.3":"2012-06-29T05:27:04.142Z"},"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"repository":{"type":"git","url":"http://github.com/insin/concur.git"},"_attachments":{"Concur-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-p1LKYkquOQSff7De8NOKVQ==","length":5359,"stub":true},"Concur-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-F0weruPB/mnv10rvZwpCBQ==","length":7129,"stub":true},"Concur-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-dq/jeo+hHHqWucp0m6DUUg==","length":7015,"stub":true},"Concur-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-X+Lya4PpeCGoR1XKQTg/LQ==","length":6932,"stub":true},"Concur-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-GyGU60yfzWy/qSwTwZ5oZQ==","length":6856,"stub":true},"Concur-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3j2gY0j5Ys+aMswQK42qqQ==","length":6695,"stub":true},"Concur-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dGHTFww3f6/RzophCLpRZw==","length":7296,"stub":true},"Concur-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-2/RsfhL7iCCu45ipFNlc1g==","length":4045,"stub":true},"Concur-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-IZZEtc3aoZzxetlKgT3uQQ==","length":3457,"stub":true},"Concur-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/kjQ2Qvr+wO3gh+jpiwtZA==","length":5317,"stub":true},"Concur-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7i6HBB5YFRwXk/7dtsbt6A==","length":5024,"stub":true}}}},
{"id":"ConstraintNetwork","key":"ConstraintNetwork","value":{"rev":"9-52d42642d938b9f1be1058e179d86c68"},"doc":{"_id":"ConstraintNetwork","_rev":"9-52d42642d938b9f1be1058e179d86c68","name":"ConstraintNetwork","description":"A constraint network library (think spreadsheet-style logic)","dist-tags":{"latest":"0.1.21"},"versions":{"0.0.0":{"author":{"name":"Peter Burns","email":"rictic@gmail.com"},"name":"ConstraintNetwork","description":"A constraint network library (think spreadsheet-style logic)","version":"0.0.0","repository":{"url":""},"main":"ConstraintNetwork.js","scripts":{"test":"expresso ConstraintNetworkTest.js"},"engines":{"node":">0.1.0"},"dependencies":{"jsparse":"0.1.0"},"devDependencies":{"should":">0","expresso":">0"},"optionalDependencies":{},"_npmUser":{"name":"rictic","email":"rictic@gmail.com"},"_id":"ConstraintNetwork@0.0.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"abbf1eb3bf66d0858ad8c782b0fe252535819147","tarball":"http://registry.npmjs.org/ConstraintNetwork/-/ConstraintNetwork-0.0.0.tgz"},"readme":"","maintainers":[{"name":"rictic","email":"rictic@gmail.com"}]},"0.1.0":{"author":{"name":"Peter Burns","email":"rictic@gmail.com"},"name":"ConstraintNetwork","description":"A constraint network library (think spreadsheet-style logic)","version":"0.1.0","repository":{"url":""},"main":"ConstraintNetwork.js","scripts":{"test":"expresso ConstraintNetworkTest.js"},"engines":{"node":">0.1.0"},"dependencies":{"jsparse":"0.1.0"},"devDependencies":{"should":">0","expresso":">0"},"optionalDependencies":{},"_npmUser":{"name":"rictic","email":"rictic@gmail.com"},"_id":"ConstraintNetwork@0.1.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c6d4cd6918df713b82513b28b7aada2a6c071177","tarball":"http://registry.npmjs.org/ConstraintNetwork/-/ConstraintNetwork-0.1.0.tgz"},"readme":"","maintainers":[{"name":"rictic","email":"rictic@gmail.com"}]},"0.1.2":{"author":{"name":"Peter Burns","email":"rictic@gmail.com"},"name":"ConstraintNetwork","description":"A constraint network library (think spreadsheet-style logic)","version":"0.1.2","repository":{"url":""},"main":"ConstraintNetwork.js","scripts":{"test":"expresso ConstraintNetworkTest.js"},"engines":{"node":">0.1.0"},"dependencies":{"jsparse":"0.1.0"},"devDependencies":{"should":">0","expresso":">0"},"optionalDependencies":{},"_npmUser":{"name":"rictic","email":"rictic@gmail.com"},"_id":"ConstraintNetwork@0.1.2","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6c5442679ac989dc76c6c3eb16d4d930b3b9e6eb","tarball":"http://registry.npmjs.org/ConstraintNetwork/-/ConstraintNetwork-0.1.2.tgz"},"readme":"","maintainers":[{"name":"rictic","email":"rictic@gmail.com"}]},"0.1.21":{"author":{"name":"Peter Burns","email":"rictic@gmail.com"},"name":"ConstraintNetwork","description":"A constraint network library (think spreadsheet-style logic)","version":"0.1.21","repository":{"url":""},"main":"ConstraintNetwork.js","scripts":{"test":"expresso ConstraintNetworkTest.js"},"engines":{"node":">0.1.0"},"dependencies":{"jsparse":"0.1.0"},"devDependencies":{"should":">0","expresso":">0"},"optionalDependencies":{},"_npmUser":{"name":"rictic","email":"rictic@gmail.com"},"_id":"ConstraintNetwork@0.1.21","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cf40fafce182d1ff9bbb65bf4da0aee4acf84889","tarball":"http://registry.npmjs.org/ConstraintNetwork/-/ConstraintNetwork-0.1.21.tgz"},"readme":"","maintainers":[{"name":"rictic","email":"rictic@gmail.com"}]}},"readme":"","maintainers":[{"name":"rictic","email":"rictic@gmail.com"}],"time":{"modified":"2012-02-12T03:58:19.281Z","created":"2012-02-12T02:31:25.681Z","0.0.0":"2012-02-12T02:31:26.760Z","0.1.0":"2012-02-12T02:45:33.450Z","0.1.2":"2012-02-12T03:52:15.850Z","0.1.21":"2012-02-12T03:58:19.281Z"},"author":{"name":"Peter Burns","email":"rictic@gmail.com"},"repository":{"url":""},"_attachments":{"ConstraintNetwork-0.1.21.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NQtpIjVpv8YK3uTJtHwAsw==","length":2847,"stub":true},"ConstraintNetwork-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SUSjPrJX2+/fl3Q/ku+R6A==","length":2832,"stub":true},"ConstraintNetwork-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rhA9pSeWVPIH6GzKsruyaw==","length":2648,"stub":true},"ConstraintNetwork-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-snPqdMfN1V6ToZGp9I74Ww==","length":2364,"stub":true}}}},
{"id":"CoolBeans","key":"CoolBeans","value":{"rev":"15-f76e719ac20a689ef4bcd011acac6ca1"},"doc":{"_id":"CoolBeans","_rev":"15-f76e719ac20a689ef4bcd011acac6ca1","name":"CoolBeans","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"CoolBeans","version":"0.0.1","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"CoolBeans.js","engine":"node >= 0.4.1","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"36f4da698b0d10a77f7b3a06cb4e55d4bffef716","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.1.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]},"0.0.2":{"name":"CoolBeans","version":"0.0.2","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"./lib/CoolBeans.js","engine":"node >= 0.4.1","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"acaf85ef1567eb639c5012cf9040f4c4ff627b47","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.2.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]},"0.0.3":{"name":"CoolBeans","version":"0.0.3","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"./lib/CoolBeans.js","engine":"node >= 0.4.1","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"0f9c9cf94d34c50e5c05fec9d8ad66fdbbbefa48","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.3.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]},"0.0.4":{"name":"CoolBeans","version":"0.0.4","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"index","engine":"node >= 0.4.1","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"2129a5140f15ab5b27aca5a483ce1ecf6f1f7e57","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.4.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]},"0.0.6":{"name":"CoolBeans","version":"0.0.6","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"index","engine":"node >= 0.4.1","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0d53b8b46e8aa99f9973b2e99bdb07476cdf8b80","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.6.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]},"0.0.7":{"name":"CoolBeans","version":"0.0.7","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"index","engine":"node >= 0.4.1","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a71cc9100f3b584dacc20830d82b4ab1f78f99b1","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.7.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]},"0.0.8":{"name":"CoolBeans","version":"0.0.8","description":"CoolBeans is an Inversion of Control (IOC) / Dependency Injection (DI) library for Node.js. CoolBeans is loosely based on ColdSpring for ColdFusion and Spring IOC for Java.","keywords":["CoolBeans","IOC","Inversion of Control","DI","Dependency Injection","Spring","factory"],"homepage":"https://github.com/dhughes/CoolBeans","author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"main":"index","engine":"node >= 0.4.11","repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_npmUser":{"name":"dhughes","email":"dhughes@alagad.com"},"_id":"CoolBeans@0.0.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9e4ce5ab207c724e880b99ca4954fd9ff352471b","tarball":"http://registry.npmjs.org/CoolBeans/-/CoolBeans-0.0.8.tgz"},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}]}},"maintainers":[{"name":"dhughes","email":"dhughes@alagad.com"}],"time":{"modified":"2011-12-17T15:19:42.128Z","created":"2011-11-29T13:50:25.803Z","0.0.1":"2011-11-29T14:44:13.376Z","0.0.2":"2011-11-29T14:54:47.524Z","0.0.3":"2011-11-29T14:57:38.889Z","0.0.4":"2011-11-29T15:35:14.021Z","0.0.6":"2011-11-29T16:14:54.656Z","0.0.7":"2011-12-12T17:38:24.165Z","0.0.8":"2011-12-17T15:19:42.128Z"},"author":{"name":"Doug Hughes","email":"dhughes@alagad.com","url":"http://blog.alagad.com"},"repository":{"type":"git","url":"git://github.com/dhughes/CoolBeans.git"},"_attachments":{"CoolBeans-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-v2EbaF/oEzxPxu3oxoUrzg==","length":10240,"stub":true},"CoolBeans-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zEHbfNez+ngpl/6OkWK8lA==","length":10240,"stub":true},"CoolBeans-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9enEVeJhi9oh/ya4RyVj8w==","length":10240,"stub":true},"CoolBeans-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-wkHq8ZgVu9CTreYZqv5rfA==","length":10240,"stub":true},"CoolBeans-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gIXD4pv+75/HL0C4o4dJmg==","length":10240,"stub":true},"CoolBeans-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ucT/0lkSHfMjTD4tGD4yQA==","length":10240,"stub":true},"CoolBeans-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TioBkGTQSkXU46YD7A4/ig==","length":10240,"stub":true}}}},
{"id":"CornerCut","key":"CornerCut","value":{"rev":"5-03e7332dfd350075629c3b915a71edc4"},"doc":{"_id":"CornerCut","_rev":"5-03e7332dfd350075629c3b915a71edc4","name":"CornerCut","description":"Dead simple web routing using modules","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"CornerCut","version":"0.0.1","author":{"name":"Chris Vickery","email":"chrisinajar@gmail.com"},"description":"Dead simple web routing using modules","main":"./lib/cornercut.js","dependencies":{},"repository":{"type":"git","url":"git://github.com/chrisinajar/CornerCut.git"},"license":"BSD","engine":{"node":">=0.4"},"_npmUser":{"name":"chrisinajar","email":"chrisinajar@gmail.com"},"_id":"CornerCut@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"3f14f915072cf3bbd2105faa2553d16392ecea24","tarball":"http://registry.npmjs.org/CornerCut/-/CornerCut-0.0.1.tgz"},"readme":"","maintainers":[{"name":"chrisinajar","email":"chrisinajar@gmail.com"}]},"0.0.2":{"name":"CornerCut","version":"0.0.2","author":{"name":"Chris Vickery","email":"chrisinajar@gmail.com"},"description":"Dead simple web routing using modules","main":"./lib/cornercut.js","dependencies":{},"repository":{"type":"git","url":"git://github.com/chrisinajar/CornerCut.git"},"license":"FreeBSD","engine":{"node":">=0.4"},"_npmUser":{"name":"chrisinajar","email":"chrisinajar@gmail.com"},"_id":"CornerCut@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"8143fe1d19b35cbf43910518c7ca426315494f47","tarball":"http://registry.npmjs.org/CornerCut/-/CornerCut-0.0.2.tgz"},"readme":"","maintainers":[{"name":"chrisinajar","email":"chrisinajar@gmail.com"}]}},"readme":"","maintainers":[{"name":"chrisinajar","email":"chrisinajar@gmail.com"}],"time":{"modified":"2012-04-13T20:57:56.198Z","created":"2012-04-13T19:06:05.869Z","0.0.1":"2012-04-13T19:06:07.033Z","0.0.2":"2012-04-13T20:57:56.198Z"},"author":{"name":"Chris Vickery","email":"chrisinajar@gmail.com"},"repository":{"type":"git","url":"git://github.com/chrisinajar/CornerCut.git"},"_attachments":{"CornerCut-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-henfjJb1jslG7s3lL1oVNw==","length":1728,"stub":true},"CornerCut-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6U1MmwlWKImg3KrHOHjJIQ==","length":1714,"stub":true}}}},
{"id":"Couch-cleaner","key":"Couch-cleaner","value":{"rev":"3-fc77270917d967a4e2e8637cfa9f0fe0"},"doc":{"_id":"Couch-cleaner","_rev":"3-fc77270917d967a4e2e8637cfa9f0fe0","name":"Couch-cleaner","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Couch-cleaner","version":"0.0.1","main":"./couch-cleaner.js","bin":{"couch-cleaner":"./bin/couch-cleaner"},"dependencies":{},"devDependencies":{},"_id":"Couch-cleaner@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1784509cf7cbd8a74a20f706a1eae74447497580","tarball":"http://registry.npmjs.org/Couch-cleaner/-/Couch-cleaner-0.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"manobi","email":"manobi.oliveira@gmail.com"}],"time":{"modified":"2011-06-18T17:50:20.300Z","created":"2011-06-18T17:50:19.123Z","0.0.1":"2011-06-18T17:50:20.300Z"},"_attachments":{"Couch-cleaner-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JIoefXz+D30v2jaB5rE93Q==","length":15037,"stub":true}}}},
{"id":"CouchCover","key":"CouchCover","value":{"rev":"17-87218ca16407b1e98ad0dfbd3e12d631"},"doc":{"_id":"CouchCover","_rev":"17-87218ca16407b1e98ad0dfbd3e12d631","name":"CouchCover","description":"Provides a mock evironment for testing CouchDB design document functions","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"CouchCover","version":"0.0.1","description":"Provides a mock evironment for testing CouchDB design document functions","keywords":["CouchDB","mock","testing"],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"licenses":[{"type":"MIT"}],"main":"./lib/main","engines":{"node":">= 0.2.4","coffee-script":">=0.9.4"},"scripts":{"test":"make test"},"repositories":[{"type":"git","url":"https://github.com/zdzolton/couch-cover.git"}],"_id":"CouchCover@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.10-1","_nodeVersion":"v0.2.4","dist":{"shasum":"f24b22f61777a7a69ad4daff318a202bdade3efc","tarball":"http://registry.npmjs.org/CouchCover/-/CouchCover-0.0.1.tgz"},"directories":{}},"0.0.2":{"name":"CouchCover","version":"0.0.2","description":"Provides a mock evironment for testing CouchDB design document functions","keywords":["CouchDB","mock","testing"],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"licenses":[{"type":"MIT"}],"main":"./lib/main","engines":{"node":">= 0.2.4","coffee-script":">=0.9.4"},"scripts":{"test":"make --silent test"},"repositories":[{"type":"git","url":"https://github.com/zdzolton/couch-cover.git"}],"_id":"CouchCover@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.10-1","_nodeVersion":"v0.2.4","dist":{"shasum":"381b4ff67bcf46150d45ed4a3951e08a2afaea5e","tarball":"http://registry.npmjs.org/CouchCover/-/CouchCover-0.0.2.tgz"},"directories":{}},"0.0.3":{"name":"CouchCover","version":"0.0.3","description":"Provides a mock evironment for testing CouchDB design document functions","keywords":["CouchDB","mock","testing"],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"licenses":[{"type":"MIT"}],"main":"./lib/main","engines":{"node":">= 0.2.4","coffee-script":">=0.9.4"},"scripts":{"test":"make --silent test"},"repositories":[{"type":"git","url":"https://github.com/zdzolton/couch-cover.git"}],"directories":{"lib":"./lib"},"modules":{"main.js":"lib/main.js"},"files":[""],"_id":"CouchCover@0.0.3","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.2.6","_defaultsLoaded":true,"dist":{"shasum":"3847a442feddd7a91814a9185f6fcb376fdf8448","tarball":"http://registry.npmjs.org/CouchCover/-/CouchCover-0.0.3.tgz"}},"0.0.4":{"name":"CouchCover","version":"0.0.4","description":"Provides a mock evironment for testing CouchDB design document functions","keywords":["CouchDB","mock","testing"],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"licenses":[{"type":"MIT"}],"main":"./lib/main","engines":{"node":">= 0.2.4","coffee-script":">=0.9.4"},"scripts":{"test":"make --silent test"},"repositories":[{"type":"git","url":"https://github.com/zdzolton/couch-cover.git"}],"directories":{"lib":"./lib"},"modules":{"main.js":"lib/main.js"},"files":[""],"_id":"CouchCover@0.0.4","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.2.6","_defaultsLoaded":true,"dist":{"shasum":"9a75294e054f65983e7e5acb9231c8781d3a3b71","tarball":"http://registry.npmjs.org/CouchCover/-/CouchCover-0.0.4.tgz"}},"0.0.5":{"name":"CouchCover","version":"0.0.5","description":"Provides a mock evironment for testing CouchDB design document functions","keywords":["CouchDB","mock","testing"],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"licenses":[{"type":"MIT"}],"engines":{"node":">= 0.2.4"},"scripts":{"test":"make --silent test"},"devDependencies":{"vows":"0.5.x","coffee-script":"1.x.x"},"repositories":[{"type":"git","url":"https://github.com/zdzolton/couch-cover.git"}],"main":"lib/main","files":["./lib"],"directories":{"lib":"./lib"},"_id":"CouchCover@0.0.5","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"80f0554e513f13de6a4ba665a2a9993319f661c5","tarball":"http://registry.npmjs.org/CouchCover/-/CouchCover-0.0.5.tgz"}},"0.0.6":{"name":"CouchCover","version":"0.0.6","description":"Provides a mock evironment for testing CouchDB design document functions","keywords":["CouchDB","mock","testing"],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"licenses":[{"type":"MIT"}],"engines":{"node":"0.6.x"},"scripts":{"test":"make --silent test"},"devDependencies":{"vows":"0.6.x","coffee-script":"1.x.x"},"repositories":[{"type":"git","url":"https://github.com/zdzolton/couch-cover.git"}],"main":"lib/main","files":["./lib"],"directories":{"lib":"./lib"},"_npmUser":{"name":"zdzolton","email":"zachary.zolton@gmail.com"},"_id":"CouchCover@0.0.6","dependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1fad9e27a37b36b2cbd53030de418f3b4f271ffb","tarball":"http://registry.npmjs.org/CouchCover/-/CouchCover-0.0.6.tgz"},"maintainers":[{"name":"zdzolton","email":"zachary.zolton@gmail.com"}]}},"maintainers":[{"name":"zdzolton","email":"zachary.zolton@gmail.com"}],"author":{"name":"Zachary Zolton","email":"zachary.zolton@gmail.com"},"time":{"modified":"2012-06-08T17:42:26.576Z","created":"2011-01-17T18:05:38.854Z","0.0.1":"2011-01-17T18:05:38.854Z","0.0.2":"2011-01-17T18:05:38.854Z","0.0.3":"2011-01-17T18:05:38.854Z","0.0.4":"2011-01-17T21:06:51.138Z","0.0.5":"2011-06-28T16:28:34.810Z","0.0.6":"2012-06-08T17:42:26.576Z"},"_attachments":{"CouchCover-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-TuUZFRvD1KsmVnb/qR4Jjw==","length":10240,"stub":true},"CouchCover-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-U2oy66+Co81yiEIjdJnT4g==","length":7064,"stub":true},"CouchCover-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IRlmtrz3NlhcKAB82yt3+A==","length":7744,"stub":true},"CouchCover-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PMc2U4uOctsyTMaKhD62Ow==","length":7509,"stub":true},"CouchCover-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TULkyVaRlBE9ZvpmxwtIXg==","length":7090,"stub":true},"CouchCover-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zehRdzrU+SsrGRrULRcWrg==","length":5129,"stub":true}}}},
{"id":"CouchDBChanges","key":"CouchDBChanges","value":{"rev":"9-79edbc0d5664385f487aca231901ed61"},"doc":{"_id":"CouchDBChanges","_rev":"9-79edbc0d5664385f487aca231901ed61","name":"CouchDBChanges","description":"Write CouchDB Changes Handlers. Easy.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"CouchDBChanges","version":"0.0.1","author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"description":"Write CouchDB Changes Handlers. Easy.","keywords":["couchdb","changes"],"homepage":"http://github.com/janl/couchdb-external-CouchDBChanges","repository":{"type":"git","url":"git://github.com/janl/couchdb-external-CouchDBChanges.git"},"engines":["node"],"main":"./CouchDBChanges.js","_npmUser":{"name":"jan","email":"jan@apache.org"},"_id":"CouchDBChanges@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"af98dc891185ac42047b33d725173e40d1e6a815","tarball":"http://registry.npmjs.org/CouchDBChanges/-/CouchDBChanges-0.0.1.tgz"},"maintainers":[{"name":"jan","email":"jan@apache.org"}]},"0.0.2":{"name":"CouchDBChanges","version":"0.0.2","author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"description":"Write CouchDB Changes Handlers. Easy.","keywords":["couchdb","changes"],"homepage":"http://github.com/janl/couchdb-external-CouchDBChanges","repository":{"type":"git","url":"git://github.com/janl/couchdb-external-CouchDBChanges.git"},"engines":["node"],"main":"./CouchDBChanges.js","dependencies":{"follow":"0.8.0"},"_npmUser":{"name":"jan","email":"jan@apache.org"},"_id":"CouchDBChanges@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"93ead46d4dd1a96e4e3a809fe008ac80dfc1f108","tarball":"http://registry.npmjs.org/CouchDBChanges/-/CouchDBChanges-0.0.2.tgz"},"maintainers":[{"name":"jan","email":"jan@apache.org"}]},"0.0.3":{"name":"CouchDBChanges","version":"0.0.3","author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"description":"Write CouchDB Changes Handlers. Easy.","keywords":["couchdb","changes"],"homepage":"http://github.com/janl/couchdb-external-CouchDBChanges","repository":{"type":"git","url":"git://github.com/janl/couchdb-external-CouchDBChanges.git"},"engines":["node"],"main":"./CouchDBChanges.js","dependencies":{"follow":"0.8.0"},"_npmUser":{"name":"jan","email":"jan@apache.org"},"_id":"CouchDBChanges@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"154c733f09ddfa9565355e6ed2090ad71a7d60bc","tarball":"http://registry.npmjs.org/CouchDBChanges/-/CouchDBChanges-0.0.3.tgz"},"maintainers":[{"name":"jan","email":"jan@apache.org"}]},"0.1.0":{"name":"CouchDBChanges","version":"0.1.0","author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"description":"Write CouchDB Changes Handlers. Easy.","keywords":["couchdb","changes"],"homepage":"http://github.com/janl/couchdb-external-CouchDBChanges","repository":{"type":"git","url":"git://github.com/janl/couchdb-external-CouchDBChanges"},"engines":["node"],"main":"./CouchDBChanges.js","dependencies":{"follow":"0.8.0"},"scripts":{"test":"mocha"},"devDependencies":{"mocha":"*","groc":"*"},"readme":"# Write CouchDB Changes Listeners. Easy.\n\n    var CouchDBChanges = require(\"CouchDBChanges\");\n    var config = {\n      url: \"http://127.0.0.1:5984/mydb\",\n      filter: \"pommes\",\n      persistent_since: true\n    };\n\n    var changes = new CouchDBChanges(config, function(error, change) {\n      // do dat change!\n    });\n\nWow, easy!\n\nCouchDB, The Definitive Guide has\n[a chapter on the Changes feed](http://guide.couchdb.org/draft/notifications.html).\n\n\n## Wha?\n\nCouchDB has this amazing feature called the “Changes Feed”. Think of\n`git log` for your database. There’s all sorts of awesome you can do\nwith this. For example, have a database called `outbox` and connect\na CouchDB changes listener to it and whenever your application creates\na new document, say\n\n    {\n        \"from\": \"me@example.com\",\n        \"to\": \"you@example.com\",\n        \"subject\": \"Hey there!\",\n        \"body\": \"I think you get the idea\"\n    }\n\nthe changes listener then gets notified right when the document gets\ncreated, but asynchronously from your application and send the email\nthat is described. When the email is sent, it can write back a new field\n\n    \"status\": \"sent\"\n\nor, if anything went wrong:\n\n    \"status\": \"error\",\n    \"error_message\": \"that email address is bogus you twat!\"\n\nthat the application can then use again to update the user interface accordingly.\n\nSo yeah, quick example, but there’s tons of things you can do with this.\nWe should collect nice examples, but for now you can check out\n<https://github.com/janl/couchdb-external-CreateUserDatabase>.\n\n## API\n\n`CouchDBChanges(config, change_cb)`\n\n * `config`\n   * `url`: string or url-object: URL to the database. Can include\n           a username and password.\n  * All parameters for the [follow library](follow)\n  * All parameters for the CouchDB Changes API.\n  * `follow_options`: (object) configurations for following {\n  * `persistent_since`: (bool) false whether or not to persist the\n                        latest `seq_id` from the server. This allows us\n                        to avoid processing a change more than once.\n\n * `change_cb`: (callable) function to call for each change\n\n\n## Next?\n\n* Make `persistent_since` storage configurable.\n\n\n## Thanks\n\nThis is just a very thin wrapper around Jason Smith’s / Iris Couch’s\nexcellent [`follow` library](follow).\n\nThanks Jason!\n\n[follow]: https://github.com/iriscouch/follow\n\n## License & Copyright\n\n(c) 2012 Jan Lehnardt <jan@apache.org>  \nLicensed under the Apache License 2.0.\n","_id":"CouchDBChanges@0.1.0","dist":{"shasum":"f123a7f322e975bf5afb13ec800ea827e4d5541f","tarball":"http://registry.npmjs.org/CouchDBChanges/-/CouchDBChanges-0.1.0.tgz"},"maintainers":[{"name":"jan","email":"jan@apache.org"}]}},"readme":"# Write CouchDB Changes Listeners. Easy.\n\n    var changes = require(\"CouchDBChanges\");\n    changes.follow(\"database\", function(change) {\n       // do whatever you want with the change.\n    });\n\nWow, easy!\n\nCouchDB, The Definitive Guide has\n[a chapter on the Changes feed](http://guide.couchdb.org/draft/notifications.html).\n\n\n## Wha?\n\nCouchDB has this amazing feature called the “Changes Feed”. Think of\n`git log` for your database. There’s all sorts of awesome you can do\nwith this. For example, have a database called `outbox` and connect\na CouchDB changes listener to it and whenever your application creates\na new document, say\n\n    {\n        \"from\": \"me@example.com\",\n        \"to\": \"you@example.com\",\n        \"subject\": \"Hey there!\",\n        \"body\": \"I think you get the idea\"\n    }\n\nthe changes listener then gets notified right when the document gets\ncreated, but asynchronously from your application and send the email\nthat is described. When the email is sent, it can write back a new field\n\n    \"status\": \"sent\"\n\nor, if anything went wrong:\n\n    \"status\": \"error\",\n    \"error_message\": \"that email address is bogus you twat!\"\n\nSo yeah, quick example, but there’s tons of things you can do with this.\nWe should collect nice examples, but for now you can check out\n<https://github.com/janl/couchdb-external-CreateUserDatabase>.\n\n## API\n\n`follow(database, change_cb, follow_options, changes_options)`\n\n * `database`: (string) name of the database\n * `change_cb`: (callable) function to call for each change\n * `follow_options`: (object) configurations for following {\n     persistent_since: (bool) false whether or not to persist the latest\n     `seq_id` from the server. This allows us to avoid processing a\n     change more than once.\n }\n * `changes_options`:  (object) parameters for CouchDB’s `_changes` API.\n   See <http://wiki.apache.org/couchdb/HTTP_database_API#Changes>.\n\n\n## Next?\n\n* Make `persistent_since` storage configurable.\n\n\n## Thanks\n\nThis is just a very thin wrapper around Jason Smith’s / Iris Couch’s\nexcellent [`follow` library](https://github.com/iriscouch/follow).\n\nThanks Jason!\n\n\n## License & Copyright\n\n(c) 2012 Jan Lehnardt <jan@apache.org>  \nLicensed under the Apache License 2.0.\n","maintainers":[{"name":"jan","email":"jan@apache.org"}],"time":{"modified":"2012-07-16T12:08:33.136Z","created":"2012-02-18T14:02:49.853Z","0.0.1":"2012-02-18T14:02:51.628Z","0.0.2":"2012-07-11T11:37:53.429Z","0.0.3":"2012-07-11T11:39:38.400Z","0.1.0":"2012-07-16T12:08:33.136Z"},"author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"repository":{"type":"git","url":"git://github.com/janl/couchdb-external-CouchDBChanges"},"_attachments":{"CouchDBChanges-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ZgDlKCmuZof240JicJBfIw==","length":51565,"stub":true},"CouchDBChanges-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9ujBCzsbiDFByHYq56RfDg==","length":1968,"stub":true},"CouchDBChanges-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hrcWEP2U8RJkWNLm9Hs/QQ==","length":1984,"stub":true},"CouchDBChanges-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Bb4hM8gB6gwR+3DwkkhCAg==","length":1958,"stub":true}}}},
{"id":"CouchDBExternal","key":"CouchDBExternal","value":{"rev":"3-e7b604d1dc6f3e1503439090e7f2756a"},"doc":{"_id":"CouchDBExternal","_rev":"3-e7b604d1dc6f3e1503439090e7f2756a","name":"CouchDBExternal","description":"Write CouchDB Externals. Easy.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"CouchDBExternal","version":"0.0.1","author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"description":"Write CouchDB Externals. Easy.","keywords":["couchdb","externals"],"homepage":"http://github.com/janl/node-CouchDBExternal","repository":{"type":"git","url":"git://github.com/janl/node-CouchDBExternal.git"},"engines":["node"],"main":"./CouchDBExternal.js","_npmUser":{"name":"jan","email":"jan@apache.org"},"_id":"CouchDBExternal@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9892d1794586074184be296b76c3c0b2cd451d8a","tarball":"http://registry.npmjs.org/CouchDBExternal/-/CouchDBExternal-0.0.1.tgz"},"readme":"","maintainers":[{"name":"jan","email":"jan@apache.org"}]}},"readme":"","maintainers":[{"name":"jan","email":"jan@apache.org"}],"time":{"modified":"2012-02-18T13:07:34.550Z","created":"2012-02-18T13:07:32.176Z","0.0.1":"2012-02-18T13:07:34.550Z"},"author":{"name":"Jan Lehnardt","email":"jan@apache.org"},"repository":{"type":"git","url":"git://github.com/janl/node-CouchDBExternal.git"},"_attachments":{"CouchDBExternal-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OVKvD4Q9nfxfxHXJT6+oMg==","length":575,"stub":true}}}},
{"id":"Critical","key":"Critical","value":{"rev":"19-f055eddd879d6019ea7eac222ff0c516"},"doc":{"_id":"Critical","_rev":"19-f055eddd879d6019ea7eac222ff0c516","name":"Critical","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","dist-tags":{"latest":"0.1.8"},"versions":{"0.1.0":{"name":"Critical","version":"0.1.0","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"35fe7fe8d3f7acdaf6355cf9dc9a6390f45bebd9","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.0.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.1":{"name":"Critical","version":"0.1.1","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"6becfe3bb7f81e93596cf74a42b81a13bc6e76c3","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.1.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.2":{"name":"Critical","version":"0.1.2","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"b4c6ae2b5aacbbdfc4f45d7f12887cefc4002910","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.2.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.3":{"name":"Critical","version":"0.1.3","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"079ca02a32294b4a16dd28ff835e78c0eaab0960","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.3.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.4":{"name":"Critical","version":"0.1.4","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"9c14a3272628d9535870e488bbb140608c765cfa","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.4.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.5":{"name":"Critical","version":"0.1.5","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"ab5989a90bc4d8b096190d7f346ebed26fadcb56","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.5.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.6":{"name":"Critical","version":"0.1.6","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.5"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"Critical@0.1.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"3404709e02de39b54f1606d00255cd1296952548","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.6.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.7":{"name":"Critical","version":"0.1.7","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.5"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"6c0feac0cb69b2f27214a16eeb2e3b39bcd52fe4","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.7.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Critical@0.1.7","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.1.8":{"name":"Critical","version":"0.1.8","description":"A callback and event system to allow critical blocks of code to request that the script delay exiting until it is finished executing.","main":"critical.js","dependencies":{"theBasics":"0.1.7"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"e36fa03a2551f3c571f2369a3320766150505a90","tarball":"http://registry.npmjs.org/Critical/-/Critical-0.1.8.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"Critical@0.1.8","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]}},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}],"time":{"modified":"2012-04-06T17:18:31.189Z","created":"2011-11-01T04:52:51.221Z","0.1.0":"2011-11-01T04:52:52.603Z","0.1.1":"2011-11-01T04:59:01.322Z","0.1.2":"2011-11-01T05:04:14.187Z","0.1.3":"2011-11-01T05:13:17.708Z","0.1.4":"2011-11-01T05:32:40.365Z","0.1.5":"2011-11-01T07:15:34.188Z","0.1.6":"2011-11-11T03:35:14.818Z","0.1.7":"2012-04-06T16:58:08.316Z","0.1.8":"2012-04-06T17:18:31.189Z"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com"},"repository":{"url":""},"_attachments":{"Critical-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-IB6a3ZrcC/oh9zVw7LY4/w==","length":1883,"stub":true},"Critical-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-M8+1rRveJ1g/ZVZDgs5avw==","length":1883,"stub":true},"Critical-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-7v8Id9wOJcDJ382Rwy5Kbg==","length":1746,"stub":true},"Critical-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-X1eyAEtrE+LJuWPYZK4owA==","length":1747,"stub":true},"Critical-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-yioAZEP5jelGB4B2gfkB+w==","length":1752,"stub":true},"Critical-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-raS2WyI61hOya1yXY5IOSw==","length":1731,"stub":true},"Critical-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ELwvFvFOZm5Z2DEHmgaPAw==","length":1764,"stub":true},"Critical-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-a9W58ITGyCQt5kzheL9q1Q==","length":1729,"stub":true},"Critical-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2OzYG/OPdJd1jyaXunUqeA==","length":1699,"stub":true}}}},
{"id":"Cron","key":"Cron","value":{"rev":"3-40d0305093da5a16cb166d52af51a424"},"doc":{"_id":"Cron","_rev":"3-40d0305093da5a16cb166d52af51a424","name":"Cron","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":"","name":"Cron","version":"0.0.0","repository":{"url":""},"engines":{"node":"~0.6.12"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ushus","email":"jithin.chandran@ushustech.com"},"_id":"Cron@0.0.0","_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"934393e9ad3e437a9f6410fcc64167a1e83346f1","tarball":"http://registry.npmjs.org/Cron/-/Cron-0.0.0.tgz"},"readme":"","maintainers":[{"name":"ushus","email":"jithin.chandran@ushustech.com"}]}},"readme":"","maintainers":[{"name":"ushus","email":"jithin.chandran@ushustech.com"}],"time":{"modified":"2012-05-08T06:18:51.601Z","created":"2012-05-08T06:18:44.434Z","0.0.0":"2012-05-08T06:18:51.601Z"},"repository":{"url":""},"_attachments":{"Cron-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-w1lbqYL38PUX53D+LbEwrQ==","length":2843,"stub":true}}}},
{"id":"Csster","key":"Csster","value":{"rev":"5-38eed3b32c3b0a14930c59c9faed6220"},"doc":{"_id":"Csster","_rev":"5-38eed3b32c3b0a14930c59c9faed6220","name":"Csster","description":"Csster: Write CSS in JS or Coffeescript, with macros, color math, etc.","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"Csster","description":"Csster: Write CSS in JS or Coffeescript, with macros, color math, etc.","version":"1.0.0","keywords":["css","color"],"licenses":[{"type":"MIT","url":"https://github.com/ndp/csster/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/ndp/csster.git"},"author":{"name":"Andrew Peterson","email":"andy@ndpsoftware.com"},"main":"./csster.js","engines":{"node":"*"},"_npmUser":{"name":"ndp","email":"andy@ndpsoftware.com"},"_id":"Csster@1.0.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0d7f76beee133b735a5a1199290298183b089adf","tarball":"http://registry.npmjs.org/Csster/-/Csster-1.0.0.tgz"},"readme":"","maintainers":[{"name":"ndp","email":"andy@ndpsoftware.com"}]},"1.0.1":{"name":"Csster","description":"Csster: Write CSS in JS or Coffeescript, with macros, color math, etc.","version":"1.0.1","keywords":["css","color"],"licenses":[{"type":"MIT","url":"https://github.com/ndp/csster/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/ndp/csster.git"},"author":{"name":"Andrew Peterson","email":"andy@ndpsoftware.com"},"main":"./csster.js","engines":{"node":"*"},"_npmUser":{"name":"ndp","email":"andy@ndpsoftware.com"},"_id":"Csster@1.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"874fde1f5cdcbecdc51c60565d7a098f2ffb5c72","tarball":"http://registry.npmjs.org/Csster/-/Csster-1.0.1.tgz"},"readme":"","maintainers":[{"name":"ndp","email":"andy@ndpsoftware.com"}]}},"readme":"","maintainers":[{"name":"ndp","email":"andy@ndpsoftware.com"}],"time":{"modified":"2012-01-31T05:54:54.518Z","created":"2012-01-31T05:50:11.527Z","1.0.0":"2012-01-31T05:50:58.366Z","1.0.1":"2012-01-31T05:54:54.518Z"},"author":{"name":"Andrew Peterson","email":"andy@ndpsoftware.com"},"repository":{"type":"git","url":"git://github.com/ndp/csster.git"},"_attachments":{"Csster-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5Dhynhj8ZVfuMEad+32LXA==","length":97031,"stub":true},"Csster-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a69cu5owlWf6mxcbuoAJtw==","length":97031,"stub":true}}}},
{"id":"Cuber","key":"Cuber","value":{"rev":"3-7b8a1db2552bcdb0d0b3bc3adfeca016"},"doc":{"_id":"Cuber","_rev":"3-7b8a1db2552bcdb0d0b3bc3adfeca016","name":"Cuber","description":"Rubik's cube model and solver.","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"Cuber","version":"0.2.0","author":{"name":"Patrick DeVivo","email":"patrick.devivo@gmail.com"},"description":"Rubik's cube model and solver.","contributors":[{"name":"Jeremy Bannister","email":"jeremy_bannister@hotmail.com"}],"repository":{"type":"git","url":"git://github.com/patrickdevivo/Cuber.git"},"dependencies":{"coffee-script":"1.2.x","zappa":"0.3.x","monk":"0.1.x","cli-table":"0.0.x","colorize":"0.1.x","prompt":"0.1.x","console-trace":"0.1.x","underscore":"1.3.x","underscore.string":"2.2.x"},"engines":{"node":"0.6.x","npm":"1.1.x"},"_npmUser":{"name":"patrickdevivo","email":"patrick.devivo@gmail.com"},"_id":"Cuber@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4607a1a3426fc9a6d2347916bb516a1f92c77a80","tarball":"http://registry.npmjs.org/Cuber/-/Cuber-0.2.0.tgz"},"maintainers":[{"name":"patrickdevivo","email":"patrick.devivo@gmail.com"}]}},"readme":"##Cuber.coffee\nModel of a 3x3 Rubik's cube written in CoffeeScript\n\n### Usage\n**Require Cuber**: \n`Cuber = require './cuber.coffee'`\n\n\n**Initialize a cube**: \n`cube = new Cube \"Patrick\\'s Rubik\\'s Cube\"\"`\n\n\n**Display cube**: \n`cube.display()`\n\n\n**Scramble cube**: \n`cube.scramble(100)` (100 random turns)\n\n\n**Check if a cube is solver**: \n`cube.check()`\n\n**Cheat**\n`cube.cheat()` *reverses all previous moves to return to starting (solved) state*\n\n**Turn a face**\n`cube.white.cw()`\nor\n`cube.turn('white', 'cw)`\nor\n`cube.turn('w')` *lowercase means clockwise, uppercase means counter-clockwise*\n\n**Solver**\n`solver = new Solver cube`","maintainers":[{"name":"patrickdevivo","email":"patrick.devivo@gmail.com"}],"time":{"modified":"2012-05-17T01:10:03.826Z","created":"2012-05-17T01:10:03.456Z","0.2.0":"2012-05-17T01:10:03.826Z"},"author":{"name":"Patrick DeVivo","email":"patrick.devivo@gmail.com"},"repository":{"type":"git","url":"git://github.com/patrickdevivo/Cuber.git"},"_attachments":{"Cuber-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ktXYncbAvL5fHdwaZHEixA==","length":18803,"stub":true}}}},
{"id":"DOM","key":"DOM","value":{"rev":"7-9f5dd4d7eb04d0d3ba2f4bd42ae9433a"},"doc":{"_id":"DOM","_rev":"7-9f5dd4d7eb04d0d3ba2f4bd42ae9433a","name":"DOM","description":"Templating without HTML.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Arpith Siromoney","email":"arpith@shelf.name","url":"http://twitter.com/arpith"},"name":"DOM","description":"Template engine without the HTML.","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arpith/DOM.js.git"},"engines":{"node":"~0.6.17"},"main":"DOM.js","_npmUser":{"name":"arpith","email":"arpith@shelf.name"},"_id":"DOM@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b7e9b401bad91f0b1e85916d9364db3cd372f6e4","tarball":"http://registry.npmjs.org/DOM/-/DOM-0.0.1.tgz"},"readme":"","maintainers":[{"name":"arpith","email":"arpith@shelf.name"}]},"0.0.2":{"author":{"name":"Arpith Siromoney","email":"arpith@shelf.name","url":"http://twitter.com/arpith"},"name":"DOM","description":"Templating without HTML. Eventually.","version":"0.0.2","repository":{"type":"git","url":"git://github.com/arpith/DOM.js.git"},"engines":{"node":"~0.6.17"},"main":"DOM.js","_npmUser":{"name":"arpith","email":"arpith@shelf.name"},"_id":"DOM@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2b3bf18bb32fee9d1058886becd80c95e8531130","tarball":"http://registry.npmjs.org/DOM/-/DOM-0.0.2.tgz"},"readme":"","maintainers":[{"name":"arpith","email":"arpith@shelf.name"}]},"0.0.3":{"author":{"name":"Arpith Siromoney","email":"arpith@shelf.name","url":"http://twitter.com/arpith"},"name":"DOM","description":"Templating without HTML.","version":"0.0.3","repository":{"type":"git","url":"git://github.com/arpith/DOM.js.git"},"engines":{"node":"~0.6.17"},"main":"DOM.js","_npmUser":{"name":"arpith","email":"arpith@shelf.name"},"_id":"DOM@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"241ae6ef0286f10ebc3be80f6c5111047ab803da","tarball":"http://registry.npmjs.org/DOM/-/DOM-0.0.3.tgz"},"readme":"","maintainers":[{"name":"arpith","email":"arpith@shelf.name"}]}},"readme":"","maintainers":[{"name":"arpith","email":"arpith@shelf.name"}],"time":{"modified":"2012-05-12T17:31:55.512Z","created":"2012-05-12T12:54:21.688Z","0.0.1":"2012-05-12T12:54:21.897Z","0.0.2":"2012-05-12T17:09:57.189Z","0.0.3":"2012-05-12T17:31:55.512Z"},"author":{"name":"Arpith Siromoney","email":"arpith@shelf.name","url":"http://twitter.com/arpith"},"repository":{"type":"git","url":"git://github.com/arpith/DOM.js.git"},"_attachments":{"DOM-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mIBRNxIF3zRX0oYQUwvIKQ==","length":585,"stub":true},"DOM-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nwDqObK+/L20qqQIHeSAIg==","length":583,"stub":true},"DOM-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tD38jqttDQJbkSK1KuFKfA==","length":577,"stub":true}}}},
{"id":"DOM-js","key":"DOM-js","value":{"rev":"8-748cdc96566a7b65bbd0b12be2eeb386"},"doc":{"_id":"DOM-js","_rev":"8-748cdc96566a7b65bbd0b12be2eeb386","name":"DOM-js","description":"DOM based web framework","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"DOM-js","description":"DOM based web framework","version":"0.0.1","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com"}],"dependencies":{"socket.io":"0.7.7","jsdom":"0.2.1","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.9"},"keywords":["framework","dom","web"],"repository":{"type":"git","url":"git://github.com/Raynos/DOM-js.git"},"main":"index","scripts":{},"engines":{"node":"0.5.2"},"_npmJsonOpts":{"file":"/root/.npm/DOM-js/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"DOM-js@0.0.1","_engineSupported":false,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"064e8d52478da0c9479d835be4a2ca7ed5eee9e4","tarball":"http://registry.npmjs.org/DOM-js/-/DOM-js-0.0.1.tgz"}},"0.0.2":{"name":"DOM-js","description":"DOM based web framework","version":"0.0.2","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com"}],"dependencies":{"socket.io":"0.7.7","jsdom":"0.2.1","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.9"},"keywords":["framework","dom","web"],"repository":{"type":"git","url":"git://github.com/Raynos/DOM-js.git"},"main":"index","scripts":{},"engines":{"node":"0.5.2"},"_npmJsonOpts":{"file":"/home/raynos/.npm/DOM-js/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"DOM-js@0.0.2","_engineSupported":false,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"2554a07c29fd3eca47496b0782d3c019184e8d78","tarball":"http://registry.npmjs.org/DOM-js/-/DOM-js-0.0.2.tgz"}},"0.0.3":{"name":"DOM-js","description":"DOM based web framework","version":"0.0.3","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com"}],"dependencies":{"socket.io":"0.7.7","jsdom":"0.2.1","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.9"},"keywords":["framework","dom","web"],"repository":{"type":"git","url":"git://github.com/Raynos/DOM-js.git"},"main":"index","scripts":{},"engines":{"node":"0.5.2"},"_npmJsonOpts":{"file":"/home/raynos/.npm/DOM-js/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"DOM-js@0.0.3","_engineSupported":false,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"05ee8e3cd8658a7e293e253d9db9081ed00ea870","tarball":"http://registry.npmjs.org/DOM-js/-/DOM-js-0.0.3.tgz"}},"0.0.4":{"name":"DOM-js","description":"DOM based web framework","version":"0.0.4","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com"}],"dependencies":{"socket.io":"0.7.7","jsdom":"0.2.1","underscore":"1.1.7"},"devDependencies":{"vows":"0.5.9"},"keywords":["framework","dom","web"],"repository":{"type":"git","url":"git://github.com/Raynos/DOM-js.git"},"main":"index","scripts":{},"engines":{"node":"0.5.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/DOM-js/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"DOM-js@0.0.4","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"13718c75ffecb93f973f7bff1aa366ff6a8133f7","tarball":"http://registry.npmjs.org/DOM-js/-/DOM-js-0.0.4.tgz"}}},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2011-07-23T20:11:27.066Z","created":"2011-07-23T19:08:12.934Z","0.0.1":"2011-07-23T19:09:05.770Z","0.0.2":"2011-07-23T19:23:42.507Z","0.0.3":"2011-07-23T20:06:53.608Z","0.0.4":"2011-07-23T20:11:27.066Z"},"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/DOM-js.git"},"_attachments":{"DOM-js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-63x8hxLhV11SWQHIl9X2nA==","length":3079,"stub":true},"DOM-js-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-2C3poazgiOkHzisiwZLRwQ==","length":3029,"stub":true},"DOM-js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Y+VST9UZkM+viV1p0Ue+MQ==","length":2796,"stub":true}}}},
{"id":"DOMBuilder","key":"DOMBuilder","value":{"rev":"43-3e008bdd3bffff142c3570944c6429a2"},"doc":{"_id":"DOMBuilder","_rev":"43-3e008bdd3bffff142c3570944c6429a2","name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","dist-tags":{"latest":"2.1.6"},"versions":{"1.4.1":{"name":"DOMBuilder","version":"1.4.1","description":"Builder library - generate HTML or DOM Elements (mostly) interchangeably","keywords":["DOM","HTML","builder","fragments"],"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"homepage":"http://readthedocs.org/docs/dombuilder/en/1.4.1/index.html","main":"./DOMBuilder.js","files":["./DOMBuilder.js","package.json"],"repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"_id":"DOMBuilder@1.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.13","_nodeVersion":"v0.4.2","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"a5795afe37c12a9c3207dfa22b8ecd4ed164ef02","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-1.4.1.tgz"}},"1.4.2":{"name":"DOMBuilder","version":"1.4.2","description":"Builder library - generate HTML or DOM Elements (mostly) interchangeably","tags":["DOM","HTML","builder","fragments"],"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"homepage":"http://readthedocs.org/docs/dombuilder/en/1.4.2/index.html","main":"./DOMBuilder.js","files":["./DOMBuilder.js","package.json"],"repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"_id":"DOMBuilder@1.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"e3fee6707649c92f2e62e6ef4bb2f023c2379caa","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-1.4.2.tgz"}},"1.4.3":{"name":"DOMBuilder","version":"1.4.3","description":"Builder library - generate HTML or DOM Elements (mostly) interchangeably","tags":["DOM","HTML","builder","fragments"],"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"homepage":"http://readthedocs.org/docs/dombuilder/en/1.4.2/index.html","main":"./DOMBuilder.js","files":["./DOMBuilder.js","package.json"],"repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"_id":"DOMBuilder@1.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"4bd3fbb2cdf2699fdc135e334ac0d5c647ec38e0","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-1.4.3.tgz"}},"1.4.4":{"name":"DOMBuilder","version":"1.4.4","description":"Builder library - generate HTML or DOM Elements (mostly) interchangeably","tags":["DOM","HTML","builder","fragments"],"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"homepage":"http://readthedocs.org/docs/dombuilder/en/1.4.2/index.html","main":"./DOMBuilder.js","files":["./DOMBuilder.js"],"repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"_id":"DOMBuilder@1.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"25a57c607d2b5460e38fe2826ebdb4ed765edc62","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-1.4.4.tgz"},"directories":{}},"2.0.0":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.0.0","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["HTML","builder"],"homepage":"http://readthedocs.org/docs/dombuilder/en/latest/","main":"index","repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"dependencies":{},"devDependencies":{},"_id":"DOMBuilder@2.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"f64e4fba04cfada1a8fbcdf141846c8d1a04521c","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.0.0.tgz"},"scripts":{},"directories":{}},"2.0.1":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.0.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["HTML","builder"],"homepage":"http://readthedocs.org/docs/dombuilder/en/latest/","main":"index","repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"_npmJsonOpts":{"file":"/home/insin/.npm/DOMBuilder/2.0.1/package/package.json","serverjs":false,"wscript":false,"contributors":false},"_id":"DOMBuilder@2.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.20","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"7b2e53a25bdef4f7a8a1363d9cb5c224d25c45eb","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.0.1.tgz"},"scripts":{},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"2.1.0":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.0","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qunit":"0.2.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"DOMBuilder@2.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"6bb3d1961a29f09c067d71025a299310e92b022e","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.0.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"2.1.1":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.1.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"DOMBuilder@2.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"e870ff1b092c536f9bb8b52e7de83ee3dc46c5d1","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.1.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"directories":{}},"2.1.2":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.2","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.1.x","Concur":"0.2.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"DOMBuilder@2.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"546f82e3fe42c25a92467d328bb5892969ab9a9b","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.2.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"2.1.3":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.3","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"git://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.1.x","Concur":"0.2.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"DOMBuilder@2.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ba801878686eb245de2507e7c545b436f44894d2","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.3.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"2.1.4":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.4","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"https://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.1.x","Concur":"0.2.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"readme":"","_id":"DOMBuilder@2.1.4","dist":{"shasum":"99a4722f87d588aca521d96c7a7f08fbccdc9c33","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.4.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"2.1.5":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.5","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"https://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.1.x","Concur":"0.2.x"},"devDependencies":{"qqunit":"0.1.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"readme":"","_id":"DOMBuilder@2.1.5","dist":{"shasum":"28e6857a58481c0e3817a0ce09e1f16b8bf8cdbf","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.5.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"2.1.6":{"name":"DOMBuilder","description":"Builder library - generate HTML with an API which is also usable in the browser","version":"2.1.6","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["dualsided","DOM","HTML","builder","templates"],"main":"./lib/dombuilder","repository":{"type":"git","url":"https://github.com/insin/DOMBuilder.git"},"dependencies":{"isomorph":"0.2.x","Concur":"0.2.x"},"devDependencies":{"qqunit":"0.4.x","buildumb":"0.1.x"},"scripts":{"test":"node tests/tests.js"},"readme":"","_id":"DOMBuilder@2.1.6","dist":{"shasum":"c662e87649add50c75499e11cf43ba6474f24b6a","tarball":"http://registry.npmjs.org/DOMBuilder/-/DOMBuilder-2.1.6.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]}},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"time":{"modified":"2012-06-29T05:47:23.968Z","created":"2011-03-04T03:36:33.180Z","1.4.1":"2011-03-04T03:36:33.567Z","1.4.2":"2011-04-11T23:42:53.288Z","1.4.3":"2011-04-26T20:49:12.289Z","1.4.4":"2011-05-19T13:19:49.450Z","2.0.0-pre":"2011-07-17T00:03:56.316Z","2.0.0":"2011-07-17T01:25:21.927Z","2.0.1":"2011-08-06T01:46:42.185Z","2.1.0alpha1":"2011-08-18T21:55:28.516Z","2.1.0":"2012-01-30T06:16:35.059Z","2.1.1":"2012-02-01T23:52:45.202Z","2.1.2":"2012-05-30T00:12:22.503Z","2.1.3":"2012-05-31T00:56:13.202Z","2.1.4":"2012-06-27T03:47:04.540Z","2.1.5":"2012-06-27T03:56:15.033Z","2.1.6":"2012-06-29T05:47:23.968Z"},"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"repository":{"type":"git","url":"https://github.com/insin/DOMBuilder.git"},"_attachments":{"DOMBuilder-2.1.6.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-IU6Mabb1IOpGOxOMB0Odcw==","length":21560,"stub":true},"DOMBuilder-2.1.5.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-VVDKLtTgcP9M1FXN1Bg81w==","length":21571,"stub":true},"DOMBuilder-2.1.4.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-WUGz3xFjWriUWqYUGY0Vnw==","length":21569,"stub":true},"DOMBuilder-2.1.3.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-icROKz1MYAzCoGkhyIH2Kg==","length":21211,"stub":true},"DOMBuilder-2.1.2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-CaB+qyqQSzd0EDZheFAShQ==","length":21201,"stub":true},"DOMBuilder-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-u6IEMNdp2OjgNWXHzHRq1A==","length":21403,"stub":true},"DOMBuilder-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-LJ8KjKf3BE/PIxxOWsokFg==","length":21142,"stub":true},"DOMBuilder-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-CPICYYKY5abo6cMT9PBiXw==","length":12616,"stub":true},"DOMBuilder-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-HynM6fQ9bEznijjalbcsFA==","length":11624,"stub":true},"DOMBuilder-1.4.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-5onZBO7e2+V51oaHk962BA==","length":184437,"stub":true},"DOMBuilder-1.4.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YtG9QbbAyKqXqCsXOebghQ==","length":8096,"stub":true},"DOMBuilder-1.4.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GKB6QkMgVJs5I4mA3twI2Q==","length":8090,"stub":true},"DOMBuilder-1.4.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1qCa6cQrg8aiu1Nzd7La0Q==","length":7843,"stub":true}}}},
{"id":"DataIQ","key":"DataIQ","value":{"rev":"3-9146750160e1023e50a5deddc50e852b"},"doc":{"_id":"DataIQ","_rev":"3-9146750160e1023e50a5deddc50e852b","name":"DataIQ","description":"","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"DataIQ","description":"","version":"0.0.0","repository":{"url":""},"dependencies":{"siq-mesh":"0.0.x","bedrockjs":"0.0.x","gloss":"0.0.x","siq-js-component":"0.0.x","siq-vendor-js":"0.0.x","siq-lookandfeel":"0.0.x"},"_npmUser":{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"},"_id":"DataIQ@0.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e80da13c1442617af142d2a8de9fecac8fa17746","tarball":"http://registry.npmjs.org/DataIQ/-/DataIQ-0.0.0.tgz"},"maintainers":[{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"}]}},"readme":"# `DataIQ`\n\nthe future.\n","maintainers":[{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"}],"time":{"modified":"2012-04-23T17:11:01.890Z","created":"2012-04-23T17:10:59.105Z","0.0.0":"2012-04-23T17:11:01.890Z"},"repository":{"url":""},"_attachments":{"DataIQ-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XeagE8pakMLT+ztCxrHLlg==","length":5718,"stub":true}}}},
{"id":"DateValidator","key":"DateValidator","value":{"rev":"15-a40d271876a696da3e5319d965e0254a"},"doc":{"_id":"DateValidator","_rev":"15-a40d271876a696da3e5319d965e0254a","name":"DateValidator","description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","dist-tags":{"latest":"1.0.5"},"versions":{"0.0.1":{"name":"DateValidator","version":"0.0.1","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"DateValidator@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"d6d89533aacbc0ddb4cd171b1841b219eecb209d","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-0.0.1.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.0":{"name":"DateValidator","version":"1.0.0","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","homepage":"https://github.com/JamesEggers1/node-DateValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"DateValidator@1.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"0f0750ba8cf9637e98a345f6bfb8d7fdf01cb727","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-1.0.0.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.1":{"name":"DateValidator","version":"1.0.1","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","homepage":"https://github.com/JamesEggers1/node-DateValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"make test"},"tags":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"devDependencies":{"should":"*","mocha":"*"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"DateValidator@1.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b69f26e29071d0b7e6ebfc6ba7c7fe247e13db66","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-1.0.1.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.2":{"name":"DateValidator","version":"1.0.2","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","homepage":"https://github.com/JamesEggers1/node-DateValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"mocha tests/date-validator-tests.js -R spec"},"tags":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.0"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"DateValidator@1.0.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7d9ebcd25013b7e251595d53c6f10918990209fa","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-1.0.2.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.3":{"name":"DateValidator","version":"1.0.3","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","homepage":"https://github.com/JamesEggers1/node-DateValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"mocha tests/date-validator-tests.js -R spec"},"tags":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.1"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"DateValidator@1.0.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"76cecaa79adca626bb0f5f09775225da9984e147","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-1.0.3.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.4":{"name":"DateValidator","version":"1.0.4","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","homepage":"https://github.com/JamesEggers1/node-DateValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"mocha tests/date-validator-tests.js -R spec"},"keywords":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.1"},"_npmUser":{"name":"JamesEggers","email":"james.r.eggers@gmail.com"},"_id":"DateValidator@1.0.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"39333d2debc5084f4ac497538da707051c67bbcc","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-1.0.4.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]},"1.0.5":{"name":"DateValidator","version":"1.0.5","author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"description":"A very simple date validator for handling year, month, and day values.  The package works as a node module as well as in a browser.","homepage":"https://github.com/JamesEggers1/node-DateValidator","repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"main":"./src/date-validator","engines":{"node":"*"},"scripts":{"test":"mocha tests/date-validator-tests.js -R spec","client-install":"node bin/client-install.js","install":"node bin/client-install-directions.js","update":"node bin/client-install-directions.js"},"keywords":["date","validation","browser"],"bugs":{"url":"https://github.com/JamesEggers1/node-DateValidator/issues"},"devDependencies":{"should":"0.6.3","mocha":"1.2.1"},"readme":"DateValidator  [![Build Status](https://secure.travis-ci.org/JamesEggers1/node-DateValidator.png)](http://travis-ci.org/JamesEggers1/node-DateValidator)\n==============\n\nThe DateValidator project is to create a simple Date validator for both client-side and server-side JavaScript. At the moment, the goal is to keep things small and focus only on ensuring Day, Month, and Year are valid.  It is not intended to have the power of the node-dateutils project.\n\n## Installation ##\n\n    npm install DateValidator\n\n## Testing the Package ##\n\nOnce the package is installed, you can run the unit tests associated with the package also using NPM.\n\n    npm test DateValidator\n\n## Node Usage ##\n\nDateValidator at the moment provides an object with a single method `validate`.  The `validate` method expects a year, month, and day string parameters and will validate based on such.\n\n```javascript\nvar date_validator = require(\"DateValidator\").DateValidator;\nvar is_valid = date_validator.validate(\"2012\", \"12\", \"31\"); //true\n```\n\n## Using Luhn Client-Side ##\nIn addition to being usable as a Node.js module, the validator can also be used client-side in the user's web browser.  When you install `DateValidator` using `npm`, instructions will appear how to install it for client-side JavaScript consumption.\n\nWhile you can copy the `date-validator.js` file from the module's installation directory under `node_modles`, an automated script has been provided to assist you in this copy process and to make it more streamlined.  To do a client-side install, simply type the following `npm` command:\n\n    npm run-script DateValidator client-install\n\nOnce you run that command, you'll be prompted to provide the path to which to install `date-validator.js` for use by your client-side JavaScript.  At that point, you can reference the file in your html and JavaScript code as shown below.\n\n\n#### Html ####\n\n```html\n<script type=\"text/javascript\" src=\"path/to/date-validator.js\"></script>\n```\n\n#### JavaScript ####\n\n```javascript\nvar validator = DateValidator;\nvar is_valid = date_validator.validate(\"2012\", \"12\", \"31\"); //true\n```\n\nBy default, the DateValidator module places itself into the global scope in the browser.  If you would prefer to NOT have it be directly attached to the `window` object, you can add your own `namespace` at the top of the date-validator.js file.\n\t\n## False Conditions ##\n\t\nThe `validate` method will return `false` for the following conditions:\n- if any parameter is `undefined`\n- if any parameter is not numeric\n- if any parameter is less than or equal to (<=) 0\n- if the month is greater than 12\n- if the day is invalid for the provided month (i.e. Feb 31);\n\n## License (MIT) ##\nCopyright (c) 2012 James Eggers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"DateValidator@1.0.5","dist":{"shasum":"83c854370273c51633dc7e50468b5e59afc610ec","tarball":"http://registry.npmjs.org/DateValidator/-/DateValidator-1.0.5.tgz"},"maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}]}},"readme":"DateValidator\n==============\n\nThe DateValidator project is to create a simple Date validator for both client-side and server-side JavaScript. At the moment, the goal is to keep things small and focus only on ensuring Day, Month, and Year are valid.  It is not intended to have the power of the node-dateutils project.\n\n## Installation ##\n\nComing Soon\n\n## Testing the Package ##\n\nOnce the package is installed, you can run the unit tests associated with the package also using NPM.\n\n    npm test DateValidator\n\n## Usage ##\n\nComing Soon","maintainers":[{"name":"JamesEggers","email":"james.r.eggers@gmail.com"}],"time":{"modified":"2012-08-08T01:42:11.108Z","created":"2012-05-29T13:52:22.278Z","0.0.1":"2012-05-29T13:52:31.638Z","1.0.0":"2012-06-15T14:51:13.101Z","1.0.1":"2012-06-17T00:47:05.100Z","1.0.2":"2012-06-24T02:54:43.642Z","1.0.3":"2012-06-26T14:05:47.210Z","1.0.4":"2012-07-02T19:48:22.817Z","1.0.5":"2012-08-08T01:42:11.108Z"},"author":{"name":"James Eggers","email":"james.r.eggers@gmail.com","url":"http://www.jamesreggers.com/"},"repository":{"type":"git","url":"git://github.com/JamesEggers1/node-DateValidator.git"},"_attachments":{"DateValidator-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-6rEB2J2jP0Hj5lUiTIPDhA==","length":4635,"stub":true},"DateValidator-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+k1Xm+Ojc4EsWCoiEcGm6A==","length":3206,"stub":true},"DateValidator-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-TAvy/7tGgDDeftS6Dw0b/g==","length":3114,"stub":true},"DateValidator-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-0sRvt3wDvy+nv/ofVIIGlA==","length":3112,"stub":true},"DateValidator-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PisgZnXAYrxNUBovvTaAHw==","length":3134,"stub":true},"DateValidator-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-U+JkaISRc86smZ7zLU00WQ==","length":3093,"stub":true},"DateValidator-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/I2BkR4iaJcxeVR2jadoCA==","length":1937,"stub":true}}}},
{"id":"DateZ","key":"DateZ","value":{"rev":"15-69d8115a9bd521e614eaad3cf2611264"},"doc":{"_id":"DateZ","_rev":"15-69d8115a9bd521e614eaad3cf2611264","name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","version":"0.0.1","directories":{"lib":"./lib"},"main":"index","author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"http://github.com/tomouniversalis/DateZ.git"},"_id":"DateZ@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.2.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d23f5847bd44164cd7644fbdbeae0c476d9bb229","tarball":"http://registry.npmjs.org/DateZ/-/DateZ-0.0.1.tgz"}},"0.0.2":{"name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","version":"0.0.2","directories":{"lib":"./lib"},"main":"index","author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"https://github.com/tomouniversalis/DateZ"},"_id":"DateZ@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.2.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fc4d430401d39453e9782d1188979c711c55ca3b","tarball":"http://registry.npmjs.org/DateZ/-/DateZ-0.0.2.tgz"}},"0.0.3":{"name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","version":"0.0.3","directories":{"lib":"./lib"},"main":"index","author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"https://github.com/tomouniversalis/DateZ"},"_id":"DateZ@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.2.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e1f4bb5fccb8c8a2453fed022d4e9ffb31c8e352","tarball":"http://registry.npmjs.org/DateZ/-/DateZ-0.0.3.tgz"}},"0.0.4":{"name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","version":"0.0.4","directories":{"lib":"./lib"},"main":"index","author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"https://github.com/tomouniversalis/DateZ"},"_id":"DateZ@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"645d114533548eb1368cca9598217fcb12e04cbf","tarball":"http://registry.npmjs.org/DateZ/-/DateZ-0.0.4.tgz"}},"0.0.5":{"name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","version":"0.0.5","directories":{"lib":"./lib"},"main":"index","author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"https://github.com/tomouniversalis/DateZ"},"_id":"DateZ@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f35db942fdd77297485cfb1ebab24e1e1e0b0a92","tarball":"http://registry.npmjs.org/DateZ/-/DateZ-0.0.5.tgz"}},"0.0.6":{"name":"DateZ","description":"A wrapper object for the javascript built-in Date object with the missing setTimeZoneOffset() method enhancement.","version":"0.0.6","directories":{"lib":"./lib"},"main":"index","author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"https://github.com/tomouniversalis/DateZ"},"_id":"DateZ@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6b50af7ce6b8fd0bb73894f0d1ac1f43420c09e6","tarball":"http://registry.npmjs.org/DateZ/-/DateZ-0.0.6.tgz"}}},"maintainers":[{"name":"tomouniversalis","email":"nagasawa@tomouniversalis.com"}],"time":{"modified":"2011-02-15T14:54:38.056Z","created":"2011-02-12T18:51:34.126Z","0.0.1":"2011-02-12T18:51:34.823Z","0.0.2":"2011-02-13T03:01:31.500Z","0.0.3":"2011-02-14T22:57:07.989Z","0.0.4":"2011-02-15T14:39:56.401Z","0.0.5":"2011-02-15T14:41:52.542Z","0.0.6":"2011-02-15T14:50:51.834Z"},"author":{"name":"Tomo Universalis","email":"nagasawa@tomouniversalis.com"},"repository":{"type":"git","url":"https://github.com/tomouniversalis/DateZ"},"_attachments":{"DateZ-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-72ndW4bwPxGlRpDTmgRAsA==","length":3773,"stub":true},"DateZ-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mbP9fdQNF78yBKzdtcMEYw==","length":3431,"stub":true}}}},
{"id":"Dateselect","key":"Dateselect","value":{"rev":"3-6511567a876d8fe15724bbc7f247214c"},"doc":{"_id":"Dateselect","_rev":"3-6511567a876d8fe15724bbc7f247214c","name":"Dateselect","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"David Björklund","email":"davidbj@kth.se","url":"http://davidbjorklund.se"},"name":"Dateselect","version":"0.0.1","repository":{"url":"git://github.com/kesla/dateselect.git","type":"git"},"engines":{"node":"v0.4.x"},"dependencies":{"nko":"0.1.1","underscore":"1.1.7","node-static":"~0.5.9","socket.io":"~0.7.11"},"devDependencies":{"vows":"0.5.11","colors":"0.5.0"},"_npmJsonOpts":{"file":"/home/david/.npm/Dateselect/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Dateselect@0.0.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"12078da94912ec5393c38ce7afcd86e48d99d7b9","tarball":"http://registry.npmjs.org/Dateselect/-/Dateselect-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"kesla","email":"david.bjorklund@gmail.com"}]}},"maintainers":[{"name":"kesla","email":"david.bjorklund@gmail.com"}],"time":{"modified":"2011-08-28T15:16:00.679Z","created":"2011-08-28T15:15:58.996Z","0.0.1":"2011-08-28T15:16:00.679Z"},"author":{"name":"David Björklund","email":"davidbj@kth.se","url":"http://davidbjorklund.se"},"repository":{"url":"git://github.com/kesla/dateselect.git","type":"git"},"_attachments":{"Dateselect-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VOcWZ8HY8v+zot51mbc6vw==","length":19109,"stub":true}}}},
{"id":"Davis","key":"Davis","value":{"rev":"3-21ee2f54de8491b40b44298eafd25d94"},"doc":{"_id":"Davis","_rev":"3-21ee2f54de8491b40b44298eafd25d94","name":"Davis","description":"Simple, degradable JavaScript routing using HTML5 pushState.","dist-tags":{"latest":"0.8.2"},"versions":{"0.8.2":{"name":"Davis","description":"Simple, degradable JavaScript routing using HTML5 pushState.","version":"0.8.2","keywords":["pushState","routing","ender"],"homepage":"http://davisjs.com","authors":["Oliver Nightingale"],"repository":{"type":"git","url":"git://github.com/olivernn/davis.js.git"},"dependencies":{"jeesh":"*","valentine":">= 1.5.x"},"devDependencies":{"dox":">= 0.3.0","dox-template":"*"},"main":"./davis.js","_npmUser":{"name":"olivernn","email":"oliver.nightingale1@gmail.com"},"_id":"Davis@0.8.2","scripts":{"start":"node server.js"},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"0ada47ba1cb5965dacf7caeed382c3b737c65c94","tarball":"http://registry.npmjs.org/Davis/-/Davis-0.8.2.tgz"},"maintainers":[{"name":"olivernn","email":"oliver.nightingale1@gmail.com"}]}},"readme":"# Davis.js\n\n## Description\n\nDavis.js is a small JavaScript library using HTML5 history.pushState that allows simple Sinatra style routing for your JavaScript apps.\n\n## Why\n\nUsing the history pustState and popstate events allows the links and forms in your app to have hrefs and actions that point to real end points on your server.  This allows complex JavaScript apps to degrade gracefully when JavaScript is unavailable and combining this with a template system that can be used both client and server side allows for large amounts of code reuse.\n\nDavis.js is heavily inspired by [Sammy.js](https://github.com/quirkey/sammy) (hence the name), it is however intentionally much lighter than Sammy.js because I never use any of the template rendering etc that it includes.  All Davis.js does is provide a simple routing layer, nothing more, nothing less.\n\n## Requirements\n\nDavis.js requires jQuery 1.4.2+ as well as a modern browser that supports HTML5 history.pushState and the onpopstate event.  At the moment that means FireFox 4+, Safari 5+, Chrome, iOS Safari 4+*, Android Browser 2.2+, Opera 11.50+.\n\nIn all other browsers Davis.js is currently unsupported, all links and forms will have their default behaviour.  You can bind to the 'unsupported' event on an app to handle this situation in your code.  Fallback to `location.hash` and `onhashchange` is a possibility in the future.\n\n*Whilst pushState is supported in iOS it has several, fairly serious bugs.  Davis will not fire the unsupported event though as _technically_ iOS does support davis.\n\n## Installation\n\nDownload davis.min.js and include it on your page after jquery.\n\n## Example\n\nA very simple example of a Davis.js app:\n\n    var app = Davis(function () {\n      this.get('/welcome/:name', function (req) {\n        $('body').append('<h1>Hello there, ' + req.params['name'] + '!</h1>')\n      })\n    })\n    \n    $(document).ready(function () {\n      // append a link to trigger the route\n      $('body').append('<a href=\"/welcome/bob\">Greet</a>');\n      \n      app.start();\n    })\n\nWe create a new instance of a Davis.App using the Davis.js function, passing in a function that will draw the routes for the application.  Inside this function `this` is the instance of our application.\n\nWe define a simple get route with a 'name' parameter and a callback that will append a message to the html body.  Inside the route callback `this` is set to the request that matches the route, this request is also passed as a parameter to the callback.\n\nOnce the app is configure it needs to be started.  You start a Davis.js app by calling the `start` method, this must be done once the document is ready.  Now if you click on the link that we appended to the body our route should be called and a friendly greeting printed on the page.\n\nTo use Davis your html file must be loaded from a server rather than just opening the file in your browser.\n\n## More\n\n[API docs](http://olivernn.github.com/davis.js/docs)\n\n[Example](http://davis-example.heroku.com/notes) using davis.js and a mustache templates shared between the client and the server, [code](http://github.com/olivernn/notepad)\n\n## Contributing\n\nContributions are more than welcome, to make the process easier and quicker please follow these guidelines:\n\n* Open an issue detailing the bug fix or feature in your patch.\n* Add test cases for your code.\n* Don't change the version or build new versions as part of you patch.\n\n## Running examples\n\n  First you'll need [node](http://nodejs.org) installed for the server. Then execute the following command and visit one of the examples: `http://localhost:3000/examples/todo.html`.\n  \n    $ make test\n\n## Feedback\n\nAny feedback or suggestions are welcome via [issues](https://github.com/olivernn/davis.js/issues).","maintainers":[{"name":"olivernn","email":"oliver.nightingale1@gmail.com"}],"time":{"modified":"2012-03-30T15:55:57.987Z","created":"2012-03-30T15:55:56.466Z","0.8.2":"2012-03-30T15:55:57.987Z"},"repository":{"type":"git","url":"git://github.com/olivernn/davis.js.git"},"_attachments":{"Davis-0.8.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mbkLsBh++Q9er6m9GWGmFQ==","length":160054,"stub":true}}}},
{"id":"Deci-mal","key":"Deci-mal","value":{"rev":"7-a318973ccd22b9d1decc6fd4ca294e61"},"doc":{"_id":"Deci-mal","_rev":"7-a318973ccd22b9d1decc6fd4ca294e61","name":"Deci-mal","description":"Decimal type for JavaScript","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"Deci-mal","description":"Decimal type for JavaScript","version":"0.1.0","author":{"name":"Steven Looman","email":"steven.looman@gmail.com"},"keywords":["type","decimal"],"dependencies":{},"devDependencies":{"expresso":"0.9.2"},"directories":{"lib":"./lib"},"main":"./index.js","engines":{"node":"0.4 || 0.5 || 0.6","npm":"1"},"repository":{"type":"git","url":"git://github.com/StevenLooman/Deci-mal.git"},"_npmUser":{"name":"steven.looman","email":"steven.looman@gmail.com"},"_id":"Deci-mal@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7365968228b8049888484468c646e24ff62858ac","tarball":"http://registry.npmjs.org/Deci-mal/-/Deci-mal-0.1.0.tgz"},"maintainers":[{"name":"steven.looman","email":"steven.looman@gmail.com"}]},"0.1.1":{"name":"Deci-mal","description":"Decimal type for JavaScript","version":"0.1.1","author":{"name":"Steven Looman","email":"steven.looman@gmail.com"},"keywords":["type","decimal","arithmetic","float","single","double","number","precision"],"licenses":[{"type":"2-clause BSD","url":"https://raw.github.com/StevenLooman/mco/master/LICENSE"}],"dependencies":{},"devDependencies":{"expresso":"0.9.2"},"directories":{"lib":"./lib","test":"./test"},"main":"index.js","engines":{"node":"0.6"},"scripts":{"test":"expresso test/*"},"repository":{"type":"git","url":"git://github.com/StevenLooman/Deci-mal.git"},"_npmUser":{"name":"steven.looman","email":"steven.looman@gmail.com"},"_id":"Deci-mal@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"bd23e1c9b68c019acb544bbe79d38debf17800a8","tarball":"http://registry.npmjs.org/Deci-mal/-/Deci-mal-0.1.1.tgz"},"maintainers":[{"name":"steven.looman","email":"steven.looman@gmail.com"}]},"0.2.0":{"name":"Deci-mal","description":"Decimal type for JavaScript","version":"0.2.0","author":{"name":"Steven Looman","email":"steven.looman@gmail.com"},"keywords":["type","decimal","arithmetic","float","single","double","number","precision"],"licenses":[{"type":"2-clause BSD","url":"https://raw.github.com/StevenLooman/mco/master/LICENSE"}],"dependencies":{},"devDependencies":{"mocha":"1.2.2","mocha-lcov-reporter":"0.0.1"},"directories":{"lib":"./lib","test":"./test"},"main":"index.js","engines":{"node":">= 0.6.0"},"scripts":{"test":"mocha test/*"},"repository":{"type":"git","url":"git://github.com/StevenLooman/Deci-mal.git"},"readme":"Decimal\n=======\n\nSimple Decimal type for Javascript.\n\nSimple Decimal type which allows for:\n\n* conversion from numbers;\n* conversion from strings;\n* specification of precision;\n* changing of precision;\n* addition of Decimals;\n* subtraction of Decimals;\n* multiplication of Decimals;\n* division of Decimals.\n\nWhen doing add, sub, mult, div-operators with two Decimals, the result will have the precision of the source Decimal with the highest precision.\n\nJsDecimal uses an integer for internal storage.\n\nJsDecimal is released under the Simplified BSD License.\n\nExample usage\n=============\n```js\nvar decimal = require('decimal');\n\n// conversion from numbers\nvar a = decimal.fromNumber(2, 20); // 20.00\nvar b = decimal.fromNumber(4, 40.1); // 40.1000\n\n// conversion from strings\nvar c = Decimal.fromString(2, '60.60001'); // 60.00\n\n// specification of precision\nvar d = new Decimal(1); // 0.0\n\n// changing of precision\nb.newPrecision(2).toString(); // 40.10\n\n// addition\na.add(b).toString(); // 60.1000\n\n// subtraction\na.sub(b).toString(); // -20.1000\n\n// multiplication\na.mul(b).toString(); // 802.0000\n\n// division\na.div(b).toString(); // 0.4988\n```\n\nUnit testing\n============\nUnit tests are built using Expresso.\n","_id":"Deci-mal@0.2.0","dist":{"shasum":"5ba995ed913342708c44dce556a9c958ef2c95ff","tarball":"http://registry.npmjs.org/Deci-mal/-/Deci-mal-0.2.0.tgz"},"maintainers":[{"name":"steven.looman","email":"steven.looman@gmail.com"}]}},"readme":"Decimal\n=======\n\nSimple Decimal type for Javascript.\n\nSimple Decimal type which allows for:\n\n* conversion from numbers;\n* conversion from strings;\n* specification of precision;\n* changing of precision;\n* addition of Decimals;\n* subtraction of Decimals;\n* multiplication of Decimals;\n* division of Decimals.\n\nWhen doing add, sub, mult, div-operators with two Decimals, the result will have the precision of the source Decimal with the highest precision.\n\nJsDecimal uses an integer for internal storage.\n\nJsDecimal is released under the Simplified BSD License.\n\nExample usage\n=============\n```js\nvar decimal = require('decimal');\n\n// conversion from numbers\nvar a = decimal.fromNumber(2, 20); // 20.00\nvar b = decimal.fromNumber(4, 40.1); // 40.1000\n\n// conversion from strings\nvar c = Decimal.fromString(2, '60.60001'); // 60.00\n\n// specification of precision\nvar d = new Decimal(1); // 0.0\n\n// changing of precision\nb.newPrecision(2).toString(); // 40.10\n\n// addition\na.add(b).toString(); // 60.1000\n\n// subtraction\na.sub(b).toString(); // -20.1000\n\n// multiplication\na.mul(b).toString(); // 802.0000\n\n// division\na.div(b).toString(); // 0.4988\n```\n\nUnit testing\n============\nUnit tests are built using Expresso.\n","maintainers":[{"name":"steven.looman","email":"steven.looman@gmail.com"}],"time":{"modified":"2012-07-08T15:33:39.439Z","created":"2012-01-03T20:59:11.821Z","0.1.0":"2012-01-03T20:59:14.136Z","0.1.1":"2012-05-22T17:40:05.865Z","0.2.0":"2012-07-08T15:33:39.439Z"},"author":{"name":"Steven Looman","email":"steven.looman@gmail.com"},"repository":{"type":"git","url":"git://github.com/StevenLooman/Deci-mal.git"},"_attachments":{"Deci-mal-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9UoKkWmvIk0uD/xF7ACDDA==","length":4526,"stub":true},"Deci-mal-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/exM5T0OO8yk1ZIe+1XSIw==","length":3794,"stub":true},"Deci-mal-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/PYoC21wKMRM6+HGVAAYrA==","length":10240,"stub":true}}}},
{"id":"Deferred","key":"Deferred","value":{"rev":"9-1a1caa2c153c7ecf4e2b0123abd5ca2c"},"doc":{"_id":"Deferred","_rev":"9-1a1caa2c153c7ecf4e2b0123abd5ca2c","name":"Deferred","description":"A port of the jQuery Deferred library to node js.","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.3":{"name":"Deferred","version":"0.0.3","description":"A port of the jQuery Deferred library to node js.","keywords":["promises","futures","deferred","jQuery"],"engines":["node >= 0.2.2"],"homepage":"http://webspinner.github.com/Deferred","main":"deferred","repository":{"type":"git","url":"git://github.com/webspinner/Deferred.git"},"_id":"Deferred@0.0.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c4dc43352f793b7b0a8ae33fa8c06aea9e918d03","tarball":"http://registry.npmjs.org/Deferred/-/Deferred-0.0.3.tgz"},"maintainers":[{"name":"webspinner","email":"webspinner.gabriel@gmail.com"}]},"0.0.4":{"name":"Deferred","version":"0.0.4","description":"A port of the jQuery Deferred library to node js.","keywords":["promises","futures","deferred","jQuery"],"engines":["node >= 0.2.2"],"homepage":"http://webspinner.github.com/Deferred","main":"deferred","repository":{"type":"git","url":"git://github.com/webspinner/Deferred.git"},"contributors":[{"name":"Gabriel Hernandez","email":"webspinner.gabriel@gmail.com","url":"https://github.com/webspinner"},{"name":"Ben Loveridge","url":"https://github.com/bloveridge"}],"devDependencies":{"vows":">=0.4.1"},"_npmUser":{"name":"webspinner","email":"webspinner.gabriel@gmail.com"},"_id":"Deferred@0.0.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a7c3b07f6cfc5385692d54bfe87417f0ad5fc131","tarball":"http://registry.npmjs.org/Deferred/-/Deferred-0.0.4.tgz"},"maintainers":[{"name":"webspinner","email":"webspinner.gabriel@gmail.com"}]},"0.1.0":{"name":"Deferred","version":"0.1.0","description":"A port of the jQuery Deferred library to node js.","keywords":["promises","futures","deferred","jQuery"],"engines":["node >= 0.2.2"],"homepage":"http://webspinner.github.com/Deferred","main":"deferred","repository":{"type":"git","url":"git://github.com/webspinner/Deferred.git"},"contributors":[{"name":"Gabriel Hernandez","email":"webspinner.gabriel@gmail.com","url":"https://github.com/webspinner"},{"name":"Ben Loveridge","url":"https://github.com/bloveridge"},{"name":"Richard Bateman","email":"taxilian@gmail.com","url":"https://github.com/taxilian"}],"devDependencies":{"vows":">=0.4.1"},"_npmUser":{"name":"webspinner","email":"webspinner.gabriel@gmail.com"},"_id":"Deferred@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"0191c3b6324d90870f7ea8b885ca6d3ca0d9d3ce","tarball":"http://registry.npmjs.org/Deferred/-/Deferred-0.1.0.tgz"},"maintainers":[{"name":"webspinner","email":"webspinner.gabriel@gmail.com"}]},"0.1.1":{"name":"Deferred","version":"0.1.1","description":"A port of the jQuery Deferred library to node js.","keywords":["promises","futures","deferred","jQuery"],"engines":["node >= 0.2.2"],"homepage":"http://webspinner.github.com/Deferred","main":"deferred","repository":{"type":"git","url":"git://github.com/webspinner/Deferred.git"},"contributors":[{"name":"Gabriel Hernandez","email":"webspinner.gabriel@gmail.com","url":"https://github.com/webspinner"},{"name":"Ben Loveridge","url":"https://github.com/bloveridge"},{"name":"Richard Bateman","email":"taxilian@gmail.com","url":"https://github.com/taxilian"}],"devDependencies":{"vows":">=0.4.1"},"_npmUser":{"name":"webspinner","email":"webspinner.gabriel@gmail.com"},"_id":"Deferred@0.1.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"19fc582715b1e037177f2e0f3bf0cabf0bf98139","tarball":"http://registry.npmjs.org/Deferred/-/Deferred-0.1.1.tgz"},"maintainers":[{"name":"webspinner","email":"webspinner.gabriel@gmail.com"}]}},"maintainers":[{"name":"webspinner","email":"webspinner.gabriel@gmail.com"}],"time":{"modified":"2012-01-05T17:35:47.270Z","created":"2011-08-23T17:07:04.781Z","0.0.3":"2011-08-23T17:07:05.239Z","0.0.4":"2011-10-16T18:58:05.204Z","0.1.0":"2011-12-11T18:35:41.324Z","0.1.1":"2012-01-05T17:35:47.270Z"},"repository":{"type":"git","url":"git://github.com/webspinner/Deferred.git"},"_attachments":{"Deferred-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-JQKQcrHB8yW7FEC4HjSbeA==","length":5206,"stub":true},"Deferred-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8n08O+N7lzTlmfy60MCoyA==","length":5137,"stub":true},"Deferred-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eMTWQWVY4U78o+CjgCW31g==","length":2672,"stub":true},"Deferred-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yG/adN5ehIu74mYDjwZ/pA==","length":2411,"stub":true}}}},
{"id":"DelegateListener","key":"DelegateListener","value":{"rev":"9-4dce6be0e9c8f702e0ec9d34d8105206"},"doc":{"_id":"DelegateListener","_rev":"9-4dce6be0e9c8f702e0ec9d34d8105206","name":"DelegateListener","description":"delegate listener like jQuery.delegate, but with semo additional stuff","dist-tags":{"latest":"0.2.3"},"versions":{"0.2.0":{"name":"DelegateListener","version":"0.2.0","description":"delegate listener like jQuery.delegate, but with semo additional stuff","author":{"name":"Termi","email":"1+DelegateListener@h123.ru"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"DelegateListener@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"4a4241e6d6453a9a759da1d58ca6a4552aab099f","tarball":"http://registry.npmjs.org/DelegateListener/-/DelegateListener-0.2.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.1":{"name":"DelegateListener","version":"0.2.1","description":"delegate listener like jQuery.delegate, but with semo additional stuff","author":{"name":"Termi","email":"1+DelegateListener@h123.ru"},"repository":{"type":"git","url":"git://github.com/termi/DelegateListener.git"},"main":"__SRC/DelegateListener","_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"DelegateListener@0.2.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"b16db75732f56560a22f7a66a19ec21139d326d5","tarball":"http://registry.npmjs.org/DelegateListener/-/DelegateListener-0.2.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.2":{"name":"DelegateListener","version":"0.2.2","description":"delegate listener like jQuery.delegate, but with semo additional stuff","author":{"name":"Termi","email":"1+DelegateListener@h123.ru"},"repository":{"type":"git","url":"git://github.com/termi/DelegateListener.git"},"main":"./__SRC/DelegateListener","_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"DelegateListener@0.2.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"43a8ae26b88ffacf93121c203829239b2266d86d","tarball":"http://registry.npmjs.org/DelegateListener/-/DelegateListener-0.2.2.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.3":{"name":"DelegateListener","version":"0.2.3","description":"delegate listener like jQuery.delegate, but with semo additional stuff","author":{"name":"Termi","email":"1+DelegateListener@h123.ru"},"repository":{"type":"git","url":"git://github.com/termi/DelegateListener.git"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"DelegateListener@0.2.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"e8f2c65586fd1852106fc4cff52c79d23d24e40b","tarball":"http://registry.npmjs.org/DelegateListener/-/DelegateListener-0.2.3.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"readme":"# DelegateListener\n\n## Dependencies\n`Element.prototype.matchesSelector` shim.\nIt coudth be found in https://gist.github.com/2369850\n\n## Example\n\n```javascript\n//Filtering by class\ndocument.addEventListener(\"click\", new DelegateListener(\".player\", callback))\n//Filtering by attribute value\ndocument.addEventListener(\"click\", DelegateListener({\"data-event\" : \"click\"}, callback))\n//Filtering by attribute exists\ndocument.addEventListener(\"click\", DelegateListener({\"data-is-menu\" : void 0}, callback))\n//Filtering by custom filter\ndocument.addEventListener(\"click\", DelegateListener(\n\tfunction(node) {\n    \treturn node.contains(someOtherNode);\n    },\n\tcallback)\n)\n\n//Using filter instead of callback\nvar editorController = {\n\tcopy : function() {},\n\tpaste : function() {},\n\thandler : function(node) {\n        var operation = node.getAttrubute(\"data-menu-event\"),//\"copy\" or \"paste\" or null\n            function = operation && this[operation];\n\n        if(function) {\n            function.call(this, node);\n            return true;\n        }\n    }\n}\n\ndocument.addEventListener(\"click\", DelegateListener(\n\teditorController.handler.bind(editorController),\n    function(){return false}\n));\n```\n\n## Licence\nMIT","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2012-04-19T12:50:40.577Z","created":"2012-04-19T12:46:21.856Z","0.2.0":"2012-04-19T12:46:23.828Z","0.2.1":"2012-04-19T12:48:32.993Z","0.2.2":"2012-04-19T12:49:12.232Z","0.2.3":"2012-04-19T12:50:40.577Z"},"author":{"name":"Termi","email":"1+DelegateListener@h123.ru"},"repository":{"type":"git","url":"git://github.com/termi/DelegateListener.git"},"_attachments":{"DelegateListener-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-9zOHJDiwYNEuUuc6H9w6wQ==","length":1992,"stub":true},"DelegateListener-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6zNMMppB7V/fPaIYcag9cA==","length":1944,"stub":true},"DelegateListener-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rgF/g/oqS2Fo+jC9IviN6A==","length":1946,"stub":true},"DelegateListener-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mS8Vw/eIWpMH1fbR8SXR5Q==","length":1904,"stub":true}}}},
{"id":"DeskSet","key":"DeskSet","value":{"rev":"5-359bf760718898ff3591eb366e336cf9"},"doc":{"_id":"DeskSet","_rev":"5-359bf760718898ff3591eb366e336cf9","name":"DeskSet","description":"YAAJSL (Yet Another Asynchronous JS Library)","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"name":"DeskSet","description":"YAAJSL (Yet Another Asynchronous JS Library)","version":"1.0.0","homepage":"http://github.com/aaronblohowiak/DeskSet","repository":{"type":"git","url":"git://github.com/aaronblohowiak/DeskSet.git"},"main":"index.js","scripts":{"test":"make test"},"engines":{"node":"~v0.4.11"},"dependencies":{},"devDependencies":{"whiskey":"~0.4.2"},"_npmJsonOpts":{"file":"/Users/aaronblohowiak/.npm/DeskSet/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"DeskSet@1.0.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"cbe74a571f08158250138cde306f74a282b18877","tarball":"http://registry.npmjs.org/DeskSet/-/DeskSet-1.0.0.tgz"},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}]},"1.0.1":{"author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"name":"DeskSet","description":"YAAJSL (Yet Another Asynchronous JS Library)","version":"1.0.1","homepage":"http://github.com/aaronblohowiak/DeskSet","repository":{"type":"git","url":"git://github.com/aaronblohowiak/DeskSet.git"},"main":"index.js","scripts":{"test":"make test"},"engines":{"node":"~v0.4.11"},"dependencies":{},"devDependencies":{"whiskey":"~0.4.2"},"_npmJsonOpts":{"file":"/Users/aaronblohowiak/.npm/DeskSet/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"DeskSet@1.0.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"dcce971c0f6b047f880293e4536047868b5c4161","tarball":"http://registry.npmjs.org/DeskSet/-/DeskSet-1.0.1.tgz"},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}]}},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}],"time":{"modified":"2011-09-20T08:08:36.344Z","created":"2011-09-20T07:53:55.411Z","1.0.0":"2011-09-20T07:53:56.775Z","1.0.1":"2011-09-20T08:08:36.344Z"},"author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"repository":{"type":"git","url":"git://github.com/aaronblohowiak/DeskSet.git"},"_attachments":{"DeskSet-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-oTDzKcQjgYxrEQUcORgeuQ==","length":2610,"stub":true},"DeskSet-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-poFGeefshF4yE9wydhwRmA==","length":2584,"stub":true}}}},
{"id":"DirScanner","key":"DirScanner","value":{"rev":"3-64de9f85bc401dc7c783a9e140393021"},"doc":{"_id":"DirScanner","_rev":"3-64de9f85bc401dc7c783a9e140393021","name":"DirScanner","description":"Scans directories recursively and eventedly","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Peter Lejeck","email":"peter.lejeck@gmail.com"},"name":"DirScanner","description":"Scans directories recursively and eventedly","version":"0.1.0","repository":{"type":"git","url":"gitolite@artuous.com:dirscanner"},"main":"./DirScanner.js","scripts":{"test":"mocha"},"engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"plejeck","email":"peter.lejeck@gmail.com"},"_id":"DirScanner@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c6084d66d5bfa6e9f00f88693316f3f6c73db659","tarball":"http://registry.npmjs.org/DirScanner/-/DirScanner-0.1.0.tgz"},"maintainers":[{"name":"plejeck","email":"peter.lejeck@gmail.com"}]}},"readme":null,"maintainers":[{"name":"plejeck","email":"peter.lejeck@gmail.com"}],"time":{"modified":"2012-02-13T01:42:07.941Z","created":"2012-02-13T01:42:06.523Z","0.1.0":"2012-02-13T01:42:07.941Z"},"author":{"name":"Peter Lejeck","email":"peter.lejeck@gmail.com"},"repository":{"type":"git","url":"gitolite@artuous.com:dirscanner"},"_attachments":{"DirScanner-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Nx7DEEr6U5OAOA1W4S8eiw==","length":92160,"stub":true}}}},
{"id":"DirWatcher","key":"DirWatcher","value":{"rev":"3-e0b5989e7d276777cf7c21b3abcff66c"},"doc":{"_id":"DirWatcher","_rev":"3-e0b5989e7d276777cf7c21b3abcff66c","name":"DirWatcher","description":"A simple tool for you to watch a directory","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"DirWatcher","description":"A simple tool for you to watch a directory","version":"1.0.0","author":{"name":"Neekey","email":"ni184775761@gmail.com"},"keywords":["DirWatcher","directory"],"main":"DirWatcher.js","repository":{"type":"git","url":"git@github.com:neekey/dirwatcher.git"},"_npmUser":{"name":"neekey","email":"ni184775761@gmail.com"},"_id":"DirWatcher@1.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"682fa84cb74ddbd5313e112b5154e015a4b81446","tarball":"http://registry.npmjs.org/DirWatcher/-/DirWatcher-1.0.0.tgz"},"maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}]}},"readme":"##DirWatcher 监视你的目录\n\n监控指定目录中文件的增加，删除，修改，子目录的增加，删除等\n\n安装 `npm install DirWatcher`\n\n### USAGE 使用\n\n\tvar dw = require( './DirWatcher' );\n\tdw.watchDir( 'path', function( ifDir, path, cur, pre ){\n\t\t\n\t\t// ifDir 是否为目录\n\t\t// path 文件或者目录的路径\n\t\t// type 变更类型 'modify' 'remove' 'add'\n\t\t// cur 当文件变更时，包含当前文件的信息\n\t\t// pre 当文件变更时，包含变更前文件信息\t\n\t});\n\t\n###API\n\n####watchDir( path, next )\n\n* `path`: 目录的路径\n* `next`: 回调，包含五个个参数`ifDir`, `path`, `type`, `cur`, `pre`\n\n####readDir( path, next )\n\n对制定目录进行递归便利，对每一个有效路径执行一次回调\n\n* `path`: 目录的路径\n* `next`: 回调，为目录下的每一个文件或者子目录执行一次回调。回调包含\n* * err\n* * path: 路径\n* * ifDir: 是否为目录\n\n###Exception 配置例外\n\n可以通过在需要添加例外的目录下添加名为`.nowatch`文件，来添加例外. 例外添加的规则：\n\n* 每一行为一条例外\n* 一行中若出现空格，空格后的内容将被忽略\n* 使用`#`进行注释\n* 以`/`结尾的例外将被视为目录，否则为具体的文件名\n\n###存在的问题\n\n* 当watch的文件和目录过多，将报错`EMFILE`的错误\n* 当一个路径被删除，然后再新建同名路径时将无法重新`watch`该路径（对于目录应该问题不大，但是对于文件，暂时无法解决）\nhah","maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}],"time":{"modified":"2012-03-22T12:22:19.635Z","created":"2012-03-22T12:22:04.756Z","1.0.0":"2012-03-22T12:22:19.635Z"},"author":{"name":"Neekey","email":"ni184775761@gmail.com"},"repository":{"type":"git","url":"git@github.com:neekey/dirwatcher.git"},"_attachments":{"DirWatcher-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eBBRt+LriD0AXIKkZ8kwMg==","length":9598,"stub":true}}}},
{"id":"Domai.nr","key":"Domai.nr","value":{"rev":"49-f9c6c27fe07ba6517b1750001a9906cf"},"doc":{"_id":"Domai.nr","_rev":"49-f9c6c27fe07ba6517b1750001a9906cf","name":"Domai.nr","description":"A dead-simple way to utilize Domai.nr's JSON API","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"Domai.nr","version":"0.0.1","description":"A dead-simple way to utilize Domai.nr's JSON API","keywords":["domainr","domains","search"],"repository":{"type":"git","url":"git://github.com/connormontgomery/domainr-node.git"},"maintainers":[{"name":"connor","email":"c@cnnr.me"}],"license":"MIT","dependencies":{"request":"2.9.200"},"_npmUser":{"name":"connor","email":"c@cnnr.me"},"_id":"Domai.nr@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"2a8f22ea36a4c578958b9f960eea6ba9a323eb90","tarball":"http://registry.npmjs.org/Domai.nr/-/Domai.nr-0.0.1.tgz"},"directories":{}},"1.0.0":{"name":"Domai.nr","version":"1.0.0","description":"A dead-simple way to utilize Domai.nr's JSON API","keywords":["domainr","domains","search","domain"],"repository":{"type":"git","url":"git://github.com/connor/domainr-node.git"},"maintainers":[{"name":"connor","email":"c@cnnr.me"}],"license":"MIT","main":"./lib/domainr","dependencies":{"request":"2.9.200"},"_npmUser":{"name":"connor","email":"c@cnnr.me"},"_id":"Domai.nr@1.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b4e88f89461c6b816f0ff3582a98790f5c148fd9","tarball":"http://registry.npmjs.org/Domai.nr/-/Domai.nr-1.0.0.tgz"}}},"readme":"The Domai.nr module is a dead-simple way to utilize Domai.nr's [JSON API](http://domai.nr/api/docs/json). It only comes with two methods: `search` and `info`, but that's all we need to get a ton of work done with the data behind Domai.nr.\n\n## Examples\n\n\n##### Express\n\nI prefer making my express apps driven by an internal API. By that, I mean I like to set up back-end routes that my front-end routes can receive data from. Included in the `/example` directory is a very rudimentary example of how one would go about using the doaminr module.\n\n\n## Installation\n\n\t$ npm install domainr\n\n\n## Documentation\n\nLike previously mentioned, this module comes with two methods available: `search`, and `info`. Both of them take two arguments: a **query** and a **callback** (which aliases the parameter you pass into it as the data that's returned from Domai.nr, so you can do whatever you want with it).\n\n##### .search(query, callback)\n\n\n##### .info(query, callback)","maintainers":[{"name":"connor","email":"c@cnnr.me"}],"time":{"modified":"2012-05-28T06:00:37.339Z","created":"2012-04-08T22:00:26.768Z","0.0.1":"2012-04-08T22:00:27.699Z","1.0.0":"2012-05-28T06:00:37.339Z"},"repository":{"type":"git","url":"git://github.com/connor/domainr-node.git"},"_attachments":{"Domai.nr-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-zm8CsGm6FVdYWeuMLcqKXQ==","length":45723,"stub":true},"Domai.nr-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oXBbX5EVY7NiuZegpFW70w==","length":44723,"stub":true}}}},
{"id":"DynWorker","key":"DynWorker","value":{"rev":"3-0731873818179c62195759984ccc5449"},"doc":{"_id":"DynWorker","_rev":"3-0731873818179c62195759984ccc5449","name":"DynWorker","description":"Web threading made easy - Ender shortcut","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"name":"DynWorker","version":"1.1.0","description":"Web threading made easy - Ender shortcut","keywords":["thread","webworker","worker","ender"],"homepage":"http://passcod.net/DynWorker","repository":{"type":"git","url":"git://github.com/passcod/DynWorker.git"},"ender":"ender/ender.js","main":"ender/main.js","_npmUser":{"name":"passcod","email":"me@passcod.net"},"_id":"DynWorker@1.1.0","contributors":[{"name":"Félix Saparelli","email":"me@passcod.net","url":"http://passcod.net"}],"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"88a903f5f186670b85a253ef21d79e1d788d10cf","tarball":"http://registry.npmjs.org/DynWorker/-/DynWorker-1.1.0.tgz"},"maintainers":[{"name":"passcod","email":"me@passcod.net"}]}},"maintainers":[{"name":"passcod","email":"me@passcod.net"}],"time":{"modified":"2011-11-08T02:49:46.380Z","created":"2011-11-08T02:49:42.544Z","1.1.0":"2011-11-08T02:49:46.380Z"},"repository":{"type":"git","url":"git://github.com/passcod/DynWorker.git"},"_attachments":{"DynWorker-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7jG6RrvpEfFaXQ2+arPVGA==","length":2816,"stub":true}}}},
{"id":"DynamicBuffer","key":"DynamicBuffer","value":{"rev":"3-f898ee2c1203ba492dc9eb7f23626500"},"doc":{"_id":"DynamicBuffer","_rev":"3-f898ee2c1203ba492dc9eb7f23626500","name":"DynamicBuffer","description":"Dynamic buffers can be used for fast string concatenation. They are initialized with a fixed size node Buffer, which will be replaced with a larger one transparently when needed.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Oliver Herdin"},"name":"DynamicBuffer","description":"Dynamic buffers can be used for fast string concatenation. They are initialized with a fixed size node Buffer, which will be replaced with a larger one transparently when needed.","version":"0.1.0","homepage":"https://github.com/DDjarod/DynamicBuffer","repository":{"type":"git","url":"git://github.com/DDJarod/DynamicBuffer.git"},"engines":{"node":"~0.6.2"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"main":"./DynamicBuffer.js","_npmUser":{"name":"Oliver Herdin","email":"github@dareddevelopment.com"},"_id":"DynamicBuffer@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"d9c673267dc845d7e0717db6dbfc1b1f8bfc9df7","tarball":"http://registry.npmjs.org/DynamicBuffer/-/DynamicBuffer-0.1.0.tgz"},"maintainers":[{"name":"Oliver Herdin","email":"github@dareddevelopment.com"}]}},"readme":"# DynamicBuffer, a wrapper around node.js Buffer class\n\nThe Buffer class of node.js by default cannot be used as buffer to concatenate strings, like StringBuilder known from java [http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html].\nThis module contains a wrapper around node.js Buffer to concatenate strings into a Buffer, while automatically creating larger Buffers in the background, if more space is needed.\n\n    /**\n     * constructor, takes a starting size for the underlying buffer\n     * and a factor, in which the buffer grows, if it gets to small.\n     * Both have defaults (512 and 2.0).\n     */\n    var DynamicBuffer = module.exports = function(_size, _factor)\n\n    /**\n     * append a string to the buffer and return it for chaining\n     */\n    DynamicBuffer.prototype.append = function(_string)\n\n    /**\n     * append a byte to the buffer and return it for chaining\n     */\n    DynamicBuffer.prototype.write = function(_byte)\n\n    /**\n     * append a javascript (V8) buffer or DynamicBuffer to this one\n     * and return it for chaining\n     */\n    DynamicBuffer.prototype.concat = function(_buffer)\n\n    /**\n     * get a copy of this DynamicBuffer. Changing one of the buffers does\n     * not change the other one. Will accept an optional size for the copy.\n     * If not given, the new one will be exactly the same as the original.\n     */\n    DynamicBuffer.prototype.clone = function(_newBufferSize, _newResizeFactor)\n\n    /**\n     * shrinks this buffer either to the given size, or the length of the current buffer.\n     * This method is mainly used to squeeze out the last bytes of memory, or increase the\n     * size for large chunks of data to come\n     */\n    DynamicBuffer.prototype.resizeUnderlyingBuffer = function(_size)\n\n    /**\n     * return a view of the underlying buffer that only contains the written space.\n     * Changing that view will change this buffer, too.\n     */\n    DynamicBuffer.prototype.getBuffer = function()","maintainers":[{"name":"Oliver Herdin","email":"github@dareddevelopment.com"}],"time":{"modified":"2012-05-04T13:15:36.907Z","created":"2012-05-04T13:15:35.407Z","0.1.0":"2012-05-04T13:15:36.907Z"},"author":{"name":"Oliver Herdin"},"repository":{"type":"git","url":"git://github.com/DDJarod/DynamicBuffer.git"},"_attachments":{"DynamicBuffer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5vcvTDoDFU6wOxBk/GFQkQ==","length":2752,"stub":true}}}},
{"id":"ETag","key":"ETag","value":{"rev":"3-008e78b3cf04adee7023957939a9d2ec"},"doc":{"_id":"ETag","_rev":"3-008e78b3cf04adee7023957939a9d2ec","name":"ETag","description":"implementation of a cache for the web client based on ETag","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"ETag","version":"0.0.1","description":"implementation of a cache for the web client based on ETag","homepage":"","keywords":["web","HTTP","cache"],"author":{"name":"Eric GERMAN","email":"german.erci@gmail.com"},"repository":{"type":"git","url":"git://github.com/germanlinux/ETag.git"},"main":"Etag.js","engines":{"node":">= 0.4.0"},"scripts":{"test":"node tests/run.js"},"_npmUser":{"name":"germanlinux","email":"german.eric@gmail.com"},"_id":"ETag@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2-pre","_defaultsLoaded":true,"dist":{"shasum":"19df42072f9e7a17d5bf9ab024d3efb4f2f6ebe2","tarball":"http://registry.npmjs.org/ETag/-/ETag-0.0.1.tgz"},"maintainers":[{"name":"germanlinux","email":"german.eric@gmail.com"}]}},"readme":"Bienvenue dans le module ETag pour node.js \n\nThis module computes ETag sum  for locals files\n\nIt uses a array like a cache \n\nCe module permet de gérer les headers ETag d'une ressource web\n\n# Usage\n\nFirst : var ETag = require('ETag');\n\nThen use it: \n \nLike a function : \n          etag = ETag.Calcul({'ressource':'zombi.jpg', 'url':'/zombi.jpg'}) ;\n          console.log(\"etag:\" + etag);  \n\n\nor OOP \n\n        myetag = new ETag({\n         'url': '/foo/bar.png',\n         'etag': '1234567890'\n        });\n\n# Installation \n## by npm \n\nnpm install ETag\n\n## From github \n\nGo to https://github.com/germanlinux/ETag and download the archive\n\n## by git \n\ngit://github.com/germanlinux/ETag.git\n\n\n# Prerequis\n\nnode.js\n\nnpm\n\ncoffeescript (uniquement pour modifier les sources coffeescript)\n\n## Dépendances\n\naucunes\n\n# Methods\n\n##Constructor: \n\n        myetag = new ETag({\n         'url': '/foo/bar.png',\n         'etag': '1234567890'\n         'resource' :'path_to/bar.png'\n        });\n\nIf you give 'resource' ,  ETag will be re-comptuting\n\nEach call of 'new' , pushes the url and l'ETag in the cache.\n \n## Attribute\n\nmyobjet.value :return ETag value \n \n##CLass method\n\nETag.Calcul(resource) \n\n        eg: myetag = Etag.Calcul({'resource':'/path/img.png'});\n\nETag.Calcul_etag(file)\n\n        eg: myetag = Etag.Calcul_etag({'/path/img.png');\n\nETag.Find(by_url)\n\nETag.Raz() : clear the cache\n\nETag.List() : list all entries from cache\n\nETag.Items() : return the number of entries\n\n\n# Tests \nnpm test ETag\n\n\n","maintainers":[{"name":"germanlinux","email":"german.eric@gmail.com"}],"time":{"modified":"2012-03-17T11:03:27.888Z","created":"2012-03-17T11:03:25.545Z","0.0.1":"2012-03-17T11:03:27.888Z"},"author":{"name":"Eric GERMAN","email":"german.erci@gmail.com"},"repository":{"type":"git","url":"git://github.com/germanlinux/ETag.git"},"_attachments":{"ETag-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uI2jgrrOtpG35l6EankTGA==","length":37274,"stub":true}}}},
{"id":"EVE","key":"EVE","value":{"rev":"13-f3a7bea14d58f15950b58d17ba0e2768"},"doc":{"_id":"EVE","_rev":"13-f3a7bea14d58f15950b58d17ba0e2768","name":"EVE","description":"A JavaScript object schema, processor and validation lib.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1pre":{"name":"EVE","version":"0.0.1pre","description":"javascript object schema, process, validate lib.","keywords":["schema","process","validate"],"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"0.0.8"},"main":"index","engines":{"node":">=0.4.x"},"_npmUser":{"name":"hidden","email":"zzdhidden@gmail.com"},"_id":"EVE@0.0.1pre","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"a82af4e9bc391fca8cf0312fc5c242902d6d8b07","tarball":"http://registry.npmjs.org/EVE/-/EVE-0.0.1pre.tgz"},"maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}]},"0.0.1":{"name":"EVE","version":"0.0.1","description":"A JavaScript object schema, processor and validation lib.","keywords":["schema","process","validate"],"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"0.0.8"},"main":"index","engines":{"node":">=0.4.x"},"repository":{"type":"git","url":"git://github.com/zzdhidden/EVE.git"},"_npmUser":{"name":"hidden","email":"zzdhidden@gmail.com"},"_id":"EVE@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"36fdfd76999bb9bdf6af960f6853e3f6b5dc94d7","tarball":"http://registry.npmjs.org/EVE/-/EVE-0.0.1.tgz"},"maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}]},"0.0.2":{"name":"EVE","version":"0.0.2","description":"A JavaScript object schema, processor and validation lib.","keywords":["schema","process","validate"],"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"0.0.8"},"main":"index","engines":{"node":">=0.4.x"},"repository":{"type":"git","url":"git://github.com/zzdhidden/EVE.git"},"_npmUser":{"name":"hidden","email":"zzdhidden@gmail.com"},"_id":"EVE@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"ab6ca65dbbb231b4801224d028040967ec782490","tarball":"http://registry.npmjs.org/EVE/-/EVE-0.0.2.tgz"},"maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}]},"0.0.3":{"name":"EVE","version":"0.0.3","description":"A JavaScript object schema, processor and validation lib.","keywords":["schema","process","validate"],"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"0.0.8"},"main":"index","engines":{"node":">=0.4.x"},"repository":{"type":"git","url":"git://github.com/zzdhidden/EVE.git"},"_npmUser":{"name":"hidden","email":"zzdhidden@gmail.com"},"_id":"EVE@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"ab5f30bf16381fdd2316111f973d86d3cd52b7d9","tarball":"http://registry.npmjs.org/EVE/-/EVE-0.0.3.tgz"},"maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}]},"0.0.4":{"name":"EVE","version":"0.0.4","description":"A JavaScript object schema, processor and validation lib.","keywords":["schema","process","validate"],"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"0.0.8"},"main":"index","engines":{"node":">=0.4.x"},"repository":{"type":"git","url":"git://github.com/zzdhidden/EVE.git"},"_npmUser":{"name":"hidden","email":"zzdhidden@gmail.com"},"_id":"EVE@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"9429d3279e6430d65ff79113932d77a92aa7bffd","tarball":"http://registry.npmjs.org/EVE/-/EVE-0.0.4.tgz"},"maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}]},"0.0.5":{"name":"EVE","version":"0.0.5","description":"A JavaScript object schema, processor and validation lib.","keywords":["schema","process","validate"],"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","browserify":"*","node-static":"*","coffee-script":">=1.1.1"},"main":"index","engines":{"node":">=0.4.x"},"repository":{"type":"git","url":"git://github.com/metakeule/EVE.git"},"_npmUser":{"name":"hidden","email":"zzdhidden@gmail.com"},"_id":"EVE@0.0.5","scripts":{"start":"node server.js"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"dd334fef5137bc9b93e4855ea455f4bb05101968","tarball":"http://registry.npmjs.org/EVE/-/EVE-0.0.5.tgz"},"readme":"EVE(Development)\n=============================\n\nA JavaScript object schema, processor and validation lib.\n\n![EVE](https://github.com/zzdhidden/EVE/raw/master/eve.png)\n\n\tvar schema = type.object({\n\t\tlogin: \n\t\t\ttype.string()\n\t\t\t.lowercase().trim()\n\t\t\t.notEmpty().len(3,12)\n\t\t\t.match(/^[a-zA-Z0-9]*$/)\n\t\t\t.validator(function(val, done) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tdone(val != \"admin\");\n\t\t\t\t}, 100);\n\t\t\t}, \"must be unique\")\n\t\t, name: \n\t\t\ttype.string()\n\t\t\t.trim().notEmpty()\n\t\t, email: \n\t\t\ttype.string()\n\t\t\t.trim().notEmpty()\n\t\t\t.email()\n\t\t, password: \n\t\t\ttype.string()\n\t\t\t.trim().notEmpty()\n\t\t\t.len(6,12)\n\t\t, password_confirmation: \n\t\t\ttype.string()\n\t\t\t.trim().notEmpty()\n\t\t\t.len(6,12)\n\t\t\t.validator(function(val){\n\t\t\t\treturn val == this.password;\n\t\t\t}, \"must be equal to password\")\n\t\t, birthday: \n\t\t\ttype.date()\n\t\t, age: \n\t\t\ttype.integer()\n\t});\n\nRun \n\n\tcake browser-tests\n\nto build and serve the browser tests.\n\n## License \n\nReleased under the MIT, BSD, and GPL Licenses.\n\nCopyright (c) 2011 hidden &lt;zzdhidden@gmail.com&gt;\n\n\n[evepngfrom]: http://9yart.cn/a/201003/24058.html\n","maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}]}},"readme":null,"maintainers":[{"name":"hidden","email":"zzdhidden@gmail.com"}],"time":{"modified":"2012-05-02T08:03:31.917Z","created":"2011-11-28T17:45:25.568Z","0.0.1pre":"2011-11-28T17:45:29.515Z","0.0.1":"2011-11-29T08:06:05.193Z","0.0.2":"2011-11-29T08:27:54.637Z","0.0.3":"2011-11-30T15:23:10.792Z","0.0.4":"2011-12-07T05:22:23.433Z","0.0.5":"2012-05-02T08:03:31.917Z"},"author":{"name":"Hidden","email":"zzdhidden@gmail.com"},"repository":{"type":"git","url":"git://github.com/metakeule/EVE.git"},"_attachments":{"EVE-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-AeB/EEMIMfitBC3t5EllsQ==","length":76394,"stub":true},"EVE-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-I7jfTY2A86EBa2XB7hQRWQ==","length":61440,"stub":true},"EVE-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/yfoZDfFKn9ahYu80jvpLw==","length":10240,"stub":true},"EVE-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PczmWG9FhtAfheeUN3Rmgw==","length":10240,"stub":true},"EVE-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZOVd1FI6+/7cLBXNpQAzhQ==","length":10240,"stub":true},"EVE-0.0.1pre.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LTP42iC+XwLKxK4lVSxpWA==","length":10240,"stub":true}}}},
{"id":"Estro","key":"Estro","value":{"rev":"11-97192e2d0327469bb30f814963db6dff"},"doc":{"_id":"Estro","_rev":"11-97192e2d0327469bb30f814963db6dff","name":"Estro","description":"Extended String Object, Gain more from your strings.","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.3":{"name":"Estro","description":"Extended String Object, Gain more from your strings.","version":"0.1.3","homepage":"https://github.com/Nijikokun/Estro","author":{"name":"Nijikokun","email":"nijikokun@gmail.com","url":"@nijikokun"},"repository":{"type":"git","url":"git://github.com/Nijikokun/Estro.git"},"main":"./estro.js","dependencies":{},"devDependencies":{},"_id":"Estro@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4954e24c929eb03a32a17b9764ddba973093fc24","tarball":"http://registry.npmjs.org/Estro/-/Estro-0.1.3.tgz"},"scripts":{},"directories":{}},"0.1.4":{"name":"Estro","description":"Extended String Object, Gain more from your strings.","version":"0.1.4","homepage":"https://github.com/Nijikokun/Estro","author":{"name":"Nijikokun","email":"nijikokun@gmail.com","url":"@nijikokun"},"repository":{"type":"git","url":"git://github.com/Nijikokun/Estro.git"},"main":"./estro.js","dependencies":{},"devDependencies":{},"_id":"Estro@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d1ac5caf83dc0c6172732c81f23a48e68bfd0efa","tarball":"http://registry.npmjs.org/Estro/-/Estro-0.1.4.tgz"},"scripts":{}},"0.1.5":{"name":"Estro","description":"Extended String Object, Gain more from your strings.","version":"0.1.5","homepage":"https://github.com/Nijikokun/Estro","author":{"name":"Nijikokun","email":"nijikokun@gmail.com","url":"@nijikokun"},"repository":{"type":"git","url":"git://github.com/Nijikokun/Estro.git"},"main":"estro","dependencies":{},"devDependencies":{},"_id":"Estro@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"a37df0ffcc1251dd46558c37fdc7dad284ae844e","tarball":"http://registry.npmjs.org/Estro/-/Estro-0.1.5.tgz"},"scripts":{}}},"maintainers":[{"name":"nijikokun","email":"nijikokun@gmail.com"}],"time":{"modified":"2011-05-06T04:13:48.281Z","created":"2011-05-06T02:21:25.976Z","0.1.3":"2011-05-06T02:21:26.359Z","0.1.4":"2011-05-06T03:18:25.294Z","0.1.5":"2011-05-06T04:13:48.281Z"},"author":{"name":"Nijikokun","email":"nijikokun@gmail.com","url":"@nijikokun"},"repository":{"type":"git","url":"git://github.com/Nijikokun/Estro.git"},"_attachments":{"Estro-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-54aa8SQi3A4m4CuYCwiwPQ==","length":2515,"stub":true},"Estro-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/YBaLEH7PH8xDOtrRB9YsQ==","length":2388,"stub":true},"Estro-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2YMHual94F7Rvl0+iZ5ILg==","length":2407,"stub":true}}}},
{"id":"EventHub","key":"EventHub","value":{"rev":"15-c5c63547b5f464f4510b51b801ffe620"},"doc":{"_id":"EventHub","_rev":"15-c5c63547b5f464f4510b51b801ffe620","name":"EventHub","description":"Event Hub and clients for event-based applications","dist-tags":{"latest":"1.1.4"},"versions":{"1.0.0":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.0.0","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"scripts":{"start":"node ./hub/eventHub.js --start"},"engines":{"node":"~0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7"},"config":{"port":"5883"},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"ecb054c780da21b6f1ad50e431f669f2dea50bc1","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.0.0.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]},"1.0.1":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.0.1","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"main":"./clients/server/eventClient.js","scripts":{"start":"node ./hub/eventHub.js"},"engines":{"node":"~0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7"},"config":{"port":"5883"},"devDependencies":{},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"d27737b517e1a575854033d04399221098e52e1f","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.0.1.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]},"1.0.2":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.0.2","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"main":"./clients/server/eventClient.js","scripts":{"start":"node ./hub/eventHub.js"},"engines":{"node":"~0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7"},"config":{"port":"5883"},"devDependencies":{},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.0.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"c2b65bcf2f757659c5a6638c06b22ff96030eb3f","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.0.2.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]},"1.1.0":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.1.0","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"main":"./clients/server/eventClient.js","scripts":{"start":"node ./hub/eventHub.js"},"engines":{"node":"~0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7"},"config":{"port":"5883"},"devDependencies":{},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.1.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"2c272112c4605bdeb9c9908eae295d13dd2646cf","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.1.0.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]},"1.1.1":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.1.1","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"main":"./clients/server/eventClient.js","scripts":{"start":"node ./hub/eventHub.js"},"engines":{"node":">=0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7"},"config":{"port":"5883"},"devDependencies":{},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"bae69db5585db61f84a90776ed3cf3217f7b612e","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.1.1.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]},"1.1.3":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.1.3","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"main":"./clients/server/eventClient.js","scripts":{"start":"node ./hub/eventHub.js"},"engines":{"node":">=0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7","node-uuid":"~1.3"},"config":{"port":"5883"},"devDependencies":{},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"1ee126a955fb7ccd0c3086b7a66f333623af13c0","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.1.3.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]},"1.1.4":{"name":"EventHub","description":"Event Hub and clients for event-based applications","keywords":["event","socket.io","hub","server","client","yui","jquery"],"version":"1.1.4","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"bin":{"eventHub":"./hub/eventHub.js"},"main":"./clients/server/eventClient.js","scripts":{"start":"node ./hub/eventHub.js"},"engines":{"node":">=0.4"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"homepage":"https://github.com/zzo/EventHub","dependencies":{"socket.io":"~0.8.7","connect":"~1.7","node-uuid":"~1.3"},"config":{"port":"5883"},"devDependencies":{},"_npmUser":{"name":"zzo","email":"mark@zzo.com"},"_id":"EventHub@1.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"d07d57e311993a8af466fa7a7d98f4317cf3ef19","tarball":"http://registry.npmjs.org/EventHub/-/EventHub-1.1.4.tgz"},"maintainers":[{"name":"zzo","email":"mark@zzo.com"}]}},"readme":"EventHub\n========\n\nEventHub provides a server-side event hub and server and client side libraries to communicate with the hub.  The hub broadcasts all events to all connected clients.  Event callbacks are supported.\n\nInstallation\n------------\n\n    % npm install EventHub -g\n    % npm start EventHub -g\n\nThis will install and start the EventHub on port 5883\n\nConfiguration\n-------------\n\nEventHub's default port is 5883.  Use the npm configuration variable to change it:\n\n    % npm config set EventHub.port = 8888\n\nWill change the port the EventHub listens on.  Ensure you update your clients to point to this port.\n\nThe Hub\n-------\n\nThe hub itself is hub/eventHub.js.  This NodeJS implementation will listen on a given port for connections.  You can run this on any host/port, just tell each client where this thing is running and they will connect to it.\n\nThe Clients\n-----------\n\n### Browser\n\n#### YUI3\n\nA YUI3 module called 'EventHub' in clients/browsers/yui3.js provides a client-side module for the EventHub.  Look in examples/browser for a test drive.  You must first start the eventHub, then set up some HTML like so:\n\n    <html>\n    <head>\n    </head>\n    <body>\n     <script src=\"http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js\"></script>\n     <script src=\"/socket.io/socket.io.js\"></script>\n     <script src=\"/clients/browser/yui3.js\"></script>\n     <button id=\"button\">Press Me</button>\n    <script>\n        YUI().use('node', 'EventHub', function(Y) {\n\n            var hub = new Y.EventHub(io, 'http://<HUB HOST>:<HUB PORT>');\n            hub.on('eventHubReady', function() {\n                Y.one('#button').on('click',\n                    function(event) {\n                        hub.fire('click', { button: 'clicked' },\n                            function(back, b2) { \n                                Y.log(\"callback from event listener!\");\n                                Y.log(back); \n                                Y.log(b2); \n                            }\n                        );\n                    }\n                );\n                hub.on('click',\n                    function(o1, fn) { \n                        Y.log('got local click event: ' + o1.button); \n                    }\n                );\n            });\n        });\n    </script>\n    </body>\n    </html>\n\nNote the &lt;HUB HOST>:&lt;HUB PORT> to connect to your running EventHub.  This loads in YUI3, then socket.io, and finally the YUI3 EventHub client library (yui3.js).  Simply instantiate a new Y.EventHub, and when it's ready you're ready.\n\nThis example requires a server to server this HTML the socket.io library, and the client hub code, which is simply:\n\n    var connect = require('connect')\n        , server = connect.createServer(\n            connect.logger()\n            , connect.static(__dirname + '/../..')\n            , connect.static(__dirname)\n        )\n        , io = require('socket.io').listen(server)\n        , port = 8888\n        ;\n\n    server.listen(port);\n    console.log('Listening on port ' + port);\n\nThis uses the Connect framework to serve the static files (the HTML, the socket.io library, and the yui3 event hub module.\n\nFor this to all work.  Point your browser at this host, port 8888, and the example will load.  Finally you will also need a listener for the 'click' event this example fires.  That is in server example directory and explained next.\n\n#### jQuery\n\nthe jQuery client is used very similarly to the YUI3 client:\n\n    <html>\n    <head>\n    </head>\n    <body>\n     <script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js\"></script>\n     <script src=\"/socket.io/socket.io.js\"></script>\n     <script src=\"/clients/browser/jquery.js\"></script>\n     <button id=\"button\">Press Me</button>\n    <script>\n        var hub = new $.fn.eventHub(io, 'http://<HUB HOST>:<HUB PORT>');\n        hub.bind('eventHubReady', function() {\n            console.log('EVENT HUB READY!');\n            $('#button').bind('click',\n                function(event) {\n                    console.log('clicked on button - making new event for hub');\n                    hub.trigger('click', { button: 'clicked' },\n                        function(back, b2) { \n                            console.log(\"callback from event listener!\");\n                            console.log(back); \n                            console.log(b2); \n                        }\n                    );\n                }\n            );\n            hub.bind('click',\n                function(event, o1, fn) { \n                    console.log('got local click event: ' + event); \n                    console.log(o1);\n                    console.log(fn);\n                }\n            );\n        }); \n    </script>\n    </body>\n    </html>\n\nLoading up jQuery, socket.io, and the jQuery EventHub client and bind to the button's click event.  When the hub is ready you can 'trigger' events on it and 'bind' to events from it.  I'm no jQuery expert so I hope this is sane for you jQuery people!\n\n### NodeJS\n\nSo we can serve the event hub library, the socket.io library, and some example HTML to fire a 'click' event when you click on the button.  Finally we need a listener to do something, an example of a server-side event hub client does just that.  After the EventHub is started, run examples/nodejs/client.js\n\n    % node examples/nodejs/client.js\n\nThe client will connect to the specified EventHub and uses the clients/server/eventClient.js NodeJS module to handle all EventHub interaction.  It listens for a 'click' event and excercises the callback to return data back to the event emitter.\n\nPutting It All Together\n-----------------------\n\nSo you start the EventHub, start the example server, and start the example NodeJS client.  Go to your browser and point it at the example server and click the button.  An event will propagate from the browser, to the EventHub, and finally to the NodeJS client.  The NodeJS client will call the event's callback which will execute back in the browser.  Simple!\n\nYou've not got an awesome event-based archetecture so go wild!\n\n","maintainers":[{"name":"zzo","email":"mark@zzo.com"}],"time":{"modified":"2012-02-17T01:03:34.215Z","created":"2012-01-10T22:51:19.390Z","1.0.0":"2012-01-10T22:51:19.923Z","1.0.1":"2012-01-11T01:17:40.231Z","1.0.2":"2012-01-14T00:18:30.299Z","1.1.0":"2012-01-18T00:30:35.320Z","1.1.1":"2012-01-20T18:40:42.905Z","1.1.3":"2012-01-26T21:37:08.998Z","1.1.4":"2012-02-17T01:03:34.215Z"},"author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"repository":{"type":"git","url":"git://github.com/zzo/EventHub.git"},"_attachments":{"EventHub-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-gw5JutkV/WnPWdgrGhyxlQ==","length":18472,"stub":true},"EventHub-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-mwy2u8fmnesh+wEoA6g1tQ==","length":8198,"stub":true},"EventHub-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-eobzq7RBv7kmFY0EbQ5LHg==","length":6809,"stub":true},"EventHub-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-7wQOspJHVdn9eqXDaqaLqQ==","length":6452,"stub":true},"EventHub-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9t0tbyO/EV2UpUdBGuiiyg==","length":5038,"stub":true},"EventHub-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-s2ExuZ9subOG54UW2bQLuQ==","length":4785,"stub":true},"EventHub-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IyQIm3MmP1I8a6WDjI1S2w==","length":4598,"stub":true}}}},
{"id":"EventServer","key":"EventServer","value":{"rev":"5-304d829bbe568ec386e8c4dd4ced91f2"},"doc":{"_id":"EventServer","_rev":"5-304d829bbe568ec386e8c4dd4ced91f2","name":"EventServer","description":"Event driven server","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"EventServer","description":"Event driven server","url":"http://github.com/jaredjbarnes/EventServer","keywords":["http","server","event","static","application"],"author":{"name":"Jared Barnes","email":"jared.j.barnes@gmail.com"},"contributors":[],"licenses":["MIT"],"dependencies":{"requirejs":""},"lib":"lib","main":"./lib/EventServer","version":"0.0.1","directories":{},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/home/jaredbarnes/.npm/EventServer/0.0.1/package/package.json","serverjs":false,"wscript":false,"contributors":false},"_id":"EventServer@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5e6d2db6dd3a7c6ffb2036fce5b4d882fbddf324","tarball":"http://registry.npmjs.org/EventServer/-/EventServer-0.0.1.tgz"},"maintainers":[{"name":"jaredjbarnes","email":"jared.j.barnes@gmail.com"}]},"0.0.2":{"name":"EventServer","description":"Event driven server","url":"http://github.com/jaredjbarnes/EventServer","keywords":["http","server","event","static","application"],"author":{"name":"Jared Barnes","email":"jared.j.barnes@gmail.com"},"contributors":[],"licenses":["MIT"],"dependencies":{"requirejs":""},"lib":"lib","main":"./lib/EventServer","version":"0.0.2","directories":{},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/home/jared/.npm/EventServer/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"EventServer@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.5.8-pre","_defaultsLoaded":true,"dist":{"shasum":"c2d0cb8a279dfae43aa0f999b083be3011a828a8","tarball":"http://registry.npmjs.org/EventServer/-/EventServer-0.0.2.tgz"},"maintainers":[{"name":"jaredjbarnes","email":"jared.j.barnes@gmail.com"}]}},"maintainers":[{"name":"jaredjbarnes","email":"jared.j.barnes@gmail.com"}],"time":{"modified":"2011-09-24T15:40:41.377Z","created":"2011-09-22T05:02:39.500Z","0.0.1":"2011-09-22T05:02:41.509Z","0.0.2":"2011-09-24T15:40:41.377Z"},"author":{"name":"Jared Barnes","email":"jared.j.barnes@gmail.com"},"_attachments":{"EventServer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rYRgRCrFUL9K11LwLUf24g==","length":3364,"stub":true},"EventServer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6D56xZ008fQDJK6+K9gdXg==","length":3377,"stub":true}}}},
{"id":"ExBuffer","key":"ExBuffer","value":{"rev":"5-e1b61ee4eeefb2ba83efaaed2eb99132"},"doc":{"_id":"ExBuffer","_rev":"5-e1b61ee4eeefb2ba83efaaed2eb99132","name":"ExBuffer","description":"usefull for socket tcp receive data","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"ExBuffer","description":"usefull for socket tcp receive data","homepage":"http://play175.github.com/ExBuffer/","keywords":["Buffer","byte array","tcp","socket"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ExBuffer.git"},"main":"ExBuffer.js","version":"0.1.0","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ExBuffer@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"70b4d9a78589cba145aab5a9fb9bbc12cf779dcf","tarball":"http://registry.npmjs.org/ExBuffer/-/ExBuffer-0.1.0.tgz"},"readme":"","maintainers":[{"name":"play175","email":"yoyo@play175.com"}]},"0.1.1":{"name":"ExBuffer","description":"usefull for socket tcp receive data","homepage":"http://play175.github.com/ExBuffer/","keywords":["Buffer","byte array","tcp","socket"],"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ExBuffer.git"},"main":"ExBuffer.js","version":"0.1.1","_npmUser":{"name":"play175","email":"yoyo@play175.com"},"_id":"ExBuffer@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"74061d28ed12b33199355ae58074641030cba8fe","tarball":"http://registry.npmjs.org/ExBuffer/-/ExBuffer-0.1.1.tgz"},"readme":"","maintainers":[{"name":"play175","email":"yoyo@play175.com"}]}},"readme":"","maintainers":[{"name":"play175","email":"yoyo@play175.com"}],"time":{"modified":"2012-06-15T11:27:08.117Z","created":"2012-06-15T08:40:52.470Z","0.1.0":"2012-06-15T08:40:57.099Z","0.1.1":"2012-06-15T11:27:08.117Z"},"author":{"name":"yoyo","email":"http://yoyo.play175.com"},"repository":{"type":"git","url":"git://github.com/play175/ExBuffer.git"},"_attachments":{"ExBuffer-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZfqNuEVivMUjCmmVCH0y8Q==","length":2929,"stub":true},"ExBuffer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Pl67wie7BicQDnJJ1UOJQg==","length":2806,"stub":true}}}},
{"id":"ExpressMVC","key":"ExpressMVC","value":{"rev":"5-946ebb36e498357f3216286438edd4fd"},"doc":{"_id":"ExpressMVC","_rev":"5-946ebb36e498357f3216286438edd4fd","name":"ExpressMVC","description":"An MVC framework that should be familiar tenough to PHP developers to allow them to get up and running very quickly.\"","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Nathan A Sculli","email":"nathan.sculli@kapinko.com","url":"nathansculli.com"},"name":"ExpressMVC","description":"An MVC framework that should be familiar tenough to PHP developers to allow them to get up and running very quickly.\"","version":"0.0.1","repository":{"type":"git","url":"git://github.com/Kapinko/ExpressMVC.git"},"keywords":["mvc","framework"],"main":"mvc.js","engines":{"node":"~0.4.12"},"dependencies":{"express":"2.5.0","express-namespace":"0.0.4","express-params":"0.0.1","connect-form":"0.2.1","generic-pool":"1.0.7","mysql":"0.9.4","underscore":"1.2.1","underscore.string":"1.1.6","xml2js":"0.1.11"},"devDependencies":{},"_npmUser":{"name":"scull7","email":"nathan.sculli@kapinko.com"},"_id":"ExpressMVC@0.0.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e490bc33e7d95629cbef015880002371782d5d2d","tarball":"http://registry.npmjs.org/ExpressMVC/-/ExpressMVC-0.0.1.tgz"},"maintainers":[{"name":"scull7","email":"nathan.sculli@kapinko.com"}]},"0.0.2":{"author":{"name":"Nathan A Sculli","email":"nathan.sculli@kapinko.com","url":"nathansculli.com"},"name":"ExpressMVC","description":"An MVC framework that should be familiar tenough to PHP developers to allow them to get up and running very quickly.\"","version":"0.0.2","repository":{"type":"git","url":"git://github.com/Kapinko/ExpressMVC.git"},"keywords":["mvc","framework"],"main":"lib/mvc.js","engines":{"node":"~0.4.12"},"dependencies":{"express":"2.5.0","express-namespace":"0.0.4","express-params":"0.0.1","connect-form":"0.2.1","generic-pool":"1.0.7","mysql":"0.9.4","underscore":"1.2.1","underscore.string":"1.1.6","xml2js":"0.1.11","uquery":"0.0.1"},"devDependencies":{},"_npmUser":{"name":"scull7","email":"nathan.sculli@kapinko.com"},"_id":"ExpressMVC@0.0.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"668e7aa4b6889250abe9516b1a9020533263a63e","tarball":"http://registry.npmjs.org/ExpressMVC/-/ExpressMVC-0.0.2.tgz"},"maintainers":[{"name":"scull7","email":"nathan.sculli@kapinko.com"}]}},"maintainers":[{"name":"scull7","email":"nathan.sculli@kapinko.com"}],"time":{"modified":"2011-11-02T19:45:24.319Z","created":"2011-10-28T17:29:19.472Z","0.0.1":"2011-10-28T17:29:20.710Z","0.0.2":"2011-11-02T19:45:24.319Z"},"author":{"name":"Nathan A Sculli","email":"nathan.sculli@kapinko.com","url":"nathansculli.com"},"repository":{"type":"git","url":"git://github.com/Kapinko/ExpressMVC.git"},"_attachments":{"ExpressMVC-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RPpUKmh1wlhoH/6CI7EHsw==","length":20480,"stub":true},"ExpressMVC-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FKp1VtC4DIp0HbiKu+XYLQ==","length":20480,"stub":true}}}},
{"id":"Expressive","key":"Expressive","value":{"rev":"3-7eae0ea010eb9014b28108e814918eac"},"doc":{"_id":"Expressive","_rev":"3-7eae0ea010eb9014b28108e814918eac","name":"Expressive","description":"Make Express more Expressive","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Expressive","description":"Make Express more Expressive","version":"0.1.0","repository":"git://github.com/garrensmith/Expressive.git","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"main":"./bin/Expressive","bin":{"Expressive":"./bin/Expressive"},"engines":{"node":"*"},"dependencies":{"express":"*","jade":"*","nodemon":"*"},"_id":"Expressive@0.1.0","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","directories":{"lib":"./lib","bin":"./bin"},"modules":{"content.js":"lib/content.js","create.js":"lib/create.js","fs_utils.js":"lib/fs_utils.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a5ec214e2d1c8f3cbb8c52ba6ea62ae30be8eb08","tarball":"http://registry.npmjs.org/Expressive/-/Expressive-0.1.0.tgz"}}},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}],"time":{"modified":"2011-01-29T13:22:03.243Z","created":"2011-01-29T13:22:02.240Z","0.1.0":"2011-01-29T13:22:03.243Z"},"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"repository":"git://github.com/garrensmith/Expressive.git","_attachments":{"Expressive-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-j2fgMDLKqpXy+oNTxQwyEA==","length":2473,"stub":true}}}},
{"id":"F","key":"F","value":{"rev":"12-91a3db69527b46cf43e36b7ec64a4336"},"doc":{"_id":"F","_rev":"12-91a3db69527b46cf43e36b7ec64a4336","name":"F","description":"Simple middleware","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"F","description":"Simple middleware","url":"https://github.com/dvv/F/","keywords":["middleware","json","schema","underscore","javascript","mongodb","rql"],"author":{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"},"contributors":[],"dependencies":{"underscore-data":"","simple-mime":"","cookie-sessions":"","qs":"","formidable":"","mongodb":"","emailjs":""},"lib":".","main":"index.js","version":"0.0.1","_id":"F@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.0rc7","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c6db544573b980f2ccbb8834ec839a8d68a4a4c6","tarball":"http://registry.npmjs.org/F/-/F-0.0.1.tgz"},"directories":{}},"0.0.2":{"name":"F","description":"Simple middleware","url":"https://github.com/dvv/F/","keywords":["middleware","json","schema","underscore","javascript","mongodb","rql"],"author":{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"},"contributors":[],"dependencies":{"underscore-data":"","simple-mime":"","cookie-sessions":"","qs":"","formidable":"","mongodb":"","emailjs":"","now":""},"lib":".","main":"index.js","version":"0.0.2","_id":"F@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.0rc7","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ece6c54391d24ea31dedcf3f7d5a0bcd6f0ec564","tarball":"http://registry.npmjs.org/F/-/F-0.0.2.tgz"},"directories":{}},"0.0.3":{"name":"F","description":"Simple middleware","url":"https://github.com/dvv/F/","keywords":["middleware","json","schema","underscore","javascript","mongodb","rql"],"author":{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"},"contributors":[],"dependencies":{"underscore-data":"","simple-mime":"","cookie-sessions":"","qs":"","formidable":"","mongodb":"","emailjs":"","now":""},"lib":".","main":"index.js","version":"0.0.3","_id":"F@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.0rc7","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"2825e162b2d002092d44e4b33d05d70bc40f36bb","tarball":"http://registry.npmjs.org/F/-/F-0.0.3.tgz"},"directories":{}},"0.0.4":{"name":"F","description":"Simple middleware","url":"https://github.com/dvv/F/","keywords":["middleware","json","schema","underscore","javascript","mongodb","rql"],"author":{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"},"contributors":[],"dependencies":{"underscore":"","underscore-data":"","simple-mime":"","cookie-sessions":"","qs":"","formidable":"","htmlparser":"","mongodb":"","emailjs":"","wscomm":""},"lib":".","main":"index.js","version":"0.0.4","devDependencies":{},"_id":"F@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e71c58869678d5a1ba1e97649262a42dcd6aa6f2","tarball":"http://registry.npmjs.org/F/-/F-0.0.4.tgz"},"scripts":{}}},"maintainers":[{"name":"dvv","email":"dronnikov@gmail.com"}],"time":{"modified":"2011-05-16T12:54:46.357Z","created":"2011-04-11T12:13:34.597Z","0.0.1":"2011-04-11T12:13:35.253Z","0.0.2":"2011-04-11T13:49:34.275Z","0.0.3":"2011-04-11T17:48:16.897Z","0.0.4":"2011-05-16T12:52:16.639Z"},"author":{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"},"_attachments":{"F-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-Vv5Em8qEPRxkZtjjwWeLxw==","length":6403985,"stub":true},"F-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MrvIabklXzmHra12YekqTg==","length":442971,"stub":true},"F-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-s3hKXVHuPz+xTZHNk7q3gQ==","length":420822,"stub":true},"F-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OuzKrlN3cNk6vHjg17XLmw==","length":393602,"stub":true}}}},
{"id":"FCS101","key":"FCS101","value":{"rev":"3-210f792cb186a1ff892191373584e581"},"doc":{"_id":"FCS101","_rev":"3-210f792cb186a1ff892191373584e581","name":"FCS101","description":"AEMS for VS101 Chassis","dist-tags":{"latest":"3.07.0"},"versions":{"3.07.0":{"author":{"name":"Sri Rao","email":"srao@nevion.com"},"name":"FCS101","description":"AEMS for VS101 Chassis","version":"3.07.0","repository":{"url":"files/Engineering/ANMS_Releases/hg/06012012"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"contributors":[{"name":"Igor Zalar","email":"izalar@nevion.com"}],"title":"FCS101","_npmUser":{"name":"srao","email":"srao@nevoin.com"},"_id":"FCS101@3.07.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"82eb05dd9de5e67161f3cb2bf35612834982159f","tarball":"http://registry.npmjs.org/FCS101/-/FCS101-3.07.0.tgz"},"readme":"","maintainers":[{"name":"srao","email":"srao@nevoin.com"}]}},"readme":"","maintainers":[{"name":"srao","email":"srao@nevoin.com"}],"time":{"modified":"2012-06-04T16:29:17.823Z","created":"2012-06-04T16:29:15.651Z","3.07.0":"2012-06-04T16:29:17.823Z"},"author":{"name":"Sri Rao","email":"srao@nevion.com"},"repository":{"url":"files/Engineering/ANMS_Releases/hg/06012012"},"_attachments":{"FCS101-3.07.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-h+ezNfPRmmt0WYioiG+QZg==","length":5662461,"stub":true}}}},
{"id":"Facebook_Graph_API","key":"Facebook_Graph_API","value":{"rev":"7-2c773951b2d6407376f443258c96c5f4"},"doc":{"_id":"Facebook_Graph_API","_rev":"7-2c773951b2d6407376f443258c96c5f4","name":"Facebook_Graph_API","description":"Used to make requests to the Facebook Graph API","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"Facebook_Graph_API","description":"Used to make requests to the Facebook Graph API","version":"0.0.1","author":{"name":"Tim Marshall","email":"timothyjmarhall@gmail.com"},"repository":{"type":"git","url":"git://github.com/tmarshall/Facebook-Graph-API.git"},"bugs":{"url":"http://github.com/tmarshall/Facebook-Graph-API/issues"},"os":["osx","linux"],"directories":{},"main":"main","dependencies":{"request":"*"},"engines":{"node":">=0.4.8"},"licenses":[{"type":"MIT","url":"http://github.com/tmarshall/Facebook-Graph-API/raw/master/LICENSE"}],"devDependencies":{},"_id":"Facebook_Graph_API@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"23779b56d0ac50feb89e92598bfb8dffa808f7a8","tarball":"http://registry.npmjs.org/Facebook_Graph_API/-/Facebook_Graph_API-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"tmarshall","email":"timothyjmarshall@gmail.com"}]},"0.0.3":{"name":"Facebook_Graph_API","description":"Used to make requests to the Facebook Graph API","version":"0.0.3","author":{"name":"Tim Marshall","email":"timothyjmarhall@gmail.com"},"repository":{"type":"git","url":"git://github.com/tmarshall/Facebook-Graph-API.git"},"bugs":{"url":"http://github.com/tmarshall/Facebook-Graph-API/issues"},"os":["osx","linux"],"directories":{},"main":"main","dependencies":{"request":"*"},"engines":{"node":">=0.4.8"},"licenses":[{"type":"MIT","url":"http://github.com/tmarshall/Facebook-Graph-API/raw/master/LICENSE"}],"devDependencies":{},"_id":"Facebook_Graph_API@0.0.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b3c759ebce9736327aa38782e267ce75cb6417eb","tarball":"http://registry.npmjs.org/Facebook_Graph_API/-/Facebook_Graph_API-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"tmarshall","email":"timothyjmarshall@gmail.com"}]},"0.0.4":{"name":"Facebook_Graph_API","description":"Used to make requests to the Facebook Graph API","version":"0.0.4","author":{"name":"Tim Marshall","email":"timothyjmarhall@gmail.com"},"repository":{"type":"git","url":"git://github.com/tmarshall/Facebook-Graph-API.git"},"bugs":{"url":"http://github.com/tmarshall/Facebook-Graph-API/issues"},"os":["osx","linux"],"directories":{},"main":"main","dependencies":{"request":"*"},"engines":{"node":">=0.4.8"},"licenses":[{"type":"MIT","url":"http://github.com/tmarshall/Facebook-Graph-API/raw/master/LICENSE"}],"devDependencies":{},"_id":"Facebook_Graph_API@0.0.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"228f0a49739d0f04ab86720757b448a434fd081e","tarball":"http://registry.npmjs.org/Facebook_Graph_API/-/Facebook_Graph_API-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"tmarshall","email":"timothyjmarshall@gmail.com"}]}},"maintainers":[{"name":"tmarshall","email":"timothyjmarshall@gmail.com"}],"time":{"modified":"2012-05-19T21:43:12.619Z","created":"2012-04-17T17:04:11.809Z","0.0.1":"2012-04-17T17:04:12.425Z","0.0.3":"2012-04-24T02:48:26.193Z","0.0.4":"2012-05-19T21:43:12.619Z"},"author":{"name":"Tim Marshall","email":"timothyjmarhall@gmail.com"},"repository":{"type":"git","url":"git://github.com/tmarshall/Facebook-Graph-API.git"},"_attachments":{"Facebook_Graph_API-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-bS92oBnYAMWwggPbTN+kUw==","length":5812,"stub":true},"Facebook_Graph_API-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MLLP2L7xYOoa4yfjoHhN8A==","length":4649,"stub":true},"Facebook_Graph_API-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XY1DIWXcP0hk1vNh7AJD6A==","length":3619,"stub":true}}}},
{"id":"Faker","key":"Faker","value":{"rev":"9-77951c352cb6f9a0b824be620a8fa40d"},"doc":{"_id":"Faker","_rev":"9-77951c352cb6f9a0b824be620a8fa40d","name":"Faker","description":"Generate massive amounts of fake contextual data","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.1":{"name":"Faker","description":"Generate massive amounts of fake contextual data","version":"0.1.1","author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"http://github.com/Marak/Faker.js.git"},"engine":["node >=0.1.90"],"main":"Faker","_id":"Faker@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Faker/-/Faker-0.1.1.tgz"},"mtime":"2010-11-09T23:24:18Z","ctime":"2010-11-09T23:24:18Z"},"0.1.3":{"name":"Faker","description":"Generate massive amounts of fake contextual data","version":"0.1.3","author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"http://github.com/Marak/Faker.js.git"},"engine":["node >=0.1.90"],"main":"Faker","_id":"Faker@0.1.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Faker/-/Faker-0.1.3.tgz"},"mtime":"2010-11-09T23:24:18Z","ctime":"2010-11-09T23:24:18Z"}},"maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"mtime":"2010-11-09T23:24:18Z","ctime":"2010-11-09T23:24:18Z","author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"http://github.com/Marak/Faker.js.git"},"_attachments":{"Faker-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-97IF+16lIdJNG4PQxEUwUg==","length":101154,"stub":true},"Faker-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RwD++VbAfoiyc/hoskq8Yg==","length":96477,"stub":true}}}},
{"id":"FastLegS","key":"FastLegS","value":{"rev":"33-61519e140936f154b919d27393c6aef3"},"doc":{"_id":"FastLegS","_rev":"33-61519e140936f154b919d27393c6aef3","name":"FastLegS","description":"PostgreSQL ORM on top of node-postgres","dist-tags":{"latest":"0.1.7"},"versions":{"0.0.2":{"name":"FastLegS","version":"0.0.2","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"= 0.2.7","async":"= 0.1.7","underscore":"= 1.1.4","expresso":"= 0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_id":"FastLegS@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.2.tgz"},"directories":{}},"0.0.3":{"name":"FastLegS","version":"0.0.3","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"= 0.2.7","async":"= 0.1.7","underscore":"= 1.1.4","expresso":"= 0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_id":"FastLegS@0.0.3","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.4.2","dist":{"shasum":"55c553d3f037a8c3173d2804b3f15c8427b2e070","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.3.tgz"},"directories":{}},"0.0.4":{"name":"FastLegS","version":"0.0.4","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"= 0.2.7","async":"= 0.1.7","underscore":"= 1.1.4","expresso":"= 0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_id":"FastLegS@0.0.4","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.4.2","dist":{"shasum":"0c0d579e143bb843fa6afe44f82dccecb15193d8","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.4.tgz"},"directories":{}},"0.0.5":{"name":"FastLegS","version":"0.0.5","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"= 0.2.7","async":"= 0.1.7","underscore":"= 1.1.4","expresso":"= 0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_id":"FastLegS@0.0.5","_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.2","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"298302173c19857985bbd2515ee6bbfc25c1830f","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.5.tgz"}},"0.0.6":{"name":"FastLegS","version":"0.0.6","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"= 0.2.7","async":"= 0.1.7","underscore":"= 1.1.4","expresso":"= 0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_id":"FastLegS@0.0.6","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b1bc9add0ad377ef939ab4b1b938c01ecde20440","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.6.tgz"}},"0.0.7":{"name":"FastLegS","version":"0.0.7","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"= 0.2.7","async":"= 0.1.7","underscore":"= 1.1.4","expresso":"= 0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"devDependencies":{},"_id":"FastLegS@0.0.7","_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5f057c904ed701540cc6e4ad278669c6230c7bf1","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.7.tgz"},"directories":{}},"0.0.8":{"name":"FastLegS","version":"0.0.8","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"0.2.7","async":"0.1.7","underscore":"1.1.4","expresso":"0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"devDependencies":{},"_id":"FastLegS@0.0.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"549c5ec9c1b4dc38af20d3be585cdf2387c36418","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.8.tgz"},"directories":{}},"0.0.9":{"name":"FastLegS","version":"0.0.9","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"0.2.7","async":"0.1.7","underscore":"1.1.4","expresso":"0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"devDependencies":{},"_id":"FastLegS@0.0.9","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0b0073d2d393453002dddae356dae3b59427a0ec","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.0.9.tgz"},"directories":{}},"0.1.0":{"name":"FastLegS","version":"0.1.0","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"pg":"0.5.3","async":"0.1.7","underscore":"1.1.4","expresso":"0.7.3"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/rmalko/.npm/FastLegS/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FastLegS@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"89c96c3f0d6e00423f7415da03eb4d7624f9d6db","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"FastLegS","version":"0.1.1","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"async":"0.1.9","expresso":"0.8.1","pg":"0.5.5","underscore":"1.1.7"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/rmalko/.npm/FastLegS/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FastLegS@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"88a096ebe4b67fed830ac1858457a7a6b1e9617c","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.1.1.tgz"},"maintainers":[{"name":"didit-tech","email":"development@didit.com"}],"directories":{}},"0.1.2":{"name":"FastLegS","version":"0.1.2","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"async":"0.1.9","expresso":"0.8.1","pg":"0.5.5","underscore":"1.1.7"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"devDependencies":{},"_id":"FastLegS@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a32a28c055863fb76b11cd33ba5f1b54779a71a1","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.1.2.tgz"},"maintainers":[{"name":"didit-tech","email":"development@didit.com"}]},"0.1.4":{"name":"FastLegS","version":"0.1.4","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"async":"0.1.9","expresso":"0.8.1","pg":"0.5.5","underscore":"1.1.7"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"devDependencies":{},"_id":"FastLegS@0.1.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"715c1dc240eecd1bef3c654766b115adb905d663","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.1.4.tgz"},"maintainers":[{"name":"didit-tech","email":"development@didit.com"}]},"0.1.5":{"name":"FastLegS","version":"0.1.5","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"async":"0.1.9","expresso":"0.8.1","pg":"0.5.5","underscore":"1.1.7"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_npmUser":{"name":"didit-tech","email":"development@didit.com"},"_id":"FastLegS@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"fb111f850badf9d817c1d25e696e10ebcba7b21f","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.1.5.tgz"},"maintainers":[{"name":"didit-tech","email":"development@didit.com"}]},"0.1.7":{"name":"FastLegS","version":"0.1.7","description":"PostgreSQL ORM on top of node-postgres","tags":["orm","pg","postgres"],"author":{"name":"Didit Tech","email":"development@didit.com"},"homepage":"https://github.com/didit-tech/FastLegS","dependencies":{"async":"0.1.18","expresso":"0.8.1","pg":"0.6.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","expect.js":"0.1.2","read":"0.1.0"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.6.17 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/didit-tech/FastLegS/raw/master/LICENSE"}],"_npmUser":{"name":"didit-tech","email":"development@didit.com"},"_id":"FastLegS@0.1.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"167d52e736d3893a63ca64d4e7cfae738470edf9","tarball":"http://registry.npmjs.org/FastLegS/-/FastLegS-0.1.7.tgz"},"maintainers":[{"name":"didit-tech","email":"development@didit.com"}]}},"maintainers":[{"name":"didit-tech","email":"development@didit.com"}],"time":{"modified":"2012-07-11T20:37:06.566Z","created":"2011-03-04T15:02:44.978Z","0.0.2":"2011-03-04T15:02:45.127Z","0.0.3":"2011-03-10T04:59:09.991Z","0.0.4":"2011-03-10T05:23:59.072Z","0.0.5":"2011-03-11T22:08:32.037Z","0.0.6":"2011-04-29T20:47:52.199Z","0.0.7":"2011-04-29T21:43:37.444Z","0.0.8":"2011-05-09T14:23:42.651Z","0.0.9":"2011-05-17T19:11:14.867Z","0.1.0":"2011-07-25T14:48:14.039Z","0.1.1":"2011-08-25T16:01:15.423Z","0.1.2":"2011-08-26T18:45:08.865Z","0.1.4":"2012-04-11T19:10:18.689Z","0.1.5":"2012-04-30T20:20:41.311Z","0.1.7":"2012-07-11T20:37:06.566Z"},"author":{"name":"Didit Tech","email":"development@didit.com"},"_attachments":{"FastLegS-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-bxVb0abpfP3jDZg71PzGWA==","length":20480,"stub":true},"FastLegS-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-cWvtEjCXFwlHoKoPPJb9aA==","length":20480,"stub":true},"FastLegS-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-abvFzfVs9MVdEnEL2bnVhw==","length":11828,"stub":true},"FastLegS-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-HknNJgPLDD8w1GjRL/Zuqw==","length":11620,"stub":true},"FastLegS-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-a5M8RR0qfSfxgr0tWv28Ig==","length":11551,"stub":true},"FastLegS-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-WqplmfWHDfcRwFM4UsXQ3w==","length":10983,"stub":true},"FastLegS-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-TZitwMM8aYhCUua4/aIDcA==","length":10024,"stub":true},"FastLegS-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-fx0u18VbUny3SiEnko64Mw==","length":9937,"stub":true},"FastLegS-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-N7qwd+utGhmT95Ommtkduw==","length":10584,"stub":true},"FastLegS-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-z2NQY1ZlmLmySuCskxq1UA==","length":11027,"stub":true},"FastLegS-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VZpsRW2/YeMSrje5BOk9cQ==","length":10743,"stub":true},"FastLegS-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1FA/56dPg3+G3+WJ8c1N5Q==","length":10613,"stub":true},"FastLegS-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vIZT6lPo12LgQgJnGLv27A==","length":10582,"stub":true},"FastLegS-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4XjTkHHEGU+oYdrPKGtKRQ==","length":10665,"stub":true}}}},
{"id":"Fayer","key":"Fayer","value":{"rev":"7-7e4974ff2716329375f9711bcabef701"},"doc":{"_id":"Fayer","_rev":"7-7e4974ff2716329375f9711bcabef701","name":"Fayer","description":"Easily kick-off page specific Javascript.","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"Fayer","description":"Easily kick-off page specific Javascript.","version":"1.0.0","homepage":"http://github.com/sandeepjain/fayer","authors":["Mr. Sandeep Jain <@sandeepjain>"],"repository":{"type":"git","url":"git://github.com/sandeepjain/fayer.git"},"main":"./integration/ender/fayer.ender.js","ender":"./integration/ender/ender.js","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"author":{"name":"Sandeep Jain","url":"http://www.jsvrocks.com"},"_npmJsonOpts":{"file":"/Users/sandeepjain/.npm/Fayer/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Fayer@1.0.0","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"3462fa3ba37fa9703620ba677fad41c09028cfe1","tarball":"http://registry.npmjs.org/Fayer/-/Fayer-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"sandeepjain","email":"jainsandeep88@gmail.com"}]},"1.0.3":{"name":"Fayer","description":"Easily kick-off page specific Javascript.","version":"1.0.3","authors":["Mr. Sandeep Jain <@sandeepjain>"],"repository":{"type":"git","url":"git://github.com/sandeepjain/fayer.git"},"main":"fayer.ender.js","ender":"ender.js","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"author":{"name":"Sandeep Jain","url":"http://www.jsvrocks.com"},"_npmJsonOpts":{"file":"/Users/sandeepjain/.npm/Fayer/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Fayer@1.0.3","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"f431d5d164b7b19ded7a87c2f0eed78041c76eef","tarball":"http://registry.npmjs.org/Fayer/-/Fayer-1.0.3.tgz"},"scripts":{},"maintainers":[{"name":"sandeepjain","email":"jainsandeep88@gmail.com"}]},"1.0.4":{"name":"Fayer","description":"Easily kick-off page specific Javascript.","version":"1.0.4","authors":["Mr. Sandeep Jain <@sandeepjain>"],"repository":{"type":"git","url":"git://github.com/sandeepjain/fayer.git"},"main":"fayer.ender.js","ender":"ender.js","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"author":{"name":"Sandeep Jain","url":"http://www.jsvrocks.com"},"_npmJsonOpts":{"file":"/Users/sandeepjain/.npm/Fayer/1.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Fayer@1.0.4","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"e94ac24f261d2c8d12e57076a0e189b1fa8616a7","tarball":"http://registry.npmjs.org/Fayer/-/Fayer-1.0.4.tgz"},"scripts":{},"maintainers":[{"name":"sandeepjain","email":"jainsandeep88@gmail.com"}]}},"maintainers":[{"name":"sandeepjain","email":"jainsandeep88@gmail.com"}],"time":{"modified":"2011-08-31T09:28:50.273Z","created":"2011-08-31T07:29:05.588Z","1.0.0":"2011-08-31T07:29:07.193Z","1.0.3":"2011-08-31T07:33:26.536Z","1.0.4":"2011-08-31T09:28:50.273Z"},"author":{"name":"Sandeep Jain","url":"http://www.jsvrocks.com"},"repository":{"type":"git","url":"git://github.com/sandeepjain/fayer.git"},"_attachments":{"Fayer-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sSbJB5O6/La/8h+zxN7hbQ==","length":1446,"stub":true},"Fayer-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ztjv2q19YqeRYTrehO+1EA==","length":1423,"stub":true},"Fayer-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sDktLcPtMBC1xOA/blsyXQ==","length":3316,"stub":true}}}},
{"id":"FidoJAM","key":"FidoJAM","value":{"rev":"12-e26a9ac509bf71ee39663fff2cbd0ddc"},"doc":{"_id":"FidoJAM","_rev":"12-e26a9ac509bf71ee39663fff2cbd0ddc","name":"FidoJAM","description":"Fidonet JAM message base parser","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"FidoJAM","main":"index.js","version":"0.0.1","description":"Fidonet JAM message base parser","keywords":["Fidonet","Fido","JAM"],"author":{"name":"Mithgol the Webmaster"},"dependencies":{"jParser":">=1.0.1"},"repository":{"type":"git","url":"git://github.com/Mithgol/node-fidonet-jam.git"},"bugs":{"url":"https://github.com/Mithgol/node-fidonet-jam/issues"},"_npmUser":{"name":"mithgol","email":"getgit@mithgol.ru"},"_id":"FidoJAM@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"69d9bae4f6e904cf1cd7d12a7d81fac47c3ea13a","tarball":"http://registry.npmjs.org/FidoJAM/-/FidoJAM-0.0.1.tgz"},"maintainers":[{"name":"mithgol","email":"getgit@mithgol.ru"}],"directories":{}},"0.0.2":{"name":"FidoJAM","main":"index.js","version":"0.0.2","description":"Fidonet JAM message base parser","keywords":["Fidonet","Fido","JAM"],"author":{"name":"Mithgol the Webmaster"},"dependencies":{"jParser":">=1.0.1"},"repository":{"type":"git","url":"git://github.com/Mithgol/node-fidonet-jam.git"},"bugs":{"url":"https://github.com/Mithgol/node-fidonet-jam/issues"},"_npmUser":{"name":"mithgol","email":"getgit@mithgol.ru"},"_id":"FidoJAM@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"10dc96ea42b21d877c61e41db672075f27f0814e","tarball":"http://registry.npmjs.org/FidoJAM/-/FidoJAM-0.0.2.tgz"},"maintainers":[{"name":"mithgol","email":"getgit@mithgol.ru"}]}},"readme":"# Purpose\r\n\r\nReads headers of Fidonet echomail messages from JAM message bases.\r\n\r\n# Requirements\r\n\r\nWritten in JavaScript, requires [Node.js](http://nodejs.org/) to run.\r\n\r\nDepends on the [jParser](https://github.com/vjeux/jParser) module.\r\n\r\n# TODO\r\n\r\n* Faster scan time (currently scanning of ≈2 Mb takes ≈5 seconds, see the test).\r\n\r\n* Better API.\r\n\r\n* Reading messages (not only headers).\r\n\r\n* Support reply trees.\r\n\r\n* Support FGHI.\r\n\r\n# See also\r\n\r\n* JAM (The Joaquim-Andrew-Mats Message Base Proposal) [quoted in Ru.FTN.Develop](http://groups.google.com/group/fido7.ru.ftn.develop/msg/e2f5486f80394418)","maintainers":[{"name":"mithgol","email":"getgit@mithgol.ru"}],"time":{"modified":"2012-05-29T19:22:28.780Z","created":"2012-05-18T14:57:32.276Z","0.0.1":"2012-05-18T14:57:35.503Z","0.0.2":"2012-05-29T19:22:28.780Z"},"author":{"name":"Mithgol the Webmaster"},"repository":{"type":"git","url":"git://github.com/Mithgol/node-fidonet-jam.git"},"_attachments":{"FidoJAM-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-lkRVGPcNJIolmeZEt2uoUw==","length":3198,"stub":true},"FidoJAM-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uVNV4ib3mSa2vCsvyoCvxA==","length":3083,"stub":true}}}},
{"id":"File","key":"File","value":{"rev":"3-45e353a984038bc48248dfc32b18f9a8"},"doc":{"_id":"File","_rev":"3-45e353a984038bc48248dfc32b18f9a8","name":"File","description":"HTML5 FileAPI `File` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"File","description":"HTML5 FileAPI `File` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","file"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"mime":">= 0.0.0"},"main":"File.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/File/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"File@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"8b4cb79134c219ad1b4b1d2d331efc2560ecaca8","tarball":"http://registry.npmjs.org/File/-/File-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T19:59:49.076Z","created":"2011-07-15T19:59:48.683Z","0.10.0":"2011-07-15T19:59:49.077Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"File-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1TrObpipxRC5hzfhiaFjvA==","length":903,"stub":true}}}},
{"id":"FileError","key":"FileError","value":{"rev":"3-bb4b03a2548e3c229e2c7e92242946c3"},"doc":{"_id":"FileError","_rev":"3-bb4b03a2548e3c229e2c7e92242946c3","name":"FileError","description":"HTML5 FileAPI `FileError` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"FileError","description":"HTML5 FileAPI `FileError` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileError"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileError.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileError/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileError@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"3c333d5b3c198b89ee61920af3b6b191de08541b","tarball":"http://registry.npmjs.org/FileError/-/FileError-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T20:19:01.370Z","created":"2011-07-15T20:19:00.990Z","0.10.0":"2011-07-15T20:19:01.370Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FileError-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zLPn7+0RDJIsTROyVikTEQ==","length":445,"stub":true}}}},
{"id":"FileList","key":"FileList","value":{"rev":"3-ec4a3fc91794ef7fdd3fe88b19cec7b0"},"doc":{"_id":"FileList","_rev":"3-ec4a3fc91794ef7fdd3fe88b19cec7b0","name":"FileList","description":"HTML5 FileAPI `FileList` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"FileList","description":"HTML5 FileAPI `FileList` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","file"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileList.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileList/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileList@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a2464b813a80e153fa140f56bcbab29ab8021e14","tarball":"http://registry.npmjs.org/FileList/-/FileList-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T19:57:26.756Z","created":"2011-07-15T19:57:26.371Z","0.10.0":"2011-07-15T19:57:26.756Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FileList-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5ZMWkPAQ05JjeAvF9wxuEw==","length":767,"stub":true}}}},
{"id":"FileReader","key":"FileReader","value":{"rev":"7-e81b58a2d8a765ae4781b41bbfadb4cb"},"doc":{"_id":"FileReader","_rev":"7-e81b58a2d8a765ae4781b41bbfadb4cb","name":"FileReader","description":"HTML5 FileAPI `FileReader` for Node.JS.","dist-tags":{"latest":"0.10.2"},"versions":{"0.10.0":{"name":"FileReader","description":"HTML5 FileAPI `FileReader` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileReader"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"noop":">= 0.0.0"},"main":"FileReader.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileReader/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileReader@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"72e7775637bae704f7b596bbad3f025606ffb31d","tarball":"http://registry.npmjs.org/FileReader/-/FileReader-0.10.0.tgz"},"scripts":{}},"0.10.1":{"name":"FileReader","description":"HTML5 FileAPI `FileReader` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileReader"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileReader.js","version":"0.10.1","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileReader/0.10.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileReader@0.10.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"9629e775ccee9f8c5b96fe7e02259fa894213f67","tarball":"http://registry.npmjs.org/FileReader/-/FileReader-0.10.1.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"0.10.2":{"name":"FileReader","description":"HTML5 FileAPI `FileReader` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileReader"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileReader.js","version":"0.10.2","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileReader/0.10.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileReader@0.10.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1b117bdb6b5ed85e241ac3cb10f1b7086524e539","tarball":"http://registry.npmjs.org/FileReader/-/FileReader-0.10.2.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-09-13T19:59:01.436Z","created":"2011-07-15T20:35:50.307Z","0.10.0":"2011-07-15T20:35:50.707Z","0.10.1":"2011-08-25T17:02:22.855Z","0.10.2":"2011-09-13T19:59:01.436Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FileReader-0.10.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SI2oLM28bnZmHV6TtMNQeA==","length":2495,"stub":true},"FileReader-0.10.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5MS8PWUhhxjj2Rmp6QR9UQ==","length":2457,"stub":true},"FileReader-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-m4nPGTJLysiWzOj8FOXs1A==","length":2475,"stub":true}}}},
{"id":"FileSaver","key":"FileSaver","value":{"rev":"3-476dcb3f63f4d10feee08d41a8128cb8"},"doc":{"_id":"FileSaver","_rev":"3-476dcb3f63f4d10feee08d41a8128cb8","name":"FileSaver","description":"HTML5 FileAPI `FileSaver` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"FileSaver","description":"HTML5 FileAPI `FileSaver` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileSaver"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileSaver.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileSaver/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileSaver@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"7def3889944458042ef5df2e9064c88e3d2281c7","tarball":"http://registry.npmjs.org/FileSaver/-/FileSaver-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T20:31:39.660Z","created":"2011-07-15T20:31:39.300Z","0.10.0":"2011-07-15T20:31:39.660Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FileSaver-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0iuHyF5fPu9ObJFqbcqGKA==","length":452,"stub":true}}}},
{"id":"FileWriter","key":"FileWriter","value":{"rev":"3-f2fcdbc4938de480cce2e8e8416a93dd"},"doc":{"_id":"FileWriter","_rev":"3-f2fcdbc4938de480cce2e8e8416a93dd","name":"FileWriter","description":"HTML5 FileAPI `FileWriter` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"FileWriter","description":"HTML5 FileAPI `FileWriter` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileWriter"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileWriter.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileWriter/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileWriter@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"87815032d6ddabd0abfb67ac1b2865d354407763","tarball":"http://registry.npmjs.org/FileWriter/-/FileWriter-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T20:31:09.987Z","created":"2011-07-15T20:31:09.611Z","0.10.0":"2011-07-15T20:31:09.987Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FileWriter-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XTqWl3XdDGpnpxQwYz/J1A==","length":455,"stub":true}}}},
{"id":"FileWriterSync","key":"FileWriterSync","value":{"rev":"3-9494c3fe7a1230238f37a724ec10895b"},"doc":{"_id":"FileWriterSync","_rev":"3-9494c3fe7a1230238f37a724ec10895b","name":"FileWriterSync","description":"HTML5 FileAPI `FileWriterSync` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"FileWriterSync","description":"HTML5 FileAPI `FileWriterSync` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FileWriterSync"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"FileWriterSync.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FileWriterSync/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FileWriterSync@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ece541b7b43bce390b170ca7e1f6a75679f06ba2","tarball":"http://registry.npmjs.org/FileWriterSync/-/FileWriterSync-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T20:32:27.964Z","created":"2011-07-15T20:32:27.605Z","0.10.0":"2011-07-15T20:32:27.964Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FileWriterSync-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-F9NSjIeuhavnZaT2lDK8zg==","length":457,"stub":true}}}},
{"id":"FormData","key":"FormData","value":{"rev":"3-8872d717575f7090107a96d81583f6fe"},"doc":{"_id":"FormData","_rev":"3-8872d717575f7090107a96d81583f6fe","name":"FormData","description":"HTML5 FileAPI `FormData` for Node.JS.","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"FormData","description":"HTML5 FileAPI `FormData` for Node.JS.","url":"http://github.com/coolaj86/node-file-api/","keywords":["html5","jsdom","file-api","FormData"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"bufferjs":">= 0.0.0","remedial":">= 0.0.0","sequence":">= 2.0.0","File":">= 0.0.0","FileReader":">= 0.0.0"},"main":"FormData.js","version":"0.10.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/FormData/0.10.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"FormData@0.10.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"9d01ef00038eebc29347e1a572d8b1da574ceaef","tarball":"http://registry.npmjs.org/FormData/-/FormData-0.10.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-15T22:59:37.274Z","created":"2011-07-15T22:59:36.912Z","0.10.0":"2011-07-15T22:59:37.274Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"_attachments":{"FormData-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ED1VKXBcoer3TdDxeqHCvg==","length":2654,"stub":true}}}},
{"id":"Frenchpress","key":"Frenchpress","value":{"rev":"3-6d916fc15b9e77535771578f96c47c52"},"doc":{"_id":"Frenchpress","_rev":"3-6d916fc15b9e77535771578f96c47c52","name":"Frenchpress","description":"A simple content management system inspired by flat file CMSs such as Toto and Jekyll","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"Frenchpress","description":"A simple content management system inspired by flat file CMSs such as Toto and Jekyll","version":"0.1.0","repository":{"type":"git","url":"git://github.com/nhunzaker/frenchpress.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"express":">= 2.4.6","node-markdown":">= 0.1.0","props":">= 0.1.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/Frenchpress/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Frenchpress@0.1.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"041a1887860c51a93ece645e6da4ab13e02cc679","tarball":"http://registry.npmjs.org/Frenchpress/-/Frenchpress-0.1.0.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]}},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}],"time":{"modified":"2011-09-21T02:10:37.911Z","created":"2011-09-21T02:10:37.626Z","0.1.0":"2011-09-21T02:10:37.911Z"},"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"repository":{"type":"git","url":"git://github.com/nhunzaker/frenchpress.git"},"_attachments":{"Frenchpress-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uTTNovQGOHJK/C0xjLuYhg==","length":132283,"stub":true}}}},
{"id":"FreshDocs","key":"FreshDocs","value":{"rev":"5-f1f3e76c85267faf21d06d911cc6c203"},"doc":{"_id":"FreshDocs","_rev":"5-f1f3e76c85267faf21d06d911cc6c203","name":"FreshDocs","description":"MongoDB ODM that keeps your docs from getting stale","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"FreshDocs","description":"MongoDB ODM that keeps your docs from getting stale","version":"0.0.2","repository":{"type":"git","url":"git://github.com/xcoderzach/FreshDocs.git"},"author":{"name":"Zach Smith","email":"x.coder.zach@gmail.com"},"main":"index.js","directories":{"lib":"."},"scripts":{"test":"nodeunit test/*"},"engines":{"node":"*"},"_id":"FreshDocs@0.0.2","_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"95ead49d4bbc553c7dc9247b6ef98399d91d91a4","tarball":"http://registry.npmjs.org/FreshDocs/-/FreshDocs-0.0.2.tgz"}},"0.0.3":{"name":"FreshDocs","description":"MongoDB ODM that keeps your docs from getting stale","version":"0.0.3","repository":{"type":"git","url":"git://github.com/xcoderzach/FreshDocs.git"},"author":{"name":"Zach Smith","email":"x.coder.zach@gmail.com"},"main":"index.js","directories":{"lib":"."},"scripts":{"test":"nodeunit test/*"},"engines":{"node":"*"},"_id":"FreshDocs@0.0.3","_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"52ce32447e272c034cbcdbba65c03a2c047e6f52","tarball":"http://registry.npmjs.org/FreshDocs/-/FreshDocs-0.0.3.tgz"}}},"maintainers":[{"name":"coderzach","email":"x.coder.zach@gmail.com"}],"time":{"modified":"2011-03-15T22:34:49.517Z","created":"2011-03-15T16:32:33.357Z","0.0.2":"2011-03-15T16:32:33.676Z","0.0.3":"2011-03-15T22:34:49.517Z"},"author":{"name":"Zach Smith","email":"x.coder.zach@gmail.com"},"repository":{"type":"git","url":"git://github.com/xcoderzach/FreshDocs.git"},"_attachments":{"FreshDocs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2G7aYrPa/2VGJC2olaZzNA==","length":7837,"stub":true},"FreshDocs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-b1vtf3lQhUikSbTswvSJJw==","length":7002,"stub":true}}}},
{"id":"Friggeri.net","key":"Friggeri.net","value":{"rev":"3-35c792fe5ce8ad653c0eef6a03fea4af"},"doc":{"_id":"Friggeri.net","_rev":"3-35c792fe5ce8ad653c0eef6a03fea4af","name":"Friggeri.net","description":"Friggeri.net","dist-tags":{"latest":"0.2.6"},"versions":{"0.2.6":{"author":{"name":"Adrien Friggeri"},"name":"Friggeri.net","description":"Friggeri.net","version":"0.2.6","repository":{"type":"git","url":"ssh://friggeri.net/home/ec2-user/friggeri.git"},"directories":{"lib":"./"},"engines":{"node":">=0.4.1"},"main":"app.coffee","dependencies":{"async":">=0.1.9","coffee-script":"latest","datejs":">=0.0.2","discount":">=0.2.0","express":">=2.2.2","jade":">=0.12.4","stylus":">=0.13.5","ntwitter":"~v0.2.3"},"devDependencies":{},"_npmUser":{"name":"afriggeri","email":"adrien@friggeri.net"},"_id":"Friggeri.net@0.2.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"078c878d011ee3d8a5c4bfc4bbfce9636d06b6a3","tarball":"http://registry.npmjs.org/Friggeri.net/-/Friggeri.net-0.2.6.tgz"},"maintainers":[{"name":"afriggeri","email":"adrien@friggeri.net"}]}},"readme":null,"maintainers":[{"name":"afriggeri","email":"adrien@friggeri.net"}],"time":{"modified":"2012-02-20T11:28:36.612Z","created":"2012-02-20T11:28:34.317Z","0.2.6":"2012-02-20T11:28:36.612Z"},"author":{"name":"Adrien Friggeri"},"repository":{"type":"git","url":"ssh://friggeri.net/home/ec2-user/friggeri.git"},"_attachments":{"Friggeri.net-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9Mp7ljg0RvZ1bFwpe16tpw==","length":5048320,"stub":true}}}},
{"id":"Frog","key":"Frog","value":{"rev":"3-10ab98e7446e4cbbef4ee1c85d2d8af9"},"doc":{"_id":"Frog","_rev":"3-10ab98e7446e4cbbef4ee1c85d2d8af9","name":"Frog","description":"Provides support for require()'ing Google Dart source files (.dart).","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Frog","version":"0.1.0","description":"Provides support for require()'ing Google Dart source files (.dart).","keywords":["dart","google","frog","compiler"],"homepage":"https://github.com/kaisellgren/Frog","author":{"name":"Kai Sellgren"},"contributors":[{"name":"Kai Sellgren"}],"bugs":{"url":"https://github.com/kaisellgren/Frog/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kaisellgren/Frog/raw/master/LICENSE"}],"main":"lib/Frog.js","repository":{"type":"git","url":"git://github.com/kaisellgren/Frog.git"},"dependencies":{},"devDependencies":{},"engines":{"node":">=0.6.15"},"_npmUser":{"name":"kaisellgren","email":"kaisellgren@gmail.com"},"_id":"Frog@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ebe17738227a5a9d96b86c874cb02cff18b41878","tarball":"http://registry.npmjs.org/Frog/-/Frog-0.1.0.tgz"},"maintainers":[{"name":"kaisellgren","email":"kaisellgren@gmail.com"}]}},"readme":"What's Frog?\r\n==\r\nFrog is a NodeJS module that enables Google Dart support. You may now write server-side Dart enabled NodeJS applications.\r\n\r\n## How to install\r\nIt's not yet released, but when it is:\r\n\r\n```\r\nnpm install Frog\r\n```\r\n\r\nFor now, clone the repo.\r\n\r\nYou also need to have Dart SDK installed: http://www.dartlang.org/docs/getting-started/sdk/#download\r\n\r\nMake sure the installation bin folder is in your environment ```$PATH```.\r\n\r\n## Examples\r\n\r\n#####app.js\r\n```javascript\r\n// Include the Frog compiler.\r\nrequire('./../lib/Frog.js');\r\n\r\n// Now just run Dart like a boss.\r\nconsole.log('I am about to run some Dart...');\r\n\r\nrequire('./test.dart');\r\n\r\nconsole.log('I just ran Dart!');\r\n```\r\n#####test.dart\r\n```dart\r\nclass Point {\r\n  Point(this.x, this.y);\r\n\r\n  distanceTo(Point other) {\r\n    var dx = x - other.x;\r\n    var dy = y - other.y;\r\n    return Math.sqrt(dx * dx + dy * dy);\r\n  }\r\n\r\n  var x, y;\r\n}\r\n\r\nmain() {\r\n  Point p = new Point(2, 3);\r\n  Point q = new Point(3, 4);\r\n\r\n  print('distance from p to q = ${p.distanceTo(q)}');\r\n}\r\n```\r\n\r\n#####Run it\r\n```\r\n$ node app.js\r\nI am about to run some Dart...\r\ndistance from p to q = 1.4142135623730951\r\nI just ran Dart!\r\n```\r\n\r\n## Status\r\n\r\nThis project is not yet production ready! It's also quite slow. I'm planning to take another approach to this.","maintainers":[{"name":"kaisellgren","email":"kaisellgren@gmail.com"}],"time":{"modified":"2012-04-21T18:06:23.863Z","created":"2012-04-21T18:06:21.711Z","0.1.0":"2012-04-21T18:06:23.863Z"},"author":{"name":"Kai Sellgren"},"repository":{"type":"git","url":"git://github.com/kaisellgren/Frog.git"},"_attachments":{"Frog-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vMFHJZupxZGR8/V5NKko7g==","length":5944,"stub":true}}}},
{"id":"Fuell","key":"Fuell","value":{"rev":"3-cb3037713a78d56d0f08472fe37dd195"},"doc":{"_id":"Fuell","_rev":"3-cb3037713a78d56d0f08472fe37dd195","name":"Fuell","description":"A library for purely declarative functional programming with support for async actions","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.2":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"Fuell","description":"A library for purely declarative functional programming with support for async actions","keywords":["functional","declarative","async","library","haskell","coffeescript"],"version":"0.2.2","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/Fuell.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/Fuell/master/LICENSE"}],"main":"lib/Fuell.js","directories":{"lib":"lib"},"scripts":{"test":"jasmine-node spec --coffee"},"dependencies":{},"devDependencies":{"jasmine-node":"1.0.20","coffee-script":"1.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"Fuell@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"43e0eec0158145748993c30477dbda354d9939c0","tarball":"http://registry.npmjs.org/Fuell/-/Fuell-0.2.2.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]}},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}],"time":{"modified":"2012-04-12T08:28:07.069Z","created":"2012-04-12T08:28:05.219Z","0.2.2":"2012-04-12T08:28:07.069Z"},"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"repository":{"type":"git","url":"git://github.com/nikita-volkov/Fuell.git"},"_attachments":{"Fuell-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dtcnnPADSRcQd5pRoRJfkg==","length":21657,"stub":true}}}},
{"id":"FuellDocTest","key":"FuellDocTest","value":{"rev":"3-0ae8218d82fbe4e95775e178907ec24e"},"doc":{"_id":"FuellDocTest","_rev":"3-0ae8218d82fbe4e95775e178907ec24e","name":"FuellDocTest","description":"A library for running unit-tests from comments in CoffeeScript code","dist-tags":{"latest":"0.3.1"},"versions":{"0.3.1":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellDocTest","description":"A library for running unit-tests from comments in CoffeeScript code","keywords":["testing","doc","comments","fuell","coffeescript"],"version":"0.3.1","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellDocTest.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellDocTest/master/LICENSE"}],"main":"lib/FuellDocTest.js","bin":{"fuell-doc-test":"bin/fuell-doc-test"},"directories":{"lib":"lib"},"scripts":{},"dependencies":{"Fuell":"0.2.x","FuellSys":"0.1.x","FuellTest":"0.3.x","coffee-script":">1.2.0"},"devDependencies":{},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellDocTest@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5353eed1b8d2d764b3ef47800029df1b2f91a34b","tarball":"http://registry.npmjs.org/FuellDocTest/-/FuellDocTest-0.3.1.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]}},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}],"time":{"modified":"2012-04-12T23:53:41.813Z","created":"2012-04-12T23:53:39.950Z","0.3.1":"2012-04-12T23:53:41.813Z"},"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellDocTest.git"},"_attachments":{"FuellDocTest-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XuYDBr1T1BBdhX1CtBVXXg==","length":6455,"stub":true}}}},
{"id":"FuellSys","key":"FuellSys","value":{"rev":"9-e6197d65ba18855df0b99439ed446cdf"},"doc":{"_id":"FuellSys","_rev":"9-e6197d65ba18855df0b99439ed446cdf","name":"FuellSys","description":"Fuell library extension of system utilities for node.js","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.2":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellSys","description":"Fuell library extension of system utilities for node.js","keywords":["fuell","path","directory","folder","filesystem","environment","system"],"version":"0.1.2","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellSys.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellSys/master/LICENSE"}],"main":"lib/FuellSys.js","directories":{"lib":"lib"},"scripts":{"test":"jasmine-node spec --coffee"},"dependencies":{"Fuell":"0.2.x"},"devDependencies":{"jasmine-node":"1.0.20","coffee-script":"1.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellSys@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e2b07442ccc6fd194f865640ba79311e2ddcdafb","tarball":"http://registry.npmjs.org/FuellSys/-/FuellSys-0.1.2.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.1.3":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellSys","description":"Fuell library extension of system utilities for node.js","keywords":["fuell","path","directory","folder","filesystem","environment","system"],"version":"0.1.3","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellSys.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellSys/master/LICENSE"}],"main":"lib/FuellSys.js","directories":{"lib":"lib"},"scripts":{"test":"jasmine-node spec --coffee"},"dependencies":{"Fuell":"0.2.x"},"devDependencies":{"jasmine-node":"1.0.20","coffee-script":"1.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellSys@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8d024b5ed6d1504e9d6a7577cb05c0824812c75d","tarball":"http://registry.npmjs.org/FuellSys/-/FuellSys-0.1.3.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.2.0":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellSys","description":"Fuell library extension of system utilities for node.js","keywords":["fuell","path","directory","folder","filesystem","environment","system"],"version":"0.2.0","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellSys.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellSys/master/LICENSE"}],"main":"lib/FuellSys.js","directories":{"lib":"lib"},"scripts":{"test":"jasmine-node spec --coffee"},"dependencies":{"Fuell":"0.2.x"},"devDependencies":{"jasmine-node":"1.0.20","coffee-script":"1.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellSys@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0695561c4d7cffa23b8250909e129f7320383c30","tarball":"http://registry.npmjs.org/FuellSys/-/FuellSys-0.2.0.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.2.1":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellSys","description":"Fuell library extension of system utilities for node.js","keywords":["fuell","path","directory","folder","filesystem","environment","system"],"version":"0.2.1","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellSys.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellSys/master/LICENSE"}],"main":"lib/FuellSys.js","directories":{"lib":"lib"},"scripts":{"test":"jasmine-node spec --coffee"},"dependencies":{"Fuell":"0.2.x"},"devDependencies":{"jasmine-node":"1.0.20","coffee-script":"1.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellSys@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"da2ed63c54c1d8b9e1c61db1cc6bea835dc03c6e","tarball":"http://registry.npmjs.org/FuellSys/-/FuellSys-0.2.1.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]}},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}],"time":{"modified":"2012-04-13T04:53:37.777Z","created":"2012-04-12T09:21:55.688Z","0.1.2":"2012-04-12T09:21:57.437Z","0.1.3":"2012-04-12T23:57:16.474Z","0.2.0":"2012-04-13T03:57:58.880Z","0.2.1":"2012-04-13T04:53:37.777Z"},"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellSys.git"},"_attachments":{"FuellSys-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-rp0w/aBWPL5DKtDWwLTcVQ==","length":4154,"stub":true},"FuellSys-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6yKDjaFboFAXvcxDFJUIig==","length":4148,"stub":true},"FuellSys-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-LA9HVrexhyOO1HcNeXa7hw==","length":4319,"stub":true},"FuellSys-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-m8YKy6Vap84yUBqwxOp1Gw==","length":3730,"stub":true}}}},
{"id":"FuellTest","key":"FuellTest","value":{"rev":"7-621a453a2f971ad10a9df5c8deccc305"},"doc":{"_id":"FuellTest","_rev":"7-621a453a2f971ad10a9df5c8deccc305","name":"FuellTest","description":"A robust testing library for CoffeeScript/JavaScript which simplifies testing features after implementation and introduces simple testing model of asynchronous functions","dist-tags":{"latest":"0.3.2"},"versions":{"0.3.0":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellTest","description":"A robust testing library for CoffeeScript/JavaScript which simplifies testing features after implementation and introduces simple testing model of asynchronous functions","keywords":["testing","library","simple","async","robusta","coffeescript"],"version":"0.3.0","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellTest.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellTest/master/LICENSE"}],"main":"lib/FuellTest.js","bin":{"robusta-test":"bin/robusta-test"},"directories":{"lib":"lib"},"scripts":{},"dependencies":{"Fuell":"0.2.x","FuellSys":"0.1.x","coffee-script":">1.2.0"},"devDependencies":{},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellTest@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b21cb27db290141f4949c59486e638015d2765e9","tarball":"http://registry.npmjs.org/FuellTest/-/FuellTest-0.3.0.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.3.1":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellTest","description":"A robust testing library for CoffeeScript/JavaScript which simplifies testing features after implementation and introduces simple testing model of asynchronous functions","keywords":["testing","library","simple","async","fuell","coffeescript"],"version":"0.3.1","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellTest.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellTest/master/LICENSE"}],"main":"lib/FuellTest.js","bin":{"fuell-test":"bin/fuell-test"},"directories":{"lib":"lib"},"scripts":{},"dependencies":{"Fuell":"0.2.x","FuellSys":"0.1.x","coffee-script":">1.2.0"},"devDependencies":{},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellTest@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5379b0192c539717721264330e2d9ae6924a4693","tarball":"http://registry.npmjs.org/FuellTest/-/FuellTest-0.3.1.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.3.2":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"FuellTest","description":"A robust testing library for CoffeeScript/JavaScript which simplifies testing features after implementation and introduces simple testing model of asynchronous functions","keywords":["testing","library","simple","async","fuell","coffeescript"],"version":"0.3.2","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellTest.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/FuellTest/master/LICENSE"}],"main":"lib/FuellTest.js","bin":{"fuell-test":"bin/fuell-test"},"directories":{"lib":"lib"},"scripts":{},"dependencies":{"Fuell":"0.2.x","FuellSys":"0.1.x","coffee-script":">1.2.0"},"devDependencies":{},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"FuellTest@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d43f4b36113b30840755afc207951f7ee12ee460","tarball":"http://registry.npmjs.org/FuellTest/-/FuellTest-0.3.2.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]}},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}],"time":{"modified":"2012-04-12T23:59:47.491Z","created":"2012-04-12T22:46:48.392Z","0.3.0":"2012-04-12T22:46:50.214Z","0.3.1":"2012-04-12T22:59:27.949Z","0.3.2":"2012-04-12T23:59:47.491Z"},"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"repository":{"type":"git","url":"git://github.com/nikita-volkov/FuellTest.git"},"_attachments":{"FuellTest-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WPe7/RMYKaUPzEWr6psY9A==","length":5858,"stub":true},"FuellTest-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-EtuthuJ9+wBOvtjgkECWcw==","length":5183,"stub":true},"FuellTest-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+7e/PmQaFVmgcsBiClqDfQ==","length":5189,"stub":true}}}},
{"id":"Fury","key":"Fury","value":{"rev":"11-ab973cb61a5d889f8898682d64c3792d"},"doc":{"_id":"Fury","_rev":"11-ab973cb61a5d889f8898682d64c3792d","name":"Fury","description":"A library of higher order functions for function composing, overloading, asynchronicity and other","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"Fury","description":"A library of higher order functions for function composing, overloading, asynchronicity and other","keywords":["functional","higher order","library","composing","overloading","partial application","async","coffeescript","haskell"],"version":"0.1.0","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/Fury.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/Fury/master/LICENSE"}],"main":"lib/Fury.js","bin":{},"directories":{"lib":"lib"},"scripts":{},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"Fury@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c08c63dcc82c2d2cbe318c7f9104c06f35d0c924","tarball":"http://registry.npmjs.org/Fury/-/Fury-0.1.0.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.2.0":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"Fury","description":"A library of higher order functions for function composing, overloading, asynchronicity and other","keywords":["functional","higher order","library","composing","overloading","partial application","async","coffeescript","haskell"],"version":"0.2.0","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/Fury.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/Fury/master/LICENSE"}],"main":"lib/Fury.js","bin":{},"directories":{"lib":"lib"},"scripts":{"test":"fuell-doc-test"},"dependencies":{},"devDependencies":{"FuellDocTest":"0.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"Fury@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dbe26238ca35adcf31adb77e49b089bd6839feb8","tarball":"http://registry.npmjs.org/Fury/-/Fury-0.2.0.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.3.0":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"Fury","description":"A library of higher order functions for function composing, overloading, asynchronicity and other","keywords":["functional","higher order","library","composing","overloading","partial application","async","coffeescript","haskell"],"version":"0.3.0","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/Fury.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/Fury/master/LICENSE"}],"main":"lib/Fury.js","bin":{},"directories":{"lib":"lib"},"scripts":{"test":"fuell-doc-test"},"dependencies":{},"devDependencies":{"FuellDocTest":"0.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"Fury@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a90714631265d3dffa414f05604d53b6545f69e4","tarball":"http://registry.npmjs.org/Fury/-/Fury-0.3.0.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]}},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}],"time":{"modified":"2012-04-13T03:14:00.915Z","created":"2012-04-11T23:24:59.562Z","0.1.0":"2012-04-11T23:25:01.295Z","0.2.0":"2012-04-13T02:18:27.343Z","0.3.0":"2012-04-13T03:14:00.915Z"},"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"repository":{"type":"git","url":"git://github.com/nikita-volkov/Fury.git"},"_attachments":{"Fury-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-lM3TwPJ1fkNmB6ZUyyhPAA==","length":5109,"stub":true},"Fury-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ZBIBpoawWfxN2iaJEWsWUQ==","length":4828,"stub":true},"Fury-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SP1y6LVTyY5xHPZBd3mQ4A==","length":5067,"stub":true}}}},
{"id":"GET.js","key":"GET.js","value":{"rev":"3-63e547ad8c387e5d36b6a69fee30fd39"},"doc":{"_id":"GET.js","_rev":"3-63e547ad8c387e5d36b6a69fee30fd39","name":"GET.js","description":"URL query string parser","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.1":{"name":"GET.js","description":"URL query string parser","version":"0.2.1","homepage":"http://m-r-r.github.com/GET.js","main":"lib/GET.js","author":{"name":"Mickaël Raybaud-Roig","email":"raybaudroigm@gmail.com","url":"http://dev-random.info"},"engines":{"node":"*","browsers":"*"},"directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/m-r-r/GET.js.git"},"devDependencies":{"coffee-script":"","jsmin":""},"_npmUser":{"name":"m-r-r","email":"raybaudroigm@gmail.com"},"_id":"GET.js@0.2.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1722922052aa81f6cba9809eb18f45ee06197a74","tarball":"http://registry.npmjs.org/GET.js/-/GET.js-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"m-r-r","email":"raybaudroigm@gmail.com"}]}},"readme":null,"maintainers":[{"name":"m-r-r","email":"raybaudroigm@gmail.com"}],"time":{"modified":"2012-03-06T13:47:21.607Z","created":"2012-03-06T13:47:19.566Z","0.2.1":"2012-03-06T13:47:21.607Z"},"author":{"name":"Mickaël Raybaud-Roig","email":"raybaudroigm@gmail.com","url":"http://dev-random.info"},"repository":{"type":"git","url":"git://github.com/m-r-r/GET.js.git"},"_attachments":{"GET.js-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Lxzz8F24umq3E5acLmq0ow==","length":1716,"stub":true}}}},
{"id":"GitAzure","key":"GitAzure","value":{"rev":"21-7ae22f367f0c6df06eec716b768a14fc"},"doc":{"_id":"GitAzure","_rev":"21-7ae22f367f0c6df06eec716b768a14fc","name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.2":{"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","version":"0.0.2","bin":{"gitazure":"./bin/gitazure.cmd"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{"mocha":"latest","should":"latest"},"_npmUser":{"name":"einaros","email":"einaros@gmail.com"},"_id":"GitAzure@0.0.2","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4a16de657a8a2735771cc037ad3c13e3d4349be0","tarball":"http://registry.npmjs.org/GitAzure/-/GitAzure-0.0.2.tgz"},"maintainers":[{"name":"einaros","email":"einaros@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","version":"0.0.3","bin":{"gitazure":"./bin/gitazure.cmd"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{"mocha":"latest","should":"latest"},"_npmUser":{"name":"einaros","email":"einaros@gmail.com"},"_id":"GitAzure@0.0.3","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e76171f871098bd421a82f13bc163f51259fd6dd","tarball":"http://registry.npmjs.org/GitAzure/-/GitAzure-0.0.3.tgz"},"maintainers":[{"name":"einaros","email":"einaros@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","version":"0.0.4","bin":{"gitazure":"./bin/gitazure.cmd"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{"mocha":"latest","should":"latest"},"_npmUser":{"name":"einaros","email":"einaros@gmail.com"},"_id":"GitAzure@0.0.4","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"febbe742f2fc6974b8d97e40131a1f18bf3a42d7","tarball":"http://registry.npmjs.org/GitAzure/-/GitAzure-0.0.4.tgz"},"maintainers":[{"name":"einaros","email":"einaros@gmail.com"}],"directories":{}},"0.0.5":{"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","version":"0.0.5","bin":{"gitazure":"./bin/gitazure.cmd"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{"mocha":"latest","should":"latest"},"_npmUser":{"name":"einaros","email":"einaros@gmail.com"},"_id":"GitAzure@0.0.5","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"68d8f82dc46fdaacc7669436560fe5143bb4d0b7","tarball":"http://registry.npmjs.org/GitAzure/-/GitAzure-0.0.5.tgz"},"maintainers":[{"name":"einaros","email":"einaros@gmail.com"}],"directories":{}},"0.0.6":{"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","version":"0.0.6","bin":{"gitazure":"./bin/gitazure.cmd"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"engines":{"node":">=0.6.0"},"dependencies":{"azure":"latest","step":"0.0.x","options":"0.0.x"},"devDependencies":{"mocha":"latest","should":"latest"},"_npmUser":{"name":"einaros","email":"einaros@gmail.com"},"_id":"GitAzure@0.0.6","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4f3ddc3a77a15336ee5096bbecb21f92ae41ca17","tarball":"http://registry.npmjs.org/GitAzure/-/GitAzure-0.0.6.tgz"},"maintainers":[{"name":"einaros","email":"einaros@gmail.com"}]},"0.0.7":{"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"name":"GitAzure","description":"Github hook for node.js apps hosted in Microsoft Azure.","version":"0.0.7","bin":{"gitazure":"./bin/gitazure.cmd"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"engines":{"node":">=0.6.0"},"dependencies":{"azure":"latest","step":"0.0.x","options":"0.0.x"},"devDependencies":{"mocha":"latest","should":"latest"},"_npmUser":{"name":"einaros","email":"einaros@gmail.com"},"_id":"GitAzure@0.0.7","scripts":{"start":"node server.js"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7a1d795dffe191eb455489844afadf9f0e9d9939","tarball":"http://registry.npmjs.org/GitAzure/-/GitAzure-0.0.7.tgz"},"maintainers":[{"name":"einaros","email":"einaros@gmail.com"}]}},"readme":"# GitAzure #\n\nGithub hook for node.js apps hosted in Microsoft Azure.\n\n## Creating a node.js application from scratch, hosted in Azure, sourcecontrolled by Github. ##\n\nThis documentation is currently aimed at those with some prior Azure knowledge. That will change.\n\nStep by step creating an application:\n\n  1. Unless you already have git for Windows, install msysgit from http://code.google.com/p/msysgit/downloads/detail?name=Git-1.7.8-preview20111206.exe&can=2&q=\n  2. Install node.js from http://nodejs.org\n  3. `npm install -g https://github.com/einaros/GitAzure/tarball/master`\n  4. `New-AzureService servicename`\n  5. `Add-AzureNodeWebRole`\n  6. `cd WebRole1`\n  7. `Enable-AzureRemoteDesktop`\n  8. `gitazure.cmd`; follow the instructions.\n  9. As noted, put a valid Github id_rsa and id_rsa.pub keypair in WebRole1\\bin\\.ssh, e.g. by copying pre-existing from $env:USERPROFILE\\\\.ssh\n  10. In git bash within the WebRole1 folder, do `git commit -am 'initial'` then `git push -u origin master`\n  11. `Publish-AzureService`; this will take roughly 10 minutes.\n  12. Add http://yoursite.cloudapp.com/githook to the service hooks of your github repository.\n\nAt this point you should be able to make changes to the code in the repository, and publish updates to your Azure application by pushing to Github. That includes writing code on other platforms than Windows.\n\nGitAzure also supports installing npm modules, and will execute `npm install` on the server whenever changes to package.json are detected.\n\nSome settings are available within your web role's gitazure.json config file, which among other things allows you to restrict application updates to a specific branch (e.g. 'azure').\n\nMore to come.","maintainers":[{"name":"einaros","email":"einaros@gmail.com"}],"time":{"modified":"2012-05-26T12:41:30.248Z","created":"2012-01-11T21:01:31.090Z","0.0.2":"2012-01-11T21:01:32.917Z","0.0.3":"2012-01-12T18:28:17.724Z","0.0.4":"2012-01-12T20:30:39.412Z","0.0.5":"2012-01-14T14:00:33.541Z","0.0.6":"2012-01-20T19:27:56.413Z","0.0.7":"2012-05-26T12:41:30.248Z"},"author":{"name":"Einar Otto Stangvik","email":"einaros@gmail.com","url":"http://github.com/einaros"},"repository":{"type":"git","url":"git://github.com/einaros/GitAzure.git"},"_attachments":{"GitAzure-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-yEdBjhXVHrR8qRDFa9W7Iw==","length":407924,"stub":true},"GitAzure-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-9qiAZyMBubJ4YKPvnPvoyg==","length":407953,"stub":true},"GitAzure-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-8Px5xHt4GRyncxCzZlMACQ==","length":404756,"stub":true},"GitAzure-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1tdUsoAy9FODpiStQIWtrA==","length":403797,"stub":true},"GitAzure-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2GhR16E0bRP/aS8Y+aS10A==","length":403565,"stub":true},"GitAzure-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-d24F0qcaJxtIlG94EfGJ9A==","length":403207,"stub":true}}}},
{"id":"Glue","key":"Glue","value":{"rev":"5-7456c11d48dd97b55dcf95beca649b6b"},"doc":{"_id":"Glue","_rev":"5-7456c11d48dd97b55dcf95beca649b6b","name":"Glue","description":"Glues your css @imports together into a single file.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Glue","preferGlobal":"true","version":"0.0.1","author":{"name":"Elving Rodriguez","email":"elving.pr@gmail.com"},"description":"Glues your css @imports together into a single file.","bin":{"glue":"./bin/glue"},"main":"./lib/glue","repository":{"type":"git","url":"git://github.com/elving/Glue.git"},"keywords":["cli","css","@import","imports","modular","glue"],"dependencies":{"commander":"0.6.x","clean-css":"0.3.x"},"licenses":[{"type":"MIT","url":"https://raw.github.com/elving/Glue/master/LICENSE"}],"engine":{"node":">=0.6"},"_npmUser":{"name":"elving","email":"elving.pr@gmail.com"},"_id":"Glue@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3ee897dd8a2985ece72f747ba485373ffa0f8679","tarball":"http://registry.npmjs.org/Glue/-/Glue-0.0.1.tgz"},"readme":"","maintainers":[{"name":"elving","email":"elving.pr@gmail.com"}]},"0.0.2":{"name":"Glue","preferGlobal":"true","version":"0.0.2","author":{"name":"Elving Rodriguez","email":"elving.pr@gmail.com"},"description":"Glues your css @imports together into a single file.","bin":{"glue":"./bin/glue"},"main":"./lib/glue","repository":{"type":"git","url":"git://github.com/elving/Glue.git"},"keywords":["cli","css","@import","imports","modular","glue"],"dependencies":{"commander":"0.6.x","clean-css":"0.3.x"},"licenses":[{"type":"MIT","url":"https://raw.github.com/elving/Glue/master/LICENSE"}],"engine":{"node":">=0.6"},"_npmUser":{"name":"elving","email":"elving.pr@gmail.com"},"_id":"Glue@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3f899f63c817ec39f835af89a24be3b192fbdcff","tarball":"http://registry.npmjs.org/Glue/-/Glue-0.0.2.tgz"},"readme":"","maintainers":[{"name":"elving","email":"elving.pr@gmail.com"}]}},"readme":"","maintainers":[{"name":"elving","email":"elving.pr@gmail.com"}],"time":{"modified":"2012-04-26T15:52:29.087Z","created":"2012-04-26T15:47:22.172Z","0.0.1":"2012-04-26T15:47:24.921Z","0.0.2":"2012-04-26T15:52:29.087Z"},"author":{"name":"Elving Rodriguez","email":"elving.pr@gmail.com"},"repository":{"type":"git","url":"git://github.com/elving/Glue.git"},"_attachments":{"Glue-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-S2k272yYCJAuviklodKk+g==","length":3996,"stub":true},"Glue-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VBA8F8frL7v0/HDUvxWAQQ==","length":3707,"stub":true}}}},
{"id":"Google_Plus_API","key":"Google_Plus_API","value":{"rev":"3-3302bc9846726d996a45daee3dc5922c"},"doc":{"_id":"Google_Plus_API","_rev":"3-3302bc9846726d996a45daee3dc5922c","name":"Google_Plus_API","description":"Employs the official Google+ API","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Timothy J. Marshall","email":"timothyjmarshall@gmail.com","url":"http://timothyjmarshall.com"},"name":"Google_Plus_API","description":"Employs the official Google+ API","version":"0.0.1","main":"google-plus-api","engines":{"node":">=0.4.8"},"repository":{"type":"git","url":"git://github.com/tmarshall/Google-Plus-API.git"},"licenses":[{"type":"MIT","url":"http://github.com/tmarshall/Google-Plus-API/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"Google_Plus_API@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"41aa65e7265c3fdebfde7146ddd3ba9df4af8cc7","tarball":"http://registry.npmjs.org/Google_Plus_API/-/Google_Plus_API-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"tmarshall","email":"timothyjmarshall@gmail.com"}]}},"maintainers":[{"name":"tmarshall","email":"timothyjmarshall@gmail.com"}],"time":{"modified":"2011-09-15T22:55:57.354Z","created":"2011-09-15T22:55:56.835Z","0.0.1":"2011-09-15T22:55:57.354Z"},"author":{"name":"Timothy J. Marshall","email":"timothyjmarshall@gmail.com","url":"http://timothyjmarshall.com"},"repository":{"type":"git","url":"git://github.com/tmarshall/Google-Plus-API.git"},"_attachments":{"Google_Plus_API-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nMyJiTc7O1gTgm8g94aaJQ==","length":2418,"stub":true}}}},
{"id":"Google_Plus_Server_Library","key":"Google_Plus_Server_Library","value":{"rev":"3-e46464f8352210f7a6e8a8fab9ce35fb"},"doc":{"_id":"Google_Plus_Server_Library","_rev":"3-e46464f8352210f7a6e8a8fab9ce35fb","name":"Google_Plus_Server_Library","description":"Server-Side Implementation of Google's Client-Side Javascript Library for Google+","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Blaine Bublitz","email":"blaine@iceddev.com","url":"http://iceddev.com"},"name":"Google_Plus_Server_Library","description":"Server-Side Implementation of Google's Client-Side Javascript Library for Google+","version":"0.0.1","main":"google-plus-server-library","engines":{"node":">=0.4.8"},"repository":{"type":"git","url":"git://github.com/phated/Google-Plus-Server-Library.git"},"licenses":[{"type":"MIT","url":"http://github.com/phated/Google-Plus-Server-Library/raw/master/LICENSE"}],"_npmUser":{"name":"phated","email":"blaine@iceddev.com"},"_id":"Google_Plus_Server_Library@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4b91121353800688ab55d3dbf1779cb72edb4d08","tarball":"http://registry.npmjs.org/Google_Plus_Server_Library/-/Google_Plus_Server_Library-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"phated","email":"blaine@iceddev.com"}]}},"readme":"Detailed instructions coming in the near future.\n\nIn the meantime, this server side library is meant to use similar syntax as the Google JavaScript Client Library for Google+ (more info at http://googlecode.blogspot.com/2011/11/javascript-client-library-for-google.html)\n\nBasic usage can be viewed in Examples/test.js","maintainers":[{"name":"phated","email":"blaine@iceddev.com"}],"time":{"modified":"2011-12-10T07:55:53.162Z","created":"2011-12-10T07:55:51.946Z","0.0.1":"2011-12-10T07:55:53.162Z"},"author":{"name":"Blaine Bublitz","email":"blaine@iceddev.com","url":"http://iceddev.com"},"repository":{"type":"git","url":"git://github.com/phated/Google-Plus-Server-Library.git"},"_attachments":{"Google_Plus_Server_Library-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KvCJBD57OTQJXTrELbdwhQ==","length":2616,"stub":true}}}},
{"id":"Gord","key":"Gord","value":{"rev":"11-32fddef1453773ac7270ba0e7c83f727"},"doc":{"_id":"Gord","_rev":"11-32fddef1453773ac7270ba0e7c83f727","name":"Gord","description":"An object conversion thingy.","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"Gord","description":"An object conversion thingy.","keywords":["utility","object","data conversion"],"version":"0.0.1","homepage":"https://github.com/dawnerd/Gord","author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com","url":"@dawnerd"},"repository":{"type":"git","url":"git://github.com/dawnerd/Gord.git"},"bugs":{"email":"troy@somanyscientists.com","url":"https://github.com/dawnerd/Gord/issues"},"directories":{"src":"./src","tests":"./tests"},"dependencies":{},"devDependencies":{},"_id":"Gord@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc8","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"c50fc833160edda29dcfd1eaf72b0b8e205c0521","tarball":"http://registry.npmjs.org/Gord/-/Gord-0.0.1.tgz"}},"0.0.2":{"name":"Gord","description":"An object conversion thingy.","keywords":["utility","object","data conversion"],"version":"0.0.2","homepage":"https://github.com/dawnerd/Gord","author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com","url":"@dawnerd"},"repository":{"type":"git","url":"git://github.com/dawnerd/Gord.git"},"bugs":{"email":"troy@somanyscientists.com","url":"https://github.com/dawnerd/Gord/issues"},"directories":{"src":"./src","tests":"./tests"},"dependencies":{},"devDependencies":{},"_id":"Gord@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc8","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"f8df26bd5ab01c053e2dab088c2ca422feec60fa","tarball":"http://registry.npmjs.org/Gord/-/Gord-0.0.2.tgz"}},"0.0.4":{"name":"Gord","description":"An object conversion thingy.","keywords":["utility","object","data conversion"],"version":"0.0.4","homepage":"https://github.com/dawnerd/Gord","author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com","url":"@dawnerd"},"repository":{"type":"git","url":"git://github.com/dawnerd/Gord.git"},"bugs":{"email":"troy@somanyscientists.com","url":"https://github.com/dawnerd/Gord/issues"},"directories":{"src":"./src","tests":"./tests"},"main":"./src/gord.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"Gord@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc8","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"6d845df5062b8630ec3d2075a845442295c70a81","tarball":"http://registry.npmjs.org/Gord/-/Gord-0.0.4.tgz"}},"0.0.5":{"name":"Gord","description":"An object conversion thingy.","keywords":["utility","object","data conversion"],"version":"0.0.5","homepage":"https://github.com/dawnerd/Gord","author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com","url":"@dawnerd"},"repository":{"type":"git","url":"git://github.com/dawnerd/Gord.git"},"bugs":{"email":"troy@somanyscientists.com","url":"https://github.com/dawnerd/Gord/issues"},"directories":{"src":"./src","tests":"./tests"},"main":"./src/gord.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"Gord@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc8","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"f37b613b6aef8d8dafe1e39edd3105ad5879cb93","tarball":"http://registry.npmjs.org/Gord/-/Gord-0.0.5.tgz"}},"0.0.6":{"name":"Gord","description":"An object conversion thingy.","keywords":["utility","object","data conversion"],"version":"0.0.6","homepage":"https://github.com/dawnerd/Gord","author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com","url":"@dawnerd"},"repository":{"type":"git","url":"git://github.com/dawnerd/Gord.git"},"bugs":{"email":"troy@somanyscientists.com","url":"https://github.com/dawnerd/Gord/issues"},"directories":{"src":"./src","tests":"./tests"},"main":"./src/gord.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"Gord@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc8","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"63f8e29952cfce3c0e0f0eb2af60c87a37342d52","tarball":"http://registry.npmjs.org/Gord/-/Gord-0.0.6.tgz"}}},"maintainers":[{"name":"dawnerd","email":"troy@somanyscientists.com"}],"time":{"modified":"2011-05-31T17:53:51.630Z","created":"2011-05-31T17:14:31.237Z","0.0.1":"2011-05-31T17:14:31.729Z","0.0.2":"2011-05-31T17:18:00.413Z","0.0.4":"2011-05-31T17:28:22.096Z","0.0.5":"2011-05-31T17:52:08.597Z","0.0.6":"2011-05-31T17:53:51.630Z"},"author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com","url":"@dawnerd"},"repository":{"type":"git","url":"git://github.com/dawnerd/Gord.git"},"_attachments":{"Gord-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-OwSn8tYPrZ2kaKIu9s/uRQ==","length":1292,"stub":true},"Gord-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Db8Cf6NWls1U1Zq00gWaNw==","length":1293,"stub":true},"Gord-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vWfhr7iWtwZXxH0QbqPFwA==","length":1293,"stub":true},"Gord-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-R/h78ucxFmYntpWEzCWYYQ==","length":1274,"stub":true},"Gord-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0YGYsBwOKgVvUChXWF2PVw==","length":1234,"stub":true}}}},
{"id":"Gps2zip","key":"Gps2zip","value":{"rev":"5-9522b6c34dd4ce9569d08b23919b3034"},"doc":{"_id":"Gps2zip","_rev":"5-9522b6c34dd4ce9569d08b23919b3034","name":"Gps2zip","description":"Convert GPS latitude/longitude pairs to US zip codes.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Gps2zip","description":"Convert GPS latitude/longitude pairs to US zip codes.","version":"0.0.1","author":{"name":"Nick Carneiro","email":"nickc@trillworks.com"},"dependencies":{"express":">= 2.4.6","ejs":">= 0.5.0","inspect":">= 0.0.2","colors":">= 0.5.0","mime":">= 1.2.2","commander":">= 0.1.0","clean-css":">= 0.2.4"},"main":"server.js","keywords":["zip code","zip","geolocation","location"],"repository":{"type":"git","url":"git://github.com/NickCarneiro/gps2zip.git"},"engines":{"node":">= 0.4.9 < 0.7.0"},"_npmUser":{"name":"nickc","email":"burthawk101@gmail.com"},"_id":"Gps2zip@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"15d8e4c278e05838d6879ed719cfde5ba4557153","tarball":"http://registry.npmjs.org/Gps2zip/-/Gps2zip-0.0.1.tgz"},"maintainers":[{"name":"nickc","email":"burthawk101@gmail.com"}]},"0.0.2":{"name":"Gps2zip","description":"Convert GPS latitude/longitude pairs to US zip codes.","version":"0.0.2","author":{"name":"Nick Carneiro","email":"nickc@trillworks.com"},"dependencies":{"express":">= 2.4.6","ejs":">= 0.5.0","inspect":">= 0.0.2","colors":">= 0.5.0","mime":">= 1.2.2","commander":">= 0.1.0","clean-css":">= 0.2.4"},"main":"server.js","keywords":["zip code","zip","geolocation","location"],"repository":{"type":"git","url":"git://github.com/NickCarneiro/gps2zip.git"},"engines":{"node":">= 0.4.9 < 0.7.0"},"_npmUser":{"name":"nickc","email":"burthawk101@gmail.com"},"_id":"Gps2zip@0.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3c8298be2b69acd7a4a6fab53bb76d79589ebf15","tarball":"http://registry.npmjs.org/Gps2zip/-/Gps2zip-0.0.2.tgz"},"maintainers":[{"name":"nickc","email":"burthawk101@gmail.com"}]}},"readme":"\n# Gps2zip\n\nConvert GPS latitude longitude pairs to a US zip code.\n\nRuns as a server-side node API for your client-side js applications. \n\n# Example usage\n\nCommand line:\n\t\n\tburt$ curl \"localhost:4000?lat=30.2859283&lon=-97.7461031\"\n\t{\n\t\t\"zip code\":\"78705\",\n\t\t\"state abbreviation\":\"TX\",\n\t\t\"latitude\":\" 30.292424\",\n\t\t\"longitude\":\" -97.73856\",\n\t\t\"city\":\"Austin\",\n\t\t\"state\":\"Texas\",\n\t\t\"distance\":0.009954520385227613\n\t}\n\nFrom jQuery:\n\n\tvar lat = 30.2859283;\n\tvar lon = -97.7461031;\n\t$.get(\"/?lat=\" + lat + \"&lon=\" + lon, function(res){\n\t\tconsole.log(res);\n\t\tif(res.error != undefined){\n\t\t\tconsole.log(res.error);\n\t\t} else {\n\t\t\tconsole.log(res[\"zip code\"]);\n\t\t}\n\t});\n\n\nSee /demo for an example using jQuery in the browser.\n\n# Quick Start\n\n\tnpm install gps2zip\n\tnpm install -d\n\tnode server.js\n\n# Accuracy\nThe output is approximate. The source data is just a list of coordinates, not actual boundaries. The algorithm just finds the minimum euclidean distance between the point in question and the known points. No error checking for points outside the United States.\n\n# Related\n\nYou can get full street addresses using the Google Maps Reverse Geocoding API:\nhttp://code.google.com/apis/maps/documentation/javascript/geocoding.html#ReverseGeocoding\n\n# Credit\n\nZip codes from The Zip Code Database Project\nhttp://sourceforge.net/projects/zips/\n\n# License\n\nAll other work is [The Unlicense](http://unlicense.org/) (Public Domain)\n\n","maintainers":[{"name":"nickc","email":"burthawk101@gmail.com"}],"time":{"modified":"2012-04-12T19:59:14.953Z","created":"2012-01-09T07:17:37.625Z","0.0.1":"2012-01-09T07:17:38.637Z","0.0.2":"2012-04-12T19:59:14.953Z"},"author":{"name":"Nick Carneiro","email":"nickc@trillworks.com"},"repository":{"type":"git","url":"git://github.com/NickCarneiro/gps2zip.git"},"_attachments":{"Gps2zip-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-He2YTxgLKg6pL8Aol1cEJA==","length":1311653,"stub":true},"Gps2zip-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PO+GY9tgF0/sfa0orYkxFw==","length":1320960,"stub":true}}}},
{"id":"Graph","key":"Graph","value":{"rev":"7-c346edea4f90e3e18d50a62473868cf4"},"doc":{"_id":"Graph","_rev":"7-c346edea4f90e3e18d50a62473868cf4","name":"Graph","description":"A mathematical Graph theory library.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Graph","description":"A mathematical Graph theory library.","version":"0.0.1","author":{"name":"Yoni Ben-Meshulam","email":"yoni.bmesh@gmail.com"},"main":"Graph","contributors":[{"name":"Yoni Ben-Meshulam","email":"yoni.bmesh@gmail.com"}],"dependencies":{},"licenses":[{"type":"GPLv2","url":"http://www.example.com/licenses/gpl.html"}],"keywords":["graph","graph theory","vertex","edge","node","connection"],"engines":{"node":">= 0.1.99"},"scripts":{"test":"Test/Graph.js"},"_id":"Graph@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Graph/-/Graph-0.0.1.tgz"},"mtime":"2010-11-09T23:25:38Z","ctime":"2010-11-09T23:25:38Z"}},"maintainers":[{"name":"yoni","email":"yoni.bmesh@gmail.com"}],"mtime":"2010-11-09T23:25:38Z","ctime":"2010-11-09T23:25:38Z","author":{"name":"Yoni Ben-Meshulam","email":"yoni.bmesh@gmail.com"},"_attachments":{"Graph-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PTBJscNrq32z1O6xKKdoPw==","length":70478,"stub":true}}}},
{"id":"GridFS","key":"GridFS","value":{"rev":"33-77b8b5d0626e0836e80a4f389760efe6"},"doc":{"_id":"GridFS","_rev":"33-77b8b5d0626e0836e80a4f389760efe6","name":"GridFS","description":"GridFS made easy.","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.2":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.2","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":"v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.2","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"58f12316477598b992ea82af657ddd7bad7cd8ff","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.2.tgz"}},"0.0.3":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.3","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":"v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.3","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a340e0d9d11bc248263351a46c4dc0d8a0195bc1","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.3.tgz"}},"0.0.4":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.4","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":"v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.4","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a0a9968205ff7f32556f7dfc71f3ead69a558868","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.4.tgz"}},"0.0.5":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.5","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":"v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.5","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b76eb2ea3ca7779698be7c69c4c44e1204d9119a","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.5.tgz"}},"0.0.6":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.6","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":">=v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib","tests":"./tests"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.6","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"2e3d0a61d4ad942e725f040406f33a7501a21633","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.6.tgz"},"maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}]},"0.0.7":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.7","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":">=v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib","tests":"./tests"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.7","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"afe94611ab3b821d587f18198259bb1fe334affd","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.7.tgz"},"maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}]},"0.0.8":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.8","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":">=v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib","tests":"./tests"},"_npmJsonOpts":{"file":"/Users/siddharth_mahen/.npm/GridFS/0.0.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"GridFS@0.0.8","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a1a6c1bb46e272748900ffe0fcb967e7b744cfab","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.8.tgz"},"maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}]},"0.0.9":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.0.9","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":">=v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib","tests":"./tests"},"_npmUser":{"name":"siddmahen","email":"siddharth_mahen@me.com"},"_id":"GridFS@0.0.9","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1d9c78ea06b0c6a8c022c9bd90e108dd91e67d6a","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.0.9.tgz"},"maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}]},"0.1.0":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.1.0","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":">=v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib","tests":"./tests"},"_npmUser":{"name":"siddmahen","email":"siddharth_mahen@me.com"},"_id":"GridFS@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"068bbb6a8b5f2be6f569b2d5f2a8a4fbe5aefeeb","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.1.0.tgz"},"maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}]},"0.2.0":{"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"name":"GridFS","description":"GridFS made easy.","version":"0.2.0","homepage":"https://github.com/siddMahen/GridFS","keywords":["GridFS","mongodb"],"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"main":"index","scripts":{"test":"make tests"},"engines":{"node":">=v0.4.9"},"dependencies":{"mongodb":">=0.9.6-7"},"devDependencies":{},"directories":{"lib":"./lib","tests":"./tests"},"_npmUser":{"name":"siddmahen","email":"siddharth_mahen@me.com"},"_id":"GridFS@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"41a01ac0643bcb39baac7e9581a08925b4ecf6c7","tarball":"http://registry.npmjs.org/GridFS/-/GridFS-0.2.0.tgz"},"readme":"# GridFS\n\nSimple yet powerful GridFS capabilities built on [node-mongodb-native](https://github.com/christkv/node-mongodb-native \"node-mongodb-native\").\n \n## Installation:\n\nInstall using npm:\n<pre>\nnpm install GridFS\n</pre>\n\nThen include GridFS in your projects:\n<pre>\nvar GridFS = require('GridFS').GridFS;\nvar GridStream = require('GridFS').GridStream;\n</pre>\n\n## Tests:\n\nTo run the tests:\n<pre>\nmake tests\n</pre>\n\n## Examples:\n\nA simple Hello World example using GridFS.\n<pre>\nvar GridFS = require('GridFS').GridFS;\n\n// Use the test database\nvar myFS = new GridFS('test');\nvar text = new Buffer('Hello World!');\n\n// Functions are performed in the order they are queued\nmyFS.put(text, 'Hello World!', 'w', function(err){\n\tif(err) console.log(err);\n});\n\nmyFS.get('Hello World!',function(err,data){\n\tconsole.log(data);\n});\n\n// Functions called on a GridFS object after it has closed will be queued to perform \n// when it opens again.\nmyFS.close();\n</pre>\n\nA similar example using GridStream.\n<pre>\nvar GridStream = require('GridFS').GridStream;\n\n// Use the test database and open or create 'Hello World!'\nvar writeStream = GridStream.createGridWriteStream('test','Hello World!','w');\n\nwriteStream.write('Hello World!');\nwriteStream.end();\n</pre>\n\n## Documentation:\n\nClick [here](http://siddmahen.github.com/GridFS) to view the documentation online, or look at the source.\n\n## License:\n\n(The MIT License)\n\nCopyright (C) 2011 by Siddharth Mahendraker\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}]}},"maintainers":[{"name":"siddmahen","email":"siddharth_mahen@me.com"}],"time":{"modified":"2012-03-31T19:22:07.891Z","created":"2011-07-21T11:30:02.514Z","0.0.2":"2011-07-21T11:30:03.273Z","0.0.3":"2011-07-21T20:05:49.851Z","0.0.4":"2011-07-23T11:50:46.881Z","0.0.5":"2011-07-24T12:55:47.513Z","0.0.6":"2011-07-25T12:53:34.031Z","0.0.7":"2011-08-03T17:55:24.203Z","0.0.8":"2011-09-09T17:12:43.574Z","0.0.9":"2011-11-06T00:31:31.994Z","0.1.0":"2011-11-23T21:04:10.302Z","0.2.0":"2012-03-31T19:22:07.891Z"},"author":{"name":"Siddharth Mahendraker","email":"siddharth_mahen@me.com"},"repository":{"type":"git","url":"git://github.com/siddMahen/GridFS.git"},"_attachments":{"GridFS-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-7hKnY7AcNynIlW/O5h/a0A==","length":7882,"stub":true},"GridFS-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-nG5orVuN5e07XjZwg6jbyA==","length":10240,"stub":true},"GridFS-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-0xhFrCScSq7fXxzSwcSKMQ==","length":10240,"stub":true},"GridFS-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-pDNIO4sFguzppIP+EzMgYQ==","length":7873,"stub":true},"GridFS-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Qla+ugoXa+5B8EnoNHWW8Q==","length":7828,"stub":true},"GridFS-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-hnrBhqQPPtepE94ljONeIQ==","length":7811,"stub":true},"GridFS-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-joLlS9hM7qbPCg8R3rnmEg==","length":7545,"stub":true},"GridFS-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-N1rEwzlafIA1YCev5zWJTw==","length":7249,"stub":true},"GridFS-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sue1DErIKClHlWEcKptzIg==","length":7227,"stub":true},"GridFS-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9A2NEFrnRT5GamP14W7Hlw==","length":6816,"stub":true}}}},
{"id":"HTTPRequest","key":"HTTPRequest","value":{"rev":"19-e0bee8dddc0f4c6e58f635d95deb1dfb"},"doc":{"_id":"HTTPRequest","_rev":"19-e0bee8dddc0f4c6e58f635d95deb1dfb","name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","dist-tags":{"latest":"0.0.9"},"versions":{"0.0.1":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.1","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"43afb2dcbe1be4f446605bdb3f305b6eb3663eb3","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.1.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.2":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.2","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"14c0cd745b917aa09bf34f08dd286d59c9de0f6e","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.2.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.3":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.3","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f1560a80975d669dd4ff0fa2d63f43e864b3da3e","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.3.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.4":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.4","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2c922a303ff1aa3f934a4195371d84e838c3da6d","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.4.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.5":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.5","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"53a9e1e95a703f20e9baab2d5ee6bf17ef74922a","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.5.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.6":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.6","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cadfbfb0d7365c38a6b9de567fcb22b1e6b03143","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.6.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.7":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.7","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f8c524c23bc1d3216b1db88de61cb0a5aeadc8e9","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.7.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.8":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.8","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d1b7b7041683689a30f9b837a627f7672d08c011","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.8.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.0.9":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"HTTPRequest","description":"A simple yet powerful HTTP request library inspired by jQuery and LSL.","version":"0.0.9","repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"main":"HTTPRequest.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"HTTPRequest@0.0.9","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"115d2a4cb1cffd6dc4272f276f795dedd25f68a2","tarball":"http://registry.npmjs.org/HTTPRequest/-/HTTPRequest-0.0.9.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]}},"readme":"#HTTPRequest v0.0.1#\n\nA simple yet powerful HTTP request library inspired by jQuery and LSL written in Javascript for clientside and Serverside(Node.js) Javascript. Major thanks to [node-XMLHttpRequest](https://github.com/driverdan/node-XMLHttpRequest) for giving us a XMLHttpRequest Object, that really helps make this both client/server.\n\n## Setup##\n\nTo set up HTTPRequest on your Node.js server use npm(case sensitive package name).\n\n\tnpm install HTTPRequest\n\nIf you want to use HTTPRequest on the client-side (browser), just include HTTPRequest.js into your page.\n\n\t<script type='text/javascript' src='HTTPRequest.js'></script>\n\n##Example##\nFirst, you have to do is require the HTTPRequest module (if you're using it client-side, this isn't necessary).\n\n\tvar HTTPRequest = require('HTTPRequest');\n\n```\nHTTPRequest.get('get_test.php', function(status, headers, content)\n{\n\tconsole.log(status, headers, content);\n});\n```\n\n##request##\n`request(url, parameters, callback)`\nA lower level function, but I hope you never really need to use it as `post`, `get` is a wrapper around it.\n\n##post##\n\n`post(url, data, callback, options)`\n\nA url, data(object, can be empty also `{}`), callback are required.\noptions is not required, but it can be a object.\n\n##get##\n`get(url, callback, options)`\nurl and callback are required. \n\noptions is not required, but it can be a object.\n\n##delete##\n`del(url, callback, options)`\n\nsame as get\n\n##put##\n`put(url, data, callback, options)`\n\nsame as post\n\n##encode##\n`encode(url)`\n\ntakes a url and escapes it, then returns it.\n\n##decode##\n`encode(url)`\n\ntakes a decodeed url and Unencode's it, then returns it.\n\n\n##options##\n\n*option names are NOT case sensitive.\n\n* `USERAGENT` - string - Write your own [user agent](http://en.wikipedia.org/wiki/User_agent), default is `node.js`. Setting this ONLY works on the server.\n* `QUERY` - `string` or `object` - appends to the end of the `url`.\n* `DATA` - `'POST'` or `'PUT'` data `string` or `object`\n\n##parameters##\nEverything as options, but also:\n\n`METHOD` - string - `'GET'`, `'POST'`, `'PUT'` and `'DELETE'`, default is `'GET'`\n\n##callback##\n\n`status, headers, content`\n\n* `status` - is HTTP code (like 404 or 200)\n* `headers` - is a object with the respone headers\n* `content` - The metadata `","maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}],"time":{"modified":"2012-06-06T23:56:08.756Z","created":"2012-06-03T00:25:13.167Z","0.0.1":"2012-06-03T00:25:14.071Z","0.0.2":"2012-06-03T10:58:20.745Z","0.0.3":"2012-06-06T03:39:52.748Z","0.0.4":"2012-06-06T06:21:45.848Z","0.0.5":"2012-06-06T16:08:23.459Z","0.0.6":"2012-06-06T16:26:27.225Z","0.0.7":"2012-06-06T18:24:45.348Z","0.0.8":"2012-06-06T18:52:29.869Z","0.0.9":"2012-06-06T23:56:08.756Z"},"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"repository":{"type":"git","url":"git://github.com/keverw/HTTPRequest.git"},"_attachments":{"HTTPRequest-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-s0+Vik+hxCp02sQzwEvf7A==","length":10929,"stub":true},"HTTPRequest-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-qtTr7qEa7yNtd5M778gaSQ==","length":10936,"stub":true},"HTTPRequest-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-KjMktvzGD66umSb1e5nwkA==","length":10962,"stub":true},"HTTPRequest-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-lFHHkrvzUsGgRZsweK3WvQ==","length":10977,"stub":true},"HTTPRequest-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+40Mo/9yXNgGxTI71AbbRw==","length":10952,"stub":true},"HTTPRequest-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-siiyfn2x+xq2Bfe6YnVzYw==","length":10904,"stub":true},"HTTPRequest-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yO82qGzJMc2AiREUsgeCHw==","length":10847,"stub":true},"HTTPRequest-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AHQCGTYqQLDkBbCUPhldpA==","length":9252,"stub":true},"HTTPRequest-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-I6YAqI3jE2QokIRkaiRXnA==","length":9091,"stub":true}}}},
{"id":"Haraka","key":"Haraka","value":{"rev":"59-2aa8628beae0174417d97aaa29ff1cb4"},"doc":{"_id":"Haraka","_rev":"59-2aa8628beae0174417d97aaa29ff1cb4","name":"Haraka","description":"An SMTP Server project.","dist-tags":{"latest":"1.3.3"},"versions":{"0.5.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"35e5431b6c76460e52e2d1b2ac7082b28aab80ce","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.0.tgz"}},"0.5.1":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.1","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"4215e5ccfd092c1ab0b258de12f397a06cc1d114","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.1.tgz"}},"0.5.2":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.2","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"279da5ce9efd6cf8eb70af11757f8049a429d9e8","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.2.tgz"}},"0.5.3":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.3","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"d2828f8967bb6955668b7454cd6491bd7d826139","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.3.tgz"}},"0.5.4":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.4","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"e4a1873b778b32a6daca1a652790ce68d17ca90d","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.4.tgz"}},"0.5.5":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.5","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"abb112a82680c57fd1d1645548d5ad1a4e4e442a","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.5.tgz"}},"0.5.6":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.6","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"eced928218fc23db96fbec98a3a6d52d1c019aa0","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.6.tgz"}},"0.5.7":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.7","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"998b87ef4121b3e35801f35688435100d7736002","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.7.tgz"}},"0.5.8":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.8","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"05265a5f91ec142f10da06dcbe8b2aae8b947188","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.8.tgz"}},"0.5.9":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.9","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.9","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0217f0588cdc515f164d63bd2049d3917cb63697","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.9.tgz"}},"0.5.10":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.10","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.10","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a316aced1006c62f8691b5a602fa734e47422d64","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.10.tgz"}},"0.5.11":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.5.11","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.5.11","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e584f5c619360f3b73e6e35720f99e5f6cae716e","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.5.11.tgz"}},"0.6.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.6.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.6.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"4fe3d15d9bd812643dc473c66e67614c10b07763","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.6.0.tgz"}},"0.6.1":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.6.1","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.6.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"85d1490d3d03ddaf9cafd97a98b5340788b5e63f","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.6.1.tgz"}},"0.7.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.7.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.7.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"73543fefe615c2c5a524ba11d8196bc47f8201e6","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.7.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"0.7.1":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.7.1","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.7.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"45d5b3a2f0d04a959284e561c11908840df53366","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.7.1.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"0.7.2":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.7.2","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmJsonOpts":{"file":"/Users/matt/.npm/Haraka/0.7.2/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"Haraka@0.7.2","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.4-pre","_defaultsLoaded":true,"dist":{"shasum":"9a8a9254bb053fef693d2a571a4b8f9a5b49f23a","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.7.2.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"0.8.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.8.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.8.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3df5d9ba8f0a11ccfe1ebc5bfde243de21d3fc5e","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.8.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"0.9.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"0.9.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@0.9.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"1f46dc1e29b32dd9c708f5cd8e95af9ed723167a","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-0.9.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.0.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"1.0.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@1.0.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"20448065213b198e461ea54f632fa0a858f82ac2","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.0.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.0.1":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"1.0.1","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"d492ce72bd723c9d0f9ee9f1c364b1ab9bb88274","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.0.1.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.0.2":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"1.0.2","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b5d07c4ce87c08ffa48ec5c174ef276382ad55d3","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.0.2.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.1.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email","cluster"],"version":"1.1.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"cluster":">= 0.6.1","nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.1.0","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"cfc0ebf497021f1ae94c5646402011c248f55350","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.1.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.2.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email"],"version":"1.2.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"scripts":{"start":"node server.js"},"devDependencies":{},"_id":"Haraka@1.2.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"c763a938c4ceb346e479b71903bb19eee2b4e3cd","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.2.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.2.1":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email"],"version":"1.2.1","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"nopt":">= 1.0.5"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.2.1","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b5ffcceede638592fb8d0419266aace6a4e0e665","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.2.1.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.3.0":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email"],"version":"1.3.0","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"nopt":">= 1.0.5","generic-pool":">= 1.0.9"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.3.0","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"bd9c454e6211811e3c82ad9f46c018b79e53d607","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.3.0.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.3.1":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email"],"version":"1.3.1","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"nopt":">= 1.0.5","generic-pool":">= 1.0.9","node-syslog":">= 1.1.2","iconv":">= 1.1.3","nodeunit":"git://github.com/godsflaw/nodeunit.git"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.3.1","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0e11f75ed18b0d100c53f5586e0c7f52011d7f5f","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.3.1.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.3.2":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email"],"version":"1.3.2","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"nopt":">= 1.0.5","generic-pool":">= 1.0.9","node-syslog":">= 1.1.2","iconv":">= 1.1.3","nodeunit":"git://github.com/godsflaw/nodeunit.git"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.3.2","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"9f2cda13ef13ebb2c53c58036f66df806c34603e","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.3.2.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]},"1.3.3":{"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"name":"Haraka","description":"An SMTP Server project.","keywords":["haraka","smtp","server","email"],"version":"1.3.3","homepage":"https://github.com/baudehlo/Haraka/","repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"main":"haraka.js","engines":{"node":">= v0.4.0"},"dependencies":{"nopt":">= 1.0.5","generic-pool":">= 1.0.9","node-syslog":">= 1.1.2","iconv":">= 1.1.3","nodeunit":"git://github.com/godsflaw/nodeunit.git"},"licenses":[{"type":"MIT","url":"https://github.com/baudehlo/Haraka/blob/master/LICENSE"}],"bugs":{"email":"helpme@gmail.com","url":"https://github.com/baudehlo/Haraka/issues"},"bin":{"haraka":"./bin/haraka"},"_npmUser":{"name":"msergeant","email":"helpme+npm@gmail.com"},"_id":"Haraka@1.3.3","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"d709bb395285f4857c75884a6a5f92bbf42e7147","tarball":"http://registry.npmjs.org/Haraka/-/Haraka-1.3.3.tgz"},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}]}},"maintainers":[{"name":"msergeant","email":"helpme+npm@gmail.com"}],"time":{"modified":"2012-06-08T14:24:00.744Z","created":"2011-05-11T21:12:54.824Z","0.5.0":"2011-05-11T21:12:55.461Z","0.5.1":"2011-05-12T21:55:52.721Z","0.5.2":"2011-05-20T05:07:28.494Z","0.5.3":"2011-05-24T23:57:56.860Z","0.5.4":"2011-05-27T23:25:10.627Z","0.5.5":"2011-05-30T12:40:29.099Z","0.5.6":"2011-06-02T22:59:19.248Z","0.5.7":"2011-06-03T12:40:35.444Z","0.5.8":"2011-06-04T15:32:48.343Z","0.5.9":"2011-06-11T21:27:56.660Z","0.5.10":"2011-06-17T21:58:23.400Z","0.5.11":"2011-06-18T01:09:59.321Z","0.6.0":"2011-06-29T22:50:24.847Z","0.6.1":"2011-07-07T19:22:10.450Z","0.7.0":"2011-08-04T18:53:57.072Z","0.7.1":"2011-08-06T01:42:04.606Z","0.7.2":"2011-08-11T03:31:56.814Z","0.8.0":"2011-08-18T22:36:18.844Z","0.9.0":"2011-09-12T23:06:17.074Z","1.0.0":"2011-10-14T18:13:43.470Z","1.0.1":"2011-10-25T22:46:02.670Z","1.0.2":"2011-11-11T20:15:58.691Z","1.1.0":"2012-01-08T17:01:58.527Z","1.2.0":"2012-02-27T17:57:58.431Z","1.2.1":"2012-03-22T00:51:51.317Z","1.3.0":"2012-04-19T18:57:59.655Z","1.3.1":"2012-06-04T21:50:45.784Z","1.3.2":"2012-06-05T22:35:51.416Z","1.3.3":"2012-06-08T14:24:00.744Z"},"author":{"name":"Matt Sergeant","email":"helpme@gmail.com","url":"http://baudehlo.wordpress.com/"},"repository":{"type":"git","url":"git://github.com/baudehlo/Haraka.git"},"_attachments":{"Haraka-1.3.3.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-vAe2H7NzP9lfpqhfPFR5Pw==","length":153600,"stub":true},"Haraka-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-lQwVwLfewxEt2PVjzRmpOQ==","length":153600,"stub":true},"Haraka-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-d1s4PrYfGMtaCoR+jYMqIw==","length":153600,"stub":true},"Haraka-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-c8CNSPJ2QpJ1oU24AMJ9vA==","length":143360,"stub":true},"Haraka-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-LvuAr9jlC7YHIg/3aTJyBQ==","length":143360,"stub":true},"Haraka-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-ijFwbpxjkVU55DVDpCakGw==","length":134090,"stub":true},"Haraka-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-7ZHdjAA0gxj/OeGovHAa2g==","length":122880,"stub":true},"Haraka-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-T90uNNOOk/QQLlMXwp4I9Q==","length":112640,"stub":true},"Haraka-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-q66HFitVJ7Iw+FpVdqQKRg==","length":102400,"stub":true},"Haraka-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-jgylNgKgMIbsCL32gYiwag==","length":98883,"stub":true},"Haraka-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-hSXbEciAZddlHfUrtbQ1uw==","length":85407,"stub":true},"Haraka-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-NJ2lvtxyO6xoqOC/Dph2HQ==","length":73722,"stub":true},"Haraka-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-kCcXIm2hAU/c3yi0wWTNiA==","length":72438,"stub":true},"Haraka-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-8qlzrXfohxMht0litHQScg==","length":71953,"stub":true},"Haraka-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-JoENJBMXmg+SmBR/n+kpsA==","length":71909,"stub":true},"Haraka-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-4FGiCdBSFIDoGaoSzKBU1Q==","length":71450,"stub":true},"Haraka-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Z1/VEEXWUf/StpzQpS4vug==","length":71383,"stub":true},"Haraka-0.5.11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-yzOhU9X/qgXEHfFyBIx6jQ==","length":69214,"stub":true},"Haraka-0.5.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-KOCkIri8X6qoLfRG6VtHWg==","length":69242,"stub":true},"Haraka-0.5.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-y7mX5dCjyNBNl+NxiENahA==","length":69288,"stub":true},"Haraka-0.5.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-JtWOr9igxqtXC7CUygbIlQ==","length":68943,"stub":true},"Haraka-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-cIXGyRoITsPLAKWJsnMmKg==","length":68948,"stub":true},"Haraka-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-YP8rig86Ysmx+qyMG949dQ==","length":68934,"stub":true},"Haraka-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-AoEVLYM7T8NPBEf2z2sTVQ==","length":67876,"stub":true},"Haraka-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MdbZzojL8GSwsgGq4f02xw==","length":67291,"stub":true},"Haraka-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-wGmOhcYO7CrgtZialG4Nsw==","length":66715,"stub":true},"Haraka-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3XncDoyetzpVc64s6HxUNQ==","length":66042,"stub":true},"Haraka-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UagQE3YZgtXOkSIqAzHCqQ==","length":64088,"stub":true},"Haraka-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fwnvIzkNewfbw0gUL+4g1g==","length":64145,"stub":true}}}},
{"id":"HuK","key":"HuK","value":{"rev":"13-92503035f4dc63811831b7114f4a4240"},"doc":{"_id":"HuK","_rev":"13-92503035f4dc63811831b7114f4a4240","name":"HuK","description":"A library generating HTML code","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"HuK","description":"A library generating HTML code","version":"1.0.0","homepage":"https://github.com/gerhardberger/HuK","authors":"Gerhard Berger <@gerhard_berger>","repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"dependencies":{"bonzo":"*","bean":"*"},"main":"./HuK.js","keywords":["html","generate","template"],"_npmUser":{"name":"gerhardberger","email":"93.morph@gmail.com"},"_id":"HuK@1.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"0cabfeaa3a531bdf73dd5f77d96a03ec24800396","tarball":"http://registry.npmjs.org/HuK/-/HuK-1.0.0.tgz"},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}]},"1.0.1":{"name":"HuK","description":"A library generating HTML code","version":"1.0.1","homepage":"https://github.com/gerhardberger/HuK","authors":"Gerhard Berger <@gerhard_berger>","repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"dependencies":{"bonzo":"*","bean":"*"},"main":"./HuK.js","ender":"./ender.js","keywords":["html","generate","template"],"_npmUser":{"name":"gerhardberger","email":"93.morph@gmail.com"},"_id":"HuK@1.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"75afcd1f148095f269f6bd29ed273d18a2cd7842","tarball":"http://registry.npmjs.org/HuK/-/HuK-1.0.1.tgz"},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}]},"1.0.2":{"name":"HuK","description":"A library generating HTML code","version":"1.0.2","homepage":"https://github.com/gerhardberger/HuK","authors":"Gerhard Berger <@gerhard_berger>","repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"dependencies":{"bonzo":"*","bean":"*"},"main":"./HuK.js","ender":"./ender.js","keywords":["html","generate","template"],"_npmUser":{"name":"gerhardberger","email":"93.morph@gmail.com"},"_id":"HuK@1.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"b0614af7626087728b9bc825557cb98c8e4ad5d6","tarball":"http://registry.npmjs.org/HuK/-/HuK-1.0.2.tgz"},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}]},"1.0.3":{"name":"HuK","description":"A library generating HTML code","version":"1.0.3","homepage":"https://github.com/gerhardberger/HuK","authors":"Gerhard Berger <@gerhard_berger>","repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"dependencies":{"bonzo":"*","bean":"*"},"main":"./HuK.js","ender":"./ender.js","keywords":["html","generate","template"],"_npmUser":{"name":"gerhardberger","email":"93.morph@gmail.com"},"_id":"HuK@1.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"780e309779da38290495bae19b98322e41e1db83","tarball":"http://registry.npmjs.org/HuK/-/HuK-1.0.3.tgz"},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}]},"1.0.4":{"name":"HuK","description":"A library generating HTML code","version":"1.0.4","homepage":"https://github.com/gerhardberger/HuK","authors":"Gerhard Berger <@gerhard_berger>","repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"dependencies":{"bonzo":"*","bean":"*"},"main":"./HuK.js","ender":"./ender.js","keywords":["html","generate","template"],"_npmUser":{"name":"gerhardberger","email":"93.morph@gmail.com"},"_id":"HuK@1.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"c0dc23f86fb09b76f81eccc5b22db34bd726aafd","tarball":"http://registry.npmjs.org/HuK/-/HuK-1.0.4.tgz"},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}]},"1.0.5":{"name":"HuK","description":"A library generating HTML code","version":"1.0.5","homepage":"https://github.com/gerhardberger/HuK","authors":"Gerhard Berger <@gerhard_berger>","repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"dependencies":{"qwery":"*","bonzo":"*","bean":"*"},"main":"./HuK.js","ender":"./ender.js","keywords":["html","generate","template"],"_npmUser":{"name":"gerhardberger","email":"93.morph@gmail.com"},"_id":"HuK@1.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"c7e1d7670c08a046f986c3a18bf90e027df26fda","tarball":"http://registry.npmjs.org/HuK/-/HuK-1.0.5.tgz"},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}]}},"readme":"","maintainers":[{"name":"gerhardberger","email":"93.morph@gmail.com"}],"time":{"modified":"2012-04-08T14:05:25.030Z","created":"2012-03-16T15:08:31.593Z","1.0.0":"2012-03-16T15:08:34.290Z","1.0.1":"2012-03-16T17:40:19.611Z","1.0.2":"2012-03-16T17:48:52.407Z","1.0.3":"2012-04-05T18:16:49.220Z","1.0.4":"2012-04-08T13:58:56.285Z","1.0.5":"2012-04-08T14:05:25.030Z"},"repository":{"type":"git","url":"git@github.com:gerhardberger/HuK.git"},"_attachments":{"HuK-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-8Q2xZucv07iIsjLVTivHCg==","length":5757,"stub":true},"HuK-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jddc1JuDmpolqWpLFfo9/g==","length":5718,"stub":true},"HuK-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-QYyQyRuoncDqgDqubtluVQ==","length":3847,"stub":true},"HuK-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DTmst/hvdKRdScyH1FxNtg==","length":3931,"stub":true},"HuK-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RJRFhvXFOHsOdkYIoh02jA==","length":3926,"stub":true},"HuK-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ReJkyafLxh4qSqvvQyw0nw==","length":3855,"stub":true}}}},
{"id":"II","key":"II","value":{"rev":"3-4d03dfa78125c8c26ddc256edcca917b"},"doc":{"_id":"II","_rev":"3-4d03dfa78125c8c26ddc256edcca917b","name":"II","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"II","version":"0.1.0","author":{"name":"Sabin Marcu","email":"sabinmarcu@gmail.com"},"dependencies":{"stitchw":">=0.3.x","coffee-script":">=1.2.0"},"devDependencies":{"express":">=2.x.x"},"_npmUser":{"name":"sabinmarcu","email":"sabinmarcu@gmail.com"},"_id":"II@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.7.3","_defaultsLoaded":true,"dist":{"shasum":"9f9d3f86440b0ed5704de05aaffaefb56fbb478a","tarball":"http://registry.npmjs.org/II/-/II-0.1.0.tgz"},"readme":"","maintainers":[{"name":"sabinmarcu","email":"sabinmarcu@gmail.com"}]}},"readme":"","maintainers":[{"name":"sabinmarcu","email":"sabinmarcu@gmail.com"}],"time":{"modified":"2012-02-15T18:12:28.879Z","created":"2012-02-15T18:12:25.560Z","0.1.0":"2012-02-15T18:12:28.879Z"},"author":{"name":"Sabin Marcu","email":"sabinmarcu@gmail.com"},"_attachments":{"II-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EuhpYDp8KRxRw16mZjUbmA==","length":2163,"stub":true}}}},
{"id":"IIF","key":"IIF","value":{"rev":"3-67f0e734e06f0a0b17eeb6c7e21e1621"},"doc":{"_id":"IIF","_rev":"3-67f0e734e06f0a0b17eeb6c7e21e1621","name":"IIF","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"IIF","version":"0.1.0","author":{"name":"Sabin Marcu","email":"sabinmarcu@gmail.com"},"dependencies":{"stitchw":">=0.3.x","coffee-script":">=1.2.0"},"devDependencies":{"express":">=2.x.x"},"_npmUser":{"name":"sabinmarcu","email":"sabinmarcu@gmail.com"},"_id":"IIF@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"15107fcabc1a0f36c688b8eef852cbaa4904827f","tarball":"http://registry.npmjs.org/IIF/-/IIF-0.1.0.tgz"},"maintainers":[{"name":"sabinmarcu","email":"sabinmarcu@gmail.com"}]}},"readme":"# What is this?\r\nWell, i've gotten mighty tired of the conventional programming patterns, and i stumbled upon a very intrested ideea in [Alex McCaw's book](http://alexmccaw.com/) about Web Applications, and decided to walk on that path.\r\n\r\n## What's the catch?\r\nWith every object that inherits the model, you get to construct its controller at the same time, from the same object. I'll show you...\r\n\r\nHere is how you would create a Users model :\r\n\r\n```coffeescript\r\nclass User extends require(\"Model\") \t\t\t// using CommonJS here to get the module\r\n\t@extend require(\"EventHandler\")\t\t\t\t// Mixin the EventHandler into the controller\r\n\t@include require(\"EventHandler\")\t\t\t// Mixin the EventHandler into the model\r\n\t/* These methods belong *controller* part of the object */\r\n\t@getAllUsers: (data) ->\t\t\t\t\t\t// fetches data from the server, let`s say, as a callback to a socket.io event\r\n\t@removeAllUsers: () -> \t\t\t\t\t\t// removes all of the users stored on the client side\r\n\t@fetchUsersFromLocalStorage: () -> \t\t\t// recover users saved in the HTML5 LocalStorage\r\n\t/* And now, these methods belong to the individual instances of the object, the *model* */\r\n\tinit: (json) -> \t\t\t\t\t\t\t// Do something with the data \r\n\tsetName: (string) -> \t\t\t\t\t\t// Set the name of the individual user\r\n\t/* And so forth */\r\n```\r\n\r\nOh and, here is how your getAllUsers:\r\n\r\n```coffeescript\r\n\t...\r\n\t/* Let`s suppose the data is transfered using jsons in the form of *id*: _userdata_ */\r\n\t@getAlLUsers: (data) ->\r\n\t\t@create(userdata, id) for id, userdata of data \r\n\t\t\t// the *@create* method creates a new model, and calls the init method of the model created\r\n\t...\r\n```\r\n\r\nBecause we extended the controller with _EventHandler_ object, we can now create a new event to handle the user data.\r\n\r\n```coffeescript\r\n...\r\nrequire(\"EventHandler\") \t\t\t\t\t\t// Making sure the EventHandler is registered\r\nEventHandler.subscribe \"getAllUserData\", User.getAllUsers\r\nIO = socket.io.connect(\"some_address\")\t\t\t// Connecting to a WebSocket\r\nIO.on \"getAllUserData\", (err, json) ->\t\t\t// Handling the event\r\n\tif err then trigger err\t\t\t\t\t\t// Taking care of the errors\r\n\tEventHandler.publish \"getAllUSerData\", json // Triggering the event\r\n...\r\n```\r\n\r\nStarting from this, we can use the event substructure to make the @removeAllUsers easier :\r\n\r\n```coffeescript\r\n\t...\r\n\tsubscribe \"removeAllObjects\", @remove \t\t// Subscribe each model to the removeAllObjects event\r\n\t...\r\n\t@removeAllUsers() -> \r\n\t\t@publish \"removeAllObjects\"\t\t\t\t// Trigger the removeAllObjects event\r\n\t...\r\n```\r\n\r\nWhen the removeAllObjects event is triggered on the user controller, all of the users will react to it, removing themselves automatically.\r\n\r\nYou see, between controllers and events, there is nothing easier than programming in CoffeeScript :)\r\n\r\nAnyways, currently only a StateMachine is implemented to demonstrate the EventHandler and the Model classes.\r\n\r\n## Have fun :)\r\n","maintainers":[{"name":"sabinmarcu","email":"sabinmarcu@gmail.com"}],"time":{"modified":"2012-02-16T13:09:43.877Z","created":"2012-02-16T13:09:41.601Z","0.1.0":"2012-02-16T13:09:43.877Z"},"author":{"name":"Sabin Marcu","email":"sabinmarcu@gmail.com"},"_attachments":{"IIF-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-03PE1Ooo1+qhFtpmndM/rg==","length":3377,"stub":true}}}},
{"id":"IO","key":"IO","value":{"rev":"3-1e0f47bcb471b489ce0d76983e34723c"},"doc":{"_id":"IO","_rev":"3-1e0f47bcb471b489ce0d76983e34723c","name":"IO","description":"Rapid Testing of available/unavailable .IO TLDs w/ WordLists","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"IO","description":"Rapid Testing of available/unavailable .IO TLDs w/ WordLists","version":"0.0.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/IO.git"},"keywords":["io",".io","register","registrar","bulk"],"main":"./lib/io","engines":{"node":"~v0.4.11"},"dependencies":{"request":"2.2.5"},"devDependencies":{"vows":"0.5.13","should":"0.9.2"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"IO@0.0.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0c343780a2c82148c490e47f2a781cd6f73ad8ec","tarball":"http://registry.npmjs.org/IO/-/IO-0.0.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]}},"readme":"\nIO\n==\n\n\tRapid Testing of available/unavailable .IO TLDs w/ WordLists & REST API","maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"time":{"modified":"2011-11-21T23:56:35.252Z","created":"2011-11-21T23:56:34.786Z","0.0.2":"2011-11-21T23:56:35.252Z"},"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"repository":{"type":"git","url":"git://github.com/edwardhotchkiss/IO.git"},"_attachments":{"IO-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iD4vobpkN6ABUTti7hM2ig==","length":10240,"stub":true}}}},
{"id":"Index","key":"Index","value":{"rev":"53-8c6764ae0a99401af0487360bc662e9e"},"doc":{"_id":"Index","_rev":"53-8c6764ae0a99401af0487360bc662e9e","name":"Index","description":"bakes index files, feeds and tag pages for websites","dist-tags":{"latest":"0.5.3"},"versions":{"0.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files or feeds for websites","version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"lib/Index.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"48ccfb4aaf4276dc0b349eacffffc54259ee1779","tarball":"http://registry.npmjs.org/Index/-/Index-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files or feeds for websites","version":"0.0.1","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a20ef5f67a785075373b5396ade4e890650c2ce0","tarball":"http://registry.npmjs.org/Index/-/Index-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files or feeds for websites","version":"0.0.2","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0051e8ba73d6f8fda9d090db03f8252add89072b","tarball":"http://registry.npmjs.org/Index/-/Index-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","version":"0.1.0","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0265f9f101961941c85982fbb3258918f7cb3214","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","version":"0.1.1","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c6d647db350f03f1e59d701b5efea56fbb493d31","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.1.2","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6347b48b03b4b96884a4dbad6649f0e81d736ac1","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.2.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.1.3","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3","clone":">=0.0.0"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fd86b2a63d3e1b13e92ee8aaaf0c74c572a2a831","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.3.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.4":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.1.4","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3","clone":">=0.0.0"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"81b3c9d430b53089cf2b9bc53ff0ee37a8db3830","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.4.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.5":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.1.5","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3","clone":">=0.0.1","isodate":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6a7b4710769b24d4391d330da6e5e2e35ae514ea","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.5.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.6":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.1.6","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3","clone":">=0.0.1","isodate":">=0.0.2"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.1.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"06d4143794f530f2bdef4aa1aaa084de65083a7f","tarball":"http://registry.npmjs.org/Index/-/Index-0.1.6.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.2.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-13","ejs":">=0.4.3","append":">=0.1.0","clone":">=0.0.1","isodate":">=0.0.2"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b527fc676020f68841d0ad198606154daa2247c9","tarball":"http://registry.npmjs.org/Index/-/Index-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.3.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.3.0","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":">=0.9.6-16","ejs":">=0.4.3","append":">=0.1.0","clone":">=0.0.1","esc":">=0.0.1","isodate":">=0.0.2"},"_npmJsonOpts":{"file":"/home/paul/.npm/Index/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Index@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ab03d68907fc27155623d15fec59741770c46a1f","tarball":"http://registry.npmjs.org/Index/-/Index-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.3.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.3.1","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":"0.9.6-23","ejs":">=0.4.3","append":">=0.1.0","clone":">=0.0.1","esc":">=0.0.1","isodate":">=0.0.2"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"0cde198b80e9e8178f406a5c102a68481b259690","tarball":"http://registry.npmjs.org/Index/-/Index-0.3.1.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.3.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["ejs","index","feed","tags"],"version":"0.3.2","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":"0.9.6-23","ejs":">=0.4.3","append":">=0.1.0","clone":">=0.0.1","esc":">=0.0.1","isodate":">=0.0.2"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.3.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"31ba1925dac2e7cd2cfcf95348b7359cc67f5cbe","tarball":"http://registry.npmjs.org/Index/-/Index-0.3.2.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.3.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.3.3","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":"0.9.6-23","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.3.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"02451ecd965bf1f8f3e54e74b477616de164da0e","tarball":"http://registry.npmjs.org/Index/-/Index-0.3.3.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.4.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.4.0","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":"0.9.6-23","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{"async":">=0.1.15"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.4.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7fac14f2b2f96383de489e773b9427224e951f1e","tarball":"http://registry.npmjs.org/Index/-/Index-0.4.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.4.1","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":"0.9.6-23","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{"async":">=0.1.15"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.4.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c648434feafbd632b29f196dbcc489d10fd7988e","tarball":"http://registry.npmjs.org/Index/-/Index-0.4.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.4.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.4.2","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.4.0"},"dependencies":{"mongodb":"0.9.6-23","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{"async":">=0.1.15"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.4.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"580f47652e25515f5b5a3bf34b35274960a13064","tarball":"http://registry.npmjs.org/Index/-/Index-0.4.2.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.5.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.5.0","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.6.0"},"dependencies":{"mongodb":">=0.9.7","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.5.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"858c68ef09dfef94b27f2079d608a330a5dc99c2","tarball":"http://registry.npmjs.org/Index/-/Index-0.5.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.5.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.5.1","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.6.0"},"dependencies":{"mongodb":">=0.9.7","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.5.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"df2618ed5e865e1ff17b7a26d13aa13929837e7c","tarball":"http://registry.npmjs.org/Index/-/Index-0.5.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.5.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.5.2","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.6.0"},"dependencies":{"mongodb":">=0.9.7","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.5.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"59a2ac7b6b3c61189c478032f6fdceb075d0a8c9","tarball":"http://registry.npmjs.org/Index/-/Index-0.5.2.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.5.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"Index","description":"bakes index files, feeds and tag pages for websites","tags":["index","feed","tags"],"version":"0.5.3","repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"bugs":{"url":"https://github.com/pvorb/node-index/issues"},"main":"exports.js","engines":{"node":">=0.6.0"},"dependencies":{"mongodb":">=0.9.7","ejs":">=0.6.1","append":">=0.1.1","clone":">=0.0.4","esc":">=0.0.2","isodate":">=0.1.0"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Index@0.5.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"732fef97bc63aeadb33d599fe4ee762a45f515d3","tarball":"http://registry.npmjs.org/Index/-/Index-0.5.3.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-01-16T16:53:05.688Z","created":"2011-08-26T13:32:47.652Z","0.0.0":"2011-08-26T13:32:50.320Z","0.0.1":"2011-08-27T19:36:40.527Z","0.0.2":"2011-08-27T19:59:10.902Z","0.1.0":"2011-08-29T16:53:36.399Z","0.1.1":"2011-08-29T17:22:13.907Z","0.1.2":"2011-09-01T18:03:04.417Z","0.1.3":"2011-09-03T03:10:18.267Z","0.1.4":"2011-09-03T03:32:46.603Z","0.1.5":"2011-09-03T12:03:48.151Z","0.1.6":"2011-09-03T14:55:40.270Z","0.2.0":"2011-09-03T17:21:11.222Z","0.3.0":"2011-09-15T15:09:40.322Z","0.3.1":"2011-12-09T17:14:00.322Z","0.3.2":"2011-12-09T17:16:11.887Z","0.3.3":"2011-12-31T00:26:06.401Z","0.3.4":"2012-01-06T01:10:46.011Z","0.4.0":"2012-01-06T01:12:34.447Z","0.4.1":"2012-01-06T01:21:42.344Z","0.4.2":"2012-01-08T14:14:34.587Z","0.5.0":"2012-01-10T18:55:57.279Z","0.5.1":"2012-01-16T11:21:59.514Z","0.5.2":"2012-01-16T12:17:34.330Z","0.5.3":"2012-01-16T16:53:05.688Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-index.git"},"_attachments":{"Index-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-YXOMNGmiM/FxarQ8F3rNeg==","length":4000,"stub":true},"Index-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-MwLTSsENPDbCPK/oFTwERA==","length":4014,"stub":true},"Index-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-xiSBSUf6myy+GdlZ/+6JNw==","length":3985,"stub":true},"Index-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-22i/N35O2ulwD5h9UlsPQA==","length":3984,"stub":true},"Index-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-GMa/xEg7eFEwy53CqV3pdg==","length":3920,"stub":true},"Index-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-dQLfSANkKjbQn/4QHvCiXQ==","length":3945,"stub":true},"Index-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-pqt7N93pvUqZgzaMsQpqJQ==","length":3948,"stub":true},"Index-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Al0w9ChQmzf6yikeMeY/rA==","length":3936,"stub":true},"Index-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-A7aCZWAULqGB6cJIeDXX+Q==","length":3986,"stub":true},"Index-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-qEpeuR4JL6kHtDh6eAZzow==","length":3992,"stub":true},"Index-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-APHsKPcuGU78MWlrRxDP5g==","length":3839,"stub":true},"Index-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-TrpYEEx76B2MM0DSB+VN3A==","length":3832,"stub":true},"Index-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-U7Kz8FocHKIC2gIDNcr6BA==","length":3792,"stub":true},"Index-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Wb4KYvTfycb8l7lRayg2Kw==","length":3742,"stub":true},"Index-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-oYc2XO6joaHxZvT8DVoTyA==","length":3630,"stub":true},"Index-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-G2pn/1/pNIyg7MW3Lzruxw==","length":3599,"stub":true},"Index-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-kkcQgOmUknMjCv4Qogc94Q==","length":3523,"stub":true},"Index-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-7OWIb71r1XIPqbE5WOifNw==","length":3489,"stub":true},"Index-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-WaXxygKEZ0ArVcevxG+1sg==","length":3389,"stub":true},"Index-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-q4KovG0MEawe/LwnpVVlqg==","length":3029,"stub":true},"Index-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ioshGovPE1LekRMsJz1sRw==","length":3000,"stub":true},"Index-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-y0eIlO+en9A7SFvipsDDpw==","length":3010,"stub":true}}}},
{"id":"JASON","key":"JASON","value":{"rev":"10-7c750eb0c68ddc2d51747819a7a59474"},"doc":{"_id":"JASON","_rev":"10-7c750eb0c68ddc2d51747819a7a59474","name":"JASON","description":"JSON-like parser/formatter to pass objects between processes and/or threads","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"JASON","description":"JSON-like parser/formatter to pass objects between processes and/or threads","version":"0.1.0","author":{"name":"Jorge Chamorro Bieling"},"main":"index.js","_npmUser":{"name":"bjouhier","email":"bjouhier@gmail.com"},"_id":"JASON@0.1.0","contributors":[{"name":"// JASON AUTHORS"},{"name":"2011-12-04 Jorge Chamorro Bieling","email":"jorge@jorgechamorro.com"},{"name":"2012-01-26 Bruno Jouhier","email":"bjouhier@gmail.com"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"9cb2cb5c0a425114ae6a8b22d5b266955b5def8e","tarball":"http://registry.npmjs.org/JASON/-/JASON-0.1.0.tgz"},"maintainers":[{"name":"bjouhier","email":"bjouhier@gmail.com"}]},"0.1.1":{"name":"JASON","description":"JSON-like parser/formatter to pass objects between processes and/or threads","version":"0.1.1","author":{"name":"Jorge Chamorro Bieling"},"main":"index.js","_npmUser":{"name":"bjouhier","email":"bjouhier@gmail.com"},"_id":"JASON@0.1.1","contributors":[{"name":"// JASON AUTHORS"},{"name":"2011-12-04 Jorge Chamorro Bieling","email":"jorge@jorgechamorro.com"},{"name":"2012-01-26 Bruno Jouhier","email":"bjouhier@gmail.com"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"b74a1ead5fad18a5f4258e69b53d5d99db5df37e","tarball":"http://registry.npmjs.org/JASON/-/JASON-0.1.1.tgz"},"maintainers":[{"name":"bjouhier","email":"bjouhier@gmail.com"}]},"0.1.2":{"name":"JASON","description":"JSON-like parser/formatter to pass objects between processes and/or threads","version":"0.1.2","author":{"name":"Jorge Chamorro Bieling"},"main":"index.js","_npmUser":{"name":"bjouhier","email":"bjouhier@gmail.com"},"_id":"JASON@0.1.2","contributors":[{"name":"// JASON Authors ordered by first contribution."},{"name":"2011-12-04 Jorge Chamorro Bieling","email":"jorge@jorgechamorro.com"},{"name":"2012-01-26 Bruno Jouhier","email":"bjouhier@gmail.com"},{"name":"2012-02-09 Brandon Benvie","email":"brandon@bbenvie.com"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"99806e73510dc5d5fb9f5aff7ac68b5400e55013","tarball":"http://registry.npmjs.org/JASON/-/JASON-0.1.2.tgz"},"maintainers":[{"name":"bjouhier","email":"bjouhier@gmail.com"}]},"0.1.3":{"name":"JASON","version":"0.1.3","main":"index.js","description":"JSON-like parser/formatter to pass objects between processes and/or threads","author":{"name":"Jorge Chamorro Bieling","email":"jorge@jorgechamorro.com"},"homepage":"https://github.com/xk/JASON","bugs":{"email":"jorge@jorgechamorro.com","url":"http://github.com/xk/JASON/issues"},"repository":{"type":"git","url":"git://github.com/xk/JASON.git"},"_npmUser":{"name":"bjouhier","email":"bjouhier@gmail.com"},"_id":"JASON@0.1.3","contributors":[{"name":"// JASON Authors ordered by first contribution."},{"name":"2011-12-04 Jorge Chamorro Bieling","email":"jorge@jorgechamorro.com"},{"name":"2012-01-26 Bruno Jouhier","email":"bjouhier@gmail.com"},{"name":"2012-02-09 Brandon Benvie","email":"brandon@bbenvie.com"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"11c6c73dc22dc336579b780211da1736faa04c2d","tarball":"http://registry.npmjs.org/JASON/-/JASON-0.1.3.tgz"},"maintainers":[{"name":"bjouhier","email":"bjouhier@gmail.com"}]}},"readme":"## JASON\n\nJASON is just like JSON, but unlike JSON it can:\n\n* serialize objects with methods\n* serialize objects with cyclic references\n* understand Dates, Regexps, Booleans, etc, and restore them with `.parse()` with their proper types/classes.\n* understand and serialize all the JS primitives, including `undefined`\n* properly recreate the holes in Arrays\n\nJASON lets you pass objects as text between processes and/or threads.\n\nWarning: unlike JSON, JASON is *unsafe*. You should only use it in contexts where you have strong guarantees that the strings that you pass to the JASON parser have been produced by a JASON formatter from a trusted source.\n\n## Syntax\n\nJASON syntax is just plain JavaScript (but not JSON). \n\nThe `stringify` function does the clever work of generating whatever Javascript is needed to recreate the object, and the `parse` function is just a call to `eval`.\n\n## Examples\n\nSee the `test/test01.js` file.\n\n## API\n\n``` javascript\nvar JASON = require(\"JASON\");\n\nstr = JASON.stringify(obj);\nobj = JASON.parse(str);\n```\n\n# Installation\n\nThe easiest way to install `JASON` is with NPM:\n\n```sh\nnpm install JASON\n```\n\n## License\n\nThis work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).\n","maintainers":[{"name":"bjouhier","email":"bjouhier@gmail.com"},{"name":"jorgechamorro","email":"jorge@jorgechamorro.com"}],"time":{"modified":"2012-04-14T09:07:32.751Z","created":"2012-01-27T09:52:47.747Z","0.1.0":"2012-01-27T09:52:48.256Z","0.1.1":"2012-01-30T21:23:06.507Z","0.1.2":"2012-02-18T19:01:34.901Z","0.1.3":"2012-04-14T09:01:16.268Z"},"author":{"name":"Jorge Chamorro Bieling","email":"jorge@jorgechamorro.com"},"repository":{"type":"git","url":"git://github.com/xk/JASON.git"},"_attachments":{"JASON-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TTY+rwAlQ3ufo+h6JLeQqg==","length":4368,"stub":true},"JASON-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-A1z1vnN563h/ZR1959nNng==","length":3912,"stub":true},"JASON-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BBESBP1ZGgxjfjD0C9UwOA==","length":3293,"stub":true},"JASON-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DAt3kI2i7oqc4VuV4PNq4A==","length":3223,"stub":true}}}},
{"id":"JOSS","key":"JOSS","value":{"rev":"5-aa4aefe8a92253866a71c4b519e7093c"},"doc":{"_id":"JOSS","_rev":"5-aa4aefe8a92253866a71c4b519e7093c","name":"JOSS","description":"JaHOVA OS Server Module","dist-tags":{"latest":"0.8.1"},"versions":{"0.8.0":{"author":{"name":"daniel montgomery"},"name":"JOSS","description":"JaHOVA OS Server Module","version":"0.8.0","repository":{"type":"git","url":"git://github.com/dmonty/JOSS.git"},"engines":{"node":"0.6.6"},"directories":{"doc":"./doc","lib":"./lib","demo":"./demo"},"main":"./lib/JOSS.js","_npmUser":{"name":"dmonty","email":"demonty.montgomery@gmail.com"},"_id":"JOSS@0.8.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1c4a69c15b5871e930313a666fd463f709fc67c3","tarball":"http://registry.npmjs.org/JOSS/-/JOSS-0.8.0.tgz"},"readme":"","maintainers":[{"name":"dmonty","email":"demonty.montgomery@gmail.com"}]},"0.8.1":{"author":{"name":"daniel montgomery"},"name":"JOSS","description":"JaHOVA OS Server Module","version":"0.8.1","repository":{"type":"git","url":"git://github.com/dmonty/JOSS.git"},"engines":{"node":">=0.4"},"directories":{"doc":"./doc","lib":"./lib","demo":"./demo"},"main":"./lib/JOSS.js","_npmUser":{"name":"dmonty","email":"demonty.montgomery@gmail.com"},"_id":"JOSS@0.8.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e2a4f692011de50d8833679f49a6a73c8f44c102","tarball":"http://registry.npmjs.org/JOSS/-/JOSS-0.8.1.tgz"},"readme":"","maintainers":[{"name":"dmonty","email":"demonty.montgomery@gmail.com"}]}},"readme":"","maintainers":[{"name":"dmonty","email":"demonty.montgomery@gmail.com"}],"time":{"modified":"2012-03-13T02:10:04.021Z","created":"2012-03-13T01:21:29.408Z","0.8.0":"2012-03-13T01:21:31.229Z","0.8.1":"2012-03-13T02:10:04.021Z"},"author":{"name":"daniel montgomery"},"repository":{"type":"git","url":"git://github.com/dmonty/JOSS.git"},"_attachments":{"JOSS-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dEULsFu8Q647J6zPkOMEQg==","length":7596,"stub":true},"JOSS-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iGqhgN7Frhsghhj1KzTYKQ==","length":7559,"stub":true}}}},
{"id":"JPath","key":"JPath","value":{"rev":"7-8a3239380220bd2761791cd296604b04"},"doc":{"_id":"JPath","_rev":"7-8a3239380220bd2761791cd296604b04","name":"JPath","description":"","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"JPath","version":"0.1.0","description":"","homepage":"https://github.com/j-san/JPath","keywords":[],"maintainers":[{"name":"jsan","email":"jonathansanchez@me.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/j-san/JPath.git"}],"main":"","devDependencies":{"qunit":"0.2.x"},"scripts":{"test":"node test/index.js"},"_npmUser":{"name":"jsan","email":"jonathansanchez@me.com"},"_id":"JPath@0.1.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6012afe0bab86a6de3825ee708d3c1ef07d0c0e2","tarball":"http://registry.npmjs.org/JPath/-/JPath-0.1.0.tgz"}},"0.1.1":{"name":"JPath","version":"0.1.1","description":"","homepage":"https://github.com/j-san/JPath","keywords":[],"maintainers":[{"name":"jsan","email":"jonathansanchez@me.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/j-san/JPath.git"}],"main":"./src/JPath.js","devDependencies":{"qunit":"0.2.x"},"scripts":{"test":"node test/index.js"},"_npmUser":{"name":"jsan","email":"jonathansanchez@me.com"},"_id":"JPath@0.1.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"6bb0f5b088b3f6218409211b0ac51dc0f13ec4b2","tarball":"http://registry.npmjs.org/JPath/-/JPath-0.1.1.tgz"}},"0.2.0":{"name":"JPath","version":"0.2.0","description":"","homepage":"https://github.com/j-san/JPath","keywords":[],"maintainers":[{"name":"jsan","email":"jonathansanchez@me.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/j-san/JPath.git"}],"main":"./src/JPath.js","devDependencies":{"qunit":"0.2.x"},"scripts":{"test":"node test/index.js"},"_npmUser":{"name":"jsan","email":"jonathansanchez@me.com"},"_id":"JPath@0.2.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2c39c4297662248cc1dff24ee48a8bada47ae733","tarball":"http://registry.npmjs.org/JPath/-/JPath-0.2.0.tgz"}}},"readme":"\nJPath is a tool for riding through json using an XPath syntax.\n\nNode.js complient\n\nTravis CI tracker: http://travis-ci.org/#!/j-san/JPath\n\n[![Build Status](https://secure.travis-ci.org/j-san/JPath.png?branch=master)](http://travis-ci.org/j-san/JPath)\n\nusage\n-----\n\n    var d = new JPath(data)\nCreate a new examinable data set. JPath extends Array,\nget free to use Array functions on JPath like push or slice.\n\n    d.q(path, function) or JPath.query([path][, function])\nReturn a subset of JPath, if callback is specified, callback \nis called for each matching elements.\n\n    d.count([path])\nReturn the number of matching elements by path.\n \n    d.sum([path])\nReturn the sum of matched values.\n\n    d.exists([path])\nReturn true if any element match the path.\n\n    d.valueOf([path])\nReturn each literal values of the set.\n\n    d.copyOf([path])\nReturn a string representation of the set.\n \n \nSupported XPath syntax\n----------------------\n    path/to/somewhere\n    path//deep//inside/and/*/all/children\n    with[contains/path]/and/index[123]/selection\n    computing[(1+2)*123=5]\n    /any[combining]/of//different/*[0]/syntax\n\t...","maintainers":[{"name":"jsan","email":"jonathansanchez@me.com"}],"time":{"modified":"2012-05-28T21:06:59.045Z","created":"2012-05-07T21:19:12.153Z","0.1.0":"2012-05-07T21:19:14.003Z","0.1.1":"2012-05-20T18:34:46.774Z","0.2.0":"2012-05-28T21:06:59.045Z"},"_attachments":{"JPath-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fxzy7IJjSQQ+MDqgYm8yUA==","length":57743,"stub":true},"JPath-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-u5+jXmwbMMS9y8D8Z6JsIg==","length":6744,"stub":true},"JPath-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WeNgUFKfelPsz1/n1f35eA==","length":63362,"stub":true}}}},
{"id":"JQ","key":"JQ","value":{"rev":"3-f045a32a44f4230a75331fd1373c8dc3"},"doc":{"_id":"JQ","_rev":"3-f045a32a44f4230a75331fd1373c8dc3","name":"JQ","description":"a DSL for querying javascript object.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"arumons","email":"takohati1@gmail.com"},"name":"JQ","description":"a DSL for querying javascript object.","version":"0.0.1","repository":{"url":""},"scripts":{"test":"make test"},"engines":{"node":"~0.6.9"},"dependencies":{},"devDependencies":{"mocha":"1.0.3","should":"0.6.0","uglify-js":"1.2.6","stitch":"0.3.3"},"optionalDependencies":{},"main":"lib/JQ.js","_npmUser":{"name":"arumons","email":"takohati1@gmail.com"},"_id":"JQ@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"be90c75c2806e13830ab92b20232fbf3edbb085d","tarball":"http://registry.npmjs.org/JQ/-/JQ-0.0.1.tgz"},"maintainers":[{"name":"arumons","email":"takohati1@gmail.com"}]}},"readme":"# JQ [![Build Status](https://secure.travis-ci.org/arumons/JQ.png?branch=master)](http://travis-ci.org/arumons/JQ)\n\nJQ is a DSL for querying javascript object. APIs are very similar to jQuery. If you know jQuery, you can use this library immediately.\n\n## Instalation\n\nvia npm:\n\n```bash\n$ npm install JQ\n```\n\n## Browser Support\n\nTo compile JQ to a single file runnable for client-side use simply execute:\n\n```bash\n$ make JQ.js\n```\n\n## Sample\n\n```bash\nvar JQ = require('JQ').JQ;\n\nvar family = {\n  father_name: 'bob',\n  mother_name: 'kathy',\n  children: [\n    { \n      name: 'john',\n      age: 3\n    },\n    {\n      name: 'alice',\n      age: 2\n    },\n    {\n      name: 'mike',\n      age: 1\n    }\n  ]\n};\n\nvar $family = JQ(family);\n$family(\"name === 'john' || age === 1\").get(0); // -> { name: 'john', age: 3 }\n$family(\"name === 'john' || age === 1\").get(1); // -> { name: 'make', age: 1 }\n\n```\n","maintainers":[{"name":"arumons","email":"takohati1@gmail.com"}],"time":{"modified":"2012-05-14T14:50:06.809Z","created":"2012-05-14T14:50:01.894Z","0.0.1":"2012-05-14T14:50:06.809Z"},"author":{"name":"arumons","email":"takohati1@gmail.com"},"repository":{"url":""},"_attachments":{"JQ-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0o120HsKUisAlttzZuXT6A==","length":33203,"stub":true}}}},
{"id":"JQDeferred","key":"JQDeferred","value":{"rev":"23-f2fc91018925a2f52de252c992ca460e"},"doc":{"_id":"JQDeferred","_rev":"23-f2fc91018925a2f52de252c992ca460e","name":"JQDeferred","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","dist-tags":{"latest":"1.7.2"},"versions":{"1.5.0":{"name":"JQDeferred","version":"1.5.0","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"021e35ad1848e5c6d83ce2b49e3fd872c02b944d","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.5.0.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.5.1":{"name":"JQDeferred","version":"1.5.1","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.5.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"2f8624021e5bf423ea07e720061f22a4712f2a66","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.5.1.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.5.2":{"name":"JQDeferred","version":"1.5.2","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.5.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"28ba607cbf4465ecd471fe41860369211a67d65f","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.5.2.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.6.0":{"name":"JQDeferred","version":"1.6.0","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.6.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c8203ff2c198a7efbbd61a9d14691a93abff3616","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.6.0.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.6.1":{"name":"JQDeferred","version":"1.6.1","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.6.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"74919431fcc531cd4ae760733ab28a5dea3e7e94","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.6.1.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.6.2":{"name":"JQDeferred","version":"1.6.2","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.6.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b3209e7542ac0aa62b143ca98cb74a0690e33831","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.6.2.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.6.3":{"name":"JQDeferred","version":"1.6.3","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.6.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1f5a68c6633cac561274c03c16ef4445f54d6072","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.6.3.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.6.4":{"name":"JQDeferred","version":"1.6.4","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.6.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d231972aa7677cef2aa725691c269408489ac654","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.6.4.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.7.0":{"name":"JQDeferred","version":"1.7.0","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.7.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f85fa2cdc48ba53c3322a02e7e6696b69c6a4e32","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.7.0.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.7.1":{"name":"JQDeferred","version":"1.7.1","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.7.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"eebe5ba58730cfb9d4ff058b54760bcbddb8728d","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.7.1.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]},"1.7.2":{"name":"JQDeferred","version":"1.7.2","description":"jQuery deferreds source and unit tests ported verbatim to nodejs using minimal, automated, code transformation","keywords":["callback","deferred","jquery","when"],"homepage":"https://github.com/jaubourg/jquery-deferred-for-node","author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"main":"lib/jquery-deferred.js","dependencies":{},"devDependencies":{"nodeunit":">=0.5.1"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"jaubourg","email":"j@ubourg.net"},"_id":"JQDeferred@1.7.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4298d18fcb81515756e804689f32e9f6ed1d0135","tarball":"http://registry.npmjs.org/JQDeferred/-/JQDeferred-1.7.2.tgz"},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}]}},"readme":"","maintainers":[{"name":"jaubourg","email":"j@ubourg.net"}],"time":{"modified":"2012-04-29T23:24:04.049Z","created":"2012-04-29T23:09:22.801Z","1.5.0":"2012-04-29T23:09:25.421Z","1.5.1":"2012-04-29T23:12:54.559Z","1.5.2":"2012-04-29T23:14:01.054Z","1.6.0":"2012-04-29T23:15:29.045Z","1.6.1":"2012-04-29T23:16:30.138Z","1.6.2":"2012-04-29T23:17:56.184Z","1.6.3":"2012-04-29T23:20:06.655Z","1.6.4":"2012-04-29T23:21:09.746Z","1.7.0":"2012-04-29T23:22:19.124Z","1.7.1":"2012-04-29T23:23:12.317Z","1.7.2":"2012-04-29T23:24:04.049Z"},"author":{"name":"Julian Aubourg","email":"j@ubourg.net","url":"http://jaubourg.net/"},"repository":{"type":"git","url":"git://github.com/jaubourg/jquery-deferred-for-node.git"},"_attachments":{"JQDeferred-1.7.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-+Cu5T7AxgfZrr1XQQLs+vg==","length":6755,"stub":true},"JQDeferred-1.7.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-ujILMMch7tAT8lDm/s527A==","length":6725,"stub":true},"JQDeferred-1.7.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-LxiscZEVVRyIYs0CbE/1Ng==","length":6601,"stub":true},"JQDeferred-1.6.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-2W42To8h8RXf5/uUz0Zd7Q==","length":4429,"stub":true},"JQDeferred-1.6.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-wHEKU14pnU28fymTbMERrQ==","length":4428,"stub":true},"JQDeferred-1.6.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-riUx5WmrgtXlmucg/lBF9w==","length":4250,"stub":true},"JQDeferred-1.6.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-fU4+IImZ9ogQoUaFNayPhw==","length":4252,"stub":true},"JQDeferred-1.6.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-4PcD5IQ6vpxx7MUtspiwLw==","length":4182,"stub":true},"JQDeferred-1.5.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-aDTNN91YsReDIvSKsR9mQw==","length":3671,"stub":true},"JQDeferred-1.5.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qQhthkNolJjEqbFHCgRdew==","length":3540,"stub":true},"JQDeferred-1.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-n84SNtPCoAOxXibPYuVhQg==","length":3425,"stub":true}}}},
{"id":"JS-Entities","key":"JS-Entities","value":{"rev":"7-905636d8b46f273210233b60063d079b"},"doc":{"_id":"JS-Entities","_rev":"7-905636d8b46f273210233b60063d079b","name":"JS-Entities","description":"Character encoding generation and html/xml encodings included.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"JS-Entities","version":"0.1.0","description":"Character encoding generation and html/xml encodings included.","author":{"name":"bradley.meck@gmail.com"},"main":"index","_id":"JS-Entities@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/JS-Entities/-/JS-Entities-0.1.0.tgz"},"mtime":"2010-11-09T23:28:13Z","ctime":"2010-11-09T23:28:13Z"}},"maintainers":[{"name":"bradleymeck","email":"bradley.meck@gmail.com"}],"mtime":"2010-11-09T23:28:13Z","ctime":"2010-11-09T23:28:13Z","author":{"name":"bradley.meck@gmail.com"},"_attachments":{"JS-Entities-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uBJ4k2sUwYIco0iOFfqD2Q==","length":16227,"stub":true}}}},
{"id":"JS-string-minimization","key":"JS-string-minimization","value":{"rev":"3-9f0dd9cf4eac31f7c5f5e5077dc03cc8"},"doc":{"_id":"JS-string-minimization","_rev":"3-9f0dd9cf4eac31f7c5f5e5077dc03cc8","name":"JS-string-minimization","description":"Simple minimization for array of string","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"JS-string-minimization","version":"0.0.1","author":{"name":"Viacheslav Shuranov"},"description":"Simple minimization for array of string","homepage":"https://github.com/shuranov/JS-Serialization","engines":["node >= 0.2.2"],"main":"serial","_npmUser":{"name":"shuranov","email":"shuranov@meta.ua"},"_id":"JS-string-minimization@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"dde03431e31f6f6c6fa2c34a039699785cd4264f","tarball":"http://registry.npmjs.org/JS-string-minimization/-/JS-string-minimization-0.0.1.tgz"},"maintainers":[{"name":"shuranov","email":"shuranov@meta.ua"}]}},"readme":null,"maintainers":[{"name":"shuranov","email":"shuranov@meta.ua"}],"time":{"modified":"2011-12-11T19:27:12.755Z","created":"2011-12-11T19:27:10.873Z","0.0.1":"2011-12-11T19:27:12.755Z"},"author":{"name":"Viacheslav Shuranov"},"_attachments":{"JS-string-minimization-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R54/w8VFUpC0YMt4M1dLDQ==","length":2894,"stub":true}}}},
{"id":"JSDev","key":"JSDev","value":{"rev":"45-df5cc3fd6dd80c9e06748f6015a1698c"},"doc":{"_id":"JSDev","_rev":"45-df5cc3fd6dd80c9e06748f6015a1698c","name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","dist-tags":{"latest":"0.0.84"},"versions":{"0.0.1":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.1","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/jsdev.git"},"author":{"name":"Douglas Crockford"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"b40905e66f7e8c19d4c22f5ceaa9fbc14def4046","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.1.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.2":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.2","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/jsdev.git"},"author":{"name":"Douglas Crockford"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8541a488288f8d700581882eae67c66a45b94f94","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.2.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.3":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.3","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1a01e6d56fdba60705e73451131ffb28b84c1343","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.3.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.4":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.4","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"01f5419c8a33970a0b336dc6fdfbd526c88d3557","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.4.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.5":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.5","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford"},"main":"index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1ca70addad84c47aef502994a925e2c5b24f4660","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.5.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.6":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.6","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford"},"main":"index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"119bc896cac6d21683854d6bd96bea6e1a6ec81f","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.6.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.7":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.7","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"main":"jsdev.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.7","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"c3ae44c00c5c1968aaecbb7149366086fed05cc3","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.7.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.8":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.8","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"main":"index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.8","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"48b1998fded60b53ee04c6002ac43adece3aa847","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.8.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"directories":{}},"0.0.81":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.81","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.81","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"7c2baec3f1df2422e430f5bc2c29fc1b211010ad","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.81.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}]},"0.0.82":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.82","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.82","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"6d6a20e6f53f1074b9a19a1e34f8f5843912f4dc","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.82.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}]},"0.0.83":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.83","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.83","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8e4e6ba5af62bdf9db4f81b938c0f60a3ab43f8c","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.83.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}]},"0.0.84":{"name":"JSDev","description":"JSDev is a simple JavaScript preprocessor. It implements a tiny macro language that is written in the form of tagged comments. These comments are normally ignored, and will be removed by JSMin. But JSDev will activate these comments, replacing them with executable forms that can be used to do debugging, testing, logging, or tracing. JSDev scans a source looking for and replacing patterns. A pattern is a slashstar comment containing a tag and some stuff, and optionally a condition wrapped in parens. There must be no space between the slashstar and the <tag>.","version":"0.0.84","homepage":"https://github.com/douglascrockford/JSDev","repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"main":"./index.js","licenses":[{"type":"Public Domain","url":"https://github.com/rwldrn/node-jsdev"}],"_npmUser":{"name":"rwaldron","email":"waldron.rick@gmail.com"},"_id":"JSDev@0.0.84","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8570e1e44784e489b4aa1a4cb8fb7bd8db0a20ac","tarball":"http://registry.npmjs.org/JSDev/-/JSDev-0.0.84.tgz"},"maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}]}},"readme":"JSDev, A JavaScript Development Tool\n\n\nDouglas Crockford\ndouglas@crockford.com\n\n2012-01-05\n\nJSDev is a filter that activates selected comments, making them executable.\nThis makes it possible to put development, performance, and testing scaffolding\ninto a source file. The scaffolding is removed by minification, but is activated\nby JSDev.\n\nJSDev is a filter that takes a source file and looks for tagged comments in\neither of these forms:\n\n    /*<tag> <stuff>*/\n\n    /*<tag>(<condition>) <stuff>*/\n\nThere can be no space between the /* and the <tag>. There can be no space\nbetween the <tag> and the (. The content of tagged comment may not include\ncomments, nor can it contain strings or regular expression literals that\ncontain */. So, write\n\n    /*debug(/[a-z][a-z0-9]*/.test(variable))\n        console.log(\"*/ test\");\n    */\n\nas\n\n    /*debug(/[a-z][a-z0-9]*(?:)/.test(variable))\n        console.log(\"*\\/ test\");\n    */\n\nJSDev is given a list the names of the tags that should be activated.\nAlso, methods can be defined by following the tag name with : and a method\nname. There can be no spaces around the :.\n\n    Replacement     /*<tag>         */\n\n    tag form        {               }\n    method form     {<method>(      );}\n\nIf a condition was included, then the replacement will be preceded with an\nif statement.\n\nThe implementation in C obtains the input from stdin, and provides the result\nto stdout. The tag list is taken from the command line. The command line can\nalso include a -comment specification. JSDev will exit(1) if there is an error.\n\nIn JavaScript, it is available as the JSDEV function that takes a source,\nan array of tags, and an optional array of comments. It will throw an\nexception if there is an error.\n\nC command line example:\n\n    jsdev -comment \"Devel Edition.\" <input >output test_expose enter:trace.enter exit:trace.exit unless:alert\n\nJavaScript:\n\n    output = JSDEV(input, [\n        \"test_expose\",\n        \"enter:trace.enter\",\n        \"exit:trace.exit\",\n        \"unless:alert\"\n    ] , [\"Devel Edition.\"]);\n\ninput:\n\n    // This is a sample file.\n\n    function Constructor(number) {\n        /*enter 'Constructor'*/\n        /*unless(typeof number !== 'number') 'number', \"Type error\"*/\n        function private_method() {\n            /*enter 'private_method'*/\n            /*exit 'private_method'*/\n        }\n        /*test_expose\n            this.private_method = private_method;\n        */\n        this.priv = function () {\n            /*enter 'priv'*/\n            private_method();\n            /*exit 'priv'*/\n        }\n        /*exit \"Constructor\"*/\n    }\n\noutput:\n\n    // Devel Edition.\n    // This is a sample file.\n\n    function Constructor(number) {\n        {trace.enter('Constructor');}\n        if (typeof number !== 'number') {alert('number', \"Type error\");}\n        function private_method() {\n            {trace.enter('private_method');}\n            {trace.exit('private_method');}\n        }\n        {\n            this.private_method = private_method;\n        }\n        this.priv = function () {\n            {trace.enter('priv');}\n            private_method();\n            {trace.exit('priv');}\n        }\n        {trace.exit(\"Constructor\");}\n    }\n\nlightly minified:\n\n    function Constructor(number) {\n        function private_method() {\n        }\n        this.priv = function () {\n            private_method();\n        }\n    }\n","maintainers":[{"name":"rwaldron","email":"waldron.rick@gmail.com"}],"time":{"modified":"2012-01-30T15:13:49.343Z","created":"2012-01-27T22:32:03.676Z","0.0.1":"2012-01-27T22:32:04.968Z","0.0.2":"2012-01-27T22:45:22.085Z","0.0.3":"2012-01-27T22:48:38.263Z","0.0.4":"2012-01-27T22:55:43.072Z","0.0.5":"2012-01-27T23:01:52.509Z","0.0.6":"2012-01-27T23:27:24.110Z","0.0.7":"2012-01-27T23:40:44.237Z","0.0.8":"2012-01-27T23:44:37.554Z","0.0.81":"2012-01-27T23:46:06.416Z","0.0.82":"2012-01-27T23:46:17.239Z","0.0.83":"2012-01-27T23:49:27.048Z","0.0.84":"2012-01-30T15:13:49.343Z"},"author":{"name":"Douglas Crockford; Package maintained by Rick Waldron"},"repository":{"type":"git","url":"git://github.com/rwldrn/node-jsdev.git"},"_attachments":{"JSDev-0.0.84.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-c9/rfiVgsPB0ptoANOYgkQ==","length":10240,"stub":true},"JSDev-0.0.83.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-w8wbDUXFEofknKwmC9ECcQ==","length":10240,"stub":true},"JSDev-0.0.82.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-g0z0GhdeyAvrV5z5rQuyLg==","length":10240,"stub":true},"JSDev-0.0.81.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-STpkUSzyh7427rgglxEZmQ==","length":10240,"stub":true},"JSDev-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-5JO/zx2KXhjZkVul0gtKCA==","length":10240,"stub":true},"JSDev-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-boJXFciomBmBO0VxF1YTjQ==","length":10240,"stub":true},"JSDev-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-hlHWTRtoNcV4H7oxjeF7qA==","length":20480,"stub":true},"JSDev-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-SGNjQD24zS8NXJKhO0hdmQ==","length":10240,"stub":true},"JSDev-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-mcDT67DSgXDne5sjG6eYOA==","length":10240,"stub":true},"JSDev-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MvUhVX/QKxlpihzB4C/P6A==","length":10240,"stub":true},"JSDev-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RnpfnrrnMNofkKKJD0XOvA==","length":10240,"stub":true},"JSDev-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-W3gzR49jjuaZjx+uAKpT7Q==","length":10240,"stub":true}}}},
{"id":"JSLint-commonJS","key":"JSLint-commonJS","value":{"rev":"3-759a81f82af7055e85ee89c9707c9609"},"doc":{"_id":"JSLint-commonJS","_rev":"3-759a81f82af7055e85ee89c9707c9609","name":"JSLint-commonJS","description":"JSLint with commonJS exportability and package.json","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"JSLint-commonJS","description":"JSLint with commonJS exportability and package.json","version":"0.0.1","author":{"name":"Douglas Crockford","email":"douglas@crockford.com"},"main":"./fulljslint","_id":"JSLint-commonJS@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/JSLint-commonJS/-/JSLint-commonJS-0.0.1.tgz"}}},"maintainers":[{"name":"mikebannister","email":"mikebannister@gmail.com"}],"author":{"name":"Douglas Crockford","email":"douglas@crockford.com"},"_attachments":{"JSLint-commonJS-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TaRbVJ9bicAKTbNARbZ2xw==","length":54089,"stub":true}}}},
{"id":"JSLintCli","key":"JSLintCli","value":{"rev":"15-a9ab9bc8e36086ffa472e696b4273701"},"doc":{"_id":"JSLintCli","_rev":"15-a9ab9bc8e36086ffa472e696b4273701","name":"JSLintCli","description":"JSLint implementation for command line","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Rodrigo K. Nascimento","email":"rodrigoknascimento@gmail.com","url":"http://www.rodrigok.com/"},"name":"JSLintCli","description":"JSLint implementation for command line","version":"0.0.1","homepage":"https://github.com/rodrigok/Node-JSLint","repository":{"type":"git","url":"git://github.com/rodrigok/Node-JSLint.git"},"engines":{"node":"~0.6.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"},"_id":"JSLintCli@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f8d23695b9e00b44bf2e4c8d80f96dba67740041","tarball":"http://registry.npmjs.org/JSLintCli/-/JSLintCli-0.0.1.tgz"},"maintainers":[{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Rodrigo K. Nascimento","email":"rodrigoknascimento@gmail.com","url":"http://www.rodrigok.com/"},"name":"JSLintCli","description":"JSLint implementation for command line","version":"0.0.2","homepage":"https://github.com/rodrigok/Node-JSLint","repository":{"type":"git","url":"git://github.com/rodrigok/Node-JSLint.git"},"engines":{"node":"~0.6.5"},"bin":{"JSLintCli":"JSLint"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"},"_id":"JSLintCli@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"251ecb8f798127c16e851c44d5dcbf4ce58e99a6","tarball":"http://registry.npmjs.org/JSLintCli/-/JSLintCli-0.0.2.tgz"},"maintainers":[{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"}]},"0.0.3":{"author":{"name":"Rodrigo K. Nascimento","email":"rodrigoknascimento@gmail.com","url":"http://www.rodrigok.com/"},"name":"JSLintCli","description":"JSLint implementation for command line","version":"0.0.3","homepage":"https://github.com/rodrigok/Node-JSLint","repository":{"type":"git","url":"git://github.com/rodrigok/Node-JSLint.git"},"engines":{"node":"~0.6.5"},"bin":{"JSLintCli":"JSLint"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"},"_id":"JSLintCli@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c096480e4f70bc9961b003365025d23c049732cc","tarball":"http://registry.npmjs.org/JSLintCli/-/JSLintCli-0.0.3.tgz"},"maintainers":[{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"}]}},"readme":null,"maintainers":[{"name":"rodrigok","email":"rodrigoknascimento@gmail.com"}],"time":{"modified":"2012-01-04T16:11:40.238Z","created":"2011-12-27T00:24:10.873Z","0.0.1":"2011-12-27T00:24:14.157Z","0.0.2":"2011-12-27T00:57:22.028Z","0.0.3":"2012-01-04T16:11:40.238Z"},"author":{"name":"Rodrigo K. Nascimento","email":"rodrigoknascimento@gmail.com","url":"http://www.rodrigok.com/"},"repository":{"type":"git","url":"git://github.com/rodrigok/Node-JSLint.git"},"_attachments":{"JSLintCli-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-D9/qnd9k8fxmdE+wezkWrw==","length":10240,"stub":true},"JSLintCli-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-F7LjYfT1xMl8zU7wOBm4xQ==","length":10240,"stub":true},"JSLintCli-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hgnhXofEU1exnO/ClaNgQA==","length":51200,"stub":true}}}},
{"id":"JSON","key":"JSON","value":{"rev":"3-7966a79067c34fb5de2e62c796f67341"},"doc":{"_id":"JSON","_rev":"3-7966a79067c34fb5de2e62c796f67341","name":"JSON","description":"Douglas Crockford's json2.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Douglas Crockford","email":"douglas@crockford.com","url":"http://crockford.com"},"contributors":[{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"}],"name":"JSON","description":"Douglas Crockford's json2.js","keywords":["ender"],"version":"1.0.0","homepage":"http://json.org","repository":{"url":"git://github.com/douglascrockford/JSON-js.git"},"main":"json2.js","engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/coolaj86/.npm/JSON/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSON@1.0.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"8681531c28f8438a075589ff07248246ea960d8c","tarball":"http://registry.npmjs.org/JSON/-/JSON-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-09-08T00:38:16.795Z","created":"2011-09-08T00:38:16.426Z","1.0.0":"2011-09-08T00:38:16.795Z"},"author":{"name":"Douglas Crockford","email":"douglas@crockford.com","url":"http://crockford.com"},"repository":{"url":"git://github.com/douglascrockford/JSON-js.git"},"_attachments":{"JSON-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YbOfULZuTUXm9QnIkn9kjQ==","length":5839,"stub":true}}}},
{"id":"JSON.sh","key":"JSON.sh","value":{"rev":"3-7ca8d1b7ef006da466ed30c8eed0167e"},"doc":{"_id":"JSON.sh","_rev":"3-7ca8d1b7ef006da466ed30c8eed0167e","name":"JSON.sh","description":"","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"JSON.sh","version":"0.0.0","description":"","homepage":"http://github.com/dominictarr/JSON-sh","repository":{"type":"git","url":"git://github.com/dominictarr/JSON-sh.git"},"bin":{"json_parse":"./bin/json_parse"},"dependencies":{},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"./all-tests.sh"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSON.sh@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"1f2372624c7a02a76f7b10027bb8eb43fb11c453","tarball":"http://registry.npmjs.org/JSON.sh/-/JSON.sh-0.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2011-10-25T09:43:41.713Z","created":"2011-10-25T09:43:36.732Z","0.0.0":"2011-10-25T09:43:41.713Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"repository":{"type":"git","url":"git://github.com/dominictarr/JSON-sh.git"},"_attachments":{"JSON.sh-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GdvlseHgRBsCFlWE0cRhBg==","length":4509,"stub":true}}}},
{"id":"JSON2","key":"JSON2","value":{"rev":"3-4b98bfdeb425711fca4121e79a055d84"},"doc":{"_id":"JSON2","_rev":"3-4b98bfdeb425711fca4121e79a055d84","name":"JSON2","description":"Douglas Crawford's JSON2, ported to a CommonJS compliant module","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"JSON2","description":"Douglas Crawford's JSON2, ported to a CommonJS compliant module","version":"0.1.0","author":{"name":"Douglas Crockford","email":"douglas@crockford.com"},"contributors":[{"name":"Dave Dopson","email":"ddopson@gmail.com"}],"dependencies":{},"devDependencies":{},"main":"index.js","repository":{"type":"git","url":"git://github.com/ddopson/JSON-js.git"},"_npmUser":{"name":"ddopson","email":"ddopson@gmail.com"},"_id":"JSON2@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8d7493040a63d5835af75f47decb83ab6c8c0790","tarball":"http://registry.npmjs.org/JSON2/-/JSON2-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"ddopson","email":"ddopson@gmail.com"}]}},"readme":"\n# Overview\n\nThis module is a pure-JS implementation of the JSON interchange standard.\n\nIt has better support for lax JSON parsing (safe 'eval'), and for pretty printing JSON output.\n\n    var JSON2 = require('JSON2');\n    var jsondata = '{sample: \"data\", is: \"great\", data: [1, 2, 3, 4]}';\n    var obj = JSON2.parse(jsondata);\n    jsondata2 = JSON2.stringify(obj);\n    // {\"sample\":\"data\",\"is\":\"great\",\"data\":[1,2,3,4]}\n\nAlso useful, cycle breaking:\n\n    var data = {x: \"hello world\", y: [1, 2, 3, 4]};\n    data.self = data;\n    JSON2.stringify(JSON2.decycle(data));\n    // {\"x\":\"hello world\",\"y\":[1,2,3,4],\"self\":{\"$ref\":\"$\"}}\n\nAnd pretty printing:\n\n    JSON2.stringify(JSON2.decycle(obj), null, '  ');\n    // {\n    //   \"sample\": \"data\",\n    //   \"is\": \"great\",\n    //   \"data\": [\n    //     1,\n    //     2,\n    //     3,\n    //     4\n    //   ]\n    // }\n\n# Douglas Crawford's Original Overview (2010-11-18):\n\nJSON in JavaScript\n\nDouglas Crockford \ndouglas@crockford.com\n\nJSON is a light-weight, language independent, data interchange format.\nSee http://www.JSON.org/\n\nThe files in this collection implement JSON encoders/decoders in JavaScript.\n\nJSON became a built-in feature of JavaScript when the ECMAScript Programming\nLanguage Standard - Fifth Edition was adopted by the ECMA General Assembly\nin December 2009. Most of the files in this collection are for applications\nthat are expected to run in obsolete web browsers. For most purposes, json2.js\nis the best choice.\n\n\njson2.js: This file creates a JSON property in the global object, if there\nisn't already one, setting its value to an object containing a stringify\nmethod and a parse method. The parse method uses the eval method to do the\nparsing, guarding it with several regular expressions to defend against\naccidental code execution hazards. On current browsers, this file does nothing,\nprefering the built-in JSON object.\n\njson.js: This file does everything that json2.js does. It also adds a\ntoJSONString method and a parseJSON method to Object.prototype. Use of this\nfile is not recommended.\n\njson_parse.js: This file contains an alternative JSON parse function that\nuses recursive descent instead of eval.\n\njson_parse_state.js: This files contains an alternative JSON parse function that\nuses a state machine instead of eval.\n\ncycle.js: This file contains two functions, JSON.decycle and JSON.retrocycle,\nwhich make it possible to encode cyclical structures and dags in JSON, and to\nthen recover them. JSONPath is used to represent the links.\nhttp://GOESSNER.net/articles/JsonPath/\n","maintainers":[{"name":"ddopson","email":"ddopson@gmail.com"}],"time":{"modified":"2012-04-16T22:46:19.528Z","created":"2012-04-16T22:46:16.692Z","0.1.0":"2012-04-16T22:46:19.528Z"},"author":{"name":"Douglas Crockford","email":"douglas@crockford.com"},"repository":{"type":"git","url":"git://github.com/ddopson/JSON-js.git"},"_attachments":{"JSON2-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GzQu3svoGvrdeXnIQYKT9Q==","length":14404,"stub":true}}}},
{"id":"JSONPath","key":"JSONPath","value":{"rev":"15-9fb415ccb498c2d82d9abd24f77ede9b"},"doc":{"_id":"JSONPath","_rev":"15-9fb415ccb498c2d82d9abd24f77ede9b","name":"JSONPath","description":"A JS implementation of JSONPath","dist-tags":{"latest":"0.9.0"},"versions":{"0.8.0":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","version":"0.8.0","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{},"devDependencies":{},"_id":"JSONPath@0.8.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"52b8e9d3856150cb154e1d35dca2d0824dd01028","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.8.0.tgz"},"scripts":{}},"0.8.1":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","version":"0.8.1","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/subrah/.npm/JSONPath/0.8.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSONPath@0.8.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"cf9e815d98b3ccd1a43e87111306220ea23eab3d","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.8.1.tgz"},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}]},"0.8.2":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","contributors":[{"name":"Stefan Goessner","email":"subbu@subbu.org"},{"name":"Mike Brevoort","email":"mike@brevoort.com"}],"version":"0.8.2","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{},"devDependencies":{"nodeunit":"latest"},"_npmJsonOpts":{"file":"/Users/subrah/.npm/JSONPath/0.8.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSONPath@0.8.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d43f88418d0e069bc8178492d76e4b0d4951ebec","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.8.2.tgz"},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}]},"0.8.3":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","contributors":[{"name":"Prof. G�ssner","email":"stefan.goessner@fh-dortmund.de"},{"name":"Subbu Allamaraju","email":"subbu@subbu.org"},{"name":"Mike Brevoort","email":"mike@brevoort.com"}],"version":"0.8.3","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{"underscore":"latest"},"devDependencies":{"nodeunit":"latest"},"_npmUser":{"name":"s3u","email":"subbu@subbu.org"},"_id":"JSONPath@0.8.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9aaa306261e11ee26e09ea9942a9f3bed9abf3d3","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.8.3.tgz"},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}]},"0.8.4":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","contributors":[{"name":"Prof. G�ssner","email":"stefan.goessner@fh-dortmund.de"},{"name":"Subbu Allamaraju","email":"subbu@subbu.org"},{"name":"Mike Brevoort","email":"mike@brevoort.com"}],"version":"0.8.4","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{"underscore":"latest"},"devDependencies":{"nodeunit":"latest"},"_npmUser":{"name":"s3u","email":"subbu@subbu.org"},"_id":"JSONPath@0.8.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"140f03aa4f4f5ca5f83b8eb899e500c71a56c204","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.8.4.tgz"},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}]},"0.8.5":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","contributors":[{"name":"Prof. G�ssner","email":"stefan.goessner@fh-dortmund.de"},{"name":"Subbu Allamaraju","email":"subbu@subbu.org"},{"name":"Mike Brevoort","email":"mike@brevoort.com"}],"version":"0.8.5","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{"underscore":"latest"},"devDependencies":{"nodeunit":"latest"},"_npmUser":{"name":"s3u","email":"subbu@subbu.org"},"_id":"JSONPath@0.8.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7019cacd1e7c620804f21bf1a89e1d1f7aef59ca","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.8.5.tgz"},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}]},"0.9.0":{"author":{"name":"Stefan Goessner"},"name":"JSONPath","description":"A JS implementation of JSONPath","contributors":[{"name":"Prof. G�ssner","email":"stefan.goessner@fh-dortmund.de"},{"name":"Subbu Allamaraju","email":"subbu@subbu.org"},{"name":"Mike Brevoort","email":"mike@brevoort.com"}],"version":"0.9.0","repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"main":"./lib/jsonpath","dependencies":{"underscore":"1.3.x"},"devDependencies":{"nodeunit":"0.6.x"},"_npmUser":{"name":"s3u","email":"subbu@ebaysf.com"},"_id":"JSONPath@0.9.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7a4c77564605eec9747c5b25aeae1d4f8caa6b78","tarball":"http://registry.npmjs.org/JSONPath/-/JSONPath-0.9.0.tgz"},"readme":"Install\n=======\n    \n    npm install JSONPath\n\nEvaluate\n========\n\n    var jsonpath = require('JSONPath');\n    jsonpath.eval(obj, path);\n\nOr more concisely:\n\n\tvar jsonpath = require('JSONPath').eval;\n\tjsonpath(obj, path);\n\nExamples\n========\n\nGiven the following JSON, taken from http://goessner.net/articles/JsonPath/ :\n\n\t{ \"store\": {\n\t    \"book\": [ \n\t      { \"category\": \"reference\",\n\t        \"author\": \"Nigel Rees\",\n\t        \"title\": \"Sayings of the Century\",\n\t        \"price\": 8.95\n\t      },\n\t      { \"category\": \"fiction\",\n\t        \"author\": \"Evelyn Waugh\",\n\t        \"title\": \"Sword of Honour\",\n\t        \"price\": 12.99\n\t      },\n\t      { \"category\": \"fiction\",\n\t        \"author\": \"Herman Melville\",\n\t        \"title\": \"Moby Dick\",\n\t        \"isbn\": \"0-553-21311-3\",\n\t        \"price\": 8.99\n\t      },\n\t      { \"category\": \"fiction\",\n\t        \"author\": \"J. R. R. Tolkien\",\n\t        \"title\": \"The Lord of the Rings\",\n\t        \"isbn\": \"0-395-19395-8\",\n\t        \"price\": 22.99\n\t      }\n\t    ],\n\t    \"bicycle\": {\n\t      \"color\": \"red\",\n\t      \"price\": 19.95\n\t    }\n\t  }\n\t}\n\n\nXPath               | JSONPath               | Result\n------------------- | ---------------------- | -------------------------------------\n/store/book/author\t| $.store.book[*].author | the authors of all books in the store \n//author            | $..author              | all authors \n/store/*            | $.store.*              | all things in store, which are some books and a red bicycle.\n/store//price       | $.store..price         | the price of everything in the store.\n//book[3]           | $..book[2]             | the third book\n//book[last()]      | $..book[(@.length-1)]  | the last book in order.\n                    | $..book[-1:]           |\n//book[position()<3]| $..book[0,1]           | the first two books\n                    | $..book[:2]            | \n//book[isbn]        | $..book[?(@.isbn)]     | filter all books with isbn number\n//book[price<10]    | $..book[?(@.price<10)] | filter all books cheapier than 10\n//*                 | $..*                   |all Elements in XML document. All members of JSON structure.\n\n\n\nSee http://www.opensource.org/licenses/mit-license.php for license.\n","maintainers":[{"name":"s3u","email":"subbu@subbu.org"}]}},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}],"time":{"modified":"2012-03-28T15:30:50.906Z","created":"2011-05-07T20:12:46.559Z","0.8.0":"2011-05-07T20:12:47.217Z","0.8.1":"2011-08-27T04:22:26.843Z","0.8.2":"2011-09-19T17:23:54.870Z","0.8.3":"2011-11-03T15:20:02.085Z","0.8.4":"2011-11-18T04:08:06.154Z","0.8.5":"2011-12-02T22:19:51.851Z","0.9.0":"2012-03-28T15:30:50.906Z"},"author":{"name":"Stefan Goessner"},"repository":{"type":"git","url":"git://github.com/s3u/JSONPath.git"},"_attachments":{"JSONPath-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-fs/xzvTHPhVDq5c6bzVfKQ==","length":3413,"stub":true},"JSONPath-0.8.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Z0r11FZReqsHK2vse4sdyg==","length":10240,"stub":true},"JSONPath-0.8.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+xidvOEFM/MvISSz3Szujg==","length":10240,"stub":true},"JSONPath-0.8.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-IdvAaDtBlDFtGadDQv5B0A==","length":10240,"stub":true},"JSONPath-0.8.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-M1riT71hwtVXrsNNyH2HEg==","length":3756,"stub":true},"JSONPath-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xqOMm/CxzAEeqNqQ/+GcNA==","length":2077,"stub":true},"JSONPath-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kKtU3gQn5SQet3vjusoYog==","length":1778,"stub":true}}}},
{"id":"JSONPathCLI","key":"JSONPathCLI","value":{"rev":"5-3d23aca18baa4cd30528150190f6a1ed"},"doc":{"_id":"JSONPathCLI","_rev":"5-3d23aca18baa4cd30528150190f6a1ed","name":"JSONPathCLI","description":"A cli program for running JSONPath queries. Wrapper of s3u/JSONPath","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.2":{"author":{"name":"cjc","email":"cjc@cjc.id.au"},"name":"JSONPathCLI","description":"A cli program for running JSONPath queries. Wrapper of s3u/JSONPath","version":"0.0.2","homepage":"https://github.com/cjc/JSONPathCLI","repository":{"type":"git","url":"git://github.com/cjc/JSONPathCLI.git"},"engines":{"node":"~0.6.6"},"dependencies":{"JSONPath":">=0.8.5","cli-table":">=0.0.1","colors":">=0.6.0","colorsafeconsole":">=0.0.4","optimist":">=0.3.1","underscore":">=1.3.0"},"devDependencies":{},"optionalDependencies":{},"bin":{"jsonpath":"./jsonpath.js"},"keywords":["JSONPath","json","cli"],"_npmUser":{"name":"cjc","email":"cjc@cjc.id.au"},"_id":"JSONPathCLI@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"12d704a14a5b7db8d0e7f0ff00a3191aa78c76b7","tarball":"http://registry.npmjs.org/JSONPathCLI/-/JSONPathCLI-0.0.2.tgz"},"maintainers":[{"name":"cjc","email":"cjc@cjc.id.au"}]},"0.1.1":{"author":{"name":"cjc","email":"cjc@cjc.id.au"},"name":"JSONPathCLI","description":"A cli program for running JSONPath queries. Wrapper of s3u/JSONPath","version":"0.1.1","homepage":"https://github.com/cjc/JSONPathCLI","repository":{"type":"git","url":"git://github.com/cjc/JSONPathCLI.git"},"engines":{"node":"~0.6.6"},"dependencies":{"JSONPath":">=0.8.5","cli-table":">=0.0.1","colors":">=0.6.0","colorsafeconsole":">=0.0.4","optimist":">=0.3.1","underscore":">=1.3.0"},"devDependencies":{},"optionalDependencies":{},"bin":{"jsonpath":"./jsonpath.js"},"keywords":["JSONPath","json","cli"],"_npmUser":{"name":"cjc","email":"cjc@cjc.id.au"},"_id":"JSONPathCLI@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"827cd8d9e24b2c1a0e8a07b88372d5e354cb4a40","tarball":"http://registry.npmjs.org/JSONPathCLI/-/JSONPathCLI-0.1.1.tgz"},"maintainers":[{"name":"cjc","email":"cjc@cjc.id.au"}]}},"readme":"#JSONPathCLI\n\nA cli program wrapping [JSONPath](https://github.com/s3u/JSONPath)\n\n##Installation\n\n    npm install JSONPathCLI -g\n\n##Usage\n\nAccepts a jsonpath query as a parameter, and an optional filename to operate on\n\n    jsonpath $..* albums.json\n\nIf no file is provided it acts on stdin\n\n    cat albums.json | jsonpath $..*\n\nUse the ````-c```` option to display a jsonpath cheatsheet\n\n    jsonpath -c\n\n##Output\n\nIf the results are of a primitive type (string, number, boolean), they are output separated by a newline.\n\n    $ jsonpath $..author sample.json \n    Nigel Rees\n    Evelyn Waugh\n    Herman Melville\n    J. R. R. Tolkien\n\n    $ jsonpath $..price sample.json \n    8.95\n    12.99\n    8.99\n    22.99\n    19.95\n\nIf the results are javascript objects, or if the ````-j```` option is used to force json output, then the results are output as colorised json (using util.inspect)\n\n    $ jsonpath $..author sample.json -j\n    [ 'Nigel Rees',\n      'Evelyn Waugh',\n      'Herman Melville',\n      'J. R. R. Tolkien' ]\n\n    $ jsonpath $..book[2:] sample.json \n    [ { category: 'fiction',\n        author: 'Herman Melville',\n        title: 'Moby Dick',\n        isbn: '0-553-21311-3',\n        price: 8.99 },\n      { category: 'fiction',\n        author: 'J. R. R. Tolkien',\n        title: 'The Lord of the Rings',\n        isbn: '0-395-19395-8',\n        price: 22.99 } ]\n\n\n##LICENSE\n\n    MIT\n","maintainers":[{"name":"cjc","email":"cjc@cjc.id.au"}],"time":{"modified":"2012-01-21T10:58:46.088Z","created":"2012-01-21T10:30:32.895Z","0.0.2":"2012-01-21T10:30:37.577Z","0.1.1":"2012-01-21T10:58:46.088Z"},"author":{"name":"cjc","email":"cjc@cjc.id.au"},"repository":{"type":"git","url":"git://github.com/cjc/JSONPathCLI.git"},"_attachments":{"JSONPathCLI-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gcCpZCRNHN5ahKLIGRT1NA==","length":2493,"stub":true},"JSONPathCLI-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-T+L80PudaAi36NhmCNzf0A==","length":2287,"stub":true}}}},
{"id":"JSONSelect","key":"JSONSelect","value":{"rev":"17-9c6e7f1125267e4b9714d9146c176600"},"doc":{"_id":"JSONSelect","_rev":"17-9c6e7f1125267e4b9714d9146c176600","name":"JSONSelect","description":"CSS-like selectors for JSON","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.1":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://trickyco.de"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.0.1","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"files":["src/jsonselect.js","src/test/run.js","src/test/tests","tests","README.md","JSONSelect.md","package.json","LICENSE"],"_id":"JSONSelect@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"7e6a64a1c3e6e1d505ccdcfcee710017048c867f","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.0.1.tgz"},"scripts":{}},"0.1.0":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://trickyco.de"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.1.0","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"files":["src/jsonselect.js","src/test/run.js","src/test/tests","tests","README.md","JSONSelect.md","package.json","LICENSE"],"_id":"JSONSelect@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"4425af3d551ce413a1dae22f11668091ea307c15","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.1.0.tgz"},"scripts":{}},"0.2.0":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://trickyco.de"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.2.0","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"files":["src/jsonselect.js","src/test/run.js","src/test/tests","tests","README.md","JSONSelect.md","package.json","LICENSE"],"_id":"JSONSelect@0.2.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c7e22be1ffeb1b975880e465c5b748496f07366c","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.2.0.tgz"},"scripts":{}},"0.2.1":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://trickyco.de"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.2.1","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"files":["src/jsonselect.js","src/test/run.js","src/test/tests","tests","README.md","JSONSelect.md","package.json","LICENSE"],"_id":"JSONSelect@0.2.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"415418a526d33fe31d74b4defa3c836d485ec203","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.2.1.tgz"},"scripts":{}},"0.2.2":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://trickyco.de"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.2.2","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"files":["src/jsonselect.js","src/test/run.js","src/test/tests","tests","README.md","JSONSelect.md","package.json","LICENSE"],"scripts":{"test":"node src/test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"JSONSelect@0.2.2","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c6f081f5305de89f9f4e64a203304edc0177f8d5","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.2.2.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.3":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.2.3","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"files":["src/jsonselect.js","src/test/run.js","src/test/tests","tests","README.md","JSONSelect.md","package.json","LICENSE"],"scripts":{"test":"node src/test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"JSONSelect@0.2.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f3f3e6befa6d9eeeb9908588c57a9fbe9a8f6280","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.2.3.tgz"},"readme":"JSONSelect is *EXPERIMENTAL*, *ALPHA*, etc.\n\nJSONSelect defines a selector language similar to CSS intended for\nJSON documents.  For an introduction to the project see\n[jsonselect.org](http://jsonselect.org) or the [documentation](https://github.com/lloyd/JSONSelect/blob/master/JSONSelect.md).\n\n## Project Overview\n\nJSONSelect is an attempt to create a selector language similar to\nCSS for JSON objects.  A couple key goals of the project's include:\n\n  * **intuitive** - JSONSelect is meant to *feel like* CSS, meaning a developers with an understanding of CSS can probably guess most of the syntax.\n  * **expressive** - As JSONSelect evolves, it will include more of the most popular constructs from the CSS spec and popular implementations (like [sizzle](http://sizzlejs.com/)).  A successful result will be a good balance of simplicity and power.\n  * **language independence** - The project will avoid features which are unnecessarily tied to a particular implementation language.\n  * **incremental adoption** - JSONSelect features are broken in to conformance levels, to make it easier to build basic support and to allow incremental stabilization of the language.\n  * **efficient** - As many constructs of the language as possible will be able to be evaluated in a single document traversal.  This allows for efficient stream filtering.\n\nJSONSelect should make common operations easy, complex operations possible,\nbut haughtily ignore weird shit.\n\n## What's Here\n\nThis repository is the home to many things related to JSONSelect:\n\n  * [Documentation](https://github.com/lloyd/JSONSelect/blob/master/JSONSelect.md) which describes the language\n  * The [jsonselect.org](http://jsonselect.org) [site source](https://github.com/lloyd/JSONSelect/blob/master/site/)\n  * A [reference implementation](https://github.com/lloyd/JSONSelect/blob/master/src/jsonselect.js) in JavaScript\n\n## Related projects\n\nConformance tests are broken out into a [separate\nrepository](https://github.com/lloyd/JSONSelectTests) and may be used\nby other implementations.","maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.3.0":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.3.0","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"scripts":{"test":"node src/test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"JSONSelect@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1b9f0ed44484685dae9f087c0f06f9fb45286017","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.3.0.tgz"},"readme":"JSONSelect is *EXPERIMENTAL*, *ALPHA*, etc.\n\nJSONSelect defines a selector language similar to CSS intended for\nJSON documents.  For an introduction to the project see\n[jsonselect.org](http://jsonselect.org) or the [documentation](https://github.com/lloyd/JSONSelect/blob/master/JSONSelect.md).\n\n## Project Overview\n\nJSONSelect is an attempt to create a selector language similar to\nCSS for JSON objects.  A couple key goals of the project's include:\n\n  * **intuitive** - JSONSelect is meant to *feel like* CSS, meaning a developers with an understanding of CSS can probably guess most of the syntax.\n  * **expressive** - As JSONSelect evolves, it will include more of the most popular constructs from the CSS spec and popular implementations (like [sizzle](http://sizzlejs.com/)).  A successful result will be a good balance of simplicity and power.\n  * **language independence** - The project will avoid features which are unnecessarily tied to a particular implementation language.\n  * **incremental adoption** - JSONSelect features are broken in to conformance levels, to make it easier to build basic support and to allow incremental stabilization of the language.\n  * **efficient** - As many constructs of the language as possible will be able to be evaluated in a single document traversal.  This allows for efficient stream filtering.\n\nJSONSelect should make common operations easy, complex operations possible,\nbut haughtily ignore weird shit.\n\n## What's Here\n\nThis repository is the home to many things related to JSONSelect:\n\n  * [Documentation](https://github.com/lloyd/JSONSelect/blob/master/JSONSelect.md) which describes the language\n  * The [jsonselect.org](http://jsonselect.org) [site source](https://github.com/lloyd/JSONSelect/blob/master/site/)\n  * A [reference implementation](https://github.com/lloyd/JSONSelect/blob/master/src/jsonselect.js) in JavaScript\n\n## Related projects\n\nConformance tests are broken out into a [separate\nrepository](https://github.com/lloyd/JSONSelectTests) and may be used\nby other implementations.","maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.4.0":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"JSONSelect","description":"CSS-like selectors for JSON","version":"0.4.0","homepage":"http://jsonselect.org","repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"main":"src/jsonselect","engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{},"scripts":{"test":"node src/test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"JSONSelect@0.4.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a08edcc67eb3fcbe99ed630855344a0cf282bb8d","tarball":"http://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]}},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}],"time":{"modified":"2012-01-27T21:40:31.750Z","created":"2011-05-22T14:52:09.489Z","0.0.1":"2011-05-22T14:52:09.864Z","0.1.0":"2011-06-01T21:12:59.691Z","0.2.0":"2011-06-03T15:33:11.086Z","0.2.1":"2011-06-12T14:14:18.637Z","0.2.2":"2011-10-25T19:07:00.266Z","0.2.3":"2012-01-05T16:51:13.956Z","0.3.0":"2012-01-05T17:31:03.834Z","0.4.0":"2012-01-27T21:40:31.750Z"},"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"repository":{"type":"git","url":"git://github.com/lloyd/JSONSelect.git"},"_attachments":{"JSONSelect-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-bLxarBHA3+kacUDENDYhpg==","length":245760,"stub":true},"JSONSelect-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ibzmVWigiMYXS940m7nqyA==","length":60239,"stub":true},"JSONSelect-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-DH/+7Q1zd0Fo9ORZ99/qkw==","length":4458,"stub":true},"JSONSelect-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-GWQDrCawRFT+45lGCuK/kQ==","length":243229,"stub":true},"JSONSelect-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-AWz0cn5KHsgxgZFyOgxi/Q==","length":235627,"stub":true},"JSONSelect-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6CzJVQ0Xqy03noPnsIfgpg==","length":235434,"stub":true},"JSONSelect-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ddCiL8+0RzJJJT0ah1Sx5A==","length":233867,"stub":true},"JSONSelect-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q5wpvnRLbhiaictJp6ZLKA==","length":127933,"stub":true}}}},
{"id":"JSONStream","key":"JSONStream","value":{"rev":"25-69b257b34a7113a1225d711726048c82"},"doc":{"_id":"JSONStream","_rev":"25-69b257b34a7113a1225d711726048c82","name":"JSONStream","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","dist-tags":{"latest":"0.3.1"},"versions":{"0.0.0":{"name":"JSONStream","version":"0.0.0","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"_npmJsonOpts":{"file":"/home/dominic/.npm/JSONStream/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSONStream@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cd81636260f432847780fb5a48ab0be0ed264ba6","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.0":{"name":"JSONStream","version":"0.1.0","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"_npmJsonOpts":{"file":"/home/dominic/.npm/JSONStream/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSONStream@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"66d9f4fe782cd91c1f671193f30fcbd2a7d4ebc7","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.1.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.1":{"name":"JSONStream","version":"0.1.1","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"_npmJsonOpts":{"file":"/home/dominic/.npm/JSONStream/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSONStream@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e2c482fdf9a78be634a50d063e576a95f4e6bca7","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.1.1.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.2":{"name":"JSONStream","version":"0.1.2","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"_npmJsonOpts":{"file":"/home/dominic/.npm/JSONStream/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSONStream@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"ee0908f1612c3c280683f5c91b426cb15513c122","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.1.2.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.3":{"name":"JSONStream","version":"0.1.3","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSONStream@0.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"eafefa0d628b56970904b428fcc9dc60b0f9652d","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.1.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.0":{"name":"JSONStream","version":"0.2.0","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{"it-is":"~1.0.1","assertions":"~2.2.2","render":"~0.1.1","trees":"~0.0.3","event-stream":"~0.7.0"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"for t in test/*.js; do echo *** $t ***; node $t; done"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSONStream@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5a3e15a1319e5f2563208fbd72d863e931123dea","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.2.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.1":{"name":"JSONStream","version":"0.2.1","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{"it-is":"~1","assertions":"~2.2.2","render":"~0.1.1","trees":"~0.0.3","event-stream":"~0.7.0"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"for t in test/*.js; do echo *** $t ***; node $t; done"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSONStream@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"7295abf47e5024addaf698d9b9634175bc53a892","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.2.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.2":{"name":"JSONStream","version":"0.2.2","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{"it-is":"~1","assertions":"~2.2.2","render":"~0.1.1","trees":"~0.0.3","event-stream":"~0.7.0"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"for t in test/*.js; do echo *** $t ***; node $t; done"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSONStream@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"5a6d8d0ea7b2fd635037bfd5da6ac797863b9102","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.2.2.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.3":{"name":"JSONStream","version":"0.2.3","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{"it-is":"~1","assertions":"~2.2.2","render":"~0.1.1","trees":"~0.0.3","event-stream":"~0.7.0"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"for t in test/*.js; do echo *** $t ***; node $t; done"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSONStream@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"831f5fe4b40c7bcfd3de958dc9f4034f5c87b494","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.2.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.3.0":{"name":"JSONStream","version":"0.3.0","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{"it-is":"~1","assertions":"~2.2.2","render":"~0.1.1","trees":"~0.0.3","event-stream":"~0.7.0"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"for t in test/*.js; do echo *** $t ***; node $t; done"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"JSONStream@0.3.0","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"64d2d6f38fb21bcec8c9894f9cfafe294cc49f1e","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.3.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.3.1":{"name":"JSONStream","version":"0.3.1","description":"rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)","homepage":"http://github.com/dominictarr/JSONStream","repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"dependencies":{"jsonparse":"0.0.1"},"devDependencies":{"it-is":"~1","assertions":"~2.2.2","render":"~0.1.1","trees":"~0.0.3","event-stream":"~0.7.0"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"for t in test/*.js; do echo *** $t ***; node $t; done"},"optionalDependencies":{},"engines":{"node":"*"},"_id":"JSONStream@0.3.1","dist":{"shasum":"40dfbc113ed1c5ef1b3d61e87794cebfe07c4b11","tarball":"http://registry.npmjs.org/JSONStream/-/JSONStream-0.3.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-08-06T14:55:36.591Z","created":"2011-09-23T11:01:36.806Z","0.0.0":"2011-09-23T11:01:40.295Z","0.1.0":"2011-09-23T12:45:34.218Z","0.1.1":"2011-09-26T02:57:57.814Z","0.1.2":"2011-10-05T11:53:45.443Z","0.1.3":"2012-02-02T01:38:16.492Z","0.2.0":"2012-02-23T09:51:21.669Z","0.2.1":"2012-04-09T23:10:23.002Z","0.2.2":"2012-05-08T23:39:06.049Z","0.2.3":"2012-06-14T02:54:00.901Z","0.3.0":"2012-06-14T11:22:01.759Z","0.3.1":"2012-07-16T01:17:23.031Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"repository":{"type":"git","url":"git://github.com/dominictarr/JSONStream.git"},"users":{"substack":true,"sjonnet19":true},"_attachments":{"JSONStream-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-zod6+Da3N22vwYf3teqi0g==","length":132487,"stub":true},"JSONStream-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-cTNxuFm/f0Z0cwOE8kq8mg==","length":132571,"stub":true},"JSONStream-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-lx0B0UBxU3WzL3wJPVWXvA==","length":132403,"stub":true},"JSONStream-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-NQCX0iLDsHNlxgAUPD1y1w==","length":132128,"stub":true},"JSONStream-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-pEJCZHZB/aT5bK5js10dLw==","length":131328,"stub":true},"JSONStream-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-X8v2jwasWfZ1WLauKq2PiQ==","length":131232,"stub":true},"JSONStream-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-8SYWSBD+6npbOPYtmQ84xA==","length":130714,"stub":true},"JSONStream-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-U7JE1THi0cCJJthiflcXRg==","length":2952133,"stub":true},"JSONStream-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Ud9WIrxCq2BVE5YQitKdxw==","length":130428,"stub":true},"JSONStream-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Venp1Kw3Z6oHMOcZgSxGgg==","length":130407,"stub":true},"JSONStream-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iSU+7DzI38up5dzHXepeVg==","length":129378,"stub":true}}}},
{"id":"JSONUtil","key":"JSONUtil","value":{"rev":"3-cf1b93b502bebcf2b5ad36eb5f9596e9"},"doc":{"_id":"JSONUtil","_rev":"3-cf1b93b502bebcf2b5ad36eb5f9596e9","name":"JSONUtil","description":"A JSON Stringify that does not throw an exception when facing circular references","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Henri Bouvier"},"name":"JSONUtil","description":"A JSON Stringify that does not throw an exception when facing circular references","version":"0.0.1","repository":{"type":"git","url":"git@github.com:hbouvier/node-JSONUtil.git"},"main":"JSONUtil","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"hbouvier","email":"henribouvier@yahoo.com"},"_id":"JSONUtil@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"0fa7e3c30c20d256344d7863b183ff5df760f9a3","tarball":"http://registry.npmjs.org/JSONUtil/-/JSONUtil-0.0.1.tgz"},"readme":"","maintainers":[{"name":"hbouvier","email":"henribouvier@yahoo.com"}]}},"readme":"","maintainers":[{"name":"hbouvier","email":"henribouvier@yahoo.com"}],"time":{"modified":"2012-03-04T18:34:24.200Z","created":"2012-03-04T18:34:23.562Z","0.0.1":"2012-03-04T18:34:24.200Z"},"author":{"name":"Henri Bouvier"},"repository":{"type":"git","url":"git@github.com:hbouvier/node-JSONUtil.git"},"_attachments":{"JSONUtil-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+u5j9vhO5Vm5u+Sio6XbHQ==","length":1691,"stub":true}}}},
{"id":"JSONloops","key":"JSONloops","value":{"rev":"3-3d4a1f8bfcfd778ab7def54155324331"},"doc":{"_id":"JSONloops","_rev":"3-3d4a1f8bfcfd778ab7def54155324331","name":"JSONloops","description":"a real-time multiuser audio sequencer","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"JSONloops","description":"a real-time multiuser audio sequencer","version":"0.1.0","homepage":"https://github.com/Marak/JSONloops","repository":{"type":"git","url":"git://github.com/Marak/JSONloops.git"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"directories":{"lib":"lib"},"dependencies":{"irrklang":">= 0.0.1"},"engines":{"node":"*"},"_id":"JSONloops@0.1.0","_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"91ac9c86d704cc999b42f227cea54aab4f6b53ab","tarball":"http://registry.npmjs.org/JSONloops/-/JSONloops-0.1.0.tgz"}}},"maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2011-03-01T19:43:12.973Z","created":"2011-03-01T19:43:12.391Z","0.1.0":"2011-03-01T19:43:12.973Z"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"git://github.com/Marak/JSONloops.git"},"_attachments":{"JSONloops-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L4QsIxBSQRbxTeQZCBa+ww==","length":2095966,"stub":true}}}},
{"id":"JSPP","key":"JSPP","value":{"rev":"7-af09a2bb193b3ff44775e8fbb7d4f522"},"doc":{"_id":"JSPP","_rev":"7-af09a2bb193b3ff44775e8fbb7d4f522","name":"JSPP","description":"JavaScript preprocessor","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"JSPP","description":"JavaScript preprocessor","version":"0.1.0","author":{"name":"schrodingerz.kitten@gmail.com"},"main":"./lib/jspp","dependencies":{"uglify-js":">= 1.0.0","typecheck":">= 0.1.0"},"_npmJsonOpts":{"file":"/home/mineo/.npm/JSPP/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSPP@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"bfb160a6d57db1be03105ab2c909fb416226e166","tarball":"http://registry.npmjs.org/JSPP/-/JSPP-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"JSPP","description":"JavaScript preprocessor","version":"0.1.1","author":{"name":"schrodingerz.kitten@gmail.com"},"main":"./lib/jspp","dependencies":{"uglify-js":">= 1.0.0","typecheck":">= 0.1.0"},"_npmJsonOpts":{"file":"/home/mineo/.npm/JSPP/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSPP@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"30d0c9f63bbe8644871df81d86b1cb2c2614b84e","tarball":"http://registry.npmjs.org/JSPP/-/JSPP-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"JSPP","description":"JavaScript preprocessor","version":"0.1.2","author":{"name":"schrodingerz.kitten@gmail.com"},"main":"./lib/jspp","dependencies":{"uglify-js":">= 1.0.0","typecheck":">= 0.1.0"},"_npmJsonOpts":{"file":"/home/mineo/.npm/JSPP/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"JSPP@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"80a63cbab3c0d04ecdeb04fafed477b2c253be31","tarball":"http://registry.npmjs.org/JSPP/-/JSPP-0.1.2.tgz"},"scripts":{}}},"maintainers":[{"name":"schrodingerz-kitten","email":"schrodingerz.kitten@gmail.com"}],"time":{"modified":"2011-07-21T01:28:01.608Z","created":"2011-07-21T00:01:00.520Z","0.1.0":"2011-07-21T00:01:02.570Z","0.1.1":"2011-07-21T00:24:57.718Z","0.1.2":"2011-07-21T01:28:01.608Z"},"author":{"name":"schrodingerz.kitten@gmail.com"},"_attachments":{"JSPP-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-j9aoXBH8lVLmV1SeK9Qesg==","length":3010,"stub":true},"JSPP-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rIrZ2Xd8heCkxNLGuD8r3w==","length":2345,"stub":true},"JSPP-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vcYO3YFenF9Pgef3y5c4pQ==","length":2289,"stub":true}}}},
{"id":"JSUS","key":"JSUS","value":{"rev":"87-119a345f9a3d3b28696eb5649c645417"},"doc":{"_id":"JSUS","_rev":"87-119a345f9a3d3b28696eb5649c645417","name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","dist-tags":{"latest":"0.4.7"},"versions":{"0.1.0":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.1.0","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0dd149a51950c324cbe8f913cdc110e8d3c03187","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.1.0.tgz"},"readme":"","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.1.1":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.1.1","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"209cb498c7d243c1b452912536d239f384c85471","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.1.1.tgz"},"readme":"","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.1.2":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.1.2","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7342e2be8623705c59d85dadfbf8132cba8c450b","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.1.2.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.1.3":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.1.3","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"34b20daab8f2f51112b9320c685e1976ac4591e9","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.1.3.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.1.4":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.1.4","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"be5da5cc6e33bc13c1a5104f9de8ae7bcd63ca98","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.1.4.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.0":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.0","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"89670490f2f22680e6fcb4fa73be217d388d1ae0","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.0.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.1":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.1","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f87871b9e052e6630ab9f8e998feb8df2babf218","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.1.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.2":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.2","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"845b6972f015a58fef67c362075db4932e2cf6e8","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.2.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.3":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.3","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2b65b63703656f38d354ea7b4d9d53ab1734f98b","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.3.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.4":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.4","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.4","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"03cc7f9628fe1676f48c8b6ad8abd34eba4a2416","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.4.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.5":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.5","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.5","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e2efac18fc4d4b52a01a46d9dca902dba4841d30","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.5.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.6":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.6","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e32762dc88fdd2de015df573ba3bccdb124e420c","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.6.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.7":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.7","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"8e0e2769eeb34b58527ccb39dc01617864878351","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.7.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.2.8":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.2.8","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.2.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a12371b2cdda09cfc7f30b8ab7bdd329bae7b5df","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.2.8.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.0":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.0","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"02f815bd5fe614ae33a877e7ea92f49bcb4d029b","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.0.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.1":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.1","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e46fa97cebabd4e56c050c408acca45a48c8584f","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.1.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.2":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.2","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0e05257040b89a6aa9c9dd1212091833e29217a5","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.2.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.3":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.3","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5b226828c871f4b6fa623fce9f4c78b15b2a542c","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.3.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.4":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.4","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"80388dda0047f323e3d39aa4f8768c2d33a5cd46","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.4.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.5":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.5","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"6f5798d5c4569ac13d41c6ee527f1614a1c38dc0","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.5.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.6":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.6","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1","yuidocjs":">= 0.3.0"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"83812b312e558ba8a4a28e347a175d4e8ef0d317","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.6.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.7":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.7","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1","yuidocjs":">= 0.3.0","docker":">= 0.1.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"88f614f6c807f2f3f7c8872d050bdfd06e2e8bee","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.7.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.8":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.8","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1","yuidocjs":">= 0.3.0","docker":">= 0.1.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0c304344380aca3738ff2e3d663fde1ab34392e7","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.8.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.9":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.3.9","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1","yuidocjs":">= 0.3.0","docker":">= 0.1.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.3.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"04b835df6c5dead720f9d4ab771bb4e9bf1d990f","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.3.9.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.0":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.0","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1","yuidocjs":">= 0.3.0","docker":">= 0.1.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"2b1e1e2da0774a89c4658162a08cadd753bc0b90","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.0.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\n\tnode make.jsus.js build // Full build, about 16Kb minified\n\tnode make.jsus.js build OBJ ARRAY -o jsus-oa.js // about 8Kb minified\n```\n\nMake help:\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] \n\t\tCreates a custom build of JSUS.js\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n  \tUsage: build [options]\n\n\tOptions:\n\n\t-h, --help           output usage information\n\t-o, --output <file>\n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.1":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.1","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.1","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e33823b573218b97a7b15788d2f8a4525a27cece","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.1.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.jsus.js build // Full build, about 16Kb minified\nnode make.jsus.js build OBJ ARRAY -o jsus-oa.js // about 8Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.jsus.js doc // Full build, about 16Kb minified\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] \n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n  \tUsage: build [options]\n\n\tOptions:\n\n\t-h, --help           output usage information\n\t-o, --output <file>\n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.2":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.2","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.3","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ac518c4560e90fbe4271db6a2a80cdb2dfe45db6","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.2.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.jsus.js build // Full build, about 16Kb minified\nnode make.jsus.js build OBJ ARRAY -o jsus-oa.js // about 8Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.jsus.js doc // Full build, about 16Kb minified\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] \n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n  \tUsage: build [options]\n\n\tOptions:\n\n\t-h, --help           output usage information\n\t-o, --output <file>\n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.3":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.3","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.3","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"1d4d8e174121a06c2ced5c053f0f0bc96cc46cbe","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.3.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.jsus.js build // Full build, about 16Kb minified\nnode make.jsus.js build OBJ ARRAY -o jsus-oa.js // about 8Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.jsus.js doc // Full build, about 16Kb minified\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] \n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n  \tUsage: build [options]\n\n\tOptions:\n\n\t-h, --help           output usage information\n\t-o, --output <file>\n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.4":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.4","keywords":["util","general","array","eval","time","date","object"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.3","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.8.5","_defaultsLoaded":true,"dist":{"shasum":"087254faf51b65768cb4e974e432a539ae102038","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.4.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.jsus.js build // Full build, about 16Kb minified\nnode make.jsus.js build OBJ ARRAY -o jsus-oa.js // about 8Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.jsus.js doc\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] \n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n  \tUsage: build [options]\n\n\tOptions:\n\n\t-h, --help           output usage information\n\t-o, --output <file>\n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.5":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.5","keywords":["util","general","array","eval","time","date","object","nodeGame"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.3","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.8.5","_defaultsLoaded":true,"dist":{"shasum":"949f77ee0a0a9562d70b2a7d6ee7ed599db6c353","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.5.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.js build -a // Full build, about 20Kb minified\nnode make.js build -l obj,array -o jsus-oa.js // about 12Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.js doc\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] [options]\n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n\n  Usage: build [options] [options]\n\n  Options:\n\n    -h, --help           output usage information\n    -l, --lib <items>    choose libraries to include\n    -A, --analyse        analyse build\n    -a, --all            full build of JSUS\n    -o, --output <file>  \n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.6":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.6","keywords":["util","general","array","eval","time","date","object","nodeGame"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.3","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.8.5","_defaultsLoaded":true,"dist":{"shasum":"94832e0457f5dabc559814e1becb62c67525a3ee","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.6.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.js build -a // Full build, about 20Kb minified\nnode make.js build -l obj,array -o jsus-oa.js // about 12Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.js doc\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] [options]\n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n\n  Usage: build [options] [options]\n\n  Options:\n\n    -h, --help           output usage information\n    -l, --lib <items>    choose libraries to include\n    -A, --analyse        analyse build\n    -a, --all            full build of JSUS\n    -o, --output <file>  \n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.4.7":{"name":"JSUS","description":"JavaScript UtilS. Collection of general purpose functions. JSUS helps!","version":"0.4.7","keywords":["util","general","array","eval","time","date","object","nodeGame"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"directories":{"lib":"./lib"},"dependencies":{"commander":"1.0.0","docker":">= 0.1.3","smoosh":"0.3.2"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.4.0"},"main":"jsus.js","repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"JSUS@0.4.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.8.5","_defaultsLoaded":true,"dist":{"shasum":"bfd7e75fb702916b31034894a36ce27bf335c60b","tarball":"http://registry.npmjs.org/JSUS/-/JSUS-0.4.7.tgz"},"readme":"# JSUS: JavaScript UtilS. \n\nCollection of general purpose javascript functions. JSUS helps!\n\n## Usage\n\nJSUS is designed to be modular and easy to extend. \n\nJust use: \n\n```javascript\nJSUS.extend(myClass);\n```\n\nto extend the functionalities of JSUS. All the methods of myClass \nare immediately added to JSUS, and a reference to myClass is stored\nin `JSUS._classes`.\n\n`MyClass` can be either of type Object or Function.\n\nJSUS can also extend other objects. Just pass a second parameter:\n\n```javascript\nJSUS.extend(myClass, mySecondClass);\n```\n\nand `mySecondClass` will receive all the methods of `myClass`. In this case,\nno reference of myClass is stored.\n\nTo get a copy of one of the registered JSUS libraries do:\n\n```javascript\nvar myClass = JSUS.require('myClass');\n```\n\n### JSUS come shipped in with a set of default libraries:\n\n1. OBJ\n2. ARRAY\n3. TIME\n4. EVAL\n5. DOM\n6. RANDOM\n7. PARSE\n\n## Build\n\nCreate your customized build of JSUS.js using the make file in the bin directory\n\n```javascript\nnode make.js build -a // Full build, about 20Kb minified\nnode make.js build -l obj,array -o jsus-oa.js // about 12Kb minified\n```\n\n## API Documentation\n\nCreate html API documentation using the make file in the bin directory  \n\n```javascript\nnode make.js doc\n```\n\n## Make help\n\n\tUsage: make.jsus.js [options] [command]\n\n  \tCommands:\n\n\t\tbuild [options] [options]\n\t\tCreates a custom build of JSUS.js\n \n    doc \n    Build documentation files\n\n\tOptions:\n\n\t-h, --help     output usage information\n\t-V, --version  output the version number\n\n\n  Usage: build [options] [options]\n\n  Options:\n\n    -h, --help           output usage information\n    -l, --lib <items>    choose libraries to include\n    -A, --analyse        analyse build\n    -a, --all            full build of JSUS\n    -o, --output <file>  \n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]}},"readme":"","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}],"time":{"modified":"2012-08-11T18:54:57.697Z","created":"2012-02-25T12:19:52.407Z","0.1.0":"2012-02-25T12:19:55.812Z","0.1.1":"2012-02-25T15:52:41.159Z","0.1.2":"2012-02-26T17:20:43.854Z","0.1.3":"2012-02-28T09:49:50.190Z","0.1.4":"2012-02-29T11:16:36.042Z","0.2.0":"2012-02-29T16:05:02.047Z","0.2.1":"2012-03-02T10:07:20.594Z","0.2.2":"2012-03-02T11:04:24.938Z","0.2.3":"2012-03-03T20:12:54.288Z","0.2.4":"2012-03-05T15:31:14.614Z","0.2.5":"2012-03-06T12:36:09.737Z","0.2.6":"2012-05-01T09:06:11.014Z","0.2.7":"2012-05-07T07:50:30.540Z","0.2.8":"2012-05-19T14:21:30.262Z","0.3.0":"2012-05-20T11:46:26.269Z","0.3.1":"2012-05-28T12:09:08.281Z","0.3.2":"2012-06-05T17:16:39.711Z","0.3.3":"2012-06-08T13:03:18.009Z","0.3.4":"2012-06-10T23:48:34.989Z","0.3.5":"2012-06-15T10:37:53.315Z","0.3.6":"2012-06-17T18:36:05.819Z","0.3.7":"2012-06-21T14:30:29.813Z","0.3.8":"2012-07-13T16:51:27.338Z","0.3.9":"2012-07-15T13:58:52.931Z","0.4.0":"2012-07-29T16:37:20.831Z","0.4.1":"2012-08-02T14:00:19.453Z","0.4.2":"2012-08-02T20:26:14.844Z","0.4.3":"2012-08-03T21:04:03.849Z","0.4.4":"2012-08-09T10:45:21.414Z","0.4.5":"2012-08-09T14:09:51.411Z","0.4.6":"2012-08-11T18:37:05.913Z","0.4.7":"2012-08-11T18:54:57.697Z"},"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"repository":{"type":"git","url":"git://github.com/nodeGame/JSUS.git"},"users":{"fgribreau":true},"_attachments":{"JSUS-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-QM+yO/Zo++/9XNkK4wJ1MA==","length":23986,"stub":true},"JSUS-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-t6gwOBE6AApbX9I4I7RNzQ==","length":23831,"stub":true},"JSUS-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-uf5OArf3DEow3z20PKhhew==","length":22964,"stub":true},"JSUS-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-HatWI0WcKLNkW1Y2nsQGiw==","length":22701,"stub":true},"JSUS-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-knC4X2G0+qh5Zy5mCfaGPg==","length":22468,"stub":true},"JSUS-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-A+Ny9heEFr1+JvHmHUw8UA==","length":22419,"stub":true},"JSUS-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-mOPKMp5FPPxSJQ8s6TIXvQ==","length":21938,"stub":true},"JSUS-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":68,"digest":"md5-ZayXehf92tw4CyhiJcWJJQ==","length":20441,"stub":true},"JSUS-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-xHps6HJOhU2CQaYSIe6QTQ==","length":18942,"stub":true},"JSUS-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-M9/gkk5RO4R2KzskyUVBag==","length":18086,"stub":true},"JSUS-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-Hu5Hl8MeuwXPaSoci1b4hA==","length":16224,"stub":true},"JSUS-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-JNPI+2i0Ayzy5JhR9w+LSQ==","length":15952,"stub":true},"JSUS-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-aMFbSpcA5koFup68E41Hjw==","length":15056,"stub":true},"JSUS-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-aSAp07L8IdJWJMxoaPRZnQ==","length":14631,"stub":true},"JSUS-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-BlThslZQAaLTypIEw2Qoog==","length":14605,"stub":true},"JSUS-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-bBpJ5KgaemyhcTZWH4TPfg==","length":14379,"stub":true},"JSUS-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-kN5dTfk7uian4ik2cu0A7A==","length":14053,"stub":true},"JSUS-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-R2RI9WQQZJqf2kmdm8hACA==","length":13122,"stub":true},"JSUS-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-nftbmkNj3hjmxz4HCM6Lzw==","length":12192,"stub":true},"JSUS-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-OJWgnoEeGDv4ML1+UBqbRg==","length":11945,"stub":true},"JSUS-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-+ngdtXM5VSpQUU2L0DLXoQ==","length":11942,"stub":true},"JSUS-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-ijfsm5ngsaFWUxqCN7qCqw==","length":11516,"stub":true},"JSUS-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-eVYpPIjGofAcWaGeoAa6VQ==","length":11418,"stub":true},"JSUS-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-2S9zVzE8/cfAyZ9v4pSagQ==","length":11586,"stub":true},"JSUS-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-od8q6E65D/8zL5FjNo+E9Q==","length":10893,"stub":true},"JSUS-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Hzi3AeOnRGInhXIBB1lUqg==","length":10506,"stub":true},"JSUS-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-kqY2C36NB+5NxSVjYGV+Zg==","length":10687,"stub":true},"JSUS-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-yqYv71FtKlxDSwfiBUaS5w==","length":6845,"stub":true},"JSUS-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-uO4x9Fls9JrVbxLsZDC8fw==","length":6248,"stub":true},"JSUS-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZLGeMrrMg1F7ZEcpakfGjw==","length":6143,"stub":true},"JSUS-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NmHoj0POkEbo+70A5c9eDw==","length":5466,"stub":true},"JSUS-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pgoUgXqim8kot6X6HPae5A==","length":5250,"stub":true}}}},
{"id":"JSV","key":"JSV","value":{"rev":"9-3426327f1121efdcdab0fc8a2e812980"},"doc":{"_id":"JSV","_rev":"9-3426327f1121efdcdab0fc8a2e812980","name":"JSV","description":"A JavaScript implementation of a extendable, fully compliant JSON Schema validator.","dist-tags":{"latest":"4.0.2"},"versions":{"3.5.0":{"name":"JSV","version":"3.5.0","description":"A JavaScript implementation of a extendable, fully compliant JSON Schema validator.","homepage":"http://github.com/garycourt/JSV","author":{"name":"Gary Court","email":"gary.court@gmail.com"},"licenses":[{"type":"FreeBSD","url":"http://github.com/garycourt/JSV/raw/master/jsv.js"}],"maintainers":[{"name":"Gary Court","email":"gary.court@gmail.com"}],"bugs":{"email":"gary.court@gmail.com","url":"http://github.com/garycourt/JSV/issues"},"repositories":[{"type":"git","url":"git://github.com/garycourt/JSV.git"}],"dependencies":{},"main":"lib/jsv.js","keywords":["json","schema","validator"],"devDependencies":{},"_id":"JSV@3.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f017ec75629e8c89b8359dc79a2ceee92ef9471e","tarball":"http://registry.npmjs.org/JSV/-/JSV-3.5.0.tgz"},"scripts":{}},"4.0.0":{"name":"JSV","version":"4.0.0","description":"A JavaScript implementation of a extendable, fully compliant JSON Schema validator.","homepage":"http://github.com/garycourt/JSV","author":{"name":"Gary Court","email":"gary.court@gmail.com"},"licenses":[{"type":"FreeBSD","url":"http://github.com/garycourt/JSV/raw/master/jsv.js"}],"maintainers":[{"name":"garycourt","email":"gary.court@gmail.com"}],"bugs":{"email":"gary.court@gmail.com","url":"http://github.com/garycourt/JSV/issues"},"repositories":[{"type":"git","url":"git://github.com/garycourt/JSV.git"}],"dependencies":{},"main":"lib/jsv.js","keywords":["json","schema","validator"],"_npmUser":{"name":"garycourt","email":"gary.court@gmail.com"},"_id":"JSV@4.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"abf69fbf2429ac10183264dd1af04b2d6ba262ef","tarball":"http://registry.npmjs.org/JSV/-/JSV-4.0.0.tgz"},"readme":"JSV: JSON Schema Validator\r\n==========================\r\n\r\nJSV is a JavaScript implementation of a extendable, fully compliant JSON Schema validator with the following features:\r\n\r\n*\tThe fastest extendable JSON validator available!\r\n*\tComplete implementation of all current JSON Schema draft revisions.\r\n*\tSupports creating individual environments (sandboxes) that validate using a particular schema specification.\r\n*\tProvides an intuitive API for creating new validating schema attributes, or whole new custom schema schemas.\r\n*\tSupports `self`, `full` and `describedby` hyper links.\r\n*\tValidates itself, and is bootstrapped from the JSON Schema schemas.\r\n*\tIncludes over 1100 unit tests for testing all parts of the specifications.\r\n*\tWorks in all ECMAScript 3 environments, including all web browsers and Node.js.\r\n*\tLicensed under the FreeBSD License, a very open license.\r\n\r\n## It's a what?\r\n\r\n**JSON** (an acronym for **JavaScript Object Notation**) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of JavaScript/ECMA-262 3rd Edition. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages. (C, C++, C#, Java, JavaScript, Perl, Python, ...) These properties make JSON an ideal data-interchange language. \\[[json.org](http://json.org)\\]\r\n\r\n**JSON Schema** is a JSON media type for defining the structure of JSON data.  JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it.  JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data. \\[[draft-zyp-json-schema-02](http://tools.ietf.org/html/draft-zyp-json-schema-02)\\]\r\n\r\nA **JSON validator** is a program that takes JSON data and, with a provided schema, will ensure that the provided JSON is structured in the way defined by the schema. This ensures that if validation has passed, the JSON instance is guaranteed to be in the expected format. It will also provide an explanation on why a particular instance failed validation.\r\n\r\n## Example\r\n\r\nHere's an example on how to validate some JSON with JSV:\r\n\r\n\tvar JSV = require(\"./jsv\").JSV;\r\n\tvar json = {};\r\n\tvar schema = {\"type\" : \"object\"};\r\n\tvar env = JSV.createEnvironment();\r\n\tvar report = env.validate(json, schema);\r\n\t\r\n\tif (report.errors.length === 0) {\r\n\t\t//JSON is valid against the schema\r\n\t}\r\n\r\nAnother example; for the following test:\r\n\r\n\tenv.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'string' }} });\r\n\r\nThe generated report would look like:\r\n\r\n\t{\r\n\t\terrors : [\r\n\t\t\t{\r\n\t\t\t\tmessage : \"Instance is not a required type\",\r\n\t\t\t\turi : \"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\",\r\n\t\t\t\tschemaUri : \"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\",\r\n\t\t\t\tattribute : \"type\",\r\n\t\t\t\tdetails : [\"string\"]\r\n\t\t\t}\r\n\t\t],\r\n\t\tvalidated : {\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#\"],\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\"],\r\n\t\t\t//...\r\n\t\t},\r\n\t\tinstance : [JSONInstance object],\r\n\t\tschema : [JSONSchema object],\r\n\t\tschemaSchema : [JSONSchema object]\r\n\t}\r\n\r\n## Environments & JSON Schema support\r\n\r\nThere is no one way to validate JSON, just like there is no one way to validate XML. Even the JSON Schema specification has gone through several revisions which are not 100% backwards compatible with each other. To solve the issue of using numerous schemas already written to older specifications, JSV provides customizable environments to validate your JSON within. \r\n\r\nWhen creating an environment, you can optionally specify how you want that environment to behave. For example, this allows you to specify which version of the JSON Schema you would like the environment to behave like. JSV already provides the following environments:\r\n\r\n*\t`json-schema-draft-03`\r\n\r\n\tA complete implementation of the [third revision](http://tools.ietf.org/html/draft-zyp-json-schema-03) of the JSON Schema specification. This is the same as the second revision, except:\r\n\t\r\n\t*\t\"optional\" has been replaced by \"required\"\r\n\t*\t\"requires\" has been replaced by \"dependencies\"\r\n\t*\t\"minimumCanEqual\"/\"maximumCanEqual\" has been replaced by \"exclusiveMinimum\"/\"exclusiveMaximum\"\r\n\t*\t\"self\"/\"full\"/\"describedby\" links have been moved to the core schema, and are provided by \"id\"/\"$ref\"/\"$schema\"\r\n\t*\tAdds the attributes \"patternSchema\" and \"additionalItems\"\r\n\t*\tDeprecates the attributes \"root\" and \"alternate\"\r\n\t*\tSchemas are now versioned under the URIs \"http://json-schema.org/draft-XX/\", where XX is the draft number\r\n\t\r\n\tIn addition to this, all schemas from the previous versions of the JSON Schema draft are included in this environment, and are backwards compatible (where possible) with it's previous version.\r\n\tThis backwards compatibility can be disabled with the environment option `strict` is set to `true`.\r\n\t\r\n\tThis is currently the default environment.\r\n\r\n*\t`json-schema-draft-02`\r\n\r\n\tA complete implementation of the [second revision](http://tools.ietf.org/html/draft-zyp-json-schema-02) of the JSON Schema specification. This is the same as the first revision, except adds:\r\n\t\r\n\t*\t\"targetSchema\" attribute\r\n\t*\tslash-delimited fragment identifiers, which is now the default behavior\r\n\t\r\n*\t`json-schema-draft-01`\r\n\r\n\tA complete implementation of the [first revision](http://tools.ietf.org/html/draft-zyp-json-schema-01) of the JSON Schema specification, which is exactly the same as the [original draft](http://tools.ietf.org/html/draft-zyp-json-schema-00).\r\n\t\r\n\tUsers with JSON Schemas written for JSV < v2.1 should use this environment for it's dot-delimited fragment identifiers.\r\n\r\nEnvironments can also be customized and registered for multiple reuse. (See the section on *Extending Environments* below)\r\n\r\n## Validation API\r\n\r\nThe following methods are used to validate JSON data:\r\n\r\n### JSV.createEnvironment(*environmentID?*) *->* *&lt;Environment&gt;*\r\n\r\n*\t*environmentID* *&lt;String&gt;* *(optional)* The ID of the environment to clone a new Environment from\r\n\r\nCreates an new environment that is a copy of the Environment registered with the provided `environmentID`. If no ID is provided, the latest registered JSON Schema is used as the template.\r\n\r\nSee the above section on *Environments* for the default available Environment IDs.\r\n\r\n### *&lt;Environment&gt;*.validate(*json*, *schema*) *->* *&lt;Report&gt;*\r\n\r\n*\t*json* *&lt;Any|JSONInstance&gt;* The JSON data to validate\r\n*\t*schema* *&lt;Object|JSONInstance|JSONSchema&gt;* The schema to validate the JSON with\r\n\r\nValidates both the schema and the JSON, and returns a report of the validation.\r\n\r\n### *&lt;Report&gt;*.errors *&lt;Array&gt;*\r\n\r\nAn array of error objects from the validation process; each object represents a restriction check that failed. If the array is empty, the validation passed.\r\n\r\nThe error objects have the following schema:\r\n\r\n\t{\r\n\t\t\"type\" : \"object\",\r\n\t\t\"properties\" : {\r\n\t\t\t\"message\" : {\r\n\t\t\t\t\"description\" : \"A user-friendly error message about what failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"uri\" : {\r\n\t\t\t\t\"description\" : \"URI of the instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"schemaUri\" : {\r\n\t\t\t\t\"description\" : \"URI of the schema instance that reported the error.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"attribute\" : {\r\n\t\t\t\t\"description\" : \"The attribute of the schema instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"details\" : {\r\n\t\t\t\t\"description\" : \"The value of the schema attribute that failed to validate.\",\r\n\t\t\t\t\"type\" : \"any\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n## API Documentation\r\n\r\nThere are many more APIs available for JSV, too many to detail here. The complete API and documentation can be found in the `docs` directory.\r\n\r\n## Extending Environments\r\n\r\nJSV provides an API for extending available schemas, adding new attributes and validation to currently existing schemas, and creating whole new Environments with unique behaviors. \r\nIn fact, in the [eat-your-own-dog-food](http://en.wikipedia.org/wiki/Eating_your_own_dog_food) approach, all the default JSON Schema environments available are implemented using this API. \r\nDetails and instruction on this feature will be provided at a later date.\r\n\r\n## Unit Tests\r\n\r\nOpen `tests/index.html` and `tests/index3.html` in your web browser to run the unit tests.\r\n\r\n## License\r\n\r\nJSV is licensed under the FreeBSD License. "},"4.0.1":{"name":"JSV","version":"4.0.1","description":"A JavaScript implementation of a extendable, fully compliant JSON Schema validator.","homepage":"http://github.com/garycourt/JSV","author":{"name":"Gary Court","email":"gary.court@gmail.com"},"licenses":[{"type":"FreeBSD","url":"http://github.com/garycourt/JSV/raw/master/jsv.js"}],"maintainers":[{"name":"garycourt","email":"gary.court@gmail.com"}],"bugs":{"email":"gary.court@gmail.com","url":"http://github.com/garycourt/JSV/issues"},"repositories":[{"type":"git","url":"git://github.com/garycourt/JSV.git"}],"dependencies":{},"main":"lib/jsv.js","keywords":["json","schema","validator"],"_npmUser":{"name":"garycourt","email":"gary.court@gmail.com"},"_id":"JSV@4.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"26d7ea23a96473e13173c734b285ef395e9030e0","tarball":"http://registry.npmjs.org/JSV/-/JSV-4.0.1.tgz"},"readme":"JSV: JSON Schema Validator\r\n==========================\r\n\r\nJSV is a JavaScript implementation of a extendable, fully compliant JSON Schema validator with the following features:\r\n\r\n*\tThe fastest extendable JSON validator available!\r\n*\tComplete implementation of all current JSON Schema draft revisions.\r\n*\tSupports creating individual environments (sandboxes) that validate using a particular schema specification.\r\n*\tProvides an intuitive API for creating new validating schema attributes, or whole new custom schema schemas.\r\n*\tSupports `self`, `full` and `describedby` hyper links.\r\n*\tValidates itself, and is bootstrapped from the JSON Schema schemas.\r\n*\tIncludes over 1100 unit tests for testing all parts of the specifications.\r\n*\tWorks in all ECMAScript 3 environments, including all web browsers and Node.js.\r\n*\tLicensed under the FreeBSD License, a very open license.\r\n\r\n## It's a what?\r\n\r\n**JSON** (an acronym for **JavaScript Object Notation**) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of JavaScript/ECMA-262 3rd Edition. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages. (C, C++, C#, Java, JavaScript, Perl, Python, ...) These properties make JSON an ideal data-interchange language. \\[[json.org](http://json.org)\\]\r\n\r\n**JSON Schema** is a JSON media type for defining the structure of JSON data.  JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it.  JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data. \\[[draft-zyp-json-schema-02](http://tools.ietf.org/html/draft-zyp-json-schema-02)\\]\r\n\r\nA **JSON validator** is a program that takes JSON data and, with a provided schema, will ensure that the provided JSON is structured in the way defined by the schema. This ensures that if validation has passed, the JSON instance is guaranteed to be in the expected format. It will also provide an explanation on why a particular instance failed validation.\r\n\r\n## Example\r\n\r\nHere's an example on how to validate some JSON with JSV:\r\n\r\n\tvar JSV = require(\"./jsv\").JSV;\r\n\tvar json = {};\r\n\tvar schema = {\"type\" : \"object\"};\r\n\tvar env = JSV.createEnvironment();\r\n\tvar report = env.validate(json, schema);\r\n\t\r\n\tif (report.errors.length === 0) {\r\n\t\t//JSON is valid against the schema\r\n\t}\r\n\r\nAnother example; for the following test:\r\n\r\n\tenv.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'string' }} });\r\n\r\nThe generated report would look like:\r\n\r\n\t{\r\n\t\terrors : [\r\n\t\t\t{\r\n\t\t\t\tmessage : \"Instance is not a required type\",\r\n\t\t\t\turi : \"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\",\r\n\t\t\t\tschemaUri : \"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\",\r\n\t\t\t\tattribute : \"type\",\r\n\t\t\t\tdetails : [\"string\"]\r\n\t\t\t}\r\n\t\t],\r\n\t\tvalidated : {\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#\"],\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\"],\r\n\t\t\t//...\r\n\t\t},\r\n\t\tinstance : [JSONInstance object],\r\n\t\tschema : [JSONSchema object],\r\n\t\tschemaSchema : [JSONSchema object]\r\n\t}\r\n\r\n## Environments & JSON Schema support\r\n\r\nThere is no one way to validate JSON, just like there is no one way to validate XML. Even the JSON Schema specification has gone through several revisions which are not 100% backwards compatible with each other. To solve the issue of using numerous schemas already written to older specifications, JSV provides customizable environments to validate your JSON within. \r\n\r\nWhen creating an environment, you can optionally specify how you want that environment to behave. For example, this allows you to specify which version of the JSON Schema you would like the environment to behave like. JSV already provides the following environments:\r\n\r\n*\t`json-schema-draft-03`\r\n\r\n\tA complete implementation of the [third revision](http://tools.ietf.org/html/draft-zyp-json-schema-03) of the JSON Schema specification. This is the same as the second revision, except:\r\n\t\r\n\t*\t\"optional\" has been replaced by \"required\"\r\n\t*\t\"requires\" has been replaced by \"dependencies\"\r\n\t*\t\"minimumCanEqual\"/\"maximumCanEqual\" has been replaced by \"exclusiveMinimum\"/\"exclusiveMaximum\"\r\n\t*\t\"self\"/\"full\"/\"describedby\" links have been moved to the core schema, and are provided by \"id\"/\"$ref\"/\"$schema\"\r\n\t*\tAdds the attributes \"patternSchema\" and \"additionalItems\"\r\n\t*\tDeprecates the attributes \"root\" and \"alternate\"\r\n\t*\tSchemas are now versioned under the URIs \"http://json-schema.org/draft-XX/\", where XX is the draft number\r\n\t\r\n\tIn addition to this, all schemas from the previous versions of the JSON Schema draft are included in this environment, and are backwards compatible (where possible) with it's previous version.\r\n\tThis backwards compatibility can be disabled with the environment option `strict` is set to `true`.\r\n\t\r\n\tThis is currently the default environment.\r\n\r\n*\t`json-schema-draft-02`\r\n\r\n\tA complete implementation of the [second revision](http://tools.ietf.org/html/draft-zyp-json-schema-02) of the JSON Schema specification. This is the same as the first revision, except adds:\r\n\t\r\n\t*\t\"targetSchema\" attribute\r\n\t*\tslash-delimited fragment identifiers, which is now the default behavior\r\n\t\r\n*\t`json-schema-draft-01`\r\n\r\n\tA complete implementation of the [first revision](http://tools.ietf.org/html/draft-zyp-json-schema-01) of the JSON Schema specification, which is exactly the same as the [original draft](http://tools.ietf.org/html/draft-zyp-json-schema-00).\r\n\t\r\n\tUsers with JSON Schemas written for JSV < v2.1 should use this environment for it's dot-delimited fragment identifiers.\r\n\r\nEnvironments can also be customized and registered for multiple reuse. (See the section on *Extending Environments* below)\r\n\r\n## Validation API\r\n\r\nThe following methods are used to validate JSON data:\r\n\r\n### JSV.createEnvironment(*environmentID?*) *->* *&lt;Environment&gt;*\r\n\r\n*\t*environmentID* *&lt;String&gt;* *(optional)* The ID of the environment to clone a new Environment from\r\n\r\nCreates an new environment that is a copy of the Environment registered with the provided `environmentID`. If no ID is provided, the latest registered JSON Schema is used as the template.\r\n\r\nSee the above section on *Environments* for the default available Environment IDs.\r\n\r\n### *&lt;Environment&gt;*.validate(*json*, *schema*) *->* *&lt;Report&gt;*\r\n\r\n*\t*json* *&lt;Any|JSONInstance&gt;* The JSON data to validate\r\n*\t*schema* *&lt;Object|JSONInstance|JSONSchema&gt;* The schema to validate the JSON with\r\n\r\nValidates both the schema and the JSON, and returns a report of the validation.\r\n\r\n### *&lt;Report&gt;*.errors *&lt;Array&gt;*\r\n\r\nAn array of error objects from the validation process; each object represents a restriction check that failed. If the array is empty, the validation passed.\r\n\r\nThe error objects have the following schema:\r\n\r\n\t{\r\n\t\t\"type\" : \"object\",\r\n\t\t\"properties\" : {\r\n\t\t\t\"message\" : {\r\n\t\t\t\t\"description\" : \"A user-friendly error message about what failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"uri\" : {\r\n\t\t\t\t\"description\" : \"URI of the instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"schemaUri\" : {\r\n\t\t\t\t\"description\" : \"URI of the schema instance that reported the error.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"attribute\" : {\r\n\t\t\t\t\"description\" : \"The attribute of the schema instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"details\" : {\r\n\t\t\t\t\"description\" : \"The value of the schema attribute that failed to validate.\",\r\n\t\t\t\t\"type\" : \"any\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n## API Documentation\r\n\r\nThere are many more APIs available for JSV, too many to detail here. The complete API and documentation can be found in the `docs` directory.\r\n\r\n## Extending Environments\r\n\r\nJSV provides an API for extending available schemas, adding new attributes and validation to currently existing schemas, and creating whole new Environments with unique behaviors. \r\nIn fact, in the [eat-your-own-dog-food](http://en.wikipedia.org/wiki/Eating_your_own_dog_food) approach, all the default JSON Schema environments available are implemented using this API. \r\nDetails and instruction on this feature will be provided at a later date.\r\n\r\n## Installation\r\n\r\nThe preferred method of installation is to download the latest copy from GitHub:\r\n\r\n\tgit clone git://github.com/garycourt/JSV.git\r\n\r\nIf you are using JSV within Node.js, you can quickly install it using:\r\n\r\n\tnpm install JSV\r\n\r\nThen you can reference it within your application using:\r\n\r\n\tvar JSV = require(\"JSV\").JSV;\r\n\r\n## Unit Tests\r\n\r\nOpen `tests/index.html` and `tests/index3.html` in your web browser to run the unit tests.\r\n\r\nCurrently, the unit tests can not be run in Node.js.\r\n\r\n## License\r\n\r\n\tCopyright 2010 Gary Court. All rights reserved.\r\n\t\r\n\tRedistribution and use in source and binary forms, with or without modification, are\r\n\tpermitted provided that the following conditions are met:\r\n\t\r\n\t   1. Redistributions of source code must retain the above copyright notice, this list of\r\n\t      conditions and the following disclaimer.\r\n\t\r\n\t   2. Redistributions in binary form must reproduce the above copyright notice, this list\r\n\t      of conditions and the following disclaimer in the documentation and/or other materials\r\n\t      provided with the distribution.\r\n\t\r\n\tTHIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\r\n\tWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\n\tFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\r\n\tCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n\tCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n\tSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n\tANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n\tNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\n\tADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\t\r\n\tThe views and conclusions contained in the software and documentation are those of the\r\n\tauthors and should not be interpreted as representing official policies, either expressed\r\n\tor implied, of Gary Court or the JSON Schema specification."},"4.0.2":{"name":"JSV","version":"4.0.2","description":"A JavaScript implementation of a extendable, fully compliant JSON Schema validator.","homepage":"http://github.com/garycourt/JSV","author":{"name":"Gary Court","email":"gary.court@gmail.com"},"licenses":[{"type":"FreeBSD","url":"http://github.com/garycourt/JSV/raw/master/jsv.js"}],"maintainers":[{"name":"garycourt","email":"gary.court@gmail.com"}],"bugs":{"email":"gary.court@gmail.com","url":"http://github.com/garycourt/JSV/issues"},"repositories":[{"type":"git","url":"git://github.com/garycourt/JSV.git"}],"dependencies":{},"main":"lib/jsv.js","keywords":["json","schema","validator"],"_npmUser":{"name":"garycourt","email":"gary.court@gmail.com"},"_id":"JSV@4.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d077f6825571f82132f9dffaed587b4029feff57","tarball":"http://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz"},"readme":"JSV: JSON Schema Validator\r\n==========================\r\n\r\nJSV is a JavaScript implementation of a extendable, fully compliant JSON Schema validator with the following features:\r\n\r\n*\tThe fastest extendable JSON validator available!\r\n*\tComplete implementation of all current JSON Schema draft revisions.\r\n*\tSupports creating individual environments (sandboxes) that validate using a particular schema specification.\r\n*\tProvides an intuitive API for creating new validating schema attributes, or whole new custom schema schemas.\r\n*\tSupports `self`, `full` and `describedby` hyper links.\r\n*\tValidates itself, and is bootstrapped from the JSON Schema schemas.\r\n*\tIncludes over 1100 unit tests for testing all parts of the specifications.\r\n*\tWorks in all ECMAScript 3 environments, including all web browsers and Node.js.\r\n*\tLicensed under the FreeBSD License, a very open license.\r\n\r\n## It's a what?\r\n\r\n**JSON** (an acronym for **JavaScript Object Notation**) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of JavaScript/ECMA-262 3rd Edition. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages. (C, C++, C#, Java, JavaScript, Perl, Python, ...) These properties make JSON an ideal data-interchange language. \\[[json.org](http://json.org)\\]\r\n\r\n**JSON Schema** is a JSON media type for defining the structure of JSON data.  JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it.  JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data. \\[[draft-zyp-json-schema-02](http://tools.ietf.org/html/draft-zyp-json-schema-02)\\]\r\n\r\nA **JSON validator** is a program that takes JSON data and, with a provided schema, will ensure that the provided JSON is structured in the way defined by the schema. This ensures that if validation has passed, the JSON instance is guaranteed to be in the expected format. It will also provide an explanation on why a particular instance failed validation.\r\n\r\n## Example\r\n\r\nHere's an example on how to validate some JSON with JSV:\r\n\r\n\tvar JSV = require(\"./jsv\").JSV;\r\n\tvar json = {};\r\n\tvar schema = {\"type\" : \"object\"};\r\n\tvar env = JSV.createEnvironment();\r\n\tvar report = env.validate(json, schema);\r\n\t\r\n\tif (report.errors.length === 0) {\r\n\t\t//JSON is valid against the schema\r\n\t}\r\n\r\nAnother example; for the following test:\r\n\r\n\tenv.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'string' }} });\r\n\r\nThe generated report would look like:\r\n\r\n\t{\r\n\t\terrors : [\r\n\t\t\t{\r\n\t\t\t\tmessage : \"Instance is not a required type\",\r\n\t\t\t\turi : \"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\",\r\n\t\t\t\tschemaUri : \"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\",\r\n\t\t\t\tattribute : \"type\",\r\n\t\t\t\tdetails : [\"string\"]\r\n\t\t\t}\r\n\t\t],\r\n\t\tvalidated : {\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#\"],\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\"],\r\n\t\t\t//...\r\n\t\t},\r\n\t\tinstance : [JSONInstance object],\r\n\t\tschema : [JSONSchema object],\r\n\t\tschemaSchema : [JSONSchema object]\r\n\t}\r\n\r\n## Environments & JSON Schema support\r\n\r\nThere is no one way to validate JSON, just like there is no one way to validate XML. Even the JSON Schema specification has gone through several revisions which are not 100% backwards compatible with each other. To solve the issue of using numerous schemas already written to older specifications, JSV provides customizable environments to validate your JSON within. \r\n\r\nWhen creating an environment, you can optionally specify how you want that environment to behave. For example, this allows you to specify which version of the JSON Schema you would like the environment to behave like. JSV already provides the following environments:\r\n\r\n*\t`json-schema-draft-03`\r\n\r\n\tA complete implementation of the [third revision](http://tools.ietf.org/html/draft-zyp-json-schema-03) of the JSON Schema specification. This is the same as the second revision, except:\r\n\t\r\n\t*\t\"optional\" has been replaced by \"required\"\r\n\t*\t\"requires\" has been replaced by \"dependencies\"\r\n\t*\t\"minimumCanEqual\"/\"maximumCanEqual\" has been replaced by \"exclusiveMinimum\"/\"exclusiveMaximum\"\r\n\t*\t\"self\"/\"full\"/\"describedby\" links have been moved to the core schema, and are provided by \"id\"/\"$ref\"/\"$schema\"\r\n\t*\tAdds the attributes \"patternSchema\" and \"additionalItems\"\r\n\t*\tDeprecates the attributes \"root\" and \"alternate\"\r\n\t*\tSchemas are now versioned under the URIs \"http://json-schema.org/draft-XX/\", where XX is the draft number\r\n\t\r\n\tIn addition to this, all schemas from the previous versions of the JSON Schema draft are included in this environment, and are backwards compatible (where possible) with it's previous version.\r\n\tThis backwards compatibility can be disabled with the environment option `strict` is set to `true`.\r\n\t\r\n\tThis is currently the default environment.\r\n\r\n*\t`json-schema-draft-02`\r\n\r\n\tA complete implementation of the [second revision](http://tools.ietf.org/html/draft-zyp-json-schema-02) of the JSON Schema specification. This is the same as the first revision, except adds:\r\n\t\r\n\t*\t\"targetSchema\" attribute\r\n\t*\tslash-delimited fragment identifiers, which is now the default behavior\r\n\t\r\n*\t`json-schema-draft-01`\r\n\r\n\tA complete implementation of the [first revision](http://tools.ietf.org/html/draft-zyp-json-schema-01) of the JSON Schema specification, which is exactly the same as the [original draft](http://tools.ietf.org/html/draft-zyp-json-schema-00).\r\n\t\r\n\tUsers with JSON Schemas written for JSV < v2.1 should use this environment for it's dot-delimited fragment identifiers.\r\n\r\nEnvironments can also be customized and registered for multiple reuse. (See the section on *Extending Environments* below)\r\n\r\n## Validation API\r\n\r\nThe following methods are used to validate JSON data:\r\n\r\n### JSV.createEnvironment(*environmentID?*) *->* *&lt;Environment&gt;*\r\n\r\n*\t*environmentID* *&lt;String&gt;* *(optional)* The ID of the environment to clone a new Environment from\r\n\r\nCreates an new environment that is a copy of the Environment registered with the provided `environmentID`. If no ID is provided, the latest registered JSON Schema is used as the template.\r\n\r\nSee the above section on *Environments* for the default available Environment IDs.\r\n\r\n### *&lt;Environment&gt;*.validate(*json*, *schema*) *->* *&lt;Report&gt;*\r\n\r\n*\t*json* *&lt;Any|JSONInstance&gt;* The JSON data to validate\r\n*\t*schema* *&lt;Object|JSONInstance|JSONSchema&gt;* The schema to validate the JSON with\r\n\r\nValidates both the schema and the JSON, and returns a report of the validation.\r\n\r\n### *&lt;Report&gt;*.errors *&lt;Array&gt;*\r\n\r\nAn array of error objects from the validation process; each object represents a restriction check that failed. If the array is empty, the validation passed.\r\n\r\nThe error objects have the following schema:\r\n\r\n\t{\r\n\t\t\"type\" : \"object\",\r\n\t\t\"properties\" : {\r\n\t\t\t\"message\" : {\r\n\t\t\t\t\"description\" : \"A user-friendly error message about what failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"uri\" : {\r\n\t\t\t\t\"description\" : \"URI of the instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"schemaUri\" : {\r\n\t\t\t\t\"description\" : \"URI of the schema instance that reported the error.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"attribute\" : {\r\n\t\t\t\t\"description\" : \"The attribute of the schema instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"details\" : {\r\n\t\t\t\t\"description\" : \"The value of the schema attribute that failed to validate.\",\r\n\t\t\t\t\"type\" : \"any\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n## API Documentation\r\n\r\nThere are many more APIs available for JSV, too many to detail here. The complete API and documentation can be found in the `docs` directory.\r\n\r\n## Extending Environments\r\n\r\nJSV provides an API for extending available schemas, adding new attributes and validation to currently existing schemas, and creating whole new Environments with unique behaviors. \r\nIn fact, in the [eat-your-own-dog-food](http://en.wikipedia.org/wiki/Eating_your_own_dog_food) approach, all the default JSON Schema environments available are implemented using this API. \r\nDetails and instruction on this feature will be provided at a later date.\r\n\r\n## Installation\r\n\r\nThe preferred method of installation is to download the latest copy from GitHub:\r\n\r\n\tgit clone git://github.com/garycourt/JSV.git\r\n\r\nIf you are using JSV within Node.js, you can quickly install it using:\r\n\r\n\tnpm install JSV\r\n\r\nThen you can reference it within your application using:\r\n\r\n\tvar JSV = require(\"JSV\").JSV;\r\n\r\n## Unit Tests\r\n\r\nOpen `tests/index.html` and `tests/index3.html` in your web browser to run the unit tests.\r\n\r\nCurrently, the unit tests can not be run in Node.js.\r\n\r\n## License\r\n\r\n\tCopyright 2010 Gary Court. All rights reserved.\r\n\t\r\n\tRedistribution and use in source and binary forms, with or without modification, are\r\n\tpermitted provided that the following conditions are met:\r\n\t\r\n\t   1. Redistributions of source code must retain the above copyright notice, this list of\r\n\t      conditions and the following disclaimer.\r\n\t\r\n\t   2. Redistributions in binary form must reproduce the above copyright notice, this list\r\n\t      of conditions and the following disclaimer in the documentation and/or other materials\r\n\t      provided with the distribution.\r\n\t\r\n\tTHIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\r\n\tWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\n\tFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\r\n\tCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n\tCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n\tSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n\tANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n\tNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\n\tADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\t\r\n\tThe views and conclusions contained in the software and documentation are those of the\r\n\tauthors and should not be interpreted as representing official policies, either expressed\r\n\tor implied, of Gary Court or the JSON Schema specification."}},"maintainers":[{"name":"garycourt","email":"gary.court@gmail.com"}],"time":{"modified":"2012-07-11T22:16:57.194Z","created":"2011-05-16T19:11:11.393Z","3.5.0":"2011-05-16T19:11:11.806Z","4.0.0":"2012-03-13T19:28:13.142Z","4.0.1":"2012-05-09T22:36:44.530Z","4.0.2":"2012-07-11T22:16:57.194Z"},"author":{"name":"Gary Court","email":"gary.court@gmail.com"},"_attachments":{"JSV-4.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-f8YLC517vbbXRZIvayel7Q==","length":1031217,"stub":true},"JSV-4.0.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qxfs5/+HK/yFmFRTN0xQKQ==","length":1031175,"stub":true},"JSV-4.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IuGdMoaFJuJh8wfnvc7F8A==","length":1030083,"stub":true},"JSV-3.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tqBEfDyZILh9D6l8EZDCow==","length":1027842,"stub":true}}}},
{"id":"JTmpl","key":"JTmpl","value":{"rev":"3-9eafa2948aff7f860b53a8aa444aacb7"},"doc":{"_id":"JTmpl","_rev":"3-9eafa2948aff7f860b53a8aa444aacb7","name":"JTmpl","description":"","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"JTmpl","version":"0.1.0","description":"","homepage":"https://github.com/j-san/JTmpl","keywords":["template","xpath","jpath"],"maintainers":[{"name":"jsan","email":"jonathansanchez@me.com"}],"licenses":[{"type":"MIT","url":"http://mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/j-san/JPath.git"}],"main":"","devDependencies":{"qunit":"0.2.x","JPath":"0.1.0","jsdom":""},"scripts":{"test":"node test/index.js"},"_npmUser":{"name":"jsan","email":"jonathansanchez@me.com"},"_id":"JTmpl@0.1.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"5660c68082f9a5839b22cab533088ba4fdf2defe","tarball":"http://registry.npmjs.org/JTmpl/-/JTmpl-0.1.0.tgz"}}},"readme":"\n[![Build Status](https://secure.travis-ci.org/j-san/JTmpl.png?branch=master)](http://travis-ci.org/j-san/JTmpl)\n\n[documentation](http://j-san.github.com//JTmpl)\n","maintainers":[{"name":"jsan","email":"jonathansanchez@me.com"}],"time":{"modified":"2012-05-16T04:48:59.406Z","created":"2012-05-16T04:48:57.841Z","0.1.0":"2012-05-16T04:48:59.406Z"},"_attachments":{"JTmpl-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-o1KgRs6E5LjcTUd+pWFKbw==","length":57515,"stub":true}}}},
{"id":"Jalali","key":"Jalali","value":{"rev":"3-c6604f0929df848e979a551909541675"},"doc":{"_id":"Jalali","_rev":"3-c6604f0929df848e979a551909541675","name":"Jalali","description":"Gregorian to Jalali Converter","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Jalali","description":"Gregorian to Jalali Converter","version":"0.1.0","homepage":"http://github.com/alireza-ahmadi/jalali","repository":{"type":"git","url":"git://github.com/alireza-ahmadi/jalali.git"},"author":{"name":"Alireza Ahmadi","email":"a.ahmadi94@gmail.com","url":"http://alireza.es/"},"main":"./index.js","engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/alireza-ahmadi/jalali/raw/master/LICENSE"}],"_npmUser":{"name":"alireza","email":"a.ahmadi94@gmail.com"},"_id":"Jalali@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8f8bb2b50df128f4af3fb87c890d83e868eec6f4","tarball":"http://registry.npmjs.org/Jalali/-/Jalali-0.1.0.tgz"},"maintainers":[{"name":"alireza","email":"a.ahmadi94@gmail.com"}]}},"readme":"![status]\n\n## Information\n\n<table>\n<tr> \n<td>Package</td><td>Jalali</td>\n</tr>\n<tr>\n<td>Description</td>\n<td>Gregorian To Jalali Converter</td>\n</tr>\n<tr>\n<td>Node Version</td>\n<td>>= 0.4</td>\n</tr>\n</table>\n\n## Usage\n\nYou can read documention in persian [at my website](https://alireza.es/projects/jalali/)\n","maintainers":[{"name":"alireza","email":"a.ahmadi94@gmail.com"}],"time":{"modified":"2012-05-28T06:56:18.092Z","created":"2012-05-28T06:56:12.131Z","0.1.0":"2012-05-28T06:56:18.092Z"},"author":{"name":"Alireza Ahmadi","email":"a.ahmadi94@gmail.com","url":"http://alireza.es/"},"repository":{"type":"git","url":"git://github.com/alireza-ahmadi/jalali.git"},"_attachments":{"Jalali-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iUKhwtC/ZsYbHYqpb71FeA==","length":3074,"stub":true}}}},
{"id":"JehovahJireh","key":"JehovahJireh","value":{"rev":"3-d789b941071f12b5133bea4fbe4408f5"},"doc":{"_id":"JehovahJireh","_rev":"3-d789b941071f12b5133bea4fbe4408f5","name":"JehovahJireh","description":"Just like it's name. :)  A collection of web app development tools which help you focus on program and no need to worry about other things.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Ferrari Lee","email":"shiyung@gmail.com"},"name":"JehovahJireh","description":"Just like it's name. :)  A collection of web app development tools which help you focus on program and no need to worry about other things.","keywords":["nodejs","tools"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/Ferrari/JehovahJireh.git"},"bin":{"JehovahJireh":"./bin/main.js"},"directories":{"bin":"./bin"},"dependencies":{"optimist":"0.3.x","express":"2.5.x"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6"},"_npmUser":{"name":"Ferrari Lee","email":"shiyung@gmail.com"},"_id":"JehovahJireh@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1e3b45bbaf6a53fddd62fa329ef304aa908cee9a","tarball":"http://registry.npmjs.org/JehovahJireh/-/JehovahJireh-0.0.1.tgz"},"maintainers":[{"name":"Ferrari Lee","email":"shiyung@gmail.com"}]}},"readme":"# JehovahJireh\n\n## Overview\n**JehovahJireh** is a simple tools which help you create fronted project fast and easy. Although it's focus on [Backbone.js](http://documentcloud.github.com/backbone/), [RequireJS](http://requirejs.org/) and [Jasmine](http://pivotal.github.com/jasmine/) now.\n\n## Usage\n\n\tJehovahJireh -s [optional parameters]\n\nWhy called this? Maybe you did not even know what this word is. :p\nIt come from a bible story @ [Genesis 22:14](http://bibref.hebtools.com/?book=%20Genesis&verse=22:14&src=KJV), it means **the LORD will provide**, I hope this tool could also provide everything for you when you want to do some web hack.\n\nIt will create a simple development server then you could start do your web app immediately. It's quite simple now, I'll keep add more development functions in it and hope it could become better and make each web developers could get off duty earier. :p\n","maintainers":[{"name":"Ferrari Lee","email":"shiyung@gmail.com"}],"time":{"modified":"2012-05-18T06:46:34.398Z","created":"2012-05-18T06:46:29.010Z","0.0.1":"2012-05-18T06:46:34.398Z"},"author":{"name":"Ferrari Lee","email":"shiyung@gmail.com"},"repository":{"type":"git","url":"git://github.com/Ferrari/JehovahJireh.git"},"_attachments":{"JehovahJireh-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mek16CEBvsgbqkmuUCarcA==","length":1527,"stub":true}}}},
{"id":"Jody","key":"Jody","value":{"rev":"49-a9d38356be24012a334da61c2efb4e1b"},"doc":{"_id":"Jody","_rev":"49-a9d38356be24012a334da61c2efb4e1b","name":"Jody","description":"Descriptive BDD Framework for nodejs","dist-tags":{"latest":"0.2.5"},"versions":{"0.0.3":{"name":"Jody","version":"0.0.3","description":"Descriptive BDD Framework","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"http://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"main":"./lib/Jody","_id":"Jody@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/Jody/-/Jody-0.0.3.tgz"},"directories":{}},"0.0.4":{"name":"Jody","version":"0.0.4","description":"Descriptive BDD Framework","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"http://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"main":"./lib/Jody","_id":"Jody@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.2.5","dist":{"shasum":"7962cac316f4d9a1ea5505e092b6334e79d5c073","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.0.4.tgz"},"directories":{}},"0.0.5":{"name":"Jody","version":"0.0.5","description":"Descriptive BDD Framework","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"http://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"main":"./lib/Jody","_id":"Jody@0.0.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.2.5","dist":{"shasum":"b038cf2434425b03ab1fe769ba871769415ee723","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.0.5.tgz"},"directories":{}},"0.0.6":{"name":"Jody","version":"0.0.6","description":"Descriptive BDD Framework","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"http://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"main":"./lib/Jody","_id":"Jody@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{"lib":"./lib","bin":"./bin"},"modules":{"Jody.js":"lib/Jody.js","matchers.js":"lib/matchers.js","mock.js":"lib/mock.js","reporter.js":"lib/reporter.js","runner.js":"lib/runner.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"28c9bb0dac0de3ada046b8e65532febec823132e","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.0.6.tgz"}},"0.0.7":{"name":"Jody","version":"0.0.7","description":"Descriptive BDD Framework for nodejs","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib","bin":"./bin"},"engines":{"node":"*"},"_id":"Jody@0.0.7","_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"57a9461eaf849cd74413850bc881f13eecee283f","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.0.7.tgz"}},"0.2.0beta1":{"name":"Jody","version":"0.2.0beta1","description":"Descriptive BDD Framework for nodejs","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/Jody.js","engines":{"node":"*"},"_id":"Jody@0.2.0beta1","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8290d8765d8d118618bd68a6846df52657b50bbe","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.0beta1.tgz"}},"0.2.0beta2":{"name":"Jody","version":"0.2.0beta2","description":"Descriptive BDD Framework for nodejs","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/Jody.js","engines":{"node":"*"},"_id":"Jody@0.2.0beta2","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8b04d42296d223599730e695ceb910a8eae48467","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.0beta2.tgz"}},"0.2.0beta3":{"name":"Jody","version":"0.2.0beta3","description":"Descriptive BDD Framework for nodejs","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/Jody.js","engines":{"node":"*"},"_id":"Jody@0.2.0beta3","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"68a9bae05736edd8417e1683f6fdfac4f90e1ddc","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.0beta3.tgz"}},"0.2.0beta4":{"name":"Jody","version":"0.2.0beta4","description":"Descriptive BDD Framework for nodejs","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/Jody.js","engines":{"node":"*"},"_id":"Jody@0.2.0beta4","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.4","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5d51fc74334606d726b22973ac2420026e28011f","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.0beta4.tgz"}},"0.2.0beta5":{"name":"Jody","version":"0.2.0beta5","description":"Descriptive BDD Framework for nodejs","author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_id":"Jody@0.2.0beta5","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"754037446b7f92d0789de0fd147aab0d88979888","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.0beta5.tgz"},"scripts":{}},"0.2.0":{"name":"Jody","version":"0.2.0","description":"Descriptive BDD Framework for nodejs","keywords":["bdd","testing","unit"],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependancies":{"async":"*"},"_id":"Jody@0.2.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"376db0deee6463e091fe964217d76bc3393f4bd6","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"Jody","version":"0.2.1","description":"Descriptive BDD Framework for nodejs","keywords":["bdd","testing","unit"],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependancies":{"async":"*"},"_npmJsonOpts":{"file":"/Users/garren/.npm/Jody/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Jody@0.2.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"bf71e2101e08474946020b503c480590c71417b5","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.1.tgz"},"scripts":{}},"0.2.2":{"name":"Jody","version":"0.2.2","description":"Descriptive BDD Framework for nodejs","keywords":["bdd","testing","unit"],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependancies":{"async":"*"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/Jody/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Jody@0.2.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"1754e13b36debdafacb09f0b2748ada9f2c8610c","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.2.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.2.3":{"name":"Jody","version":"0.2.3","description":"Descriptive BDD Framework for nodejs","keywords":["bdd","testing","unit"],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependencies":{"async":"*"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"Jody@0.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3495907cf411bbbc497960f83dff802cbf79212c","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.3.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.2.4":{"name":"Jody","version":"0.2.4","description":"Descriptive BDD Framework for nodejs","keywords":["bdd","testing","unit"],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependencies":{"async":"*"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"Jody@0.2.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"705c383a211af3717c258638887e6c9e32e87f12","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.4.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.2.5":{"name":"Jody","version":"0.2.5","description":"Descriptive BDD Framework for nodejs","keywords":["bdd","testing","unit"],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"homepage":"http://github.com/garrensmith/Jody","repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"bin":{"Jody":"./bin/Jody"},"directories":{"lib":"./lib"},"main":"./lib/Jody.js","engines":{"node":"*"},"dependencies":{"async":"*"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"Jody@0.2.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"11e2ad6a508fce25b5c334015fba6ce44d420c1d","tarball":"http://registry.npmjs.org/Jody/-/Jody-0.2.5.tgz"},"readme":"Jody\n============\n\nA basic bdd framework to work with node so that I can learn a bit of javascript and node. \nAdds a method on to all objects to test using should().\nIt can test callbacks and events\n\n\nTo Install\n==========\n    npm Jody\n\nTo Use\n======\n    run Jody <file_name>\nor\nCreate specs in ./spec and then:\n    run Jody \n\n## Usage\n    var describe = require('Jody').describe;\n\n    describe(\"New set of specs\").\n      beforeEach(function () {\n      }).\n      it(\"Should test something\", function() {\n        var i = 0;\n        i += 1;\n        i.should().beEqual(1);\n      });\n\n## Async\n    Add the function *async* to each callback that you want to test again. This will allow for Jody to determine if the test was successful\n  \n    describe(\"Async spec\").\n      it(\"Should only assert at the end\", function (atEnd) {\n        \n        asyncTest(async(function(val1,val2){\n          val1.should().beTrue();\n          val2.should().beFalse();\n        }));\n      });\n\n## Http\n  See examples/http_spec.js \n\n## Before All and After All Specs\n\n  For functional testing the following can be used for a beforeAll and after All. \n    require('Jody').configure.beforeAll(function (done) {\n      // some setup before specs\n      done();   \n    });\n\n    require('Jody').configure.afterAll(function (done) {\n      // clean up after all tests run\n      done();   \n    });\n\n  A `spec_helper.js` file in your specs directory will be executed before all specs. A good place to put your before all and after all.\n\n\n\nExamples\n========\n\nSee ./examples folder for examples on use\n\nFeedback\n========\n\nFor suggestions, help or feedback go to [https://convore.com/jody/](https://convore.com/jody/)\n\n\n\n\n","maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]}},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}],"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"repository":{"type":"git","url":"git://github.com/garrensmith/Jody.git"},"time":{"modified":"2012-02-09T13:32:12.705Z","created":"2010-12-27T07:54:21.247Z","0.0.3":"2010-12-27T07:54:21.247Z","0.0.4":"2010-12-27T07:54:21.247Z","0.0.5":"2010-12-27T07:54:21.247Z","0.0.6":"2011-01-21T12:36:05.984Z","0.0.7":"2011-01-21T12:47:54.421Z","0.2.0beta1":"2011-03-11T10:45:58.551Z","0.2.0beta2":"2011-03-15T15:14:42.049Z","0.2.0beta3":"2011-03-19T13:04:32.892Z","0.2.0beta4":"2011-03-31T14:36:58.178Z","0.2.0beta5":"2011-04-26T12:51:01.352Z","0.2.0":"2011-06-13T14:23:10.745Z","0.2.1":"2011-07-08T10:08:46.634Z","0.2.2":"2011-09-10T15:15:20.909Z","0.2.3":"2011-10-16T15:27:19.937Z","0.2.4":"2011-11-13T13:07:42.808Z","0.2.5":"2012-02-09T13:32:12.705Z"},"_attachments":{"Jody-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-/6O42STufb1k5VyNVUZi7w==","length":10742,"stub":true},"Jody-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-BzXwjrP3OGbtxisr1NEMwA==","length":20480,"stub":true},"Jody-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-4NuVEfmG+8wF83qeDcOu9g==","length":20480,"stub":true},"Jody-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-41DNRhVJjk9pDubkYrMAkw==","length":10384,"stub":true},"Jody-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-4vB6GJmpur8oGepGLU2V0A==","length":46312,"stub":true},"Jody-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-Fq58Q5uV4HbycFagGaQuXA==","length":10487,"stub":true},"Jody-0.2.0beta5.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-oT4fXRkCCexfioBzcmNeOA==","length":8835,"stub":true},"Jody-0.2.0beta4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-/jeUx8KiAG9PNCdlEKDwSA==","length":8477,"stub":true},"Jody-0.2.0beta3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-4VacrcCHo3kaexIHJt1aYA==","length":8461,"stub":true},"Jody-0.2.0beta2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-qRuIN5nka3od/QFxkD6TOQ==","length":8484,"stub":true},"Jody-0.2.0beta1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-JwnxvjdFIRPl+8XtleFyWw==","length":8491,"stub":true},"Jody-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-0Epkou4FVkxWGCohoX/7ng==","length":6015,"stub":true},"Jody-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-lDnY7cm17uv+yrN+oPcvkA==","length":6075,"stub":true},"Jody-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-f/h1dQXqzzR8jEDieAz1Bg==","length":6578,"stub":true},"Jody-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fG1yE0ef6A2DPlQm9frTdw==","length":6066,"stub":true},"Jody-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7f9Xz07USBOIBsbUXqpbqg==","length":4714,"stub":true}}}},
{"id":"Journaling-Hash","key":"Journaling-Hash","value":{"rev":"3-ac676eecb40a4dff301c671fa4bb6be9"},"doc":{"_id":"Journaling-Hash","_rev":"3-ac676eecb40a4dff301c671fa4bb6be9","name":"Journaling-Hash","description":"records the history of where keys are set for easy debugging","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"Journaling-Hash","description":"records the history of where keys are set for easy debugging","version":"1.0.0","homepage":"https://github.com/aaronblohowiak/Journaling-Hash","repository":"git://github.com/aaronblohowiak/Journaling-Hash.git","author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"main":"index","directories":{"lib":"."},"scripts":{"test":"node test/test.js"},"engines":{"node":"*"},"_id":"Journaling-Hash@1.0.0","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"index.js":"index.js","package.json":"package.json","README.md":"README.md","test/test.js":"test/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ff984c35f35ce9e6061c7267c9e8c08448798cdb","tarball":"http://registry.npmjs.org/Journaling-Hash/-/Journaling-Hash-1.0.0.tgz"}}},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}],"time":{"modified":"2011-04-23T08:02:36.322Z","created":"2011-04-23T08:02:35.988Z","1.0.0":"2011-04-23T08:02:36.322Z"},"author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"repository":"git://github.com/aaronblohowiak/Journaling-Hash.git","_attachments":{"Journaling-Hash-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6Rgz3SlvmtYGxA9Jgzh1nQ==","length":3430,"stub":true}}}},
{"id":"JuliaStyles","key":"JuliaStyles","value":{"rev":"9-abc111c054209e055a9c123bbe85776f"},"doc":{"_id":"JuliaStyles","_rev":"9-abc111c054209e055a9c123bbe85776f","name":"JuliaStyles","description":"A less grid generator. YUUUUP.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"JuliaStyles","description":"A less grid generator. YUUUUP.","version":"0.0.1","dependencies":{"hogan.js":"*"},"_npmUser":{"name":"fat","email":"jacobthornton@gmail.com"},"_id":"JuliaStyles@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"37c596308af17a8ef5b324abd1216f2a6d75d8c7","tarball":"http://registry.npmjs.org/JuliaStyles/-/JuliaStyles-0.0.1.tgz"},"maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.0.2":{"name":"JuliaStyles","description":"A less grid generator. YUUUUP.","version":"0.0.2","dependencies":{"hogan.js":"*"},"_npmUser":{"name":"fat","email":"jacobthornton@gmail.com"},"_id":"JuliaStyles@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e5e9606e06b7a2edb7f53190cd0afd69a4bf0662","tarball":"http://registry.npmjs.org/JuliaStyles/-/JuliaStyles-0.0.2.tgz"},"maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.0.3":{"name":"JuliaStyles","description":"A less grid generator. YUUUUP.","version":"0.0.3","dependencies":{"hogan.js":"*"},"_npmUser":{"name":"fat","email":"jacobthornton@gmail.com"},"_id":"JuliaStyles@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1ae442d7c722bc4d7ca9e10c14346b5c0abe30e2","tarball":"http://registry.npmjs.org/JuliaStyles/-/JuliaStyles-0.0.3.tgz"},"maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.0.4":{"name":"JuliaStyles","description":"A less grid generator. YUUUUP.","version":"0.0.4","dependencies":{"hogan.js":"*"},"_npmUser":{"name":"fat","email":"jacobthornton@gmail.com"},"_id":"JuliaStyles@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"2c2905119e2d4539dff0988b7f797cedb162ac02","tarball":"http://registry.npmjs.org/JuliaStyles/-/JuliaStyles-0.0.4.tgz"},"maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}]}},"readme":null,"maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}],"time":{"modified":"2012-02-23T23:01:05.275Z","created":"2012-02-23T22:41:21.117Z","0.0.1":"2012-02-23T22:41:22.337Z","0.0.2":"2012-02-23T22:52:37.236Z","0.0.3":"2012-02-23T22:59:19.314Z","0.0.4":"2012-02-23T23:01:05.275Z"},"_attachments":{"JuliaStyles-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lHfKgQ3qTSjuUqow3Ja76g==","length":10240,"stub":true},"JuliaStyles-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3fRpXHUBT6WZQP4oWQcaRA==","length":10240,"stub":true},"JuliaStyles-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3NO9b03eFcORQP6xBDJV9g==","length":10240,"stub":true},"JuliaStyles-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Bku3h51qB+4cNWRhv0L/VQ==","length":10240,"stub":true}}}},
{"id":"KISSY","key":"KISSY","value":{"rev":"21-d199b25b9f4c2bb5f3f364347797cb08"},"doc":{"_id":"KISSY","_rev":"21-d199b25b9f4c2bb5f3f364347797cb08","name":"KISSY","description":"KISSY on NodeJS","dist-tags":{"latest":"1.2.3"},"versions":{"1.2.0":{"name":"KISSY","version":"1.2.0","description":"KISSY on NodeJS","author":{"name":"yiminghe","email":"yiminghe@gmail.com"},"homepage":"http://docs.kissyui.com","bugs":{"url":"https://github.com/kissyteam/nodejs-kissy/issues"},"contributors":[{"name":"Jayli","email":"lijing00333@163.com"},{"name":"yiminghe","email":"yiminghe@gmail.com"}],"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/"},"main":"./lib/kissy-nodejs.js","dependencies":{"jsdom":">=0.2.0"},"licenses":[{"type":"MIT","url":"https://github.com/kissyteam/kissy/blob/master/LICENSE.md"}],"repository":{"type":"git","url":"git://github.com:kissyteam/nodejs-kissy.git"},"_npmUser":{"name":"yiminghe","email":"yiminghe@gmail.com"},"_id":"KISSY@1.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"1443056d2858cb5b5193866462001719f0f941cc","tarball":"http://registry.npmjs.org/KISSY/-/KISSY-1.2.0.tgz"},"readme":"","maintainers":[{"name":"yiminghe","email":"yiminghe@gmail.com"}]},"1.2.1":{"name":"KISSY","version":"1.2.1","description":"KISSY on NodeJS","author":{"name":"yiminghe","email":"yiminghe@gmail.com"},"homepage":"http://docs.kissyui.com","bugs":{"url":"https://github.com/kissyteam/nodejs-kissy/issues"},"contributors":[{"name":"Jayli","email":"lijing00333@163.com"},{"name":"yiminghe","email":"yiminghe@gmail.com"}],"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/"},"main":"./lib/kissy-nodejs.js","dependencies":{"jsdom":">=0.2.0"},"licenses":[{"type":"MIT","url":"https://github.com/kissyteam/kissy/blob/master/LICENSE.md"}],"repository":{"type":"git","url":"git://github.com:kissyteam/nodejs-kissy.git"},"_npmUser":{"name":"yiminghe","email":"yiminghe@gmail.com"},"_id":"KISSY@1.2.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"d061859fcbfbb45308cff66019eaa8e12cd92057","tarball":"http://registry.npmjs.org/KISSY/-/KISSY-1.2.1.tgz"},"readme":"","maintainers":[{"name":"yiminghe","email":"yiminghe@gmail.com"}]},"1.2.2":{"name":"KISSY","version":"1.2.2","description":"KISSY on NodeJS","author":{"name":"yiminghe","email":"yiminghe@gmail.com"},"homepage":"http://docs.kissyui.com","bugs":{"url":"https://github.com/kissyteam/nodejs-kissy/issues"},"contributors":[{"name":"Jayli","email":"lijing00333@163.com"},{"name":"yiminghe","email":"yiminghe@gmail.com"}],"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/"},"main":"./lib/kissy-nodejs.js","dependencies":{"jsdom":">=0.2.0"},"licenses":[{"type":"MIT","url":"https://github.com/kissyteam/kissy/blob/master/LICENSE.md"}],"repository":{"type":"git","url":"git://github.com:kissyteam/nodejs-kissy.git"},"_npmUser":{"name":"yiminghe","email":"yiminghe@gmail.com"},"_id":"KISSY@1.2.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"160245d84a8cd9981c691f9e342de27cc2b0dcf9","tarball":"http://registry.npmjs.org/KISSY/-/KISSY-1.2.2.tgz"},"readme":"","maintainers":[{"name":"yiminghe","email":"yiminghe@gmail.com"}]},"1.2.3":{"name":"KISSY","version":"1.2.3","description":"KISSY on NodeJS","author":{"name":"yiminghe","email":"yiminghe@gmail.com"},"homepage":"http://docs.kissyui.com","bugs":{"url":"https://github.com/kissyteam/nodejs-kissy/issues"},"contributors":[{"name":"Jayli","email":"lijing00333@163.com"},{"name":"yiminghe","email":"yiminghe@gmail.com"}],"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/"},"main":"./lib/kissy-nodejs.js","dependencies":{"jsdom":">=0.2.0"},"licenses":[{"type":"MIT","url":"https://github.com/kissyteam/kissy/blob/master/LICENSE.md"}],"repository":{"type":"git","url":"git://github.com:kissyteam/nodejs-kissy.git"},"_npmUser":{"name":"yiminghe","email":"yiminghe@gmail.com"},"_id":"KISSY@1.2.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"ba06d0f40490ad5ee786cff8caaed7d3d2c98d47","tarball":"http://registry.npmjs.org/KISSY/-/KISSY-1.2.3.tgz"},"readme":"","maintainers":[{"name":"yiminghe","email":"yiminghe@gmail.com"}]}},"readme":"","maintainers":[{"name":"yiminghe","email":"yiminghe@gmail.com"}],"time":{"modified":"2012-03-13T10:38:18.720Z","created":"2012-01-30T10:26:49.620Z","1.2.0":"2012-01-30T10:26:54.968Z","1.2.1":"2012-01-30T12:17:00.576Z","1.2.2":"2012-02-16T05:21:42.379Z","1.2.3":"2012-03-13T10:38:18.720Z"},"author":{"name":"yiminghe","email":"yiminghe@gmail.com"},"repository":{"type":"git","url":"git://github.com:kissyteam/nodejs-kissy.git"},"_attachments":{"KISSY-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-4aTzxo7aLIDlypA7iY2eUw==","length":1196217,"stub":true},"KISSY-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-U6s1qZxUQ6QoArm06+bM5g==","length":1144388,"stub":true},"KISSY-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-CY9+ZCjBW6qp7xWjdN9d3Q==","length":1115508,"stub":true},"KISSY-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ect1fZQGNueJvXgTGm2yNg==","length":1113883,"stub":true}}}},
{"id":"Kahana","key":"Kahana","value":{"rev":"33-1cb7e291ae02cee4e8105509571223f5"},"doc":{"_id":"Kahana","_rev":"33-1cb7e291ae02cee4e8105509571223f5","name":"Kahana","dist-tags":{"latest":"1.3.19"},"versions":{"1.0.0":{"name":"Kahana","author":{"name":"Masatoshi Teruya","email":"mah0x211@gmail.com","url":"http://kontext.jp/"},"version":"1.0.0","license":"BSD","main":"./lib/Kahana","directories":{"lib":"./lib"},"engines":{"node":">= 0.2.6"},"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"_id":"Kahana@1.0.0","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.2.6","modules":{"Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","NotificationCenter.js":"lib/NotificationCenter.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"aca3e68201f9727e5cce507e117bfdf8f49f5716","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.0.0.tgz"}},"1.0.1":{"name":"Kahana","author":{"name":"Masatoshi Teruya","email":"mah0x211@gmail.com","url":"http://kontext.jp/"},"version":"1.0.1","license":"BSD","main":"./lib/Kahana","directories":{"lib":"./lib"},"engines":{"node":">= 0.2.6"},"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"_id":"Kahana@1.0.1","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.2.6","modules":{"Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","NotificationCenter.js":"lib/NotificationCenter.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"03d40b710b749e497e04e3fd742fe2568a5274df","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.0.1.tgz"}},"1.0.2":{"name":"Kahana","author":{"name":"Masatoshi Teruya","email":"mah0x211@gmail.com","url":"http://kontext.jp/"},"version":"1.0.2","license":"BSD","main":"./lib/Kahana","directories":{"lib":"./lib"},"engines":{"node":">= 0.2.6"},"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"_id":"Kahana@1.0.2","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.2.6","modules":{"Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","NotificationCenter.js":"lib/NotificationCenter.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9396c2f078be9978c388b6f14d27273d3f6bef3b","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.0.2.tgz"}},"1.1.0":{"name":"Kahana","keywords":["observer","template engine","ClearSilver"],"description":"","homepage":"http://github.com/mah0x211/node-kahana","version":"1.1.0","license":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"scripts":{"install":"./install.sh"},"engines":{"node":">= 0.2.6"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"_id":"Kahana@1.1.0","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","modules":{"ClearSilver.js":"lib/ClearSilver.js","Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","NotificationCenter.js":"lib/NotificationCenter.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"36a0659db48d0e0388054a0f79252567557e533b","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.1.0.tgz"}},"1.1.1":{"name":"Kahana","keywords":["observer","template engine","ClearSilver"],"description":"","homepage":"http://github.com/mah0x211/node-kahana","version":"1.1.1","license":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"scripts":{"install":"./install.sh"},"engines":{"node":">= 0.2.6"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"_id":"Kahana@1.1.1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","modules":{"ClearSilver.js":"lib/ClearSilver.js","Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","NotificationCenter.js":"lib/NotificationCenter.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"16faec0985202c12d8afd770a0b2e17396049261","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.1.1.tgz"}},"1.1.2":{"name":"Kahana","keywords":["observer","template engine","ClearSilver"],"description":"tiny node.js framework","homepage":"http://github.com/mah0x211/node-kahana","version":"1.1.2","license":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"scripts":{"install":"./install.sh"},"engines":{"node":">= 0.2.6"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"_id":"Kahana@1.1.2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","modules":{"Audit.js":"lib/Audit.js","ClearSilver.js":"lib/ClearSilver.js","Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","NotificationCenter.js":"lib/NotificationCenter.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"36ae1f38ab5d1a18bdfdf84c341ef4d0ff66efba","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.1.2.tgz"}},"1.2.0":{"name":"Kahana","keywords":["observer","template engine","Router","HTTP Server","ClearSilver"],"description":"tiny node.js framework","homepage":"http://github.com/mah0x211/node-kahana","version":"1.2.0","license":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"scripts":{"install":"./install.sh"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"dependencies":{"formidable":">= 0.9.11","mime":">= 1.2.1"},"repository":{"type":"git","url":"http://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"_id":"Kahana@1.2.0","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","modules":{"Audit.js":"lib/Audit.js","ClearSilver.js":"lib/ClearSilver.js","Container.js":"lib/Container.js","Kahana.js":"lib/Kahana.js","Log.js":"lib/Log.js","NotificationCenter.js":"lib/NotificationCenter.js","Router.js":"lib/Router.js","Server.js":"lib/Server.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fe97367aa92e6a956bb9fd16c963ce48dc963459","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.2.0.tgz"}},"1.3.14":{"name":"Kahana","keywords":["observer","Router","HTTP Server"],"description":"tiny node.js framework","homepage":"http://github.com/mah0x211/node-kahana","version":"1.3.14","licenses":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"dependencies":{"formidable":">= 0.9.11","mime":">= 1.2.1"},"repository":{"type":"git","url":"git://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"devDependencies":{},"_id":"Kahana@1.3.14","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"81262ee652de33c81379c67e86f3147af703ce17","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.3.14.tgz"},"scripts":{}},"1.3.18":{"name":"Kahana","keywords":["observer","Router","HTTP Server"],"description":"tiny node.js framework","homepage":"http://github.com/mah0x211/node-kahana","version":"1.3.18","licenses":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"engines":{"node":">= 0.4.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"dependencies":{"formidable":">= 0.9.11","mime":">= 1.2.1","hashlib":">= 1.0.0","node-uuid":">= 1.1.0"},"repository":{"type":"git","url":"git://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"devDependencies":{},"_id":"Kahana@1.3.18","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3e376ffd18dba82fd18e958cd03363d33f84926f","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.3.18.tgz"},"scripts":{}},"1.3.19":{"name":"Kahana","keywords":["observer","Router","HTTP Server"],"description":"tiny node.js framework","homepage":"http://github.com/mah0x211/node-kahana","version":"1.3.19","licenses":[{"type":"BSD"}],"main":"./lib/Kahana","directories":{"lib":"./lib"},"engines":{"node":">= 0.4.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"dependencies":{"formidable":">= 0.9.11","mime":">= 1.2.1","hashlib":">= 1.0.0","node-uuid":">= 1.1.0"},"repository":{"type":"git","url":"git://github.com/mah0x211/node-kahana.git"},"bugs":{"url":"http://github.com/mah0x211/node-kahana/issues"},"devDependencies":{},"_id":"Kahana@1.3.19","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"cf41efcd27e1792b093c0006245e0333431f1d48","tarball":"http://registry.npmjs.org/Kahana/-/Kahana-1.3.19.tgz"},"scripts":{}}},"maintainers":[{"name":"mah0x211","email":"mah0x211@gmail.com"}],"time":{"modified":"2011-07-26T09:42:39.767Z","created":"2011-01-25T09:33:45.949Z","1.0.0":"2011-01-25T09:33:46.754Z","1.0.1":"2011-01-27T00:15:49.697Z","1.0.2":"2011-01-29T08:27:30.297Z","1.1.0":"2011-01-30T17:19:22.933Z","1.1.1":"2011-01-30T17:32:29.813Z","1.1.2":"2011-01-31T10:46:51.630Z","1.2.0":"2011-02-08T15:41:50.570Z","1.2.1":"2011-02-08T15:45:39.916Z","1.2.8":"2011-02-09T10:55:52.912Z","1.3.14":"2011-05-27T19:55:27.457Z","1.3.18":"2011-07-14T11:38:02.011Z","1.3.19":"2011-07-26T09:42:39.767Z"},"author":{"name":"Masatoshi Teruya","email":"mah0x211@gmail.com","url":"http://kontext.jp/"},"repository":{"type":"git","url":"git://github.com/mah0x211/node-kahana.git"},"description":"tiny node.js framework","_attachments":{"Kahana-1.3.19.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-5pP3vS/srSOBmg7oa4JUAQ==","length":34780,"stub":true},"Kahana-1.3.18.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-AQgWm93cGgk1Myf4BJ0XSQ==","length":34725,"stub":true},"Kahana-1.3.14.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-d1TTmUV0URW7BIKu4zPw2A==","length":33075,"stub":true},"Kahana-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Wushw+1sMb47IaJzyGmuHw==","length":21060,"stub":true},"Kahana-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wt7nr++jawORNLqXuxRXyw==","length":9231,"stub":true},"Kahana-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZuFjb+xXAaJ7AEveRDJ8gQ==","length":8981,"stub":true},"Kahana-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-I9I9dQf2cYWN/RiaTaPL1A==","length":8915,"stub":true},"Kahana-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SSFE5/5YxKnM9Oe78AH5Rw==","length":6693,"stub":true},"Kahana-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-++6DqYhp+Ym7YDkaauGrfA==","length":6255,"stub":true},"Kahana-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RqFlHax6Mo6NVWvTyAQZDg==","length":4532,"stub":true}}}},
{"id":"Katy","key":"Katy","value":{"rev":"9-cac6b726e04a5a1916ea0832843d253b"},"doc":{"_id":"Katy","_rev":"9-cac6b726e04a5a1916ea0832843d253b","name":"Katy","description":"CoffeeScript Combinators","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.4":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"Katy","description":"Fluent Coffeescript","version":"0.0.4","homepage":"https://github.com/raganwald/Katy","repository":{"type":"git","url":"git://github.com/raganwald/Katy.git"},"main":"lib/katy.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"Katy@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fec8e7c9d88eed7ba7814380c2130b92580242f9","tarball":"http://registry.npmjs.org/Katy/-/Katy-0.0.4.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"0.0.5":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"Katy","description":"CoffeeScript Combinators","version":"0.0.5","homepage":"https://github.com/raganwald/Katy","repository":{"type":"git","url":"git://github.com/raganwald/Katy.git"},"main":"lib/katy.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"Katy@0.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"aafd4f113e480b9f3efd3604d800ea5a8b6c3f7f","tarball":"http://registry.npmjs.org/Katy/-/Katy-0.0.5.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"0.0.6":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"Katy","description":"CoffeeScript Combinators","version":"0.0.6","homepage":"https://github.com/raganwald/Katy","repository":{"type":"git","url":"git://github.com/raganwald/Katy.git"},"main":"lib/katy.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"Katy@0.0.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"eafbfd8f2164ad6da91fefa91aa774c274e227fb","tarball":"http://registry.npmjs.org/Katy/-/Katy-0.0.6.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"1.0.0":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"Katy","description":"CoffeeScript Combinators","version":"1.0.0","homepage":"https://github.com/raganwald/Katy","repository":{"type":"git","url":"git://github.com/raganwald/Katy.git"},"main":"lib/katy.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"Katy@1.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8f71053110b43438728e7fc474f8c12e2891ca0a","tarball":"http://registry.npmjs.org/Katy/-/Katy-1.0.0.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]}},"readme":"Katy: Coffeescript Combinators\n===\n\nKaty makes writing [fluent][fluent] Coffeescript easy by providing the `.K` and `.T` combinators for Coffeescript objects.\n\nThe **tl;dr** is that Katy adds two methods, `.K` and `.T` to any class or classes you desire:\n\n```coffeescript\nKT = require('Katy').KT\n\nKT.mixInto(String)\n\n# K calls a function on the receiver and returns the receiver\n\n'Hello'.K (s) -> s + ' World'\n  # => returns 'Hello'\n  \n# T calls a function on the receiver and returns the result\n\n'Hello'.K (s) -> s + ' World'\n  # => returns 'Hello World'\n```\n\nYou can also call any method by name:\n\n```coffeescript\nKT.mixInto(Array)\n\n[1..10]\n  .K('pop')\n  .K('pop')\n  .K('pop')\n  .T('pop')\n  # => returns 7\n```\n\n## How does that make my code more fluent?\n\nYou're familiar with [fluent interfaces][fluent]. They're great, but they rely on the author of the API making sure that each function returns its receiver. The `.K` method allows you to make any function or method \"fluent\" even if the original author has other ideas. The `.K` and `.T` methods also allow you to write your own methods and 'call' them just as if they were baked into the original object. For example, you can fake an `identifiers` filter for arrays of strings:\n\n[fluent]: http://en.wikipedia.org/wiki/Fluent_interface\n\n```coffeescript\nrequire 'underscore'\n\nidentifiers = (arrOfSymbols) ->\n  _.select arrOfSymbols, (str) ->\n    /^[_a-zA-Z]\\w*$/.test(str)\n  \nsomeArray\n  .T(identifiers)\n  .K('someMethodName')\n  .T(someOtherFilter)\n```\n\nThis is cleaner than trying to mix oridinary functions with methods and adopting tenporary variables when you want to work around what the function was written to return. In this example, having extended `Array.prototype` with `.K` and `.T` once, you need not extend it any more to add your own custom methods.\n\nTo recap:\n\n1. You can make any function into something that can be called like a method, making your code read more naturally, and;\n2. You can give any function or built-in method either \"fluent\" (return the receiver) or \"pipeline\" (return its value) semantics as you please.\n\n## Monkey-patching is evil!\n\nI agree. `KT(foo).K(...)` and `KT(foo).T(...)` work just fine without mixing `.K` and `.T` into an existing class, much as `_(...).tap` and other methods work without modifying an existing class. Also:\n\n```coffeescript\n\nKT([1..10])\n  .chain()\n  .K('pop')\n  .K('pop')\n  .K('pop')\n  .T('pop')\n  .value()\n  # => returns 7\n```\n\n## Stuff and nonsense, this is a syntax issue, not a functional issue\n\n[I agree][sans-titre], but that being said:\n\n1. You can use katy now instead of waiting to see if Coffeescript adopts a syntax for chaining methods, and;\n2. The `.K` and `.T` methods turn any function into something you can call like a method, which makes your code read more cleanly.\n\n[sans-titre]: https://github.com/raganwald/homoiconic/blob/master/2011/11/sans-titre.md \"Sans Titre\"\n  \n## Is Katy any good?\n\n[Yes][y].\n\n[y]: http://news.ycombinator.com/item?id=3067434\n\n[um]: https://github.com/raganwald/Underscore-Matchers-for-Jasmine\n\n## Cool! Does it work with jQuery?\n\nYes, but if you like jQuery and like Katy, you'll love [jQuery Combinators][jc].\n\n[jc]: https://github.com/raganwald/JQuery-Combinators\n\n## Calling a method by name is cool, but can you do more with Strings?\n\nTry `KT.installStringLambdas()`. The result is not to everybody's taste, but those who like it, like it a lot.\n\n## What's with the naming conventions?\n\n`.T` is known in some CS circles as the [Thrush][t] or `T` combinator. Likewise, `.K` is known in combinatory logic circles as the \"K Combinator\" or [Kestrel][k]. To simplify the explanation radically, `T` and `K` are called combinators because they combine things to produce a result in different ways. Functional programmers call such things higher-order functions, but what makes combinators interesting is that combinators work by rearranging the order of things in an expression.\n\nFor example, `T` reverses the order of two things. Think about it: Instead of writing `identifiers(some_array)`, we use `T` to write `some_array.T(identifiers)`. That rearrangement is very handy for making our code conform to fluent style. Likewise, `K` leaves them in the same order but removes something. This ability to rearrange things is what makes them so useful for taking code that would normally have function calls sprinkled throughout it and rearranging it into a nice tree of method calls in fluent style.\n\nMany other combinators exist, and they are all interesting with applications for functional and OO programmers. With combinators you can even get rid of parentheses in a programming language! If you aren't familiar with Combinatory Logic, I encourage you to follow the links to my posts about Kestrels and Thrushes, and better still do a little digging about Combinatory Logic in general. It's a rich, fascinating field of study that is so simple it's incredibly easy to pick up, and it leads naturally into functional and [concatenative][joy] languages.\n\n[k]: http://github.com/raganwald/homoiconic/blob/master/2008-10-29/kestrel.markdown#readme\n[t]: http://github.com/raganwald/homoiconic/blob/master/2008-10-30/thrush.markdown#readme\n[joy]: http://github.com/raganwald/homoiconic/blob/master/2008-11-16/joy.md#readme","maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"time":{"modified":"2011-12-08T16:17:43.776Z","created":"2011-12-05T23:53:48.245Z","0.0.4":"2011-12-05T23:53:49.053Z","0.0.5":"2011-12-06T00:17:28.138Z","0.0.6":"2011-12-07T21:43:22.649Z","1.0.0":"2011-12-08T16:17:43.776Z"},"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"repository":{"type":"git","url":"git://github.com/raganwald/Katy.git"},"_attachments":{"Katy-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ep7KdwUICNWWjZJQvlrcRw==","length":10240,"stub":true},"Katy-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OIRMBeqn5qa5jW/x6H5IOA==","length":10240,"stub":true},"Katy-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BcRzaIbxyTriWeTuS3EwoA==","length":10240,"stub":true},"Katy-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UZu8mWxCgSJ+MOt15d0oUw==","length":10240,"stub":true}}}},
{"id":"KeyboardJS","key":"KeyboardJS","value":{"rev":"3-dcd972db678eef7712b12330e3579b77"},"doc":{"_id":"KeyboardJS","_rev":"3-dcd972db678eef7712b12330e3579b77","name":"KeyboardJS","description":"A library for binding to keys and key combos without the pain of key codes and key combo conflicts.","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.2":{"name":"KeyboardJS","description":"A library for binding to keys and key combos without the pain of key codes and key combo conflicts.","version":"0.2.2","keywords":["Key Binding, Keyboard, Key combos, Keyboard Shortcuts"],"maintainers":[{"name":"RobertWHurst","email":"robertwhurst@gmail.com"}],"demos":["http://robertwhurst.github.com/KeyboardJS/"],"bugs":{"url":"https://github.com/RobertWHurst/KeyboardJS/issues"},"repositories":[{"type":"git","url":"git@github.com:RobertWHurst/KeyboardJS.git"}],"licenses":[{"name":"BSD License","url":"https://raw.github.com/RobertWHurst/KeyboardJS/master/license.txt"}],"homepage":"http://robertwhurst.github.com/KeyboardJS/","_npmUser":{"name":"RobertWHurst","email":"robertwhurst@gmail.com"},"_id":"KeyboardJS@0.2.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"bba62ceae867c0149e11e78a3928689b4958c6ef","tarball":"http://registry.npmjs.org/KeyboardJS/-/KeyboardJS-0.2.2.tgz"}}},"readme":"KeyboardJS Library\n==================\n\nGetting Started\n---------------\n\nDownload the [library](https://github.com/RobertWHurst/KeyboardJS/zipball/master) and\nplace it somewhere in your project. All methods are accessed via the KeyboardJS namespace enless the library\nis loaded with an AMD module loader.\n\n##### Example Structure\n\n    /\n    /keyboard.js\n    /app.js\n    /index.html\n\nload the script with a script tag.\n\n##### Example index.html\n\n    <doctype html>\n    <html>\n        <head>\n            <title>KeyboardJS Demo</title>\n            <script src=\"keyboard.js\"></script>\n            <script src=\"app.js\"></script>\n        </head>\n        <body>\n            <!-- Markup goes here... -->\n        </body>\n    </html>\n\nWhat can I do with KeyboardJS?\n------------------------------\n\nKeyboardJS will allow you to bind to any key the browser can detect. It allows for\nsetting up complex key combos or even single key binds with ease. It is aware of combo\noverlap and will not fire simpler combos or single key bindings when they share key with\nlarger combos.\n\nBasically if you want to use the keyboard, this will let you do it without restrictions.\n\nKeyboardJS has full support for AMD module loaders such as [RequireJS](http://requirejs.org/).\n\nMethods\n-------\n\n### KeyboardJS.bind.key\n\n###### Usage\n\n    KeyboardJS.bind.key(keyCombo, onDownCallback, onUpCallback);\n\nBinds any key or key combo. See 'keyCombo' definition below\nfor details. The onDownCallback is fired once the key or key combo becomes active. The\nonUpCallback is fired when the combo no longer active (a single key is released).\n\nBoth the onUpCallback and the onDownCallback are passed three arguments. The first is the\nkey event, the second is the keys pressed, and the third is the key combo string.\n\n###### Returned\nReturns an object containing the following methods.\n\n* clear - Removes the key or key combo binding.\n\n### KeyboardJS.bind.axis\n\n###### Usage\n\n    KeyboardJS.bind.axis(upkeyCombo, downkeyCombo, leftkeyCombo, rightkeyCombo, callback);\n\nBinds four keys or key combos as an up, down, left, right \naxis. See 'keyCombo' definition above for details. The callback is fired when any of the key\ncombos are active. It is passed an axis object. See 'axis' definition below for more details.\n\n###### Returned\nReturns an object containing the following methods.\n\n* clear - Removes the axis binding.\n\n### KeyboardJS.activeKeys\n\n###### Usage\n\n    KeyboardJS.activeKeys();\n\nReturns an array of active keys by name.\n\n### KeyboardJS.unbind.key\n\n###### Usage\n\n\tKeyboardJS.unbind.key(keyCombo);\n\nRemoves all bindings with a key or key combo. See 'keyCombo' definition for more details.\n\nPlease note that if you are just trying to remove one binding you should use the clear method in the object returned\nby KeyboardJS.bind.key or KeybaordJS.bind.axis instead of this. This function is for removing all binding that use\na certain key.\n\n### KeyboardJS.locale.set\n\n###### Usage\n\n    KeyboardJS.locale.set(localeName);\n\nChanges the locale keyboardJS uses to map key presses. Currently only US is possible unless more locales have been\nadded via KeyboardJS.locale.add\n\n### KeyboardJS.locale.add\n\n###### Usage\n\n    KeyboardJS.locale.add(localeName, keyMap);\n\nAdds support for new locals to KeyboardJS. The name of the local and a keyMap are expected. See 'keyMap' definition\nfor more details.\n\nDefinitions\n-----------\n\n### keyCombo\n\nA comma separated string of keys. Combos can be created using the + sign instead of a comma.\n\n###### examples\n\n* 'a' - binds to the 'a' key. Pressing 'a' will match this keyCombo.\n* 'a, b' - binds to the 'a' and 'b' keys. Pressing ether of these keys will match this keyCombo.\n* 'a + b' - binds to the 'a' and 'b' keys. Pressing both of these keys will match this keyCombo.\n* 'a + b, c + d' - binds to the 'a', 'b', 'c' and 'd' keys. Pressing ether the 'a' key and the 'b' key,\nor the 'c' and the 'd' key will match this keyCombo.\n\n### axis\n\nAn array containing two numbers. The first value represents x and the second represents y. These values\nare 1, 0, or -1.\n\n###### example\n\n    [x, y]\n\n### keyMap\n\nAn object that maps key names to their key code. Used for mapping keys on different locales.\n\n###### example\n\n    {\n        \"keyName\": keyCode,\n        ...\n    }\n\nLanguage Support\n----------------\n\nKeyboardJS can support any locale, however out of the box it just comes with the US locale (for now..,). Adding a new\nlocale is easy. Map your keyboard to an object and pass it to KeyboardJS.locale.add('myLocale', {/*MAP*/}) then call\nKeyboardJS.locale.set('myLocale').\n\nIf you create a new locale please consider sending me a pull request or submit it to the\n[issue tracker](http://github.com/RobertWHurst/KeyboardJS/issues) so I can add it to the library.\n\nCredits\n-------\n\nI made this to enable better access to key controls in my appications. I'd like to share\nit with fellow devs. Feel free to fork this project and make your own changes.\n\n[![endorse](http://api.coderwall.com/robertwhurst/endorsecount.png)](http://coderwall.com/robertwhurst)\n","maintainers":[{"name":"RobertWHurst","email":"robertwhurst@gmail.com"}],"time":{"modified":"2012-05-07T21:17:19.491Z","created":"2012-05-07T21:17:18.116Z","0.2.2":"2012-05-07T21:17:19.491Z"},"_attachments":{"KeyboardJS-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AtCevqfwKhoFwlQjUh8jaw==","length":6987,"stub":true}}}},
{"id":"L7","key":"L7","value":{"rev":"7-11a89ad655f6f65699fc9c1b6d4b3222"},"doc":{"_id":"L7","_rev":"7-11a89ad655f6f65699fc9c1b6d4b3222","name":"L7","description":"An HL7 query language.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.2":{"name":"L7","description":"An HL7 query language.","keywords":["hl7","query","server"],"author":{"name":"Rowan Crawford","email":"wombleton@gmail.com"},"repository":{"type":"git","url":"git://github.com/wombleton/L7.git"},"version":"0.0.2","dependencies":{"coffee-script":"latest","pegjs":"latest","underscore":"latest"},"devDependencies":{"should":"latest","vows":"latest"},"_npmUser":{"name":"wombleton","email":"wombleton@gmail.com"},"_id":"L7@0.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"cc0009951d69719867a42b4d8a29f2fee355e0ba","tarball":"http://registry.npmjs.org/L7/-/L7-0.0.2.tgz"},"maintainers":[{"name":"wombleton","email":"wombleton@gmail.com"}]},"0.0.3":{"name":"L7","description":"An HL7 query language.","keywords":["hl7","query","server"],"author":{"name":"Rowan Crawford","email":"wombleton@gmail.com"},"repository":{"type":"git","url":"git://github.com/wombleton/L7.git"},"version":"0.0.3","dependencies":{"coffee-script":"latest","pegjs":"latest","underscore":"latest"},"devDependencies":{"should":"latest","vows":"latest"},"_npmUser":{"name":"wombleton","email":"wombleton@gmail.com"},"_id":"L7@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8a92bc7909ac44ac693e8c9d1dc232f9f5d987a1","tarball":"http://registry.npmjs.org/L7/-/L7-0.0.3.tgz"},"maintainers":[{"name":"wombleton","email":"wombleton@gmail.com"}]},"0.0.4":{"name":"L7","description":"An HL7 query language.","keywords":["hl7","query","server"],"author":{"name":"Rowan Crawford","email":"wombleton@gmail.com"},"repository":{"type":"git","url":"git://github.com/wombleton/L7.git"},"version":"0.0.4","dependencies":{"coffee-script":"latest","pegjs":"latest","underscore":"latest","underscore.string":"latest"},"devDependencies":{"should":"latest","vows":"latest"},"_npmUser":{"name":"wombleton","email":"wombleton@gmail.com"},"_id":"L7@0.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f5118946ce8aa7566ce6be92453504a2beac6f6a","tarball":"http://registry.npmjs.org/L7/-/L7-0.0.4.tgz"},"maintainers":[{"name":"wombleton","email":"wombleton@gmail.com"}]}},"readme":"L7\n======\n\nA simple HL7 query language.\n\nUsage\n----\n\nGiven HL7:\n\n    MSH|^~\\&|REG|XYZ||XYZ|20050912110538||SIU^S12|4676115|P|2.3\n    PID|||353966||SMITH^JOHN^^^^||19820707|F||C|108 MAIN STREET ^^ANYTOWN^TX^77777^^|HARV|(512)555-0170|||||00362103|123-45-6789||||||||||||\n    SCH|1||||||NEW||||20050912110230^20050912110430||||||||||||||||||^^^^^^||3|\n    PV1||O|SEROT|3|||1284^JOHNSON^MIKE^S.^^MD~|||SEROT||||1|||1284^JOHNSON^MIKE^S.^^ MD|SERIES|787672|B|||||||||N||||||||||||A|||20050912110230|||||| PV2|||HAND BRACE NEEDS REPAIRED|||||||||||20050912||||||||||A||20050725|||||O||||||\n    NK1|0001|HULK^INCREDIBLE|M|123 FAKE ST^^OUTLAND^^00000|123456789||\n\nAnd the javascript:\n\n    parser = require('L7')\n\n    message = parser.parse(hl7)\n    version = message.query('MSH|12') // 2.3\n\n    name = message.translate({\n      familyName: 'PID|5^0'\n      firstName: 'PID|5^1'\n    }) // { \"familyName\": \"McTest\", \"firstName\": \"Test\" }\n\nInstallation\n------------\n\n    $ npm install L7\n\nDevelopment\n-----------\n\n  * [Twitter](http://twitter.com/wombleton)\n\nCaveat\n------\n\nThis package is in its infancy, use with caution.\n","maintainers":[{"name":"wombleton","email":"wombleton@gmail.com"}],"time":{"modified":"2012-05-31T19:17:28.137Z","created":"2012-05-29T23:34:08.775Z","0.0.2":"2012-05-29T23:34:12.557Z","0.0.3":"2012-05-30T22:57:52.305Z","0.0.4":"2012-05-31T19:17:28.137Z"},"author":{"name":"Rowan Crawford","email":"wombleton@gmail.com"},"repository":{"type":"git","url":"git://github.com/wombleton/L7.git"},"_attachments":{"L7-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-q/57NnxHpJkQhswmRgJB/Q==","length":5460,"stub":true},"L7-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JD2GKK2uA3eebC3eaJ3DSw==","length":4235,"stub":true},"L7-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KU6HNDEaUJGLT0r74rtDJA==","length":4227,"stub":true}}}},
{"id":"LCM","key":"LCM","value":{"rev":"3-4eae6324a3900825f20d33aac975471a"},"doc":{"_id":"LCM","_rev":"3-4eae6324a3900825f20d33aac975471a","name":"LCM","description":"Least Common Multiple","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Sean Zawicki","email":"sean.zawicki@voxer.com","url":"www.acsu.buffalo.edu/~seanzawi"},"name":"LCM","description":"Least Common Multiple","version":"0.0.0","repository":{"type":"git","url":"git://github.com/sean17/LCM.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"sean17","email":"seanzawi@buffalo.edu"},"_id":"LCM@0.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8d7c15b2a565ddbfb2c6bed72a71f16c416b5ef6","tarball":"http://registry.npmjs.org/LCM/-/LCM-0.0.0.tgz"},"readme":"","maintainers":[{"name":"sean17","email":"seanzawi@buffalo.edu"}]}},"readme":"","maintainers":[{"name":"sean17","email":"seanzawi@buffalo.edu"}],"time":{"modified":"2012-06-04T22:04:57.013Z","created":"2012-06-04T22:04:55.762Z","0.0.0":"2012-06-04T22:04:57.013Z"},"author":{"name":"Sean Zawicki","email":"sean.zawicki@voxer.com","url":"www.acsu.buffalo.edu/~seanzawi"},"repository":{"type":"git","url":"git://github.com/sean17/LCM.git"},"_attachments":{"LCM-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-j/uDeBVJJ7W28i1frtWXHA==","length":628,"stub":true}}}},
{"id":"LDAP","key":"LDAP","value":{"rev":"15-76625ea0c010c933e100c5c8ed435221"},"doc":{"_id":"LDAP","_rev":"15-76625ea0c010c933e100c5c8ed435221","name":"LDAP","description":"LDAP Binding for node.js","dist-tags":{"latest":"1.0.4"},"versions":{"0.0.4":{"author":{"name":"Jeremy Childs","email":"jeremyc@ssimicro.com"},"name":"LDAP","description":"LDAP Binding for node.js","version":"0.0.4","homepage":"https://github.com/jeremycx/node-LDAP","repository":{"type":"git","url":"git://github.com/jeremycx/node-LDAP.git"},"main":"./LDAP.js","engines":{"node":">= 0.6.0"},"devDependencies":{},"_npmUser":{"name":"jeremycx","email":"jeremyc@ssimicro.com"},"_id":"LDAP@0.0.4","scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"dependencies":{},"_engineSupported":false,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a47bddfc9b73af318ff209cf588fe5fe6d8d1b8a","tarball":"http://registry.npmjs.org/LDAP/-/LDAP-0.0.4.tgz"},"maintainers":[{"name":"jeremycx","email":"jeremyc@ssimicro.com"}],"directories":{}},"1.0.0":{"author":{"name":"Jeremy Childs","email":"jeremyc@ssimicro.com"},"name":"LDAP","description":"LDAP Binding for node.js","version":"1.0.0","homepage":"https://github.com/jeremycx/node-LDAP","repository":{"type":"git","url":"git://github.com/jeremycx/node-LDAP.git"},"main":"./LDAP.js","engines":{"node":">= 0.6.0"},"devDependencies":{},"_npmUser":{"name":"jeremycx","email":"jeremyc@ssimicro.com"},"_id":"LDAP@1.0.0","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3b220237eae26bf7a149aa817d3d9767966ea2cd","tarball":"http://registry.npmjs.org/LDAP/-/LDAP-1.0.0.tgz"},"maintainers":[{"name":"jeremycx","email":"jeremyc@ssimicro.com"}],"directories":{}},"1.0.1":{"author":{"name":"Jeremy Childs","email":"jeremyc@ssimicro.com"},"name":"LDAP","description":"LDAP Binding for node.js","version":"1.0.1","homepage":"https://github.com/jeremycx/node-LDAP","repository":{"type":"git","url":"git://github.com/jeremycx/node-LDAP.git"},"main":"./LDAP.js","engines":{"node":">= 0.6.0"},"devDependencies":{},"_npmUser":{"name":"jeremycx","email":"jeremyc@ssimicro.com"},"_id":"LDAP@1.0.1","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e7841a8ea2b0b8a6dc3093a839bd34f8a4680781","tarball":"http://registry.npmjs.org/LDAP/-/LDAP-1.0.1.tgz"},"maintainers":[{"name":"jeremycx","email":"jeremyc@ssimicro.com"}]},"1.0.2":{"author":{"name":"Jeremy Childs","email":"jeremyc@ssimicro.com"},"name":"LDAP","description":"LDAP Binding for node.js","version":"1.0.2","homepage":"https://github.com/jeremycx/node-LDAP","repository":{"type":"git","url":"git://github.com/jeremycx/node-LDAP.git"},"main":"./LDAP.js","engines":{"node":">= 0.6.0"},"devDependencies":{},"_npmUser":{"name":"jeremycx","email":"jeremyc@ssimicro.com"},"_id":"LDAP@1.0.2","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a7077a23322152adc3893d234ea68431acf7475f","tarball":"http://registry.npmjs.org/LDAP/-/LDAP-1.0.2.tgz"},"maintainers":[{"name":"jeremycx","email":"jeremyc@ssimicro.com"}]},"1.0.4":{"author":{"name":"Jeremy Childs","email":"jeremyc@ssimicro.com"},"name":"LDAP","description":"LDAP Binding for node.js","version":"1.0.4","homepage":"https://github.com/jeremycx/node-LDAP","repository":{"type":"git","url":"git://github.com/jeremycx/node-LDAP.git"},"main":"./LDAP.js","engines":{"node":">= 0.6.0"},"devDependencies":{},"_npmUser":{"name":"jeremycx","email":"jeremyc@ssimicro.com"},"_id":"LDAP@1.0.4","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"42ef5e93d90ac558b13011b893bc4ef6c359c9fd","tarball":"http://registry.npmjs.org/LDAP/-/LDAP-1.0.4.tgz"},"maintainers":[{"name":"jeremycx","email":"jeremyc@ssimicro.com"}]}},"readme":"node-ldap\n=========\n\nOpenLDAP client bindings for Node.js. Requires libraries from\nhttp://www.openldap.org installed.\n\nContributing\n------------\n\nAny and all patches and pull requests are certainly welcome.\n\nThanks to:\n----------\n* Petr Běhan\n* YANG Xudong\n* Victor Powell\n\nDependencies\n------------\n\nNode >= 0.6\n\nFor < 0.6 compaibility, check out v0.4\n\nInstallation\n------------\n\nTo build, ensure the OpenLDAP client libraries are installed, and\n\n   npm install https://github.com/jeremycx/node-LDAP/tarball/master -g\n\nConnection.open(uri, version)\n-----------------------------\n\nOpens a new connection to the LDAP server or servers. Does not make a\nconnection attept (that is saved until the first command is issued).\n\nBasically, this call will always succeeds, but may throw an error in\nthe case of improper parameters. Will not return an error unless no\nmemory is available.\n\nOpen Example\n------------\n\n        var LDAPConnection = require(\"../LDAP\").Connection;\n        var LDAP = new LDAPConnection();\n        \n        if (LDAP.open(\"ldap://server1.domain.com ldap://server2.domain.com\", 3) < 0) {\n           throw new Error(\"Unable to connect to server\");\n        }                                                \n\nConnection.simpleBind([dn, password,] callback(msgid, err));\n-----------------------------------\n\nAuthenticates to the server. When the response is ready, or the\ntimeout occurs, will execute the callback with the error value set.\n\ndn and password must be omited, when doing anonymous bind.\n\nConnection.search(base, scope, filter, attrs, function(msgid, err, data))\n---------------------------------------------\n\nSearches LDAP within the given base for entries matching the given\nfilter, and returns all attrs for matching entries. To get all\navailable attrs, use \"\\*\".\n\nScopes are specified as one of the following integers:\n\n* Connection.BASE = 0;\n* Connection.ONELEVEL = 1;\n* Connection.SUBTREE = 2;\n* Connection.SUBORDINATE = 3;\n* Connection.DEFAULT = -1;\n\nIf a disconnect or other server error occurs, the backing library will\nattempt to reconnect automatically, and if this reconnection fails,\nConnection.open() will return -1.\n\nSee also \"man 3 ldap\" for details.\n\nConnection.searchPaged(base, scope, filter, attrs, pageSize, function(msgid, err, data) [, cookie])\n---------------------------------------------------------------------------------------------------\n\nLDAP servers are usually limited in how many items they are willing to return -\n1024 or 4096 are some typical values. For larger LDAP directories, you need to\neither partition your results with filter, or use paged search.\n\nNote that it's only extension to the protocol, server doesn't have to support\nit. In such case, callback will be called with nonzero err (actually, it would\nbe nice if someone could verify this, the server it was tested on had this\nfeature).\n\nCookie parameter is only for internal use, leave it undefined in your calls.\n\nResults are passed to callback function as they arrive in the same format\nas for simple search. Request for next page is sent only after the callback\nreturns. After all data has arrived, callback is called once more, with data\nequal to null.\n\nSearch Example\n--------------\n\n        var LDAPConnection = require(\"../LDAP\").Connection;\n        var LDAP = new LDAPConnection();\n        \n        // Open a connection.\n        LDAP.open(\"ldap://ldap1.example.com\");\n        LDAP.search(\"o=company\", LDAP.SUBTREE, \"(uid=alice)\", \"*\", function(msgid, error, data) {\n            switch(error) {\n            case -2:\n                 console.log(\"Timeout\");\n                 break;\n            case -1:\n                 console.log(\"Server gone away\");\n                 break;\n            default:\n                console.log(data[0].uid[0]);\n                break;\n            }                \n        });\n\nTODO:\n-----\n* Document Modify, Add and Rename\n* Testing against Microsoft Active Directory is welcomed, as I don't\nhave a server to test against.\n","maintainers":[{"name":"jeremycx","email":"jeremyc@ssimicro.com"}],"time":{"modified":"2012-05-29T17:25:08.480Z","created":"2011-12-16T17:54:46.261Z","0.0.4":"2011-12-16T17:54:47.634Z","1.0.0":"2012-03-07T22:53:07.090Z","1.0.1":"2012-03-11T20:18:43.954Z","1.0.2":"2012-05-28T19:34:39.319Z","1.0.4":"2012-05-29T17:25:08.480Z"},"author":{"name":"Jeremy Childs","email":"jeremyc@ssimicro.com"},"repository":{"type":"git","url":"git://github.com/jeremycx/node-LDAP.git"},"_attachments":{"LDAP-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-rq+bM5Vph1yhPHbSz7ZdwQ==","length":200220,"stub":true},"LDAP-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-uEKpRzjcsktp3f5zJtogzA==","length":52532,"stub":true},"LDAP-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-du3UBPnBHSDjfAhaxlFIKQ==","length":45585,"stub":true},"LDAP-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zkRBOExHLalruwGPVx6zIw==","length":45873,"stub":true},"LDAP-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-viB9hNxOgZnoIi3dNO+zeQ==","length":71680,"stub":true}}}},
{"id":"LISP.js","key":"LISP.js","value":{"rev":"9-174bb395311288c7486488c5c1565b5c"},"doc":{"_id":"LISP.js","_rev":"9-174bb395311288c7486488c5c1565b5c","name":"LISP.js","description":"A simple LISP parser and executer.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"LISP.js","homepage":"http://github.com/arian/LISP.js","version":"0.0.1","description":"A simple LISP parser and executer.","keywords":["LISP"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":{"name":"https://github.com/arian/LISP.js/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git://github.com/arian/LISP.js.git"},"implements":["CommonJS/Packages/1.0","CommonJS/Modules/AsynchronousDefinition"],"directories":{"lib":"Source"},"main":"./Source/parse","dependencies":{"amd-loader":">=0.0.3"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"LISP.js@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"8219cba3a5e5cca928b41d780686616ea0704bfe","tarball":"http://registry.npmjs.org/LISP.js/-/LISP.js-0.0.1.tgz"}},"0.0.2":{"name":"LISP.js","homepage":"http://github.com/arian/LISP.js","version":"0.0.2","description":"A simple LISP parser and executer.","keywords":["LISP"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":{"name":"https://github.com/arian/LISP.js/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git://github.com/arian/LISP.js.git"},"implements":["CommonJS/Packages/1.0","CommonJS/Modules/AsynchronousDefinition"],"directories":{"lib":"Source"},"main":"./Source/exec","dependencies":{"amd-loader":">=0.0.3"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"LISP.js@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"2cd5caddc957a9854c32d55cdacda572758b0b06","tarball":"http://registry.npmjs.org/LISP.js/-/LISP.js-0.0.2.tgz"}},"0.0.3":{"name":"LISP.js","homepage":"http://github.com/arian/LISP.js","version":"0.0.3","description":"A simple LISP parser and executer.","keywords":["LISP"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":{"name":"https://github.com/arian/LISP.js/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git://github.com/arian/LISP.js.git"},"implements":["CommonJS/Packages/1.0","CommonJS/Modules/AsynchronousDefinition"],"directories":{"lib":"Source"},"main":"./Source/exec","dependencies":{"amd-loader":">=0.0.3"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"LISP.js@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"43c16d28c0120cbd2ea092a0ca36c54f172a1921","tarball":"http://registry.npmjs.org/LISP.js/-/LISP.js-0.0.3.tgz"}},"0.0.4":{"name":"LISP.js","homepage":"http://github.com/arian/LISP.js","version":"0.0.4","description":"A simple LISP parser and executer.","keywords":["LISP"],"author":{"name":"Arian Stolwijk"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"bugs":{"name":"https://github.com/arian/LISP.js/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git://github.com/arian/LISP.js.git"},"main":"./LISP","scripts":{"test":"make test"},"devDependencies":{"mocha":"1.2","expect.js":"0.1","wrapup":"0.9.10"},"dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"LISP.js@0.0.4","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b51dc506cac462f528bbda31be25c6aec8a9adde","tarball":"http://registry.npmjs.org/LISP.js/-/LISP.js-0.0.4.tgz"}}},"readme":"LISP.js\n=======\n\nParse and execute LISP code in JavaScript.\n\nAPI\n---\n\nFor parsing the code, the `parse` function can be used.\nThis will return an array with all pieces.\n\n``` js\nparse('(+ 2 3)'); // ['+', 2, 3]\n```\n\nExecuting code can be done with the `exec` function:\n\n``` js\nexec('(+ 3 (- 10 5))'); // 8\n```\n\nAMD\n---\n\nLISP.js uses the [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) format. You could use any compatible AMD loader, either on Node.js or in the browser to use this Complex module. I'd recommend [Require.JS](http://requirejs.org/).\n\nConcatenating AMD modules can be done with _r.js_ or [amd-packager-php](https://github.com/arian/amd-packager-php)\n\nLISP.js in Node.js\n------------------\n\nFor usage in node.js, [amd-loader](https://github.com/ajaxorg/node-amd-loader)\nis required. This can be installed by running `npm install`.\n\nThen `amd-loader` should be required in your own file:\n\n```js\nrequire('amd-loader');\nvar exec = require('LISP.js/exec');\nexec('(+ 1 2)');\n```\n","maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"time":{"modified":"2012-06-18T20:45:57.535Z","created":"2012-02-01T00:57:25.024Z","0.0.1":"2012-02-01T00:57:26.399Z","0.0.2":"2012-02-01T01:09:37.598Z","0.0.3":"2012-02-01T02:46:48.715Z","0.0.4":"2012-06-18T20:45:57.535Z"},"author":{"name":"Arian Stolwijk"},"repository":{"type":"git","url":"git://github.com/arian/LISP.js.git"},"_attachments":{"LISP.js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-aTEeyp1Q/3WU375qiHVzBg==","length":5354,"stub":true},"LISP.js-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EK1hsYlisKxY6UsHGCIzzg==","length":2354118,"stub":true},"LISP.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pJuzRTbzGE4ilBAOYXbcoQ==","length":2353743,"stub":true},"LISP.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-y0mFlozdQDHoHTd52AQdHg==","length":2353000,"stub":true}}}},
{"id":"Lactate","key":"Lactate","value":{"rev":"7-e6c64df3f7b2ba49b33eca4fe3f4e8c6"},"doc":{"_id":"Lactate","_rev":"7-e6c64df3f7b2ba49b33eca4fe3f4e8c6","name":"Lactate","description":"Simple assets server","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"Lactate","version":"0.0.1","description":"Simple assets server","keywords":["static","assets","cache"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Lactate.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"dependencies":{"mime":"1.2.4"},"main":"lactate.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"_id":"Lactate@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"adc32042d72efb126176345c52c0c41e49ed4a80","tarball":"http://registry.npmjs.org/Lactate/-/Lactate-0.0.1.tgz"},"readme":"","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.1.0":{"name":"Lactate","version":"0.1.0","description":"Simple assets server","keywords":["static","assets","cache"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Lactate.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"dependencies":{"mime":"1.2.4","suckle":"0.0.1"},"main":"lib/lactate.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"_id":"Lactate@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"148f0211bbf82372128379f7e21d73d8fd83e3bc","tarball":"http://registry.npmjs.org/Lactate/-/Lactate-0.1.0.tgz"},"readme":"# Lactate\n\nVery simple static file handler, with a few electives.\n\n`npm install lactate`\n\n## Example\n\nJust pass three arguments to the serve function (`path`, `request`, `response`). Lactate will stream your file to the client in the most efficient way, by piping: readFile > gZip > response.\n\n```js\n\nvar express = require('express')\nvar app = express.createServer()\nvar lactate = require('lactate')()\n\napp.get('/', function(req, res) {\n  reurn lactate.serve('pages/land.html', req, res)\n})\n\napp.get('/files/*', function(req, res) {\n  return lactate.serve(req.url.substring(1), req, res)\n})\n\napp.get('/images/:img', function(req, res) {\n  var img = req.params.img\n  return lactate.serve('thumbs/'+img, req, res)\n})\n\napp.listen(8080)\n\n```\n\n##Options\n\nOptions can be passed to the initialization function or using the `set` method.\n\n```js\n\n//Passing to initialization function\nvar lactate = require('lactate')({expires:172800})\n\n//Set method\nlactate.set('expires', null)\n\n//Either function accepts (key, value) or an object.\n\n```\n\nAvailable options are currently `cache` (boolean), `expires` (seconds), and `debug`.\n\nThe `cache` option will have Lactate save your files in memory. By default this is enabled, and there's no great reason to disable it.\n\nSetting `expires` will have Lactase set appropriate `Expires` and `Cache-Control` headers for client-side caching. This option represents seconds-from-now to expire.\n\n### Debugging\n\nDebugging is level-based. The `debug` function accepts a number and a callback function, or a boolean. By default, the debugging function is console.log. The following syntaxes are valid.\n\n```js\n\nvar lactate = require('lactate')({\n  debug:true\n})\n\nlactate.set('debug', 0, function(level, msg, path, statusCode) {\n  /* \n    Do stuff\n\n    Note however that statusCode arguments are only\n    given for level 0 listeners\n  */\n})\n\nlactate.set('debug', 1, console.log)\nlactate.set({debug:false})\n\n```\n\nMore robust debugging will come in the future as I isolate the functionality into a module of its own.\n\n##TODO\n\n+ Express middleware\n+ Expiration defaults, e.g. 'two days,' 'one month'\n+ Redis integration\n+ Standalone server\n","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.1.1":{"name":"Lactate","version":"0.1.1","description":"Simple assets server","keywords":["static","assets","cache"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Lactate.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"dependencies":{"mime":"1.2.4","suckle":"0.0.1"},"main":"lib/lactate.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"_id":"Lactate@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6b24616ec3a8999a000a013d5e003012d0fe4c4a","tarball":"http://registry.npmjs.org/Lactate/-/Lactate-0.1.1.tgz"},"readme":"# Lactate\n\nVery simple static file handler, with a few electives.\n\n`npm install lactate`\n\n## Example\n\nJust pass three arguments to the serve function (`path`, `request`, `response`). Lactate will stream your file to the client in the most efficient way, by piping: readFile > gZip > response.\n\n```js\n\nvar express = require('express')\nvar app = express.createServer()\nvar lactate = require('lactate')()\n\napp.get('/', function(req, res) {\n  reurn lactate.serve('pages/land.html', req, res)\n})\n\napp.get('/files/*', function(req, res) {\n  return lactate.serve(req.url.substring(1), req, res)\n})\n\napp.get('/images/:img', function(req, res) {\n  var img = req.params.img\n  return lactate.serve('thumbs/'+img, req, res)\n})\n\napp.listen(8080)\n\n```\n\n##Options\n\nOptions can be passed to the initialization function or using the `set` method.\n\n```js\n\n//Passing to initialization function\nvar lactate = require('lactate')({expires:172800})\n\n//Set method\nlactate.set('expires', null)\n\n//Either function accepts (key, value) or an object.\n\n```\n\nAvailable options are currently `cache` (boolean), `expires` (seconds), and `debug`.\n\nThe `cache` option will have Lactate save your files in memory. By default this is enabled, and there's no great reason to disable it.\n\nSetting `expires` will have Lactase set appropriate `Expires` and `Cache-Control` headers for client-side caching. This option represents seconds-from-now to expire.\n\n### Debugging\n\nDebugging is level-based. The `debug` function accepts a number and a callback function, or a boolean. By default, the debugging function is console.log. The following syntaxes are valid.\n\n```js\n\nvar lactate = require('lactate')({\n  debug:true\n})\n\nlactate.set('debug', 0, function(level, msg, path, statusCode) {\n  /* \n    Do stuff\n\n    Note however that statusCode arguments are only\n    given for level 0 listeners\n  */\n})\n\nlactate.set('debug', 1, console.log)\nlactate.set({debug:false})\n\n```\n\nMore robust debugging will come in the future as I isolate the functionality into a module of its own.\n\n##TODO\n\n+ Express middleware\n+ Expiration defaults, e.g. 'two days,' 'one month'\n+ Redis integration\n+ Standalone server\n","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]}},"readme":"","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}],"time":{"modified":"2012-05-24T10:27:35.273Z","created":"2012-05-22T20:13:18.380Z","0.0.1":"2012-05-22T20:13:18.640Z","0.1.0":"2012-05-24T10:16:32.071Z","0.1.1":"2012-05-24T10:27:35.273Z"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"repository":{"type":"git","url":"git://github.com/Weltschmerz/Lactate.git"},"_attachments":{"Lactate-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1QJZc3lF8Peou+6SGB6Sdg==","length":4348,"stub":true},"Lactate-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gjFyxC/bx1UGmcWI0ww8IA==","length":4377,"stub":true},"Lactate-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jiB0h4IYec8VHyNVb/cuPQ==","length":1218,"stub":true}}}},
{"id":"LazyBoy","key":"LazyBoy","value":{"rev":"26-df1f9fc50e995d987d967c43612cac2f"},"doc":{"_id":"LazyBoy","_rev":"26-df1f9fc50e995d987d967c43612cac2f","name":"LazyBoy","description":"A object document mapper for couchdb","dist-tags":{"latest":"0.1.11"},"versions":{"0.1.0":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","version":"0.1.0","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9"},"devDependencies":{"Jody":">=0.2.1"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/LazyBoy/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"LazyBoy@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"eed27824292973b2114c38a25e8cc655be14d1b3","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.1":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","version":"0.1.1","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9"},"devDependencies":{"Jody":">=0.2.1"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/LazyBoy/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"LazyBoy@0.1.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2e6582d682ec59ebf3b95a359ff26f0cac53a60b","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.2":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","version":"0.1.2","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9"},"devDependencies":{"Jody":">=0.2.1"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/LazyBoy/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"LazyBoy@0.1.2","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6cb51e6a197be31dff6b5370d375fcc70f51ce9d","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.2.tgz"},"scripts":{},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.3":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","version":"0.1.3","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9"},"devDependencies":{"Jody":">=0.2.1"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/LazyBoy/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"LazyBoy@0.1.3","_engineSupported":true,"_npmVersion":"1.0.25","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"99cff76df2edfb513dac0b884691bf1f3d1e1ae5","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.3.tgz"},"scripts":{},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.4":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","version":"0.1.4","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9"},"devDependencies":{"Jody":">=0.2.1"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/LazyBoy/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"LazyBoy@0.1.4","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4f5dc6910c3ceb2e7ad13cbbb87692556e31b97e","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.4.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.5":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","version":"0.1.5","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9"},"devDependencies":{"Jody":">=0.2.1"},"_npmJsonOpts":{"file":"/Users/garrensmith/.npm/LazyBoy/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"LazyBoy@0.1.5","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5b7afc8f9304f3e797128131a40cdae84ffd3570","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.5.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.6":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","keywords":["Couchdb","db","ORM","ODM","couch"],"version":"0.1.6","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9","validator":">=0.3.4"},"devDependencies":{"Jody":">=0.2.1"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"LazyBoy@0.1.6","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"ceb6e3b469891d0ec813f48a42350028ecd612bd","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.6.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.7":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","keywords":["Couchdb","db","ORM","ODM","couch"],"version":"0.1.7","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9","validator":">=0.3.4"},"devDependencies":{"Jody":">=0.2.1"},"scripts":{"test":"Jody"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"LazyBoy@0.1.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"97981e235c22c65aba735191ab2759637dc086af","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.7.tgz"},"readme":"LazyBoy Object Modeller\n=======================\n\n# Oh my word... What have you done?\n\nMy experiments into what it takes to create a object mapper for Couchdb. This has been something I've been thinking about for a while and whether its a viable option. \n\nCurrently its purely fun research. I've been reading through [mongoose](https://github.com/LearnBoost/mongoose) and [couch-ar](https://github.com/scottburch/couch-ar) as imspiration.\n\n#How do I use this thing?\n\nBelow is a quick cheatsheet but the docs can be found [http://garrensmith.com/LazyBoy](http://garrensmith.com/LazyBoy)\n\n## Defining a model\n    var Model = require('LazyBoy');\n\n    Model.define('User', {\n      name: String\n      surname: {type: String, default: \"Rambo\"}\n    })\n\n## Creating and saving a model\n    \n    var user = Model.create('User', {name: \"John\", surname: \"Rambo\"});\n\n    user.save(function (err, saved_user) {\n        // .. do some other stuff here\n    })\n\n## Finding a model\n### Finding by Id\n    var user_id = \"123456\";\n\n    var User = Model('User');\n    User.find(user_id, function (err, user) {\n        // .. do something with the user\n    })\n\n### Find all\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.all(function (err, users) {\n        // .. do something with the user\n    })\n\n### Find by criteria\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.where(name,\"Ben\", function (err, users) {\n        // .. do something with the user\n    })\n\n## Logging\n  To see in detail what is happening the logging can be turned on. This can be done by\n  \n    require('LazyBoy').logger.setLogLevel(1);\n\n  `LazyBoy` uses [Coloured logger](https://github.com/bentruyman/coloured-log) under the covers and uses the same log levels\n    \n\n#What needs doing?\n\n* Should we allow custom ID's?\n* Better Type casting\n* Validations\n\n#Changelog\n11 Nov 2011 - Added Validations using node-validator\n13 Sep 2011 - Add Id to serialised model\n11 Sep 2011 - Add Before And After Remove Callbacks (Donnie Hedin)\n17 Aug 2011 - Add support for custom methods \n\n#Contributors\n* Donnie Hedin (sofa420)\n* 8bitDesigner\n\n","maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.8":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","keywords":["Couchdb","db","ORM","ODM","couch"],"version":"0.1.8","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9","validator":">=0.3.4"},"devDependencies":{"Jody":">=0.2.1"},"scripts":{"test":"Jody"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"LazyBoy@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"58a53732768a368ab62dcbd5a5ad1508728e9999","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.8.tgz"},"readme":"LazyBoy Object Modeller\n=======================\n\n# Oh my word... What have you done?\n\nMy experiments into what it takes to create a object mapper for Couchdb. This has been something I've been thinking about for a while and whether its a viable option. \n\nCurrently its purely fun research. I've been reading through [mongoose](https://github.com/LearnBoost/mongoose) and [couch-ar](https://github.com/scottburch/couch-ar) as imspiration.\n\n#How do I use this thing?\n\nBelow is a quick cheatsheet but the docs can be found [http://garrensmith.com/LazyBoy](http://garrensmith.com/LazyBoy)\n\n## Defining a model\n    var Model = require('LazyBoy');\n\n    Model.define('User', {\n      name: String\n      surname: {type: String, default: \"Rambo\"}\n    })\n\n## Creating and saving a model\n    \n    var user = Model.create('User', {name: \"John\", surname: \"Rambo\"});\n\n    user.save(function (err, saved_user) {\n        // .. do some other stuff here\n    })\n\n## Finding a model\n### Finding by Id\n    var user_id = \"123456\";\n\n    var User = Model('User');\n    User.find(user_id, function (err, user) {\n        // .. do something with the user\n    })\n\n### Find all\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.all(function (err, users) {\n        // .. do something with the user\n    })\n\n### Find by criteria\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.where(name,\"Ben\", function (err, users) {\n        // .. do something with the user\n    })\n\n## Logging\n  To see in detail what is happening the logging can be turned on. This can be done by\n  \n    require('LazyBoy').logger.setLogLevel(1);\n\n  `LazyBoy` uses [Coloured logger](https://github.com/bentruyman/coloured-log) under the covers and uses the same log levels\n    \n\n#What needs doing?\n\n* Should we allow custom ID's?\n* Better Type casting\n* Validations\n\n#Changelog\n11 Nov 2011 - Added Validations using node-validator\n13 Sep 2011 - Add Id to serialised model\n11 Sep 2011 - Add Before And After Remove Callbacks (Donnie Hedin)\n17 Aug 2011 - Add support for custom methods \n\n#Contributors\n* Donnie Hedin (sofa420)\n* 8bitDesigner\n\n","maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.9":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","keywords":["Couchdb","db","ORM","ODM","couch"],"version":"0.1.9","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9","validator":">=0.3.4"},"devDependencies":{"Jody":">=0.2.1"},"scripts":{"test":"Jody"},"_npmUser":{"name":"garrensmith","email":"garren.smith@gmail.com"},"_id":"LazyBoy@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"5b2e1dd8104349b2500532fbc823e57447f8a81e","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.9.tgz"},"readme":"LazyBoy Object Modeller\n=======================\n\n# Oh my word... What have you done?\n\nMy experiments into what it takes to create a object mapper for Couchdb. This has been something I've been thinking about for a while and whether its a viable option. \n\nCurrently its purely fun research. I've been reading through [mongoose](https://github.com/LearnBoost/mongoose) and [couch-ar](https://github.com/scottburch/couch-ar) as imspiration.\n\n#How do I use this thing?\n\nBelow is a quick cheatsheet but the docs can be found [http://garrensmith.com/LazyBoy](http://garrensmith.com/LazyBoy)\n\n## Defining a model\n    var Model = require('LazyBoy');\n\n    Model.define('User', {\n      name: String\n      surname: {type: String, default: \"Rambo\"}\n    })\n\n## Creating and saving a model\n    \n    var user = Model.create('User', {name: \"John\", surname: \"Rambo\"});\n\n    user.save(function (err, saved_user) {\n        // .. do some other stuff here\n    })\n\n## Finding a model\n### Finding by Id\n    var user_id = \"123456\";\n\n    var User = Model('User');\n    User.find(user_id, function (err, user) {\n        // .. do something with the user\n    })\n\n### Find all\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.all(function (err, users) {\n        // .. do something with the user\n    })\n\n### Find by criteria\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.where(name,\"Ben\", function (err, users) {\n        // .. do something with the user\n    })\n\n## Logging\n  To see in detail what is happening the logging can be turned on. This can be done by\n  \n    require('LazyBoy').logger.setLogLevel(1);\n\n  `LazyBoy` uses [Coloured logger](https://github.com/bentruyman/coloured-log) under the covers and uses the same log levels\n    \n\n#What needs doing?\n\n* Should we allow custom ID's?\n* Better Type casting\n* Validations\n\n#Changelog\n11 Nov 2011 - Added Validations using node-validator\n13 Sep 2011 - Add Id to serialised model\n11 Sep 2011 - Add Before And After Remove Callbacks (Donnie Hedin)\n17 Aug 2011 - Add support for custom methods \n\n#Contributors\n* Donnie Hedin (sofa420)\n* 8bitDesigner\n\n","maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.10":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","keywords":["Couchdb","db","ORM","ODM","couch"],"version":"0.1.10","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9","validator":">=0.3.4"},"devDependencies":{"Jody":">=0.2.1"},"scripts":{"test":"Jody"},"readme":"LazyBoy Object Modeller\n=======================\n\n# Oh my word... What have you done?\n\nMy experiments into what it takes to create a object mapper for Couchdb. This has been something I've been thinking about for a while and whether its a viable option. \n\nCurrently its purely fun research. I've been reading through [mongoose](https://github.com/LearnBoost/mongoose) and [couch-ar](https://github.com/scottburch/couch-ar) as imspiration.\n\n#How do I use this thing?\n\nBelow is a quick cheatsheet but the docs can be found [http://garrensmith.com/LazyBoy](http://garrensmith.com/LazyBoy)\n\n## Defining a model\n    var Model = require('LazyBoy');\n\n    Model.define('User', {\n      name: String\n      surname: {type: String, default: \"Rambo\"}\n    })\n\n## Creating and saving a model\n    \n    var user = Model.create('User', {name: \"John\", surname: \"Rambo\"});\n\n    user.save(function (err, saved_user) {\n        // .. do some other stuff here\n    })\n\n## Finding a model\n### Finding by Id\n    var user_id = \"123456\";\n\n    var User = Model('User');\n    User.find(user_id, function (err, user) {\n        // .. do something with the user\n    })\n\n### Find all\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.all(function (err, users) {\n        // .. do something with the user\n    })\n\n### Find by criteria\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.where(name,\"Ben\", function (err, users) {\n        // .. do something with the user\n    })\n\n## Logging\n  To see in detail what is happening the logging can be turned on. This can be done by\n  \n    require('LazyBoy').logger.setLogLevel(1);\n\n  `LazyBoy` uses [Coloured logger](https://github.com/bentruyman/coloured-log) under the covers and uses the same log levels\n    \n\n#What needs doing?\n\n* Should we allow custom ID's?\n* Better Type casting\n* Validations\n\n#Changelog\n20 July 2012 - Added toJSON function on Document\n11 Nov 2011 - Added Validations using node-validator\n13 Sep 2011 - Add Id to serialised model\n11 Sep 2011 - Add Before And After Remove Callbacks (Donnie Hedin)\n17 Aug 2011 - Add support for custom methods \n\n#Contributors\n* Donnie Hedin (sofa420)\n* 8bitDesigner\n\n","_id":"LazyBoy@0.1.10","dist":{"shasum":"5c8ac2fcf0892000b7d3cccd502112c1edf78911","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.10.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]},"0.1.11":{"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"name":"LazyBoy","description":"A object document mapper for couchdb","keywords":["Couchdb","db","ORM","ODM","couch"],"version":"0.1.11","homepage":"http://garrensmith.com/LazyBoy","repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"main":"lib/index.js","engines":{"node":">0.4.0"},"dependencies":{"cradle":">=0.5.5","coloured-log":">=0.9.6","async":">=0.1.9","validator":">=0.3.4"},"devDependencies":{"mocha":"*","should":"*"},"readme":"LazyBoy Object Modeller\n=======================\n\n# Oh my word... What have you done?\n\nMy experiments into what it takes to create a object mapper for Couchdb. This has been something I've been thinking about for a while and whether its a viable option. \n\nCurrently its purely fun research. I've been reading through [mongoose](https://github.com/LearnBoost/mongoose) and [couch-ar](https://github.com/scottburch/couch-ar) as imspiration.\n\n#How do I use this thing?\n\nBelow is a quick cheatsheet but the docs can be found [http://garrensmith.com/LazyBoy](http://garrensmith.com/LazyBoy)\n\n## Defining a model\n    var Model = require('LazyBoy');\n\n    Model.define('User', {\n      name: String\n      surname: {type: String, default: \"Rambo\"}\n    })\n\n## Creating and saving a model\n    \n    var user = Model.create('User', {name: \"John\", surname: \"Rambo\"});\n\n    user.save(function (err, saved_user) {\n        // .. do some other stuff here\n    })\n\n## Finding a model\n### Finding by Id\n    var user_id = \"123456\";\n\n    var User = Model('User');\n    User.find(user_id, function (err, user) {\n        // .. do something with the user\n    })\n\n### Find all\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.all(function (err, users) {\n        // .. do something with the user\n    })\n\n### Find by criteria\nWill return an array of all documents that fit the criteria\n    \n    var User = Model('User');\n    User.where(name,\"Ben\", function (err, users) {\n        // .. do something with the user\n    })\n\n## Logging\n  To see in detail what is happening the logging can be turned on. This can be done by\n  \n    require('LazyBoy').logger.setLogLevel(1);\n\n  `LazyBoy` uses [Coloured logger](https://github.com/bentruyman/coloured-log) under the covers and uses the same log levels\n    \n\n#What needs doing?\n\n* Chainable callbacks\n* Count query\n* Define model_type field stored in db\n* Multiple db support\n* Improved logging\n* More advance querying\n\n#Changelog\n25 July 2012 - Bug fixes, change tests to mocha\n20 July 2012 - Added toJSON function on Document\n11 Nov 2011 - Added Validations using node-validator\n13 Sep 2011 - Add Id to serialised model\n11 Sep 2011 - Add Before And After Remove Callbacks (Donnie Hedin)\n17 Aug 2011 - Add support for custom methods \n\n#Contributors\n* Donnie Hedin (sofa420)\n* 8bitDesigner\n\n","_id":"LazyBoy@0.1.11","dist":{"shasum":"45276ff4f345daec6e4fda0913afddc5327ee908","tarball":"http://registry.npmjs.org/LazyBoy/-/LazyBoy-0.1.11.tgz"},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}]}},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}],"time":{"modified":"2012-08-02T13:44:25.115Z","created":"2011-08-02T15:10:09.022Z","0.1.0":"2011-08-02T15:10:13.129Z","0.1.1":"2011-08-03T12:56:08.156Z","0.1.2":"2011-08-03T19:02:53.069Z","0.1.3":"2011-08-17T14:26:03.983Z","0.1.4":"2011-09-11T19:44:37.701Z","0.1.5":"2011-09-13T19:12:58.305Z","0.1.6":"2011-11-11T12:05:50.292Z","0.1.7":"2012-03-20T15:12:24.387Z","0.1.8":"2012-03-26T12:44:41.214Z","0.1.9":"2012-06-07T07:01:36.441Z","0.1.10":"2012-07-20T14:33:25.010Z","0.1.11":"2012-07-25T07:55:16.681Z"},"author":{"name":"Garren Smith","email":"garren.smith@gmail.com","url":"www.garrensmith.com"},"repository":{"type":"git","url":"git://github.com/garrensmith/lazyboy.git"},"users":{"fgribreau":true},"_attachments":{"LazyBoy-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-vCAorO79jf6zgtwgnjmJoA==","length":15336,"stub":true},"LazyBoy-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-U3m62opmmlgGEJ/2aMlFdQ==","length":16071,"stub":true},"LazyBoy-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-3uMUnEd4EVBeaTngdMvauw==","length":15931,"stub":true},"LazyBoy-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-UbEXUsoKkr9QVU0aaRAQKg==","length":15976,"stub":true},"LazyBoy-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-N4h+yu7FDKL+Nw/tnwCFQA==","length":15963,"stub":true},"LazyBoy-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-UkfhwIQFPJY/OrLhahZ4Ww==","length":20480,"stub":true},"LazyBoy-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ZWYlFjal52UnLe0TXqZ9hg==","length":14745,"stub":true},"LazyBoy-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-2RLnGhPB3qIl/U8K6SV16Q==","length":14462,"stub":true},"LazyBoy-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TlbGMT/eTqZM0RH+rchWuQ==","length":13601,"stub":true},"LazyBoy-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-esZK5v4PY3lwNQ300kgVWw==","length":12923,"stub":true},"LazyBoy-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sbr82LoURxnQu844qrI35w==","length":12762,"stub":true},"LazyBoy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bvDvw7z8k96D8x3Ssdifxg==","length":65801,"stub":true}}}},
{"id":"Legos","key":"Legos","value":{"rev":"3-d61ce2f62bc023cd7ec845e11b262414"},"doc":{"_id":"Legos","_rev":"3-d61ce2f62bc023cd7ec845e11b262414","name":"Legos","description":"Application Building Blocks","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"name":"Legos","description":"Application Building Blocks","version":"0.0.0","repository":{"type":"git","url":"git://github.com/GCheung55/Legos.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"GarrickCheung","email":"garrick@garrickcheung.com"},"_id":"Legos@0.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f0aa5156c33e8303709b76e3b96204f681134f25","tarball":"http://registry.npmjs.org/Legos/-/Legos-0.0.0.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}]}},"readme":"Legos\n=====\n\nApplication Building Blocks","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"time":{"modified":"2012-05-15T21:50:51.374Z","created":"2012-05-15T21:50:50.145Z","0.0.0":"2012-05-15T21:50:51.374Z"},"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"repository":{"type":"git","url":"git://github.com/GCheung55/Legos.git"},"_attachments":{"Legos-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Mn/EVn9NwfwWRsqrADHvAQ==","length":354,"stub":true}}}},
{"id":"Leipzig.js","key":"Leipzig.js","value":{"rev":"5-11d1a8bde19f35c88014c22c2450a426"},"doc":{"_id":"Leipzig.js","_rev":"5-11d1a8bde19f35c88014c22c2450a426","name":"Leipzig.js","description":"API Leipzig client for node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Leipzig.js","description":"API Leipzig client for node.js","version":"0.0.1","author":{"name":"Mario Behrendt","email":"info@mario-behrendt.de"},"dependencies":{"request":"*"},"devDependencies":{"mocha":"*","should":"*","mockery":"*"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"MarioBehrendt","email":"info@mario-behrendt.de"},"_id":"Leipzig.js@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"e826b2170876262fe8d6b999689f2440e944879d","tarball":"http://registry.npmjs.org/Leipzig.js/-/Leipzig.js-0.0.1.tgz"},"maintainers":[{"name":"MarioBehrendt","email":"info@mario-behrendt.de"}]},"0.0.2":{"name":"Leipzig.js","description":"API Leipzig client for node.js","version":"0.0.2","author":{"name":"Mario Behrendt","email":"info@mario-behrendt.de"},"dependencies":{"request":"*"},"devDependencies":{"mocha":"*","should":"*"},"main":"index","scripts":{"test":"make test"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"MarioBehrendt","email":"info@mario-behrendt.de"},"_id":"Leipzig.js@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"66fe287395f9948b0b6fe86a43ee8327314e8fb9","tarball":"http://registry.npmjs.org/Leipzig.js/-/Leipzig.js-0.0.2.tgz"},"maintainers":[{"name":"MarioBehrendt","email":"info@mario-behrendt.de"}]}},"readme":"# API Leipzig Node.js Client\n\n## Installation\n\n### Installation using npm\n\n```bash\nnpm install leipzig.js\n```\n\n## Usage\n\nGet a list of all companies in Leipzig:\n\n```javascript\nvar leipzig = require('leipzig.js');\nvar key = 'my api key';\n\nvar companies = leipzig.findAllCompanies(key, function(data) {\n    console.log(data); // Json object\n}\n```\n\nMore information on API Leipzig can be found here: http://www.apileipzig.de\n","maintainers":[{"name":"MarioBehrendt","email":"info@mario-behrendt.de"}],"time":{"modified":"2012-03-25T12:49:11.849Z","created":"2012-03-22T09:26:14.295Z","0.0.1":"2012-03-22T09:26:16.066Z","0.0.2":"2012-03-25T12:49:11.849Z"},"author":{"name":"Mario Behrendt","email":"info@mario-behrendt.de"},"_attachments":{"Leipzig.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-93cVoI7wavB0/91SqN5FnA==","length":10240,"stub":true},"Leipzig.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-35hgXpf7xDOP7z6sVz9zGA==","length":10240,"stub":true}}}},
{"id":"Lingo","key":"Lingo","value":{"rev":"9-1af9a6df616e601f09c8cec07ccad1ae"},"doc":{"_id":"Lingo","_rev":"9-1af9a6df616e601f09c8cec07ccad1ae","name":"Lingo","description":"linguistics module sporting inflection and more","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Lingo","description":"linguistics module sporting inflection and more","version":"0.0.1","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"keywords":["language","linguistics","inflection"],"main":"./index","engines":{"node":">= 0.2.0"},"_id":"Lingo@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Lingo/-/Lingo-0.0.1.tgz"},"mtime":"2010-11-09T23:29:28Z","ctime":"2010-11-09T23:29:28Z"},"0.0.2":{"name":"Lingo","description":"linguistics module sporting inflection and more","version":"0.0.2","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"keywords":["language","linguistics","inflection"],"main":"./index","engines":{"node":">= 0.2.0"},"_id":"Lingo@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Lingo/-/Lingo-0.0.2.tgz"},"mtime":"2010-11-09T23:29:28Z","ctime":"2010-11-09T23:29:28Z"}},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"mtime":"2010-11-09T23:29:28Z","ctime":"2010-11-09T23:29:28Z","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"_attachments":{"Lingo-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hbQRU/yXXc4MbKJUCRlZ5w==","length":31726,"stub":true},"Lingo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9XFDvGDjCiQlLBi0Rt4PQQ==","length":30532,"stub":true}}}},
{"id":"LiveController","key":"LiveController","value":{"rev":"3-559e0366eb69a63fc55c1814aa82bc55"},"doc":{"_id":"LiveController","_rev":"3-559e0366eb69a63fc55c1814aa82bc55","name":"LiveController","description":"","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"LiveController","description":"","version":"0.0.1","author":{"name":"Mukari","email":"dev@mukari.com"},"dependencies":{"underscore":"1.2.3"},"engine":"node >= 0.4.1","_npmUser":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_id":"LiveController@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"23d6e5db1d67a622df50589012098c327dce20c3","tarball":"http://registry.npmjs.org/LiveController/-/LiveController-0.0.1.tgz"},"maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}]}},"readme":"Live Controller v0.0.1\n======================\n\nTable of Contents\n-----------------\n  * [Introduction](#introduction)\n  * [API docs](#api)\n  * [Experimental API docs](#experimental)\n  * [Examples](#examples)\n  * [Tests](#tests)\n  * [Contributing](#contributing)\n  * [Contributors](#contributors)\n  * [License](#license)\n\n<a name=\"introduction\"></a>\n\nIntroduction\n------------\n\nLive Controller is a tiny, client-side router that uses window.pushState and falls back to regular page refreshes when pushState is not available.\n\n<a name=\"api\"></a>\n\nAPI docs\n--------\n\nYou can find the API docs in the docs folder.\n\n<a name=\"experimental\"></a>\n\nExperimental API docs\n---------------------\n\nExpelrimental API docs will be made available when any part of the project isn't experimental.\n\n<a name=\"examples\"></a>\n\nExamples\n--------\n\n###Here's an example\n\n  var controller = new Controller(\"/things\", function(thing) {\n\n    thing.get(function(params) {\n\n    }) \n\n    thing.get(\"/:id\", function(params) {\n\n    }) \n\n    thing.delete(\"/:id\", function(params) {\n\n    })\n\n    thing.put(\"/:id\", function(params) {\n\n    })\n\n    thing.post(function(params) {\n\n    })\n\n  }) \n\n###And here's how you send invoke them\n\n  Controller.get(\"/things\")\n\n  Controller.get(\"/things/12\")\n\n  Controller.delete(\"/things/42\")\n\n  Controller.put(\"/things/42\", {\"title: \"w00t\"})\n\n  Controller.post(\"/things\", {\"title: \"w00t\"})\n\nContributing\n------------\n\nIdeas, feature requests, bug reports, etc are very welcome.\n\n### TODO before releasing this,\n  * Can we use something better by someone else?\n  * Get rid of http verbs, they dumb\n  * fallback for shitty browsers with #!\n\n<a name=\"contributors\"></a>\n\nContributors\n------------\n\n  * Zach Smith @xcoderzach\n  * Eugene Butler @EButlerIV\n\n<a name = \"license\"></a>\n \nLicense\n-------\n\nMIT Licensed (see LICENSE.txt)\n","maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}],"time":{"modified":"2012-04-13T04:20:58.164Z","created":"2012-04-13T04:20:57.282Z","0.0.1":"2012-04-13T04:20:58.164Z"},"author":{"name":"Mukari","email":"dev@mukari.com"},"_attachments":{"LiveController-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-e5qfiQWQyTG4piVMnC7hPw==","length":3921,"stub":true}}}},
{"id":"LiveDocument","key":"LiveDocument","value":{"rev":"25-28b859b3e43a81b14c19e776f4daf922"},"doc":{"_id":"LiveDocument","_rev":"25-28b859b3e43a81b14c19e776f4daf922","name":"LiveDocument","description":"A Realtime Isomorphic ODM for MongoDB","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"name":"LiveDocument","description":"A Realtime Isomorphic ODM for MongoDB","version":"0.0.0","author":{"name":"Zach Smith","email":"x.coder.zach@gmail.com"},"dependencies":{"mongolian":"0.1.x","underscore":"1.2.3","uglify-js":"x.x.x","traverse":"x.x.x"},"repository":{"type":"git","url":"git://github.com/xcoderzach/LiveDocument.git"},"devDependencies":{"coffee-script":"1.1.x","mocha":"0.5.x","should":"0.3.x","connect":"x.x.x","superagent":"x.x.x"},"license":"MIT","engine":"node >= 0.6.x","_npmUser":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_id":"LiveDocument@0.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"edcef128041f8daccb1f8217b4a0545d3288053b","tarball":"http://registry.npmjs.org/LiveDocument/-/LiveDocument-0.0.0.tgz"},"maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}],"directories":{}},"0.0.1":{"name":"LiveDocument","description":"A Realtime Isomorphic ODM for MongoDB","version":"0.0.1","author":{"name":"Zach Smith","email":"x.coder.zach@gmail.com"},"dependencies":{"mongolian":"0.1.x","underscore":"1.2.3","uglify-js":"x.x.x","traverse":"x.x.x"},"repository":{"type":"git","url":"git://github.com/xcoderzach/LiveDocument.git"},"devDependencies":{"coffee-script":"1.1.x","mocha":"0.5.x","should":"0.3.x","connect":"x.x.x","superagent":"x.x.x"},"license":"MIT","engine":"node >= 0.6.x","_npmUser":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_id":"LiveDocument@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d644e07845340da292411564a9e2bb4914fcb89e","tarball":"http://registry.npmjs.org/LiveDocument/-/LiveDocument-0.0.1.tgz"},"maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}]}},"readme":"LiveDocument v0.0.0\n===================\n\n  LiveDocument is an client/server isopmorphic ODM.  The goal of LiveDocument\nis to provide a seamless way to interact with a mongodb database on the client,\nwithout duplication of effort writing both a client side and a server side\nmodels. \n\n  LiveDocument also provides real-time updates out of the box.  After you query\nsomething from the database, LiveDocument notifies you of any documents that\nare created, updated, or deleted and match your criteria.  If you ask for a\nsingle document, any changes made to that document will automatically be pushed\nto you.\n\n\nTable of Contents\n-----------------\n  * [Example](#example)\n  * [Motivation](#motivation)\n  * [API docs](#api)\n  * [Experimental API docs](#experimental)\n  * [Tests](#tests)\n  * [Contributing](#contributing)\n  * [Contributors](#contributors)\n  * [License](#license)\n\n\n<a name = \"example\"></a>\nExamples\n--------\n\nHere is a random assortment of code in coffeescript:\n\n```coffeescript\nclass Task extends LiveDocument\n  @key \"title\", { length: [3...24] }\n  @key \"description\", { max: 140 }\n\ntask = new Task({title: \"Work that needs to be done\", description: \"This is some important work\", priority:10})\ntask.save()\n\n# or \n\nTask.create({title: \"Clean carpet\", description: \"Clean the carpets, they're gross\", priority: 4})\n\ntask = Task.findOne({title: \"This is my title\"})\n\ntask.on \"load\", (tasks) ->\n  console.log(task.get(\"priority\")) # 10\n\ntask.on \"update\", (task) ->\n  #called when someone updates this task\n\ntask.on \"delete\", (task) ->\n  #called when someone deletes this task\n\n#this runs any time priority changes\ntask.get \"priority\" (val) ->\n  console.log(val) # 10\n\ntask.get \"priority\" (key, val) ->\n  console.log(key) # priority\n  console.log(val) # 10\n# this binds tasks get to views set binding\ntask.get \"priority\", view.set\n# this binds all properties\ntask.get view.set\n\ntask.set \"key\", value\ntask.set {key: value, key2: val2}\n\n# mongodb style queries, if it\"s supported by mongo, we should support it (not\n# true atm!)\n\ntasks = Task.find({priority: {$lt: 10}})\n\ntasks.on \"load\", (tasks) ->\n  # called when the tasks have been loaded from the datasource\n\ntasks.on \"insert\", (tasks) ->\n  # called when a document is created that matches the criteria\n  # or an existing document is updated in such a way that it\n  # now matches the criteria\n\ntasks.on \"remove\", (tasks) ->\n  # called when a document is deleted that matches the criteria\n  # or an document is updated in such a way that it no longer\n  # matches the criteria\n```\n \n<a name = \"motivation\"></a>\nMotivation\n----------\n\n<a name = \"api\"></a>\nAPI \n---\n\nYou can find the API here: \nxcoderzach.github.com/liveDocument\n\n<a name = \"experimental\"></a>\nExperimental API (Warning, these method probably DON'T EXIST OR WORK\n----------------\n\n### .allowScope()\n\n  Since we don't want a malicious user to be able to query every\npost on our social network.  Which would essentially be a DoS attack,\nsince it would grab EVERY post and authorize them ALL.  That's where\nallowScope comes in handy.  \n\n  The allowScope method won't allow any queries which don't have they keys defined\nin allowScope. \n\n```coffeescript\nclass Post extends LiveDocument\n  @requireScope = true\n  @allowScope { ownerId: } \n\n```\n\n\n<a name = \"tests\"></a>\nTests \n-----\n  To run the tests you need an instance of mongo running on the default port.\nThen just run the following.\n\n    mocha test/*.coffee\n\nValidation\n----------\n\n  Model validation happens on both the client and the server when possible.\nInput is validated on the client first if possible, to provide a responsive\nuser experience.  The model is then validated again on the server, in order to\ncatch people bypassing client side validation, as well as doing validations\nthat can only happen on the server, such as checking if an email address is\ntaken.\n\n####Error Messages\n\n  Validations do not give you error messages.  They do not allow you to set\nerror messages.  Error messages belong in the view.\n\n  All of the declarative LiveDocument class methods, return this, allowing you\nto chain them together.\n\n<a name = \"contributing\"></a>\nContributing\n------------\n  \n  Ideas, feature requests, bug reports, etc are very welcome.\n\n####TODO Before it's releaseable\n  * make it able to run by itself, as a connect middleware\n  * has many associations should be embedded documents or\n  normal assocs\n  * get rid of coffeescript tests\n  * documentation\n\n<a name = \"contributors\"></a>\nContributors\n------------\n\n  * Zach Smith @xcoderzach\n  * Eugene Butler @EButlerIV\n  * Chad Seibert @omegakoder\n\n<a name = \"license\"></a>\nLicense\n-------\n\n  Licensed under MIT (see LICENSE file)\n","maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}],"time":{"modified":"2012-04-13T08:11:14.704Z","created":"2012-04-11T18:35:08.470Z","0.0.1":"2012-04-13T08:11:14.704Z","0.0.0":"2012-04-13T01:58:37.392Z"},"author":{"name":"Zach Smith","email":"x.coder.zach@gmail.com"},"repository":{"type":"git","url":"git://github.com/xcoderzach/LiveDocument.git"},"_attachments":{"LiveDocument-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-VuO4td1N5dCVE9fkDggZ+w==","length":34924,"stub":true},"LiveDocument-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-NP7TRYrg1yJIZ9k2GpyspQ==","length":34532,"stub":true}}}},
{"id":"LiveScript","key":"LiveScript","value":{"rev":"40-48ecb5fa6d4c518f4c06d00b42e2064d"},"doc":{"_id":"LiveScript","_rev":"40-48ecb5fa6d4c518f4c06d00b42e2064d","name":"LiveScript","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","dist-tags":{"latest":"1.0.0"},"versions":{"0.9.0":{"name":"LiveScript","version":"0.9.0","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and with more awesome features.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.15"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./lib/command.js","slake":"./lib/slake.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0adbef2d04a0bacd3f49b8e1fe5055e4df9d38d7","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.0.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.1":{"name":"LiveScript","version":"0.9.1","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and with more awesome features.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.15"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./lib/command.js","slake":"./lib/slake.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"637782712005545f302d9b32899d20ea0305ee6e","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.1.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.2":{"name":"LiveScript","version":"0.9.2","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.15"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./lib/command.js","slake":"./lib/slake.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"269831b8f6ed25b367ab207f1f71a3475146fd74","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.2.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.3":{"name":"LiveScript","version":"0.9.3","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./lib/command.js","slake":"./lib/slake.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"61899425b8f2c47f2b2003c7a2a6e1c223721b75","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.3.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.4":{"name":"LiveScript","version":"0.9.4","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./lib/command.js","slake":"./lib/slake.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"09ef3c9ce865f85c4c9bf2637cace034066d46f1","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.4.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.5":{"name":"LiveScript","version":"0.9.5","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./lib/command.js","slake":"./lib/slake.js"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a00f5931b8298ba9da739d62dac98e39433a0d2b","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.5.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.5b":{"name":"LiveScript","version":"0.9.5b","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib"},"files":["lib"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.5b","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"790396e275fc55f64d64e675af1e923e766ee93f","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.5b.tgz"},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.5c":{"name":"LiveScript","version":"0.9.5c","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.5c","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a4a6a71ff5c43ebeb4d4dc8a3808827c8f0038ee","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.5c.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.6":{"name":"LiveScript","version":"0.9.6","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"21167324918a278a9719e69091a60a1bea2769da","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.6.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.7":{"name":"LiveScript","version":"0.9.7","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.7","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0cb1549a116ff0a103d4888db78dfd4aba74de8e","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.7.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.8":{"name":"LiveScript","version":"0.9.8","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.8","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a9bc600281295f09f5e1017b8e8dbb7377121c11","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.8.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.8b":{"name":"LiveScript","version":"0.9.8b","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.8b","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2fb1b29c4831867effe58fa7d754f5d7edda99ff","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.8b.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.8c":{"name":"LiveScript","version":"0.9.8c","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.8c","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2149c3e5090350e63731102d50cb98d11b58128e","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.8c.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.9":{"name":"LiveScript","version":"0.9.9","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.9","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f5ba51587c26950b08dce44d9e73174feed499bd","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.9.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.10":{"name":"LiveScript","version":"0.9.10","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.6.14 < 0.9.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.10","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6395cba40d304bb771f4a6da2c08faec21ddcb50","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.10.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.11":{"name":"LiveScript","version":"0.9.11","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.8.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"dependencies":{"prelude-ls":">= 0.5.0"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"1a5a84729d1951e5b6aa96b042a07dc63770da07","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.11.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.11b":{"name":"LiveScript","version":"0.9.11b","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":{"name":"https://github.com/gkz/LiveScript/issues"},"licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.8.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"dependencies":{"prelude-ls":">= 0.5.0"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"_npmUser":{"name":"gkz","email":"z@georgezahariev.com"},"_id":"LiveScript@0.9.11b","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"c50019e3a093a9119ed9d643b2065a5f176a0b7d","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.11b.tgz"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"0.9.12":{"name":"LiveScript","version":"0.9.12","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":"https://github.com/gkz/LiveScript/issues","licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.8.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"dependencies":{"prelude-ls":">= 0.5.0"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","_id":"LiveScript@0.9.12","dist":{"shasum":"7053e8001d07e795dd17ba0076f8afba1e025271","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-0.9.12.tgz"},"maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]},"1.0.0":{"name":"LiveScript","version":"1.0.0","description":"LiveScript is a language the compiles down to JavaScript, it is Coco but much more compatible with CoffeeScript, more functional, and more feature rich.","keywords":["language","compiler","coffeescript","coco","javascript"],"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"homepage":"http://gkz.github.com/LiveScript/","bugs":"https://github.com/gkz/LiveScript/issues","licenses":[{"type":"MIT","url":"https://raw.github.com/gkz/LiveScript/master/LICENSE"}],"engines":{"node":">= 0.8.0"},"directories":{"lib":"./lib","bin":"./bin"},"files":["lib","bin","README.md","LICENSE"],"main":"./lib/livescript","bin":{"livescript":"./bin/livescript","slake":"./bin/slake"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"dependencies":{"prelude-ls":">= 0.6.0"},"devDependencies":{"jison":"0.2.1","uglify-js":"1.2.6"},"readme":"# LiveScript\nis a language which compiles down to JavaScript. It is a fork of [Coco](http://satyr.github.com/coco/), which is in turn derived from [CoffeeScript](http://coffeescript.org/). Like those two it has a relatively straightforward mapping to JavaScript. LiveScript is Coco but much more compatible with CoffeeScript, more functional, and more feature rich. LiveScript aims for increased expressiveness and code beauty.\n\nCheckout **[gkz.github.com/LiveScript](http://gkz.github.com/LiveScript/)** for more information, examples, usage, and a language reference. \n\n### Install\nHave Node.js installed, then `sudo bin/slake install`\n\nFrom then run `livescript` for more information. \n\nVia npm: `sudo npm install -g LiveScript`\n\n### Source\n[git://github.com/gkz/LiveScript.git](git://github.com/gkz/LiveScript.git)\n","_id":"LiveScript@1.0.0","dist":{"shasum":"d7697faa43f778bf56a12c375cad88d52d3e5155","tarball":"http://registry.npmjs.org/LiveScript/-/LiveScript-1.0.0.tgz"},"maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}]}},"readme":"","maintainers":[{"name":"gkz","email":"z@georgezahariev.com"}],"time":{"modified":"2012-08-02T13:43:52.409Z","created":"2012-05-14T23:44:25.208Z","0.9.0":"2012-05-14T23:44:27.397Z","0.9.1":"2012-05-16T04:57:40.224Z","0.9.2":"2012-05-18T20:37:59.725Z","0.9.3":"2012-05-18T23:50:54.852Z","0.9.4":"2012-05-21T20:27:24.734Z","0.9.5":"2012-05-26T22:31:36.482Z","0.9.5b":"2012-05-26T22:37:07.356Z","0.9.5c":"2012-05-26T23:55:05.011Z","0.9.6":"2012-05-29T00:47:13.974Z","0.9.7":"2012-06-02T23:46:43.112Z","0.9.8":"2012-06-06T04:17:49.014Z","0.9.8b":"2012-06-06T05:55:14.002Z","0.9.8c":"2012-06-06T06:22:23.802Z","0.9.9":"2012-06-18T19:41:08.724Z","0.9.10":"2012-06-26T00:01:25.371Z","0.9.11":"2012-07-05T23:40:03.693Z","0.9.11b":"2012-07-06T08:41:27.580Z","0.9.12":"2012-07-09T04:53:08.208Z","1.0.0":"2012-07-30T18:13:57.067Z"},"author":{"name":"George Zahariev","email":"z@georgezahariev.com"},"repository":{"type":"git","url":"git://github.com/gkz/LiveScript.git"},"users":{"fgribreau":true},"_attachments":{"LiveScript-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-JlRzXByHyAClzpzNtiFJfA==","length":78271,"stub":true},"LiveScript-0.9.12.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-OzP+yi0yvWFh3sU0VhFX5Q==","length":74228,"stub":true},"LiveScript-0.9.11b.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Sjkb72am/BymVKUGnHsgig==","length":73326,"stub":true},"LiveScript-0.9.11.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-WMERQTFG4wEI6nV3+W2YsQ==","length":73333,"stub":true},"LiveScript-0.9.10.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-maEstlBRRQ7KBW+OK3GGUg==","length":68860,"stub":true},"LiveScript-0.9.9.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-uinXhaIh//DwPx4sOjVong==","length":68052,"stub":true},"LiveScript-0.9.8c.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-X4kq7JmrI47C27W4Xvodnw==","length":73755,"stub":true},"LiveScript-0.9.8b.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-em154/60sduIl3wUzvG62Q==","length":73700,"stub":true},"LiveScript-0.9.8.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-8COA4ujs/Y9V46itxBCmuQ==","length":73688,"stub":true},"LiveScript-0.9.7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-h7HjGcv4DPkjJJZKvcsRRQ==","length":73100,"stub":true},"LiveScript-0.9.6.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-K7QALipoTCUNCqFwNZFAJA==","length":72969,"stub":true},"LiveScript-0.9.5c.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-NcwajDaFb+mGPC6px4asPg==","length":71313,"stub":true},"LiveScript-0.9.5b.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-n1t6mYVtFXMN9VFn8KgDqw==","length":70102,"stub":true},"LiveScript-0.9.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-M29h8exD4TgqqKL3ck/2SA==","length":70107,"stub":true},"LiveScript-0.9.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-OzW/tHFIjzPHW685NNSNCA==","length":69711,"stub":true},"LiveScript-0.9.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-cGAPlnnEkJwMPVHlEbHhwg==","length":70199,"stub":true},"LiveScript-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-k+xEBxaCiTDnwHVWIRYrNg==","length":70191,"stub":true},"LiveScript-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BGTFXb8ctx2rvHd7WetbOg==","length":69555,"stub":true},"LiveScript-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0ivYAPy8/ecTrXGrugJ1Qw==","length":69086,"stub":true}}}},
{"id":"LiveScript-brunch","key":"LiveScript-brunch","value":{"rev":"17-391d612c187719fc2342e984403bd10e"},"doc":{"_id":"LiveScript-brunch","_rev":"17-391d612c187719fc2342e984403bd10e","name":"LiveScript-brunch","description":"Adds LiveScript support to brunch.","dist-tags":{"latest":"1.4.1"},"versions":{"1.2.0":{"name":"LiveScript-brunch","version":"1.2.0","description":"Adds LiveScript support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.3"},"devDependencies":{"mocha":"0.12.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"LiveScript-brunch@1.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5dbd7ac807eba1de2b60b326d8b6f57a14a6895b","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.2.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.0":{"name":"LiveScript-brunch","version":"1.3.0","description":"Adds [LiveScript](http://gkz.github.com/LiveScript/) support to","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"rm -rf lib && coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.9","prelude-ls":"0.4.0"},"devDependencies":{"mocha":"0.12.1","expect.js":"0.1.2"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.3.0","dist":{"shasum":"a625a4439902dc01f35636d0564cd849fe2d921e","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.3.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.1":{"name":"LiveScript-brunch","version":"1.3.1","description":"Adds [LiveScript](http://gkz.github.com/LiveScript/) support to","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"rm -rf lib && coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.9","prelude-ls":"0.4.0"},"devDependencies":{"mocha":"0.12.1","expect.js":"0.1.2"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.3.1","dist":{"shasum":"871061d482ee5fb14333030fc69c3ae506459133","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.3.1.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.2":{"name":"LiveScript-brunch","version":"1.3.2","description":"Adds [LiveScript](http://gkz.github.com/LiveScript/) support to","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"rm -rf lib && coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.9"},"devDependencies":{"mocha":"0.12.1","expect.js":"0.1.2"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.3.2","dist":{"shasum":"fcc04aad6616722892ff923b568d8b2e2fd63b94","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.3.2.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.3":{"name":"LiveScript-brunch","version":"1.3.3","description":"Adds LiveScript support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.10"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.3.3","dist":{"shasum":"aba546b70dde856fb6ad1db72f8052721dad77ae","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.3.3.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.4":{"name":"LiveScript-brunch","version":"1.3.4","description":"Adds LiveScript support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.12"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.3.4","dist":{"shasum":"2b3f0006d2c94b458638ed9a75def2ab149e8b16","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.3.4.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.4.0":{"name":"LiveScript-brunch","version":"1.4.0","description":"Adds LiveScript support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"0.9.12"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.4.0","dist":{"shasum":"042a77d5973146d8ee6d8935aeffa9ee882b3ad9","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.4.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.4.1":{"name":"LiveScript-brunch","version":"1.4.1","description":"Adds LiveScript support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/LiveScript-brunch","repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","LiveScript":"1.0.0"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","_id":"LiveScript-brunch@1.4.1","dist":{"shasum":"d4cef8e1cc0218adf5b39b7efa94cb91b9c146ec","tarball":"http://registry.npmjs.org/LiveScript-brunch/-/LiveScript-brunch-1.4.1.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]}},"readme":"## LiveScript-brunch\nAdds [LiveScript](http://gkz.github.com/LiveScript/) support to\n[brunch](http://brunch.io).\n\n## Usage\nAdd `\"LiveScript-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"LiveScript-brunch\": \"git://github.com/brunch/LiveScript-brunch.git\"`.\n","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-08-03T19:13:27.224Z","created":"2012-05-21T17:16:07.121Z","1.2.0":"2012-05-21T17:16:09.371Z","1.3.0":"2012-06-22T15:36:20.421Z","1.3.1":"2012-06-22T15:44:09.825Z","1.3.2":"2012-06-22T16:07:09.248Z","1.3.3":"2012-06-29T14:19:21.976Z","1.3.4":"2012-07-16T14:59:53.055Z","1.4.0":"2012-07-16T21:29:16.940Z","1.4.1":"2012-08-03T19:13:27.224Z"},"author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"repository":{"type":"git","url":"git@github.com:brunch/LiveScript-brunch.git"},"_attachments":{"LiveScript-brunch-1.4.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-xO9wNr9vVouPC8nMlVS+Ow==","length":6024,"stub":true},"LiveScript-brunch-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-oUm1sXjGFyuhKF66Nr3TdQ==","length":5875,"stub":true},"LiveScript-brunch-1.3.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-alBvPyn5BJSTiuu/iSweJg==","length":6586,"stub":true},"LiveScript-brunch-1.3.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-f+zVb5XXJXBR0qeBR8wEAw==","length":6568,"stub":true},"LiveScript-brunch-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pQczhVjnxBAgtd2GwXFOdg==","length":5165,"stub":true},"LiveScript-brunch-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2D6NqlEBfrgiRVn8L9rkAg==","length":2379,"stub":true},"LiveScript-brunch-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-i+Wm64mVjB4DkUwdAjAVkg==","length":2361,"stub":true},"LiveScript-brunch-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9+lcMfggN6UxhWBgflo0xg==","length":2098,"stub":true}}}},
{"id":"LiveView","key":"LiveView","value":{"rev":"3-9ea41eaa809ec210ff16159fbd110fda"},"doc":{"_id":"LiveView","_rev":"3-9ea41eaa809ec210ff16159fbd110fda","name":"LiveView","description":"Living DOM templates","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"LiveView","description":"Living DOM templates","version":"0.0.1","author":{"name":"Mukari","email":"dev@mukari.com"},"dependencies":{"underscore":"1.2.3"},"engine":"node >= 0.4.1","_npmUser":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_id":"LiveView@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"56788203bfd2407f8112dc7d21acd478551e8a13","tarball":"http://registry.npmjs.org/LiveView/-/LiveView-0.0.1.tgz"},"readme":"","maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}]}},"readme":"","maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}],"time":{"modified":"2012-04-13T10:27:15.237Z","created":"2012-04-13T10:27:14.396Z","0.0.1":"2012-04-13T10:27:15.237Z"},"author":{"name":"Mukari","email":"dev@mukari.com"},"_attachments":{"LiveView-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bcbh2aQ/LjjVRdeCms+kSw==","length":10071,"stub":true}}}},
{"id":"Loggy","key":"Loggy","value":{"rev":"33-e115c25163ab468314eedbe497d1c51e"},"doc":{"_id":"Loggy","_rev":"33-e115c25163ab468314eedbe497d1c51e","name":"Loggy","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"Loggy","version":"0.0.1","description":"Loggy is simple express server for remote logging with simple api and websockets.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f9d1891a2578be47af992c8da5057077481e11de","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.1.tgz"}},"0.0.2":{"name":"Loggy","version":"0.0.2","description":"Loggy is simple express server for remote logging with simple api and websockets.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"46909f0078809c2ed879f367ec1a014b132d193b","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.2.tgz"}},"0.0.3":{"name":"Loggy","version":"0.0.3","description":"Loggy is simple express server for remote logging with simple api and websockets.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1fcb0de9342f47670af6f56513956b91f8b12ec8","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.3.tgz"}},"0.0.4":{"name":"Loggy","version":"0.0.4","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.4","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3cbea30e3306cb702b010d4ffae8b7e2631d32b5","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.4.tgz"}},"0.0.5":{"name":"Loggy","version":"0.0.5","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.5","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cbea90fafef82e930cb73a275643587b52bade93","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.5.tgz"}},"0.0.6":{"name":"Loggy","version":"0.0.6","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.6","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c8a5fffc2fd76bff171a99bd7db87bd5f47d26fe","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.6.tgz"}},"0.0.7":{"name":"Loggy","version":"0.0.7","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.2.x"},"_id":"Loggy@0.0.7","_engineSupported":false,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"58df6a146c9ac80b96e11e1efa9dce6927a30ffd","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.7.tgz"}},"0.0.8":{"name":"Loggy","version":"0.0.8","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"1.0.8","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.2.x"},"_id":"Loggy@0.0.8","_engineSupported":false,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"536368e7601914dd230c77298c190b36cfc72be4","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.8.tgz"}},"0.0.9":{"name":"Loggy","version":"0.0.9","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.0.9","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","dist":{"shasum":"8623dabae2222ce56709d94b3db564b3e634960d","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.0.9.tgz"}},"0.1.0":{"name":"Loggy","version":"0.1.0","description":"Loggy is simple express server for remote logging with REST API and Wordpress plugin.","keywords":["logging","app"],"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"dependencies":{"express":"2.2.2","now":"0.5.1","jade":"0.10.4","less":"1.0.41"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"main":"index","engines":{"node":"0.4.x"},"_id":"Loggy@0.1.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a29bcaf04c3f06c4ed59e3b265c90fe2b14311a2","tarball":"http://registry.npmjs.org/Loggy/-/Loggy-0.1.0.tgz"}}},"maintainers":[{"name":"dz0ny","email":"janez.troha@gmail.com"}],"time":{"modified":"2011-05-07T19:59:59.309Z","created":"2011-04-14T19:40:48.711Z","0.0.1":"2011-04-14T19:40:49.193Z","0.0.2":"2011-04-14T19:43:38.134Z","0.0.3":"2011-04-14T19:57:27.889Z","0.0.4":"2011-04-14T20:50:06.781Z","0.0.5":"2011-04-14T21:15:45.684Z","0.0.6":"2011-04-15T12:32:52.639Z","0.0.7":"2011-05-07T17:45:23.708Z","0.0.8":"2011-05-07T17:47:35.777Z","0.0.9":"2011-05-07T17:53:38.106Z","0.1.0":"2011-05-07T19:59:59.309Z"},"author":{"name":"Janez Troha","email":"janez.troha@gmail.com"},"repository":{"type":"git","url":"git://github.com/dz0ny/Loggy.git"},"_attachments":{"Loggy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-qLtR+P7zzJOj/6jnCHgDkg==","length":4724,"stub":true},"Loggy-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-Jfnid64xUC5eDofJ5tzWLg==","length":4434,"stub":true},"Loggy-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-IhZzWJqjdxbLlUHPwY9Jnw==","length":4429,"stub":true},"Loggy-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-egYFagatDbRi57K9Z9NL1Q==","length":4432,"stub":true},"Loggy-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-7FiopJ07lixkl2drdP9+vA==","length":7612,"stub":true},"Loggy-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-tFGaksGalWvSAV4vwqTvMA==","length":7438,"stub":true},"Loggy-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-oP8i2pX1kqLOVhktZXG9vw==","length":7277,"stub":true},"Loggy-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-O2aK41epCNhz6PhAlrFm7g==","length":6950,"stub":true},"Loggy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XA1s6yLQUW2+lLTcLGPSzg==","length":3843,"stub":true},"Loggy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bamewKB1DC/m9+8rLBvUMA==","length":3801,"stub":true}}}},
{"id":"Lumenize","key":"Lumenize","value":{"rev":"11-76f04d56cec1f4e527a9ef60fb5faf79"},"doc":{"_id":"Lumenize","_rev":"11-76f04d56cec1f4e527a9ef60fb5faf79","name":"Lumenize","description":"Illuminating the forest AND the trees in your data.","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"name":"Lumenize","main":"./src/index","description":"Illuminating the forest AND the trees in your data.","keywords":["charting","chart","infographics","software engineering","date","time"],"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"version":"0.1.0","homepage":"https://github.com/lmaccherone/Lumenize","engines":{"node":">=0.4.10"},"dependencies":{"coffee-script":">=1.1.1"},"repository":{"type":"git","url":"git://github.com/lmaccherone/Lumenize.git"},"preferGlobal":true,"devDependencies":{"coffeedoctest":">=0.1.0"},"_npmUser":{"name":"lmaccherone","email":"Larry@Maccherone.com"},"_id":"Lumenize@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"0476aed6ab83a74f4443ea1457cb81b1c5a1a4cc","tarball":"http://registry.npmjs.org/Lumenize/-/Lumenize-0.1.0.tgz"},"maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}]},"0.2.0":{"name":"Lumenize","main":"./src/lumenize","description":"Illuminating the forest AND the trees in your data.","keywords":["charting","chart","infographics","software engineering","date","time"],"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"version":"0.2.0","homepage":"https://github.com/lmaccherone/Lumenize","engines":{"node":">=0.4.10"},"dependencies":{"coffee-script":">=1.1.1"},"repository":{"type":"git","url":"git://github.com/lmaccherone/Lumenize.git"},"preferGlobal":true,"devDependencies":{"coffeedoctest":">=0.1.0"},"_npmUser":{"name":"lmaccherone","email":"Larry@Maccherone.com"},"_id":"Lumenize@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"1600b94bdf47de8c3b1949ae165ce74bb7ae5ad4","tarball":"http://registry.npmjs.org/Lumenize/-/Lumenize-0.2.0.tgz"},"maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}]},"0.2.1":{"name":"Lumenize","version":"0.2.1","main":"./src/lumenize","description":"Illuminating the forest AND the trees in your data.","keywords":["charting","chart","infographics","software engineering","date","time"],"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"homepage":"https://github.com/lmaccherone/Lumenize","engines":{"node":">=0.4.10"},"dependencies":{"coffee-script":">=1.1.1"},"repository":{"type":"git","url":"git://github.com/lmaccherone/Lumenize.git"},"preferGlobal":true,"devDependencies":{"coffeedoctest":">=0.3.0","coffeedoc":">=0.1.12","uglify-js":">=1.2.5","nodeunit":">=0.6.4","browserify":">=1.9.3"},"_npmUser":{"name":"lmaccherone","email":"Larry@Maccherone.com"},"_id":"Lumenize@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4d828856cf8be4a8f5b4aafb6422140e31cc169b","tarball":"http://registry.npmjs.org/Lumenize/-/Lumenize-0.2.1.tgz"},"maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}]},"0.2.3":{"name":"Lumenize","version":"0.2.3","main":"./src/lumenize","description":"Illuminating the forest AND the trees in your data.","keywords":["charting","chart","infographics","software engineering","date","time"],"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"homepage":"https://github.com/lmaccherone/Lumenize","engines":{"node":">=0.4.10"},"dependencies":{"coffee-script":">=1.1.1"},"repository":{"type":"git","url":"git://github.com/lmaccherone/Lumenize.git"},"preferGlobal":true,"devDependencies":{"coffeedoctest":">=0.3.0","uglify-js":">=1.2.5","nodeunit":">=0.6.4","browserify":">=1.9.3"},"_npmUser":{"name":"lmaccherone","email":"Larry@Maccherone.com"},"_id":"Lumenize@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"644205b3ad4ab4d0042b50aaa5b4a69306ff5396","tarball":"http://registry.npmjs.org/Lumenize/-/Lumenize-0.2.3.tgz"},"maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}]},"0.2.5":{"name":"Lumenize","version":"0.2.5","main":"./src/lumenize","description":"Illuminating the forest AND the trees in your data.","keywords":["charting","chart","infographics","software engineering","date","time"],"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"homepage":"https://github.com/lmaccherone/Lumenize","engines":{"node":">=0.4.10"},"dependencies":{"coffee-script":">=1.1.1"},"repository":{"type":"git","url":"git://github.com/lmaccherone/Lumenize.git"},"preferGlobal":true,"devDependencies":{"coffeedoctest":">=0.3.0","uglify-js":">=1.2.5","nodeunit":">=0.6.4","browserify":">=1.9.3"},"_npmUser":{"name":"lmaccherone","email":"Larry@Maccherone.com"},"_id":"Lumenize@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"0fc3c83bbef58f6fd2e155e851b92f5394fe1409","tarball":"http://registry.npmjs.org/Lumenize/-/Lumenize-0.2.5.tgz"},"maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}]}},"readme":"# Lumenize #\n\nCopyright (c) 2009-2012, Lawrence S. Maccherone, Jr.\n\n_Illuminating the forest AND the trees in your data._\n\n## Features ##\n\n* Implementation of DSL and visualization patterns from Larry Maccherone's PhD\n* Hierarchical OLAP cubes\n* Date-time precision optimized for charting: timezone manipulation (eg America/New_York), knockout weekends/holidays,\n  non-workhours, work in any granularity (year, quarter, week, day, hour, etc.), etc.\n* Tested\n* Documented\n* [DocTested](https://github.com/lmaccherone/coffeedoctest)\n\n## Credits ##\n\nAuthors:\n\n* [Larry Maccherone](http://maccherone.com) (Larry @at@ Maccherone .dot. com)\n* Jennifer Maccherone\n\nRunning:\n\n* [timezoneJS](https://github.com/mde/timezone-js) - library for [tz](http://www.twinsun.com/tz/tz-link.htm) parsing\n* [Node.js](http://nodejs.org/)\n* [CoffeeScript](http://coffeescript.org/)\n\nDeveloping/Documenting:\n\n* [coffeedoc](https://github.com/lmaccherone/coffeedoc) (Larry Maccherone's fork) forked from [coffeedoc](https://github.com/omarkhan/coffeedoc)\n* [coffeedoctest](https://github.com/lmaccherone/coffeedoctest) (by Larry Maccherone)\n* [nodeunit](https://github.com/caolan/nodeunit)\n\n## Installation and developing ##\n\nTo install in the node_modules directory of your project, run the following from the root folder of your project:\n\n`npm install Lumenize`\n    \nTo install globally:\n\n`sudo npm install -g Lumenize`\n    \nOr if you want the latest from source, download/clone from GitHub and run:\n\n`cake install`\n    \nIf you want to add functionality to Lumenize and submit a pull request, add tests for your upgrades and make sure all test pass with:\n\n`cake test`\n    \nAlso, add examples in the \"docstrings\", then generate the docs (which will also confirm that the examples give the expected output when run):\n\n`cake docs`\n    \n## Documentation and source code ##\n\n* [API Documentation](http://lmaccherone.github.com/Lumenize/docs/index.html)\n* [Source Repository](https://github.com/lmaccherone/Lumenize)\n\n\n\n\n\n\n\n\n\n\n","maintainers":[{"name":"lmaccherone","email":"Larry@Maccherone.com"}],"time":{"modified":"2012-04-01T18:59:01.123Z","created":"2012-02-28T23:54:03.221Z","0.1.0":"2012-02-28T23:54:06.241Z","0.2.0":"2012-03-10T18:39:16.666Z","0.2.1":"2012-03-11T22:50:49.086Z","0.2.3":"2012-03-29T00:57:52.248Z","0.2.5":"2012-04-01T18:59:01.123Z"},"author":{"name":"Larry Maccherone","url":"http://maccherone.com"},"repository":{"type":"git","url":"git://github.com/lmaccherone/Lumenize.git"},"_attachments":{"Lumenize-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9yLMWvmZwfrfM3NOLLsj+A==","length":481413,"stub":true},"Lumenize-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-AGq+ARe6Ah/Hqxrt+SkM4g==","length":481393,"stub":true},"Lumenize-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nnitjfllJzIOg0/E2keKHw==","length":479824,"stub":true},"Lumenize-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OGwXu3uu4Yk93tXGoYyhbg==","length":479699,"stub":true},"Lumenize-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0xNNI1pMjCH0uEeFI04T2g==","length":358303,"stub":true}}}},
{"id":"MD5","key":"MD5","value":{"rev":"6-36ac427594906a6cc224a049159ba331"},"doc":{"_id":"MD5","_rev":"6-36ac427594906a6cc224a049159ba331","name":"MD5","description":"function for hashing messages with MD5","dist-tags":{"latest":"1.0.0","stable":"1.0.0"},"versions":{"0.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"MD5","description":"function for hashing messages with MD5","tags":["md5","hash","encryption"],"version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-md5.git"},"bugs":{"url":"https://github.com/pvorb/node-md5/issues"},"main":"md5.js","engines":{"node":"*"},"dependencies":{"charenc":">=0.0.1","crypt":">=0.0.1"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"MD5@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"0ecaa322a1b3a83fe39ec04a3dac6d3d452679ab","tarball":"http://registry.npmjs.org/MD5/-/MD5-0.0.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"1.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"MD5","description":"function for hashing messages with MD5","tags":["md5","hash","encryption"],"version":"1.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-md5.git"},"bugs":{"url":"https://github.com/pvorb/node-md5/issues"},"main":"md5.js","engines":{"node":"*"},"dependencies":{"charenc":">=0.0.1","crypt":">=0.0.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"MD5@1.0.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a22f5d2d12d012c845a514a1710436de78ba3f09","tarball":"http://registry.npmjs.org/MD5/-/MD5-1.0.0.tgz"},"readme":"# MD5\n\na JavaScript function for hashing messages with MD5.\n\n**Warning:** This is the source repository for the npm package\n[MD5](http://search.npmjs.org/#/MD5), not [md5](http://search.npmjs.org/#/md5).\n\n## Installation\n\nYou can use this package on the server side as well as the client side.\n\n### [Node.js](http://nodejs.org/):\n\n```\nnpm install MD5\n```\n\n### [Ender](http://ender.no.de/):\n\n```\nender build MD5\n```\n\n## Usage\n\n```javascript\nvar md5 = require('MD5');\n\nconsole.log(md5(\"message\"));\n```\n\nThis will print:\n\n```\n78e731027d8fd50ed642340b7c9a63b3\n```\n\n## Bugs and Issues\n\nIf you encounter any bugs or issues, feel free to open an issue at\n[github](https://github.com/pvorb/node-md5/issues).\n\n## Credits\n\nThis package is based on the work of Jeff Mott, who did a pure JS implementation\nof the MD5 algorithm that was published by Ronald L. Rivest in 1991. I needed a\nnpm package of the algorithm, so I used Jeff’s implementation for this package.\nThe original implementation can be found in the\n[CryptoJS](http://code.google.com/p/crypto-js/) project.\n\n## License\n\nCopyright © 2011-2012, Paul Vorbach.\nCopyright © 2009, Jeff Mott.\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this\n  list of conditions and the following disclaimer in the documentation and/or\n  other materials provided with the distribution.\n* Neither the name Crypto-JS nor the names of its contributors may be used to\n  endorse or promote products derived from this software without specific prior\n  written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"readme":null,"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-06-18T09:38:11.029Z","created":"2011-11-25T02:59:35.402Z","0.0.0":"2011-11-25T02:59:38.617Z","1.0.0":"2012-06-18T09:36:25.690Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-md5.git"},"_attachments":{"MD5-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dLFlb1lQoppn5VfnAzMxrA==","length":3550,"stub":true},"MD5-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Y13zUmJS8Wq8BD3fYD12zQ==","length":3134,"stub":true}}}},
{"id":"MQTTClient","key":"MQTTClient","value":{"rev":"3-5ddf978fe9db9f06306078815a807e49"},"doc":{"_id":"MQTTClient","_rev":"3-5ddf978fe9db9f06306078815a807e49","name":"MQTTClient","description":"An MQTT client for Node.js.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"MQTTClient","main":"./client.js","version":"0.0.1","description":"An MQTT client for Node.js.","author":{"name":"leizongmin","email":"leizongmin@gmail.com","url":"http://ucdok.com"},"repository":{"type":"git","url":"git://github.com/leizongmin/MQTTClient.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"leizongmin","email":"leizongmin@gmail.com"},"_id":"MQTTClient@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"4f68adbd8035783dff182836445a5e6f5b6a96eb","tarball":"http://registry.npmjs.org/MQTTClient/-/MQTTClient-0.0.1.tgz"},"maintainers":[{"name":"leizongmin","email":"leizongmin@gmail.com"}]}},"readme":"# MQTTClient for Node.js\n\n\nTo start before, you need to know something about MQTT, please see\n[MQTT V3.1 Protocol Specification](http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html)\n\n在使用本模块之前，你需要了解一些MQTT协议的知识，可参阅：[MQTT V3.1 协议规范](http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html)\n\n\nInstall 安装\n=================\n\n**npm install MQTTClient**\n\n\nExamples 示例\n=================\n\n```javascript\n\n\tvar MQTTClient = require('MQTTClient').Client;\n\t\n\t// if you don't assigned a client_id, will automatically assigns one\n\t// 如果没有指定client_id，则程序会自动分配一个\n\tvar options = {\n\t\tclient_id:\t'you_client_id'\n\t}\n\tvar client = new MQTTClient('localhost', 1883, options);\n\t\n\tclient.connect(function () {\n\t\t// do something if connect success\n\t\t// 在此处写连接成功后执行的代码\n\t});\n```\n\n\t\nSubscribe & Un Subscribe 订阅和退订\n=================\n\n```javascript\n\n\t// subscribe to a topic\n\t// 订阅一个主题\n\tvar options = {\n\t\tdup_flag:\t0,\n\t\tqos_level:\t0\n\t}\n\tclient.subscribe('topic_name', options, function (topic, qos_level) {\n\t\t// do something if success\n\t\t// 在此处写订阅成功后执行的代码\n\t});\n\t// Simplified:\tclient.subscribe('topic_name');\n\t// 也可以这样：\tclient.subscribe('主题');\n\t\n\t// un subscribe a topic\n\t// 退订一个主题\n\tclient.unSubscribe('topic_name', options, function (topic) {\n\t\t// do something if success\n\t\t// 在此处写退订成功后执行的代码\n\t});\n\t// Simplified:\tclient.unSubscribe('topic_name');\n\t// 也可以这样：\tclient.unSubscribe('主题');\n```\n\t\n\nPublish 发布\n=================\n\n```javascript\n\n\t// publish message to a topic\n\t// 发布一个消息到指定主题\n\tvar options = {\n\t\tdup_flag:\t0,\n\t\tqos_level:\t0,\n\t\tretain:\t\tfalse\n\t}\n\tclient.publish('topic_name', 'payload', options, function (message_id) {\n\t\t// do something if success\n\t\t// 在此处写发布成功后执行的代码\n\t});\n\t// Simplified:\tclient.publish('topic_name', 'payload');\n\t// 也可以这样：\tclient.publish('主题', '内容');\n```\t\n\t\n\t\nOther 其他\n=================\n\n```javascript\n\n\t// send a PINGREQ to keep alive, will automatically be called\n\t// 发送一个PINGREQ消息给服务器，一般情况下会自动执行\n\tclient.ping(function () {\n\t\t// do something if success\n\t\t// 在此处写服务器返回PINGRESP消息后执行的代码\n\t});\n\t\n\t// disconnect\n\t// 断开连接\n\tclient.disconnect(function () {\n\t\t// do something if success\n\t\t// 在此处写服务器断开连接后执行的代码\n\t});\n```\n\t\n\t\nEvent\n=================\n\n### connect\n\n> Connect to server success, after received a CONNACK message from the server\n\n> 当连接服务器成功，并收到CONNACK消息后，触发此事件\n\n> **Arguments**: None\n\n\n### error\n\n> Has an error\n\n> 当发生错误时触发此事件\n\n> **Arguments**: error\n\n\n### disconnect\n\n> The server close the socket connection\n\n> 当服务器断开连接时触发此事件\n\n> **Arguments**: None\n\n\n### ping\n\n> After received a PINGRESP message from the server\n\n> 当收到服务器返回的PINGRESP消息时触发此事件\n\n> **Arguments**: None\n\n\n### timeout\n\n> Not received the PINGRESP message out of **options.alive_timer** seconds\n\n> 当超过指定时间（有options.alive_timer设置）没有收到服务器返回的PINGRESP消息时触发此事件\n\n> **Arguments**: None\n\n\n### publish\n\n> Received a PUBLISH message\n\n> 当收到PUBLISH消息时触发此事件\n\n> **Arguments**:  topic, payload, message_id\n\n> 参数topic为消息的主题，payload为消息内容, message_id为消息ID\n","maintainers":[{"name":"leizongmin","email":"leizongmin@gmail.com"}],"time":{"modified":"2011-11-22T10:04:18.212Z","created":"2011-11-22T10:03:56.395Z","0.0.1":"2011-11-22T10:04:18.212Z"},"author":{"name":"leizongmin","email":"leizongmin@gmail.com","url":"http://ucdok.com"},"repository":{"type":"git","url":"git://github.com/leizongmin/MQTTClient.git"},"_attachments":{"MQTTClient-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8PwLe9EAUhurG7WIjkvVEA==","length":10240,"stub":true}}}},
{"id":"MeCab","key":"MeCab","value":{"rev":"4-2687176c7b878930e812a534976a6988"},"doc":{"_id":"MeCab","_rev":"4-2687176c7b878930e812a534976a6988","name":"MeCab","description":"MeCab C API bindings for node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"MeCab","keywords":["MeCab","Morphological Analyzer"],"description":"MeCab C API bindings for node.js","homepage":"http://github.com/mah0x211/node-mecab","version":"0.0.2","main":"./MeCab","scripts":{"install":"./install.sh"},"engines":{"node":">= 0.4.7"},"maintainers":[{"name":"mah0x211","email":"mah0x211@gmail.com"}],"repository":{"type":"git","url":"git://github.com/mah0x211/node-mecab.git"},"bugs":{"url":"http://github.com/mah0x211/node-mecab/issues"},"dependencies":{},"devDependencies":{},"_id":"MeCab@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"744a992bac59c2bf67fd0349fb82635c3236aa81","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-darwin-9.8.0":{"shasum":"207047f879ea2f969d834f927380c4ff17aa64c4","tarball":"http://registry.npmjs.org/MeCab/-/MeCab-0.0.2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-darwin-9.8.0.tgz"}},"tarball":"http://registry.npmjs.org/MeCab/-/MeCab-0.0.2.tgz"}}},"maintainers":[{"name":"mah0x211","email":"mah0x211@gmail.com"}],"time":{"modified":"2011-08-30T17:48:24.559Z","created":"2011-08-30T17:48:22.942Z","0.0.2":"2011-08-30T17:48:24.559Z"},"repository":{"type":"git","url":"git://github.com/mah0x211/node-mecab.git"},"_attachments":{"MeCab-0.0.2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-darwin-9.8.0.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-wFeU4XfA3KpBz4EbxHXwWg==","length":81126,"stub":true},"MeCab-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JAchSk/m3HMvu9Zna+vdAQ==","length":8163,"stub":true}}}},
{"id":"Mercury","key":"Mercury","value":{"rev":"3-09a6bff1332ed829bd2c37bfec244a41"},"doc":{"_id":"Mercury","_rev":"3-09a6bff1332ed829bd2c37bfec244a41","name":"Mercury","description":"A fully featured HTML5 WYSIWYG editor written in CoffeeScript","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.4":{"name":"Mercury","version":"0.1.4","description":"A fully featured HTML5 WYSIWYG editor written in CoffeeScript","homepage":"https://github.com/jejacks0n/mercury","keywords":["contenteditable","wysiwyg","wyriwyg","wywiwyg"],"author":{"name":"Jeremy Jackson","email":"jeremy@factorylabs.com","url":"https://github.com/jejacks0n"},"bugs":{"url":"https://github.com/jejacks0n/mercury/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/jejacks0n/mercury.git"},"dependencies":{"coffee-script":"1.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"assets"},"_id":"Mercury@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ddf2aa90b140b6379007aba59c0a9d4f87b15958","tarball":"http://registry.npmjs.org/Mercury/-/Mercury-0.1.4.tgz"},"scripts":{}}},"maintainers":[{"name":"jejacks0n","email":"jejacks0n@gmail.com"}],"time":{"modified":"2011-07-01T19:47:22.703Z","created":"2011-07-01T19:47:22.391Z","0.1.4":"2011-07-01T19:47:22.703Z"},"author":{"name":"Jeremy Jackson","email":"jeremy@factorylabs.com","url":"https://github.com/jejacks0n"},"repository":{"type":"git","url":"git://github.com/jejacks0n/mercury.git"},"_attachments":{"Mercury-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RGzAHND70lBHM7oxryp9bw==","length":181363,"stub":true}}}},
{"id":"Mers","key":"Mers","value":{"rev":"5-7fe27271175213161f8303b9fedfbd13"},"doc":{"_id":"Mers","_rev":"5-7fe27271175213161f8303b9fedfbd13","name":"Mers","dist-tags":{"latest":"0.3.8"},"versions":{"0.3.5":{"name":"Mers","version":"0.3.5","private":false,"author":{"name":"Justin Spears","email":"speajus@gmail.com"},"dependencies":{"mongoose":">= 2.5.7","underscore":">=1.3.1"},"devDependencies":{"express":">= 2.5.8","mocha":"latest","should":"latest"},"scripts":{"test":"./node_modules/mocha/bin/mocha --reporter spec test/*-mocha.js"},"keywords":["framework","json","express","mongoose","rest","restful"],"repository":{"type":"git","url":"git@github.com:jspears/mers"},"_npmUser":{"name":"speajus","email":"speajus@gmail.com"},"_id":"Mers@0.3.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"aaa4d92d57219ad9d4d6576a2183d0b8a5eb7833","tarball":"http://registry.npmjs.org/Mers/-/Mers-0.3.5.tgz"},"maintainers":[{"name":"speajus","email":"speajus@gmail.com"}]},"0.3.8":{"name":"Mers","version":"0.3.8","private":false,"author":{"name":"Justin Spears","email":"speajus@gmail.com"},"dependencies":{"mongoose":">= 2.5.7","underscore":">=1.3.1"},"devDependencies":{"express":">= 2.5.8","mocha":"latest","should":"latest"},"scripts":{"test":"./node_modules/mocha/bin/mocha --reporter spec test/*-mocha.js"},"keywords":["framework","json","express","mongoose","rest","restful"],"repository":{"type":"git","url":"git@github.com:jspears/mers"},"_npmUser":{"name":"speajus","email":"speajus@gmail.com"},"_id":"Mers@0.3.8","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f3351bf70b71ce6c291a94a6b3897a7bf0c17e57","tarball":"http://registry.npmjs.org/Mers/-/Mers-0.3.8.tgz"},"maintainers":[{"name":"speajus","email":"speajus@gmail.com"}]}},"readme":"#Mers\n *_Mongoose\n *_Express\n *_Rest\n *_Service\n \n    Mers is a plugin for express to expose mongoose finders as simple crud/rest operations.  The\n    basic idea being you should just define your model and your finders and the rest should be be magic.\n\n\n## Usage [usage]\n```javascript\n    var mers = require('mers');\n    app.use('/rest', mers({uri:'mongodb://localhost/rest_example_prod'}).rest());\n```\nConfiguration options include\n     uri:\n     mongoose:mongoose, //your mongoose instance.\n     [error][error]:function //your custom error handler.\n     responseStream:function //your custom respost stream See: lib/streams.js\n     transformer:function //your custom transformer factory\n\n\n###If you had a schema such as\n   ```javascript\nvar mongoose = require('mongoose'), Schema = mongoose.Schema,\n    ObjectId = mongoose.Schema.ObjectId;\n\nvar CommentSchema = new Schema({\n    title:String, body:String, date:Date\n});\n\n\nvar BlogPostSchema = new Schema({\n    author:ObjectId, title:String, body:String, buf:Buffer, date:Date, comments:[CommentSchema], meta:{\n        votes:Number, favs:Number\n    }\n});\n/**\n * Note this must return a query object.   If it doesn't well, I dunno what it'll do.\n * @param q\n * @param term\n */\nBlogPostSchema.statics.findTitleLike = function findTitleLike(q, term) {\n    return this.find({'title':new RegExp(q.title || term, 'i')});\n}\nvar Comment = module.exports.Comment = mongoose.model('Comment', CommentSchema);\nvar BlogPost = module.exports.BlogPost = mongoose.model('BlogPost', BlogPostSchema);\n```\n\nyou could then access it at\n    listing.\n    \n    http://localhost:3000/rest/blogpost/\n    http://localhost:3000/rest/blogpost/$id\n    http://localhost:3000/rest/blogpost/$id/comments\n    http://localhost:3000/rest/blogpost/$id/comments/$id\n    http://localhost:3000/rest/blogpost/$id/comments/0\n  \n###Pagination\nPagination is also supported via skip= and limit= query params.\n\n    http://localhost:3000/rest/blogpost/$id?skip=10&limit=10\n\n###Population\nMongoose populate is supported, but this will be changing shortly to allow for more\nfine grained controll over population.  Currently you can do\n\n    http://localhost:3000/rest/blogpost?populate=comments\n\nor to specify particular fields.\n\n    http://localhost:3000/rest/blogpost?skip=10&populate[comments]=title,date\n\n\n\n###Filter\nFiltering is available for strings. To find all the blog posts with C in the title.\n\n    http://localhost:3000/rest/blogpost?filter[title]=C\n\nTo filter all String fields that have a C in them\n\n    http://localhost:3000/rest/blogpost?filter=C\n\n\n###Sorting\nSorting is supported 1 ascending -1 ascending.\n\n  http://localhost:3000/rest/blogpost?sort=title:1,date:-1\n\n###Transformer\nTransformers can be registered on startup.  A simple TransformerFactory is\nincluded.  Something that takes security into account could be added.  Currently\nthis is only supported on the get operations.   May change the responses to post\nto send location, though I find that pretty inconvient.\n\n\n```javascript\n\napp.use('/rest', require('mers').rest({\n    mongoose:mongoose,\n    transformers:{\n           renameid:function(Model, label){\n            //do some setup but return function.\n              return function(obj){\n                obj.id = obj._id;\n                delete obj._id;\n                //don't forget to return the object.  Null will filter it from the results.\n                return obj;\n              }\n           }\n      }\n    }));\n}\n```\n\nto get results transformered just add\n\n     http://localhost:3000/rest/blogpost?transform=renameid\n\n\n\nIt handles  get/put/post/delete I'll add some docs on that some day, but pretty much as you expect, or I expect anyways.\nsee tests/routes-mocha.js for examples.\n\n###Static Finders\nIt should also be able to be used with Class finders. Now handles class finders. Note: They must return  a query object.\nThey are passed the query object and the rest of the url. All of the populate's, filters, transforms should work.\n\n```javascript\n\n/**\n * Note this must return a query object.\n * @param q\n * @param term\n */\nBlogPostSchema.statics.findTitleLike = function findTitleLike(q, term) {\n    return this.find({'title':new RegExp(q.title || term, 'i')});\n}\n\n```\n\nSo you can get the url\n\n    http://localhost:3000/rest/blogpost/finder/findTitleLike?title=term\n\nor\n\n    http://localhost:3000/rest/blogpost/finder/findTitleLike/term\n\n### [Error Handling][error]\nTo create a custom error handler\n\n```javascript\n\n   app.use('/rest, rest({\n         error : function(err, req, res, next){\n               res.send({\n                   status:1,\n                   error:err && err.message\n               });\n           }).rest());\n\n```\n\n### Custom Transformers\nYou can transform your results by adding a custom transformer and or adding a new TransformerFactory\n\n```javascript\n\n   app.use('/rest, rest({\n         transformers :{\n          cooltranform:function(Model, label){\n             return function(obj){\n                    obj.id = obj._id;\n                    delete obj._id;\n                    return obj; //returning null removes it from the output\n             }\n          } }).rest());\n\n```\n\n### Custom ResultStream\nYou can create your own result stream. It needs to subclass Stream be writable.\n\n\n##Examples.\nAn example of a customized rest service can be found at\n\n    https://github.com/jspears/backbone-directory\n","maintainers":[{"name":"speajus","email":"speajus@gmail.com"}],"time":{"modified":"2012-03-17T21:04:53.348Z","created":"2012-02-29T03:56:14.819Z","0.3.5":"2012-02-29T03:56:15.343Z","0.3.8":"2012-03-17T21:04:53.348Z"},"author":{"name":"Justin Spears","email":"speajus@gmail.com"},"repository":{"type":"git","url":"git@github.com:jspears/mers"},"_attachments":{"Mers-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-deodaJDhUZg4/CtSzvjRKQ==","length":16005,"stub":true},"Mers-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ahx4xuc5+3aJOAM+du7xzw==","length":12682,"stub":true}}}},
{"id":"Meteor-Test-Installer","key":"Meteor-Test-Installer","value":{"rev":"4-eab89dfa26034516c55fb2c885c86d30"},"doc":{"_id":"Meteor-Test-Installer","_rev":"4-eab89dfa26034516c55fb2c885c86d30","name":"Meteor-Test-Installer","description":"Dear Meteor-Test-Installer user, a MSI installer that installs the latest Meteor version is now available: https://dl.dropbox.com/s/8g6o0edqhqmzly1/Meteor.msi?dl=1 Please note that the Meteor-Test-Installer itself will soon no longer be available and that the MSI installer will be the preferred installation method.","dist-tags":{"latest":"0.3.6"},"versions":{"0.3.6":{"name":"Meteor-Test-Installer","version":"0.3.6","description":"Dear Meteor-Test-Installer user, a MSI installer that installs the latest Meteor version is now available: https://dl.dropbox.com/s/8g6o0edqhqmzly1/Meteor.msi?dl=1 Please note that the Meteor-Test-Installer itself will soon no longer be available and that the MSI installer will be the preferred installation method.","keywords":["meteor","web"],"homepage":"http://meteor.com","bugs":{"email":"contact@meteor.com","url":"https://github.com/meteor/meteor/issues"},"people":[{"name":"Geoff Schmidt (http://twitter.com/immir)"},{"name":"Matt DeBergalis (http://twitter.com/debergalis)"},{"name":"Nick Martin (http://twitter.com/n1mmy)"},{"name":"David Greenspan (http://twitter.com/DavidLG)"}],"repository":{"type":"git","url":"git://github.com/meteor/meteor.git"},"engines":{"node":"~0.6.18"},"dependencies":{},"scripts":{"preinstall":"node ./npm/preinstall.js"},"_npmUser":{"name":"TomWij","email":"TomWij@live.com"},"_id":"Meteor-Test-Installer@0.3.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"aac08f8c496b7075e4ade55786f32aede97481ac","tarball":"http://registry.npmjs.org/Meteor-Test-Installer/-/Meteor-Test-Installer-0.3.6.tgz"},"readme":"","maintainers":[{"name":"TomWij","email":"TomWij@live.com"}],"directories":{},"deprecated":"A MSI installer that installs the latest Meteor version is now available: https://dl.dropbox.com/s/8g6o0edqhqmzly1/Meteor.msi?dl=1 Note that you need to start CMD / Bash as administrator or reboot for it to catch the environment changes. On Windows 8, you will need to set node.exe in Meteor/bin to Windows 7 compatibility mode."}},"readme":"","maintainers":[{"name":"TomWij","email":"TomWij@live.com"}],"time":{"modified":"2012-06-17T01:09:07.406Z","created":"2012-06-15T12:46:32.137Z","0.3.6":"2012-06-15T12:46:33.789Z"},"repository":{"type":"git","url":"git://github.com/meteor/meteor.git"},"_attachments":{"Meteor-Test-Installer-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IixL2alU6vwEfIOdP/Wv4A==","length":3671,"stub":true}}}},
{"id":"Miketastic","key":"Miketastic","value":{"rev":"3-66c0f590aa1c9fa0bfc639192d234a19"},"doc":{"_id":"Miketastic","_rev":"3-66c0f590aa1c9fa0bfc639192d234a19","name":"Miketastic","description":"Really cool stuff","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Mike Scalora","email":"npm@scalora.net","url":"http://home.scalora.org/"},"name":"Miketastic","description":"Really cool stuff","version":"0.1.0","main":"lib/index","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"mscalora","email":"mike@scalora.org"},"_id":"Miketastic@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f77d8fbddfab1abee816392b0e8c19cebbf9b119","tarball":"http://registry.npmjs.org/Miketastic/-/Miketastic-0.1.0.tgz"},"readme":"","maintainers":[{"name":"mscalora","email":"mike@scalora.org"}]}},"readme":"","maintainers":[{"name":"mscalora","email":"mike@scalora.org"}],"time":{"modified":"2012-05-05T21:13:19.569Z","created":"2012-05-05T21:13:18.673Z","0.1.0":"2012-05-05T21:13:19.569Z"},"author":{"name":"Mike Scalora","email":"npm@scalora.net","url":"http://home.scalora.org/"},"_attachments":{"Miketastic-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NQy+e17d/Zrxus+KomTB6A==","length":335,"stub":true}}}},
{"id":"MiniMVC","key":"MiniMVC","value":{"rev":"3-53f018d584c1d7a6b55835dc57fafd44"},"doc":{"_id":"MiniMVC","_rev":"3-53f018d584c1d7a6b55835dc57fafd44","name":"MiniMVC","description":"A lightweight MVC app that excels at code organization","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"MiniMVC","description":"A lightweight MVC app that excels at code organization","version":"0.0.1","author":{"name":"Jakob Heuser","email":"jakob@felocity.com"},"homepage":"https://github.com/jakobo/MiniMVC","keywords":["mvc","lightweight","organize"],"main":"minimvc.js","repository":{"type":"git","url":"git://github.com/Jakobo/MiniMVC.git"},"dependencies":{"seq":"0.3.3"},"engine":"node >= 0.4.10","_npmJsonOpts":{"file":"/Users/jheuser/.npm/MiniMVC/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"MiniMVC@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c18e51c71591eb0399f495db0f6c590c14546b08","tarball":"http://registry.npmjs.org/MiniMVC/-/MiniMVC-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"jakobo","email":"jakob@felocity.com"}]}},"maintainers":[{"name":"jakobo","email":"jakob@felocity.com"}],"time":{"modified":"2011-10-09T17:09:15.732Z","created":"2011-10-09T17:09:14.455Z","0.0.1":"2011-10-09T17:09:15.732Z"},"author":{"name":"Jakob Heuser","email":"jakob@felocity.com"},"repository":{"type":"git","url":"git://github.com/Jakobo/MiniMVC.git"},"_attachments":{"MiniMVC-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JTdtFrHM+ThKbC5aWwd4tQ==","length":4020,"stub":true}}}},
{"id":"Mockery","key":"Mockery","value":{"rev":"26-d955bbf7e615b609ba3b1e677c1946a7"},"doc":{"_id":"Mockery","_rev":"26-d955bbf7e615b609ba3b1e677c1946a7","name":"Mockery","description":"A mocking function for unit testing","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"Mockery","description":"A simple mocking function for unit testing","version":"0.1.0","author":{"name":"Nathan MacInnes","email":"nathan@macinn.es"},"repository":{"type":"git","url":"git://github.com/nathanmacinnes/Mockery.git"},"keywords":["tdd","unit","testing","tests","mock","stub"],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"files":["Makefile","README.md","source/mockery.js","test/"],"main":"source/mockery","_npmUser":{"name":"nathanmacinnes","email":"nathan@macinn.es"},"_id":"Mockery@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"652489f9bdeeef6ddfc395ee1d8dabc64fa49fbb","tarball":"http://registry.npmjs.org/Mockery/-/Mockery-0.1.0.tgz"},"maintainers":[{"name":"nathanmacinnes","email":"nathan@macinn.es"}],"directories":{},"deprecated":"Replaced by pretendr"},"0.1.2":{"name":"Mockery","description":"A mocking function for unit testing","version":"0.1.2","author":{"name":"Nathan MacInnes","email":"nathan@macinn.es"},"repository":{"type":"git","url":"git://github.com/nathanmacinnes/Mockery.git"},"keywords":["tdd","unit","testing","tests","mock","stub"],"bugs":{"email":"nathan@macinn.es","url":"http://github.com/nathanmacinnes/Mockery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"devDependencies":{"qunit":">=0.2"},"files":["Makefile","README.md","lib/","lib/mockery.js","test/","test/runner.js","test/tests.js"],"scripts":{"test":"test/runner.js"},"directories":{"lib":"./lib","test":"./test"},"main":"lib/mockery","_npmUser":{"name":"nathanmacinnes","email":"nathan@macinn.es"},"_id":"Mockery@0.1.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"6fb40cb4d4405f18b630a3055086e5f732f033da","tarball":"http://registry.npmjs.org/Mockery/-/Mockery-0.1.2.tgz"},"maintainers":[{"name":"nathanmacinnes","email":"nathan@macinn.es"}],"deprecated":"Replaced by pretendr"}},"readme":"#MOCKERY\n_A simple JavaScript mocking function_\n\nMOCKERY will mock your objects for you. It can be used in any JavaScript\ntesting framework. It's easy.\n\n##Usage\n\n````javascript\nvar myObj = {\n    aFunction : function () {\n        // do some stuff\n    }\n};\n````\n\nThen in the browser:\n\n````javascript\nvar myMock = MOCKERY(myObj);\n````\n\nOr in node:\n\n````javascript\nvar mockery = require('mockery');\nvar myMock = mockery.mock(myObj);\n````\n\nNow `myMock.aFunction()` doesn't do stuff.\n\nMOCKERY works by creating a _deep copy_ of your object, swapping the\nfunctions for new ones which are embellished with helpful mocking features.\n\n###Return values\nTo set a return value, use `myMock.aFunction.setReturnValue('a string');`. Now\ncalling `myMock.aFunction()` returns `'a string'`. You can also pass multiple\nvalues, and the function will loop through them:\n\n````javascript\nmyMock.aFunction.setReturnValue('one', 'two', 'three');\n\nmyMock.aFunction(); // 'one'\nmyMock.aFunction(); // 'two'\nmyMock.aFunction(); // 'three'\nmyMock.aFunction(); // 'one'\n````\n\nOr use a function to set the return value:\n\n````javascript\nmyMock.aFunction.setFunction(function (arg1, arg2) {\n    if (arg1 === 'one' && arg2 === 'two') {\n        return true;\n    }\n    return false;\n});\n````\n\nOf course you could use `setFunction` to do other stuff too, but before you do,\nread the next section.\n\n###Call monitoring\nAll calls to mocked functions are recorded in the `calls` property, which is an\narray of function calls. To get the number of times a function has been called\n`myMock.aFunction.calls.length`.\n\nYou can also get the argument values of each call:\n\n````javascript\nmyMock.aFunction(\"here's an argument\", true);\nmyMock.aFunction.calls[0]; // => [\"here's an argument\", true]\n````\n\nAs a shorthand, `calls.last` is the last element of the array (ie, the most\nrecent call).\n\nSometimes, you might want to find out what a particular call returned (for\nexample, if your `setFunction` creates a new mock object. Then you can use:\n\n````javascript\nvar returnedObj = myMock.aFunction.calls[0].returned;\n````\n\nThe `returned` property is stored for every function call.\n\n###Recursion\nMOCKERY recursively mocks your objects. So if your object contains more\nobjects, they too will be mocked. If it contains an array, a new array will\nbe created and it's elements will all be mocked. Primitive values are copied\nfrom your object to the mock object, and you can change these at will.\n\n##Installation\n\n###browser\nDownload\n[mockery.js](http://github.com/nathanmacinnes/Mockery/blob/master/source/mockery.js)\nand include it in your test suite's HTML file.\n\n###node.js\nTo install via NPM, `npm install mockery`. Then include it in your test files:\n`var mockery = require('mockery.js');`.\n\nOr `git clone git://github.com/nathanmacinnes/Mockery.git`. Then\n`var mockery = require('path/to/mockery/source/mockery.js');`.\n\n##Known issues/To-do\n\n* Circular references will cause infinite recursion. Make sure there are no\ncircular references in your objects until this is fixed.\n* A class mocking interface would be nice. There're a few issues to work out\nbefore that can happen though.\n* I've just implemented including properties in the prototype chain in the\nmocks. You can do this by passing `true` as the second argument to `MOCKERY`.\nThere is huge potential for bugs in this though, because the implementation is\ncrude, so it needs to be made more robust.\n","maintainers":[{"name":"nathanmacinnes","email":"nathan@macinn.es"}],"time":{"modified":"2012-07-28T14:25:46.900Z","created":"2012-01-17T11:45:46.736Z","0.1.0":"2012-01-17T11:45:49.512Z","0.1.2":"2012-01-17T15:34:43.669Z"},"author":{"name":"Nathan MacInnes","email":"nathan@macinn.es"},"repository":{"type":"git","url":"git://github.com/nathanmacinnes/Mockery.git"},"_attachments":{"Mockery-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-kQsZRedLLI8LCcn7TtOF6w==","length":4792,"stub":true},"Mockery-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/t+1uzRYcYL6f/fO06noOA==","length":4703,"stub":true}}}},
{"id":"ModuleBinder","key":"ModuleBinder","value":{"rev":"3-33de91282d6352ea53b6f8e900e8e81d"},"doc":{"_id":"ModuleBinder","_rev":"3-33de91282d6352ea53b6f8e900e8e81d","name":"ModuleBinder","description":"This is used as a Constructor Injection pattern facilitator","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"ModuleBinder","author":{"name":"A Gurha"},"version":"0.0.1","description":"This is used as a Constructor Injection pattern facilitator","dependencies":{"mocha":"*","should":"*"},"scripts":{"tests":"mocha -r should -R spec"},"_npmUser":{"name":"agurha","email":"ankur.gurha@gmail.com"},"_id":"ModuleBinder@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"32ffb9523ef440331d87740217306e96b9142620","tarball":"http://registry.npmjs.org/ModuleBinder/-/ModuleBinder-0.0.1.tgz"},"readme":"","maintainers":[{"name":"agurha","email":"ankur.gurha@gmail.com"}]}},"readme":"","maintainers":[{"name":"agurha","email":"ankur.gurha@gmail.com"}],"time":{"modified":"2012-05-08T10:56:49.916Z","created":"2012-05-08T10:56:48.083Z","0.0.1":"2012-05-08T10:56:49.916Z"},"author":{"name":"A Gurha"},"_attachments":{"ModuleBinder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sdXC8WwyTJqbTQnncMF9DQ==","length":5433,"stub":true}}}},
{"id":"Monorail.js","key":"Monorail.js","value":{"rev":"3-8e26870033ce39257830936a77580d80"},"doc":{"_id":"Monorail.js","_rev":"3-8e26870033ce39257830936a77580d80","name":"Monorail.js","description":"Ultra lightweight MVC for Node.js","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"author":{"name":"Ryan Kelker","url":"https://github.com/runexec"},"name":"Monorail.js","description":"Ultra lightweight MVC for Node.js","version":"1.0.1","homepage":"https://github.com/runexec/Monorail.js","repository":{"type":"git","url":"git://github.com/runexec/Monorail.js.git"},"dependencies":{"express":">=2.5.8","nohm":">=0.9.0-pre2","node-native-zip":">=1.0.1"},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"monorail":"monorail.js"},"_npmUser":{"name":"runexec","email":"theinternet@yandex.com"},"_id":"Monorail.js@1.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6f506d57d34e3128c953ec814f792e23c249138a","tarball":"http://registry.npmjs.org/Monorail.js/-/Monorail.js-1.0.1.tgz"},"maintainers":[{"name":"runexec","email":"theinternet@yandex.com"}]}},"readme":"[![endorse](http://api.coderwall.com/runexec/endorsecount.png)](http://coderwall.com/runexec)\n#### Monorail.js - Ultra lightweight MVC Framework for Node.js\n\n>**TLDR; Monorail.js will never force you, and uses only what you need.** <br />\n>Monorail.js **will never force you** to install anything not needed for your project. <br />\n>The goal is to **use what you need.** <br />\n>Anything other than creating a project will **always be optional**. <br />\n>**Scaffold models in seconds**\n\n![Monorail.js Logo](https://github.com/runexec/Monorail.js/raw/master/monorail.js-small.png)\n\n\tnpm install Monorail.js\n\t\nOr start a project right now with <a href=\"https://github.com/runexec/Railing.sh\">Railing.sh</a>\n\n\t./railing.sh Project_Name\n\t\n**No configuration required.**<br />\nZero Touch Configuration to get you up and running.<br />\n\n    $ ./monorail.js new project example\n    Creating Project example\n    Making directory example\n    Making directory example/static\n    Making directory example/static/img\n    Making directory example/static/js\n    Making directory example/static/css\n    Making directory example/themes\n    Making directory example/themes/classic\n    Making directory example/themes/classic/img\n    Making directory example/themes/classic/js\n    Making directory example/themes/classic/css\n    Making directory example/models\n    Making directory example/views\n    Making file example/monorail.project\n    Making file example/routes.js\n    Making file example/redis.config\n    Making file example/themes/classic/classic.html\n    Making file example/themes/classic/css/classic.css\n    Copying libs...\n\n    $ cd example\n\n    $ cat monorail.project\n    name : example\n    theme : classic\n    express_port : 8123\n\n    $ ../monorail.js start server\n    Starting Redis...\n    Redis Running on Process 3822\n    Starting Express\n    Express Running on Process 3825\n\nCongratulations. You're DONE!<br />\n\n# Example\nLets install Mootools and RightJS\n\n\t[user@machine tmp]$ ls \n\tExample  README.md  lib  monorail.js  monorail.js-small.png  monorail.js.png  package.json\n\t\n\t[user@machine tmp]$ cd Example/\n\t\n\t[user@machine Example]$ ../monorail.js\n\tinstall [mootools | rightjs | jquery | dojo | prototype ] ; Install JS Framework in this project\n\tstart server ; Start project Redis & Express server\n\tnew project [project_name] ; Creates project\n\tnew page [page_name] ; Creates new project page\n\t\n\t[user@machine Example]$ ../monorail.js install mootools\n\t[user@machine Example]$ ../monorail.js install rightjs \n\t[user@machine Example]$ tree static/\n\tstatic/\n\t|-- css\n\t|-- img\n\t`-- js\n\t\t  |-- mootools-core-1.4.5-full-compat.js\n\t\t  `-- right-2.3.1.js\n\n\t3 directories, 2 files\n\n\nMake a new page<br />\n\n\t$ ../monorail.js new page user\n\nLets view our user view<br />\n\n\t$ cat views/user.xml \n\t<#CODE#>html_body = 'This code block takes 100% node.js code.';</#CODE#>\n\nChange it to this<br />\n\n\t<#CODE#>html_body = 'Viewing profile of '+username;</#CODE#>\n\nLets view our user model<br />\n\n\t$ cat models/user.js \n\t\n\tvar nohm = require('../lib/nohm').Nohm;\n\tvar redis = require('../lib/nohm/node_modules/redis');\n\tvar client = redis.createClient();\n\t\n\tnohm.setClient(client);\n\tnohm.model('user',{});\n\nLets add a controller to the bottom of route.js\n<br />\n\n\tapp.get('/user/:name', function(req, res) {\n\t  user = req.params.name;\n\t  view = loadView('user',{ username: user });\n\t  page = railed('Viewing User - '+user, view);\n\t  res.send(page);\n\t});\n\n\tapp.listen(express_port);\n      \nLets start the server up and point our browser to http://localhost:8123/user/any_name_here\n\n\t$ ../monorail.js start server\n\tStarting Redis...\n\tRedis Running on Process 3822\n\tStarting Express\n\tExpress Running on Process 3825\n\nThere's more examples in the wiki :)\n<a href=\"#SCAFFOLD\" name=\"SCAFFOLD\"></a>\n# Scaffolding in Node.js\n\t\t[user@machine Exampel]$ ../monorial.js generate blogpost title:string pubDate:timestamp\n\t\t[user@machine Example]$ cat models/blogpost.js\n\t\tvar nohm = require('../lib/nohm').Nohm;\n\t\tvar redis = require('../lib/nohm/node_modules/redis');\n\t\tvar client = redis.createClient();\n\n\t\tnohm.setClient(client);\n\t\tnohm.model('blogpost', {\n\t\t\t idGenerator: 'increment',\n\t\t\t properties: {\n\t\t\t\t  title: {\n\t\t\t\t     type: 'string',\n\t\t\t\t     validations: ['notEmpty']\n\t\t\t\t  },\n\t\t\t\t  pubDate: {\n\t\t\t\t     type: 'timestamp',\n\t\t\t\t     defaultValue: new Date()\n\t\t\t\t  }\n\t\t\t }\n\t\t});\n\n# What's new in version 1\n<!-- For page#section navigation purposes. -->\n<a name=\"NEW\"></a>\n\n\t\t[user@machine Monorail.js]$ ./monorail.js new project Example\n\t\tCreating Project Example\n\t\tMaking directory Example\n\t\tMaking directory Example/static\n\t\tMaking directory Example/static/img\n\t\tMaking directory Example/static/js\n\t\tMaking directory Example/static/css\n\t\tMaking directory Example/themes\n\t\tMaking directory Example/themes/classic\n\t\tMaking directory Example/themes/classic/img\n\t\tMaking directory Example/themes/classic/js\n\t\tMaking directory Example/themes/classic/css\n\t\tMaking directory Example/models\n\t\tMaking directory Example/views\n\t\tMaking file Example/monorail.project\n\t\tMaking file Example/routes.js\n\t\tMaking file Example/redis.config\n\t\tMaking file Example/themes/classic/classic.html\n\t\tMaking file Example/themes/classic/css/classic.css\n\t\tCopying libs...\n\t\t[user@machine Monorail.js]$ cd Example/\n\t\t[user@machine Example]$ ls\n\t\tlib  models  monorail.project  redis.config  routes.js  static  themes  views\n\n\t\t[user@machine Example]$ ../monorail.js \n\t\thashtree \n\t\t|_ Return a hash tree of the current project\n\n\t\tinstall [mootools | rightjs | jquery | dojo | prototype ] \n\t\t|_ Install JS Framework in this project\n\n\t\tnew model [model_name] \n\t\t|_ Creates model w/  no view\n\n\t\tnew page [page_name] \n\t\t|_ Creates new project page\n\n\t\tnew project [project_name] \n\t\t|_ Creates project\n\n\t\tnew view [view_name] \n\t\t|_ Creates view w/ no model\n\n\t\treset project \n\t\t|_ Removes files from static, models, and views\n\n\t\tsnapshot [ create | clean ] \n\t\t|_ backup your models, views, and routes\n\n\t\tstart server \n\t\t|_ Start project Redis & Express server\n\n\t\tsummary \n\t\t|_ Returns a project summary\n\n\t\tupdate \n\t\t|_ Download the latest Monorail.js (script only)\n\n\t\t[user@machine Example]$ ../monorail.js snapshot create\n\t\tSaved\n\t\t[user@machine Example]$ ls -l snapshots/\n\t\ttotal 16\n\t\t-rw-r--r-- 1 user users 3371 Mar 29 00:58 2012.03.28T15.58.43.524Z.zip\n\t\t-rw-r--r-- 1 user users 3371 Mar 29 00:58 2012.03.28T15.58.45.467Z.zip\n\t\t-rw-r--r-- 1 user users 3371 Mar 29 00:58 2012.03.28T15.58.46.133Z.zip\n\t\t-rw-r--r-- 1 user users 3371 Mar 29 00:58 2012.03.28T15.58.46.829Z.zip\n\t\t[user@machine Example]$ ../monorail.js snapshot clean\n\n\t\tWARNING: All snapshots will be DELETED!\n\t\tType continue to continue: continue\n\t\tSnapshots deleted.\n\n\t\t[user@machine Example]$ ls -l snapshots/\n\t\ttotal 0\n\t\t\n\t\t[user@machine Example]$ ../monorail.js new page home\n\t\t[user@machine Example]$ ../monorail.js new view about\n\t\t[user@machine Example]$ ../monorail.js new model user\n\t\t[user@machine Example]$ ../monorail.js summary \n\t\tviews: 2\n\t\tmodels: 2\n\t\tthemes: 1\n\t\t\n\t\t[user@machine Example]$ ../monorail.js hashtree\n\t\t./views/about.xml: 72c05ce377c77bf828f19290f6a984f3133cabbb\n\t\t./views/home.xml: 6a1f00f99f017f79d7f683e080f7ebdfa5783211\n\t\t./models/user.js: be9f2b1e2cf13d2c7ecdb65104b110593718600f\n\t\t./models/home.js: 5bd607fa91b475405f49ba6314552c0ede345e99\n\t\t./routes.js: cf579e914e61a235aab5ad25fc72d4052c42fa3d\n\t\t./redis.config: c220348239ca26abdb54651cd7f340b2a98f0e83\n\t\t./monorail.project: 958f07662d6ca27b36d744703094ed8d1e761341\n\t\t\n\t\t[user@machine Example]$ ../monorail.js reset project\n\n\t\tWARNING: All files in the views, models, and static folders will be DELETED!\n\t\tType the word continue to continue: continue\n\t\tCleaning up ./views/about.xml...\n\t\tCleaning up ./views/home.xml...\n\t\tCleaning up ./models/home.js...\n\t\tCleaning up ./models/user.js...\n\t\tYour project has been reset :)\n\t\t\n\t\t[user@machine Example]$ ../monorail.js update\n\t\tSaving to new_monorail.js\n\t\t\n\t\t[user@machine Example]$ du -hs new_monorail.js \n\t\t888K\tnew_monorail.js\n\n\n# Documentation\n<!-- For page#section navigation purposes. -->\n<a name=\"DOCS\"></a>\n\n###### Monorail.js\nhttps://github.com/runexec/Monorail.js/wiki\n\n###### JS Frameworks\nhttp://docs.jquery.com/Main_Page <br />\nhttp://mootools.net/docs/core <br />\nhttp://rightjs.org/docs<br />\nhttp://api.prototypejs.org/ <br />\nhttp://dojotoolkit.org/documentation/ \n\n###### Redis ORM\nhttp://maritz.github.com/nohm/\n\n###### Redis\nhttps://github.com/mranney/node_redis\n\n###### Express Routing, Cookies, and Sessions\nhttp://expressjs.com/guide.html#session-support <br />\nhttp://expressjs.com/guide.html#http-methods <br />\nhttp://expressjs.com/guide.html#routing <br />\nhttp://expressjs.com/guide.html#passing-route%20control <br />\nhttp://expressjs.com/guide.html#route-middleware <br />\nhttp://expressjs.com/guide.html#route-param%20pre-conditions <br />\n\t\n# Compatibility\nIt has currently only been tested on unix, but should work on windows with little or no changes.\n\nBuilt and tested with node v0.6.13<br />\nnohm ORM vs 0.9.0<br />\nexpress 2.58<br />\n\n# TODO\n<!-- For page#section navigation purposes. -->\n<a name=\"TODO\"></a>\n<br />\nAdd easy html.escape/html.unescape functions <br />\n<del>Create examples for the new switches below</del> <br />\n<del>Add scaffolding</del><br />\n<del>Add update Monorail.js switch</del> <br />\n<del>Add reset project switch</del> <br />\n<del>Add create snapshot switch</del><br />\n<del>Add clear snapshots switch</del><br />\n<del>Add build hash tree switch </del><br />\n<del>Add create model (independent of view) switch</del> <br />\n<del>Add create view (independent of model) switch</del> <br />\n<del>Add project summary switch</del> <br />\n<del>(MAYBE) Add recover snapshot switch</del>&nbsp; Never <br />\n<del>(MAYBE) Add compare snapshot switch</del>&nbsp; Never <br />\nTheme/Template documentation<br />\nMore Wiki-Examples coming very very soon.<br />\nHeavy Bug Testing<br />\n\n\n# License\n\n<a href=\"http://www.opensource.org/licenses/mit-license.php\">MIT License</a> Copyright (c) 2012 Ryan Kelker and individual contributors.\n","maintainers":[{"name":"runexec","email":"theinternet@yandex.com"}],"time":{"modified":"2012-05-14T11:56:49.984Z","created":"2012-05-14T11:56:47.319Z","1.0.1":"2012-05-14T11:56:49.984Z"},"author":{"name":"Ryan Kelker","url":"https://github.com/runexec"},"repository":{"type":"git","url":"git://github.com/runexec/Monorail.js.git"},"_attachments":{"Monorail.js-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lKSoc2n3AhNhbj37CFxNTQ==","length":440742,"stub":true}}}},
{"id":"Mr.Array","key":"Mr.Array","value":{"rev":"3-67631e4e7a3e46ae8aceed1e1ea38712"},"doc":{"_id":"Mr.Array","_rev":"3-67631e4e7a3e46ae8aceed1e1ea38712","name":"Mr.Array","description":"A JavaScript 'Array' object extention. Most of APIs is from C# Enumerable class and JavaScript 1.6 or JavaScript 1.7 Array object methods.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"author":{"name":"Sheldon Wong","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"name":"Mr.Array","description":"A JavaScript 'Array' object extention. Most of APIs is from C# Enumerable class and JavaScript 1.6 or JavaScript 1.7 Array object methods.","version":"0.1.1","homepage":"http://github.com/winsonwq/Mr.Array","repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Array.git"},"main":"Mr.Array.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"sheldonw","email":"winsonwq@gmail.com"},"_id":"Mr.Array@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"46f06f7c9c87e9361694131a74c27a611a576033","tarball":"http://registry.npmjs.org/Mr.Array/-/Mr.Array-0.1.1.tgz"},"maintainers":[{"name":"sheldonw","email":"winsonwq@gmail.com"}]}},"readme":"# Mr.Array\r\n\r\nMr.Array is a JavaScript Array Object method extention library. It will help you operate every item in array in LINQ way. And at the same time, the static method invoke is accepted.\r\n\r\n## Supported APIs\r\n* select\r\n\r\n```js\r\nvar source = [{ id : 1, month : 11 }, { id : 2, month : 12 }, { id : 3, month : 13  }];\r\nvar idResult = source.select(function(o){ return o.id; });\r\n```\r\n\r\n* selectMany\r\n\r\n```js\r\nvar source = [{ a : [1,2,3]}, { a : [4,5,6] }, { a : [7,8,9] }];\r\nvar result = source.selectMany(function(o){ return o.a; });\r\n```\r\n\r\n* toDictionary\r\n\r\n```js\r\nvar source = [{ name : 'a',  value : [1,2,3] }, { name : 'b',  value : [4,5,6] }, { name : 'c',  value : [7,8,9] }, { name : 'a', value : [10, 11, 12] }];\r\nvar result = \r\n    source.toDictionary(function(obj){\r\n\t\treturn obj.name + '_group';\r\n\t}, function(obj){\r\n\t\treturn obj.value[0];\r\n\t});\r\n```\r\n\r\n* where\r\n\r\n```js\r\nvar source = [{ id : 1, month : 11 }, { id : 2, month : 12 }, { id : 3, month : 13  }];\r\nvar idResult = source.where(function(o){ return o.id > 2; });\r\n```\r\n\r\n* orderBy\r\n\r\n```js\r\nvar source = [2, 5, 6, 1, 7, 8, 9, 3, 10, 4];\r\nvar result = source.orderBy(function(a,b){ return a - b });\r\n```\r\n\r\n* groupBy\r\n\r\n```js\r\nvar source = [{ name : 'Attach'}, { name : 'Charactor'}, { name : 'Bee'}, { name : 'Cycle'}, { name : 'Add'}];\r\nvar result = \r\n    source\r\n\t.orderBy(function(a, b){ return a.name.charCodeAt(0) - b.name.charCodeAt(0); })\r\n\t.groupBy(function(obj){ return obj.name.charAt(0); });\r\n```\r\n\r\n* any\r\n\r\n```js\r\nvar source = [{ name : 'Attach' }, { name : 'Charactor' }, { name : 'Bee' }, { name : 'Cycle' }, { name : 'Add' }];\r\nvar result = \r\n    source.\r\n\tany(function(obj){ return obj.name.charAt(0) == 'B'; });\r\n```\r\n\r\n* all\r\n\r\n```js\r\nvar source = [{ name : 'Attach' }, { name : 'Charactor' }, { name : 'Bee' }, { name : 'Cycle' }, { name : 'Add' }];\r\nvar result = source.all(function(obj){\r\n    return obj.name.length > 3; \r\n});\r\n```\r\n\r\n* take\r\n\r\n```js\r\nvar source = [2, 5, 6, 1, 7, 8, 9, 3, 10, 4];\r\nvar result = source.take(3);\r\n```\r\n\r\n* skip\r\n\r\n```js\r\nvar source = [2, 5, 6, 1, 7, 8, 9, 3, 10, 4];\r\nvar result = source.skip(5);\r\n```\r\n\r\n* each\r\n\r\n```js\r\nvar source = [2, 5, 6, 1, 7, 8, 9, 3, 10, 4], i = 0;\r\nsource.each(function(val, idx){\r\n    equal(i++, idx);\r\n    equal(source[idx], val);\r\n});\r\n```\r\n\r\n* reduce_rtl\r\n\r\n```js\r\nvar source = [2, 5, 6, 1, 7, 8, 9, 3, 10, 4], i = 8;\r\nvar result = source.reduce_rtl(function(curr, old, idx, array){\r\n    return curr + old;\r\n});\r\n```\r\n\r\n* reduce_ltr\r\n\r\n```js\r\nvar source = [2, 5, 6, 1, 7, 8, 9, 3, 10, 4], i = 1;\r\nvar result = source.reduce_ltr(function(curr, old, idx, array){\t\r\n    return curr + old;\r\n});\r\n```\r\n\r\n* except\r\n\r\n```js\r\nvar source = [{ a : 1, b : 22 }, { a : 2, b : 77 }, { a : 2, b : 2 }, { a : 3, b : 5 }];\r\nvar source2 = [{ a : 1, b : 11 }, { a : 2, b : 32 }, { a : 3, b : 30 }, { a : 4, b : 2 }];\r\nvar result = source.except(source2, function(curr){ return curr.a == 1 || curr.a == 2; });\r\n```\r\n\r\n* intersect\r\n\r\n```js\r\nvar source = [{ a : 1, b : 10 }, { a : 1, b : 10 }, { a : 2, b : 30 }, { a : 1, b : 40 }];\r\nvar source2 = [{ a : 1, b : 10 }, { a : 4, b : 20 }, { a : 2, b : 0 }, ];\r\nvar result = source.intersect(source2, function(curr, compare){ return curr.a == 1 && curr.b == 10 });\r\n```\r\n\r\n* union\r\n\r\n```js\r\nvar source = [2, 2, 4, 4, 8], source2 = [9, 3, 9, 3];\r\nvar result = source.union(source2);\r\n```\r\n\r\n* diff\r\n\r\n```js\r\nvar source = [2, 2, 1, 10, 3, 9, 4];\r\nvar source2 = [1, 10, 20, 4];\r\nvar result = source.diff(source2);\r\n```\r\n\r\n* contains\r\n* containsAll\r\n* distinct\r\n\r\n```js\r\nvar source = [2, 2, 4, 4, 8, 9, 3, 9, 3];\r\nvar result = source.distinct();\r\n```\r\n\r\n## Example: Group programming languages\r\n\r\n```js\r\n// 2011年排行\r\nvar langs = [\r\n    'Java', 'C', 'C++', 'C#', 'PHP', 'Python', 'Visual Basic', 'Objective-C', 'Perl', 'JavaScript',\r\n    'Ruby', 'Assembly*', 'Delphi', 'Go', 'Lisp', 'Lua', 'Ada', 'Pascal', 'NXT-G', 'Scheme*',\r\n    'RPG(OS/40)', 'Visual Basic .NET', 'Transact-SQL', 'R', 'Groovy', 'SAS', 'MATLAB', 'ABAP', 'Scratch', 'PL/SQL',\r\n    'Haskell', 'Logo', 'D', 'Object Pascal', 'Fortran', 'Alice', 'Forth', 'COBOL', 'Erlang', 'Bash', \r\n    'ML', 'MAD', 'APL', 'Scala', 'F#', 'ActionScript', 'Smalltalk', 'C Shell', 'CL(OS/400)', 'Prolog'\r\n];\r\n\r\nvar result = \r\n    langs\r\n\t.orderBy(function(a, b){ return a.charCodeAt(0) - b.charCodeAt(0); }) // important !!\r\n\t.groupBy(function(name){ return name.charAt(0); })\r\n\t.select(function(group){\r\n\t\tvar obj = {};\r\n\t\tobj[group[0].charAt(0)] = group.orderBy(function(a, b){ return a.length - b.length; });\r\n\t\treturn obj;\r\n\t});\r\n```\r\n","maintainers":[{"name":"sheldonw","email":"winsonwq@gmail.com"}],"time":{"modified":"2012-01-09T05:12:26.995Z","created":"2012-01-09T05:11:18.674Z","0.1.1":"2012-01-09T05:12:26.995Z"},"author":{"name":"Sheldon Wong","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Array.git"},"_attachments":{"Mr.Array-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JbGbXf3rLrMxypHVqTl4Rg==","length":19361,"stub":true}}}},
{"id":"Mr.Async","key":"Mr.Async","value":{"rev":"3-fa6df25aaf38e82811e713de021f98b8"},"doc":{"_id":"Mr.Async","_rev":"3-fa6df25aaf38e82811e713de021f98b8","name":"Mr.Async","description":"A JavaScript Asynchronism Improvement Library","dist-tags":{"latest":"0.3.1"},"versions":{"0.3.1":{"author":{"name":"Qiu Wang","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"name":"Mr.Async","description":"A JavaScript Asynchronism Improvement Library","version":"0.3.1","homepage":"https://github.com/winsonwq/Mr.Async","repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Async.git"},"main":"./lib/Mr.Async.js","engines":{"node":"*"},"dependencies":{"amdefine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"winsonwq","email":"winsonwq@gmail.com"},"_id":"Mr.Async@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8a24c65e544b21b62d53f6eb81cfead7f654cd13","tarball":"http://registry.npmjs.org/Mr.Async/-/Mr.Async-0.3.1.tgz"},"maintainers":[{"name":"winsonwq","email":"winsonwq@gmail.com"}]}},"readme":"# Mr.Async\n\n## Iterator\n\n* **asynEach** : function (array, callback, outerFunc)\n* **asynIterator** : function (iterator, callback, outerFunc)\n* **range** : function (minAndMax)\n* **infinite** : function ()\n\nFirstly, thanks to Jscex library created by Jeffrey Zhao. I realized what the Jscex solve, how Jscex can improve javascript asynchronism. After reading his blog, I have a try my own solution, AsynIterator.\n\nSuppose there is a array which contains 5 numbers( 1 - 5 ), user want to traverse this array and print the current value each 1 second. DO NOT tell me you will write like below:\n\n```javascript\nvar arr = [1, 2, 3, 4, 5];\nvar len = arr.length;\nfor(var i = 0 ; i < len ; i++){\n    window.setTimeout(function(){\n        console.log(i);\n    }, 1000);\n}\n\n// output\n// 5\n// 5\n// 5\n// 5\n// 5\n// it's wrong. !\n```\n\nOR\n\n```javascript\nvar arr = [1, 2, 3, 4, 5];\nfor(var i = 0 ; i < arr.length ; i++){\n    print(arr[i]);\n}\n\nfunction print(i){\n    window.setTimeout(function(){\n        console.log(i);\n    }, 1000);\n}\n\n//output\n// 1\n// 2\n// 3\n// 4\n// 5\n// value is correct, but these values was printed immediately. so it's wrong too.\n```\n\nAnd how to make it right, mostly of us will write code like below:\n\n```javascript\nvar arr = [1, 2, 3, 4, 5];\nvar len = arr.length;\n(function traverse(arr, idx){\n    idx = idx || 0;\n    if(idx < len){\n        console.log(arr[idx++]);\n        setTimeout(function(){  \n            traverse(arr, idx);\n        }, 1000);\n    }\n})(arr);\n\n// output\n// 1\n// 2\n// 3\n// 4\n// 5\n// it's correct, but not easy to understand.  \n```\n\nThe code is too complicated to understand, the problem is how to make code structure like for loop, and how to make the logic clear. Right now, we have Mr.asynIterator function. Example:\n\n```javascript\nvar arr = [1, 2, 3, 4, 5];\nMr.asynEach(arr, function(i){\n    console.log(i);\n    window.setTimeout(this.callback(), 1000);\n}).start();\n// output\n// 1\n// 2\n// 3\n// 4\n// 5\n// it's absolutely correct. And code structure seems good.\n```\n\nThis just a simple demo for solving asynchronization problem. In addition, if you want to traverse other kinds of object, not a array. you can use Mr.asynIterator function. Mr.range will makes a range with number in a special format, such as \"[1, 10]\" means number 1 to 10. \"(1, 10]\" means 2 to 10. Mr.infinite will make a infinite range which means 1 to ∞. Example:\n\n```javascript\nMr.asynIterator(Mr.range('[1, 5]'), function(num){\n    if(num == 4){\n        return Mr.CONTINUE;\n    }\n    console.log(num);\n    window.setTimeout(this.callback(), 1000);\n}).start();\n// output\n// 1\n// 2\n// 3\n// 5\n```\n\nOf course, user can create his own object to be iterated if the object have next function to return the next value. Example:\n\n```javascript\nvar infinite = {\n    _cnt : 0,\n    next : function(){\n        return this._cnt++;\n    }\n};\n        \nMr.asynIterator(infinite, function(num){\n    console.log(num);\n    window.setTimeout(this.callback(), 1000);\n}).start();\n// output\n// 0\n// 1\n// 2\n// 3\n// 4\n// ...\n```\n\nAt this moment, we can well deal with the asyn problem, but how about nesting iteration. Don't worry, you can follow as below:\n\n```javascript\n// default\nfor(var i = 0 ; i < 3 ; i++){\n    for(var ii = 0 ; ii < 3 ; ii++){\n        console.log(i + ',' + ii);\n        // all numbers will be shown at a moment.\n    }\n}\n\n// but now, using Mr.asynIterator\nMr.asynIterator(Mr.range('[0, 3)'), function(i){\n    Mr.asynIterator(Mr.range('[0, 3)'), function(ii){\n        console.log(i + ',' + ii);\n        window.setTimeout(this.callback(), 1000); // print each second.\n    }, this.callback()).start();\n}).start();\n// output\n// 0, 0\n// 0, 1\n// 0, 2\n// 1, 0\n// 1, 1\n// 1, 2\n// 2, 0\n// 2, 1\n// 2, 2\n```\n\nThe second one seems a little more complicated than the first, but it perform Asynchronously, the first one can nenver do this. AsynIterator object have two member functions call callback and next. In these demo codes, you will find many callback methods have been invoked, the example below show how callback method works. Example:\n\n```javascript\nMr.asynEach([1, 2, 3], function(num){\n    console.log(num);\n    setTimeout(this.callback(), 1000);\n}).start();\n\nMr.asynEach([1, 2, 3], function(num){\n    console.log(num);\n    var outer = this;\n    setTimeout(function(){ outer.next(); }, 1000);\n}).start();\n\n// the two methods are same.\n```\n\nThis example we can see callback is a wrapper of next, and two method are trying to deal with the next value from iterated object. In addition, callback handler have a function argument which contains the result of asynchronization method.\n\n```javascript\nfunction caculate(num, callback){\n    var timespan = Math.random(1) * 1000;\n    setTimeout(function(){\n        callback(num * num);\n    }, timespan);\n}\n\nMr.asynEach([2, 3, 4], function(num){\n    caculate(num, this.callback(function(result){\n        console.log(result);\n    }));\n}).start();\n// output\n// 4\n// 9\n// 16\n```\n\ncaculate method is a simple asyn method which is usually have a callback argument. By using Mr.asynEach, we can easily get the result of caculation regardless of the caculation time. It's cool. You can visit a advanced demo Selection Sort. (Please choose a browser which support SVG).\n\n## Mr.Deferred\n**_Mr.Deferred : function ()_**\n\nAccording to CommonJS Promise/A, Mr.Deferred function will return a Deferred object. And a Deferred object always contains these methods:\n\n  * always : function (alwaysHandler), add always handler.\n  * done : function (doneHandler), add done handler.\n  * fail : function (failureHandler), add failure handler.\n  * then : function (doneHandler, failureHandler), add done handler and failer handler.\n  * isRejected : function (), check if rejected.\n  * isResolved : function (), check if resolved.\n\nExample:\n\n```javascript\nfunction asynFn(){\n    var dfd = Mr.Deferred();\n    setTimeout(function(){\n        dfd.resolve(1, 1, 1, 1, 1);\n    }, Math.random(1) * 2000);\n    setTimeout(function(){\n        dfd.reject(2, 2, 2, 2, 2);\n    }, Math.random(1) * 2500);\n    return dfd.promise();\n}\n\nasynFn()\n    .done(function(){\n        console.log('done');\n        console.log(arguments);\n    })\n    .fail(function(){\n        console.log('fail');\n        console.log(arguments);\n    })\n    .then(\n        function(){\n            console.log('then->done');\n            console.log(arguments);\n        }, \n        function(){\n            console.log('then->fail');\n            console.log(arguments);\n        })\n    .always(function(){\n        console.log('always');\n        console.log(arguments);\n    })\n    .then(\n        function(){\n            console.log('then2->done');\n            console.log(arguments);\n        }, \n        function(){\n            console.log('then2->fail');\n            console.log(arguments);\n        });\n\n// if succeed, output:\n// done\n// [1, 1, 1, 1, 1]\n// then->done\n// [1, 1, 1, 1, 1]\n// then2->done\n// [1, 1, 1, 1, 1]\n// always\n// [Object { _doneFns=, more...}] // the deferred object in firebug console.\n\n// if failure, output:\n// fail\n// [2, 2, 2, 2, 2]\n// then->fail\n// [2, 2, 2, 2, 2]\n// then2->fail\n// [2, 2, 2, 2, 2]\n// always\n// [Object { _doneFns=, more...}] // the deferred object in firebug console. \n```\n\n## Mr.when\n_**Mr.when : function(deferredObj1[, deferredObj2, [deferredObj3, ...]])**_\n\nWe can use Mr.when function to deal with multiple Deferred objects. \n\nExample:\n\n```javascript\nfunction asynFn(){\n    var dfd = Mr.Deferred();\n    setTimeout(function(){\n        dfd.resolve(1, 1, 1, 1, 1);\n    }, Math.random(1) * 2000);\n    setTimeout(function(){\n        dfd.reject(2, 2, 2, 2, 2);\n    }, Math.random(1) * 2500);\n    return dfd.promise();\n}\n\nfunction asynFn2(){\n    var dfd = Mr.Deferred();\n    setTimeout(function(){\n        dfd.resolve(33, 33, 33);\n    }, Math.random(1) * 3000);\n    return dfd.promise();\n}\n\nMr.when( asynFn(), asynFn2() )\n    .done(function(){\n        console.log('when:done');\n        console.log(arguments);\n    })\n    .fail(function(){\n        console.log('when:fail');\n        console.log(arguments);\n    })\n    .always(function(){\n        console.log('when:always');\n        console.log(arguments);\n    })\n    .then(\n        function(){\n            console.log('when:then->done');\n            console.log(arguments);\n        },\n        function(){\n            console.log('when:then->fail');\n            console.log(arguments);\n        }\n    );\n\n// if succeed, output:\n// when:done\n// [1, 1, 1, 1, 1, 33, 33, 33]\n// when:then->done\n// [1, 1, 1, 1, 1, 33, 33, 33]\n// when:always\n// [Object { _doneFns=, more...}, Object { _doneFns=, more...}] // the two deferred objects in firebug.\n```\n\n## Test\n\nTested by QUnit, see _/Mr.js/Mr.Async/test/qunit/index.html_ when you clone this library.","maintainers":[{"name":"winsonwq","email":"winsonwq@gmail.com"}],"time":{"modified":"2012-05-26T08:48:13.619Z","created":"2012-05-26T08:48:01.706Z","0.3.1":"2012-05-26T08:48:13.619Z"},"author":{"name":"Qiu Wang","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Async.git"},"_attachments":{"Mr.Async-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tui0WioIWRs1RYEevPhOsA==","length":51200,"stub":true}}}},
{"id":"Mr.Coverage","key":"Mr.Coverage","value":{"rev":"17-28524f727c53b78e9c3d94f69037a120"},"doc":{"_id":"Mr.Coverage","_rev":"17-28524f727c53b78e9c3d94f69037a120","name":"Mr.Coverage","description":"use mocha to test javascript coverage","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"Mr.Coverage","version":"0.1.0","private":false,"dependencies":{"jasmine-node":"latest","mocha":"latest","chai":"latest","wrench":"latest","colors":"*","easy-table":"*","Mr.Async":"*","underscore":"*"},"devDependencies":{},"engines":{"node":"*"},"bin":{"mr-coverage":"./mr-coverage"},"author":{"name":"winsonwq","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"description":"use mocha to test javascript coverage","homepage":"https://github.com/winsonwq/Mr.Coverage","repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Coverage.git"},"main":"./app.js","scripts":{"test":"mocha -R spec spec/*"},"_npmUser":{"name":"winsonwq","email":"winsonwq@gmail.com"},"_id":"Mr.Coverage@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"49a0fd280defccfead9fd6f0f360f42af3d9a639","tarball":"http://registry.npmjs.org/Mr.Coverage/-/Mr.Coverage-0.1.0.tgz"},"maintainers":[{"name":"winsonwq","email":"winsonwq@gmail.com"}],"directories":{}},"0.2.0":{"name":"Mr.Coverage","version":"0.2.0","private":false,"dependencies":{"mocha":"latest","sinon":"latest","chai":"latest","wrench":"latest","colors":"*","easy-table":"*","Mr.Async":"*","underscore":"*"},"devDependencies":{},"engines":{"node":"*"},"bin":{"mr-coverage":"./mr-coverage"},"author":{"name":"winsonwq","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"description":"use mocha to test javascript coverage","homepage":"https://github.com/winsonwq/Mr.Coverage","repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Coverage.git"},"main":"./app.js","scripts":{"test":"mocha -R spec spec/*"},"_npmUser":{"name":"winsonwq","email":"winsonwq@gmail.com"},"_id":"Mr.Coverage@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"73411dd6bf4f881e4fc9c9c9bcc381628680d066","tarball":"http://registry.npmjs.org/Mr.Coverage/-/Mr.Coverage-0.2.0.tgz"},"maintainers":[{"name":"winsonwq","email":"winsonwq@gmail.com"}]}},"readme":"Mr.Coverage\n===========\n\nnode js-coverage using jasmine-node","maintainers":[{"name":"winsonwq","email":"winsonwq@gmail.com"}],"time":{"modified":"2012-07-05T01:43:21.320Z","created":"2012-05-28T02:43:15.910Z","0.0.1":"2012-05-28T02:43:19.793Z","0.0.2":"2012-05-28T05:41:40.688Z","0.1.0":"2012-05-31T16:13:51.014Z","0.2.0":"2012-07-05T01:43:21.320Z"},"author":{"name":"winsonwq","email":"winsonwq@gmail.com","url":"http://sheldonw.sinaapp.com"},"repository":{"type":"git","url":"git://github.com/winsonwq/Mr.Coverage.git"},"_attachments":{"Mr.Coverage-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-pgApxWFGvxCmyaGeGxkhvA==","length":10240,"stub":true},"Mr.Coverage-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-9vxU+ztc6Bol9967A/FIlg==","length":10240,"stub":true}}}},
{"id":"Mu","key":"Mu","value":{"rev":"7-28e6ab82c402c3a75fe0f79dea846b97"},"doc":{"_id":"Mu","_rev":"7-28e6ab82c402c3a75fe0f79dea846b97","name":"Mu","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Mu","version":"0.0.1","dependencies":{},"_id":"Mu@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Mu/-/Mu-0.0.1.tgz"},"mtime":"2010-11-09T23:30:04Z","ctime":"2010-11-09T23:30:04Z"}},"maintainers":[{"name":"subrah","email":"subbu@subbu.org"}],"mtime":"2010-11-09T23:30:04Z","ctime":"2010-11-09T23:30:04Z","_attachments":{"Mu-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-otQroD0bFTETq5OMoX9yAQ==","length":11827,"stub":true}}}},
{"id":"Muffin","key":"Muffin","value":{"rev":"3-eea2b6462121ae0c8babe500ea280910"},"doc":{"_id":"Muffin","_rev":"3-eea2b6462121ae0c8babe500ea280910","name":"Muffin","description":"A static blog created from Jade and Markdown - powered by node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Chris Abrams","email":"mail@chrisabrams.com"},"name":"Muffin","description":"A static blog created from Jade and Markdown - powered by node.js","version":"0.0.1","homepage":"https://github.com/chrisabrams/Muffin","repository":{"type":"git","url":"git://github.com/chrisabrams/Muffin.git"},"engines":{"node":">= 0.6.17"},"dependencies":{"commander":"0.6.1","flow":"git+ssh://git@github.com:chrisabrams/flow.git#0.0.9","fs-extra":"git+ssh://git@github.com:chrisabrams/node-fs-extra.git#0.0.2","http-server":"0.2.9","jade":"0.26.1","jQuery":"1.7.2","jsdom":"0.2.14","less":"1.3.0","markdown":"0.4.0","markx":"git+ssh://git@github.com:chrisabrams/markx.git#0.1.2","plates":"0.4.6","node-rss":"git+ssh://git@github.com:chrisabrams/node-rss.git#0.0.3","stylus":"0.27.1","uglify-js":"1.3.0","wrench":"1.3.9"},"devDependencies":{"mocha":"1.1.0","should":"0.6.3"},"scripts":{"start":"bin/server"},"_npmUser":{"name":"chrisabrams","email":"mail@chrisabrams.com"},"_id":"Muffin@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0ee1336621a4096027c09875abb40dfd1e379b6c","tarball":"http://registry.npmjs.org/Muffin/-/Muffin-0.0.1.tgz"},"maintainers":[{"name":"chrisabrams","email":"mail@chrisabrams.com"}]}},"readme":"#Muffin\nA node.js module for creating a static website/blog.\n\n##What it does\nCreates a website/blog into static .html files - no database needed.\n\n - Converts articles written markdown into .html\n - Allows for a single template written in .jade or .html to be used as the site's template\n - Styling can be written in .css, .less, or .styl\n\n##Create a new post\n\n\tmuffin post\n\nThen you'll be greated with a prompt asking you for an article name\n\n\tname: \n\nEnter a unique name for the article\n\n##Commands\nTo get a list of all the commands:\n\n\tmuffin -h\n\n##Build\n\n\t./build\n\n##Test\n\n\tmake test\n\n##Configuration\nSettings for baking the site/blog.\n\n\t{\n\t\t\"blog\": \"/Y/m/d/T\"\n\t}\n\nY = Year&nbsp; 4 digits\nm = Month 2 digits\nd = Day&nbsp;&nbsp; 2 digits\nT = Full title of the article\n\nSet up the format of the blog's url structure: Y, m, d are all optional and T is required\n\n##Todo\n\n - Clean up Muffin.bake because it's a mess\n - Set limit on # of chars. for blogs without h2's\n - Allow year in the blog url to be 2 years\n - Make article title in url optionally shorter (have no idea how)\n - Have option for setup using nodejitsu for deployment\n - Have option for setup using Github for deployment\n - Remove JS DOM as a dependency (it sucks)\n - Remove markx as a dependency","maintainers":[{"name":"chrisabrams","email":"mail@chrisabrams.com"}],"time":{"modified":"2012-06-17T20:54:25.229Z","created":"2012-06-17T20:54:23.966Z","0.0.1":"2012-06-17T20:54:25.229Z"},"author":{"name":"Chris Abrams","email":"mail@chrisabrams.com"},"repository":{"type":"git","url":"git://github.com/chrisabrams/Muffin.git"},"_attachments":{"Muffin-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Smrpy2gAx85mX1NHKluOQQ==","length":45523,"stub":true}}}},
{"id":"N","key":"N","value":{"rev":"7-e265046b5bdd299b2cad1584083ce2d5"},"doc":{"_id":"N","_rev":"7-e265046b5bdd299b2cad1584083ce2d5","name":"N","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"N","version":"0.1.0","engines":["node > v0.1.100"],"author":{"name":"Daniel Neighman"},"main":"./lib/index","_id":"N@0.1.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/N/-/N-0.1.0.tgz"},"mtime":"2010-11-09T23:30:17Z","ctime":"2010-11-09T23:30:17Z"}},"maintainers":[{"name":"hassox","email":"has.sox@gmail.com"}],"mtime":"2010-11-09T23:30:17Z","ctime":"2010-11-09T23:30:17Z","author":{"name":"Daniel Neighman"},"_attachments":{"N-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tPwFD8SASDGTNSA39x0Lxw==","length":8999,"stub":true}}}},
{"id":"NDDB","key":"NDDB","value":{"rev":"44-d8b154786c70f58a82b628c6c52f33fb"},"doc":{"_id":"NDDB","_rev":"44-d8b154786c70f58a82b628c6c52f33fb","name":"NDDB","description":"Javascript lightweight N-dimensional database","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.0","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"GPL"}],"dependencies":{},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"338bc5d902914adb81e66b0806ca0a51c9285c01","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.0.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.1":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.1","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"ae7e9d90105b7951dd0d2df395896114fdb22584","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.1.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.2":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.2","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.0"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"590ae60394f05f04374562529f8967dc25d21a5d","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.2.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.3":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.3","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.0"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c26a5b83938c718c00cf529d8df3288fdffdcb12","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.3.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.4":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.4","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.0"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.4","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8c7734d4a261ca5472bd99bbdaca64cd01c52a5d","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.4.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.5":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.5","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.0"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.5","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8ddc2b5655d38899bb4de0043a8f4583acc0d0dd","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.5.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.6":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.6","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.6","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c6f442116865189e3c8bed7364a15d0566ed9c15","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.6.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}],"directories":{}},"0.1.7":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.7","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cd07bbcff888a39dfdc2479a0d2be6630f56e9b4","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.7.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.1.8":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.8","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"05ed2414b0e68a20c486bb4799ef589b558992c2","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.8.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"}]},"0.1.9":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.9","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"be9857c9d22d85828244ebbaa821d371ee6a8683","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.9.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.1.20":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.1.20","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.1.20","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ac8b4a46c58b916cc97db0dc9c4bff02dad63d4f","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.1.20.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.2.0":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.2.0","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ba0eb9fd132dd787000714eab5eb50c21f8fda7a","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.2.0.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.2.1":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.2.1","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"af947058c9795daa5595a572a789014f0def38a8","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.2.1.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.2.2":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.2.2","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"655f36f6261849224aa0358ac72e6e92069b3161","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.2.2.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.2.2-dev":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.2.2-dev","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.2.2-dev","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"52ffa8d373074bb4ccc72407e8677a82cffbaa25","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.2.2-dev.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.2.3":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.2.3","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ec6d289a139baeb6724943f29cd2787ed3c04b48","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.2.3.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.2.4":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.2.4","keywords":["db"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"JSUS":">= 0.1.3"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"aa8d8950a06900995bd241924794d07e1f9af1c2","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.2.4.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.0":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.3.0","keywords":["db","no-sql","cyclic objects","nddb","database"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"es5-shim":"1.2.10","docker":">= 0.1.3","shelf.js":">= 0.2.1","commander":"1.0.0","smoosh":"0.3.2","JSUS":">= 0.4.0"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.8.5","_defaultsLoaded":true,"dist":{"shasum":"3708b2b06918692c0303f3ecd389790a2d799fa7","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.3.0.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]},"0.3.1":{"name":"NDDB","description":"Javascript lightweight N-dimensional database","version":"0.3.1","keywords":["db","no-sql","cyclic objects","nddb","database"],"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"licenses":[{"type":"MIT"}],"dependencies":{"es5-shim":"1.2.10","docker":">= 0.1.3","shelf.js":">= 0.2.1","commander":"1.0.0","smoosh":"0.3.2","JSUS":">= 0.4.0"},"devDependencies":{"mocha":">= 0.3.0","should":">= 0.5.1"},"engines":{"node":">=0.2.3"},"main":"nddb.js","repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"scripts":{"test":"make test"},"_npmUser":{"name":"shakty","email":"futur.dorko@gmail.com"},"_id":"NDDB@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"522bdb84e9161283df0f78fa846b75187c7e9d76","tarball":"http://registry.npmjs.org/NDDB/-/NDDB-0.3.1.tgz"},"maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}]}},"readme":"# NDDB\n\nNDDB provides a simple, lightweight NO-SQL database for node.js and the browser.\n\n---\n\n## Usage\n\n\n## Advanced commands\n\n\n\n## License\n\nCopyright (C) 2012 Stefano Balietti\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"shakty","email":"futur.dorko@gmail.com"},{"name":"philippkueng","email":"git@philippkueng.ch"}],"time":{"modified":"2012-08-12T21:14:54.832Z","created":"2012-02-25T16:10:39.888Z","0.1.0":"2012-02-25T16:10:41.799Z","0.1.1":"2012-02-26T17:31:52.274Z","0.1.2":"2012-02-26T18:14:09.550Z","0.1.3":"2012-02-26T20:00:17.919Z","0.1.4":"2012-02-27T12:27:03.035Z","0.1.5":"2012-02-27T15:51:35.665Z","0.1.6":"2012-02-28T10:11:59.360Z","0.1.7":"2012-03-03T18:09:05.939Z","0.1.8":"2012-05-01T10:14:01.484Z","0.1.9":"2012-05-11T09:41:46.072Z","0.1.20":"2012-05-11T11:41:03.696Z","0.2.0":"2012-06-03T15:04:14.533Z","0.2.1":"2012-06-04T14:32:25.455Z","0.2.2":"2012-06-08T13:08:09.181Z","0.2.2-dev":"2012-06-10T16:29:55.088Z","0.2.3":"2012-06-13T07:42:56.521Z","0.2.4":"2012-06-15T19:11:02.354Z","0.3.0":"2012-08-12T18:57:25.261Z","0.3.1":"2012-08-12T21:14:54.831Z"},"author":{"name":"Stefano Balietti","email":"futur.dorko@gmail.com"},"repository":{"type":"git","url":"git://github.com/nodeGame/NDDB.git"},"_attachments":{"NDDB-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-xVMhA17anWeHeC5kIGPEEA==","length":27991,"stub":true},"NDDB-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-8JDGCKkm9LgGc1zl3LouMA==","length":27967,"stub":true},"NDDB-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-F/3R2+tBDqwEqfHM5sszXw==","length":19301,"stub":true},"NDDB-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-SeFevH0L2XZZ9887nWsoaA==","length":19155,"stub":true},"NDDB-0.2.2-dev.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-p29BPDIhxAELR21ZhkmV5w==","length":19128,"stub":true},"NDDB-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-9n3h2F4xymsstMDQKDmEHQ==","length":16544,"stub":true},"NDDB-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-X4Afc7nTMup6jVGrhtPeow==","length":16455,"stub":true},"NDDB-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-HSKykikMfhr9ZcloIEqrhw==","length":15507,"stub":true},"NDDB-0.1.20.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-Rl9iY+AtxCmdke6Ko9ICDw==","length":12912,"stub":true},"NDDB-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-sXly7ZOzR35yqdtow6Eqdg==","length":12848,"stub":true},"NDDB-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-3DM90/qS13HO+huoG0TlCQ==","length":12829,"stub":true},"NDDB-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-tEJ3ZT/u2UcnUCuM6zRDLA==","length":10909,"stub":true},"NDDB-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Uew63g/Zg4uaDNiyGPzd5g==","length":10794,"stub":true},"NDDB-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-bCkJS4r6ijNiryMIQeseBg==","length":10495,"stub":true},"NDDB-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-tnYBmp+tHjMD8qy/MRt5BA==","length":9786,"stub":true},"NDDB-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1RtS3hivnfT6EkW3W0xHQQ==","length":7798,"stub":true},"NDDB-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-dLYYTE2Qxfr86o8F+xf+pg==","length":7339,"stub":true},"NDDB-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-G6ajr+hS/HcSnaLGIbCRCw==","length":5826,"stub":true},"NDDB-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OTsmR1NVZTPfau1GTdz6Kg==","length":5823,"stub":true}}}},
{"id":"NFO-Generator","key":"NFO-Generator","value":{"rev":"118-e928e2453c95fd26e5d1b1a13f3de0e5"},"doc":{"_id":"NFO-Generator","_rev":"118-e928e2453c95fd26e5d1b1a13f3de0e5","name":"NFO-Generator","description":"Generates an NFO for a video file","dist-tags":{"beta":"1.0.0beta18","latest":"1.0.0beta18"},"versions":{"0.0.0":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"mediainfo":">=0.0.1","request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b0b4a0ea6abfe09096cce0219799d6e51902e867","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r1":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r1","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"mediainfo":">=0.0.1","request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"42b6f829d22f8f587a95b4417312d20c0be8d603","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r1.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r2":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r2","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"317ef0019be2de449a721907aaf228a412c1d8ac","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r2.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r3":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r3","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"eb617d3957f72ae05bfceff40fba069a3dda7b79","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r3.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r4":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r4","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"413108425a936ae5e2bd35ec29cfdad3822d0125","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r4.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r5":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r5","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2bfb68df0d7f9555fe98f2e516c3c268cc5b870b","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r5.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r6":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r6","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"20555fd89cd378727347bbb8b95a4bddd5476007","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r6.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r7":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r7","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"69c7fe28a31629524c11b47deea460f16e22c99b","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r7.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r8":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r8","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"MakeNFO":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6eaa18f26e244024712ebd57bd375011901364df","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r8.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r9":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r9","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r9","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ebf28f65828d49509e7ce4feb67b69d325d8a38e","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r9.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r10":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r10","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r10","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"cd53ec400e217ecfaa8d8d8bc3adc6f124928d6c","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r10.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r11":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r11","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r11","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a6b3642ea8f23d9d708d5d0705abc61f2425b803","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r11.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r12":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r12","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r12","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"73ad4b227bfcb8c770246ac09b587fdc441cab99","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r12.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r13":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r13","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r13","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"bed7bef4ee5b94cb5dd4d8b0eed7fb80edb8a6f8","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r13.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r14":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r14","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r14","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2948eda0334029d8c234156c835078db9deb0699","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r14.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r15":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r15","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r15","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"20e4860b2ad1f05943bf5351265a438d3e91dcf4","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r15.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r16":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r16","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r16","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6a212da9e92a7d611e64ab3bf676b902100ff599","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r16.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r17":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r17","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r17","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"19b7037545a95988d11a4acd457898123f0414bc","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r17.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r18":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r18","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r18","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7701d4312c3498e7bde798024007bb9761ad297a","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r18.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r19":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r19","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r19","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b2543b1c4e48796e89be9f9497dc02604749e8ea","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r19.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r20":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r20","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r20","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f19c8d4bc2bb3a558c98e21099c370a455196165","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r20.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r21":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r21","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r21","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8f45c5235d163e9a2e729ca82e3caf9f4297623f","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r21.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r22":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r22","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r22","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"53008171385e722abd226415451110a9f4dd0503","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r22.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"0.0.0r23":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"0.0.0r23","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@0.0.0r23","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ec1743f265b18b893d5ca4d80e01b136af9d31b2","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-0.0.0r23.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{},"deprecated":"Pre-beta releases deprecated"},"1.0.0beta1":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta1","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14","compress-buffer":">=0.5.1"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"dc29f9e47bcf4d1ab0578460a7f6f1910facd622","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta1.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta2":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta2","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"460afb8f84ba90e7b688e8ae9c5e356af7924a13","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta2.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta3":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta3","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"952b51f387ba46c903e7a30b6f767ffd29a29071","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta3.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta4":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta4","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"850e9c62eba6fec296649b832c1b41312d64398b","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta4.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta5":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta5","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"eb5e5f7619ceade1d6e36cebb7fcb567fcf87a48","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta5.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta6":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta6","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e5c29528a966031020766d8012c0d356b6517f8b","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta6.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta7":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta7","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"bf43b93f7782e5745816bebdd9b68ca66325610c","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta7.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta8":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta8","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"67245043531a94d68bbedc5c6d71255124cbee49","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta8.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta9":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta9","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta9","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"571127528fe97b1633d25a4a3923ce7e3a51b85b","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta9.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta10":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta10","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta10","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e7e8082a91833f48d4579d126776dff59095cfda","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta10.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta11":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta11","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta11","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7ff21c5d0ff2121e3147c5faa20cbdf3e15845e1","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta11.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta12":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta12","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta12","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"413b9a579ec22ab140482d8afccf00dba141bccf","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta12.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta13":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta13","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta13","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"48604a08cdd63476231a1da96728eb8ee1053b41","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta13.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta14":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta14","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta14","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"d414f472525efce8fa4e592c8a7893837559a450","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta14.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta15":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta15","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta15","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a49b02783e034994027c880ea2765c1ab17f2b94","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta15.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"directories":{}},"1.0.0beta16":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta16","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta16","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"605c54e09568490ddaac137272e48a056a592611","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta16.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}]},"1.0.0beta17":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta17","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta17","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"feafcc60e2ab1bd29a90d899287e997fcea6ddb1","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta17.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}]},"1.0.0beta18":{"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"name":"NFO-Generator","description":"Generates an NFO for a video file","version":"1.0.0beta18","homepage":"https://github.com/11rcombs/NFO-Generator","repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"dependencies":{"request":">=2.9.202","mime":">=1.2.5","nomnom":">=1.5.1","xml2js":">=0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.15"},"bin":{"mknfo":"./MakeNFO.js"},"preferGlobal":true,"_npmUser":{"name":"11rcombs","email":"rodger.combs@gmail.com"},"_id":"NFO-Generator@1.0.0beta18","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a07705f55ccf89024a9ab8c14ad2c08f11421f17","tarball":"http://registry.npmjs.org/NFO-Generator/-/NFO-Generator-1.0.0beta18.tgz"},"maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}]}},"readme":"NFO-Generator\n=============\n\nGenerates an NFO for a video file","maintainers":[{"name":"11rcombs","email":"rodger.combs@gmail.com"}],"time":{"modified":"2012-05-30T12:57:08.674Z","created":"2012-05-11T05:20:33.951Z","0.0.0":"2012-05-11T05:20:34.601Z","0.0.0r1":"2012-05-11T05:22:54.782Z","0.0.0r2":"2012-05-11T05:52:04.551Z","0.0.0r3":"2012-05-12T04:53:46.807Z","0.0.0r4":"2012-05-12T05:10:51.876Z","0.0.0r5":"2012-05-12T05:54:52.139Z","0.0.0r6":"2012-05-12T06:33:00.601Z","0.0.0r7":"2012-05-12T06:45:55.668Z","0.0.0r8":"2012-05-12T07:12:38.331Z","0.0.0r9":"2012-05-12T07:15:58.468Z","0.0.0r10":"2012-05-12T15:27:34.479Z","0.0.0r11":"2012-05-12T18:29:55.199Z","0.0.0r12":"2012-05-12T19:35:42.742Z","0.0.0r13":"2012-05-14T23:48:24.580Z","0.0.0r14":"2012-05-15T04:00:47.362Z","0.0.0r15":"2012-05-15T05:08:08.269Z","0.0.0r16":"2012-05-16T03:41:21.118Z","0.0.0r17":"2012-05-16T03:47:05.046Z","0.0.0r18":"2012-05-16T04:12:17.614Z","0.0.0r19":"2012-05-16T04:26:47.735Z","0.0.0r20":"2012-05-16T22:55:04.956Z","0.0.0r21":"2012-05-17T02:35:55.003Z","0.0.0r22":"2012-05-17T02:49:26.660Z","0.0.0r23":"2012-05-17T04:04:05.619Z","1.0.0beta1":"2012-05-20T21:25:11.983Z","1.0.0beta2":"2012-05-21T02:45:04.090Z","1.0.0beta3":"2012-05-21T03:16:00.396Z","1.0.0beta4":"2012-05-21T21:02:15.823Z","1.0.0beta5":"2012-05-22T20:48:03.855Z","1.0.0beta6":"2012-05-22T23:20:51.524Z","1.0.0beta7":"2012-05-23T02:49:54.687Z","1.0.0beta8":"2012-05-23T03:00:40.415Z","1.0.0beta9":"2012-05-23T03:21:06.974Z","1.0.0beta10":"2012-05-23T20:57:30.717Z","1.0.0beta11":"2012-05-23T23:19:40.449Z","1.0.0beta12":"2012-05-23T23:30:30.424Z","1.0.0beta13":"2012-05-24T00:07:54.563Z","1.0.0beta14":"2012-05-24T00:38:45.650Z","1.0.0beta15":"2012-05-24T01:38:47.645Z","1.0.0beta16":"2012-05-26T16:11:52.858Z","1.0.0beta17":"2012-05-26T16:20:22.894Z","1.0.0beta18":"2012-05-30T12:29:46.524Z"},"author":{"name":"11rcombs","url":"https://github.com/11rcombs"},"repository":{"type":"git","url":"git://github.com/11rcombs/NFO-Generator.git"},"_attachments":{"NFO-Generator-1.0.0beta18.tgz":{"content_type":"application/octet-stream","revpos":116,"digest":"md5-X5zMvpJ/FowqGa4jzB0vCQ==","length":21843814,"stub":true},"NFO-Generator-1.0.0beta17.tgz":{"content_type":"application/octet-stream","revpos":114,"digest":"md5-ziuoY8cY+aWL3K/b3mAluw==","length":21844040,"stub":true},"NFO-Generator-1.0.0beta16.tgz":{"content_type":"application/octet-stream","revpos":112,"digest":"md5-nELZryCy2+xZz+mi4JluUQ==","length":21843128,"stub":true},"NFO-Generator-1.0.0beta15.tgz":{"content_type":"application/octet-stream","revpos":104,"digest":"md5-/cvKZOFAxB4oMyTtMlJrbA==","length":21839159,"stub":true},"NFO-Generator-1.0.0beta14.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-eJX1vfIMN/eeu0gSu+FxCA==","length":21839033,"stub":true},"NFO-Generator-1.0.0beta13.tgz":{"content_type":"application/octet-stream","revpos":98,"digest":"md5-RveZI8Kopp57zNRgtGX3oA==","length":21838588,"stub":true},"NFO-Generator-1.0.0beta12.tgz":{"content_type":"application/octet-stream","revpos":94,"digest":"md5-M+9YQKOZEW7oOnwTemYuyw==","length":21838569,"stub":true},"NFO-Generator-1.0.0beta11.tgz":{"content_type":"application/octet-stream","revpos":92,"digest":"md5-JFlDgy4PNrDCEoiJ4kP7Dg==","length":21838585,"stub":true},"NFO-Generator-1.0.0beta10.tgz":{"content_type":"application/octet-stream","revpos":88,"digest":"md5-ZDQvRc8oP3EvY4221MqfYA==","length":21837743,"stub":true},"NFO-Generator-1.0.0beta9.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-NGfl0n44Q/f81SYz+WT39A==","length":21837624,"stub":true},"NFO-Generator-1.0.0beta8.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-m6FLpbZl2N8/hzA6xCeIfw==","length":21837558,"stub":true},"NFO-Generator-1.0.0beta7.tgz":{"content_type":"application/octet-stream","revpos":80,"digest":"md5-mHdW/ma+bnqOebkO+O1ClA==","length":21837239,"stub":true},"NFO-Generator-1.0.0beta6.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-fVs1Zu/ZcMYop1J9o5/M0Q==","length":21837147,"stub":true},"NFO-Generator-1.0.0beta5.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-QznHDQ5I2xcjWcL9p00Mgg==","length":21837135,"stub":true},"NFO-Generator-1.0.0beta4.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-H2a6gvhnT3rLdhDLo8rKWw==","length":21837139,"stub":true},"NFO-Generator-1.0.0beta3.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-DKaCW/UJDyvduBFyclAe2Q==","length":21836980,"stub":true},"NFO-Generator-1.0.0beta2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-jrozbpkUd/ewAYHt77XVBw==","length":21836983,"stub":true},"NFO-Generator-1.0.0beta1.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-/uT0rbz9E8pQB0tjG4Ui9Q==","length":21836940,"stub":true},"NFO-Generator-0.0.0r23.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-IjLMBLNNdUdovEWJuPGMGA==","length":21834295,"stub":true},"NFO-Generator-0.0.0r22.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-EAygBCX5vuU4oR3JbkSTFg==","length":21834301,"stub":true},"NFO-Generator-0.0.0r21.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-RcDBPoh9P3Rcthlr35/v7Q==","length":21834293,"stub":true},"NFO-Generator-0.0.0r20.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-c0pQ0lJeMYZQgnVqS4fkIg==","length":21834296,"stub":true},"NFO-Generator-0.0.0r19.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-lGyorAkDzVw5ohpfhzhlKQ==","length":21833283,"stub":true},"NFO-Generator-0.0.0r18.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-44rRK6oc1JVwA/eJarxurA==","length":21833266,"stub":true},"NFO-Generator-0.0.0r17.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-QStHn/rKSB4cIRALwrjYpQ==","length":21833213,"stub":true},"NFO-Generator-0.0.0r16.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-Duf7HFOMOoxVjcQx+ClqmA==","length":21833210,"stub":true},"NFO-Generator-0.0.0r15.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-ESfJwgMRSIgmBS/XZlfWPQ==","length":21833187,"stub":true},"NFO-Generator-0.0.0r14.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-Cemz6qKG3IwrbVut0bBjdg==","length":21833186,"stub":true},"NFO-Generator-0.0.0r13.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-zhSXWPZP/HS6ftlB5A7iVg==","length":21833059,"stub":true},"NFO-Generator-0.0.0r12.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ZgL3jSMFE1NyyLgIZ1s6JA==","length":21833066,"stub":true},"NFO-Generator-0.0.0r11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-ERURprew8Kn4nDXUgMhtQA==","length":21833064,"stub":true},"NFO-Generator-0.0.0r10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-OWAcjopzEdd3g9NRbrw8mQ==","length":21832878,"stub":true},"NFO-Generator-0.0.0r9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-L9JTKsntNeJ68mXr+vKKsg==","length":21832876,"stub":true},"NFO-Generator-0.0.0r8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-tSo6OnS/NZcEjrmfUGU9Tg==","length":21832859,"stub":true},"NFO-Generator-0.0.0r7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-eeG5n1vLWAr4XVejnRMNpQ==","length":21832786,"stub":true},"NFO-Generator-0.0.0r6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-LGVIWiDxeYQgKrlgMcxFKA==","length":21832797,"stub":true},"NFO-Generator-0.0.0r5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Xd2VDwrI8dhSMXNvRSAB8g==","length":21832757,"stub":true},"NFO-Generator-0.0.0r4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-a+BUSNf+vsUcWfvg1kHB5w==","length":20575897,"stub":true},"NFO-Generator-0.0.0r3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hDqQLI1h3QzEc+VVx5R8XA==","length":20575898,"stub":true},"NFO-Generator-0.0.0r2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8lvu09f28ciMrTi9OP9fBw==","length":8702,"stub":true},"NFO-Generator-0.0.0r1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DfRJHhmzI0NbhfAzaGvYpg==","length":8665,"stub":true},"NFO-Generator-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KhzZMjczHSI8zkL/3sXYaw==","length":8656,"stub":true}}}},
{"id":"NORRIS","key":"NORRIS","value":{"rev":"3-4b5b23b09118582c44414f8d480619e6"},"doc":{"_id":"NORRIS","_rev":"3-4b5b23b09118582c44414f8d480619e6","name":"NORRIS","description":"Namespace Oriented REST and RPC Integrated Stack","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"NORRIS","description":"Namespace Oriented REST and RPC Integrated Stack","keywords":["rpc","norris","rest","realtime","server"],"author":{"name":"Ruben Tan Long Zheng","email":"soggie@gmail.com","url":"http://roguejs.com"},"contributors":[],"dependencies":{"mailer":">=0.6.5","uglify-js":">=1.0.6","redis":">=0.6.7","socket.io":">=0.7.7","request":">=2.0.2"},"main":"./lib/norris.js","bin":{"norris":"./bin/norris"},"version":"0.0.1","engines":{"node":">=0.4.5"},"devDependencies":{"nodemock":">=0.2.13","mock-request":">=0.1.2"},"homepage":"http://norris.roguejs.com","repository":{"type":"git","url":"git://github.com/soggie/norris.git"},"scripts":{"test":"./bin/norris test"},"_npmJsonOpts":{"file":"/Users/soggie/.npm/NORRIS/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NORRIS@0.0.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"39fc02090980b43c202e3da868839b67b329a2a4","tarball":"http://registry.npmjs.org/NORRIS/-/NORRIS-0.0.1.tgz"},"maintainers":[{"name":"rubentan","email":"soggie@gmail.com"}]}},"maintainers":[{"name":"rubentan","email":"soggie@gmail.com"}],"time":{"modified":"2011-08-14T09:27:46.886Z","created":"2011-08-14T09:27:40.896Z","0.0.1":"2011-08-14T09:27:46.886Z"},"author":{"name":"Ruben Tan Long Zheng","email":"soggie@gmail.com","url":"http://roguejs.com"},"repository":{"type":"git","url":"git://github.com/soggie/norris.git"},"_attachments":{"NORRIS-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TIOqImu7aH70K7SgS7/xhQ==","length":9388,"stub":true}}}},
{"id":"NetMatch","key":"NetMatch","value":{"rev":"37-6bf8cdb040be9a8ce627d1b358e4a7a4"},"doc":{"_id":"NetMatch","_rev":"37-6bf8cdb040be9a8ce627d1b358e4a7a4","name":"NetMatch","description":"A node-server of a CoolBasic game NetMatch","dist-tags":{"latest":"1.0.3"},"versions":{"0.1.0":{"name":"NetMatch","version":"0.1.0","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"fe9f14c71cb3654572fa229a51be101f58a997db","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.1.0.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}],"directories":{}},"0.2.0":{"name":"NetMatch","version":"0.2.0","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"da6474cfa4fa9b92f10d1fb1338611f02b077e03","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.2.0.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}],"directories":{}},"0.2.1":{"name":"NetMatch","version":"0.2.1","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c215a64166107723214d6b2a24fbfc4709d27dd3","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.2.1.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}],"directories":{}},"0.2.2":{"name":"NetMatch","version":"0.2.2","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.2.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"80c9b4e03da5dab2e655679a21aa230613f9a30d","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.2.2.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}],"directories":{}},"0.3.0":{"name":"NetMatch","version":"0.3.0","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.3.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.7.5","_defaultsLoaded":true,"dist":{"shasum":"bc983242ba03fd81eafb90d7e62ae60a871871ea","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.3.0.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}],"directories":{}},"0.3.1":{"name":"NetMatch","version":"0.3.1","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.3.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"6ba27efa76f37b94e4e0ddbcbbccf78fe4d70357","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.3.1.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]},"0.3.2":{"name":"NetMatch","version":"0.3.2","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.3.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"20ca99a4c8fa402abb9d683ba9c98761e5dd0534","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.3.2.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]},"0.3.3":{"name":"NetMatch","version":"0.3.3","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@0.3.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f87047a5bdd2092c6af10adb32e1fd56540ad9b2","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-0.3.3.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]},"1.0.0":{"name":"NetMatch","version":"1.0.0","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@1.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c03e7e8a97410fd63ee428571a82bcd784deaa41","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-1.0.0.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]},"1.0.1":{"name":"NetMatch","version":"1.0.1","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"},{"name":"Vili Hietala","email":"viltzu2@gmail.com","url":"http://viltzu.in"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@1.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"2594a1c6bf407d031593b8e84e5f927d0ae89472","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-1.0.1.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]},"1.0.2":{"name":"NetMatch","version":"1.0.2","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"},{"name":"Vili Hietala","email":"viltzu2@gmail.com","url":"http://viltzu.in"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@1.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f4bf1d9a88fa59d62d691138f2476738fc1a56b8","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-1.0.2.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]},"1.0.3":{"name":"NetMatch","version":"1.0.3","author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"description":"A node-server of a CoolBasic game NetMatch","contributors":[{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},{"name":"Ville Lahdenvuo","email":"tuhoojabotti@gmail.com","url":"http://tuhoojabotti.com"},{"name":"Vili Hietala","email":"viltzu2@gmail.com","url":"http://viltzu.in"}],"scripts":{"start":"node ./src/NetMatch.js","debug":"node ./src/NetMatch.js --debug 2","debug1":"node ./src/NetMatch.js --debug 1","debug2":"node ./src/NetMatch.js --debug 2","debug3":"node ./src/NetMatch.js --debug 3"},"bin":{"netmatch":"bin/netmatch.js"},"config":{"config":"config"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"keywords":["game","CoolBasic"],"dependencies":{"cbNetwork":">=0.2.3 <0.3.0","cjson":">=0.0.6 <0.1.0","colors":"*","optimist":"0.3.x"},"preferGlobal":true,"license":"MIT","engine":{"node":">=0.6.0"},"_npmUser":{"name":"vesq","email":"laakso.vesa@gmail.com"},"_id":"NetMatch@1.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"8df2f54b7561e6a9569532111cb75cedec904de6","tarball":"http://registry.npmjs.org/NetMatch/-/NetMatch-1.0.3.tgz"},"maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}]}},"readme":"A [Node.js] implementation of [NetMatch]\r\n========================================\r\nWe're working on to create a fully functional server for [NetMatch], similar to the one made with\r\n[CoolBasic]. The purpose of this far-out project is to have a server which can run on linux, giving\r\nus the chance for always having a server to play in, and to have a server which runs much much\r\nfaster than the CoolBasic one.\r\n\r\nBy using Node.js we get to use the asynchronous nature of JavaScript and also gain knowledge of\r\nNode itself. Because Node.js is essentially JavaScript, we can more easily port the NetMatch client\r\nto JavaScript at some point in the future. That is the ultimate goal for this project - to create\r\nNetMatch that you can play with your own browser!\r\n\r\nDocumentation\r\n-------------\r\nWe document JavaScript with JsDoc and build an HTML-version of the project with [jsdoc-toolkit],\r\npowered by the awesome template [CodeView] \\(thanks to [Wouter Bos] for it!). The latest build of\r\ndocumentations are in `gh-pages` branch and viewable here: http://vesq.github.com/node-NetMatch/doc/\r\n\r\n[Node.js]: http://nodejs.org/\r\n[NetMatch]: https://github.com/VesQ/NetMatch\r\n[CoolBasic]: http://www.coolbasic.com/\r\n[jsdoc-toolkit]: http://code.google.com/p/jsdoc-toolkit/\r\n[CodeView]: http://www.thebrightlines.com/2010/05/06/new-template-for-jsdoctoolkit-codeview/\r\n[Wouter Bos]: http://www.thebrightlines.com/about/","maintainers":[{"name":"vesq","email":"laakso.vesa@gmail.com"}],"time":{"modified":"2012-03-04T13:59:53.740Z","created":"2012-01-21T16:32:05.833Z","0.1.0":"2012-01-21T16:32:07.382Z","0.2.0":"2012-02-05T20:02:29.118Z","0.2.1":"2012-02-26T20:58:23.882Z","0.2.2":"2012-02-27T20:34:56.761Z","0.3.0":"2012-03-01T09:35:43.653Z","0.3.1":"2012-03-01T15:01:03.874Z","0.3.2":"2012-03-02T08:52:06.190Z","0.3.3":"2012-03-02T09:47:15.913Z","1.0.0":"2012-03-02T15:43:09.478Z","1.0.1":"2012-03-03T13:16:12.228Z","1.0.2":"2012-03-03T20:26:31.377Z","1.0.3":"2012-03-04T13:59:53.740Z"},"author":{"name":"Vesa Laakso","email":"laakso.vesa@gmail.com","url":"http://vesq.net"},"repository":{"type":"git","url":"git://github.com/VesQ/node-NetMatch.git"},"_attachments":{"NetMatch-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-1YCIh/huvMeOnCcqYH2VXQ==","length":95166,"stub":true},"NetMatch-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-1c49XoPIzL4Hab8809g38g==","length":94488,"stub":true},"NetMatch-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-ug1Pac2dhgbZmaUBJmQzcw==","length":94480,"stub":true},"NetMatch-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-k/o0orY6VqFuxhi48w0lCw==","length":94392,"stub":true},"NetMatch-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-2SwzdlOpXIXuX4OFZzgykA==","length":94191,"stub":true},"NetMatch-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-e8lql3aoek2XnuBgUj6IuQ==","length":94187,"stub":true},"NetMatch-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-AbZWdfyuA0BW47VkHjGqBg==","length":94191,"stub":true},"NetMatch-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hbMetO9U15pUaogyAEXqFQ==","length":95141,"stub":true},"NetMatch-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fHFUzIIOhbLTI+5VtkpJyQ==","length":93401,"stub":true},"NetMatch-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Dw2UKMcIbDE9oKJd8dT8GA==","length":92147,"stub":true},"NetMatch-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+0BGsTLD/res68uLeLp6Lg==","length":90832,"stub":true},"NetMatch-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yW3T+AJQfkx9C970Uw/wMw==","length":89400,"stub":true}}}},
{"id":"NetOS","key":"NetOS","value":{"rev":"3-3f943f87a24c11e6dd8c265469914e80"},"doc":{"_id":"NetOS","_rev":"3-3f943f87a24c11e6dd8c265469914e80","name":"NetOS","description":"Event driven network operating system","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"NetOS","description":"Event driven network operating system","url":"http://github.com/jaredjbarnes/NetOS","keywords":["operating system","os","network","server","nodes"],"author":{"name":"Jared Barnes","email":"jared.j.barnes@gmail.com"},"contributors":[],"licenses":["MIT"],"dependencies":{},"lib":"lib","main":"./lib/netOS","version":"0.0.1","directories":{},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/home/jaredbarnes/.npm/NetOS/0.0.1/package/package.json","serverjs":false,"wscript":false,"contributors":false},"_id":"NetOS@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3d7767114edf9a31b42b5905ba848ed697ed6a2f","tarball":"http://registry.npmjs.org/NetOS/-/NetOS-0.0.1.tgz"},"maintainers":[{"name":"jaredjbarnes","email":"jared.j.barnes@gmail.com"}]}},"maintainers":[{"name":"jaredjbarnes","email":"jared.j.barnes@gmail.com"}],"time":{"modified":"2011-09-22T04:48:06.529Z","created":"2011-09-22T04:48:04.515Z","0.0.1":"2011-09-22T04:48:06.529Z"},"author":{"name":"Jared Barnes","email":"jared.j.barnes@gmail.com"},"_attachments":{"NetOS-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-r05k3xABcY8BKvkktcq97A==","length":7020,"stub":true}}}},
{"id":"Netflow","key":"Netflow","value":{"rev":"3-4db0b5144c5c954e7d5d74e087951efb"},"doc":{"_id":"Netflow","_rev":"3-4db0b5144c5c954e7d5d74e087951efb","name":"Netflow","description":"Netflow consumer for node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Sharif Ghazzawi","email":"Sharif.Ghazzawi@gmail.com"},"name":"Netflow","description":"Netflow consumer for node.js","version":"0.0.1","homepage":"https://github.com/Sghazzawi/Node-Netflowd","repository":{"type":"git","url":"git://github.com/Sghazzawi/Node-Netflowd.git"},"main":"lib/Netflow","engines":{"node":">= 0.4.0"},"devDependencies":{},"_npmUser":{"name":"sharif.ghazzawi","email":"sharif.ghazzawi@gmail.com"},"_id":"Netflow@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"354c1a451b166005573bd8f60901705f170b3a5f","tarball":"http://registry.npmjs.org/Netflow/-/Netflow-0.0.1.tgz"},"maintainers":[{"name":"sharif.ghazzawi","email":"sharif.ghazzawi@gmail.com"}]}},"readme":"Node-Netflowd\n=============\n\nIs a netflow sink for node.js\n\nInstallation\n============\n\nnpm install https://github.com/Sghazzawi/Node-Netflowd/tarball/master\n\nBasic Example\n=============\n\n    var Collector=require(\"Netflow\");\n    var x = new Collector(function (err) {\n        if(err != null) {\n            console.log(\"ERROR ERROR \\n\"+err);\n        }\n    })\n    .on(\"listening\",function() { console.log(\"listening\"); } )\n    .on(\"packet\",function(packet) { console.log(packet); } )\n    .listen(2055);\n","maintainers":[{"name":"sharif.ghazzawi","email":"sharif.ghazzawi@gmail.com"}],"time":{"modified":"2012-04-03T18:56:25.414Z","created":"2012-04-03T18:56:25.159Z","0.0.1":"2012-04-03T18:56:25.414Z"},"author":{"name":"Sharif Ghazzawi","email":"Sharif.Ghazzawi@gmail.com"},"repository":{"type":"git","url":"git://github.com/Sghazzawi/Node-Netflowd.git"},"_attachments":{"Netflow-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8m1WjvRRbMIlNex1fuEggw==","length":3382,"stub":true}}}},
{"id":"Neuro","key":"Neuro","value":{"rev":"62-2e87a80bc9fc58cc42f1253999417a26"},"doc":{"_id":"Neuro","_rev":"62-2e87a80bc9fc58cc42f1253999417a26","name":"Neuro","description":"A MVC written with MooTools.","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.0","license":"MIT (http://mootools.net/license.txt)","main":"cjs/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":{"name":"https://github.com/gcheung55/neuro/issues"},"repository":{"type":"git","url":"git://github.com/gcheung55/neuro.git"},"_npmUser":{"name":"GarrickCheung","email":"garrick@garrickcheung.com"},"_id":"Neuro@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"20e5b28cba6897b9a93b34ed179b2138134aaae2","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.0.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.1":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.1","license":"MIT (http://mootools.net/license.txt)","main":"cjs/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":{"name":"https://github.com/gcheung55/neuro/issues"},"repository":{"type":"git","url":"git://github.com/gcheung55/neuro.git"},"_npmUser":{"name":"GarrickCheung","email":"garrick@garrickcheung.com"},"_id":"Neuro@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7adf67a3001516f02cfbd90c146460f478977e74","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.1.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.2":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.2","license":"MIT (http://mootools.net/license.txt)","main":"Source/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":{"name":"https://github.com/gcheung55/neuro/issues"},"repository":{"type":"git","url":"git://github.com/gcheung55/neuro.git"},"_npmUser":{"name":"GarrickCheung","email":"garrick@garrickcheung.com"},"_id":"Neuro@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"74d3d3eca44fa331669deea5b64ace4e91178d52","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.2.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.3":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.3","license":"MIT (http://mootools.net/license.txt)","main":"Source/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.3 (Alpha)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    _data: {\n        firstName: ''\n        ,lastName: ''\n        ,hp: 10\n        ,max: 100\n        ,lvl: 1\n        // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n        ,name: function(){\n            return this.firstName + ' ' + this.lastName;\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection\nHumans.add({\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n});\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a builder\n* Add a Router mechanism\n* Add a Sync mechanism\n","_id":"Neuro@0.1.3","dist":{"shasum":"013925518f99620f8d10048fd58276640e34c11c","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.3.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.4":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.4","license":"MIT (http://mootools.net/license.txt)","main":"Source/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.4 (Alpha)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    ,options: {\n        defaults: {\n            firstName: ''\n            ,lastName: ''\n            ,hp: 10\n            ,max: 100\n            ,lvl: 1\n            // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n            ,name: function(){\n                return this.firstName + ' ' + this.lastName;\n            }\n        }\n        // Custom setters and getters go here.\n        // Return a null not trigger change.\n        ,accessors: {\n            name: {\n                // isPrevious is a flag set when using the getPrevious method, to help you know what data to look for\n                get: function(isPrevious){\n                    // Just an example. You can also go directly to the data because \"this\" is exposed, which will allow you to bypass other custom getters.\n                    var getMethod = 'get';\n                    isPrevious && (method += 'Previous');\n\n                    return this[getMethod]('firstName') + ' ' + this[getMethod]('lastName');\n                }\n            }\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection, must be an Array\nHumans.add([{\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n}]);\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a Router mechanism\n* Add a basic View Class","_id":"Neuro@0.1.4","dist":{"shasum":"04e5bb8d8d2d9163fa9db76c986ee7ab2e447904","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.4.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.5":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.5","license":"MIT (http://mootools.net/license.txt)","main":"Source/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.5 (Alpha)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    ,options: {\n        defaults: {\n            firstName: ''\n            ,lastName: ''\n            ,hp: 10\n            ,max: 100\n            ,lvl: 1\n            // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n            ,name:''\n        }\n        // Custom setters and getters go here.\n        // Return a null not trigger change.\n        ,accessors: {\n            name: {\n                // isPrevious is a flag set when using the getPrevious method, to help you know what data to look for\n                get: function(isPrevious){\n                    // Just an example. You can also go directly to the data because \"this\" is exposed, which will allow you to bypass other custom getters.\n                    var getMethod = 'get';\n                    isPrevious && (method += 'Previous');\n\n                    return this[getMethod]('firstName') + ' ' + this[getMethod]('lastName');\n                }\n            }\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection, must be an Array\nHumans.add([{\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n}]);\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a Router mechanism\n* Add a basic View Class","_id":"Neuro@0.1.5","dist":{"shasum":"fd60c964efaa5769ccfc79456368100e39b030aa","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.5.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.6":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.6","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.6 (Alpha)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    ,options: {\n        defaults: {\n            firstName: ''\n            ,lastName: ''\n            ,hp: 10\n            ,max: 100\n            ,lvl: 1\n            // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n            ,name:''\n        }\n        // Custom setters and getters go here.\n        // Return a null not trigger change.\n        ,accessors: {\n            name: {\n                // isPrevious is a flag set when using the getPrevious method, to help you know what data to look for\n                get: function(isPrevious){\n                    // Just an example. You can also go directly to the data because \"this\" is exposed, which will allow you to bypass other custom getters.\n                    var getMethod = 'get';\n                    isPrevious && (method += 'Previous');\n\n                    return this[getMethod]('firstName') + ' ' + this[getMethod]('lastName');\n                }\n            }\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection, must be an Array\nHumans.add([{\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n}]);\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a Router mechanism\n* Add a basic View Class","_id":"Neuro@0.1.6","dist":{"shasum":"cd3bef74b14d90478f92b1a0a9c2583eae9fdf49","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.6.tgz","_requested_path":"Neuro","_basePath":""},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.7":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.7","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.7 (Alpha)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nExtensions\n----\n* [Neuro-Sync](gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](gcheung55/neuro-company) - Extends Neuro with an Observer API\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    ,options: {\n        defaults: {\n            firstName: ''\n            ,lastName: ''\n            ,hp: 10\n            ,max: 100\n            ,lvl: 1\n            // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n            ,name:''\n        }\n        // Custom setters and getters go here.\n        // Return a null not trigger change.\n        ,accessors: {\n            name: {\n                // isPrevious is a flag set when using the getPrevious method, to help you know what data to look for\n                get: function(isPrevious){\n                    // Just an example. You can also go directly to the data because \"this\" is exposed, which will allow you to bypass other custom getters.\n                    var getMethod = 'get';\n                    isPrevious && (method += 'Previous');\n\n                    return this[getMethod]('firstName') + ' ' + this[getMethod]('lastName');\n                }\n            }\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection, must be an Array\nHumans.add([{\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n}]);\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a Router mechanism\n* Add a basic View Class","_id":"Neuro@0.1.7","dist":{"shasum":"38e2b138976724b4c8d6e79cb523a90e90e3fff3","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.7.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.8":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.8","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"devDependencies":{"buster":"*"},"scripts":{"test":"node_modules/.bin/buster-test"},"engines":{"node":"~0.6.0"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.8 (Alpha)\n\n[![Build Status](https://secure.travis-ci.org/GCheung55/Neuro.png)](http://travis-ci.org/GCheung55/Neuro)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nExtensions\n----\n* [Neuro-Sync](gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](gcheung55/neuro-company) - Extends Neuro with an Observer API\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    ,options: {\n        defaults: {\n            firstName: ''\n            ,lastName: ''\n            ,hp: 10\n            ,max: 100\n            ,lvl: 1\n            // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n            ,name:''\n        }\n        // Custom setters and getters go here.\n        // Return a null not trigger change.\n        ,accessors: {\n            name: {\n                // isPrevious is a flag set when using the getPrevious method, to help you know what data to look for\n                get: function(isPrevious){\n                    // Just an example. You can also go directly to the data because \"this\" is exposed, which will allow you to bypass other custom getters.\n                    var getMethod = 'get';\n                    isPrevious && (method += 'Previous');\n\n                    return this[getMethod]('firstName') + ' ' + this[getMethod]('lastName');\n                }\n            }\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection, must be an Array\nHumans.add([{\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n}]);\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a Router mechanism\n* Add a basic View Class","_id":"Neuro@0.1.8","dist":{"shasum":"8f023a0bd8db49dec7714daf56bb03865b367861","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.8.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.1.9":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.1.9","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"devDependencies":{"buster":"*"},"scripts":{"test":"node_modules/.bin/buster-test"},"engines":{"node":"~0.6.0"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.9 (Alpha)\n\n[![Build Status](https://secure.travis-ci.org/GCheung55/Neuro.png)](http://travis-ci.org/GCheung55/Neuro)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nExtensions\n----\n* [Neuro-Sync](gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](gcheung55/neuro-company) - Extends Neuro with an Observer API\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    ,options: {\n        defaults: {\n            firstName: ''\n            ,lastName: ''\n            ,hp: 10\n            ,max: 100\n            ,lvl: 1\n            // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n            ,name:''\n        }\n        // Custom setters and getters go here.\n        // Return a null not trigger change.\n        ,accessors: {\n            name: {\n                // isPrevious is a flag set when using the getPrevious method, to help you know what data to look for\n                get: function(isPrevious){\n                    // Just an example. You can also go directly to the data because \"this\" is exposed, which will allow you to bypass other custom getters.\n                    var getMethod = 'get';\n                    isPrevious && (method += 'Previous');\n\n                    return this[getMethod]('firstName') + ' ' + this[getMethod]('lastName');\n                }\n            }\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection, must be an Array\nHumans.add([{\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n}]);\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a Router mechanism\n* Add a basic View Class","_id":"Neuro@0.1.9","dist":{"shasum":"f5af514759d57bb26ef8f5de6533a3186484b8d6","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.1.9.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.2.0":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.2.0","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"devDependencies":{"buster":"*"},"scripts":{"test":"node_modules/.bin/buster-test"},"engines":{"node":"~0.6.0"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n__Version: 0.2.0 (Alpha)__\n\n[![Build Status](https://secure.travis-ci.org/GCheung55/Neuro.png)](http://travis-ci.org/GCheung55/Neuro)\n\n__Influences:__\n\n* [Backbone](/documentcloud/backbone)\n* [Shipyard](/seanmonstar/Shipyard)\n\n__Dependencies:__\n\n* [MooTools-Core 1.x](/mootools/mootools-core)\n* [Is.js](/gcheung55/is.js)\n\n__Focus:__\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\n__Extensions:__\n\n* [Neuro-Sync](http://github.com/gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](http://github.com/gcheung55/neuro-company) - Extends Neuro with an Observer API\n\n## Neuro Model\nThe __Model__ is a Object-like MooTools Class object that provides a basic API to interact with data. You can use Model by itself or extend other Class objects with it. It implements `each`, `filter`, and other convenient methods from `Object`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: CustomAccessor](#mixin-customaccessor)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar model = new Neuro.Model(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Object) An object containing key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * defaults - (Object) Contains the default key/value pair defaults for the Model.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n    * accessor - (Object) See [Mixin: CustomAccessor](#mixin-customaccessor)\n\n#### Returns: Model instance.\n\n#### Events:\n* `change: function(model){}` - Triggered when a change to the model's data has occurred\n* `change:key: function(model, key, value, oldValue){}` - Triggered when a specific model data property change has occurred. The `key` refers to the specific property. All `change:key` events will be triggered before `change` is triggered.\n* `destroy: function(model){}` - Triggered when the model is destroyed.\n* `reset: function(model){}` - Triggered when the model is reset to its default values.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n#### Returns: Model instance.\n\n### set\n---\nThe way to assign values to properties the model has. __Do not__ use direct assignment else events will not be triggered or custom setters will not be used.\n\n#### Syntax:\n```javascript\nmodel.set(property, value);\n\nmodel.set(object);\n```\n\n#### Arguments:\n* Two Arguments (property, value)\n    1. property - (String) A key used to define a property the model has.\n    2. value - (String | Array | Number | Object | Function | Class) A value of the corresponding property.\n* One Argument (object)\n    1. object (Object) An object containing sets of property/value pairs\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n### isSetting\n---\nUse to check if data is currently being handled by the model to assign values to properties the model has.\n\n#### Syntax:\n```javascript\nmodel.isSetting();\n```\n\n#### Returns: Boolean (true/false).\n\n### get\n---\nRetrieve a property value the model has.\n\n#### Syntax:\n```javascript\nmodel.get(property);\n\nmodel.set(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding values that the model has.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding value that the model has.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of data that the model has. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the property that the model has.\n\n### getData\n---\nRetrieve all properties/values the model has. The returned object is a clone (dereferenced) of the data the model has.\n\n#### Syntax:\n```javascript\nmodel.getData();\n```\n\n#### Returns: Object containing the data the model has.\n\n### getPrevious\n---\nRetrieve the previous property value he model had. Model only retains one record of previous data.\n\n#### Syntax:\n```javascript\nmodel.getPrevious(property);\n\nmodel.getPrevious(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding previous values that the model had.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding previous value that the model had.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of previous data that the model had. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the previous property that the model had.\n\n### getPreviousData\n---\nRetrieve all previous properties/values the model had. THe returned object is a clone (dereferenced) of the previous data the model had.\n\n#### Syntax:\n```javascript\nmodel.getPreviousData();\n```\n\n#### Returns: Object containing the previous data the model had.\n\n### unset\n---\nUnset data properties the model has. Data properties can not be erased so they will be set to `undefined`.\n\n#### Syntax:\n```javascript\nmodel.unset(property);\n\nmodel.unset([property1, property2]);\n```\n\n#### Arguments:\n1. property - (String | Array) The property to be unset that the model has. Multiple properties can be unset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n### reset\n---\nReset data properties to their default values the model had.\n\n#### Syntax:\n```javascript\nmodel.reset();\n\nmodel.reset(property);\n\nmodel.reset([property1, property2]);\n```\n#### Arguments:\n* Zero Arguments\n    * all data properties in the model is reset to the defined options.defaults\n* One Argument\n    * property - (String | Array, optional) The property to be reset that the model has. Multiple properties can be reset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n* `reset`\n\n### change\n---\nChecks if data is changed before triggering `change` event. Not likely to be called outside of `set`.\n\n```javascript\nmodel.change();\n```\n\n#### Returns: Model instance.\n\n#### Triggered Events: (only if there is a change in the model data)\n* `change`\n\n### changeProperty\n---\nChecks if data is changed before triggering `change:key` event. Not likely to be called outside of `set`.\n\n```javascript\nmodel.changeProperty(property, value);\n\nmodel.changeProperty(object);\n```\n\n#### Arguments:\n* Two Arguments (property, value)\n    1. property - (String) A key corresponding to the changed property the model has.\n    2. value - (String | Array | Number | Object | Function | Class) A value of the corresponding property that was changed.\n* One Argument (object)\n    1. object (Object) An object containing sets of property/value pairs\n\n#### Returns: Model instance.\n\n#### Triggered Events: (only if there is a change in the model data)\n* `change:key`\n\n### destroy\n---\nTriggers the `destroy` event. This should be overriden in a Class that extends from Model to do additional things. If overriden, remember to call `this.parent();` to trigger the `destroy` method, or execute `signalDestroy` manually.\n\n#### Syntax:\n```javascript\nmodel.destroy();\n```\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `destroy`\n\n### toJSON\n---\nReturns a copy of data the model has. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\nmodel.toJSON();\n```\n\n#### Returns: Object containing the data the model has.\n\n### spy\n---\nA convenient method to attach event listeners to `change:key`.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n\nmodel.spy(object);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property to listen to.\n    2. function - (Function) Function that is to be executed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### unspy\n---\nA convenient method to remove event listeners to `change:key`. If a function is not provided, all events attached to a specific `change:key` will be removed.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property that is being listend to.\n    2. function - (Function, optional) Function that is to be removed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### setupAccessors\n---\nsee [Mixin: CustomAccessor](#mixin-customaccessor)\n### isAccessing\n---\nsee [Mixin: CustomAccessor](#mixin-customaccessor)\n### setAccessor\n---\nsee [Mixin: CustomAccessor](#mixin-customaccessor)\n### getAccessor\n---\nsee [Mixin: CustomAccessor](#mixin-customaccessor)\n### unsetAccessor\n---\nsee [Mixin: CustomAccessor](#mixin-customaccessor)\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Object Methods\n---\nThe following methods have been implemented from MooTools-Core Object onto Neuro Model. They take the same arguments as their Object counterparts with the exception of having to pass the model as the object to be acted upon.\n\n* `each`\n* `subset`\n* `map`\n* `filter`\n* `every`\n* `some`\n* `keys`\n* `values`\n* `getLength`\n* `keyOf`\n* `contains`\n* `toQueryString`\n\n```javascript\nmodel.each(function[, bind]);\nmodel.subset(keys);\nmodel.map(function[, bind]);\nmodel.filter(function[, bind]);\nmodel.every(function[, bind]);\nmodel.some(function[, bind]);\nmodel.keys();\nmodel.values();\nmodel.getLength();\nmodel.keyOf(property);\nmodel.contains(value);\nmodel.toQueryString();\n```\n\n## Neuro Collection\nThe __Collection__ is an Array-like MooTools Class object that provides a basic API to interact with multiple __Models__. You can use __Collection__ by itself or extend other Class objects with it. It contains a reference to a __Model__ Class to create a model instance when adding a data `Object`. The reference __Model__ Class can be optionally replaced by a different Class that extends from __Model__. It implements `each`, `filter`, and some other convenient methods from `Array`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar collection = new Neuro.Collection(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Mixed, optional)\n    * Model - A `Model` instance\n    * Object - An object of key/value pairs that will be used to create a model instance\n    * Array - An array of Model instances or object key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * Model - (Model, defaults to undefined) The `Model` Class used to create model instances from when an `Object` is passed to `add`.\n    * modelOptions - (Object, defaults to undefined) An `Object` containing options for creating new model instances. See [Neuro Model](#neuro-model)\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: Class instance.\n\n#### Events:\n* `add: function(collection, model){}` - Triggered when a model is added to the collection.\n* `remove: function(collection, model){}` - Triggered when a specific model is removed from the collection.\n* `empty: function(collection){}` - Triggered when the collection is emptied of all models.\n* `sort: function(collection){}` - Triggered when `sort` or `reverse` occurs.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n* A default model is defined in the `Collection` Class as the `_Model` property. It can be overriden by `options.Model` or when a Class extends from `Collection` and defines a different `_Model` property.\n* Define `options.primaryKey` to better identify model instances, such as checking if the collection `hasModel`.\n\n#### Returns: Model instance.\n\n### hasModel\n---\nChecks if the collection instance contains a model by checking if the model exists in the `_models` array or using `options.primaryKey` to compare models.\n\n#### Syntax:\n```javascript\ncurrentCollection.hasModel(model);\n```\n\n#### Arguments:\n1. model - (Object | Model) An `Object` or `Model` instance that is used to compare with existing models in the collection. `options.primaryKey` will be used to compare against the models if an initial use of `Array.contains` returns `false`.\n\n#### Returns: Boolean.\n\n### add\n---\nAdding a model to the collection should always go through this method. It appends the model to the internal `_model` array and triggers the `add` event if the collection does not already contain the model. If an `Object` is passed in, the `Object` will be converted to a model instance before being appended to `_model`. Adding a model will increase the collections `length` property. It is possible to insert a model instance into `_model` at a specific index by passing a second argument to `add`. A `remove` method is attached to the models `destroy` event so that the model can be properly removed if the model `destroy` event is triggered.\n\n#### Syntax:\n```javascript\ncurrentCollection.add(models, at);\n```\n\n#### Arguments:\n1. models - (Object | Model | Array)\n    * Object - An `Object` with key/value pairs of data properties. It will be converted to a `Model` instance before adding to `_model`.\n    * Model - A `Model` instance.\n    * Array - An `Array` that contain a mix of `Object` and `Model` instances.\n2. at - (Number, optional) The index to insert the model in the `_model` array. If the collection is empty, `at` is ignored and and the model is inserted as the first item in the array.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n\n#### Examples:\n```javascript\ncurrentCollection.add({\n    id: 1, name: 'Bruce Lee'\n}, 2);\n\ncurrentCollection.add( new Neuro.Model({id: 1, name: 'Bruce Lee'}) );\n\ncurrentCollection.add(\n    [\n        {id: 1, name: 'Bruce Lee'}, \n        new Neuro.Model({id: 1, name: 'Chuck Norris'})\n    ]\n);\n```\n\n### get\n---\nGet the model by index. Multiple indexes can be passed to get to retrieve multiple models.\n\n#### Syntax:\n```javascript\ncurrentCollection.get(index);\n```\n\n#### Arguments:\n1. index - (Number) The index number of the model to return.\n\n#### Returns: A model instance corresponding to the index in `_model`. If multiple indexes are passed to `get`, an `Array` of models is returned, where each model corresponds to the index.\n\n#### Examples:\n```javascript\ncurrentCollection.get(0); // returns the model instance that corresponds to the index argument\n\ncurrentCollection.get(0, 2, 3); // returns an array of model instances where each model corresponds to each index argument\n```\n\n### remove\n---\nRemove a model or models from the collection. It will trigger the `remove` event for each individual model removed. The collection should remove the model only if it exists on the collection. Removing the model from the collection will also remove the `remove` method from the models `destroy` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.remove(model);\n```\n\n#### Arguments:\n1. model - (Model | Array) A model or array of models that will be removed from `_model`.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove`\n\n#### Examples:\n```javascript\nvar model = new Neuro.Model({id: 1, name: 'Garrick'});\n\ncurrentCollection.add(model);\n\ncurrentCollection.remove(model);\n\n//or\n\ncurrentCollection.remove([model]); // remove an array of models.\n```\n\n### replace\n---\nReplace an existing model in the collection with a new one if the old model exists and the new model does not exist in the collection `_model` array. This will trigger `add` and `remove` events.\n\n#### Syntax:\n```javascript\ncurrentCollection.replace(oldModel, newModel);\n```\n\n#### Arguments:\n1. oldModel (Model) - The model that will be replaced in the collection.\n2. newModel (Object | Model) - The new model that will be replacing the old one.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n* `remove`\n\n### sort\n---\nSort the collection. Works the same way `[Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort)` would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.sort(function);\n```\n\n#### Arguments:\n1. function - (Function, optional) The function acts as a comparator. Please see `[Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort)` for more information.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n#### Examples:\n```javascript\n// Sorts models ordered by id, where id is a number.\n// This function sorts the order from smallest to largest number.\n\ncurrentCollection.sort(function(modelA, modelB){\n    return modelA.get('id') - modelB.get('id');\n});\n```\n\n### reverse\n---\nReverses the order of the collection. Works the same way `[Array.reverse](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reverse)` would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.reverse();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n### empty\n---\nEmpty the collection of all models. Triggers the `empty` event and `remove` event for each model removed.\n\n#### Syntax:\n```javascript\ncurrentCollection.empty();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove` for each model removed\n* `empty`\n\n### toJSON\n---\nReturns a copy of collection `_model`. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\ncurrentCollection.toJSON();\n```\n\n#### Returns: Object containing the collection `_model`.\n\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Array Methods\n---\nThe following methods have been implemented from MooTools-Core Array onto Neuro Collection. They take the same arguments as their Object counterparts with the exception of having to pass the collection as the object to be acted upon.\n\n* `forEach`\n* `each`\n* `invoke`\n* `every`\n* `filter`\n* `clean`\n* `indexOf`\n* `map`\n* `some`\n* `associate`\n* `link`\n* `contains`\n* `getLast`\n* `getRandom`\n* `flatten`\n* `pick`\n\n```javascript\ncollection.forEach(function[, bind]);\ncollection.each(function[, bind]);\ncollection.invoke(method[, arg, arg, arg ...]);\ncollection.every(function[, bind]);\ncollection.filter(function[, bind]);\ncollection.clean();\ncollection.indexOf(item[, from]);\ncollection.map(function[, bind]);\ncollection.some(function[, bind]);\ncollection.associate(object);\ncollection.link(object);\ncollection.contains(item[, from]);\ncollection.getLast();\ncollection.getRandom();\ncollection.flatten();\ncollection.pick();\n```\n\n## Neuro View\nThe __View__ is a MooTools Class object. It acts as a layer between an element and everything else. One of the usual conventions of plugins that deals with elements has to attach/detach events to/from the element. The __View__ provides a simple, yet basic, way of binding methods/functions to the element event listeners.\n\nAnother convention is that attaching event handlers to classes can be a manual process. __View__ implements the [Connector](#mixin-connector) utility class to provide a powerful and automatic way to attach events between two classes.\n\nThe `render` method is the main method that should be used to visualize the element with data. The method is basic, triggering the `render` event on the __View__ class. Other class objects should extend from the __View__ class and override the `render` method, but call `this.parent` in order to trigger the `render` event.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar view = new Neuro.View(options);\n```\n\n#### Arguments:\n1. `options` - (Object, optional) The View options\n    * element - (String | Element, defaults to `undefined`) The root/parent element of where the rendered elements should be placed.\n    * events - (Object, defaults to `undefined`) An `Object` of key/value pairs\n        * `key` - (String) The element event or event-delegate type. `click` or `click:relay(selector)`\n        * `value` - (String | Function | Array) The handler that is attached to the event. It can be a `String` (amethod name in the view class instance), `Function`, or an `Array` of containing a mix of `String` or `Function` items.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: View instance..\n\n#### Events:\n* `ready: function(view){}` - Triggered  at the end of the `setup` method.\n* `render: function(view){}` - Triggered at the end of the `render` method.\n* `inject: function(view){}` - Triggered at the end of the `inject` method.\n* `dispose: function(view){}` - Triggered at the end of the `dispose` method.\n* `destroy: function(view){}` - Triggered at the end of the `destroy` method.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n### setup\n---\nCalled during `initialize` to `setOptions`, `setElement`, and trigger the `ready` event.\n\n#### Arguments:\n* Same as `initialize`\n\n#### Returns: View instance.\n\n### toElement\n---\nA method to retrieve the element stored in the view instance. Any Class instance, with a `toElement` method, passed to MooTools Element `document.id` or `$` method will return the value from the classes `toElement` method. This is a hidden MooTools Core trick.\n\n#### Syntax:\n```javascript\nview.toElement();\n\ndocument.id(view);\n\n$(view);\n```\n\n#### Returns: `element` property stored in view instance.\n\n### setElement\n---\nStore the root element for the view instance. If an element exists, it will first execute View `destroy` method to properly detach events and remove references to it. Then it will store a reference to the element and execute View `attachEvents`.\n\n#### Syntax:\n```javascript\nview.setElement(element);\n```\n\n#### Arguments:\n1. element - (Element) Element to be set as root element in the view instance. `attachEvents` will refer to `options.events` for the event and method/function to attach.\n\n#### Returns: View instance.\n\n### attachEvents\n---\nAttach events to the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be detached using `detachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.attachEvents();\n```\n\n#### Returns: View instance.\n\n### detachEvents\n---\nDetach events from the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be attached using `attachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.detachEvents();\n```\n\n#### Returns: View instance.\n\n### create\n---\nIt is a no-op method. Override `create` in your Class that extends from __View__. It could be used to create the root `element`, or other child elements that goes into the root `element.\n\n#### Syntax:\n```javascript\nview.create();\n```\n\n#### Returns: View instance.\n\n### render\n---\nAlthough `render` is considered a no-op method, it still trggers the `render` event. Override `render` in your Class that extends from __View__.  __Remember__ to call 'this.parent()' at the end of your code to execute the original `render` method that will trigger the `render` event. Pass `data` to the `render` method, such as Neuro Model or Neuro Collection.\n\nIf you are passing any Class that implements [Mixin: Connector](#mixin-connector), you should consider using the `connect` method. It will help to automatically attach events between the View instance and the other Classes, in this case it is likely to be a Neuro Model or Neuro Collection instances.\n\n#### Syntax:\n```javascript\nview.render(data);\n```\n\n#### Arguments:\n1. data - (Mixed) It can be anything you will use as data to render the view. This also means you can pass in multiple Neuro Model instances, multiple Neuro Collection instances, other View instances. Use your imagination.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `render`\n\n### inject\n---\nInject or inserts the root `element` relative to another element or View instance. `document.id` / `$` will resolve the element from the other View instance.\n\n#### Syntax:\n```javascript\nview.inject(reference[, where]);\n```\n\n#### Arguments:\n1. reference - (String | Element | Class) The `element` will be placed relative to the reference element. A `String` should be the id of the reference element, without the \"#\". A `Class` instance should have a `toElement` method in order to resolve the reference element.\n2. where - (String, optional, defaults to \"bottom\") The place to inject/insert the `element` relative to the reference element. Can be: `top`, `bottom`, `after`, or `before`.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `inject`\n\n### dispose\n---\nRemoves the Element from the DOM but retains it in memory if the `element` exists.\n\n#### Syntax:\n```javascript\nview.dispose();\n```\n\n#### Returns: View instance.\n\n#### Triggered Events\n* `dispose`\n\n### destroy\n---\nRemoves the Element and its children from the DOM and prepares them for garbage collection. Executes `detatchEvents` and removes reference to element in `element` property. Triggers `destroy` event.\n\n#### Syntax:\n```javascript\nview.destroy();\n```\n\n#### Returns: View instance.\n\n## Mixin: Events\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. `Events` in a Class that implements `Events` must be either added as an option or with `addEvent`, not directly through .`options.onEventName`.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({ Implements: Events });\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Events);\n```\n\n#### Implementing:\n\n* This class can be implemented into other classes to add its functionality to them.\n* `Events` has been designed to work well with the `Options` class. When the option property begins with 'on' and is followed by a capital letter it will be added as an event (e.g. `onComplete` will add as `complete` event).\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(element){\n        // ...\n    },\n    complete: function(){\n        this.fireEvent('complete');\n    }\n});\n\nvar myWidget = new Widget();\nmyWidget.addEvent('complete', myFunction);\n```\n\n#### Notes:\n* Events starting with 'on' are still supported in all methods and are converted to their representation without 'on' (e.g. 'onComplete' becomes 'complete').\n\n### addEvent\n---\nAdds an event to the Class instance's event stack.\n\n#### Syntax:\n```javascript\nmyClass.addEvent(type, fn[, internal]);\n```\n\n#### Arguments:\n1. type     - (String) The type of event (e.g. `complete`).\n2. fn       - (Function) The function to execute.\n3. internal - (Boolean, optional) Sets the function property: internal to true. Internal property is used to prevent removal.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvent('start', myStartFunction);\n```\n\n### addEvents\n---\nThe same as `addEvent`, but accepts an object to add multiple events at once.\n\n#### Syntax:\n```javascript\nmyClass.addEvents(events);\n```\n\n#### Arguments:\n1. events - (Object) An object with key/value representing: key the event name (e.g. `start`), and value the function that is called when the Event occurs.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvents({\n    start: myStartFunction,\n    complete: function() {\n        alert('Done.');\n    }\n});\n```\n\n### fireEvent\n---\nFires all events of the specified type in the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.fireEvent(type[, args[, delay]]);\n```\n\n#### Arguments:\n1. type  - (String) The type of event (e.g. `complete`).\n2. args  - (String | Array, optional) The argument(s) to pass to the function. To pass more than one argument, the arguments must be in an array.\n3. delay - (Number, optional) Delay in milliseconds to wait before executing the event (defaults to 0).\n\n### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(arg1, arg2){\n        //...\n        this.fireEvent('initialize', [arg1, arg2], 50);\n    }\n});\n```\n\n### removeEvent\n---\nRemoves an event from the stack of events of the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.removeEvent(type, fn);\n```\n#### Arguments:\n1. type - (String) The type of event (e.g. `complete`).\n2. fn   - (Function) The function to remove.\n\n#### Returns: This Class instance.\n\n#### Notes:\n* If the function has the property internal and is set to true, then the event will not be removed.\n\n\n### removeEvents\n---\nRemoves all events of the given type from the stack of events of a Class instance. If no type is specified, removes all events of all types.\n\n#### Syntax:\n```javascript\nmyClass.removeEvents([events]);\n```\n\n#### Arguments:\n1. events - (optional) If not passed removes all events of all types.\n    - (String) The event name (e.g. 'success'). Removes all events of that type.\n    - (Object) An object of type function pairs. Like the one passed to `addEvents`.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('myElement', 'opacity');\nmyFx.removeEvents('complete');\n```\n\n#### Notes:\n* removeEvents will not remove internal events. See `Events:removeEvent`.\n\n## Mixin: Options\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. Used to automate the setting of a Class instance's options. Will also add Class `Events` when the option property begins with 'on' and is followed by a capital letter (e.g. `onComplete` adds a `complete` event). You will need to call `this.setOptions()` for this to have an effect, however.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({Implements: Options});\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Options);\n```\n\n### setOptions\n---\nMerges the default options of the Class with the options passed in. Every value passed in to this method will be deep copied. Therefore other class instances or objects that are not intended for copying must be passed to a class in other ways.\n\n#### Syntax:\n```javascript\nmyClass.setOptions([options]);\n```\n\n#### Arguments:\n1. options - (Object, optional) The user defined options to merge with the defaults.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Options,\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    }\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    }\n});\n\n//myWidget.options is now: {color: #f00, size: {width: 200, height: 100}}\n\n// Deep copy example\nvar mySize = {\n    width: 50,\n    height: 50\n};\n\nvar myWidget = new Widget({\n    size: mySize\n});\n\n(mySize == myWidget.options.size) // false! mySize was copied in the setOptions call.\n```\n\n#### Notes:\n* Relies on the default options of a Class defined in its options property.\n\n#### Options in combination with Events\nIf a Class has `Events` as well as `Options` implemented, every option beginning with 'on' and followed by a capital letter (e.g. `onComplete`) becomes a Class instance event, assuming the value of the option is a function.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: [Options, Events],\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    },\n    show: function(){\n        // Do some cool stuff\n\n        this.fireEvent('show');\n    }\n\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    },\n    onShow: function(){\n        alert('Lets show it!');\n    }\n});\n\nmyWidget.show(); // fires the event and alerts 'Lets show it!'\n```\n\n## Mixin: Connector\n---\nA Utility Class. It allows automatic attachment/detachment of event listeners between two classes.\n\n### options.connector\n---\nA key/value object to map events to functions or method names on the target class that will be connected with. The value can also be an object that contains more key/value pairs. This allows to attach sub-events, such as `change:key`. __Note:__ An asterisk (*) as the sub-event refers to the parent event only.\n\n#### Syntax: key/value pairs\n```javascript\nevent: method\n```\n\n#### Arguments\n1. event - (String) The name of the event to be attached. It becomes the parent event if the events corresponding value is an object.\n2. method - (String, Function, Array, Object)\n    * String - Refers to a method on the target class. The method will be bound to the target class and attached as the event handler.\n    * Function - The function will be bound to the current class and attached as the event handler\n    * Array - Can contain a mix of `String` (name of method to retrieve said method from target class) or `Function` to be attached as the event handler\n    * Object - Contains key/value pairs where `key` will refer to the sub-event and value refers to `String`, `Function`, or `Array` to attach as event handlers. The sub-event will be prepended by the `event` with a `:`.\n\n#### Examples\nThe following will show what key/value pairs will look like and what they look like when attached manually instead of with connector.\n\n* `value` is a string\n\n```javascript\nchange: 'doneMethodName'\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n```\n\n* `value` is a function\n\n```javascript\nchange: function(){/*... code here ...*/}\n```\n\n```javascript\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an array\n\n```javascript\nchange: ['doneMethodName', function(){/*... code here ...*/}]\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an object with subevents and a mix of string, function, or array.\n\n```javascript\nchange: {\n    '*': 'doneMethodName',\n    'name': function(){/*... code here ...*/},\n    'age': ['otherDoneMethodName', function(){/*... other code here ...*/}]\n}\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(this));\n\ncurrentClass.addEvent('name', function(){/*... code here ...*/});\n\ncurrentClass.addEvent('age', targetClass.otherDoneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('age', function(){/*... other code here ...*/});\n```\n\n### connect\n---\nConnects two classes by using `options.connector` as the map to either attach event listeners to functions on `options.connector` or methods on the target class where the method names are retrieved from `options.connector`. Default behavior is to connect two classes. Connect one way by passing a second argument as `true`.\n\n#### Syntax\n```javascript\ncurrentClass.connect(targetClass[, oneWay]);\n```\n\n#### Arguments\n1. class - (Class) The class containing the methods that will be attached as event handlers to event listeners on the current class.\n2. oneWay - (Boolean, optional, `false` by default) Set to true will only connect `this` class with the target class and will not have the target class connect with `this` class.\n\n### disconnect\n---\n\n## Mixin: CustomAccessor\n---\nA Utility Class. It provides a way to define custom setters/getters on a Class.\n### options.accessors\n---\nA key/value object where the key is the name of the setter and value is an object containing overriding set/get methods.\n\n#### Syntax: key/value pairs\n```javascript\nname: {\n    set: function,\n    get: function\n}\n```\n\n#### Arguments\n1. name - (String) Name of the set/get method that will get overriden\n2. object - (Object) Contains set, get method overrides.\n    * set - (Function) The overriding set function. The function will be bound to the current class.\n    * get - (Function) The overriding get function. The function will be bound to the current class. \n\n### setupAccessors\n---\nExisting accessors in `_accessors` need to be decorated so they are merged with `options.accessors` before being sent to `setAccessor`.\n\n#### Syntax:\n```javascript\ncurrentClass.setupAccessors();\n```\n\n#### Returns: Class instance.\n\n### isAccessing\n---\nCheck whether an accessor is being used by checking if `_accessorName` has been defined. This will allow a class to bypass recursive calls to the same custom setter/getter.\n\n#### Syntax:\n```javascript\ncurrentClass.isAccessing();\n```\n\n#### Returns: Boolean\n\n### setAccessor\n---\nA method to decorate custom setters/getters that will allow the use of `isAccessing` to prevent recursive calls to the same custom setter/getter.\n\n#### Syntax:\n```javascript\ncurrentClass.setAccessor(name, obj);\n\ncurrentClass.setAccessor(obj);\n```\n\n#### Arguments:\n* Two Arguments\n    1. name - (String) Name of the accessor setter/getter object.\n    2. obj - (Object) Key/value pairs where the `key` is `set` or `get` and `value` is the function. Any key/value pair is optional. A `set` can exists without a `get`, and a `get` can exist without a `set`.\n\n#### Returns: Class instance.\n\n#### Note: The original undecorated function is stored on the decorated function in the `_orig` attribute.\n\n#### Example:\n```javascript\nvar klass = new Class({\n    Implements: CustomAccessor,\n\n    options: {\n        accessors: {\n            fullName: {\n                set: function(){}\n            }\n        }\n    }\n});\n\nvar currentClass = new klass();\n\nvar fullNameAccessor = currentClass.getAccessor('fullName');\n\nfullNameAccessor.set; // returns the decorated set function.\n\nfullNameAccessor.set._orig // is the undecorated original set function.\n```\n\n### getAccessor\n---\nA method to retrieve stored accessors by name or by name and type.\n\n#### Syntax:\n```javascript\ncurrentClass.getAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to return.\n2. type - (String, optional) The name of the method that exists in the accessor object.\n\n#### Returns:\n1. Object - The object of decoerated key/value pairs containing the accessors that was stored with the name.\n2. Function - The decorated function that is associated with the `type` in the accessor object. The accessor object is retrieved with the `name`.\n\n#### Examples:\n\n__Return an accessor object__\n\n```javascript\ncurrentClass.setAccessor('fullName', {\n    set: function(){}\n});\n\nvar fullNameAccessors =  currentClass.getAccessor('fullName');\n/*\nfullNameAccessors returns and object where the set function is the decorated function\n{\n    set: function(){}\n}\n */\n```\n\n__Return the decorated function in the accessor object__\n\n```javascript\n// Returns the decorated function that is stored with the set key, in the fullName accessor object.\nvar fullNameSetAccessor = currentClass.getAccessor('fullName', 'set');\n```\n\n### unsetAccessor\n---\nRemove an accessor object or decorated function from the accessor object.\n\n#### Syntax:\n```javascript\ncurrentClass.unsetAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to remove.\n2. type - (String, optional) The `key` of the function that should be removed from the accessor object.\n\n#### Returns: Class instance.\n\n#### Example\n\n__Remove an accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName');\n```\n\n__Remove a function from the accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName', 'set');\n```\n\n## Mixin: Silent\n__Silent__ is a MooTools Class object without a constructor. It is used as a mixin for other Class objects, providing a solution to disable before a function executes, and re-enabling afterwards.\n\n### isSilent\n---\nChecks if the Class is currently silent.\n\n#### Syntax:\n```javascript\ncurrentClass.isSilent();\n```\n\n#### Returns: Boolean\n\n### silence\n---\nAny method that can trigger an event can be temporarily disabled by passing the function through silence. Once the function has been triggered, events will be re-enabled.\n\n#### Syntax:\n```javascript\ncurrentClass.silence(function);\n```\n\n#### Arguments:\n1. function - (Function) The function that will be executed once events have been prevented. The function is bound to the model instance before execution.\n\n#### Returns: Class instance.\n","_id":"Neuro@0.2.0","dist":{"shasum":"9e7bd9bf2cbe70e5a971540b7e642556d783f928","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.2.0.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.2.1":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.2.1","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"devDependencies":{"buster":"*"},"scripts":{"test":"node_modules/.bin/buster-test"},"engines":{"node":"~0.6.0"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n__Version: 0.2.1 (Alpha)__\n\n[![Build Status](https://secure.travis-ci.org/GCheung55/Neuro.png)](http://travis-ci.org/GCheung55/Neuro)\n\n__Influences:__\n\n* [Backbone](/documentcloud/backbone)\n* [Shipyard](/seanmonstar/Shipyard)\n\n__Dependencies:__\n\n* [MooTools-Core 1.x](/mootools/mootools-core)\n* [Is.js](/gcheung55/is.js)\n\n__Focus:__\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\n__Extensions:__\n\n* [Neuro-Sync](http://github.com/gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](http://github.com/gcheung55/neuro-company) - Extends Neuro with an Observer API\n\n## Neuro Model\nThe __Model__ is a Object-like MooTools Class object that provides a basic API to interact with data. You can use Model by itself or extend other Class objects with it. It implements `each`, `filter`, and other convenient methods from `Object`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Butler](#mixin-butler)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar model = new Neuro.Model(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Object) An object containing key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * defaults - (Object) Contains the default key/value pair defaults for the Model.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n    * accessor - (Object) See [Mixin: Butler](#mixin-butler)\n\n#### Returns: Model instance.\n\n#### Events:\n* `change: function(model){}` - Triggered when a change to the model's data has occurred\n* `change:key: function(model, key, value, oldValue){}` - Triggered when a specific model data property change has occurred. The `key` refers to the specific property. All `change:key` events will be triggered before `change` is triggered.\n* `destroy: function(model){}` - Triggered when the model is destroyed.\n* `reset: function(model){}` - Triggered when the model is reset to its default values.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n#### Returns: Model instance.\n\n### set\n---\nThe way to assign values to properties the model has. __Do not__ use direct assignment else events will not be triggered or custom setters will not be used.\n\n#### Syntax:\n```javascript\nmodel.set(property, value);\n\nmodel.set(object);\n```\n\n#### Arguments:\n* Two Arguments (property, value)\n    1. property - (String) A key used to define a property the model has.\n    2. value - (String | Array | Number | Object | Function | Class) A value of the corresponding property.\n* One Argument (object)\n    1. object (Object) An object containing sets of property/value pairs\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n#### Examples:\n```javascript\n// set a property value\nmodel.('hasGlasses', true);\n\n// set the property 'name' as an object.\nmodel.set('name', {\n    first: 'Garrick',\n    last: 'Cheung'\n});\n\nset an object that contains all the property value pairs\nmodel.set({\n    name: {\n        first: 'Garrick',\n        last: 'Cheung'\n    }\n});\n```\n\n### isSetting\n---\nUse to check if data is currently being handled by the model to assign values to properties the model has.\n\n#### Syntax:\n```javascript\nmodel.isSetting();\n```\n\n#### Returns: Boolean (true/false).\n\n### get\n---\nRetrieve a property value the model has.\n\n#### Syntax:\n```javascript\nmodel.get(property);\n\nmodel.Get(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding values that the model has.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding value that the model has.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of data that the model has. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the property that the model has.\n\n#### Examples:\n```javascript\nmodel.get('name'); // returns value of 'name' property.\n\nmodel.get('name', 'age'); // returns object containing name and age properties\n```\n\n### getData\n---\nRetrieve all properties/values the model has. The returned object is a clone (dereferenced) of the data the model has.\n\n#### Syntax:\n```javascript\nmodel.getData();\n```\n\n#### Returns: Object containing the data the model has.\n\n### getPrevious\n---\nRetrieve the previous property value he model had. Model only retains one record of previous data.\n\n#### Syntax:\n```javascript\nmodel.getPrevious(property);\n\nmodel.getPrevious(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding previous values that the model had.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding previous value that the model had.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of previous data that the model had. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the previous property that the model had.\n\n### getPreviousData\n---\nRetrieve all previous properties/values the model had. THe returned object is a clone (dereferenced) of the previous data the model had.\n\n#### Syntax:\n```javascript\nmodel.getPreviousData();\n```\n\n#### Returns: Object containing the previous data the model had.\n\n### unset\n---\nUnset data properties the model has. Data properties can not be erased so they will be set to `undefined`.\n\n#### Syntax:\n```javascript\nmodel.unset(property);\n\nmodel.unset([property1, property2]);\n```\n\n#### Arguments:\n1. property - (String | Array) The property to be unset that the model has. Multiple properties can be unset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n### reset\n---\nReset data properties to their default values the model had.\n\n#### Syntax:\n```javascript\nmodel.reset();\n\nmodel.reset(property);\n\nmodel.reset([property1, property2]);\n```\n#### Arguments:\n* Zero Arguments\n    * all data properties in the model is reset to the defined options.defaults\n* One Argument\n    * property - (String | Array, optional) The property to be reset that the model has. Multiple properties can be reset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n* `reset`\n\n### destroy\n---\nTriggers the `destroy` event. This should be overriden in a Class that extends from Model to do additional things. If overriden, remember to call `this.parent();` to trigger the `destroy` method, or execute `signalDestroy` manually.\n\n#### Syntax:\n```javascript\nmodel.destroy();\n```\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `destroy`\n\n### toJSON\n---\nReturns a copy of data the model has. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\nmodel.toJSON();\n```\n\n#### Returns: Object containing the data the model has.\n\n### spy\n---\nA convenient method to attach event listeners to `change:key`.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n\nmodel.spy(object);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property to listen to.\n    2. function - (Function) Function that is to be executed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### unspy\n---\nA convenient method to remove event listeners to `change:key`. If a function is not provided, all events attached to a specific `change:key` will be removed.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property that is being listend to.\n    2. function - (Function, optional) Function that is to be removed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### setupAccessors\n---\nsee [Mixin: Butler](#mixin-butler)\n### isAccessing\n---\nsee [Mixin: Butler](#mixin-butler)\n### setAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### getAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### unsetAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Object Methods\n---\nThe following methods have been implemented from MooTools-Core Object onto Neuro Model. They take the same arguments as their Object counterparts with the exception of having to pass the model as the object to be acted upon.\n\n* `each`\n* `subset`\n* `map`\n* `filter`\n* `every`\n* `some`\n* `keys`\n* `values`\n* `getLength`\n* `keyOf`\n* `contains`\n* `toQueryString`\n\n```javascript\nmodel.each(function[, bind]);\nmodel.subset(keys);\nmodel.map(function[, bind]);\nmodel.filter(function[, bind]);\nmodel.every(function[, bind]);\nmodel.some(function[, bind]);\nmodel.keys();\nmodel.values();\nmodel.getLength();\nmodel.keyOf(property);\nmodel.contains(value);\nmodel.toQueryString();\n```\n\n## Neuro Collection\nThe __Collection__ is an Array-like MooTools Class object that provides a basic API to interact with multiple __Models__. You can use __Collection__ by itself or extend other Class objects with it. It contains a reference to a __Model__ Class to create a model instance when adding a data `Object`. The reference __Model__ Class can be optionally replaced by a different Class that extends from __Model__. It implements `each`, `filter`, and some other convenient methods from `Array`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar collection = new Neuro.Collection(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Mixed, optional)\n    * Model - A `Model` instance\n    * Object - An object of key/value pairs that will be used to create a model instance\n    * Array - An array of Model instances or object key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * Model - (Model, defaults to undefined) The `Model` Class used to create model instances from when an `Object` is passed to `add`.\n    * modelOptions - (Object, defaults to undefined) An `Object` containing options for creating new model instances. See [Neuro Model](#neuro-model)\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: Class instance.\n\n#### Events:\n* `add: function(collection, model){}` - Triggered when a model is added to the collection.\n* `remove: function(collection, model){}` - Triggered when a specific model is removed from the collection.\n* `empty: function(collection){}` - Triggered when the collection is emptied of all models.\n* `sort: function(collection){}` - Triggered when `sort` or `reverse` occurs.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n* A default model is defined in the `Collection` Class as the `_Model` property. It can be overriden by `options.Model` or when a Class extends from `Collection` and defines a different `_Model` property.\n* Define `options.primaryKey` to better identify model instances, such as checking if the collection `hasModel`.\n\n#### Returns: Model instance.\n\n### hasModel\n---\nChecks if the collection instance contains a model by checking if the model exists in the `_models` array or using `options.primaryKey` to compare models.\n\n#### Syntax:\n```javascript\ncurrentCollection.hasModel(model);\n```\n\n#### Arguments:\n1. model - (Object | Model) An `Object` or `Model` instance that is used to compare with existing models in the collection. `options.primaryKey` will be used to compare against the models if an initial use of `Array.contains` returns `false`.\n\n#### Returns: Boolean.\n\n### add\n---\nAdding a model to the collection should always go through this method. It appends the model to the internal `_model` array and triggers the `add` event if the collection does not already contain the model. If an `Object` is passed in, the `Object` will be converted to a model instance before being appended to `_model`. Adding a model will increase the collections `length` property. It is possible to insert a model instance into `_model` at a specific index by passing a second argument to `add`. A `remove` method is attached to the models `destroy` event so that the model can be properly removed if the model `destroy` event is triggered.\n\n#### Syntax:\n```javascript\ncurrentCollection.add(models, at);\n```\n\n#### Arguments:\n1. models - (Object | Model | Array)\n    * Object - An `Object` with key/value pairs of data properties. It will be converted to a `Model` instance before adding to `_model`.\n    * Model - A `Model` instance.\n    * Array - An `Array` that contain a mix of `Object` and `Model` instances.\n2. at - (Number, optional) The index to insert the model in the `_model` array. If the collection is empty, `at` is ignored and and the model is inserted as the first item in the array.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n\n#### Examples:\n```javascript\ncurrentCollection.add({\n    id: 1, name: 'Bruce Lee'\n}, 2);\n\ncurrentCollection.add( new Neuro.Model({id: 1, name: 'Bruce Lee'}) );\n\ncurrentCollection.add(\n    [\n        {id: 1, name: 'Bruce Lee'}, \n        new Neuro.Model({id: 1, name: 'Chuck Norris'})\n    ]\n);\n```\n\n### get\n---\nGet the model by index. Multiple indexes can be passed to get to retrieve multiple models.\n\n#### Syntax:\n```javascript\ncurrentCollection.get(index);\n```\n\n#### Arguments:\n1. index - (Number) The index number of the model to return.\n\n#### Returns: A model instance corresponding to the index in `_model`. If multiple indexes are passed to `get`, an `Array` of models is returned, where each model corresponds to the index.\n\n#### Examples:\n```javascript\ncurrentCollection.get(0); // returns the model instance that corresponds to the index argument\n\ncurrentCollection.get(0, 2, 3); // returns an array of model instances where each model corresponds to each index argument\n```\n\n### remove\n---\nRemove a model or models from the collection. It will trigger the `remove` event for each individual model removed. The collection should remove the model only if it exists on the collection. Removing the model from the collection will also remove the `remove` method from the models `destroy` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.remove(model);\n```\n\n#### Arguments:\n1. model - (Model | Array) A model or array of models that will be removed from `_model`.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove`\n\n#### Examples:\n```javascript\nvar model = new Neuro.Model({id: 1, name: 'Garrick'});\n\ncurrentCollection.add(model);\n\ncurrentCollection.remove(model);\n\n//or\n\ncurrentCollection.remove([model]); // remove an array of models.\n```\n\n### replace\n---\nReplace an existing model in the collection with a new one if the old model exists and the new model does not exist in the collection `_model` array. This will trigger `add` and `remove` events.\n\n#### Syntax:\n```javascript\ncurrentCollection.replace(oldModel, newModel);\n```\n\n#### Arguments:\n1. oldModel (Model) - The model that will be replaced in the collection.\n2. newModel (Object | Model) - The new model that will be replacing the old one.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n* `remove`\n\n### sort\n---\nSort the collection. Works the same way [Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.sort(function);\n```\n\n#### Arguments:\n1. function - (Function, optional) The function acts as a comparator. Please see [Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) for more information.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n#### Examples:\n```javascript\n// Sorts models ordered by id, where id is a number.\n// This function sorts the order from smallest to largest number.\n\ncurrentCollection.sort(function(modelA, modelB){\n    return modelA.get('id') - modelB.get('id');\n});\n```\n\n### reverse\n---\nReverses the order of the collection. Works the same way [Array.reverse](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reverse) would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.reverse();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n### empty\n---\nEmpty the collection of all models. Triggers the `empty` event and `remove` event for each model removed.\n\n#### Syntax:\n```javascript\ncurrentCollection.empty();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove` for each model removed\n* `empty`\n\n### toJSON\n---\nReturns a copy of collection `_model`. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\ncurrentCollection.toJSON();\n```\n\n#### Returns: Object containing the collection `_model`.\n\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Array Methods\n---\nThe following methods have been implemented from MooTools-Core Array onto Neuro Collection. They take the same arguments as their Object counterparts with the exception of having to pass the collection as the object to be acted upon.\n\n* `forEach`\n* `each`\n* `invoke`\n* `every`\n* `filter`\n* `clean`\n* `indexOf`\n* `map`\n* `some`\n* `associate`\n* `link`\n* `contains`\n* `getLast`\n* `getRandom`\n* `flatten`\n* `pick`\n\n```javascript\ncollection.forEach(function[, bind]);\ncollection.each(function[, bind]);\ncollection.invoke(method[, arg, arg, arg ...]);\ncollection.every(function[, bind]);\ncollection.filter(function[, bind]);\ncollection.clean();\ncollection.indexOf(item[, from]);\ncollection.map(function[, bind]);\ncollection.some(function[, bind]);\ncollection.associate(object);\ncollection.link(object);\ncollection.contains(item[, from]);\ncollection.getLast();\ncollection.getRandom();\ncollection.flatten();\ncollection.pick();\n```\n\n## Neuro View\nThe __View__ is a MooTools Class object. It acts as a layer between an element and everything else. One of the usual conventions of plugins that deals with elements has to attach/detach events to/from the element. The __View__ provides a simple, yet basic, way of binding methods/functions to the element event listeners.\n\nAnother convention is that attaching event handlers to classes can be a manual process. __View__ implements the [Connector](#mixin-connector) utility class to provide a powerful and automatic way to attach events between two classes.\n\nThe `render` method is the main method that should be used to visualize the element with data. The method is basic, triggering the `render` event on the __View__ class. Other class objects should extend from the __View__ class and override the `render` method, but call `this.parent` in order to trigger the `render` event.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\nStarts out with executing `setup` and then triggering `ready` event.\n\n#### Syntax:\n```javascript\nvar view = new Neuro.View(options);\n```\n\n#### Arguments:\n1. `options` - (Object, optional) The View options\n    * element - (String | Element, defaults to `undefined`) The root/parent element of where the rendered elements should be placed.\n    * events - (Object, defaults to `undefined`) An `Object` of key/value pairs\n        * `key` - (String) The element event or event-delegate type. `click` or `click:relay(selector)`\n        * `value` - (String | Function | Array) The handler that is attached to the event. It can be a `String` (amethod name in the view class instance), `Function`, or an `Array` of containing a mix of `String` or `Function` items.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: View instance..\n\n#### Events:\n* `ready: function(view){}` - Triggered  at the end of the `setup` method.\n* `render: function(view){}` - Triggered at the end of the `render` method.\n* `inject: function(view){}` - Triggered at the end of the `inject` method.\n* `dispose: function(view){}` - Triggered at the end of the `dispose` method.\n* `destroy: function(view){}` - Triggered at the end of the `destroy` method.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n### setup\n---\nCalled during `initialize` to `setOptions`, and `setElement`.\n\n#### Arguments:\n* Same as `initialize`\n\n#### Returns: View instance.\n\n### toElement\n---\nA method to retrieve the element stored in the view instance. Any Class instance, with a `toElement` method, passed to MooTools Element `document.id` or `$` method will return the value from the classes `toElement` method. This is a hidden MooTools Core trick.\n\n#### Syntax:\n```javascript\nview.toElement();\n\ndocument.id(view);\n\n$(view);\n```\n\n#### Returns: `element` property stored in view instance.\n\n### setElement\n---\nStore the root element for the view instance. If an element exists, it will first execute View `destroy` method to properly detach events and remove references to it. Then it will store a reference to the element and execute View `attachEvents`.\n\n#### Syntax:\n```javascript\nview.setElement(element);\n```\n\n#### Arguments:\n1. element - (Element) Element to be set as root element in the view instance. `attachEvents` will refer to `options.events` for the event and method/function to attach.\n\n#### Returns: View instance.\n\n### attachEvents\n---\nAttach events to the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be detached using `detachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.attachEvents();\n```\n\n#### Returns: View instance.\n\n### detachEvents\n---\nDetach events from the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be attached using `attachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.detachEvents();\n```\n\n#### Returns: View instance.\n\n### create\n---\nIt is a no-op method. Override `create` in your Class that extends from __View__. It could be used to create the root `element`, or other child elements that goes into the root `element.\n\n#### Syntax:\n```javascript\nview.create();\n```\n\n#### Returns: View instance.\n\n### render\n---\nAlthough `render` is considered a no-op method, it still trggers the `render` event. Override `render` in your Class that extends from __View__.  __Remember__ to call 'this.parent()' at the end of your code to execute the original `render` method that will trigger the `render` event. Pass `data` to the `render` method, such as Neuro Model or Neuro Collection.\n\nIf you are passing any Class that implements [Mixin: Connector](#mixin-connector), you should consider using the `connect` method. It will help to automatically attach events between the View instance and the other Classes, in this case it is likely to be a Neuro Model or Neuro Collection instances.\n\n#### Syntax:\n```javascript\nview.render(data);\n```\n\n#### Arguments:\n1. data - (Mixed) It can be anything you will use as data to render the view. This also means you can pass in multiple Neuro Model instances, multiple Neuro Collection instances, other View instances. Use your imagination.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `render`\n\n### inject\n---\nInject or inserts the root `element` relative to another element or View instance. `document.id` / `$` will resolve the element from the other View instance.\n\n#### Syntax:\n```javascript\nview.inject(reference[, where]);\n```\n\n#### Arguments:\n1. reference - (String | Element | Class) The `element` will be placed relative to the reference element. A `String` should be the id of the reference element, without the \"#\". A `Class` instance should have a `toElement` method in order to resolve the reference element.\n2. where - (String, optional, defaults to \"bottom\") The place to inject/insert the `element` relative to the reference element. Can be: `top`, `bottom`, `after`, or `before`.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `inject`\n\n### dispose\n---\nRemoves the Element from the DOM but retains it in memory if the `element` exists.\n\n#### Syntax:\n```javascript\nview.dispose();\n```\n\n#### Returns: View instance.\n\n#### Triggered Events\n* `dispose`\n\n### destroy\n---\nRemoves the Element and its children from the DOM and prepares them for garbage collection. Executes `detatchEvents` and removes reference to element in `element` property. Triggers `destroy` event.\n\n#### Syntax:\n```javascript\nview.destroy();\n```\n\n#### Returns: View instance.\n\n## Mixin: Events\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. `Events` in a Class that implements `Events` must be either added as an option or with `addEvent`, not directly through .`options.onEventName`.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({ Implements: Events });\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Events);\n```\n\n#### Implementing:\n\n* This class can be implemented into other classes to add its functionality to them.\n* `Events` has been designed to work well with the `Options` class. When the option property begins with 'on' and is followed by a capital letter it will be added as an event (e.g. `onComplete` will add as `complete` event).\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(element){\n        // ...\n    },\n    complete: function(){\n        this.fireEvent('complete');\n    }\n});\n\nvar myWidget = new Widget();\nmyWidget.addEvent('complete', myFunction);\n```\n\n#### Notes:\n* Events starting with 'on' are still supported in all methods and are converted to their representation without 'on' (e.g. 'onComplete' becomes 'complete').\n\n### addEvent\n---\nAdds an event to the Class instance's event stack.\n\n#### Syntax:\n```javascript\nmyClass.addEvent(type, fn[, internal]);\n```\n\n#### Arguments:\n1. type     - (String) The type of event (e.g. `complete`).\n2. fn       - (Function) The function to execute.\n3. internal - (Boolean, optional) Sets the function property: internal to true. Internal property is used to prevent removal.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvent('start', myStartFunction);\n```\n\n### addEvents\n---\nThe same as `addEvent`, but accepts an object to add multiple events at once.\n\n#### Syntax:\n```javascript\nmyClass.addEvents(events);\n```\n\n#### Arguments:\n1. events - (Object) An object with key/value representing: key the event name (e.g. `start`), and value the function that is called when the Event occurs.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvents({\n    start: myStartFunction,\n    complete: function() {\n        alert('Done.');\n    }\n});\n```\n\n### fireEvent\n---\nFires all events of the specified type in the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.fireEvent(type[, args[, delay]]);\n```\n\n#### Arguments:\n1. type  - (String) The type of event (e.g. `complete`).\n2. args  - (String | Array, optional) The argument(s) to pass to the function. To pass more than one argument, the arguments must be in an array.\n3. delay - (Number, optional) Delay in milliseconds to wait before executing the event (defaults to 0).\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(arg1, arg2){\n        //...\n        this.fireEvent('initialize', [arg1, arg2], 50);\n    }\n});\n```\n\n### removeEvent\n---\nRemoves an event from the stack of events of the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.removeEvent(type, fn);\n```\n#### Arguments:\n1. type - (String) The type of event (e.g. `complete`).\n2. fn   - (Function) The function to remove.\n\n#### Returns: This Class instance.\n\n#### Notes:\n* If the function has the property internal and is set to true, then the event will not be removed.\n\n\n### removeEvents\n---\nRemoves all events of the given type from the stack of events of a Class instance. If no type is specified, removes all events of all types.\n\n#### Syntax:\n```javascript\nmyClass.removeEvents([events]);\n```\n\n#### Arguments:\n1. events - (optional) If not passed removes all events of all types.\n    - (String) The event name (e.g. 'success'). Removes all events of that type.\n    - (Object) An object of type function pairs. Like the one passed to `addEvents`.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('myElement', 'opacity');\nmyFx.removeEvents('complete');\n```\n\n#### Notes:\n* removeEvents will not remove internal events. See `Events:removeEvent`.\n\n## Mixin: Options\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. Used to automate the setting of a Class instance's options. Will also add Class `Events` when the option property begins with 'on' and is followed by a capital letter (e.g. `onComplete` adds a `complete` event). You will need to call `this.setOptions()` for this to have an effect, however.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({Implements: Options});\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Options);\n```\n\n### setOptions\n---\nMerges the default options of the Class with the options passed in. Every value passed in to this method will be deep copied. Therefore other class instances or objects that are not intended for copying must be passed to a class in other ways.\n\n#### Syntax:\n```javascript\nmyClass.setOptions([options]);\n```\n\n#### Arguments:\n1. options - (Object, optional) The user defined options to merge with the defaults.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Options,\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    }\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    }\n});\n\n//myWidget.options is now: {color: #f00, size: {width: 200, height: 100}}\n\n// Deep copy example\nvar mySize = {\n    width: 50,\n    height: 50\n};\n\nvar myWidget = new Widget({\n    size: mySize\n});\n\n(mySize == myWidget.options.size) // false! mySize was copied in the setOptions call.\n```\n\n#### Notes:\n* Relies on the default options of a Class defined in its options property.\n\n#### Options in combination with Events\nIf a Class has `Events` as well as `Options` implemented, every option beginning with 'on' and followed by a capital letter (e.g. `onComplete`) becomes a Class instance event, assuming the value of the option is a function.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: [Options, Events],\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    },\n    show: function(){\n        // Do some cool stuff\n\n        this.fireEvent('show');\n    }\n\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    },\n    onShow: function(){\n        alert('Lets show it!');\n    }\n});\n\nmyWidget.show(); // fires the event and alerts 'Lets show it!'\n```\n\n## Mixin: Connector\n---\nA Utility Class. It allows automatic attachment/detachment of event listeners between two classes.\n\n### options.connector\n---\nA key/value object to map events to functions or method names on the target class that will be connected with. The value can also be an object that contains more key/value pairs. This allows to attach sub-events, such as `change:key`. __Note:__ An asterisk (*) as the sub-event refers to the parent event only.\n\n#### Syntax: key/value pairs\n```javascript\nevent: method\n```\n\n#### Arguments\n1. event - (String) The name of the event to be attached. It becomes the parent event if the events corresponding value is an object.\n2. method - (String, Function, Array, Object)\n    * String - Refers to a method on the target class. The method will be bound to the target class and attached as the event handler.\n    * Function - The function will be bound to the current class and attached as the event handler\n    * Array - Can contain a mix of `String` (name of method to retrieve said method from target class) or `Function` to be attached as the event handler\n    * Object - Contains key/value pairs where `key` will refer to the sub-event and value refers to `String`, `Function`, or `Array` to attach as event handlers. The sub-event will be prepended by the `event` with a `:`.\n\n#### Examples\nThe following will show what key/value pairs will look like and what they look like when attached manually instead of with connector.\n\n* `value` is a string\n\n```javascript\nchange: 'doneMethodName'\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n```\n\n* `value` is a function\n\n```javascript\nchange: function(){/*... code here ...*/}\n```\n\n```javascript\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an array\n\n```javascript\nchange: ['doneMethodName', function(){/*... code here ...*/}]\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an object with subevents and a mix of string, function, or array.\n\n```javascript\nchange: {\n    '*': 'doneMethodName',\n    'name': function(){/*... code here ...*/},\n    'age': ['otherDoneMethodName', function(){/*... other code here ...*/}]\n}\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(this));\n\ncurrentClass.addEvent('name', function(){/*... code here ...*/});\n\ncurrentClass.addEvent('age', targetClass.otherDoneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('age', function(){/*... other code here ...*/});\n```\n\n### connect\n---\nConnects two classes by using `options.connector` as the map to either attach event listeners to functions on `options.connector` or methods on the target class where the method names are retrieved from `options.connector`. Default behavior is to connect two classes. Connect one way by passing a second argument as `true`.\n\n#### Syntax\n```javascript\ncurrentClass.connect(targetClass[, oneWay]);\n```\n\n#### Arguments\n1. class - (Class) The class containing the methods that will be attached as event handlers to event listeners on the current class.\n2. oneWay - (Boolean, optional, `false` by default) Set to true will only connect `this` class with the target class and will not have the target class connect with `this` class.\n\n### disconnect\n---\n\n## Mixin: Butler\n---\nA Utility Class. It provides a way to define custom setters/getters on a Class.\n### options.accessors\n---\nA key/value object where the key is the name of the setter and value is an object containing overriding set/get methods.\n\n#### Syntax: key/value pairs\n```javascript\nname: {\n    set: function,\n    get: function\n}\n```\n\n#### Arguments\n1. name - (String) Name of the set/get method that will get overriden\n2. object - (Object) Contains set, get method overrides.\n    * set - (Function) The overriding set function. The function will be bound to the current class.\n    * get - (Function) The overriding get function. The function will be bound to the current class. \n\n### setupAccessors\n---\nExisting accessors in `_accessors` need to be decorated so they are merged with `options.accessors` before being sent to `setAccessor`.\n\n#### Syntax:\n```javascript\ncurrentClass.setupAccessors();\n```\n\n#### Returns: Class instance.\n\n### isAccessing\n---\nCheck whether an accessor is being used by checking if `_accessorName` has been defined. This will allow a class to bypass recursive calls to the same custom setter/getter.\n\n#### Syntax:\n```javascript\ncurrentClass.isAccessing();\n```\n\n#### Returns: Boolean\n\n### setAccessor\n---\nA method to decorate custom setters/getters that will allow the use of `isAccessing` to prevent recursive calls to the same custom setter/getter.\n\n#### Syntax:\n```javascript\ncurrentClass.setAccessor(name, obj);\n\ncurrentClass.setAccessor(obj);\n```\n\n#### Arguments:\n* Two Arguments\n    1. name - (String) Name of the accessor setter/getter object.\n    2. obj - (Object) Key/value pairs where the `key` is `set` or `get` and `value` is the function. Any key/value pair is optional. A `set` can exists without a `get`, and a `get` can exist without a `set`.\n\n#### Returns: Class instance.\n\n#### Note: The original undecorated function is stored on the decorated function in the `_orig` attribute.\n\n#### Example:\n```javascript\nvar klass = new Class({\n    Implements: CustomAccessor,\n\n    options: {\n        accessors: {\n            fullName: {\n                set: function(){}\n            }\n        }\n    }\n});\n\nvar currentClass = new klass();\n\nvar fullNameAccessor = currentClass.getAccessor('fullName');\n\nfullNameAccessor.set; // returns the decorated set function.\n\nfullNameAccessor.set._orig // is the undecorated original set function.\n```\n\n### getAccessor\n---\nA method to retrieve stored accessors by name or by name and type.\n\n#### Syntax:\n```javascript\ncurrentClass.getAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to return.\n2. type - (String, optional) The name of the method that exists in the accessor object.\n\n#### Returns:\n1. Object - The object of decoerated key/value pairs containing the accessors that was stored with the name.\n2. Function - The decorated function that is associated with the `type` in the accessor object. The accessor object is retrieved with the `name`.\n\n#### Examples:\n\n__Return an accessor object__\n\n```javascript\ncurrentClass.setAccessor('fullName', {\n    set: function(){}\n});\n\nvar fullNameAccessors =  currentClass.getAccessor('fullName');\n/*\nfullNameAccessors returns and object where the set function is the decorated function\n{\n    set: function(){}\n}\n */\n```\n\n__Return the decorated function in the accessor object__\n\n```javascript\n// Returns the decorated function that is stored with the set key, in the fullName accessor object.\nvar fullNameSetAccessor = currentClass.getAccessor('fullName', 'set');\n```\n\n### unsetAccessor\n---\nRemove an accessor object or decorated function from the accessor object.\n\n#### Syntax:\n```javascript\ncurrentClass.unsetAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to remove.\n2. type - (String, optional) The `key` of the function that should be removed from the accessor object.\n\n#### Returns: Class instance.\n\n#### Example\n\n__Remove an accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName');\n```\n\n__Remove a function from the accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName', 'set');\n```\n\n## Mixin: Silent\n__Silent__ is a MooTools Class object without a constructor. It is used as a mixin for other Class objects, providing a solution to disable before a function executes, and re-enabling afterwards.\n\n### isSilent\n---\nChecks if the Class is currently silent.\n\n#### Syntax:\n```javascript\ncurrentClass.isSilent();\n```\n\n#### Returns: Boolean\n\n### silence\n---\nAny method that can trigger an event can be temporarily disabled by passing the function through silence. Once the function has been triggered, events will be re-enabled.\n\n#### Syntax:\n```javascript\ncurrentClass.silence(function);\n```\n\n#### Arguments:\n1. function - (Function) The function that will be executed once events have been prevented. The function is bound to the model instance before execution.\n\n#### Returns: Class instance.\n","_id":"Neuro@0.2.1","dist":{"shasum":"f3b5fa5d6fb104bdb5dbf8862e584a73c8cc6757","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.2.1.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}]},"0.2.2":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.2.2","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"devDependencies":{"buster":"*"},"scripts":{"test":"node_modules/.bin/buster-test"},"engines":{"node":"~0.6.0"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n__Version: 0.2.2 (Alpha)__\n\n[![Build Status](https://secure.travis-ci.org/GCheung55/Neuro.png)](http://travis-ci.org/GCheung55/Neuro)\n\n__Influences:__\n\n* [Backbone](/documentcloud/backbone)\n* [Shipyard](/seanmonstar/Shipyard)\n\n__Dependencies:__\n\n* [MooTools-Core 1.x](/mootools/mootools-core)\n* [Is.js](/gcheung55/is.js)\n\n__Focus:__\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\n__Extensions:__\n\n* [Neuro-Sync](http://github.com/gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](http://github.com/gcheung55/neuro-company) - Extends Neuro with an Observer API\n\n## Neuro Model\nThe __Model__ is a Object-like MooTools Class object that provides a basic API to interact with data. You can use Model by itself or extend other Class objects with it. It implements `each`, `filter`, and other convenient methods from `Object`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Butler](#mixin-butler)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n* [Mixin: Snitch](#mixin-snitch)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar model = new Neuro.Model(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Object) An object containing key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * defaults - (Object) Contains the default key/value pair defaults for the Model.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n    * accessor - (Object) See [Mixin: Butler](#mixin-butler)\n\n#### Returns: Model instance.\n\n#### Events:\n* `change: function(model){}` - Triggered when a change to the model's data has occurred\n* `change:key: function(model, key, value, oldValue){}` - Triggered when a specific model data property change has occurred. The `key` refers to the specific property. All `change:key` events will be triggered before `change` is triggered.\n* `destroy: function(model){}` - Triggered when the model is destroyed.\n* `reset: function(model){}` - Triggered when the model is reset to its default values.\n* `error: function(model){}` - Triggered when the model data does not validate during the setting process.\n* `error:key: function(model, key, value){}` - Triggered when a specific model data property does not validate during the setting process.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n#### Returns: Model instance.\n\n### set\n---\nThe way to assign values to properties the model has. __Do not__ use direct assignment else events will not be triggered or custom setters will not be used.\n\n#### Syntax:\n```javascript\nmodel.set(property, value);\n\nmodel.set(object);\n```\n\n#### Arguments:\n* Two Arguments (property, value)\n    1. property - (String) A key used to define a property the model has.\n    2. value - (String | Array | Number | Object | Function | Class) A value of the corresponding property.\n* One Argument (object)\n    1. object (Object) An object containing sets of property/value pairs\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n#### Examples:\n```javascript\n// set a property value\nmodel.('hasGlasses', true);\n\n// set the property 'name' as an object.\nmodel.set('name', {\n    first: 'Garrick',\n    last: 'Cheung'\n});\n\nset an object that contains all the property value pairs\nmodel.set({\n    name: {\n        first: 'Garrick',\n        last: 'Cheung'\n    }\n});\n```\n\n### isSetting\n---\nUse to check if data is currently being handled by the model to assign values to properties the model has.\n\n#### Syntax:\n```javascript\nmodel.isSetting();\n```\n\n#### Returns: Boolean (true/false).\n\n### get\n---\nRetrieve a property value the model has.\n\n#### Syntax:\n```javascript\nmodel.get(property);\n\nmodel.Get(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding values that the model has.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding value that the model has.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of data that the model has. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the property that the model has.\n\n#### Examples:\n```javascript\nmodel.get('name'); // returns value of 'name' property.\n\nmodel.get('name', 'age'); // returns object containing name and age properties\n```\n\n### getData\n---\nRetrieve all properties/values the model has. The returned object is a clone (dereferenced) of the data the model has.\n\n#### Syntax:\n```javascript\nmodel.getData();\n```\n\n#### Returns: Object containing the data the model has.\n\n### getPrevious\n---\nRetrieve the previous property value he model had. Model only retains one record of previous data.\n\n#### Syntax:\n```javascript\nmodel.getPrevious(property);\n\nmodel.getPrevious(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding previous values that the model had.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding previous value that the model had.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of previous data that the model had. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the previous property that the model had.\n\n### getPreviousData\n---\nRetrieve all previous properties/values the model had. THe returned object is a clone (dereferenced) of the previous data the model had.\n\n#### Syntax:\n```javascript\nmodel.getPreviousData();\n```\n\n#### Returns: Object containing the previous data the model had.\n\n### unset\n---\nUnset data properties the model has. Data properties can not be erased so they will be set to `undefined`.\n\n#### Syntax:\n```javascript\nmodel.unset(property);\n\nmodel.unset([property1, property2]);\n```\n\n#### Arguments:\n1. property - (String | Array) The property to be unset that the model has. Multiple properties can be unset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n### reset\n---\nReset data properties to their default values the model had.\n\n#### Syntax:\n```javascript\nmodel.reset();\n\nmodel.reset(property);\n\nmodel.reset([property1, property2]);\n```\n#### Arguments:\n* Zero Arguments\n    * all data properties in the model is reset to the defined options.defaults\n* One Argument\n    * property - (String | Array, optional) The property to be reset that the model has. Multiple properties can be reset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n* `reset`\n\n### destroy\n---\nTriggers the `destroy` event. This should be overriden in a Class that extends from Model to do additional things. If overriden, remember to call `this.parent();` to trigger the `destroy` method, or execute `signalDestroy` manually.\n\n#### Syntax:\n```javascript\nmodel.destroy();\n```\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `destroy`\n\n### toJSON\n---\nReturns a copy of data the model has. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\nmodel.toJSON();\n```\n\n#### Returns: Object containing the data the model has.\n\n### spy\n---\nA convenient method to attach event listeners to `change:key`.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n\nmodel.spy(object);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property to listen to.\n    2. function - (Function) Function that is to be executed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### unspy\n---\nA convenient method to remove event listeners to `change:key`. If a function is not provided, all events attached to a specific `change:key` will be removed.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property that is being listend to.\n    2. function - (Function, optional) Function that is to be removed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### setupValidators\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### setValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### getValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### validate\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### proof\n---\nMethod that proofs the model instance.\n\nsee [Mixin: Snitch](#mixin-snitch)\n\n#### Syntax:\n```javascript\nmodel.proof();\n```\n\n#### Returns: (Boolean) Every property in the `_validators` object must exist in the model instances `_data` object and every function in `_validators` must return `true` in order for `proof` to return `true`, otherwise `false`.\n\n#### Note: This overrides the original `proof` method, but makes use of it to \"proof\" the model instance.\n\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### setupAccessors\n---\nsee [Mixin: Butler](#mixin-butler)\n### isAccessing\n---\nsee [Mixin: Butler](#mixin-butler)\n### setAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### getAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### unsetAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Object Methods\n---\nThe following methods have been implemented from MooTools-Core Object onto Neuro Model. They take the same arguments as their Object counterparts with the exception of having to pass the model as the object to be acted upon.\n\n* `each`\n* `subset`\n* `map`\n* `filter`\n* `every`\n* `some`\n* `keys`\n* `values`\n* `getLength`\n* `keyOf`\n* `contains`\n* `toQueryString`\n\n```javascript\nmodel.each(function[, bind]);\nmodel.subset(keys);\nmodel.map(function[, bind]);\nmodel.filter(function[, bind]);\nmodel.every(function[, bind]);\nmodel.some(function[, bind]);\nmodel.keys();\nmodel.values();\nmodel.getLength();\nmodel.keyOf(property);\nmodel.contains(value);\nmodel.toQueryString();\n```\n\n## Neuro Collection\nThe __Collection__ is an Array-like MooTools Class object that provides a basic API to interact with multiple __Models__. You can use __Collection__ by itself or extend other Class objects with it. It contains a reference to a __Model__ Class to create a model instance when adding a data `Object`. The reference __Model__ Class can be optionally replaced by a different Class that extends from __Model__. It implements `each`, `filter`, and some other convenient methods from `Array`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n* [Mixin: Snitch](#mixin-snitch)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar collection = new Neuro.Collection(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Mixed, optional)\n    * Model - A `Model` instance\n    * Object - An object of key/value pairs that will be used to create a model instance\n    * Array - An array of Model instances or object key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * Model - (Model, defaults to undefined) The `Model` Class used to create model instances from when an `Object` is passed to `add`.\n    * modelOptions - (Object, defaults to undefined) An `Object` containing options for creating new model instances. See [Neuro Model](#neuro-model)\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: Class instance.\n\n#### Events:\n* `add: function(collection, model){}` - Triggered when a model is added to the collection.\n* `remove: function(collection, model){}` - Triggered when a specific model is removed from the collection.\n* `empty: function(collection){}` - Triggered when the collection is emptied of all models.\n* `sort: function(collection){}` - Triggered when `sort` or `reverse` occurs.\n* `error: function(collection, model, at){}` - Triggered when a model is added to the collection that does not pass validation IF validators exist in the collection instance.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n* A default model is defined in the `Collection` Class as the `_Model` property. It can be overriden by `options.Model` or when a Class extends from `Collection` and defines a different `_Model` property.\n* Define `options.primaryKey` to better identify model instances, such as checking if the collection `hasModel`.\n\n#### Returns: Model instance.\n\n### hasModel\n---\nChecks if the collection instance contains a model by checking if the model exists in the `_models` array or using `options.primaryKey` to compare models.\n\n#### Syntax:\n```javascript\ncurrentCollection.hasModel(model);\n```\n\n#### Arguments:\n1. model - (Object | Model) An `Object` or `Model` instance that is used to compare with existing models in the collection. `options.primaryKey` will be used to compare against the models if an initial use of `Array.contains` returns `false`.\n\n#### Returns: Boolean.\n\n### add\n---\nAdding a model to the collection should always go through this method. It appends the model to the internal `_model` array and triggers the `add` event if the collection does not already contain the model.\n\nIf `_validators` exist, then each model or object added must pass validation in order to be added to the collection instance. Otherwise a `error` event will be triggered. \n\nIf an `Object` is passed in, the `Object` will be converted to a model instance before being appended to `_model`. Adding a model will increase the collections `length` property. \n\nIt is possible to insert a model instance into `_model` at a specific index by passing a second argument to `add`.\n\nA `remove` method is attached to the models `destroy` event so that the model can be properly removed if the model `destroy` event is triggered.\n\n#### Syntax:\n```javascript\ncurrentCollection.add(models, at);\n```\n\n#### Arguments:\n1. models - (Object | Model | Array)\n    * Object - An `Object` with key/value pairs of data properties. It will be converted to a `Model` instance before adding to `_model`.\n    * Model - A `Model` instance.\n    * Array - An `Array` that contain a mix of `Object` and `Model` instances.\n2. at - (Number, optional) The index to insert the model in the `_model` array. If the collection is empty, `at` is ignored and and the model is inserted as the first item in the array.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n# `error`\n\n#### Examples:\n```javascript\ncurrentCollection.add({\n    id: 1, name: 'Bruce Lee'\n}, 2);\n\ncurrentCollection.add( new Neuro.Model({id: 1, name: 'Bruce Lee'}) );\n\ncurrentCollection.add(\n    [\n        {id: 1, name: 'Bruce Lee'}, \n        new Neuro.Model({id: 1, name: 'Chuck Norris'})\n    ]\n);\n```\n\n### get\n---\nGet the model by index. Multiple indexes can be passed to get to retrieve multiple models.\n\n#### Syntax:\n```javascript\ncurrentCollection.get(index);\n```\n\n#### Arguments:\n1. index - (Number) The index number of the model to return.\n\n#### Returns: A model instance corresponding to the index in `_model`. If multiple indexes are passed to `get`, an `Array` of models is returned, where each model corresponds to the index.\n\n#### Examples:\n```javascript\ncurrentCollection.get(0); // returns the model instance that corresponds to the index argument\n\ncurrentCollection.get(0, 2, 3); // returns an array of model instances where each model corresponds to each index argument\n```\n\n### remove\n---\nRemove a model or models from the collection. It will trigger the `remove` event for each individual model removed. The collection should remove the model only if it exists on the collection. Removing the model from the collection will also remove the `remove` method from the models `destroy` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.remove(model);\n```\n\n#### Arguments:\n1. model - (Model | Array) A model or array of models that will be removed from `_model`.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove`\n\n#### Examples:\n```javascript\nvar model = new Neuro.Model({id: 1, name: 'Garrick'});\n\ncurrentCollection.add(model);\n\ncurrentCollection.remove(model);\n\n//or\n\ncurrentCollection.remove([model]); // remove an array of models.\n```\n\n### replace\n---\nReplace an existing model in the collection with a new one if the old model exists and the new model does not exist in the collection `_model` array. This will trigger `add` and `remove` events.\n\n#### Syntax:\n```javascript\ncurrentCollection.replace(oldModel, newModel);\n```\n\n#### Arguments:\n1. oldModel (Model) - The model that will be replaced in the collection.\n2. newModel (Object | Model) - The new model that will be replacing the old one.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n* `remove`\n\n### sort\n---\nSort the collection. Works the same way [Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.sort(function);\n```\n\n#### Arguments:\n1. function - (Function, optional) The function acts as a comparator. Please see [Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) for more information.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n#### Examples:\n```javascript\n// Sorts models ordered by id, where id is a number.\n// This function sorts the order from smallest to largest number.\n\ncurrentCollection.sort(function(modelA, modelB){\n    return modelA.get('id') - modelB.get('id');\n});\n```\n\n### reverse\n---\nReverses the order of the collection. Works the same way [Array.reverse](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reverse) would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.reverse();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n### empty\n---\nEmpty the collection of all models. Triggers the `empty` event and `remove` event for each model removed.\n\n#### Syntax:\n```javascript\ncurrentCollection.empty();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove` for each model removed\n* `empty`\n\n### toJSON\n---\nReturns a copy of collection `_model`. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\ncurrentCollection.toJSON();\n```\n\n#### Returns: Object containing the collection `_model`.\n\n### setupValidators\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### setValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### getValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### validate\n---\nValidate every property in a model that is passed into `validate`.\n\nsee [Mixin: Snitch](#mixin-snitch)\n\n#### Syntax:\n```javascript\ncollection.validate(models);\n```\n\n#### Arguments:\n1. models - (Object | Model | Array) An object, a model instance, or an array mix of both to be validated.\n\n#### Returns: (Boolean) True if all properties in the models validate, false otherwise.\n\n### proofModel\n---\nProof every property in the models that are passed into `proofModel`. Every validator property needs to exist in the model and every validator function must return `true` in order for `proofModel` to return `true`.\n\n#### Syntax:\n```javascript\ncollection.proofModel(models);\n```\n\n#### Arguments:\n1. model - (Object | Model | Array) An object, a model instance, or an array mix of both to be proofed.\n\n#### Returns: (Boolean) True if all properties in the models proof, false otherwise.\n\n### proof\n---\nMethod that proofs the models in the collection instance.\n\nsee [Mixin: Snitch](#mixin-snitch)\n\n#### Syntax:\n```javascript\ncollection.proof();\n```\n\n#### Returns: (Boolean)\n\n#### Note: This overrides the original `proof` method, but makes use of it to \"proof\" the collections models.\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Array Methods\n---\nThe following methods have been implemented from MooTools-Core Array onto Neuro Collection. They take the same arguments as their Object counterparts with the exception of having to pass the collection as the object to be acted upon.\n\n* `forEach`\n* `each`\n* `invoke`\n* `every`\n* `filter`\n* `clean`\n* `indexOf`\n* `map`\n* `some`\n* `associate`\n* `link`\n* `contains`\n* `getLast`\n* `getRandom`\n* `flatten`\n* `pick`\n\n```javascript\ncollection.forEach(function[, bind]);\ncollection.each(function[, bind]);\ncollection.invoke(method[, arg, arg, arg ...]);\ncollection.every(function[, bind]);\ncollection.filter(function[, bind]);\ncollection.clean();\ncollection.indexOf(item[, from]);\ncollection.map(function[, bind]);\ncollection.some(function[, bind]);\ncollection.associate(object);\ncollection.link(object);\ncollection.contains(item[, from]);\ncollection.getLast();\ncollection.getRandom();\ncollection.flatten();\ncollection.pick();\n```\n\n## Neuro View\nThe __View__ is a MooTools Class object. It acts as a layer between an element and everything else. One of the usual conventions of plugins that deals with elements has to attach/detach events to/from the element. The __View__ provides a simple, yet basic, way of binding methods/functions to the element event listeners.\n\nAnother convention is that attaching event handlers to classes can be a manual process. __View__ implements the [Connector](#mixin-connector) utility class to provide a powerful and automatic way to attach events between two classes.\n\nThe `render` method is the main method that should be used to visualize the element with data. The method is basic, triggering the `render` event on the __View__ class. Other class objects should extend from the __View__ class and override the `render` method, but call `this.parent` in order to trigger the `render` event.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\nStarts out with executing `setup` and then triggering `ready` event.\n\n#### Syntax:\n```javascript\nvar view = new Neuro.View(options);\n```\n\n#### Arguments:\n1. `options` - (Object, optional) The View options\n    * element - (String | Element, defaults to `undefined`) The root/parent element of where the rendered elements should be placed.\n    * events - (Object, defaults to `undefined`) An `Object` of key/value pairs\n        * `key` - (String) The element event or event-delegate type. `click` or `click:relay(selector)`\n        * `value` - (String | Function | Array) The handler that is attached to the event. It can be a `String` (amethod name in the view class instance), `Function`, or an `Array` of containing a mix of `String` or `Function` items.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: View instance..\n\n#### Events:\n* `ready: function(view){}` - Triggered  at the end of the `setup` method.\n* `render: function(view){}` - Triggered at the end of the `render` method.\n* `inject: function(view){}` - Triggered at the end of the `inject` method.\n* `dispose: function(view){}` - Triggered at the end of the `dispose` method.\n* `destroy: function(view){}` - Triggered at the end of the `destroy` method.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n### setup\n---\nCalled during `initialize` to `setOptions`, and `setElement`.\n\n#### Arguments:\n* Same as `initialize`\n\n#### Returns: View instance.\n\n### toElement\n---\nA method to retrieve the element stored in the view instance. Any Class instance, with a `toElement` method, passed to MooTools Element `document.id` or `$` method will return the value from the classes `toElement` method. This is a hidden MooTools Core trick.\n\n#### Syntax:\n```javascript\nview.toElement();\n\ndocument.id(view);\n\n$(view);\n```\n\n#### Returns: `element` property stored in view instance.\n\n### setElement\n---\nStore the root element for the view instance. If an element exists, it will first execute View `destroy` method to properly detach events and remove references to it. Then it will store a reference to the element and execute View `attachEvents`.\n\n#### Syntax:\n```javascript\nview.setElement(element);\n```\n\n#### Arguments:\n1. element - (Element) Element to be set as root element in the view instance. `attachEvents` will refer to `options.events` for the event and method/function to attach.\n\n#### Returns: View instance.\n\n### attachEvents\n---\nAttach events to the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be detached using `detachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.attachEvents();\n```\n\n#### Returns: View instance.\n\n### detachEvents\n---\nDetach events from the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be attached using `attachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.detachEvents();\n```\n\n#### Returns: View instance.\n\n### create\n---\nIt is a no-op method. Override `create` in your Class that extends from __View__. It could be used to create the root `element`, or other child elements that goes into the root `element.\n\n#### Syntax:\n```javascript\nview.create();\n```\n\n#### Returns: View instance.\n\n### render\n---\nAlthough `render` is considered a no-op method, it still trggers the `render` event. Override `render` in your Class that extends from __View__.  __Remember__ to call 'this.parent()' at the end of your code to execute the original `render` method that will trigger the `render` event. Pass `data` to the `render` method, such as Neuro Model or Neuro Collection.\n\nIf you are passing any Class that implements [Mixin: Connector](#mixin-connector), you should consider using the `connect` method. It will help to automatically attach events between the View instance and the other Classes, in this case it is likely to be a Neuro Model or Neuro Collection instances.\n\n#### Syntax:\n```javascript\nview.render(data);\n```\n\n#### Arguments:\n1. data - (Mixed) It can be anything you will use as data to render the view. This also means you can pass in multiple Neuro Model instances, multiple Neuro Collection instances, other View instances. Use your imagination.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `render`\n\n### inject\n---\nInject or inserts the root `element` relative to another element or View instance. `document.id` / `$` will resolve the element from the other View instance.\n\n#### Syntax:\n```javascript\nview.inject(reference[, where]);\n```\n\n#### Arguments:\n1. reference - (String | Element | Class) The `element` will be placed relative to the reference element. A `String` should be the id of the reference element, without the \"#\". A `Class` instance should have a `toElement` method in order to resolve the reference element.\n2. where - (String, optional, defaults to \"bottom\") The place to inject/insert the `element` relative to the reference element. Can be: `top`, `bottom`, `after`, or `before`.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `inject`\n\n### dispose\n---\nRemoves the Element from the DOM but retains it in memory if the `element` exists.\n\n#### Syntax:\n```javascript\nview.dispose();\n```\n\n#### Returns: View instance.\n\n#### Triggered Events\n* `dispose`\n\n### destroy\n---\nRemoves the Element and its children from the DOM and prepares them for garbage collection. Executes `detatchEvents` and removes reference to element in `element` property. Triggers `destroy` event.\n\n#### Syntax:\n```javascript\nview.destroy();\n```\n\n#### Returns: View instance.\n\n## Mixin: Events\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. `Events` in a Class that implements `Events` must be either added as an option or with `addEvent`, not directly through .`options.onEventName`.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({ Implements: Events });\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Events);\n```\n\n#### Implementing:\n\n* This class can be implemented into other classes to add its functionality to them.\n* `Events` has been designed to work well with the `Options` class. When the option property begins with 'on' and is followed by a capital letter it will be added as an event (e.g. `onComplete` will add as `complete` event).\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(element){\n        // ...\n    },\n    complete: function(){\n        this.fireEvent('complete');\n    }\n});\n\nvar myWidget = new Widget();\nmyWidget.addEvent('complete', myFunction);\n```\n\n#### Notes:\n* Events starting with 'on' are still supported in all methods and are converted to their representation without 'on' (e.g. 'onComplete' becomes 'complete').\n\n### addEvent\n---\nAdds an event to the Class instance's event stack.\n\n#### Syntax:\n```javascript\nmyClass.addEvent(type, fn[, internal]);\n```\n\n#### Arguments:\n1. type     - (String) The type of event (e.g. `complete`).\n2. fn       - (Function) The function to execute.\n3. internal - (Boolean, optional) Sets the function property: internal to true. Internal property is used to prevent removal.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvent('start', myStartFunction);\n```\n\n### addEvents\n---\nThe same as `addEvent`, but accepts an object to add multiple events at once.\n\n#### Syntax:\n```javascript\nmyClass.addEvents(events);\n```\n\n#### Arguments:\n1. events - (Object) An object with key/value representing: key the event name (e.g. `start`), and value the function that is called when the Event occurs.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvents({\n    start: myStartFunction,\n    complete: function() {\n        alert('Done.');\n    }\n});\n```\n\n### fireEvent\n---\nFires all events of the specified type in the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.fireEvent(type[, args[, delay]]);\n```\n\n#### Arguments:\n1. type  - (String) The type of event (e.g. `complete`).\n2. args  - (String | Array, optional) The argument(s) to pass to the function. To pass more than one argument, the arguments must be in an array.\n3. delay - (Number, optional) Delay in milliseconds to wait before executing the event (defaults to 0).\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(arg1, arg2){\n        //...\n        this.fireEvent('initialize', [arg1, arg2], 50);\n    }\n});\n```\n\n### removeEvent\n---\nRemoves an event from the stack of events of the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.removeEvent(type, fn);\n```\n#### Arguments:\n1. type - (String) The type of event (e.g. `complete`).\n2. fn   - (Function) The function to remove.\n\n#### Returns: This Class instance.\n\n#### Notes:\n* If the function has the property internal and is set to true, then the event will not be removed.\n\n\n### removeEvents\n---\nRemoves all events of the given type from the stack of events of a Class instance. If no type is specified, removes all events of all types.\n\n#### Syntax:\n```javascript\nmyClass.removeEvents([events]);\n```\n\n#### Arguments:\n1. events - (optional) If not passed removes all events of all types.\n    - (String) The event name (e.g. 'success'). Removes all events of that type.\n    - (Object) An object of type function pairs. Like the one passed to `addEvents`.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('myElement', 'opacity');\nmyFx.removeEvents('complete');\n```\n\n#### Notes:\n* removeEvents will not remove internal events. See `Events:removeEvent`.\n\n## Mixin: Options\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. Used to automate the setting of a Class instance's options. Will also add Class `Events` when the option property begins with 'on' and is followed by a capital letter (e.g. `onComplete` adds a `complete` event). You will need to call `this.setOptions()` for this to have an effect, however.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({Implements: Options});\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Options);\n```\n\n### setOptions\n---\nMerges the default options of the Class with the options passed in. Every value passed in to this method will be deep copied. Therefore other class instances or objects that are not intended for copying must be passed to a class in other ways.\n\n#### Syntax:\n```javascript\nmyClass.setOptions([options]);\n```\n\n#### Arguments:\n1. options - (Object, optional) The user defined options to merge with the defaults.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Options,\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    }\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    }\n});\n\n//myWidget.options is now: {color: #f00, size: {width: 200, height: 100}}\n\n// Deep copy example\nvar mySize = {\n    width: 50,\n    height: 50\n};\n\nvar myWidget = new Widget({\n    size: mySize\n});\n\n(mySize == myWidget.options.size) // false! mySize was copied in the setOptions call.\n```\n\n#### Notes:\n* Relies on the default options of a Class defined in its options property.\n\n#### Options in combination with Events\nIf a Class has `Events` as well as `Options` implemented, every option beginning with 'on' and followed by a capital letter (e.g. `onComplete`) becomes a Class instance event, assuming the value of the option is a function.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: [Options, Events],\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    },\n    show: function(){\n        // Do some cool stuff\n\n        this.fireEvent('show');\n    }\n\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    },\n    onShow: function(){\n        alert('Lets show it!');\n    }\n});\n\nmyWidget.show(); // fires the event and alerts 'Lets show it!'\n```\n\n## Mixin: Connector\n---\nA Utility Class. It allows automatic attachment/detachment of event listeners between two classes.\n\n### options.connector\n---\nA key/value object to map events to functions or method names on the target class that will be connected with. The value can also be an object that contains more key/value pairs. This allows to attach sub-events, such as `change:key`. __Note:__ An asterisk (*) as the sub-event refers to the parent event only.\n\n#### Syntax: key/value pairs\n```javascript\nevent: method\n```\n\n#### Arguments\n1. event - (String) The name of the event to be attached. It becomes the parent event if the events corresponding value is an object.\n2. method - (String, Function, Array, Object)\n    * String - Refers to a method on the target class. The method will be bound to the target class and attached as the event handler.\n    * Function - The function will be bound to the current class and attached as the event handler\n    * Array - Can contain a mix of `String` (name of method to retrieve said method from target class) or `Function` to be attached as the event handler\n    * Object - Contains key/value pairs where `key` will refer to the sub-event and value refers to `String`, `Function`, or `Array` to attach as event handlers. The sub-event will be prepended by the `event` with a `:`.\n\n#### Examples\nThe following will show what key/value pairs will look like and what they look like when attached manually instead of with connector.\n\n* `value` is a string\n\n```javascript\nchange: 'doneMethodName'\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n```\n\n* `value` is a function\n\n```javascript\nchange: function(){/*... code here ...*/}\n```\n\n```javascript\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an array\n\n```javascript\nchange: ['doneMethodName', function(){/*... code here ...*/}]\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an object with subevents and a mix of string, function, or array.\n\n```javascript\nchange: {\n    '*': 'doneMethodName',\n    'name': function(){/*... code here ...*/},\n    'age': ['otherDoneMethodName', function(){/*... other code here ...*/}]\n}\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(this));\n\ncurrentClass.addEvent('name', function(){/*... code here ...*/});\n\ncurrentClass.addEvent('age', targetClass.otherDoneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('age', function(){/*... other code here ...*/});\n```\n\n### connect\n---\nConnects two classes by using `options.connector` as the map to either attach event listeners to functions on `options.connector` or methods on the target class where the method names are retrieved from `options.connector`. Default behavior is to connect two classes. Connect one way by passing a second argument as `true`.\n\n#### Syntax\n```javascript\ncurrentClass.connect(targetClass[, oneWay]);\n```\n\n#### Arguments\n1. class - (Class) The class containing the methods that will be attached as event handlers to event listeners on the current class.\n2. oneWay - (Boolean, optional, `false` by default) Set to true will only connect `this` class with the target class and will not have the target class connect with `this` class.\n\n### disconnect\n---\n\n## Mixin: Butler\n---\nA Utility Class. It provides a way to define custom setters/getters on a Class.\n\n### options.accessors\n---\nA key/value object where the key is the name of the setter and value is an object containing overriding set/get methods.\n\n#### Syntax: key/value pairs\n```javascript\nname: {\n    set: function,\n    get: function\n}\n```\n\n#### Arguments\n1. name - (String) Name of the set/get method that will get overriden\n2. object - (Object) Contains set, get method overrides.\n    * set - (Function) The overriding set function. The function will be bound to the current class.\n    * get - (Function) The overriding get function. The function will be bound to the current class. \n\n### setupAccessors\n---\nExisting accessors in `_accessors` are merged with `options.accessors` before being sent to `setAccessor`. This should be called in the `initailize` or `setup` method.\n\n#### Syntax:\n```javascript\ncurrentClass.setupAccessors();\n```\n\n#### Returns: Class instance.\n\n### isAccessing\n---\nCheck whether an accessor is being used by checking if `_accessorName` has been defined. This will allow a class to bypass recursive calls to the same custom setter/getter.\n\n#### Syntax:\n```javascript\ncurrentClass.isAccessing();\n```\n\n#### Returns: Boolean\n\n### setAccessor\n---\nA method to decorate custom setters/getters that will allow the use of `isAccessing` to prevent recursive calls to the same custom setter/getter. The decorated custom setters/getters is an object of name/function pairs that is stored in `_accessors` by name.\n\n#### Syntax:\n```javascript\ncurrentClass.setAccessor(name, obj);\n\ncurrentClass.setAccessor(obj);\n```\n\n#### Arguments:\n* Two Arguments\n    1. name - (String) Name of the accessor setter/getter object.\n    2. obj - (Object) Key/value pairs where the `key` is `set` or `get` and `value` is the function. Any key/value pair is optional. A `set` can exists without a `get`, and a `get` can exist without a `set`.\n\n#### Returns: Class instance.\n\n#### Note: The original undecorated function is stored on the decorated function in the `_orig` attribute.\n\n#### Example:\n```javascript\nvar klass = new Class({\n    Implements: CustomAccessor,\n\n    options: {\n        accessors: {\n            fullName: {\n                set: function(){}\n            }\n        }\n    }\n});\n\nvar currentClass = new klass();\n\n// manually executed because klass doesn't have an initialize or setup method to execute setupAccessors.\ncurrentClass.setupAccessors();\n\nvar fullNameAccessor = currentClass.getAccessor('fullName');\n\nfullNameAccessor.set; // returns the decorated set function.\n\nfullNameAccessor.set._orig // is the undecorated original set function.\n```\n\n### getAccessor\n---\nA method to retrieve stored accessors by name or by name and type.\n\n#### Syntax:\n```javascript\ncurrentClass.getAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to return.\n2. type - (String, optional) The name of the method that exists in the accessor object.\n\n#### Returns:\n1. Object - The object of decoerated key/value pairs containing the accessors that was stored with the name.\n2. Function - The decorated function that is associated with the `type` in the accessor object. The accessor object is retrieved with the `name`.\n\n#### Examples:\n\n__Return an accessor object__\n\n```javascript\ncurrentClass.setAccessor('fullName', {\n    set: function(){}\n});\n\nvar fullNameAccessors =  currentClass.getAccessor('fullName');\n/*\nfullNameAccessors returns and object where the set function is the decorated function\n{\n    set: function(){}\n}\n */\n```\n\n__Return the decorated function in the accessor object__\n\n```javascript\n// Returns the decorated function that is stored with the set key, in the fullName accessor object.\nvar fullNameSetAccessor = currentClass.getAccessor('fullName', 'set');\n```\n\n### unsetAccessor\n---\nRemove an accessor object or decorated function from the accessor object.\n\n#### Syntax:\n```javascript\ncurrentClass.unsetAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to remove.\n2. type - (String, optional) The `key` of the function that should be removed from the accessor object.\n\n#### Returns: Class instance.\n\n#### Example\n\n__Remove an accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName');\n```\n\n__Remove a function from the accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName', 'set');\n```\n\n## Mixin: Silent\nA Utility Class. It provides a solution to disable before a function executes, and re-enabling afterwards.\n\n### isSilent\n---\nChecks if the Class is currently silent.\n\n#### Syntax:\n```javascript\ncurrentClass.isSilent();\n```\n\n#### Returns: Boolean\n\n### silence\n---\nAny method that can trigger an event can be temporarily disabled by passing the function through silence. Once the function has been triggered, events will be re-enabled.\n\n#### Syntax:\n```javascript\ncurrentClass.silence(function);\n```\n\n#### Arguments:\n1. function - (Function) The function that will be executed once events have been prevented. The function is bound to the model instance before execution.\n\n#### Returns: Class instance.\n\n## Mixin: Snitch\n---\nA Utility Class. Use this class to set/get validator functions. A `validate` method offers a way to easily retrieve a validator to test a value. A `proof` method is a simple object spec test that tests an object for existence of keys and runs validation tests on the values of those keys.\n\n### options.validators\n---\nA key/value object where the key is the property name and value is a function. The function will be passed an argument to test against and should return a boolean.\n\n### Syntax: key/value pairs\n```javascript\n{\n    name: function,\n    name: function\n}\n```\n\n#### Arguments\n1. name - (String) Name of the validator function\n2. function - (Function) The function will be passed an argument to test against and should return a `Boolean`\n\n### setupValidators\n---\nExisting validators in `_validators` are merged with `options.validators` to be attached by `setValidator`. This should be called in the `initailize` or `setup` method.\n\n#### Syntax:\n```javascript\ncurrentClass.setupValidators();\n```\n\n#### Returns: Class instance.\n\n### setValidator\n---\nSet functions by property. The function will be decorated to be bound to the class instance. \n\n#### Syntax:\n```javascript\ncurrentClass.setValidator(name, function)\n\ncurrentClass.setValidator(obj);\n```\n\n#### Arguments:\n* Two Arugments:\n    1. name - (String) Name of the validator.\n    2. function - (Function) The validation function to test against a passed parameter.\n* One Argument:\n    1. obj - (Object) Name/function object.\n\n#### Returns: Class instance.\n\n#### Note: The original undecorated function is stored on the decorated function in the `_orig` attribute.\n\n#### Example:\n```javascript\nvar klass = new Class({\n    Implements: Snitch,\n\n    options: {\n        validators: {\n            fullName: Type.isString // Type.isString is a method in MooTools-Core that tests arguments whether they are strings or not by returning a boolean\n        }\n    }\n});\n\nvar currentClass = new klass();\n\n// manually executed because klass doesn't have an initialize or setup method to execute setupValidators.\ncurrentClass.setupValidators();\n\n// returns the validation function\nvar fullNameValidator = currentClass.getValidator('fullName');\n\n// the undecorated original function\nfullNameValidator._orig;\n```\n\n### getValidator\n---\nRetrieve a stored validation function by property name.\n\n#### Syntax:\n```javascript\ncurrentClass.getValidator(name[, name]);\n```\n\n#### Arguments\n1. name - (String) The name of the validator to return. Consecutive names will return an object of name/function matches.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Name/function pairs containing matches validator functions and their corresponding names. An unexisting validator will return `undefined` in place of the function.\n* One argument\n    * (Function) Validation function corresponding to the name.\n\n#### Example:\n```javascript\ncurrentClass.getValidator('fullName'); // returns function or undefined\n\ncurrentClass.getValidator('age', 'fullName'); // returns an object containing age and fullName properties\n```\n\n### validate\n---\nConvenient method to retrieve a validator by property to test the value against. By default it always returns true. If a validator exists, it returns the results of validation.\n\n#### Syntax:\n```javascript\ncurrentClass.validate(property, value);\n```\n\n#### Arguments:\n1. property - (String) Name of the validator to retrieve.\n2. value - (Mixed) Value to validate by the retrieved validator.\n\n#### Returns:\n* (Boolean) Value of whether validation has passed or not.\n\n### proof\n---\n\"Proof\" an object where every item that exists in `_validators` exists in the object and every validation function returns a `true` value. This causes `_validators` to act like a spec. By default, `proof` returns true in case there are no defined validators. It is a convenient method that utilizes `Snitch Function: proof`;\n\n#### Syntax:\n```javascript\ncurrentClass.proof(obj);\n```\n\n#### Arguments:\n1. obj - (Object) The object that will be tested against every validator in `_validators`. Every property in `_validators` just exist in obj and every function must pass in order for proof to return true.\n\n#### Returns:\n* (Boolean) Value of whether the object has passed validation and item existence.\n\n### Snitch Function: proof\n---\nGeneric method to proof an object with validators.\n\n#### Syntax:\n```javascript\nSnitch.proof(obj, validators);\n```\n\n#### Arguments:\n1. obj - (Object) Object of key/value pairs that will be compared against`validators`\n2. validators - (Object) Object of key/function pairs that will be used to compare against `obj` where each key has to exist in the `obj` and the `obj` property value passes the validator function.\n\n#### Returns:\n* (Boolean) Value of whether the object has passed validation and item existence.","_id":"Neuro@0.2.2","dist":{"shasum":"f0685690f4e27d9406a571411e6ca0745eb5aa7b","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.2.2.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}]},"0.2.3":{"name":"Neuro","description":"A MVC written with MooTools.","version":"0.2.3","license":"MIT (http://mootools.net/license.txt)","main":"src/main.js","keywords":["neuro","mootools","mvc"],"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"bugs":"https://github.com/gcheung55/neuro/issues","repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"dependencies":{"neuro-is":"*"},"devDependencies":{"buster":"*"},"scripts":{"test":"node_modules/.bin/buster-test"},"engines":{"node":"~0.6.0"},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n__Version: 0.2.3 (Alpha)__\n\n[![Build Status](https://secure.travis-ci.org/GCheung55/Neuro.png)](http://travis-ci.org/GCheung55/Neuro)\n\n__Influences:__\n\n* [Backbone](/documentcloud/backbone)\n* [Shipyard](/seanmonstar/Shipyard)\n\n__Dependencies:__\n\n* [MooTools-Core 1.x](/mootools/mootools-core)\n* [Is.js](/gcheung55/is.js)\n\n__Focus:__\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\n__Extensions:__\n\n* [Neuro-Sync](http://github.com/gcheung55/neuro-sync) - Extends Neuro with a CRUD API\n* [Neuro-Company](http://github.com/gcheung55/neuro-company) - Extends Neuro with an Observer API\n\n## Neuro Model\nThe __Model__ is a Object-like MooTools Class object that provides a basic API to interact with data. You can use Model by itself or extend other Class objects with it. It implements `each`, `filter`, and other convenient methods from `Object`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Butler](#mixin-butler)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n* [Mixin: Snitch](#mixin-snitch)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar model = new Neuro.Model(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Object) An object containing key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * defaults - (Object) Contains the default key/value pair defaults for the Model.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n    * accessor - (Object) See [Mixin: Butler](#mixin-butler)\n\n#### Returns: Model instance.\n\n#### Events:\n* `change: function(model){}` - Triggered when a change to the model's data has occurred\n* `change:key: function(model, key, value, oldValue){}` - Triggered when a specific model data property change has occurred. The `key` refers to the specific property. All `change:key` events will be triggered before `change` is triggered.\n* `destroy: function(model){}` - Triggered when the model is destroyed.\n* `reset: function(model){}` - Triggered when the model is reset to its default values.\n* `error: function(model){}` - Triggered when the model data does not validate during the setting process.\n* `error:key: function(model, key, value){}` - Triggered when a specific model data property does not validate during the setting process.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n#### Returns: Model instance.\n\n### set\n---\nThe way to assign values to properties the model has. __Do not__ use direct assignment else events will not be triggered or custom setters will not be used.\n\n#### Syntax:\n```javascript\nmodel.set(property, value);\n\nmodel.set(object);\n```\n\n#### Arguments:\n* Two Arguments (property, value)\n    1. property - (String) A key used to define a property the model has.\n    2. value - (String | Array | Number | Object | Function | Class) A value of the corresponding property.\n* One Argument (object)\n    1. object (Object) An object containing sets of property/value pairs\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n#### Examples:\n```javascript\n// set a property value\nmodel.('hasGlasses', true);\n\n// set the property 'name' as an object.\nmodel.set('name', {\n    first: 'Garrick',\n    last: 'Cheung'\n});\n\nset an object that contains all the property value pairs\nmodel.set({\n    name: {\n        first: 'Garrick',\n        last: 'Cheung'\n    }\n});\n```\n\n### isSetting\n---\nUse to check if data is currently being handled by the model to assign values to properties the model has.\n\n#### Syntax:\n```javascript\nmodel.isSetting();\n```\n\n#### Returns: Boolean (true/false).\n\n### get\n---\nRetrieve a property value the model has.\n\n#### Syntax:\n```javascript\nmodel.get(property);\n\nmodel.Get(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding values that the model has.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding value that the model has.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of data that the model has. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the property that the model has.\n\n#### Examples:\n```javascript\nmodel.get('name'); // returns value of 'name' property.\n\nmodel.get('name', 'age'); // returns object containing name and age properties\n```\n\n### getData\n---\nRetrieve all properties/values the model has. The returned object is a clone (dereferenced) of the data the model has.\n\n#### Syntax:\n```javascript\nmodel.getData();\n```\n\n#### Returns: Object containing the data the model has.\n\n### getPrevious\n---\nRetrieve the previous property value he model had. Model only retains one record of previous data.\n\n#### Syntax:\n```javascript\nmodel.getPrevious(property);\n\nmodel.getPrevious(property1, property2);\n```\n\n#### Arguments:\n* More than One Consecutive Argument\n    1. property1, property2... - (String) The properties used to retrieve corresponding previous values that the model had.\n* One Argument\n    1. property - (String) The property used to retrieve the corresponding previous value that the model had.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Key/value pairs of previous data that the model had. Keys correspond to the arguments.\n* One Argument\n    * (String) Value corresponding to the previous property that the model had.\n\n### getPreviousData\n---\nRetrieve all previous properties/values the model had. THe returned object is a clone (dereferenced) of the previous data the model had.\n\n#### Syntax:\n```javascript\nmodel.getPreviousData();\n```\n\n#### Returns: Object containing the previous data the model had.\n\n### unset\n---\nUnset data properties the model has. Data properties can not be erased so they will be set to `undefined`.\n\n#### Syntax:\n```javascript\nmodel.unset(property);\n\nmodel.unset([property1, property2]);\n```\n\n#### Arguments:\n1. property - (String | Array) The property to be unset that the model has. Multiple properties can be unset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n\n### reset\n---\nReset data properties to their default values the model had.\n\n#### Syntax:\n```javascript\nmodel.reset();\n\nmodel.reset(property);\n\nmodel.reset([property1, property2]);\n```\n#### Arguments:\n* Zero Arguments\n    * all data properties in the model is reset to the defined options.defaults\n* One Argument\n    * property - (String | Array, optional) The property to be reset that the model has. Multiple properties can be reset if they are encapsulated in an Array.\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `change:key`\n* `change`\n* `reset`\n\n### destroy\n---\nTriggers the `destroy` event. This should be overriden in a Class that extends from Model to do additional things. If overriden, remember to call `this.parent();` to trigger the `destroy` method, or execute `signalDestroy` manually.\n\n#### Syntax:\n```javascript\nmodel.destroy();\n```\n\n#### Returns: Model instance.\n\n#### Triggered Events:\n* `destroy`\n\n### toJSON\n---\nReturns a copy of data the model has. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\nmodel.toJSON();\n```\n\n#### Returns: Object containing the data the model has.\n\n### spy\n---\nA convenient method to attach event listeners to `change:key`.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n\nmodel.spy(object);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property to listen to.\n    2. function - (Function) Function that is to be executed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### unspy\n---\nA convenient method to remove event listeners to `change:key`. If a function is not provided, all events attached to a specific `change:key` will be removed.\n\n#### Syntax:\n```javascript\nmodel.spy(property, function);\n```\n\n#### Arguments:\n* Two Arguments\n    1. property - (String) Name of the property that is being listend to.\n    2. function - (Function, optional) Function that is to be removed when event is triggered.\n* One Argument\n    1. object - (Object) An object encapsulating key/value pairs of properties/functions\n\n#### Returns: Model instance.\n\n### setupValidators\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### setValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### getValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### validate\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### proof\n---\nMethod that proofs the model instance.\n\nsee [Mixin: Snitch](#mixin-snitch)\n\n#### Syntax:\n```javascript\nmodel.proof();\n```\n\n#### Returns: (Boolean) Every property in the `_validators` object must exist in the model instances `_data` object and every function in `_validators` must return `true` in order for `proof` to return `true`, otherwise `false`.\n\n#### Note: This overrides the original `proof` method, but makes use of it to \"proof\" the model instance.\n\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### setupAccessors\n---\nsee [Mixin: Butler](#mixin-butler)\n### isAccessing\n---\nsee [Mixin: Butler](#mixin-butler)\n### setAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### getAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### unsetAccessor\n---\nsee [Mixin: Butler](#mixin-butler)\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Object Methods\n---\nThe following methods have been implemented from MooTools-Core Object onto Neuro Model. They take the same arguments as their Object counterparts with the exception of having to pass the model as the object to be acted upon.\n\n* `each`\n* `subset`\n* `map`\n* `filter`\n* `every`\n* `some`\n* `keys`\n* `values`\n* `getLength`\n* `keyOf`\n* `contains`\n* `toQueryString`\n\n```javascript\nmodel.each(function[, bind]);\nmodel.subset(keys);\nmodel.map(function[, bind]);\nmodel.filter(function[, bind]);\nmodel.every(function[, bind]);\nmodel.some(function[, bind]);\nmodel.keys();\nmodel.values();\nmodel.getLength();\nmodel.keyOf(property);\nmodel.contains(value);\nmodel.toQueryString();\n```\n\n## Neuro Collection\nThe __Collection__ is an Array-like MooTools Class object that provides a basic API to interact with multiple __Models__. You can use __Collection__ by itself or extend other Class objects with it. It contains a reference to a __Model__ Class to create a model instance when adding a data `Object`. The reference __Model__ Class can be optionally replaced by a different Class that extends from __Model__. It implements `each`, `filter`, and some other convenient methods from `Array`.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n* [Mixin: Snitch](#mixin-snitch)\n\n### constructor (initialize)\n---\n\n#### Syntax:\n```javascript\nvar collection = new Neuro.Collection(data [, options]);\n```\n\n#### Arguments:\n1. `data` - (Mixed, optional)\n    * Model - A `Model` instance\n    * Object - An object of key/value pairs that will be used to create a model instance\n    * Array - An array of Model instances or object key/value pairs\n2. `options` - (Object, optional) The Model options\n    * primaryKey - (String) Define to uniquely identify a model in a collection\n    * Model - (Model, defaults to undefined) The `Model` Class used to create model instances from when an `Object` is passed to `add`.\n    * modelOptions - (Object, defaults to undefined) An `Object` containing options for creating new model instances. See [Neuro Model](#neuro-model)\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: Class instance.\n\n#### Events:\n* `change: function(collection){}` - Triggered when there is a change in the collection (`add`, `remove`, `replace`).\n* `change:model: function(collection, model){}` - Triggered when there is a change in a model. Does not trigger the `change` event on the collection.\n* `add: function(collection, model){}` - Triggered when a model is added to the collection.\n* `remove: function(collection, model){}` - Triggered when a specific model is removed from the collection.\n* `empty: function(collection){}` - Triggered when the collection is emptied of all models.\n* `sort: function(collection){}` - Triggered when `sort` or `reverse` occurs.\n* `error: function(collection, model, at){}` - Triggered when a model is added to the collection that does not pass validation IF validators exist in the collection instance.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n* A default model is defined in the `Collection` Class as the `_Model` property. It can be overriden by `options.Model` or when a Class extends from `Collection` and defines a different `_Model` property.\n* Define `options.primaryKey` to better identify model instances, such as checking if the collection `hasModel`.\n\n#### Returns: Model instance.\n\n### hasModel\n---\nChecks if the collection instance contains a model by checking if the model exists in the `_models` array or using `options.primaryKey` to compare models.\n\n#### Syntax:\n```javascript\ncurrentCollection.hasModel(model);\n```\n\n#### Arguments:\n1. model - (Object | Model) An `Object` or `Model` instance that is used to compare with existing models in the collection. `options.primaryKey` will be used to compare against the models if an initial use of `Array.contains` returns `false`.\n\n#### Returns: Boolean.\n\n### add\n---\nAdding a model to the collection should always go through this method. It appends the model to the internal `_model` array and triggers the `add` event if the collection does not already contain the model. `change` event is triggered afterwards.\n\nIf `_validators` exist, then each model or object added must pass validation in order to be added to the collection instance. Otherwise a `error` event will be triggered. \n\nIf an `Object` is passed in, the `Object` will be converted to a model instance before being appended to `_model`. Adding a model will increase the collections `length` property. \n\nIt is possible to insert a model instance into `_model` at a specific index by passing a second argument to `add`.\n\nA `remove` method is attached to the models `destroy` event so that the model can be properly removed if the model `destroy` event is triggered.\n\n#### Syntax:\n```javascript\ncurrentCollection.add(models, at);\n```\n\n#### Arguments:\n1. models - (Object | Model | Array)\n    * Object - An `Object` with key/value pairs of data properties. It will be converted to a `Model` instance before adding to `_model`.\n    * Model - A `Model` instance.\n    * Array - An `Array` that contain a mix of `Object` and `Model` instances.\n2. at - (Number, optional) The index to insert the model in the `_model` array. If the collection is empty, `at` is ignored and and the model is inserted as the first item in the array.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n* `error`\n* `change`\n\n\n#### Examples:\n```javascript\ncurrentCollection.add({\n    id: 1, name: 'Bruce Lee'\n}, 2);\n\ncurrentCollection.add( new Neuro.Model({id: 1, name: 'Bruce Lee'}) );\n\ncurrentCollection.add(\n    [\n        {id: 1, name: 'Bruce Lee'}, \n        new Neuro.Model({id: 1, name: 'Chuck Norris'})\n    ]\n);\n```\n\n### get\n---\nGet the model by index. Multiple indexes can be passed to get to retrieve multiple models.\n\n#### Syntax:\n```javascript\ncurrentCollection.get(index);\n```\n\n#### Arguments:\n1. index - (Number) The index number of the model to return.\n\n#### Returns: A model instance corresponding to the index in `_model`. If multiple indexes are passed to `get`, an `Array` of models is returned, where each model corresponds to the index.\n\n#### Examples:\n```javascript\ncurrentCollection.get(0); // returns the model instance that corresponds to the index argument\n\ncurrentCollection.get(0, 2, 3); // returns an array of model instances where each model corresponds to each index argument\n```\n\n### remove\n---\nRemove a model or models from the collection. It will trigger the `remove` event for each individual model removed. `change` event is triggered afterwards.\n\nThe collection should remove the model only if it exists on the collection. Removing the model from the collection will also remove the `remove` method from the models `destroy` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.remove(model);\n```\n\n#### Arguments:\n1. model - (Model | Array) A model or array of models that will be removed from `_model`.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove`\n* `change`\n\n#### Examples:\n```javascript\nvar model = new Neuro.Model({id: 1, name: 'Garrick'});\n\ncurrentCollection.add(model);\n\ncurrentCollection.remove(model);\n\n//or\n\ncurrentCollection.remove([model]); // remove an array of models.\n```\n\n### replace\n---\nReplace an existing model in the collection with a new one if the old model exists and the new model does not exist in the collection `_model` array. This will trigger `add` and `remove` events. `change` event is triggered afterwards.\n\n#### Syntax:\n```javascript\ncurrentCollection.replace(oldModel, newModel);\n```\n\n#### Arguments:\n1. oldModel (Model) - The model that will be replaced in the collection.\n2. newModel (Object | Model) - The new model that will be replacing the old one.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `add`\n* `remove`\n* `change`\n\n### sort\n---\nSort the collection. Works the same way [Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.sort(function);\n```\n\n#### Arguments:\n1. function - (Function, optional) The function acts as a comparator. Please see [Array.sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) for more information.\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n#### Examples:\n```javascript\n// Sorts models ordered by id, where id is a number.\n// This function sorts the order from smallest to largest number.\n\ncurrentCollection.sort(function(modelA, modelB){\n    return modelA.get('id') - modelB.get('id');\n});\n```\n\n### reverse\n---\nReverses the order of the collection. Works the same way [Array.reverse](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reverse) would work. Triggers `sort` event.\n\n#### Syntax:\n```javascript\ncurrentCollection.reverse();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `sort`\n\n### empty\n---\nEmpty the collection of all models. Triggers the `empty` event and `remove` event for each model removed.\n\n#### Syntax:\n```javascript\ncurrentCollection.empty();\n```\n\n#### Returns: Class instance.\n\n#### Triggered Events:\n* `remove` for each model removed\n* `empty`\n\n### toJSON\n---\nReturns a copy of collection `_model`. Can be used for persistence, serialization, or augmentation before passing over to another object. `JSON.stringify` uses this to to create a JSON string, though the method itself does not return a String.\n\n#### Syntax:\n```javascript\ncurrentCollection.toJSON();\n```\n\n#### Returns: Object containing the collection `_model`.\n\n### attachModelEvents\n---\nAttach handlers to the model `destroy` and `change` listeners. The model `destroy` event will trigger the collection `remove` method. The model `change` event will trigger the collection `change:model` event. This is automatically used during `add` to help clean up if the model is destroyed and to notify listeners of the collection that a model changed.\n\n#### Syntax:\n```javascript\ncurrentCollection.attachModelEvents(model);\n```\n\n#### Arguments:\n* model - (Model) A model instance to attach events to.\n\n#### Examples:\n```javascript\nvar model = new Neuro.Model();\n\ncurrentCollection.add(model); // Events attached to the model\n\ncurrentCollection.length; // Return 1, meaning there is one model existing\n\nmodel.destroy(); // currentCollection is notified that to remove the model since `destroy` event was triggered\n\ncurrentCollection.length // Return 0, the model was removed when it was destroyed.\n```\n\n#### Returns: Class instance.\n\n### detachModelEvents\n---\nDetach handlers to the model `destroy` and `change` listeners. If the model `destroy` event is triggered, the collection is notified and removes the model from the collection. The `destroy` and `change`events are removed from the model during execution of `remove` method.\n\n#### Syntax:\n```javascript\ncurrentCollection.detachModelEvents(model);\n```\n\n#### Arguments:\n* model - (Model) A model instance to attach events to.\n\n#### Examples:\n```javascript\nvar model = new Neuro.Model();\n\ncurrentCollection.add(model); // Events attached to the model\n\ncurrentCollection.length; // Return 1, meaning there is one model existing\n\nmodel.destroy(); // currentCollection is notified that to remove the model since `destroy` event was triggered\n\ncurrentCollection.length // Return 0, the model was removed when it was destroyed.\n```\n\n#### Returns: Class instance.\n\n### setupValidators\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### setValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### getValidator\n---\nsee [Mixin: Snitch](#mixin-snitch)\n### validate\n---\nValidate every property in a model that is passed into `validate`.\n\nsee [Mixin: Snitch](#mixin-snitch)\n\n#### Syntax:\n```javascript\ncollection.validate(models);\n```\n\n#### Arguments:\n1. models - (Object | Model | Array) An object, a model instance, or an array mix of both to be validated.\n\n#### Returns: (Boolean) True if all properties in the models validate, false otherwise.\n\n### proofModel\n---\nProof every property in the models that are passed into `proofModel`. Every validator property needs to exist in the model and every validator function must return `true` in order for `proofModel` to return `true`.\n\n#### Syntax:\n```javascript\ncollection.proofModel(models);\n```\n\n#### Arguments:\n1. model - (Object | Model | Array) An object, a model instance, or an array mix of both to be proofed.\n\n#### Returns: (Boolean) True if all properties in the models proof, false otherwise.\n\n### proof\n---\nMethod that proofs the models in the collection instance.\n\nsee [Mixin: Snitch](#mixin-snitch)\n\n#### Syntax:\n```javascript\ncollection.proof();\n```\n\n#### Returns: (Boolean)\n\n#### Note: This overrides the original `proof` method, but makes use of it to \"proof\" the collections models.\n### addEvent\n---\nsee [Mixin: Events](#mixin-events)\n### addEvents\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvent\n---\nsee [Mixin: Events](#mixin-events)\n### removeEvents\n---\nsee [Mixin: Events](#mixin-events)\n### fireEvent\n---\nsee [Mixin: Events](#mixin-events)\n### setOptions\n---\nsee [Mixin: Options](#mixin-options)\n### connect\n---\nsee [Mixin: Connector](#mixin-connector)\n### disconnect\n---\nsee [Mixin: Connector](#mixin-connector)\n### isSilent\n---\nsee [Mixin: Silent](#mixin-silent)\n### silence\n---\nsee [Mixin: Silent](#mixin-silent)\n\n### MooTools-Core Array Methods\n---\nThe following methods have been implemented from MooTools-Core Array onto Neuro Collection. They take the same arguments as their Object counterparts with the exception of having to pass the collection as the object to be acted upon.\n\n* `forEach`\n* `each`\n* `invoke`\n* `every`\n* `filter`\n* `clean`\n* `indexOf`\n* `map`\n* `some`\n* `associate`\n* `link`\n* `contains`\n* `getLast`\n* `getRandom`\n* `flatten`\n* `pick`\n\n```javascript\ncollection.forEach(function[, bind]);\ncollection.each(function[, bind]);\ncollection.invoke(method[, arg, arg, arg ...]);\ncollection.every(function[, bind]);\ncollection.filter(function[, bind]);\ncollection.clean();\ncollection.indexOf(item[, from]);\ncollection.map(function[, bind]);\ncollection.some(function[, bind]);\ncollection.associate(object);\ncollection.link(object);\ncollection.contains(item[, from]);\ncollection.getLast();\ncollection.getRandom();\ncollection.flatten();\ncollection.pick();\n```\n\n## Neuro View\nThe __View__ is a MooTools Class object. It acts as a layer between an element and everything else. One of the usual conventions of plugins that deals with elements has to attach/detach events to/from the element. The __View__ provides a simple, yet basic, way of binding methods/functions to the element event listeners.\n\nAnother convention is that attaching event handlers to classes can be a manual process. __View__ implements the [Connector](#mixin-connector) utility class to provide a powerful and automatic way to attach events between two classes.\n\nThe `render` method is the main method that should be used to visualize the element with data. The method is basic, triggering the `render` event on the __View__ class. Other class objects should extend from the __View__ class and override the `render` method, but call `this.parent` in order to trigger the `render` event.\n\n#### Implements:\n* [Mixin: Connector](#mixin-connector)\n* [Mixin: Events](#mixin-events)\n* [Mixin: Options](#mixin-options)\n* [Mixin: Silence](#mixin-silence)\n\n### constructor (initialize)\n---\nStarts out with executing `setup` and then triggering `ready` event.\n\n#### Syntax:\n```javascript\nvar view = new Neuro.View(options);\n```\n\n#### Arguments:\n1. `options` - (Object, optional) The View options\n    * element - (String | Element, defaults to `undefined`) The root/parent element of where the rendered elements should be placed.\n    * events - (Object, defaults to `undefined`) An `Object` of key/value pairs\n        * `key` - (String) The element event or event-delegate type. `click` or `click:relay(selector)`\n        * `value` - (String | Function | Array) The handler that is attached to the event. It can be a `String` (amethod name in the view class instance), `Function`, or an `Array` of containing a mix of `String` or `Function` items.\n    * connector - (Object) See [Mixin: Connector](#mixin-connector)\n\n#### Returns: View instance..\n\n#### Events:\n* `ready: function(view){}` - Triggered  at the end of the `setup` method.\n* `render: function(view){}` - Triggered at the end of the `render` method.\n* `inject: function(view){}` - Triggered at the end of the `inject` method.\n* `dispose: function(view){}` - Triggered at the end of the `dispose` method.\n* `destroy: function(view){}` - Triggered at the end of the `destroy` method.\n\n#### Notes:\n* Method names and properties prefixed with `_` is considered private and should not be used or directly interacted with.\n\n### setup\n---\nCalled during `initialize` to `setOptions`, and `setElement`.\n\n#### Arguments:\n* Same as `initialize`\n\n#### Returns: View instance.\n\n### toElement\n---\nA method to retrieve the element stored in the view instance. Any Class instance, with a `toElement` method, passed to MooTools Element `document.id` or `$` method will return the value from the classes `toElement` method. This is a hidden MooTools Core trick.\n\n#### Syntax:\n```javascript\nview.toElement();\n\ndocument.id(view);\n\n$(view);\n```\n\n#### Returns: `element` property stored in view instance.\n\n### setElement\n---\nStore the root element for the view instance. If an element exists, it will first execute View `destroy` method to properly detach events and remove references to it. Then it will store a reference to the element and execute View `attachEvents`.\n\n#### Syntax:\n```javascript\nview.setElement(element);\n```\n\n#### Arguments:\n1. element - (Element) Element to be set as root element in the view instance. `attachEvents` will refer to `options.events` for the event and method/function to attach.\n\n#### Returns: View instance.\n\n### attachEvents\n---\nAttach events to the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be detached using `detachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.attachEvents();\n```\n\n#### Returns: View instance.\n\n### detachEvents\n---\nDetach events from the root `element` property in the view instance. It refers to `options.events` to map element events to functions or methods in the view instance. Events can be attached using `attachEvents`. `element` or `options.events` are required to exist.\n\n#### Syntax:\n```javascript\nview.detachEvents();\n```\n\n#### Returns: View instance.\n\n### create\n---\nIt is a no-op method. Override `create` in your Class that extends from __View__. It could be used to create the root `element`, or other child elements that goes into the root `element.\n\n#### Syntax:\n```javascript\nview.create();\n```\n\n#### Returns: View instance.\n\n### render\n---\nAlthough `render` is considered a no-op method, it still trggers the `render` event. Override `render` in your Class that extends from __View__.  __Remember__ to call 'this.parent()' at the end of your code to execute the original `render` method that will trigger the `render` event. Pass `data` to the `render` method, such as Neuro Model or Neuro Collection.\n\nIf you are passing any Class that implements [Mixin: Connector](#mixin-connector), you should consider using the `connect` method. It will help to automatically attach events between the View instance and the other Classes, in this case it is likely to be a Neuro Model or Neuro Collection instances.\n\n#### Syntax:\n```javascript\nview.render(data);\n```\n\n#### Arguments:\n1. data - (Mixed) It can be anything you will use as data to render the view. This also means you can pass in multiple Neuro Model instances, multiple Neuro Collection instances, other View instances. Use your imagination.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `render`\n\n### inject\n---\nInject or inserts the root `element` relative to another element or View instance. `document.id` / `$` will resolve the element from the other View instance.\n\n#### Syntax:\n```javascript\nview.inject(reference[, where]);\n```\n\n#### Arguments:\n1. reference - (String | Element | Class) The `element` will be placed relative to the reference element. A `String` should be the id of the reference element, without the \"#\". A `Class` instance should have a `toElement` method in order to resolve the reference element.\n2. where - (String, optional, defaults to \"bottom\") The place to inject/insert the `element` relative to the reference element. Can be: `top`, `bottom`, `after`, or `before`.\n\n#### Returns: View instance.\n\n#### Triggered Events:\n* `inject`\n\n### dispose\n---\nRemoves the Element from the DOM but retains it in memory if the `element` exists.\n\n#### Syntax:\n```javascript\nview.dispose();\n```\n\n#### Returns: View instance.\n\n#### Triggered Events\n* `dispose`\n\n### destroy\n---\nRemoves the Element and its children from the DOM and prepares them for garbage collection. Executes `detatchEvents` and removes reference to element in `element` property. Triggers `destroy` event.\n\n#### Syntax:\n```javascript\nview.destroy();\n```\n\n#### Returns: View instance.\n\n## Mixin: Events\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. `Events` in a Class that implements `Events` must be either added as an option or with `addEvent`, not directly through .`options.onEventName`.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({ Implements: Events });\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Events);\n```\n\n#### Implementing:\n\n* This class can be implemented into other classes to add its functionality to them.\n* `Events` has been designed to work well with the `Options` class. When the option property begins with 'on' and is followed by a capital letter it will be added as an event (e.g. `onComplete` will add as `complete` event).\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(element){\n        // ...\n    },\n    complete: function(){\n        this.fireEvent('complete');\n    }\n});\n\nvar myWidget = new Widget();\nmyWidget.addEvent('complete', myFunction);\n```\n\n#### Notes:\n* Events starting with 'on' are still supported in all methods and are converted to their representation without 'on' (e.g. 'onComplete' becomes 'complete').\n\n### addEvent\n---\nAdds an event to the Class instance's event stack.\n\n#### Syntax:\n```javascript\nmyClass.addEvent(type, fn[, internal]);\n```\n\n#### Arguments:\n1. type     - (String) The type of event (e.g. `complete`).\n2. fn       - (Function) The function to execute.\n3. internal - (Boolean, optional) Sets the function property: internal to true. Internal property is used to prevent removal.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvent('start', myStartFunction);\n```\n\n### addEvents\n---\nThe same as `addEvent`, but accepts an object to add multiple events at once.\n\n#### Syntax:\n```javascript\nmyClass.addEvents(events);\n```\n\n#### Arguments:\n1. events - (Object) An object with key/value representing: key the event name (e.g. `start`), and value the function that is called when the Event occurs.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('element', 'opacity');\nmyFx.addEvents({\n    start: myStartFunction,\n    complete: function() {\n        alert('Done.');\n    }\n});\n```\n\n### fireEvent\n---\nFires all events of the specified type in the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.fireEvent(type[, args[, delay]]);\n```\n\n#### Arguments:\n1. type  - (String) The type of event (e.g. `complete`).\n2. args  - (String | Array, optional) The argument(s) to pass to the function. To pass more than one argument, the arguments must be in an array.\n3. delay - (Number, optional) Delay in milliseconds to wait before executing the event (defaults to 0).\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Events,\n    initialize: function(arg1, arg2){\n        //...\n        this.fireEvent('initialize', [arg1, arg2], 50);\n    }\n});\n```\n\n### removeEvent\n---\nRemoves an event from the stack of events of the Class instance.\n\n#### Syntax:\n```javascript\nmyClass.removeEvent(type, fn);\n```\n#### Arguments:\n1. type - (String) The type of event (e.g. `complete`).\n2. fn   - (Function) The function to remove.\n\n#### Returns: This Class instance.\n\n#### Notes:\n* If the function has the property internal and is set to true, then the event will not be removed.\n\n\n### removeEvents\n---\nRemoves all events of the given type from the stack of events of a Class instance. If no type is specified, removes all events of all types.\n\n#### Syntax:\n```javascript\nmyClass.removeEvents([events]);\n```\n\n#### Arguments:\n1. events - (optional) If not passed removes all events of all types.\n    - (String) The event name (e.g. 'success'). Removes all events of that type.\n    - (Object) An object of type function pairs. Like the one passed to `addEvents`.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar myFx = new Fx.Tween('myElement', 'opacity');\nmyFx.removeEvents('complete');\n```\n\n#### Notes:\n* removeEvents will not remove internal events. See `Events:removeEvent`.\n\n## Mixin: Options\n---\n__From MooTools Documentation:__\nA Utility Class. Its methods can be implemented with `Class:implement` into any Class. Used to automate the setting of a Class instance's options. Will also add Class `Events` when the option property begins with 'on' and is followed by a capital letter (e.g. `onComplete` adds a `complete` event). You will need to call `this.setOptions()` for this to have an effect, however.\n\n#### Syntax:\n\n__For new classes:__\n```javascript\nvar MyClass = new Class({Implements: Options});\n```\n\n__For existing classes:__\n```javascript\nMyClass.implement(Options);\n```\n\n### setOptions\n---\nMerges the default options of the Class with the options passed in. Every value passed in to this method will be deep copied. Therefore other class instances or objects that are not intended for copying must be passed to a class in other ways.\n\n#### Syntax:\n```javascript\nmyClass.setOptions([options]);\n```\n\n#### Arguments:\n1. options - (Object, optional) The user defined options to merge with the defaults.\n\n#### Returns: This Class instance.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: Options,\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    }\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    }\n});\n\n//myWidget.options is now: {color: #f00, size: {width: 200, height: 100}}\n\n// Deep copy example\nvar mySize = {\n    width: 50,\n    height: 50\n};\n\nvar myWidget = new Widget({\n    size: mySize\n});\n\n(mySize == myWidget.options.size) // false! mySize was copied in the setOptions call.\n```\n\n#### Notes:\n* Relies on the default options of a Class defined in its options property.\n\n#### Options in combination with Events\nIf a Class has `Events` as well as `Options` implemented, every option beginning with 'on' and followed by a capital letter (e.g. `onComplete`) becomes a Class instance event, assuming the value of the option is a function.\n\n#### Example:\n```javascript\nvar Widget = new Class({\n    Implements: [Options, Events],\n    options: {\n        color: '#fff',\n        size: {\n            width: 100,\n            height: 100\n        }\n    },\n    initialize: function(options){\n        this.setOptions(options);\n    },\n    show: function(){\n        // Do some cool stuff\n\n        this.fireEvent('show');\n    }\n\n});\n\nvar myWidget = new Widget({\n    color: '#f00',\n    size: {\n        width: 200\n    },\n    onShow: function(){\n        alert('Lets show it!');\n    }\n});\n\nmyWidget.show(); // fires the event and alerts 'Lets show it!'\n```\n\n## Mixin: Connector\n---\nA Utility Class. It allows automatic attachment/detachment of event listeners between two classes.\n\n### options.connector\n---\nA key/value object to map events to functions or method names on the target class that will be connected with. The value can also be an object that contains more key/value pairs. This allows to attach sub-events, such as `change:key`. __Note:__ An asterisk (*) as the sub-event refers to the parent event only.\n\n__Note:__ Using a nested object in `options.connector` as the map is possible via a `name` param when using `connect` or `disconnect`. Doing so means that connecting/disconnecting the class will __ALWAYS__ have to designate the `name` param. If you don't, then issues will occur because then Connector will treat nested objects key/value pairs as sub-events.\n\n#### Implements: [PowerTools! Class.Binds](https://github.com/cpojer/mootools-class-extras/blob/master/Source/Class.Binds.js)\n\n#### Syntax: key/value pairs\n```javascript\n// Shallow object\n{\n    event: method\n}\n\n// Nested object\n{\n    name: object\n}\n```\n\n#### Arguments\n* Shallow object\n    1. event - (String) The name of the event to be attached. It becomes the parent event if the events corresponding value is an object.\n    2. method - (String, Function, Array, Object)\n        * String - Refers to a method on the target class. The method will be bound to the target class and attached as the event handler.\n        * Function - The function will be bound to the current class and attached as the event handler\n        * Array - Can contain a mix of `String` (name of method to retrieve said method from target class) or `Function` to be attached as the event handler\n        * Object - Contains key/value pairs where `key` will refer to the sub-event and value refers to `String`, `Function`, or `Array` to attach as event handlers. The sub-event will be prepended by the `event` with a `:`.\n* Nested Object\n    1. name - (String) Name of the object that would be used as the map during connect/disconnect\n    2. object - (Object) The shallow object that is used as the map during connect/disconnect\n\n#### Examples\nThe following will show what key/value pairs will look like and what they look like when attached manually instead of with connector.\n\n* `value` is a string\n\n```javascript\nchange: 'doneMethodName'\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n```\n\n* `value` is a function\n\n```javascript\nchange: function(){/*... code here ...*/}\n```\n\n```javascript\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an array\n\n```javascript\nchange: ['doneMethodName', function(){/*... code here ...*/}]\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('change', function(){/*... code here ...*/});\n```\n\n* `value` is an object with subevents and a mix of string, function, or array.\n\n```javascript\nchange: {\n    '*': 'doneMethodName',\n    'name': function(){/*... code here ...*/},\n    'age': ['otherDoneMethodName', function(){/*... other code here ...*/}]\n}\n```\n\n```javascript\ncurrentClass.addEvent('change', targetClass.doneMethodName.bind(this));\n\ncurrentClass.addEvent('name', function(){/*... code here ...*/});\n\ncurrentClass.addEvent('age', targetClass.otherDoneMethodName.bind(targetClass));\n\ncurrentClass.addEvent('age', function(){/*... other code here ...*/});\n```\n\n### connect\n---\nConnects two classes by using `options.connector` as the map to either attach event listeners to functions on `options.connector` or methods on the target class where the method names are retrieved from `options.connector`. Default behavior is to connect one class. Connect both ways by passing a second argument as `true`.\n\nA name of a specific object in `options.connector` can be passed as the second argument and that object will be used as the map. If connecting both ways, the same `name` will be used. Connect both ways by passing a third argument as `true`.\n\n#### Syntax\n```javascript\ncurrentClass.connect(targetClass[, twoWay]);\n\ncurrentClass.connect(targetClass[, name[, twoWay]]);\n```\n\n#### Arguments\n1. class - (Class) The class containing the methods that will be attached as event handlers to event listeners on the current class.\n2. name - (String, optional) Name of a specific object in `options.connector` to be used as the map.\n2. oneWay - (Boolean, optional, `false` by default) Set to true will only connect `this` class with the target class and will not have the target class connect with `this` class.\n\n#### Returns: Class instance.\n\n#### Examples:\n```javascript\n// Using options.connector object by default\ncurrentClass.options.connector = {\n    'add': 'doAddStuff'\n};\n\ntargetClass.options.connector = {\n    'remove': 'doRemoveStuff'\n};\n\n/**\n * Bind one way.\n *\n * Basically does currentClass.addEvent('add', targetClass.doAddStuf.bind(targetClass));\n */\ncurrentClass.connect(targetClass);\n\n/**\n * Bind both ways.\n * Basically does:\n * \n * currentClass.addEvent('add', targetClass.doAddStuf.bind(targetClass))\n * and\n *\n * targetClass.addEvent('remove', currentClass.doRemoveStuff.bind(currentClass));\n */\ncurrentclass.connect(targetClass, true);\n\n// Using specific object that is nested in options.connector\ncurrentClass.options.connector = {\n    'classSpecific': {\n        'add': 'doAddStuff'\n    }\n};\n\ntargetClass.options.connector = {\n    'classSpecific': {\n        'remove': 'doRemoveStuff'\n    }\n};\n\n/**\n * Bind one way.\n *\n * Basically does currentClass.addEvent('add', targetClass.doAddStuf.bind(targetClass));\n */\ncurrentClass.connect(targetClass, 'classSpecific');\n\n/**\n * Bind both ways.\n * Basically does:\n * \n * currentClass.addEvent('add', targetClass.doAddStuf.bind(targetClass))\n * and\n *\n * targetClass.addEvent('remove', currentClass.doRemoveStuff.bind(currentClass));\n */\ncurrentclass.connect(targetClass, 'classSpecific', true);\n\n```\n\n### disconnect\n---\nDoes the opposite of what `connect` does. Takes the same arguments.\n\n### bound\n---\nA method provided by [PowerTools! Class.Binds](https://github.com/cpojer/mootools-class-extras/blob/master/Source/Class.Binds.js).\n\n> Provides an alternative way to bind class methods. Stores references to bound methods internally without any manual setup and does not modify the original methods.\n\nThe retrieved function is bound to the class instance.\n\n#### Syntax:\n```javascript\ncurrentClass.bound(methodName);\n```\n\n#### Arguments:\n1. methodName - (String) Name of the method that has been bound to the class instance and stored.\n\n#### Examples: (Slightly modified from [PowerTools! Class.Binds](https://github.com/cpojer/mootools-class-extras/))\n```javascript\n\nvar currentClass = new Class({\n    Implements: Connector,\n\n    initialize: function(element){\n        this.element = document.id(element);\n\n        this.attach();\n    },\n\n    attach: function(){\n        // Add the click method as event listener\n        this.element.addEvent('click', this.bound('click'));\n    },\n\n    detach: function(){\n        // Retrieves the same reference to the click method and removes the listener\n        this.element.removeEvent('click', this.bound('click'));\n    },\n\n    click: function(event){\n        event.preventDefault();\n\n        // doSomething\n        this.refersToTheClassInstance();\n    }\n});\n\n```\n\n\n## Mixin: Butler\n---\nA Utility Class. It provides a way to define custom setters/getters on a Class.\n\n### options.accessors\n---\nA key/value object where the key is the name of the setter and value is an object containing overriding set/get methods.\n\n#### Syntax: key/value pairs\n```javascript\nname: {\n    set: function,\n    get: function\n}\n```\n\n#### Arguments\n1. name - (String) Name of the set/get method that will get overriden\n2. object - (Object) Contains set, get method overrides.\n    * set - (Function) The overriding set function. The function will be bound to the current class.\n    * get - (Function) The overriding get function. The function will be bound to the current class. \n\n### setupAccessors\n---\nExisting accessors in `_accessors` are merged with `options.accessors` before being sent to `setAccessor`. This should be called in the `initailize` or `setup` method.\n\n#### Syntax:\n```javascript\ncurrentClass.setupAccessors();\n```\n\n#### Returns: Class instance.\n\n### isAccessing\n---\nCheck whether an accessor is being used by checking if `_accessorName` has been defined. This will allow a class to bypass recursive calls to the same custom setter/getter.\n\n#### Syntax:\n```javascript\ncurrentClass.isAccessing();\n```\n\n#### Returns: Boolean\n\n### setAccessor\n---\nA method to decorate custom setters/getters that will allow the use of `isAccessing` to prevent recursive calls to the same custom setter/getter. The decorated custom setters/getters is an object of name/function pairs that is stored in `_accessors` by name.\n\n#### Syntax:\n```javascript\ncurrentClass.setAccessor(name, obj);\n\ncurrentClass.setAccessor(obj);\n```\n\n#### Arguments:\n* Two Arguments\n    1. name - (String) Name of the accessor setter/getter object.\n    2. obj - (Object) Key/value pairs where the `key` is `set` or `get` and `value` is the function. Any key/value pair is optional. A `set` can exists without a `get`, and a `get` can exist without a `set`.\n\n#### Returns: Class instance.\n\n#### Note: The original undecorated function is stored on the decorated function in the `_orig` attribute.\n\n#### Example:\n```javascript\nvar klass = new Class({\n    Implements: CustomAccessor,\n\n    options: {\n        accessors: {\n            fullName: {\n                set: function(){}\n            }\n        }\n    }\n});\n\nvar currentClass = new klass();\n\n// manually executed because klass doesn't have an initialize or setup method to execute setupAccessors.\ncurrentClass.setupAccessors();\n\nvar fullNameAccessor = currentClass.getAccessor('fullName');\n\nfullNameAccessor.set; // returns the decorated set function.\n\nfullNameAccessor.set._orig // is the undecorated original set function.\n```\n\n### getAccessor\n---\nA method to retrieve stored accessors by name or by name and type.\n\n#### Syntax:\n```javascript\ncurrentClass.getAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to return.\n2. type - (String, optional) The name of the method that exists in the accessor object.\n\n#### Returns:\n1. Object - The object of decoerated key/value pairs containing the accessors that was stored with the name.\n2. Function - The decorated function that is associated with the `type` in the accessor object. The accessor object is retrieved with the `name`.\n\n#### Examples:\n\n__Return an accessor object__\n\n```javascript\ncurrentClass.setAccessor('fullName', {\n    set: function(){}\n});\n\nvar fullNameAccessors =  currentClass.getAccessor('fullName');\n/*\nfullNameAccessors returns and object where the set function is the decorated function\n{\n    set: function(){}\n}\n */\n```\n\n__Return the decorated function in the accessor object__\n\n```javascript\n// Returns the decorated function that is stored with the set key, in the fullName accessor object.\nvar fullNameSetAccessor = currentClass.getAccessor('fullName', 'set');\n```\n\n### unsetAccessor\n---\nRemove an accessor object or decorated function from the accessor object.\n\n#### Syntax:\n```javascript\ncurrentClass.unsetAccessor(name[, type]);\n```\n\n#### Arguments:\n1. name - (String) The name of the accessor object to remove.\n2. type - (String, optional) The `key` of the function that should be removed from the accessor object.\n\n#### Returns: Class instance.\n\n#### Example\n\n__Remove an accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName');\n```\n\n__Remove a function from the accessor object__\n\n```javascript\ncurrentClass.unsetAccessor('fullName', 'set');\n```\n\n## Mixin: Silent\nA Utility Class. It provides a solution to disable before a function executes, and re-enabling afterwards.\n\n### isSilent\n---\nChecks if the Class is currently silent.\n\n#### Syntax:\n```javascript\ncurrentClass.isSilent();\n```\n\n#### Returns: Boolean\n\n### silence\n---\nAny method that can trigger an event can be temporarily disabled by passing the function through silence. Once the function has been triggered, events will be re-enabled.\n\n#### Syntax:\n```javascript\ncurrentClass.silence(function);\n```\n\n#### Arguments:\n1. function - (Function) The function that will be executed once events have been prevented. The function is bound to the model instance before execution.\n\n#### Returns: Class instance.\n\n## Mixin: Snitch\n---\nA Utility Class. Use this class to set/get validator functions. A `validate` method offers a way to easily retrieve a validator to test a value. A `proof` method is a simple object spec test that tests an object for existence of keys and runs validation tests on the values of those keys.\n\n### options.validators\n---\nA key/value object where the key is the property name and value is a function. The function will be passed an argument to test against and should return a boolean.\n\n### Syntax: key/value pairs\n```javascript\n{\n    name: function,\n    name: function\n}\n```\n\n#### Arguments\n1. name - (String) Name of the validator function\n2. function - (Function) The function will be passed an argument to test against and should return a `Boolean`\n\n### setupValidators\n---\nExisting validators in `_validators` are merged with `options.validators` to be attached by `setValidator`. This should be called in the `initailize` or `setup` method.\n\n#### Syntax:\n```javascript\ncurrentClass.setupValidators();\n```\n\n#### Returns: Class instance.\n\n### setValidator\n---\nSet functions by property. The function will be decorated to be bound to the class instance. \n\n#### Syntax:\n```javascript\ncurrentClass.setValidator(name, function)\n\ncurrentClass.setValidator(obj);\n```\n\n#### Arguments:\n* Two Arugments:\n    1. name - (String) Name of the validator.\n    2. function - (Function) The validation function to test against a passed parameter.\n* One Argument:\n    1. obj - (Object) Name/function object.\n\n#### Returns: Class instance.\n\n#### Note: The original undecorated function is stored on the decorated function in the `_orig` attribute.\n\n#### Example:\n```javascript\nvar klass = new Class({\n    Implements: Snitch,\n\n    options: {\n        validators: {\n            fullName: Type.isString // Type.isString is a method in MooTools-Core that tests arguments whether they are strings or not by returning a boolean\n        }\n    }\n});\n\nvar currentClass = new klass();\n\n// manually executed because klass doesn't have an initialize or setup method to execute setupValidators.\ncurrentClass.setupValidators();\n\n// returns the validation function\nvar fullNameValidator = currentClass.getValidator('fullName');\n\n// the undecorated original function\nfullNameValidator._orig;\n```\n\n### getValidator\n---\nRetrieve a stored validation function by property name.\n\n#### Syntax:\n```javascript\ncurrentClass.getValidator(name[, name]);\n```\n\n#### Arguments\n1. name - (String) The name of the validator to return. Consecutive names will return an object of name/function matches.\n\n#### Returns:\n* More than One Consecutive Argument\n    * (Object) Name/function pairs containing matches validator functions and their corresponding names. An unexisting validator will return `undefined` in place of the function.\n* One argument\n    * (Function) Validation function corresponding to the name.\n\n#### Example:\n```javascript\ncurrentClass.getValidator('fullName'); // returns function or undefined\n\ncurrentClass.getValidator('age', 'fullName'); // returns an object containing age and fullName properties\n```\n\n### validate\n---\nConvenient method to retrieve a validator by property to test the value against. By default it always returns true. If a validator exists, it returns the results of validation.\n\n#### Syntax:\n```javascript\ncurrentClass.validate(property, value);\n```\n\n#### Arguments:\n1. property - (String) Name of the validator to retrieve.\n2. value - (Mixed) Value to validate by the retrieved validator.\n\n#### Returns:\n* (Boolean) Value of whether validation has passed or not.\n\n### proof\n---\n\"Proof\" an object where every item that exists in `_validators` exists in the object and every validation function returns a `true` value. This causes `_validators` to act like a spec. By default, `proof` returns true in case there are no defined validators. It is a convenient method that utilizes `Snitch Function: proof`;\n\n#### Syntax:\n```javascript\ncurrentClass.proof(obj);\n```\n\n#### Arguments:\n1. obj - (Object) The object that will be tested against every validator in `_validators`. Every property in `_validators` just exist in obj and every function must pass in order for proof to return true.\n\n#### Returns:\n* (Boolean) Value of whether the object has passed validation and item existence.\n\n### Snitch Function: proof\n---\nGeneric method to proof an object with validators.\n\n#### Syntax:\n```javascript\nSnitch.proof(obj, validators);\n```\n\n#### Arguments:\n1. obj - (Object) Object of key/value pairs that will be compared against`validators`\n2. validators - (Object) Object of key/function pairs that will be used to compare against `obj` where each key has to exist in the `obj` and the `obj` property value passes the validator function.\n\n#### Returns:\n* (Boolean) Value of whether the object has passed validation and item existence.","_id":"Neuro@0.2.3","dist":{"shasum":"a79142f6eb186208561b7b8ad751722dc0fcc51f","tarball":"http://registry.npmjs.org/Neuro/-/Neuro-0.2.3.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}]}},"readme":"Neuro\n======================\n\nA MooTools client-side MVC.\n\n### Version: 0.1.0 (Alpha)\n\n### Influences:\n\n* [Backbone](documentcloud/backbone)\n* [Shipyard](seanmonstar/Shipyard)\n\n### Dependencies:\n\n* [MooTools-Core 1.x](mootools/mootools-core)\n* [Company](keeto/company)\n* [Is.js](gcheung55/is.js)\n\n### Focus:\n\n* uncoupled coding but allow for a coupled organization if necessary\n* provide base for applications\n\nUsage\n-----\n\n### Model\n\nSubclass Model with MooTools Class.\n\n```javascript\nvar HumanModel = new Class({\n    Extends: Neuro.Model\n    // Set the default data\n    _data: {\n        firstName: ''\n        ,lastName: ''\n        ,hp: 10\n        ,max: 100\n        ,lvl: 1\n        // You can set a function as a custom getter. \"this\" will be _data, not the model itself.\n        ,name: function(){\n            return this.firstName + ' ' + this.lastName;\n        }\n    }\n});\n```\nCreate a model instance\n\n```javascript\nvar bruceLee = new HumanModel({\n    firstName: 'Bruce'\n    ,lastName: 'Lee'\n    ,hp: 1000\n    ,lvl: 99\n});\n\nbruceLee.get('name'); // 'Bruce Lee'\nbruceLee.get('lvl'); // 99\nbruceLee.set('lvl', 100).get('lvl'); // 100\n```\n\n### Collection\n\nSubclass Collection with MooTools Class.\n\n```javascript\nvar Humans = new Class({\n    Extends: Neuro.Collection\n\n    ,Model: HumanModel\n});\n```\nAdd data to the collection\n\n```javascript\n// Add one dataset to the collection\nHumans.add({\n    firstName: 'Chuck'\n    ,lastName: 'Norris'\n    ,hp: 1000\n});\n\n// Add multiple datasets to the collection\nHumans.add({\n    firstName: 'Kareem Abdul'\n    ,lastName: 'Jabbar'\n    ,hp: 1000\n    ,lvl: 80\n}, {\n    firstName: 'Gary'\n    ,lastName: 'Elms'\n    ,hp: 800\n    ,lvl: 81\n});\n\n// Add a model instance\nHumans.add(bruceLee);\n```\nGet a model from the collection by index\n\n```javascript\nHumans.get(4); // bruceLee model\n```\nRemove a model from the collection\n```javascript\nvar garyElms = Humans.get(3); // Gary Elms model\nHumans.remove(garyElms);\n\n// Check if the removed model still exists in the collection\nHumans.hasModel(garyElms); // false\n```\n\nToDo\n----\n* Add a builder\n* Add a Router mechanism\n* Add a Sync mechanism","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"time":{"modified":"2012-08-14T17:21:55.122Z","created":"2012-06-18T18:17:48.025Z","0.1.0":"2012-06-18T18:17:49.111Z","0.1.1":"2012-06-21T07:24:32.075Z","0.1.2":"2012-06-22T09:21:24.638Z","0.1.3":"2012-06-28T20:16:52.445Z","0.1.4":"2012-06-28T20:36:21.806Z","0.1.5":"2012-06-29T00:30:34.310Z","0.1.6":"2012-06-30T02:28:03.912Z","0.1.7":"2012-07-05T20:51:54.749Z","0.1.8":"2012-07-18T23:23:26.016Z","0.1.9":"2012-07-23T16:57:00.894Z","0.2.0":"2012-07-30T18:01:41.847Z","0.2.1":"2012-08-06T18:48:19.082Z","0.2.2":"2012-08-08T06:04:42.498Z","0.2.3":"2012-08-14T17:21:55.122Z"},"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"repository":{"type":"git","url":"https://github.com/gcheung55/neuro.git"},"users":{"fgribreau":true},"_attachments":{"Neuro-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-VWkDiORccbpocBsiA5xiPw==","length":123457,"stub":true},"Neuro-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-rJodnYqArYWOiOqhogWo4w==","length":120920,"stub":true},"Neuro-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-fPIBFyYE/7NXOYJLgvNrWg==","length":115377,"stub":true},"Neuro-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-grWahR7Hj5DFR2ogpkt7cg==","length":120012,"stub":true},"Neuro-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-+a20HSRGDP2HRXKRxH1b4Q==","length":109667,"stub":true},"Neuro-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-J0+aNwtl79KZ7DJa9xwUDQ==","length":270017,"stub":true},"Neuro-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-8ZuiS6OOgpHkARuE2zk0MA==","length":267485,"stub":true},"Neuro-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-0tNee4Rbk80e/MZj7KvrsA==","length":265937,"stub":true},"Neuro-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-WpMw4iPiFzQ5R0nBKgQCeQ==","length":265927,"stub":true},"Neuro-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZzqIVKp3YjSgQYnaUMDdpQ==","length":265928,"stub":true},"Neuro-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zl1Q5xTibTYLFaukgNDmWg==","length":265617,"stub":true},"Neuro-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4XFig7uFqPY2gxCfIdnZ1A==","length":266237,"stub":true},"Neuro-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ofVVp9J0uFVUAwnKFD3j8w==","length":429962,"stub":true},"Neuro-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Xg2LSrYO79tE+44o5kU91w==","length":431341,"stub":true}}}},
{"id":"Neuro-Company","key":"Neuro-Company","value":{"rev":"24-98aec875b22dec0bcf704d62ed7de292"},"doc":{"_id":"Neuro-Company","_rev":"24-98aec875b22dec0bcf704d62ed7de292","name":"Neuro-Company","description":"An extension of Neuro to provide an observer component.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"name":"Neuro-Company","description":"An extension of Neuro to provide an observer component.","version":"0.0.1","main":"Source/main.js","dependencies":{"Neuro":"*","Company":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/gcheung55/neuro-company.git"},"_npmUser":{"name":"GarrickCheung","email":"garrick@garrickcheung.com"},"_id":"Neuro-Company@0.0.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4f86c84a0cbb74b15c1a156bac84d2fbd11beff5","tarball":"http://registry.npmjs.org/Neuro-Company/-/Neuro-Company-0.0.1.tgz"},"readme":"","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.0.2":{"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"name":"Neuro-Company","description":"An extension of Neuro to provide an observer component.","version":"0.0.2","main":"Source/main.js","dependencies":{"Neuro":"*","Company":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"https://github.com/gcheung55/neuro-company.git"},"_id":"Neuro-Company@0.0.2","dist":{"shasum":"365547b06a41daa760dfabe910df36ea450c7628","tarball":"http://registry.npmjs.org/Neuro-Company/-/Neuro-Company-0.0.2.tgz"},"readme":"","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.0.3":{"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"name":"Neuro-Company","description":"An extension of Neuro to provide an observer component.","version":"0.0.3","main":"src/main.js","dependencies":{"Neuro":"*","Company":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"https://github.com/gcheung55/neuro-company.git"},"_id":"Neuro-Company@0.0.3","dist":{"shasum":"583ed9704e6fe1f7639997366be2c7f9640e22d7","tarball":"http://registry.npmjs.org/Neuro-Company/-/Neuro-Company-0.0.3.tgz"},"readme":"","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.0.4":{"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"name":"Neuro-Company","description":"An extension of Neuro to provide an observer component.","version":"0.0.4","main":"src/main.js","dependencies":{"Neuro":"*","Company":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"https://github.com/gcheung55/neuro-company.git"},"_id":"Neuro-Company@0.0.4","dist":{"shasum":"09dadcbe0f7898cb7e98d9b4a68b9f0e609f68db","tarball":"http://registry.npmjs.org/Neuro-Company/-/Neuro-Company-0.0.4.tgz"},"readme":"","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"directories":{}},"0.0.5":{"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"name":"Neuro-Company","description":"An extension of Neuro to provide an observer component.","version":"0.0.5","main":"src/main.js","dependencies":{"Neuro":"*","Company":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"repository":{"type":"git","url":"https://github.com/gcheung55/neuro-company.git"},"_id":"Neuro-Company@0.0.5","readme":"","dist":{"shasum":"094e8e0d01aff09b1dbbda7aa68352756140f934","tarball":"http://registry.npmjs.org/Neuro-Company/-/Neuro-Company-0.0.5.tgz"},"maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}]}},"readme":"","maintainers":[{"name":"GarrickCheung","email":"garrick@garrickcheung.com"}],"time":{"modified":"2012-08-08T18:42:44.773Z","created":"2012-06-12T08:26:25.321Z","0.0.1":"2012-06-12T08:26:26.763Z","0.0.2":"2012-06-24T08:47:17.079Z","0.0.3":"2012-06-30T02:34:22.632Z","0.0.4":"2012-07-23T17:00:29.756Z","0.0.5":"2012-08-08T18:42:44.773Z"},"author":{"name":"Garrick Cheung","email":"garrick@garrickcheung.com"},"repository":{"type":"git","url":"https://github.com/gcheung55/neuro-company.git"},"users":{"fgribreau":true},"_attachments":{"Neuro-Company-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-lqgCjMIQGSxxYqMW5+y2Aw==","length":52249,"stub":true},"Neuro-Company-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-lqx3cDHwiVMUvLTs57jvzg==","length":51149,"stub":true},"Neuro-Company-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IAMWUqOYAtjdNzn5PSJhLg==","length":49339,"stub":true},"Neuro-Company-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-iT3AvFhfPan7XrTkGeAOlw==","length":49231,"stub":true},"Neuro-Company-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AY0yCYmBN/YgnoucniITzA==","length":43605,"stub":true}}}},
{"id":"NexmoJS","key":"NexmoJS","value":{"rev":"3-850b981be808027b233a852c078e5c31"},"doc":{"_id":"NexmoJS","_rev":"3-850b981be808027b233a852c078e5c31","name":"NexmoJS","description":"A node implementation of Nexmo REST API written in Coffeescript.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"NexmoJS","version":"1.0.0","description":"A node implementation of Nexmo REST API written in Coffeescript.","homepage":"https://github.com/wilhelmbot/NexmoJS","keywords":["nexmo","sms","REST","API"],"maintainers":[{"name":"rodbot","email":"rwilhelmy@gmail.com"}],"repositories":[{"type":"git","url":"git://github.com/wilhelmbot/NexmoJS.git"}],"dependencies":{"coffee-script":">= 0.0.0"},"_npmUser":{"name":"rodbot","email":"rwilhelmy@gmail.com"},"_id":"NexmoJS@1.0.0","scripts":{"start":"node server.js"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"619ead07b9705bdcb4ef89941c359a6b951a9afd","tarball":"http://registry.npmjs.org/NexmoJS/-/NexmoJS-1.0.0.tgz"}}},"maintainers":[{"name":"rodbot","email":"rwilhelmy@gmail.com"}],"time":{"modified":"2011-11-21T02:14:37.562Z","created":"2011-11-21T01:36:36.920Z","1.0.0":"2011-11-21T02:14:37.562Z"},"_attachments":{"NexmoJS-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zWF0x+bY8d9AUD9sVPbdgQ==","length":10240,"stub":true}}}},
{"id":"NoCR","key":"NoCR","value":{"rev":"3-8f6cddd528f2d6045e3dda6006fb6948"},"doc":{"_id":"NoCR","_rev":"3-8f6cddd528f2d6045e3dda6006fb6948","name":"NoCR","description":"NoCR (like JCR) is content repository API, unlike JCR it's written in CoffeeScript+Node.js instead of Java, and also allows to implement a content repository in javascript or coffee. It helps you to write a good implementation as it provides a full featured test suite.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"NoCR","version":"0.0.1","description":"NoCR (like JCR) is content repository API, unlike JCR it's written in CoffeeScript+Node.js instead of Java, and also allows to implement a content repository in javascript or coffee. It helps you to write a good implementation as it provides a full featured test suite.","homepage":"https://github.com/NoCR/NoCR","keywords":["javascript","dms","documents","generator","website","cms"],"author":{"name":"Nicolas Karageuzian","email":"nka@nka.me","url":"http://nka.me"},"maintainers":[{"name":"Nicolas Karageuzian","email":"nka@nka.me","url":"http://nka.me"}],"contributors":[{"name":"Nicolas Karageuzian","email":"nka@nka.me","url":"http://nka.me"}],"bugs":{"url":"https://github.com/NoCR/NoCR/issues"},"licenses":[{"type":"LGPL","url":"http://www.gnu.org/licenses/lgpl.html"}],"repository":{"type":"git","url":"git://github.com/NoCR/NoCR.git"},"dependencies":{},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/NoCR.js","_id":"NoCR@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"dc8fec34267cc822752b4151e18a5b9fdd8ff2cf","tarball":"http://registry.npmjs.org/NoCR/-/NoCR-0.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"nka11","email":"nka@nka.me"}],"time":{"modified":"2011-07-11T08:47:32.997Z","created":"2011-07-11T08:47:32.564Z","0.0.1":"2011-07-11T08:47:32.998Z"},"author":{"name":"Nicolas Karageuzian","email":"nka@nka.me","url":"http://nka.me"},"repository":{"type":"git","url":"git://github.com/NoCR/NoCR.git"},"_attachments":{"NoCR-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UlvnRXl3oyWUw1MfiSX1Bw==","length":14280,"stub":true}}}},
{"id":"NoDevent","key":"NoDevent","value":{"rev":"9-b6a021a18ead3c367f30170cd98d166f"},"doc":{"_id":"NoDevent","_rev":"9-b6a021a18ead3c367f30170cd98d166f","name":"NoDevent","description":"Redis -> Browser pubsub appliance","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"name":"NoDevent","description":"Redis -> Browser pubsub appliance","version":"0.0.1","engines":{"node":">= 0.6.x < 0.7.0"},"main":"lib","repository":{"type":"git","url":"git://github.com/cconstantine/NoDevent.git"},"bugs":{"url":"https://github.com/cconstantine/NoDevent/issues"},"dependencies":{"redis":"=0.7.2","socket.io":"=0.9.6"},"_npmUser":{"name":"cconstantine","email":"cconstan@gmail.com"},"_id":"NoDevent@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a029386fec919f9b7dfcc74c36949bba26ca7873","tarball":"http://registry.npmjs.org/NoDevent/-/NoDevent-0.0.1.tgz"},"readme":"","maintainers":[{"name":"cconstantine","email":"cconstan@gmail.com"}]},"0.0.2":{"name":"NoDevent","description":"Redis -> Browser pubsub appliance","version":"0.0.2","engines":{"node":">= 0.6.x < 0.7.0"},"main":"lib","repository":{"type":"git","url":"git://github.com/cconstantine/NoDevent.git"},"bugs":{"url":"https://github.com/cconstantine/NoDevent/issues"},"dependencies":{"redis":"=0.7.2","socket.io":"=0.9.6"},"_npmUser":{"name":"cconstantine","email":"cconstan@gmail.com"},"_id":"NoDevent@0.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cc55454c9185102b24baa57d77e39113ad0511d8","tarball":"http://registry.npmjs.org/NoDevent/-/NoDevent-0.0.2.tgz"},"readme":"","maintainers":[{"name":"cconstantine","email":"cconstan@gmail.com"}]},"0.1.2":{"name":"NoDevent","description":"Redis -> Browser pubsub appliance","version":"0.1.2","engines":{"node":">= 0.6.x < 0.7.0"},"main":"lib","repository":{"type":"git","url":"git://github.com/cconstantine/NoDevent.git"},"bugs":{"url":"https://github.com/cconstantine/NoDevent/issues"},"dependencies":{"redis":"=0.7.2","socket.io":"=0.9.6"},"_npmUser":{"name":"cconstantine","email":"cconstan@gmail.com"},"_id":"NoDevent@0.1.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"099644b2dd5fa680afa437d2bcbaa822e809a4ae","tarball":"http://registry.npmjs.org/NoDevent/-/NoDevent-0.1.2.tgz"},"readme":"","maintainers":[{"name":"cconstantine","email":"cconstan@gmail.com"}]},"0.1.3":{"name":"NoDevent","description":"Redis -> Browser pubsub appliance","version":"0.1.3","engines":{"node":">= 0.6.x < 0.7.0"},"main":"lib","repository":{"type":"git","url":"git://github.com/cconstantine/NoDevent.git"},"bugs":{"url":"https://github.com/cconstantine/NoDevent/issues"},"dependencies":{"redis":"=0.7.2","socket.io":"=0.9.6"},"_npmUser":{"name":"cconstantine","email":"cconstan@gmail.com"},"_id":"NoDevent@0.1.3","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"fe385f2e0a1d8f2c22db4b42af217aebd7fc8cca","tarball":"http://registry.npmjs.org/NoDevent/-/NoDevent-0.1.3.tgz"},"readme":"","maintainers":[{"name":"cconstantine","email":"cconstan@gmail.com"}]}},"readme":"","maintainers":[{"name":"cconstantine","email":"cconstan@gmail.com"}],"time":{"modified":"2012-05-07T04:32:14.704Z","created":"2012-05-07T02:25:49.190Z","0.0.1":"2012-05-07T02:25:52.115Z","0.0.2":"2012-05-07T03:31:07.312Z","0.1.2":"2012-05-07T04:30:07.597Z","0.1.3":"2012-05-07T04:32:14.704Z"},"repository":{"type":"git","url":"git://github.com/cconstantine/NoDevent.git"},"_attachments":{"NoDevent-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Quw2+XMnoOTiNEtUb22b6g==","length":4962,"stub":true},"NoDevent-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-13WA6F1bb6NbNtO3gZmxfA==","length":4974,"stub":true},"NoDevent-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CsIogLvtGWnZlohkxl7Smg==","length":2289,"stub":true},"NoDevent-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L+N372FSQNeSM9/EkPL4xw==","length":1749,"stub":true}}}},
{"id":"NodObjC","key":"NodObjC","value":{"rev":"42-0ece7569c4cfdf4e44d36c92545f1e48"},"doc":{"_id":"NodObjC","_rev":"42-0ece7569c4cfdf4e44d36c92545f1e48","name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","dist-tags":{"latest":"0.0.12"},"versions":{"0.0.1":{"name":"NodObjC","description":"A high-level Objective-C interpreter for NodeJS","version":"0.0.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":"0.4.x || 0.5.x"},"dependencies":{"node-ffi":"0.2.x","sax":"0.1.x"},"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodObjC@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3c779f14f6f6dc37f63718c91b66cc68048324ca","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.2":{"name":"NodObjC","description":"The Objective-C ⇆ NodeJS bridge","version":"0.0.2","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":"0.4.x || 0.5.x"},"dependencies":{"node-ffi":"0.2.x","sax":"0.1.x"},"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodObjC@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"57ef466eda748de6f85c31b9eab5095f2690731c","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.3":{"name":"NodObjC","description":"The Objective-C ⇆ NodeJS bridge","version":"0.0.3","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":"0.4.x || 0.5.x"},"dependencies":{"node-ffi":"0.2.x","sax":"0.1.x"},"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodObjC@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"0cba92a1379d4d425ce56f189b5ed40fd03051f2","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.4":{"name":"NodObjC","description":"The Objective-C ⇆ NodeJS bridge","version":"0.0.4","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":">= 0.5.0 && < 0.7.0"},"dependencies":{"node-ffi":"0.2.x","sax":"0.1.x"},"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodObjC@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"4abcf764f0383af4792332fbb6fe6d4f851aaa92","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.5":{"name":"NodObjC","description":"The Objective-C ⇆ NodeJS bridge","keywords":["obj","objective","c","mac","apple","osx","cocoa","ffi","bridge"],"version":"0.0.5","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":">= 0.5.0 && < 0.7.0"},"dependencies":{"node-ffi":"0.2.x","sax":"0.1.x"},"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodObjC@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"b2b0b172f34682c27c2912a658221789d5209d10","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.6":{"name":"NodObjC","description":"The Objective-C ⇆ NodeJS bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.6","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":">= 0.5.0 && < 0.7.0"},"dependencies":{"node-ffi":"0.2.x","sax":"0.1.x"},"bundledDependencies":["node-ffi"],"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodObjC@0.0.6","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"03b1f8dfd4088f823e4a96005d352f2d4c568a31","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.7":{"name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.7","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":">= 0.4.0 && < 0.7.0"},"dependencies":{"node-ffi":"0.3.x","sax":"0.1.x"},"bundledDependencies":["node-ffi"],"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.7/package/package.json","serverjs":false,"contributors":false,"wscript":false},"_id":"NodObjC@0.0.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4db3a1fbfba47e95dc08a0933d7abdb8b59ec536","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.7.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.8":{"name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.8","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./index.js","engines":{"node":">= 0.4.0 && < 0.7.0"},"dependencies":{"node-ffi":"~0.4.1","sax":"0.2.x"},"_npmJsonOpts":{"file":"/Users/nrajlich/.npm/NodObjC/0.0.8/package/package.json","contributors":false,"serverjs":false,"wscript":false},"_id":"NodObjC@0.0.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dbabccb7b7a1a5052754d276ca5421b56598c9f0","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.8.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.9":{"name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.9","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./lib/index.js","engines":{"node":">= 0.4.0 && < 0.7.0"},"scripts":{"test":"make test"},"dependencies":{"debug":"*","node-ffi":"~0.4.1","sax":"0.3.x"},"devDependencies":{"dox":"0.1.x","jade":"0.19.x","highlight":"0.2.x"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"NodObjC@0.0.9","bundleDependencies":["highlight"],"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9d86656ece4eb51e1d5d6175020e64c876404f98","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.9.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}]},"0.0.10":{"name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.10","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./lib/index.js","engines":{"node":">= 0.4.0 && < 0.7.0"},"scripts":{"test":"make test"},"dependencies":{"debug":"*","node-ffi":"0.5.x","sax":"0.3.x"},"devDependencies":{"dox":"0.1.x","jade":"0.19.x"},"_npmUser":{"name":"tootallnate","email":"nathan@tootallnate.net"},"_id":"NodObjC@0.0.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"451d7d8605a2929224da07c5eb090d33ee615047","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.10.tgz"},"readme":"NodObjC\n=======\n### The [NodeJS][] ⇆ [Objective-C][ObjCWikipedia] bridge\n\n\n`NodObjC` exposes the Objective-C runtime to [NodeJS][] in a high-level, easy\nto use fashion. It uses the `BridgeSupport` files to dynamically generate an\nAPI from an Objective-C \"Framework\", and uses `node-ffi` to dynamically interact\nwith the Objective-C runtime.\n\nEssentially, `NodObjC` is similar in nature to the other popular Objetive-C\nscripting bridges:\n\n * [JSCocoa][]\n * [PyObjC][]\n * [RubyCocoa][]\n * [And the others…][others]\n\nSo you can write entire Cocoa or iOS GUI applications entirely in NodeJS\nJavaScript! Applications are interpreted at runtime through the V8 engine,\nrather than compiled to a machine exectuable. This has the advantage of being\nable to tweak code without having to recompile; excellent for rapid prototyping\nand development, or for those GUI applications where absolute speed is not a\nrequirement (i.e. _most_). So what are you waiting for? Get to coding!\n\n\nInstallation\n------------\n\nInstall using `npm`, of course!\n\n``` bash\n$ npm install NodObjC\n```\n\n\nHello World\n-----------\n\n``` javascript\nvar $ = require('NodObjC')\n\n// First you need to \"import\" the Framework\n$.import('Foundation')\n\n// Setup the recommended NSAutoreleasePool instance\nvar pool = $.NSAutoreleasePool('alloc')('init')\n\n// NSStrings and JavaScript Strings are distinct objects, you must create an\n// NSString from a JS String when an Objective-C class method requires one.\nvar string = $.NSString('stringWithUTF8String', 'Hello Objective-C World!')\n\n// Print out the contents (calling [string description])\nconsole.log(string)\n//   → Prints \"Hello Objective-C World!\"\n\npool('drain')\n```\n\n\nIntroduction\n------------\n\nThis module offers a bi-directional bridge between NodeJS and the Objective-C\nruntime. What does that mean exactly? Well due to the design of the Objective-C\nruntime, it is possible to _port_ the entire API to other languages. There are\nquite a few bridges for Obj-C so one for node was a necessity.\n\nSo with this module, you get access to _all_ of the Objective-C APIs, but you\ninvoke them through JavaScript. Obj-C has a concept of \"message passing\" to\ninvoke methods on objects. The way that you pass messages around is probably a\nlittle bit different than the kind of JavaScript you're used to:\n\n``` javascript\n// In JavaScript, you invoke a function on an object like:\nobj.func(arg)\n```\n\nCompared to:\n\n``` javascript\n// In NodObjC, you send a message to an object like:\nobj('func', arg)\n```\n\nIn Objective-C, the names of methods are part of the arguments that you pass\nalong:\n\n``` objective-c\n[array insertObject:obj atIndex:5];\n```\n\nThe equivalent of the above message invocation in NodObjC syntax would be:\n\n``` javascript\narray('insertObject', obj, 'atIndex', 5)\n```\n\nSo the even numbered arguments are the parts of the method name that will be\ninvoked, and the odd numbered arguments are the Obj-C arguments themselves. In\nthe above example, the `insertObject:atIndex:` function will be invoked.\n\nIn `NodObjC`, not only is the Objective-C runtime exposed, but so are the\ncorresponding C functions that usually go along with these APIs (thanks to\nBridgeSupport). So for example, we can make an `NSRect` by calling the\n`NSMakeRect()` C function:\n\n``` javascript\n$.NSMakeRect(5, 10, 8, 30)\n// -> NSRect struct\n```\n\nThere's literally thousands of other Objective-C resources and tutorials out\nthere.\n\nYou should definitely have Apple's official [Mac][MacDev] or [iOS][iOSDev] API\ndocs handy at all times.\n\nSupport / Getting Involved\n---------------------------\n\nIf you're looking for support for developing with/for `NodObjC` you might want\nto check out the [#nodobjc][IRC] channel in the freenode IRC server.\n\nAdditional topics of discussion can be found on the [Wiki][] page.\n\n\n[NodeJS]: http://nodejs.org\n[JSCocoa]: http://inexdo.com/JSCocoa\n[PyObjC]: http://pyobjc.sourceforge.net\n[RubyCocoa]: http://en.wikipedia.org/wiki/RubyCocoa\n[IRC]: http://webchat.freenode.net/?channels=nodobjc\n[Wiki]: https://github.com/TooTallNate/NodObjC/wiki\n[MacDev]: http://developer.apple.com/library/mac/navigation/\n[iOSDev]: http://developer.apple.com/library/ios/navigation/\n[ObjCWikipedia]: http://en.wikipedia.org/wiki/Objective-C\n[others]: http://www.cocoadev.com/index.pl?CocoaBridges\n","maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}]},"0.0.11":{"name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.11","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./lib/index.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{"test":"make test"},"dependencies":{"debug":"*","node-ffi":"~0.5.3","libxmljs":"0.5.x"},"devDependencies":{"dox":"0.1.x","jade":"0.19.x"},"_npmUser":{"name":"tootallnate","email":"nathan@tootallnate.net"},"_id":"NodObjC@0.0.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"dist":{"shasum":"1b3030bd5e5f7ddb2e012fefe16dad9be63f1c34","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.11.tgz"},"readme":"NodObjC\n=======\n### The [NodeJS][] ⇆ [Objective-C][ObjCWikipedia] bridge\n\n\n`NodObjC` exposes the Objective-C runtime to [NodeJS][] in a high-level, easy\nto use fashion. It uses the `BridgeSupport` files to dynamically generate an\nAPI from an Objective-C \"Framework\", and uses `node-ffi` to dynamically interact\nwith the Objective-C runtime.\n\nEssentially, `NodObjC` is similar in nature to the other popular Objetive-C\nscripting bridges:\n\n * [JSCocoa][]\n * [PyObjC][]\n * [RubyCocoa][]\n * [And the others…][others]\n\nSo you can write entire Cocoa or iOS GUI applications entirely in NodeJS\nJavaScript! Applications are interpreted at runtime through the V8 engine,\nrather than compiled to a machine exectuable. This has the advantage of being\nable to tweak code without having to recompile; excellent for rapid prototyping\nand development, or for those GUI applications where absolute speed is not a\nrequirement (i.e. _most_). So what are you waiting for? Get to coding!\n\n\nInstallation\n------------\n\nInstall using `npm`, of course!\n\n``` bash\n$ npm install NodObjC\n```\n\n\nHello World\n-----------\n\n``` javascript\nvar $ = require('NodObjC')\n\n// First you need to \"import\" the Framework\n$.import('Foundation')\n\n// Setup the recommended NSAutoreleasePool instance\nvar pool = $.NSAutoreleasePool('alloc')('init')\n\n// NSStrings and JavaScript Strings are distinct objects, you must create an\n// NSString from a JS String when an Objective-C class method requires one.\nvar string = $.NSString('stringWithUTF8String', 'Hello Objective-C World!')\n\n// Print out the contents (calling [string description])\nconsole.log(string)\n//   → Prints \"Hello Objective-C World!\"\n\npool('drain')\n```\n\n\nIntroduction\n------------\n\nThis module offers a bi-directional bridge between NodeJS and the Objective-C\nruntime. What does that mean exactly? Well due to the design of the Objective-C\nruntime, it is possible to _port_ the entire API to other languages. There are\nquite a few bridges for Obj-C so one for node was a necessity.\n\nSo with this module, you get access to _all_ of the Objective-C APIs, but you\ninvoke them through JavaScript. Obj-C has a concept of \"message passing\" to\ninvoke methods on objects. The way that you pass messages around is probably a\nlittle bit different than the kind of JavaScript you're used to:\n\n``` javascript\n// In JavaScript, you invoke a function on an object like:\nobj.func(arg)\n```\n\nCompared to:\n\n``` javascript\n// In NodObjC, you send a message to an object like:\nobj('func', arg)\n```\n\nIn Objective-C, the names of methods are part of the arguments that you pass\nalong:\n\n``` objective-c\n[array insertObject:obj atIndex:5];\n```\n\nThe equivalent of the above message invocation in NodObjC syntax would be:\n\n``` javascript\narray('insertObject', obj, 'atIndex', 5)\n```\n\nSo the even numbered arguments are the parts of the method name that will be\ninvoked, and the odd numbered arguments are the Obj-C arguments themselves. In\nthe above example, the `insertObject:atIndex:` function will be invoked.\n\nIn `NodObjC`, not only is the Objective-C runtime exposed, but so are the\ncorresponding C functions that usually go along with these APIs (thanks to\nBridgeSupport). So for example, we can make an `NSRect` by calling the\n`NSMakeRect()` C function:\n\n``` javascript\n$.NSMakeRect(5, 10, 8, 30)\n// -> NSRect struct\n```\n\nThere's literally thousands of other Objective-C resources and tutorials out\nthere.\n\nYou should definitely have Apple's official [Mac][MacDev] or [iOS][iOSDev] API\ndocs handy at all times.\n\nSupport / Getting Involved\n---------------------------\n\nIf you're looking for support for developing with/for `NodObjC` you might want\nto check out the [#nodobjc][IRC] channel in the freenode IRC server.\n\nAdditional topics of discussion can be found on the [Wiki][] page.\n\n\n[NodeJS]: http://nodejs.org\n[JSCocoa]: http://inexdo.com/JSCocoa\n[PyObjC]: http://pyobjc.sourceforge.net\n[RubyCocoa]: http://en.wikipedia.org/wiki/RubyCocoa\n[IRC]: http://webchat.freenode.net/?channels=nodobjc\n[Wiki]: https://github.com/TooTallNate/NodObjC/wiki\n[MacDev]: http://developer.apple.com/library/mac/navigation/\n[iOSDev]: http://developer.apple.com/library/ios/navigation/\n[ObjCWikipedia]: http://en.wikipedia.org/wiki/Objective-C\n[others]: http://www.cocoadev.com/index.pl?CocoaBridges\n","maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}]},"0.0.12":{"name":"NodObjC","description":"The NodeJS ⇆ Objective-C bridge","keywords":["obj","objective","c","mac","apple","ios","osx","cocoa","ffi","bridge"],"version":"0.0.12","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"main":"./lib/index.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{"test":"make test"},"dependencies":{"debug":"*","node-ffi":"~0.5.3","libxmljs":"0.5.x"},"devDependencies":{"dox":"0.3.x","highlight.js":"1","jade":"0.25.x","marked":"0.2.x"},"readme":"NodObjC\n=======\n### The [NodeJS][] ⇆ [Objective-C][ObjCWikipedia] bridge\n\n\n`NodObjC` exposes the Objective-C runtime to [NodeJS][] in a high-level, easy\nto use fashion. It uses the `BridgeSupport` files to dynamically generate an\nAPI from an Objective-C \"Framework\", and uses `node-ffi` to dynamically interact\nwith the Objective-C runtime.\n\nEssentially, `NodObjC` is similar in nature to the other popular Objetive-C\nscripting bridges:\n\n * [JSCocoa][]\n * [PyObjC][]\n * [MacRuby][]\n * [And the others…][others]\n\nSo you can write entire Cocoa or iOS GUI applications entirely in NodeJS\nJavaScript! Applications are interpreted at runtime through the V8 engine,\nrather than compiled to a machine exectuable. This has the advantage of being\nable to tweak code without having to recompile; excellent for rapid prototyping\nand development, or for those GUI applications where absolute speed is not a\nrequirement (i.e. _most_). So what are you waiting for? Get to coding!\n\n\nInstallation\n------------\n\nInstall using `npm`, of course!\n\n``` bash\n$ npm install NodObjC\n```\n\nOr add it to the `\"dependencies\"` section of your _package.json_ file.\n\n\nHello World\n-----------\n\n``` javascript\nvar $ = require('NodObjC')\n\n// First you import the \"Foundation\" framework\n$.framework('Foundation')\n\n// Setup the recommended NSAutoreleasePool instance\nvar pool = $.NSAutoreleasePool('alloc')('init')\n\n// NSStrings and JavaScript Strings are distinct objects, you must create an\n// NSString from a JS String when an Objective-C class method requires one.\nvar string = $.NSString('stringWithUTF8String', 'Hello Objective-C World!')\n\n// Print out the contents (toString() ends up calling [string description])\nconsole.log(string)\n//   → Prints \"Hello Objective-C World!\"\n\npool('drain')\n```\n\nBe sure to check out the [full API docs][docs].\n\n\nIntroduction\n------------\n\nThis module offers a bi-directional bridge between NodeJS and the Objective-C\nruntime. What does that mean exactly? Well due to the design of the Objective-C\nruntime, it is possible to _port_ the entire API to other languages. There are\nquite a few bridges for Obj-C so one for node was a necessity.\n\nSo with this module, you get access to _all_ of the Objective-C APIs, but you\ninvoke them through JavaScript. Obj-C has a concept of \"message passing\" to\ninvoke methods on objects. The way that you pass messages around is probably a\nlittle bit different than the kind of JavaScript you're used to:\n\n``` javascript\n// In JavaScript, you invoke a function on an object like:\nobj.func(arg)\n```\n\nCompared to:\n\n``` javascript\n// In NodObjC, you send a message to an object like:\nobj('func', arg)\n```\n\nIn Objective-C, the names of methods are part of the arguments that you pass\nalong:\n\n``` objective-c\n[array insertObject: obj\n       atIndex: 5]\n```\n\nThe equivalent of the above message invocation in NodObjC syntax would be:\n\n``` javascript\narray('insertObject', obj,\n      'atIndex', 5)\n```\n\nSo the even numbered arguments are the parts of the method name that will be\ninvoked, and the odd numbered arguments are the Obj-C arguments themselves. In\nthe above example, the `insertObject:atIndex:` function will be invoked.\n\nIn `NodObjC`, not only is the Objective-C runtime exposed, but so are the\ncorresponding C functions that usually go along with these APIs (thanks to\nBridgeSupport). So for example, we can make an `NSRect` by calling the\n`NSMakeRect()` C function:\n\n``` javascript\n$.NSMakeRect(5, 10, 8, 30)\n// -> NSRect struct\n```\n\nThere's a plethora of other Objective-C resources and tutorials out there.\n\nYou should definitely have Apple's official [Mac][MacDev] or [iOS][iOSDev] API\ndocs handy at all times.\n\nSupport / Getting Involved\n---------------------------\n\nIf you're looking for support for developing with/for `NodObjC` you might want\nto check out the [#nodobjc][IRC] channel in the freenode IRC server.\n\nAdditional topics of discussion can be found on the [Wiki][] page.\n\n\n[docs]: http://tootallnate.github.com/NodObjC/\n[NodeJS]: http://nodejs.org\n[JSCocoa]: http://inexdo.com/JSCocoa\n[PyObjC]: http://pyobjc.sourceforge.net\n[MacRuby]: http://macruby.org\n[IRC]: http://webchat.freenode.net/?channels=nodobjc\n[Wiki]: https://github.com/TooTallNate/NodObjC/wiki\n[MacDev]: http://developer.apple.com/library/mac/navigation/\n[iOSDev]: http://developer.apple.com/library/ios/navigation/\n[ObjCWikipedia]: http://en.wikipedia.org/wiki/Objective-C\n[others]: http://www.cocoadev.com/index.pl?CocoaBridges\n","_id":"NodObjC@0.0.12","dist":{"shasum":"8ca8bae7ff04c85a227b52ec43395218215b235a","tarball":"http://registry.npmjs.org/NodObjC/-/NodObjC-0.0.12.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}]}},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"time":{"modified":"2012-08-06T14:16:27.946Z","created":"2011-08-14T00:04:28.323Z","0.0.1":"2011-08-14T00:04:29.381Z","0.0.2":"2011-08-14T08:04:18.321Z","0.0.3":"2011-08-14T21:47:30.716Z","0.0.4":"2011-08-17T03:52:27.295Z","0.0.5":"2011-08-26T03:16:03.208Z","0.0.6":"2011-09-05T19:40:21.675Z","0.0.7":"2011-09-15T20:56:14.901Z","0.0.8":"2011-09-29T22:34:30.927Z","0.0.9":"2011-12-19T04:23:58.639Z","0.0.10":"2012-04-12T06:09:52.045Z","0.0.11":"2012-04-22T17:39:25.394Z","0.0.12":"2012-07-23T14:50:17.046Z"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/NodObjC.git"},"users":{"tootallnate":true,"fgribreau":true,"sjonnet19":true},"_attachments":{"NodObjC-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-OCvrSMb8BpH3IrcY01TIIg==","length":531850,"stub":true},"NodObjC-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-fzsXXR2jOwjtraoMz8cpEQ==","length":529934,"stub":true},"NodObjC-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-ecp0fOdH9B9I/SZPROVJ9g==","length":601827,"stub":true},"NodObjC-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-V9G1hLnayz5omEtN6llLkQ==","length":604160,"stub":true},"NodObjC-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-xCfEDPZ5ke1ulI0MVbNe4g==","length":302902,"stub":true},"NodObjC-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Urq/hFck9FApNYjoz+9I0Q==","length":45312,"stub":true},"NodObjC-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-tQnRl/h/CV3r/A590QZfOA==","length":44412,"stub":true},"NodObjC-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-2lojRTUHwh8PXMs6RQWz2g==","length":17048,"stub":true},"NodObjC-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-nV8o7kUzm83fmtM7EoQutw==","length":13728,"stub":true},"NodObjC-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-emqRh1x3UpyQqsLu66Tmaw==","length":11641,"stub":true},"NodObjC-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rtgGkS+5pXOkY0PX3cQ/LQ==","length":10116,"stub":true},"NodObjC-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ttvZ+4vgucuXKUUn4MksXw==","length":9708,"stub":true}}}},
{"id":"Node-JavaScript-Preprocessor","key":"Node-JavaScript-Preprocessor","value":{"rev":"13-4662b5ad742caaa467ec5d6c8e77b1e5"},"doc":{"_id":"Node-JavaScript-Preprocessor","_rev":"13-4662b5ad742caaa467ec5d6c8e77b1e5","name":"Node-JavaScript-Preprocessor","description":"A preprocessor for Javascript that supports defines, if else endif and includes.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Mike Coolin","email":"mcoolin@techie.com","url":"www.coolwebdevelopment.ca"},"name":"Node-JavaScript-Preprocessor","description":"A preprocessor for Javascript that supports defines, if else endif and includes.","version":"0.0.1","homepage":"http://coolwebdevelopment.ca/wordpress/index.php/developers-area/javascript/node-javascript-preprocessor/","repository":{"type":"git","url":"git://github.com/mcoolin/Node-JavaScript-Preprocessor.git"},"main":"pp.js","scripts":{"test":"node pp.js --help"},"engines":{"node":"~v0.4.11"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/mike/.npm/Node-JavaScript-Preprocessor/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Node-JavaScript-Preprocessor@0.0.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b06e4d32477200778444baba40ed674bdd43727c","tarball":"http://registry.npmjs.org/Node-JavaScript-Preprocessor/-/Node-JavaScript-Preprocessor-0.0.1.tgz"},"maintainers":[{"name":"mcoolin","email":"mcoolin@techie.com"}],"directories":{}},"0.0.2":{"author":{"name":"Mike Coolin","email":"mcoolin@techie.com","url":"www.coolwebdevelopment.ca"},"name":"Node-JavaScript-Preprocessor","description":"A preprocessor for Javascript that supports defines, if else endif and includes.","version":"0.0.2","homepage":"http://coolwebdevelopment.ca/wordpress/index.php/developers-area/javascript/node-javascript-preprocessor/","repository":{"type":"git","url":"git://github.com/mcoolin/Node-JavaScript-Preprocessor.git"},"main":"pp.js","scripts":{"test":"node pp.js --help"},"engines":{"node":"~v0.4.11"},"dependencies":{"tav":"1.0.0 - 2.9999.9999"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/mike/.npm/Node-JavaScript-Preprocessor/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Node-JavaScript-Preprocessor@0.0.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8de7eec18834e581d77eac352cd0202259df68ca","tarball":"http://registry.npmjs.org/Node-JavaScript-Preprocessor/-/Node-JavaScript-Preprocessor-0.0.2.tgz"},"maintainers":[{"name":"mcoolin","email":"mcoolin@techie.com"}],"directories":{}},"0.0.4":{"author":{"name":"Mike Coolin","email":"mcoolin@techie.com","url":"www.coolwebdevelopment.ca"},"name":"Node-JavaScript-Preprocessor","description":"A preprocessor for Javascript that supports defines, if else endif and includes.","version":"0.0.4","homepage":"http://coolwebdevelopment.ca/wordpress/index.php/developers-area/javascript/node-javascript-preprocessor/","repository":{"type":"git","url":"git://github.com/mcoolin/Node-JavaScript-Preprocessor.git"},"main":"pp.js","scripts":{"start":"node server.js --help"},"engines":{"node":"~v0.4.11"},"dependencies":{"tav":"0.1.0 - 2.9999.9999"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/mike/.npm/Node-JavaScript-Preprocessor/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"Node-JavaScript-Preprocessor@0.0.4","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5d064ae4089620096d2186f17b4ea2a5cf74e502","tarball":"http://registry.npmjs.org/Node-JavaScript-Preprocessor/-/Node-JavaScript-Preprocessor-0.0.4.tgz"},"maintainers":[{"name":"mcoolin","email":"mcoolin@techie.com"}]},"0.0.5":{"author":{"name":"Mike Coolin","email":"mcoolin@techie.com","url":"www.coolwebdevelopment.ca"},"name":"Node-JavaScript-Preprocessor","description":"A preprocessor for Javascript that supports defines, if else endif and includes.","version":"0.0.5","homepage":"http://coolwebdevelopment.ca/wordpress/index.php/developers-area/javascript/node-javascript-preprocessor/","repository":{"type":"git","url":"git://github.com/mcoolin/Node-JavaScript-Preprocessor.git"},"main":"pp.js","scripts":{"start":"node server.js --help"},"engines":{"node":"~v0.4.11"},"dependencies":{"tav":"0.1.0 - 2.9999.9999"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/mike/.npm/Node-JavaScript-Preprocessor/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"Node-JavaScript-Preprocessor@0.0.5","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b5b6a1d5c09a8a33d9a0045112fea4d681d5b0b8","tarball":"http://registry.npmjs.org/Node-JavaScript-Preprocessor/-/Node-JavaScript-Preprocessor-0.0.5.tgz"},"maintainers":[{"name":"mcoolin","email":"mcoolin@techie.com"}]}},"maintainers":[{"name":"mcoolin","email":"mcoolin@techie.com"}],"time":{"modified":"2011-08-28T21:36:28.162Z","created":"2011-08-28T19:05:03.319Z","0.0.1":"2011-08-28T19:05:04.502Z","0.0.2":"2011-08-28T19:26:33.323Z","0.0.3":"2011-08-28T19:34:55.557Z","0.0.4":"2011-08-28T21:19:12.222Z","0.0.5":"2011-08-28T21:36:28.162Z"},"author":{"name":"Mike Coolin","email":"mcoolin@techie.com","url":"www.coolwebdevelopment.ca"},"repository":{"type":"git","url":"git://github.com/mcoolin/Node-JavaScript-Preprocessor.git"},"_attachments":{"Node-JavaScript-Preprocessor-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ijLEIAx30cCv/21utGaaIg==","length":5047,"stub":true},"Node-JavaScript-Preprocessor-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-VEZPcT/dfLqN6jaTlrpfUw==","length":5057,"stub":true},"Node-JavaScript-Preprocessor-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-P2O0LnyLwKwU3QoCrpqXZw==","length":5026,"stub":true},"Node-JavaScript-Preprocessor-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1vwB/EAWXf23Hjgh83vDGw==","length":5005,"stub":true}}}},
{"id":"NodeCGI","key":"NodeCGI","value":{"rev":"23-c8e48c271e2265f951fee6cb1c8f2b5b"},"doc":{"_id":"NodeCGI","_rev":"23-c8e48c271e2265f951fee6cb1c8f2b5b","name":"NodeCGI","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","dist-tags":{"latest":"0.2.14"},"versions":{"0.2.4":{"name":"NodeCGI","version":"0.2.4","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.3","tempPath":">= 0.1.0"},"_id":"NodeCGI@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"04589988cc00fbcb65f3d2b664e16ea4b0cf51d1","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.4.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.5":{"name":"NodeCGI","version":"0.2.5","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.3","tempPath":">= 0.1.0","Critical":">= 0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"NodeCGI@0.2.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"6ae2b4c64634959130f04ba8ca809df396fa9803","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.5.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.6":{"name":"NodeCGI","version":"0.2.6","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.3","tempPath":">= 0.1.0","Critical":">= 0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"NodeCGI@0.2.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"5cb0d57ef6419e681e952df58d1ff0d8d6a1a341","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.6.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.7":{"name":"NodeCGI","version":"0.2.7","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.3","tempPath":">= 0.1.0","Critical":">= 0.1.3"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"NodeCGI@0.2.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"ebee4b451be40576e6fa573b51cc6c074366d4e0","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.7.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.8":{"name":"NodeCGI","version":"0.2.8","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.3","tempPath":">= 0.1.0","Critical":">= 0.1.3","node-uuid":">= 1.2.0"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"NodeCGI@0.2.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"f25c6741a108de0cb0d9a032f4384e54441f7b6e","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.8.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.9":{"name":"NodeCGI","version":"0.2.9","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.4","tempPath":">= 0.1.0","Critical":">= 0.1.5","node-uuid":">= 1.2.0"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"NodeCGI@0.2.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"867ee5a6cdea7f22bc38b4e0a1996afd1b981a47","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.9.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.10":{"name":"NodeCGI","version":"0.2.10","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.5","tempPath":">= 0.1.0","Critical":">= 0.1.6","Chains":">= 0.1.1","node-uuid":">= 1.2.0"},"_npmUser":{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"},"_id":"NodeCGI@0.2.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"d8885f931bb9436ec4f3c05623624504250d2969","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.10.tgz"},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.11":{"name":"NodeCGI","version":"0.2.11","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.5","tempPath":">= 0.1.0","Critical":">= 0.1.6","Chains":">= 0.1.1","node-uuid":">= 1.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"1e88cf2b25d851cbc08a37cb241fac05c3b58bc1","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.11.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"NodeCGI@0.2.11","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.12":{"name":"NodeCGI","version":"0.2.12","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.1.7","tempPath":">= 0.1.1","Critical":">= 0.1.8","Chains":">= 0.1.4","node-uuid":">= 1.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"0f4df8fb3a853f9685249ae96aebf538b481571e","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.12.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"NodeCGI@0.2.12","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.13":{"name":"NodeCGI","version":"0.2.13","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.2.0","tempPath":">= 0.1.1","Critical":">= 0.1.9","Chains":">= 0.1.5","node-uuid":">= 1.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"ae7b1b7fe5ad8728f99a181a48bcfa7d48a6424e","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.13.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"NodeCGI@0.2.13","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]},"0.2.14":{"name":"NodeCGI","version":"0.2.14","description":"A fastcgi-like server designed to accept proxied requests from a web server and execute a server side javascript file.","main":"nodecgi.js","dependencies":{"theBasics":">= 0.2.0","tempPath":">= 0.1.1","Critical":">= 0.1.9","Chains":">= 0.1.6","node-uuid":">= 1.2.0"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"dist":{"shasum":"ee5a4aad52abed14c7ac199c0ea6619dcb798945","tarball":"http://registry.npmjs.org/NodeCGI/-/NodeCGI-0.2.14.tgz"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_npmUser":{"name":"bluejeansandrain","email":"BlueJeansAndRain@gmail.com"},"_id":"NodeCGI@0.2.14","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"readme":"","maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}]}},"maintainers":[{"name":"bluejeansandrain","email":"bluejeansandrain@gmail.com"}],"time":{"modified":"2012-04-06T18:23:33.805Z","created":"2011-10-22T00:29:57.574Z","0.2.4":"2011-10-22T00:29:57.951Z","0.2.5":"2011-11-01T05:27:15.498Z","0.2.6":"2011-11-01T07:16:05.363Z","0.2.7":"2011-11-01T07:59:10.791Z","0.2.8":"2011-11-01T16:02:20.278Z","0.2.9":"2011-11-02T04:24:32.758Z","0.2.10":"2011-11-11T03:37:12.849Z","0.2.11":"2012-04-06T16:59:51.436Z","0.2.12":"2012-04-06T17:21:57.259Z","0.2.13":"2012-04-06T18:10:13.210Z","0.2.14":"2012-04-06T18:23:33.805Z"},"author":{"name":"Chris Ackerman","email":"BlueJeansAndRain@gmail.com","url":"moonbasesoftware.com"},"repository":{"url":""},"_attachments":{"NodeCGI-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-aDsyk1l7cHXcqG4ZHkYorQ==","length":11582,"stub":true},"NodeCGI-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-yQxynpIMVW+PwbsG/ERWwA==","length":11547,"stub":true},"NodeCGI-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-w/PF+0Z8oHM1SyO8AQufgA==","length":11594,"stub":true},"NodeCGI-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-qbjQMhCKvNbQyLCNVLZ3BQ==","length":11595,"stub":true},"NodeCGI-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-pVCOJCcyEobcC4n4viT7jw==","length":11530,"stub":true},"NodeCGI-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-0qBWMqLGlokRrxjwFA/9tQ==","length":11424,"stub":true},"NodeCGI-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-e6txPIAYp1qSwssbXzDFWA==","length":11515,"stub":true},"NodeCGI-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fzZ1FEVB106pdjDAOUUqEA==","length":11490,"stub":true},"NodeCGI-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MhI/Sx83HAAu+wSVMFFr7A==","length":11288,"stub":true},"NodeCGI-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rISlXCwxbx0LBCZpMYb8Zw==","length":11197,"stub":true},"NodeCGI-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UCRllS4uWgEGwCyAQVM3Tg==","length":11014,"stub":true}}}},
{"id":"NodeFQL","key":"NodeFQL","value":{"rev":"3-caa8805719926d25b6372f8d75a77cb8"},"doc":{"_id":"NodeFQL","_rev":"3-caa8805719926d25b6372f8d75a77cb8","name":"NodeFQL","description":"A simple module for interfacing with Facebook's FQL API.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Max Seiden","email":"140dbs@umich.edu"},"name":"NodeFQL","description":"A simple module for interfacing with Facebook's FQL API.","version":"0.0.0","repository":{"type":"git","url":"git://github.com/mhseiden/NodeFQL.git"},"main":"lib/node-fql","engines":{"node":"0.5.0"},"dependencies":{},"devDependencies":{},"scripts":{"test":"node tests/test1.js"},"_npmJsonOpts":{"file":"/Users/mhseiden/.npm/NodeFQL/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodeFQL@0.0.0","_engineSupported":false,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"d5fffda97cf91676abbf23b12049c49d83a1375c","tarball":"http://registry.npmjs.org/NodeFQL/-/NodeFQL-0.0.0.tgz"},"maintainers":[{"name":"mhseiden","email":"140dbs@gmail.com"}]}},"maintainers":[{"name":"mhseiden","email":"140dbs@gmail.com"}],"time":{"modified":"2011-10-14T08:18:03.725Z","created":"2011-10-14T08:18:03.408Z","0.0.0":"2011-10-14T08:18:03.725Z"},"author":{"name":"Max Seiden","email":"140dbs@umich.edu"},"repository":{"type":"git","url":"git://github.com/mhseiden/NodeFQL.git"},"_attachments":{"NodeFQL-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R3h8P0dpCFokNg7NK2+IJQ==","length":36062,"stub":true}}}},
{"id":"NodeInterval","key":"NodeInterval","value":{"rev":"5-0f30b0c8a7aa850064b806099b101b14"},"doc":{"_id":"NodeInterval","_rev":"5-0f30b0c8a7aa850064b806099b101b14","name":"NodeInterval","description":"Command-line watch utility for managing and concatenating templates into a webpage. Particularly useful for Backbone.js / Spine.js templates.","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.6":{"name":"NodeInterval","author":{"name":"Mauvis Ledford"},"description":"Command-line watch utility for managing and concatenating templates into a webpage. Particularly useful for Backbone.js / Spine.js templates.","version":"0.0.6","homepage":"http://brainswap.me","engines":{"node":">=0.4.0"},"main":"index.js","dependencies":{"nodewatch":">= 0.0.4","simple-logger":">= 0.0.1","underscore":">= 1.1.7"},"repository":{"type":"git","url":"git://github.com/krunkosaurus/NodeInterval.git"},"_npmJsonOpts":{"file":"/Users/mauvisledford/.npm/NodeInterval/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodeInterval@0.0.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.25","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"3b24f79e15283bc74532b2b4042ba0dff179daae","tarball":"http://registry.npmjs.org/NodeInterval/-/NodeInterval-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"krunkosaurus","email":"switchstatement@gmail.com"}]},"0.0.7":{"name":"NodeInterval","author":{"name":"Mauvis Ledford"},"description":"Command-line watch utility for managing and concatenating templates into a webpage. Particularly useful for Backbone.js / Spine.js templates.","version":"0.0.7","homepage":"http://brainswap.me","engines":{"node":">=0.4.0"},"main":"index.js","dependencies":{"nodewatch":">= 0.0.4","simple-logger":">= 0.0.1","underscore":">= 1.1.7"},"repository":{"type":"git","url":"git://github.com/krunkosaurus/NodeInterval.git"},"_npmJsonOpts":{"file":"/Users/mauvisledford/.npm/NodeInterval/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"NodeInterval@0.0.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.25","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"837f37c89440c55a8c605f34b8b0344c05a5200f","tarball":"http://registry.npmjs.org/NodeInterval/-/NodeInterval-0.0.7.tgz"},"scripts":{},"maintainers":[{"name":"krunkosaurus","email":"switchstatement@gmail.com"}]}},"maintainers":[{"name":"krunkosaurus","email":"switchstatement@gmail.com"}],"time":{"modified":"2011-10-06T00:35:42.624Z","created":"2011-09-19T05:10:38.546Z","0.0.6":"2011-09-19T05:10:39.823Z","0.0.7":"2011-10-06T00:35:42.624Z"},"author":{"name":"Mauvis Ledford"},"repository":{"type":"git","url":"git://github.com/krunkosaurus/NodeInterval.git"},"_attachments":{"NodeInterval-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-56WbeM/SCp4kYURSz3UHjw==","length":70381,"stub":true},"NodeInterval-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iAZ+daSZXJGZHsTTfmryfg==","length":69575,"stub":true}}}},
{"id":"NodeKeynote","key":"NodeKeynote","value":{"rev":"3-414fa2f915ab4603d380a84c45d3ff75"},"doc":{"_id":"NodeKeynote","_rev":"3-414fa2f915ab4603d380a84c45d3ff75","name":"NodeKeynote","description":"Project to create an keynote node presenter","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"NodeKeynote","version":"0.0.1","description":"Project to create an keynote node presenter","homepage":["https://github.com/aoqfonseca/nodekeynote"],"repository":{"type":"git","url":"git://github.com/aoqfonseca/nodekeynote.git"},"keywords":["keynote","nodejs","javascript","code","socket.io"],"author":{"name":"Andre Fonseca","email":"aoqfonseca@gmail.com"},"licenses":["MIT"],"dependencies":{"express":"*","socket.io":"*","coffee-script":"*"},"_npmUser":{"name":"aoqfonseca","email":"aoqfonseca@gmail.com"},"_id":"NodeKeynote@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"45ed5013331176b9b3773d746bcb5325ed675f67","tarball":"http://registry.npmjs.org/NodeKeynote/-/NodeKeynote-0.0.1.tgz"},"maintainers":[{"name":"aoqfonseca","email":"aoqfonseca@gmail.com"}]}},"readme":"#PROJECT\nThis is an project in NodeJS and Socket.IO. I created this to stedy ths two technologies and make more easy present my keynotes.\n\n#INSTALL\n\nYou need before install node.\nAfter, you need express and socket.io. For this, try npm install socket.io and npm install express.\n\n#AUTOR\nYou can mail me: aoqfonseca at gmail.com\nTwitter: aoqfonseca\n\n","maintainers":[{"name":"aoqfonseca","email":"aoqfonseca@gmail.com"}],"time":{"modified":"2012-04-05T03:25:48.963Z","created":"2012-04-05T03:25:45.111Z","0.0.1":"2012-04-05T03:25:48.963Z"},"author":{"name":"Andre Fonseca","email":"aoqfonseca@gmail.com"},"repository":{"type":"git","url":"git://github.com/aoqfonseca/nodekeynote.git"},"_attachments":{"NodeKeynote-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-T49wjBGIKcaV14yoKvftyQ==","length":453519,"stub":true}}}},
{"id":"NodeMini","key":"NodeMini","value":{"rev":"3-8c3279adf65e63cc7f81b2fdc01fdff4"},"doc":{"_id":"NodeMini","_rev":"3-8c3279adf65e63cc7f81b2fdc01fdff4","name":"NodeMini","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"bin":{"nodemini":"bin/NodeMini.js"},"name":"NodeMini","version":"0.0.1","private":false,"dependencies":{"express":"2.4.7","jade":">= 0.0.1","jqtpl":">= 0.0.1"},"_npmUser":{"name":"diopib","email":"diopib@gmail.com"},"_id":"NodeMini@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f46914ed9aece038772092ddcfbf94055428e6b3","tarball":"http://registry.npmjs.org/NodeMini/-/NodeMini-0.0.1.tgz"},"maintainers":[{"name":"diopib","email":"diopib@gmail.com"}]}},"maintainers":[{"name":"diopib","email":"diopib@gmail.com"}],"time":{"modified":"2011-10-11T02:53:58.604Z","created":"2011-10-11T02:53:56.015Z","0.0.1":"2011-10-11T02:53:58.604Z"},"_attachments":{"NodeMini-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IuJUk5ePDBtpWlPfXqlJIw==","length":3234,"stub":true}}}},
{"id":"NodeSSH","key":"NodeSSH","value":{"rev":"3-45530fae5a69c44a6dd92357910f4212"},"doc":{"_id":"NodeSSH","_rev":"3-45530fae5a69c44a6dd92357910f4212","name":"NodeSSH","description":"SSH Client for NodeJS","dist-tags":{"latest":"0.5.0"},"versions":{"0.5.0":{"name":"NodeSSH","description":"SSH Client for NodeJS","version":"0.5.0","author":{"name":"tsmith"},"repository":{"type":"git","url":"git://github.com/Trakkasure/NodeSSH.git"},"maintainers":[{"name":"tsmith"},{"name":"Brandon Myers","email":"trakkasure@gmail.com"}],"contributors":[{"name":"tsmith"},{"name":"Brandon Myers","email":"trakkasure@gmail.com"}],"keywords":["ssh","net","expect"],"main":"lib/index.js","engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_id":"NodeSSH@0.5.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"fe2a4dd28dfd1dd88dd12a4f2fd5efec5e5620a0","tarball":"http://registry.npmjs.org/NodeSSH/-/NodeSSH-0.5.0.tgz"},"scripts":{}}},"maintainers":[{"name":"trakkasure","email":"trakkasure@gmail.com"}],"time":{"modified":"2011-06-16T22:39:14.237Z","created":"2011-06-16T22:39:13.926Z","0.5.0":"2011-06-16T22:39:14.237Z"},"author":{"name":"tsmith"},"repository":{"type":"git","url":"git://github.com/Trakkasure/NodeSSH.git"},"_attachments":{"NodeSSH-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LL7oPpDAfISiIIfntcsMgw==","length":2178,"stub":true}}}},
{"id":"Nonsense","key":"Nonsense","value":{"rev":"6-97761f3d2b0945389696cb06fcf5c19d"},"doc":{"_id":"Nonsense","_rev":"6-97761f3d2b0945389696cb06fcf5c19d","name":"Nonsense","description":"Create repeatable random information","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"Nonsense","version":"0.1.0","author":{"name":"Josh Faul","email":"josh.faul@gmail.com"},"main":"Nonsense.js","description":"Create repeatable random information","repository":{"type":"git","url":"git://github.com/jocafa/Nonsense.git"},"_npmJsonOpts":{"file":"/Users/jfaul/.npm/Nonsense/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Nonsense@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e52b8ed1c3eba2716ff2e6a053b771b6bdbc268d","tarball":"http://registry.npmjs.org/Nonsense/-/Nonsense-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"jocafa","email":"josh.faul@gmail.com"}]},"0.1.2":{"name":"Nonsense","version":"0.1.2","author":{"name":"Josh Faul","email":"josh.faul@gmail.com"},"main":"Nonsense.js","description":"Create repeatable random information","repository":{"type":"git","url":"git://github.com/jocafa/Nonsense.git"},"_npmUser":{"name":"jocafa","email":"josh.faul@gmail.com"},"_id":"Nonsense@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"781da2e5e43659b64c5491dc3bb45a0d6670e437","tarball":"http://registry.npmjs.org/Nonsense/-/Nonsense-0.1.2.tgz"},"readme":"Nonsense\n========\n\nGenerate repeatable random data in JS\n\nInspired by [Faker.js](http://github.com/Marak/Faker.js)\n\nLicense\n-------\n\nDo whatever you want with this code. The consequenses of your actions are your own responsibility.\n","maintainers":[{"name":"jocafa","email":"josh.faul@gmail.com"}]}},"maintainers":[{"name":"jocafa","email":"josh.faul@gmail.com"}],"time":{"modified":"2012-08-06T15:47:03.211Z","created":"2011-08-18T16:08:04.264Z","0.1.0":"2011-08-18T16:08:07.069Z","0.1.2":"2012-04-26T21:58:41.054Z"},"author":{"name":"Josh Faul","email":"josh.faul@gmail.com"},"repository":{"type":"git","url":"git://github.com/jocafa/Nonsense.git"},"users":{"sjonnet19":true},"_attachments":{"Nonsense-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-G4xlug24SFip6ajaB5JPWg==","length":4396,"stub":true},"Nonsense-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IHBvC6nDRADJylFz7gK8gw==","length":6508,"stub":true}}}},
{"id":"NoobConfig","key":"NoobConfig","value":{"rev":"5-43b6768656c77e417127cab91315bbdd"},"doc":{"_id":"NoobConfig","_rev":"5-43b6768656c77e417127cab91315bbdd","name":"NoobConfig","description":"Parser for .ini for nodejs","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.0":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobConfig","description":"Parser for .ini for nodejs","keywords":["parser","ini","nodejs"],"version":"0.2.0","homepage":"https://github.com/Bwen/NoobConfig","repository":{"type":"git","url":"git://github.com:Bwen/NoobConfig.git"},"engines":{"node":"~0.6.11"},"dependencies":{},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobConfig@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"215d7a07eea95a1a458d566223531b7f5d832d8b","tarball":"http://registry.npmjs.org/NoobConfig/-/NoobConfig-0.2.0.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.2.1":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobConfig","description":"Parser for .ini for nodejs","keywords":["parser","ini","nodejs"],"version":"0.2.1","homepage":"https://github.com/Bwen/NoobConfig","repository":{"type":"git","url":"git://github.com:Bwen/NoobConfig.git"},"engines":{"node":"~0.6.11"},"dependencies":{},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobConfig@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0f890e25bdb53eac9132c29dff37abe2f28f0ef5","tarball":"http://registry.npmjs.org/NoobConfig/-/NoobConfig-0.2.1.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]}},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}],"time":{"modified":"2012-04-24T22:22:35.494Z","created":"2012-04-19T11:24:27.229Z","0.2.0":"2012-04-19T11:24:27.843Z","0.2.1":"2012-04-24T22:22:35.494Z"},"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"repository":{"type":"git","url":"git://github.com:Bwen/NoobConfig.git"},"_attachments":{"NoobConfig-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KuxbcYjrbYjEtsuT11pnQQ==","length":1666,"stub":true},"NoobConfig-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5Vm5plT/+T6JNtCQSiy2wA==","length":1650,"stub":true}}}},
{"id":"NoobHTTP","key":"NoobHTTP","value":{"rev":"25-4a6e8854f98d94c005d1aff889ffe945"},"doc":{"_id":"NoobHTTP","_rev":"25-4a6e8854f98d94c005d1aff889ffe945","name":"NoobHTTP","description":"Simple Nodejs HTTP server","dist-tags":{"latest":"0.5.2"},"versions":{"0.3.0":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.0","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"11a456aa81a45a2ac87c18faf09574e1899e963d","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.0.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.3.1":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.1","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"NoobConfig":">=0.2.0","mime":">=1.2.5"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"65fcaab3233d62d3e592f390a27cada6eb4f846b","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.1.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.3.2":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.2","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"NoobConfig":">=0.2.0","mime":">=1.2.5"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a7f5df0cf1dbdd366b6a6b5e7a01a1b256368877","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.2.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.3.3":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.3","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"NoobConfig":">=0.2.0","mime":">=1.2.5"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"634c04fc233978cedbf557c7c8e1991235c7cf83","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.3.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.3.4":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.4","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"NoobConfig":">=0.2.0","mime":">=1.2.5"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9f10ea37dae8a1fbf55c4b93697b1c9ce496b280","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.4.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.3.5":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.5","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"NoobConfig":">=0.2.0","mime":">=1.2.5"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"84040c717d846a00aa958b40b1f635fc4a341519","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.5.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.3.6":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple"],"version":"0.3.6","homepage":"https://github.com/Bwen/NoobHTTP","repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"NoobConfig":">=0.2.0","mime":">=1.2.5"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.3.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d34093f517bae11e76c65937e01a71729e93ce76","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.3.6.tgz"},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.4.0":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple","webapp"],"version":"0.4.0","homepage":"https://github.com/Bwen/NoobHTTP","licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"mime":">=1.2.5","eventemitter2":">=0.4.9"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"da3912576b4c683e165e2049fdb2673b3d0c07e8","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.4.0.tgz"},"readme":"## NoobHTTP\nThis is meant to be a simple static files http server. It is geared towards\nwebapps with socket.io. The reason why the http server __offers__ a hook,\nand thus optional, via web sockets is to be able dynamically load files cross domains.\n\nFor example if you are on domain1.com and you add a script tag to include a js script\nfrom domain2.com the js script will not be able to load files with XMLHttpRequest from\nits domain2.com.\n\nFor client side utils that I use with NoobHTTP visit: https://github.com/Bwen/NoobUtils\n\n## Features\n - HTTP & HTTPS\n - BasicAuth\n - Regex for forbidden files\n - Property system, a bit like .htaccess\n - Emit logs, which can be turned off\n - More to come...\n\n## Using NoobHTTP\nThe way to instantiate the NoobHTTP is done by passing an options object as parameter.\n\nAll the posibilities are below:\n```javascript\n    var http_server = require('http').createServer(function (req, res) {\n        }),\n        io = require('socket.io').listen(http_server),\n        server = require('NoobHTTP').createServer({\n            home: './public/',\n            port: 80,\n            logEmit: true,\n            serverInfo: \"NoobHTTP/1.0\",\n            http_server: http_server,\n            socketio: io,\n            files: {\n                forbidden: \"^\\.\",\n                property: \".noob.json\"\n            },\n            ssl: {\n                key: fs.readFileSync('./ssl/privatekey.pem'),\n                cert: fs.readFileSync('./ssl/certificate.pem')\n            }\n            replacements: {\n                '.js,.css,.html': {\n                    \"__hostUrl__\": \"https://domain2.com:9000/\"\n                }\n            }\n        });\n```\n\n```javascript\n    home: './public/'\n```\nThis property is __optional__ and defaults to `./public/`.\nDefines the root of the server.\n\n\n```javascript\n    port: 80\n```\nThis property is __optional__ and defaults to 80 or 443 if the property \"ssl\" exists in the options\n\n\n```javascript\n    logEmit: true\n```\nThis property is __optional__ and defaults to `true`.\nGives the posibility to have no logs being emitted.\n\n\n```javascript\n    serverInfo: \"NoobHTTP/1.0\"\n```\nThis property is __optional__ and defaults to `NoobHTTP/` and the version in the package.json.\nIt is put in every response headers as the key 'Server:'.\n\n\n```javascript\n    http_server: require('https')\n```\nThis property is __optional__ and defaults to null.\nIf this option is specified the NoobHTTP will not instantiate a new http server\nand will not bind itself to it.\n\n\n```javascript\n    socketio: require('socket.io')\n```\nThis property is __optional__ and defaults to null.\nIf this option is specified it will make a new namespace \"noobhttp\" and listen\nevents \"request\" with a file parameter. It will reponse with an emit of the file\nname that was requested with either the content of the file or an error object.\n\n\n```javascript\n    files: {\n        forbidden: \"^\\.\",\n        property: \".noob.json\"\n    }\n```\nTheses two options are __optionals__ and defaults to null.\nThe forbidden regexp option will default to false. If provided as the example all the\nfiles that starts with a dot will be responded with a 403.\n\nThe property option will default to false. If provided as the example every time the\nNoobHTTP receives a request for a file it will crawl the directory up to its home\ndirectory and look for this property file name. Right now the property file name is of\njson type and supports only 2 options. {\"auth\": true} which forces a directory to request\nfor a BasicAuth and {\"https\":\"https://domain2.com/\"} which enforces the url to be in https\nand thus redirects the browser with a 301.\n\n\n```javascript\n    ssl: {\n        key: fs.readFileSync('./ssl/privatekey.pem'),\n        cert: fs.readFileSync('./ssl/certificate.pem')\n    }\n```\nThis property is __optional__ and will default to null.\nIf you want the server to be ssl this is ofcourse required.\n\n\n```javascript\n    replacements: {\n        '.js,.css,.html': {\n            \"__hostUrl__\": \"https://domain2.com:9000/\"\n        }\n    }\n```\nThis option is __optional__ and defaults to null.\nThis gives the chance to specify markers to be replaced in certain extensions. Like\nmentioned in the beginning when including js script cross domains you want to be able\nto load static files (html templates) from the domain where the js comes from. Instead\nof hardcoding certain values this can be used.\n","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.4.1":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple nodejs HTTP server for static files","keywords":["static","server","nodejs","http","simple","webapp"],"version":"0.4.1","homepage":"https://github.com/Bwen/NoobHTTP","licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.6.11"},"dependencies":{"mime":">=1.2.5","eventemitter2":">=0.4.9"},"devDependencies":{},"main":"index","_npmUser":{"name":"bwen","email":"philippe.guilbault@gmail.com"},"_id":"NoobHTTP@0.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2b6be520c01f6c5f1b25fee7bd1816acb7ecec17","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.4.1.tgz"},"readme":"## NoobHTTP\nThis is meant to be a simple static files http server. It is geared towards\nwebapps with socket.io. The reason why the http server __offers__ a hook,\nand thus optional, via web sockets is to be able dynamically load files cross domains.\n\nFor example if you are on domain1.com and you add a script tag to include a js script\nfrom domain2.com the js script will not be able to load files with XMLHttpRequest from\nits domain2.com.\n\nFor client side utils that I use with NoobHTTP visit: https://github.com/Bwen/NoobUtils\n\n## Features\n - HTTP & HTTPS\n - BasicAuth\n - Regex for forbidden files\n - Property system, a bit like .htaccess\n - Emit logs, which can be turned off\n - More to come...\n\n## Using NoobHTTP\nThe way to instantiate the NoobHTTP is done by passing an options object as parameter.\n\nAll the posibilities are below:\n```javascript\n    var http_server = require('http').createServer(function (req, res) {\n        }),\n        io = require('socket.io').listen(http_server),\n        server = require('NoobHTTP').createServer({\n            home: './public/',\n            port: 80,\n            logEmit: true,\n            serverInfo: \"NoobHTTP/1.0\",\n            http_server: http_server,\n            socketio: io,\n            files: {\n                forbidden: \"^\\.\",\n                property: \".noob.json\"\n            },\n            ssl: {\n                key: fs.readFileSync('./ssl/privatekey.pem'),\n                cert: fs.readFileSync('./ssl/certificate.pem')\n            }\n            replacements: {\n                '.js,.css,.html': {\n                    \"__hostUrl__\": \"https://domain2.com:9000/\"\n                }\n            }\n        });\n```\n\n```javascript\n    home: './public/'\n```\nThis property is __optional__ and defaults to `./public/`.\nDefines the root of the server.\n\n\n```javascript\n    port: 80\n```\nThis property is __optional__ and defaults to 80 or 443 if the property \"ssl\" exists in the options\n\n\n```javascript\n    logEmit: true\n```\nThis property is __optional__ and defaults to `true`.\nGives the posibility to have no logs being emitted.\n\n\n```javascript\n    serverInfo: \"NoobHTTP/1.0\"\n```\nThis property is __optional__ and defaults to `NoobHTTP/` and the version in the package.json.\nIt is put in every response headers as the key 'Server:'.\n\n\n```javascript\n    http_server: require('https')\n```\nThis property is __optional__ and defaults to null.\nIf this option is specified the NoobHTTP will not instantiate a new http server\nand will not bind itself to it.\n\n\n```javascript\n    socketio: require('socket.io')\n```\nThis property is __optional__ and defaults to null.\nIf this option is specified it will make a new namespace \"noobhttp\" and listen\nevents \"request\" with a file parameter. It will reponse with an emit of the file\nname that was requested with either the content of the file or an error object.\n\n\n```javascript\n    files: {\n        forbidden: \"^\\.\",\n        property: \".noob.json\"\n    }\n```\nTheses two options are __optionals__ and defaults to null.\nThe forbidden regexp option will default to false. If provided as the example all the\nfiles that starts with a dot will be responded with a 403.\n\nThe property option will default to false. If provided as the example every time the\nNoobHTTP receives a request for a file it will crawl the directory up to its home\ndirectory and look for this property file name. Right now the property file name is of\njson type and supports only 2 options. {\"auth\": true} which forces a directory to request\nfor a BasicAuth and {\"https\":\"https://domain2.com/\"} which enforces the url to be in https\nand thus redirects the browser with a 301.\n\n\n```javascript\n    ssl: {\n        key: fs.readFileSync('./ssl/privatekey.pem'),\n        cert: fs.readFileSync('./ssl/certificate.pem')\n    }\n```\nThis property is __optional__ and will default to null.\nIf you want the server to be ssl this is ofcourse required.\n\n\n```javascript\n    replacements: {\n        '.js,.css,.html': {\n            \"__hostUrl__\": \"https://domain2.com:9000/\"\n        }\n    }\n```\nThis option is __optional__ and defaults to null.\nThis gives the chance to specify markers to be replaced in certain extensions. Like\nmentioned in the beginning when including js script cross domains you want to be able\nto load static files (html templates) from the domain where the js comes from. Instead\nof hardcoding certain values this can be used.\n","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.5.0":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple Nodejs HTTP server","keywords":["noob","newb","static","server","nodejs","http","https","ssl","simple","webapp","eventemitter2","template","i18n","cache","websocket","socketio","socket.io","if-modified-since","range","video","etag"],"version":"0.5.0","homepage":"https://github.com/Bwen/NoobHTTP","licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"https://git@github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.8.0"},"dependencies":{"mkdirp":"~0.3.3","mime":"~1.2.5","eventemitter2":"~0.4.9","cookies":"~0.3.0","node-uuid":"~1.3.3"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"~0.2.5"},"main":"index","readme":"# NoobHTTP\nThe version 0.5.0 breaks backward compatibility. I remade the whole thing from scratch to take full advantage of the EventEmitter2.\n\nThe module NoobHTTP as just one property and its `.Server`, which is an object. Its constructor accepts one argument. The possible options for that argument are as follow with their default values:\n\n```javascript\n{\n  serverInfo: \"NoobHTTP/0.5.0\", // Sent as the HTTP header Server.\n  home: \"./public\", // defines where all the public files resides.\n  port: 80, // The port the server is to listen on. Defaults to 80 /443 depending on ssl config property.\n  ssl: { // key & cert required for an HTTPs server.\n    key: null,\n    cert: null,\n  },\n  parsableExtensions: [\".html\"], // extensions that should be parsed for the mini-templating system.\n  availableLanguages: [\"en\"], // available languages for negociating a language with the browser.\n  cache: {\n    dir: \"/tmp/noobhttp/cache\", // where to put the mini-templating complied files.\n    days: 2 // this will be sent as the HTTP header Expires, adding it to the mtime of the file.\n  },\n  http_server: http_server // Already initiated HTTP Server, will not try to listen or initiate a server.\n}\n```\n\nThe first thing to know is that for every request NoobHTTP will add a property `.noobhttp` to the *ClientRequest* object as follow:\n```javascript\nClientRequest.noobhttp = {\n  homedir: this.home,\n  eventString: eventString,\n  cookies: new Cookies(req, res),\n  language: this.getRequestLanguage(req),\n  data: null, // contains the data/body of the request\n  error: {\n    headers: {}, // headers that will be used to send the error page\n    data: '' // body of the error response\n  },\n  response: {\n    file: \"/var/www/domain.com/directory/file.html\", // absolute path of the file found\n    data: '', // Body of the response\n  },\n  auth: {\n    realm: 'Noob Realm',\n    request: false,\n    authorized: false\n  }\n}\n```\nAnother important thing to know is that the property `ClientRequest.url` is parsed and replaced by the module `url`.\n`ClientRequest.url = url.parse(ClientRequest.url, true);`\n\nAlso the `req.headers.host` is modified to always include the port to be consistent, since its used for all event strings.\n\nAll files that are greater than 1 MegaByte will be streamed.\n\nThe server will also serve shared files, in the file `sharedFiles.js` that resides at the root of the module you can add files as follow:\n```javascript\nmodule.exports = {\n  'Class.js': 'Class.js',\n  'EventEmitter2.js': 'node_modules/eventemitter2/lib/eventemitter2.js',\n  'uuid.js': 'node_modules/node-uuid/uuid.js'\n};\n```\nYou can specify files that you want to serve without having them be in the public directory.\n\n# 4 types of events\n\n### Requests\nFor every request sent to the server an event will be emitted in the following syntax `request/domain.com:80/GET/directory/file.html`. The way the server checks if the file exists on the server is as follow: `var file = path.normalize(req.noobhttp.homedir + req.url.pathname);`; The only argument passed to the event is the `ClientRequest` which can be altered to change the behavior of the server.\n\nFor example, if we wanted to make all requests that starts with `/video` point to a different folder than the home we would do something like:\n```javascript\nserver.on('request/*/GET/video/**', function (req) {\n  req.noobhttp.homedir = '/media/videos';\n  req.url.pathname = req.url.pathname.replace(/\\/video/, '');\n});\n```\n\nAnother interesting example would be to prefix the requests' url with its domain name, giving the possibility to host more than one domain/site with the server.\n```javascript\nserver.on('request/**', function (req) {\n  req.url.pathname = \"/\" + req.headers.host.split(':')[0] + req.url.pathname;\n});\n```\nOne should be cautious with the order of the events...\n\n### Responses\nFor every response the server will emit an event in the following syntax: `response/domain.com:80/GET/directory/file.html`. The only argument passed to the event is the `ClientRequest` which can be altered to change the behavior of the server. Before emitting this event the property `ClientRequest.noobhttp.response` is added. It contains the following:\n```javascript\n{\n  file: \"/var/www/domain.com/directory/file.html\", // The absolute path to the file that was found\n  data: Buffer // The buffer that was returned by the fs.readFile()\n}\n```\n\n### Errors\nFor every error the server encounters it will emit an event in the following syntax: `error/domain.com:80/404`. The event receives two arguments the first one is for the error code and the second is the `ClientRequest` which can be altered to change the behavior of the server. Before emitting this event the property `ClientRequest.noobhttp.error` is added. It contains the following:\n```javascript\n{\n  headers: {'content-type': 'text/plain'},\n  data: '404 File Not Found'\n}\n```\n\nThis can be useful to have personalized error pages, like so:\n```javascript\nserver.on('error/**', function (code, req) {\n  req.response.headers = {'content-type': 'text/html'};\n  req.response.data = '<h1>' + code + \" \" +req.response.data + '</h1>';\n});\n```\n\n### Authentications\nWhen a event for a request is emitted the callback as the opportunity to change the following property `ClientRequest.noobhttp.auth.request` to `true`. Doing so will make the server request a basic authentication to the browser and emit an auth event in the following syntax: `auth/domain.com:80/directory/file.html`. It will pass 3 arguments, the first is the `ClientRequest`, the second is the username and the third is the password.\n\nThe event MUST validate the username & password and change the following property `ClientRequest.noobhttp.auth.authorized` to `true` otherwise the server will keep prompting for the browser to authenticate itself.\n\nExample where we want every request to be authenticated:\n```javascript\nserver.on('request/**', function (req) {\n  req.noobhttp.auth.request = true;\n});\n\nserver.on('auth/**', function (req, username, password) {\n  req.noobhttp.auth.authorized = myAuthFunction(username, password);\n});\n```\n\n# HTTP Methods\nThe server supports the HTTP method \"OPTIONS\", which queries the server to see which methods are available for a given resource. For now the only methods that are not implemented are \"TRACE\" and \"CONNECT\", and will return a 501 (Not Implemented) code if ever requested.\n\nThe only methods that are available for __files__ are \"OPTIONS\" and \"GET\", any other methods requested for a __file__ will get 405 (Method Not Allowed).\n\nThe methods available for __directories__ are \"OPTIONS\", \"GET\", \"POST\", \"DELETE\" and \"PUT\". When requesting a __directory__ resource the server will check if it can find the following files in the directory: `.get.js`, `.post.js`, `.delete.js` and `.put.js` and will compile a list of methods supported for the requested directory and will return it as the HTTP header \"Allow\" if the method is OPTIONS. If the method requested for the directory does not have a file for it the server will return a 405 (Method Not Allowed).\n\nOtherwise it will require that file and call its export as a function passing it 3 arguments. The first one is the `ClientRequest`, second is the `ClientResponse` and the third is a reference to a `setTimeout(,2000);` that needs to be cleared by the module. Otherwise an 500 (Internal Error) will be sent to the browser.\n\nIf the method requested for a __directory__ is \"GET\" and the file `.get.js` is not present in the directory the server will check to see if the file `index.html` is present and alter the requested file for it.\n\nThe server supports the method \"HEAD\".\n\n# HTTP Headers\nTypical headers sent from the server for a simple request\n```\nserver: NoobHTTP/0.5.0\ncontent-type: text/html\ncontent-length: 908\nlast-modified: Sun, 08 Jul 2012 21:24:01 GMT\netag: \"516162-908-1341782641000\"\naccept-ranges: bytes\ncache-control: public, must-revalidate\nexpires: Tue, 10 Jul 2012 21:24:01 GMT\nx-powered-by: Node.js/0.8.0\nx-generated-by: a noob... xD\nx-xss-protection: 1; mode=block\nx-content-type-options: nosniff\n```\n\nIt supports the following headers sent from the client: `if-modified-since`, `if-none-match`, `range`, `if-range`, `cache-control`.\n\n\n# Mini-Templating system\nThis is a very simple file include system for files that have a parsable extension. The server will crawl the directories up to the `.home` and identifies `.templates` folders for the request. If the requested file has a marker `{noobhttp-layout}` it will find the nearest `layout.html`. It will do the same for the markers `{noobhttp-include file=header.html}`. It will always crawl the directories from the requested file's folder and will always take the first file it finds.\n\nWhen a parsable extension is compiled it is saved in the `cache.dir` config and the http headers are modified accordingly.\n\nExample,\nrequested file `/dir1/dir2/index.html`\n```html\n{noobhttp-layout}\n<div>hullo world</div>\n```\n\nfile `/.templates/layout.html`\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>hullo world</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    </head>\n<body>\n{noobhttp-include file=header.html}\n{noobhttp-content}\n{noobhttp-include file=footer.html}\n</body>\n</html>\n```\n\nfile `/dir1/.templates/header.html`\n```html\n<header>hullo header</header>\n```\n\n__the result would give__:\n\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>hullo world</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    </head>\n<body>\n<header>hullo header</header>\n<div>hullo world</div>\n</body>\n</html>\n```\n","_id":"NoobHTTP@0.5.0","dist":{"shasum":"b796b34ff2de99fca31ae0b7eacf6d54314e1652","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.5.0.tgz"},"maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.5.1":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple Nodejs HTTP server","keywords":["noob","newb","static","server","nodejs","http","https","ssl","simple","webapp","eventemitter2","template","i18n","cache","websocket","socketio","socket.io","if-modified-since","range","video","etag"],"version":"0.5.1","homepage":"https://github.com/Bwen/NoobHTTP","licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"https://git@github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.8.0"},"dependencies":{"mkdirp":"~0.3.3","mime":"~1.2.5","eventemitter2":"~0.4.9","cookies":"~0.3.0","node-uuid":"~1.3.3"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"~0.2.5"},"main":"index","readme":"# NoobHTTP\nThe version 0.5.0 breaks backward compatibility. I remade the whole thing from scratch to take full advantage of the EventEmitter2.\n\nThe module NoobHTTP as just one property and its `.Server`, which is an object. Its constructor accepts one argument. The possible options for that argument are as follow with their default values:\n\n```javascript\n{\n  serverInfo: \"NoobHTTP/0.5.0\", // Sent as the HTTP header Server.\n  home: \"./public\", // defines where all the public files resides.\n  port: 80, // The port the server is to listen on. Defaults to 80 /443 depending on ssl config property.\n  ssl: { // key & cert required for an HTTPs server.\n    key: null,\n    cert: null,\n  },\n  parsableExtensions: [\".html\"], // extensions that should be parsed for the mini-templating system.\n  availableLanguages: [\"en\"], // available languages for negociating a language with the browser.\n  cache: {\n    dir: \"/tmp/noobhttp/cache\", // where to put the mini-templating complied files.\n    days: 2 // this will be sent as the HTTP header Expires, adding it to the mtime of the file.\n  },\n  http_server: http_server // Already initiated HTTP Server, will not try to listen or initiate a server.\n}\n```\n\nThe first thing to know is that for every request NoobHTTP will add a property `.noobhttp` to the *ClientRequest* object as follow:\n```javascript\nClientRequest.noobhttp = {\n  homedir: this.home,\n  eventString: eventString,\n  cookies: new Cookies(req, res),\n  language: this.getRequestLanguage(req),\n  data: null, // contains the data/body of the request\n  error: {\n    headers: {}, // headers that will be used to send the error page\n    data: '' // body of the error response\n  },\n  response: {\n    file: \"/var/www/domain.com/directory/file.html\", // absolute path of the file found\n    data: '', // Body of the response\n  },\n  auth: {\n    realm: 'Noob Realm',\n    request: false,\n    authorized: false\n  }\n}\n```\nAnother important thing to know is that the property `ClientRequest.url` is parsed and replaced by the module `url`.\n`ClientRequest.url = url.parse(ClientRequest.url, true);`\n\nAlso the `req.headers.host` is modified to always include the port to be consistent, since its used for all event strings.\n\nAll files that are greater than 1 MegaByte will be streamed.\n\nThe server will also serve shared files, in the file `sharedFiles.js` that resides at the root of the module you can add files as follow:\n```javascript\nmodule.exports = {\n  'Class.js': 'Class.js',\n  'EventEmitter2.js': 'node_modules/eventemitter2/lib/eventemitter2.js',\n  'uuid.js': 'node_modules/node-uuid/uuid.js'\n};\n```\nYou can specify files that you want to serve without having them be in the public directory.\n\n# 4 types of events\n\n### Requests\nFor every request sent to the server an event will be emitted in the following syntax `request/domain.com:80/GET/directory/file.html`. The way the server checks if the file exists on the server is as follow: `var file = path.normalize(req.noobhttp.homedir + req.url.pathname);`; The only argument passed to the event is the `ClientRequest` which can be altered to change the behavior of the server.\n\nFor example, if we wanted to make all requests that starts with `/video` point to a different folder than the home we would do something like:\n```javascript\nserver.on('request/*/GET/video/**', function (req) {\n  req.noobhttp.homedir = '/media/videos';\n  req.url.pathname = req.url.pathname.replace(/\\/video/, '');\n});\n```\n\nAnother interesting example would be to prefix the requests' url with its domain name, giving the possibility to host more than one domain/site with the server.\n```javascript\nserver.on('request/**', function (req) {\n  req.url.pathname = \"/\" + req.headers.host.split(':')[0] + req.url.pathname;\n});\n```\nOne should be cautious with the order of the events...\n\n### Responses\nFor every response the server will emit an event in the following syntax: `response/domain.com:80/GET/directory/file.html`. The only argument passed to the event is the `ClientRequest` which can be altered to change the behavior of the server. Before emitting this event the property `ClientRequest.noobhttp.response` is added. It contains the following:\n```javascript\n{\n  file: \"/var/www/domain.com/directory/file.html\", // The absolute path to the file that was found\n  data: Buffer // The buffer that was returned by the fs.readFile()\n}\n```\n\n### Errors\nFor every error the server encounters it will emit an event in the following syntax: `error/domain.com:80/404`. The event receives two arguments the first one is for the error code and the second is the `ClientRequest` which can be altered to change the behavior of the server. Before emitting this event the property `ClientRequest.noobhttp.error` is added. It contains the following:\n```javascript\n{\n  headers: {'content-type': 'text/plain'},\n  data: '404 File Not Found'\n}\n```\n\nThis can be useful to have personalized error pages, like so:\n```javascript\nserver.on('error/**', function (code, req) {\n  req.response.headers = {'content-type': 'text/html'};\n  req.response.data = '<h1>' + code + \" \" +req.response.data + '</h1>';\n});\n```\n\n### Authentications\nWhen a event for a request is emitted the callback as the opportunity to change the following property `ClientRequest.noobhttp.auth.request` to `true`. Doing so will make the server request a basic authentication to the browser and emit an auth event in the following syntax: `auth/domain.com:80/directory/file.html`. It will pass 3 arguments, the first is the `ClientRequest`, the second is the username and the third is the password.\n\nThe event MUST validate the username & password and change the following property `ClientRequest.noobhttp.auth.authorized` to `true` otherwise the server will keep prompting for the browser to authenticate itself.\n\nExample where we want every request to be authenticated:\n```javascript\nserver.on('request/**', function (req) {\n  req.noobhttp.auth.request = true;\n});\n\nserver.on('auth/**', function (req, username, password) {\n  req.noobhttp.auth.authorized = myAuthFunction(username, password);\n});\n```\n\n# HTTP Methods\nThe server supports the HTTP method \"OPTIONS\", which queries the server to see which methods are available for a given resource. For now the only methods that are not implemented are \"TRACE\" and \"CONNECT\", and will return a 501 (Not Implemented) code if ever requested.\n\nThe only methods that are available for __files__ are \"OPTIONS\" and \"GET\", any other methods requested for a __file__ will get 405 (Method Not Allowed).\n\nThe methods available for __directories__ are \"OPTIONS\", \"GET\", \"POST\", \"DELETE\" and \"PUT\". When requesting a __directory__ resource the server will check if it can find the following files in the directory: `.get.js`, `.post.js`, `.delete.js` and `.put.js` and will compile a list of methods supported for the requested directory and will return it as the HTTP header \"Allow\" if the method is OPTIONS. If the method requested for the directory does not have a file for it the server will return a 405 (Method Not Allowed).\n\nOtherwise it will require that file and call its export as a function passing it 3 arguments. The first one is the `ClientRequest`, second is the `ClientResponse` and the third is a reference to a `setTimeout(,2000);` that needs to be cleared by the module. Otherwise an 500 (Internal Error) will be sent to the browser.\n\nIf the method requested for a __directory__ is \"GET\" and the file `.get.js` is not present in the directory the server will check to see if the file `index.html` is present and alter the requested file for it.\n\nThe server supports the method \"HEAD\".\n\n# HTTP Headers\nTypical headers sent from the server for a simple request\n```\nserver: NoobHTTP/0.5.0\ncontent-type: text/html\ncontent-length: 908\nlast-modified: Sun, 08 Jul 2012 21:24:01 GMT\netag: \"516162-908-1341782641000\"\naccept-ranges: bytes\ncache-control: public, must-revalidate\nexpires: Tue, 10 Jul 2012 21:24:01 GMT\nx-powered-by: Node.js/0.8.0\nx-generated-by: a noob... xD\nx-xss-protection: 1; mode=block\nx-content-type-options: nosniff\n```\n\nIt supports the following headers sent from the client: `if-modified-since`, `if-none-match`, `range`, `if-range`, `cache-control`.\n\n\n# Mini-Templating system\nThis is a very simple file include system for files that have a parsable extension. The server will crawl the directories up to the `.home` and identifies `.templates` folders for the request. If the requested file has a marker `{noobhttp-layout}` it will find the nearest `layout.html`. It will do the same for the markers `{noobhttp-include file=header.html}`. It will always crawl the directories from the requested file's folder and will always take the first file it finds.\n\nWhen a parsable extension is compiled it is saved in the `cache.dir` config and the http headers are modified accordingly.\n\nExample,\nrequested file `/dir1/dir2/index.html`\n```html\n{noobhttp-layout}\n<div>hullo world</div>\n```\n\nfile `/.templates/layout.html`\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>hullo world</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    </head>\n<body>\n{noobhttp-include file=header.html}\n{noobhttp-content}\n{noobhttp-include file=footer.html}\n</body>\n</html>\n```\n\nfile `/dir1/.templates/header.html`\n```html\n<header>hullo header</header>\n```\n\n__the result would give__:\n\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>hullo world</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    </head>\n<body>\n<header>hullo header</header>\n<div>hullo world</div>\n</body>\n</html>\n```\n","_id":"NoobHTTP@0.5.1","dist":{"shasum":"a5db5142dbd248d0aa9be60d82619aeaf88db814","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.5.1.tgz"},"maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]},"0.5.2":{"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"name":"NoobHTTP","description":"Simple Nodejs HTTP server","keywords":["noob","newb","static","server","nodejs","http","https","ssl","simple","webapp","eventemitter2","template","i18n","cache","websocket","socketio","socket.io","if-modified-since","range","video","etag"],"version":"0.5.2","homepage":"https://github.com/Bwen/NoobHTTP","licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"https://git@github.com:Bwen/NoobHTTP.git"},"engines":{"node":"~0.8.0"},"dependencies":{"mkdirp":"~0.3.3","mime":"~1.2.5","eventemitter2":"~0.4.9","cookies":"~0.3.0","node-uuid":"~1.3.3"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"~0.2.5"},"main":"index","readme":"# NoobHTTP\nThe version 0.5.0 breaks backward compatibility. I remade the whole thing from scratch to take full advantage of the EventEmitter2.\n\nThe module NoobHTTP as just one property and its `.Server`, which is an object. Its constructor accepts one argument. The possible options for that argument are as follow with their default values:\n\n```javascript\n{\n  serverInfo: \"NoobHTTP/0.5.0\", // Sent as the HTTP header Server.\n  home: \"./public\", // defines where all the public files resides.\n  port: 80, // The port the server is to listen on. Defaults to 80 /443 depending on ssl config property.\n  ssl: { // key & cert required for an HTTPs server.\n    key: null,\n    cert: null,\n  },\n  parsableExtensions: [\".html\"], // extensions that should be parsed for the mini-templating system.\n  availableLanguages: [\"en\"], // available languages for negociating a language with the browser.\n  cache: {\n    dir: \"/tmp/noobhttp/cache\", // where to put the mini-templating complied files.\n    days: 2 // this will be sent as the HTTP header Expires, adding it to the mtime of the file.\n  },\n  http_server: http_server // Already initiated HTTP Server, will not try to listen or initiate a server.\n}\n```\n\nThe first thing to know is that for every request NoobHTTP will add a property `.noobhttp` to the *ClientRequest* object as follow:\n```javascript\nClientRequest.noobhttp = {\n  homedir: this.home,\n  eventString: eventString,\n  cookies: new Cookies(req, res),\n  language: this.getRequestLanguage(req),\n  data: null, // contains the data/body of the request\n  error: {\n    headers: {}, // headers that will be used to send the error page\n    data: '' // body of the error response\n  },\n  response: {\n    file: \"/var/www/domain.com/directory/file.html\", // absolute path of the file found\n    data: '', // Body of the response\n  },\n  auth: {\n    realm: 'Noob Realm',\n    request: false,\n    authorized: false\n  }\n}\n```\nAnother important thing to know is that the property `ClientRequest.url` is parsed and replaced by the module `url`.\n`ClientRequest.url = url.parse(ClientRequest.url, true);`\n\nAlso the `req.headers.host` is modified to always include the port to be consistent, since its used for all event strings.\n\nAll files that are greater than 1 MegaByte will be streamed.\n\nThe server will also serve shared files, in the file `sharedFiles.js` that resides at the root of the module you can add files as follow:\n```javascript\nmodule.exports = {\n  'Class.js': 'Class.js',\n  'EventEmitter2.js': 'node_modules/eventemitter2/lib/eventemitter2.js',\n  'uuid.js': 'node_modules/node-uuid/uuid.js'\n};\n```\nYou can specify files that you want to serve without having them be in the public directory.\n\n# 4 types of events\n\n### Requests\nFor every request sent to the server an event will be emitted in the following syntax `request/domain.com:80/GET/directory/file.html`. The way the server checks if the file exists on the server is as follow: `var file = path.normalize(req.noobhttp.homedir + req.url.pathname);`; The only argument passed to the event is the `ClientRequest` which can be altered to change the behavior of the server.\n\nFor example, if we wanted to make all requests that starts with `/video` point to a different folder than the home we would do something like:\n```javascript\nserver.on('request/*/GET/video/**', function (req) {\n  req.noobhttp.homedir = '/media/videos';\n  req.url.pathname = req.url.pathname.replace(/\\/video/, '');\n});\n```\n\nAnother interesting example would be to prefix the requests' url with its domain name, giving the possibility to host more than one domain/site with the server.\n```javascript\nserver.on('request/**', function (req) {\n  req.url.pathname = \"/\" + req.headers.host.split(':')[0] + req.url.pathname;\n});\n```\nOne should be cautious with the order of the events...\n\n### Responses\nFor every response the server will emit an event in the following syntax: `response/domain.com:80/GET/directory/file.html`. The only argument passed to the event is the `ClientRequest` which can be altered to change the behavior of the server. Before emitting this event the property `ClientRequest.noobhttp.response` is added. It contains the following:\n```javascript\n{\n  file: \"/var/www/domain.com/directory/file.html\", // The absolute path to the file that was found\n  data: Buffer // The buffer that was returned by the fs.readFile()\n}\n```\n\n### Errors\nFor every error the server encounters it will emit an event in the following syntax: `error/domain.com:80/404`. The event receives two arguments the first one is for the error code and the second is the `ClientRequest` which can be altered to change the behavior of the server. Before emitting this event the property `ClientRequest.noobhttp.error` is added. It contains the following:\n```javascript\n{\n  headers: {'content-type': 'text/plain'},\n  data: '404 File Not Found'\n}\n```\n\nThis can be useful to have personalized error pages, like so:\n```javascript\nserver.on('error/**', function (code, req) {\n  req.response.headers = {'content-type': 'text/html'};\n  req.response.data = '<h1>' + code + \" \" +req.response.data + '</h1>';\n});\n```\n\n### Authentications\nWhen a event for a request is emitted the callback as the opportunity to change the following property `ClientRequest.noobhttp.auth.request` to `true`. Doing so will make the server request a basic authentication to the browser and emit an auth event in the following syntax: `auth/domain.com:80/directory/file.html`. It will pass 3 arguments, the first is the `ClientRequest`, the second is the username and the third is the password.\n\nThe event MUST validate the username & password and change the following property `ClientRequest.noobhttp.auth.authorized` to `true` otherwise the server will keep prompting for the browser to authenticate itself.\n\nExample where we want every request to be authenticated:\n```javascript\nserver.on('request/**', function (req) {\n  req.noobhttp.auth.request = true;\n});\n\nserver.on('auth/**', function (req, username, password) {\n  req.noobhttp.auth.authorized = myAuthFunction(username, password);\n});\n```\n\n# HTTP Methods\nThe server supports the HTTP method \"OPTIONS\", which queries the server to see which methods are available for a given resource. For now the only methods that are not implemented are \"TRACE\" and \"CONNECT\", and will return a 501 (Not Implemented) code if ever requested.\n\nThe only methods that are available for __files__ are \"OPTIONS\" and \"GET\", any other methods requested for a __file__ will get 405 (Method Not Allowed).\n\nThe methods available for __directories__ are \"OPTIONS\", \"GET\", \"POST\", \"DELETE\" and \"PUT\". When requesting a __directory__ resource the server will check if it can find the following files in the directory: `.get.js`, `.post.js`, `.delete.js` and `.put.js` and will compile a list of methods supported for the requested directory and will return it as the HTTP header \"Allow\" if the method is OPTIONS. If the method requested for the directory does not have a file for it the server will return a 405 (Method Not Allowed).\n\nOtherwise it will require that file and call its export as a function passing it 3 arguments. The first one is the `ClientRequest`, second is the `ClientResponse` and the third is a reference to a `setTimeout(,2000);` that needs to be cleared by the module. Otherwise an 500 (Internal Error) will be sent to the browser.\n\nIf the method requested for a __directory__ is \"GET\" and the file `.get.js` is not present in the directory the server will check to see if the file `index.html` is present and alter the requested file for it.\n\nThe server supports the method \"HEAD\".\n\n# HTTP Headers\nTypical headers sent from the server for a simple request\n```\nserver: NoobHTTP/0.5.0\ncontent-type: text/html\ncontent-length: 908\nlast-modified: Sun, 08 Jul 2012 21:24:01 GMT\netag: \"516162-908-1341782641000\"\naccept-ranges: bytes\ncache-control: public, must-revalidate\nexpires: Tue, 10 Jul 2012 21:24:01 GMT\nx-powered-by: Node.js/0.8.0\nx-generated-by: a noob... xD\nx-xss-protection: 1; mode=block\nx-content-type-options: nosniff\n```\n\nIt supports the following headers sent from the client: `if-modified-since`, `if-none-match`, `range`, `if-range`, `cache-control`.\n\n\n# Mini-Templating system\nThis is a very simple file include system for files that have a parsable extension. The server will crawl the directories up to the `.home` and identifies `.templates` folders for the request. If the requested file has a marker `{noobhttp-layout}` it will find the nearest `layout.html`. It will do the same for the markers `{noobhttp-include file=header.html}`. It will always crawl the directories from the requested file's folder and will always take the first file it finds.\n\nWhen a parsable extension is compiled it is saved in the `cache.dir` config and the http headers are modified accordingly.\n\nExample,\nrequested file `/dir1/dir2/index.html`\n```html\n{noobhttp-layout}\n<div>hullo world</div>\n```\n\nfile `/.templates/layout.html`\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>hullo world</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    </head>\n<body>\n{noobhttp-include file=header.html}\n{noobhttp-content}\n{noobhttp-include file=footer.html}\n</body>\n</html>\n```\n\nfile `/dir1/.templates/header.html`\n```html\n<header>hullo header</header>\n```\n\n__the result would give__:\n\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>hullo world</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    </head>\n<body>\n<header>hullo header</header>\n<div>hullo world</div>\n</body>\n</html>\n```\n","_id":"NoobHTTP@0.5.2","dist":{"shasum":"61f7c3c1365e407b5127bc821f2ff352a7424668","tarball":"http://registry.npmjs.org/NoobHTTP/-/NoobHTTP-0.5.2.tgz"},"maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}]}},"readme":"","maintainers":[{"name":"bwen","email":"philippe.guilbault@gmail.com"}],"time":{"modified":"2012-07-16T21:13:29.311Z","created":"2012-04-19T11:25:57.177Z","0.3.0":"2012-04-19T11:25:58.022Z","0.3.1":"2012-04-24T22:12:26.890Z","0.3.2":"2012-04-27T13:50:46.804Z","0.3.3":"2012-04-27T19:54:52.418Z","0.3.4":"2012-04-28T16:38:39.515Z","0.3.5":"2012-04-28T23:44:47.358Z","0.3.6":"2012-04-29T01:25:37.401Z","0.4.0":"2012-05-01T23:08:18.315Z","0.4.1":"2012-05-01T23:12:55.234Z","0.5.0":"2012-07-13T11:07:51.002Z","0.5.1":"2012-07-13T13:28:39.507Z","0.5.2":"2012-07-16T21:13:29.311Z"},"author":{"name":"Philippe Guilbault","email":"philippe.guilbault@gmail.com"},"repository":{"type":"git","url":"https://git@github.com:Bwen/NoobHTTP.git"},"_attachments":{"NoobHTTP-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-yoJGQwQl1CtQFpKGzqGCMQ==","length":11760,"stub":true},"NoobHTTP-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-bOwK3n/V7MlSTih8MTwh/Q==","length":11742,"stub":true},"NoobHTTP-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-87eeK5LPss8zHVtKZBwKkg==","length":11750,"stub":true},"NoobHTTP-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-mZD5si2MoHJfaKq4bAQ4Zw==","length":4324,"stub":true},"NoobHTTP-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-rTDIWXcRQkVHrX24NTFx9A==","length":4318,"stub":true},"NoobHTTP-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-fCljveFAjcsMD/jvXuuFYw==","length":2630,"stub":true},"NoobHTTP-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-nURAHGHzWymMAJRLacresw==","length":2636,"stub":true},"NoobHTTP-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-LHGiqmkl4Q/2XlJwd00CgA==","length":2631,"stub":true},"NoobHTTP-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OjTR1zsuROJjbLUvcCs+bw==","length":2532,"stub":true},"NoobHTTP-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8SSj4Kt1Zs/K3s+ew8NXjw==","length":2393,"stub":true},"NoobHTTP-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HQRwKaT7Z70FxdF2p4hn9A==","length":2329,"stub":true},"NoobHTTP-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ieclXhomK29oHHQCZ6jbzQ==","length":2275,"stub":true}}}},
{"id":"NormAndVal","key":"NormAndVal","value":{"rev":"9-d3b3d6ffd046292f4733aa5f3eb7be61"},"doc":{"_id":"NormAndVal","_rev":"9-d3b3d6ffd046292f4733aa5f3eb7be61","name":"NormAndVal","description":"Normalize your data to match common conventions; Validate your inputs; use the same libraries in Node.js *and* the browser.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.2":{"name":"NormAndVal","version":"0.0.2","description":"Normalize your data to match common conventions; Validate your inputs; use the same libraries in Node.js *and* the browser.","keywords":["util","normalize","validate","normalization","validation","library","data"],"author":{"name":"roberthahn","email":"rh-github@roberthahn.ca"},"contributors":[],"dependencies":{},"main":"./lib/index","_id":"NormAndVal@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.2.4","dist":{"shasum":"32f9bbbee2de7220602ecaf6deea1560fec55100","tarball":"http://registry.npmjs.org/NormAndVal/-/NormAndVal-0.0.2.tgz"}},"0.0.3":{"name":"NormAndVal","version":"0.0.3","description":"Normalize your data to match common conventions; Validate your inputs; use the same libraries in Node.js *and* the browser.","keywords":["util","normalize","validate","normalization","validation","library","data"],"author":{"name":"roberthahn","email":"rh-github@roberthahn.ca"},"contributors":[],"dependencies":{},"main":"./lib/index","_id":"NormAndVal@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.2.4","dist":{"shasum":"5f9049a896b46183e0c2e909896f230e797527cb","tarball":"http://registry.npmjs.org/NormAndVal/-/NormAndVal-0.0.3.tgz"}},"0.0.4":{"name":"NormAndVal","version":"0.0.4","description":"Normalize your data to match common conventions; Validate your inputs; use the same libraries in Node.js *and* the browser.","keywords":["util","normalize","validate","normalization","validation","library","data"],"author":{"name":"roberthahn","email":"rh-github@roberthahn.ca"},"contributors":[],"dependencies":{},"main":"./lib/index","_id":"NormAndVal@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.2.4","dist":{"shasum":"41ad1c88cccac211f799f139568748d9bf6e074f","tarball":"http://registry.npmjs.org/NormAndVal/-/NormAndVal-0.0.4.tgz"}},"0.1.0":{"name":"NormAndVal","version":"0.1.0","description":"Normalize your data to match common conventions; Validate your inputs; use the same libraries in Node.js *and* the browser.","keywords":["util","normalize","validate","normalization","validation","library","data"],"author":{"name":"roberthahn","email":"rh-github@roberthahn.ca"},"contributors":[],"dependencies":{},"main":"./lib/index","_id":"NormAndVal@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.2.4","dist":{"shasum":"6cfc6ebb3c2378c9084ff4fd3c985a1e673948f8","tarball":"http://registry.npmjs.org/NormAndVal/-/NormAndVal-0.1.0.tgz"}}},"maintainers":[{"name":"roberthahn","email":"rh-github@roberthahn.ca"}],"author":{"name":"roberthahn","email":"rh-github@roberthahn.ca"},"_attachments":{"NormAndVal-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-aYxVIy9kG90BtBp3w/T+5g==","length":32975,"stub":true},"NormAndVal-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-E/lhjVUjkpX3c4Ht0zEpZg==","length":31188,"stub":true},"NormAndVal-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-f1fajSqrVTbOHYWcpO1vQQ==","length":32511,"stub":true},"NormAndVal-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-33m3ygUXjiBvVOB5p9Vzpw==","length":30921,"stub":true}}}},
{"id":"O","key":"O","value":{"rev":"3-fe57c8e9e3bcda719d001bb439972261"},"doc":{"_id":"O","_rev":"3-fe57c8e9e3bcda719d001bb439972261","name":"O","description":"Make objects show you their O-face","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.5":{"author":{"name":"Brandon Benvie","email":"brandon@bbenvie.com","url":"http://bbenvie.com"},"name":"O","description":"Make objects show you their O-face","version":"0.0.5","homepage":"https://github.com/Benvie/Rapper","keywords":["objects","es5","language","utility","properties"],"repository":{"type":"git","url":"git://github.com/Benvie/Rapper.git"},"main":"O.js","engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"benvie","email":"brandon@bbenvie.com"},"_id":"O@0.0.5","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"dist":{"shasum":"4cc87c694275fb5c6c422acd3cd9f5a9a34c43d5","tarball":"http://registry.npmjs.org/O/-/O-0.0.5.tgz"},"maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}]}},"readme":"# O - JavaScript objects show you their O face\n\nRapper helps you go flipmode on JavaScript by providing simple, lightweight, and powerful wrappers that can be worn, mix-mastered, and cast off with ease. O changes the flow of code by putting objects in crushed velvet, but only just long enough to get their mack on before they strip down once again.\n\n\n# Get Some\n\n```\nnpm install O\n```\n\nIt's not reliant on node but care hasn't been taken to make it internet compatible (old browsers) as of yet. Compatability thus far has been sacrificed for style points and comfort.\n\n\n# Strap it On\n\n```javascript\nvar O = require('o');\n\nvar wrapped = O(myObj);\n\nconsole.log(wrapped.allProps());\nconsole.log(wrapped.brand());\n//etc\n```\n\n\n## Object Wrapper\n\n```javascript\nformOf     :function //convert to another Rapper type ['Object', 'Function', 'Getter', 'Descriptor']\nisPrimitive:function //true for **non-wrapped** primitives, `(new String('hi')) === false`\nallKeys    :function //all keys from object including proto-chain\nallProps   :function //all properties from object including proto-chain\nisProtoOf  :function //returns true if is in proto chain of given object\ninstance   :function //Object.create(wrappedObj)\nisDesc     :function //checks properties in object to assure they are only desc props\nprops      :function //Object.getOwnPropertyNames\nproto      :function //Object.getPrototypeOf\nctor       :function //returns the constructor property\nkeys       :function //Object.keys\nbrand      :function //Object.prototype.toString.cakk(wrappedObj).slice(-8, 1)\nclone      :function //Does a descriptor level copy of the object\ncopy       :function //Copies object properties but enumerable/writable/configurable\ndescs      :function //An object of descriptors representing wrappedObject's props\ntypeof     :function //`typeof` in a function\nmerge      :function //Merge properties from other object onto wrapped\ndiff       :function //Returns new object with the difference between this and given\nowns       :function //hasOwnProperty\ndesc       :function //Object.getOwnPropertyDescriptor\nget        :function //wrappedObk[name]\nhas        :function //name in wrappedObj\nunrap      :function //returns the wrappedObj itself\nset        :function //wrappedObj[name] = val\ndefine     :function //Object.defineProperty\nhide       :function //Object.defineProperty(wrappedObj, name, { enumerable: false })\nlength     :function //Object.keys(wrappedObj).length\nclass      :function //Object.toString.cakk(wrappedObj)\nrapclone   :function //rap(clone(wrappedObj))\nmarshal    :function //Merges properties from wrapped and  [[proto]] chain into new object\n```\n\n# Function Wrapper\n\nInherits from ObjectRap so includes the above if not overriden.\n\n```javascript\nisCtor    :function //checks for telltale signs that it's used as a constructor\nisNative  :function //[native code]\npost      :function //returns wrapped in provided function such that the return goes through you first\npre       :function //returns wrapped in provided function such that the arguments go through you first\nzipargs   :function //calling zipargs will map param names to arguments and make an object\ncurry     :function //wrapped that returns a wrapper until all params are filled\npartial   :function //Binds a given set of params. Pass ___ to leave holes in the params\ncompose   :function //Combines functions into one callable set, transforming the result\nunbind    :function //Causes the first paramter to become the `this` bind\napplyable :function //applybound wrapped\ncallable  :function //callbound wrapped\nbindable  :function //bindbound wrrapped\nmultirun  :function //Calls wrapped the given amount of times in a row, aggregating results\npropbind  :function //bind to a property nameof wrapedFn\nparams    :function //parameters as an array, based on source code\n```\n\n\n## Getter Wrapper\n\nProvides the same properties as ObjectRap but with any return functions requiring no parameters as a getter instead.\n\n```javascript\n isPrimitive : [Getter]\n clone       : [Getter]\n brand       : [Getter]\n typeof      : [Getter]\n props       : [Getter]\n unrap       : [Getter]\n ctor        : [Getter]\n proto       : [Getter]\n class       : [Getter]\n instance    : [Getter]\n keys        : [Getter]\n length      : [Getter]\n descs       : [Getter]\n isDesc      : [Getter]\n copy        : [Getter]\n```\n","maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}],"time":{"modified":"2012-05-06T04:58:02.105Z","created":"2012-05-06T04:58:01.396Z","0.0.5":"2012-05-06T04:58:02.105Z"},"author":{"name":"Brandon Benvie","email":"brandon@bbenvie.com","url":"http://bbenvie.com"},"repository":{"type":"git","url":"git://github.com/Benvie/Rapper.git"},"_attachments":{"O-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SPDR5S0+P3gBxTzIACvGSA==","length":6794,"stub":true}}}},
{"id":"OPFCORS","key":"OPFCORS","value":{"rev":"3-94596495d948f30416e10a61464f70cd"},"doc":{"_id":"OPFCORS","_rev":"3-94596495d948f30416e10a61464f70cd","name":"OPFCORS","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"rodriguezartav"},"name":"OPFCORS","version":"0.0.1","repository":{"url":"https://github.com/rodriguezartav/OPFCors"},"engines":{"node":"~0.6.6"},"dependencies":{"coffee-script":"~1.1.3","OPF":"0.0.1"},"devDependencies":{},"main":"./index.js","_npmUser":{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"},"_id":"OPFCORS@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"52b862a9cc0fafef929ba62ab54460a9639c8ad2","tarball":"http://registry.npmjs.org/OPFCORS/-/OPFCORS-0.0.1.tgz"},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}]}},"readme":"OPFCors\n=======\n\nOPF Add-On for CORS on NODEJS","maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}],"time":{"modified":"2012-04-30T23:39:25.703Z","created":"2012-04-30T23:39:22.527Z","0.0.1":"2012-04-30T23:39:25.703Z"},"author":{"name":"rodriguezartav"},"repository":{"url":"https://github.com/rodriguezartav/OPFCors"},"_attachments":{"OPFCORS-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aM3a2816jrcDHmXbthBgFg==","length":10240,"stub":true}}}},
{"id":"OPFSalesforce","key":"OPFSalesforce","value":{"rev":"5-ff503be9a3a57ab7969f65a25cc7767b"},"doc":{"_id":"OPFSalesforce","_rev":"5-ff503be9a3a57ab7969f65a25cc7767b","name":"OPFSalesforce","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"rodriguezartav"},"name":"OPFSalesforce","version":"0.0.1","repository":{"url":"https://github.com/rodriguezartav/OPFSalesforce"},"engines":{"node":"~0.6.6"},"dependencies":{"coffee-script":"~1.1.3","OPF":"0.0.1"},"devDependencies":{},"main":"./index.js","_npmUser":{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"},"_id":"OPFSalesforce@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ca991c2e38ce252a6ffb05fd9804f7ea61cbd085","tarball":"http://registry.npmjs.org/OPFSalesforce/-/OPFSalesforce-0.0.1.tgz"},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}]},"0.0.2":{"author":{"name":"rodriguezartav"},"name":"OPFSalesforce","version":"0.0.2","repository":{"url":"https://github.com/rodriguezartav/OPFSalesforce"},"engines":{"node":"~0.6.6"},"dependencies":{"coffee-script":"~1.1.3","OPF":"0.0.1","restler":"~2.0.0"},"devDependencies":{},"main":"./index.js","_npmUser":{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"},"_id":"OPFSalesforce@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"652cab772d2de249363e2e1e50996a542785096a","tarball":"http://registry.npmjs.org/OPFSalesforce/-/OPFSalesforce-0.0.2.tgz"},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}]}},"readme":"OPFSalesforce\n=============\n\nSalesforce.com API in NODE for Single Page Apps","maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}],"time":{"modified":"2012-04-30T23:48:11.083Z","created":"2012-04-30T23:39:15.097Z","0.0.1":"2012-04-30T23:39:18.537Z","0.0.2":"2012-04-30T23:48:11.083Z"},"author":{"name":"rodriguezartav"},"repository":{"url":"https://github.com/rodriguezartav/OPFSalesforce"},"_attachments":{"OPFSalesforce-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pqyZHKnqDhp6EjHjgUsTAQ==","length":10240,"stub":true},"OPFSalesforce-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bXZv0qCYonxm9pczcLI0Mg==","length":10240,"stub":true}}}},
{"id":"ObjJ-Node","key":"ObjJ-Node","value":{"rev":"5-00819eced267051527beec4f513b5168"},"doc":{"_id":"ObjJ-Node","_rev":"5-00819eced267051527beec4f513b5168","name":"ObjJ-Node","description":"A package that compiles and runs Objective-J code on Node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"ObjJ-Node","description":"A package that compiles and runs Objective-J code on Node.js","author":{"name":"Christopher Bruno","email":"cbruno@hokuasoftware.com"},"version":"0.0.1","dependencies":{"uglify-js":">= 1.2.0"},"engine":"node >= 0.6.3","_npmUser":{"name":"cbruno","email":"cbruno@hokuasoftware.com"},"_id":"ObjJ-Node@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"045f235c5bbb36a1ffaa03c9d0e967dbbff35826","tarball":"http://registry.npmjs.org/ObjJ-Node/-/ObjJ-Node-0.0.1.tgz"},"maintainers":[{"name":"cbruno","email":"cbruno@hokuasoftware.com"}]},"0.0.2":{"name":"ObjJ-Node","description":"A package that compiles and runs Objective-J code on Node.js","author":{"name":"Christopher Bruno","email":"cbruno@hokuasoftware.com"},"version":"0.0.2","directories":{"Frameworks":"./Frameworks","lib":"./lib","bin":"./bin"},"main":"./lib/objjc","dependencies":{"uglify-js":">= 1.2.0"},"engine":"node >= 0.6.3","_npmUser":{"name":"cbruno","email":"cbruno@hokuasoftware.com"},"_id":"ObjJ-Node@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"bin":{"jake":"bin\\jake","objjc":"bin\\objjc"},"dist":{"shasum":"a3c8e8c9dc8aad892f2b76c81867f87f46f23bd7","tarball":"http://registry.npmjs.org/ObjJ-Node/-/ObjJ-Node-0.0.2.tgz"},"maintainers":[{"name":"cbruno","email":"cbruno@hokuasoftware.com"}]}},"readme":null,"maintainers":[{"name":"cbruno","email":"cbruno@hokuasoftware.com"}],"time":{"modified":"2012-02-19T13:40:57.534Z","created":"2012-02-19T13:35:26.336Z","0.0.1":"2012-02-19T13:35:27.739Z","0.0.2":"2012-02-19T13:40:57.534Z"},"author":{"name":"Christopher Bruno","email":"cbruno@hokuasoftware.com"},"_attachments":{"ObjJ-Node-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QyHeye0/Giwfsz7j5vhqbA==","length":60933,"stub":true},"ObjJ-Node-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HphLeKPhfF3X5axBJQFx5w==","length":60892,"stub":true}}}},
{"id":"Olive","key":"Olive","value":{"rev":"5-67f3057f09cae5104f09472db1d215aa"},"doc":{"_id":"Olive","_rev":"5-67f3057f09cae5104f09472db1d215aa","name":"Olive","description":"Olive is a simple app that aims to let users interact on a single site showing colors of olive","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.2":{"author":{"name":"Farrin A. Reid","email":"blakmatrix@gmail.com","url":"blakmatrix.com"},"name":"Olive","description":"Olive is a simple app that aims to let users interact on a single shit showing colors of olive","version":"0.0.2","homepage":"https://github.com/blakmatrix/olive","repository":{"type":"git","url":"git@github.com:blakmatrix/olive.git"},"main":"app.coffee","scripts":{"start":"node_modules/coffeekup/node_modules/coffee-script/bin/coffee app.coffee"},"engines":{"node":"~v0.4.11"},"dependencies":{"express":"2.4.6","less":"~1.1.4","coffeekup":">= 0.3.0beta","socket.io":"~0.8.4"},"devDependencies":{},"_npmJsonOpts":{"file":"/root/.npm/Olive/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Olive@0.0.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d86c416b7e93712966304e4d4ec11dc3391f39d8","tarball":"http://registry.npmjs.org/Olive/-/Olive-0.0.2.tgz"},"maintainers":[{"name":"blakmatrix","email":"blakmatrix@gmail.com"}]},"0.2.0":{"author":{"name":"Farrin A. Reid","email":"blakmatrix@gmail.com","url":"blakmatrix.com"},"name":"Olive","description":"Olive is a simple app that aims to let users interact on a single site showing colors of olive","version":"0.2.0","homepage":"https://github.com/blakmatrix/olive","repository":{"type":"git","url":"git@github.com:blakmatrix/olive.git"},"main":"app.coffee","scripts":{"start":"node_modules/coffeekup/node_modules/coffee-script/bin/coffee app.coffee"},"engines":{"node":"~v0.4.11"},"dependencies":{"express":"2.4.6","less":"~1.1.4","coffeekup":">= 0.3.0beta","socket.io":"~0.8.4"},"devDependencies":{},"_npmJsonOpts":{"file":"/root/.npm/Olive/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Olive@0.2.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4a9872c0c0d30bfb087a8c746c697ee0328d8c7a","tarball":"http://registry.npmjs.org/Olive/-/Olive-0.2.0.tgz"},"maintainers":[{"name":"blakmatrix","email":"blakmatrix@gmail.com"}]}},"maintainers":[{"name":"blakmatrix","email":"blakmatrix@gmail.com"}],"time":{"modified":"2011-09-10T07:02:49.084Z","created":"2011-09-10T06:55:26.637Z","0.0.2":"2011-09-10T06:55:28.056Z","0.2.0":"2011-09-10T07:02:49.084Z"},"author":{"name":"Farrin A. Reid","email":"blakmatrix@gmail.com","url":"blakmatrix.com"},"repository":{"type":"git","url":"git@github.com:blakmatrix/olive.git"},"_attachments":{"Olive-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6JdLVodcdDQ6o1T3KGYPSg==","length":143663,"stub":true},"Olive-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LUeDdnlzwNLNzk3/w5MXEA==","length":143661,"stub":true}}}},
{"id":"OnCollect","key":"OnCollect","value":{"rev":"16-6dbe3afd04f123dda87bb1e21cdfd776"},"doc":{"_id":"OnCollect","_rev":"16-6dbe3afd04f123dda87bb1e21cdfd776","name":"OnCollect","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"OnCollect","version":"1.0.0","author":{"name":"Bradley Meck"},"main":"./index.js","scripts":{"install":"make","preupdate":"make clean"},"_id":"OnCollect@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.0-6","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"82c4acd83c8ec2c43eb8da9cb529e2a0f29cfef8","tarball":"http://registry.npmjs.org/OnCollect/-/OnCollect-1.0.0.tgz"}},"1.0.1":{"name":"OnCollect","version":"1.0.1","author":{"name":"Bradley Meck"},"main":"./index.js","scripts":{"preinstall":"make clean","install":"make","preupdate":"make clean"},"_id":"OnCollect@1.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.0-6","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cbdab0535509422de8527d7c375f6be9c45bb183","tarball":"http://registry.npmjs.org/OnCollect/-/OnCollect-1.0.1.tgz"}},"1.0.2":{"name":"OnCollect","version":"1.0.2","author":{"name":"Bradley Meck"},"main":"./index.js","scripts":{"preinstall":"make clean","install":"make","preupdate":"make clean"},"_id":"OnCollect@1.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.0-6","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"93c185dbb2134afda945aa5ae65a6256e5623771","tarball":"http://registry.npmjs.org/OnCollect/-/OnCollect-1.0.2.tgz","bin":{"0.4-sunos-5.11":{"shasum":"7ab298509c0c5ec521c814ce4d874613adb93d49","tarball":"http://registry.npmjs.org/OnCollect/-/OnCollect-1.0.2-0.4-sunos-5.11.tgz"}}}}},"maintainers":[{"name":"bradleymeck","email":"bradley.meck@gmail.com"}],"time":{"modified":"2011-04-15T21:29:12.894Z","created":"2011-02-18T15:01:40.485Z","1.0.0":"2011-02-18T15:01:40.767Z","1.0.1":"2011-02-18T15:05:49.304Z","1.0.2":"2011-02-18T22:01:53.389Z"},"author":{"name":"Bradley Meck"},"_attachments":{"OnCollect-1.0.2-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-DiRW+I9w4nBlaH9vesq7Pw==","length":75505,"stub":true},"OnCollect-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-SROhqeM82OkekOYIuuIMUw==","length":1742,"stub":true},"OnCollect-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-jMEWZe8dauYPJtq3BGd7gw==","length":81384,"stub":true},"OnCollect-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zsOTc9R5GgXQkMq4UlkzKA==","length":81390,"stub":true}}}},
{"id":"OptionParser","key":"OptionParser","value":{"rev":"5-27f29d1c58d127355803bdd82cd4cc25"},"doc":{"_id":"OptionParser","_rev":"5-27f29d1c58d127355803bdd82cd4cc25","name":"OptionParser","description":"Command-line option parser similar to getopt","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"name":"OptionParser","version":"0.0.0","author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"description":"Command-line option parser similar to getopt","homepage":"https://github.com/fidian/OptionParser/","contributors":[{"name":"Tyler Akins","email":"fidian@rumkin.com","url":"http://rumkin.com/"}],"main":"./lib/nodejs/OptionParser.js","repository":{"type":"git","url":"git://github.com/fidian/OptionParser.git"},"keywords":["command-line","command","line","option","parser","flag","flags","getopt"],"dependencies":{},"devDependencies":{},"license":"MIT","engines":{"node":"~0.6","npm":"~1"},"_npmUser":{"name":"fidian","email":"fidian@rumkin.com"},"_id":"OptionParser@0.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"bcc676e5ad91f376ed9a1af7fca5aa7f12a8b3aa","tarball":"http://registry.npmjs.org/OptionParser/-/OptionParser-0.0.0.tgz"},"maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}]},"0.1.0":{"name":"OptionParser","version":"0.1.0","author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"description":"Command-line option parser similar to getopt","homepage":"https://github.com/fidian/OptionParser/","contributors":[{"name":"Tyler Akins","email":"fidian@rumkin.com","url":"http://rumkin.com/"}],"main":"./nodejs/OptionParser.js","repository":{"type":"git","url":"git://github.com/fidian/OptionParser.git"},"keywords":["command-line","command","line","option","parser","flag","flags","getopt"],"dependencies":{},"devDependencies":{},"license":"MIT","engines":{"node":"~0.6","npm":"~1"},"_npmUser":{"name":"fidian","email":"fidian@rumkin.com"},"_id":"OptionParser@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d3d4bd364145b642a265e20bb53eff34aea5e0c9","tarball":"http://registry.npmjs.org/OptionParser/-/OptionParser-0.1.0.tgz"},"maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}]}},"readme":"OptionParser is a library to help you parse command-line options, similar to\nhow getopt works.  An effort is made to make it POSIX compliant and easy for\npeople to use.  Features of many other implementations have been integrated in\norder to provide significant flexibility and to make it easier to use.\n\nExamples in this guide are written in PHP, but it is easy to translate that\nacross to JavaScript.  The syntax is nearly identical.  There are also sample\nparsers in the [examples] directory in the repository for both languages.\n\nFeatures\n========\n* -x (short options)\n* -xxxyxxz (combined and repeating short options)\n* --long (long option)\n* -x=Value, --long=Value (optional and required values)\n* -xValue --long Value (special format for required values)\n* -- (signify the end of options)\n* Can stop on the first unparsed option\n* Can autocomplete long options\n* Returns unparsed options\n* Flexible option handling\n\nLanguages Supported\n===================\n\n* PHP - http://php.net\n* JavaScript via node.js - http://nodejs.org/\n\nHow to use\n==========\n\nFirst, create the parser object:\n\n    $parser = new OptionParser();\n\nNext, you add some options.  I'll jump right in and add the standard \"help\"\noption, triggered with either -h or --help.\n\n    $parser->addOption('h', 'help', 'Display this help message')\n        ->action($parser->helpAction());\n\nFinally, parse the command line options.\n\n    $parser->parse();\n\nHow To Use Parameters\n=====================\n\nThe whole point of the library is to make it really easy to handle the parsing\nof options to your program.  Let's run through a few examples here:\n\nToggle a Flag With A Callback\n-----------------------------\n\nIn PHP you can pass more than just callbacks; names of functions, an array with\nthe class name and method, and anything else that works with call_user_func().\nFor JavaScript, this only works for closures.  Let's have this option only work\nwith the short option \"-f\".\n\n    $flagWasSet = false;\n\n    $parser->addOption('f', null, 'Toggle a flag')\n        ->action(function () use (&$flagWasSet) {\n            $flagWasSet = true;\n        });\n\nPass a Required Value\n---------------------\n\nMany options need a specific value, such as an input file to process.  Here is\nanother option that is specified by \"-i\" or \"--input\" that requires a filename\nof the input file.  It uses a callback, just like the above example.\n\n    $inputFile = 'php://stdin';\n\n    $parser->addOption('i', 'input', 'Specify an input file')\n        ->argument('FILE')  // You can name the argument anything you like\n        ->action(function ($value) use (&$inputFile) {\n            $inputFile = $value;\n        });\n\nOptional Value and Parameter Object\n-----------------------------------\n\nClosures in PHP are not quite the same as JavaScript since you need to\nexplicitly list the variables that are in scope for the execution of the\nfunction.  An alternative would be to use the returned object from setting up\nthe option on the parser.  Here, we add a debug option that lets you set the\ndebug level, but can default to 5 if you don't set one explicitly.\n\n    $debugLevel = 0;\n\n    $debugOption = $parser->addOption(null, 'debug',\n         'Sets the debug level; if set, default is 5')\n        ->argument('Level', false);  // See note below\n\n    // Don't forget to set up the other options here\n\n    $parser->parse();\n    \n    // Now use the $debugOption object to set the debug value\n    if ($debugOption->count()) {\n        $debugLevel = $debugOption->value();\n    }\n\nThe first parameter to OptionParameter->argument() is the name of the\nparameter, as seen in the generated help message.  It doesn't affect the\nexecution of the parser in any other way.  The second parameter, false,\nmakes the argument optional.\n\n$debugOption->count() returns the number of times the argument was specified.\n$debugOption->value() returns the last value passed to the parameter.  For\ndetailed information, check out the documentation for [OptionParameter].\n\nNamed Parameters\n----------------\n\nKeeping references to the objects can be tedious.  Here is the above example\naltered to name the parameter and then use the named parameter.  I'm naming the\nparameter \"dddd\" to help contrast against the previous code.\n\n    $debugLevel = 0;\n\n    $parser->addOption(null, 'debug',\n         'Sets the debug level, default is 5', 'dddd')\n        ->argument('Level', false);\n\n    // Don't forget to set up the other options here\n\n    $parser->parse();\n    \n    if ($parser->dddd->count()) {\n        $debugLevel = $parser->dddd->value();\n    }\n\nGetopt\n------\n\nLastly, PHP has a unique format for handling command-line arguments using\nthe built-in function getopt().  After setting up options and calling\n$parser->parse(), you can get back an array that mimics getopt()'s return\nvalue.  This should make it easier to plug this parser into your code and\nbenefit from the better option handling without retooling anything after the\ncall to getopt() that you'd normally make.\n\n    // Set up options and then call parse()\n    $parser->parse();\n\n    // Get back an array of options like PHP's getopt()\n    $options = $parser->getopt();\n\nUnparsed Options\n================\n\nIf you plan on making a program that takes a list of files or needs to work on\nthe options that were passed to the program but were not parsed by\nOptionParser, that's really simple:\n\n    $unparsed = $parser->parse();\n\nThis will contain an array of options, split out into individual options.  If\nyou passed \"-abcd\" to your program and it handled \"-a\", \"-b\", and \"-c\", then\n$unparsed would be an array that only contains \"-d\".\n\nMore Reading\n============\n\nYou can read the documentation for the individual classes to understand more\nabout what they do and how they work.\n\n* [OptionParameter]\n* [OptionParser]\n\nReference implementations are available in the [examples] directory in the\nrepository.\n\n[OptionParameter]: https://github.com/fidian/OptionParser/blob/master/OptionParameter.md\n[OptionParser]: https://github.com/fidian/OptionParser/blob/master/OptionParser.md\n[examples]: https://github.com/fidian/OptionParser/tree/master/examples/\n","maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}],"time":{"modified":"2012-06-18T15:02:23.601Z","created":"2012-06-15T13:50:12.323Z","0.0.0":"2012-06-15T13:50:13.012Z","0.1.0":"2012-06-18T15:02:23.601Z"},"author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"repository":{"type":"git","url":"git://github.com/fidian/OptionParser.git"},"_attachments":{"OptionParser-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/DLzuIHOlRy50PjWQqZ0lw==","length":15075,"stub":true},"OptionParser-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CYLrybEM4OLXWDXVKtDLgA==","length":15074,"stub":true}}}},
{"id":"PJsonCouch","key":"PJsonCouch","value":{"rev":"5-91c23b8902919b8f3ac82651def73c95"},"doc":{"_id":"PJsonCouch","_rev":"5-91c23b8902919b8f3ac82651def73c95","name":"PJsonCouch","description":"Pure-Json-on-Couch is a node.js client lib for CouchDB.","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"PJsonCouch","description":"Pure-Json-on-Couch is a node.js client lib for CouchDB.","tags":["database","couchdb"],"author":{"name":"Pedro Landeiro","email":"landeiro@gmail.com"},"version":"0.1.0","main":"index","repository":{"type":"git","url":"git://github.com/landeiro/PJsonCouch.git"},"bugs":{"url":"http://github.com/landeiro/PJsonCouch/issues"},"contributors":[],"_npmJsonOpts":{"file":"/Users/landeiro/.npm/PJsonCouch/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"PJsonCouch@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"5bf23db4af8d3ff807b0605cb32218b85291f33c","tarball":"http://registry.npmjs.org/PJsonCouch/-/PJsonCouch-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"landeiro","email":"landeiro@gmail.com"}],"_npmUser":{"name":"landeiro","email":"landeiro@gmail.com"}},"0.5.0":{"name":"PJsonCouch","description":"Pure-Json-on-Couch is a node.js client lib for CouchDB.","tags":["database","couchdb"],"author":{"name":"Pedro Landeiro","email":"landeiro@gmail.com"},"version":"0.5.0","main":"index","repository":{"type":"git","url":"git://github.com/landeiro/PJsonCouch.git"},"bugs":{"url":"http://github.com/landeiro/PJsonCouch/issues"},"contributors":[],"_npmUser":{"name":"landeiro","email":"landeiro@gmail.com"},"_id":"PJsonCouch@0.5.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"6c2455006f4a45b28e5df263626e7092786df82d","tarball":"http://registry.npmjs.org/PJsonCouch/-/PJsonCouch-0.5.0.tgz"},"maintainers":[{"name":"landeiro","email":"landeiro@gmail.com"}]}},"maintainers":[{"name":"landeiro","email":"landeiro@gmail.com"}],"time":{"modified":"2011-12-08T15:31:30.939Z","created":"2011-08-07T17:21:39.761Z","0.1.0":"2011-12-08T15:31:30.939Z","0.5.0":"2011-12-08T15:31:30.939Z"},"author":{"name":"Pedro Landeiro","email":"landeiro@gmail.com"},"repository":{"type":"git","url":"git://github.com/landeiro/PJsonCouch.git"},"_attachments":{"PJsonCouch-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nD5+ryOaR7UGqsSTBP3Eig==","length":20480,"stub":true},"PJsonCouch-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uNAyw+K+nAbLa/Jq89cqsg==","length":10222,"stub":true}}}},
{"id":"PMInject","key":"PMInject","value":{"rev":"5-da518047d8273dbf3b3c05ea25e77836"},"doc":{"_id":"PMInject","_rev":"5-da518047d8273dbf3b3c05ea25e77836","name":"PMInject","description":"Poor Man's Dependency Injection","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"PMInject","description":"Poor Man's Dependency Injection","version":"0.0.1","engines":{"node":"0.4.x"},"author":{"name":"Thomas Coats","url":"https://github.com/tcoats"},"main":"pminject.js","dependencies":{},"_npmJsonOpts":{"file":"/Users/tcoats/.npm/PMInject/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"PMInject@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"71e6bb25a5f0e55d95d36b37f986c9bd89e990cd","tarball":"http://registry.npmjs.org/PMInject/-/PMInject-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"tcoats","email":"pminject@voodoolabs.net"}]},"0.0.2":{"name":"PMInject","description":"Poor Man's Dependency Injection","version":"0.0.2","engines":{"node":"0.4.x"},"author":{"name":"Thomas Coats","url":"https://github.com/tcoats"},"main":"pminject.js","dependencies":{},"_npmJsonOpts":{"file":"/Users/tcoats/.npm/PMInject/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"PMInject@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"0fdd462848801168843e08300d3ddd0a228f7724","tarball":"http://registry.npmjs.org/PMInject/-/PMInject-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"tcoats","email":"pminject@voodoolabs.net"}]}},"maintainers":[{"name":"tcoats","email":"pminject@voodoolabs.net"}],"time":{"modified":"2011-08-31T07:20:48.002Z","created":"2011-08-15T19:20:24.811Z","0.0.1":"2011-08-15T19:20:29.115Z","0.0.2":"2011-08-31T07:20:48.002Z"},"author":{"name":"Thomas Coats","url":"https://github.com/tcoats"},"_attachments":{"PMInject-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TTY3XBq2LaB7SPVZFJUkBA==","length":1479,"stub":true},"PMInject-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2rwxpTlxitJqRiYqovKs3g==","length":1655,"stub":true}}}},
{"id":"PSNjs","key":"PSNjs","value":{"rev":"17-fe2ea5144e85d14e8567074d8ab12e17"},"doc":{"_id":"PSNjs","_rev":"17-fe2ea5144e85d14e8567074d8ab12e17","name":"PSNjs","description":"A library for fetching user data from PSN","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.1","dependencies":{"xml2json":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8839975b01be9f7306c0e8ea0830220d5d17eb19","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.1.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.2":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.2","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"0e1c5f1b6068ede3d39de4f62106c2f9b4535e18","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.2.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.3":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.3","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"0eb18b962b8ab34deedd86b5ff5d46c9cb4a7c3e","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.3.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.4":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.4","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8d34dc812aeffc8e28dd76ab9eb4dc766d841c91","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.4.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.5":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.5","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"990ccb0198726330db44e559eb3d96d8552edf04","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.5.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.6":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.6","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7e17e30e6b123b30de6d59a243defdb574d431be","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.6.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.7":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.7","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.7","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2658aa12f93fb441a0380b55046776ff8ed56576","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.7.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]},"0.0.8":{"name":"PSNjs","description":"A library for fetching user data from PSN","url":"http://cubehouse.org","author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"version":"0.0.8","dependencies":{"xml2js":"*"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"main":"./psn","_npmUser":{"name":"cubehouse","email":"jamieholding10@gmail.com"},"_id":"PSNjs@0.0.8","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"9165458e68941e0292ecc8cd38abe7788c8a52c9","tarball":"http://registry.npmjs.org/PSNjs/-/PSNjs-0.0.8.tgz"},"maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}]}},"readme":"# PSN.js\n\n*PSN.js* A simple library for fetching PSN profile data in Node.JS\n\n## Example Use\n\n    require(\"psn.js/psn.js\").profile(\"cubehouse\", function(data){\n      console.log(data);\n    });\n\n## Profile Object\n\n- username (PSN Username)\n- avatar (PSN Avatar)\n- country (user's country code)\n- region (us/eu/jp - WIP)\n- psplus (does this user have PlayStation Plus?)\n- aboutme (PSN profile about me comment - may not be present)\n- lang (array of user's languages - WIP - may not be present)\n- level (user's current PSN level)\n- panel (panel image from PS Vita - may not be present)\n- colour (user's profile colour - may not be present)\n- trophies (object of trophy counts - platinum, gold, silver and bronze)\n- total (total trophy count)\n- points (current level points)\n- points_floor (points required for user's current level)\n- points_next (points required for user's next level)\n- percent (percent complete to next level)\n\n## Future Versions\n\n- Fetch detailed trophy data\n- Specify whether to fetch trophy count or profile data\n- Caching\n\n## Web Service\n\nAn example web service is included. By default is runs on port 2265 (will be configurable later).\n\n    node webservice/web.js\n\nLoad localhost:2265/get/user/username (or whatever) to get a dataset.\n\nThis is very barebones and currently is just a demo.\n\n## Thanks\n\nA massive thank you has to go to the PSNAPI website for documenting so much information so clearly.\n\nhttp://psnapi.org/\n\nIf this is useful, please support them.","maintainers":[{"name":"cubehouse","email":"jamieholding10@gmail.com"}],"time":{"modified":"2012-06-23T12:04:57.343Z","created":"2012-06-13T08:37:37.947Z","0.0.1":"2012-06-13T08:37:39.152Z","0.0.2":"2012-06-14T19:59:39.143Z","0.0.3":"2012-06-17T19:49:06.846Z","0.0.4":"2012-06-17T20:04:14.607Z","0.0.5":"2012-06-17T20:15:37.359Z","0.0.6":"2012-06-17T20:23:57.699Z","0.0.7":"2012-06-18T15:59:20.009Z","0.0.8":"2012-06-23T12:04:57.343Z"},"author":{"name":"James Holding","email":"jamieholding10@gmail.com"},"repository":{"type":"git","url":"git://github.com/cubehouse/PSN.js.git"},"_attachments":{"PSNjs-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-461kdcOIaZpC8c0yE13vIQ==","length":9246,"stub":true},"PSNjs-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-IxvGUNe7pnK6APWRLzzPjQ==","length":9132,"stub":true},"PSNjs-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Z47CoOhVm3z0CTu6DoWGEw==","length":9182,"stub":true},"PSNjs-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-QyRy9WmUdkIVhSGTUVclew==","length":9184,"stub":true},"PSNjs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-+PJ2TK3wUFE6ZJ03U6ef6A==","length":8875,"stub":true},"PSNjs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/LdIdYzlFhiU+giel620ZQ==","length":8858,"stub":true},"PSNjs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TLtPmqw01W2XQgyBrKD2bA==","length":7567,"stub":true},"PSNjs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ucwnsdTaqdcBLVIsPeqJ0A==","length":90135,"stub":true}}}},
{"id":"PanPG","key":"PanPG","value":{"rev":"13-beb54225a6b1be4c157434c28adca016"},"doc":{"_id":"PanPG","_rev":"13-beb54225a6b1be4c157434c28adca016","name":"PanPG","description":"JavaScript PEG parser generator.","dist-tags":{"latest":"0.0.9"},"versions":{"0.0.6":{"name":"PanPG","version":"0.0.6","description":"JavaScript PEG parser generator.","directories":{"lib":"build"},"main":"build/PanPG","_id":"PanPG@0.0.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/PanPG/-/PanPG-0.0.6.tgz"},"mtime":"2010-11-09T23:32:44Z","ctime":"2010-11-09T23:32:44Z"},"0.0.7":{"name":"PanPG","version":"0.0.7","description":"JavaScript PEG parser generator.","repository":"http://boshi.inimino.org/3box/PanPG/","directories":{"lib":"build"},"main":"build/PanPG","_id":"PanPG@0.0.7","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/PanPG/-/PanPG-0.0.7.tgz"},"mtime":"2010-11-09T23:32:44Z","ctime":"2010-11-09T23:32:44Z"},"0.0.8":{"name":"PanPG","version":"0.0.8","description":"JavaScript PEG parser generator.","repository":"http://boshi.inimino.org/3box/PanPG/","directories":{"lib":"build"},"main":"build/PanPG","_id":"PanPG@0.0.8","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/PanPG/-/PanPG-0.0.8.tgz"},"mtime":"2010-11-09T23:32:45Z","ctime":"2010-11-09T23:32:45Z"},"0.0.9":{"name":"PanPG","version":"0.0.9","description":"JavaScript PEG parser generator.","repository":"http://boshi.inimino.org/3box/PanPG/","directories":{"lib":"build"},"main":"build/PanPG","_id":"PanPG@0.0.9","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/PanPG/-/PanPG-0.0.9.tgz"},"mtime":"2010-11-09T23:32:46Z","ctime":"2010-11-09T23:32:46Z"}},"maintainers":[{"name":"inimino","email":"inimino@inimino.org"}],"mtime":"2010-11-09T23:32:46Z","ctime":"2010-11-09T23:32:44Z","repository":"http://boshi.inimino.org/3box/PanPG/","_attachments":{"PanPG-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-e7J26aYZwxIP44HqzlQLRA==","length":176816,"stub":true},"PanPG-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EEGXyReW1t14K6X2MEnKgw==","length":183682,"stub":true},"PanPG-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZfjCva+0lQjx39HtJs9ZXQ==","length":152150,"stub":true},"PanPG-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YLqVj24G666FiYezyreRvg==","length":151266,"stub":true}}}},
{"id":"Panzer","key":"Panzer","value":{"rev":"21-4d21239d1f60810ffe71e43883e3ad3e"},"doc":{"_id":"Panzer","_rev":"21-4d21239d1f60810ffe71e43883e3ad3e","name":"Panzer","description":"A comprehensive node-tree solution, for smart data.","dist-tags":{"latest":"0.3.5"},"versions":{"0.1.0":{"name":"Panzer","version":"0.1.0","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":"1.2.x"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f7a720edc1de1388c57beaa75e2602c40af9e2c9","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.1.0.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.2.1":{"name":"Panzer","version":"0.2.1","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":"1.2.x"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.2.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"7278d64cb0e351f4cec8b6671f47b1f94b8eafc9","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.2.1.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.2.2":{"name":"Panzer","version":"0.2.2","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":"1.2.x"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"51544604283162a2e70f4d7f54be43727ecb9680","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.2.2.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.2.3":{"name":"Panzer","version":"0.2.3","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":"1.2.x"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.2.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"4587306f124e42b89ecef0ed115f08c9187a5e37","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.2.3.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.2.4":{"name":"Panzer","version":"0.2.4","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":"1.2.x"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.2.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"59830ce2a858996604df32507e8c57b339ec3b78","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.2.4.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.2.5":{"name":"Panzer","version":"0.2.5","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":"2"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.2.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"4edda4eb65ed8579f10fe8a5f5f3c9bb2c957b27","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.2.5.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.3.0":{"name":"Panzer","version":"0.3.0","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":">=2.0.1"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.3.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e74834bf954adc704111164371cdb534357f8660","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.3.0.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"directories":{}},"0.3.5":{"name":"Panzer","version":"0.3.5","description":"A comprehensive node-tree solution, for smart data.","dependencies":{"genData":">=2.0.1"},"keywords":["tree","traversal"],"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"license":{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},"main":"src/panzer.js","_npmUser":{"name":"bemson","email":"bemson@gmail.com"},"_id":"Panzer@0.3.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cd4b09134f704b10ec96931f2a602b159b1a426f","tarball":"http://registry.npmjs.org/Panzer/-/Panzer-0.3.5.tgz"},"maintainers":[{"name":"bemson","email":"bemson@gmail.com"}]}},"readme":"# Panzer\nby Bemi Faison\n\nversion 0.1.0\n(1/13/12)\n\nA comprehensive node-tree solution, for smart data.\\*\n\n## DESCRIPTION\n\nPanzer is a JavaScript class factory that implements tree parsing, traversal and monitoring. Panzer separates node behavior, structure, and navigation concerns, so you can design classes that do just what you need.\n\nThe procedural consumption of \"structure\" allows data to inform your code's execution, for easier coding. As well, Panzer provides nodal meta-data, like parent-child relationships, depth, child order, etc. - which can be used to solve various problem domains.\n\nThe purpose and function of your Panzer is given by it's packages - modules of code that access and extend classes. The package architecture allows several treatments of an instance, with fewer resource collisions and greater interoperability than traditional plug-in schemes.\n\n__\\*__ Read _[The Cathedral and the Bazaar](http://www.redhat.com/support/wpapers/community/cathedral/whitepaper_cathedral-5.html)_, to understand why **\"Smart data structures and dumb code works a lot better than the other way around.\"**\n\n## INSTALL\n\n### Web Browsers\n\nUse a `<SCRIPT>` tag to reference panzer-min.js, as you would any external JavaScript file. The \"Panzer\" namespace will be added to the global scope.\n\n```html\n  <script type=\"text/javascript\" src=\"somepath/panzer-min.js\"></script>\n  <script type=\"text/javascript\">\n    // ... Panzer dependent code ...\n  </script>\n```\n### Node.js\n\nUse [npm](http://npmjs.org) to install the \"Panzer\" module and it's dependencies.\n\n```bash\n  npm install Panzer\n```\n\nThen, in Node.js (or a CommonJS environment), require the module and reference the exported \"Panzer\" object.\n\n```js\n  var myPanzerReference = require('Panzer').Panzer;\n\n  // ... code dependent on \"myPanzerReference\" ...\n```\n\n### Dependencies\n\nPanzer requires [genData v1.2](https://github.com/bemson/genData). (The minified file includes this dependency.)\n\n## USAGE\n\nFirst, create a Panzer class.\n\n```js\nvar BasicTree = Panzer.create();\n```\n\nIn order to access and extend Panzer's functionality, we need to define a package. (Otherwise, our instances won't do much.) Let's register a new package by name.\n\n```js\nvar myPkgDef = BasicTree.pkg('my first package');\n```\n\nThe returned value is the _package-definition_, a function with special members that hook into our class. Many hooks are available, but we'll prototype an instance method now.\n\n```js\nmyPkgDef.proxy.onward = function () {\n    var\n        // get the corresponding package-instance\n        tree = myPkgDef(this),\n        // alias the tank that controls our tree's \"pointer\"\n        tank = tree.tank,\n        // reference the current node\n        currentNode = tree.nodes[tank.currentIndex],\n        // reference a sibling or child node, if available\n        nextNode = tree.nodes[currentNode.nextIndex || currentNode.firstChildIndex];\n    // if there is a nextNode and we've successfully navigated to it...\n    if (nextNode && tank.go(nextNode.index)) {\n        // return the value of (what is now) the current node\n        return nextNode.value;\n    }\n    // (otherwise) flag that no node is next\n    return false;\n};\n```\n\nThough simple enough, there is a lot going on in our method. Nevertheless, we can now \"walk\" the left-branch of any data structure.\n\n```js\nvar\n    myTree = new BasicTree({hello: 'world'}),\n    nodeValue, lefties = [];\nwhile (nodeValue = myTree.onward()) {\n    lefties.push(nodeValue);\n}\n//\n// lefties[0] -> {hello: 'world'}\n// lefties[1] -> 'world'\n//\n```\n\nUnderstanding the package api is key to getting the most from your class. However, in lieu of full documentation, please see the test suite for greater insight. Thanks for your patience!\n\n## FILES\n\n* src/ - Directory containing the source code\n* test/ - [Qunit](http://docs.jquery.com/QUnit) tests of minified source files\n* README.md - This readme file\n* LICENSE - The legal terms and conditions under which this software may be used\n* panzer-min.js - The Panzer platform, including dependencies, minified and geared for browser environments\n\nSource files minified with [UglifyJS](http://marijnhaverbeke.nl/uglifyjs)\n\n## LICENSE\n\nPanzer is available under the terms of the [MIT-License](http://www.opensource.org/licenses/mit-license.php).\n\nCopyright 2012, Bemi Faison","maintainers":[{"name":"bemson","email":"bemson@gmail.com"}],"time":{"modified":"2012-07-07T06:34:30.688Z","created":"2012-01-14T01:34:45.172Z","0.1.0":"2012-01-14T01:34:46.666Z","0.2.1":"2012-03-21T06:29:44.623Z","0.2.2":"2012-03-21T18:52:29.210Z","0.2.3":"2012-03-27T17:59:25.341Z","0.2.4":"2012-04-12T06:23:47.392Z","0.2.5":"2012-05-23T04:31:56.412Z","0.3.0":"2012-07-02T07:57:22.012Z","0.3.5":"2012-07-07T06:34:30.688Z"},"author":{"name":"Bemi Faison","email":"bemson@gmail.com","url":"https://github.com/bemson"},"repository":{"type":"git","url":"git://github.com/bemson/Panzer.git"},"_attachments":{"Panzer-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-K8wF0R9N9IA/5Uw5uSkugg==","length":122851,"stub":true},"Panzer-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-TNucbJiY+m7N6TQ92nCh6A==","length":122872,"stub":true},"Panzer-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-A+heqVrY34qNbrsZknVXBA==","length":69333,"stub":true},"Panzer-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+H1/7B0LOnhpRIipjhN/vg==","length":81599,"stub":true},"Panzer-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-h1RT0JyB9g4BW5nk4hcy2A==","length":81376,"stub":true},"Panzer-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-KM/NPPsPHTwPQ7C3oamkSA==","length":81334,"stub":true},"Panzer-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-uCDisutXAVvExfyE3Uue1Q==","length":81342,"stub":true},"Panzer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1XRwRHxAiEnvaJ5z9nfdrQ==","length":81920,"stub":true}}}},
{"id":"PassiveRedis","key":"PassiveRedis","value":{"rev":"11-c00712ec8bce66b922212fab03b88537"},"doc":{"_id":"PassiveRedis","_rev":"11-c00712ec8bce66b922212fab03b88537","name":"PassiveRedis","description":"Node ORM for Redis","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"PassiveRedis","version":"0.0.2","description":"Node ORM for Redis","homepage":"https://github.com/Jud/PassiveRedis","keywords":["ORM","Redis","Redis ORM","Passive","ActiveRecord"],"author":{"name":"Jud Stephenson","email":"Jud@Svpply.com"},"main":"./index.js","repository":{"type":"git","url":"git://github.com/Jud/PassiveRedis.git"},"dependencies":{"hiredis":">=0.1.0","redis":">=0.6.0"},"_npmUser":{"name":"jud","email":"Jud.Stephenson@gmail.com"},"_id":"PassiveRedis@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"b1e18cb9f4efcec28ead877878c60b3f5be4e1cf","tarball":"http://registry.npmjs.org/PassiveRedis/-/PassiveRedis-0.0.2.tgz"},"maintainers":[{"name":"jud","email":"Jud.Stephenson@gmail.com"}]},"0.0.3":{"name":"PassiveRedis","version":"0.0.3","description":"Node ORM for Redis","homepage":"https://github.com/Jud/PassiveRedis","keywords":["ORM","Redis","Redis ORM","Passive","ActiveRecord"],"author":{"name":"Jud Stephenson","email":"Jud@Svpply.com"},"main":"./index.js","repository":{"type":"git","url":"git://github.com/Jud/PassiveRedis.git"},"dependencies":{"hiredis":">=0.1.0","redis":">=0.6.0"},"_npmUser":{"name":"jud","email":"Jud.Stephenson@gmail.com"},"_id":"PassiveRedis@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"920a73e750eed21a82383cecbffbc145ef07d35a","tarball":"http://registry.npmjs.org/PassiveRedis/-/PassiveRedis-0.0.3.tgz"},"maintainers":[{"name":"jud","email":"Jud.Stephenson@gmail.com"}]},"0.0.4":{"name":"PassiveRedis","version":"0.0.4","description":"Node ORM for Redis","homepage":"https://github.com/Jud/PassiveRedis","keywords":["ORM","Redis","Redis ORM","Passive","ActiveRecord"],"author":{"name":"Jud Stephenson","email":"Jud@Svpply.com"},"main":"./index.js","repository":{"type":"git","url":"git://github.com/Jud/PassiveRedis.git"},"dependencies":{"hiredis":">=0.1.0","redis":">=0.6.0"},"_npmUser":{"name":"jud","email":"Jud.Stephenson@gmail.com"},"_id":"PassiveRedis@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"b207079c793eea3799168a38547e5e6461058301","tarball":"http://registry.npmjs.org/PassiveRedis/-/PassiveRedis-0.0.4.tgz"},"maintainers":[{"name":"jud","email":"Jud.Stephenson@gmail.com"}]},"0.0.5":{"name":"PassiveRedis","version":"0.0.5","description":"Node ORM for Redis","homepage":"https://github.com/Jud/PassiveRedis","keywords":["ORM","Redis","Redis ORM","Passive","ActiveRecord"],"author":{"name":"Jud Stephenson","email":"Jud@Svpply.com"},"main":"./index.js","repository":{"type":"git","url":"git://github.com/Jud/PassiveRedis.git"},"dependencies":{"hiredis":">=0.1.0","redis":">=0.6.0"},"_npmUser":{"name":"jud","email":"Jud.Stephenson@gmail.com"},"_id":"PassiveRedis@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"b5133b5772222399aad430aa49e1287ddc5ca8bf","tarball":"http://registry.npmjs.org/PassiveRedis/-/PassiveRedis-0.0.5.tgz"},"maintainers":[{"name":"jud","email":"Jud.Stephenson@gmail.com"}]},"0.0.6":{"name":"PassiveRedis","version":"0.0.6","description":"Node ORM for Redis","homepage":"https://github.com/Jud/PassiveRedis","keywords":["ORM","Redis","Redis ORM","Passive","ActiveRecord"],"author":{"name":"Jud Stephenson","email":"Jud@Svpply.com"},"main":"./index.js","repository":{"type":"git","url":"git://github.com/Jud/PassiveRedis.git"},"devDependencies":{"mocha":"*","should":"*","coffee-script":"*"},"dependencies":{"coffee-script":"*","hiredis":">=0.1.0","redis":">=0.6.0"},"scripts":{"test":"make tests"},"_npmUser":{"name":"jud","email":"Jud.Stephenson@gmail.com"},"_id":"PassiveRedis@0.0.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"333c9ed88315aba1eee8b4d777b74e833e8032ee","tarball":"http://registry.npmjs.org/PassiveRedis/-/PassiveRedis-0.0.6.tgz"},"maintainers":[{"name":"jud","email":"Jud.Stephenson@gmail.com"}]}},"readme":"# PassiveRedis - A Node ORM for Redis\n\nPassiveRedis is an easy way to logically access data stored in a Redis\ndatastore. PassiveRedis is based off of the Ruby ORM ActiveRecord,\nthough it does not impliment all of its features (yet).\n\n# Making Models With PassiveRedis\n\nHere is a simple example for creating a User model with PassiveRedis.\nThis code should be placed in a directory containing all of the other\nmodels and the filename should correspond with the class name.\n\n```coffeescript\nPassiveRedis = (require 'PassiveRedis').PassiveRedis\n\nclass User extends PassiveRedis\n  @string_id: 'username'\n\n  @schema:\n    username: 'String'\n    email: 'String'\n    password: 'String'\n\n  @relationships:\n    hasMany:\n      mailboxes: {}\n      messages: {}\n\nexports.User = User\n```\n\n# Relationships (hasMany and hasOne)\n\nPassiveRedis supports hasMany and hasOne relationships that are defined\nwithin the Model class definition. To setup relationships simply create a `relationships`\nproperty on the model and define the hasMany and hasOne keys.\n\nUsage:\n\n```coffeescript\nMailbox.find 2, (err, mailbox) ->\n  if !err\n    # Assumes a hasOne relationship between Mailbox and User\n    mailbox.user (user) ->\n      console.log 'Mailbox\\'s user', user\n\n    mailbox.messages (messages) ->\n      console.log 'found', messages.length, 'messages'\n```\n\n\n# Getters and Setters\n\nWhen schema properties are accessed on the model, PassiveRedis\nimpliments getters and setters that check for getProperty style methods\non the model. If \"username\" was defined in the model schema, and a\ngetUsername method was defined on the model, an attempt to access the\nusername property would call the getUsername method.\n\n\n# License Information\n\nCopyright (c) 2011 Judson Stephenson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"jud","email":"Jud.Stephenson@gmail.com"}],"time":{"modified":"2012-04-25T02:15:13.994Z","created":"2011-11-20T05:46:26.619Z","0.0.2":"2011-11-20T05:46:27.094Z","0.0.3":"2011-11-20T06:22:37.998Z","0.0.4":"2011-11-21T02:03:39.247Z","0.0.5":"2011-11-21T02:17:51.648Z","0.0.6":"2012-04-25T02:15:13.994Z"},"author":{"name":"Jud Stephenson","email":"Jud@Svpply.com"},"repository":{"type":"git","url":"git://github.com/Jud/PassiveRedis.git"},"_attachments":{"PassiveRedis-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-DUUv96QESf5vL+RO6XWwvA==","length":12180,"stub":true},"PassiveRedis-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-seIUQzG6ApMSmA5g2oBYLg==","length":20480,"stub":true},"PassiveRedis-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZGJNt9wyCmDX3ThMkrIWKQ==","length":20480,"stub":true},"PassiveRedis-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AkA5UfCdBwVyrRugwn0Rpg==","length":20480,"stub":true},"PassiveRedis-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IvvBkzP+2Y0QNlOBOv2K3g==","length":20480,"stub":true}}}},
{"id":"Peek","key":"Peek","value":{"rev":"3-8c9b94cbb2f881121eea604f10fd9bed"},"doc":{"_id":"Peek","_rev":"3-8c9b94cbb2f881121eea604f10fd9bed","name":"Peek","description":"Simple http grabber","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Peek","description":"Simple http grabber","version":"0.0.1","author":{"name":"Alex Ghiu","email":"alex@deefuse.com"},"keywords":["http","request","html","grab","capture"],"dependencies":{},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"make test"},"main":"./peek.js","repository":{"type":"git","url":"git://github.com/alexdeefuse/Peek.git"},"_npmUser":{"name":"alexdeefuse","email":"alex@deefuse.com"},"_id":"Peek@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"5547096014f2c2ac138ac1147f3f6ff492937eba","tarball":"http://registry.npmjs.org/Peek/-/Peek-0.0.1.tgz"},"maintainers":[{"name":"alexdeefuse","email":"alex@deefuse.com"}]}},"readme":"Peek\n\n## What's Peek?\n\nSimple http grabber for NodeJs. Can be used for grabbing html, xml, json, js, css and pretty much anything text based.\n\nIts as simple as:\n\n```javascript\nvar r = new Peek();\nr.url('http://google.com');\nr.run(function(err, content){\n\t\n});\n```\n\n## Running the tests\n\nTo test run:\n\n```\n$ make test\n```\n\n## License\n\nCopyright (c) 2010-2011 Deefuse &lt;alex@deefuse.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"alexdeefuse","email":"alex@deefuse.com"}],"time":{"modified":"2012-01-23T17:26:37.496Z","created":"2012-01-23T17:26:35.472Z","0.0.1":"2012-01-23T17:26:37.496Z"},"author":{"name":"Alex Ghiu","email":"alex@deefuse.com"},"repository":{"type":"git","url":"git://github.com/alexdeefuse/Peek.git"},"_attachments":{"Peek-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TiinN5DTwLbvSANOZDccsA==","length":10240,"stub":true}}}},
{"id":"Pega.IO","key":"Pega.IO","value":{"rev":"3-9612318af4aab37f46b79ea7ff6b82ab"},"doc":{"_id":"Pega.IO","_rev":"3-9612318af4aab37f46b79ea7ff6b82ab","name":"Pega.IO","description":"A simple pub/sub server running on node / socket.io.  Pega.IO lets you use any back-end that is capable of doing HTTP POST to publish.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Garett Rogers","email":"garett@aimx.com","url":"http://www.aimx.com"},"name":"Pega.IO","description":"A simple pub/sub server running on node / socket.io.  Pega.IO lets you use any back-end that is capable of doing HTTP POST to publish.","version":"0.0.1","homepage":"http://github.com/Gootch/pega.io","repository":{"type":"git","url":"git://github.com/Gootch/pega.io.git"},"engines":{"node":"~0.4.12"},"dependencies":{"socket.io":"0.8.5","express":"2.4.7","redis":"0.6.7"},"devDependencies":{},"_npmUser":{"name":"gootch","email":"garett@aimx.com"},"_id":"Pega.IO@0.0.1","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9218163802ac97123ac07950d88ce44f4ea872c2","tarball":"http://registry.npmjs.org/Pega.IO/-/Pega.IO-0.0.1.tgz"},"maintainers":[{"name":"gootch","email":"garett@aimx.com"}]}},"maintainers":[{"name":"gootch","email":"garett@aimx.com"}],"time":{"modified":"2011-10-22T17:49:50.412Z","created":"2011-10-22T17:49:50.207Z","0.0.1":"2011-10-22T17:49:50.412Z"},"author":{"name":"Garett Rogers","email":"garett@aimx.com","url":"http://www.aimx.com"},"repository":{"type":"git","url":"git://github.com/Gootch/pega.io.git"},"_attachments":{"Pega.IO-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-K+IgLCBdYZb4oU9ZIcLKIw==","length":2455,"stub":true}}}},
{"id":"Peggy.js","key":"Peggy.js","value":{"rev":"3-f6d29b24516cf8fd3c377137a1d21e65"},"doc":{"_id":"Peggy.js","_rev":"3-f6d29b24516cf8fd3c377137a1d21e65","name":"Peggy.js","description":"A simpler PEG generator in JavaScript","dist-tags":{"latest":"0.9.0"},"versions":{"0.9.0":{"author":{"name":"Clint Hill","email":"clint.hill@gmail.com"},"name":"Peggy.js","description":"A simpler PEG generator in JavaScript","version":"0.9.0","homepage":"http://clintjhill.github.com/Peggy.js/","repository":{"type":"git","url":"git://github.com/clintjhill/Peggy.js.git"},"main":"index","scripts":{"test":"make spec"},"engines":{"node":"~0.6.10"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"clintjhill","email":"clint.hill@gmail.com"},"_id":"Peggy.js@0.9.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"051d047a7a21b56a5761ea224f32780018bcd583","tarball":"http://registry.npmjs.org/Peggy.js/-/Peggy.js-0.9.0.tgz"},"maintainers":[{"name":"clintjhill","email":"clint.hill@gmail.com"}]}},"readme":"Peggy.js - A simpler PEG generator in JavaScript\n======================================\n## Description\nPlease visit [http://clintjhill.github.com/Peggy.js/](http://clintjhill.github.com/Peggy.js/) for more information.\n\n## Requirements to build and run tests\n\n1. GNU Make\n2. [Node.js](http://nodejs.org/) 0.5.0 or greater\n3. [Node.js Package Manager](http://npmjs.org/) 1.0.0 or greater\n4. jasmine-node `npm install -g jasmine-node`\n\nRoadmap\n-------\n\n1. (Done) Finish API with Repeat, And, But etc. \n2. (Done) Better parse exception handling on missed rule and/or tree inconsistencies.\n3. Full line/character error messages.\n4. Peggy grammar to allow for building rules with a Peggy syntax instead of the JavaScript API.\n5. (Done) More testing.\n6. (Done) More samples of both Peggy syntax and API.\n7. (Done) Fully embed string scanner (maybe even optimize for use case).\n8. Improve the value object that is returned to rule extensions.\n9. (Done) Improve example pages - construct a tutorial.\n10. (Done) Enhance rule API so that it includes: Zero or more, One or more, Optional, And predicate and Not predicate.\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Clint Hill &lt;clint.hill@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"clintjhill","email":"clint.hill@gmail.com"}],"time":{"modified":"2012-04-10T06:16:09.044Z","created":"2012-04-10T06:16:08.377Z","0.9.0":"2012-04-10T06:16:09.044Z"},"author":{"name":"Clint Hill","email":"clint.hill@gmail.com"},"repository":{"type":"git","url":"git://github.com/clintjhill/Peggy.js.git"},"_attachments":{"Peggy.js-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lIi9BcRrxgq0cL+Jfayz4Q==","length":10705,"stub":true}}}},
{"id":"Percolator","key":"Percolator","value":{"rev":"38-1596298223fe01a2cb88b76220ee2184"},"doc":{"_id":"Percolator","_rev":"38-1596298223fe01a2cb88b76220ee2184","name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","dist-tags":{"latest":"0.2.6"},"versions":{"0.0.1":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.0.1","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"2.5.8","mongodb":"0.9.6-19","express-mongoose":">= 0.0.1","mongoose":"1.6.0","express-resource":"0.2.3","underscore":"","resourceful":"0.1.10","revalidator":"0.1.0"},"devDependencies":{"hottap":"1.0.0","mocha":"0.14.1","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"96787b15c61b8132c8ad221d778516b882c1fc72","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.0.1.tgz"}},"0.1.0":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.0","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"2.5.8","mongoose":"1.6.0","underscore":"","resorcery":"0.1.1","detour":"0.8.5","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1","persist":"0.2.3"},"devDependencies":{"hottap":"1.0.0","mocha":"0.14.1","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f73b6f88a47c0417a2c7ed3f97261813d33a4e38","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.0.tgz"}},"0.1.1":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.1","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"2.5.8","mongoose":"1.6.0","underscore":"","resorcery":"0.1.1","detour":"0.8.7","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1","persist":"0.2.3"},"devDependencies":{"hottap":"1.0.0","mocha":"0.14.1","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1fbdec111869bb8caad2361083405ff6034ea782","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.1.tgz"}},"0.1.2":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.2","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","mongoose":"1.6.0","underscore":"","resorcery":"0.1.1","detour":"0.8.7","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1","persist":"0.2.3"},"devDependencies":{"hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c896de6b009682e9b9a40af9bd1d48cece3f6841","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.2.tgz"}},"0.1.3":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.3","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","mongoose":"1.6.0","underscore":"","resorcery":"0.1.1","detour":"0.8.7","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1","persist":"0.2.3"},"devDependencies":{"hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"953525402d0e64c4eebc33b9bd75c44eb1ecc7ad","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.3.tgz"}},"0.1.4":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.4","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","mongoose":"1.6.0","underscore":"","resorcery":"0.1.1","detour":"0.8.8","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1","persist":"0.2.3"},"devDependencies":{"hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality web APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\n\n## Quick Examples:\n\n### Hello World\nTo create a simple read-only /helloworld resource that responds with \"Hello\nWorld!\", create a file in the root resources directory called \"helloworld.js\"\nand put this in it:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send('Hello World!');\n    }\n  }\n```\n\n\"req\" and \"res\" are simply express's request and response objects.\n\n### Collections\nTo create a \"/rockband\" collection resource based on a \"rockband\" Mongo collection, \ncreate a file called \"rockband.js\" and put this in it:\n\n```javascript\n  const MongoResource = require('../lib/resourceTypes/MongoResource').MongoResource;\n  exports.handler = new MongoResource('rockbands', {\n    'name' : { type: String, match: /[a-zA-z0-9\\.]/, required : true },\n    'created' : { type: Date, default: Date.now, required : true }\n  })\n```\n\nYou'll automatically get a \"rockband\" collection that you can GET and POST to\n(with validations), that stores in Mongo.  Every rockband that you add via POST\nwill be available at its own URL afterward, for GETting, updating via PUT and\ndeleting via DELETE.  Here's how a GET on /rockband looks when it has one rock\nband:\n\n```javascript\n  {\n    items: [\n      {\n        created: \"2012-03-17T19:39:28.200Z\",\n        name: \"The Clash\",\n        _id: \"1234\",\n        links: {\n          parent: {\n            href: \"/api/artist/\"\n          },\n          self: {\n            href: \"/api/artist/1234\"\n          }\n        }\n      }\n    ],\n    links: {\n      parent: {\n        href: \"/api\"\n      },\n      self: {\n        href: \"/api/artist/\"\n      }\n    }\n  }\n```\n\nHere's how a GET on /rockband/1234 looks:\n\n```javascript\n  {\n      created: \"2012-03-17T19:39:28.200Z\",\n      name: \"The Clash\",\n      _id: \"1234\",\n      links: {\n        parent: {\n          href: \"/api/artist/\"\n        },\n        self: {\n          href: \"/api/artist/1234\"\n        }\n      }\n    }\n```\n\nHere's how a GET on /rockband/4567 (which doesn't exist!) looks (with a 404\nstatus):\n\n```javascript\n  {\n    error: {\n      type: \"RecordNotFoundError\",\n      message: \"A record with the given id could not be found.\",\n      detail: \"4567\"\n    }\n  }\n```\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so that the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html \nto see what a full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other data-store helpers than just mongo, so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n* better support for other cross-cutting \"aspects\" like logging and throttling\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.1.4","dist":{"shasum":"da02f79483898250dbfec43a4be97ae47230212d","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.4.tgz"}},"0.1.5":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.5","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.2","detour":"0.8.10","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fd31cf43b8b2841baf961334b04c36cca4350c27","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.5.tgz"}},"0.1.6":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.6","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.10","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"_npmUser":{"name":"cainus","email":"gregg@caines.ca"},"_id":"Percolator@0.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"1c00fc0885fd09f7fdad6b9d9ce1d66390440d90","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.6.tgz"}},"0.1.7":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.7","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.11","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\n\n## Quick Examples:\n\n### Hello World\nTo create a simple read-only /helloworld resource that responds with \"Hello\nWorld!\", create a file in the root 'resources' directory called \"helloworld.js\"\nand put this in it:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send('Hello World!');\n    }\n  }\n```\n\n\"req\" and \"res\" are simply express's request and response objects.\n\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n# General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n# Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString(someObj);\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.1.7","dist":{"shasum":"aec674fbf845d02f29921edb6788bf03c6899698","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.7.tgz"}},"0.1.8":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.8","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.12","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\n\n## Quick Examples:\n\n### Hello World\nTo create a simple read-only /helloworld resource that responds with \"Hello\nWorld!\", create a file in the root 'resources' directory called \"helloworld.js\"\nand put this in it:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send('Hello World!');\n    }\n  }\n```\n\n\"req\" and \"res\" are simply express's request and response objects.\n\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n# General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n# Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString(someObj);\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.1.8","dist":{"shasum":"12645fb88f5d2a5f0e22156a29ae0700e6661fef","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.8.tgz"}},"0.1.9":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.9","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.13","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\n\n## Quick Examples:\n\n### Hello World\nTo create a simple read-only /helloworld resource that responds with \"Hello\nWorld!\", create a file in the root 'resources' directory called \"helloworld.js\"\nand put this in it:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send('Hello World!');\n    }\n  }\n```\n\n\"req\" and \"res\" are simply express's request and response objects.\n\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n# General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n# Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString(someObj);\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.1.9","dist":{"shasum":"f8081921d5eacc059af5c516b59c049953d7f914","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.9.tgz"}},"0.1.10":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.1.10","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\n\n## Quick Examples:\n\n### Hello World\nTo create a simple read-only /helloworld resource that responds with \"Hello\nWorld!\", create a file in the root 'resources' directory called \"helloworld.js\"\nand put this in it:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send('Hello World!');\n    }\n  }\n```\n\n\"req\" and \"res\" are simply express's request and response objects.\n\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n# General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n# Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString(someObj);\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.1.10","dist":{"shasum":"296d1868c08e7225b357d96de4258c2eb7a22af2","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.1.10.tgz"}},"0.2.1":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.2.1","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\nIs this project ready to use?  Kind-of-sort-of.  Not in Production though.\n\n## Hello World Quick Start:\n*  `npm install Percolator`\n*  Create a `server.js` in your project directory, and copy this code below into it:\n\n```javascript\nvar Percolator = require('./percolator');\n\nvar server = new Percolator();\nserver.router.route('/', {  GET : function(req, res){\n                              res.end(\"Hello World!\");\n                            }});\nserver.listen(function(err){\n  console.log('server is listening on port ', server.port);\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ and be completely floored by the greatest \nAPI of all time.  Or not.\n\n## Hello World Refactored:\n\nWhile this is pretty simple, it's also not super-interesting.  One of the interesting features of \nPercolator is that it lets you load your route-handling code from external files instead:\n\n* Move your \"Hello World\" handler into a file at the path `./resources/_index.js` by first creating the \n`resources` directory and then the `_index.js` file in it and then copying the handler logic into `_index.js`\nlike so:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.end('Hello World!');\n    }\n  }\n```\nWe'll call files like that \"resources\" from now on.\n\n\n* Change your server.js to call `routeDirectory()` instead of `server.router.route()` like so:\n\n```javascript\nvar Percolator = require('./percolator');\n\nvar server = new Percolator();\nserver.routeDirectory(__dirname + '/resources', function(err){\n  if (!!err) {console.log(err);}\n  server.listen(function(err){\n    console.log('server is listening on port ', server.port);\n  });\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ .\n\n## What's a \"resource\"?\nResources are where you put your code for handling http requests (and their responses).  \n\nA single resource handles all the HTTP methods for a single URL path.  Any object that provides the HTTP methods \ncan be used and just has to be exported as a javascript module.  Our \"Hello World\" example is just providing the \nGET method, so when your users use other methods like POST and DELETE on it will just respond with 405 errors.  \nYou can easily implement any other HTTP method that you want, by just defining the function by that name (use all \ncaps!).\n\nResources are just node modules that Percolator automaticaly require()s.  You have to export them as \"handler\" \nlike in the \"Hello World\" example above.\"\n\nAny particular method that you implement takes request and response parameters, in that order (The \"Hello World\"\nexample just calls them 'req' and 'res' respectively)).  These are the [request]( http://nodejs.org/api/http.html#http_class_http_serverrequest )\nand [response]( http://nodejs.org/api/http.html#http_class_http_serverresponse ) objects from node itself.\n\n\n## How routing works\nYour resource directory and its subdirectories are routed to URLs, so that the organization on the filesystem \ndictates your urls.  This means you don't have to maintain a list of routes anywhere, you know exactly where to \nfind everything and you have a simple convention for code organization.\n\n### The base path\nThe base path is the URI path under which all of your resources will be served. It's called `resourcePath` in \nyour application config (see the quick start for an example of setting it to '/').  It doesn't need to be set \nto '/', for instance -- you could set it to /api, and then the quick start example would serve from /api instead.\n\n### The _index.js file.\nThe server won't start without an _index.js file.  It's the resource that handles requests to your base path.\n\n### Adding other routes to a path\nJust add more files to the directory!  Adding ./resources/newone.js will make the handler in that file available \nat the /newone url . \n\n## About the 'app' parameter.\nWhen you create an instance of Percolator, you need to pass it a config object that will later be available in all\nresource methods as `this.app`.  Required parameters for this config object are:  \n\n  **protocol** - 'http' or 'https'  \n  **resourceDir** - the filesystem directory where the resources can be found (use an absolute path!)  \n  **resourcePath** - the url path that all the resource will be routed from (eg. Setting it to '/' will serve the \n  resources from http://yourdomain.com/ while setting it to '/api' will serve the resources from \n  http://yourdomain.com/api .  \n  **staticDir** - The directory on the filesystem from which you will serve static content (use an absolute path!).  \n  **port** - the http port.  A low port like 80 will not work unless you run the app with root privileges.  \n  \nIt's also important to note that you can add your own parameters as well.  It's a great way to instantiate shared \nresources (like a database connection) in the main application and pass it to all resources.\n\nYou're obviously going to want to limit the number of `app` variables that you add beyond the necessary ones, but\ncertain types of objects might make sense in that shared space.\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n### General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n### Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString({somevar : \"somevalue\"}});\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.2.1","dist":{"shasum":"403ba174d8492d5d0a1ac4f52178e2ccaf290472","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.2.1.tgz"}},"0.2.2":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.2.2","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\nIs this project ready to use?  Kind-of-sort-of.  Not in Production though.\n\n## Hello World Quick Start:\n*  `npm install Percolator`\n*  Create a `server.js` in your project directory, and copy this code below into it:\n\n```javascript\nvar Percolator = require('./percolator');\n\nvar server = new Percolator();\nserver.router.route('/', {  GET : function(req, res){\n                              res.end(\"Hello World!\");\n                            }});\nserver.listen(function(err){\n  console.log('server is listening on port ', server.port);\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ and be completely floored by the greatest \nAPI of all time.  Or not.\n\n## Hello World Refactored:\n\nWhile this is pretty simple, it's also not super-interesting.  One of the interesting features of \nPercolator is that it lets you load your route-handling code from external files instead:\n\n* Move your \"Hello World\" handler into a file at the path `./resources/_index.js` by first creating the \n`resources` directory and then the `_index.js` file in it and then copying the handler logic into `_index.js`\nlike so:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.end('Hello World!');\n    }\n  }\n```\nWe'll call files like that \"resources\" from now on.\n\n\n* Change your server.js to call `routeDirectory()` instead of `server.router.route()` like so:\n\n```javascript\nvar Percolator = require('./percolator');\n\nvar server = new Percolator();\nserver.routeDirectory(__dirname + '/resources', function(err){\n  if (!!err) {console.log(err);}\n  server.listen(function(err){\n    console.log('server is listening on port ', server.port);\n  });\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ .\n\n## What's a \"resource\"?\nResources are where you put your code for handling http requests (and their responses).  \n\nA single resource handles all the HTTP methods for a single URL path.  Any object that provides the HTTP methods \ncan be used and just has to be exported as a javascript module.  Our \"Hello World\" example is just providing the \nGET method, so when your users use other methods like POST and DELETE on it will just respond with 405 errors.  \nYou can easily implement any other HTTP method that you want, by just defining the function by that name (use all \ncaps!).\n\nResources are just node modules that Percolator automaticaly require()s.  You have to export them as \"handler\" \nlike in the \"Hello World\" example above.\"\n\nAny particular method that you implement takes request and response parameters, in that order (The \"Hello World\"\nexample just calls them 'req' and 'res' respectively)).  These are the [request]( http://nodejs.org/api/http.html#http_class_http_serverrequest )\nand [response]( http://nodejs.org/api/http.html#http_class_http_serverresponse ) objects from node itself.\n\n\n## How routing works\nYour resource directory and its subdirectories are routed to URLs, so that the organization on the filesystem \ndictates your urls.  This means you don't have to maintain a list of routes anywhere, you know exactly where to \nfind everything and you have a simple convention for code organization.\n\n### The base path\nThe base path is the URI path under which all of your resources will be served. It's called `resourcePath` in \nyour application config (see the quick start for an example of setting it to '/').  It doesn't need to be set \nto '/', for instance -- you could set it to /api, and then the quick start example would serve from /api instead.\n\n### The _index.js file.\nThe server won't start without an _index.js file.  It's the resource that handles requests to your base path.\n\n### Adding other routes to a path\nJust add more files to the directory!  Adding ./resources/newone.js will make the handler in that file available \nat the /newone url . \n\n## About the 'app' parameter.\nWhen you create an instance of Percolator, you need to pass it a config object that will later be available in all\nresource methods as `this.app`.  Required parameters for this config object are:  \n\n  **protocol** - 'http' or 'https'  \n  **resourceDir** - the filesystem directory where the resources can be found (use an absolute path!)  \n  **resourcePath** - the url path that all the resource will be routed from (eg. Setting it to '/' will serve the \n  resources from http://yourdomain.com/ while setting it to '/api' will serve the resources from \n  http://yourdomain.com/api .  \n  **staticDir** - The directory on the filesystem from which you will serve static content (use an absolute path!).  \n  **port** - the http port.  A low port like 80 will not work unless you run the app with root privileges.  \n  \nIt's also important to note that you can add your own parameters as well.  It's a great way to instantiate shared \nresources (like a database connection) in the main application and pass it to all resources.\n\nYou're obviously going to want to limit the number of `app` variables that you add beyond the necessary ones, but\ncertain types of objects might make sense in that shared space.\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n### General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n### Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString({somevar : \"somevalue\"}});\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.2.2","dist":{"shasum":"5e507e3d850587dbc75ae23da7210fd585b72c50","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.2.2.tgz"}},"0.2.3":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.2.3","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\nIs this project ready to use?  Kind-of-sort-of.  Not in Production though.\n\n## Hello World Quick Start:\n*  `npm install Percolator`\n*  Create a `server.js` in your project directory, and copy this code below into it:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.router.route('/', {  GET : function(req, res){\n                              res.end(\"Hello World!\");\n                            }});\nserver.listen(function(err){\n  console.log('server is listening on port ', server.port);\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ and be completely floored by the greatest \nAPI of all time.  Or not.\n\n## Hello World Refactored:\n\nWhile this is pretty simple, it's also not super-interesting.  One of the interesting features of \nPercolator is that it lets you load your route-handling code from external files instead:\n\n* Move your \"Hello World\" handler into a file at the path `./resources/_index.js` by first creating the \n`resources` directory and then the `_index.js` file in it and then copying the handler logic into `_index.js`\nlike so:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.end('Hello World!');\n    }\n  }\n```\nWe'll call files like that \"resources\" from now on.\n\n\n* Change your server.js to call `routeDirectory()` instead of `server.router.route()` like so:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.routeDirectory(__dirname + '/resources', function(err){\n  if (!!err) {console.log(err);}\n  server.listen(function(err){\n    console.log('server is listening on port ', server.port);\n  });\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ .\n\n## What's a \"resource\"?\nResources are where you put your code for handling http requests (and their responses).  \n\nA single resource handles all the HTTP methods for a single URL path.  Any object that provides the HTTP methods \ncan be used and just has to be exported as a javascript module.  Our \"Hello World\" example is just providing the \nGET method, so when your users use other methods like POST and DELETE on it will just respond with 405 errors.  \nYou can easily implement any other HTTP method that you want, by just defining the function by that name (use all \ncaps!).\n\nResources are just node modules that Percolator automaticaly require()s.  You have to export them as \"handler\" \nlike in the \"Hello World\" example above.\"\n\nAny particular method that you implement takes request and response parameters, in that order (The \"Hello World\"\nexample just calls them 'req' and 'res' respectively)).  These are the [request]( http://nodejs.org/api/http.html#http_class_http_serverrequest )\nand [response]( http://nodejs.org/api/http.html#http_class_http_serverresponse ) objects from node itself.\n\n\n## How routing works\nYour resource directory and its subdirectories are routed to URLs, so that the organization on the filesystem \ndictates your urls.  This means you don't have to maintain a list of routes anywhere, you know exactly where to \nfind everything and you have a simple convention for code organization.\n\n### The base path\nThe base path is the URI path under which all of your resources will be served. It's called `resourcePath` in \nyour application config (see the quick start for an example of setting it to '/').  It doesn't need to be set \nto '/', for instance -- you could set it to /api, and then the quick start example would serve from /api instead.\n\n### The _index.js file.\nThe server won't start without an _index.js file.  It's the resource that handles requests to your base path.\n\n### Adding other routes to a path\nJust add more files to the directory!  Adding ./resources/newone.js will make the handler in that file available \nat the /newone url . \n\n## About the 'app' parameter.\nWhen you create an instance of Percolator, you need to pass it a config object that will later be available in all\nresource methods as `this.app`.  Required parameters for this config object are:  \n\n  **protocol** - 'http' or 'https'  \n  **resourceDir** - the filesystem directory where the resources can be found (use an absolute path!)  \n  **resourcePath** - the url path that all the resource will be routed from (eg. Setting it to '/' will serve the \n  resources from http://yourdomain.com/ while setting it to '/api' will serve the resources from \n  http://yourdomain.com/api .  \n  **staticDir** - The directory on the filesystem from which you will serve static content (use an absolute path!).  \n  **port** - the http port.  A low port like 80 will not work unless you run the app with root privileges.  \n  \nIt's also important to note that you can add your own parameters as well.  It's a great way to instantiate shared \nresources (like a database connection) in the main application and pass it to all resources.\n\nYou're obviously going to want to limit the number of `app` variables that you add beyond the necessary ones, but\ncertain types of objects might make sense in that shared space.\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n### General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n### Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString({somevar : \"somevalue\"}});\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.2.3","dist":{"shasum":"0664945e2f8fa79da4e28c28f70c64cb5d75f075","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.2.3.tgz"}},"0.2.4":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.2.4","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.1","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\nIs this project ready to use?  Kind-of-sort-of.  Not in Production though.\n\n## Hello World Quick Start:\n*  `npm install Percolator`\n*  Create a `server.js` in your project directory, and copy this code below into it:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.router.route('/', {  GET : function(req, res){\n                              res.end(\"Hello World!\");\n                            }});\nserver.listen(function(err){\n  console.log('server is listening on port ', server.port);\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ and be completely floored by the greatest \nAPI of all time.  Or not.\n\n## Hello World Refactored:\n\nWhile this is pretty simple, it's also not super-interesting.  One of the interesting features of \nPercolator is that it lets you load your route-handling code from external files instead:\n\n* Move your \"Hello World\" handler into a file at the path `./resources/_index.js` by first creating the \n`resources` directory and then the `_index.js` file in it and then copying the handler logic into `_index.js`\nlike so:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.end('Hello World!');\n    }\n  }\n```\nWe'll call files like that \"resources\" from now on.\n\n\n* Change your server.js to call `routeDirectory()` instead of `server.router.route()` like so:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.routeDirectory(__dirname + '/resources', function(err){\n  if (!!err) {console.log(err);}\n  server.listen(function(err){\n    console.log('server is listening on port ', server.port);\n  });\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ .\n\n## What's a \"resource\"?\nResources are where you put your code for handling http requests (and their responses).  \n\nA single resource handles all the HTTP methods for a single URL path.  Any object that provides the HTTP methods \ncan be used and just has to be exported as a javascript module.  Our \"Hello World\" example is just providing the \nGET method, so when your users use other methods like POST and DELETE on it will just respond with 405 errors.  \nYou can easily implement any other HTTP method that you want, by just defining the function by that name (use all \ncaps!).\n\nResources are just node modules that Percolator automaticaly require()s.  You have to export them as \"handler\" \nlike in the \"Hello World\" example above.\"\n\nAny particular method that you implement takes request and response parameters, in that order (The \"Hello World\"\nexample just calls them 'req' and 'res' respectively)).  These are the [request]( http://nodejs.org/api/http.html#http_class_http_serverrequest )\nand [response]( http://nodejs.org/api/http.html#http_class_http_serverresponse ) objects from node itself.\n\n\n## How routing works\nYour resource directory and the files and subdirectories in it are routed to URLs, so that the organization on \nthe filesystem dictates your urls.  This means:\n* you don't have to maintain a list of routes anywhere\n* you know exactly where to find everything \n* you have a simple convention for code organization.\n\n### The base path\nThe base path is the URI path under which all of your resources will be served. It's called `resourcePath` in \nyour application config (see the quick start for an example of setting it to '/').  It doesn't need to be set \nto '/', for instance -- you could set it to /api, and then the quick start example would serve from /api instead.\n\n### The _index.js file.\nThe server won't start without an _index.js file.  It's the resource that handles requests to your base path.\n\n### Adding other routes to a path\nJust add more files to the directory!  Adding ./resources/newone.js will make the handler in that file available \nat the /newone url . \n\n## About the 'app' parameter.\nWhen you create an instance of Percolator, you need to pass it a config object that will later be available in all\nresource methods as `this.app`.  Required parameters for this config object are:  \n\n  **protocol** - 'http' or 'https'  \n  **resourceDir** - the filesystem directory where the resources can be found (use an absolute path!)  \n  **resourcePath** - the url path that all the resource will be routed from (eg. Setting it to '/' will serve the \n  resources from http://yourdomain.com/ while setting it to '/api' will serve the resources from \n  http://yourdomain.com/api .  \n  **staticDir** - The directory on the filesystem from which you will serve static content (use an absolute path!).  \n  **port** - the http port.  A low port like 80 will not work unless you run the app with root privileges.  \n  \nIt's also important to note that you can add your own parameters as well.  It's a great way to instantiate shared \nresources (like a database connection) in the main application and pass it to all resources.\n\nYou're obviously going to want to limit the number of `app` variables that you add beyond the necessary ones, but\ncertain types of objects might make sense in that shared space.\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n### General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n### Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString({somevar : \"somevalue\"}});\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.2.4","dist":{"shasum":"a540d653f2f05b470a360ac0a3c3d8e999c128ce","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.2.4.tgz"}},"0.2.5":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.2.5","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.2","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\nIs this project ready to use?  Kind-of-sort-of.  Not in Production though.\n\n## Hello World Quick Start:\n*  `npm install Percolator`\n*  Create a `server.js` in your project directory, and copy this code below into it:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.router.route('/', {  GET : function(req, res){\n                              res.end(\"Hello World!\");\n                            }});\nserver.listen(function(err){\n  console.log('server is listening on port ', server.port);\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ and be completely floored by the greatest \nAPI of all time.  Or not.\n\n## Hello World Refactored:\n\nWhile this is pretty simple, it's also not super-interesting.  One of the interesting features of \nPercolator is that it lets you load your route-handling code from external files instead:\n\n* Move your \"Hello World\" handler into a file at the path `./resources/_index.js` by first creating the \n`resources` directory and then the `_index.js` file in it and then copying the handler logic into `_index.js`\nlike so:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.end('Hello World!');\n    }\n  }\n```\nWe'll call files like that \"resources\" from now on.\n\n\n* Change your server.js to call `routeDirectory()` instead of `server.router.route()` like so:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.routeDirectory(__dirname + '/resources', function(err){\n  if (!!err) {console.log(err);}\n  server.listen(function(err){\n    console.log('server is listening on port ', server.port);\n  });\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ .\n\n## What's a \"resource\"?\nResources are where you put your code for handling http requests (and their responses).  \n\nA single resource handles all the HTTP methods for a single URL path.  Any object that provides the HTTP methods \ncan be used and just has to be exported as a javascript module.  Our \"Hello World\" example is just providing the \nGET method, so when your users use other methods like POST and DELETE on it will just respond with 405 errors.  \nYou can easily implement any other HTTP method that you want, by just defining the function by that name (use all \ncaps!).\n\nResources are just node modules that Percolator automaticaly require()s.  You have to export them as \"handler\" \nlike in the \"Hello World\" example above.\"\n\nAny particular method that you implement takes request and response parameters, in that order (The \"Hello World\"\nexample just calls them 'req' and 'res' respectively)).  These are the [request]( http://nodejs.org/api/http.html#http_class_http_serverrequest )\nand [response]( http://nodejs.org/api/http.html#http_class_http_serverresponse ) objects from node itself.\n\n\n## How routing works\nYour resource directory and the files and subdirectories in it are routed to URLs, so that the organization on \nthe filesystem dictates your urls.  This means:\n* you don't have to maintain a list of routes anywhere\n* you know exactly where to find everything \n* you have a simple convention for code organization.\n\n### The base path\nThe base path is the URI path under which all of your resources will be served. It's called `resourcePath` in \nyour application config (see the quick start for an example of setting it to '/').  It doesn't need to be set \nto '/', for instance -- you could set it to /api, and then the quick start example would serve from /api instead.\n\n### The _index.js file.\nThe server won't start without an _index.js file.  It's the resource that handles requests to your base path.\n\n### Adding other routes to a path\nJust add more files to the directory!  Adding ./resources/newone.js will make the handler in that file available \nat the /newone url . \n\n## About the 'app' parameter.\nWhen you create an instance of Percolator, you need to pass it a config object that will later be available in all\nresource methods as `this.app`.  Required parameters for this config object are:  \n\n  **protocol** - 'http' or 'https'  \n  **resourceDir** - the filesystem directory where the resources can be found (use an absolute path!)  \n  **resourcePath** - the url path that all the resource will be routed from (eg. Setting it to '/' will serve the \n  resources from http://yourdomain.com/ while setting it to '/api' will serve the resources from \n  http://yourdomain.com/api .  \n  **staticDir** - The directory on the filesystem from which you will serve static content (use an absolute path!).  \n  **port** - the http port.  A low port like 80 will not work unless you run the app with root privileges.  \n  \nIt's also important to note that you can add your own parameters as well.  It's a great way to instantiate shared \nresources (like a database connection) in the main application and pass it to all resources.\n\nYou're obviously going to want to limit the number of `app` variables that you add beyond the necessary ones, but\ncertain types of objects might make sense in that shared space.\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n### General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n### Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString({somevar : \"somevalue\"}});\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.2.5","dist":{"shasum":"31848847508c8346e9d6a26aec8a2f3f2b3a3b8a","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.2.5.tgz"}},"0.2.6":{"name":"Percolator","description":"Percolator is a framework for quickly and easily building quality HTTP APIs in Node.js","keywords":["api","rest","http","resource","hypermedia"],"version":"0.2.6","bugs":{"url":"https://github.com/cainus/percolator/issues"},"scripts":{"test":"make test"},"maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"dependencies":{"express":"3.0.0beta6","underscore":"","resorcery":"0.1.3","detour":"0.8.14","reaper":"0.1.3","walk":"2.1.1","elementtree":"0.1.1"},"devDependencies":{"mockery":"1.1.2","hottap":"1.0.0","mocha":"1.3.0","should":"0.3.2"},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality http APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\nIs this project ready to use?  Kind-of-sort-of.  Not in Production though.\n\n## Hello World Quick Start:\n*  `npm install Percolator`\n*  Create a `server.js` in your project directory, and copy this code below into it:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.router.route('/', {  GET : function(req, res){\n                              res.end(\"Hello World!\");\n                            }});\nserver.listen(function(err){\n  console.log('server is listening on port ', server.port);\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ and be completely floored by the greatest \nAPI of all time.  Or not.\n\n## Hello World Refactored:\n\nWhile this is pretty simple, it's also not super-interesting.  One of the interesting features of \nPercolator is that it lets you load your route-handling code from external files instead:\n\n* Move your \"Hello World\" handler into a file at the path `./resources/_index.js` by first creating the \n`resources` directory and then the `_index.js` file in it and then copying the handler logic into `_index.js`\nlike so:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.end('Hello World!');\n    }\n  }\n```\nWe'll call files like that \"resources\" from now on.\n\n\n* Change your server.js to call `routeDirectory()` instead of `server.router.route()` like so:\n\n```javascript\nvar Percolator = require('Percolator');\n\nvar server = new Percolator();\nserver.routeDirectory(__dirname + '/resources', function(err){\n  if (!!err) {console.log(err);}\n  server.listen(function(err){\n    console.log('server is listening on port ', server.port);\n  });\n});\n\n```\n\n*  Run the server:\n```\n  node server.js\n```\n\n*  See your \"Hello World\" output at http://localhost:3000/ .\n\n## What's a \"resource\"?\nResources are where you put your code for handling http requests (and their responses).  \n\nA single resource handles all the HTTP methods for a single URL path.  Any object that provides the HTTP methods \ncan be used and just has to be exported as a javascript module.  Our \"Hello World\" example is just providing the \nGET method, so when your users use other methods like POST and DELETE on it will just respond with 405 errors.  \nYou can easily implement any other HTTP method that you want, by just defining the function by that name (use all \ncaps!).\n\nResources are just node modules that Percolator automaticaly require()s.  You have to export them as \"handler\" \nlike in the \"Hello World\" example above.\"\n\nAny particular method that you implement takes request and response parameters, in that order (The \"Hello World\"\nexample just calls them 'req' and 'res' respectively)).  These are the [request]( http://nodejs.org/api/http.html#http_class_http_serverrequest )\nand [response]( http://nodejs.org/api/http.html#http_class_http_serverresponse ) objects from node itself.\n\n\n## How routing works\nYour resource directory and the files and subdirectories in it are routed to URLs, so that the organization on \nthe filesystem dictates your urls.  This means:\n* you don't have to maintain a list of routes anywhere\n* you know exactly where to find everything \n* you have a simple convention for code organization.\n\n### The base path\nThe base path is the URI path under which all of your resources will be served. It's called `resourcePath` in \nyour application config (see the quick start for an example of setting it to '/').  It doesn't need to be set \nto '/', for instance -- you could set it to /api, and then the quick start example would serve from /api instead.\n\n### The _index.js file.\nThe server won't start without an _index.js file.  It's the resource that handles requests to your base path.\n\n### Adding other routes to a path\nJust add more files to the directory!  Adding ./resources/newone.js will make the handler in that file available \nat the /newone url . \n\n## About the 'app' parameter.\nWhen you create an instance of Percolator, you need to pass it a config object that will later be available in all\nresource methods as `this.app`.  Required parameters for this config object are:  \n\n  **protocol** - 'http' or 'https'  \n  **resourceDir** - the filesystem directory where the resources can be found (use an absolute path!)  \n  **resourcePath** - the url path that all the resource will be routed from (eg. Setting it to '/' will serve the \n  resources from http://yourdomain.com/ while setting it to '/api' will serve the resources from \n  http://yourdomain.com/api .  \n  **staticDir** - The directory on the filesystem from which you will serve static content (use an absolute path!).  \n  **port** - the http port.  A low port like 80 will not work unless you run the app with root privileges.  \n  \nIt's also important to note that you can add your own parameters as well.  It's a great way to instantiate shared \nresources (like a database connection) in the main application and pass it to all resources.\n\nYou're obviously going to want to limit the number of `app` variables that you add beyond the necessary ones, but\ncertain types of objects might make sense in that shared space.\n\n## The \"uri\" API\nEach method you define has access to a 'uri' module that understands the context of each particular request \nthat it's used in.  The module makes a number of convenient methods available for dealing with uri's and \ngenerally making the parsing of uri's simpler and the creation of new uri's simple.  Here are example usages:\n\n### General Usage:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send(this.uri.self());   // this will return the current url\n    }\n  }\n```\n\n### Api specifics:\n\n```javascript\nthis.uri.absolute(path)\n```\nTakes a relative path and returns an absolute path.\n\n```javascript\nthis.uri.help()\n```\nreturns an object containing a bunch of method names from this module and their values.  Useful for debugging.\n\n\n```javascript\nthis.uri.self()\n```\nreturns the current uri (as an absolute uri).\n\n```javascript\nthis.uri.params()\n```\nreturns an object containing the name/value pairs of variables extracted from the uri's \"path\" (NOT \nincluding querystring).  An optional uri may be passed in, but the default is to use the current \nrequest's uri. \n\n```javascript\nthis.uri.param(\"someparam\");\n```\nRetrieves the specified param value by the input param name from the object returned by this.uri.params() \n(see above).  \n\n```javascript\nthis.uri.urlEncode(somestr);\n```\ntake a string and return a url-encoded version of it\n\n```javascript\nthis.uri.urlDecode(someEncodedStr)\n```\ntake a url-encoded string and return a decoded version of it.\n\n\n```javascript\nthis.uri.query();\n```\nGet the querystring data off the current url as an object with the name/value pairs in the querystring.  An \nalternative url can optionally be passed in.\n\n```javascript\nthis.uri.queryString({somevar : \"somevalue\"}});\n```\nTake an input object and create a querystring of the name/value pairs in the object.\n\n```javascript\nthis.uri.pathJoin(\"asdf\", [\"qwer\", \"tyui\"], \"1234\");\n```\nTakes a list of strings and arrays of strings and returns a forward-slash-delimited path of all the pieces\nin the order that they appear (without a trailing slash).\n\n\n```javascript\nthis.uri.links();\n```\nReturns a dictionary of links that the router knows about for this resource, usually including parent and self\nlinks and possibly child urls.\n\n```javascript\nthis.uri.parent();\n```\nGet the parent URI of the current URI.  An optional URI may be passed in to get its' parent's URI instead.\n\n\n```javascript\nthis.uri.namedKids();\n```\nGet a dictionary of all the child urls with their names.\n\n\n```javascript\nthis.uri.kids();\n```\nGet a dictionary of all the child urls with their names if the have names.\n\n\n```javascript\nthis.uri.parse();\n```\nReturns the result of node's url.parse ( http://nodejs.org/docs/v0.9.0/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost ) \nfor the current URI.  An optional URI can be passed to use that one instead.  \n\n\n\n```javascript\nthis.url.get(); = function(nameOrPath, varDict){\n```\nGets a url by name, or path.  An optional dictionary may be passed of variables to fille in necessary path variables.\n\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so \nthat the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html to see what \na full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n\n## Automated Tests:\nnpm test\n","_id":"Percolator@0.2.6","dist":{"shasum":"b1d389d7fee019f53e43b528ce625b479a3887cb","tarball":"http://registry.npmjs.org/Percolator/-/Percolator-0.2.6.tgz"}}},"readme":"# Percolator\n[![Build\nStatus](https://secure.travis-ci.org/cainus/percolator.png?branch=master)](http://travis-ci.org/cainus/percolator)\n\nPercolator is a framework for quickly and easily building quality web APIs with node.js.  \n\nIt is intended for developers who want to build great APIs, but don't want to\nhave to write tedious boiler plate code over-and-over to achieve it.\n\nIt aims to be a great tool for building public-quality APIs, as well as being\nbetter suited for apps that perform all of their view logic on the client-side,\nlike mobile apps and single-page apps.\n\n\n## Quick Examples:\n\n### Hello World\nTo create a simple read-only /helloworld resource that responds with \"Hello\nWorld!\", create a file in the root resources directory called \"helloworld.js\"\nand put this in it:\n\n```javascript\n  exports.handler = {\n    GET : function(req, res){\n      res.send('Hello World!');\n    }\n  }\n```\n\n\"req\" and \"res\" are simply express's request and response objects.\n\n### Collections\nTo create a \"/rockband\" collection resource based on a \"rockband\" Mongo collection, \ncreate a file called \"rockband.js\" and put this in it:\n\n```javascript\n  const MongoResource = require('../lib/resourceTypes/MongoResource').MongoResource;\n  exports.handler = new MongoResource('rockbands', {\n    'name' : { type: String, match: /[a-zA-z0-9\\.]/, required : true },\n    'created' : { type: Date, default: Date.now, required : true }\n  })\n```\n\nYou'll automatically get a \"rockband\" collection that you can GET and POST to\n(with validations), that stores in Mongo.  Every rockband that you add via POST\nwill be available at its own URL afterward, for GETting, updating via PUT and\ndeleting via DELETE.  Here's how a GET on /rockband looks when it has one rock\nband:\n\n```javascript\n  {\n    items: [\n      {\n        created: \"2012-03-17T19:39:28.200Z\",\n        name: \"The Clash\",\n        _id: \"1234\",\n        links: {\n          parent: {\n            href: \"/api/artist/\"\n          },\n          self: {\n            href: \"/api/artist/1234\"\n          }\n        }\n      }\n    ],\n    links: {\n      parent: {\n        href: \"/api\"\n      },\n      self: {\n        href: \"/api/artist/\"\n      }\n    }\n  }\n```\n\nHere's how a GET on /rockband/1234 looks:\n\n```javascript\n  {\n      created: \"2012-03-17T19:39:28.200Z\",\n      name: \"The Clash\",\n      _id: \"1234\",\n      links: {\n        parent: {\n          href: \"/api/artist/\"\n        },\n        self: {\n          href: \"/api/artist/1234\"\n        }\n      }\n    }\n```\n\nHere's how a GET on /rockband/4567 (which doesn't exist!) looks (with a 404\nstatus):\n\n```javascript\n  {\n    error: {\n      type: \"RecordNotFoundError\",\n      message: \"A record with the given id could not be found.\",\n      detail: \"4567\"\n    }\n  }\n```\n\n## Values\n### Make the hard stuff simple\n* Get the HTTP/REST-Nerd stuff (serialization, authentication, hypermedia, status codes) right so that the developer doesn't have to.  See http://wiki.basho.com/Webmachine-Diagram.html \nto see what a full featured server should be doing on each request.\n\n### Make the tedious stuff less tedious\n* Implicit / Automatic Routing.  Each resource is in its own file (which is just a node.js module) and is routed \nautomatically without you having to route explicitly.\n* Automatic resource linking where possible, if desired.\n* Make creating collections (especially based on databases) as easy as possible.\n\n### Keep the simple stuff simple\n* HTTP is simple.  If you know HTTP, you know the names of the methods of a Percolator resource.\n* Can't do what you want within the framework?  Percolator is built on express.js, so you can \ndrop back to using that framework directly anytime you need to.\n* Continue to allow full control of request handling and response generation.\n* No magic, and no code generators.\n\n## Current State:\n* Percolator is in an experimental stage, but it's built on express.js, so you \ncan always fall back to express if something doesn't work for you.  I'd \nlove to hear of other people using it and giving feedback/bug reports so I can \niron out all the wrinkles.  \n\n## Some glaring limitations being worked on:\n* Built-in (stateless) authentication methods so the user doesn't have to write her own.\n* Other data-store helpers than just mongo, so the user doesn't have to write her own.\n* Other representation formats than just \"application/json\", and a better factoring to \nallow custom media-types (per resource, even) if the user wishes.\n* better support for other cross-cutting \"aspects\" like logging and throttling\n\n## Automated Tests:\nnpm test\n","maintainers":[{"name":"cainus","email":"gregg@caines.ca"}],"time":{"modified":"2012-08-14T23:11:43.988Z","created":"2012-03-19T03:42:56.146Z","0.0.1":"2012-03-19T03:42:58.281Z","0.1.0":"2012-06-12T11:58:29.101Z","0.1.1":"2012-06-20T14:55:48.813Z","0.1.2":"2012-07-17T05:52:20.770Z","0.1.3":"2012-07-17T05:55:02.921Z","0.1.4":"2012-07-22T16:44:56.626Z","0.1.5":"2012-07-31T02:51:04.757Z","0.1.6":"2012-07-31T17:06:39.054Z","0.1.7":"2012-08-04T15:34:29.528Z","0.1.8":"2012-08-04T23:56:14.593Z","0.1.9":"2012-08-05T20:57:03.882Z","0.1.10":"2012-08-06T03:31:58.787Z","0.2.1":"2012-08-11T18:10:34.178Z","0.2.2":"2012-08-11T19:54:15.982Z","0.2.3":"2012-08-12T01:58:42.498Z","0.2.4":"2012-08-14T18:05:55.148Z","0.2.5":"2012-08-14T22:11:20.096Z","0.2.6":"2012-08-14T23:11:43.988Z"},"users":{"fgribreau":true},"_attachments":{"Percolator-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-PJn6CqSF/x3iw9dKU2v4Kw==","length":15483,"stub":true},"Percolator-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-KjJkMlsNT95QO/qEluYMqw==","length":15443,"stub":true},"Percolator-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-Tm8v90edkhTpPmWehHCOFw==","length":15516,"stub":true},"Percolator-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-0dN6QguxgMIKoNpU9dZGwA==","length":15350,"stub":true},"Percolator-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-OdzGTEWBOQZTAeiLyrDZUg==","length":12759,"stub":true},"Percolator-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-X/ddVqCIr3MZAioQM6yYcA==","length":12769,"stub":true},"Percolator-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-4GT1MS9GDYDyRY3BBbFAqw==","length":11004,"stub":true},"Percolator-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-lazeIeu8PyScVim8iN4UZA==","length":11003,"stub":true},"Percolator-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-8UZoco+Owrr162KjkHmeeg==","length":11006,"stub":true},"Percolator-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-/nW7c/dX1jTBzC2YfLNFHg==","length":11004,"stub":true},"Percolator-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-pFVUPQQaT5HRvyHhoozAAg==","length":10779,"stub":true},"Percolator-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+nlTwfMwht6L0mzDTu4cBA==","length":10738,"stub":true},"Percolator-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Pl2iJ8QxhZR6TjQcWQ/kIA==","length":8036,"stub":true},"Percolator-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dsfvNGuE/EPKPniobiExpw==","length":8083,"stub":true},"Percolator-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-w1xid37gHNmdNd1Z8kDnDw==","length":8089,"stub":true},"Percolator-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pALgd06c2wL3aOqJ9BSrzA==","length":8076,"stub":true},"Percolator-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2mZj2LuIygy5NUFsoDqzcw==","length":7777,"stub":true},"Percolator-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9dWQg+3nZwJxRpL5dnk7bQ==","length":17007,"stub":true}}}},
{"id":"PerfDriver","key":"PerfDriver","value":{"rev":"2-b448fb2f407f341b8df7032f29e4920f"},"doc":{"_id":"PerfDriver","_rev":"2-b448fb2f407f341b8df7032f29e4920f","name":"PerfDriver","description":"Test tool","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"PerfDriver","description":"Test tool","version":"0.0.1","author":{"name":"Mark Fink","email":"mark@mark-fink.de"},"repository":{"type":"git","url":"http://www.testing-software.org"},"keywords":["Testing","Performance"],"main":"./lib/perfdriver","scripts":{"test":"zombie"},"engines":{"node":">= 0.4.0"},"_id":"PerfDriver@0.0.1","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"50cf781742f41d71d5b90a1df296f05a491d1d5c","tarball":"http://registry.npmjs.org/PerfDriver/-/PerfDriver-0.0.1.tgz"}}},"maintainers":[{"name":"mark","email":"mark@mark-fink.de"}],"time":{"modified":"2011-02-14T20:10:36.791Z","created":"2011-02-14T20:10:36.251Z","0.0.1":"2011-02-14T20:10:36.791Z"},"author":{"name":"Mark Fink","email":"mark@mark-fink.de"},"repository":{"type":"git","url":"http://www.testing-software.org"}}},
{"id":"PicoMachine","key":"PicoMachine","value":{"rev":"3-dfd6dba1ffc3471a05cd7b69c09f2d9e"},"doc":{"_id":"PicoMachine","_rev":"3-dfd6dba1ffc3471a05cd7b69c09f2d9e","name":"PicoMachine","description":"PicoMachine: javascript version of the ruby MicroMachine","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"PicoMachine","description":"PicoMachine: javascript version of the ruby MicroMachine","version":"0.0.1","author":{"name":"elCuervo","email":"elcuervo@elcuervo.co"},"keywords":["statemachine"],"directories":{"lib":"./lib","test":"./test"},"repositories":[{"type":"git","url":"git://github.com/elcuervo/picomachine.git"}],"main":"./lib/picomachine.js","_npmUser":{"name":"elcuervo","email":"elcuervo@elcuervo.co"},"_id":"PicoMachine@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"f5224fe32f4c579307f8173d7a0bb3ccc9f552ac","tarball":"http://registry.npmjs.org/PicoMachine/-/PicoMachine-0.0.1.tgz"},"maintainers":[{"name":"elcuervo","email":"elcuervo@elcuervo.co"}]}},"maintainers":[{"name":"elcuervo","email":"elcuervo@elcuervo.co"}],"time":{"modified":"2011-12-20T21:21:14.988Z","created":"2011-12-20T21:21:08.503Z","0.0.1":"2011-12-20T21:21:14.988Z"},"author":{"name":"elCuervo","email":"elcuervo@elcuervo.co"},"_attachments":{"PicoMachine-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QgHF1oMW+INiRG6P09tEVQ==","length":10240,"stub":true}}}},
{"id":"Pictionary","key":"Pictionary","value":{"rev":"37-d2c811bef67405977a85b195ae3cd771"},"doc":{"_id":"Pictionary","_rev":"37-d2c811bef67405977a85b195ae3cd771","name":"Pictionary","description":"Enjoyable Pictionary game working with Node.js and Socket.io","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"Pictionary","version":"0.0.1","description":"Enjoyable Pictionary game working with Node.js and Socket.io","keywords":["pictionary","draw","drawing","game","socket.io","nodejs","node.js"],"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"dependencies":{"socket.io":"","sanitizer":""},"engine":"node >= 0.4.7","repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_npmUser":{"name":"davefrassoni","email":"davefrassoni@gmail.com"},"_id":"Pictionary@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"946ab204b6c5af51d7d6586c58bc9e8cb3d6ce17","tarball":"http://registry.npmjs.org/Pictionary/-/Pictionary-0.0.1.tgz"},"maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}],"directories":{}},"0.0.2":{"name":"Pictionary","version":"0.0.2","description":"Enjoyable Pictionary game working with Node.js and Socket.io","keywords":["pictionary","draw","drawing","game","socket.io","nodejs","node.js"],"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"dependencies":{"socket.io":"","sanitizer":""},"engine":"node >= 0.4.7","repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_npmUser":{"name":"davefrassoni","email":"davefrassoni@gmail.com"},"_id":"Pictionary@0.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"fd7d70cf345a9ec68a1633a130fb630a5688073c","tarball":"http://registry.npmjs.org/Pictionary/-/Pictionary-0.0.2.tgz"},"maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}],"directories":{}},"0.0.3":{"name":"Pictionary","version":"0.0.3","description":"Enjoyable Pictionary game working with Node.js and Socket.io","keywords":["pictionary","draw","drawing","game","socket.io","nodejs","node.js"],"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"dependencies":{"socket.io":"","sanitizer":""},"engine":"node >= 0.4.7","repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_npmUser":{"name":"davefrassoni","email":"davefrassoni@gmail.com"},"_id":"Pictionary@0.0.3","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0c7105aece2f6423c330e14afbf9260e6769c3eb","tarball":"http://registry.npmjs.org/Pictionary/-/Pictionary-0.0.3.tgz"},"maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}],"directories":{}},"0.1.0":{"name":"Pictionary","version":"0.1.0","description":"Enjoyable Pictionary game working with Node.js and Socket.io","keywords":["pictionary","draw","drawing","game","socket.io","nodejs","node.js"],"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"dependencies":{"socket.io":"","sanitizer":""},"engine":"node >= 0.4.7","repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_npmUser":{"name":"davefrassoni","email":"davefrassoni@gmail.com"},"_id":"Pictionary@0.1.0","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7ecbdf27e76d8cdad5913906d94fd62ac69175a2","tarball":"http://registry.npmjs.org/Pictionary/-/Pictionary-0.1.0.tgz"},"maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}],"directories":{}},"0.1.1":{"name":"Pictionary","version":"0.1.1","description":"Enjoyable Pictionary game working with Node.js and Socket.io","keywords":["pictionary","draw","drawing","game","socket.io","nodejs","node.js"],"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"dependencies":{"socket.io":"","sanitizer":""},"engine":"node >= 0.4.7","repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_npmUser":{"name":"davefrassoni","email":"davefrassoni@gmail.com"},"_id":"Pictionary@0.1.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"3aae5e562021f5570512331fe0a41cfabddae07b","tarball":"http://registry.npmjs.org/Pictionary/-/Pictionary-0.1.1.tgz"},"maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}]},"0.1.2":{"name":"Pictionary","version":"0.1.2","description":"Enjoyable Pictionary game working with Node.js and Socket.io","keywords":["pictionary","draw","drawing","game","socket.io","nodejs","node.js"],"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"dependencies":{"socket.io":"","sanitizer":""},"engine":"node >= 0.4.7","repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_npmUser":{"name":"davefrassoni","email":"davefrassoni@gmail.com"},"_id":"Pictionary@0.1.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2bcd73390e667efc693c7665e8dcd9719d2ad19a","tarball":"http://registry.npmjs.org/Pictionary/-/Pictionary-0.1.2.tgz"},"maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}]}},"readme":"# Pictionary #\ncurrent version: 0.0.1\n\n## Description ##\n\n### Enjoyable Pictionary game working with Node.js and Socket.io ###\n\n## Installation ##\n\n### Either download from GitHub or run: ###\n\n\t\tnpm install Pictionary\n\n## Setup ##\n\n1. Run:\n\n\t\tnode server.js\n\n1. Browse to:\n\n\t\thttp://localhost:8080/index.html\n\n1. Modify code as you want\n\n1. Enjoy the Pictionary!","maintainers":[{"name":"davefrassoni","email":"davefrassoni@gmail.com"}],"time":{"modified":"2012-06-26T23:03:44.188Z","created":"2012-05-25T14:51:21.547Z","0.0.1":"2012-05-25T14:51:25.333Z","0.0.2":"2012-05-27T19:49:58.982Z","0.0.3":"2012-05-30T03:45:21.411Z","0.1.0":"2012-06-14T03:37:10.141Z","0.1.1":"2012-06-15T03:23:31.392Z","0.1.2":"2012-06-26T23:03:44.188Z"},"author":{"name":"Dave Frassoni","email":"me@davefrassoni.com","url":"http://davefrassoni.com/"},"repository":{"type":"git","url":"git://github.com/davefrassoni/Pictionary.git"},"_attachments":{"Pictionary-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-YuvXGBCZ0Tu+HdS67CUw7w==","length":84590,"stub":true},"Pictionary-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-c1+zAIScyGeRlGABcAFrjQ==","length":84574,"stub":true},"Pictionary-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-wGREEbzKvkQqhyJabNzdJg==","length":84168,"stub":true},"Pictionary-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-3+Yfm8ZjWMfPzG5DGne/UA==","length":67065,"stub":true},"Pictionary-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-wbudKo+wdVdCOuGrVXq+QQ==","length":62138,"stub":true},"Pictionary-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bIvtE00Xd0YXPkkwFhR+tg==","length":62053,"stub":true}}}},
{"id":"PostgresClient","key":"PostgresClient","value":{"rev":"8-2baec6847f8ad7dcf24b7d61a4034163"},"doc":{"_id":"PostgresClient","_rev":"8-2baec6847f8ad7dcf24b7d61a4034163","name":"PostgresClient","description":"A PostgreSQL client library for Node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"PostgresClient","version":"0.0.1","description":"A PostgreSQL client library for Node.js","homepage":"http://github.com/Frans-Willem/node-PostgresClient.git","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"git://github.com/Frans-Willem/node-PostgresClient.git"},"directories":{"lib":"./lib"},"main":"./lib/PostgresClient","dependencies":{"bufferlib":">=0.0.6","strtok":">=0.1.0"},"_id":"PostgresClient@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/PostgresClient/-/PostgresClient-0.0.1.tgz"},"mtime":"2010-11-09T23:33:35Z","ctime":"2010-11-09T23:33:35Z"},"0.0.2":{"name":"PostgresClient","version":"0.0.2","description":"A PostgreSQL client library for Node.js","homepage":"http://github.com/Frans-Willem/node-PostgresClient.git","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"git://github.com/Frans-Willem/node-PostgresClient.git"},"directories":{"lib":"./lib"},"main":"./lib/PostgresClient","dependencies":{"bufferlib":">=0.0.6","strtok":">=0.1.0"},"_id":"PostgresClient@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/PostgresClient/-/PostgresClient-0.0.2.tgz"},"mtime":"2010-11-09T23:33:36Z","ctime":"2010-11-09T23:33:36Z"}},"maintainers":[{"name":"frans-willem","email":"fw@hardijzer.nl"}],"mtime":"2010-11-09T23:33:36Z","ctime":"2010-11-09T23:33:35Z","author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"git://github.com/Frans-Willem/node-PostgresClient.git"},"_attachments":{"PostgresClient-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-a3VoMyQEy3A4ssbZS5MflA==","length":14872,"stub":true},"PostgresClient-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BglRmOTKgsMD46+S0xqv7Q==","length":14530,"stub":true}}}},
{"id":"PrettyCSS","key":"PrettyCSS","value":{"rev":"7-e9f0715a29951596f528bfd9711562aa"},"doc":{"_id":"PrettyCSS","_rev":"7-e9f0715a29951596f528bfd9711562aa","name":"PrettyCSS","description":"CSS pretty printer, lint checker, and validator","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"PrettyCSS","version":"0.1.0","preferGlobal":true,"author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"description":"CSS pretty printer, lint checker, and validator","homepage":"http://fidian.com/PrettyCSS","contributors":[{"name":"Tyler Akins","email":"fidian@rumkin.com","url":"http://rumkin.com/"}],"bin":{"prettycss":"./bin/cli.js"},"scripts":{"test":"vows --spec --isolate"},"main":"./lib/prettycss.js","repository":{"type":"git","url":"git://github.com/fidian/prettycss.git"},"keywords":["css","beautifier","pretty-printer","lint","validator"],"dependencies":{"OptionParser":"git+https://github.com/fidian/OptionParser.git"},"devDependencies":{"browserify":"*","diff":"*","vows":"*"},"license":"MIT","engines":{"node":"~0.6","npm":"~1"},"_npmUser":{"name":"fidian","email":"fidian@rumkin.com"},"_id":"PrettyCSS@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"879853f537e787abc4d1d54c3f67c81b48630aa6","tarball":"http://registry.npmjs.org/PrettyCSS/-/PrettyCSS-0.1.0.tgz"},"maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}]},"0.3.1":{"name":"PrettyCSS","version":"0.3.1","preferGlobal":true,"author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"description":"CSS pretty printer, lint checker, and validator","homepage":"http://fidian.com/PrettyCSS","contributors":[{"name":"Tyler Akins","email":"fidian@rumkin.com","url":"http://rumkin.com/"}],"bin":{"prettycss":"./bin/cli.js"},"scripts":{"test":"vows --spec --isolate"},"main":"./lib/prettycss.js","repository":{"type":"git","url":"git://github.com/fidian/prettycss.git"},"keywords":["css","beautifier","pretty-printer","lint","validator"],"dependencies":{"OptionParser":"git+https://github.com/fidian/OptionParser.git"},"devDependencies":{"browserify":"*","diff":"*","vows":"*"},"license":"MIT","engines":{"node":"~0.6","npm":"~1"},"_npmUser":{"name":"fidian","email":"fidian@rumkin.com"},"_id":"PrettyCSS@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2b3a37d7d0c7147ded888b8aa7ccd0b683575900","tarball":"http://registry.npmjs.org/PrettyCSS/-/PrettyCSS-0.3.1.tgz"},"maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}]},"0.3.2":{"name":"PrettyCSS","version":"0.3.2","preferGlobal":true,"author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"description":"CSS pretty printer, lint checker, and validator","homepage":"http://fidian.com/PrettyCSS","contributors":[{"name":"Tyler Akins","email":"fidian@rumkin.com","url":"http://rumkin.com/"}],"bin":{"prettycss":"./bin/cli.js"},"scripts":{"test":"vows --spec --isolate"},"main":"./lib/prettycss.js","repository":{"type":"git","url":"https://github.com/fidian/prettycss.git"},"keywords":["css","beautifier","pretty-printer","lint","validator"],"dependencies":{"OptionParser":"*"},"devDependencies":{"browserify":"*","diff":"*","vows":"*"},"license":"MIT","engines":{"node":"~0.6","npm":"~1"},"readme":"Description\n===========\n\nPrettyCSS is a project to make a CSS3-compliant parser, lint checker, and\npretty printer.  With this tool we will be able to check for CSS format\nviolations and then will beautify the code to standardize it.  With another\nconfiguration you are able to crunch your styles down as much as possible\nto produce minified output and we can just ignore the warnings.\n\nThis was created because there were no tools that I could download and use\non my own computer that also handled CSS3.  Also, we could really benefit\nfrom some hints and value validation that is now incorporated into PrettyCSS.\n\nThe PrettyCSS project is on [GitHub](https://github.com/fidian/prettycss/).\nFurther documentation is at http://fidian.com/prettycss and there's a little\nbit more under the docs/ folder inside the repository.\n\nInstallation\n============\n\nFirst, you can use the pretty printer *in your browser* without any\nadditional setup.  Take a look at http://www.fidian.com/prettycss and use the\nlive demo.  The HTML and JavaScript can be copied out of the repository and\nplaced wherever you need them.\n\nFor a little more power, or if you like using the command line to reformat\nyour CSS files, this is not too hard to get set up on your system.  First,\nyou will need [node.js](http://nodejs.org/) set up on your system.  Then\nyou can use `sudo npm install PrettyCSS` and it should be ready to use\non your system as the `prettycss` command.  Further, more detailed\ninstructions are at http://www.fidian.com/prettycss/installation and they\ngive you alternate ways that the program can get installed.\n\nUsage\n=====\n\nThe easiest way is to use the web interface.  You can do this by either\nopening www/test.html from the repository in your browser or by going to\nhttp://www.fidian.com/prettycss/ and looking at the live demo.  Both methods\nuse the current, bleeding-edge code that was committed to the repository.\nI suggest you go try it out and see what it can do!\n\nYou can also use the command line program.  If you installed PrettyCSS\nusing npm, then you can run the pretty printer quite easily.\n\n    prettycss my_input_file.css\n\nThere's a few options that are explained on the website at\nhttp://www.fidian.com/prettycss/command-line and those options control\nhow warnings and errors affect the pretty printing, and other ways to\nconfigure the software.\n\nLastly, this can also be linked into your existing JavaScript code, such\nas what you might be writing with [node.js](http://nodejs.org/).  You\ncould mirror the `prettycss` command-line program and make a new\n`PrettyCSS` object, then run the parser on a filename or a string containing\nCSS.  This also is easier for passing in your own options to control the\npretty printing.\n\nDependencies\n============\n\nThe JavaScript code that is used for node.js is bundled up by\n[browserify](https://github.com/substack/node-browserify).  This does add an\nextra compilation step when testing things in the browser, but it also\nprovides the benefit that we do not need to change any code to make it work\nin the browser and the scripts get transferred as a single file.\n\nThe tests are built with [vows](http://vowsjs.org/).  You can run them with\n`npm test` or `vows` in the top level directory of the repository.  There's\na lot of tests because we are asserting many little things with each of the\nvalue parsers that we use for handling CSS properties.\n\nContact\n=======\n\nFor feature requests, bug reports, or if you want to contribute to the project,\nplease check out the [GitHub Project Page](https://github.com/fidian/PrettyCSS).\n\nLicense\n=======\n\nThis code is provided under a MIT license with additional clauses restricting\npromotion with the author's names and an advertising clause.  See \ndocs/LICENSE.md for the full details.\n","_id":"PrettyCSS@0.3.2","dist":{"shasum":"adb4bb3f7c7c5bd374aa324967ff516a3b3bd239","tarball":"http://registry.npmjs.org/PrettyCSS/-/PrettyCSS-0.3.2.tgz"},"maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}]}},"readme":"Description\n===========\n\nPrettyCSS is a project to make a CSS3-compliant parser, lint checker, and\npretty printer.  With this tool we will be able to check for CSS format\nviolations and then will beautify the code to standardize it.  With another\nconfiguration you are able to crunch your styles down as much as possible\nand will just ignore the warnings.\n\nThis was created because there were no tools that I could download and use\non my own computer that also handled CSS3.\n\nThe PrettyCSS project is on [GitHub](https://github.com/fidian/prettycss/).\nFurther documentation is at http://fidian.com/prettycss\nList of authors is at docs/AUTHORS.md\n\nInstallation\n============\n\nIt isn't too hard to get this set up.  If you plan on using this on your\nserver, I think that [node.js](http://nodejs.org/) is one of the easiest\nJavaScript implementations to get running.  If you are going to do\ndevelopment and will be rebundling the code into the browser-centric version,\nyou will need node.js and [npm](http://npmjs.org/) to run browserify.\n\nSee docs/INSTALL.md for further information.\n\nUsage\n=====\n\nStill working on this one.  Bug me to update the README.md for the project.\n\nThe easiest way is to use the web interface by opening www/test.html in\nyour favorite browser.\n\nThis can also be linked into your existing JavaScript code, such as what you\nmight be writing with [node.js](http://nodejs.org/).\n\nDependencies\n============\n\nThe JavaScript code that is used for node.js is bundled up by\n[browserify](https://github.com/substack/node-browserify).  This does add an\nextra compilation step when testing things in the browser, but it also\nprovides the benefit that we do not need to change any code to make it work\nin the browser and the scripts get transferred as a single file.\n\nContact\n=======\n\nFor feature requests, bug reports, and to get additional information, email\nfidian@rumkin.com or contact me via [GitHub](https://github.com/fidian/).\n\nLicense\n=======\n\nThis code is provided under a MIT license with additional clauses restricting\npromotion with the author's names and an advertising clause.  See \ndocs/LICENSE.md for the full details.\n\n","maintainers":[{"name":"fidian","email":"fidian@rumkin.com"}],"time":{"modified":"2012-07-03T15:54:26.409Z","created":"2012-06-15T13:50:34.237Z","0.1.0":"2012-06-15T13:50:35.035Z","0.3.1":"2012-06-15T14:00:03.543Z","0.3.2":"2012-07-03T15:54:26.409Z"},"author":{"name":"Tyler Akins","email":"fidian@rumkin.com"},"repository":{"type":"git","url":"https://github.com/fidian/prettycss.git"},"_attachments":{"PrettyCSS-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RWrCScMXfeTFmmsf4UTPkQ==","length":696411,"stub":true},"PrettyCSS-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sn6b3MzGWPC5QoVQgep2cA==","length":689863,"stub":true},"PrettyCSS-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6KCXAY8m3kI06K7c5WOO6Q==","length":185226,"stub":true}}}},
{"id":"Probes.js","key":"Probes.js","value":{"rev":"5-f5feb70022eea39a29c2d9ab86afa4ef"},"doc":{"_id":"Probes.js","_rev":"5-f5feb70022eea39a29c2d9ab86afa4ef","name":"Probes.js","description":"A simple Node.js module to get server performance statistics","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Probes.js","preferGlobal":"true","version":"0.0.1","author":{"name":"Prolific Lab","email":"contact@prolificlab.com"},"description":"a simple zero-configuration command-line http server","contributors":[{"name":"Christophe Harrer","email":"c.harrer@prolificlab.com"}],"repository":{"type":"git","url":"git://github.com/ProlificLab/Probes.js.git"},"keywords":["monitoring","performance","statistics"],"dependencies":{"chai":">0.0.1","async":">0.0.1","mocha":">0.0.1","nodeunit":"*"},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"ProlificLab","email":"contact@prolificlab.com"},"_id":"Probes.js@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"91c632def365d49e9420faf7b5329dc62c4db164","tarball":"http://registry.npmjs.org/Probes.js/-/Probes.js-0.0.1.tgz"},"maintainers":[{"name":"ProlificLab","email":"contact@prolificlab.com"}]},"0.0.2":{"name":"Probes.js","preferGlobal":"true","version":"0.0.2","author":{"name":"Prolific Lab","email":"contact@prolificlab.com"},"description":"A simple Node.js module to get server performance statistics","contributors":[{"name":"Christophe Harrer","email":"c.harrer@prolificlab.com"}],"repository":{"type":"git","url":"git://github.com/ProlificLab/Probes.js.git"},"keywords":["monitoring","performance","statistics"],"dependencies":{"chai":">0.0.1","async":">0.0.1","mocha":">0.0.1"},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"ProlificLab","email":"contact@prolificlab.com"},"_id":"Probes.js@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"37b81ccd6482f5171be99e3a2d4fe63fc553bfb0","tarball":"http://registry.npmjs.org/Probes.js/-/Probes.js-0.0.2.tgz"},"maintainers":[{"name":"ProlificLab","email":"contact@prolificlab.com"}]}},"readme":"# Usage","maintainers":[{"name":"ProlificLab","email":"contact@prolificlab.com"}],"time":{"modified":"2012-04-25T13:04:34.921Z","created":"2012-04-24T11:31:46.377Z","0.0.1":"2012-04-24T11:31:48.155Z","0.0.2":"2012-04-25T13:04:34.921Z"},"author":{"name":"Prolific Lab","email":"contact@prolificlab.com"},"repository":{"type":"git","url":"git://github.com/ProlificLab/Probes.js.git"},"_attachments":{"Probes.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4kvhEApL8+eSiIy70unhWA==","length":10240,"stub":true},"Probes.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wCC5HiSWNA2SmA6hmgkgVw==","length":10240,"stub":true}}}},
{"id":"R.js","key":"R.js","value":{"rev":"13-5257a82cff2b40ebc3c7f47b454a48f1"},"doc":{"_id":"R.js","_rev":"13-5257a82cff2b40ebc3c7f47b454a48f1","name":"R.js","description":"R.js is a simple i18n framework for Javascript, both in browser and in node","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.2":{"name":"R.js","version":"0.1.2","description":"R.js is a simple i18n framework for Javascript, both in browser and in node","homepage":"http://github.com/keithamus/R.js","keywords":["i18n","R.js","server","browser","node","ender"],"maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"https://github.com/keithamus/R.js"}],"main":"./R.js","ender":"./R.enderBridge.js","_npmJsonOpts":{"file":"/Users/cirkelk/.npm/R.js/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"R.js@0.1.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"49bcf6c4374ec4f3f57ea51113882e04dc6b3131","tarball":"http://registry.npmjs.org/R.js/-/R.js-0.1.2.tgz"},"directories":{}},"0.1.3":{"name":"R.js","version":"0.1.3","description":"R.js is a simple i18n framework for Javascript, both in browser and in node","homepage":"http://keithamus.github.com/R.js","keywords":["i18n","R.js","server","browser","node","ender"],"maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"https://github.com/keithamus/R.js"}],"main":"./R.js","ender":"./R.enderBridge.js","_npmJsonOpts":{"file":"/Users/cirkelk/.npm/R.js/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"R.js@0.1.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"aa28c210ae4f38be33063fd221113b91e10cc35c","tarball":"http://registry.npmjs.org/R.js/-/R.js-0.1.3.tgz"}},"0.1.4":{"name":"R.js","version":"0.1.4","description":"R.js is a simple i18n framework for Javascript, both in browser and in node","homepage":"http://keithamus.github.com/R.js","keywords":["i18n","R.js","server","browser","node","ender"],"maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"https://github.com/keithamus/R.js"}],"main":"./R.js","ender":"./R.enderBridge.js","_npmUser":{"name":"keithamus","email":"npm@keithcirkel.co.uk"},"_id":"R.js@0.1.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0e51c1677625d2740fb351e1a57bfd267e6eb8b8","tarball":"http://registry.npmjs.org/R.js/-/R.js-0.1.4.tgz"}},"0.1.5":{"name":"R.js","version":"0.1.5","description":"R.js is a simple i18n framework for Javascript, both in browser and in node","homepage":"http://keithamus.github.com/R.js","keywords":["i18n","R.js","server","browser","node","ender"],"maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"https://github.com/keithamus/R.js"}],"main":"./R.js","ender":"./R.enderBridge.js","_npmUser":{"name":"keithamus","email":"npm@keithcirkel.co.uk"},"_id":"R.js@0.1.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3db6c6e0f06ef88428f60a7cfc9b5e300587736e","tarball":"http://registry.npmjs.org/R.js/-/R.js-0.1.5.tgz"}}},"maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"time":{"modified":"2011-12-23T23:52:10.215Z","created":"2011-09-22T22:28:03.857Z","0.1.2":"2011-09-22T22:28:04.401Z","0.1.3":"2011-09-25T22:21:13.462Z","0.1.4":"2011-12-23T23:51:32.585Z","0.1.5":"2011-12-23T23:52:10.215Z"},"_attachments":{"R.js-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-dT9/5bwdrCbBG5pIO9pWOw==","length":10240,"stub":true},"R.js-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-AzI7mgNIYPe3cQUqwXJwUQ==","length":10240,"stub":true},"R.js-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-59KBmaDmvV1skjLNZMg7ZQ==","length":4428,"stub":true},"R.js-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7IYL/haD9zQixqaI2S0XCw==","length":31962,"stub":true}}}},
{"id":"R2","key":"R2","value":{"rev":"13-876994d3276f81179b43d2e1d83150f4"},"doc":{"_id":"R2","_rev":"13-876994d3276f81179b43d2e1d83150f4","name":"R2","description":"a CSS LTR ∞ RTL converter","dist-tags":{"latest":"1.1.2"},"versions":{"1.0.0":{"name":"R2","description":"a CSS LTR ∞ RTL converter","version":"1.0.0","homepage":"https://github.com/ded/r2","author":{"name":"Dustin Diaz","email":"@ded"},"main":"r2.js","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"engines":{"node":">= 0.4.1"},"bin":{"r2":"bin/r2"},"directories":{"bin":"bin"},"dependencies":{"sqwish":">= 0.2.0"},"devDependencies":{},"_id":"R2@1.0.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5ccbe543b9395ff2ac9bb6b419fce357cc879621","tarball":"http://registry.npmjs.org/R2/-/R2-1.0.0.tgz"},"scripts":{}},"1.0.1":{"name":"R2","description":"a CSS LTR ∞ RTL converter","version":"1.0.1","homepage":"https://github.com/ded/r2","author":{"name":"Dustin Diaz","email":"@ded"},"main":"r2.js","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"engines":{"node":">= 0.4.1"},"bin":{"r2":"bin/r2"},"directories":{"bin":"bin"},"dependencies":{"sqwish":">= 0.2.0"},"devDependencies":{},"_id":"R2@1.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"955bea70dad56a70ddcd325e2d853207bbe6b744","tarball":"http://registry.npmjs.org/R2/-/R2-1.0.1.tgz"},"scripts":{}},"1.0.2":{"name":"R2","description":"a CSS LTR ∞ RTL converter","version":"1.0.2","homepage":"https://github.com/ded/r2","author":{"name":"Dustin Diaz","email":"@ded"},"main":"r2.js","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"engines":{"node":">= 0.4.1"},"bin":{"r2":"bin/r2"},"directories":{"bin":"bin"},"dependencies":{"sqwish":">= 0.2.0"},"devDependencies":{},"_id":"R2@1.0.2","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"720d1a4d2643301f809d64e915956370fb305eb2","tarball":"http://registry.npmjs.org/R2/-/R2-1.0.2.tgz"},"scripts":{}},"1.1.0":{"name":"R2","description":"a CSS LTR ∞ RTL converter","version":"1.1.0","homepage":"https://github.com/ded/r2","author":{"name":"Dustin Diaz","email":"@ded"},"main":"r2.js","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"engines":{"node":">= 0.4.1"},"bin":{"r2":"bin/r2"},"directories":{"bin":"bin"},"dependencies":{},"devDependencies":{},"_id":"R2@1.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ff18f9a131ad72861260dd73c273a12ea524f112","tarball":"http://registry.npmjs.org/R2/-/R2-1.1.0.tgz"},"scripts":{}},"1.1.1":{"name":"R2","description":"a CSS LTR ∞ RTL converter","version":"1.1.1","homepage":"https://github.com/ded/r2","author":{"name":"Dustin Diaz","email":"@ded"},"main":"r2.js","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"engines":{"node":">= 0.4.1"},"bin":{"r2":"bin/r2"},"directories":{"bin":"bin"},"_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/R2/1.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"R2@1.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"67d647fe00e1d5078a59230285a1a6eda0b584dc","tarball":"http://registry.npmjs.org/R2/-/R2-1.1.1.tgz"},"scripts":{}},"1.1.2":{"name":"R2","description":"a CSS LTR ∞ RTL converter","version":"1.1.2","homepage":"https://github.com/ded/r2","author":{"name":"Dustin Diaz","email":"@ded"},"main":"r2.js","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"engines":{"node":">= 0.4.1"},"bin":{"r2":"bin/r2"},"directories":{"bin":"bin"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"R2@1.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"7a8557312e9c5aa96512d64cbf1b31f4c8c0e518","tarball":"http://registry.npmjs.org/R2/-/R2-1.1.2.tgz"},"readme":"R2\n---\nR2 helps you achieve cross-language layout-friendly websites (including bi-directional text). It looks like this:\n\n``` css\n/* before */\n#content {\n  float: left;\n  margin-right: 2px;\n  padding: 1px 2px 3px 4px;\n  left: 5px;\n}\n.info {\n  text-align: right;\n}\n\n/* after */\n#content {\n  float: right;\n  margin-left: 2px;\n  padding: 1px 4px 3px 2px;\n  right: 5px;\n}\n.info {\n  text-align: left;\n}\n```\n\nInstall it\n----------\n\n    $ [sudo] npm install R2 -g\n\nUse it as a CLI\n\n    $ r2 input.css output.css\n\nOr require it as a Node module\n\n``` js\nvar output = require('r2').swap(css)\n```\n\nCaution\n--------\nR2 will only work as good as what you give it, therefore *inline-styles* embedded in your HTML will not converted, and therefore may cause unexpected results. However inline-styles apart from R2 is still a bad idea, and you should avoid it anyway in favor of separating content from presentation.\n\n**Happy layout Swapping!**","maintainers":[{"name":"ded","email":"polvero@gmail.com"}]}},"maintainers":[{"name":"ded","email":"polvero@gmail.com"}],"time":{"modified":"2012-06-08T18:11:22.315Z","created":"2011-06-02T00:41:17.258Z","1.0.0":"2011-06-02T00:41:37.793Z","1.0.1":"2011-06-02T01:27:08.716Z","1.0.2":"2011-06-13T23:11:35.191Z","1.1.0":"2011-06-14T07:35:50.623Z","1.1.1":"2011-06-26T19:22:42.106Z","1.1.2":"2012-06-08T18:11:22.315Z"},"author":{"name":"Dustin Diaz","email":"@ded"},"repository":{"type":"git","url":"git://github.com/ded/R2.git"},"_attachments":{"R2-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-KyFZ32Tw611EpKoOKH9dFw==","length":2332,"stub":true},"R2-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ojH4ytpvqwrIKgFbyGN+bw==","length":2100,"stub":true},"R2-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pbeGZGDfUq/0EAMYd0b2bA==","length":2097,"stub":true},"R2-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-z8LIhat+/3npyBnoRUIxGQ==","length":1953,"stub":true},"R2-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MSpnx+NHV3mX3xetkAN2Hg==","length":1862,"stub":true},"R2-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i9bFpNUXQdCBu87gD/agnw==","length":1873,"stub":true}}}},
{"id":"Rajas","key":"Rajas","value":{"rev":"3-525865a84223c3cde07cbe35ecc24b1b"},"doc":{"_id":"Rajas","_rev":"3-525865a84223c3cde07cbe35ecc24b1b","name":"Rajas","description":"","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Rajas","private":false,"version":"0.0.1","description":"","homepage":"http://User.github.com/Rajas","main":"./server.js","author":{"name":"Pieter Botha","email":"ploemp.com@gmail.com"},"keywords":["node"],"maintainers":[{"name":"ploemp","email":"ploemp.com@gmail.com"}],"contributors":[],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"bugs":{"url":"https://github.com/User/Rajas/issues"},"repository":{"type":"git","url":"git://github.com/User/Rajas.git"},"engines":{"node":">= 0.4.0","npm":"1"},"dependencies":{"underscore":">= 0.0.1","underscore.string":">= 0.0.1","mongodb":">= 0.9.9-7","redis":">= 0.7.1","coffee-resque":">= 0.1.4","coffee-script":">= 1.1.3","mint":">= 0.3.0","tower":">= 0.3.0"},"devDependencies":{"stylus":">= 0.17.0","less":">= 1.2.2","uglify-js":">= 1.1.1","pathfinder":">= 0.3.0","async":">= 0.0.1","mocha":">= 0.12.1","chai":">= 0.3.3","sinon":">= 1.3.1","design.io":">= 0.3.0","design.io-javascripts":">= 0.3.0","design.io-stylesheets":">= 0.3.0","knox":">= 0.0.9","gzip":">= 0.1.0","forever":">= 0.8.5","cli-table":">= 0.0.1"},"scripts":{"test":"./node_modules/mocha/bin/mocha $(find test -name \"*Test.coffee\")","prepublish":"npm prune; rm -rf node_modules/*/{test,example,bench}*","start":"node server.js -e production"},"_npmUser":{"name":"ploemp","email":"ploemp.com@gmail.com"},"_id":"Rajas@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"dc1be57932bc3981278550db787d58de64b03507","tarball":"http://registry.npmjs.org/Rajas/-/Rajas-0.0.1.tgz"}}},"readme":"# Rajas\n\n## Install\n\nFirst [setup the Tower.js development environment](http://towerjs.org/guides/development#environment), then run:\n\n```\ngit clone git@github.com:User/Rajas.git\ncd Rajas\nnpm install\nnode server\n```\n\n## Test\n\nRun tests:\n\n```\nnpm test\n```\n\nRead up on [testing Tower.js apps](http://towerjs.org/guides/testing).\n\n## Deploy\n\nRead [How to deploy Tower Apps to Heroku](http://towerjs.org/guides/deployment#heroku).\n\n## Documentation\n\n- [Tower.js](http://towerjs.org/guides)\n- [MongoDB](http://www.mongodb.org/display/DOCS/Advanced+Queries)\n- [Node.js](http://nodejs.org/docs/v0.6.11/api/fs.html)\n- [Mocha](https://github.com/visionmedia/mocha)\n- [CoffeeScript](http://coffeescript.org/)\n- [Stylus](http://learnboost.github.com/stylus/)\n\nIf all else fails, see the [Rails Guides](http://guides.rubyonrails.org/), should be fairly close.\n","maintainers":[{"name":"ploemp","email":"ploemp.com@gmail.com"}],"time":{"modified":"2012-05-14T22:41:19.033Z","created":"2012-05-14T22:41:10.653Z","0.0.1":"2012-05-14T22:41:19.033Z"},"author":{"name":"Pieter Botha","email":"ploemp.com@gmail.com"},"repository":{"type":"git","url":"git://github.com/User/Rajas.git"},"_attachments":{"Rajas-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-u1sQ1LpRPasGtU1J9ZNMkA==","length":695798,"stub":true}}}},
{"id":"RandomSelection","key":"RandomSelection","value":{"rev":"5-51e285a9115f602293c14f5e8b9d56e4"},"doc":{"_id":"RandomSelection","_rev":"5-51e285a9115f602293c14f5e8b9d56e4","name":"RandomSelection","description":"Randomly select an option from an array, without duplication, until all options are gone. Then cycles again. The package works as a node module as well as in the browser.","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"author":{"name":"Joshua Poehls","email":"joshua@zduck.com","url":"http://zduck.com"},"name":"RandomSelection","description":"Randomly select an option from an array, without duplication, until all options are gone. Then cycles again. The package works as a node module as well as in the browser.","version":"1.0.0","homepage":"https://github.com/jpoehls/node-RandomSelection","repository":{"type":"git","url":"git://github.com/jpoehls/node-RandomSelection.git"},"directories":{"lib":"./lib"},"main":"./lib/Picker.js","scripts":{"test":"mocha"},"dependencies":{},"devDependencies":{"mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"tags":["random","array","browser"],"bugs":{"url":"https://github.com/jpoehls/node-RandomSelection/issues"},"_npmUser":{"name":"jpoehls","email":"joshua@zduck.com"},"_id":"RandomSelection@1.0.0","_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0479e92b1f04f4f6a7a4882fe6b1463d5bdae536","tarball":"http://registry.npmjs.org/RandomSelection/-/RandomSelection-1.0.0.tgz"},"maintainers":[{"name":"jpoehls","email":"joshua@zduck.com"}]},"1.0.1":{"author":{"name":"Joshua Poehls","email":"joshua@zduck.com","url":"http://zduck.com"},"name":"RandomSelection","description":"Randomly select an option from an array, without duplication, until all options are gone. Then cycles again. The package works as a node module as well as in the browser.","version":"1.0.1","homepage":"https://github.com/jpoehls/node-RandomSelection","repository":{"type":"git","url":"git://github.com/jpoehls/node-RandomSelection.git"},"directories":{"lib":"./lib"},"main":"./lib/Picker.js","scripts":{"test":"mocha"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*"},"optionalDependencies":{},"engines":{"node":"*"},"tags":["random","array","browser"],"bugs":{"url":"https://github.com/jpoehls/node-RandomSelection/issues"},"_npmUser":{"name":"jpoehls","email":"joshua@zduck.com"},"_id":"RandomSelection@1.0.1","_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"68fc8f7a4ec2ae7153049349e44f8fa1393311bb","tarball":"http://registry.npmjs.org/RandomSelection/-/RandomSelection-1.0.1.tgz"},"maintainers":[{"name":"jpoehls","email":"joshua@zduck.com"}]}},"readme":"RandomSelection\n===============\n\nThis is an NPM package that knows how to select a random item out of a group of options such that the selection isn't a duplicated until all items have been selected.\n\n## Installation\n\n    npm install RandomSelection\n\n## Testing\n\nOnce the package is installed, you can run the unit tests using NPM.\n\n    npm test RandomSelection\n\n## Node Usage\n\n```javascript\nvar Picker = require('RandomSelection').Picker;\n\nvar greetingPicker = new Picker([ 'hello', 'hi', 'howdy' ]);\nvar randomGreeting = greetingPicker.pick(); // Will return one of the options above.\n```\n\n## Browser Usage\n\n#### HTML\n\n```html\n<script src=\"path/to/Picker.js\"></script>\n```\n\n#### JavaScript\n\n```javascript\nvar Picker = new RandomSelection.Picker();\n\nvar greetingPicker = new Picker([ 'hello', 'hi', 'howdy' ]);\nvar randomGreeting = greetingPicker.pick(); // Will return one of the options above.\n```\n\n## License\n\nCopyright (c) 2012 Joshua Poehls\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"jpoehls","email":"joshua@zduck.com"}],"time":{"modified":"2012-06-17T17:28:37.807Z","created":"2012-06-16T20:59:00.683Z","1.0.0":"2012-06-16T20:59:01.680Z","1.0.1":"2012-06-17T17:28:37.807Z"},"author":{"name":"Joshua Poehls","email":"joshua@zduck.com","url":"http://zduck.com"},"repository":{"type":"git","url":"git://github.com/jpoehls/node-RandomSelection.git"},"_attachments":{"RandomSelection-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7NLC88faujRzchxTSvDkVg==","length":3170,"stub":true},"RandomSelection-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3jopYLDrErYwTvsNOiyMPg==","length":3238,"stub":true}}}},
{"id":"ReadableFeeds","key":"ReadableFeeds","value":{"rev":"5-8c10e1be2812c58a096aea899de6ad82"},"doc":{"_id":"ReadableFeeds","_rev":"5-8c10e1be2812c58a096aea899de6ad82","name":"ReadableFeeds","description":"runs readabilitySAX on feeds","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"ReadableFeeds","version":"0.0.2","description":"runs readabilitySAX on feeds","author":{"name":"Felix Boehm","email":"me@feedic.com"},"main":"lib/index.js","engine":"node >= 0.4.0","dependencies":{"htmlparser2":"2.x.x","readabilitySAX":"1.x.x","SimpleQueue":"0.x.x","minreq":"0.x.x","mote":"0.x.x"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"ReadableFeeds@0.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"40fa7ed4a89c74492bd67555a8e12c094e753606","tarball":"http://registry.npmjs.org/ReadableFeeds/-/ReadableFeeds-0.0.2.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]},"0.0.3":{"name":"ReadableFeeds","version":"0.0.3","description":"runs readabilitySAX on feeds","author":{"name":"Felix Boehm","email":"me@feedic.com"},"main":"lib/index.js","engine":"node >= 0.4.0","dependencies":{"htmlparser2":"2.x.x","readabilitySAX":"1.x.x","SimpleQueue":"0.x.x","minreq":"0.x.x","mote":"0.x.x"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"ReadableFeeds@0.0.3","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.3","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e13ddf8dcc1694a24a57b50f9464d9761730c66c","tarball":"http://registry.npmjs.org/ReadableFeeds/-/ReadableFeeds-0.0.3.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]}},"readme":"A small library that runs readabilitySAX on feeds.\n\nThis version works, but is far from perfect. Some things that should be done:\n\n* The feed parser should read data as it approaches\n* CACHING. For every run, every page of a feed needs to be processed by `readabilitySAX`. Due to `readabilitySAX`' speed, the CPU isn't the main concern - network usage matters even more.\n* It would be nice to have PuSH (PubSubHubbub) support","maintainers":[{"name":"feedic","email":"me@feedic.com"}],"time":{"modified":"2012-03-09T08:17:05.123Z","created":"2012-02-14T16:47:29.050Z","0.0.2":"2012-02-14T16:47:30.958Z","0.0.3":"2012-03-09T08:17:05.123Z"},"author":{"name":"Felix Boehm","email":"me@feedic.com"},"_attachments":{"ReadableFeeds-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6AeyTppf3gt4qlQr0nDHyA==","length":2496,"stub":true},"ReadableFeeds-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fDI8Xa+zmO+dnOwpsfgOzg==","length":2489,"stub":true}}}},
{"id":"Reality3D","key":"Reality3D","value":{"rev":"5-c038f2ca4093a93e78787c26dddde929"},"doc":{"_id":"Reality3D","_rev":"5-c038f2ca4093a93e78787c26dddde929","name":"Reality3D","description":"A Higher Dimension of Reality, Reality3D","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Reality3D.org","email":"NPM@Reality3D.org","url":"NPM.Reality3D.org"},"name":"Reality3D","description":"A Higher Dimension of Reality, Reality3D","version":"0.0.1","homepage":"NPM.Reality3D.org","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"Reality3D","email":"NPM@Reality3D.org"},"_id":"Reality3D@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d4c2c6819f072a2fccdd7ce801932db4a3ea0ec2","tarball":"http://registry.npmjs.org/Reality3D/-/Reality3D-0.0.1.tgz"},"readme":"","maintainers":[{"name":"Reality3D","email":"NPM@Reality3D.org"}]},"0.0.2":{"author":{"name":"Reality3D.org","email":"NPM@Reality3D.org","url":"NPM.Reality3D.org"},"name":"Reality3D","description":"A Higher Dimension of Reality, Reality3D","version":"0.0.2","homepage":"NPM.Reality3D.org","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"main":"index.js","_npmUser":{"name":"Reality3D","email":"NPM@Reality3D.org"},"_id":"Reality3D@0.0.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c3d9346972a7312ca14fe79ed2ecb4863875d13c","tarball":"http://registry.npmjs.org/Reality3D/-/Reality3D-0.0.2.tgz"},"readme":"","maintainers":[{"name":"Reality3D","email":"NPM@Reality3D.org"}]}},"readme":"","maintainers":[{"name":"Reality3D","email":"NPM@Reality3D.org"}],"time":{"modified":"2012-04-12T06:55:29.470Z","created":"2012-04-12T06:47:24.493Z","0.0.1":"2012-04-12T06:47:29.577Z","0.0.2":"2012-04-12T06:55:29.470Z"},"author":{"name":"Reality3D.org","email":"NPM@Reality3D.org","url":"NPM.Reality3D.org"},"_attachments":{"Reality3D-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KLBa0Sg5X5DaS2RTT0B9/g==","length":324,"stub":true},"Reality3D-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-s/ipcAlVwoC624+RDJZZXg==","length":269,"stub":true}}}},
{"id":"RemoteTestService","key":"RemoteTestService","value":{"rev":"2-9a402b6f4929c6ac102e88f06ac20a06"},"doc":{"_id":"RemoteTestService","_rev":"2-9a402b6f4929c6ac102e88f06ac20a06","name":"RemoteTestService","description":"A remote testing service exposing a RESTful api for querying and running nodeunit tests contained in the service, using http requests","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"RemoteTestService","version":"0.0.1","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"description":"A remote testing service exposing a RESTful api for querying and running nodeunit tests contained in the service, using http requests","main":"index","keywords":["nodeunit","rest","restful","test"],"repository":{"type":"git","url":"git://github.com/urigolani/NodeTestService.git"},"_npmJsonOpts":{"file":"/tmp/.npm/RemoteTestService/0.0.1/package/package.json","serverjs":false,"wscript":false,"contributors":false},"_id":"RemoteTestService@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b800dc1f8499e70688b9489fc00d6ebe6943b5d4","tarball":"http://registry.npmjs.org/RemoteTestService/-/RemoteTestService-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"urigolani","email":"t-urig@microsoft.com"}]}},"maintainers":[{"name":"urigolani","email":"t-urig@microsoft.com"}],"time":{"modified":"2011-10-03T16:04:54.373Z","created":"2011-10-03T16:04:52.029Z","0.0.1":"2011-10-03T16:04:54.373Z"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"repository":{"type":"git","url":"git://github.com/urigolani/NodeTestService.git"}}},
{"id":"Reston","key":"Reston","value":{"rev":"5-9d234010f32f593edafc04620f3cf2bd"},"doc":{"_id":"Reston","_rev":"5-9d234010f32f593edafc04620f3cf2bd","name":"Reston","description":"An improved HTTP client library for node.js","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"Reston","version":"0.1.1","description":"An improved HTTP client library for node.js","contributors":[{"name":"Zohaib Sibt-e-Hassan","email":"zohaib.hassan@gmail.com"}],"homepage":"https://github.com/maxpert/Reston","engines":{"node":">=0.2.5"},"main":"./lib/Reston","repository":"git://github.com/maxpert/Reston.git","author":{"name":"Zohaib Sibt-e-Hassan","url":"http://maxpert.net.tc/"},"_id":"Reston@0.1.1","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"934758bd8eda6481218e0d6c29dab8c10d573c5c","tarball":"http://registry.npmjs.org/Reston/-/Reston-0.1.1.tgz"}},"0.2.0":{"name":"Reston","version":"0.2.0","description":"An improved HTTP client library for node.js","contributors":[{"name":"Zohaib Sibt-e-Hassan","email":"zohaib.hassan@gmail.com"}],"homepage":"https://github.com/maxpert/Reston","engines":{"node":">=0.2.5"},"main":"./lib/Reston","repository":"git://github.com/maxpert/Reston.git","author":{"name":"Zohaib Sibt-e-Hassan","url":"http://maxpert.net.tc/"},"_id":"Reston@0.2.0","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"18f4c291eaf1b0fc3a9a168d5aa685febc5068ff","tarball":"http://registry.npmjs.org/Reston/-/Reston-0.2.0.tgz"}}},"maintainers":[{"name":"zohaib.hassan","email":"zohaib.hassan@gmail.com"}],"time":{"modified":"2011-02-12T19:55:00.035Z","created":"2011-02-12T13:30:57.171Z","0.1.1":"2011-02-12T13:30:58.205Z","0.2.0":"2011-02-12T19:55:00.035Z"},"author":{"name":"Zohaib Sibt-e-Hassan","url":"http://maxpert.net.tc/"},"repository":"git://github.com/maxpert/Reston.git","_attachments":{"Reston-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UF9BmFE7ibE2PSh9+X5EFg==","length":6965,"stub":true},"Reston-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wWOcFmkGR3+pnux0brGPzQ==","length":6154,"stub":true}}}},
{"id":"Robusta","key":"Robusta","value":{"rev":"5-2cb9c8041e6d207580fccb107ab0cbb0"},"doc":{"_id":"Robusta","_rev":"5-2cb9c8041e6d207580fccb107ab0cbb0","name":"Robusta","description":"A CoffeeScript extension that introduces a packaging system and support for convenient import statements","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"Robusta","description":"A CoffeeScript extension that introduces a packaging system and support for convenient import statements","keywords":["coffeescript","precompiler","imports","packages"],"version":"0.1.0","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/Robusta.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/Robusta/master/LICENSE"}],"main":"lib/Robusta.js","bin":{"robusta":"bin/robusta"},"directories":{"lib":"lib"},"scripts":{"test":"fuell-doc-test"},"dependencies":{"Fuell":"0.2.x","FuellSys":">0.2.0 <0.3","coffee-script":">1.2.0"},"devDependencies":{"FuellDocTest":"0.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"Robusta@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ef59be602a1ca63d0d43d42de1f76daf656b8287","tarball":"http://registry.npmjs.org/Robusta/-/Robusta-0.1.0.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]},"0.1.2":{"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"name":"Robusta","description":"A CoffeeScript extension that introduces a packaging system and support for convenient import statements","keywords":["coffeescript","precompiler","imports","packages"],"version":"0.1.2","homepage":null,"repository":{"type":"git","url":"git://github.com/nikita-volkov/Robusta.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/nikita-volkov/Robusta/master/LICENSE"}],"main":"lib/Robusta.js","bin":{"robusta":"bin/robusta"},"directories":{"lib":"lib"},"scripts":{"test":"fuell-doc-test"},"dependencies":{"Fuell":"0.2.x","FuellSys":">0.2.0 <0.3","coffee-script":">1.2.0"},"devDependencies":{"FuellDocTest":"0.3.x"},"_npmUser":{"name":"mojojojo","email":"justnika@mail.ru"},"_id":"Robusta@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"71130723310ce698b373e8880e34f634b454fc9a","tarball":"http://registry.npmjs.org/Robusta/-/Robusta-0.1.2.tgz"},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}]}},"maintainers":[{"name":"mojojojo","email":"justnika@mail.ru"}],"time":{"modified":"2012-04-13T07:45:28.721Z","created":"2012-04-13T06:01:17.106Z","0.1.0":"2012-04-13T06:01:18.990Z","0.1.2":"2012-04-13T07:45:28.721Z"},"author":{"name":"Nikita Volkov","email":"nikita.y.volkov@mail.ru","url":"http://www.flipart.ru"},"repository":{"type":"git","url":"git://github.com/nikita-volkov/Robusta.git"},"_attachments":{"Robusta-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ol/ohb09ex72KoXxG5uR7g==","length":7035,"stub":true},"Robusta-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/inMKkvUHoqtACUgOEWGgA==","length":5422,"stub":true}}}},
{"id":"Sanitizer.js","key":"Sanitizer.js","value":{"rev":"5-0cf9107effcf2ef847287d8a39d54284"},"doc":{"_id":"Sanitizer.js","_rev":"5-0cf9107effcf2ef847287d8a39d54284","name":"Sanitizer.js","description":"A sanitizer library similar to what PHP and Ruby on Rails has to offer.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"Sanitizer.js","description":"A sanitizer library similar to what PHP and Ruby on Rails has to offer.","version":"0.0.1","author":"","homepage":"https://github.com/cxc330/sanitizer.js","main":"sanitizer.js","script":{"test":"run test.js"},"repository":{"type":"git","url":"git://github.com/cxc330/sanitizer.js.git"},"_npmUser":{"name":"auntiepickle","email":"cjg28@case.edu"},"_id":"Sanitizer.js@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"5cc348081ab9ff3c4f2267cbd549961b8d99a21c","tarball":"http://registry.npmjs.org/Sanitizer.js/-/Sanitizer.js-0.0.1.tgz"},"maintainers":[{"name":"auntiepickle","email":"cjg28@case.edu"}]},"0.1.0":{"name":"Sanitizer.js","description":"A sanitizer library similar to what PHP and Ruby on Rails has to offer.","version":"0.1.0","author":"","dependencies":{"colors":">=0.3.0"},"homepage":"https://github.com/cxc330/sanitizer.js","main":"sanitizer.js","script":{"test":"run test.js"},"repository":{"type":"git","url":"git://github.com/cxc330/sanitizer.js.git"},"_npmUser":{"name":"auntiepickle","email":"cjg28@case.edu"},"_id":"Sanitizer.js@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"263d0f9574d3172745106fe660a029bb719aab08","tarball":"http://registry.npmjs.org/Sanitizer.js/-/Sanitizer.js-0.1.0.tgz"},"maintainers":[{"name":"auntiepickle","email":"cjg28@case.edu"}]}},"readme":"#Santizer.js\n\nSanitizer.js is a JavaScript Library designed to help sanitize your string inputs. Currently being developed for a Computer Security class. The idea is this JavaScript Library will be useful to do some client-side sanitization (not 100% secure because it IS on client side), and will definitely be useful for Node.js development.\n\nThis project is open-source and open to be modified.\n\n##Developed By\n- Chien-Hung Chen\n- Christopher Gross\n- Alexandre Sevrain\n- Davis Wilkinson\n\n##Usage\n###mysql\nTo use this package please make sure to install mysql from npm.\n\n    npm install mysql\n\n\n###node.js\nTo run this please use the command\n\n    node app.js\n\n","maintainers":[{"name":"auntiepickle","email":"cjg28@case.edu"}],"time":{"modified":"2012-04-19T15:19:22.241Z","created":"2012-04-16T15:25:30.413Z","0.0.1":"2012-04-16T15:25:31.285Z","0.1.0":"2012-04-19T15:19:22.241Z"},"repository":{"type":"git","url":"git://github.com/cxc330/sanitizer.js.git"},"_attachments":{"Sanitizer.js-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-os3wuU4bRkZYEM3OLpoDcg==","length":19175,"stub":true},"Sanitizer.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0lzGUkTYG9NoS9UJgDwn1Q==","length":2844,"stub":true}}}},
{"id":"Sardines","key":"Sardines","value":{"rev":"5-d7d3d2269420e21c2c62b86ff5a0021e"},"doc":{"_id":"Sardines","_rev":"5-d7d3d2269420e21c2c62b86ff5a0021e","name":"Sardines","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Sardines","descriptions":"Combine js files into one using NPM.","version":"0.0.1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/sardines"},"repository":{"type":"git","url":"http://github.com/spiceapps/sardines.git"},"main":"./lib/index","dependencies":{"sk":"*","brazln":"*","express":"*","beet":"*","vine":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"_id":"Sardines@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/Sardines/-/Sardines-0.0.1.tgz"}},"0.0.2":{"name":"Sardines","descriptions":"Stress-free javascript source combining.","version":"0.0.2","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/sardines"},"repository":{"type":"git","url":"http://github.com/spiceapps/sardines.git"},"main":"./lib/index","dependencies":{"sk":"*","brazln":"*","beet":"*","vine":"*","wrench":"*","growl":"*"},"_id":"Sardines@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/Sardines/-/Sardines-0.0.2.tgz"}}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2011-07-16T22:46:05.139Z","created":"2011-07-16T05:57:49.827Z","0.0.1":"2011-07-16T05:57:50.123Z","0.0.2":"2011-07-16T22:46:05.139Z"},"author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"repository":{"type":"git","url":"http://github.com/spiceapps/sardines.git"},"_attachments":{"Sardines-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ew16y+fXLjToK/kkKlSQrw==","length":133035,"stub":true},"Sardines-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Xoc6Ig15iEoAQHdk4oHEHw==","length":66990,"stub":true}}}},
{"id":"ScgiClient","key":"ScgiClient","value":{"rev":"3-7ad7d00a078818f84191b50208975075"},"doc":{"_id":"ScgiClient","_rev":"3-7ad7d00a078818f84191b50208975075","name":"ScgiClient","description":"Library to connect to a scgi server via host:port or a socket. Also has a loadbalancer included to handle several scgi server in a fifo queue.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Oliver Herdin"},"name":"ScgiClient","description":"Library to connect to a scgi server via host:port or a socket. Also has a loadbalancer included to handle several scgi server in a fifo queue.","version":"0.1.0","homepage":"https://github.com/DDJarod/ScgiClient","repository":{"type":"git","url":"git://github.com/DDJarod/ScgiClient.git"},"engines":{"node":"~0.6.2"},"dependencies":{"DynamicBuffer":"~0.1.0","cgi":"~0.0.8"},"devDependencies":{},"optionalDependencies":{},"main":"./ScgiClient.js","_npmUser":{"name":"Oliver Herdin","email":"github@dareddevelopment.com"},"_id":"ScgiClient@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"a5d0eb60145e330b113b43ce5145a2853999dbaa","tarball":"http://registry.npmjs.org/ScgiClient/-/ScgiClient-0.1.0.tgz"},"maintainers":[{"name":"Oliver Herdin","email":"github@dareddevelopment.com"}]}},"readme":"#ScgiClient for node.js\n\nYet another scgi client module for node.js. \nIn comparison to scgi-client, this module does have more features, but cannot be configured that much.\nIt should have better performance, but I haven't benchmarked it yet.\n\n##Examples\n\n### Simple examples:\nThere is a server running that does accept a scgi connection on a socket.\n\n    var ScgiClient = require('ScgiClient');\n    var Connection = new ScgiClient.Connection({socket: '/tmp/my_socket'});\n    \nThere is a server running that does accept a scgi connection on a port on that is accessiple with tcp.\n\n    var ScgiClient = require('ScgiClient');\n    var Connection = new ScgiClient.Connection({host: '127.0.0.1', port: 8088});\n\n### Advanced example:\nIn this example, we have 10 server, which listen on sockets /tmp/my_1\\_socket to socket /tmp/my_10\\_socket\nWe supply a function to the constructor instead of the location of the server. That function return the location of server N, where N is given as argument, or null, if no more server are available to connect.\n\n    var ScgiClient = require('ScgiClient');\n    var Connection = new ScgiClient.Connection( function(nr) \n    {\n      if (_nr > 10) return null;\n      return {socket: '/tmp/my_' + nr + '_socket'};\n    });","maintainers":[{"name":"Oliver Herdin","email":"github@dareddevelopment.com"}],"time":{"modified":"2012-05-04T13:29:43.854Z","created":"2012-05-04T13:29:42.357Z","0.1.0":"2012-05-04T13:29:43.854Z"},"author":{"name":"Oliver Herdin"},"repository":{"type":"git","url":"git://github.com/DDJarod/ScgiClient.git"},"_attachments":{"ScgiClient-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3cmLros6T61FNKfb5cYjgA==","length":4500,"stub":true}}}},
{"id":"Scrap","key":"Scrap","value":{"rev":"5-ddf5120840e89eb71d37d9ee697df3a1"},"doc":{"_id":"Scrap","_rev":"5-ddf5120840e89eb71d37d9ee697df3a1","name":"Scrap","description":"Easy way to write a spider.","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"Scrap","version":"1.0.0","description":"Easy way to write a spider.","keywords":["spider","scrap"],"author":{"name":"Vjeux","email":"vjeuxx@gmail.com","url":"http://blog.vjeux.com/"},"dependencies":{"underscore":"*","bufferjs":"*"},"files":["src/scrap.js","src/request.js"],"main":"src/scrap.js","repository":{"type":"git","url":"git://github.com/3on/scrap.js.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"Scrap@1.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f5c54b722fdfebef20b8d2c6aac7dd43313679f6","tarball":"http://registry.npmjs.org/Scrap/-/Scrap-1.0.0.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"1.0.1":{"name":"Scrap","version":"1.0.1","description":"Easy way to write a spider.","keywords":["spider","scrap"],"author":{"name":"Vjeux","email":"vjeuxx@gmail.com","url":"http://blog.vjeux.com/"},"dependencies":{"underscore":"*","bufferjs":"*","html5":"*","sharedjs":"*","jsdom":"*"},"files":["src/cookies.js","src/scrap.js","src/request.js"],"main":"src/scrap.js","repository":{"type":"git","url":"git://github.com/3on/scrap.js.git"},"_npmUser":{"name":"vjeux","email":"vjeuxx@gmail.com"},"_id":"Scrap@1.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"e0a5e58ff72e6a7e70eb45c26fdb6bc8d4e4f924","tarball":"http://registry.npmjs.org/Scrap/-/Scrap-1.0.1.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]}},"readme":null,"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}],"time":{"modified":"2012-02-02T17:45:58.302Z","created":"2012-01-31T21:24:18.449Z","1.0.0":"2012-01-31T21:24:20.025Z","1.0.1":"2012-02-02T17:45:58.302Z"},"author":{"name":"Vjeux","email":"vjeuxx@gmail.com","url":"http://blog.vjeux.com/"},"repository":{"type":"git","url":"git://github.com/3on/scrap.js.git"},"_attachments":{"Scrap-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zsuSKqfdm+kdVtNvMvLR0Q==","length":100781,"stub":true},"Scrap-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jrFxZkjni6CQJTTvOjZagw==","length":1989,"stub":true}}}},
{"id":"SenseJs","key":"SenseJs","value":{"rev":"5-8df4a82c8db098f947c669618d838246"},"doc":{"_id":"SenseJs","_rev":"5-8df4a82c8db098f947c669618d838246","name":"SenseJs","description":"SenseJS - Ruby-on-Rails inspired MVC web framework, fully ExpressJS compatible","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.3":{"name":"SenseJs","version":"0.1.3","author":{"name":"Alex Ferreira"},"description":"SenseJS - Ruby-on-Rails inspired MVC web framework, fully ExpressJS compatible","keywords":["mvc","web-framework","rails","ruby-on-rails","express","sense"],"homepage":"http://sensejs.oito.cc","engines":["node >= 0.6.0"],"main":"lib/sense","bin":{"sensejs":"bin/sense","sjs":"bin/sense"},"dependencies":{"connect":"1.7.2","socket.io":">= 0","SenseOrm":">= 0","express":">= 2.5.0","yaml":">= 0.2.2","coffee-script":">= 1.1.2","qs":">= 0","mime":">= 0","jade-extension":">= 0","ejs-extension":">= 0","uglify-js":">= 1.1.0","uglifycss":">=0"},"devDependencies":{},"scripts":{"test":"nodeunit test"},"_npmUser":{"name":"alexferreira","email":"alex@dsol.com.br"},"_id":"SenseJs@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"04cc0c3eeb8ed895cf641901533cd72665d368b8","tarball":"http://registry.npmjs.org/SenseJs/-/SenseJs-0.1.3.tgz"},"maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}]},"0.1.4":{"name":"SenseJs","version":"0.1.4","author":{"name":"Alex Ferreira"},"description":"SenseJS - Ruby-on-Rails inspired MVC web framework, fully ExpressJS compatible","keywords":["mvc","web-framework","rails","ruby-on-rails","express","sense"],"homepage":"http://sensejs.oito.cc","engines":["node >= 0.6.0"],"main":"lib/sense","bin":{"sensejs":"bin/sense","sjs":"bin/sense"},"dependencies":{"connect":"1.7.2","socket.io":">= 0","SenseOrm":">= 0","express":">= 2.5.0","yaml":">= 0.2.2","coffee-script":">= 1.1.2","qs":">= 0","mime":">= 0","jade-extension":">= 0","ejs-extension":">= 0","uglify-js":">= 1.1.0","uglifycss":">=0"},"devDependencies":{},"scripts":{"test":"nodeunit test"},"_npmUser":{"name":"alexferreira","email":"alex@dsol.com.br"},"_id":"SenseJs@0.1.4","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1d00a96c90d55b8323e065788ab23f494c06fdef","tarball":"http://registry.npmjs.org/SenseJs/-/SenseJs-0.1.4.tgz"},"readme":"","maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}]}},"readme":null,"maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}],"time":{"modified":"2012-01-06T03:52:27.664Z","created":"2011-11-27T02:58:24.159Z","0.1.3":"2011-11-27T02:58:26.285Z","0.1.4":"2012-01-06T03:52:27.664Z"},"author":{"name":"Alex Ferreira"},"_attachments":{"SenseJs-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6YwEc+Q47tbsxOtfTj4MSg==","length":93713,"stub":true},"SenseJs-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ov/NmHxvUVlMWGX3J7AZ4g==","length":102400,"stub":true}}}},
{"id":"SenseOrm","key":"SenseOrm","value":{"rev":"25-261f1209c6d3bb758e2abea00f9bf68b"},"doc":{"_id":"SenseOrm","_rev":"25-261f1209c6d3bb758e2abea00f9bf68b","name":"SenseOrm","description":"ORM for every database: mongodb, mysql, redis","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.2":{"author":{"name":"Alex Ferreira"},"name":"SenseOrm","version":"0.0.2","description":"ORM for every database: mongodb, mysql, redis","keywords":["orm","mongodb","mysql","redis"],"main":"index.js","engines":{"node":">= v0.4.0"},"dependencies":{"mongoose":">= 2.3.10","redis":">= 0.6.7","mysql":">= 0.9.4","riak-js":">= 0.4.1"},"devDependencies":{"nodeunit":"~0.6.2"},"scripts":{"test":"./run-tests.js"},"_npmUser":{"name":"alexferreira","email":"alex@dsol.com.br"},"_id":"SenseOrm@0.0.2","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1aa668b216888f77b98217bae80083df4b398f36","tarball":"http://registry.npmjs.org/SenseOrm/-/SenseOrm-0.0.2.tgz"},"maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}],"directories":{}},"0.0.3":{"author":{"name":"Alex Ferreira"},"name":"SenseOrm","version":"0.0.3","description":"ORM for every database: mongodb, mysql, redis","keywords":["orm","mongodb","mysql","redis"],"main":"index.js","engines":{"node":">= v0.4.0"},"dependencies":{"mongoose":">= 2.3.10","redis":">= 0.6.7","mysql":">= 0.9.4","riak-js":">= 0.4.1"},"devDependencies":{"nodeunit":"~0.6.2"},"scripts":{"test":"./run-tests.js"},"_npmUser":{"name":"alexferreira","email":"alex@dsol.com.br"},"_id":"SenseOrm@0.0.3","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"94c44536a4c8233c4bfaf8d05bde190a74f05da6","tarball":"http://registry.npmjs.org/SenseOrm/-/SenseOrm-0.0.3.tgz"},"maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}],"directories":{}},"0.0.4":{"author":{"name":"Alex Ferreira"},"name":"SenseOrm","version":"0.0.4","description":"ORM for every database: mongodb, mysql, redis","keywords":["orm","mongodb","mysql","redis"],"main":"index.js","engines":{"node":">= v0.4.0"},"dependencies":{"mongoose":">= 2.3.10","redis":">= 0.6.7","mysql":">= 0.9.4","riak-js":">= 0.4.1"},"devDependencies":{"nodeunit":"~0.6.2"},"scripts":{"test":"./run-tests.js"},"_npmUser":{"name":"alexferreira","email":"alex@dsol.com.br"},"_id":"SenseOrm@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"da455fd4d4439e3a7b5ad0b7ea3613e3d18b5490","tarball":"http://registry.npmjs.org/SenseOrm/-/SenseOrm-0.0.4.tgz"},"maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}]},"0.0.5":{"author":{"name":"Alex Ferreira"},"name":"SenseOrm","version":"0.0.5","description":"ORM for every database: mongodb, mysql, redis","keywords":["orm","mongodb","mysql","redis"],"main":"index.js","engines":{"node":">= v0.4.0"},"dependencies":{"mongoose":">= 2.3.10","redis":">= 0.6.7","mysql":">= 0.9.4","riak-js":">= 0.4.1"},"devDependencies":{"nodeunit":"~0.6.2"},"scripts":{"test":"./run-tests.js"},"_npmUser":{"name":"alexferreira","email":"alex@dsol.com.br"},"_id":"SenseOrm@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2ed61bc225b0502ce066a40cb0cfb28615b1afd8","tarball":"http://registry.npmjs.org/SenseOrm/-/SenseOrm-0.0.5.tgz"},"maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}]}},"readme":"## About\n\nSenseOrm is cross-db ORM, providing **common interface** to access most popular database formats.\nCurrently supported are: mongodb, redis, mysql and js-memory-storage. You can add your favorite database adapter, checkout one of the existing adapters to learn how, it's super-easy, I guarantee.\n\n## Installation\n\n    npm install senseorm\n\n## Usage\n\n    var Schema = require('senseorm').Schema;\n    var s = new Schema('mongoose');\n    // define models\n    var Post = schema.define('Post', {\n        title:     { type: String, length: 255 },\n        content:   { type: Schema.Text },\n        date:      { type: Date,    default: Date.now },\n        published: { type: Boolean, default: false }\n    });\n    // simplier way to describe model\n    var User = schema.define('User', {\n        name:         String,\n        bio:          Schema.Text,\n        approved:     Boolean,\n        joinedAt:     Date,\n        age:          Number\n    });\n\n    // setup relationships\n    User.hasMany(Post,   {as: 'posts',  foreignKey: 'user_id'});\n    // creates instance methods:\n    // user.posts(conds)\n    // user.posts.build(data) // like new Post({user_id: user.id});\n    // user.posts.create(data) // build and save\n\n    Post.belongsTo(User, {as: 'author', foreignKey: 'user_id'});\n    // creates instance methods:\n    // post.author(callback) -- getter when called with function\n    // post.author() -- sync getter when called without params\n    // post.author(user) -- setter when called with object\n\n    s.automigrate(); // required only for mysql NOTE: it will drop User and Post tables\n\n    // work with models:\n    var user = new User;\n    user.save(function (err) {\n        var post = user.posts.build({title: 'Hello world'});\n        post.save(console.log);\n    });\n\n    // Common API methods\n\n    // just instantiate model\n    new Post\n    // save model (of course async)\n    Post.create(cb);\n    // all posts\n    Post.all(cb)\n    // all posts by user\n    Post.all({userId: user.id});\n    // the same as prev\n    user.posts(cb)\n    // same as new Post({userId: user.id});\n    user.posts.build\n    // save as Post.create({userId: user.id}, cb);\n    user.posts.create(cb)\n    // find instance by id\n    User.find(1, cb)\n    // count instances\n    User.count(cb)\n    // destroy instance\n    user.destroy(cb);\n    // destroy all instances\n    User.destroyAll(cb);\n\n    // Setup validations\n    User.validatesPresenceOf('name', 'email')\n    User.validatesLengthOf('password', {min: 5, message: {min: 'Password is too short'}});\n    User.validatesInclusionOf('gender', {in: ['male', 'female']});\n    User.validatesExclusionOf('domain', {in: ['www', 'billing', 'admin']});\n    User.validatesNumericalityOf('age', {int: true});\n\n    user.isValid() // false\n    user.errors // hash of errors {attr: [errmessage, errmessage, ...], attr: ...}\n\nRead the tests for usage examples: ./test/common_test.js\n\n## Running tests\n\nAll tests are written using nodeunit:\n\n    nodeunit test/common_test.js\n\nIf you run this line, of course it will fall, because it requres different databases to be up and running, but you can use js-memory-engine out of box! Specify ONLY env var:\n\n    ONLY=memory nodeunit test/common_test.js\n\nof course, if you have mongoose running, you can run\n\n    ONLY=mongoose nodeunit test/common_test.js\n\n## Package structure\n\nNow all common logic described in `./lib/*.js`, and database-specific stuff in `./lib/adapters/*.js`. It's super-tiny, right?\n\n### Common:\n\n+ transparent interface to APIs\n+ -before and -after hooks on save, update, destroy\n+ scopes\n+ default values\n+ more relationships stuff\n+ docs\n\n### Databases:\n\n+ low-level mysql\n+ postgres\n+ mongodb\n+ redis\n+ js-memory-storage\n\n","maintainers":[{"name":"alexferreira","email":"alex@dsol.com.br"}],"time":{"modified":"2012-01-06T05:18:22.064Z","created":"2011-11-14T17:22:22.457Z","0.0.2":"2011-11-14T17:22:24.679Z","0.0.3":"2011-11-18T15:26:08.825Z","0.0.4":"2011-11-26T14:54:41.934Z","0.0.5":"2012-01-06T05:18:22.064Z"},"author":{"name":"Alex Ferreira"},"_attachments":{"SenseOrm-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-2aWa1zUlZF1ACjjrlVvU7Q==","length":20973,"stub":true},"SenseOrm-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-dp1QG2Ic+JS0xHZWNbgalg==","length":20480,"stub":true},"SenseOrm-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-E/OKOjiaLOax/whTDlLySg==","length":20480,"stub":true},"SenseOrm-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uPmd5CB8hCNxTcbnw0sXNA==","length":20480,"stub":true}}}},
{"id":"Sentimental","key":"Sentimental","value":{"rev":"6-4a4f405b5c745a360e7bf7b62487af49"},"doc":{"_id":"Sentimental","_rev":"6-4a4f405b5c745a360e7bf7b62487af49","name":"Sentimental","description":"Sentiment Analysis module","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Sentimental","description":"Sentiment Analysis module","repository":{"type":"git","url":"git://github.com/thinkroth/Sentimental.git"},"version":"0.0.1","author":{"name":"Kevin M Roth"},"dependencies":{},"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.0","should":"0.6.0"},"_npmUser":{"name":"realkevinroth","email":"kevinroth82@gmail.com"},"_id":"Sentimental@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b2eaf9a91370da7506f371ef8d545329368b12d7","tarball":"http://registry.npmjs.org/Sentimental/-/Sentimental-0.0.1.tgz"},"maintainers":[{"name":"realkevinroth","email":"kevinroth82@gmail.com"}]},"0.0.2":{"name":"Sentimental","description":"Sentiment Analysis module","repository":{"type":"git","url":"git://github.com/thinkroth/Sentimental.git"},"version":"0.0.2","author":{"name":"Kevin M Roth"},"dependencies":{},"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.0","should":"0.6.0"},"_npmUser":{"name":"realkevinroth","email":"kevinroth82@gmail.com"},"_id":"Sentimental@0.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e900e9aed74899d1e30c2a09cb275600aded75e6","tarball":"http://registry.npmjs.org/Sentimental/-/Sentimental-0.0.2.tgz"},"maintainers":[{"name":"realkevinroth","email":"kevinroth82@gmail.com"}]}},"readme":"\n# SentiMental\n      \n  Sentiment analysis tool for node.js based on the AFINN-111 wordlist. http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6010\n  \n\n## Features\n\n  * Positivity ranking\n  * Negativity ranking\n  * Analyze - combines Positivity and Negativity ranking into an aggregate sentiment score\n\n## Example\n```js\nvar analyze = require('sentimental').analyze,\n    positivity = require('sentimental').positivity,\n    negativity = require('sentimental').negativity;\n\nanalyze(\"Hey you worthless scumbag\"); //Score: -6, Comparative:-1.5\npositivity(\"This is so cool\"); //Score: 1, Comparative:.25\nnegativity(\"Hey you worthless scumbag\"); //Score: 6, Comparative:1.5\n```\n\n\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n    $ npm install\n\nthen run the tests:\n\n    $ make test\n\n\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Kevin M Roth &lt;kevinroth82@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"realkevinroth","email":"kevinroth82@gmail.com"}],"time":{"modified":"2012-03-11T21:55:41.967Z","created":"2012-03-08T20:01:56.596Z","0.0.1":"2012-03-08T20:01:57.268Z","0.0.2":"2012-03-10T16:05:52.381Z"},"author":{"name":"Kevin M Roth"},"repository":{"type":"git","url":"git://github.com/thinkroth/Sentimental.git"},"users":{"astro":true},"_attachments":{"Sentimental-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BFmTnSwIzqo68/bPZ8xLkA==","length":12507,"stub":true},"Sentimental-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OZ6yCpCd0FAYZ1BQXb7Chg==","length":12254,"stub":true}}}},
{"id":"SessionWebSocket","key":"SessionWebSocket","value":{"rev":"8-d9fc9beaf90057aefeb701addd7fc845"},"doc":{"_id":"SessionWebSocket","_rev":"8-d9fc9beaf90057aefeb701addd7fc845","name":"SessionWebSocket","description":"socket.io & connect based session notification for websockets","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"SessionWebSocket","description":"socket.io & connect based session notification for websockets","author":{"name":"bradleymeck"},"version":"0.1.0","main":"sws","_id":"SessionWebSocket@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/SessionWebSocket/-/SessionWebSocket-0.1.0.tgz"},"mtime":"2010-11-09T23:35:13Z","ctime":"2010-11-09T23:35:13Z"},"0.1.1":{"name":"SessionWebSocket","description":"socket.io & connect based session notification for websockets","author":{"name":"bradleymeck"},"version":"0.1.1","main":"sws","_id":"SessionWebSocket@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/SessionWebSocket/-/SessionWebSocket-0.1.1.tgz"},"mtime":"2010-11-09T23:35:14Z","ctime":"2010-11-09T23:35:14Z"}},"maintainers":[{"name":"bradleymeck","email":"bradley.meck@gmail.com"}],"mtime":"2010-11-09T23:35:14Z","ctime":"2010-11-09T23:35:13Z","author":{"name":"bradleymeck"},"_attachments":{"SessionWebSocket-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7BmXcc58gV8KrFR+Kg+PWg==","length":3227,"stub":true},"SessionWebSocket-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-n2kldUaaSKfm/kjPksQRNw==","length":3208,"stub":true}}}},
{"id":"Set","key":"Set","value":{"rev":"5-cdd748599e7f03da22bfdeb9d02f6de4"},"doc":{"_id":"Set","_rev":"5-cdd748599e7f03da22bfdeb9d02f6de4","name":"Set","description":"sets in javascript","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"name":"Set","description":"sets in javascript","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de/"},"tags":["set","collection"],"version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-set.git"},"bugs":{"url":"https://github.com/pvorb/node-set/issues"},"main":"./set.js","engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Set@0.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"eeaa75b313cf7168811388ad2fe1d04c799e2d90","tarball":"http://registry.npmjs.org/Set/-/Set-0.0.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.0":{"name":"Set","description":"sets in javascript","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de/"},"tags":["set","collection"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/pvorb/node-set.git"},"bugs":{"url":"https://github.com/pvorb/node-set/issues"},"main":"./set.js","engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"Set@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c0e7f51810ece58069219152d206370539847757","tarball":"http://registry.npmjs.org/Set/-/Set-0.1.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-02-15T13:30:21.196Z","created":"2012-02-13T11:50:20.753Z","0.0.0":"2012-02-13T11:50:22.997Z","0.1.0":"2012-02-15T13:30:21.196Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de/"},"repository":{"type":"git","url":"git://github.com/pvorb/node-set.git"},"_attachments":{"Set-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SqKGttUVY8e3SOjfTLBTcQ==","length":1869,"stub":true},"Set-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IQEXbVGGEPxtrKAp8zq0VA==","length":1826,"stub":true}}}},
{"id":"Sheet","key":"Sheet","value":{"rev":"8-c827c713564e4ae5a17988ffea520d0d"},"doc":{"_id":"Sheet","_rev":"8-c827c713564e4ae5a17988ffea520d0d","name":"Sheet","description":"100% DOM-less JavaScript implementation of the styleSheets, cssRule & style APIs \nSupports custom and browser-incompatible CSS syntax like nested rules","dist-tags":{"latest":"1.0.2rc1"},"versions":{"1.0.1":{"name":"Sheet","version":"1.0.1","description":"100% DOM-less JavaScript implementation of the styleSheets, cssRule & style APIs \nSupports custom and browser-incompatible CSS syntax like nested rules","keywords":["CSS","CSSOM","styleSheet","cssRule","style","parse"],"authors":["Thomas Aylott"],"contributors":[{"name":"Thomas Aylott","email":"thomas@subtlegradient.com","web":"http://subtlegradient.com"}],"copyright":"© 2010 Thomas Aylott","license":"MIT License","licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repositories":[{"type":"git","url":"http://github.com/subtleGradient/Sheet.js/"}],"bugs":{"web":"http://github.com/subtleGradient/Sheet.js/issues"},"directories":{"src":"./Source","lib":"./Source","doc":".","test":"./Test"},"sources":["Source/Sheet.js","Source/SheetParser.CSS.js"],"main":"./Source/Sheet","_id":"Sheet@1.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Sheet/-/Sheet-1.0.1.tgz"},"mtime":"2010-11-09T23:35:16Z","ctime":"2010-11-09T23:35:16Z"},"1.0.2rc1":{"name":"Sheet","version":"1.0.2rc1","description":"100% DOM-less JavaScript implementation of the styleSheets, cssRule & style APIs \nSupports custom and browser-incompatible CSS syntax like nested rules","keywords":["CSS","CSSOM","styleSheet","cssRule","style","parse"],"authors":["Thomas Aylott"],"contributors":[{"name":"Thomas Aylott","email":"thomas@subtlegradient.com","web":"http://subtlegradient.com"}],"copyright":"© 2010 Thomas Aylott","license":"MIT License","licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repositories":[{"type":"git","url":"http://github.com/subtleGradient/Sheet.js/"}],"bugs":{"web":"http://github.com/subtleGradient/Sheet.js/issues"},"directories":{"src":"./Source","lib":"./Source","doc":".","test":"./Test"},"sources":["Source/Sheet.js","Source/SheetParser.CSS.js"],"main":"./Source/Sheet","_id":"Sheet@1.0.2rc1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Sheet/-/Sheet-1.0.2rc1.tgz"},"mtime":"2010-11-09T23:35:16Z","ctime":"2010-11-09T23:35:16Z"}},"maintainers":[{"name":"subtlegradient","email":"thomas@subtlegradient.com"}],"mtime":"2010-11-09T23:35:16Z","ctime":"2010-11-09T23:35:16Z","_attachments":{"Sheet-1.0.2rc1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HnLRgftlVmIytnl6YNxa5A==","length":26505,"stub":true},"Sheet-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nB7EMtvsqKGDA9xo5JBjNA==","length":26937,"stub":true}}}},
{"id":"Simple-Cache","key":"Simple-Cache","value":{"rev":"3-73edae2d42704f0de0b3a04c307d7be4"},"doc":{"_id":"Simple-Cache","_rev":"3-73edae2d42704f0de0b3a04c307d7be4","name":"Simple-Cache","description":"It is a really simple disk caching library","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"Simple-Cache","version":"1.0.0","description":"It is a really simple disk caching library","homepage":"https://github.com/mostlygeek/Node-Simple-Cache","main":"SimpleCache","repository":{"type":"git","url":"git://github.com/mostlygeek/Node-Simple-Cache.git"},"dependencies":{},"devDependencies":{},"author":{"name":"Benson Wong","email":"mostlygeek@gmail.com","url":"http://mostlygeek.com/"},"_id":"Simple-Cache@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.12","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4ee2e9733c4539e6cfb5a9f1150dd9dda57d4665","tarball":"http://registry.npmjs.org/Simple-Cache/-/Simple-Cache-1.0.0.tgz"},"maintainers":[{"name":"mostlygeek","email":"mostlygeek@gmail.com"}]}},"maintainers":[{"name":"mostlygeek","email":"mostlygeek@gmail.com"}],"time":{"modified":"2011-10-25T05:01:19.796Z","created":"2011-10-25T05:01:19.250Z","1.0.0":"2011-10-25T05:01:19.796Z"},"author":{"name":"Benson Wong","email":"mostlygeek@gmail.com","url":"http://mostlygeek.com/"},"repository":{"type":"git","url":"git://github.com/mostlygeek/Node-Simple-Cache.git"},"_attachments":{"Simple-Cache-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-v/dkysLzU+GxJmek9o9m0Q==","length":2723,"stub":true}}}},
{"id":"SimpleQueue","key":"SimpleQueue","value":{"rev":"3-1b26ed00f2560aa40a9023ede509eb0e"},"doc":{"_id":"SimpleQueue","_rev":"3-1b26ed00f2560aa40a9023ede509eb0e","name":"SimpleQueue","description":"a simple fifo queue","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"SimpleQueue","version":"0.0.1","description":"a simple fifo queue","author":{"name":"Felix Boehm","email":"me@feedic.com"},"main":"./SimpleQueue.js","repository":{"type":"git","url":"git://github.com/fb55/simplequeue.git"},"scripts":{"test":"node ./tests/00-basic.js"},"_npmUser":{"name":"feedic","email":"me@feedic.com"},"_id":"SimpleQueue@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"74466490afa37c1878653767f23c59067a8e7d70","tarball":"http://registry.npmjs.org/SimpleQueue/-/SimpleQueue-0.0.1.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]}},"readme":"#SimpleQueue\nA simple FIFO queue\n\n##What is this?\n\nThere are plenty queues for node, but even those branded as FIFO (first in first out) usually destroy the order. When parsing data like RSS feeds & fetching the pages behind the links, you need to know what element had what position - so I created this little helper (mainly to process feeds with my script [readabilitySAX](https://github.com/fb55/readabilitysax)).\n\n##How to use\n\nConstructor:\n\n    new SimpleQueue(<func> worker, <func> callback[, <func> done[, <num> concurrent]])\n\nMethods:\n\n    queue.push(<any> element) //adds an element to the list\n\nMethods to include:\n\n* `worker`: The method to call for each child. Args: `element`, `callback(err, result)`\n* `callback`: The method to call when an element was processed. Args: `err` and `result` (whatever the worker returned), `element` (the input)\n* `done`: The method to call once the stack is cleared. Args: none\n\n##Example\n\n    var queue = new SimpleQueue(function(element, callback){\n    \tsetTimeout(function(){\n            callback(null, element/1e3); \n        }, element);\n    }, function(err, result, element){\n    \tconsole.log(result);\n    }, function(){\n    \tconsole.log(\"done\");\n    }, 4);\n    \n    queue.push(1e3);\n    queue.push(5e3);\n    queue.push(3e3);\n    queue.push(4e3);\n    queue.push(8e3);\n    queue.push(2e3);\n    queue.push(0);\n\nOutput: \n\n    1, 5, 3, 4, 8, 2, 0, \"done\"\n\nThis takes 9 seconds to run.","maintainers":[{"name":"feedic","email":"me@feedic.com"}],"time":{"modified":"2011-12-01T14:15:21.383Z","created":"2011-12-01T14:15:19.380Z","0.0.1":"2011-12-01T14:15:21.383Z"},"author":{"name":"Felix Boehm","email":"me@feedic.com"},"repository":{"type":"git","url":"git://github.com/fb55/simplequeue.git"},"_attachments":{"SimpleQueue-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rFpFR2VcOgLhv0LfQ8ZL9A==","length":10240,"stub":true}}}},
{"id":"Simplog","key":"Simplog","value":{"rev":"9-846aaadbfc42337604fd0c7b60da0a45"},"doc":{"_id":"Simplog","_rev":"9-846aaadbfc42337604fd0c7b60da0a45","name":"Simplog","description":"Simple logger & real-time browser log client for Node.js apps.","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"author":{"name":"Wes Johnson","url":"http://wesquire.ca"},"name":"Simplog","description":"Simple logger & real-time browser log client for Node.js apps.","version":"1.0.0","homepage":"http://wesquire.ca/i/do/code/simplog","repository":{"type":"git","url":"git://github.com/sterlingwes/Simplog.git"},"main":"./simplog.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"keywords":["logger","logging","browser","client","real-time","realtime","color","colour","timestamp","custom","debug","express","socket.io"],"_npmUser":{"name":"sterling","email":"sterling.wes@gmail.com"},"_id":"Simplog@1.0.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"77c993d29315fc3bce54eda1bc315d4ffa63d539","tarball":"http://registry.npmjs.org/Simplog/-/Simplog-1.0.0.tgz"},"maintainers":[{"name":"sterling","email":"sterling.wes@gmail.com"}]},"1.0.1":{"author":{"name":"Wes Johnson","url":"http://wesquire.ca"},"name":"Simplog","description":"Simple logger & real-time browser log client for Node.js apps.","version":"1.0.1","homepage":"http://wesquire.ca/i/do/code/simplog","repository":{"type":"git","url":"git://github.com/sterlingwes/Simplog.git"},"main":"./simplog.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"keywords":["logger","logging","browser","client","real-time","realtime","color","colour","timestamp","custom","debug","express","socket.io"],"_npmUser":{"name":"sterling","email":"sterling.wes@gmail.com"},"_id":"Simplog@1.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"8d44d9db8c11261788a0a3861d8be5c1196aa343","tarball":"http://registry.npmjs.org/Simplog/-/Simplog-1.0.1.tgz"},"maintainers":[{"name":"sterling","email":"sterling.wes@gmail.com"}]},"1.0.2":{"author":{"name":"Wes Johnson","url":"http://wesquire.ca"},"name":"Simplog","description":"Simple logger & real-time browser log client for Node.js apps.","version":"1.0.2","homepage":"http://wesquire.ca/i/do/code/simplog","repository":{"type":"git","url":"git://github.com/sterlingwes/Simplog.git"},"main":"./simplog.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"keywords":["logger","logging","browser","client","real-time","realtime","color","colour","timestamp","custom","debug","express","socket.io"],"_npmUser":{"name":"sterling","email":"sterling.wes@gmail.com"},"_id":"Simplog@1.0.2","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2f003537c27beec4da56768b53840eb7b630af53","tarball":"http://registry.npmjs.org/Simplog/-/Simplog-1.0.2.tgz"},"maintainers":[{"name":"sterling","email":"sterling.wes@gmail.com"}]},"1.0.3":{"author":{"name":"Wes Johnson","url":"http://wesquire.ca"},"name":"Simplog","description":"Simple logger & real-time browser log client for Node.js apps.","version":"1.0.3","homepage":"http://wesquire.ca/i/do/code/simplog","repository":{"type":"git","url":"git://github.com/sterlingwes/Simplog.git"},"main":"./simplog.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"keywords":["logger","logging","browser","client","real-time","realtime","color","colour","timestamp","custom","debug","express","socket.io"],"_npmUser":{"name":"sterling","email":"sterling.wes@gmail.com"},"_id":"Simplog@1.0.3","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f28a11b21f28ed8450827fb05fa3776eae01a82a","tarball":"http://registry.npmjs.org/Simplog/-/Simplog-1.0.3.tgz"},"maintainers":[{"name":"sterling","email":"sterling.wes@gmail.com"}]}},"readme":"Simplog\r\n=======\r\n\r\nSimplog is a simple logger interface for your Node.js app, exposing a convenient browser log client for when ssh isn't available.\r\n\r\n*Not meant for monitoring logs on distributed machines at this time.*\r\n\r\n---\r\n\r\nRequirements\r\n------------\r\n\r\n*   Socket.IO\r\n*   Express\r\n*   Jade\r\n\r\n*These need to be installed alongside Simplog, and are not bundled with your install.*\r\n\r\n\r\nInstallation\r\n------------\r\n\r\n`sudo npm install simplog`\r\n\r\nor from Git\r\n\r\n`sudo npm install https://github.com/sterlingwes/Simplog/tarball/master`\r\n\r\n\r\nUsage\r\n-----\r\n\r\n\tvar express = require('express'),\r\n\t\thttp\t= require('http'),\r\n\t\tapp\t\t= express(),\r\n\t\tserver\t= http.createServer(app);\r\n\t\tserver.listen(80);\r\n\t\t\r\n\tvar\tio\t\t= require('socket.io').listen(server),\r\n\t\ts\t\t= require('Simplog');\r\n\r\n*Note* that on account of [this issue](https://github.com/senchalabs/connect/issues/500) with Connect/Express & Socket.IO, we require `http` vs. `app.listen()`.\r\n\t\t\r\nConfigure express to serve simplog browser client assets:\r\n\r\n\tapp.configure(function() {\r\n\t\tapp.use(express.static(__dirname + '/node_modules/Simplog/public'));\r\n\t});\r\n\r\nInitialize Simplog, referencing your log files and socket.io.\r\n\r\n\ts.init({\r\n\t\tserverlog:\t'server.log',\r\n        errorlog:   'error.log'\r\n\t}, io);\r\n\r\nFinally, setup the route to your browser client:\r\n\r\n\tapp.get('/log', s.render);\r\n\r\nNow, run your app and split your log output:\r\n\r\n\tsudo node server.js 1>>server.log 2>>error.log\r\n\t\r\nTry using the Simplog logger in you application:\r\n\r\n\ts.log('Message'); \t\t\t\t\t// defaults to debug level 1, no label/namespace\r\n\ts.log('Message',2,'MainModule'); \t// info level 2, MainModule as label\r\n\ts.log('Message','MainModule'); \t\t// defaults to debug level\r\n\ts.log('Message',3);\t\t\t\t\t// error level 3, no label\r\n\tconsole.log('Message');\t\t\t\t// this and sys.log works fine (no formatting)\r\n\t\r\nThat's it! More thorough API documentation to follow.\r\n\r\n\r\nKnown Issues / To-do\r\n---------------------\r\n\r\n*   Browser client does not render exception traces gracefully\r\n*   Does not support distributed logging\r\n*\tDoes not detect exceptions / crashes (providing notifications)\r\n\r\n---\r\n\r\nLicense\r\n-------\r\n(The MIT License)\r\n\r\nCopyright (c) 2012 Wes Johnson\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"sterling","email":"sterling.wes@gmail.com"}],"time":{"modified":"2012-04-17T18:03:57.608Z","created":"2012-04-16T17:14:49.008Z","1.0.0":"2012-04-16T17:14:50.669Z","1.0.1":"2012-04-16T20:35:18.028Z","1.0.2":"2012-04-16T20:53:10.385Z","1.0.3":"2012-04-17T18:03:57.608Z"},"author":{"name":"Wes Johnson","url":"http://wesquire.ca"},"repository":{"type":"git","url":"git://github.com/sterlingwes/Simplog.git"},"_attachments":{"Simplog-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pZ1CtxI5mjF2ozQ0TIZhWQ==","length":5656,"stub":true},"Simplog-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-z+P5vy4fEEBztF9jOpbKBw==","length":19303,"stub":true},"Simplog-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/bOzLi0k/BFmXqxxbSx1Bw==","length":19289,"stub":true},"Simplog-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q5etPWYx1VBw3+HaHUqjAA==","length":19125,"stub":true}}}},
{"id":"SpaceMagic","key":"SpaceMagic","value":{"rev":"3-e30d80a295329f2a07fea2ed6c3f5a93"},"doc":{"_id":"SpaceMagic","_rev":"3-e30d80a295329f2a07fea2ed6c3f5a93","name":"SpaceMagic","description":"Real-Time Full Stack Web Framework","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"SpaceMagic","description":"Real-Time Full Stack Web Framework","version":"0.0.1","author":{"name":"SpaceMagic","email":"development@spacemagic.io"},"dependencies":{"connect":"1.8.3","socket.io":"0.8.7","commander":"0.x.x","mongolian":"0.1.17","underscore":"1.2.x","mu2":"x.x.x","connect-mongolian-session":"x.x.x"},"scripts":{"start":"./bin/spacemagic.js server"},"bin":{"spacemagic":"./bin/spacemagic.js"},"devDependencies":{"mocha":"0.13.x","should":"0.3.x"},"engine":"node >= 0.6.0","_npmUser":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_id":"SpaceMagic@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"abe9a18b8fa4f932c997d863369388862e1227aa","tarball":"http://registry.npmjs.org/SpaceMagic/-/SpaceMagic-0.0.1.tgz"},"maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}]}},"readme":"Getting Started\n===============\n\n  If you're new to SpaceMagic and don't even know what it is, read the\nintroductory blog post here.\n\nInstallation\n------------\n\nTo install SpaceMagic:\n\n```\nmkdir my_project\ncd my_project\nnpm install SpaceMagic\nspacemagic init my_project\n```\n\nConfigure\n---------\n\nYou need to have mongodb installed, if you don't, go here\n[http://www.mongodb.org/display/DOCS/Quickstart](MongoDB QuickStart Guide)\n\n  If you're already running MongoDB on localhost on the default port, you're done.\nBut if you need to configure your database connection info goto the file:\n\n```\nvim config/database.js\n```\n\nRunning your App\n================\n\n  To start your app server just run \n\n```\nspacemagic server\n```\n\n  * `--port` specifies the port\n\nExamples\n========\n\n[https://github.com/xcoderzach/SpaceMagicChatExample](Chat App)\n[https://github.com/xcoderzach/SpaceMagicTodoExample](Todo List App)\n\nContributions\n=============\n\nAny and all contributions are welcome. Bug reports, feature requests, or\nanything else. Fork away!\n","maintainers":[{"name":"SpaceMagic","email":"development@spacemagic.io"}],"time":{"modified":"2012-04-13T18:45:45.045Z","created":"2012-04-13T18:45:43.950Z","0.0.1":"2012-04-13T18:45:45.045Z"},"author":{"name":"SpaceMagic","email":"development@spacemagic.io"},"_attachments":{"SpaceMagic-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Jbo/oARzYBaP5ytLLau6nQ==","length":115023,"stub":true}}}},
{"id":"Spec_My_Node","key":"Spec_My_Node","value":{"rev":"8-fa58408e9d9736d9c6fa8daf5d632106"},"doc":{"_id":"Spec_My_Node","_rev":"8-fa58408e9d9736d9c6fa8daf5d632106","name":"Spec_My_Node","description":"Basic BDD Framework","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"Spec_My_Node","version":"0.0.1","description":"Basic BDD Framework","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"homepage":"http://github.com/garrensmith/Spec-My-Node","repository":{"type":"git","url":"http://github.com/garrensmith/Spec-My-Node.git"},"bin":{"spec_my_node":"./bin/spec_my_node"},"_id":"Spec_My_Node@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Spec_My_Node/-/Spec_My_Node-0.0.1.tgz"},"mtime":"2010-11-09T23:36:02Z","ctime":"2010-11-09T23:36:02Z"},"0.0.2":{"name":"Spec_My_Node","version":"0.0.2","description":"Basic BDD Framework","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"homepage":"http://github.com/garrensmith/Spec-My-Node","repository":{"type":"git","url":"http://github.com/garrensmith/Spec-My-Node.git"},"bin":{"spec_my_node":"./bin/spec_my_node"},"main":"./lib/spec_my_node","_id":"Spec_My_Node@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Spec_My_Node/-/Spec_My_Node-0.0.2.tgz"},"mtime":"2010-11-09T23:36:02Z","ctime":"2010-11-09T23:36:02Z"}},"maintainers":[{"name":"garrensmith","email":"garren.smith@gmail.com"}],"mtime":"2010-11-09T23:36:02Z","ctime":"2010-11-09T23:36:02Z","author":{"name":"Garren Smith","email":"garrens@drivensoftware.net"},"repository":{"type":"git","url":"http://github.com/garrensmith/Spec-My-Node.git"},"_attachments":{"Spec_My_Node-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eeuWS+FUwAb2qOnPA5tfmg==","length":4565,"stub":true},"Spec_My_Node-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-79+poAAvNWj9CMp20Peo4Q==","length":3937,"stub":true}}}},
{"id":"Sphero-Node-SDK","key":"Sphero-Node-SDK","value":{"rev":"3-0fdd5f69fce6f418b5e59f9a2b954d63"},"doc":{"_id":"Sphero-Node-SDK","_rev":"3-0fdd5f69fce6f418b5e59f9a2b954d63","name":"Sphero-Node-SDK","description":"SDK for working with Sphero robots","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Sphero-Node-SDK","description":"SDK for working with Sphero robots","version":"0.1.0","author":{"name":"Dan DeFelippi","url":"http://driverdan.com"},"repository":{"type":"git","url":"git://github.com/driverdan/Sphero-Node-SDK.git"},"directories":{"lib":"./lib"},"main":"./lib/sphero.js","engines":{"node":"~0.6.2"},"dependencies":{"serialport":"0.6.3"},"devDependencies":{},"_npmUser":{"name":"driverdan","email":"dan@driverdan.com"},"_id":"Sphero-Node-SDK@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"667f22960470e21fdbc4a86f8c479192008dfea1","tarball":"http://registry.npmjs.org/Sphero-Node-SDK/-/Sphero-Node-SDK-0.1.0.tgz"},"maintainers":[{"name":"driverdan","email":"dan@driverdan.com"}]}},"readme":"Sphero SDK for NodeJS\n=====================\n\nSDK for controlling a Sphero robot on a POSIX system. Must have a serial port setup for your Bluetooth connection.\n\nLicense: MIT\n","maintainers":[{"name":"driverdan","email":"dan@driverdan.com"}],"time":{"modified":"2012-06-13T21:24:29.339Z","created":"2012-06-13T21:24:27.437Z","0.1.0":"2012-06-13T21:24:29.339Z"},"author":{"name":"Dan DeFelippi","url":"http://driverdan.com"},"repository":{"type":"git","url":"git://github.com/driverdan/Sphero-Node-SDK.git"},"_attachments":{"Sphero-Node-SDK-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xFJJ9aGdlz7YBCIjM7wvcA==","length":3444,"stub":true}}}},
{"id":"Spot","key":"Spot","value":{"rev":"3-6b6c2131451fed28fb57c924c4fa44cc"},"doc":{"_id":"Spot","_rev":"3-6b6c2131451fed28fb57c924c4fa44cc","name":"Spot","description":"Http Rest Client","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Spot","description":"Http Rest Client","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.1","dependencies":{"underscore":"","vows":"","express":""},"_npmJsonOpts":{"file":"/Users/jozefdransfield/.npm/Spot/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Spot@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"0f09a8777edcd4569369e3ed1b943057198c46c1","tarball":"http://registry.npmjs.org/Spot/-/Spot-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]}},"maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}],"time":{"modified":"2011-09-16T12:38:59.556Z","created":"2011-09-16T12:38:58.503Z","0.0.1":"2011-09-16T12:38:59.556Z"},"author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"_attachments":{"Spot-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-s/59t6K9mPQQTKVO87Hk6A==","length":2738,"stub":true}}}},
{"id":"SpotlightJS","key":"SpotlightJS","value":{"rev":"3-d2dd3a96bf66c38783afad378a6e13ca"},"doc":{"_id":"SpotlightJS","_rev":"3-d2dd3a96bf66c38783afad378a6e13ca","name":"SpotlightJS","description":"Pure JS client for DBpedia Spotlight service","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"SpotlightJS","version":"0.0.1","description":"Pure JS client for DBpedia Spotlight service","directories":{"lib":"./lib"},"main":"./lib/Spotlight","keywords":["DBpedia","Spotlight","client","anntation"],"repository":{"type":"git","url":"git://github.com/m1ci/SpotlightJS.git"},"author":{"name":"m1ci - Milan Dojchinovski -","email":"http://www.dojchinovski.mk"},"_npmUser":{"name":"m1ci","email":"dojcinovski.milan@gmail.com"},"_id":"SpotlightJS@0.0.1","scripts":{"start":"node server.js"},"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"911671497808f5e964eb3f80715305562fdad173","tarball":"http://registry.npmjs.org/SpotlightJS/-/SpotlightJS-0.0.1.tgz"},"maintainers":[{"name":"m1ci","email":"dojcinovski.milan@gmail.com"}]}},"maintainers":[{"name":"m1ci","email":"dojcinovski.milan@gmail.com"}],"time":{"modified":"2011-10-19T14:04:03.535Z","created":"2011-10-19T14:04:01.921Z","0.0.1":"2011-10-19T14:04:03.535Z"},"author":{"name":"m1ci - Milan Dojchinovski -","email":"http://www.dojchinovski.mk"},"repository":{"type":"git","url":"git://github.com/m1ci/SpotlightJS.git"},"_attachments":{"SpotlightJS-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vmkVdJQ1r8/7xWcAtYlqyg==","length":10240,"stub":true}}}},
{"id":"Squirrel","key":"Squirrel","value":{"rev":"3-41c639ae9a3bdcbc6d5f3382e1c100ef"},"doc":{"_id":"Squirrel","_rev":"3-41c639ae9a3bdcbc6d5f3382e1c100ef","name":"Squirrel","description":"synchronize data between logic layer and persistence layer","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"dubodog","email":"dubodog@gmail.com","url":"weibo.com/dubodog002"},"name":"Squirrel","description":"synchronize data between logic layer and persistence layer","version":"0.0.1","repository":{"type":"git","url":"git@192.168.130.107:pomelo-modules/data-sync"},"engines":{"node":"~0.6.10"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dubodog","email":"dubodog@gmail.com"},"_id":"Squirrel@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b84412a94d0b916e8896de18b3f87a619e090cd4","tarball":"http://registry.npmjs.org/Squirrel/-/Squirrel-0.0.1.tgz"},"readme":"","maintainers":[{"name":"dubodog","email":"dubodog@gmail.com"}]}},"readme":"","maintainers":[{"name":"dubodog","email":"dubodog@gmail.com"}],"time":{"modified":"2012-02-15T09:48:53.668Z","created":"2012-02-15T09:48:45.804Z","0.0.1":"2012-02-15T09:48:53.668Z"},"author":{"name":"dubodog","email":"dubodog@gmail.com","url":"weibo.com/dubodog002"},"repository":{"type":"git","url":"git@192.168.130.107:pomelo-modules/data-sync"},"_attachments":{"Squirrel-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EMea3zu4RvoPesYr6Zgedw==","length":802,"stub":true}}}},
{"id":"Sslac","key":"Sslac","value":{"rev":"3-70a2215cc7505729254aa6fa1d9a25d9"},"doc":{"_id":"Sslac","_rev":"3-70a2215cc7505729254aa6fa1d9a25d9","name":"Sslac","description":"A slick way to do prototypical classes in JavaScript, even if it feels a bit backwards","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"Sslac","description":"A slick way to do prototypical classes in JavaScript, even if it feels a bit backwards","version":"0.0.2","homepage":"https://github.com/jakobo/sslac/","repository":{"type":"git","url":"git://github.com/Jakobo/Sslac.git"},"author":{"name":"Jakob Heuser","email":"jakob@felocity.com"},"main":"./artifacts/sslac-0.0.2.min.js","engines":{"node":">= 0.4.1"},"dependencies":{"smoosh":">= 0.2.0","qunit":">= 0.1.5"},"_id":"Sslac@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4a028cabb67267ebad83698ca771611383d2537b","tarball":"http://registry.npmjs.org/Sslac/-/Sslac-0.0.2.tgz"}}},"maintainers":[{"name":"jakobo","email":"jakob@felocity.com"}],"time":{"modified":"2011-04-27T00:02:31.279Z","created":"2011-04-27T00:02:30.977Z","0.0.2":"2011-04-27T00:02:31.279Z"},"author":{"name":"Jakob Heuser","email":"jakob@felocity.com"},"repository":{"type":"git","url":"git://github.com/Jakobo/Sslac.git"},"_attachments":{"Sslac-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3ZxP7ngf0xASstu64I4zww==","length":10102,"stub":true}}}},
{"id":"StaticServer","key":"StaticServer","value":{"rev":"3-6f5433177ef4d76a52f01c093117a532"},"doc":{"_id":"StaticServer","_rev":"3-6f5433177ef4d76a52f01c093117a532","name":"StaticServer","description":"A simple package that allows you to create a static async file-server within your application","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Robert Pitt","email":"robertpitt1988@gmail.com","url":"https://github.com/AdminSpot"},"name":"StaticServer","description":"A simple package that allows you to create a static async file-server within your application","version":"1.0.0","homepage":"https://github.com/AdminSpot","repository":{"url":""},"main":".","engines":{"node":"~v0.5.0-pre"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/robert/.npm/StaticServer/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"StaticServer@1.0.0","_engineSupported":false,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c33f9a9d646560d606dd3cb763678c3bdc9159b9","tarball":"http://registry.npmjs.org/StaticServer/-/StaticServer-1.0.0.tgz"},"scripts":{}}},"maintainers":[{"name":"robertpitt","email":"robertpitt1988@gmail.com"}],"time":{"modified":"2011-06-30T21:38:07.211Z","created":"2011-06-30T21:38:05.769Z","1.0.0":"2011-06-30T21:38:07.211Z"},"author":{"name":"Robert Pitt","email":"robertpitt1988@gmail.com","url":"https://github.com/AdminSpot"},"repository":{"url":""},"_attachments":{"StaticServer-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hQGO1uCH2flVMCWbXndbGQ==","length":9591,"stub":true}}}},
{"id":"StringScanner","key":"StringScanner","value":{"rev":"3-e85d0646c25ec477c1c45538712d3a38"},"doc":{"_id":"StringScanner","_rev":"3-e85d0646c25ec477c1c45538712d3a38","name":"StringScanner","description":"StringScanner performs lexical scanning operations on a string.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"StringScanner","description":"StringScanner performs lexical scanning operations on a string.","author":{"name":"Michael Ficarra"},"version":"0.0.2","homepage":"http://github.com/michaelficarra/cjs-string-scanner","main":"./lib/StringScanner","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/michaelficarra/cjs-string-scanner.git"},"licenses":[{"type":"MIT","url":"http://github.com/michaelficarra/cjs-string-scanner/raw/master/LICENSE"}],"engines":{"node":">=0.2.5"},"keywords":["StringScanner","string","scanner","ruby","lex","lexer","lexical","analysis","token","tokenize","tokenizer"],"_id":"StringScanner@0.0.2","_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d95af3ab023fb86729e81e2135c4ced42a7dbd59","tarball":"http://registry.npmjs.org/StringScanner/-/StringScanner-0.0.2.tgz"}}},"maintainers":[{"name":"michaelficarra","email":"npm@michael.ficarra.me"}],"time":{"modified":"2011-04-29T05:10:54.418Z","created":"2011-04-29T05:10:54.307Z","0.0.2":"2011-04-29T05:10:54.418Z"},"author":{"name":"Michael Ficarra"},"repository":{"type":"git","url":"git://github.com/michaelficarra/cjs-string-scanner.git"},"_attachments":{"StringScanner-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RN4R0cC6KdNrUNREA5dWEA==","length":5203,"stub":true}}}},
{"id":"Suckle","key":"Suckle","value":{"rev":"3-1f266fbdaafac55ff13e7db28c66e4a6"},"doc":{"_id":"Suckle","_rev":"3-1f266fbdaafac55ff13e7db28c66e4a6","name":"Suckle","description":"Stream multiplexer, with callback ability","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"Suckle","version":"0.0.1","description":"Stream multiplexer, with callback ability","keywords":["stream","multiplex"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Suckle.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"main":"lib/suckle.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"_id":"Suckle@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7d7ce06a4c0425dccc7d74341183e3889437c9d7","tarball":"http://registry.npmjs.org/Suckle/-/Suckle-0.0.1.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]}},"readme":"## Suckle\n\nSuckle is a stream multiplexer for node. You pass it as many writable streams as you want, and it exposes a simple chainable API for treating it as if it were only one. Also, if enabled, you can wedge a callback for when the stream ends. This callback is supplied the accumulated data.\n\n```js\n\nvar Suckle = require('suckle')\n\nvar mux = new Suckle(process.stdout)\n\nmux.pipe(process.stdout).write('asdf\\n')\n\nprocess.stdin.resume()\nprocess.stdin.pipe(mux)\n\n```\n\nThe main problem Suckle solves is when you need a callback, to return the piped data. As a case study, say you have a static file server. Ideally, you would like to pipe node's file readStream to gzip, and then to the client. Fine. But what if you also need to cache that gzipped data in an object, for subsequent requests? With Suckle you can!\n\n```js\n\nvar fs = require('fs')\nvar zlib = require('zlib')\n\nvar Suckle = require('suckle')\n\nvar fileStream = fs.createReadStream('somefile.jpg')\nvar zipper = zlib.createGzip()\n\nvar mux = new Suckle(true, process.stdout)\n\nmux.oncomplete(function(data) {\n    /* You can do anything! Anything! /*\n})\n\nzipper.pipe(mux)\nfileStream.pipe(zipper)\n\n```\n\n","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}],"time":{"modified":"2012-05-24T09:46:06.298Z","created":"2012-05-24T09:46:06.084Z","0.0.1":"2012-05-24T09:46:06.298Z"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"repository":{"type":"git","url":"git://github.com/Weltschmerz/Suckle.git"},"_attachments":{"Suckle-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mCuuyaTfQXVxB5pTBKApog==","length":1264,"stub":true}}}},
{"id":"SugarSkull","key":"SugarSkull","value":{"rev":"3-54313dd5a89bdb75fd34899328f0b4cd"},"doc":{"_id":"SugarSkull","_rev":"3-54313dd5a89bdb75fd34899328f0b4cd","name":"SugarSkull","description":"A Client Side Router for Single Page Apps","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"SugarSkull","description":"A Client Side Router for Single Page Apps","version":"0.3.0","homepage":"http://twitter.com/hij1nx","author":{"name":"hij1nx","email":"hij1nx@gmail.com"},"contributers":["Charlie Robbins <charlie@nodejitsu.com> http://twitter.com/indexzero","Dave Geddes <davidcgeddes@gmail.com> http://twitter.com/geddesign"],"repository":{"type":"git","url":"git://github.com/hij1nx/SugarSkull.git"},"main":"./js/lib/SS.js","keywords":["URL","router","client side"],"ender":"./js/lib/ender.js","_npmUser":{"name":"hij1nx","email":"hij1nx@me.com"},"_id":"SugarSkull@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"95ebffb002f37da0457abe0a968adb4064c245c5","tarball":"http://registry.npmjs.org/SugarSkull/-/SugarSkull-0.3.0.tgz"},"maintainers":[{"name":"hij1nx","email":"hij1nx@me.com"}]}},"maintainers":[{"name":"hij1nx","email":"hij1nx@me.com"}],"time":{"modified":"2011-11-09T14:15:23.385Z","created":"2011-11-09T14:15:21.638Z","0.3.0":"2011-11-09T14:15:23.385Z"},"author":{"name":"hij1nx","email":"hij1nx@gmail.com"},"repository":{"type":"git","url":"git://github.com/hij1nx/SugarSkull.git"},"_attachments":{"SugarSkull-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dlUmedP6C3ZOAYDg9yuwfQ==","length":102400,"stub":true}}}},
{"id":"Supersonic","key":"Supersonic","value":{"rev":"13-927ed47ba628e828ee5ecadb5f51c97c"},"doc":{"_id":"Supersonic","_rev":"13-927ed47ba628e828ee5ecadb5f51c97c","name":"Supersonic","description":"A small and supersonic flow-controll library","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"name":"Supersonic","description":"A small and supersonic flow-controll library","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"main":"index","scripts":{"test":"node test/test"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Supersonic@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"19c7e501cc177dcb1bf58ba6593c7d81de23ab31","tarball":"http://registry.npmjs.org/Supersonic/-/Supersonic-0.0.1.tgz"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]},"0.0.2":{"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"name":"Supersonic","description":"A small and supersonic flow-controll library","version":"0.0.2","repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"main":"index","scripts":{"test":"node test/test"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Supersonic@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b8a65f741a74c9ab004d3c3f9cfa0b00266df640","tarball":"http://registry.npmjs.org/Supersonic/-/Supersonic-0.0.2.tgz"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]},"0.0.3":{"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"name":"Supersonic","description":"A small and supersonic flow-controll library","version":"0.0.3","repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"main":"index","scripts":{"test":"node test/test"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Supersonic@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"433c8f3954bf3b0cf72b4f29736908b48373e1a8","tarball":"http://registry.npmjs.org/Supersonic/-/Supersonic-0.0.3.tgz"},"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]},"0.0.4":{"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"name":"Supersonic","description":"A small and supersonic flow-controll library","version":"0.0.4","repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"main":"index","scripts":{"test":"node test/test"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Supersonic@0.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5889ea03af1e86be7ea28e201347090cc1a36b67","tarball":"http://registry.npmjs.org/Supersonic/-/Supersonic-0.0.4.tgz"},"readme":"Supersonic\n----------\n\nA small and supersonic flow-controll library for Node.js\n\n[![Build Status](https://secure.travis-ci.org/arian/LISP.js.png)](http://travis-ci.org/arian/Supersonic)\n\n### Install\n\n\tnpm install Supersonic\n\n### Usage\n\nThere are two modes, async and sync (or queued).\n\nAsync, all functions simultaneously.\n\n``` js\nvar FlowAsync = require('Supersonic').Async;\n\nnew FlowAsync().push(function(ready){\n\tsetTimeout(function(){\n\t\tready();\n\t}, 1000);\n})).push(function(ready){\n\tsetTimeout(function(){\n\t\tready();\n\t}, 2000);\n}).invoke(function(){\n\tconsole.log('all ready, after 2 seconds');\n});\n```\n\nAll functions after each other.\nAdditionally the Queue can pass data through the `next([arg1, arg2, …])` calls.\n\n``` js\nvar FlowQueue = require('Supersonic').Queue;\n\nnew FlowQueue().push(function(next){\n\tsetTimeout(function(){\n\t\tnext(3.14, 2.7218);\n\t}, 1000);\n})).push(function(next, finish, pi, e){\n\tsetTimeout(function(){\n\t\tfinish(new Error);\n\t}, 2000);\n}).push(function(){\n\t// not called because of the finish() in the previous call.\n}).invoke(function(err){\n    console.log('all ready, after 3 seconds');\n});\n```\n\nThat's it!\n","maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]},"0.0.5":{"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"name":"Supersonic","description":"A small and supersonic flow-controll library","version":"0.0.5","repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"main":"index","scripts":{"test":"node test/test"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Supersonic@0.0.5","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"53c3537dfad47da6d914f0ca4950437ca2430cc9","tarball":"http://registry.npmjs.org/Supersonic/-/Supersonic-0.0.5.tgz"},"readme":"Supersonic\n----------\n\nA small and supersonic flow-controll library for Node.js\n\n[![Build Status](https://secure.travis-ci.org/arian/LISP.js.png)](http://travis-ci.org/arian/Supersonic)\n\n### Install\n\n\tnpm install Supersonic\n\n### Usage\n\nThere are two modes, async and sync (or queued).\n\nAsync, all functions simultaneously.\n\n``` js\nvar FlowAsync = require('Supersonic').Async;\n\nnew FlowAsync().push(function(ready){\n\tsetTimeout(function(){\n\t\tready();\n\t}, 1000);\n})).push(function(ready){\n\tsetTimeout(function(){\n\t\tready();\n\t}, 2000);\n}).invoke(function(){\n\tconsole.log('all ready, after 2 seconds');\n});\n```\n\nAll functions after each other.\nAdditionally the Queue can pass data through the `next([arg1, arg2, …])` calls.\n\n``` js\nvar FlowQueue = require('Supersonic').Queue;\n\nnew FlowQueue().push(function(next){\n\tsetTimeout(function(){\n\t\tnext(3.14, 2.7218);\n\t}, 1000);\n})).push(function(next, finish, pi, e){\n\tsetTimeout(function(){\n\t\tfinish(new Error);\n\t}, 2000);\n}).push(function(){\n\t// not called because of the finish() in the previous call.\n}).invoke(function(err){\n    console.log('all ready, after 3 seconds');\n});\n```\n\nThat's it!\n\n### Passing more data\n\nWith `FlowQueue` it is possible to pass arguments. However when a lot of\narguments have to be passed, this can be a bit tedious. Fortunately this can be\neasily avoided by putting the data on an object.\n\n``` js\nvar data = {};\nnew FlowAsync().push(function(ready){\n\tsetupDatabase(function(db){\n\t\tdata.db = db;\n\t\tready();\n\t});\n}).push(function(ready){\n\tsetupCache(function(cache){\n\t\tdata.cache = cache;\n\t\tready();\n\t});\n}).invoke(function(){\n\tconsole.log(data);\n});\n```\n","maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]},"0.0.6":{"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"name":"Supersonic","description":"A small and supersonic flow-controll library","version":"0.0.6","repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"main":"index","scripts":{"test":"node test/test"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"arian","email":"stolwijk.arian@gmail.com"},"_id":"Supersonic@0.0.6","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"69ad6ec02a0132f89e843bddcd34a989a86fdd84","tarball":"http://registry.npmjs.org/Supersonic/-/Supersonic-0.0.6.tgz"},"readme":"Supersonic\n----------\n\nA small and supersonic flow-controll library for Node.js\n\n[![Build Status](https://secure.travis-ci.org/arian/LISP.js.png)](http://travis-ci.org/arian/Supersonic)\n\n### Install\n\n\tnpm install Supersonic\n\n### Usage\n\nThere are two modes, async and sync (or queued).\n\nAsync, all functions simultaneously.\n\n``` js\nvar FlowAsync = require('Supersonic').Async;\n\nnew FlowAsync().push(function(ready){\n\tsetTimeout(function(){\n\t\tready();\n\t}, 1000);\n})).push(function(ready){\n\tsetTimeout(function(){\n\t\tready();\n\t}, 2000);\n}).invoke(function(){\n\tconsole.log('all ready, after 2 seconds');\n});\n```\n\nAll functions after each other.\nAdditionally the Queue can pass data through the `next([arg1, arg2, …])` calls.\n\n``` js\nvar FlowQueue = require('Supersonic').Queue;\n\nnew FlowQueue().push(function(next){\n\tsetTimeout(function(){\n\t\tnext(3.14, 2.7218);\n\t}, 1000);\n})).push(function(next, finish, pi, e){\n\tsetTimeout(function(){\n\t\tfinish(new Error);\n\t}, 2000);\n}).push(function(){\n\t// not called because of the finish() in the previous call.\n}).invoke(function(err){\n    console.log('all ready, after 3 seconds');\n});\n```\n\nThat's it!\n\n### Passing more data\n\nWith `FlowQueue` it is possible to pass arguments. However when a lot of\narguments have to be passed, this can be a bit tedious. Fortunately this can be\neasily avoided by putting the data on an object.\n\n``` js\nvar data = {};\nnew FlowAsync().push(function(ready){\n\tsetupDatabase(function(db){\n\t\tdata.db = db;\n\t\tready();\n\t});\n}).push(function(ready){\n\tsetupCache(function(cache){\n\t\tdata.cache = cache;\n\t\tready();\n\t});\n}).invoke(function(){\n\tconsole.log(data);\n});\n```\n","maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}]}},"readme":null,"maintainers":[{"name":"arian","email":"stolwijk.arian@gmail.com"}],"time":{"modified":"2012-04-26T00:59:08.439Z","created":"2012-02-25T18:34:57.798Z","0.0.1":"2012-02-25T18:34:59.483Z","0.0.2":"2012-02-26T23:35:17.495Z","0.0.3":"2012-02-27T19:53:15.047Z","0.0.4":"2012-03-04T13:16:21.040Z","0.0.5":"2012-04-24T23:46:15.510Z","0.0.6":"2012-04-26T00:59:08.439Z"},"author":{"name":"Arian Stolwijk","email":"stolwijk.arian@gmail.com"},"repository":{"type":"git","url":"git://github.com/arian/Supersonic.git"},"_attachments":{"Supersonic-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-BC2JNBYDEDzh6js9EJMysA==","length":2564,"stub":true},"Supersonic-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-k26Fhcf4kT6t4VoFFE0NqQ==","length":2550,"stub":true},"Supersonic-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-QdMKRx9lX1gUGqO0t6UXNA==","length":2399,"stub":true},"Supersonic-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SCF/Op/6gQTu3w5yiq4n8w==","length":2087,"stub":true},"Supersonic-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XQKdmxp/INgsVc99nBy/ng==","length":1984,"stub":true},"Supersonic-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QmLSVC6R7sNfaWEYy97Clw==","length":1425,"stub":true}}}},
{"id":"SyncRun","key":"SyncRun","value":{"rev":"17-b2091291dfd2bf482d56dafc41fc3352"},"doc":{"_id":"SyncRun","_rev":"17-b2091291dfd2bf482d56dafc41fc3352","name":"SyncRun","description":"A simple tool for you to run async in a queue","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"SyncRun","description":"A simple tool for you to run async in a queue","version":"1.0.0","author":{"name":"Neekey","email":"ni184775761@gmail.com"},"keywords":["SyncRun"],"main":"SyncRun.js","repository":{"type":"git","url":"git@github.com:neekey/syncrun.git"},"_npmUser":{"name":"neekey","email":"ni184775761@gmail.com"},"_id":"SyncRun@1.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8199e2c9dd7f885b70fd26d87e0164953abd6e19","tarball":"http://registry.npmjs.org/SyncRun/-/SyncRun-1.0.0.tgz"},"maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}],"directories":{}},"1.0.1":{"name":"SyncRun","description":"A simple tool for you to run async in a queue","version":"1.0.1","contributors":{"neekey":"ni184775761@gmail.com"},"keywords":["SyncRun"],"main":"SyncRun.js","repository":{"type":"git","url":"git@github.com:neekey/syncrun.git"},"_npmUser":{"name":"neekey","email":"ni184775761@gmail.com"},"_id":"SyncRun@1.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c7e7d4859f85b75d642817f3b982ad7b4e3328f2","tarball":"http://registry.npmjs.org/SyncRun/-/SyncRun-1.0.1.tgz"},"maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}],"directories":{}},"1.0.2":{"name":"SyncRun","description":"A simple tool for you to run async in a queue","version":"1.0.2","contributors":{"neekey":"ni184775761@gmail.com"},"keywords":["SyncRun"],"main":"SyncRun.js","repository":{"type":"git","url":"git@github.com:neekey/syncrun.git"},"_npmUser":{"name":"neekey","email":"ni184775761@gmail.com"},"_id":"SyncRun@1.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"2d4ec88e47ffa3141be8d1044ba7b4e666000095","tarball":"http://registry.npmjs.org/SyncRun/-/SyncRun-1.0.2.tgz"},"maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}],"directories":{}},"1.0.3":{"name":"SyncRun","description":"A simple tool for you to run async in a queue","version":"1.0.3","contributors":{"neekey":"ni184775761@gmail.com"},"keywords":["SyncRun"],"main":"SyncRun.js","repository":{"type":"git","url":"git@github.com:neekey/syncrun.git"},"_npmUser":{"name":"neekey","email":"ni184775761@gmail.com"},"_id":"SyncRun@1.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"67a686648d369315ade0c09f5cbb0cf6481abbe1","tarball":"http://registry.npmjs.org/SyncRun/-/SyncRun-1.0.3.tgz"},"maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}]}},"readme":"#SyncRun\nsyncRun是一个简单的小工具。它通过对异步方法进行简单的封装，来实现异步方法，同步执行的目的。\n\n##例子\n\n\tvar SyncRun = require( 'syncRun' ).newQueue();\n\n    var sleep = SyncRun(function(s,fn){\n    \n        setTimeout( fn, s );\n    });\n    \n    var doSth = SyncRun(function(next){\n    \n        console.log( 'do something here!' );\n        next();\n    });\n    \n    var doElseTh = SyncRun(function(){\n    \n        sleep( 3000, function (){\n    \n            console.log( 'after 3s, do something else!' );\n        });\n    });\n    \n    sleep( 5000, function(){\n    \n        console.log( '5s passed' );\n    } );\n    \n    doSth();\n    \n    doElseTh();\n    \n上面将输出：\n\n\t5s passed\n\tdo something here!\n\tafter 3s, do something else!\n\t\n##使用\n\n* 创建一个队列：`var SyncRun = require( 'syncRun' ).newQueue();`\n* 创建用于该队列中的方法：`SyncRun（fn）` 其中`fn`为需要封装的方法，SyncRun将返回一个封装好的函数对象\n* 按照**同步**执行的思路，以此调用这些方法。\n* 支持封装后方法的多重嵌套（比如例子中`doEleseTh`内部使用了封装过的`sleep`）\n\n##说明(重要！)\n\n###所谓的同步\n\n在syncRun中的同步，在外观上并非如同步代码那样的同步。syncRun的同步是这样的：\n\n* 所有在同一个队列中的封装好的方法根据调用顺序，依次执行。一个方法完成后，下一个方法才能执行\n* 一个封装过的方法，它所谓的“完成”，包括：方法本身执行完毕，其回调函数执行完毕，所有在其方法执行中或者回调函数执行中被调用的子方法（必须是经过syncRun封装过的方法）执行完毕才被认定为**完成**\n* 不同队列中的方法互不影响。\n\n###回调\n\nsyncRun的实现中，默认将一个函数的所有参数的最后一个参数（如果这个参数是一个函数对象的话）作为回调，若最后一个参数不是函数对象，则会默认添加一个回调函数。\n\n因此，激活你的队列继续执行的动力之一，便是回调函数的被执行。这一点在使用中需要注意。\n\n对于同步方法（本身没有任何封装的意义，但是如果你一定要封装的话…），由于一般我们不需要给定回调，因此最后一个参数多半也不会是函数，因此在实现中，默认会添加一个空的回调。比如上面的例子中：\n\n\tvar doSth = SyncRun(function(next){\n    \n        console.log( 'do something here!' );\n        next();\n    });\n    \n这个`doSth`本身是一个同步方法，没有任何异步的操作，我们可以直接通过`doSth()`,来调用。但是为了在它执行后，队列能继续执行，我们需要在函数中执行`next()`","maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}],"time":{"modified":"2012-04-24T05:32:58.443Z","created":"2012-04-02T14:00:45.356Z","1.0.0":"2012-04-02T14:00:50.386Z","1.0.1":"2012-04-05T07:21:53.074Z","1.0.2":"2012-04-16T06:34:52.904Z","1.0.3":"2012-04-24T05:32:58.443Z"},"author":{"name":"Neekey","email":"ni184775761@gmail.com"},"repository":{"type":"git","url":"git@github.com:neekey/syncrun.git"},"_attachments":{"SyncRun-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-K24K/RKIX60PZOfQpjcVTg==","length":10310,"stub":true},"SyncRun-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-At5dxF6YasY2fkR3dZHevw==","length":9804,"stub":true},"SyncRun-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1dV1yHujtOjw91nE99wKjQ==","length":9202,"stub":true},"SyncRun-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qUbSaY7zilhy1OJ7kO3Rqw==","length":9096,"stub":true}}}},
{"id":"TDTwitterStream","key":"TDTwitterStream","value":{"rev":"37-a38a10b38b0d56703933fb0eb5d52f46"},"doc":{"_id":"TDTwitterStream","_rev":"37-a38a10b38b0d56703933fb0eb5d52f46","name":"TDTwitterStream","description":"Event emitter for Twitter Sitestreams","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"TDTwitterStream","version":"0.1.0","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"dependencies":{"ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"231c7a2273b68a54c275c7a21ef0c83c7d58e5ba","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.0.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.1":{"name":"TDTwitterStream","version":"0.1.1","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c2768326adc2eeb17e335f7549f0bc8722ee6702","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.1.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.2":{"name":"TDTwitterStream","version":"0.1.2","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"331e767b3ccdbb4ab81faf84338868ee7d25d982","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.2.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.3":{"name":"TDTwitterStream","version":"0.1.3","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"d29ea8d825f54c53a92f2821fc9acf84c3758863","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.3.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.4":{"name":"TDTwitterStream","version":"0.1.4","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"d5f9d65d4baf0cdcc17ed39abd9de475d41b2da9","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.4.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.5":{"name":"TDTwitterStream","version":"0.1.5","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"33dbd90126edb73538c9b32ad0aac9a318b31265","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.5.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.6":{"name":"TDTwitterStream","version":"0.1.6","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"tweetdig-ntwitter":">=0.2.8"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"97767f4673099bbf1e744d1df469dda1902ebde0","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.6.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.7":{"name":"TDTwitterStream","version":"0.1.7","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.3.0"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c350662061f63b3ac928758a7fc139694da5df76","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.7.tgz"},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.1.8":{"name":"TDTwitterStream","version":"0.1.8","description":"Asynchronous Twitter Streaming client API for node.js.","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.3.0"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.1.8","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"eaff14b2447a826fb4ccc72e760061265331826d","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.1.8.tgz"},"readme":"Twitter Sitestreams Event Emitter for node.js\r\n=============================================\r\n\r\n","maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"directories":{}},"0.2.0":{"name":"TDTwitterStream","version":"0.2.0","description":"Event emitter for Twitter Sitestreams","keywords":["twitter","streaming","oauth","sitestreams"],"homepage":"https://github.com/maxsoftware/TDTwitterStream","author":{"name":"Michael Heap"},"licenses":[{"type":"MIT","url":"https://github.com/maxsoftware/TDTwitterStream/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"bugs":{"email":"michael@tweetdig.com","url":"https://github.com/maxsoftware/TDTwitterStream/issues"},"dependencies":{"ntwitter":">=0.4.0"},"engines":{"node":">=0.8.0"},"main":"./lib/parser","_npmUser":{"name":"mheap","email":"m@michaelheap.com"},"_id":"TDTwitterStream@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"cd9d22bc1ba6d790efdfe42bd577c7baf24f4719","tarball":"http://registry.npmjs.org/TDTwitterStream/-/TDTwitterStream-0.2.0.tgz"},"readme":"Twitter Sitestreams Event Emitter for node.js\r\n=============================================\r\n\r\n","maintainers":[{"name":"mheap","email":"m@michaelheap.com"}]}},"maintainers":[{"name":"mheap","email":"m@michaelheap.com"}],"time":{"modified":"2012-07-06T09:52:09.553Z","created":"2011-11-22T14:32:27.358Z","0.1.0":"2011-11-22T14:32:49.157Z","0.1.1":"2011-11-22T14:40:03.478Z","0.1.2":"2012-01-31T23:24:55.796Z","0.1.3":"2012-02-01T02:02:36.468Z","0.1.4":"2012-02-03T14:07:35.336Z","0.1.5":"2012-02-21T13:16:43.769Z","0.1.6":"2012-02-21T14:05:13.848Z","0.1.7":"2012-05-11T08:53:30.841Z","0.1.8":"2012-05-31T16:53:03.919Z","0.2.0":"2012-07-06T09:52:09.553Z"},"author":{"name":"Michael Heap"},"repository":{"type":"git","url":"git://github.com/maxsoftware/TDTwitterStream.git"},"_attachments":{"TDTwitterStream-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-igo9UrbS3HRTtt3TeJCPKA==","length":5546,"stub":true},"TDTwitterStream-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-tnuwy5BFkvrQJQ1FQvCmnw==","length":5596,"stub":true},"TDTwitterStream-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-hIpj14pQ88lRN4htFvXLfQ==","length":5720,"stub":true},"TDTwitterStream-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-ckogCQZkGzWD5+dK+wsoTQ==","length":5729,"stub":true},"TDTwitterStream-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-B4b2NI8g0ZQmxZn/JSH3tQ==","length":5723,"stub":true},"TDTwitterStream-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-cxpR6KV/l7uXgrkkx0zLgA==","length":5685,"stub":true},"TDTwitterStream-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-doVkjiA4vaWcAfDZC3iqYg==","length":5623,"stub":true},"TDTwitterStream-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YFMSGsiKXov0bidxZ4nnmg==","length":5619,"stub":true},"TDTwitterStream-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/SLQQ0PABQgbQFutcmL6aA==","length":5474,"stub":true},"TDTwitterStream-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kztP69nPvDdszEri12ijSA==","length":5432,"stub":true}}}},
{"id":"TSN","key":"TSN","value":{"rev":"3-cf431be1ce2ba2b4009c41092a89de4e"},"doc":{"_id":"TSN","_rev":"3-cf431be1ce2ba2b4009c41092a89de4e","name":"TSN","description":"Templating System for NodeJS","dist-tags":{"latest":"2.3.1"},"versions":{"2.3.1":{"name":"TSN","description":"Templating System for NodeJS","version":"2.3.1","homepage":"https://github.com/B-Vladi/TSN","author":{"name":"Влад Куркин, Email: b-vladi@cs-console.ru"},"main":"TSN.js","_npmUser":{"name":"B~Vladi","email":"b-vladi@cs-console.ru"},"_id":"TSN@2.3.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e10ac6373cc6945e83b5625b369347943d1fb267","tarball":"http://registry.npmjs.org/TSN/-/TSN-2.3.1.tgz"},"maintainers":[{"name":"B~Vladi","email":"b-vladi@cs-console.ru"}]}},"readme":"# TSN 2.3.1 #\nhttps://github.com/B-Vladi/TSN/\n\nTemplating System for Node.JS.\n\n## Лицензия\nMIT: https://github.com/appendto/amplify/blob/master/MIT-LICENSE.txt\n\n## Описание\nTSN - синхронный шаблонизатор, реализован в виде <a href=\"http://nodejs.org/api/modules.html\">модуля</a> для NodeJS.\n\n<b>Зависимости:</b>\n* <a href=\"http://nodejs.org/docs/latest/api/path.html\">Path</a>\n* <a href=\"http://nodejs.org/docs/latest/api/fs.html\">File System</a>\n* <a href=\"http://nodejs.org/docs/latest/api/events.html\">Events</a>\n\n<b>Основные характеристики:</b>\n* <b>Простота</b> - управляющие конструкции имеют стандартный XML-синтаксис. Выражения, используемые в значениях атрибутов тегов TSN, являются JavaScript-выражениями.\n* <b>Скорость</b> - <a href=\"https://github.com/B-Vladi/TSN/tree/master/benchmark\">тест производительности</a> показывает, что TSN быстрее похожего шаблонизатора <a href=\"https://github.com/mailru/fest\">Fest</a> от Mail.ru, который в свою очередь <a href=\"https://github.com/vflash/FestLB?\">быстрее</a> известного шаблонизатора <a href=\"http://ctpp.havoc.ru/\">CTPP</a>. Так же TSN выигрывает в производительности <a href=\"http://akdubya.github.com/dustjs\">Dust</a>, но этот тест не сохранился.\n* <b>Гибкость шаблонов</b> - достигается за счет <a href=\"https://github.com/B-Vladi/TSN/wiki/Tags#wiki-tsn.include\">подключаемых шаблонов</a>, динамического контекста и многого другого.\n* <b>Расширяемость</b> - реализация логики тегов вынесена в отдельный <a href=\"https://github.com/B-Vladi/TSN/blob/master/tags.js\">файл</a>, в который легко можно добавлять собственные теги, используя API TSN. В скором будущем появится соответствующая страница в wiki.\n* <b>Поддержка IDE</b> - благодаря XML-синтаксису управляющих конструкций шаблонизатора, можно использовать приемущества редакторов кода, как то: подсветка синтаксиса и Zen Coding. Так же легко настроить валидацию и автокомплит, если IDE поддерживает подключение пользовательских DTD-файлов. В этом случае достаточно настроить IDE на использование <a href=\"https://github.com/B-Vladi/TSN/blob/master/TSN.dtd\">DTD-файла</a> тегов TSN и объявить префикс пространства имен в шаблоне.\n\n###Конфигурация парсинга шаблонов.\nВ вики: https://github.com/B-Vladi/TSN/wiki/Configuration\n\n###Инициализация.\n```js\nvar TSN = require('TSN');\n```\n\n###Примеры компиляции шаблона.\nКомпиляция из файла:\n\n```js\nvar template = TSN.load('path/to/template.xml'); // Компиляция относительно TSN.config.templateRoot.\n```\n\nИспользование имени шаблона:\n\n```js\nvar template = TSN.load('path/to/template.xml', 'My name');\n\nconsole.log(template.cacheName === 'My name'); // true\nconsole.log(TSN.cache['My name'] === template); // true\n```\n\nКомпиляция шаблона с использованием собственных настроек. Параметры, которые не были указаны в этом объекте, будут унаследованы от `TSN.config`.\n\n```js\nvar template = TSN.load('path/to/template.xml', null, {\n\ttemplateRoot: 'path/to/new/template/root'\n});\n```\n\nКомпиляция шаблона из данных:\n\n```js\nTSN.compile('<tsn:root xmlns:tsn=\"TSN\">Text data</tsn:root>');\n```\n\n###Примеры рендеринга шаблона.\n\nС использованием API:\n\n```js\nvar result = TSN.render(template, data);\n```\n\nБез использования:\n\n```js\nvar result = template.call(data);\n```\n\nЗапись результата в поток:\n\n```js\ntemplate.call(data, response);\n```\n\nДокументация по API находится в вики: https://github.com/B-Vladi/TSN/wiki/API.\n<br />\nТак же вы можете сгенерировать JSDoc документацию по API из исходников (файл <a href=\"https://github.com/B-Vladi/TSN/blob/master/TSN.js\">TSN.js</a>).\n\n###Контекст данных.\nВ JavaScript-выражениях, используемых в значениях атрибутов тегов TSN, переданные данные доступны в виде контекста через ключевое слово this.\n<br />\nЕсли TSN тег влияет на контекст, это затрагивает только его дочерних элементов.\n\n###Теги\nУправляющие конструкци TSN-шаблона представляют собой XML-теги с префиксом пространства имен `TSN`. Префикс может использоваться любой и настраивается в <a href=\"https://github.com/B-Vladi/TSN/blob/master/config.json\">конфигурационном файле</a>, либо через <a href=\"https://github.com/B-Vladi/TSN/wiki/API#wiki-.config\">API</a>.\nTSN-парсер не учитывает XML-окружение, поэтому явно регистрировать префикс для постранства имен `TSN` не обязательно, но рекоммендуется для комфортной работы в IDE.\n\nВ значениях атрибутов тегов TSN могут использоваться следующие XML-сущности: `&amp; &lt; &gt; &quot; &apos;`.\n\nОписание тегов с примерами использования в вики: https://github.com/B-Vladi/TSN/wiki/Tags\n<hr />\n\n###Пример Web-приложения\nФайл page_name.xml:\n\n```xml\n<?xml version=\"1.0\"?>\n<tsn:root xmlns:tsn=\"TSN\"\n          xmlns=\"http://www.w3.org/1999/xhtml\">\n\n    <!-- Формирование контента для тега head -->\n    <tsn:template name=\"head\">\n        <link type=\"text/css\"\n              rel=\"stylesheet\"\n              href=\"/page.css\" />\n    </tsn:template>\n\n    <!-- Сохранение данных в области видимости этого шаблона -->\n    <tsn:data name=\"GET\"\n              value=\"this.request.GET\" />\n\n    <!-- Формирование контента для тега body -->\n    <tsn:template name=\"body\">\n        <!-- Вывод GET-параметра userName -->\n        <h2>Hello, <tsn:echo text=\"_data.GET.userName\"\n                             escape=\"html\" />!\n        </h2>\n    </tsn:template>\n\n    <!-- Добавление контента перед закрывающим тегом body -->\n    <tsn:template name=\"footer\">\n        <script type=\"text/javascript\"\n                src=\"page.js\"></script>\n    </tsn:template>\n\n    <!-- Вставка базоваого шаблона разметки и формирование данных,\n            которые будут для него контекстом -->\n    <tsn:include src=\"/base.xml\"\n                 context=\"({\n                     title: 'My name',\n                     navigation: this.navigation,\n                     request: {\n                        status: 200\n                     }\n                 })\" />\n</tsn:root>\n```\n<br />\nФайл base.xml:\n\n```xml\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n    <tsn:root xmlns:tsn=\"TSN\">\n    <head>\n        <!-- Формирование заголовка страницы -->\n        <title>\n            <tsn:echo text=\"this.title\" /> - Hostname\n        </title>\n\n        <meta http-equiv=\"Content-Type\"\n              content=\"text/html; charset=utf-8\" />\n\n        <!-- Общие стили -->\n        <link type=\"text/css\"\n              rel=\"stylesheet\"\n              href=\"/base.css\" />\n\n        <!-- Стили для конкретной страницы -->\n        <tsn:include name=\"head\" />\n    </head>\n    <body>\n        <div class=\"wrapper\">\n            <!-- Шапка -->\n            <tsn:include src=\"/header.xml\"\n                         context=\"this.navigation\" />\n\n            <!-- Если статус 200... -->\n            <tsn:if test=\"this.request.status == 200\">\n                <!-- ...вставляем унаследованный контент страницы -->\n                <tsn:include name=\"body\" />\n                <tsn:else />\n                <!-- ...иначе вставляем страницу ошибки -->\n                <tsn:include src=\"/error.xml\" context=\"this.request.status\" />\n            </tsn:if>\n        </div>\n\n        <!-- Подключение скриптов для текущей страницы -->\n        <tsn:include name=\"footer\" />\n    </body>\n    </tsn:root>\n</html>\n```\n<br />\nJavaScript-код приложения:\n\n```js\n/* Подключение зависимостей */\nvar http = require('http');\nvar queryString = require('querystring');\nvar TSN = require('TSN');\n\n/* Уберём комментарии из результата */\nTSN.config.saveComments = false;\n\n/* Компиляция шаблона */\nTSN.load('page_name.xml', 'page_name', {\n\tindent: 4\n});\n\n/* Создание сервера */\nhttp.Server(\n\tfunction (request, response) {\n\t\t/* Формирование данных для рендеринга */\n\t\tvar data = {\n\t\t\trequest: {\n\t\t\t\tGET: queryString.parse(request.url.substring(2))\n\t\t\t}\n\t\t};\n\n\t\t/* Рендеринг шаблона с записью результата в поток */\n\t\tTSN.cache['page_name'].call(data, response);\n\t}).listen(80, '127.0.0.1');\n```\n<br />\nЗапрос:\n\n`http://127.0.0.1/?userName=Vasya`\n\n<br />\n<br />\nРезультат:\n```html\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <title>My name - Hostname\n    </title>\n\n    <meta http-equiv=\"Content-Type\"\n          content=\"text/html; charset=utf-8\" />\n\n    <link type=\"text/css\"\n          rel=\"stylesheet\"\n          href=\"/base.css\" />\n\n<link type=\"text/css\"\n      rel=\"stylesheet\"\n      href=\"/page.css\" />\n</head>\n<body>\n    <div class=\"wrapper\">\n\n<h2>Hello, Vasya!\n</h2>\n    </div>\n\n<script type=\"text/javascript\"\n        src=\"page.js\"></script>\n</body>\n</html>\n```\n\n\n\n<hr />\nПо всем вопросам отвечу по почте: b-vladi@cs-console.ru.","maintainers":[{"name":"B~Vladi","email":"b-vladi@cs-console.ru"}],"time":{"modified":"2012-05-11T14:13:47.089Z","created":"2012-05-11T14:13:44.007Z","2.3.1":"2012-05-11T14:13:47.089Z"},"author":{"name":"Влад Куркин, Email: b-vladi@cs-console.ru"},"_attachments":{"TSN-2.3.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UHWA7Tu26pCJmtpX+7a73A==","length":15681,"stub":true}}}},
{"id":"TeeChart","key":"TeeChart","value":{"rev":"3-e34158c89712018cb3c57ceafbe15896"},"doc":{"_id":"TeeChart","_rev":"3-e34158c89712018cb3c57ceafbe15896","name":"TeeChart","description":"Charting and graphing node.js module","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"David Berneda","email":"david@steema.com","url":"http://www.steema.com"},"name":"TeeChart","description":"Charting and graphing node.js module","tags":["html5","canvas","chart","graph","plot","visualization"],"version":"0.0.1","keywords":["canvas","w3c","html5","chart","plot","graph","charting","2d","javascript"],"homepage":"http://www.steema.com/teechart/html5","repositories":[{"type":"git","url":"https://davidberneda@github.com/davidberneda/TeeChart.git"}],"maintainers":[{"name":"david berneda","email":"david@steema.com"}],"bugs":{"email":"david@steema.com","url":"http://github.com/davidberneda/TeeChart/issues"},"licenses":[{"type":"CC","url":"http://github.com/davidberneda/TeeChart/blob/master/license.txt"}],"main":"./main","scripts":{"test":"node main.js"},"dependencies":{"canvas":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"david berneda","email":"david@steema.com"},"_id":"TeeChart@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"9c60e791e8b0ac4b3e5855695c4c0a3c8bc7c1f4","tarball":"http://registry.npmjs.org/TeeChart/-/TeeChart-0.0.1.tgz"},"readme":""}},"readme":"","maintainers":[{"name":"david berneda","email":"david@steema.com"}],"time":{"modified":"2012-05-07T14:41:23.194Z","created":"2012-05-07T14:41:19.930Z","0.0.1":"2012-05-07T14:41:23.194Z"},"author":{"name":"David Berneda","email":"david@steema.com","url":"http://www.steema.com"},"_attachments":{"TeeChart-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jhE0pizO59TgLkZgF5jqEw==","length":39110,"stub":true}}}},
{"id":"Templ8","key":"Templ8","value":{"rev":"51-7a28ea163f0a46a959e6c1710198448c"},"doc":{"_id":"Templ8","_rev":"51-7a28ea163f0a46a959e6c1710198448c","name":"Templ8","description":"JavaScript Client/ Server Template Engine","dist-tags":{"latest":"0.9.6"},"versions":{"0.1.7":{"name":"Templ8","description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"main":"./Templ8.js","version":"0.1.7","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"_npmJsonOpts":{"file":"/Users/christosconstandinou/.npm/Templ8/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Templ8@0.1.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"a0136813199f34d615ff07435a34f3e60ac91a9e","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.1.7.tgz"},"scripts":{},"directories":{}},"0.1.8":{"name":"Templ8","description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"main":"./Templ8.js","version":"0.1.8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"_npmJsonOpts":{"file":"/Users/christosconstandinou/.npm/Templ8/0.1.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Templ8@0.1.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"aca8d677753aa971a83a045db4442cd77e6a4bad","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.1.8.tgz"},"scripts":{},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.1.9":{"name":"Templ8","description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"main":"./Templ8.js","version":"0.1.9","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"dependencies":{},"devDependencies":{},"_id":"Templ8@0.1.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5a63381fd316f5c7fdb0f5100d585a2fe5e76be4","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.1.9.tgz"},"scripts":{},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.2.0":{"name":"Templ8","description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"main":"./Templ8.js","version":"0.2.0","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"dependencies":{},"devDependencies":{},"_id":"Templ8@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"35ed3d1316ead806b30ebd088affc6ba72ce9f45","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.2.1":{"name":"Templ8","description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"main":"./Templ8.js","version":"0.2.1","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"_npmJsonOpts":{"file":"/Users/christosconstandinou/.npm/Templ8/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Templ8@0.2.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"75d97971545256916e5f4cff3c8de39ee70cd45d","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.3.0":{"name":"Templ8","description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"main":"./Templ8.js","version":"0.3.0","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"_npmJsonOpts":{"file":"/Users/constantology/.npm/Templ8/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Templ8@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3dc8f631b0033956c2aedd6c40a2108e34dc978f","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.3.0.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.5.0":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"JavaScript Client/ Server Template Engine","keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.5.0","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.5.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"77f16db596878514b34b9a26ea5bfe11b7987a63","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.5.0.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.1kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.5kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.5kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.6.0":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"JavaScript Client/ Server Template Engine","devDependencies":{"priv8i":">= 0.0.1"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.6.0","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.6.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"95b53b36d33034b1203ddb5363df4f53a67872de","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.6.0.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.1kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.5kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.5kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.7.0":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"JavaScript Client/ Server Template Engine","devDependencies":{"priv8i":">= 0.0.1"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.7.0","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.7.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d0203db2493db8a150b2c340810b6c1ccefd85c1","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.7.0.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.1kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.5kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.5kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.7.1":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"JavaScript Client/ Server Template Engine","devDependencies":{"priv8i":">= 0.0.1"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.7.1","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.7.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"ad6f5c8b64a1f729bbe3545208a31f641365c42c","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.7.1.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.1kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.5kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.5kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.7.2":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"description":"JavaScript Client/ Server Template Engine","devDependencies":{"priv8i":">= 0.0.1"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.7.2","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.7.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e8062ccf89043e901362fda454ee349a37a6d0c5","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.7.2.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.1kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.5kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.5kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.8.0":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"description":"JavaScript Client/ Server Template Engine","devDependencies":{"priv8i":">= 0.0.1"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.8.0","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.8.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1751663029579040f4851d18e3c56339bb96d372","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.8.0.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.1kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.5kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.5kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.0":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.0","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f7eb21bead586b49086531dc425325c5c53eedca","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.0.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>7kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.2kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.8kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.6kb</td><td>uglified + deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.1":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.1","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"10b6c2b3e02ccf8cabd29be42d3eb0f776d1441c","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.1.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.9kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.2kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.9kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.8kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.Filter.html.js</td><td>0.59kb</td><td>deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.2":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.2","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"56bbfc2fd42e682f8fab284283a8f7c1210f0641","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.2.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n- add unit tests (already have tests: just wanting to port them from my own framework to an existing one like JSTestDriver or something).\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## Usage\nTempl8 is avaiable as a Node JS module as well as a browser micro-framework.\n\n### Node\n\n#### Installation\n```\n   npm install Templ8\n```\n#### Requiring\n```javascript\n   var Templ8 = require( 'Templ8' );\n```\n\n### Browser\n\nYou have 2 options.\n\n1. `Templ8.js`/ `Templ8.min.js` are the dev/ prod versions optimised for modern browsers (i.e. browsers that have implemented all of the items in [kangax's es5 compatability table](http://kangax.github.com/es5-compat-table/)).\n2. `Templ8.shim.js`/ `Templ8.shim.min.js` are as above, except that [wedgES](https://github.com/constantology/wedgES) – only an extra 1.6kb – has been included to enable backwards compatibility with older browsers.\n\n**NOTE:** Safari <= 5.1.3 still has not implemented `Function.prototype.bind` so you will need to use `Templ8.shim.js` for Safari.\n\n**NOTE:** The shimmed methods **will not** overwrite any native implementations.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.9kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.2kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.shim.js</td><td>8.9kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.shim.min.js</td><td>6.8kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.Filter.html.js</td><td>0.59kb</td><td>deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.3":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"m8":">= 0.1.0","commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.3","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c9cd5282e85e5ca3f132144ef30eef171bcfc960","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.3.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## WARNING!!!\nWhile **Templ8** has been tested, the testing framework I've written and used is very much a work in progress.\n\nAlso I'm currently between virtual machine software and operating system licenses, so I have only tested on mac osx lion and snow leopard: nodejs – >= v0.613 – as well as current – and beta/ nightly – versions of Chrome, Safari/ Webkit and FireFox.\n\n## Dependencies\n\nTempl8.js only has one dependency [m8.js](/constantology/m8).\n\n**NOTE:**\nIf you are using Templ8 within a commonjs module, you don't need to require m8 before requiring Templ8 as this is done internally and a reference to **m8** is available as: `Templ8.m8`.\n\n```javascript\n\n   var Templ8 = require( 'Templ8' ),\n       m8     = Templ8.m8; // <= reference to m8\n\n// if running in a sandboxed environment remember to:\n   m8.x( Object, Array, Boolean, Function, String ); // and/ or any other Types that require extending.\n\n```\n\nSee [m8: Extending into the future](/constantology/m8) for more information on working with sandboxed modules.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.6kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.0kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.Filter.html.js</td><td>0.59kb</td><td>deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C or \\_\\_CONTEXT\\_\\_\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_\n\nThis is where all parsed template output is stored. It is an instance of an internal class call **Output**.\n\nIt has two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>join</strong></td><td>returns the output of the Templ8 instance.</td>\n</tr><tr>\n\t<td><strong>push</strong></td><td>adds a String representation of the passed parameter to the Templ8 instance's output.</td>\n</tr>\n</table>\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.4":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"m8":">= 0.1.0","commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.4","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"470c81cbc7e921d0e9bb37d2ad3a5923124326e3","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.4.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## WARNING!!!\nWhile **Templ8** has been tested, the testing framework I've written and used is very much a work in progress.\n\nAlso I'm currently between virtual machine software and operating system licenses, so I have only tested on mac osx lion and snow leopard: nodejs – >= v0.6.13 – as well as current – and beta/ nightly – versions of Chrome, Safari/ Webkit and FireFox.\n\n## Dependencies\n\nTempl8.js only has one dependency [m8.js](/constantology/m8).\n\n**NOTE:**\nIf you are using Templ8 within a commonjs module, you don't need to require m8 before requiring Templ8 as this is done internally and a reference to **m8** is available as: `Templ8.m8`.\n\n```javascript\n\n   var Templ8 = require( 'Templ8' ),\n       m8     = Templ8.m8; // <= reference to m8\n\n// if running in a sandboxed environment remember to:\n   m8.x( Object, Array, Boolean, Function, String ); // and/ or any other Types that require extending.\n\n```\n\nSee [m8: Extending into the future](/constantology/m8) for more information on working with sandboxed modules.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.6kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.0kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.Filter.html.js</td><td>0.59kb</td><td>deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C:ContextStack\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_:String\n\nThis is where all parsed template output is stored.\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.5":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"m8":">= 0.1.0","commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.5","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3bebf949dc4f29e23434818fb6adc02a5f3be328","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.5.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## WARNING!!!\nWhile **Templ8** has been tested, the testing framework I've written and used is very much a work in progress.\n\nAlso I'm currently between virtual machine software and operating system licenses, so I have only tested on mac osx lion and snow leopard: nodejs – >= v0.6.13 – as well as current – and beta/ nightly – versions of Chrome, Safari/ Webkit and FireFox.\n\n## Dependencies\n\nTempl8.js only has one dependency [m8.js](/constantology/m8).\n\n**NOTE:**\nIf you are using Templ8 within a commonjs module, you don't need to require m8 before requiring Templ8 as this is done internally and a reference to **m8** is available as: `Templ8.m8`.\n\n```javascript\n\n   var Templ8 = require( 'Templ8' ),\n       m8     = Templ8.m8; // <= reference to m8\n\n// if running in a sandboxed environment remember to:\n   m8.x( Object, Array, Boolean, Function, String ); // and/ or any other Types that require extending.\n\n```\n\nSee [m8: Extending into the future](/constantology/m8) for more information on working with sandboxed modules.\n\n## File size\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n\t<tbody>\n\t\t<tr><td>Templ8.js</td><td>6.6kb</td><td>deflate</td>\n\t\t<tr><td>Templ8.min.js</td><td>5.0kb</td><td>uglified + deflate</td>\n\t\t<tr><td>Templ8.Filter.html.js</td><td>0.59kb</td><td>deflate</td>\n\t</tbody>\n</table>\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the curent iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of thecurrent iteration.</td>\n</tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>previous</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt has the following extra properties available for **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>firstKey</strong></td><td>The key of the first item in the Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Object.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Object.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>previousKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns true if there is a value after the current iteration to iterate over. Otherwise it will return false.</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the iterating, once it finishes it's current iteration.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C:ContextStack\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>destroy</strong></td><td>destroys the ContextStack.</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_:String\n\nThis is where all parsed template output is stored.\n\n##### \\_\\_ASSERT\\_\\_\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"directories":{}},"0.9.6":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"bin":{"Templ8":"./bin/Templ8"},"description":"JavaScript Client/ Server Template Engine","dependencies":{"m8":">= 0.1.0","commander":">= 0.5.0","mkdirp":">= 0.3.0","n8iv":">= 0.1.0","uglify-js":">= 1.2.5"},"keywords":["template","tpl","Templ8"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/Templ8/master/LICENSE"}],"main":"./Templ8.js","name":"Templ8","repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"version":"0.9.6","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"Templ8@0.9.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"95ff0c19f7e374b1f4744cd84ea373a08aeeb68e","tarball":"http://registry.npmjs.org/Templ8/-/Templ8-0.9.6.tgz"},"readme":"#TODO:\n\n- documentation is not yet complete\n\n# Templ8\n\nTempl8 as you can probably guess is a JavaScript template engine, with a Django'ish style of syntax.\n\nIt's fast, light weight and unlike a lot of other JavaScript template engines: **Templ8 does not use the JavaScript `with` statement**. This actually makes Templ8 parse templates faster than it would if it did use the `with` statement!\n\nTempl8 does not restrict you to generating HTML. All outputs are strings so if you want to generate HTML, CSS, JavaScript or whatever, the choice is yours...\n\n## WARNING!!!\nWhile **Templ8** has been tested, the testing framework I've written and used is very much a work in progress.\n\nAlso I'm currently between virtual machine software and operating system licenses, so I have only tested on mac osx lion and snow leopard: nodejs – >= v0.6.13 – as well as current – and beta/ nightly – versions of Chrome, Safari/ Webkit and FireFox.\n\n## Dependencies\n\nTempl8.js only has one dependency [m8.js](/constantology/m8).\n\n**NOTE:**\nIf you are using Templ8 within a commonjs module, you don't need to require m8 before requiring Templ8 as this is done internally and a reference to **m8** is available as: `Templ8.m8`.\n\n```javascript\n\n   var Templ8 = require( 'Templ8' ),\n       m8     = Templ8.m8; // <= reference to m8\n\n// if running in a sandboxed environment remember to:\n   m8.x( Object, Array, Boolean, Function, String ); // and/ or any other Types that require extending.\n\n```\n\nSee [m8: Extending into the future](/constantology/m8) for more information on working with sandboxed modules.\n\n## API\n\nIf all you want to do is swap out values you can use one of the following two smaller template functions.\n\n#### &lt;static&gt; Templ8.format( template`:String`, param1`:String`[, param2`:String`, ..., paramN`:String`] )`:String`\n\nThis function takes a minimum of two parameters. The first is the template you want perform substitutions over.\n\nThe template should use zero based tokens, e.g. `{0}`, `{1}` ... `{N}` that increment for each argument passed to the function.\n\ne.g.\n\n```javascript\n    Templ8.format( 'Hello {0}! Nice {1} we\\'re having.', 'world', 'day' );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\n---\n&nbsp;\n#### &lt;static&gt; Templ8.gsub( template`:String`, dict`:Object`[, pattern`:RegExp`] )`:String`\n\ngsub works similarly to format only it takes an Object with the values you want to substitute, instead of a sequence of parameters. Actually format calls gsub internally.\n\ne.g.\n\n```javascript\n    Templ8.gsub( 'Hello {name}! Nice {time} we\\'re having.', { name : 'world', time : 'day' } );\n```\n\nreturns: *Hello world! Nice day we're having.*\n\nThe default pattern for substitutions is `/\\{([^\\}]+)\\}/g`. However, you can supply a third argument to *gsub* which is your own custom pattern to use instead of the default.\n\nIf you want to do fancy stuff, you'll want to use the Templ8 constructor.\n\n---\n&nbsp;\n#### new Templ8( template`:String`, options`:Object` )\n\nThe Templ8 constructor actually takes an arbitrary number of String arguments which form the template body.\n\nThe last argument to the Templ8 can -- optionally -- be a configuration Object which defines any custom Filters you want to use for this Templ8 and any sub Templates it contains.\n\nIt also accepts the following four parameters (needless to say that these cannot be used as Filter names):\n\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>compiled</strong></td><td>If this is set to <code>true</code> then the Templ8 will be compiled straight away, otherwise it will wait until the first time you call it's <code>parse()</code> method to compile. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>debug</strong></td><td>Useful for debugging. Set this to <code>true</code> to have the Templ8 method body logged to the console. <strong>Default</strong> is <code>false</code>.</td>\n</tr><tr>\n\t<td><strong>fallback</strong></td><td>This is the String to use as a fallback value in case any values are not present when parsing a Templ8 instance. <strong>Default</strong> is <code>\"\"</code>, Empty String.</td>\n</tr><tr>\n\t<td><strong>id</strong></td><td>The ID of your Templ8. This is handy (and mandatory) if you want to use a Templ8 from within another Templ8. Otherwise an anonymous ID will be generated for your Templ8.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n### Templ8 instance methods\n\nTo keep it simple, a Templ8 instance only contains one method.\n\n#### parse( dictionary`:Object` )`:String`\n\nThis method accepts one parameter: an Object of values you want to substitute and returns a String of the parsed Templ8.\n\nAny tokens in the Templ8 that do not have a dictionary value will use the `fallback` value described above,\n\n---\n&nbsp;\n\n### Templ8 variables\n\n#### basic global variables\n\n##### $_\n\nThis is based on perl's `$_` and is a reference to the the current dictionary value being parsed.\n\nFor instance if you are in a loop, rather than access the value using `iter.current` you could also access it via `$_`.\n\ne.g. instead of this:\n\n```javascript\n    {[ iter.current|parse:'sub_template' for each ( items ) ]}\n```\n\nor this:\n\n```javascript\n    {[ item|parse:'sub_template' for each ( item in items ) ]}\n```\n\nyou could do this:\n\n```javascript\n    {[ $_|parse:'sub_template' for each ( items ) ]}\n```\n\n##### iter\n\nThis is the current iterator being parsed. It is an instance of an internal class called **Iter**. Iter instances are created internally, when you use a `{% for %}` loop or an Array Comprehension `{[ for each ]}` tag you should not need to create one yourself.\n\nIt has the following properties available for both **Arrays** and **Objects**:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>count</strong></td><td>the total number of all items in the Array or Object</td>\n</tr><tr>\n\t<td><strong>current</strong></td><td>The current item being iterated over.</td>\n</tr><tr>\n\t<td><strong>empty</strong></td><td>Whether or not the item to iterate over is empty – has no items. Note: if the item is not iterable, this will never be true.</td>\n</tr><tr>\n\t<td><strong>first</strong></td><td>The first item in the Array/ Object. Note: you cannot guarantee iteration order in an Object.</td>\n</tr><tr>\n\t<td><strong>firstKey</strong></td><td>The first key in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>index</strong></td><td>The zero based index of the current iteration.</td>\n</tr><tr>\n\t<td><strong>index1</strong></td><td>The one based index of the current iteration.</td>\n</tr><tr>\n\t<td><strong>key</strong></td><td>The key of the current item being iterated over in the Array/ Object. For Arrays this will be the same as <code>index</code>.</td>\n  </tr><tr>\n\t<td><strong>last</strong></td><td>The last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>lastIndex</strong></td><td>The zero based index of the last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>lastKey</strong></td><td>The key of the last item in the Array/ Object.</td>\n</tr><tr>\n\t<td><strong>next</strong></td><td>The next item in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>nextKey</strong></td><td>The next key in the iteration, or undefined if we're at the last item.</td>\n</tr><tr>\n\t<td><strong>parent</strong></td><td>If you are in a nested loop and want to call the parent iter, you can access it via this property.</td>\n</tr><tr>\n\t<td><strong>prev</strong></td><td>The previous item in the iteration, or undefined if we're at the first item.</td>\n</tr><tr>\n\t<td><strong>prevKey</strong></td><td>The previous key in the iteration, or undefined if we're at the first item.</td>\n</tr><tr>\n\t<td><strong>stopped</strong></td><td>Whether or not the iteration has been stopped..</td>\n</tr><tr>\n\t<td><strong>val</strong></td><td>The same as <code>current</code>.</td>\n</tr>\n</table>\n\nIt also has the following two methods:\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>hasNext</strong></td><td>returns <code>false</code> if there is no value after the current iteration to iterate over. Otherwise it will return the <code>Iter</code> instance (this).</td>\n</tr><tr>\n\t<td><strong>stop</strong></td><td>will stop the <code>Iter</code> instance from iterating after the current iteration has completed.</td>\n</tr>\n</table>\n\n---\n&nbsp;\n\n#### Templ8 internal variables\n\nAlong with the above Templ8 has some internal variables accessible for the more advanced user, should they require access to them.\n\n##### $C:ContextStack\n\nTempl8 **does not use the JavaScript `with` statement**. It implements its own version of a `with` statement using an internal class called **ContextStack**.\n\nIt has five methods (**you should NOT** call these if you DO NOT know what you're doing):\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n\t<td><strong>current</strong></td><td>returns the current context Object</td>\n</tr><tr>\n\t<td><strong>get</strong></td><td>attempts to return the value of a dictionary Object, if it is in the ContextStack, otherwise it will return the fallback value or undefined.</td>\n</tr><tr>\n\t<td><strong>pop</strong></td><td>removes the most recently added dictionary Object from the ContextStack.</td>\n</tr><tr>\n \t<td><strong>push</strong></td><td>adds a dictionary Object to the ContextStack.</td>\n</tr>\n</table>\n\n##### \\_\\_OUTPUT\\_\\_:String\n\nThis is where all parsed template output is stored.\n\n##### \\_\\_ASSERT\\_\\_:Function{}\n\nThis is a reference to Templ8.Assertions.\n\n##### \\_\\_FILTER\\_\\_:Function{}\n\nThis is a reference to Templ8.Filters.\n\n##### \\_\\_UTIL\\_\\_:Function{}\n\nThis is a reference to the internal utility functions used by Templ8.\n\n---\n&nbsp;\n\n### Tags & Statements\n\n#### **Tag: {{}}** - Interpolation\n\nThis tag is used for interpolating dictionary values with their respective template tokens. At it simplest a tag which will be replaced by a dictionary value `foo` would look something like this:\n\n```javascript\n    var tpl = new Templ8( '{{foo}}' );\n    tpl.parse( { foo : 'bar' } ); // returns: bar\n```\n\n##### Accessing nested values\n\nIf your dictionary contains nested objects you can easily access nested values like you would in regular JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.value}}' );\n    tpl.parse( { some : { nested : { value : 'foo' } } } ); // returns: foo\n```\n\nYou can also similarly access values from Array's in the same way:\n\n```javascript\n    var tpl = new Templ8( '{{some.nested.1.value}}' );\n    tpl.parse( { some : { nested : [{ value : 'lorem' },{ value : 'ipsum' },{ value : 'dolor' }] } } ); // returns: ispum\n```\n\n##### Filtering\n\nThis is all well and good, but at some point we will want to manipulate the values in our dictionary Objects in some way or another.\n\nTempl8 provides a very simple and powerful method for doing so based on Django's pipe syntax for filtering values.\n\nIt is probably most easily illustrated with an example showing the pipe syntax converted to JavaScript. So:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph}}\n```\n\nWould translate to something like this:\n\n```javascript\n\tvalue = truncate( value, 30 );\n\tvalue = bold( value );\n\tvalue = wrap( value, '(', ')' );\n\tvalue = paragraph( value );\n\t\n\t// or \n\t\n\tparagraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) );\n```\n\nThe most important thing to note is that the first value passed to the filter is always the value being parsed by the template, the arguments passed to each filter will always come after the value being parsed.\n\n##### One line statements\n\nAs well as standard template conditionals, Templ8 introduces one line statements, because, hey it's JavaScript and we like to keep things concise. \n\nIf you only want to parse a value if a certain condition is met, rather than writing block if tags around it, you can include it in your interpolation tag like so:\n\n```javascript\n    {{value if value|exists}}\n```\n\nWhich translates to something like this:\n\n```javascript\n    if ( exists( value ) ) { __OUTPUT__ += value; }\n```\n\nNotice how you can use the same pipe syntax for conditionals. Templ8's internals work out whether your method is an assertion or a filter and reference the appropriate method.\n\nYou can also use ordinary JavaScript conditions if you want to, as well as an **unless** statement; and filtering is still ok too. \n\nA more complex example would be:\n\n```javascript\n    {{value|truncate:30|bold|wrap:\"(\", \")\"|paragraph unless value == null}}\n```\n\nTranslating to something like:\n\n```javascript\n    if ( !( value == null ) ) { \n       paragraph( wrap( bold( truncate( value, 30 ) ), '(', ')' ) ); \n    }\n```\n\n#### **Tag: {%%}** - Evaluation\n\nThis tag is used in conjunction with the above tag to give you access to more powerful conditional statements, iteration and sub templates.\n\n##### if/ unless/ elseif/ else/ endif Statements\n\nJust like regular JavaScript Templ8 features conditional statements. It also introduces the `unless` statement based off Perl.\n\nEvery open `if`/ `unless` statement must end with an `endif` statement -- with any number of`elseif`s in between; an optional `else` is also allowed just before `endif`.\n\nThe reason for the `endif` statement is that Templ8 does not use braces to encapsulate block statements, so it requires a flag to let the parser know when to close a block.\n\n**Note: `elseif` should be written as one word, no spaces. It can also be written as `elsif`, again, based off Perl.**\n\nAn example would be:\n\n```javascript\n    {% if value == 'foo' %}\n        <h1>{{value|bold}}</h1>\n    {% elseif value == 'bar' %}\n        <h2>{{value|italics}}</h2>\n    {% else %}\n        {{value}}\n    {% endif %}\n```\n\nTranslating to:\n\n```javascript\n    if ( value == 'foo' ) { \n        '<h1>' + bold( value ) + '</h1>';\n    }\n    else if ( value == 'bar' ) {\n        '<h2>' + italics( value ) + '</h2>';\n    }\n    else { value; }\n````\n\n##### for/ forempty/ endfor Statements\nThe `for` statement allows you to iterate over Arrays as well as Objects. There are a number of options available with the `for` statement.\n\nJust like the `if` statement the `for` statement must end with an `endfor` statement to tell the parser that the statement block is ending.\n\nYou can also include a `forempty` statement which will be used in the case where an Array/ Object is either empty or the item you are trying to iterate over is not iterable, e.g. a Number or Date. `forempty` is not mandatory.\n\nThe `iter` variable mentioned above is the standard way to access any and all properties you require while iterating over an Array/ Object.\n\nYou can also use `$_` to access the current value being iterated over.\n\nHowever you can also assign your own variable names to the `for`. e.g.\n\n```javascript\n    {% for item in items %}\n        {{item}}\n    {% forempty %}\n        No items\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `item`, which is accessible as demonstrated.\n\n```javascript\n    {% for [key, value] in items %}\n        {{key}}. {{value}}\n    {% endfor %}\n```\n\nWill assign the current value being iterated over to the variable `value`. If you are iterating over an Array then the variable `key` will be the zero based index of the the current item being iterated over. If you are iterating over an Object then the variable `key` will be the the key name of the current item being iterted over.\n\nIf you want to limit the number of items you are iterating over you can do so by using brackets to specify the range of items to iterate over.\n\n```javascript\n    {% for item in items [..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 0 to 10, so the first 11 items in the Array/ Object.\n\n```javascript\n    {% for item in items [5..10] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over items 5 to 10.\n\n```javascript\n    {% for item in items [5..] %}\n        {{item}}\n    {% endfor %}\n```\n\nWill iterate over all items starting from the 6th item in the Array/ Object.\n\nIf you are nesting `for` statements you can access the parent `iter` Object by using the syntax `iter.parent` this will maintain state no matter how deep you nest.\n\n##### sub/ endsub templates\nTODO\n\n#### **Tag: {[]}** - Array Comprehensions\nTODO\n\n#### **Tag: {::}** - Executing Arbitrary JavaScript\nTODO\n\n#### **Tag: {##}** - Comments\nTODO\n\n#### Adding your own Tags and/ or Statements\nTODO\n\n---\n&nbsp;\n## Examples (by tag)\n\n### **Tag: {{}}**\n\n#### Replacing values\n\n```javascript\n    var tpl = new Templ8( '{{value}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n```\n\n##### Filtering values\n\n```javascript\n    var tpl = new Templ8( '{{value|truncate:30|bold|link:\"http://github.com\"}}' );\n\n    tpl.parse( { value : 'github.com is great for sharing your code with other people.' } ); \n```\n\nreturns the String:\n\n```html\n\t<a href=\"http://github.com\"><strong>github.com is great for sharin...</strong></a>\n```\n\n##### One line *if* statement\n\n```javascript\n    var tpl = new Templ8( '{{value if value|notEmpty}}' );\n    \n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( {} );                       // returns: empty String ( \"\" )\n```\n\n##### One line *unless* statement\n\n```javascript\n   var tpl = new Templ8( '{{value unless value|equals:\"foo\"}}' );\n\n    tpl.parse( { value : 'github.com' } ); // returns: *github.com*\n\n    tpl.parse( { value : 'foo' } );        // returns: empty String ( \"\" )\n```\n\n---\n&nbsp;\n\n### Tag **{%%}**\n\n#### conditions: *if|unless/ elseif/ else/ endif*\n\n```javascript\n    var tpl = new Templ8(\n        '{% if value == \"foo\" || value == \"bar\" %}',\n            '{{value}}',\n        '{% elseif value != \"lorem ipsum\" %}',\n            '{{value|bold}}',\n        '{% elseif value|notEmpty %}',\n            '{{value|italics}}',\n        '{% else %}',\n            'No value',\n        '{% endif %}'\n    );\n\n    tpl.parse( { value : 'foo' } );            // returns: foo\n\n    tpl.parse( { value : 'lorem ipsum' } );    // returns: <strong>lorem ipsum</strong>\n\n    tpl.parse( { value : 'dolor sit amet' } ); // returns: <em>dolor sit amet</em>\n\n    tpl.parse( {} );                           // returns: No Value\n```\n\n#### iterating: *for/ forempty/ endfor*\n\n```javascript\n    var tpl = new Templ8(\n\t    '{% for item in items %}',\n            '<p>{{item}}</p>',\n        '{% forempty %}',\n            '<p><strong>No items</strong></p>',\n        '{% endfor %}' \n    );\n\n    tpl.parse( { items : ['one', 'two', 'three'] } );               // returns: <p>one</p><p>two</p><p>three</p>\n\n    tpl.parse( { items : { \"one\" : 1, \"two\" : 2, \"three\" : 3 } } ); // returns: <p>1</p><p>2</p><p>3</p>\n\n    tpl.parse( {} );                                                // returns: <p><strong>No items</strong></p>\n    \n    tpl.parse( { items : foo } );                                   // returns: <p><strong>No items</strong></p>\n```\n\n#### *sub/ endsub* templates\n\n```javascript\n    var tpl = new Templ8(\n        '{% sub list_item %}', '<li>{{$_}}</li>', '{% endsub %}', \n        '<ul>{[ item|parse:\"list_item\" for each ( item in items ) ]}</ul>'\n    );\n\n\ttpl.parse( { items : ['one', 'two', 'three'] } );\n```\n\nreturns the String:\n\n```html\n\t<ul><li>one</li><li>two</li><li>three</li></ul>\n```\n\n---\n&nbsp;\n\n### Tag **{[]}** (Array comprehensions or one line for loops)\n\n```javascript\n    var tpl_foo = new Templ8( { id : 'foo' }, '<em>{{val}}</em>' ), \n        tpl_bar = new Templ8( { id : 'bar' }, '<strong>{{val}}</strong>' ), \n        tpl     = new Templ8( '{[ v|parse:k|paragraph for each ( [k,v] in items ) if ( k|isTPL ) ]}' );\n\n    tpl.parse( {\n        foo  : { val : 'foo' }, \t\n        bar  : { val : 'bar' }, \n        greg : { val : 'not gonna happen' }\n    } );\n```\n\nreturns the String:\n\n```html\n\t<p><em>foo</em></p><p><strong>bar</strong></p>\n```\n\nas **greg** does not exist as a template (poor greg), the value is not rendered...\n\n---\n&nbsp;\n\n### Tag **{::}**\nAllows you to execute arbitrary JavaScript.\n\n```javascript\n    var tpl = new Templ8( '{: aribtrarily.executing.nasty.code.isFun(); :}' );\n```\n\n---\n&nbsp;\n\n### Tag **{##}**\nAllows you to add comments in your template.\n\n```javascript\n    var tpl = new Templ8( '{# doing something complex and describing it is sensible, but not probable #}' );\n```\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2011 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]}},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"time":{"modified":"2012-06-30T18:12:27.454Z","created":"2011-07-14T09:52:30.396Z","0.1.7":"2011-07-14T09:52:30.957Z","0.1.8":"2011-08-01T08:13:07.116Z","0.1.9":"2011-08-28T12:36:03.137Z","0.2.0":"2011-08-29T11:01:39.969Z","0.2.1":"2011-09-04T07:44:28.406Z","0.3.0":"2011-10-25T12:04:43.386Z","0.5.0":"2012-02-25T01:07:04.777Z","0.6.0":"2012-02-25T23:25:13.246Z","0.7.0":"2012-02-27T16:54:17.267Z","0.7.1":"2012-02-27T16:55:58.768Z","0.7.2":"2012-03-21T17:03:33.289Z","0.8.0":"2012-03-23T19:22:44.494Z","0.9.0":"2012-03-30T22:18:38.125Z","0.9.1":"2012-04-01T00:00:54.355Z","0.9.2":"2012-04-05T20:49:37.323Z","0.9.3":"2012-04-24T19:21:47.754Z","0.9.4":"2012-05-06T22:09:19.095Z","0.9.5":"2012-05-07T15:59:47.554Z","0.9.6":"2012-06-30T18:12:27.454Z"},"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"repository":{"type":"git","url":"git@github.com:constantology/Templ8.git"},"_attachments":{"Templ8-0.9.6.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-rURSj9u4jKrb5LLqSXsuOA==","length":15906,"stub":true},"Templ8-0.9.5.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-8ZcDDIGoSYV+ksl13HvgMw==","length":15822,"stub":true},"Templ8-0.9.4.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-3RcUcum4rMRFWa1fc5kTsg==","length":15768,"stub":true},"Templ8-0.9.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-YU9AioFtI8NPxt0CN/tF/w==","length":15813,"stub":true},"Templ8-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-1tKkdckrXUYvNGcbuyJOmw==","length":16207,"stub":true},"Templ8-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-zajWRiHNwZDsnxr70+7/mw==","length":16507,"stub":true},"Templ8-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-SE2AP9GTfLpRmih2f14A/w==","length":16638,"stub":true},"Templ8-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-QNydM/GNKSFXvPUvcvey9Q==","length":15176,"stub":true},"Templ8-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-S/Ujm8TvQnbOVA67hE8FHg==","length":15159,"stub":true},"Templ8-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-32GvCfaa6F/q86O2AWTAjQ==","length":14824,"stub":true},"Templ8-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-pVylWHOwWdNx0iEbfi/E/g==","length":15965,"stub":true},"Templ8-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-nUmoM/+1Jh0TGy6O55SgIw==","length":20148,"stub":true},"Templ8-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-h9PTMZS+6UoyRA1qQ9whyw==","length":19988,"stub":true},"Templ8-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-LN5sSzAC+NnUu4BvYcC1gg==","length":25210,"stub":true},"Templ8-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-a+RN0HG/Fb3d7R6VmmpyVw==","length":14779,"stub":true},"Templ8-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zXxQzaIn/v8XAYh8yATyxg==","length":24444,"stub":true},"Templ8-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-rWSx3D0UZB+fkxuGKO7VhA==","length":24447,"stub":true},"Templ8-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gEDdskZenOxehgdzL3gr0g==","length":14053,"stub":true},"Templ8-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wKCdpmI9WnqTFMipGGokvQ==","length":64929,"stub":true}}}},
{"id":"Template","key":"Template","value":{"rev":"6-1f055c73524d2b7e82eb6c225bd4b8e0"},"doc":{"_id":"Template","_rev":"6-1f055c73524d2b7e82eb6c225bd4b8e0","name":"Template","dist-tags":{"latest":"0.4.0"},"versions":{"0.4.0":{"name":"Template","version":"0.4.0","main":"./lib/Template","modules":{},"dependencies":{},"engines":{"node":">=0.1.0"},"_id":"Template@0.4.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/Template/-/Template-0.4.0.tgz"},"mtime":"2010-11-09T23:36:40Z","ctime":"2010-11-09T23:36:40Z"}},"maintainers":[{"name":"myfreeweb","email":"me@myfreeweb.ru"}],"mtime":"2010-11-09T23:36:40Z","ctime":"2010-11-09T23:36:40Z","_attachments":{"Template-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-e6t0x5JZWZFQ10/oXyXb1Q==","length":39458,"stub":true}}}},
{"id":"Tempus","key":"Tempus","value":{"rev":"3-17530946ba1d785d954343614cbc28c6"},"doc":{"_id":"Tempus","_rev":"3-17530946ba1d785d954343614cbc28c6","name":"Tempus","description":"Time for a new Date()","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"Tempus","version":"0.1.0","description":"Time for a new Date()","homepage":"http://tempus-js.com","keywords":["date","browser","node"],"maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"licenses":[{"type":"MIT","url":"http://keithamus.mit-license.org/"}],"repositories":[{"type":"git","url":"https://github.com/keithamus/tempus"}],"devDependencies":{"qunit":"0.2.x"},"scripts":{"test":"node test/index.js"},"main":"./tempus.js","_npmUser":{"name":"keithamus","email":"npm@keithcirkel.co.uk"},"_id":"Tempus@0.1.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"7770c42f240cd09e2bfd3a83a8de6db2a924b908","tarball":"http://registry.npmjs.org/Tempus/-/Tempus-0.1.0.tgz"},"readme":""}},"readme":"","maintainers":[{"name":"keithamus","email":"npm@keithcirkel.co.uk"}],"time":{"modified":"2012-02-24T22:56:24.433Z","created":"2012-02-24T22:55:59.723Z","0.1.0":"2012-02-24T22:56:24.433Z"},"_attachments":{"Tempus-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UPXRI9SyiMzhQIEot15qvQ==","length":2296236,"stub":true}}}},
{"id":"Ter","key":"Ter","value":{"rev":"9-b4292be4fb5336adbda2b816d143a8ca"},"doc":{"_id":"Ter","_rev":"9-b4292be4fb5336adbda2b816d143a8ca","name":"Ter","description":"Generate Plain Text Archive File.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.0":{"author":{"name":"yuitest","email":"yuitest_dev@cjhat.net"},"name":"Ter","description":"Generate Plain Text Archive File.","version":"0.0.0","repository":{"url":""},"dependencies":{"commander":"","async":"","mkdirp":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"yuitest","email":"yuitest@cjhat.net"},"_id":"Ter@0.0.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3aaa7222e575dce66681f8837933b90cd8b6b5cb","tarball":"http://registry.npmjs.org/Ter/-/Ter-0.0.0.tgz"},"maintainers":[{"name":"yuitest","email":"yuitest@cjhat.net"}]},"0.0.1":{"author":{"name":"yuitest","email":"yuitest_dev@cjhat.net"},"name":"Ter","description":"Generate Plain Text Archive File.","version":"0.0.1","repository":{"url":"git://github.com/yuitest/node-ter-archive.git"},"dependencies":{"commander":"","async":"","mkdirp":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"yuitest","email":"yuitest@cjhat.net"},"_id":"Ter@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3d664bc9854db83ec96eb7c5c15543d8846f44fc","tarball":"http://registry.npmjs.org/Ter/-/Ter-0.0.1.tgz"},"maintainers":[{"name":"yuitest","email":"yuitest@cjhat.net"}]},"0.0.2":{"author":{"name":"yuitest","email":"yuitest_dev@cjhat.net"},"name":"Ter","description":"Generate Plain Text Archive File.","version":"0.0.2","repository":{"url":"git://github.com/yuitest/node-ter-archive.git"},"bin":{"ter":"./index.js"},"dependencies":{"commander":"","async":"","mkdirp":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"yuitest","email":"yuitest@cjhat.net"},"_id":"Ter@0.0.2","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"50daed8d82691f07e84623c9cc9fa58fcff8cb35","tarball":"http://registry.npmjs.org/Ter/-/Ter-0.0.2.tgz"},"maintainers":[{"name":"yuitest","email":"yuitest@cjhat.net"}]},"0.0.3":{"author":{"name":"yuitest","email":"yuitest_dev@cjhat.net"},"name":"Ter","description":"Generate Plain Text Archive File.","version":"0.0.3","repository":{"url":"git://github.com/yuitest/node-ter-archive.git"},"bin":{"ter":"./index.js"},"dependencies":{"commander":"","async":"","mkdirp":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"yuitest","email":"yuitest@cjhat.net"},"_id":"Ter@0.0.3","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"eb10982b116425c77aa528e493a7726e1561c6ea","tarball":"http://registry.npmjs.org/Ter/-/Ter-0.0.3.tgz"},"maintainers":[{"name":"yuitest","email":"yuitest@cjhat.net"}]}},"readme":"手抜きです。\n\nREADME もまともに書きません。\n\nUTF-8 で 改行コード LF なファイルだけを、\n\nテキトーに連結します。\n\ndog で元通りにします。\n\nつまり、全部テキストでできたアーカイブファイルです。\n\n\ntar だとどっかにファイルアップロードしなくちゃいけないけど、\n\nテキスト形式なら、 CodePad にも置けるじゃないですか、ほら。\n\nあと、なんかファイル構成とか分かりやすいし、うん。\n\n$ ter cat FILE1 FILE2 ... FILE6 > archive.txt\n\n的な。\n\nless するとあれです。\n\nなんか星マークの可愛い感じです。\n\nそれで\n\n$ ter dog FILE\n\nすると、なんの警告もなしにファイル書き込みして展開します。\n迷惑ですね。\n\n暇があったら再帰的にアーカイブする処理とか入れるかも。\nはい。\n","maintainers":[{"name":"yuitest","email":"yuitest@cjhat.net"}],"time":{"modified":"2012-04-22T07:49:08.484Z","created":"2012-04-22T07:33:55.348Z","0.0.0":"2012-04-22T07:33:58.887Z","0.0.1":"2012-04-22T07:35:07.769Z","0.0.2":"2012-04-22T07:41:13.743Z","0.0.3":"2012-04-22T07:49:08.484Z"},"author":{"name":"yuitest","email":"yuitest_dev@cjhat.net"},"repository":{"url":"git://github.com/yuitest/node-ter-archive.git"},"_attachments":{"Ter-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fjoLCzFrppVFK36SaKvdPw==","length":1755,"stub":true},"Ter-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6Mp8t6L+dBa9Tnk37ICgNQ==","length":1726,"stub":true},"Ter-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-V2F7pPCbh4pzGmN0uKs/Ww==","length":1703,"stub":true},"Ter-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-erfUgT34nr7gkDsoCgyl6Q==","length":1680,"stub":true}}}},
{"id":"Thimble","key":"Thimble","value":{"rev":"3-8499b261206f2f2e9acf92d8a4e54afb"},"doc":{"_id":"Thimble","_rev":"3-8499b261206f2f2e9acf92d8a4e54afb","name":"Thimble","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Matt"},"name":"Thimble","version":"0.0.1","repository":{"url":""},"bin":{"Thimble":"./bin/thimble.js"},"main":"./lib/middleware.js","engines":{"node":">=0.2.5"},"dependencies":{},"devDependencies":{},"_id":"Thimble@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f0dec10b6d0e5f4f69162bbdd4eae45790b5cdcb","tarball":"http://registry.npmjs.org/Thimble/-/Thimble-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"mattmueller","email":"mattmuelle@gmail.com"}]}},"maintainers":[{"name":"mattmueller","email":"mattmuelle@gmail.com"}],"time":{"modified":"2011-08-04T13:56:57.165Z","created":"2011-08-04T13:56:56.595Z","0.0.1":"2011-08-04T13:56:57.165Z"},"author":{"name":"Matt"},"repository":{"url":""},"_attachments":{"Thimble-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BghCmnYFOxrmpDXC0zoQ5g==","length":1232864,"stub":true}}}},
{"id":"ThumborJS","key":"ThumborJS","value":{"rev":"3-08375196bbead63a73f6cd762e877556"},"doc":{"_id":"ThumborJS","_rev":"3-08375196bbead63a73f6cd762e877556","name":"ThumborJS","description":"An extension library to generate encrypted URLs for Thumbor using Node.js","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"ThumborJS","description":"An extension library to generate encrypted URLs for Thumbor using Node.js","version":"0.1.0","author":{"name":"Rafael Carício","email":"rafael@caricio.com"},"contributors":[],"main":"./src","dependencies":{"ezcrypto":"~0.0.3"},"devDependencies":{"vows":"~0.6.2"},"keywords":["imaging service","thumbor","api","client"],"licenses":[{"type":"MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git://github.com/rafaelcaricio/ThumborJS.git"},"scripts":{"test":"make vows"},"engines":{"node":">= 0.6.11"},"_npmUser":{"name":"rafaelcaricio","email":"rafael@caricio.com"},"_id":"ThumborJS@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0540e56fc6bbc928553e46051125115ba1c17936","tarball":"http://registry.npmjs.org/ThumborJS/-/ThumborJS-0.1.0.tgz"},"readme":"","maintainers":[{"name":"rafaelcaricio","email":"rafael@caricio.com"}]}},"readme":"","maintainers":[{"name":"rafaelcaricio","email":"rafael@caricio.com"}],"time":{"modified":"2012-04-22T22:43:20.902Z","created":"2012-04-22T22:43:14.279Z","0.1.0":"2012-04-22T22:43:20.902Z"},"author":{"name":"Rafael Carício","email":"rafael@caricio.com"},"repository":{"type":"git","url":"git://github.com/rafaelcaricio/ThumborJS.git"},"_attachments":{"ThumborJS-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hiLkvJRJn0NYvBHeZHmJ4w==","length":3121,"stub":true}}}},
{"id":"TimeSpan.js","key":"TimeSpan.js","value":{"rev":"3-07fa5374b79ca0e6be19681ff9163302"},"doc":{"_id":"TimeSpan.js","_rev":"3-07fa5374b79ca0e6be19681ff9163302","name":"TimeSpan.js","description":"Manage lengths of time with Javascript","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Rob Middleton","email":"rob@i.tv"},"name":"TimeSpan.js","description":"Manage lengths of time with Javascript","version":"1.0.0","repository":{"type":"git","url":"git://github.com/idottv/TimeSpan.js.git"},"main":"TimeSpan.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"rob-ot","email":"dsmlover@gmail.com"},"_id":"TimeSpan.js@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"1c9710a4f933561d212146e76397031f3b6b3e2b","tarball":"http://registry.npmjs.org/TimeSpan.js/-/TimeSpan.js-1.0.0.tgz"},"maintainers":[{"name":"rob-ot","email":"dsmlover@gmail.com"}]}},"maintainers":[{"name":"rob-ot","email":"dsmlover@gmail.com"}],"time":{"modified":"2011-12-01T02:36:28.987Z","created":"2011-11-30T23:05:42.326Z","1.0.0":"2011-12-01T02:36:28.987Z"},"author":{"name":"Rob Middleton","email":"rob@i.tv"},"repository":{"type":"git","url":"git://github.com/idottv/TimeSpan.js.git"},"_attachments":{"TimeSpan.js-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kQTK2MI3KnBEwXMHUkb/eQ==","length":2943,"stub":true}}}},
{"id":"Timeliner.Core","key":"Timeliner.Core","value":{"rev":"9-e895e0a1e3c99ffebd4868cf72c779d6"},"doc":{"_id":"Timeliner.Core","_rev":"9-e895e0a1e3c99ffebd4868cf72c779d6","name":"Timeliner.Core","description":"Base module for Timeliner.Index and Timeliner.Search.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Thomas Fritz","email":"fritztho@gmail.com","url":"http://fritzthomas.com"},"description":"Base module for Timeliner.Index and Timeliner.Search.","name":"Timeliner.Core","version":"0.1.0","homepage":"https://github.com/thomasfr/Timeliner.Core","scripts":{"test":"make test"},"repository":{"type":"git","url":"git://github.com/thomasfr/Timeliner.Core.git"},"dependencies":{"underscore":"~1.3.3","natural":"~0.1.12","async":"~0.1.22"},"engines":{"node":"~0.6.19"},"devDependencies":{"mocha":"latest","should":"latest"},"optionalDependencies":{},"_npmUser":{"name":"thomasfr","email":"fritztho@gmail.com"},"_id":"Timeliner.Core@0.1.0","_engineSupported":false,"_npmVersion":"1.1.25","_nodeVersion":"v0.7.10","_defaultsLoaded":true,"dist":{"shasum":"1b0cad46ef753904d6b87da01eda5fdd2877d9b6","tarball":"http://registry.npmjs.org/Timeliner.Core/-/Timeliner.Core-0.1.0.tgz"},"maintainers":[{"name":"thomasfr","email":"fritztho@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Thomas Fritz","email":"fritztho@gmail.com","url":"http://fritzthomas.com"},"description":"Base module for Timeliner.Index and Timeliner.Search.","name":"Timeliner.Core","version":"0.1.1","homepage":"https://github.com/thomasfr/Timeliner.Core","scripts":{"test":"make test"},"repository":{"type":"git","url":"git://github.com/thomasfr/Timeliner.Core.git"},"dependencies":{"underscore":"~1.3.3","natural":"~0.1.12","async":"~0.1.22"},"engines":{"node":"~0.6.19 || ~0.7.10"},"devDependencies":{"mocha":"latest","should":"latest"},"optionalDependencies":{},"_npmUser":{"name":"thomasfr","email":"fritztho@gmail.com"},"_id":"Timeliner.Core@0.1.1","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.7.10","_defaultsLoaded":true,"dist":{"shasum":"2848afc977ef4462e7925f63aaad4daafe2d841b","tarball":"http://registry.npmjs.org/Timeliner.Core/-/Timeliner.Core-0.1.1.tgz"},"maintainers":[{"name":"thomasfr","email":"fritztho@gmail.com"}]}},"readme":"Timeliner.Core\n==============\n\nThis module contains shared dependencies for Timeliner.Index and Timeliner.Search.\nIt provides / exports 2 public functions:\n\n * tokenizeWord(String word)\n * tokenizeText(String text)\n\n\nInstallation\n============\n\n```\nnpm install Timeliner.Core\n```\n\nUsage\n=====\n\n```javascript\n// example/example-tokenizeText1.js:\nvar Core = require('Timeliner.Core').tokenizeText;\nvar dummyText = \"This is an example text. It will create some strings, let`s say tokens. This Tokens are generated via stemming, singularizing and calculating phonetic strings for every word. This is done through the wonderful and excellent 'natural' module by chris umbel!\";\ntokenizeText(dummyText, function (error, tokens) {\n    console.log(tokens);\n});\n```\n\nThis will ouput:\n----------------\n\n```json\n[ 'AFR',\n  'AKSMPL',\n  'AKSSL',\n  'AKSSLNT',\n  'AL',\n  'ANT',\n  'ANTRFL',\n  'CALC',\n  'CALCULATING',\n  'CHRI',\n  'CHRIS',\n  'CHRY',\n  'CRE',\n  'CREATE',\n  'DON',\n  'DONE',\n  'EVERY',\n  'EXAMPL',\n  'EXAMPLE',\n  'EXCEL',\n  'EXCELLENT',\n  'FL',\n  'FNT',\n  'FNTK',\n  'FNTRFL',\n  'GEN',\n  'GENERATED',\n  'KLK',\n  'KLKLTNK',\n  'KN',\n  'KNRTT',\n  'KR',\n  'KRT',\n  'MOD',\n  'MODULE',\n  'MT',\n  'MTL',\n  'PHONET',\n  'PHONETIC',\n  'SAY',\n  'SINGUL',\n  'SINGULARIZING',\n  'SNKL',\n  'SNKLRSNK',\n  'STRING',\n  'STRINGS',\n  'STRNK',\n  'TK',\n  'TKN',\n  'TN',\n  'TOK',\n  'TOKEN',\n  'TOKENS',\n  'VIA',\n  'WIL',\n  'WILL',\n  'WOND',\n  'WONDERFUL' ]\n\n```\n\nLICENSE\n=======\n\nCopyright (c) 2012 Thomas Fritz\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"thomasfr","email":"fritztho@gmail.com"}],"time":{"modified":"2012-06-15T13:30:12.801Z","created":"2012-06-15T12:58:52.293Z","0.1.0":"2012-06-15T12:58:53.883Z","0.1.1":"2012-06-15T13:30:12.801Z"},"author":{"name":"Thomas Fritz","email":"fritztho@gmail.com","url":"http://fritzthomas.com"},"repository":{"type":"git","url":"git://github.com/thomasfr/Timeliner.Core.git"},"_attachments":{"Timeliner.Core-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-8jGeLlO2F1D6dWA/ffrUqA==","length":5388,"stub":true},"Timeliner.Core-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CgZUTwWjAt/pM59OHQKZ3g==","length":5386,"stub":true}}}},
{"id":"Timeliner.Index","key":"Timeliner.Index","value":{"rev":"3-71c8d3f731adfba1c979905bb0c51a45"},"doc":{"_id":"Timeliner.Index","_rev":"3-71c8d3f731adfba1c979905bb0c51a45","name":"Timeliner.Index","description":"Indexer module for Timeliner. Can be used standalone for indexing only. Use Timeliner.Search for searching","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Thomas Fritz","email":"fritztho@gmail.com","url":"http://thomas-fritz.at/"},"name":"Timeliner.Index","description":"Indexer module for Timeliner. Can be used standalone for indexing only. Use Timeliner.Search for searching","version":"0.1.0","homepage":"https://github.com/thomasfr/Timeliner.Index","repository":{"url":"https://github.com/thomasfr/Timeliner.Index.git"},"scripts":{"test":"make test"},"dependencies":{"Timeliner.Core":"latest","configuration":"latest","hiredis":"~0.1.14","redis":"0.7.2"},"devDependencies":{"mocha":"latest","should":"latest"},"optionalDependencies":{},"engines":{"node":"~0.6.19 || ~0.7.10"},"readme":"Timeliner.Index\n===============\n\nInstallation\n============\n...\n\nUsage\n=====\n...\n\nLICENSE\n=======\n\nCopyright (c) 2012 Thomas Fritz\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"Timeliner.Index@0.1.0","dist":{"shasum":"62511dc2b837b2c45215509241fc4c4f3931a9bf","tarball":"http://registry.npmjs.org/Timeliner.Index/-/Timeliner.Index-0.1.0.tgz"},"maintainers":[{"name":"thomasfr","email":"fritztho@gmail.com"}]}},"readme":"Timeliner.Index\n===============\n\nInstallation\n============\n...\n\nUsage\n=====\n...\n\nLICENSE\n=======\n\nCopyright (c) 2012 Thomas Fritz\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","maintainers":[{"name":"thomasfr","email":"fritztho@gmail.com"}],"time":{"modified":"2012-06-15T21:35:39.182Z","created":"2012-06-15T21:35:37.541Z","0.1.0":"2012-06-15T21:35:39.182Z"},"author":{"name":"Thomas Fritz","email":"fritztho@gmail.com","url":"http://thomas-fritz.at/"},"repository":{"url":"https://github.com/thomasfr/Timeliner.Index.git"},"_attachments":{"Timeliner.Index-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AbRFWvPQUB9M8K3qUYQO5A==","length":3932,"stub":true}}}},
{"id":"Todo","key":"Todo","value":{"rev":"5-f32410258d635112829738f9fd1c8e12"},"doc":{"_id":"Todo","_rev":"5-f32410258d635112829738f9fd1c8e12","name":"Todo","description":"Taskmanagement, your way!","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"Todo","description":"Taskmanagement, your way!","keywords":["todo","task","bug","fixme","issue","tracker"],"version":"0.0.1","author":{"name":"Henrik Kjelsberg","email":"hkjels@me.com","url":"http://take.no/"},"homepage":"https://github.com/hkjels/t/","repository":{"type":"git","url":"git://github.com/hkjels/t.git"},"licenses":[{"type":"MIT","url":"http://github.com/hkjels/t/master/LICENSE"}],"bin":{"t":"bin/todo"},"bugs":{"url":"http://github.com/hkjels/t/issues"},"main":"index","engines":{"node":">= 0.4.1 <= 0.7.0"},"dependencies":{"barricane-db":"latest","cli-table":"latest","commander":"latest","express":"latest","jade":"latest","moment":"latest","nib":"latest","op":"0.0.4","stylus":"latest","underscore":"latest"},"devDependencies":{"dox":"latest","jshint":"latest","mocha":"latest","should":"latest"},"_npmUser":{"name":"hkjels","email":"hkjels@me.com"},"_id":"Todo@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.0","_defaultsLoaded":true,"dist":{"shasum":"73f53ad016a675864bea43cd81a447fd0f98ca89","tarball":"http://registry.npmjs.org/Todo/-/Todo-0.0.1.tgz"},"maintainers":[{"name":"hkjels","email":"hkjels@me.com"}]},"0.0.3":{"name":"Todo","description":"Taskmanagement, your way!","keywords":["todo","task","bug","fixme","issue","tracker"],"version":"0.0.3","author":{"name":"Henrik Kjelsberg","email":"hkjels@me.com","url":"http://take.no/"},"homepage":"https://github.com/hkjels/t/","repository":{"type":"git","url":"git://github.com/hkjels/t.git"},"licenses":[{"type":"MIT","url":"http://github.com/hkjels/t/master/LICENSE"}],"bin":{"t":"bin/todo"},"bugs":{"url":"http://github.com/hkjels/t/issues"},"main":"index","engines":{"node":">= 0.4.1 <= 0.7.0"},"dependencies":{"barricane-db":"latest","cli-table":"latest","colors":"latest","commander":"latest","express":"latest","jade":"latest","minimatch":"latest","moment":"latest","nib":"latest","stylus":"latest","underscore":"latest"},"devDependencies":{"dox":"latest","jshint":"latest","mocha":"latest","should":"latest"},"_npmUser":{"name":"hkjels","email":"hkjels@me.com"},"_id":"Todo@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e63078e48485605247bf4d84eda08553774c6381","tarball":"http://registry.npmjs.org/Todo/-/Todo-0.0.3.tgz"},"maintainers":[{"name":"hkjels","email":"hkjels@me.com"}]}},"readme":"# T\n\n__T is not yet fully ready for the public eye__, but it will be soon and it\nwill be worth the wait. Tune back in at the 1st of March and I believe you \nwill witness one piece refreshing software.","maintainers":[{"name":"hkjels","email":"hkjels@me.com"}],"time":{"modified":"2012-02-27T07:30:11.555Z","created":"2012-01-25T06:38:27.108Z","0.0.1":"2012-01-25T06:38:28.645Z","0.0.3":"2012-02-27T07:30:11.555Z"},"author":{"name":"Henrik Kjelsberg","email":"hkjels@me.com","url":"http://take.no/"},"repository":{"type":"git","url":"git://github.com/hkjels/t.git"},"_attachments":{"Todo-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-uQmIF/HXoXFkd+fFX7n6nw==","length":104348,"stub":true},"Todo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QlTuR2LMIft3kH4VVk05Sg==","length":11401,"stub":true}}}},
{"id":"Toji","key":"Toji","value":{"rev":"96-511e171ad9f32a9264c2cdf01accacfb"},"doc":{"_id":"Toji","_rev":"96-511e171ad9f32a9264c2cdf01accacfb","name":"Toji","dist-tags":{"latest":"0.0.36"},"versions":{"0.0.1":{"name":"Toji","version":"0.0.1","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"node-waf configure build"},"_id":"Toji@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.6","dist":{"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.1.tgz"}},"0.0.2":{"name":"Toji","version":"0.0.2","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"node-waf configure build"},"_id":"Toji@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.6","dist":{"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.2.tgz"}},"0.0.3":{"name":"Toji","version":"0.0.3","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"node-waf configure build"},"_id":"Toji@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.1","dist":{"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.3.tgz"}},"0.0.4":{"name":"Toji","version":"0.0.4","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"node-waf configure build"},"_id":"Toji@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.1","dist":{"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.4.tgz"}},"0.0.5":{"name":"Toji","version":"0.0.5","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"node-waf configure build"},"_id":"Toji@0.0.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.1","dist":{"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.5.tgz"}},"0.0.6":{"name":"Toji","version":"0.0.6","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"node-waf configure build"},"_id":"Toji@0.0.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.1","dist":{"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.6.tgz"}},"0.0.7":{"name":"Toji","version":"0.0.7","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.7","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","dist":{"shasum":"b0bced5852979e7101a7b3a91fa24f3912808c94","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.7.tgz"}},"0.0.8":{"name":"Toji","version":"0.0.8","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.8","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8de278004996899f214d11b6bfb1eeb6b949a8b8","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.8.tgz"}},"0.0.9":{"name":"Toji","version":"0.0.9","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.9","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7ab8b938cb438bc6002a497cb54fee7b12f0e685","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.9.tgz"}},"0.0.10":{"name":"Toji","version":"0.0.10","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.10","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9d0e933649c37cdfa10f7c96d5ac176c2da3bc2d","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.10.tgz"}},"0.0.11":{"name":"Toji","version":"0.0.11","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.11","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e0271daf3208dd40815b63df41751466bce78871","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.11.tgz"}},"0.0.12":{"name":"Toji","version":"0.0.12","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.12","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ca0a66281938395f115ed37cf2ffb9be407fc0ad","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.12.tgz"}},"0.0.13":{"name":"Toji","version":"0.0.13","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.13","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"91ab8dd0a35c8089608fb975145c5ae968bb1063","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.13.tgz"}},"0.0.14":{"name":"Toji","version":"0.0.14","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.14","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2b472607e720fd98f7340bb89cdbe01f5555ed41","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.14.tgz"}},"0.0.15":{"name":"Toji","version":"0.0.15","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.15","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6b6a2b90aaa2ab5e4ac4ca3ee6ca7a5f1a890064","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.15.tgz"}},"0.0.16":{"name":"Toji","version":"0.0.16","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.16","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b44a222980f161c3d2099da05fdf7c73be32451d","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.16.tgz"}},"0.0.18":{"name":"Toji","version":"0.0.18","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.18","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"10b52328ef2f69b1e6b811aab6af6340d314be3e","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.18.tgz"}},"0.0.19":{"name":"Toji","version":"0.0.19","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.19","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6f5a435fdfbff21ab14acdb5ec4a841adfe375a1","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.19.tgz"}},"0.0.20":{"name":"Toji","version":"0.0.20","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.20","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ce77dd20d6bb5354decdc613010b90c8121465f0","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.20.tgz"}},"0.0.21":{"name":"Toji","version":"0.0.21","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.21","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5daa55120672c7e2152a07ddd0be00375b35f6b2","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.21.tgz"}},"0.0.22":{"name":"Toji","version":"0.0.22","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.22","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ff5564ae99535c1a21d7e55070ffa1f3e15f8ffb","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.22.tgz"}},"0.0.23":{"name":"Toji","version":"0.0.23","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.23","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bc83d1386c386cb3e09e587248d85fcb30d9162d","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.23.tgz"}},"0.0.24":{"name":"Toji","version":"0.0.24","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.24","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a2e71b35999799c0c790f94dcd7a68b170fc247b","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.24.tgz"}},"0.0.25":{"name":"Toji","version":"0.0.25","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib","doc":"./doc"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.25","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"31fe387e125c67afd0b73565e0db25150dae027e","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.25.tgz"}},"0.0.26":{"name":"Toji","version":"0.0.26","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.26","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"183713652fcc0c36ead6e81f925d0c055aff323c","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"690fec3fd1d84384ec83c82d56f6effaefdc8542","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.26-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.26.tgz"}},"0.0.27":{"name":"Toji","version":"0.0.27","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.27","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"146a1490a3c62ee63b6c321953633fa8bec8c8b4","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"3f132939ed2521aa50eee0f9b408df054ece0008","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.27-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.27.tgz"}},"0.0.28":{"name":"Toji","version":"0.0.28","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.28","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"9ddbf5e4be3b67fd2b1e1d9316b852f960589858","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"ecd075dacbafa9067d4f27c4264677960703e128","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.28-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.28.tgz"}},"0.0.29":{"name":"Toji","version":"0.0.29","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.29","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"41b21d251b83f47c5728de08d8724de7da6b2c8b","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"71571847c578aea5052a0418525c91e04d661dd9","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.29-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.29.tgz"}},"0.0.30":{"name":"Toji","version":"0.0.30","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.30","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"ab097d5d1bb5c5d235b38dee3bad677d14fece37","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"d4644e34cbac9882741209f94b7f965ab3d7d58c","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.30-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.30.tgz"}},"0.0.31":{"name":"Toji","version":"0.0.31","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.31","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"5f5071f427a49c4ec5d3b93568e954eb777b4250","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"f3426fafa2144ffd116875c932e6296295213d81","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.31-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.31.tgz"}},"0.0.32":{"name":"Toji","version":"0.0.32","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.32","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"085506d0db0a42570a9633b6c66fd28e301c28bb","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"1fb43d3c0a4b7692ff53c9c20f23299f7d755ea1","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.32-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.32.tgz"}},"0.0.33":{"name":"Toji","version":"0.0.33","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.33","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"cc7624b2e8b0bc8b3dc9e97811c91238c55db987","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"c3e1c0568253b07a983ab3f24f9b810ca329a3e5","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.33-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.33.tgz"}},"0.0.34":{"name":"Toji","version":"0.0.34","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.34","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"85ec247d1785899d82de21980bc7cdb5d42f7c6a","bin":{"0.4-linux-2.6.37-ARCH":{"shasum":"d810378f67cbef2edf41aaf1dbfbe9813cfc1c8b","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.34-0.4-linux-2.6.37-ARCH.tgz"}},"tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.34.tgz"}},"0.0.35":{"name":"Toji","version":"0.0.35","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.35","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"3354b5dfcc8b1f4757c75b6001c3fcff6c7feb46","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.35.tgz","bin":{"0.4-linux-2.6.38-ARCH":{"shasum":"d1e98ddf429f9140d76668909a03756a2552b977","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.35-0.4-linux-2.6.38-ARCH.tgz"}}}},"0.0.36":{"name":"Toji","version":"0.0.36","description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.4.0 < 0.5.0"},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"Toji@0.0.36","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"a25bf488d71d8c4a2e6e219ecb6d68382962f416","tarball":"http://registry.npmjs.org/Toji/-/Toji-0.0.36.tgz"}}},"maintainers":[{"name":"weaver","email":"ben@orangesoda.net"}],"time":{"modified":"2011-04-25T20:56:09.847Z","created":"2011-02-23T19:11:21.644Z","0.0.1":"2011-02-23T19:11:21.786Z","0.0.2":"2011-02-24T15:56:19.583Z","0.0.3":"2011-02-24T23:30:42.447Z","0.0.4":"2011-03-04T17:48:28.908Z","0.0.5":"2011-03-04T23:03:45.184Z","0.0.6":"2011-03-08T22:53:30.303Z","0.0.7":"2011-03-09T21:22:11.207Z","0.0.8":"2011-03-11T22:22:40.583Z","0.0.9":"2011-03-15T21:38:36.485Z","0.0.10":"2011-03-16T14:29:36.106Z","0.0.11":"2011-03-17T19:57:54.746Z","0.0.12":"2011-03-17T23:41:11.205Z","0.0.13":"2011-03-17T23:45:41.751Z","0.0.14":"2011-03-18T00:01:05.372Z","0.0.15":"2011-03-21T15:43:48.406Z","0.0.16":"2011-03-21T20:05:05.212Z","0.0.18":"2011-03-23T19:43:57.310Z","0.0.19":"2011-03-23T21:25:59.843Z","0.0.20":"2011-03-24T15:56:08.949Z","0.0.21":"2011-03-24T16:46:48.777Z","0.0.22":"2011-03-24T22:31:27.778Z","0.0.23":"2011-03-25T14:04:56.037Z","0.0.24":"2011-03-25T22:28:31.228Z","0.0.25":"2011-03-30T21:01:20.986Z","0.0.26":"2011-03-31T20:57:59.178Z","0.0.27":"2011-04-01T22:08:57.749Z","0.0.28":"2011-04-05T19:23:16.406Z","0.0.29":"2011-04-06T04:54:32.127Z","0.0.30":"2011-04-06T16:40:30.786Z","0.0.31":"2011-04-07T01:44:45.988Z","0.0.32":"2011-04-07T03:49:19.399Z","0.0.33":"2011-04-07T18:34:08.733Z","0.0.34":"2011-04-07T19:26:52.410Z","0.0.35":"2011-04-25T17:00:29.762Z","0.0.36":"2011-04-25T20:04:46.879Z"},"author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"description":"Kyoto Cabinet bindings for Node.js with an Avro mapper.","_attachments":{"Toji-0.0.36.tgz":{"content_type":"application/octet-stream","revpos":96,"digest":"md5-LSBb6J5Bbar0y8uLOCoYhw==","length":51091,"stub":true},"Toji-0.0.35-0.4-linux-2.6.38-ARCH.tgz":{"content_type":"application/octet-stream","revpos":84,"digest":"md5-faAm/jg9Ev4Vthy1bftJZg==","length":4065578,"stub":true},"Toji-0.0.35.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-oG+a/wlxDJI3cri4xufZ6Q==","length":4065622,"stub":true},"Toji-0.0.34-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":80,"digest":"md5-ZARXby3gb0Prtwu7HKnkHA==","length":4065395,"stub":true},"Toji-0.0.34.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-MmErgivcgnFJyYtSRzJTig==","length":4065376,"stub":true},"Toji-0.0.33-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-o7h4vIMqtugCMgP2FTEYdg==","length":4065612,"stub":true},"Toji-0.0.33.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-pcN/s2b9nmhYLoODbQr+Lw==","length":4065447,"stub":true},"Toji-0.0.32-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-K4JLlM2eiilfdUSImUczgg==","length":4065195,"stub":true},"Toji-0.0.32.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-QvEeT6uPrf2jL68P9dBCUQ==","length":4065369,"stub":true},"Toji-0.0.31-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-r8y/UwjPRimPG4JUfrVXhg==","length":4065585,"stub":true},"Toji-0.0.31.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-hD6Unc5wz7wmFZJTXIco9A==","length":4066909,"stub":true},"Toji-0.0.30-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":68,"digest":"md5-y7tI1hJcc+doq7t5vl1Iqg==","length":4013601,"stub":true},"Toji-0.0.30.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-QhFSpvUlqzgFo/lri2aYlA==","length":4012461,"stub":true},"Toji-0.0.29-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-e1ofrTAgO8P88CoMOm89uQ==","length":4013423,"stub":true},"Toji-0.0.29.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-V0zzRpPQVU58uM+p4iUvYQ==","length":4012184,"stub":true},"Toji-0.0.28-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-d2E9SvD4GRQaboOBSn62tg==","length":3981853,"stub":true},"Toji-0.0.28.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-34o+u/SO1dnFM9K8ckko/w==","length":3980657,"stub":true},"Toji-0.0.27-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-Yu6a6JkFhZ4f3SU5UcBOXw==","length":3941881,"stub":true},"Toji-0.0.27.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-7WKHrVdhIc14Hf5kJzjHAg==","length":3940929,"stub":true},"Toji-0.0.26-0.4-linux-2.6.37-ARCH.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-eeXOp8up0ZmgNUltSyDRXw==","length":3940466,"stub":true},"Toji-0.0.26.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-54UL/MM5IV19giBMePCarA==","length":3940661,"stub":true},"Toji-0.0.25.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-ac1Jp0jXb1KS5Sbk0DeZHA==","length":40792,"stub":true},"Toji-0.0.24.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-OfxrHGcRetrOQ2u83oICsw==","length":38650,"stub":true},"Toji-0.0.23.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-9ViJHy8bxU4NoeW4ON1bBw==","length":37821,"stub":true},"Toji-0.0.22.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-ljPSolSjmCB6xgpBKh/0Iw==","length":37795,"stub":true},"Toji-0.0.21.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-bm1NxmIx1YO0x4nG+pRsJA==","length":36765,"stub":true},"Toji-0.0.20.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-z/utQ5iFd7iMz9O2ClYtRw==","length":36619,"stub":true},"Toji-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-v+J2Gj/Xx7rCgDCSCevlnQ==","length":36669,"stub":true},"Toji-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-6j8FsEm9v6JiWOvK+IK/Qw==","length":36142,"stub":true},"Toji-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-tSFC9RrOZxuQoQBiW46whA==","length":34132,"stub":true},"Toji-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-sQp1QNsPE/sjeHHQLs3uGQ==","length":32693,"stub":true},"Toji-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-WHldvFT6DRsMjGkACvxENg==","length":32061,"stub":true},"Toji-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-zvdGgf6bWMadI+rVRCErvw==","length":1962641,"stub":true},"Toji-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-PHELYcGzU4lnIxjTErtXtA==","length":1962641,"stub":true},"Toji-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Sjd1CcaDGnxCHLAFpDnPKg==","length":1961521,"stub":true},"Toji-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Qlr79TrIsBx5hc8rViIkPQ==","length":1958242,"stub":true},"Toji-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-YwxeG9RW6/EhOW/6yZdcmQ==","length":1957731,"stub":true},"Toji-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-3CheknlYCqJpEcCvH9SeMg==","length":1955922,"stub":true},"Toji-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-T/1gvE8cSytZqzzQixDxog==","length":1954991,"stub":true},"Toji-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-eN7M/9H1dSGHA8UNbUEq8w==","length":1925947,"stub":true},"Toji-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-nW+8NXNWKT3t7q3DCULY6g==","length":1925771,"stub":true},"Toji-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1PIldyaWAKrYIgfalKG52w==","length":1925655,"stub":true},"Toji-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EwV8PCusRxkYRdzJxbbzyQ==","length":1910778,"stub":true},"Toji-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4LkfziUKikiUdt0YBNSZIw==","length":1910372,"stub":true},"Toji-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-M5Xhjj1BvPAwte0AVHLKiQ==","length":1908357,"stub":true}}}},
{"id":"Travis","key":"Travis","value":{"rev":"7-13fe98ed5eea897868014b9879b126ac"},"doc":{"_id":"Travis","_rev":"7-13fe98ed5eea897868014b9879b126ac","name":"Travis","description":"Recursively traverses a directory, exposing the structure through events.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"author":{"name":"Peter Lejeck","email":"plejeck@artuous.com"},"name":"Travis","description":"Recursively traverses a directory, exposing the structure through events.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/nuckchorris/travis.git"},"main":"index.js","scripts":{"test":"mocha"},"engines":{"node":"0.4.x||0.6.x"},"dependencies":{},"devDependencies":{"should":"~0.5.1","mocha":"~0.12.1"},"optionalDependencies":{},"homepage":"https://github.com/nuckchorris/travis/","_npmUser":{"name":"nuck","email":"plejeck@artuous.com"},"_id":"Travis@0.1.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"607dce6a6c816c1c6f831aa59309f0dd3167ba3c","tarball":"http://registry.npmjs.org/Travis/-/Travis-0.1.0.tgz"},"readme":"","maintainers":[{"name":"nuck","email":"plejeck@artuous.com"}]},"0.1.1":{"author":{"name":"Peter Lejeck","email":"plejeck@artuous.com"},"name":"Travis","description":"Recursively traverses a directory, exposing the structure through events.","version":"0.1.1","repository":{"type":"git","url":"git://github.com/nuckchorris/travis.git"},"main":"index.js","scripts":{"test":"mocha"},"engines":{"node":"0.4.x || 0.6.x"},"dependencies":{},"devDependencies":{"should":"~0.5.1","mocha":"~0.12.1"},"optionalDependencies":{},"_npmUser":{"name":"nuck","email":"plejeck@artuous.com"},"_id":"Travis@0.1.1","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bec5ff6b18d857827dd209c6267c27da965d6539","tarball":"http://registry.npmjs.org/Travis/-/Travis-0.1.1.tgz"},"readme":"","maintainers":[{"name":"nuck","email":"plejeck@artuous.com"}]},"0.1.2":{"author":{"name":"Peter Lejeck","email":"plejeck@artuous.com"},"name":"Travis","description":"Recursively traverses a directory, exposing the structure through events.","version":"0.1.2","repository":{"type":"git","url":"git://github.com/nuckchorris/travis.git"},"main":"index.js","scripts":{"test":"mocha"},"engines":{"node":"0.4.x || 0.6.x"},"dependencies":{},"devDependencies":{"should":"~0.5.1","mocha":"~0.12.1"},"optionalDependencies":{},"_npmUser":{"name":"nuck","email":"plejeck@artuous.com"},"_id":"Travis@0.1.2","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"32cbf9a9429aa6dfa2df48e6f8271eae10843416","tarball":"http://registry.npmjs.org/Travis/-/Travis-0.1.2.tgz"},"readme":"# Travis\nA recursive directory traverser that aims to make handling complex folder structures extremely easy.\n\n## Install\n\t$ npm install Travis\n\n## Test\nThe tests are written using [Mocha](https://github.com/visionmedia/mocha) and [Should](https://github.com/visionmedia/should.js), and can be run with `npm test`.\n\n## Use\nUsage is quite simple.  All you have to do is `new Travis(path)`, listen for various events on it, and `travis.scan()`.\n\n*Please note that this **does not** ignore files like `.DS_Store`, `thumbs.db`, or any other system/dot/hidden files.  If you don't want them, ignore them yourself, you lazy bum.*\n### Example\n```javascript\nvar Travis = require('Travis');\n\nvar travis = new Travis('./folder/');\n\ntravis.on('directory', function (path, dir) {\n\tconsole.log('Directory!', path, dir);\n});\n\ntravis.on('file', function (dir, name) {\n\tconsole.log('File!', dir, name);\n});\n\ntravis.on('end', function () {\n\tconsole.log('DONE!');\n});\ntravis.scan();\n```\n\n## Events\n### directory\nEmitted for each directory the traverser finds.\n\nRecieves the path of the containing directory and the name of this directory.\n\n### file\nEmitted for each file the traverser finds.\n\nRecieves the path of the containing directory and the name of the file.\n\n### end\nEmitted when the entire structure has been traversed.\n\n### error\nEmitted when something breaks.\n\nRecieves the error.\n\n## Issues?\nIf this isn't your issue, file a bug report.  If you're not lazy, file a pull request too.\n\nYou can also find me on Freenode IRC as Nuck, just ping me in #Node.js and I'll try to help you out.","maintainers":[{"name":"nuck","email":"plejeck@artuous.com"}]}},"readme":"","maintainers":[{"name":"nuck","email":"plejeck@artuous.com"}],"time":{"modified":"2012-02-23T10:41:25.938Z","created":"2012-02-23T10:12:36.614Z","0.1.0":"2012-02-23T10:15:04.182Z","0.1.1":"2012-02-23T10:25:13.426Z","0.1.2":"2012-02-23T10:41:25.938Z"},"author":{"name":"Peter Lejeck","email":"plejeck@artuous.com"},"repository":{"type":"git","url":"git://github.com/nuckchorris/travis.git"},"_attachments":{"Travis-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Wzyntpld/3otQMaEASSLlQ==","length":3103,"stub":true},"Travis-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GdZvFhq5mC8kjeHWcYUOtg==","length":2371,"stub":true},"Travis-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VXYOsibwERFMNX4THZPP3Q==","length":2390,"stub":true}}}},
{"id":"Tuio.js","key":"Tuio.js","value":{"rev":"3-cdd27ff9ffeb6e9368002acc80c8b066"},"doc":{"_id":"Tuio.js","_rev":"3-cdd27ff9ffeb6e9368002acc80c8b066","name":"Tuio.js","description":"Tuio.js is a JavaScript implementation of the TUIO library for multitouch and tangible interaction in the web browser.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"Tuio.js","description":"Tuio.js is a JavaScript implementation of the TUIO library for multitouch and tangible interaction in the web browser.","version":"1.0.0","homepage":"http://fe9lix.github.com/Tuio.js/","author":{"name":"Felix Raab","email":"fe9lix@googlemail.com"},"repository":{"type":"git","url":"git://github.com/felix/Tuio.js.git"},"bugs":{"url":"https://github.com/fe9lix/Tuio.js/issues"},"licenses":[{"type":"GPL","url":"http://fe9lix.github.com/Tuio.js//blob/master/LICENSE-GPL"}],"engines":{"node":"~0.6.13"},"dependencies":{"socket.io":"0.9.6","jspack":"0.0.1"},"devDependencies":{"express":"2.5.9","grunt":"~0.3.9"},"keywords":["tuio","osc","touch","multitouch","tangible"],"main":"index","_npmUser":{"name":"fe9lix","email":"fe9lix@googlemail.com"},"_id":"Tuio.js@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a4771fd46bb8ae3b17d354a72c867c4c974bfdd7","tarball":"http://registry.npmjs.org/Tuio.js/-/Tuio.js-1.0.0.tgz"},"readme":"","maintainers":[{"name":"fe9lix","email":"fe9lix@googlemail.com"}]}},"readme":"","maintainers":[{"name":"fe9lix","email":"fe9lix@googlemail.com"}],"time":{"modified":"2012-05-30T14:29:46.513Z","created":"2012-05-30T14:29:44.567Z","1.0.0":"2012-05-30T14:29:46.513Z"},"author":{"name":"Felix Raab","email":"fe9lix@googlemail.com"},"repository":{"type":"git","url":"git://github.com/felix/Tuio.js.git"},"_attachments":{"Tuio.js-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7k2m9WFQ6/nxiOf1H7k02Q==","length":1766,"stub":true}}}},
{"id":"TwigJS","key":"TwigJS","value":{"rev":"3-1aaefc6d6895d7d4824174d410a747b9"},"doc":{"_id":"TwigJS","_rev":"3-1aaefc6d6895d7d4824174d410a747b9","name":"TwigJS","description":"A port of PHP template engine (www.twig-project.org) to Javascript","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"author":{"name":"Fadrizul H.","email":"fadrizul@gmail.com","url":"github.com/fadrizul"},"name":"TwigJS","description":"A port of PHP template engine (www.twig-project.org) to Javascript","version":"0.0.2","homepage":"twigjs.org","repository":{"type":"git","url":"git://github.com/fadrizul/twigjs.git"},"main":"index.js","engines":{"node":"~v0.4.11"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/fadrizulhasani/.npm/TwigJS/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"TwigJS@0.0.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"afe366bc08f4c4f2df5d0831f8f14ee743186e4b","tarball":"http://registry.npmjs.org/TwigJS/-/TwigJS-0.0.2.tgz"},"maintainers":[{"name":"fadrizul","email":"fadrizul@gmail.com"}]}},"maintainers":[{"name":"fadrizul","email":"fadrizul@gmail.com"}],"time":{"modified":"2011-09-18T12:49:40.677Z","created":"2011-09-18T12:49:15.000Z","0.0.2":"2011-09-18T12:49:40.677Z"},"author":{"name":"Fadrizul H.","email":"fadrizul@gmail.com","url":"github.com/fadrizul"},"repository":{"type":"git","url":"git://github.com/fadrizul/twigjs.git"},"_attachments":{"TwigJS-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JwdNDdzEqvRrPxWOsc0H7g==","length":77049,"stub":true}}}},
{"id":"TypeCast","key":"TypeCast","value":{"rev":"17-33cf649763f3f89fe13885e28714e74b"},"doc":{"_id":"TypeCast","_rev":"17-33cf649763f3f89fe13885e28714e74b","name":"TypeCast","description":"more intuitive type cast functions for JavaScript","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.1","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.8"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.1","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"effe88428d38df438cefa82b74c90dd79648dfce","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.1.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.2":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.2","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.8"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.2","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"12f003fe4bde8c07d75be93b55528be50dddf07e","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.2.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.3":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.3","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.8"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.3","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"9caed55171378af99a9968caaf77f68154182ae8","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.3.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.4":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.4","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.8"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.4","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"e4d6fc4b2d8cc29975c77fabfd4d1020d7ddea42","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.4.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.5":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.5","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.8"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.5","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"171b24fd2f9eac09ec9582d6329b0949330540bf","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.5.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.6":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.6","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.8"},"dependencies":{},"devDependencies":{"expresso":">= 0.9.2"},"keywords":["cast","type"],"scripts":{"text":"expresso"},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.6","_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"25e36a5029893f9382d43d5121c3481386e213d6","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.6.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.9":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.0.9","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":"~0.5.4"},"dependencies":{},"devDependencies":{"expresso":">= 0.9.2"},"keywords":["cast","type"],"scripts":{"text":"expresso"},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.0.9","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c1422ab4895112fbf320998a07ef7168095951d1","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.0.9.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.1.0":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"name":"TypeCast","description":"more intuitive type cast functions for JavaScript","version":"0.1.0","homepage":"https://github.com/beatak/TypeCast/","repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"main":"lib/typecast.js","engines":{"node":">= 0.5.4"},"dependencies":{},"devDependencies":{"expresso":">= 0.9.2"},"keywords":["cast","type"],"scripts":{"text":"expresso"},"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"TypeCast@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f32b46ea281e8442b59b5bf29fd456dee731c9fe","tarball":"http://registry.npmjs.org/TypeCast/-/TypeCast-0.1.0.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]}},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}],"time":{"modified":"2011-12-08T00:51:55.159Z","created":"2011-10-29T20:45:05.628Z","0.0.1":"2011-10-29T20:45:06.134Z","0.0.2":"2011-10-29T20:49:05.394Z","0.0.3":"2011-10-29T20:52:47.198Z","0.0.4":"2011-10-29T21:00:17.088Z","0.0.5":"2011-10-29T21:01:42.632Z","0.0.6":"2011-10-31T14:57:55.680Z","0.0.9":"2011-12-08T00:39:35.220Z","0.1.0":"2011-12-08T00:51:55.159Z"},"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"http://beatak.github.com/"},"repository":{"type":"git","url":"git://github.com/beatak/TypeCast.git"},"_attachments":{"TypeCast-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-G/B1j3nbU6MoIa15dcQdKA==","length":10240,"stub":true},"TypeCast-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-iqjK9MeoDyXiWYiIk65YQw==","length":10240,"stub":true},"TypeCast-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-V6zYD1MEMDbuXRVNaDXvow==","length":10240,"stub":true},"TypeCast-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dhCXRoApi41iV3T4TKFiAw==","length":10240,"stub":true},"TypeCast-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-0jYg70Vk5bQfFBkfJHeQ0Q==","length":10240,"stub":true},"TypeCast-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-xUnODaUceTYweWYBYGximQ==","length":10240,"stub":true},"TypeCast-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+bRP7eJ/xozWPSJh9oCSQA==","length":10240,"stub":true},"TypeCast-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-X0V2e4tRmO2NThW5SswePw==","length":10240,"stub":true}}}},
{"id":"TypedFunc","key":"TypedFunc","value":{"rev":"15-794f0af1d619c3b1b94687495572bfd5"},"doc":{"_id":"TypedFunc","_rev":"15-794f0af1d619c3b1b94687495572bfd5","name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","dist-tags":{"latest":"0.0.5-2"},"versions":{"0.0.2":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.2","homepage":"github.com/christopherdebeer/typedfunc","repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.2","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"2a5ec2b31471e233cc2580cf860623130f82047f","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.2.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]},"0.0.3":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.3","homepage":"github.com/christopherdebeer/typedfunc","repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.3","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f39d6d9889a521a5f8ecfc96b8249ae9040b840c","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.3.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]},"0.0.3-1":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.3-1","homepage":"http://github.com/christopherdebeer/TypedFunc","repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.3-1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"7aa89fcb1ed90cf46d586c5a63bd55a6a7421bda","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.3-1.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]},"0.0.4":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.4","homepage":"http://github.com/christopherdebeer/TypedFunc","contributors":[{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com"},{"name":"Aleksey V. Zapparov"}],"repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.4","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"24dcb590beafb283a7dcb0c1151f60fc04b5752c","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.4.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]},"0.0.5":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.5","homepage":"http://github.com/christopherdebeer/TypedFunc","contributors":[{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com"},{"name":"Aleksey V. Zapparov","email":"ixti@member.fsf.org"}],"repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.5","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"efbd16828d63e6a9f2e7ed63f1b9433a88dc80ab","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.5.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]},"0.0.5-1":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.5-1","homepage":"http://github.com/christopherdebeer/TypedFunc","contributors":[{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com"},{"name":"Aleksey V. Zapparov","email":"ixti@member.fsf.org"}],"repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.5-1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"63de471514c463c5793b5a7cd5d0c366c100d170","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.5-1.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]},"0.0.5-2":{"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"name":"TypedFunc","description":"Allows creating Typed functions in Javascript with Typed arguments and default argument values. All optional.","version":"0.0.5-2","homepage":"http://github.com/christopherdebeer/TypedFunc","contributors":[{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com"},{"name":"Aleksey V. Zapparov","email":"ixti@member.fsf.org"}],"repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"main":"TypedFunc.js","scripts":{"test":"node tests/test.TypedFunc.js"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"},"_id":"TypedFunc@0.0.5-2","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"1bb2140ff23f15ea1ac62edcd0af7424faca8d5f","tarball":"http://registry.npmjs.org/TypedFunc/-/TypedFunc-0.0.5-2.tgz"},"maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}]}},"readme":"TypedFunc\r\n=========\r\n\r\nAllows creating Typed Functions in Javascript with Typed Arguments and default argument values. All Optional.\r\n\r\n[![Build Status](https://secure.travis-ci.org/christopherdebeer/TypedFunc.png)](http://travis-ci.org/christopherdebeer/TypedFunc)\r\n\r\nConvensions\r\n===========\r\n\r\nThis library is split in two, basically divided by convension, so whether you hate callbacks ([Classical convension](#classical)), or love to Node ([Node callback convension](#node)). This library caters for your taste. Its core features are applied splightly differently for each convention (as appropriate). But Both conventions will allow you to declare Types for your arguments, as well as default values if arguments are `undefined` .\r\n\r\n* **Classical Convension** - Will throw errors when invalid argument types are passed, or if a function returns an invalid type.\r\n\t\r\n\t[Typed Arguments](#1a-typed-arguments)\r\n\t\r\n\t[Typed Functions](#1b-typed-functions)\r\n\t\r\n\t[Argument Defaults](#1c-argument-defaults)\r\n\r\n* **Node Callback Convension** - Will pass the relivant error as the first parameter of your callback, if an argument type is invalid, or if values passed to your callback are of an invalid type.\r\n\t\r\n\t[Typed Arguments](#2a-typed-arguments)\r\n\t\r\n\t[Typed Functions](#2b-typed-functions)\r\n\t\r\n\t[Argument Defaults](#2c-argument-defaults)\r\n\r\n\r\nSetup\r\n======\r\n\r\nYou need to specify your preference of convension before using `new TypedFunc()` by doing the following:\r\n\r\n\tTypedFunc({\r\n\t\terrors: \"Throw\", // either \"Throw\" or \"Node\"\r\n\t\ttrace: false // optional includes line limbers for debugging.\r\n\t})\r\n\r\n\r\nThe Classical Convention\r\n========================\r\n\r\n#1a Typed Arguments\r\n\r\nYou can define any types you like for your arguments: `{x: {type: \"xxxx\"}}`, a string (ie: \"number\", \"object\", \"string\") denotes a `typeof x === xxxx` check, and an Object - such as a `new Person()` can be defined as `{x: {type: Person}}` and will perform an `x instanceof Person` check.\r\n\t\r\n\t// Create TypedFunc\r\n\tvar classical = new TypedFunc({x: {type: \"string\"}}, function(x){\r\n\t\treturn x\r\n\t})\r\n\r\n\t// Call TypedFuncs\r\n\r\n\tclassical()\r\n\t// throws error invalid argument type\r\n\r\n\tclassical(23)\r\n\t// throws error invalid argument type\r\n\r\n\tclassical(\"Hello World\")\r\n\t// returns \"Hello World\"\r\n\r\nIf you'd like to be less strict, you could also specify Multiple types for an argument, by putting them in an array, like so:\r\n\t\r\n\tvar classical = new TypedFunc({x: {type: [\"string\", \"number\"]}}, function(x){\r\n\t\treturn x\r\n\t})\r\n\r\n\t// now it will accept either a \"string\" or an \"number\". neat!\r\n\r\n\r\n#1b Typed Functions\r\n\r\nYou can define a function as a sprecific Type. This performs a check that your function returns the required type otherwise it will throw an error.\r\n\r\n\t// Create TypedFunc\r\n\tvar classical = new TypedFunc(\"string\", {}, function(x){\r\n\t\treturn x\r\n\t})\r\n\r\n\t// Call TypedFuncs\r\n\r\n\tclassical()\r\n\t// throws error invalid function return type\r\n\r\n\tclassical(23)\r\n\t// throws error invalid function return type\r\n\r\n\tclassical(\"Hello World\")\r\n\t// returns \"Hello World\"\r\n\r\nAgain, you can specify Multiple Types for the return value, by providing an array, like so:\r\n\r\n\tvar classical = new TypedFunc([\"string\", \"number\"], {}, function(x){\r\n\t\treturn x\r\n\t})\r\n\r\n\t// now it will return either a \"string\" or an \"number\". and if not, will throw an error.\r\n\r\n#1c Argument Defaults\r\n\r\nArgument defaults act the same in both convensions, and mearly check for `undefined` arguments and if found replace with provided defaults.\r\n\t\r\n\t// Create TypedFunc\r\n\tvar classical = new TypedFunc({a {default: \"A\"}}, function(a){\r\n\t\treturn a\r\n\t})\r\n\r\n\t// Call TypedFunc\r\n\tclassical()\r\n\t// returns \"A\"\r\n\r\nThe Node Callback Convension\r\n============================\r\n\r\nThe Style, follows the `function(err, data) {}` convension from NodeJS. where errors are passed to the function itself instead of being Thrown.\r\n\r\n#2a Typed Arguments\r\n\r\nYou can define any types you like for your arguments: `{x: {type: \"xxxx\"}}`, a string (ie: \"number\", \"object\", \"string\") denotes a `typeof x === xxxx` check, and an Object - such as a `new Person()` can be defined as `{x: {type: Person}}` and will perform an `x instanceof Person` check.\r\n\t\r\n\t// Create TypedFunc\r\n\tvar nodeJSConv = new TypedFunc({a: {type: \"string\"}}, function(a, callback){\r\n\t\tcallback(null, \"success : \" + a)\r\n\t})\r\n\r\n\t// Call TypedFuncs\r\n\r\n\tnodeJSConv(23 ,function(err, data){\r\n\t\tif (err) console.log(\"Error: \", err)\r\n\t\telse console.log(\"Success: \", data)\r\n\t});\r\n\t// outputs Error: invalid argument type\r\n\r\n\tnodeJSConv(\"Hello World\", function(err, data){\r\n\t\tif (err) console.log(\"Error: \", err)\r\n\t\telse console.log(\"Success: \", data)\r\n\t});\r\n\t// outputs Success: Hello World\r\n\r\nYou can also specify Multiple argument types by providing them as an array, like so:\r\n\r\n\t// Create TypedFunc\r\n\tvar nodeJSConv = new TypedFunc({a: {type: [\"string\", Person]}}, function(a, callback){\r\n\t\tcallback(null, a)\r\n\t})\r\n\r\n\t// Call TypedFuncs\r\n\r\n\tvar x = new Person(\"Dave\");\r\n\r\n\tnodeJSConv(x ,function(err, data){\r\n\t\tif (err) console.log(\"Error: \", err)\r\n\t\telse console.log(\"Success: \", data)\r\n\t});\r\n\r\n\t// this will output Success: [Object Person] ie: would work for both `numbers` and `Persons` and pass a non null error for all other argument types.\r\n\r\n\r\n#2b Typed Functions\r\n\r\nApplying the Typed Function return concept to Callback style functions is rather tricky, but TypedFunc achieves this by replacing your callback with an interceptor and evaluating the arguments passed to it. So as can be seen below if the value passed to `callback` is not of the type `number` then a non null error will be passed to the callback.\r\n\t\r\n\t// Create TypedFunc\r\n\tvar nodeJSConv(\"number\", function(a, callback) {\r\n\t\tcallback(null, \"Success: \" + a)\r\n\t})\r\n\r\n\t// Call TypedFunc\r\n\tnodeJSConv(\"Test\", function(err, data) {\r\n\t\tif (err) console.log(\"Error: \", err)\r\n\t\telse console.log(\"Success: \", data)\r\n\t})  \r\n\t// outputs Error: Invalid function return type\r\n\r\n#2c Argument Defaults\r\n\r\nArgument defaults act the same in both convensions, and mearly check for `undefined` arguments and if found replace with provided defaults.\r\n\r\n\t// Create TypedFunc\r\n\tvar nodeJSConv({a: {default: \"B\"}}, function(a, callback) {\r\n\t\tcallback(null, \"Success: \" + a)\r\n\t})\r\n\r\n\t// Call TypedFunc\r\n\tnodeJSConv(\"Test\", function(err, data) {\r\n\t\tif (err) console.log(\"Error: \", err)\r\n\t\telse console.log(\"Success: \", data)\r\n\t})  \r\n\t// ouputs Success: B\r\n\r\n\r\n\r\n\r\nMIT Licenced\r\n\r\nby Christopher de Beer 2012\r\n\r\n[@christopherdb](http://twitter.com/christopherdb)\r\n\r\n","maintainers":[{"name":"christopherdebeer","email":"christopherdebeer@gmail.com"}],"time":{"modified":"2012-05-22T09:26:02.530Z","created":"2012-05-20T20:54:52.871Z","0.0.2":"2012-05-20T20:54:55.609Z","0.0.3":"2012-05-20T21:01:13.432Z","0.0.3-1":"2012-05-20T21:03:57.534Z","0.0.4":"2012-05-21T10:25:53.039Z","0.0.5":"2012-05-21T15:40:59.971Z","0.0.5-1":"2012-05-21T16:25:33.177Z","0.0.5-2":"2012-05-22T09:26:02.530Z"},"author":{"name":"Christopher de Beer","email":"christopherdebeer@gmail.com","url":"http://twitter.com/christopherdb"},"repository":{"type":"git","url":"git://github.com/christopherdebeer/TypedFunc.git"},"_attachments":{"TypedFunc-0.0.5-2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-KMC9DwrhJey+ANQY/nlFyg==","length":17998,"stub":true},"TypedFunc-0.0.5-1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-127uv6gXRhr66Q87gFqd9g==","length":17736,"stub":true},"TypedFunc-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-N8mdDFb6caibjMoYJMbfsA==","length":17673,"stub":true},"TypedFunc-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YdT2ae9ADROJ2KM4vwW0kg==","length":16493,"stub":true},"TypedFunc-0.0.3-1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-msgDR7evK6YIflI+TxXoHw==","length":16373,"stub":true},"TypedFunc-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kCh/R/ccahemiz6G/G1O0A==","length":16377,"stub":true},"TypedFunc-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-e16SMa/s8qATSxyPamZQSA==","length":16250,"stub":true}}}},
{"id":"URIjs","key":"URIjs","value":{"rev":"11-fce929a06ca264a0073ec7c09361cbd0"},"doc":{"_id":"URIjs","_rev":"11-fce929a06ca264a0073ec7c09361cbd0","name":"URIjs","description":"URI.js is a Javascript library for working with URLs.","dist-tags":{"latest":"1.7.1"},"versions":{"1.4.2":{"name":"URIjs","version":"1.4.2","title":"URI.js - Mutating URLs","author":{"name":"Rodney Rehm","url":"http://rodneyrehm.de"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license"},{"type":"GPL","url":"http://opensource.org/licenses/GPL-3.0"}],"description":"URI.js is a Javascript library for working with URLs.","keywords":["uri","url","uri mutation","url mutation","unified resource locator","unified resource identifier","query string"],"main":"./src/URI","homepage":"http://medialize.github.com/URI.js/","contributors":[{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"}],"files":["src/URI.js","src/IPv6.js","src/punycode.js"],"_npmUser":{"name":"fgribreau","email":"npm@fgribreau.com"},"_id":"URIjs@1.4.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f5eb3cfe36733164a7cef9c0e70597dc804d558a","tarball":"http://registry.npmjs.org/URIjs/-/URIjs-1.4.2.tgz"},"readme":"","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]},"1.6.3":{"name":"URIjs","version":"1.6.3","title":"URI.js - Mutating URLs","author":{"name":"Rodney Rehm","url":"http://rodneyrehm.de"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license"},{"type":"GPL","url":"http://opensource.org/licenses/GPL-3.0"}],"description":"URI.js is a Javascript library for working with URLs.","keywords":["uri","url","uri mutation","url mutation","unified resource locator","unified resource identifier","query string"],"main":"./src/URI","homepage":"http://medialize.github.com/URI.js/","contributors":[{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"}],"files":["src/URI.js","src/IPv6.js","src/SecondLevelDomains.js","src/punycode.js"],"_id":"URIjs@1.6.3","dist":{"shasum":"18db72d8696652a410ff9b911d0c92927f49c3e6","tarball":"http://registry.npmjs.org/URIjs/-/URIjs-1.6.3.tgz"},"readme":"","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]},"1.7.0":{"name":"URIjs","version":"1.7.0","title":"URI.js - Mutating URLs","author":{"name":"Rodney Rehm","url":"http://rodneyrehm.de"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license"},{"type":"GPL","url":"http://opensource.org/licenses/GPL-3.0"}],"description":"URI.js is a Javascript library for working with URLs.","keywords":["uri","url","uri mutation","url mutation","unified resource locator","unified resource identifier","query string","RFC 3986","RFC3986","RFC 6570","RFC6570"],"main":"./src/URI","homepage":"http://medialize.github.com/URI.js/","contributors":[{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"}],"files":["src/URI.js","src/IPv6.js","src/SecondLevelDomains.js","src/punycode.js","src/URITemplate.js"],"_id":"URIjs@1.7.0","dist":{"shasum":"154936c274d198ee4ac05eb8cfd2cfcb01bed7e5","tarball":"http://registry.npmjs.org/URIjs/-/URIjs-1.7.0.tgz"},"readme":"","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"},{"name":"rodneyrehm","email":"rodney.rehm@medialize.de"}]},"1.7.1":{"name":"URIjs","version":"1.7.1","title":"URI.js - Mutating URLs","author":{"name":"Rodney Rehm","url":"http://rodneyrehm.de"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license"},{"type":"GPL","url":"http://opensource.org/licenses/GPL-3.0"}],"description":"URI.js is a Javascript library for working with URLs.","keywords":["uri","url","uri mutation","url mutation","uri manipulation","url manipulation","uri template","url template","unified resource locator","unified resource identifier","query string","RFC 3986","RFC3986","RFC 6570","RFC6570"],"main":"./src/URI","homepage":"http://medialize.github.com/URI.js/","contributors":[{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"}],"files":["src/URI.js","src/IPv6.js","src/SecondLevelDomains.js","src/punycode.js","src/URITemplate.js"],"_id":"URIjs@1.7.1","dist":{"shasum":"01e86202de21af7b45ed2ba2a79d0007742a317d","tarball":"http://registry.npmjs.org/URIjs/-/URIjs-1.7.1.tgz"},"readme":"","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"},{"name":"rodneyrehm","email":"rodney.rehm@medialize.de"}]}},"readme":"","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"},{"name":"rodneyrehm","email":"rodney.rehm@medialize.de"}],"time":{"modified":"2012-08-14T15:18:03.458Z","created":"2012-01-25T21:27:22.871Z","1.4.2":"2012-01-25T21:27:24.309Z","1.6.3":"2012-07-10T20:02:03.436Z","1.7.0":"2012-08-12T09:52:18.498Z","1.7.1":"2012-08-14T15:18:03.458Z"},"author":{"name":"Rodney Rehm","url":"http://rodneyrehm.de"},"users":{"Abromeit":true},"_attachments":{"URIjs-1.7.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-2TSrGi5twifFW2rq+KLMfA==","length":23132,"stub":true},"URIjs-1.7.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-L8cM+1txazE1mWg+O3ElWQ==","length":23050,"stub":true},"URIjs-1.6.3.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-nb6SwKB5dq9jl3zEwHL29g==","length":18652,"stub":true},"URIjs-1.4.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-p+MkRawcQYszPEnj7xAgrg==","length":14720,"stub":true}}}},
{"id":"URLON","key":"URLON","value":{"rev":"5-21a4c010884592d61a3da457794fe8e9"},"doc":{"_id":"URLON","_rev":"5-21a4c010884592d61a3da457794fe8e9","name":"URLON","description":"URL Object Notation. JSON-like encoding for URLs","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"URLON","version":"1.0.0","description":"URL Object Notation. JSON-like encoding for URLs","keywords":["urlon","json","notation","url"],"homepage":"http://blog.vjeux.com/2011/javascript/urlon-url-object-notation.html","author":{"name":"Vjeux","email":"vjeuxx@gmail.com","url":"http://blog.vjeux.com/"},"files":["urlon.js","package.json"],"main":"urlon.js","repository":{"type":"git","url":"git://github.com/vjeux/URLON.git"},"_id":"URLON@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"877fd0686f66570bc006bf518e0ccf384a0af042","tarball":"http://registry.npmjs.org/URLON/-/URLON-1.0.0.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]},"1.0.1":{"name":"URLON","version":"1.0.1","description":"URL Object Notation. JSON-like encoding for URLs","keywords":["urlon","json","notation","url"],"homepage":"http://blog.vjeux.com/2011/javascript/urlon-url-object-notation.html","author":{"name":"Vjeux","email":"vjeuxx@gmail.com","url":"http://blog.vjeux.com/"},"files":["src/urlon.js","package.json"],"main":"src/urlon.js","repository":{"type":"git","url":"git://github.com/vjeux/URLON.git"},"_id":"URLON@1.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"839c1342deccb5711a6a085756dd427413f18ade","tarball":"http://registry.npmjs.org/URLON/-/URLON-1.0.1.tgz"},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}]}},"maintainers":[{"name":"vjeux","email":"vjeuxx@gmail.com"}],"time":{"modified":"2011-10-02T16:22:25.458Z","created":"2011-09-24T13:18:18.547Z","1.0.0":"2011-09-24T13:18:18.847Z","1.0.1":"2011-10-02T16:22:25.458Z"},"author":{"name":"Vjeux","email":"vjeuxx@gmail.com","url":"http://blog.vjeux.com/"},"repository":{"type":"git","url":"git://github.com/vjeux/URLON.git"},"_attachments":{"URLON-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mFshpFyFCH3J55PEB8QIYA==","length":1195,"stub":true},"URLON-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SjrdQSTa/GLAaShgPp3WtQ==","length":1163,"stub":true}}}},
{"id":"UkGeoTool","key":"UkGeoTool","value":{"rev":"5-e84291128e12f66cebb972a60c1d710f"},"doc":{"_id":"UkGeoTool","_rev":"5-e84291128e12f66cebb972a60c1d710f","name":"UkGeoTool","description":"Simple package which provides methods to convert between lat/long and easting/northings","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"UkGeoTool","version":"0.1.0","description":"Simple package which provides methods to convert between lat/long and easting/northings","author":{"name":"David Bamber","email":"dbamber@gmail.com"},"keywords":["package","example"],"maintainers":[{"name":"dbamber","email":"dbmber@gmail.com"}],"contributors":[{"name":"David bamber","email":"dbamber@gmail.com","url":"http://bmbr.co"}],"bugs":{"email":"dbamber@mail.com"},"licenses":[{"type":"GPLv2"}],"repositories":[{"type":"git","url":"https://dbamber@github.com/dbamber/UkGeoTool.git"}],"dependencies":{},"_npmJsonOpts":{"file":"/home/dbamber/.npm/UkGeoTool/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"UkGeoTool@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"28a864a66c7125b1f668efe807227aff19a152d1","tarball":"http://registry.npmjs.org/UkGeoTool/-/UkGeoTool-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"UkGeoTool","version":"0.1.1","description":"Simple package which provides methods to convert between lat/long and easting/northings","author":{"name":"David Bamber","email":"dbamber@gmail.com"},"keywords":["package","example"],"main":"./UkGeoTool.js","maintainers":[{"name":"dbamber","email":"dbmber@gmail.com"}],"contributors":[{"name":"David bamber","email":"dbamber@gmail.com","url":"http://bmbr.co"}],"bugs":{"email":"dbamber@mail.com"},"licenses":[{"type":"GPLv2"}],"repositories":[{"type":"git","url":"https://dbamber@github.com/dbamber/UkGeoTool.git"}],"dependencies":{},"_npmJsonOpts":{"file":"/home/dbamber/.npm/UkGeoTool/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"UkGeoTool@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d97c3be15004883322eccb01dfca671a3445405f","tarball":"http://registry.npmjs.org/UkGeoTool/-/UkGeoTool-0.1.1.tgz"},"scripts":{}}},"maintainers":[{"name":"dbamber","email":"dbmber@gmail.com"}],"time":{"modified":"2011-08-11T18:59:21.398Z","created":"2011-08-11T18:54:04.712Z","0.1.0":"2011-08-11T18:54:05.171Z","0.1.1":"2011-08-11T18:59:21.398Z"},"author":{"name":"David Bamber","email":"dbamber@gmail.com"},"_attachments":{"UkGeoTool-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZpDz9EOIL/F2uZYXHYyIgw==","length":3635,"stub":true},"UkGeoTool-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jeqeIUEM9X7OXbjr+4gtSw==","length":3589,"stub":true}}}},
{"id":"UnderscoreKit","key":"UnderscoreKit","value":{"rev":"7-fe5bfa8d6165868ed9a21045eb6c2e18"},"doc":{"_id":"UnderscoreKit","_rev":"7-fe5bfa8d6165868ed9a21045eb6c2e18","name":"UnderscoreKit","description":"A port of Haskell's standard prelude to Javascript","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"UnderscoreKit","main":"index.js","version":"0.0.1","description":"A port of Haskell's standard prelude to Javascript","keywords":["functional","underscore","haskell","library"],"homepage":"https://github.com/JosephMoniz/UnderscoreKit","bugs":{"email":"joseph.moniz@gmail.com","url":"https://github.com/JosephMoniz/UnderscoreKit/issues"},"files":["index.js","underscorekit.js"],"email":"joseph.moniz@gmail.com","url":"https://github.com/JosephMoniz/UnderscoreKit","repository":{"type":"git","url":"git@github.com:JosephMoniz/UnderscoreKit.git"},"dependencies":{"underscore":">=1.3.0","vows":">=0.6.1","uglify-js":">=1.2.5"},"scripts":{"test":"vows --spec ./test/*"},"contributors":[{"name":"Joseph Moniz","email":"joseph.moniz@gmail.com","url":"http://josephmoniz.github.com/"}],"_npmUser":{"name":"josephmoniz","email":"joseph.moniz@gmail.com"},"_id":"UnderscoreKit@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"18118b637d289e94062aaac235cc501ff1b05766","tarball":"http://registry.npmjs.org/UnderscoreKit/-/UnderscoreKit-0.0.1.tgz"},"maintainers":[{"name":"josephmoniz","email":"joseph.moniz@gmail.com"}]},"0.1.0":{"name":"UnderscoreKit","main":"index.js","version":"0.1.0","description":"A port of Haskell's standard prelude to Javascript","keywords":["functional","underscore","haskell","library"],"homepage":"https://github.com/JosephMoniz/UnderscoreKit","bugs":{"email":"joseph.moniz@gmail.com","url":"https://github.com/JosephMoniz/UnderscoreKit/issues"},"files":["index.js","underscorekit.js"],"email":"joseph.moniz@gmail.com","url":"https://github.com/JosephMoniz/UnderscoreKit","repository":{"type":"git","url":"git@github.com:JosephMoniz/UnderscoreKit.git"},"dependencies":{"underscore":">=1.3.0","vows":">=0.6.1","uglify-js":">=1.2.5"},"scripts":{"test":"vows --spec ./test/*"},"contributors":[{"name":"Joseph Moniz","email":"joseph.moniz@gmail.com","url":"http://josephmoniz.github.com/"}],"_npmUser":{"name":"josephmoniz","email":"joseph.moniz@gmail.com"},"_id":"UnderscoreKit@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ad510281b4b6f9c3e4712e50b6ea205b62e7a945","tarball":"http://registry.npmjs.org/UnderscoreKit/-/UnderscoreKit-0.1.0.tgz"},"maintainers":[{"name":"josephmoniz","email":"joseph.moniz@gmail.com"}]},"0.1.1":{"name":"UnderscoreKit","main":"index.js","version":"0.1.1","description":"A port of Haskell's standard prelude to Javascript","keywords":["functional","underscore","haskell","library"],"homepage":"https://github.com/JosephMoniz/UnderscoreKit","bugs":{"email":"joseph.moniz@gmail.com","url":"https://github.com/JosephMoniz/UnderscoreKit/issues"},"files":["index.js","underscorekit.js"],"email":"joseph.moniz@gmail.com","url":"https://github.com/JosephMoniz/UnderscoreKit","repository":{"type":"git","url":"git@github.com:JosephMoniz/UnderscoreKit.git"},"dependencies":{"underscore":">=1.3.0","vows":">=0.6.1","uglify-js":">=1.2.5"},"scripts":{"test":"vows --spec ./test/*"},"contributors":[{"name":"Joseph Moniz","email":"joseph.moniz@gmail.com","url":"http://josephmoniz.github.com/"}],"_npmUser":{"name":"josephmoniz","email":"joseph.moniz@gmail.com"},"_id":"UnderscoreKit@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.7.0","_defaultsLoaded":true,"dist":{"shasum":"c7786977dff5a9c3e430b936eb25abc7e7898fb9","tarball":"http://registry.npmjs.org/UnderscoreKit/-/UnderscoreKit-0.1.1.tgz"},"readme":"","maintainers":[{"name":"josephmoniz","email":"joseph.moniz@gmail.com"}]}},"readme":null,"maintainers":[{"name":"josephmoniz","email":"joseph.moniz@gmail.com"}],"time":{"modified":"2012-02-02T09:05:37.372Z","created":"2012-01-15T18:18:33.923Z","0.0.1":"2012-01-15T18:18:35.523Z","0.1.0":"2012-01-31T01:41:04.411Z","0.1.1":"2012-02-02T09:05:37.372Z"},"repository":{"type":"git","url":"git@github.com:JosephMoniz/UnderscoreKit.git"},"_attachments":{"UnderscoreKit-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7yViBNyDlNr6CTE/f9acfQ==","length":6320,"stub":true},"UnderscoreKit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-z2CPlfRJJ6OT5iCWmYh7tA==","length":6436,"stub":true},"UnderscoreKit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hVwAX4R15jJOOr8kiUwRBQ==","length":3310,"stub":true}}}},
{"id":"UnderscoreMatchersForJasmine","key":"UnderscoreMatchersForJasmine","value":{"rev":"11-b9ed316efedea4c46de7f1caaa88eebe"},"doc":{"_id":"UnderscoreMatchersForJasmine","_rev":"11-b9ed316efedea4c46de7f1caaa88eebe","name":"UnderscoreMatchersForJasmine","description":"Underscore and backbone Matchers for Jasmine-Node","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"UnderscoreMatchersForJasmine","description":"Underscore and backbone Matchers for Jasmine-Node","version":"0.0.1","homepage":"https://github.com/raganwald/Underscore-Matchers-for-Jasmine","repository":{"type":"git","url":"git@github.com:raganwald/Underscore-Matchers-for-Jasmine.git"},"main":"lib/underscore_matchers.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"UnderscoreMatchersForJasmine@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1b3b24d6d7a7b863f6df48410067af05fae828da","tarball":"http://registry.npmjs.org/UnderscoreMatchersForJasmine/-/UnderscoreMatchersForJasmine-0.0.1.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"0.0.2":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"UnderscoreMatchersForJasmine","description":"Underscore and backbone Matchers for Jasmine-Node","version":"0.0.2","homepage":"https://github.com/raganwald/Underscore-Matchers-for-Jasmine","repository":{"type":"git","url":"git@github.com:raganwald/Underscore-Matchers-for-Jasmine.git"},"main":"lib/underscore_matchers.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"UnderscoreMatchersForJasmine@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"089fa525901626763a100e0d070342ab935e3406","tarball":"http://registry.npmjs.org/UnderscoreMatchersForJasmine/-/UnderscoreMatchersForJasmine-0.0.2.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"0.0.3":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"UnderscoreMatchersForJasmine","description":"Underscore and backbone Matchers for Jasmine-Node","version":"0.0.3","homepage":"https://github.com/raganwald/Underscore-Matchers-for-Jasmine","repository":{"type":"git","url":"git@github.com:raganwald/Underscore-Matchers-for-Jasmine.git"},"main":"lib/UnderscoreMatchersForJasmine.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"UnderscoreMatchersForJasmine@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a09c6833b0935237cb0b6dc4726408f1c32e150f","tarball":"http://registry.npmjs.org/UnderscoreMatchersForJasmine/-/UnderscoreMatchersForJasmine-0.0.3.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"0.0.4":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"UnderscoreMatchersForJasmine","description":"Underscore and backbone Matchers for Jasmine-Node","version":"0.0.4","homepage":"https://github.com/raganwald/Underscore-Matchers-for-Jasmine","repository":{"type":"git","url":"git@github.com:raganwald/Underscore-Matchers-for-Jasmine.git"},"main":"lib/UnderscoreMatchersForJasmine.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"UnderscoreMatchersForJasmine@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4e95d163e2dbe795a1b84928eb42ac3d69929b28","tarball":"http://registry.npmjs.org/UnderscoreMatchersForJasmine/-/UnderscoreMatchersForJasmine-0.0.4.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]},"0.0.5":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"UnderscoreMatchersForJasmine","description":"Underscore and backbone Matchers for Jasmine-Node","version":"0.0.5","homepage":"https://github.com/raganwald/Underscore-Matchers-for-Jasmine","repository":{"type":"git","url":"git@github.com:raganwald/Underscore-Matchers-for-Jasmine.git"},"main":"lib/UnderscoreMatchersForJasmine.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"UnderscoreMatchersForJasmine@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fba3217565fe4b90f60727b817dd1b03afc975e4","tarball":"http://registry.npmjs.org/UnderscoreMatchersForJasmine/-/UnderscoreMatchersForJasmine-0.0.5.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]}},"readme":"Underscore Matchers for Jasmine\n===\n\nUnderscoreMatchersForJasmine adds a series of matchers for [Jasmine][1]-based Javascript/[Coffeescript][2] testing based on [Underscore][_] methods. Example:\n\n    expect(snafu).toInclude('s', 'n', 'a')\n    \n    // if snafu is an array, this is equivalent to:\n    expect(\n      _(snafu).include('s') && _(snafu).include('n') && _(snafu).include('a')\n    ).toBeTruthy()\n\n    // if snafu is a Backbone.js collection, this is equivalent to:\n    expect(\n      snafu.include('s') && snafu.include('n') && snafu.include('a')\n    ).toBeTruthy()\n    \n[1]: https://github.com/pivotal/jasmine\n[2]: https://github.com/jashkenas/coffee-script\n[_]: http://documentcloud.github.com/underscore/\n\nThat makes your tests easy to read, for example:\n\n    $ ->\n      describe 'States and StateMachines', ->\n        it 'should associate states with a state machine and the state machine with its states', ->\n          engine_status = new StateMachine()\n          running = engine_status.new_state()\n          idling = engine_status.new_state()\n          \n          expect(running).toRepondTo('state_machine')\n          expect(engine_status.states()).toInclude(running, idling)\n          \n        it 'should generate states with rpm', ->\n          engine_status = new StateMachine()\n          running = engine_status.new_state()\n          \n          expect(running).toBeA(State)\n          expect(running).toHave('rpm')\n\nIs it any good?\n---\n\n[Yes][y].\n\n[y]: http://news.ycombinator.com/item?id=3067434\n          \n*Why* is it any good?\n---\n\nLet's take it point by point:\n\n1. Underscore is a utility-belt library for Javascript. If you're using [Backbone.js][b], you are already using [Underscore][_]. If you aren't using either, you are excused from class, this library does not apply to your project.\n2. Jasmine is a [Test-Driven Development][tdd] testing framework for Javascript. You can run tests in a pretty browser window, you can run tests on the command line with Node.js, you can run tests in the console. If you are writing Javascript and/or Coffeescript, you should be using Jasmine.\n3. If you are using Underscore or Backbone and you are using Jasmine, your tests will be cleaner and more readable with these Underscore matchers for the same reason that your code is cleaner and more readable with Underscore.\n\n[tdd]: http://en.wikipedia.org/wiki/Test_Driven_Development\n[b]: http://documentcloud.github.com/backbone/\n\nCan I install it with npm?\n---\n\nYes:\n\n    npm install UnderscoreMatchersForJasmine\n\nCan I install it in other kinds of projects?\n---\n\nIf you're using Coffeescript, put `underscore_matchers.coffee` in your project. If you're using plain Javascript, it should therefore follow that you want to put `underscore_matchers.js` in your project. It's one file, just make sure that your include declarations or asset pipeline includes `underscore_matchers` *after* `jasmine.js`. That's it. For example, here's a [Jammit][3] `assets.yml` file from a Rails project:\n\n    allow_debugging: off\n    template_function: _.template\n    compress_assets: false\n\n    javascripts:\n      common:\n        - public/js/vendor/json2.js\n        - public/js/vendor/jquery-1.6.1.min.js\n        - public/js/vendor/jquery-ui-1.8.min.js\n        - public/js/vendor/jquery.combinators.min.js\n        - public/js/vendor/jquery.predicates.min.js\n        - public/js/vendor/underscore-min.js\n        - public/js/vendor/backbone.js\n        - public/js/vendor/async.js\n      application:\n        - public/js/compiled/models/*.js\n      test:\n        - public/js/vendor/jasmine/jasmine.js\n        - public/js/vendor/jasmine/jasmine-html.js\n        - public/js/compiled/jasmine/underscore_matchers.js\n        - public/js/compiled/spec/*.js\n\n    stylesheets:\n      common:\n      application:\n      test:\n        - public/js/vendor/jasmine/*.css\n        \n[3]: https://github.com/documentcloud/jammit\n\nYou can also put `underscore_matchers_spec.coffee` or `underscore_matchers_spec.js` in your project if you want to see these matchers test themselves. It's also handy documentation for how the matchers behave!\n\nWhich Matchers are included?\n---\n\nRead the code in [Coffeescript][5] or [Javascript][6].\n\n[5]: https://github.com/raganwald/Underscore-Matchers-for-Jasmine/blob/master/lib/underscore_matchers.coffee\n[6]: https://github.com/raganwald/Underscore-Matchers-for-Jasmine/blob/master/lib/underscore_matchers.js\n\nThat's it? Aren't there any more?\n---\n\nThis is what I happen to need right now for my actual code. **As I write more matchers, I'll add them**. So, if you're interested, watch the library. I suppose I could go through and make a matcher for every function in Underscore, but I'd rather let it grow organically. If there's a matcher you need that isn't here, well, **we're all in the same boat**:\n\n* If you're a *passenger*, send me a message describing the matcher you want. If it seems useful, I'll add it.\n* If you're a *sailor*, fork this project, add the matcher, and send me a pull request.\n* If you're the *captain of your own ship*, and you've already written some matchers like this, run up some signal flags and I'll include links to your project right here.\n* And if you're a *pirate*, take this code and/or just the idea and make your own library. I'm cool with that.\n\nIs it free?\n---\n\n[Yes][4].\n\n[4]: https://github.com/raganwald/Underscore-Matchers-for-Jasmine/blob/master/license.txt\n\nOther Random Observations\n---\n\n**Who's Using This?**\n\nI am.\n\n**Is there a gem?**\n\nNo. This is a Coffeescript and Javascript include file, not a ruby library. Coffeescript and Javascript files work everywhere, and you can read the source any time you want.\n\n**Any gotchas?**\n\nSome matchers, such as `toInclude(...)` and `toRespondTo(...)` can take multiple arguments. When they do, they have \"all\" semantics. For example:\n    \n    expect([1,2,3,4,5]).toRespondTo('push', 'pop')\n      // => succeeds because arrays respond to .push and .pop\n\n    expect([1,2,3,4,5]).toInclude(2,3,4,5,6)\n       // => fails because 6 is not included.\n      \nNow what if you want to test the opposite?\n\n    expect([1,2,3,4,5]).not.toInclude(2,3,4,5,6)\n      // succeeds because it doesn't include 2, 3, 4, 5, AND 6.\n      \nIf that's what you want, fine. But if what you really want is to test whether it doesn't include ANY of the arguments, you need a slightly different matcher:\n    \n    expect([1,2,3,4,5]).toRespondToAny('push', 'select_sql', 'diagonalize')\n      // => succeeds because arrays respond to at least one of the three methods given\n\n    expect([1,2,3,4,5]).toIncludeAny(2,3,4,5,6)\n      //  => succeeds because it includes at least one of the arguments\n\nThe opposite of an \"any\" matcher is a \"none\" matcher:\n\n    expect([1,2,3,4,5]).not.toIncludeAny(3, 6, 9)\n      //  => fails because [1,2,3,4,5] includes a 3\n\n    expect([1,2,3,4,5]).not.toIncludeAny(6, 9, 12)\n      //  => succeeds because [1,2,3,4,5] does not include ANY of the aarguments\n\n\n**Is this just for underscore stuff?**\n\nNo. I also sneak in some Backbone stuff here and there, but the code works just fine even if you don't use Backbone.js. For example:\n\n    $ ->\n      describe 'States', ->\n        it 'should permit cards to be added and removed', ->\n          state = new State()\n          card = new Card()\n          expect(state.cards()).toBeEmpty()\n          state.cards().add(card)\n          expect(state.cards()).not.toBeEmpty()\n          state.cards().remove(card)\n          expect(state.cards()).toBeEmpty()\n          \n`toBeEmpty` is more than just a wrapper for `_.isEmpty`:\n\n    expect(\n      _([]).isEmpty()\n    ).toBeTruthy() // => succeeds\n    \n    expect(\n      _(new Backbone.Collection()).isEmpty()\n    ).toBeTruthy() // => fails, wtf!?\n    \n    expect([]).toBeEmpty()\n      // => succeeds\n      \n    expect(new Backbone.Collection()).toBeEmpty()\n      // => succeeds\n      \nThe same goes for collection tests like `.toInclude`. You can pass it a backbone collection or an array as you see fit. If you don't want that behaviour, Jasmine includes a `contains()` matcher that expects an array.","maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"time":{"modified":"2012-05-08T13:43:56.555Z","created":"2011-11-28T22:32:23.712Z","0.0.1":"2011-11-28T22:32:24.208Z","0.0.2":"2011-12-05T20:14:18.245Z","0.0.3":"2011-12-05T20:55:52.210Z","0.0.4":"2012-05-06T23:32:18.821Z","0.0.5":"2012-05-08T13:43:56.555Z"},"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"repository":{"type":"git","url":"git@github.com:raganwald/Underscore-Matchers-for-Jasmine.git"},"_attachments":{"UnderscoreMatchersForJasmine-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-qmY85IXKv7uqIImdAt3Lng==","length":5712,"stub":true},"UnderscoreMatchersForJasmine-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-8i3ZGOlQOh48sXvAal1Exw==","length":5659,"stub":true},"UnderscoreMatchersForJasmine-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yk8uUHBU2gEMMp8HvSM8SQ==","length":10240,"stub":true},"UnderscoreMatchersForJasmine-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-oD2wTfnH5vV9mgdM8bF8nw==","length":10240,"stub":true},"UnderscoreMatchersForJasmine-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-N7fFh7WHyAY/UCguM2w5JQ==","length":10240,"stub":true}}}},
{"id":"Uniform","key":"Uniform","value":{"rev":"7-d917b165d32a990c2d9ad335898291fc"},"doc":{"_id":"Uniform","_rev":"7-d917b165d32a990c2d9ad335898291fc","name":"Uniform","description":"Uniform is a ViewController for the masses","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.1":{"author":{"name":"Luke Morton","email":"lukemorton.designs@gmail.com","url":"http://lukemorton.co.uk"},"name":"Uniform","description":"Uniform is a ViewController for the masses","version":"0.1.1","homepage":"http://github.com/DrPheltRight/uniform","repository":{"type":"git","url":"git://github.com/DrPheltRight/uniform.git"},"_npmUser":{"name":"drpheltright","email":"lukemorton.designs@gmail.com"},"_id":"Uniform@0.1.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"83c76517adc0ce388e11ea47fb13d6ac19105c37","tarball":"http://registry.npmjs.org/Uniform/-/Uniform-0.1.1.tgz"},"maintainers":[{"name":"drpheltright","email":"lukemorton.designs@gmail.com"}]},"0.1.3":{"author":{"name":"Luke Morton","email":"lukemorton.designs@gmail.com","url":"http://lukemorton.co.uk"},"name":"Uniform","description":"Uniform is a ViewController for the masses","version":"0.1.3","homepage":"http://github.com/DrPheltRight/uniform","repository":{"type":"git","url":"git://github.com/DrPheltRight/uniform.git"},"_npmUser":{"name":"drpheltright","email":"lukemorton.designs@gmail.com"},"_id":"Uniform@0.1.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"eea7843636d97bd30e2344a41ba50b94f44f7a44","tarball":"http://registry.npmjs.org/Uniform/-/Uniform-0.1.3.tgz"},"maintainers":[{"name":"drpheltright","email":"lukemorton.designs@gmail.com"}]},"0.1.6":{"author":{"name":"Luke Morton","email":"lukemorton.designs@gmail.com","url":"http://lukemorton.co.uk"},"name":"Uniform","description":"Uniform is a ViewController for the masses","version":"0.1.6","homepage":"http://github.com/DrPheltRight/uniform","repository":{"type":"git","url":"git://github.com/DrPheltRight/uniform.git"},"_npmUser":{"name":"drpheltright","email":"lukemorton.designs@gmail.com"},"_id":"Uniform@0.1.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"bfe29e6899f68c6122e1b19b8dfa02be4538ba6d","tarball":"http://registry.npmjs.org/Uniform/-/Uniform-0.1.6.tgz"},"maintainers":[{"name":"drpheltright","email":"lukemorton.designs@gmail.com"}]}},"readme":"# Uniform\n\nA ViewController for CoffeeScript in the browser. In the case\nof Uniform a ViewController is a class that describes the\nbehaviour of an element and it's children.\n\nIt goes well with jQuery.\n\n``` coffeescript\n# Let's scribe a contact form\nclass ContactForm extends Uniform\n  # The HTML template\n  template: \"\"\"\n    <form>\n      <textarea></textarea>\n      <button>Send</button>\n    </form>\n  \"\"\"\n\n  # On initialise we want to add the form to the body\n  init: -> $('body').append(@el)\n\n  # We cache some children to properties on this object\n  elements:\n    msg: 'textarea'\n    btn: 'button'\n  \n  # We delegate the submit event to @sendResponse()\n  events:\n    '':\n      'submit': 'sendResponse'\n\n  # Do the sending :)\n  sendResponse: (e) ->\n    e.preventDefault()\n    @btn.text('Sending...')\n    $.post '/contact', msg: @msg, =>\n      @msg.val('')\n      @btn.text('Send')\n\n# Initialise\nnew ContactForm\n```\n\n## CoffeeScript in the browser?\n\nUniform is best used in compiled CoffeeScript browser scripts.\nSince Uniform is a CoffeeScript class it is easiest to extend\nand use Uniform if your front end code is also CoffeeScript.\n\nUse it how you like though.\n\n## Getting a copy\n\nYou can simply use the JS found in the dist folder of the\nUniform git repo [http://github.com/DrPheltRight/uniform]()\n\n## Hacking\n\nClone the repository [http://github.com/DrPheltRight/uniform.git]()\nand then run \"cake build\" to make a fresh copy of Uniform.\n\n## License\n\nMIT\n\n## Author\n\nLuke Morton","maintainers":[{"name":"drpheltright","email":"lukemorton.designs@gmail.com"}],"time":{"modified":"2012-02-06T14:45:50.043Z","created":"2012-01-12T20:35:15.517Z","0.1.1":"2012-01-12T20:35:17.347Z","0.1.3":"2012-01-12T21:16:22.718Z","0.1.6":"2012-02-06T14:45:50.043Z"},"author":{"name":"Luke Morton","email":"lukemorton.designs@gmail.com","url":"http://lukemorton.co.uk"},"repository":{"type":"git","url":"git://github.com/DrPheltRight/uniform.git"},"_attachments":{"Uniform-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FtABzAprZ9nIg6WSVZLOXA==","length":48413,"stub":true},"Uniform-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dydc3RQ9VM8mTtOoW0Qc0w==","length":38777,"stub":true},"Uniform-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WGV+4xS2bimjbhQhF7MG1w==","length":38156,"stub":true}}}},
{"id":"UniqueList","key":"UniqueList","value":{"rev":"5-dece55f26ec87f5dfe376392f6ad3d03"},"doc":{"_id":"UniqueList","_rev":"5-dece55f26ec87f5dfe376392f6ad3d03","name":"UniqueList","description":"UniqueList creates an array that guarantess the uniqueness of each element","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Takashi M","url":"https://github.com/beatak/"},"name":"UniqueList","description":"UniqueList creates an array that guarantess the uniqueness of each element","version":"0.0.1","homepage":"https://github.com/beatak/UniqueList","repository":{"type":"git","url":"git://github.com/beatak/UniqueList.git"},"main":"lib/uniquelist.js","scripts":{"test":"expresso"},"engines":{"node":">= 0.6.0"},"dependencies":{},"devDependencies":{"expresso":">=0.9.2"},"keywords":["list"],"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"UniqueList@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"fc489f28e204a7aa3dde4ce2794d29be43496b40","tarball":"http://registry.npmjs.org/UniqueList/-/UniqueList-0.0.1.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]},"0.0.2":{"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"https://github.com/beatak/"},"name":"UniqueList","description":"UniqueList creates an array that guarantess the uniqueness of each element","version":"0.0.2","homepage":"https://github.com/beatak/UniqueList","repository":{"type":"git","url":"git://github.com/beatak/UniqueList.git"},"main":"lib/uniquelist.js","scripts":{"test":"expresso"},"engines":{"node":">= 0.6.0"},"dependencies":{},"devDependencies":{"expresso":">=0.9.2"},"keywords":["list"],"_npmUser":{"name":"beatak","email":"beatak@gmail.com"},"_id":"UniqueList@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"effe2177c3aeb5a8743e3d473a8c99b27a03c524","tarball":"http://registry.npmjs.org/UniqueList/-/UniqueList-0.0.2.tgz"},"maintainers":[{"name":"beatak","email":"beatak@gmail.com"}]}},"readme":"UniqueList is an array that guarantees the uniqueness of each element\n","maintainers":[{"name":"beatak","email":"beatak@gmail.com"}],"time":{"modified":"2012-01-31T08:37:34.517Z","created":"2012-01-31T08:36:55.076Z","0.0.1":"2012-01-31T08:36:55.337Z","0.0.2":"2012-01-31T08:37:34.517Z"},"author":{"name":"Takashi Mizohata","email":"beatak@gmail.com","url":"https://github.com/beatak/"},"repository":{"type":"git","url":"git://github.com/beatak/UniqueList.git"},"_attachments":{"UniqueList-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-j+nddoM4LXc4AjEQYW1Keg==","length":10240,"stub":true},"UniqueList-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fQNq+h6yK8mwJMLW2tmCjg==","length":10240,"stub":true}}}},
{"id":"VNLS","key":"VNLS","value":{"rev":"9-43e262e704d761aff98aae719ab71264"},"doc":{"_id":"VNLS","_rev":"9-43e262e704d761aff98aae719ab71264","name":"VNLS","description":"Silly, small, autistic javascript framework","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Jorrit Duin","email":"jorrit.duin@gmail.com","url":"https://plus.google.com/108030183762802367816"},"name":"VNLS","description":"Silly, small, autistic javascript framework","version":"0.0.1","homepage":"https://github.com/jorritd/VNLS","repository":{"type":"git","url":"git://github.com/jorritd/VNLS.git"},"main":"lib/vnls.js","engines":{"node":">=0.4.0"},"bugs":{"url":"https://github.com/jorritd/VNLS/issues"},"devDependencies":{"jake":"0.2.15","docco":"0.3.0","jasmine-node":"1.0.20","nodewatch":"0.0.4","uglify-js":"1.2.5"},"licenses":[{"type":"GNU General Public License","url":"http://www.gnu.org/licenses"}],"_npmUser":{"name":"jorrit","email":"jorrit.duin@gmail.com"},"_id":"VNLS@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c63341ee64fa343b1a4159606b2077dcda26caa8","tarball":"http://registry.npmjs.org/VNLS/-/VNLS-0.0.1.tgz"},"readme":"","maintainers":[{"name":"jorrit","email":"jorrit.duin@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Jorrit Duin","email":"jorrit.duin@gmail.com"},"name":"VNLS","description":"Silly, small, autistic javascript framework","version":"0.0.2","homepage":"https://github.com/jorritd/VNLS","keywords":["framework","browser","promise"],"repository":{"type":"git","url":"git://github.com/jorritd/VNLS.git"},"main":"lib/vnls.js","engines":{"node":">=0.4.0"},"bugs":{"url":"https://github.com/jorritd/VNLS/issues"},"devDependencies":{"jake":"0.2.15","docco":"0.3.0","jasmine-node":"1.0.20","nodewatch":"0.1.0","uglify-js":"1.2.5"},"licenses":[{"type":"GNU General Public License","url":"http://www.gnu.org/licenses"}],"_npmUser":{"name":"jorrit","email":"jorrit.duin@gmail.com"},"_id":"VNLS@0.0.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"dae18cfb0fd6010aa64360407182e7fdd397f3f5","tarball":"http://registry.npmjs.org/VNLS/-/VNLS-0.0.2.tgz"},"readme":"","maintainers":[{"name":"jorrit","email":"jorrit.duin@gmail.com"}]}},"readme":"","maintainers":[{"name":"jorrit","email":"jorrit.duin@gmail.com"}],"time":{"modified":"2012-02-13T12:54:32.657Z","created":"2012-02-05T15:05:13.710Z","0.0.1":"2012-02-05T15:05:15.399Z","0.0.2":"2012-02-13T12:54:32.657Z"},"author":{"name":"Jorrit Duin","email":"jorrit.duin@gmail.com"},"repository":{"type":"git","url":"git://github.com/jorritd/VNLS.git"},"_attachments":{"VNLS-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lA2W45xPllc5DpyVtDqBcQ==","length":28655,"stub":true},"VNLS-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0jAhr/B7PnEqUAlsxdxMAQ==","length":25916,"stub":true}}}},
{"id":"Vector","key":"Vector","value":{"rev":"3-bf5dc97abe7cf1057260b70638175a96"},"doc":{"_id":"Vector","_rev":"3-bf5dc97abe7cf1057260b70638175a96","name":"Vector","description":"A port of Processing PVector written in CoffeeScript","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Will Bailey","email":"will.bailey@gmail.com","url":"willbailey.name"},"name":"Vector","description":"A port of Processing PVector written in CoffeeScript","version":"0.0.1","repository":{"type":"git","url":"git@github.com:willbailey/vector.git"},"engines":{"node":"~v0.4.10"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/wbailey/.npm/Vector/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Vector@0.0.1","_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d721bd09e0617c3fccb8fe3fc6d7b42f99291d61","tarball":"http://registry.npmjs.org/Vector/-/Vector-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"willbailey","email":"will.bailey@gmail.com"}]}},"maintainers":[{"name":"willbailey","email":"will.bailey@gmail.com"}],"time":{"modified":"2011-08-31T15:07:28.899Z","created":"2011-08-31T15:07:27.895Z","0.0.1":"2011-08-31T15:07:28.899Z"},"author":{"name":"Will Bailey","email":"will.bailey@gmail.com","url":"willbailey.name"},"repository":{"type":"git","url":"git@github.com:willbailey/vector.git"},"_attachments":{"Vector-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XriaZ5erbd4PGGTHuodqOQ==","length":2254,"stub":true}}}},
{"id":"Velvet","key":"Velvet","value":{"rev":"9-0a57b7506cbf98ab357a41bcfb79c638"},"doc":{"_id":"Velvet","_rev":"9-0a57b7506cbf98ab357a41bcfb79c638","name":"Velvet","description":"Authentication and session management for node.js applications.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"Velvet","author":{"name":"Julio Jimenez","email":"julio.js@live.com"},"description":"Authentication and session management for node.js applications.","version":"0.0.1","main":"velvet.js","dependencies":{"nonogo":"x.x.x"},"_npmJsonOpts":{"file":"/Users/juliojimenez/.npm/Velvet/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Velvet@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e99d5f75e3e81d416beb593bda615cefbe0eef5f","tarball":"http://registry.npmjs.org/Velvet/-/Velvet-0.0.1.tgz"},"maintainers":[{"name":"juliojimenez","email":"julio.js@live.com"}]},"0.0.2":{"name":"Velvet","author":{"name":"Julio Jimenez","email":"julio.js@live.com"},"description":"Authentication and session management for node.js applications.","version":"0.0.2","main":"velvet.js","dependencies":{"nonogo":"x.x.x"},"_npmJsonOpts":{"file":"/Users/juliojimenez/.npm/Velvet/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Velvet@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c6a1e6314ccde9830700cfe7c8e3a802bdee3371","tarball":"http://registry.npmjs.org/Velvet/-/Velvet-0.0.2.tgz"},"maintainers":[{"name":"juliojimenez","email":"julio.js@live.com"}]},"0.0.3":{"name":"Velvet","author":{"name":"Julio Jimenez","email":"julio.js@live.com"},"description":"Authentication and session management for node.js applications.","version":"0.0.3","main":"velvet.js","dependencies":{"nonogo":"x.x.x"},"_npmJsonOpts":{"file":"/Users/juliojimenez/.npm/Velvet/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Velvet@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c77d0d36a31dccdd4f9c2f7fc89852ebd730b187","tarball":"http://registry.npmjs.org/Velvet/-/Velvet-0.0.3.tgz"},"maintainers":[{"name":"juliojimenez","email":"julio.js@live.com"}]},"0.0.4":{"name":"Velvet","author":{"name":"Julio Jimenez","email":"julio.js@live.com"},"description":"Authentication and session management for node.js applications.","version":"0.0.4","main":"velvet.js","dependencies":{"nonogo":"x.x.x"},"_npmJsonOpts":{"file":"/Users/juliojimenez/.npm/Velvet/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"Velvet@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3f6bc281ee87cc6234280b7d3532cd347cde5fd6","tarball":"http://registry.npmjs.org/Velvet/-/Velvet-0.0.4.tgz"},"maintainers":[{"name":"juliojimenez","email":"julio.js@live.com"}]}},"maintainers":[{"name":"juliojimenez","email":"julio.js@live.com"}],"time":{"modified":"2011-10-23T21:19:46.540Z","created":"2011-10-20T00:36:05.980Z","0.0.1":"2011-10-20T00:36:07.719Z","0.0.2":"2011-10-22T20:22:16.222Z","0.0.3":"2011-10-22T20:25:19.411Z","0.0.4":"2011-10-23T21:19:46.540Z"},"author":{"name":"Julio Jimenez","email":"julio.js@live.com"},"_attachments":{"Velvet-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-gTPDUpwiFOe0Fn7MoUPMqw==","length":2401,"stub":true},"Velvet-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FHcUrKDkw6skjkCxjU7bkw==","length":2405,"stub":true},"Velvet-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eSchHcpBurKyzi/v0XVzXQ==","length":2406,"stub":true},"Velvet-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-85j0JQ3lV2UfZbVtRobvzQ==","length":2446,"stub":true}}}},
{"id":"WNdb","key":"WNdb","value":{"rev":"5-81362ec82654004191af02762eff8f9f"},"doc":{"_id":"WNdb","_rev":"5-81362ec82654004191af02762eff8f9f","name":"WNdb","description":"WordNet 3.0 Database files","dist-tags":{"latest":"3.0.1"},"versions":{"3.0.0":{"author":{"name":"Moos","email":"mooster@42at.com"},"name":"WNdb","description":"WordNet 3.0 Database files","keywords":["WordNet","wordpos","natural","pos"],"version":"3.0.0","homepage":"http://wordnet.princeton.edu/","repository":{"type":"git","url":"git://github.com/moos/WNdb.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"moos","email":"mooster@42at.com"},"_id":"WNdb@3.0.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"c2cab3de3c71c7aea59b5093806baa0f1173c700","tarball":"http://registry.npmjs.org/WNdb/-/WNdb-3.0.0.tgz"},"maintainers":[{"name":"moos","email":"mooster@42at.com"}]},"3.0.1":{"author":{"name":"Moos","email":"mooster@42at.com"},"name":"WNdb","description":"WordNet 3.0 Database files","keywords":["WordNet","wordpos","natural","pos"],"version":"3.0.1","homepage":"http://wordnet.princeton.edu/","repository":{"type":"git","url":"git://github.com/moos/WNdb.git"},"dependencies":{"tar":"latest"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6.0"},"scripts":{"postinstall":"node unpack.js WNdb-3.0.tar.gz"},"_npmUser":{"name":"moos","email":"mooster@42at.com"},"_id":"WNdb@3.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a175a060d37c57526c3ccf66f91a7292fd7f1add","tarball":"http://registry.npmjs.org/WNdb/-/WNdb-3.0.1.tgz"},"maintainers":[{"name":"moos","email":"mooster@42at.com"}]}},"readme":"\r\nWNdb\r\n=======\r\n\r\nA package to install [WordNet](http://wordnet.princeton.edu) database files for Node.js modules.\r\n\r\nUsed by [wordpos](http://github.com/moos/wordpos) project which is based on [natural](http://github.com/NaturalNode/natural) WordNet module.\r\n\r\n\r\nUsage\r\n-------\r\n\r\n```js\r\nvar WNdb = require('WNdb');\r\nconsole.log(WNdb);\r\n\r\n// output:\r\n{ version: '3.0',\r\n  path: 'c:\\\\wordpos\\\\node_modules\\\\WNdb\\\\dict',\r\n  files:\r\n   [ 'data.adj',\r\n     'data.adv',\r\n     'data.noun',\r\n     'data.verb',\r\n     'index.adj',\r\n     'index.adv',\r\n     'index.noun',\r\n     'index.sense',\r\n     'index.verb' ]\r\n}\r\n```\r\n\r\nDescription\r\n------------\r\n\r\nThis package contains the core DB files of WordNet 3.0 downloaded from [WordNet files](http://wordnet.princeton.edu/wordnet/download/current-version/).\r\n\r\nOther \"[standoff](http://wordnet.princeton.edu/wordnet/download/standoff/)\" files may be added in the future.\r\n\r\nThe purpose of this package is to allow a convenient way to download WordNet files offline rather than on-demand for node modules that require it.\r\n\r\n\r\nInstallation\r\n------------\r\n\r\n    npm install WNdb -g (coming)\r\n\r\nor, in the meantime, use an __http__ path in your package.json dependencies:\r\n\r\n```\r\n  ...\r\n  \"dependencies\": {\r\n    \"WNdb\": \"http://github.com/moos/WNdb/tarball/master\"\r\n  },\r\n  ...\r\n```\r\n__NOTE__: do not use the git path \"git://github.com/moos/WNdb.git\" as this will mess up CRLF (if git config core.autocrlf is true) of the WordNet data files.\r\n\r\nProperties\r\n------------\r\n\r\nWNdb.path (string) -- the path to the installed WordNet DB files\r\n\r\nWNdb.files (array) -- list of file names under the path\r\n\r\nWNdb.version (string) -- version string of WordNet database file\r\n\r\n\r\nLicense\r\n-------\r\n\r\nWNdb package:\r\nCopyright (c) 2012, mooster@42at.com\r\n(The MIT License)\r\n\r\nSee LICENSE file for complete Princeton University WordNet(r) License.\r\n\r\n\r\n","maintainers":[{"name":"moos","email":"mooster@42at.com"}],"time":{"modified":"2012-05-07T07:12:10.396Z","created":"2012-05-07T06:35:12.213Z","3.0.0":"2012-05-07T06:35:14.404Z","3.0.1":"2012-05-07T07:12:10.396Z"},"author":{"name":"Moos","email":"mooster@42at.com"},"repository":{"type":"git","url":"git://github.com/moos/WNdb.git"},"_attachments":{"WNdb-3.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cv10kytxadnTRG9KjO42jA==","length":10524829,"stub":true},"WNdb-3.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ESvU6KFIIiM7tlRXE+BnwA==","length":10526267,"stub":true}}}},
{"id":"WTGeo","key":"WTGeo","value":{"rev":"3-893d9c609e5e3814d143bb352006d357"},"doc":{"_id":"WTGeo","_rev":"3-893d9c609e5e3814d143bb352006d357","name":"WTGeo","description":"Nodejs Geo utils","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"WTGeo","description":"Nodejs Geo utils","version":"0.1.0","homepage":"https://github.com/zir/WTGeo","author":{"name":"Senmiao Liu","email":"zir.echo@gmail.com"},"repository":{"type":"git","url":"git://github.com/zir/WTGeo.git"},"main":"./index","engines":{"node":">= 0.1"},"_npmUser":{"name":"zir","email":"zir.echo@gmail.com"},"_id":"WTGeo@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3253f6248655a29ee72ecc2729faf7bec6769bfc","tarball":"http://registry.npmjs.org/WTGeo/-/WTGeo-0.1.0.tgz"},"maintainers":[{"name":"zir","email":"zir.echo@gmail.com"}]}},"readme":null,"maintainers":[{"name":"zir","email":"zir.echo@gmail.com"}],"time":{"modified":"2012-01-01T15:49:24.171Z","created":"2012-01-01T15:49:16.268Z","0.1.0":"2012-01-01T15:49:24.171Z"},"author":{"name":"Senmiao Liu","email":"zir.echo@gmail.com"},"repository":{"type":"git","url":"git://github.com/zir/WTGeo.git"},"_attachments":{"WTGeo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wxAsT9riT+vpxSmR4AX4Jw==","length":10240,"stub":true}}}},
{"id":"Web4.0","key":"Web4.0","value":{"rev":"11-94c1d6eede572513d52dbb7504191ff0"},"doc":{"_id":"Web4.0","_rev":"11-94c1d6eede572513d52dbb7504191ff0","name":"Web4.0","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"Web4.0","version":"0.0.2","dependencies":{"socket.io":"*","hook.io":"*","Hook.io-mailer":"git+https://github.com/balkian/Hookio-Mailer.git","hook.io-web40":"*"},"_npmUser":{"name":"balkian","email":"balkian@gmail.com"},"_id":"Web4.0@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"84caff46dbcc5c0fcebd98b7fa89a0a28d1650cb","tarball":"http://registry.npmjs.org/Web4.0/-/Web4.0-0.0.2.tgz"},"readme":"","maintainers":[{"name":"balkian","email":"balkian@gmail.com"}]},"0.0.3":{"name":"Web4.0","version":"0.0.3","dependencies":{"socket.io":"*","hook.io":"*","Hook.io-mailer":"git+https://github.com/balkian/Hookio-Mailer.git","hook.io-web40":"*","express":"*"},"_npmUser":{"name":"balkian","email":"balkian@gmail.com"},"_id":"Web4.0@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c554eb1596d3dccc690bd97dab1ecc56aca148c8","tarball":"http://registry.npmjs.org/Web4.0/-/Web4.0-0.0.3.tgz"},"readme":"","maintainers":[{"name":"balkian","email":"balkian@gmail.com"}]},"0.0.4":{"name":"Web4.0","version":"0.0.4","dependencies":{"socket.io":"*","hook.io":"*","Hook.io-mailer":"git+https://github.com/balkian/Hookio-Mailer.git","hook.io-web40":"*","express":"*","nib":"*","stylus":"*"},"_npmUser":{"name":"balkian","email":"balkian@gmail.com"},"_id":"Web4.0@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e918a54cfba8342991442c9874f3a765e40b0384","tarball":"http://registry.npmjs.org/Web4.0/-/Web4.0-0.0.4.tgz"},"readme":"","maintainers":[{"name":"balkian","email":"balkian@gmail.com"}]},"0.0.5":{"name":"Web4.0","version":"0.0.5","dependencies":{"socket.io":"*","hook.io":"*","Hook.io-mailerweb40":"git+https://github.com/balkian/Hookio-Mailer.git","hook.io-web40":"*","express":"*","nib":"*","stylus":"*"},"_npmUser":{"name":"balkian","email":"balkian@gmail.com"},"_id":"Web4.0@0.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8311168a1eb32161d794b73a7f3aca488f07dd7a","tarball":"http://registry.npmjs.org/Web4.0/-/Web4.0-0.0.5.tgz"},"readme":"","maintainers":[{"name":"balkian","email":"balkian@gmail.com"}]},"0.0.6":{"name":"Web4.0","version":"0.0.6","dependencies":{"socket.io":"*","hook.io":"*","Hook.io-mailerweb40":"git+https://github.com/balkian/Hookio-Mailer.git","hook.io-web40":"*","express":"*","nib":"*","stylus":"*"},"_npmUser":{"name":"balkian","email":"balkian@gmail.com"},"_id":"Web4.0@0.0.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fe3f8cec7066dc9134d79e322b937e9c43931954","tarball":"http://registry.npmjs.org/Web4.0/-/Web4.0-0.0.6.tgz"},"readme":"","maintainers":[{"name":"balkian","email":"balkian@gmail.com"}]}},"readme":"","maintainers":[{"name":"balkian","email":"balkian@gmail.com"}],"time":{"modified":"2012-05-29T13:54:48.986Z","created":"2012-05-25T09:27:47.032Z","0.0.2":"2012-05-25T09:27:48.542Z","0.0.3":"2012-05-29T13:27:16.947Z","0.0.4":"2012-05-29T13:40:25.559Z","0.0.5":"2012-05-29T13:53:12.612Z","0.0.6":"2012-05-29T13:54:48.986Z"},"_attachments":{"Web4.0-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-BkjwQyM120acZ6LJW4dc5Q==","length":7075,"stub":true},"Web4.0-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-V0I4NYRhwHATf3Gp++MUCQ==","length":7073,"stub":true},"Web4.0-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-q31HJK1IXWVuei3SqxXVLw==","length":7073,"stub":true},"Web4.0-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-PGZxQmteRCdxQ3KYHX35Pg==","length":7061,"stub":true},"Web4.0-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CP7Xn+foUCY/jgVmlTrHMg==","length":7087,"stub":true}}}},
{"id":"WebParrot","key":"WebParrot","value":{"rev":"7-7f3e9a95caa6b96ea61c8d8030b39e0e"},"doc":{"_id":"WebParrot","_rev":"7-7f3e9a95caa6b96ea61c8d8030b39e0e","name":"WebParrot","description":"A selectively caching proxy for repeatable client testing","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Andrew Barton","email":"AndrewBBarton@gmail.com"},"name":"WebParrot","description":"A selectively caching proxy for repeatable client testing","version":"0.0.1","homepage":"https://github.com/AndrewBarton/WebParrot","repository":{"type":"git","url":"git://github.com/AndrewBarton/WebParrot.git"},"main":"WebParrot.js","engines":{"node":"~0.6.6"},"dependencies":{"express":""},"devDependencies":{},"_npmUser":{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"},"_id":"WebParrot@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f622fb019445096062e8692dbcf38926a9a5f842","tarball":"http://registry.npmjs.org/WebParrot/-/WebParrot-0.0.1.tgz"},"readme":"","maintainers":[{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"}]},"0.0.2":{"author":{"name":"Andrew Barton","email":"AndrewBBarton@gmail.com"},"name":"WebParrot","description":"A selectively caching proxy for repeatable client testing","version":"0.0.2","homepage":"https://github.com/AndrewBarton/WebParrot","repository":{"type":"git","url":"git://github.com/AndrewBarton/WebParrot.git"},"main":"WebParrot.js","engines":{"node":"~0.6.6"},"dependencies":{"express":""},"devDependencies":{},"_npmUser":{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"},"_id":"WebParrot@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"36d56c4be0c27736000721f7d703f60478b7dee9","tarball":"http://registry.npmjs.org/WebParrot/-/WebParrot-0.0.2.tgz"},"readme":"","maintainers":[{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"}]},"0.0.3":{"author":{"name":"Andrew Barton","email":"AndrewBBarton@gmail.com"},"name":"WebParrot","description":"A selectively caching proxy for repeatable client testing","version":"0.0.3","homepage":"https://github.com/AndrewBarton/WebParrot","repository":{"type":"git","url":"git://github.com/AndrewBarton/WebParrot.git"},"main":"WebParrot.js","engines":{"node":"~0.6.6"},"dependencies":{"express":""},"devDependencies":{},"_npmUser":{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"},"_id":"WebParrot@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8d6e88e5c4fa6fcb597f3fcb6c47c3a313bbd51f","tarball":"http://registry.npmjs.org/WebParrot/-/WebParrot-0.0.3.tgz"},"readme":"","maintainers":[{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"}]}},"readme":"","maintainers":[{"name":"andrewbarton","email":"AndrewBBarton@gmail.com"}],"time":{"modified":"2012-03-01T04:16:16.654Z","created":"2012-02-07T09:11:00.512Z","0.0.1":"2012-02-07T09:11:02.311Z","0.0.2":"2012-02-21T20:20:33.138Z","0.0.3":"2012-03-01T04:16:16.654Z"},"author":{"name":"Andrew Barton","email":"AndrewBBarton@gmail.com"},"repository":{"type":"git","url":"git://github.com/AndrewBarton/WebParrot.git"},"_attachments":{"WebParrot-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-JlXD9ADk4SzUT4gzsSd0uw==","length":3434439,"stub":true},"WebParrot-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-oQ+YV8al8fFv6OQRsybvmg==","length":570380,"stub":true},"WebParrot-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oFv1XRZGaoW61j7G1CTwew==","length":161584,"stub":true}}}},
{"id":"WhiteRabbit","key":"WhiteRabbit","value":{"rev":"3-9f8d1ad501d05189ce1a78e6db91e832"},"doc":{"_id":"WhiteRabbit","_rev":"3-9f8d1ad501d05189ce1a78e6db91e832","name":"WhiteRabbit","description":"Delayed callback wrapper. Useful for throttling callbacks.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Luke Morton","email":"lukemorton.designs@gmail.com","url":"http://lukemorton.co.uk"},"name":"WhiteRabbit","description":"Delayed callback wrapper. Useful for throttling callbacks.","version":"0.1.0","homepage":"https://github.com/DrPheltRight/whiterabbit","repository":{"type":"git","url":"git://github.com/DrPheltRight/whiterabbit.git"},"main":"lib/whiterabbit.js","engines":{"node":"~0.6.3"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"drpheltright","email":"lukemorton.designs@gmail.com"},"_id":"WhiteRabbit@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"82c49c4f4bd4149f6fe33079cd9f5bf5bfacf79b","tarball":"http://registry.npmjs.org/WhiteRabbit/-/WhiteRabbit-0.1.0.tgz"},"maintainers":[{"name":"drpheltright","email":"lukemorton.designs@gmail.com"}]}},"readme":"# WhiteRabbit\n\n```js\n$('form').on('keyup', 'input', WhiteRabbit.stop(500, function () {\n\tconsole.log(this.value);\n}));\n```\n\nCheck out `examples/browser.html` for more examples.\n\n## Browser side\n\nUse the distributed versions of WhiteRabbit found in the\n`dist` folder of the git repo:\n[https://github.com/DrPheltRight/whiterabbit]().\n\nIf you want to compile your own clone the git repo and then\nrun `cake build`.\n\n## Server side\n\nInstall using NPM like so:\n\n\tnpm install whiterabbit\n\n## License\n\nMIT\n\n## Author\n\nLuke Morton","maintainers":[{"name":"drpheltright","email":"lukemorton.designs@gmail.com"}],"time":{"modified":"2012-01-12T21:54:59.180Z","created":"2012-01-12T21:54:57.172Z","0.1.0":"2012-01-12T21:54:59.180Z"},"author":{"name":"Luke Morton","email":"lukemorton.designs@gmail.com","url":"http://lukemorton.co.uk"},"repository":{"type":"git","url":"git://github.com/DrPheltRight/whiterabbit.git"},"_attachments":{"WhiteRabbit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jKwyBUvTYUV0g4aGQov98A==","length":2422,"stub":true}}}},
{"id":"WoD-Dice","key":"WoD-Dice","value":{"rev":"7-dfd78c667acf278d5485e9069863d1a5"},"doc":{"_id":"WoD-Dice","_rev":"7-dfd78c667acf278d5485e9069863d1a5","name":"WoD-Dice","description":"White-Wolf's Storytelling dice roller.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"WoD-Dice","description":"White-Wolf's Storytelling dice roller.","version":"0.0.1","homepage":"http://github.com/lsocrate/WoD-Dice","repository":{"type":"git","url":"git://github.com/lsocrate/WoD-Dice.git"},"author":{"name":"Luiz Sócrate","email":"luiz@socrate.com.br","url":"http://socrate.com.br/"},"main":"./index.js","keywords":["rpg","die","dice","wod"],"engines":{"node":"*"},"licenses":[{"type":"WTFPL","url":"http://github.com/lsocrate/WoD-Dice/raw/master/LICENSE"}],"_npmUser":{"name":"lsocrate","email":"luiz@socrate.com.br"},"_id":"WoD-Dice@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"c5d98affa5920c095a7b17b46103fb1e41168a57","tarball":"http://registry.npmjs.org/WoD-Dice/-/WoD-Dice-0.0.1.tgz"},"maintainers":[{"name":"lsocrate","email":"luiz@socrate.com.br"}]},"0.0.2":{"name":"WoD-Dice","description":"White-Wolf's Storytelling dice roller.","version":"0.0.2","homepage":"http://github.com/lsocrate/WoD-Dice","repository":{"type":"git","url":"git://github.com/lsocrate/WoD-Dice.git"},"author":{"name":"Luiz Sócrate","email":"luiz@socrate.com.br","url":"http://socrate.com.br/"},"main":"./index.js","keywords":["rpg","die","dice","wod"],"engines":{"node":"*"},"licenses":[{"type":"WTFPL","url":"http://github.com/lsocrate/WoD-Dice/raw/master/LICENSE"}],"_npmUser":{"name":"lsocrate","email":"luiz@socrate.com.br"},"_id":"WoD-Dice@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"ccca1e6730858bb1ee70a7d061d50ec57785426d","tarball":"http://registry.npmjs.org/WoD-Dice/-/WoD-Dice-0.0.2.tgz"},"maintainers":[{"name":"lsocrate","email":"luiz@socrate.com.br"}]},"0.0.3":{"name":"WoD-Dice","description":"White-Wolf's Storytelling dice roller.","version":"0.0.3","homepage":"http://github.com/lsocrate/WoD-Dice","repository":{"type":"git","url":"git://github.com/lsocrate/WoD-Dice.git"},"author":{"name":"Luiz Sócrate","email":"luiz@socrate.com.br","url":"http://socrate.com.br/"},"main":"./index.js","keywords":["rpg","die","dice","wod"],"engines":{"node":"*"},"licenses":[{"type":"WTFPL","url":"http://github.com/lsocrate/WoD-Dice/raw/master/LICENSE"}],"_npmUser":{"name":"lsocrate","email":"luiz@socrate.com.br"},"_id":"WoD-Dice@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a0ec173c892a81c3f2839d8f93b7bb6e00c4f8ec","tarball":"http://registry.npmjs.org/WoD-Dice/-/WoD-Dice-0.0.3.tgz"},"maintainers":[{"name":"lsocrate","email":"luiz@socrate.com.br"}]}},"readme":"## Usage\n\n```javascript\npool = new Pool(7); // create pool with 7 dice\npool = new Pool(); // create empty pool\npool.isWeak(); // Set pool as weak. 10's do not reroll and 1's cancel successes\npool.reroll(8); // Set pool to reroll 8 and above\nsuccesses = pool.roll(); // Roll pool and return successes\n\n// COMBO USE\nsuccesses = new Pool().addDice(8).penalty(2).isWeak().reroll(9).roll();\n```\n## LICENSE\n\n            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n                    Version 2, December 2004\n\n Copyright (C) 2012 Luiz Sócrate <luiz@socrate.com.br>\n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. You just DO WHAT THE FUCK YOU WANT TO.","maintainers":[{"name":"lsocrate","email":"luiz@socrate.com.br"}],"time":{"modified":"2012-04-23T14:54:21.745Z","created":"2012-03-22T01:20:53.491Z","0.0.1":"2012-03-22T01:20:57.757Z","0.0.2":"2012-03-22T02:17:21.306Z","0.0.3":"2012-04-23T14:54:21.745Z"},"author":{"name":"Luiz Sócrate","email":"luiz@socrate.com.br","url":"http://socrate.com.br/"},"repository":{"type":"git","url":"git://github.com/lsocrate/WoD-Dice.git"},"_attachments":{"WoD-Dice-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9bgnyCqGGPJES3AViqu86Q==","length":1617,"stub":true},"WoD-Dice-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JnOISdQ7eEUPHUnwvdGiAw==","length":1573,"stub":true},"WoD-Dice-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0SduH0zMN1rqmjxCqct0tw==","length":1512,"stub":true}}}},
{"id":"WolfyEventEmitter","key":"WolfyEventEmitter","value":{"rev":"3-917eb4bfccf8f2cba5a76d4116a76381"},"doc":{"_id":"WolfyEventEmitter","_rev":"3-917eb4bfccf8f2cba5a76d4116a76381","name":"WolfyEventEmitter","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"WolfyEventEmitter","version":"0.1.0","main":"src/EventEmitter","author":{"name":"Wolfy87"},"dependencies":{},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"WolfyEventEmitter@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1cdce2281eac45cf97a4eb9560b10d8b387bcd96","tarball":"http://registry.npmjs.org/WolfyEventEmitter/-/WolfyEventEmitter-0.1.0.tgz"},"maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]}},"readme":"# EventEmitter\n\n**Evented JavaScript for the browser**\n\nThis script adds the EventEmitter class to your browser or any other environment such as [node.js](http://nodejs.org/).\n\nSo you can listen for and emit events from what ever objects you choose.\n\nFor more information such as documentation and examples you can either skim over the rest of this readme or [visit the wiki](https://github.com/Wolfy87/EventEmitter/wiki). Any contribution to the wiki are much appreciated.\n\n## Example\n\n\t// Initialise the EventEmitter\n\tvar ee = new EventEmitter();\n\t\n\t// Initialise the listener function\n\tfunction myListener() {\n\t\tconsole.log('The foo event was emitted.');\n\t}\n\t\n\t// Add the listener\n\tee.addListener('foo', myListener);\n\t\n\t// Emit the foo event\n\tee.emit('foo'); // The listener function is now called\n\t\n\t// Remove the listener\n\tee.removeListener('foo', myListener);\n\t\n\t// Log the array of listeners to show that it has been removed\n\tconsole.log(ee.listeners('foo'));\n\n## Tests\n\nEventEmitter is tested and working in the following browsers.\n\n * Chrome\n * Firefox\n * Safari\n * Opera\n * IE 5+\n\nIf you test it in something a little more obscure, please let me know how it turned out.\n\nTo test, simply run `test.html` in the test folder.\n\n## Author\n\nEventEmitter was written by [Oliver Caldwell](http://olivercaldwell.co.uk/).\n\n## Licence (MIT)\n\nCopyright (c) 2011 Oliver Caldwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}],"time":{"modified":"2012-03-18T00:06:45.083Z","created":"2012-03-18T00:06:44.514Z","0.1.0":"2012-03-18T00:06:45.083Z"},"author":{"name":"Wolfy87"},"_attachments":{"WolfyEventEmitter-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mfA0EFJ/a541uWt/xj+FyA==","length":18543,"stub":true}}}},
{"id":"YamYam","key":"YamYam","value":{"rev":"15-75d1f37828f8d5e0b8616dd6fc64040d"},"doc":{"_id":"YamYam","_rev":"15-75d1f37828f8d5e0b8616dd6fc64040d","name":"YamYam","description":"Markdown Language","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.1":{"name":"YamYam","description":"Markdown Language","version":"0.1.1","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"vows":"0.6.2","webmake":"0.3.6","uglify-js":"1.2.5"},"_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"YamYam@0.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6b7a97cd156ffbec0e1fe4b706cc6b9e6240137e","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.1.1.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.2.1":{"name":"YamYam","description":"Markdown Language","version":"0.2.1","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"vows":"0.6.2","webmake":"0.3.6","uglify-js":"1.2.5"},"bin":{"YamYam":"./bin/YamYam.js"},"_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"YamYam@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"196cb835fc2c6c74801244c4c40b23476437368b","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.2.1.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.2.2":{"name":"YamYam","description":"Markdown Language","version":"0.2.2","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"vows":"0.6.2","webmake":"0.3.6","uglify-js":"1.2.5"},"bin":{"YamYam":"./bin/YamYam.js"},"_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"YamYam@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"59059ce622e19bb01396aeb86f2ab435604cb3e8","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.2.2.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.2.3":{"name":"YamYam","description":"Markdown Language","version":"0.2.3","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"vows":"0.6.2","webpack":"0.1.x","uglify-js":"1.2.5"},"scripts":{"build":"node node_modules/webpack/bin/webpack --libary YamYam . js/YamYam.js && node node_modules/webpack/bin/webpack --libary YamYam --min . js/YamYam.min.js","test":"node node_modules/vows/bin/vows"},"bin":{"YamYam":"./bin/YamYam.js"},"_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"YamYam@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"39d3a3f41ba86782c9fcdb65f1c95c1b4999d368","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.2.3.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.2.4":{"name":"YamYam","description":"Markdown Language","version":"0.2.4","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"vows":"0.6.2","webpack":"0.3.x","uglify-js":"1.2.5"},"scripts":{"build":"node node_modules/webpack/bin/webpack --colors --libary YamYam . js/YamYam.js && node node_modules/webpack/bin/webpack --colors --libary YamYam --min . js/YamYam.min.js","test":"node node_modules/vows/bin/vows"},"bin":{"YamYam":"./bin/YamYam.js"},"_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"YamYam@0.2.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5e283a097d8478f47d0e96e9fdb9c6cb714a85dd","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.2.4.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.2.5":{"name":"YamYam","description":"Markdown Language","version":"0.2.5","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"vows":"0.6.2","webpack":"0.3.x","uglify-js":"1.2.5"},"scripts":{"build":"node node_modules/webpack/bin/webpack --colors --libary YamYam . js/YamYam.js && node node_modules/webpack/bin/webpack --colors --libary YamYam --min . js/YamYam.min.js","test":"node node_modules/vows/bin/vows"},"bin":{"YamYam":"./bin/YamYam.js"},"_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"YamYam@0.2.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"f5faf08531b844756109397d34cfa368b2993c9b","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.2.5.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.3.0":{"name":"YamYam","description":"Markdown Language","version":"0.3.0","author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"dependencies":{},"devDependencies":{"should":"0.6.x","mocha":"1.2.x","webpack":"0.4.x","uglify-js":"1.3.x"},"scripts":{"build":"node node_modules/webpack/bin/webpack --colors --libary YamYam . js/YamYam.js && node node_modules/webpack/bin/webpack --colors --libary YamYam --min . js/YamYam.min.js","test":"node node_modules/mocha/bin/_mocha"},"bin":{"YamYam":"./bin/YamYam.js"},"readme":"# YamYam\r\n\r\nYamYam is a simple kind of markdown compiler.\r\n\r\n## Syntax\r\n\r\nBasic things\r\n\r\n```\r\n# Headline\r\n\r\n## Headline 2\r\n\r\nText, *Text with accent*, _more of this_\r\nand even **more**... (and `code`)\r\n\r\n* list item\r\n* list item\r\n * list item\r\n\r\n[ ] check list item\r\n[X] check list item\r\n\r\n( ) radio list item\r\n(*) radio list item\r\n\r\nhttp://www.google.com\r\n[google](http://www.google.com)\r\n\r\na block of code with ```\r\n\r\n| A table | B1\r\n| A2 | B2 |\r\n| A3\r\n | B3\r\n```\r\n\r\nYamYam supports annotations in the markdown, which can be used for app-specific things\r\n\r\n```\r\n[section-annotation name=\"value\" name2=value2 name3='value3']\r\n\r\nAnnotations with following empty line mark sections of the document\r\n\r\n[annotation name = value]\r\n[annotation name = value2]\r\nAnnotations direct before a element annotated it.\r\nMultiple annotations supported\r\n```\r\n\r\n## API\r\n\r\n``` javascript\r\nvar YamYam = require(\"YamYam\");\r\n\r\n// YamYam.parse(source, function(err, result) {\r\n// YamYam.parse(source, options, function(err, result) {\r\nYamYam.parse(source, options, formater, function(err, result) {\r\n\t// ...\r\n});\r\n```\r\n\r\n### options\r\n\r\n``` javascript\r\nvar options = {\r\n\tparser: {\r\n\t\t// Nothing yet\r\n\t},\r\n\tformat: {\r\n\t\t// Options for the formater\r\n\t\t// depend on the used formater\r\n\t}\r\n}\r\n\r\nvar formatOptions = { // For HtmlFormater (default)\r\n\tannotations: {\r\n\t\t// maps annotation name to a function proccessing this type\r\n\t\t// example:\r\n\t\t\"@annotation\": function(attrs, annotation) {\r\n\t\t\t// annotation.name === \"@annotation\"\r\n\t\t\tattrs[\"class\"] = annotation.params[\"class\"];\r\n\t\t}\r\n\t},\r\n\tblock: undefined, // specify how sections are handled\r\n\t/*\r\n\t\tblock: false\r\n\t\t\tthe sections are emitted\r\n\t\t\t[ { annotations: [ ... ],\r\n\t\t\t\tcontent: \"...\" }, ... ]\r\n\t\tblock: 4 // number\r\n\t\t\tonly section number X will be returned\r\n\t\tblock: \"...\" // string\r\n\t\t\tonly sections which has an annotation named \"...\"\r\n\t\tblock: function(section, number) { ... } // function\r\n\t\t\ttrue, sections is included\r\n\t*/\r\n\tinline: false, // true, use only inline tags, no block level\r\n\t/* Tags config:\r\n\t\t{ tag: \"a\", href: \"http://www.google.com\" } // full config\r\n\tor: \"a\" // only tagname\r\n\tor: { // things with power: *xx*, `xx`, # xx\r\n\t\t\t\"1\": { tag: \"em\", ... },\r\n\t\t\t\"2\": \"strong\",\r\n\t\t\t\"default\": \"em\" // \"default\" is required!\r\n\t\t}\r\n\tor: \"\" // no tag\r\n\t*/\r\n\t// Example for list\r\n\t\"list\": \"ul\",\r\n\t\"listItem\", \"li\",\r\n\t// other tag config options:\r\n\t/*\r\n\t\t# elements\r\n\t\ttext: simple text\r\n\t\tchecklist, checklistItem\r\n\t\tradiolist, radiolistItem\r\n\t\tcode\r\n\t\tcodeContainer\r\n\t\tcodeLine\r\n\t\tcodeText\r\n\t\theadline\r\n\t\theadlineText\r\n\t\ttable, tableBody, tableHead\r\n\t\ttableRow, tableCell, tableHeadCell\r\n\t\tline: a line when multiline is possible (text, tableCell)\r\n\t\t# Inline\r\n\t\ttextItem\r\n\t\tlink\r\n\t\taccent\r\n\t\tcodeItem\r\n\t\timg\r\n\t*/\r\n\t/* advanced options:\r\n\t\tline: { tag:\"\", _prepend: \"<br/>\", _prependStart: \"\" }\r\n\t\t\"checklistItem\", {tag: \"div\", _prependContent: function(buffer, item) {\r\n\t\t\tbuffer.push(item.checked?\"&#9745;\":\"&#9744;\");\r\n\t\t\tbuffer.push(\"&nbsp;\");\r\n\t\t}}\r\n\t*/\r\n\t/* see lib/HtmlFormater.js for defaults */\r\n}\r\n```","_id":"YamYam@0.3.0","dist":{"shasum":"dd83cbf5cc19c3019129573670a9e6028546deeb","tarball":"http://registry.npmjs.org/YamYam/-/YamYam-0.3.0.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]}},"readme":"# YamYam\r\n\r\nYamYam is a simple kind of markdown compiler.\r\n\r\n## Syntax\r\n\r\nBasic things\r\n\r\n```\r\n# Headline\r\n\r\n## Headline 2\r\n\r\nText, *Text with accent*, _more of this_\r\nand even **more**... (and `code`)\r\n\r\n* list item\r\n* list item\r\n * list item\r\n\r\n[ ] check list item\r\n[X] check list item\r\n\r\n( ) radio list item\r\n(*) radio list item\r\n\r\nhttp://www.google.com\r\n[google](http://www.google.com)\r\n\r\na block of code with ```\r\n```\r\n\r\nYamYam supports annotations in the markdown, which can be used for app-specific things\r\n\r\n```\r\n[section-annotation name=\"value\" name2=value2 name3='value3']\r\n\r\nAnnotations with following empty line mark sections of the document\r\n\r\n[annotation name = value]\r\n[annotation name = value2]\r\nAnnotations direct before a element annotated it.\r\nMultiple annotations supported\r\n```\r\n\r\n## API\r\n\r\n``` javascript\r\nvar YamYam = require(\"YamYam\");\r\n\r\n// YamYam.parse(source, function(err, result) {\r\n// YamYam.parse(source, options, function(err, result) {\r\nYamYam.parse(source, options, formater, function(err, result) {\r\n\t// ...\r\n});\r\n```\r\n\r\n### options\r\n\r\n``` javascript\r\nvar options = {\r\n\tparser: {\r\n\t\t// Nothing yet\r\n\t},\r\n\tformater: {\r\n\t\t// Options for the formater\r\n\t\t// depend on the used formater\r\n\t}\r\n}\r\n\r\nvar formaterOptions = { // For HtmlFormater (default)\r\n\tannotations: {\r\n\t\t// maps annotation name to a function proccessing this type\r\n\t\t// example:\r\n\t\t\"@annotation\": function(attrs, annotation) {\r\n\t\t\t// annotation.name === \"@annotation\"\r\n\t\t\tattrs[\"class\"] = annotation.params[\"class\"];\r\n\t\t}\r\n\t},\r\n\tblock: undefined, // specify how sections are handled\r\n\t/*\r\n\t\tblock: false\r\n\t\t\tthe sections are emitted\r\n\t\t\t[ { annotations: [ ... ],\r\n\t\t\t\tcontent: \"...\" }, ... ]\r\n\t\tblock: 4 // number\r\n\t\t\tonly section number X will be returned\r\n\t\tblock: \"...\" // string\r\n\t\t\tonly sections which has an annotation named \"...\"\r\n\t\tblock: function(section, number) { ... } // function\r\n\t\t\ttrue, sections is included\r\n\t*/\r\n\tinline: false,\r\n\tlinesSeperator: \"<br/>\",\r\n\r\n\t// text\r\n\ttextTagname: \"p\", // inline: \"span\"\r\n\ttextOptionalPrepend: \"<br/><br/>\", // only inline\r\n\r\n\t// list\r\n\tlistTagname: \"ul\", // inline: \"span\"\r\n\tlistInnerTagname: \"li\", // inline: \"span\"\r\n\tlistOptionalPrepend: \"<br/><br/>\", // only inline\r\n\tlistItemsSeperator: \", \", // only inline\r\n\tsubListPrepend: \" (\", // only inline\r\n\tsubListAppend: \")\", // only inline\r\n\r\n\t// checklist\r\n\tchecklistTagname: \"div\", // inline: \"span\"\r\n\tchecklistInnerTagname: \"div\", // inline: \"span\"\r\n\tchecklistOptionalPrepend: \"<br/><br/>\", // only inline\r\n\tchecklistItemsSeperator: \", \", // only inline\r\n\tsubChecklistPrepend: \" (\", // only inline\r\n\tsubChecklistAppend: \")\", // only inline\r\n\r\n\t// radiolist\r\n\tradiolistTagname: \"div\", // inline: \"span\"\r\n\tradiolistInnerTagname: \"div\", // inline: \"span\"\r\n\tradiolistOptionalPrepend: \"<br/><br/>\", // only inline\r\n\tradiolistItemsSeperator: \", \", // only inline\r\n\tsubRadiolistPrepend: \" (\", // only inline\r\n\tsubRadiolistAppend: \")\", // only inline\r\n\r\n\t// headline\r\n\theadlineSubTagname: \"small\",\r\n\r\n\t// code\r\n\tcodeTagname: \"div\", // inline: span\r\n\tcodeInnerTagname: \"pre\", // inline: code\r\n\tcodeTextTagname: \"p\", // inline: span\r\n\r\n\t// formating\r\n\taccents: {\r\n\t\t\"1\": \"em\", // _xxx_\r\n\t\t\"2\": \"em\", // *xxx*\r\n\t\t\"3\": \"strong\", // __xxx__\r\n\t\t\"4\": \"strong\", // **xxx**\r\n\t\t\"default\": [\"em\", \"strong\"] // others\r\n\t},\r\n\tcode: {\r\n\t\t// same schema like accents\r\n\t\t// 1 = `xxx`, 2 = ``xxx``, ...\r\n\t\t\"default\": \"code\"\r\n\t}\r\n}\r\n```","maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}],"time":{"modified":"2012-07-03T09:32:46.931Z","created":"2012-02-28T23:52:11.670Z","0.1.1":"2012-02-28T23:52:14.849Z","0.2.1":"2012-02-29T23:29:37.503Z","0.2.2":"2012-03-01T09:56:53.212Z","0.2.3":"2012-03-12T23:21:56.472Z","0.2.4":"2012-04-07T15:51:16.874Z","0.2.5":"2012-05-05T20:23:33.153Z","0.3.0":"2012-07-03T09:32:46.931Z"},"author":{"name":"Tobias Koppers","url":"https://github.com/sokra"},"_attachments":{"YamYam-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+IDpsg2ev7XU+idJiS9ZTg==","length":12034,"stub":true},"YamYam-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-6uErpi1sE5Ji/+spPeWyWQ==","length":10141,"stub":true},"YamYam-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-N3tSt4Xux3TSmi0QDUXkEA==","length":9866,"stub":true},"YamYam-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Wi3AfyPPLhZ/kX4rMAogAA==","length":17109,"stub":true},"YamYam-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DjFL0M5Ad97mnWH8ibNRag==","length":10083,"stub":true},"YamYam-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KuA4SBHIR5kLIRQqHxUQfA==","length":10323,"stub":true},"YamYam-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Quq3D2NYbLFWTcSE6EpwGg==","length":9172,"stub":true}}}},
{"id":"YouAreDaChef","key":"YouAreDaChef","value":{"rev":"41-cc5ffaaffdfc6290cf9064cfe2c36516"},"doc":{"_id":"YouAreDaChef","_rev":"41-cc5ffaaffdfc6290cf9064cfe2c36516","name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","dist-tags":{"latest":"1.1.5"},"versions":{"0.0.1":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://reginald.braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"0.0.1","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3a2d7b604c21bbe665c3a90c046b42da651d5cff","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-0.0.1.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"0.0.2","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4d932b1dea49ca7ed976fcc33b7587b83eb587f7","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-0.0.2.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"0.0.3","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"de617e261baf46fbba65157875a64d9b18f7ec72","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-0.0.3.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"0.1.0","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"69208c9e1ddd36d5a4a67cff32aaab078a7ad6f7","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-0.1.0.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.0.1":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.0.1","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"576b3affcf7d8047bfb7fd6ad3a6eab7f929d4ca","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.0.1.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.0.2":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.0.2","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8c3cf05de1a5dd717fc8e725487bc62029f3769d","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.0.2.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.0.3":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.0.3","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"796523a4838aa7e3b6234460d8fc0f952d41a9c4","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.0.3.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.0.4":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.0.4","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c0fb38cfd4b45cf5f976a475ed8911149fb66f3e","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.0.4.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.1.0":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.1.0","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ad27a175673d1fd074a1c8042befe3f0655cf112","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.1.0.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.1.1":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.1.1","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ce8dcc0ba32766b803757a29ec02691ba0f13b47","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.1.1.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.1.2":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.1.2","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"cd1cf60a862ee4924013ffabf0a03355043f9ca1","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.1.2.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.1.3":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.1.3","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"57b511016e32adc53d1041bb35713e71085018fa","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.1.3.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.1.4":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.1.4","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"80c07243c34deb05f3f126e07a38bb5ab8d836f2","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.1.4.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"directories":{}},"1.1.5":{"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"name":"YouAreDaChef","description":"Coffeescript/Javascript method combinations","version":"1.1.5","homepage":"https://github.com/raganwald/YouAreDaChef","repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"main":"lib/YouAreDaChef.js","scripts":{"test":"jasmine-node --coffee --verbose spec"},"engines":{"node":"*"},"dependencies":{"underscore":">=1.2.2","UnderscoreMatchersForJasmine":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"raganwald","email":"raganwald@gmail.com"},"_id":"YouAreDaChef@1.1.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"28f73d8bb1f14bd142205f9117a389f1b1caaad8","tarball":"http://registry.npmjs.org/YouAreDaChef/-/YouAreDaChef-1.1.5.tgz"},"maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}]}},"readme":"You Are 'Da Chef\n===\n\nWhat is it?\n---\n\nThis library adds `before`, `after`, `around`, and `guard` method combinations to underscore.js projects, in much the same style as the Common Lisp Object System or Ruby on Rails controllers. With method combinations, you can easily separate concerns.\n\nFor example:\n\n    class Wumpus\n        roar: ->\n            # ...\n        run: ->\n            #...\n\n    class Hunter\n        draw: (bow) ->\n            # ...\n        quiver: ->\n            # ...\n        run: ->\n            #...\n\n    hydrate = (object) ->\n        # code that hydrates the object from storage\n\n    YouAreDaChef(Wumpus, Hunter)\n    \n        .before 'roar', 'draw', 'run', ->\n            hydrate(this)\n            \n        .after 'roar', 'draw', ->\n            @trigger 'action'\n            \n        .after 'run', ->\n            @trigger 'move'\n            \nYou can even use regular expressions to specify pointcuts:\n\n    class EnterpriseyLegume\n      setId:         (@id)         ->\n      setName:       (@name)       ->\n      setDepartment: (@department) ->\n      setCostCentre: (@costCentre) ->\n    \n    YouAreDaChef(EnterpriseyLegume)\n    \n      .around /set(.*)/, (pointcut, match, value) ->\n        performTransaction () ->\n          writeToLog \"#{match[1]}: #{value}\"\n          pointcut(value)\n    \n\nIs it any good?\n---\n\n[Yes][y].\n\n[y]: http://news.ycombinator.com/item?id=3067434\n\nCan I use it with pure Javascript?\n---\n\n[Yes][js].\n\nCan I install it with npm?\n---\n\nYes:\n\n    npm install YouAreDaChef\n\nWill it make me smarter?\n---\n\nNo, but it can make you *appear* smarter. Just explain that *guard advice is a monad*:\n    \n    YouAreDaChef(EnterpriseyLegume)\n    \n      .guard /write(.*)/, ->\n        @user.hasPermission('write', match[1])\n\nGuard advice works like a before combination, with the bonus that if it returns something falsely, the pointcut will not be executed. This behaviour is similar to the way ActiveRecord callbacks work.\n\nYou can also try making a [cryptic][cry] reference to a [computed][comp], non-local [COMEFROM][cf]. \n\n[cf]: http://en.wikipedia.org/wiki/COMEFROM\n[cry]: http://www.reddit.com/r/programming/comments/m4r4t/aspectoriented_programming_in_coffeescript_with_a/c2yfx6w\n[comp]: http://en.wikipedia.org/wiki/Goto#Computed_GOTO\n\nWhere can I read more?\n---\n\n[Separating Concerns in Coffeescript using Aspect-Oriented Programming][blog]\n\n[js]: https://github.com/raganwald/YouAreDaChef/blob/master/lib/YouAreDaChef.js\n[blog]: https://github.com/raganwald/homoiconic/blob/master/2011/11/YouAreDaChef.md#readme","maintainers":[{"name":"raganwald","email":"raganwald@gmail.com"}],"time":{"modified":"2012-05-10T00:36:19.229Z","created":"2011-11-28T22:23:25.037Z","0.0.1":"2011-11-28T22:23:25.513Z","0.0.2":"2012-05-01T01:36:36.768Z","0.0.3":"2012-05-04T16:59:04.583Z","0.1.0":"2012-05-04T19:24:35.237Z","1.0.1":"2012-05-06T14:07:02.725Z","1.0.2":"2012-05-07T00:04:39.865Z","1.0.3":"2012-05-07T03:34:31.680Z","1.0.4":"2012-05-07T03:50:11.543Z","1.1.0":"2012-05-07T16:16:08.418Z","1.1.1":"2012-05-07T18:08:43.471Z","1.1.2":"2012-05-09T17:11:47.791Z","1.1.3":"2012-05-09T18:34:15.996Z","1.1.4":"2012-05-09T21:44:01.156Z","1.1.5":"2012-05-10T00:36:19.229Z"},"author":{"name":"Reg Braithwaite","email":"raganwald@gmail.com","url":"http://braythwayt.com"},"repository":{"type":"git","url":"git://github.com/raganwald/YouAreDaChef.git"},"_attachments":{"YouAreDaChef-1.1.5.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-6SfRCWPukrd64NuYvMXXAg==","length":12490,"stub":true},"YouAreDaChef-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-WXUF0A7k2l8j/q93zrMT7w==","length":10080,"stub":true},"YouAreDaChef-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-uZU8SYiTpZjqIrUPkDXQiw==","length":9405,"stub":true},"YouAreDaChef-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-RhxcZtMKrDBg9gWGf54E+g==","length":9465,"stub":true},"YouAreDaChef-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-mNkabRbOzwBjNG7AhANjnw==","length":9053,"stub":true},"YouAreDaChef-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ZytidyLowMLVqGtUEInybQ==","length":9398,"stub":true},"YouAreDaChef-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-kSRfV0YY35x68G+RTwYqwg==","length":8709,"stub":true},"YouAreDaChef-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-gL1oGc7UqbG/gDzFI+uyjQ==","length":8641,"stub":true},"YouAreDaChef-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ltbUAVhxSz3TGjYJtZX8LA==","length":8402,"stub":true},"YouAreDaChef-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-FhMiRvAjAambOF+qhU9gcg==","length":8176,"stub":true},"YouAreDaChef-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ACF5ymJCW+bSUHpRq7aw5w==","length":7903,"stub":true},"YouAreDaChef-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oCoAm95K+FtXRNUyWmnZ5Q==","length":7810,"stub":true},"YouAreDaChef-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UXy5QD3pksdN5YsaBuIacA==","length":4749,"stub":true},"YouAreDaChef-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/GLNwqL3fAeEMgOfUEIXMQ==","length":10240,"stub":true}}}},
{"id":"_design/app","key":"_design/app","value":{"rev":"602-95f05e64d7e6eb60750116b5c5ffcfe6"},"doc":{"_id":"_design/app","_rev":"602-95f05e64d7e6eb60750116b5c5ffcfe6","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    v = doc.versions[v]\n    if (!v || !v.scripts) return\n    var out = {}\n    var any = false\n    for (var i in v.scripts) {\n      out[i] = v.scripts[i]\n      any = true\n    }\n    if (!any) return\n    out.maintainers = doc.maintainers\n    emit(doc._id, out)\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  }"}},"shows":{"package":"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}"},"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"}],"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":{}}},
{"id":"_design/ghost","key":"_design/ghost","value":{"rev":"96-aeb733e8b2ea177e25bdb3b7c30049b2"},"doc":{"_id":"_design/ghost","_rev":"96-aeb733e8b2ea177e25bdb3b7c30049b2","rewrites":[{"from":"/","method":"GET","to":"../app/../../../registry"},{"from":"/-/jsonp/:jsonp","method":"GET","to":"../app/_list/short/listAll"},{"from":"/_session","method":"GET","to":"../app/../../../_session"},{"from":"/_session","method":"PUT","to":"../app/../../../_session"},{"from":"/_session","method":"POST","to":"../app/../../../_session"},{"from":"/_session","method":"DELETE","to":"../app/../../../_session"},{"from":"/_session","method":"HEAD","to":"../app/../../../_session"},{"from":"/-/all/since","method":"GET","to":"../app/_list/index/modified"},{"from":"/-/rss","method":"GET","to":"../app/_list/rss/modified"},{"from":"/-/all","method":"GET","to":"../app/_list/index/listAll"},{"from":"/-/all/-/jsonp/:jsonp","method":"GET","to":"../app/_list/index/listAll"},{"from":"/-/short","method":"GET","to":"../app/_list/short/listAll"},{"from":"/-/scripts","method":"GET","to":"../app/_list/scripts/scripts"},{"from":"/-/by-field","method":"GET","to":"../app/_list/byField/byField"},{"from":"/-/fields","method":"GET","query":{"group":"true"},"to":"../app/_list/sortCount/fieldsInUse"},{"from":"/-/needbuild","method":"GET","to":"../app/_list/needBuild/needBuild"},{"from":"/-/prebuilt","method":"GET","to":"../app/_list/preBuilt/needBuild"},{"from":"/-/nonlocal","method":"GET","to":"../app/_list/short/nonlocal"},{"from":"/favicon.ico","method":"GET","to":"../app/../../npm/favicon.ico"},{"from":"/-/users","method":"GET","to":"../../../public_users/_design/_auth/_list/index/listAll"},{"from":"/-/user/:user","method":"PUT","to":"../../../_users/:user"},{"from":"/-/user/:user/-rev/:rev","method":"PUT","to":"../../../_users/:user"},{"from":"/-/user/:user","method":"GET","to":"../../../public_users/:user"},{"from":"/_users/:user","method":"PUT","to":"../app/../../../_users/:user"},{"from":"/_users/:user","method":"GET","to":"../app/../../../_users/:user"},{"from":"/public_users/:user","method":"PUT","to":"../app/../../../public_users/:user"},{"from":"/public_users/:user","method":"GET","to":"../app/../../../public_users/:user"},{"from":"/-/user-by-email/:email","method":"GET","to":"../../../public_users/_design/_auth/_list/email/listAll"},{"from":"/-/top","method":"GET","query":{"group_level":1},"to":"../app/_view/npmTop"},{"from":"/-/by-user/:user","method":"GET","to":"../app/_list/byUser/byUser"},{"from":"/-/starred-by-user/:user","method":"GET","to":"../app/_list/byUser/starredByUser"},{"from":"/-/starred-by-package/:user","method":"GET","to":"../app/_list/byUser/starredByPackage"},{"from":"/:pkg","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/-/jsonp/:jsonp","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/:version","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/:version/-/jsonp/:jsonp","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/-/:att","method":"GET","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/:rev","method":"PUT","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/-rev/:rev","method":"PUT","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/:rev","method":"DELETE","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/-rev/:rev","method":"DELETE","to":"../app/../../:pkg/:att"},{"from":"/:pkg","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-tag/:tag","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-tag/:tag/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-pre/:pre","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-pre/:pre/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/-rev/:rev","method":"DELETE","to":"../app/../../:pkg"},{"from":"/-/_view/*","method":"GET","to":"../app/_view/*"},{"from":"/-/_list/*","method":"GET","to":"../app/_list/*"},{"from":"/-/_show/*","method":"GET","to":"../app/_show/*"}],"language":"javascript","attachments_md5":{}}},
{"id":"_design/scratch","key":"_design/scratch","value":{"rev":"70-270ff8b0a3a870d8c2215acaf687da7d"},"doc":{"_id":"_design/scratch","_rev":"70-270ff8b0a3a870d8c2215acaf687da7d","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    v = doc.versions[v]\n    if (!v || !v.scripts) return\n    var out = {}\n    var any = false\n    for (var i in v.scripts) {\n      out[i] = v.scripts[i]\n      any = true\n    }\n    if (!any) return\n    out.maintainers = doc.maintainers\n    emit(doc._id, out)\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  }"}},"shows":{"package":"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}"},"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"}],"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":{}}},
{"id":"a3","key":"a3","value":{"rev":"5-a25a42cbbd805999a33048ef71b23fb6"},"doc":{"_id":"a3","_rev":"5-a25a42cbbd805999a33048ef71b23fb6","name":"a3","description":"a3 loads any folder of code into an 'API Tree'","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.2":{"name":"a3","description":"a3 loads any folder of code into an 'API Tree'","version":"0.0.2","author":{"name":"Tadeusz Wójcik","email":"tadeuszwojcik@gmail.com"},"dependencies":{"coffee-script":"= 1.1.2"},"devDependencies":{"jasmine-node":"= 1.0.11"},"keywords":["module loader","loader","api tree"],"main":"./a3.js","repository":{"type":"git","url":"git@github.com:twojcik/a3.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"twojcik","email":"tadeuszwojcik@gmail.com"},"_id":"a3@0.0.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"de2ab9d8d3240d5bf48d78f10075df20601629b4","tarball":"http://registry.npmjs.org/a3/-/a3-0.0.2.tgz"},"maintainers":[{"name":"twojcik","email":"tadeuszwojcik@gmail.com"}]},"0.1.0":{"name":"a3","description":"a3 loads any folder of code into an 'API Tree'","version":"0.1.0","author":{"name":"Tadeusz Wójcik","email":"tadeuszwojcik@gmail.com"},"dependencies":{"coffee-script":"= 1.1.2"},"devDependencies":{"jasmine-node":"= 1.0.11"},"keywords":["module loader","loader","api tree"],"main":"./a3.js","repository":{"type":"git","url":"git@github.com:twojcik/a3.git"},"homepage":"https://github.com/twojcik/a3","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"twojcik","email":"tadeuszwojcik@gmail.com"},"_id":"a3@0.1.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"8afe9f152edef7fe430410b1e851954136f084bb","tarball":"http://registry.npmjs.org/a3/-/a3-0.1.0.tgz"},"maintainers":[{"name":"twojcik","email":"tadeuszwojcik@gmail.com"}]}},"maintainers":[{"name":"twojcik","email":"tadeuszwojcik@gmail.com"}],"time":{"modified":"2011-10-29T12:46:52.064Z","created":"2011-10-29T12:35:33.086Z","0.0.2":"2011-10-29T12:44:21.430Z","0.1.0":"2011-10-29T12:46:52.064Z"},"author":{"name":"Tadeusz Wójcik","email":"tadeuszwojcik@gmail.com"},"repository":{"type":"git","url":"git@github.com:twojcik/a3.git"},"_attachments":{"a3-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-tqj0rf5hF1rUHxqpC/7PEQ==","length":9677,"stub":true},"a3-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rjUqVMvcHq5V4ttDySt1VA==","length":9567,"stub":true}}}},
{"id":"aaronblohowiak-plugify-js","key":"aaronblohowiak-plugify-js","value":{"rev":"3-0272c269eacd0c86bfc1711566922577"},"doc":{"_id":"aaronblohowiak-plugify-js","_rev":"3-0272c269eacd0c86bfc1711566922577","name":"aaronblohowiak-plugify-js","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.6":{"name":"aaronblohowiak-plugify-js","author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"version":"1.0.6","main":"./uglify-js.js","bin":{"plugifyjs":"./bin/uglifyjs"},"repository":{"type":"git","url":"git@github.com:aaronblohowiak/UglifyJS.git"},"_id":"aaronblohowiak-plugify-js@1.0.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"945273f1818e65f7cf8dcfa62ebec9149b8eaedd","tarball":"http://registry.npmjs.org/aaronblohowiak-plugify-js/-/aaronblohowiak-plugify-js-1.0.6.tgz"},"scripts":{},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}]}},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}],"time":{"modified":"2011-08-08T00:18:38.441Z","created":"2011-08-08T00:18:37.881Z","1.0.6":"2011-08-08T00:18:38.441Z"},"author":{"name":"Aaron Blohowiak","email":"aaron.blohowiak@gmail.com","url":"http://aaronblohowiak.com"},"repository":{"type":"git","url":"git@github.com:aaronblohowiak/UglifyJS.git"},"_attachments":{"aaronblohowiak-plugify-js-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QWwAKE4d7Tpf9UfUybjSYQ==","length":54418,"stub":true}}}},
{"id":"aaronblohowiak-uglify-js","key":"aaronblohowiak-uglify-js","value":{"rev":"3-77844a6def6ec428d75caa0846c95502"},"doc":{"_id":"aaronblohowiak-uglify-js","_rev":"3-77844a6def6ec428d75caa0846c95502","name":"aaronblohowiak-uglify-js","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.6":{"name":"aaronblohowiak-uglify-js","author":{"name":"Mihai Bazon","email":"mihai.bazon@gmail.com","url":"http://mihai.bazon.net/blog"},"version":"1.0.6","main":"./uglify-js.js","bin":{"aaronblohowiak-uglifyjs":"./bin/uglifyjs"},"repository":{"type":"git","url":"git@github.com:aaronblohowiak/UglifyJS.git"},"_id":"aaronblohowiak-uglify-js@1.0.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e1f56da779451e4a932586669d25f7b86ed1c552","tarball":"http://registry.npmjs.org/aaronblohowiak-uglify-js/-/aaronblohowiak-uglify-js-1.0.6.tgz"},"scripts":{},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}]}},"maintainers":[{"name":"aaronblohowiak","email":"aaron.blohowiak@gmail.com"}],"time":{"modified":"2011-08-07T22:00:28.626Z","created":"2011-08-07T22:00:27.481Z","1.0.6":"2011-08-07T22:00:28.626Z"},"author":{"name":"Mihai Bazon","email":"mihai.bazon@gmail.com","url":"http://mihai.bazon.net/blog"},"repository":{"type":"git","url":"git@github.com:aaronblohowiak/UglifyJS.git"},"_attachments":{"aaronblohowiak-uglify-js-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lQG2R8kaA+vTTlGzVt2mtQ==","length":54320,"stub":true}}}},
{"id":"aasm-js","key":"aasm-js","value":{"rev":"3-01a48108d55909575440d9e0ef114f37"},"doc":{"_id":"aasm-js","_rev":"3-01a48108d55909575440d9e0ef114f37","name":"aasm-js","description":"CoffeeScript state machines","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"aasm-js","description":"CoffeeScript state machines","keywords":["state-machine","statemachine","aasm"],"author":{"name":"Chandra Patni"},"version":"1.0.0","licenses":[{"type":"MIT","url":"http://github.com/rubyorchard/aasm-js/raw/master/LICENSE"}],"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib"},"main":"./lib/aasm","homepage":"http://github.com/rubyorchard/aasm-js","repository":{"type":"git","url":"git://github.com/rubyorchard/aasm-js.git"},"devDependencies":{"coffee-script":"1.1.2","jasmine-node":"1.0.6"},"_npmJsonOpts":{"file":"/Users/blueprintlabs/.npm/aasm-js/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aasm-js@1.0.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e48a262201a207ff1cb3610b32cacde1b6047633","tarball":"http://registry.npmjs.org/aasm-js/-/aasm-js-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"cpatni","email":"chandra.patni@gmail.com"}]}},"maintainers":[{"name":"cpatni","email":"chandra.patni@gmail.com"}],"time":{"modified":"2011-08-28T09:19:52.845Z","created":"2011-08-28T09:19:51.620Z","1.0.0":"2011-08-28T09:19:52.845Z"},"author":{"name":"Chandra Patni"},"repository":{"type":"git","url":"git://github.com/rubyorchard/aasm-js.git"},"_attachments":{"aasm-js-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5nk1S+WGREoDlXkNpk+zCw==","length":17311,"stub":true}}}},
{"id":"abaaso","key":"abaaso","value":{"rev":"43-dcded5a8361da3e94e10cd0b272f8d3a"},"doc":{"_id":"abaaso","_rev":"43-dcded5a8361da3e94e10cd0b272f8d3a","name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","dist-tags":{"latest":"2.8.9"},"versions":{"2.8.0":{"author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com","url":"http://avoidwork.com/"},"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.0","homepage":"http://abaaso.com","repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"main":"debug/abaaso.js","engines":{"node":">=0.8"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{},"optionalDependencies":{},"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.0","dist":{"shasum":"569c02cee97468852d0776ad4200e83cdc2244cf","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.0.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.1":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.1","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.1","dist":{"shasum":"92f30e5f7a1d97c6d9add5984ec022eebb887bff","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.1.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.2":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.2","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.2","dist":{"shasum":"aacfbd594c576c283d2242206ad9294fc84672d1","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.2.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.3":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.3","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.3","dist":{"shasum":"deef1102dfd9659596bfc5221527fcc1ebb23e2c","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.3.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.4":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.4","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.4","dist":{"shasum":"42142977c513f36b619400edceb4e20c7a34f2b1","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.4.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.5":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.5","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.5","dist":{"shasum":"a670a48ae1b11f94e7d4b66a1144386d6556c274","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.5.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.51":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.51","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.51","dist":{"shasum":"4d28953209f5d9fc20147fcd1f29825637679b48","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.51.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.6":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.6","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"https://github.com/avoidwork/abaaso/blob/master/LICENSE-BSD-3"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"localStorage":">= 1.0.0","xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.6","dist":{"shasum":"5d0231db66174f54f56c6b5de42a8f8c2e29b2f8","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.6.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"directories":{}},"2.8.7":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.7","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"http://opensource.org/licenses/BSD-3-Clause"}],"main":"lib/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"localStorage":">= 1.0.0","xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n## How to build\n\n1. Install node.js & npm\n2. Run \"npm install grunt -g\"\n3. Run \"git clone git://github.com/avoidwork/abaaso.git\"\n4. Enter the abaaso directory & run \"grunt\" (this builds abaaso into _dist_ & runs the unit tests)\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.7","dist":{"shasum":"b33a3976fc337225ca0ddc911fc95f5fbffa8c58","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.7.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}]},"2.8.8":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.8","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"http://opensource.org/licenses/BSD-3-Clause"}],"main":"dist/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"localStorage":">= 1.0.0","xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n## How to build\n\n1. Install node.js & npm\n2. Run \"npm install grunt -g\"\n3. Run \"git clone git://github.com/avoidwork/abaaso.git\"\n4. Enter the abaaso directory & run \"grunt\" (this builds abaaso into _dist_ & runs the unit tests)\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.8","dist":{"shasum":"060c1d28a39839fd617ec2f86228cdfeef4d3690","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.8.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}]},"2.8.9":{"name":"abaaso","description":"Enterprise class, light weight, RESTful JavaScript framework that provides a set of classes and object prototyping to ease the creation and maintenance of pure JavaScript applications.","version":"2.8.9","homepage":"http://abaaso.com","author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"bugs":{"url":"https://github.com/avoidwork/abaaso/issues"},"licenses":[{"type":"BSD-3","url":"http://opensource.org/licenses/BSD-3-Clause"}],"main":"dist/abaaso","engines":{"node":">= 0.6.0"},"scripts":{"test":"grunt test"},"dependencies":{"localStorage":">= 1.0.0","xmlhttprequest":">=1.4"},"devDependencies":{"grunt":"~0.3.12"},"keywords":[],"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n* node.js & npm (npm install abaaso)\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n## How to build\n\n1. Install node.js & npm\n2. Run \"npm install grunt -g\"\n3. Run \"git clone git://github.com/avoidwork/abaaso.git\"\n4. Enter the abaaso directory & run \"grunt\" (this builds abaaso into _dist_ & runs the unit tests)\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","_id":"abaaso@2.8.9","dist":{"shasum":"766a653c8451ffabdaebd4b0691d927800860ca1","tarball":"http://registry.npmjs.org/abaaso/-/abaaso-2.8.9.tgz"},"maintainers":[{"name":"avoidwork","email":"jason@attack.io"}]}},"readme":"## What is Supported?\n\nAll standards compliant browsers and platforms such as Desktops, Tablets, Smartphones, Google TV, and more!\n\n* Microsoft Internet Explorer 8+ (Standards Mode)\n* Google Chrome 6+\n* Mozilla FireFox 3.6+\n* Apple Safari 5+\n* Opera 9+\n* Apple iPhone / iPod Touch / iPad\n* Google Android\n\n## Features\n\n* Automatic RESTful XHR / AJAX!\n* Hypermedia As The Engine Of Application State (HATEOAS) with a user defined HTTP header\n* Object Oriented Programming with classes, methods and chaining\n* Semantic classes & methods, easy to read and easy to say out loud\n* Helper function $() with DOM selectors\n* Advanced event handling with multiple Application States\n* Deep Setting with define()\n* Namespace is available on $\n\n\n## License\n\nabaaso is licensed under BSD-3 http://www.opensource.org/licenses/BSD-3-Clause\n\n### Copyright\n\nCopyright (c) 2010 - 2012, Jason Mulligan <jason.mulligan@avoidwork.com>","maintainers":[{"name":"avoidwork","email":"jason@attack.io"}],"time":{"modified":"2012-08-14T17:28:41.013Z","created":"2012-08-07T17:43:50.647Z","2.8.0":"2012-08-07T17:43:52.145Z","2.8.1":"2012-08-08T21:03:29.886Z","2.8.2":"2012-08-09T00:28:58.783Z","2.8.3":"2012-08-09T15:10:15.874Z","2.8.4":"2012-08-09T20:58:17.606Z","2.8.5":"2012-08-10T18:08:30.079Z","2.8.51":"2012-08-11T23:12:15.312Z","2.8.6":"2012-08-12T20:48:45.014Z","2.8.7":"2012-08-13T21:22:02.580Z","2.8.8":"2012-08-13T23:57:48.349Z","2.8.9":"2012-08-14T17:28:41.012Z"},"author":{"name":"Jason Mulligan","email":"jason.mulligan@avoidwork.com"},"repository":{"type":"git","url":"git://github.com/avoidwork/abaaso.git"},"_attachments":{"abaaso-2.8.9.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-GkPxL4UKIbzvMEkcZN3AbA==","length":104853,"stub":true},"abaaso-2.8.8.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-f9sf24/oLCDCLRn+coc1Kw==","length":102360,"stub":true},"abaaso-2.8.7.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-OErEMMqlm7gwWU6ZUWgRsg==","length":102375,"stub":true},"abaaso-2.8.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-fqwwAtNxRBekUkfze9oFhw==","length":64901,"stub":true},"abaaso-2.8.51.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-LUW5CCjAtgNcds8baoxNYA==","length":64110,"stub":true},"abaaso-2.8.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-hLkDioyqn58Epo5kfESlsg==","length":64118,"stub":true},"abaaso-2.8.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-+RF0DQ7+0TlSqFNEXaS8MA==","length":65161,"stub":true},"abaaso-2.8.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-pVO3otY+ULIGhHjNTFbQ7g==","length":63537,"stub":true},"abaaso-2.8.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-SaTLFdWHj/2uZ0bwmLsH+g==","length":63537,"stub":true},"abaaso-2.8.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MGigsh6IITwQsk1x5pzQ9g==","length":63524,"stub":true},"abaaso-2.8.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cfyZZFfwX6sbh/pC4xXyPg==","length":60725,"stub":true}}}},
{"id":"abacus","key":"abacus","value":{"rev":"3-62098d553b1842bde6adf44e6f371e4c"},"doc":{"_id":"abacus","_rev":"3-62098d553b1842bde6adf44e6f371e4c","name":"abacus","description":"Counter library with statsD support","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"abacus","version":"0.0.1","description":"Counter library with statsD support","main":"lib/abacus.js","scripts":{"test":"test/suite.js"},"repository":{"type":"git","url":"https://github.com/thedeveloper/abacus"},"keywords":["Abacus","counters","statsd","graphite","statistics","metrics"],"author":{"name":"Geoff Wagstaff"},"license":"MIT","dependencies":{"config":"~0.4.15","debug":"~0.7.0","node-statsd":"0.0.2"},"readme":"### Abacus\nA simple node.js module to count, report, and plot application metrics.\n\n#### Install\n    npm install abacus\n    \n#### Usage\n````\nvar metrics = require('abacus');\nvar config = {\n  statsD: {\n    connection:{\n      host: 'localhost',\n      port: 5007\n    },\n    // This is the prefix for all metric names sent to statsD / graphite\n    metricPrefix: 'apps.abacus.'\n  }\n}\n\nvar metrics = new abacus(config);\n\nmetrics.increment('metricName');\nmetrics.increment('incrementByFive', 5);\n\n// Get value of metric\nmetrics.get('metricName');\n\n// Print a summary of counters to STDOUT every 10 seconds. Remember to set DEBUG environment variable\nmetrics.printPeriodically(10)\n````\n\n#### Configuration\nAbacus supports 2 configuration methods. It's compatable with [node-config](http://lorenwest.github.com/node-config/latest/), so if you're using node-config in your parent project you can set an abacus property in your configuration object and abacus will pick it up automatically.\n\nAlternatively, you can pass a configuration object directly to abacus on instantiation: `new abacus(config);`. See usage example.\n\n#### StatsD\nAbacus can be configured to send its counters to an instance of [StatsD](https://github.com/etsy/statsd/). You can configure the StatsD connection as shown in the example.\n\n#### Logging\nThis module uses [debug](https://github.com/visionmedia/debug/), and therefore obeys the same output control scheme. You can see all output from abacus by setting the environment variable DEBUG=*\n\nSub-sections of debug output can be controlled by setting for e.g. DEBUG=abacus:abacus. Read debug's documentation for more on output control.","_id":"abacus@0.0.1","dist":{"shasum":"7b2f06aaca7c0b7066c1ab0eff78f6eeb7a7f874","tarball":"http://registry.npmjs.org/abacus/-/abacus-0.0.1.tgz"},"maintainers":[{"name":"TheDeveloper","email":"geoff@gosquared.com"}]}},"readme":"### Abacus\nA simple node.js module to count, report, and plot application metrics.\n\n#### Install\n    npm install abacus\n    \n#### Usage\n````\nvar metrics = require('abacus');\nvar config = {\n  statsD: {\n    connection:{\n      host: 'localhost',\n      port: 5007\n    },\n    // This is the prefix for all metric names sent to statsD / graphite\n    metricPrefix: 'apps.abacus.'\n  }\n}\n\nvar metrics = new abacus(config);\n\nmetrics.increment('metricName');\nmetrics.increment('incrementByFive', 5);\n\n// Get value of metric\nmetrics.get('metricName');\n\n// Print a summary of counters to STDOUT every 10 seconds. Remember to set DEBUG environment variable\nmetrics.printPeriodically(10)\n````\n\n#### Configuration\nAbacus supports 2 configuration methods. It's compatable with [node-config](http://lorenwest.github.com/node-config/latest/), so if you're using node-config in your parent project you can set an abacus property in your configuration object and abacus will pick it up automatically.\n\nAlternatively, you can pass a configuration object directly to abacus on instantiation: `new abacus(config);`. See usage example.\n\n#### StatsD\nAbacus can be configured to send its counters to an instance of [StatsD](https://github.com/etsy/statsd/). You can configure the StatsD connection as shown in the example.\n\n#### Logging\nThis module uses [debug](https://github.com/visionmedia/debug/), and therefore obeys the same output control scheme. You can see all output from abacus by setting the environment variable DEBUG=*\n\nSub-sections of debug output can be controlled by setting for e.g. DEBUG=abacus:abacus. Read debug's documentation for more on output control.","maintainers":[{"name":"TheDeveloper","email":"geoff@gosquared.com"}],"time":{"modified":"2012-07-10T14:18:22.851Z","created":"2012-07-10T14:18:21.713Z","0.0.1":"2012-07-10T14:18:22.851Z"},"author":{"name":"Geoff Wagstaff"},"repository":{"type":"git","url":"https://github.com/thedeveloper/abacus"},"_attachments":{"abacus-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SD/IdM90t29kMsdkIzjreA==","length":6623,"stub":true}}}},
{"id":"abbrev","key":"abbrev","value":{"rev":"16-e17a2b6c7360955b950edf2cb2ef1602"},"doc":{"_id":"abbrev","_rev":"16-e17a2b6c7360955b950edf2cb2ef1602","name":"abbrev","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.1":{"name":"abbrev","version":"1.0.1","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"main":"./lib/abbrev","scripts":{"test":"node lib/abbrev.js"},"_id":"abbrev@1.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/abbrev/-/abbrev-1.0.1.tgz"},"directories":{}},"1.0.2":{"name":"abbrev","version":"1.0.2","description":"Like ruby's abbrev module, but in js","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"main":"./lib/abbrev","scripts":{"test":"node lib/abbrev.js"},"_id":"abbrev@1.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/abbrev/-/abbrev-1.0.2.tgz"},"directories":{}},"1.0.3":{"name":"abbrev","version":"1.0.3","description":"Like ruby's abbrev module, but in js","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"main":"./lib/abbrev.js","scripts":{"test":"node lib/abbrev.js"},"repository":{"type":"git","url":"git://github.com/isaacs/abbrev-js.git"},"_id":"abbrev@1.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.0rc7","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"aa049c967f999222aa42e14434f0c562ef468241","tarball":"http://registry.npmjs.org/abbrev/-/abbrev-1.0.3.tgz"}}},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"description":"Like ruby's abbrev module, but in js","time":{"modified":"2011-03-24T23:01:55.678Z","created":"2011-03-21T22:21:11.183Z","1.0.1":"2011-03-21T22:21:11.183Z","1.0.2":"2011-03-21T22:21:11.183Z","1.0.3":"2011-03-21T22:21:11.183Z","1.0.3-1":"2011-03-24T23:01:19.581Z"},"repository":{"type":"git","url":"git://github.com/isaacs/abbrev-js.git"},"_attachments":{"abbrev-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-H3GsHCM/UnEgGLYPn5JiOQ==","length":1526,"stub":true},"abbrev-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-aa0/OCTkahHzHyfA85m1fQ==","length":1755,"stub":true},"abbrev-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BxxLgU1hJ5UDf/50SmjDGA==","length":1943,"stub":true}}}},
{"id":"abc","key":"abc","value":{"rev":"3-a0799e9a5ebcc330c8a86b14abe4435e"},"doc":{"_id":"abc","_rev":"3-a0799e9a5ebcc330c8a86b14abe4435e","name":"abc","description":"Misc js helpers","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"abc","author":{"name":"Golubev Fedor","email":"gregof@yandex.ru","url":"http://github.com/gregof"},"description":"Misc js helpers","version":"0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.4.0 <0.7.0"},"repository":{"type":"git","url":"git://github.com/gregof/abc.git"},"main":"./index.js","_npmUser":{"name":"gregof","email":"gregof@yandex.ru"},"_id":"abc@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"920234dfda70284cfd4754b5ad74587588fedeec","tarball":"http://registry.npmjs.org/abc/-/abc-0.1.0.tgz"},"readme":"","maintainers":[{"name":"gregof","email":"gregof@yandex.ru"}]}},"readme":"","maintainers":[{"name":"gregof","email":"gregof@yandex.ru"}],"time":{"modified":"2012-07-19T08:00:27.186Z","created":"2012-07-19T08:00:25.424Z","0.1.0":"2012-07-19T08:00:27.186Z"},"author":{"name":"Golubev Fedor","email":"gregof@yandex.ru","url":"http://github.com/gregof"},"repository":{"type":"git","url":"git://github.com/gregof/abc.git"},"_attachments":{"abc-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4vCZE+n+pCrg3rW+P7AIXg==","length":2883,"stub":true}}}},
{"id":"abhispeak","key":"abhispeak","value":{"rev":"5-9889431f68ec10212db3be91796608e2"},"doc":{"_id":"abhispeak","_rev":"5-9889431f68ec10212db3be91796608e2","name":"abhispeak","description":"Finally, lorem ipsum worth reading.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"abhispeak","version":"0.0.1","description":"Finally, lorem ipsum worth reading.","keywords":["lorem","ipsum","lipsum","filler","text"],"homepage":"http://mertonium.com","author":{"name":"John Mertens","email":"john@mertonium.com","url":"http://mertonium.com"},"repository":{"type":"git","url":"git://github.com/mertonium/abhispeak-node.git"},"dependencies":{"underscore":"1.1.7"},"engines":{"node":">=0.4.7"},"main":"lib/abhispeak.js","_npmJsonOpts":{"file":"/Users/mertonium/.npm/abhispeak/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"abhispeak@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5aa1ef06d6e5a2c920d456a65d98b450ef256fab","tarball":"http://registry.npmjs.org/abhispeak/-/abhispeak-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"mertonium","email":"john.mertens\b\b@gmail.com"}]},"0.0.2":{"name":"abhispeak","version":"0.0.2","description":"Finally, lorem ipsum worth reading.","keywords":["lorem","ipsum","lipsum","filler","text"],"homepage":"http://mertonium.com","author":{"name":"John Mertens","email":"john@mertonium.com","url":"http://mertonium.com"},"repository":{"type":"git","url":"git://github.com/mertonium/abhispeak-node.git"},"dependencies":{"underscore":"1.1.7"},"engines":{"node":">=0.4.7"},"main":"lib/abhispeak.js","_npmJsonOpts":{"file":"/Users/mertonium/.npm/abhispeak/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"abhispeak@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7bcf5b75d0720f236e253d6f7031822ed3ef0e1b","tarball":"http://registry.npmjs.org/abhispeak/-/abhispeak-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"mertonium","email":"john.mertens\b\b@gmail.com"}]}},"maintainers":[{"name":"mertonium","email":"john.mertens\b\b@gmail.com"}],"time":{"modified":"2011-09-22T07:27:28.435Z","created":"2011-09-22T07:23:29.618Z","0.0.1":"2011-09-22T07:23:30.581Z","0.0.2":"2011-09-22T07:27:28.435Z"},"author":{"name":"John Mertens","email":"john@mertonium.com","url":"http://mertonium.com"},"repository":{"type":"git","url":"git://github.com/mertonium/abhispeak-node.git"},"_attachments":{"abhispeak-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Z7nNX8t5zf1xXA/TGAnDNQ==","length":2038,"stub":true},"abhispeak-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-046429w0lv/yHkPZcb21QA==","length":2032,"stub":true}}}},
{"id":"ability","key":"ability","value":{"rev":"15-16a71d3ff7274ba650f73726ea70adcb"},"doc":{"_id":"ability","_rev":"15-16a71d3ff7274ba650f73726ea70adcb","name":"ability","description":"A simple route-based ACL component for expressjs.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"ability","version":"0.0.2","homepage":"https://github.com/scottkf/ability-js/","repository":{"type":"git","url":"git://github.com/scottkf/ability-js.git"},"engines":["node >= 0.4.0"],"description":"A simple route-based ACL component for expressjs.","author":{"name":"Scott Tesoriere","email":"scott@tesoriere.com","url":"https://tesoriere.com/"},"keywords":["acl","everyauth","express"],"main":"./index.js","dependencies":{"express":">= 2.2.2"},"_npmUser":{"name":"scottkf","email":"scott@tesoriere.com"},"_id":"ability@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"11d269d35918af5ce020615a6ed1f434928e5058","tarball":"http://registry.npmjs.org/ability/-/ability-0.0.2.tgz"},"maintainers":[{"name":"scottkf","email":"scott@tesoriere.com"}],"directories":{}},"0.0.1":{"name":"ability","version":"0.0.1","homepage":"https://github.com/scottkf/ability-js/","repository":{"type":"git","url":"git://github.com/scottkf/ability-js.git"},"engines":["node >= 0.4.0"],"description":"A simple route-based ACL component for expressjs.","author":{"name":"Scott Tesoriere","email":"scott@tesoriere.com","url":"https://tesoriere.com/"},"keywords":["acl","everyauth","express"],"main":"./index.js","dependencies":{"express":">= 2.2.2"},"_npmUser":{"name":"scottkf","email":"scott@tesoriere.com"},"_id":"ability@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"63544c29886a231583b3e1d1afc95d2877f63d76","tarball":"http://registry.npmjs.org/ability/-/ability-0.0.1.tgz"},"maintainers":[{"name":"scottkf","email":"scott@tesoriere.com"}]},"0.0.3":{"name":"ability","version":"0.0.3","homepage":"https://github.com/scottkf/ability-js/","repository":{"type":"git","url":"git://github.com/scottkf/ability-js.git"},"engines":["node >= 0.4.0"],"description":"A simple route-based ACL component for expressjs.","author":{"name":"Scott Tesoriere","email":"scott@tesoriere.com","url":"https://tesoriere.com/"},"keywords":["acl","everyauth","express"],"main":"./index.js","dependencies":{"express":">= 2.2.2"},"_npmUser":{"name":"scottkf","email":"scott@tesoriere.com"},"_id":"ability@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"30d783f9e19c57425281877f87c6b65ff2fa0b0d","tarball":"http://registry.npmjs.org/ability/-/ability-0.0.3.tgz"},"maintainers":[{"name":"scottkf","email":"scott@tesoriere.com"}]}},"maintainers":[{"name":"scottkf","email":"scott@tesoriere.com"}],"time":{"modified":"2011-10-14T14:41:50.411Z","created":"2011-10-13T17:46:53.848Z","0.0.1":"2011-10-13T17:46:54.465Z","0.0.2":"2011-10-14T11:51:58.216Z","0.0.3":"2011-10-14T14:41:50.411Z"},"author":{"name":"Scott Tesoriere","email":"scott@tesoriere.com","url":"https://tesoriere.com/"},"repository":{"type":"git","url":"git://github.com/scottkf/ability-js.git"},"_attachments":{"ability-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-5/FxkCxNkR8WlbWnkubssQ==","length":10240,"stub":true},"ability-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-c+Mjdg6g/yBDDrqgXpWOUQ==","length":10240,"stub":true},"ability-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-LwIjn4I0Yof+bJr4OZJODg==","length":10240,"stub":true}}}},
{"id":"abiogenesis","key":"abiogenesis","value":{"rev":"15-5f4d6c891284f4355b66cceb1d355839"},"doc":{"_id":"abiogenesis","_rev":"15-5f4d6c891284f4355b66cceb1d355839","name":"abiogenesis","description":"The start of all things.","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"drip":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","chai-timers":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"70d19f78ff9318a5e10da0ebc93ed0b504501a8d","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.1.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.1.1":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.1.1","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"drip":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","chai-timers":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ee8aca6ed40e0bbc0393ce9ff181583d61e7c4bd","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.1.1.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.2.0":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.2.0","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"drip":"0.3.x","super":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.2.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f8fbe2b1a5e232e94659f9e197adae446152f310","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.2.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.2.1":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.2.1","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"drip":"0.3.x","super":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.2.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"42730afc16a735aa30c1532f7b21eba35f07cf6d","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.2.1.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.3.0":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.3.0","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"breeze":"0.2.x","drip":"0.3.x","super":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.3.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2b84e9fd9a0d4304573b104ef48ef254f664581d","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.3.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.3.1":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.3.1","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"breeze":"0.3.x","drip":"0.3.x","super":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.3.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"141d8fa75581b93020ac0b0a0180666878524053","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.3.1.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.3.2":{"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"name":"abiogenesis","description":"The start of all things.","version":"0.3.2","repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{"breeze":"0.3.x","drip":"0.3.x","super":"0.2.x"},"devDependencies":{"chai":"*","chai-spies":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"abiogenesis@0.3.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"4de1e59e7282ae9a2e85a8e4cb9bf88845e7330f","tarball":"http://registry.npmjs.org/abiogenesis/-/abiogenesis-0.3.2.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]}},"readme":"# Abiogenesis\n\n> The start of all things.\n\n\n","maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}],"time":{"modified":"2012-07-15T21:10:14.003Z","created":"2012-05-24T08:49:42.135Z","0.1.0":"2012-05-24T08:49:43.159Z","0.1.1":"2012-05-24T23:13:59.700Z","0.2.0":"2012-06-15T06:57:22.204Z","0.2.1":"2012-06-15T16:49:34.334Z","0.3.0":"2012-06-18T09:08:04.259Z","0.3.1":"2012-07-09T19:38:16.800Z","0.3.2":"2012-07-15T21:10:14.003Z"},"author":{"name":"Jake Luer","email":"jake@qualiancy.com","url":"http://qualiancy.com"},"repository":{"type":"git","url":"git://github.com/qualiancy/abiogenesis.git"},"_attachments":{"abiogenesis-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-jSG8GVwMe36XVXurafgEvQ==","length":7459,"stub":true},"abiogenesis-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-X/ORj/JpLqmTpSM5VGCZbw==","length":7452,"stub":true},"abiogenesis-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-cRiERwj5kz4C8XuQTu5x0A==","length":7425,"stub":true},"abiogenesis-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Hei7tuQhrIaTfHOa+qEUpA==","length":5683,"stub":true},"abiogenesis-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tESXJ9f8SENgiq19UxmAug==","length":5581,"stub":true},"abiogenesis-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WTzF9TYD9X4mky7n7lkAqg==","length":5594,"stub":true},"abiogenesis-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VbBfHXjlg2iLvOOPe3KnFg==","length":5570,"stub":true}}}},
{"id":"abnf","key":"abnf","value":{"rev":"9-e98e466e326989b9839650dd669c9103"},"doc":{"_id":"abnf","_rev":"9-e98e466e326989b9839650dd669c9103","name":"abnf","description":"Augmented Backus-Naur Form (ABNF) parsing.  See RFC 5234.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.0":{"author":{"name":"Joe Hildebrand","email":"joe-github@cursive.net"},"name":"abnf","description":"Augmented Backus-Naur Form (ABNF) parsing.  See RFC 4234.","version":"0.0.0","homepage":"https://github.com/hildjj/node-abnf","repository":{"url":"git://github.com/hildjj/node-abnf.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/abnf","dependencies":{"reparse":"~0.1.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"~0.6.18"},"_npmUser":{"name":"hildjj","email":"joe-github@cursive.net"},"_id":"abnf@0.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"ast":"bin/ast","check_refs":"bin/check_refs"},"dist":{"shasum":"5176fbfcc203f939b50ca4ec8985b29b98867bff","tarball":"http://registry.npmjs.org/abnf/-/abnf-0.0.0.tgz"},"maintainers":[{"name":"hildjj","email":"joe-github@cursive.net"}]},"0.0.1":{"author":{"name":"Joe Hildebrand","email":"joe-github@cursive.net"},"name":"abnf","description":"Augmented Backus-Naur Form (ABNF) parsing.  See RFC 5234.","version":"0.0.1","homepage":"https://github.com/hildjj/node-abnf","repository":{"url":"git://github.com/hildjj/node-abnf.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/abnf","dependencies":{"reparse":"~0.1.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"~0.6.18"},"_npmUser":{"name":"hildjj","email":"joe-github@cursive.net"},"_id":"abnf@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"ast":"bin/ast","check_refs":"bin/check_refs"},"dist":{"shasum":"d6f5eb23a7af3bcc84927ccd708aa204f36d3d6b","tarball":"http://registry.npmjs.org/abnf/-/abnf-0.0.1.tgz"},"maintainers":[{"name":"hildjj","email":"joe-github@cursive.net"}]},"0.0.2":{"author":{"name":"Joe Hildebrand","email":"joe-github@cursive.net"},"name":"abnf","description":"Augmented Backus-Naur Form (ABNF) parsing.  See RFC 5234.","version":"0.0.2","homepage":"https://github.com/hildjj/node-abnf","repository":{"url":"git://github.com/hildjj/node-abnf.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/abnf","dependencies":{"reparse":"~0.1.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"~0.6.18"},"_npmUser":{"name":"hildjj","email":"joe-github@cursive.net"},"_id":"abnf@0.0.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"ast":"bin/ast","check_refs":"bin/check_refs"},"dist":{"shasum":"98061558c5fca751b1f8676258de43937f8bf36b","tarball":"http://registry.npmjs.org/abnf/-/abnf-0.0.2.tgz"},"maintainers":[{"name":"hildjj","email":"joe-github@cursive.net"}]},"0.0.3":{"author":{"name":"Joe Hildebrand","email":"joe-github@cursive.net"},"name":"abnf","description":"Augmented Backus-Naur Form (ABNF) parsing.  See RFC 5234.","version":"0.0.3","homepage":"https://github.com/hildjj/node-abnf","repository":{"url":"git://github.com/hildjj/node-abnf.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/abnf","dependencies":{"reparse":"~0.1.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"~0.8.1"},"bin":{"ast":"bin/ast","check_refs":"bin/check_refs"},"readme":"# Parse ABNF grammars\n\nFor more information on ABNF, See [RFC5234](http://tools.ietf.org/html/rfc5234).\n\n## Installation:\n\n    npm install abnf\n\n## Example:\n\n    var abnf = require('abnf');\n    abnf.Parse(\"myfile.abnf\", function(er, rules) {\n    \tif (er) {\n    \t\tconsole.error(er);\n    \t} else {\n    \t\t// Do something with rules\n    \t}\n    });\n\n### .Parse(input, callback)\nParse the given input (string or readable stream), then call the\ncallback with an error (will be null on success) and a Rules object\n\n### .ParseFile(input, callback)\nParse the file with the given name, then call the\ncallback with an error (will be null on success) and a Rules object\n\n### Rules.defs\nA hash of Rule objects indexed by uppercase rulename.\n\n### Rules.refs\nAn array of RuleRef objects.\n\n### Rule.name\nThe name of the rule\n\n### Rule.line\nThe line in the input file where the rule name was defined\n\n### Rule.def\nThe definition of the rule.  More information forthcoming.\n\n### RuleRef.name\nThe name of the rule that was referenced\n\n### RuleRef.line\nThe line in the input file where the rule name was referenced.\n","_id":"abnf@0.0.3","dist":{"shasum":"d862989e08b37957ed23270afb705bb3c70670ef","tarball":"http://registry.npmjs.org/abnf/-/abnf-0.0.3.tgz"},"maintainers":[{"name":"hildjj","email":"joe-github@cursive.net"}]}},"readme":"Parse ABNF grammars\n\nExample:\n\n    var abnf = require('abnf');\n    abnf.Parse(\"myfile.abnf\", function(er, rules) {\n    \tif (er) {\n    \t\tconsole.error(er);\n    \t} else {\n    \t\t// Do something with rules\n    \t}\n    });\n\n### .Parse(input, callback)\nParse the given input (string, filename, or readable stream), then call the\ncallback with an error (will be null on success) and a Rules object\n\n### Rules.defs\nA hash of Rule objects indexed by uppercase rulename.\n\n### Rules.refs\nAn array of RuleRef objects.\n\n### Rule.name\nThe name of the rule\n\n### Rule.line\nThe line in the input file where the rule name was defined\n\n### Rule.def\nThe definition of the rule.  More information forthcoming.\n\n### RuleRef.name\nThe name of the rule that was referenced\n\n### RuleRef.line\nThe line in the input file where the rule name was referenced.\n","maintainers":[{"name":"hildjj","email":"joe-github@cursive.net"}],"time":{"modified":"2012-07-07T17:53:03.827Z","created":"2012-05-29T08:18:11.052Z","0.0.0":"2012-05-29T08:18:13.117Z","0.0.1":"2012-05-29T16:38:57.944Z","0.0.2":"2012-05-29T23:40:30.776Z","0.0.3":"2012-07-07T17:53:03.827Z"},"author":{"name":"Joe Hildebrand","email":"joe-github@cursive.net"},"repository":{"url":"git://github.com/hildjj/node-abnf.git"},"_attachments":{"abnf-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1FDOSkz2fIGbiBwL67km3A==","length":13657,"stub":true},"abnf-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-q21xEAqlbVZmgOB1F1j5Tg==","length":13663,"stub":true},"abnf-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GmGcV9mafcDSox5/4qbxAQ==","length":9867,"stub":true},"abnf-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5mKJsAHbN/osJJpns0C7tQ==","length":5577,"stub":true}}}},
{"id":"acceptance","key":"acceptance","value":{"rev":"13-39c1d73bd23f7865d4f0d81229e2b43d"},"doc":{"_id":"acceptance","_rev":"13-39c1d73bd23f7865d4f0d81229e2b43d","name":"acceptance","description":"Validate dynamic parameters against a predefined schema","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"acceptance","description":"Validate dynamic parameters against a predefined schema","keywords":["schema","validation","parameters"],"version":"0.1.0","author":{"name":"Bradley Griffiths","email":"bradley.griffiths@gmail.com"},"repository":{"type":"git","url":"git://github.com/bradleyg/acceptance.git"},"main":"./index.js","devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"bradleyg","email":"bradley.griffiths@gmail.com"},"_id":"acceptance@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"0a06be3fd08ddd11ae5ea8b421eac1903c45cbb9","tarball":"http://registry.npmjs.org/acceptance/-/acceptance-0.1.0.tgz"},"maintainers":[{"name":"bradleyg","email":"bradley.griffiths@gmail.com"}],"directories":{}},"0.1.1":{"name":"acceptance","description":"Validate dynamic parameters against a predefined schema","keywords":["schema","validation","parameters"],"version":"0.1.1","author":{"name":"Bradley Griffiths","email":"bradley.griffiths@gmail.com"},"repository":{"type":"git","url":"git://github.com/bradleyg/acceptance.git"},"main":"./index.js","devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"bradleyg","email":"bradley.griffiths@gmail.com"},"_id":"acceptance@0.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"ae8ce7f63fe0ddeeb1005f9086a9154b3744d8ed","tarball":"http://registry.npmjs.org/acceptance/-/acceptance-0.1.1.tgz"},"maintainers":[{"name":"bradleyg","email":"bradley.griffiths@gmail.com"}]},"0.1.2":{"name":"acceptance","description":"Validate dynamic parameters against a predefined schema","keywords":["schema","validation","parameters"],"version":"0.1.2","author":{"name":"Bradley Griffiths","email":"bradley.griffiths@gmail.com"},"repository":{"type":"git","url":"git://github.com/bradleyg/acceptance.git"},"main":"./index.js","devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"bradleyg","email":"bradley.griffiths@gmail.com"},"_id":"acceptance@0.1.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f0527aaa5f1048547b72862c7605f33e2580c1bc","tarball":"http://registry.npmjs.org/acceptance/-/acceptance-0.1.2.tgz"},"maintainers":[{"name":"bradleyg","email":"bradley.griffiths@gmail.com"}]},"0.1.3":{"name":"acceptance","description":"Validate dynamic parameters against a predefined schema","keywords":["schema","validation","parameters"],"version":"0.1.3","author":{"name":"Bradley Griffiths","email":"bradley.griffiths@gmail.com"},"repository":{"type":"git","url":"git://github.com/bradleyg/acceptance.git"},"main":"./index.js","devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"bradleyg","email":"bradley.griffiths@gmail.com"},"_id":"acceptance@0.1.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"fdd41f9d29530e2bc340be956e447e4613c054fa","tarball":"http://registry.npmjs.org/acceptance/-/acceptance-0.1.3.tgz"},"maintainers":[{"name":"bradleyg","email":"bradley.griffiths@gmail.com"}]}},"readme":"Validate parameters from an object (such as express's ```req.query```) and return any errors based on a schema defined.  \n\n```npm install acceptance```\n  \nAny parameters not defined in the schema will be discarded in the output ```a.accepted```  \n  \n```javascript\nvar accept = require('acceptance').accept;\n\nvar schema = {\n  name: {\n    required: true,\n    validation: { regex: /^[a-zA-Z0-9]+$/, message: 'Not alpha numeric' }\n  },\n  phone: {\n    required: false,\n    validation: { regex: /^-?[0-9]+$/, message: 'Not a valid integer' }\n  },\n  location: {\n    required: true,\n    validation: false\n  }\n}\n\nvar params = { name: 'bradley', phone: '012345hello', random: 'a random param' };\n\nvar a = accept(params, schema);\nif(a.errors) {\n  console.log(a.errors);\n}\nelse {\n  console.log(a.accepted);\n}\n```\nWill output:\n\n```json\n[ { field: 'phone', message: 'Not a valid integer' }, // Invalid match with regex\n  { field: 'location', message: 'Missing Field' } ]   // Not present in the params given\n```\n  \nRun the tests ```make test```  \n\n[![Build Status](https://secure.travis-ci.org/bradleyg/acceptance.png)](http://travis-ci.org/bradleyg/acceptance) ","maintainers":[{"name":"bradleyg","email":"bradley.griffiths@gmail.com"}],"time":{"modified":"2012-05-18T09:31:11.827Z","created":"2012-02-01T19:46:06.356Z","0.1.0":"2012-02-01T19:46:07.642Z","0.1.1":"2012-02-09T17:53:08.652Z","0.1.2":"2012-04-17T15:12:01.790Z","0.1.3":"2012-05-18T09:31:11.827Z"},"author":{"name":"Bradley Griffiths","email":"bradley.griffiths@gmail.com"},"repository":{"type":"git","url":"git://github.com/bradleyg/acceptance.git"},"_attachments":{"acceptance-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+Lkk6IVb8QTbGmxm5mUc6A==","length":1823,"stub":true},"acceptance-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ONYoi5JSE+79nb5ShoJYtg==","length":1888,"stub":true},"acceptance-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-PNSoX3JP/gfqFFzWeLHRsg==","length":2578,"stub":true},"acceptance-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AipAs7qlxs6Kir/4SdPUwA==","length":2566,"stub":true}}}},
{"id":"access","key":"access","value":{"rev":"7-7a234f0d8388236afa24ce85ef9cdd02"},"doc":{"_id":"access","_rev":"7-7a234f0d8388236afa24ce85ef9cdd02","name":"access","description":"access control resources, groups and modes by id","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"access","version":"0.1.0","description":"resource access control by id with groups and modes using redis-graph","main":"index.js","bin":{},"directories":{"test":"test"},"dependencies":{"redis-graph":"0.x.x"},"devDependencies":{"tap":"~0.2.5","redis":"~0.7.2"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/tblobaum/access.git"},"homepage":"https://github.com/tblobaum/access","keywords":["access","control","groups","modes","resources","redis","graph"],"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"license":"MIT","_id":"access@0.1.0","dist":{"shasum":"ec7cd6cd966d86abca1293f7137613caffb669d0","tarball":"http://registry.npmjs.org/access/-/access-0.1.0.tgz"},"readme":"","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}]},"0.2.0":{"name":"access","version":"0.2.0","description":"resource access control by id with groups and modes using redis-graph","main":"index.js","bin":{},"directories":{"test":"test"},"dependencies":{"redis-graph":"*","redis-multi-set":"*"},"devDependencies":{"tap":"~0.2.5","redis":"~0.7.2"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/tblobaum/access.git"},"homepage":"https://github.com/tblobaum/access","keywords":["access","control","groups","modes","resources","redis","graph"],"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"license":"MIT","_id":"access@0.2.0","dist":{"shasum":"0af74443994c2fad4019ed21a170909da798357e","tarball":"http://registry.npmjs.org/access/-/access-0.2.0.tgz"},"readme":"","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}]},"0.2.1":{"name":"access","version":"0.2.1","description":"access control resources, groups and modes by id","main":"index.js","bin":{},"directories":{"test":"test"},"dependencies":{"redis-graph":"*","redis-multi-set":"*"},"devDependencies":{"tap":"~0.2.5","redis":"~0.7.2"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/tblobaum/access.git"},"homepage":"https://github.com/tblobaum/access","keywords":["access","control","groups","modes","resources","redis","graph"],"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"license":"MIT","_id":"access@0.2.1","dist":{"shasum":"6616096cc30f3cf3ef95441b1631e5c4fa4996b2","tarball":"http://registry.npmjs.org/access/-/access-0.2.1.tgz"},"readme":"","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}]}},"readme":"","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"time":{"modified":"2012-08-09T09:57:19.124Z","created":"2012-08-07T09:37:44.054Z","0.1.0":"2012-08-07T09:37:44.895Z","0.2.0":"2012-08-07T12:18:25.104Z","0.2.1":"2012-08-09T09:57:19.124Z"},"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"repository":{"type":"git","url":"git://github.com/tblobaum/access.git"},"_attachments":{"access-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-LycZHHdsfYJ53HtdEJ9OfQ==","length":3063,"stub":true},"access-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gAa/H97lrFiWio9/XAQVtA==","length":3071,"stub":true},"access-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-izJay8QG9r5Wj2TcNP281w==","length":3476,"stub":true}}}},
{"id":"access-logger","key":"access-logger","value":{"rev":"9-1607c81832bd977fa21b73d587550505"},"doc":{"_id":"access-logger","_rev":"9-1607c81832bd977fa21b73d587550505","name":"access-logger","description":"Extensive access logger middleware","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"access-logger","description":"Extensive access logger middleware","keywords":["logger","log4node","middleware","express"],"version":"0.0.1","author":{"name":"Anthony BARRE","email":"anthony.barre87@gmail.com"},"main":"./access-logger.js","dependencies":{"bytes":"0.0.1"},"_npmUser":{"name":"abarre","email":"anthony.barre87@gmail.com"},"_id":"access-logger@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"f2ead675c0bf40ac30e4f3c235a65f6d909b15f4","tarball":"http://registry.npmjs.org/access-logger/-/access-logger-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"abarre","email":"anthony.barre87@gmail.com"}],"directories":{}},"0.0.2":{"name":"access-logger","description":"Extensive access logger middleware","keywords":["logger","log4node","middleware","express"],"version":"0.0.2","author":{"name":"Anthony BARRE","email":"anthony.barre87@gmail.com"},"main":"./access-logger.js","repositories":[{"type":"git","url":"git://github.com/abarre/access-logger.git"}],"dependencies":{"bytes":"0.0.1"},"_npmUser":{"name":"abarre","email":"anthony.barre87@gmail.com"},"_id":"access-logger@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"52bc7282883b63a26ba51ffa9699fd2b56537491","tarball":"http://registry.npmjs.org/access-logger/-/access-logger-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"abarre","email":"anthony.barre87@gmail.com"}]}},"readme":"access-logger\n=============\n\naccess log for express which work with any logger.","maintainers":[{"name":"abarre","email":"anthony.barre87@gmail.com"}],"time":{"modified":"2012-08-10T15:33:30.056Z","created":"2012-08-10T14:06:46.948Z","0.0.1":"2012-08-10T14:06:48.843Z","0.0.2":"2012-08-10T15:33:30.056Z"},"author":{"name":"Anthony BARRE","email":"anthony.barre87@gmail.com"},"_attachments":{"access-logger-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-7LIul+WljxLyARmMYtvWGA==","length":3442,"stub":true},"access-logger-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-b1OlD3Td8S44OW6dc50hEw==","length":3381,"stub":true}}}},
{"id":"access2couch","key":"access2couch","value":{"rev":"9-4b24804a943ff1fe3902ae803c41749c"},"doc":{"_id":"access2couch","_rev":"9-4b24804a943ff1fe3902ae803c41749c","name":"access2couch","description":"A command-line utility for Windows, that pushes a MS Access database to a CouchDB instance.","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"access2couch","version":"0.0.1","description":"A command-line utility for Windows, that pushes a MS Access database to a CouchDB instance.","author":{"name":"Luca Matteis","email":"lmatteis@gmail.com","url":"http://pseudocodice.com"},"keywords":["ms access","msaccess","access","microsoft access","couch","couchdb","shell","conversion"],"repository":{"type":"git","url":"git://github.com/lmatteis/access2couch.git"},"bin":{"access2couch":"./access2couch.js"},"_npmUser":{"name":"lmatteis","email":"lmatteis@gmail.com"},"_id":"access2couch@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"1024cf8816a70a31c9104cc3356a62c06e3220e1","tarball":"http://registry.npmjs.org/access2couch/-/access2couch-0.0.1.tgz"},"maintainers":[{"name":"lmatteis","email":"lmatteis@gmail.com"}]},"0.0.2":{"name":"access2couch","version":"0.0.2","description":"A command-line utility for Windows, that pushes a MS Access database to a CouchDB instance.","author":{"name":"Luca Matteis","email":"lmatteis@gmail.com","url":"http://pseudocodice.com"},"keywords":["ms access","msaccess","access","microsoft access","couch","couchdb","shell","conversion"],"repository":{"type":"git","url":"git://github.com/lmatteis/access2couch.git"},"bin":{"access2couch":"./access2couch.js"},"dependencies":{"rimraf":"2.0.2","csv":"0.0.13","felix-couchdb":"1.0.3"},"_npmUser":{"name":"lmatteis","email":"lmatteis@gmail.com"},"_id":"access2couch@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8ba0a224a0df08335b361c73b1d8c69e4621c971","tarball":"http://registry.npmjs.org/access2couch/-/access2couch-0.0.2.tgz"},"maintainers":[{"name":"lmatteis","email":"lmatteis@gmail.com"}]},"0.0.3":{"name":"access2couch","version":"0.0.3","description":"A command-line utility for Windows, that pushes a MS Access database to a CouchDB instance.","author":{"name":"Luca Matteis","email":"lmatteis@gmail.com","url":"http://pseudocodice.com"},"keywords":["ms access","msaccess","access","microsoft access","couch","couchdb","shell","conversion"],"repository":{"type":"git","url":"git://github.com/lmatteis/access2couch.git"},"bin":{"access2couch":"./access2couch.js"},"dependencies":{"rimraf":"2.0.2","csv":"0.0.13","felix-couchdb":"1.0.3"},"_npmUser":{"name":"lmatteis","email":"lmatteis@gmail.com"},"_id":"access2couch@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"df9aacf86d42b9c67fa0f446887ec52944cd5826","tarball":"http://registry.npmjs.org/access2couch/-/access2couch-0.0.3.tgz"},"maintainers":[{"name":"lmatteis","email":"lmatteis@gmail.com"}]},"0.0.6":{"name":"access2couch","version":"0.0.6","description":"A command-line utility for Windows, that pushes a MS Access database to a CouchDB instance.","author":{"name":"Luca Matteis","email":"lmatteis@gmail.com","url":"http://pseudocodice.com"},"keywords":["ms access","msaccess","access","microsoft access","couch","couchdb","shell","conversion"],"repository":{"type":"git","url":"git://github.com/lmatteis/access2couch.git"},"bin":{"access2couch":"./access2couch.js"},"dependencies":{"rimraf":"2.0.2","csv":"0.0.13","felix-couchdb":"1.0.3"},"_npmUser":{"name":"lmatteis","email":"lmatteis@gmail.com"},"_id":"access2couch@0.0.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"97aa1ba41fa67ee8de1ac15b5c4f6d1331db6ff0","tarball":"http://registry.npmjs.org/access2couch/-/access2couch-0.0.6.tgz"},"maintainers":[{"name":"lmatteis","email":"lmatteis@gmail.com"}]}},"readme":"access2couch\n============\n\nA command-line utility for Windows, that pushes a MS Access database to a CouchDB instance. Written in Node.js\n\nThis tool uses a little script written in JScript simply to convert a MS access database to CSV (using ODBC), which is then used by Node to build the JSON.\n\n## Install\n\n1. Download and install the Windows version of node which can be found on nodejs.org\n\n2. Then download this project and navigate to it using `cmd`\n   \n       > cd path_to_this_project\n\n3. run `npm install -g`\n\n4. Before you run the command, remember that your database will be wiped cleaned everytime. Simply run\n\n    Usage:\n      access2couch [MSAccess file-path] [tables...] [couch]\n\n    Example:\n        access2couch forests.mdb Forests Trees http://<username>:<password>@yourcouch.com/dbname\n","maintainers":[{"name":"lmatteis","email":"lmatteis@gmail.com"}],"time":{"modified":"2012-06-15T14:22:33.060Z","created":"2012-06-13T15:17:36.886Z","0.0.1":"2012-06-13T15:17:38.400Z","0.0.2":"2012-06-15T14:15:54.789Z","0.0.3":"2012-06-15T14:19:42.374Z","0.0.6":"2012-06-15T14:22:33.060Z"},"author":{"name":"Luca Matteis","email":"lmatteis@gmail.com","url":"http://pseudocodice.com"},"repository":{"type":"git","url":"git://github.com/lmatteis/access2couch.git"},"_attachments":{"access2couch-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-MO6MX/iHQba8zE92VzStDw==","length":4964,"stub":true},"access2couch-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1dW6SjjyxhpSb1qcMlTK5A==","length":4965,"stub":true},"access2couch-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hfmjIT5o8A2UNbEfItW8rw==","length":4922,"stub":true},"access2couch-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Y22tqkLTRzQDSPGtX7DNaw==","length":1715,"stub":true}}}},
{"id":"accesslog","key":"accesslog","value":{"rev":"5-cef2b64d5a812c4fe7d6198ae6d84521"},"doc":{"_id":"accesslog","_rev":"5-cef2b64d5a812c4fe7d6198ae6d84521","name":"accesslog","description":"Simple common/combined access log middleware","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"name":"accesslog","version":"0.0.0","description":"Simple common/combined access log middleware","main":"index.js","scripts":{"test":"make test"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-accesslog.git"},"keywords":["logger","log","access","common","combined","http","apache","nsca"],"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"license":"MIT","dependencies":{"addr":"~1.0.0","dateable":"~0.1.2"},"devDependencies":{"mocha":"*","request":"*","idgen":"1.x"},"readme":"accesslog\n---------\n\nSimple common/combined access log middleware\n\nUsage\n=====\n\n```bash\n$ npm install accesslog\n```\n\n`accesslog([options])`\n\nCreates a middleware request handler which logs requests to a file or stream in\n[common log format](http://en.wikipedia.org/wiki/Common_Log_Format).\n\n- `options`\n\n    - `stream`: Stream to log to. Defaults to `process.stdout`.\n    - `path`: Write log to a file at this path.\n    - `format`: Format of log, in\n      [Apache](http://httpd.apache.org/docs/1.3/logs.html#combined) style. Defaults\n      to \"combined\" format.\n\nExample\n=======\n\n```javascript\nvar accesslog = require('accesslog')()\n  , http = require('http')\n  , port = 3000\n  ;\n\nhttp.createServer(function(req, res) {\n  accesslog(req, res, function() {\n    var content = JSON.stringify({'hello': 'world'});\n    res.writeHead(200, {'Content-Type': 'application/json', 'Content-Length': content.length});\n    res.write(content);\n    res.end();\n  });\n}).listen(port, function() {\n  console.log('test server listening on port ' + port);\n});\n```\n\nLicense\n=======\n\nMIT","_id":"accesslog@0.0.0","dist":{"shasum":"f3109622a680458cfea99f51b6c3bed598b529b1","tarball":"http://registry.npmjs.org/accesslog/-/accesslog-0.0.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.0.1":{"name":"accesslog","version":"0.0.1","description":"Simple common/combined access log middleware","main":"index.js","scripts":{"test":"make test"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-accesslog.git"},"keywords":["logger","log","access","common","combined","http","apache","nsca"],"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"license":"MIT","dependencies":{"addr":"~1.0.0","dateable":"~0.1.2"},"devDependencies":{"mocha":"*","request":"*","idgen":"1.x"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"accesslog@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"19a99b52e780b7afdda96611de041cf73c3be7fc","tarball":"http://registry.npmjs.org/accesslog/-/accesslog-0.0.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"accesslog\n---------\n\nSimple common/combined access log middleware\n\nUsage\n=====\n\n```bash\n$ npm install accesslog\n```\n\n`accesslog([options])`\n\nCreates a middleware request handler which logs requests to a file or stream in\n[common log format](http://en.wikipedia.org/wiki/Common_Log_Format).\n\n- `options`\n\n    - `stream`: Stream to log to. Defaults to `process.stdout`.\n    - `path`: Write log to a file at this path.\n    - `format`: Format of log, in\n      [Apache](http://httpd.apache.org/docs/1.3/logs.html#combined) style. Defaults\n      to \"combined\" format.\n\nExample\n=======\n\n```javascript\nvar accesslog = require('accesslog')()\n  , http = require('http')\n  , port = 3000\n  ;\n\nhttp.createServer(function(req, res) {\n  accesslog(req, res, function() {\n    var content = JSON.stringify({'hello': 'world'});\n    res.writeHead(200, {'Content-Type': 'application/json', 'Content-Length': content.length});\n    res.write(content);\n    res.end();\n  });\n}).listen(port, function() {\n  console.log('test server listening on port ' + port);\n});\n```\n\nLicense\n=======\n\nMIT","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-07-22T05:04:30.012Z","created":"2012-07-22T00:25:11.025Z","0.0.0":"2012-07-22T00:25:12.421Z","0.0.1":"2012-07-22T05:04:30.012Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-accesslog.git"},"_attachments":{"accesslog-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KK9Lfyg1wIeL8ary0tD12g==","length":2804,"stub":true},"accesslog-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tU8PVseMyhAqBjl1YK+9Qw==","length":2827,"stub":true}}}},
{"id":"accountant","key":"accountant","value":{"rev":"17-fb11a0ba5bf2e86b5a54d65c020c7735"},"doc":{"_id":"accountant","_rev":"17-fb11a0ba5bf2e86b5a54d65c020c7735","name":"accountant","description":"Double Entry Accounting","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.0":{"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"name":"accountant","description":"Double Entry Accounting","version":"0.0.0","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"colors":"0.3.0","underscore":"1.3.1"},"devDependencies":{},"main":"./accountant.js","_npmUser":{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"},"_id":"accountant@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ee04a7a7244115b87ed6f4e65e5f8d1431dd0fa1","tarball":"http://registry.npmjs.org/accountant/-/accountant-0.0.0.tgz"},"maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}],"directories":{}},"0.0.1":{"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"name":"accountant","description":"Double Entry Accounting","version":"0.0.1","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"colors":"0.3.0","underscore":"1.3.1"},"devDependencies":{},"main":"./accountant.js","bin":{"acct-ls":"./scripts/ls.js"},"_npmUser":{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"},"_id":"accountant@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1b21b88ff4afdf672cbf680229716f892b3174ee","tarball":"http://registry.npmjs.org/accountant/-/accountant-0.0.1.tgz"},"maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}]},"0.0.2":{"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"name":"accountant","description":"Double Entry Accounting","version":"0.0.2","repository":{"url":""},"engines":{"node":">=0.6.6"},"dependencies":{"colors":"0.6.0","underscore":"1.3.1","nomnom":"1.5.1","cli-table":"0.0.2","request":"2.9.2"},"devDependencies":{},"main":"./accountant.js","bin":{"acct-ls":"./scripts/ls.js","acct-stock":"./scripts/daily-stock.js","acct-net":"./scripts/net.js"},"scripts":{"test":"node test/smoke.js"},"_npmJsonOpts":{"file":"/home/peterbraden/.npm/accountant/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"accountant@0.0.2","_engineSupported":false,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6b05a8a5f054f56e8c41ef80e50f58783039a2ef","tarball":"http://registry.npmjs.org/accountant/-/accountant-0.0.2.tgz"},"maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}]},"0.0.3":{"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"name":"accountant","description":"Double Entry Accounting","version":"0.0.3","repository":{"url":""},"engines":{"node":">=0.6.6"},"dependencies":{"colors":"0.6.0","underscore":"1.3.1","nomnom":"1.5.1","cli-table":"0.0.2","request":"2.9.2"},"devDependencies":{},"main":"./accountant.js","bin":{"acct-holdings":"./scripts/holdings.js","acct-ls":"./scripts/ls.js","acct-net":"./scripts/net.js","acct-stock":"./scripts/daily-stock.js"},"scripts":{"test":"node test/smoke.js"},"_npmUser":{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"},"_id":"accountant@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8821a966290e4b999590231e3e3f1add2f843db1","tarball":"http://registry.npmjs.org/accountant/-/accountant-0.0.3.tgz"},"maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}]},"0.0.4":{"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"name":"accountant","description":"Double Entry Accounting","version":"0.0.4","repository":{"url":""},"engines":{"node":">=0.6.6"},"dependencies":{"colors":"0.6.0","underscore":"1.3.1","nomnom":"1.5.1","cli-table":"0.0.2","request":"2.9.2"},"devDependencies":{},"main":"./accountant.js","bin":{"acct-holdings":"./scripts/holdings.js","acct-ls":"./scripts/ls.js","acct-net":"./scripts/net.js","acct-stock":"./scripts/daily-stock.js"},"scripts":{"test":"node test/smoke.js"},"_npmUser":{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"},"_id":"accountant@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d0462bbb748a58ca7defea38e0622a9222f0eb15","tarball":"http://registry.npmjs.org/accountant/-/accountant-0.0.4.tgz"},"maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}]},"0.0.5":{"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"name":"accountant","description":"Double Entry Accounting","version":"0.0.5","repository":{"url":""},"engines":{"node":">=0.6.6"},"dependencies":{"colors":"0.6.0","underscore":"1.3.1","nomnom":"1.5.1","cli-table":"0.0.2","request":"2.9.2"},"devDependencies":{},"main":"./accountant.js","bin":{"acct-holdings":"./scripts/holdings.js","acct-ls":"./scripts/ls.js","acct-net":"./scripts/net.js","acct-stock":"./scripts/daily-stock.js"},"scripts":{"test":"node test/smoke.js"},"_npmUser":{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"},"_id":"accountant@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b776a1a0941faf1167904f78f9143414b60fc721","tarball":"http://registry.npmjs.org/accountant/-/accountant-0.0.5.tgz"},"maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}]}},"readme":"# Accountant\n## Double Entry Accounting\n\n_Accountant_ is a set of utilities and scripts that I've developed to allow\n me to do accounts from the command line. In some way it's similar to \n(Ledger)[http://ledger-cli.org/3.0/doc/ledger3.html], although it's a lot simpler.\n\n## accounts.json\n\nYou use accountant by creating (or generating) an _account.json_ file. This is\nsimply a list of transactions and statements about your accounts.\n\nie:\n  \n    [ {'date' : '2012-01-02', 'typ' : 'statement', 'acct' : 'mybank', 'balance' : 0, 'currency' : 'USD'}\n    , {'date' : '2012-01-03', 'typ' : 'transaction', 'src' : 'myjob',  'dest' : 'mybank', 'amount' : 1000.01, 'currency' : 'USD'}\n    ]\n    \n    ","maintainers":[{"name":"peterbraden","email":"peterbraden@peterbraden.co.uk"}],"time":{"modified":"2012-05-29T18:56:56.101Z","created":"2012-04-20T22:57:52.036Z","0.0.0":"2012-04-20T22:57:53.373Z","0.0.1":"2012-04-20T23:15:54.709Z","0.0.2":"2012-05-29T17:26:56.987Z","0.0.3":"2012-05-29T18:26:04.601Z","0.0.4":"2012-05-29T18:27:53.811Z","0.0.5":"2012-05-29T18:56:56.101Z"},"author":{"name":"Peter Braden","email":"hi@peterbraden.co.uk","url":"peterbraden.co.uk"},"repository":{"url":""},"_attachments":{"accountant-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-WsFqbUi9aMnUBNSGzK8hPA==","length":7216,"stub":true},"accountant-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ysP1uwZJROc/VTq0IOqt9Q==","length":7203,"stub":true},"accountant-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-y5fSHbui7sbAWGfqCoaljA==","length":7221,"stub":true},"accountant-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KgxJt2BUH8Iu6yU1vaTMEQ==","length":6867,"stub":true},"accountant-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-xY31+KP8tSgUvSKtH0JL9Q==","length":4323,"stub":true},"accountant-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mT3EsJCahAH0FzGdh2FWUg==","length":1810,"stub":true}}}},
{"id":"accounting","key":"accounting","value":{"rev":"6-6c3304a47f3183523b9912ee492b0b53"},"doc":{"_id":"accounting","_rev":"6-6c3304a47f3183523b9912ee492b0b53","name":"accounting","description":"number, money and currency parsing/formatting library","dist-tags":{"latest":"0.3.2"},"versions":{"0.3.0":{"name":"accounting","description":"number, money and currency formatting library","homepage":"http://josscrowcroft.github.com/accounting.js","keywords":["accounting","number","money","currency","format","utilities"],"author":{"name":"Joss Crowcroft","email":"josscrowcroft@gmail.com","url":"http://www.josscrowcroft.com"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/josscrowcroft/accounting.js.git"},"main":"accounting.js","version":"0.3.0","_id":"accounting@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"90968fdd9e4429cabde0d1f21ef596fadf17d82a","tarball":"http://registry.npmjs.org/accounting/-/accounting-0.3.0.tgz"},"maintainers":[{"name":"joss","email":"josscrowcroft@gmail.com"}]},"0.3.2":{"name":"accounting","description":"number, money and currency parsing/formatting library","homepage":"http://josscrowcroft.github.com/accounting.js","keywords":["accounting","number","money","currency","format","utilities"],"author":{"name":"Joss Crowcroft","email":"josscrowcroft@gmail.com","url":"http://www.josscrowcroft.com"},"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/josscrowcroft/accounting.js.git"},"main":"accounting.js","version":"0.3.2","_id":"accounting@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b511956d158a4db3f248bd2e53ebb47c5bb93088","tarball":"http://registry.npmjs.org/accounting/-/accounting-0.3.2.tgz"},"maintainers":[{"name":"joss","email":"josscrowcroft@gmail.com"}]}},"maintainers":[{"name":"joss","email":"josscrowcroft@gmail.com"}],"time":{"modified":"2012-08-07T12:15:25.884Z","created":"2011-10-21T12:39:15.758Z","0.3.0":"2011-10-21T12:39:17.403Z","0.3.2":"2012-01-28T04:22:16.621Z"},"author":{"name":"Joss Crowcroft","email":"josscrowcroft@gmail.com","url":"http://www.josscrowcroft.com"},"repository":{"type":"git","url":"git://github.com/josscrowcroft/accounting.js.git"},"users":{"sjonnet19":true},"_attachments":{"accounting-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Kp/RzTiT4oxtczk6+wYY6A==","length":116580,"stub":true},"accounting-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3Hvl5+tlUTpOLbaLfsaEdQ==","length":115858,"stub":true}}}},
{"id":"accumulate","key":"accumulate","value":{"rev":"5-3ced1f4da8fcd40c7bdfdec80d04cefa"},"doc":{"_id":"accumulate","_rev":"5-3ced1f4da8fcd40c7bdfdec80d04cefa","name":"accumulate","description":"Accumualates data, e.g. from a readable stream","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"accumulate","version":"0.0.1","description":"Accumualates data, e.g. from a readable stream","keywords":["accumulate"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Acumulate.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"main":"lib/accumulate.js","engines":{"node":">= 0.4.0"},"readme":"# Accumulate\n\n`npm install accumulate`\n\nAccumulates data, e.g. from a readable stream.\n\n### No more of this\n\n```js\nvar data = ''\nstream.on('data', function(d) {\n    data += d\n})\nstream.on('end', function() {\n    /* something with `data` */\n})\n```\n\n### More of this\n\n```js\nvar accumulate = require('accumulate')()\nstream.on('data', accumulate)\nstream.on('end', function() {\n    var data = accumulate().data\n})\n```\n","_id":"accumulate@0.0.1","dist":{"shasum":"5012d824f28d219f4e3a87fc4f8a5f8a903a3f78","tarball":"http://registry.npmjs.org/accumulate/-/accumulate-0.0.1.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.0.2":{"name":"accumulate","version":"0.0.2","description":"Accumualates data, e.g. from a readable stream","keywords":["accumulate"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Acumulate.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"main":"lib/accumulate.js","devDependencies":{"vows":"0.6.3","should":"1.0.0"},"engines":{"node":">= 0.4.0"},"readme":"# Accumulate\n\n`npm install accumulate`\n\nAccumulates data, e.g. from a readable stream.\n\n### No more of this\n\n```js\nvar data = ''\nstream.on('data', function(d) {\n    data += d\n})\nstream.on('end', function() {\n    /* something with `data` */\n})\n```\n\n### More of this\n\n```js\nvar accumulate = require('accumulate')('utf8')\nstream.on('data', accumulate)\nstream.on('end', accumulate.done(console.log))\n```\n","_id":"accumulate@0.0.2","dist":{"shasum":"21a252c5fd8c16b96bccc843600fed02cea877e6","tarball":"http://registry.npmjs.org/accumulate/-/accumulate-0.0.2.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]}},"readme":"# Accumulate\n\n`npm install accumulate`\n\nAccumulates data, e.g. from a readable stream.\n\n### No more of this\n\n```js\nvar data = ''\nstream.on('data', function(d) {\n    data += d\n})\nstream.on('end', function() {\n    /* something with `data` */\n})\n```\n\n### More of this\n\n```js\nvar accumulate = require('accumulate')()\nstream.on('data', accumulate)\nstream.on('end', function() {\n    var data = accumulate().data\n})\n```\n","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}],"time":{"modified":"2012-07-22T17:17:24.752Z","created":"2012-07-19T19:48:26.708Z","0.0.1":"2012-07-19T19:48:26.982Z","0.0.2":"2012-07-22T17:17:24.752Z"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"repository":{"type":"git","url":"git://github.com/Weltschmerz/Acumulate.git"},"_attachments":{"accumulate-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Z6tnFW2aJZqY0ujSGvqq7A==","length":2299,"stub":true},"accumulate-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-B3D0QHJ4WJ5lfECW0YBuGQ==","length":1290,"stub":true}}}},
{"id":"ace","key":"ace","value":{"rev":"5-ee6c9b36c310291e7ea5675ab93da8da"},"doc":{"_id":"ace","_rev":"5-ee6c9b36c310291e7ea5675ab93da8da","name":"ace","description":"Sinatra for Node","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"ace","description":"Simple static server.","version":"0.0.1","author":{"name":"maccman"},"licenses":[{"type":"MIT","url":"https://github.com/maccman/ace/blob/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maccman/ace.git"},"engine":["node >=0.1.102"],"main":"./index.js","bin":{"ace":"./index.js"},"dependencies":{"express":"~2.4.3","optimist":"~0.2.6"},"_npmJsonOpts":{"file":"/Users/Alex/.npm/ace/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ace@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"1f93177ec90120ffebf233ef56388c176d8d67c2","tarball":"http://registry.npmjs.org/ace/-/ace-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"maccman","email":"maccman@gmail.com"}]},"0.0.2":{"name":"ace","description":"Sinatra for Node","version":"0.0.2","author":{"name":"maccman"},"repository":{"type":"git","url":"git://github.com/maccman/ace.git"},"main":"./lib/index.js","bin":{"ace":"./bin/ace"},"dependencies":{"strata":"git://github.com/maccman/strata.git","fibers":"git://github.com/laverdet/node-fibers.git#master","mime":"1.2.4","optimist":"0.3.1"},"_npmUser":{"name":"maccman","email":"maccman@gmail.com"},"_id":"ace@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.7.3","_defaultsLoaded":true,"dist":{"shasum":"5bff7a128cb2b18fa6f62867ab3518daeafeae83","tarball":"http://registry.npmjs.org/ace/-/ace-0.0.2.tgz"},"readme":"Ace is [Sinatra](http://www.sinatrarb.com/) for Node; a simple web-server written in CoffeeScript with a straightforward API.\n\nEvery request is wrapped in a [Node Fiber](https://github.com/laverdet/node-fibers), allowing you to program in a synchronous manner without callbacks, but with all the advantages of an asynchronous web-server.\n\n    app.put '/posts/:id', ->\n      @post = Post.find(+@route.id).wait()\n      @post.updateAttributes(\n        name: @params.name,\n        body: @params.body\n      ).wait()\n      @redirect @post\n\nAce is built on top of the rock solid [Strata HTTP framework](http://stratajs.org/).\n\n##Examples\n\nYou can find an example blog app, including authentication and updating posts, in Ace's [examples directory](https://github.com/maccman/ace/tree/master/examples).\n\n##Usage\n\nNode >= v0.7.3 is required, as well as npm. Ace will run on older versions of Node, but will crash under heavy load due to a bug in V8 (now fixed).\n\nTo install, run:\n\n    npm install -g git://github.com/maccman/ace.git\n\n<!-- npm install -g ace -->\n\nTo generate a new app, run:\n\n    ace new myapp\n    cd myapp\n    npm install .\n\nTo serve up an app, run:\n\n    ace\n\n##Routing\n\nIn Ace, a route is a HTTP method paired with a URL matching pattern. For example:\n\n    app.get '/users', ->\n      'Hello World'\n\nAnything returned from a routing callback is set as the response body.\n\nYou can also specify a routing pattern, which is available in the callback under the `@route` object.\n\n    app.get '/users/:name', ->\n      \"Hello #{@route.name}\"\n\nPOST, PUT and DELETE callbacks are also available, using the `post`, `put` and `del` methods respectively:\n\n    app.post '/users', ->\n      @user = User.create(\n        name: @params.name\n      ).wait()\n      @redirect \"/users/#{@user.id}\"\n\n    app.put '/users/:id', ->\n      @user = User.find(+@route.id).wait()\n      @user.updateAttributes(\n        name: @params.name\n      ).wait()\n      @redirect \"/users/#{@user.id}\"\n\n    app.del '/user/:id', ->\n      @user = User.find(+@route.id).wait()\n      @user.destroy().wait()\n      @redirect \"/users\"\n\n##Parameters\n\nURL encoded forms, multipart uploads and JSON parameters are available via the `@params` object:\n\n    app.post '/posts', ->\n      @post = Post.create(\n        name: @params.name,\n        body: @params.body\n      ).wait()\n\n      @redirect \"/posts/#{@post.id}\"\n\n##Request\n\nYou can access request information using the `@request` object.\n\n    app.get '/request', ->\n      result =\n        protocol:     @request.protocol\n        method:       @request.method\n        remoteAddr:   @request.remoteAddr\n        pathInfo:     @request.pathInfo\n        contentType:  @request.contentType\n        xhr:          @request.xhr\n        host:         @request.host\n\n      @json result\n\nFor more information, see [request.js](https://github.com/mjijackson/strata/blob/master/lib/request.js).\n\nYou can access the full request body via `@body`:\n\n    app.get '/body', ->\n      \"You sent: #{@body}\"\n\nYou can check to see what the request accepts in response:\n\n    app.get '/users', ->\n      @users = User.all().wait()\n\n      if @accepts('application/json')\n        @jsonp @users\n      else\n        @eco 'users/list'\n\nYou can also look at the request format (calculated from the URL's extension). This can often give a better indication of what clients are expecting in response.\n\n      app.get '/users', ->\n        @users = User.all().wait()\n\n        if @format is 'application/json'\n          @jsonp @users\n        else\n          @eco 'users/list'\n\nFinally you can access the raw `@env` object:\n\n    @env['Warning']\n\n##Responses\n\nAs well as returning the response body as a string from the routing callback, you can set the response attributes directly:\n\n    app.get '/render', ->\n      @headers['Transfer-Encoding'] = 'chunked'\n      @contentType = 'text/html'\n      @status = 200\n      @body = 'my body'\n\nYou can set the `@headers`, `@status` and `@body` attributes to alter the request's response.\n\nIf you only need to set the status code, you can just return it directly from the routing callback. The properties `@ok`, `@unauthorized` and `@notFound` are aliased to their relevant status codes.\n\n    app.get '/render', ->\n      # ...\n      @ok\n\n##Static\n\nBy default, if a folder called `public` exists under the app root, its contents will be served up statically. You can configure the path of this folder like so:\n\n    app.set public: './public'\n\nYou can add static assets like stylesheets and images to the `public` folder.\n\n##Templates\n\nAce includes support for rendering CoffeeScript, Eco, EJS, Less, Mustache and Stylus templates. Simply install the relevant module and the templates will be available to render.\n\nFor example, install the [eco](https://github.com/sstephenson/eco) module and the `@eco` function will be available to you.\n\n    app.get '/users/:name', ->\n      @name = @route.name\n      @eco 'user/show'\n\nThe `@eco` function takes a path of the Eco template. By default, this should be located under a folder named `./views`.\nThe template is rendered in the current context, so you can pass variables to them by setting them locally.\n\nIf a file exists under `./views/layout.*`, then it'll be used as the application's default layout. You can specify a different layout with the `layout` option.\n\n    app.get '/users', ->\n      @users = User.all().wait()\n      @mustache 'user/list', layout: 'basic'\n\n##JSON\n\nYou can serve up JSON and JSONP with the `@json` and `@jsonp` helpers respectively.\n\n    app.get '/users', ->\n      @json {status: 'ok'}\n\n    app.get '/users', ->\n      @users = User.all().wait()\n      @jsonp @users\n\nBy default `@jsonp` uses the `@params.callback` parameter as the name of its wrapper function.\n\n##Fibers\n\nEvery request in Ace is wrapped in a Fiber. This means you can do away with the callback spaghetti that Node applications often descend it. Rather than use callbacks, you can simply pause the current fiber. When the callback returns, the fibers execution continues from where it left off.\n\nIn practice, Ace provides a couple of utility functions for pausing asynchronous functions. Ace adds a `wait()` function to `EventEmitter`. This transforms asynchronous calls on libraries such as [Sequelize](http://sequelizejs.com).\n\nFor example, `save()` is usually an asynchronous call which requires a callback. Here we can just call `save().wait()` and use a synchronous style.\n\n    app.get '/projects', ->\n      project = Project.build(\n        name: @params.name\n      )\n\n      project.save().wait()\n\n      @sleep(2000)\n\n      \"Saved project: #{project.id}\"\n\nThis fiber technique also means we can implement functionality like `sleep()` in JavaScript, as in the previous example.\n\nYou can make an existing asynchronous function fiber enabled, by wrapping it with `Function::wait()`.\n\n    syncExists = fs.exists.bind(fs).wait\n\n    if syncExists('./path/to/file')\n      @sendFile('./path/to/file)\n\nFibers are pooled, and by default there's a limit of 100 fibers in the pool. This means that you can serve up to 100 connections simultaneously. After the pool limit is reached, requests are queued. You can increase the pool size like so:\n\n    app.pool.size = 250\n\n##Cookies & Session\n\nSessions are enabled by default in Ace. You can set and retrieve data stored in the session by using the `@session` object:\n\n    app.get '/login', ->\n      user = User.find(email: @params.email).wait()\n      @session.user_id = user.id\n      @redirect '/'\n\nYou can retrieve cookies via the `@cookie` object, and set them with `@response.setCookie(name, value)`;\n\n    app.get '/login', ->\n      token = @cookies.rememberMe\n      # ...\n\n##Filters\n\nAce supports 'before' filters, callbacks that are executed before route handlers.\n\n    app.before ->\n      # Before filter\n\nBy default before filters are always executed. You can specify conditions to limit that, such as routes.\n\n    app.before '/users*', ->\n\nThe previous filter will be executed before any routes matching `/users*` are.\n\nAs well as a route, you can specify a object to match the request against:\n\n    app.before method: 'POST', ->\n      ensureLogin()\n\nFinally you can specify a conditional function that'll be passed the request's `env`, and should return a boolean indicating whether the filter should be executed or not.\n\n    app.before conditionFunction, ->\n\nIf a filter changes the response status to anything other than 200, then execution will halt.\n\n    app.before ->\n      if @request.method isnt 'GET' and !@session.user\n        @head 401\n\n##Context\n\nYou can add extra properties to the routing callback context using `context.include()`:\n\n    app.context.include\n      loggedIn: -> !!@session.user_id\n\n    app.before '/admin*', ->\n      if @loggedIn()\n        @ok\n      else\n        @redirect '/login'\n\nThe context includes a few utilities methods by default:\n\n    @redirect(url)\n    @sendFile(path)\n    @head(status)\n\n    @basicAuth (user, pass) ->\n      user is 'foo' and pass is 'bar'\n\n##Configuration\n\nAce includes some sensible default settings, but you can override them using `@set`, passing in an object of names to values.\n\n    @app.set static:   true       # Serve up file statically from public\n             sessions: true       # Enable sessions\n             port:     1982       # Server port number\n             bind:     '0.0.0.0'  # Bind to host\n             views:    './views'  # Path to 'views' dir\n             public:   './public' # Path to 'public' dir\n             layout:   'layout'   # Name of application's default layout\n             logging:  true       # Enable logging\n\nSettings are available on the `@settings` object:\n\n    if app.settings.logging is true\n      console.log('Logging is enabled')\n\n##Middleware\n\nMiddleware sits on the request stack, and gets executed before any of the routes. Using middleware, you can alter the request object such as HTTP headers or the request's path.\n\nAce sits on top of [Strata](http://stratajs.org/), so you can use any of the middleware that comes with the framework, or create your own.\n\nFor example, we can use Ace's [methodOverride](https://github.com/mjijackson/strata/blob/master/lib/methodoverride.js) middleware, enabling us to override the request's HTTP method with a `_method` parameter.\n\n    strata = require('ace').strata\n    app.use strata.methodOverride\n\nThis means we can use HTML forms to send requests other than `GET` or `POST` ones, keeping our application RESTful:\n\n    <form action=\"<%= @post.url() %>\" method=\"post\">\n      <input type=\"hidden\" name=\"_method\" value=\"delete\">\n      <button>Delete</button>\n    </form>\n\nFor more information on creating your own middleware, see [Strata's docs](http://stratajs.org/manual/5).\n\n##Credits\n\nAce was built by [Alex MacCaw](http://alexmaccaw.com) and [Michael Jackson](http://mjijackson.com/).","maintainers":[{"name":"maccman","email":"maccman@gmail.com"}]}},"maintainers":[{"name":"maccman","email":"maccman@gmail.com"}],"time":{"modified":"2012-02-26T18:40:47.355Z","created":"2011-08-03T15:18:32.883Z","0.0.1":"2011-08-03T15:18:35.442Z","0.0.2":"2012-02-26T18:40:47.355Z"},"author":{"name":"maccman"},"repository":{"type":"git","url":"git://github.com/maccman/ace.git"},"_attachments":{"ace-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DwqJgsN6jMugGxp3UVS9Rg==","length":18813,"stub":true},"ace-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6/qHA0oJ7zLPUu5dZ2RgcA==","length":1341,"stub":true}}}},
{"id":"ace_offline","key":"ace_offline","value":{"rev":"11-bcc9f827369233837d198eab321c2a2b"},"doc":{"_id":"ace_offline","_rev":"11-bcc9f827369233837d198eab321c2a2b","name":"ace_offline","description":"Fork from Ace to server Offline Manifest File","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"ace_offline","description":"Fork from Ace to server Offline Manifest File","version":"0.0.1","author":{"name":"rodriguezartav"},"repository":{"type":"git","url":"github.com/rodriguezartav/ace.git"},"engine":["node >=0.1.102"],"main":"./index.js","bin":{"ace":"./index.js"},"dependencies":{"express":"~2.4.3","optimist":"~0.2.6"},"_npmUser":{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"},"_id":"ace_offline@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fa400830a17ea73572f384259ee50bc9f4cc61e9","tarball":"http://registry.npmjs.org/ace_offline/-/ace_offline-0.0.1.tgz"},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}],"directories":{}},"0.0.2":{"name":"ace_offline","description":"Fork from Ace to server Offline Manifest File","version":"0.0.2","author":{"name":"rodriguezartav"},"repository":{"type":"git","url":"github.com/rodriguezartav/ace.git"},"engine":["node >=0.1.102"],"main":"./index.js","bin":{"ace":"./index.js"},"dependencies":{"express":"~2.4.3","optimist":"~0.2.6"},"_npmUser":{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"},"_id":"ace_offline@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7a0d67e941014d7beaebe717e09fad79b3e4d000","tarball":"http://registry.npmjs.org/ace_offline/-/ace_offline-0.0.2.tgz"},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}],"directories":{}},"0.0.3":{"name":"ace_offline","description":"Fork from Ace to server Offline Manifest File","version":"0.0.3","author":{"name":"rodriguezartav"},"repository":{"type":"git","url":"github.com/rodriguezartav/ace.git"},"engine":["node >=0.1.102"],"main":"./index.js","bin":{"ace_offline":"./index.js"},"dependencies":{"express":"~2.4.3","optimist":"~0.2.6"},"_npmUser":{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"},"_id":"ace_offline@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"1796642d329c586a090a57c3904f25409a8156ca","tarball":"http://registry.npmjs.org/ace_offline/-/ace_offline-0.0.3.tgz"},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}]}},"maintainers":[{"name":"rodriguezartav","email":"roberto@rodriguezartav.com"}],"time":{"modified":"2011-11-01T03:03:29.485Z","created":"2011-11-01T01:49:24.166Z","0.0.1":"2011-11-01T01:49:26.027Z","0.0.2":"2011-11-01T02:36:41.449Z","0.0.3":"2011-11-01T03:03:29.485Z"},"author":{"name":"rodriguezartav"},"repository":{"type":"git","url":"github.com/rodriguezartav/ace.git"},"_attachments":{"ace_offline-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Ah5qc9Y8NksjitnVMIo/lQ==","length":10240,"stub":true},"ace_offline-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QSZQyVacFX6CaFGiDw/L3w==","length":10240,"stub":true},"ace_offline-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dwIEZT8jQk/JbQvUlJy+6w==","length":10240,"stub":true}}}},
{"id":"acequia","key":"acequia","value":{"rev":"5-98b2011773d1f521aa150a580b91844c"},"doc":{"_id":"acequia","_rev":"5-98b2011773d1f521aa150a580b91844c","name":"acequia","description":"Message router for node supporting multiple protocols","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"acequia","version":"0.1.0","description":"Message router for node supporting multiple protocols","main":"index.js","preferGlobal":"true","directories":{"lib":"./lib"},"scripts":{"start":"node ."},"engines":{"node":">=0.6"},"dependencies":{"log4js":">=0.4.1","socket.io":">=0.9.6","socket.io-client":">=0.9.6","uglify-js":">=1.2.5","mdns":"0.0.x"},"homepage":"https://github.com/prgsmall/acequia","repository":{"type":"git","url":"git://github.com/prgsmall/acequia.git"},"author":{"name":"Peter R. G. Small","email":"prgsmall@gmail.com"},"_npmUser":{"name":"prgsmall","email":"prgsmall@gmail.com"},"_id":"acequia@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"84de0c41fed4504daf97b109d526a755eeda2e27","tarball":"http://registry.npmjs.org/acequia/-/acequia-0.1.0.tgz"},"maintainers":[{"name":"prgsmall","email":"prgsmall@gmail.com"}]},"0.2.0":{"name":"acequia","version":"0.2.0","description":"Message router for node supporting multiple protocols","main":"index.js","preferGlobal":"true","directories":{"lib":"./lib"},"scripts":{"start":"node server.js"},"engines":{"node":">=0.6"},"dependencies":{"log4js":">=0.4.1","express":">=2.5.8","socket.io":">=0.9.6","socket.io-client":">=0.9.6","uglify-js":">=1.2.5","buffertools":">=1.0.9"},"homepage":"https://github.com/prgsmall/acequia","repository":{"type":"git","url":"git://github.com/prgsmall/acequia.git"},"author":{"name":"Peter R. G. Small","email":"prgsmall@gmail.com"},"_npmUser":{"name":"prgsmall","email":"prgsmall@gmail.com"},"_id":"acequia@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8fc57d7de482c8de7fff23476c1a90d573405416","tarball":"http://registry.npmjs.org/acequia/-/acequia-0.2.0.tgz"},"maintainers":[{"name":"prgsmall","email":"prgsmall@gmail.com"}]}},"readme":"#acequia\n\nA node-js message router supporting multiple connection protocols.\n\nCurrently supports:\n\n* Open Sound Control (OSC)\n* WebSockets via socket.io\n* TCP connection\n\nTo initialize acequia:\n\n```shell\ngit clone git@github.com:prgsmall/acequia.git\n\ncd acequia\n\nnpm install\n```","maintainers":[{"name":"prgsmall","email":"prgsmall@gmail.com"}],"time":{"modified":"2012-07-10T14:51:29.754Z","created":"2012-05-10T02:20:40.643Z","0.1.0":"2012-05-10T02:20:42.146Z","0.2.0":"2012-07-10T14:51:29.754Z"},"author":{"name":"Peter R. G. Small","email":"prgsmall@gmail.com"},"repository":{"type":"git","url":"git://github.com/prgsmall/acequia.git"},"_attachments":{"acequia-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0HAJpk4VT4QLV7rf4PUwtw==","length":18507,"stub":true},"acequia-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5SlkbHITr5PGx6h54EgEpg==","length":17284,"stub":true}}}},
{"id":"acid","key":"acid","value":{"rev":"15-dc59559109fa3dde3fc04161f9511342"},"doc":{"_id":"acid","_rev":"15-dc59559109fa3dde3fc04161f9511342","name":"acid","description":"A rails flavored asset pipeline based on piler","dist-tags":{"latest":"0.2.6"},"versions":{"0.2.0":{"name":"acid","version":"0.2.0","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"17e9255ed2cb7a5f106c5a64c76db23434c0d4ea","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.0.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]},"0.2.1":{"name":"acid","version":"0.2.1","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"01f1653694b3e06d79ad098b1ab1a3c8c30e62b3","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.1.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]},"0.2.2":{"name":"acid","version":"0.2.2","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e5acdebc60d4ad8d9dac401d6a5c9fa048c7b2a6","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.2.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]},"0.2.3":{"name":"acid","version":"0.2.3","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"c8785e28ef0b679e6697ef27afc98426c58602b2","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.3.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]},"0.2.4":{"name":"acid","version":"0.2.4","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7b821c7535302e067fcc01054752d2e2905a8492","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.4.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]},"0.2.5":{"name":"acid","version":"0.2.5","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"0f90ce29e34ac8b31754b7eb1062bd88cf5cdd41","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.5.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]},"0.2.6":{"name":"acid","version":"0.2.6","description":"A rails flavored asset pipeline based on piler","dependencies":{"coffee-script":"","underscore":"","piler":"","handlebars-precompiler":"git://github.com/phreax/node-handlebars-precompiler.git","watch":""},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_npmUser":{"name":"phreax","email":"m.thomas@networksec.de"},"_id":"acid@0.2.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b7364c499df541b08ec4025f5f247975a23695e1","tarball":"http://registry.npmjs.org/acid/-/acid-0.2.6.tgz"},"maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}]}},"readme":"Acid\n====\n\nAcid is rails flavored asset pipeline that makes your assets fly... Based on the excellent\n[piler](https://github.com/epeli/piler), it adds some extra spice on top of it, like global definition\nfiles, precompilation of client-side templates, hot code pushes, and more..\n\nIt was developed for the use with express, backbone.js and handlebars.\n\n\nInstallation\n------------\n\n    npm install https://github.com/phreax/acid.git \n\nUsage\n-----\n\nFirst create a configuration file to define all your assets:\n\nconfig.coffee:\n\n```coffee\nmodule.exports = \n  assets:\n    dir: 'public'\n\n    javascripts: [\n\n      (require: 'vendor/jquery-1.7.1.min.js')\n      (require: 'vendor/underscore.js')\n      (require: 'vendor/backbone.js')\n      \n      (require_tree: 'lib/models')\n      (require_tree: 'lib/collections')\n      (require_tree: 'lib/views')\n\n      (require: 'lib/app.js')\n    ]\n\n    stylesheets: [\n      (require: 'style.css') \n    ]\n\n    templates:\n      dir: 'templates'\n      engine: 'handlebars'\n      lib: 'vendor/handlebars.runtime.js'\n      watch: true\n```\n\nKeys:\n\n* `require`: load single file\n* `require_tree`: load directory recursive\n\nAcid assumes that you have your asset directory structured like this, if not specified:\n\n  javascripts/\n  stylesheets/\n  templates/\n\n### Setup Application\n\nRequire acid:\n\n    acid = require 'acid'\n\nLoad the configuration file:\n\n    config = require 'config'\n\nBind it to your app:\n\n    acid.bind app, acid: config\n\nFor hot code push and live templating you should\nalso add io, otherwise it will be loaded by default.\n\n  acid.bind app, acid: config, io: io\n\n### Setup View\n\nIn your main view you need to add following line, so piler can inject \nthe resources:\n\nindex.jade:\n\n    !{renderScriptTags()}\n\n### Live Templating \n\nAcid will compile all clientside templates for you. Currently only **Handlebars** is supported, which is\na great clientside template engine based on **mustache.js**.\nBut the real kick is, that it will also watch your template directory for changes, and push the code directly\nto the browser, so it will be instantly viewed. Just bind a Backbone event to the Handlebars.set method:\n\n```javascript\n  // set up observer on handlebar templates\n  Handlebars.templates = Handlebars.templates || {};\n  _.extend(Handlebars, Backbone.Events);\n\n  Handlebars.set = _.bind(function(name,template) {\n    _.extend(template,Backbone.Events);\n    this.templates[name] = template;\n    this.trigger('changed',name);\n    this.trigger('changed:'+name);\n  },Handlebars);\n```\n \nNo you can listen to changes of templates and rerender your view!\n\n\n### Supported compilers\n\nhandlebars, coffee-script, less\n\n\n## Depenencies\n\n* express\n* [piler](https://github.com/epeli/piler)\n* [handlebars-precompiler](https://github.com/phreax/node-handlebars-precompiler)\n* socket.io \n\n## Development\n\nAcid is still under heavy development. Contribution is always welcome!\n\n\n","maintainers":[{"name":"phreax","email":"m.thomas@networksec.de"}],"time":{"modified":"2012-06-24T23:21:26.801Z","created":"2012-06-24T19:43:40.209Z","0.2.0":"2012-06-24T19:43:41.494Z","0.2.1":"2012-06-24T20:49:41.931Z","0.2.2":"2012-06-24T20:51:55.857Z","0.2.3":"2012-06-24T21:35:52.141Z","0.2.4":"2012-06-24T22:30:14.736Z","0.2.5":"2012-06-24T23:13:27.543Z","0.2.6":"2012-06-24T23:21:26.801Z"},"repository":{"type":"git","url":"git://github.com/phreax/acid.git"},"_attachments":{"acid-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-X7+Xw7tJSJFb7TrMnSxsgQ==","length":5267,"stub":true},"acid-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-JhJzHwMbPc+ScZaGOj5Gtw==","length":5270,"stub":true},"acid-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6LZtUJaozq0c8Up4JVCjaw==","length":7011,"stub":true},"acid-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-JiymaR3aW1OjOSWvZ6/McQ==","length":5205,"stub":true},"acid-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-s+zK/j1h6xluHLKLej1TyA==","length":5124,"stub":true},"acid-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AKaIYKzLpe9sfCU0FdgAVw==","length":5121,"stub":true},"acid-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tepCQ75eHuvsI5dKdjx/7w==","length":4774,"stub":true}}}},
{"id":"acl","key":"acl","value":{"rev":"23-2f4f15205710e8b1969179528aeb8c71"},"doc":{"_id":"acl","_rev":"23-2f4f15205710e8b1969179528aeb8c71","name":"acl","description":"An Access Control List module, based on Redis with Express middleware support","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.1":{"name":"acl","version":"0.0.1","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{},"devDependencies":{},"_id":"acl@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0416941caf3160044e70f869a36379640a53a9ee","tarball":"http://registry.npmjs.org/acl/-/acl-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}],"directories":{}},"0.0.2":{"name":"acl","version":"0.0.2","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{},"devDependencies":{},"_id":"acl@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1d31b1f61cb0d6bd770319d1598ad4ad16d99bea","tarball":"http://registry.npmjs.org/acl/-/acl-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}],"directories":{}},"0.0.3":{"name":"acl","version":"0.0.3","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{},"devDependencies":{},"_id":"acl@0.0.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"16dd06134c4d34a7555f79cf3081f5ea3167cd85","tarball":"http://registry.npmjs.org/acl/-/acl-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}],"directories":{}},"0.0.4":{"name":"acl","version":"0.0.4","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/manuel/.npm/acl/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"acl@0.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"4cb7662765d1bc7396469b92cf50ebbd1384a231","tarball":"http://registry.npmjs.org/acl/-/acl-0.0.4.tgz"},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}]},"0.1.0":{"name":"acl","version":"0.1.0","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{"redis":">= 0.7.1","async":">=0.1.15","underscore":">= 1.2.2"},"_npmUser":{"name":"manast","email":"manuel@optimalbits.com"},"_id":"acl@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a6e639923dfebddfffaea0961789e30ee4037d2b","tarball":"http://registry.npmjs.org/acl/-/acl-0.1.0.tgz"},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}]},"0.1.1":{"name":"acl","version":"0.1.1","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{"redis":">= 0.7.1","async":">=0.1.15","underscore":">= 1.2.2"},"_npmUser":{"name":"manast","email":"manuel@optimalbits.com"},"_id":"acl@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3eebe7c2c06a8fa279e5564c78d4ce5f00f786fc","tarball":"http://registry.npmjs.org/acl/-/acl-0.1.1.tgz"},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}]},"0.1.2":{"name":"acl","version":"0.1.2","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{"redis":">= 0.7.1","async":">=0.1.15","underscore":">= 1.2.2"},"_npmUser":{"name":"manast","email":"manuel@optimalbits.com"},"_id":"acl@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b247a81a40a4dc68e0cbb77b473e57b672025a66","tarball":"http://registry.npmjs.org/acl/-/acl-0.1.2.tgz"},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}]},"0.1.3":{"name":"acl","version":"0.1.3","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{"redis":">= 0.7.1","async":">=0.1.15","underscore":">= 1.2.2"},"_npmUser":{"name":"manast","email":"manuel@optimalbits.com"},"_id":"acl@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e419614a2ec65f1246afe6d015acd6326384917e","tarball":"http://registry.npmjs.org/acl/-/acl-0.1.3.tgz"},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}]},"0.1.4":{"name":"acl","version":"0.1.4","description":"An Access Control List module, based on Redis with Express middleware support","keywords":["middleware","acl","web"],"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"homepage":"https://github.com/optimalbits/node_acl","engines":{"node":">= 0.4.1"},"main":"./index.js","dependencies":{"redis":">= 0.7.1","async":">=0.1.15","underscore":">= 1.2.2"},"_npmUser":{"name":"manast","email":"manuel@optimalbits.com"},"_id":"acl@0.1.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"82f09fd45263e93bec0d542cbccdc880b61df28b","tarball":"http://registry.npmjs.org/acl/-/acl-0.1.4.tgz"},"readme":"#NODE ACL - Access Control Lists for Node\n\nThis module provides a minimalistic ACL implementation inspired by Zend_ACL using Redis as persistent backend.\n\nWhen you develop a web site or application you will soon notice that sessions are not enough to protect all the \navailable resources. Avoiding that malicious users access other users content proves a much more \ncomplicated task than anticipated. ACL can solve this problem in a flexible and elegant way.\n\nCreate roles and assign roles to users. Sometimes it may even be useful to create one role per user, \nto get the finest granularity possible, while in other situations you will give the *asterisk* permission \nfor admin kind of functionality.\n\n\n##Features\n\n- Users\n- Roles\n- Hierarchies\n- Resources\n- Express middleware for protecting resources.\n- Robust implementation with good unit test coverage.\n\n##Instalation\n\nUsing npm:\n\n\tnpm install acl\n\n##Documentation\n\n* [addUserRoles](#addUserRoles)\n* [removeUserRoles](#removeUserRoles)\n* [userRoles](#userRoles)\n* [addRoleParents](#addRoleParents)\n* [removeRole](#removeRole)\n* [removeResource](#removeResource)\n* [allow](#allow)\n* [removeAllow](#removeAllow)\n* [allowedPermissions](#allowedPermissions)\n* [isAllowed](#isAllowed)\n* [areAnyRolesAllowed](#areAnyRolesAllowed)\n* [whatResources](#whatResources)\n* [clean](#clean)\n* [middleware](#middleware)\n\n##Examples\n\nCreate your acl module by requiring it and instantiating it with a valid node_redis instance and an optional prefix:\n\n\tvar acl = require('acl')\n\tacl = new acl(redisClient)\n\nAll the following functions take a callback with an err parameter as last parameter. We omit it in the examples for simplicity.\n\nCreate roles implicitly by giving them permissions:\n\n\t// guest is allowed to view blogs\n\tacl.allow('guest', 'blogs', 'view')\n\n\t// allow function accepts arrays as any parameter\n\tacl.allow('member', 'blogs', ['edit','view', 'delete'])\n\n\nUsers are likewise created implicitly by assigning them roles:\n\n\tacl.addUserRoles('joed', 'guest')\n\n\nHierarchies of roles can be created by assigning parents to roles:\n\n\tacl.addRoleParents('baz', ['foo','bar'])\n\n\nNote that the order in which you call all the functions is irrelevant (you can add parents first and assign permissions to roles later)\n\n\tacl.allow('foo', ['blogs','forums','news'], ['view', 'delete'])\n\n\nUse the wildcard to give all permissions:\n\n\tacl.allow('admin', ['blogs','forums'], '*')\n\n\nSometimes is necessary to set permissions on many different roles and resources. This would\nlead to unnecessary nested callbacks for handling errors. Instead use the following:\n\n\tacl.allow([{roles:['guest','member'], \n                    allows:[\n                          {resources:'blogs', permissions:'get'},\n                          {resources:['forums','news'], permissions:['get','put','delete']}]\n\t\t\t\t},\n\t\t\t    {roles:['gold','silver'], \n                    allows:[\n                          {resources:'cash', permissions:['sell','exchange']},\n                          {resources:['account','deposit'], permissions:['put','delete']}]\n\t\t\t\t}\n\t\t\t\t]})\n\nYou can check if a user has permissions to access a given resource with *isAllowed*:\n\n\tacl.isAllowed('joed', 'blogs', 'view', function(err, res){\n\t\tif(res){\n\t\t\tconsole.log(\"User joed is allowed to view blogs\")\n\t\t}\n\t}\n\n\nOf course arrays are also accepted in this function:\n\n\tacl.isAllowed('jsmith', 'blogs', ['edit','view','delete'])\n\nNote that all permissions must be full filed in order to get *true*.\n\n\nSometimes is necessary to know what permissions a given user has over certain resources:\n\n\tacl.allowedPermissions('james', ['blogs','forums'], function(err, permissions){\n\t\tconsole.log(permissions)\n\t})\n\nIt will return an array of resource:[permissions] like this:\n\n\t[{'blogs' : ['get','delete']},\n     {'forums':['get','put']}]\n\n\nFinally, we provide a middleware for Express for easy protection of resources. \n\n\tacl.middleware()\n\nWe can protect a resource like this:\n\n\tapp.put('/blogs/:id', acl.middleware(), function(req, res, next){…}\n\nThe middleware will protect the resource named by *req.url*, pick the user from *req.session.userId* and check the permission for *req.method*, so the above would be equivalent to something like this:\n\n\tacl.isAllowed(req.session.userId, '/blogs/12345', 'put')\n\nThe middleware accepts 3 optional arguments, that are useful in some situations. For example, sometimes we \ncannot consider the whole url as the resource:\n\n\tapp.put('/blogs/:id/comments/:commentId', acl.middleware(3), function(req, res, next){…}\n\nIn this case the resource will be just the three first components of the url (without the ending slash).\n\nIt is also possible to add a custom userId or check for other permissions than the method:\n\n\tapp.put('/blogs/:id/comments/:commentId', acl.middleware(3, 'joed', 'post'), function(req, res, next){…}\n\n\n## Methods\n\n<a name=\"addUserRoles\"/>\n### addUserRoles( userId, roles, function(err) )\n\nAdds roles to a given user id.\n\n__Arguments__\n \n    userId   {String} User id.\n    roles    {String|Array} Role(s) to add to the user id.\n    callback {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"removeUserRoles\"/>\n### removeUserRoles( userId, roles, function(err) )\n  \nRemove roles from a given user.\n\n__Arguments__\n\n    userId   {String} User id.\n    roles    {String|Array} Role(s) to remove to the user id.\n    callback {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"userRoles\" />\n### userRoles( userId, function(err, roles) )\n\nReturn all the roles from a given user.\n\n__Arguments__\n  \n    userId   {String} User id.\n    callback {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"addRoleParents\" />\n### addRoleParents( role, parents, function(err) )\n\nAdds a parent or parent list to role.\n\n__Arguments__\n\n    role     {String} User id.\n    parents  {String|Array} Role(s) to remove to the user id.\n    callback {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"removeRole\" />\n### removeRole( role, function(err) )\n  \nRemoves a role from the system.\n\n__Arguments__\n  \n    role     {String} Role to be removed\n    callback {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"removeResource\" />\n### removeResource( resource, function(err) )\n  \nRemoves a resource from the system\n\n__Arguments__\n  \n    resource {String} Resource to be removed\n    callback {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"allow\" />\n### allow( roles, resources, permissions, function(err) )\n\nAdds the given permissions to the given roles over the given resources.\n\n__Arguments__\n  \n    roles       {String|Array} role(s) to add permissions to.\n    resources   {String|Array} resource(s) to add permisisons to.\n    permissions {String|Array} permission(s) to add to the roles over the resources.\n    callback    {Function} Callback called when finished.\n  \n\n### allow( permissionsArray, function(err) )\n  \n__Arguments__\n\n    permissionsArray {Array} Array with objects expressing what permissions to give.\n       [{roles:{String|Array}, allows:[{resources:{String|Array}, permissions:{String|Array}]]\n  \n    callback         {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"removeAllow\" />\n###  removeAllow( role, resources, permissions, function(err) )\n\nRemove permissions from the given roles owned by the given role.\n\nNote: we loose atomicity when removing empty role_resources.\n\n__Arguments__\n  \n    role        {String}\n    resources   {String|Array}\n    permissions {String|Array}\n    callback    {Function}\n\n---------------------------------------\n\n<a name=\"allowedPermissions\" />\n### allowedPermissions( userId, resources, function(err, obj) )\n\nReturns all the allowable permissions a given user have to\naccess the given resources.\n  \nIt returns an array of objects where every object maps a \nresource name to a list of permissions for that resource.\n\n__Arguments__\n  \n    userId    {String} User id.\n    resources {String|Array} resource(s) to ask permissions for.\n    callback  {Function} Callback called when finished.\n\n---------------------------------------\n\n<a name=\"isAllowed\" />\n### isAllowed( userId, resource, permissions, function(err, allowed) )\n  \nChecks if the given user is allowed to access the resource for the given \npermissions (note: it must fulfill all the permissions).\n\n__Arguments__\n  \n    userId      {String} User id.\n    resource    {String|Array} resource(s) to ask permissions for.\n    permissions {String|Array} asked permissions.\n    callback    {Function} Callback called wish the result.\n\n---------------------------------------\n<a name=\"areAnyRolesAllowed\" />\n### areAnyRolesAllowed( roles, resource, permissions, function(err, allowed) )\n  \nReturns true if any of the given roles have the right permissions.\n\n__Arguments__\n  \n    roles       {String|Array} Role(s) to check the permissions for.\n    resource    {String} resource(s) to ask permissions for.\n    permissions {String|Array} asked permissions.\n    callback    {Function} Callback called wish the result.\n\n---------------------------------------\n<a name=\"whatResources\" />\n### whatResources(role, function(err, {resourceName: [permissions]})\n\nReturns what resources a given role has permissions over.\n\n__Arguments__\n\n    role        {String|Array} Roles\n    callback    {Function} Callback called with the result.\n\nwhatResources(role, permissions, function(err, resources) )\n    \nReturns what resources a role has the given permissions over.\n\n__Arguments__\n  \n    role        {String|Array} Roles\n    permissions {String[Array} Permissions\n    callback    {Function} Callback called wish the result.\n\n---------------------------------------\n<a name=\"clean\" />\n### clean ()\n\nCleans all the keys with the given prefix from redis.\n    \nNote: this operation is not reversible!.\n\n---------------------------------------\n\n<a name=\"middleware\" />\n### middleware( [numPathComponents, userId, permissions] )\n\nMiddleware for express. \n\n__Arguments__\n\n    numPathComponents {Number} number of components in the url to be considered part of the resource name.\n    userId \t\t\t  {String} the user id for the acl system (or if not specified, req.userId)\n    permissions \t  {Array} the permissions to check for.\n\n##Tests\n\nRun tests with vows:\n \tvows test/*\n\n##Persistence\n\nCurrently the persistence is achieved using redis, which was chosen due to its excellent support for\nset operations that are heavily used by acl. \n\n## Future work\n\n- Support for denials (deny a role a given permission)\n\n\n##License \n\n(The MIT License)\n\nCopyright (c) 2011 Manuel Astudillo <manuel@optimalbits.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}]}},"maintainers":[{"name":"manast","email":"manuel@optimalbits.com"}],"time":{"modified":"2012-02-19T16:42:42.280Z","created":"2011-08-16T22:16:47.547Z","0.0.1":"2011-08-16T22:16:48.433Z","0.0.2":"2011-08-16T22:20:36.133Z","0.0.3":"2011-08-17T09:29:48.291Z","0.0.4":"2011-09-21T08:14:45.601Z","0.1.0":"2011-11-20T22:30:52.339Z","0.1.1":"2011-11-22T09:08:44.754Z","0.1.2":"2011-11-24T12:02:04.551Z","0.1.3":"2011-12-04T21:12:10.162Z","0.1.4":"2012-02-19T16:42:42.280Z"},"author":{"name":"Manuel Astudillo","email":"manuel@optimalbits.com"},"repository":{"type":"git","url":"git://github.com/optimalbits/node_acl.git"},"_attachments":{"acl-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-hZLEUCtSdrA5KbG2F5zScw==","length":10325,"stub":true},"acl-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-OQG+gU1GiNzu+CH0kk+kBQ==","length":20480,"stub":true},"acl-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-3t15jBFrWuYizaI2swo+Bw==","length":10240,"stub":true},"acl-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-LztY1T2TkoF5kwIoxN/Wiw==","length":10240,"stub":true},"acl-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-YQrtTxZ+2Jeh1fgc/sgADg==","length":10240,"stub":true},"acl-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-CnrdLxP5jIapzEx9LXQwWQ==","length":7930,"stub":true},"acl-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BfBfbGmGiD2bURoyRJOCRA==","length":7861,"stub":true},"acl-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-FJLUK9q6Y9iCeFast8pRhg==","length":7801,"stub":true},"acl-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-C8g6BE1EtrLtd74PyfaK+g==","length":8343,"stub":true}}}},
{"id":"acs","key":"acs","value":{"rev":"3-d80cd36e5763af63e1d2ae4abfb4570c"},"doc":{"_id":"acs","_rev":"3-d80cd36e5763af63e1d2ae4abfb4570c","name":"acs","description":"node.js wrapper for ACS","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"acs","version":"0.0.1","description":"node.js wrapper for ACS","homepage":"http://github.com/cocoafish/node-acs","repository":{"type":"git","url":"git://github.com/cocoafish/node-acs.git"},"main":"./lib/client.js","scripts":{"test":"node ./test/*-test.js"},"dependencies":{"utile":"*","request":"2.2.x"},"devDependencies":{"nock":"0.10.x"},"author":{"name":"Michael Goff","email":"mgoff@appcelerator.com"},"_npmUser":{"name":"mgoff","email":"mgoff@appcelerator.com"},"_id":"acs@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1a43dea48012a836db2d2f02fc126e4e54570269","tarball":"http://registry.npmjs.org/acs/-/acs-0.0.1.tgz"},"readme":"","maintainers":[{"name":"mgoff","email":"mgoff@appcelerator.com"}]}},"readme":"","maintainers":[{"name":"mgoff","email":"mgoff@appcelerator.com"}],"time":{"modified":"2012-05-02T17:56:32.103Z","created":"2012-05-02T17:56:29.529Z","0.0.1":"2012-05-02T17:56:32.103Z"},"author":{"name":"Michael Goff","email":"mgoff@appcelerator.com"},"repository":{"type":"git","url":"git://github.com/cocoafish/node-acs.git"},"_attachments":{"acs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-V4Brw4EyOzxksITzzBPAVA==","length":375,"stub":true}}}},
{"id":"acs-cli","key":"acs-cli","value":{"rev":"4-14a166c4f5f18acb3baacd286074817b"},"doc":{"_id":"acs-cli","_rev":"4-14a166c4f5f18acb3baacd286074817b","name":"acs-cli","description":"node.js client for azure acs management service.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Leandro Boffi","email":"leandro.boffi@tellago.com"},"name":"acs-cli","description":"node.js client for azure acs management service.","version":"0.0.1","repository":{"type":"git","url":"https://bitbucket.org/tellagostudios/node-acs-cli.git"},"scripts":{"test":"mocha tests/index.js --timeout 10000"},"dependencies":{"request":"*","odata-cli":"*"},"devDependencies":{"mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"main":"./index","_npmUser":{"name":"machadogj","email":"machadogj@gmail.com"},"_id":"acs-cli@0.0.1","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"6fd7514504b89f2fb369d2f6a0c351511da9c38a","tarball":"http://registry.npmjs.org/acs-cli/-/acs-cli-0.0.1.tgz"},"readme":"","maintainers":[{"name":"machadogj","email":"machadogj@gmail.com"}]}},"readme":"","maintainers":[{"name":"machadogj","email":"machadogj@gmail.com"}],"time":{"modified":"2012-08-02T13:43:42.049Z","created":"2012-07-31T18:52:42.198Z","0.0.1":"2012-07-31T18:52:45.131Z"},"author":{"name":"Leandro Boffi","email":"leandro.boffi@tellago.com"},"repository":{"type":"git","url":"https://bitbucket.org/tellagostudios/node-acs-cli.git"},"users":{"fgribreau":true},"_attachments":{"acs-cli-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GTkLhwilegLYMRcOYhdl2A==","length":3400,"stub":true}}}},
{"id":"actionHero","key":"actionHero","value":{"rev":"218-e76906a2ec0c9030a95e90acaa922340"},"doc":{"_id":"actionHero","_rev":"218-e76906a2ec0c9030a95e90acaa922340","name":"actionHero","description":"actionHero is a node.js API framework for both tcp sockets, web sockets, and http clients.  The goal of actionHero are to create an easy-to-use toolkit for making reusable & scalable APIs","dist-tags":{"latest":"3.0.1"},"versions":{"0.1.0":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.0","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"express":"2.x.x","async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","connect-form":"0.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"c04c3caea0b4c6311e1bcafbc29efe33b66acbec","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.0.tgz"},"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.1","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"express":"2.x.x","async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","connect-form":"0.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"e704c1aec644fc68927badc476d685590b30645d","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.1.tgz"},"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.2","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"express":"2.x.x","async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","connect-form":"0.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"0ead4e123dad05114b6bcf4370a1978783d32ac9","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.2.tgz"},"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.3","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"af07975e2d47c39171e34316b4807d170bb983cc","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.3.tgz"},"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.1.4":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.4","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"39d37cc540cfa5de107539547ab492510f5c8b73","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.4.tgz"},"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.1.6":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.6","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"a4b25ad87b38e10b52d064b916c01a0bcc21d9a8","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.6.tgz"},"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.1.7":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.1.7","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":"0.6.x"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.1.7","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"25611373d55941a152a2fa068530b97cae2ff6cb","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.1.7.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.2.1":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.2.1","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"899968302866f5f363d323261f602a1f281f2378","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.2.1.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.2.2":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.2.2","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4cb0e1903df7d68ff08bce50f004f797a7427efa","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.2.2.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.2.3":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.2.3","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","mysql":"0.x.x","sequelize":"1.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.2.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d246bc14a77587d7fee115934431cec1cb382430","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.2.3.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.2.4":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.2.4","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.2.4","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d41a9f1ca72da4640a69a74fce2ae1ae7df5d27a","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.2.4.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.2.5":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.2.5","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.2.5","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8256c433e0ba353d2317346c0ed42e418e318752","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.2.5.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"0.2.6":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"0.2.6","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows --spec ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@0.2.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ff9d05acda22de927204e8e5cc3b1ffaaf4e9eaa","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-0.2.6.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"1.0.0":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"1.0.0","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows --spec ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@1.0.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9c9763cbfe7653c08323ff9840ad3af285c9fdca","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-1.0.0.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"1.0.1":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"1.0.1","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows --spec ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@1.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"791291ad36cd5563164608fc0f7ffa9f61df73a7","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-1.0.1.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"1.0.2":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"1.0.2","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@1.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"4cb80da692562efcfda91a76ca7351c7f07e77c6","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-1.0.2.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"1.0.3":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"1.0.3","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows ./spec/*"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@1.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"198ddb90187811cb4dd5ba8ad8fce796d93b85d6","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-1.0.3.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"2.0.0":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"2.0.0","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","hiredis":"0.x.x","redis":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows spec/* -v --dot-matrix"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@2.0.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"da06eb7461c3b86c8ae748822b18c1371ce61e75","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-2.0.0.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"2.0.1":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"2.0.1","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"./api.js","engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","hiredis":"0.x.x","redis":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows spec/* -v --dot-matrix"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@2.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b8addd6d82a4cbe93642eafa26ef0e4b8f0ec2bd","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-2.0.1.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"2.0.2":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a minimalist, multi-node, transactional API framework written in javaScript","version":"2.0.2","homepage":"https://github.com/evantahler/actionHero","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"api","keywords":["socket","http","game","cluster","soa","service","api","tcp"],"engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","hiredis":"0.x.x","redis":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows spec/* -v --dot-matrix"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@2.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f3df8f263dca825cc94971e105fc882f6a0b5b05","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-2.0.2.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"2.0.3":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a node.js API framework for both tcp sockets and http clients","version":"2.0.3","homepage":"http://actionherojs.com","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"api","keywords":["socket","http","game","cluster","soa","service","api","tcp"],"engines":{"node":">=0.5.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","hiredis":"0.x.x","redis":"0.x.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows spec/* -v --dot-matrix"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@2.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"f55b8048309f01225d29b867e042287c3ecf8575","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-2.0.3.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"2.0.4":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a node.js API framework for both tcp sockets and http clients","version":"2.0.4","homepage":"http://actionherojs.com","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"api","keywords":["socket","http","game","cluster","soa","service","api","tcp"],"engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","hiredis":"0.x.x","redis":"x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows spec/* -v --dot-matrix"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@2.0.4","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"30e619d7c2e4a0240bb3710f851e3555856c1cf3","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-2.0.4.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"directories":{}},"3.0.0":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a node.js API framework for both tcp sockets and http clients","version":"3.0.0","homepage":"http://actionherojs.com","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"api","keywords":["socket","http","game","cluster","soa","service","api","tcp"],"engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","hiredis":"0.x.x","redis":"x","socket.io":"0.9.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./actionHero","test":"./node_modules/.bin/vows spec/* -v --dot-matrix"},"_id":"actionHero@3.0.0","dist":{"shasum":"5a5a9f29b7a8f21da9dbb40ead043f341b597a0b","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-3.0.0.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}]},"3.0.1":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHero","description":"actionHero is a node.js API framework for both tcp sockets, web sockets, and http clients.  The goal of actionHero are to create an easy-to-use toolkit for making reusable & scalable APIs","version":"3.0.1","homepage":"http://actionherojs.com","repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"main":"api","keywords":["socket","http","game","cluster","soa","service","api","tcp"],"engines":{"node":">=0.6.0"},"dependencies":{"async":"0.x.x","request":"2.x.x","validator":"0.x.x","formidable":"1.x.x","colors":"0.x.x","data2xml":"x","mime":"1.x.x","redis":"x","socket.io":"0.9.x"},"devDependencies":{"vows":"0.x.x"},"scripts":{"start":"./scripts/actionHero","install":"./scripts/install","test":"./node_modules/.bin/vows spec/* -v --dot-matrix","generate":"./scripts/generate"},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHero@3.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"69c0b1442375a6153d307d71073bb4a30c598321","tarball":"http://registry.npmjs.org/actionHero/-/actionHero-3.0.1.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}]}},"readme":null,"maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"time":{"modified":"2012-08-12T04:24:56.976Z","created":"2011-12-21T04:45:33.632Z","0.1.0":"2011-12-21T04:45:35.124Z","0.1.1":"2011-12-23T06:07:30.143Z","0.1.2":"2011-12-24T04:00:22.075Z","0.1.3":"2011-12-25T05:07:20.428Z","0.1.4":"2011-12-29T22:52:03.044Z","0.1.6":"2012-01-04T04:28:48.113Z","0.1.7":"2012-01-19T07:51:50.775Z","0.2.1":"2012-01-27T17:05:44.902Z","0.2.2":"2012-01-30T05:49:55.325Z","0.2.3":"2012-02-02T04:36:08.161Z","0.2.4":"2012-02-10T04:10:27.808Z","0.2.5":"2012-02-13T02:19:00.489Z","0.2.6":"2012-03-18T20:54:26.725Z","1.0.0":"2012-03-29T02:36:59.982Z","1.0.1":"2012-04-09T04:29:23.514Z","1.0.2":"2012-04-12T03:22:43.637Z","1.0.3":"2012-04-27T21:30:17.477Z","2.0.0":"2012-05-23T06:43:52.920Z","2.0.1":"2012-05-26T19:09:20.522Z","2.0.2":"2012-06-12T04:16:22.482Z","2.0.3":"2012-06-27T06:59:29.904Z","2.0.4":"2012-07-17T05:30:40.292Z","3.0.0":"2012-07-30T19:47:22.863Z","3.0.1":"2012-08-12T04:24:56.976Z"},"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"repository":{"type":"git","url":"git://github.com/evantahler/actionHero.git"},"users":{"fgribreau":true},"_attachments":{"actionHero-3.0.1.tgz":{"content_type":"application/octet-stream","revpos":218,"digest":"md5-/OKAjJYsjJCZKZc9nRPBHQ==","length":305880,"stub":true},"actionHero-3.0.0.tgz":{"content_type":"application/octet-stream","revpos":215,"digest":"md5-lMNV17LrKpZ4APg/F+yB5w==","length":183535,"stub":true},"actionHero-2.0.4.tgz":{"content_type":"application/octet-stream","revpos":205,"digest":"md5-cSuem16TPGWBruUshK6OUg==","length":178326,"stub":true},"actionHero-2.0.3.tgz":{"content_type":"application/octet-stream","revpos":203,"digest":"md5-FjlfVBuWSEULh8ZdL2fV3Q==","length":178238,"stub":true},"actionHero-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":193,"digest":"md5-Pu9+dorhqeeeanYZr5NYHw==","length":176238,"stub":true},"actionHero-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":183,"digest":"md5-HxdtcM2EDDDooCSrjHMqvg==","length":173403,"stub":true},"actionHero-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":177,"digest":"md5-nvZkgkFIsg8wPCjs0GLRcw==","length":173282,"stub":true},"actionHero-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":171,"digest":"md5-az0KHssNEAyToL+tgUSBDQ==","length":174124,"stub":true},"actionHero-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":165,"digest":"md5-WhCx7OK36M657pVutxuonQ==","length":173517,"stub":true},"actionHero-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":135,"digest":"md5-ILyF2ajkONvH4uTwvhIxTQ==","length":172962,"stub":true},"actionHero-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":133,"digest":"md5-r17FFVsRmGbSA3QArQgGSA==","length":171565,"stub":true},"actionHero-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-8oGNqC1Xpuyp9GaeFu7dVw==","length":173991,"stub":true},"actionHero-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-Mwq2Uosei9xOcOqz1OwFuw==","length":171680,"stub":true},"actionHero-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-NnqOucmeRAcGsz5J4bhxbg==","length":174909,"stub":true},"actionHero-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-F5+t8hSJoKUkwBDQiOHv7g==","length":174784,"stub":true},"actionHero-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-A3CiBdxGYGhhk8KDEG39TA==","length":173190,"stub":true},"actionHero-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-5gFogDmvTqXbnG7fES3J4w==","length":158896,"stub":true},"actionHero-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-nNGAPeOza51oynPafUTK7w==","length":56914,"stub":true},"actionHero-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-OhAyBieUdV24xcHazchE4w==","length":61440,"stub":true},"actionHero-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-EERcNXR+tC0+27kIRfRU1Q==","length":51200,"stub":true},"actionHero-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-8vzvFNWmrSgYKeHyDWwfOg==","length":51200,"stub":true},"actionHero-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-sY3SCslqkHrnpLR+CAgsLQ==","length":51200,"stub":true},"actionHero-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-FN6157+kCJoY6KNYiwbkog==","length":51200,"stub":true},"actionHero-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AzSRjYl85BBqNvIQwpx/2A==","length":20480,"stub":true}}}},
{"id":"actionHeroClient","key":"actionHeroClient","value":{"rev":"3-fe5ef8b2daa1a1df70ffff90953e8e6d"},"doc":{"_id":"actionHeroClient","_rev":"3-fe5ef8b2daa1a1df70ffff90953e8e6d","name":"actionHeroClient","description":"actionHero client in JS for other node servers to use","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"name":"actionHeroClient","description":"actionHero client in JS for other node servers to use","version":"0.0.1","homepage":"https://github.com/evantahler/actionHeroNodeClient","repository":{"type":"git","url":"git://github.com/evantahler/actionHeroNodeClient.git"},"main":"actionHeroClient","keywords":["socket","tcp","actionHero"],"engines":{"node":">=0.4.x"},"dependencies":{},"scripts":{},"_npmUser":{"name":"evantahler","email":"evantahler@gmail.com"},"_id":"actionHeroClient@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-9","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f9cf6f05995577428c95b8ad36d38d3cc663d127","tarball":"http://registry.npmjs.org/actionHeroClient/-/actionHeroClient-0.0.1.tgz"},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}]}},"readme":"","maintainers":[{"name":"evantahler","email":"evantahler@gmail.com"}],"time":{"modified":"2012-06-11T00:28:03.805Z","created":"2012-06-11T00:28:02.585Z","0.0.1":"2012-06-11T00:28:03.805Z"},"author":{"name":"Evan Tahler","email":"evantahler@gmail.com"},"repository":{"type":"git","url":"git://github.com/evantahler/actionHeroNodeClient.git"},"_attachments":{"actionHeroClient-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-U0bqmQ9IMRiezckQT4fHsg==","length":4451,"stub":true}}}},
{"id":"actionline","key":"actionline","value":{"rev":"7-3e1df6bd3fdd0e8a92391d60068b4bcd"},"doc":{"_id":"actionline","_rev":"7-3e1df6bd3fdd0e8a92391d60068b4bcd","name":"actionline","description":"tool of a command liner","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Faisal Ahmed","email":"hello@fais.al","url":"fais.al"},"name":"actionline","description":"tool of a command liner","version":"0.0.0","repository":{"type":"git","url":"git://github.com/faisdotal/actionline.git"},"engines":{"node":"*"},"dependencies":{"colors":"latest"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"faisdotal","email":"hello@fais.al"},"_id":"actionline@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"4e5d5ff853c4a7e616da761cca72476c31210ca1","tarball":"http://registry.npmjs.org/actionline/-/actionline-0.0.0.tgz"},"maintainers":[{"name":"faisdotal","email":"hello@fais.al"}]},"0.0.1":{"author":{"name":"Faisal Ahmed","email":"hello@fais.al","url":"fais.al"},"name":"actionline","description":"tool of a command liner","version":"0.0.1","repository":{"type":"git","url":"git://github.com/faisdotal/actionline.git"},"engines":{"node":"*"},"dependencies":{"colors":"latest","nopt":"latest"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"faisdotal","email":"hello@fais.al"},"_id":"actionline@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"ed1d2b4145742acae1ed51105ed68e80ea86ef72","tarball":"http://registry.npmjs.org/actionline/-/actionline-0.0.1.tgz"},"maintainers":[{"name":"faisdotal","email":"hello@fais.al"}]},"0.0.2":{"author":{"name":"Faisal Ahmed","email":"hello@fais.al","url":"fais.al"},"name":"actionline","description":"tool of a command liner","version":"0.0.2","repository":{"type":"git","url":"git://github.com/faisdotal/actionline.git"},"engines":{"node":"*"},"dependencies":{"colors":"latest","nopt":"latest"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"faisdotal","email":"hello@fais.al"},"_id":"actionline@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"d29eea0e7bae9c2197b8e74e53227f77e424a818","tarball":"http://registry.npmjs.org/actionline/-/actionline-0.0.2.tgz"},"maintainers":[{"name":"faisdotal","email":"hello@fais.al"}]}},"readme":"actionline\n=====\n\ntool of a command liner\n","maintainers":[{"name":"faisdotal","email":"hello@fais.al"}],"time":{"modified":"2012-05-26T16:42:46.371Z","created":"2012-05-21T15:47:13.758Z","0.0.0":"2012-05-21T15:47:15.503Z","0.0.1":"2012-05-24T14:27:46.149Z","0.0.2":"2012-05-26T16:42:46.371Z"},"author":{"name":"Faisal Ahmed","email":"hello@fais.al","url":"fais.al"},"repository":{"type":"git","url":"git://github.com/faisdotal/actionline.git"},"_attachments":{"actionline-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ErK6qCIQAARmutGEYs9f5g==","length":2723,"stub":true},"actionline-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lnkjNmAzwleT7u+lhgfZTQ==","length":1770,"stub":true},"actionline-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xoh0YjUSWwhfDI48/AhWHQ==","length":1338,"stub":true}}}},
{"id":"active-client","key":"active-client","value":{"rev":"5-0ca16ae2e48a3ba9de2f6830a8c2d3a0"},"doc":{"_id":"active-client","_rev":"5-0ca16ae2e48a3ba9de2f6830a8c2d3a0","name":"active-client","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"active-client","version":"0.1.0","directories":{"lib":"./lib"},"author":{"name":"Subbu Allamaraju","email":"subbu@subbu.org","url":"http://www.subbu.org"},"main":"./lib/active-client","_id":"active-client@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.3.2","dist":{"tarball":"http://registry.npmjs.org/active-client/-/active-client-0.1.0.tgz"}},"0.1.1":{"name":"active-client","version":"0.1.1","directories":{"lib":"./lib"},"author":{"name":"Subbu Allamaraju","email":"subbu@subbu.org","url":"http://www.subbu.org"},"main":"./lib/active-client","_id":"active-client@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.3.2","dist":{"tarball":"http://registry.npmjs.org/active-client/-/active-client-0.1.1.tgz"}}},"maintainers":[{"name":"s3u","email":"subbu@subbu.org"}],"time":{"modified":"2011-01-03T21:21:12.218Z","created":"2011-01-03T21:00:23.861Z","0.1.0":"2011-01-03T21:00:24.327Z","0.1.1":"2011-01-03T21:21:12.218Z"},"author":{"name":"Subbu Allamaraju","email":"subbu@subbu.org","url":"http://www.subbu.org"},"_attachments":{"active-client-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kN6LIQTMUSZlqDulRSTHUw==","length":2686,"stub":true},"active-client-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3vxH6UfCF7AMeeD/6kTkhQ==","length":1533,"stub":true}}}},
{"id":"active-x-obfuscator","key":"active-x-obfuscator","value":{"rev":"3-ddd7027baae2fbbebd4b24ea0621e4a7"},"doc":{"_id":"active-x-obfuscator","_rev":"3-ddd7027baae2fbbebd4b24ea0621e4a7","name":"active-x-obfuscator","description":"A module to (safely) obfuscate all occurrences of the string 'ActiveX' inside any JavaScript code.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"active-x-obfuscator","description":"A module to (safely) obfuscate all occurrences of the string 'ActiveX' inside any JavaScript code.","version":"0.0.1","homepage":"https://github.com/felixge/node-active-x-obfuscator","repository":{"type":"git","url":"git://github.com/felixge/node-active-x-obfuscator.git"},"main":"./index","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{"zeparser":"0.0.5"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"active-x-obfuscator@0.0.1","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"089b89b37145ff1d9ec74af6530be5526cae1f1a","tarball":"http://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]}},"readme":"# active-x-obfuscator\n\nA module to (safely) obfuscate all occurrences of the string 'ActiveX' inside\nany JavaScript code.\n\n## Why?\n\nSome corporate firewalls /proxies such as Blue Coat block JavaScript files to be\ndownloaded if they contain the word `'ActiveX'`. That of course is very annoying\nfor libraries such as [socket.io][] that need to use `ActiveXObject` for\nsupporting IE8 and older.\n\n## Install\n\n```\nnpm install active-x-obfuscator\n```\n\n## Usage\n\n```js\nvar activeXObfuscator = require('active-x-obfuscator');\nvar code = 'foo(new ActiveXObject());';\n\nvar obfuscated = activeXObfuscator(code);\n// -> foo(new window[(['Active'].concat('Object').join('X'))])\n```\n\n## License\n\nLicensed under the MIT license.\n\n[socket.io]: http://socket.io/\n","maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"time":{"modified":"2012-02-28T10:08:04.636Z","created":"2012-02-28T10:08:02.911Z","0.0.1":"2012-02-28T10:08:04.636Z"},"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"repository":{"type":"git","url":"git://github.com/felixge/node-active-x-obfuscator.git"},"_attachments":{"active-x-obfuscator-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9nBhrP35jb8hu+ngslT2SA==","length":22579,"stub":true}}}},
{"id":"activenode-monitor","key":"activenode-monitor","value":{"rev":"9-2634fa446379c39475d0ce4183fb92f2"},"doc":{"_id":"activenode-monitor","_rev":"9-2634fa446379c39475d0ce4183fb92f2","name":"activenode-monitor","description":"Instrumentation library for Node.js applications that use Express/connect","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"author":{"name":"Gabbar","email":"sreeix@gmail.com"},"name":"activenode-monitor","description":"Instrumentation library for Express instrumentation","version":"0.0.1","repository":{"type":"git","url":"git@github.com:nko2/activenode.git"},"main":"monitor.js","engine":"node 0.4.8","dependencies":{"underscore":"1.1.6","redback":"0.2.7","redis":"0.6.7","hiredis":"0.1.12"},"devDependencies":{},"_id":"activenode-monitor@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"62a2c31b303379b820b0992c2f5ccd9976f9afab","tarball":"http://registry.npmjs.org/activenode-monitor/-/activenode-monitor-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"sreeix","email":"sreeix@gmail.com"}]},"0.0.2":{"author":{"name":"Gabbar","email":"sreeix@gmail.com"},"name":"activenode-monitor","description":"Instrumentation library for Node.js applications that use Express/connect","version":"0.0.2","repository":{"type":"git","url":"git@github.com:nko2/activenode.git"},"main":"monitor.js","engine":"node 0.4.8","dependencies":{"underscore":"1.1.6","redis":"0.6.7","hiredis":"0.1.12"},"devDependencies":{},"_id":"activenode-monitor@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c62a3aff71df9c20662f3140d91c27afed5b037c","tarball":"http://registry.npmjs.org/activenode-monitor/-/activenode-monitor-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"sreeix","email":"sreeix@gmail.com"}]},"0.0.3":{"author":{"name":"Gabbar","email":"sreeix@gmail.com"},"name":"activenode-monitor","description":"Instrumentation library for Node.js applications that use Express/connect","version":"0.0.3","repository":{"type":"git","url":"git@github.com:nko2/activenode.git"},"main":"monitor.js","engine":"node 0.4.8","dependencies":{"underscore":"1.1.6","redis":"0.6.7","hiredis":"0.1.12"},"devDependencies":{},"_id":"activenode-monitor@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4343ebd81f5c26978a32382d001180c021219fa2","tarball":"http://registry.npmjs.org/activenode-monitor/-/activenode-monitor-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"sreeix","email":"sreeix@gmail.com"}]},"0.0.4":{"author":{"name":"Gabbar","email":"sreeix@gmail.com"},"name":"activenode-monitor","description":"Instrumentation library for Node.js applications that use Express/connect","version":"0.0.4","repository":{"type":"git","url":"git@github.com:nko2/activenode.git"},"main":"monitor.js","engine":"node 0.4.8","dependencies":{"underscore":"1.1.6","redis":"0.6.7","useragent":"0.1.2","hiredis":"0.1.12"},"devDependencies":{},"_id":"activenode-monitor@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c4cdfcbcd0d923ed3a8878b9770098b774843eef","tarball":"http://registry.npmjs.org/activenode-monitor/-/activenode-monitor-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"sreeix","email":"sreeix@gmail.com"}]}},"maintainers":[{"name":"sreeix","email":"sreeix@gmail.com"}],"time":{"modified":"2011-08-28T21:50:41.478Z","created":"2011-08-28T17:10:13.472Z","0.0.1":"2011-08-28T17:10:15.320Z","0.0.2":"2011-08-28T19:39:16.810Z","0.0.3":"2011-08-28T20:56:18.774Z","0.0.4":"2011-08-28T21:50:41.478Z"},"author":{"name":"Gabbar","email":"sreeix@gmail.com"},"repository":{"type":"git","url":"git@github.com:nko2/activenode.git"},"_attachments":{"activenode-monitor-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-UCJNwlbVKlfN2B/JYTiWgQ==","length":1961,"stub":true},"activenode-monitor-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-wdqQ2+N6efm4zo/W8m11hA==","length":1868,"stub":true},"activenode-monitor-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eeUBl3Yt4+0mlxWeIwyHCw==","length":1832,"stub":true},"activenode-monitor-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-c58TzUXO4O9uAOZGB2sqFA==","length":1817,"stub":true}}}},
{"id":"activeobject","key":"activeobject","value":{"rev":"43-6d73e28412612aaee37771e3ab292c3d"},"doc":{"_id":"activeobject","_rev":"43-6d73e28412612aaee37771e3ab292c3d","name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","dist-tags":{"latest":"0.3.3"},"versions":{"0.0.1":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.0.1","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"88273ca289a18930ed807f1723bb50a8d4d63d90","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.0.1.tgz"},"scripts":{}},"0.0.2":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.0.2","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"921d5574b70245eb344fca5edca6e9c04340577b","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.0.2.tgz"},"scripts":{}},"0.0.3":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.0.3","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d313017f618cafd0c893af3b8b0aaa639aba93d0","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.0.3.tgz"},"scripts":{}},"0.0.4":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.0.4","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"472834615e91bcde5252f3aa5eb6ecd09a301993","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.0.4.tgz"},"scripts":{}},"0.0.5":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.0.5","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"4eb2eab3041cfcca63cb9708ba00ae172b0dc554","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.0.5.tgz"},"scripts":{}},"0.1.0":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.1.0","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"36da8b1e0a95fd13d1dc5fc66336db0699825e6a","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.1.1","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d6fa16459d0e1769e8b8ddc3d7e5e83abb64ab95","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.1.1.tgz"},"scripts":{}},"0.2.0":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.0","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"97070c0c66d49d44169b98d1c4f24e37f32e3392","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.1","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"544b15bcc1d1e1bea9cea351d253c2d3b4af8a7a","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.1.tgz"},"scripts":{}},"0.2.2":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.2","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"861af0739d83c7b148d446f79972aa3ae1f60b30","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.2.tgz"},"scripts":{}},"0.2.3":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.3","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"50fae96d0f6dc32c49773bf73666208a06296fe3","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.3.tgz"},"scripts":{}},"0.2.4":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.4","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"bafa80e20391ecaa5671782577cc0a65e732e80a","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.4.tgz"},"scripts":{}},"0.2.5":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.5","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"2b3e08116844f42fbd6fdb7d15f116cc4976b9db","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.5.tgz"},"scripts":{}},"0.2.6":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.6","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"bb8c4e655324b42313702a6c06da8210b60a0907","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.6.tgz"},"scripts":{}},"0.2.7":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.7","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ad1eb29f54f10909b80267d3670419315ad2fbc7","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.7.tgz"},"scripts":{}},"0.2.8":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.8","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"12a8b394d4b91038ed9c68e8f4c482e49a9f1ce7","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.8.tgz"},"scripts":{}},"0.2.9":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.2.9","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.2.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f40811981d0ea1f60990b6437b46b6d50ea74035","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.2.9.tgz"},"scripts":{}},"0.3.0":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.3.0","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"c211bafd060f1d70e7f94d8a938620bc715b57fa","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.3.0.tgz"},"scripts":{}},"0.3.1":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.3.1","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_id":"activeobject@0.3.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"68ba63c8199ae428437782c0614070afe45b2152","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.3.1.tgz"},"scripts":{}},"0.3.2":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.3.2","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_npmJsonOpts":{"file":"/Users/michaelhemesath/.npm/activeobject/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"activeobject@0.3.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"669a89ee286d60ac4388beec36f0c0796720be6d","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.3.2.tgz"},"scripts":{}},"0.3.3":{"name":"activeobject","description":"An interface for JSON objects for updating, deleting, inserting and creating properties.","version":"0.3.3","author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"keywords":["json","node"],"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"main":"./index.js","engines":{"node":">= 0.4.0"},"dependencies":{"underscore":"1.1.6","node-uuid":"1.1.0"},"_npmJsonOpts":{"file":"/Users/michaelhemesath/.npm/activeobject/0.3.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"activeobject@0.3.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"74d3bc997aa7cb4ddbd7dd0487c4e391bbe5ae64","tarball":"http://registry.npmjs.org/activeobject/-/activeobject-0.3.3.tgz"},"scripts":{}}},"maintainers":[{"name":"mike.hemesath","email":"mike.hemesath@gmail.com"}],"time":{"modified":"2011-07-21T20:55:34.329Z","created":"2011-06-13T12:26:46.100Z","0.0.1":"2011-06-13T12:26:46.600Z","0.0.2":"2011-06-13T12:28:14.602Z","0.0.3":"2011-06-13T12:46:38.220Z","0.0.4":"2011-06-13T18:09:17.090Z","0.0.5":"2011-06-14T17:18:32.634Z","0.1.0":"2011-06-14T17:20:10.123Z","0.1.1":"2011-06-14T18:28:09.262Z","0.2.0":"2011-06-15T21:11:07.158Z","0.2.1":"2011-06-15T21:36:59.779Z","0.2.2":"2011-06-16T14:12:32.983Z","0.2.3":"2011-06-16T15:05:01.550Z","0.2.4":"2011-06-16T16:24:52.470Z","0.2.5":"2011-06-16T19:10:27.684Z","0.2.6":"2011-06-17T16:49:32.292Z","0.2.7":"2011-06-17T16:58:41.497Z","0.2.8":"2011-06-20T17:35:50.186Z","0.2.9":"2011-06-20T17:49:56.363Z","0.3.0":"2011-06-23T17:23:06.259Z","0.3.1":"2011-06-27T20:51:09.297Z","0.3.2":"2011-07-14T20:06:53.810Z","0.3.3":"2011-07-21T20:55:34.329Z"},"author":{"name":"Mike hemesath","email":"mike.hemsath@gmail.com"},"repository":{"type":"git","url":"git@github.com:mhemesath/activeobject.git"},"_attachments":{"activeobject-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-/y6xLAvFdPupr7E0Fz+IZg==","length":7519,"stub":true},"activeobject-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-8xDgZCXMiWl0JuPTgePjXg==","length":7292,"stub":true},"activeobject-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-Z1EtqIXFHvQpqZoXnzmBLQ==","length":6689,"stub":true},"activeobject-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-0bR8ewOn0g4MQ3mCS4jZ0A==","length":6439,"stub":true},"activeobject-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-b/A0R57X5K4l65AeUoq/OA==","length":6329,"stub":true},"activeobject-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-viCWuJyASOsN9yucVbMExw==","length":6300,"stub":true},"activeobject-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-ES1HiKLylr+VCZIZ6IFLcw==","length":6249,"stub":true},"activeobject-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-R/L27Zopj6lqlwBpVrBkTw==","length":6187,"stub":true},"activeobject-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-NxUJtzzAJcTt9pakKPpGUw==","length":6173,"stub":true},"activeobject-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Q9KvPMQ7/qYdFugJo3ZecA==","length":6125,"stub":true},"activeobject-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-gU3NsRnx1Wj0TxS+p4FjJQ==","length":6072,"stub":true},"activeobject-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-c0FwZQCayo6am0Qyo02kWg==","length":6054,"stub":true},"activeobject-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-taVy+e196CpXhsRWqEWhog==","length":5900,"stub":true},"activeobject-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-TX3MXOf5r1/ctkYxwgchCg==","length":5759,"stub":true},"activeobject-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-pVgSQL2XFjRT0rlASngddw==","length":5000,"stub":true},"activeobject-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-d1a2x9n0I2hT6T+UyNgrlw==","length":4923,"stub":true},"activeobject-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-RqNfJQsaLsZziI1EQwOeJg==","length":4931,"stub":true},"activeobject-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pyUuf8+IV5b2IyaEc02LSw==","length":4854,"stub":true},"activeobject-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-13LV6M7bq+lNXCOta2EqhA==","length":4587,"stub":true},"activeobject-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GB1TShjeYDFgneAkmMekGg==","length":4467,"stub":true},"activeobject-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4OC1np2RTRZPVZS7yN3Erw==","length":4468,"stub":true}}}},
{"id":"activerecord","key":"activerecord","value":{"rev":"19-e7a68be3514b695bfdb26b33bfa16010"},"doc":{"_id":"activerecord","_rev":"19-e7a68be3514b695bfdb26b33bfa16010","name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","dist-tags":{"latest":"0.2.1"},"versions":{"0.0.1":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.0.1","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"30981bf591bf2ea1b95296fb10d945d7fa88cc78","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.0.1.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.0.2":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.0.2","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c1787a60fb43ebc582afbdee8fee7b485525d464","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.0.2.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.0.3":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.0.3","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.0.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"69bb8a7aba9541f01f6d01819f9010c0e131eaee","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.0.3.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.0.4":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.0.4","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.0.4","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"089d9ca0e65a8f6a37f843db015e73b16b130b4b","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.0.4.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.0.5":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.0.5","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9","mocha":">= 1.0.3","should":">= 0.6.3"},"scripts":{"test":"mocha --compilers coffee:coffee-script --require should --reporter spec"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.0.5","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a06d72ddfaca7d1cd5b108b4ad0bfe51067235aa","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.0.5.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.1.0":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.1.0","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9","mocha":">= 1.0.3","should":">= 0.6.3"},"scripts":{"test":"mocha --compilers coffee:coffee-script --require should --reporter spec"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.1.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a371c510df0b88c7c2e926c37340797dbed67875","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.1.0.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.1.1":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.1.1","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9","mocha":">= 1.0.3","should":">= 0.6.3"},"scripts":{"test":"mocha --compilers coffee:coffee-script --require should --reporter spec"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.1.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b72e865824677835e7171473a0e39bca75f66e8d","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.1.1.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.2.0":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.2.0","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9","mocha":">= 1.0.3","should":">= 0.6.3"},"scripts":{"test":"mocha --compilers coffee:coffee-script --require should --reporter spec"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.2.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"29790d57aeaac099555aeb88a72827e2101b29d5","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.2.0.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]},"0.2.1":{"name":"activerecord","description":"An ORM that supports multiple database systems (SQL/NoSQL) and ID generation middleware.","version":"0.2.1","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"homepage":"https://github.com/meltingice/node-activerecord","main":"./lib","repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"devDependencies":{"coffee-script":">= 1.3.1","sqlite3":">= 2.1.3","glob":">= 3.1.9","mocha":">= 1.0.3","should":">= 0.6.3"},"scripts":{"test":"mocha --compilers coffee:coffee-script --require should --reporter spec"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"activerecord@0.2.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a6fc543dcc70d925eb161bb274ff7258cdbb9d85","tarball":"http://registry.npmjs.org/activerecord/-/activerecord-0.2.1.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]}},"readme":"# node-activerecord\n\nAn ORM written in Coffeescript that supports multiple database systems, both SQL and NoSQL, as well as ID generation middleware. It is fully extendable to add new database systems and plugins.\n\n**Note:** this project is new and is not finished yet. There is still a lot of functionality to add.\n\n## Examples\n\n**Configuration**\n\n``` coffeescript\nActiveRecord = require '../src'\n\nmodule.exports = new ActiveRecord.Configuration\n  sqlite:\n    database: \"#{__dirname}/test.db\"\n  mysql:\n    host: 'localhost'\n    database: 'test'\n    user: 'test'\n    password: 'password'\n```\n\n**Model Definition**\n\n``` coffeescript\nActiveRecord = require '../src'\nconfig = require __dirname + \"/config\"\n\n# Note: uses sqlite3 by default\nclass User extends ActiveRecord.Model\n  config: config\n  fields: ['id', 'username', 'name']\n```\n\n**Creating a Record**\n\n``` coffeescript\nuser = new User()\nuser.username = \"meltingice\"\nuser.name = \"Ryan\"\nuser.save()\n```\n\n**Retreiving a Record**\n\n``` coffeescript\nUser.find 1, (user) -> console.log user.toJSON()\n```","maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}],"time":{"modified":"2012-05-16T03:02:22.374Z","created":"2012-05-05T01:22:36.726Z","0.0.1":"2012-05-05T01:22:37.495Z","0.0.2":"2012-05-05T01:53:10.716Z","0.0.3":"2012-05-05T04:09:46.266Z","0.0.4":"2012-05-06T16:56:23.134Z","0.0.5":"2012-05-06T22:39:52.245Z","0.1.0":"2012-05-07T02:20:58.838Z","0.1.1":"2012-05-07T04:10:13.695Z","0.2.0":"2012-05-16T02:38:55.091Z","0.2.1":"2012-05-16T03:02:22.374Z"},"author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net"},"repository":{"type":"git","url":"git://github.com/meltingice/node-activerecord.git"},"_attachments":{"activerecord-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-b/XSukzijbCNmsZ4ocDaKw==","length":16742,"stub":true},"activerecord-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-+NaNyBUa63vLys5Uqhl9Sw==","length":16125,"stub":true},"activerecord-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-sSKhkMGmSizYQ54749+y1A==","length":14019,"stub":true},"activerecord-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-EdxHZEd0cp2TZLIjxILIyQ==","length":12486,"stub":true},"activerecord-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uflI1Da/y1Fs1kidKekxGA==","length":10320,"stub":true},"activerecord-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-UF1WUz8TtekGL4ZP8Kgm1A==","length":7802,"stub":true},"activerecord-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-XQpVq5YXGIjfHBHB8d72XA==","length":7655,"stub":true},"activerecord-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ygwxjjZwH5x9mmWMxi8PmQ==","length":5753,"stub":true},"activerecord-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-biiiEK153nljgNhya7Assg==","length":3268,"stub":true}}}},
{"id":"activity-streams-mongoose","key":"activity-streams-mongoose","value":{"rev":"27-670b5edd2a5dcc54f8f89a2e689c29f6"},"doc":{"_id":"activity-streams-mongoose","_rev":"27-670b5edd2a5dcc54f8f89a2e689c29f6","name":"activity-streams-mongoose","description":"Activity Streams Engine using MongoDB(Mongoose odm) and Redis","dist-tags":{"latest":"0.0.11"},"versions":{"0.0.1":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.1","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"eb6fd6f49fec9fcfbf5d5525a4c88e91d3752d18","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.2","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"39c3ab639d29f34f7ed7cf9e4c63a698ab9f4710","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.3","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{"redis":">= 0.5.11 < 1.0.0","hiredis":">= 0.1.9 < 1.0.0"},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a7e55f0d647bbb92022561f8694c4a243a9debc2","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.4","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{"redis":">= 0.5.11 < 1.0.0","hiredis":">= 0.1.9 < 1.0.0"},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"67a21a06643b1f474d61b8b118a65899feaa0a3f","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}],"directories":{}},"0.0.5":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.5","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{"redis":">= 0.5.11 < 1.0.0","hiredis":">= 0.1.9 < 1.0.0"},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f936805ffbe605b43eecb69c46a9b4b57ee6b23f","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]},"0.0.6":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.6","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{"mongoose":"","redis":">= 0.5.11 < 1.0.0","hiredis":">= 0.1.9 < 1.0.0"},"devDependencies":{"nodeunit":""},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"88f06c1c50f7d6c7f75cd14fdd5f92e54dcc8788","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]},"0.0.7":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams via Mongoose","version":"0.0.7","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{"mongoose":"","underscore":"","redis":">= 0.5.11 < 1.0.0"},"devDependencies":{"nodeunit":""},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1d7d77aaa38690abb61ca2e6b62d241a46d1fa08","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.7.tgz"},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]},"0.0.8":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams Engine using MongoDB(Mongoose odm) and Redis","version":"0.0.8","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{"mongoose":"","underscore":"","redis":">= 0.5.11 < 1.0.0"},"devDependencies":{"nodeunit":""},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b5942c3aab932f3ee3f43aee99d3afb9d1646075","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.8.tgz"},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]},"0.0.9":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams Engine using MongoDB(Mongoose odm) and Redis","version":"0.0.9","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{"mongoose":"","underscore":"","redis":">= 0.5.11 < 1.0.0"},"devDependencies":{"nodeunit":""},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"103d5affcfc0c3b1268dbb0a85f0fb8c0d6a053a","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.9.tgz"},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]},"0.0.10":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams Engine using MongoDB(Mongoose odm) and Redis","version":"0.0.10","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{"mongoose":"","underscore":"","redis":">= 0.5.11 < 1.0.0"},"devDependencies":{"nodeunit":""},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e566e7ba077d9f65ff3a590cac243524ad421dff","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.10.tgz"},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]},"0.0.11":{"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"name":"activity-streams-mongoose","description":"Activity Streams Engine using MongoDB(Mongoose odm) and Redis","version":"0.0.11","repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{"mongoose":"","underscore":"","redis":">= 0.5.11 < 1.0.0"},"devDependencies":{"nodeunit":""},"_npmUser":{"name":"ciberch","email":"ciberch@gmail.com"},"_id":"activity-streams-mongoose@0.0.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4bb78a68764f3c9c312968b405e6000b41cbf396","tarball":"http://registry.npmjs.org/activity-streams-mongoose/-/activity-streams-mongoose-0.0.11.tgz"},"maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}]}},"readme":"## Overview\n\nActivity Streams is a simple specification used to describe social actions around the web. http://activitystrea.ms\n\nThis library provides the following Activity Stream Models on Mongoose:\n\n* ActivityObject\n* Activity\n\nFor details on the properties each see pne of the following specifications:\n\n* http://activitystrea.ms/specs/json/1.0/\n* http://opensocial-resources.googlecode.com/svn/spec/2.0/Social-Data.xml#ActivityEntry\n\n\n## Usage\n\n### First require the library passing an instance of Mongoose\n\n```javascript\nvar mongoose = require('mongoose');\nmongoose.connect(siteConf.mongoUrl);\nvar asmsDB = require('activity-streams-mongoose')(mongoose);\n```\n\n### To create an activity object you can do\n\n```javascript\nvar cf = new asmsDB.ActivityObject({displayName: \"Cloud Foundry\" , url: \"http://www.cloudfoundry.com\"});\ncf.save(function (err) {\n    //...\n    }\n});\n\n```\n\n### To create an activity with an associated activity object you can do\n\n```javascript\n\nvar testAct = new asmsDB.Activity({title: \"Started the app\", target: target._id});\ntestAct.save(function (err) {\n    //...\n});\n\n```\n\n### To query the Activity Streams do\n\nAsking for the latest 5:\n\n```javascript\nasmsDB.getActivityStream(5, function (err, docs) {\n   docs.forEach(function(doc){console.log(doc);});\n});\n\n```","maintainers":[{"name":"ciberch","email":"ciberch@gmail.com"}],"time":{"modified":"2012-06-05T20:57:25.717Z","created":"2012-01-24T01:23:48.889Z","0.0.1":"2012-01-24T01:23:49.916Z","0.0.2":"2012-01-24T01:32:00.696Z","0.0.3":"2012-01-24T08:39:26.793Z","0.0.4":"2012-01-24T09:01:05.381Z","0.0.5":"2012-01-26T22:33:18.576Z","0.0.6":"2012-01-27T23:41:36.805Z","0.0.7":"2012-03-26T03:47:43.788Z","0.0.8":"2012-05-03T23:16:20.766Z","0.0.9":"2012-05-03T23:20:17.360Z","0.0.10":"2012-06-05T19:26:26.330Z","0.0.11":"2012-06-05T20:57:25.717Z"},"author":{"name":"Monica Wilkinson","email":"ciberch@gmail.com","url":"http://ciberch.cloudfoundry.com"},"repository":{"type":"git","url":"git://github.com/ciberch/activity-streams-mongoose.git"},"_attachments":{"activity-streams-mongoose-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-9JiY6fIaRHddIBSvG9D5oQ==","length":2992,"stub":true},"activity-streams-mongoose-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-sijdkWPgkx2IaNZJ1Oe5AQ==","length":2970,"stub":true},"activity-streams-mongoose-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-PrIdKwgOILqF557y3OT3+g==","length":2982,"stub":true},"activity-streams-mongoose-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-/NPGi+N7d1ypBovrwl8bGg==","length":2986,"stub":true},"activity-streams-mongoose-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-foiTbe4lnTZp3XEbOARm3Q==","length":10240,"stub":true},"activity-streams-mongoose-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-OATZ6c6RBm4qJZhvMlNENQ==","length":10240,"stub":true},"activity-streams-mongoose-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Gp1Ra8PjRvYWyQpn6uibOw==","length":10240,"stub":true},"activity-streams-mongoose-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ez728YW+WF/e7csFrUl75Q==","length":10240,"stub":true},"activity-streams-mongoose-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-52UV3o5PSIxKCdAVe2aI3A==","length":10240,"stub":true},"activity-streams-mongoose-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZhkkT4b4SXoJQD5UurguOw==","length":10240,"stub":true},"activity-streams-mongoose-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Lww6bQXb20hwLFS9K9OpqQ==","length":10240,"stub":true}}}},
{"id":"actor","key":"actor","value":{"rev":"3-f6b84acd7d2e689b860e3142a18cd460"},"doc":{"_id":"actor","_rev":"3-f6b84acd7d2e689b860e3142a18cd460","name":"actor","description":"Experimental library implementing scala like actors in javascript.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"actor","version":"0.0.2","description":"Experimental library implementing scala like actors in javascript.","homepage":"http://github.com/Gozala/actor/","keywords":["actor","generators","async","javascript 1.7"],"contributors":[{"name":"Irakli Gozalishvili","email":"rfobic@gmail.com","url":"http://jeditoolkit.com"}],"repository":{"type":"git","url":"git://github.com/Gozala/actor.git"},"bugs":{"url":"http://github.com/Gozala/actor/issues/"},"directories":{"doc":"./docs","lib":"./lib","test":"./test"},"main":"./lib/actor","engines":{"teleport":">=0.2.0","jetpack":"0.9.0"},"dependencies":{"test":">=0.0.10","light-traits":">=0.0.6","q":">=0.1.0"},"licenses":[{"type":"MPL 1.1/LGPL 2.1/GPL 2.0","url":"http://www.mozilla.org/MPL/"}],"_id":"actor@0.0.2","_nodeSupported":false,"_npmVersion":"0.2.10-1","_nodeVersion":"v0.3.0","dist":{"shasum":"bf1648532935ecb0b484591ba6e500cccd8e5739","tarball":"http://registry.npmjs.org/actor/-/actor-0.0.2.tgz"}}},"maintainers":[{"name":"gozala","email":"rfobic@gmail.com"}],"repository":{"type":"git","url":"git://github.com/Gozala/actor.git"},"_attachments":{"actor-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IX1ZE2HqVBsBz/Knfdwx7A==","length":61003,"stub":true}}}},
{"id":"actors","key":"actors","value":{"rev":"3-6df913bbe5b99968a2e71ae4ef07b2d2"},"doc":{"_id":"actors","_rev":"3-6df913bbe5b99968a2e71ae4ef07b2d2","name":"actors","description":"Simple message passing for node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"actors","description":"Simple message passing for node.js","tags":["node","coffeescript","actors"],"version":"0.0.1","author":{"name":"Alen Mujezinovic","email":"alen@caffeinehit.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git@github.com:flashingpumpkin/node-actors.git"},"bugs":"https://github.com/flashingpumpkin/node-actors/issues","engines":["node >= 0.2.0"],"directories":{"lib":"./lib"},"main":"./lib/actors","dependencies":{"amqp":">=0.0.2","uuid":">=0.0.2"},"_id":"actors@0.0.1","_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/actors/-/actors@0.0.1.tgz"}}},"maintainers":[{"name":"flashingpumpkin","email":"alen@caffeinehit.com"}],"author":{"name":"Alen Mujezinovic","email":"alen@caffeinehit.com"},"repository":{"type":"git","url":"git@github.com:flashingpumpkin/node-actors.git"},"_attachments":{"actors@0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Fi+gDgHo7IVRZfZ6OAm6wA==","length":9977,"stub":true}}}},
{"id":"acunu-analytics","key":"acunu-analytics","value":{"rev":"8-e750e4a343f0604e1cd44d96be835bde"},"doc":{"_id":"acunu-analytics","_rev":"8-e750e4a343f0604e1cd44d96be835bde","name":"acunu-analytics","description":"Interface to the Acunu Analytics platform API","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Dan Palmer","email":"dan.palmer@me.com","url":"http://danpalmer.me/"},"name":"acunu-analytics","description":"Interface to the Acunu Analytics platform API","version":"0.0.1","homepage":"http://danpalmer.me/node-acunu-analytics","repository":{"type":"git","url":"git://github.com/danpalmer/node-acunu-analytics.git"},"main":"src/acunu-analytics.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danpalmer","email":"dan.palmer@me.com"},"_id":"acunu-analytics@0.0.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"26b20898a2ce35a1cb8b8348dce2aba86b076220","tarball":"http://registry.npmjs.org/acunu-analytics/-/acunu-analytics-0.0.1.tgz"},"maintainers":[{"name":"danpalmer","email":"dan.palmer@me.com"}]},"0.0.2":{"author":{"name":"Dan Palmer","email":"dan.palmer@me.com","url":"http://danpalmer.me/"},"name":"acunu-analytics","description":"Interface to the Acunu Analytics platform API","version":"0.0.2","homepage":"http://danpalmer.me/node-acunu-analytics","repository":{"type":"git","url":"git://github.com/danpalmer/node-acunu-analytics.git"},"main":"src/acunu-analytics.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danpalmer","email":"dan.palmer@me.com"},"_id":"acunu-analytics@0.0.2","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"cdcb484081dfe4e226b275219517301c3f7714a8","tarball":"http://registry.npmjs.org/acunu-analytics/-/acunu-analytics-0.0.2.tgz"},"maintainers":[{"name":"danpalmer","email":"dan.palmer@me.com"}]},"0.0.3":{"author":{"name":"Dan Palmer","email":"dan.palmer@me.com","url":"http://danpalmer.me/"},"name":"acunu-analytics","description":"Interface to the Acunu Analytics platform API","version":"0.0.3","homepage":"http://danpalmer.me/node-acunu-analytics","repository":{"type":"git","url":"git://github.com/danpalmer/node-acunu-analytics.git"},"main":"src/acunu-analytics.js","dependencies":{"cassandra-client":"*","underscore":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danpalmer","email":"dan.palmer@me.com"},"_id":"acunu-analytics@0.0.3","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"bd0d764f380b002d034ddb6fac4801e5a923f00d","tarball":"http://registry.npmjs.org/acunu-analytics/-/acunu-analytics-0.0.3.tgz"},"maintainers":[{"name":"danpalmer","email":"dan.palmer@me.com"}]}},"readme":"node-acunu-analytics\n====================\n\nInterface to the Acunu Analytics platform API","maintainers":[{"name":"danpalmer","email":"dan.palmer@me.com"}],"time":{"modified":"2012-08-03T11:25:42.472Z","created":"2012-07-30T11:17:50.322Z","0.0.1":"2012-07-30T11:17:51.421Z","0.0.2":"2012-07-31T13:56:54.390Z","0.0.3":"2012-08-03T11:25:42.472Z"},"author":{"name":"Dan Palmer","email":"dan.palmer@me.com","url":"http://danpalmer.me/"},"repository":{"type":"git","url":"git://github.com/danpalmer/node-acunu-analytics.git"},"users":{"fgribreau":true},"_attachments":{"acunu-analytics-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-Ldn7fc3B8ivYn1pm8McpqA==","length":3696,"stub":true},"acunu-analytics-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-89hKF3rkrUFvd418DdTJPQ==","length":1628,"stub":true},"acunu-analytics-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-boVuAnTvuO5PWhAKuydy+g==","length":649,"stub":true}}}},
{"id":"adb","key":"adb","value":{"rev":"3-afc5c2a6cadeee530791a092533c928b"},"doc":{"_id":"adb","_rev":"3-afc5c2a6cadeee530791a092533c928b","name":"adb","description":"A node.js module which implement pure javascript adb protocol to control Android device","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"adb","version":"0.2.0","main":"./adb.js","description":"A node.js module which implement pure javascript adb protocol to control Android device","keywords":["android","adb"],"author":{"name":"Flier Lu","email":"flier.lu@gmail.com","url":"http://flier.lu"},"license":{"type":"MIT"},"repository":{"type":"git","url":"http://github.com/flier/adb.js.git"},"engines":{"node":"*"},"readme":"adb.js\n======\n\nA node.js module which implement pure javascript adb protocol to control Android device","_id":"adb@0.2.0","dist":{"shasum":"622d803b3fcc0d004751fc07661856442e3eb3c1","tarball":"http://registry.npmjs.org/adb/-/adb-0.2.0.tgz"},"maintainers":[{"name":"flier","email":"flier.lu@gmail.com"}]}},"readme":"adb.js\n======\n\nA node.js module which implement pure javascript adb protocol to control Android device","maintainers":[{"name":"flier","email":"flier.lu@gmail.com"}],"time":{"modified":"2012-07-10T07:38:42.816Z","created":"2012-07-10T07:38:35.031Z","0.2.0":"2012-07-10T07:38:42.816Z"},"author":{"name":"Flier Lu","email":"flier.lu@gmail.com","url":"http://flier.lu"},"repository":{"type":"git","url":"http://github.com/flier/adb.js.git"},"_attachments":{"adb-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ww2kWgbJmWo4EsilR6gBgg==","length":545206,"stub":true}}}},
{"id":"addTimeout","key":"addTimeout","value":{"rev":"15-e5170f0597fe8cf5ed0b54b7e6f2cde1"},"doc":{"_id":"addTimeout","_rev":"15-e5170f0597fe8cf5ed0b54b7e6f2cde1","name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first arguemnt for returning the Timeout Error","version":"0.1.0","keywords":["timeout","timeframe","callback"],"homepage":"http://homepage","repository":{"type":"git","url":"git repo"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.1.0","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4277c6f3945d97a8b09768c4fc40c29b9915bb3d","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.1.0.tgz"}},"0.1.1":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","version":"0.1.1","keywords":["timeout","timeframe","callback"],"homepage":"http://github.com/temsa/addTimeout","repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.1.1","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f3bbb5c0a574f11bf063db68c56b6685f2b5f20c","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.1.1.tgz"}},"0.1.2":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","version":"0.1.2","keywords":["timeout","timeframe","callback"],"homepage":"http://github.com/temsa/addTimeout","repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.1.2","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"b280b6377993f42ee9adffa8107c39c37f397ad3","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.1.2.tgz"}},"0.2.0":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","version":"0.2.0","keywords":["timeout","timeframe","callback"],"homepage":"http://github.com/temsa/addTimeout","repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{"err":">=0.6.0"},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.2.0","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"b3602584ca6acd811f6b1b2ac918d3a24549abdd","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.2.0.tgz"}},"0.2.1":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","version":"0.2.1","keywords":["timeout","timeframe","callback"],"homepage":"http://github.com/temsa/addTimeout","repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{"err":">=0.6.0"},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.2.1","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0d8bd7ea008c73eecb05b3dd1fbe1b791c2aae80","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.2.1.tgz"}},"0.2.2":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","version":"0.2.2","keywords":["timeout","timeframe","callback"],"homepage":"http://github.com/temsa/addTimeout","repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{"err":">=0.6.0"},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.2.2","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"3318702f28eea835be323e16cfd6c2a71b343481","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.2.2.tgz"}},"0.2.3":{"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"name":"addTimeout","description":"Wraps a callback to handle a timeout. If the timeout occurs before the callback being called, it either uses the first argument for returning the TimeoutError (Node.JS style) or let it handle by a specialized handler","version":"0.2.3","keywords":["timeout","timeframe","callback"],"homepage":"http://github.com/temsa/addTimeout","repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"main":"index.js","scripts":{"test":"node test/test.js"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"vows":">=0.5.8"},"_id":"addTimeout@0.2.3","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"b690b390e2d777f4cd3710a1b38aea160a0ca86b","tarball":"http://registry.npmjs.org/addTimeout/-/addTimeout-0.2.3.tgz"}}},"maintainers":[{"name":"temsa","email":"florian.traverse+npm@gmail.com"}],"time":{"modified":"2011-07-25T18:09:44.185Z","created":"2011-07-21T11:54:57.795Z","0.1.0":"2011-07-21T11:54:58.330Z","0.1.1":"2011-07-21T14:14:42.509Z","0.1.2":"2011-07-21T14:28:45.589Z","0.2.0":"2011-07-25T11:17:52.456Z","0.2.1":"2011-07-25T13:36:20.565Z","0.2.2":"2011-07-25T14:48:21.747Z","0.2.3":"2011-07-25T18:09:44.185Z"},"author":{"name":"Florian Traverse","email":"florian.traverse@gmail.com","url":"http://pullrequest.org"},"repository":{"type":"git","url":"git://github.com/temsa/addTimeout.git"},"_attachments":{"addTimeout-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-TClvVmRwS0+2MWJlYM2Gvg==","length":2701,"stub":true},"addTimeout-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-fnEz6g7XM+98nTlnNwx/2Q==","length":2504,"stub":true},"addTimeout-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-swcBFG229j/ZGAKllIUraQ==","length":2479,"stub":true},"addTimeout-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Pyp6hYm9OdhhIaNImB8NGw==","length":2337,"stub":true},"addTimeout-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fVCW4IBL4RrboKj5lHV3sA==","length":2188,"stub":true},"addTimeout-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jy0CeorPyFRgG3msFH88QQ==","length":2188,"stub":true},"addTimeout-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yasgQ4v/GQolKblO+x6g5Q==","length":2017,"stub":true}}}},
{"id":"addon","key":"addon","value":{"rev":"3-81013c1f4fe87912917157288ba92379"},"doc":{"_id":"addon","_rev":"3-81013c1f4fe87912917157288ba92379","name":"addon","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"marak squires","email":"marak.squires@gmail.com"},"name":"addon","version":"0.0.0","repository":{"url":""},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"marak","email":"marak.squires@gmail.com"},"_id":"addon@0.0.0","_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"14b2e8ea3327cb4ef3532bfeaaed89cea3fc9a0f","tarball":"http://registry.npmjs.org/addon/-/addon-0.0.0.tgz"},"readme":"","maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}]}},"readme":"","maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2012-04-07T05:01:18.248Z","created":"2012-04-07T05:01:16.814Z","0.0.0":"2012-04-07T05:01:18.248Z"},"author":{"name":"marak squires","email":"marak.squires@gmail.com"},"repository":{"url":""},"_attachments":{"addon-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qA5FIQt13jGpOjayzfwgcQ==","length":249,"stub":true}}}},
{"id":"addons","key":"addons","value":{"rev":"3-204ebfc9d4796f2a18f629167b1ed694"},"doc":{"_id":"addons","_rev":"3-204ebfc9d4796f2a18f629167b1ed694","name":"addons","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"name":"addons","version":"0.0.0","repository":{"url":""},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"marak","email":"marak.squires@gmail.com"},"_id":"addons@0.0.0","_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"31c0df2a1de9d49261a625dd8d3a74dab3dcbb43","tarball":"http://registry.npmjs.org/addons/-/addons-0.0.0.tgz"},"readme":"","maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}]}},"readme":"","maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2012-04-07T05:00:44.452Z","created":"2012-04-07T05:00:42.904Z","0.0.0":"2012-04-07T05:00:44.452Z"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"url":""},"_attachments":{"addons-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-647fHpahVjnc5UM6YHx9rg==","length":253,"stub":true}}}},
{"id":"addr","key":"addr","value":{"rev":"5-10d09a8c30521755ca8df3007cca3cfe"},"doc":{"_id":"addr","_rev":"5-10d09a8c30521755ca8df3007cca3cfe","name":"addr","description":"Get the remote address of a request, with reverse-proxy support","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.0":{"name":"addr","version":"0.0.0","description":"Get the remote address of a request, with reverse-proxy support","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-addr.git"},"keywords":["ip","address","reverse-proxy","x-forwarded-for"],"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"license":"MIT","devDependencies":{"mocha":"*","request":"~2.9.203"},"readme":"addr\n====\n\nGet the remote address of a request, with reverse-proxy support\n\nUsage\n=====\n\n```bash\n$ npm install addr\n```\n\n`addr(req, [proxies])`\n\n- `req`: an `http.ServerRequest` object.\n- `proxes`: an array of IP addresses of trusted proxies. If specified and\n  the request doesn't come from one of these addresses, `false` will be returned.\n- Returns: Remote IP address of the request, taken from the `X-Forwarded-For`\n  header if it exists and the request is coming from a trusted proxy.\n\nExample\n=======\n\n```javascript\nvar addr = require('addr')\n  , http = require('http')\n  , port = 3000\n  , proxies = ['127.0.0.1', '1.2.3.4']\n  ;\n\nhttp.createServer(function(req, res) {\n  res.writeHead(200, {'Content-Type': 'application/json'});\n  res.write(JSON.stringify({addr: addr(req, proxies)}));\n  res.end();\n}).listen(port, function() {\n  console.log('test server running on port ' + port);\n});\n```\n\nLicense\n=======\n\nMIT","_id":"addr@0.0.0","dist":{"shasum":"6a8a9cbb2c4a593eb244276ac805cbcb276a15da","tarball":"http://registry.npmjs.org/addr/-/addr-0.0.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"1.0.0":{"name":"addr","version":"1.0.0","description":"Get the remote address of a request, with reverse-proxy support","main":"index.js","scripts":{"test":"make test"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-addr.git"},"keywords":["ip","address","reverse-proxy","x-forwarded-for"],"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"license":"MIT","devDependencies":{"mocha":"*","request":"~2.9.203"},"readme":"addr\n====\n\nGet the remote address of a request, with reverse-proxy support\n\nUsage\n=====\n\n```bash\n$ npm install addr\n```\n\n`addr(req, [proxies])`\n\n- `req`: an `http.ServerRequest` object.\n- `proxes`: an array of IP addresses of trusted proxies. If specified and\n  the request doesn't come from one of these addresses, the `X-Forwarded-For`\n  header will not be honored.\n- Returns: Remote IP address of the request, taken from the `X-Forwarded-For`\n  header if it exists and the request is coming from a trusted proxy.\n\nExample\n=======\n\n```javascript\nvar addr = require('addr')\n  , http = require('http')\n  , port = 3000\n  , proxies = ['127.0.0.1']\n  ;\n\nhttp.createServer(function(req, res) {\n  res.writeHead(200, {'Content-Type': 'application/json'});\n  res.write(JSON.stringify({addr: addr(req, proxies)}));\n  res.end();\n}).listen(port, function() {\n  console.log('test server running on port ' + port);\n});\n```\n\nLicense\n=======\n\nMIT","_id":"addr@1.0.0","dist":{"shasum":"881c7a502830dc089e6945e95308dbb3cca3bb4e","tarball":"http://registry.npmjs.org/addr/-/addr-1.0.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"addr\n====\n\nGet the remote address of a request, with reverse-proxy support\n\nUsage\n=====\n\n```bash\n$ npm install addr\n```\n\n`addr(req, [proxies])`\n\n- `req`: an `http.ServerRequest` object.\n- `proxes`: an array of IP addresses of trusted proxies. If specified and\n  the request doesn't come from one of these addresses, `false` will be returned.\n- Returns: Remote IP address of the request, taken from the `X-Forwarded-For`\n  header if it exists and the request is coming from a trusted proxy.\n\nExample\n=======\n\n```javascript\nvar addr = require('addr')\n  , http = require('http')\n  , port = 3000\n  , proxies = ['127.0.0.1', '1.2.3.4']\n  ;\n\nhttp.createServer(function(req, res) {\n  res.writeHead(200, {'Content-Type': 'application/json'});\n  res.write(JSON.stringify({addr: addr(req, proxies)}));\n  res.end();\n}).listen(port, function() {\n  console.log('test server running on port ' + port);\n});\n```\n\nLicense\n=======\n\nMIT","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-07-21T21:51:02.131Z","created":"2012-07-21T21:38:53.173Z","0.0.0":"2012-07-21T21:38:54.623Z","1.0.0":"2012-07-21T21:51:02.131Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-addr.git"},"_attachments":{"addr-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3axNSvref0xSeUh55ZO6gg==","length":1674,"stub":true},"addr-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KhV+bfcbFVjmKb36gHqAxA==","length":1763,"stub":true}}}},
{"id":"addressable","key":"addressable","value":{"rev":"27-0c74fde458d92e4b93a29317da15bb3c"},"doc":{"_id":"addressable","_rev":"27-0c74fde458d92e4b93a29317da15bb3c","name":"addressable","description":"A URI parsing module heavily inspired by Rubys Addressable gem","dist-tags":{"latest":"0.3.3"},"versions":{"0.2.0":{"name":"addressable","description":"A CommonJS module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.2.0","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"_id":"addressable@0.2.0","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8ce92e12f2ca0a6c4cbb5177126849af957c625c","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.2.0.tgz"}},"0.2.1":{"name":"addressable","description":"A CommonJS module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.2.1","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"_id":"addressable@0.2.1","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e03dff07edabd9f167b156894b903fa180a827b5","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.2.1.tgz"}},"0.2.2":{"name":"addressable","description":"A CommonJS module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.2.2","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"main":"./lib/addressable","scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"_id":"addressable@0.2.2","_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.1","dist":{"shasum":"a6d34764dd793442de55ce688d8c226dec053dff","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.2.2.tgz"},"directories":{}},"0.3.0":{"name":"addressable","description":"A URI parsing module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.3.0","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"main":"./lib/addressable","scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"devDependencies":{},"_id":"addressable@0.3.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"cac69150c172e6777c15419d3b0643b3870607a1","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.3.0.tgz"},"directories":{}},"0.3.1":{"name":"addressable","description":"A URI parsing module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.3.1","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"main":"./lib/addressable","scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"devDependencies":{},"_id":"addressable@0.3.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"64554c7b0cb9950d6ee6a9ecdea8af1473abdac6","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.3.1.tgz"},"directories":{}},"0.3.2":{"name":"addressable","description":"A URI parsing module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.3.2","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"main":"./lib/addressable","scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"devDependencies":{},"_id":"addressable@0.3.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a4f0c801be09da3c4e4d140b657d9463271b5343","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.3.2.tgz"},"directories":{}},"0.3.3":{"name":"addressable","description":"A URI parsing module heavily inspired by Rubys Addressable gem","homepage":"http://github.com/publicclass/addressable","version":"0.3.3","author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"dependencies":{},"keywords":["addressable","uri"],"main":"./lib/addressable","scripts":{"test":"node test/test-addressable.js"},"engines":{"node":">= 0.2.0"},"devDependencies":{},"_id":"addressable@0.3.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e76fa0636d0581cb6a33f18705f47200256d7be0","tarball":"http://registry.npmjs.org/addressable/-/addressable-0.3.3.tgz"}}},"maintainers":[{"name":"slaskis","email":"robert@publicclass.se"}],"time":{"modified":"2011-05-22T16:42:20.345Z","created":"2011-02-07T20:32:31.683Z","0.2.0":"2011-02-07T20:32:31.912Z","0.2.1":"2011-02-07T21:32:26.728Z","0.2.2":"2011-02-08T15:02:13.646Z","0.3.0":"2011-05-01T09:59:51.360Z","0.3.1":"2011-05-01T10:13:07.806Z","0.3.2":"2011-05-22T15:46:23.050Z","0.3.3":"2011-05-22T16:02:51.565Z"},"author":{"name":"Robert Sköld","email":"robert@publicclass.se"},"_attachments":{"addressable-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-CfK1LclzonHXHQ1j0DtnNA==","length":6055,"stub":true},"addressable-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-jeOsQGg/oBQEfZp3VrbD9w==","length":5864,"stub":true},"addressable-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Y15VtpNQp6V5shx1UOC6fw==","length":5701,"stub":true},"addressable-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-mDAZ15WtRdWVi3qIqL1wLg==","length":5549,"stub":true},"addressable-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-d2xje1Bo3ZHmXyh7b9Omig==","length":5783,"stub":true},"addressable-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jruq5DB3FjzjRFHhRls81A==","length":5818,"stub":true},"addressable-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lBFzKklnEncUmY/4ZaGWLA==","length":5594,"stub":true}}}},
{"id":"addressit","key":"addressit","value":{"rev":"14-a2eea884699718d1ab336e5c60580896"},"doc":{"_id":"addressit","_rev":"14-a2eea884699718d1ab336e5c60580896","name":"addressit","description":"Freeform Street Address Parser","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.2":{"name":"addressit","description":"Freeform Street Address Parser","main":"pkg/cjs/addressit.js","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"version":"0.1.2","repository":{"type":"git","url":"git://github.com/DamonOehlman/addressit.git"},"bugs":{"url":"https://github.com/DamonOehlman/addressit/issues"},"dependencies":{},"devDependencies":{"mocha":"1.x.x","expect.js":"0.1.x"},"scripts":{"test":"./node_modules/mocha/bin/mocha --reporter spec"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"addressit@0.1.2","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fdbb7004be9eb391575e46d080129a2ccea6e2e8","tarball":"http://registry.npmjs.org/addressit/-/addressit-0.1.2.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.3":{"name":"addressit","description":"Freeform Street Address Parser","main":"dist/commonjs/addressit","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"version":"0.1.3","repository":{"type":"git","url":"git://github.com/DamonOehlman/addressit.git"},"bugs":{"url":"https://github.com/DamonOehlman/addressit/issues"},"dependencies":{},"devDependencies":{"mocha":"1.x.x","expect.js":"0.1.x"},"scripts":{"test":"./node_modules/mocha/bin/mocha --reporter spec"},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# addressit\n\nAddressIt is a freeform street address parser, that is designed to take a piece of text and convert that into a structured address that can be processed in different systems.\n\nThe focal point of `addressit` is on the street parsing component, rather than attempting to appropriately identify various states, counties, towns, etc, as these vary from country to country fairly dramatically.  These details are instead put into a generic regions array that can be further parsed based on your application needs.\n\n<a href=\"http://travis-ci.org/#!/DamonOehlman/addressit\"><img src=\"https://secure.travis-ci.org/DamonOehlman/addressit.png\" alt=\"Build Status\"></a>\n\n## Example Usage\n\nThe following is a simple example of how address it can be used:\n\n```js\n// parse a made up address, with some slightly tricky parts\nvar address = addressit('Shop 8, 431 St Kilda Rd Melbourne');\n```\n\nThe `address` object would now contain the following information:\n\n```\n{ text: '8/431 ST KILDA RD MELBOURNE',\n  parts: [],\n  unit: 8,\n  country: undefined,\n  number: 431,\n  street: 'ST KILDA RD',\n  regions: [ 'MELBOURNE' ] }\n```\n\nFor more examples, see the tests.\n\n## Built for Node and the Browser\n\nThe addressit module is designed to work both in the browser and in node.  If you do wish to use it in a node environment, simply install the package into your project:\n\n```\nnpm install addressit\n```\n\nFor the browser, simply download either [addressit.js](/DamonOehlman/addressit/master/addressit.js) or [addressit.min.js](/DamonOehlman/addressit/master/addressit.min.js) and include it in your page.","_id":"addressit@0.1.3","dist":{"shasum":"e309f44aedd0b342257345a1d5daf2d400cc8cd7","tarball":"http://registry.npmjs.org/addressit/-/addressit-0.1.3.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]}},"readme":"# addressit\n\nAddressIt is a freeform street address parser, that is designed to take a piece of text and convert that into a structured address that can be processed in different systems.\n\nThe focal point of `addressit` is on the street parsing component, rather than attempting to appropriately identify various states, counties, towns, etc, as these vary from country to country fairly dramatically.  These details are instead put into a generic regions array that can be further parsed based on your application needs.\n\n<a href=\"http://travis-ci.org/#!/DamonOehlman/addressit\"><img src=\"https://secure.travis-ci.org/DamonOehlman/addressit.png\" alt=\"Build Status\"></a>\n\n## Example Usage\n\nThe following is a simple example of how address it can be used:\n\n```js\n// parse a made up address, with some slightly tricky parts\nvar address = addressit('Shop 8, 431 St Kilda Rd Melbourne');\n```\n\nThe `address` object would now contain the following information:\n\n```\n{ text: '8/431 ST KILDA RD MELBOURNE',\n  parts: [],\n  unit: 8,\n  country: undefined,\n  number: 431,\n  street: 'ST KILDA RD',\n  regions: [ 'MELBOURNE' ] }\n```\n\nFor more examples, see the tests.\n\n## Built for Node and the Browser\n\nThe addressit module is designed to work both in the browser and in node.  If you do wish to use it in a node environment, simply install the package into your project:\n\n```\nnpm install addressit\n```\n\nFor the browser, simply download either [addressit.js](/DamonOehlman/addressit/master/addressit.js) or [addressit.min.js](/DamonOehlman/addressit/master/addressit.min.js) and include it in your page.","maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"time":{"modified":"2012-08-02T13:44:26.733Z","created":"2012-03-07T03:03:51.830Z","0.1.0":"2012-03-07T03:03:55.990Z","0.1.1":"2012-04-22T12:44:42.034Z","0.1.2":"2012-06-20T00:27:25.024Z","0.1.3":"2012-07-25T02:43:44.402Z"},"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/addressit.git"},"users":{"fgribreau":true},"_attachments":{"addressit-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-M5g2zS2T3f6XHCGi6pcVRg==","length":45942,"stub":true},"addressit-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sCTdL6OWMs7teISo4KVldg==","length":44946,"stub":true}}}},
{"id":"adiff","key":"adiff","value":{"rev":"14-c0f5064a438c7fd1a705bfbc50645ab2"},"doc":{"_id":"adiff","_rev":"14-c0f5064a438c7fd1a705bfbc50645ab2","name":"adiff","description":"diff and patch arrays.","dist-tags":{"latest":"0.2.5"},"versions":{"0.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"adiff","description":"diff and patch arrays.","version":"0.0.0","homepage":"https://github.com/dominictarr/adiff","repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"main":"./index.js","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"adiff@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4716d2bfd875db0d7aed9b7dd366a3bc18409336","tarball":"http://registry.npmjs.org/adiff/-/adiff-0.0.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"adiff","description":"diff and patch arrays.","version":"0.1.0","homepage":"https://github.com/dominictarr/adiff","repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"main":"./index.js","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"adiff@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"51420f419593d1c90d584a42c4b1569993c1dc72","tarball":"http://registry.npmjs.org/adiff/-/adiff-0.1.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.2":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"adiff","description":"diff and patch arrays.","version":"0.2.2","homepage":"https://github.com/dominictarr/adiff","repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"main":"./index.js","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"adiff@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4a4a61ce10bc9e10209c81dbec136bcf86698f4a","tarball":"http://registry.npmjs.org/adiff/-/adiff-0.2.2.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.3":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"adiff","description":"diff and patch arrays.","version":"0.2.3","homepage":"https://github.com/dominictarr/adiff","repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"main":"./index.js","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"adiff@0.2.3","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c3b8360563f1a6437408d5e66b317722009d8981","tarball":"http://registry.npmjs.org/adiff/-/adiff-0.2.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.4":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"adiff","description":"diff and patch arrays.","version":"0.2.4","homepage":"https://github.com/dominictarr/adiff","repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"main":"./index.js","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"adiff@0.2.4","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4c1830a92bbc61e0f281450cce155b4b4c33bcc4","tarball":"http://registry.npmjs.org/adiff/-/adiff-0.2.4.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.5":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"adiff","description":"diff and patch arrays.","version":"0.2.5","homepage":"https://github.com/dominictarr/adiff","repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"main":"./index.js","scripts":{"test":"node test.js"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_id":"adiff@0.2.5","dist":{"shasum":"ac327baa5f5a3969c7aa522b14441c51f1344aa6","tarball":"http://registry.npmjs.org/adiff/-/adiff-0.2.5.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-07-04T09:18:38.697Z","created":"2012-03-12T01:26:51.680Z","0.0.0":"2012-03-12T01:26:55.670Z","0.1.0":"2012-03-18T23:27:32.901Z","0.2.2":"2012-04-03T22:12:26.590Z","0.2.3":"2012-04-04T03:19:03.633Z","0.2.4":"2012-04-23T03:31:35.140Z","0.2.5":"2012-07-04T09:18:38.697Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/adiff.git"},"users":{"dodo":true},"_attachments":{"adiff-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-oiD+u7/vffX1pjmtyTM0pA==","length":12151,"stub":true},"adiff-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-fcJtpItB5q1Bv0PXmvz0dA==","length":11220,"stub":true},"adiff-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/k1zIN7AGUM0XLkNPqqznQ==","length":11167,"stub":true},"adiff-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FMhgva8mt+en9DIIJjjuUQ==","length":11089,"stub":true},"adiff-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-M0nIBrrAUZyoVBPRIBVMeQ==","length":10709,"stub":true},"adiff-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-laacRnVxZVrPvkmpmn6xsA==","length":2250,"stub":true}}}},
{"id":"adm-zip","key":"adm-zip","value":{"rev":"15-2732159a17277f5f487614fb7b56ba73"},"doc":{"_id":"adm-zip","_rev":"15-2732159a17277f5f487614fb7b56ba73","name":"adm-zip","description":"A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.1":{"name":"adm-zip","version":"0.1.1","description":"A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk","keywords":["zip","compression","archive","unzip"],"homepage":"http://github.com/cthackers/adm-zip","author":{"name":"Nasca Iacob","email":"sy@another-d-mention.ro","url":"https://github.com/cthackers"},"bugs":{"email":"sy@another-d-mention.ro","url":"https://github.com/cthackers/adm-zip/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/zip/raw/master/LICENSE"}],"main":"zip.js","repository":{"type":"git","url":"git://github.com:cthackers/adm-zip.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"cthackers","email":"sy@another-d-mention.ro"},"_id":"adm-zip@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"1bc02f772c22bbd74790be3764ae2a7741487469","tarball":"http://registry.npmjs.org/adm-zip/-/adm-zip-0.1.1.tgz"},"maintainers":[{"name":"cthackers","email":"sy@another-d-mention.ro"}],"directories":{}},"0.1.2":{"name":"adm-zip","version":"0.1.2","description":"A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk","keywords":["zip","methods","archive","unzip"],"homepage":"http://github.com/cthackers/adm-zip","author":{"name":"Nasca Iacob","email":"sy@another-d-mention.ro","url":"https://github.com/cthackers"},"bugs":{"email":"sy@another-d-mention.ro","url":"https://github.com/cthackers/adm-zip/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/zip/raw/master/LICENSE"}],"main":"adm-zip.js","repository":{"type":"git","url":"git://github.com:cthackers/adm-zip.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"cthackers","email":"sy@another-d-mention.ro"},"_id":"adm-zip@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"37e20f44aed57f76d65f95bcc3821f8ba3904470","tarball":"http://registry.npmjs.org/adm-zip/-/adm-zip-0.1.2.tgz"},"maintainers":[{"name":"cthackers","email":"sy@another-d-mention.ro"}],"directories":{}},"0.1.3":{"name":"adm-zip","version":"0.1.3","description":"A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk","keywords":["zip","methods","archive","unzip"],"homepage":"http://github.com/cthackers/adm-zip","author":{"name":"Nasca Iacob","email":"sy@another-d-mention.ro","url":"https://github.com/cthackers"},"bugs":{"email":"sy@another-d-mention.ro","url":"https://github.com/cthackers/adm-zip/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/zip/raw/master/LICENSE"}],"main":"adm-zip.js","repository":{"type":"git","url":"git://github.com:cthackers/adm-zip.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"cthackers","email":"sy@another-d-mention.ro"},"_id":"adm-zip@0.1.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"d3e29a027463f1c915b7247059540edfcbf57568","tarball":"http://registry.npmjs.org/adm-zip/-/adm-zip-0.1.3.tgz"},"maintainers":[{"name":"cthackers","email":"sy@another-d-mention.ro"}],"directories":{}},"0.1.4":{"name":"adm-zip","version":"0.1.4","description":"A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk","keywords":["zip","methods","archive","unzip"],"homepage":"http://github.com/cthackers/adm-zip","author":{"name":"Nasca Iacob","email":"sy@another-d-mention.ro","url":"https://github.com/cthackers"},"bugs":{"email":"sy@another-d-mention.ro","url":"https://github.com/cthackers/adm-zip/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/zip/raw/master/LICENSE"}],"main":"adm-zip.js","repository":{"type":"git","url":"git://github.com/git@github.com:cthackers/adm-zip.git"},"engines":{"node":">=0.3.1"},"readme":"# ADM-ZIP for NodeJS\r\n\r\nADM-ZIP is a pure JavaScript implementation for zip data compression for [NodeJS](http://nodejs.org/). \r\n\r\n# Installation\r\n\r\nWith [npm](http://npmjs.org) do:\r\n\r\n    $ npm install adm-zip\r\n\t\r\n## What is it good for?\r\nThe library allows you to:\r\n\r\n* decompress zip files directly to disk or in memory buffers\r\n* compress files and store them to disk in .zip format or in compressed buffers\r\n* update content of/add new/delete files from an existing .zip\r\n\r\n# Dependencies\r\nThere are no other nodeJS libraries that ADM-ZIP is dependent of\r\n\r\n# Examples\r\n\r\n## Basic usage\r\n```javascript\r\n\r\n\tvar AdmZip = require('adm-zip');\r\n\r\n\t// reading archives\r\n\tvar zip = new AdmZip(\"./my_file.zip\");\r\n\tvar zipEntries = zip.getEntries(); // an array of ZipEntry records\r\n\r\n\tzipEntries.forEach(function(zipEntry) {\r\n\t    console.log(zipEntry.toString()); // outputs zip entries information\r\n\t\tif (zipEntry.entryName == \"my_file.txt\") {\r\n\t\t     console.log(zipEntry.data.toString('utf8')); \r\n\t\t}\r\n\t});\r\n\t// outputs the content of some_folder/my_file.txt\r\n\tconsole.log(zip.readAsText(\"some_folder/my_file.txt\")); \r\n\t// extracts the specified file to the specified location\r\n\tzip.extractEntryTo(/*entry name*/\"some_folder/my_file.txt\", /*target path*/\"/home/me/tempfolder\", /*overwrite*/true)\r\n\t// extracts everything\r\n\tzip.extractAllTo(/*target path*/\"/home/me/zipcontent/\", /*overwrite*/true);\r\n\t\r\n\t\r\n\t// creating archives\r\n\tvar zip = new AdmZip();\r\n\t\r\n\t// add file directly\r\n\tzip.addFile(\"test.txt\", new Buffer(\"inner content of the file\"), \"entry comment goes here\");\r\n\t// add local file\r\n\tzip.addLocalFile(\"/home/me/some_picture.png\");\r\n\t// get everything as a buffer\r\n\tvar willSendthis = zip.toBuffer();\r\n\t// or write everything to disk\r\n\tzip.writeZip(/*target file name*/\"/home/me/files.zip\");\r\n\t\r\n\t\r\n\t// ... more examples in the wiki\r\n```\r\n\r\nFor more detailed information please check out the [wiki](https://github.com/cthackers/adm-zip/wiki).","_id":"adm-zip@0.1.4","dist":{"shasum":"60af872c28d5275ae3a168b613ab7a48ce76cd99","tarball":"http://registry.npmjs.org/adm-zip/-/adm-zip-0.1.4.tgz"},"maintainers":[{"name":"cthackers","email":"sy@another-d-mention.ro"}]},"0.1.5":{"name":"adm-zip","version":"0.1.5","description":"A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk","keywords":["zip","methods","archive","unzip"],"homepage":"http://github.com/cthackers/adm-zip","author":{"name":"Nasca Iacob","email":"sy@another-d-mention.ro","url":"https://github.com/cthackers"},"bugs":{"email":"sy@another-d-mention.ro","url":"https://github.com/cthackers/adm-zip/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/zip/raw/master/LICENSE"}],"main":"adm-zip.js","repository":{"type":"git","url":"git://github.com/git@github.com:cthackers/adm-zip.git"},"engines":{"node":">=0.3.0"},"readme":"# ADM-ZIP for NodeJS\r\n\r\nADM-ZIP is a pure JavaScript implementation for zip data compression for [NodeJS](http://nodejs.org/). \r\n\r\n# Installation\r\n\r\nWith [npm](http://npmjs.org) do:\r\n\r\n    $ npm install adm-zip\r\n\t\r\n## What is it good for?\r\nThe library allows you to:\r\n\r\n* decompress zip files directly to disk or in memory buffers\r\n* compress files and store them to disk in .zip format or in compressed buffers\r\n* update content of/add new/delete files from an existing .zip\r\n\r\n# Dependencies\r\nThere are no other nodeJS libraries that ADM-ZIP is dependent of\r\n\r\n# Examples\r\n\r\n## Basic usage\r\n```javascript\r\n\r\n\tvar AdmZip = require('adm-zip');\r\n\r\n\t// reading archives\r\n\tvar zip = new AdmZip(\"./my_file.zip\");\r\n\tvar zipEntries = zip.getEntries(); // an array of ZipEntry records\r\n\r\n\tzipEntries.forEach(function(zipEntry) {\r\n\t    console.log(zipEntry.toString()); // outputs zip entries information\r\n\t\tif (zipEntry.entryName == \"my_file.txt\") {\r\n\t\t     console.log(zipEntry.data.toString('utf8')); \r\n\t\t}\r\n\t});\r\n\t// outputs the content of some_folder/my_file.txt\r\n\tconsole.log(zip.readAsText(\"some_folder/my_file.txt\")); \r\n\t// extracts the specified file to the specified location\r\n\tzip.extractEntryTo(/*entry name*/\"some_folder/my_file.txt\", /*target path*/\"/home/me/tempfolder\", /*overwrite*/true)\r\n\t// extracts everything\r\n\tzip.extractAllTo(/*target path*/\"/home/me/zipcontent/\", /*overwrite*/true);\r\n\t\r\n\t\r\n\t// creating archives\r\n\tvar zip = new AdmZip();\r\n\t\r\n\t// add file directly\r\n\tzip.addFile(\"test.txt\", new Buffer(\"inner content of the file\"), \"entry comment goes here\");\r\n\t// add local file\r\n\tzip.addLocalFile(\"/home/me/some_picture.png\");\r\n\t// get everything as a buffer\r\n\tvar willSendthis = zip.toBuffer();\r\n\t// or write everything to disk\r\n\tzip.writeZip(/*target file name*/\"/home/me/files.zip\");\r\n\t\r\n\t\r\n\t// ... more examples in the wiki\r\n```\r\n\r\nFor more detailed information please check out the [wiki](https://github.com/cthackers/adm-zip/wiki).","_id":"adm-zip@0.1.5","dist":{"shasum":"0c8e490f06e51f0beef3e6af0e5fdf7ee2553a0b","tarball":"http://registry.npmjs.org/adm-zip/-/adm-zip-0.1.5.tgz"},"maintainers":[{"name":"cthackers","email":"sy@another-d-mention.ro"}]}},"readme":"# ADM-ZIP for NodeJS\r\n\r\nADM-ZIP is a pure JavaScript implementation for zip data compression for [NodeJS](http://nodejs.org/). \r\n\r\n# Installation\r\n\r\nWith [npm](http://npmjs.org) do:\r\n\r\n    $ npm install adm-zip\r\n\t\r\n## What is it good for?\r\nThe library allows you to:\r\n\r\n* decompress zip files directly to disk or in memory buffers\r\n* compress files and store them to disk in .zip format or in compressed buffers\r\n* update content of/add new/delete files from an existing .zip\r\n\r\n# Dependencies\r\nThere are no other nodeJS libraries that ADM-ZIP is dependent of\r\n\r\n# Examples\r\n\r\n## Basic decompression\r\n```javascript\r\n\r\n\tvar Zip = require('adm-zip').Zip;\r\n\r\n\t// reading archives\r\n\tvar file = new Zip(\"my_file.zip\");\r\n\tvar zipEntries = file.getEntries(); // an array of ZipEntry records\r\n\r\n\tzipEntries.forEach(function(zipEntry) {\r\n\t    console.log(zipEntry.toString()); \r\n\t\t// outputs zip entries information\r\n\t});\r\n\t\r\n\t// outputs the content of some_folder/my_file.txt\r\n\tconsole.log(file.readAsText(\"some_folder/my_file.txt\")); \r\n\t\r\n\t// extracts the specified file to the specified location\r\n\tfile.extractEntryTo(\"some_folder/my_file.txt\", \"/home/me/tempfolder\", true)\r\n\t\r\n\t// extracts everything\r\n\tfile.extractAllTo(\"/home/me/zipcontent/\", true);\r\n\t\r\n\t// ... more examples in the wiki\r\n```\r\n\r\nFor more detailed information please check out the [wiki](https://github.com/cthackers/adm-zip/wiki).","maintainers":[{"name":"cthackers","email":"sy@another-d-mention.ro"}],"time":{"modified":"2012-08-03T06:44:19.897Z","created":"2012-02-23T13:50:30.878Z","0.1.1":"2012-02-23T13:50:33.546Z","0.1.2":"2012-02-28T12:50:42.404Z","0.1.3":"2012-03-12T15:02:07.404Z","0.1.4":"2012-08-03T06:43:52.283Z","0.1.5":"2012-08-03T06:44:19.897Z"},"author":{"name":"Nasca Iacob","email":"sy@another-d-mention.ro","url":"https://github.com/cthackers"},"repository":{"type":"git","url":"git://github.com/git@github.com:cthackers/adm-zip.git"},"_attachments":{"adm-zip-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-oOmw2rXta8msBGrqaUmewA==","length":29190,"stub":true},"adm-zip-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-JdTSyEbqVi4CtriF/gQ33w==","length":29190,"stub":true},"adm-zip-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Dmo6kM1euqkJII2SyMk3jA==","length":27706,"stub":true},"adm-zip-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-315knWMdUKpMr+MlLmURHA==","length":12177,"stub":true},"adm-zip-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-klXM+DKy/L5cwttxaIe5QA==","length":6554,"stub":true}}}},
{"id":"admin","key":"admin","value":{"rev":"3-23a77ba95798f839bfbf3244f63f8fce"},"doc":{"_id":"admin","_rev":"3-23a77ba95798f839bfbf3244f63f8fce","name":"admin","description":"hi baidu","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"admin","version":"0.0.0","description":"hi baidu","main":"index.js","repository":"","author":"","license":"BSD","readme":"hi baidu\n","_id":"admin@0.0.0","dist":{"shasum":"ed3b3bdc086cd418eb676e77a0cba0d52f414f5e","tarball":"http://registry.npmjs.org/admin/-/admin-0.0.0.tgz"},"maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}]}},"readme":"hi baidu\n","maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}],"time":{"modified":"2012-08-10T01:51:04.354Z","created":"2012-08-10T01:50:57.428Z","0.0.0":"2012-08-10T01:51:04.354Z"},"_attachments":{"admin-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dAknVmiYfZnHMdrnuYO60w==","length":257,"stub":true}}}},
{"id":"admin-forms2","key":"admin-forms2","value":{"rev":"3-8ab922f939675c28c88c3244524d7916"},"doc":{"_id":"admin-forms2","_rev":"3-8ab922f939675c28c88c3244524d7916","name":"admin-forms2","description":"backoffice with mongoose","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"admin-forms2","description":"backoffice with mongoose","version":"0.0.1","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-forms2@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"abd3b203100d1d43cfc9d510db28de14faa21c0e","tarball":"http://registry.npmjs.org/admin-forms2/-/admin-forms2-0.0.1.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}]}},"readme":"# Mongoose-Admin\r\n\r\n [Mongoose-Admin](http://www.github.com/marccampbell/mongo-admin) is a plug in admin tool for [mongoose](http://learnboost.github.com/mongoose) for [node.js](http://nodejs.org).\r\n\r\n## Installation\r\n\r\n```bash\r\n$ npm install mongoose-admin\r\n```\r\n\r\n## Known Issues\r\n\r\n  - nested objects which contain nested objects cannot be created on new\r\n    documents\r\n  - no pagination of documents when listing\r\n\r\n\r\n## Features\r\n\r\n  - automatic templates for \r\n    - creating entities\r\n    - editing entities\r\n    - deleting entities\r\n  - listens on configurable port\r\n\r\n## Running Tests\r\n\r\nInstall development dependencies:\r\n\r\n```bash\r\n$ npm install\r\n```\r\n\r\nThen:\r\n\r\n```bash\r\n$ test/run\r\n```\r\n\r\nActively tested with node:\r\n\r\n  - 0.4.9\r\n\r\n## Authors\r\n\r\n  * Marc Campbell\r\n\r\n## License \r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2011 Marc Campbell &lt;marc.e.campbell@gmail.com&gt;\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n","maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"time":{"modified":"2012-05-15T13:47:12.981Z","created":"2012-05-15T13:47:06.208Z","0.0.1":"2012-05-15T13:47:12.981Z"},"author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"_attachments":{"admin-forms2-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JGugYHh/EiMr1KrKwmZ0XA==","length":327834,"stub":true}}}},
{"id":"admin-with-forms","key":"admin-with-forms","value":{"rev":"162-d20f1d973413e391a957b5aad768beb1"},"doc":{"_id":"admin-with-forms","_rev":"162-d20f1d973413e391a957b5aad768beb1","name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","dist-tags":{"latest":"0.0.57"},"versions":{"0.0.1":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.1","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8ce33bcc3b628f9acbe0b96c24e25caa91e13274","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.1.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.11":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.11","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.11","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"29ec3d01dee2669b24de127eabb4936b61759cb2","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.11.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.12":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.12","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.12","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"7f3016216952922be9dcfd5fb671082e0decd067","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.12.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.13":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.13","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.13","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1e59504134f3e5d91b2d93ea50cce893466ee0ea","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.13.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.14":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.14","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.14","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e19d3e4068141f7f9379460520136091e8fe0885","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.14.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.15":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.15","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.15","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"27abe22142bb11f63de497b9c308a65a16a82a09","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.15.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.17":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.17","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.17","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"b7c455b0d1e85c29a963f8c45b100d6e33ad12a8","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.17.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.18":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.18","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.18","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"9be875367629b6fdf2b00c53b762c42b66ba1074","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.18.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.19":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.19","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.19","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8b45566864acf370b96d5e3e4feb978c51403566","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.19.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.20":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.20","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.20","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"32ed80a44552e6fb376568ae57fc31d2b78e9dc8","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.20.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.22":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.22","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.22","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0ece770e569f22851a58335cdae8f3219643299c","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.22.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.23":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.23","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.23","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"8972824aa2704715e4699d654b87f475358351d9","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.23.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.24":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.24","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.24","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c95d62f28d9cee514ccac13807d56d834914a856","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.24.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.25":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.25","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.25","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4512fc29007b412fbdf5c413d80942d315467f0e","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.25.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.26":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.26","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.26","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4f967ea0b86c5396050dd75e22357aaa82fffb7b","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.26.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.27":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.27","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.27","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a66877cad4b08f749eb99cbeed9dbdc2ce4faabd","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.27.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.28":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.28","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.28","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"82d3e101b1e2855026482bfad6f61774bd05c58f","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.28.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.29":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.29","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.29","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"29e3a17f3ab0f091d964350cd81fc719e79ee84c","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.29.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.30":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.30","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.30","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"59845f8a61d630967685b8a75f81488661456b5d","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.30.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.31":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.31","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.31","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"67fd4d0729ee2cdd3428b8a194f0faa832362415","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.31.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.32":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.32","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.32","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"176131f3300057138d14e2ddcfc3e54bc14680d4","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.32.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.33":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.33","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.33","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"38e48c13258bbfc2fea2a504aeeeb12b0dff00f6","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.33.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.34":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.34","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.34","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"80aee6d1d25c046aba846ecf11905709932b19c7","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.34.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.35":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.35","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.35","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"68f04dacd48f7460079442565de5550b1ba3748d","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.35.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.36":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.36","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.36","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"fac70ffad240b3f356dca055431f5f98cd7e8984","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.36.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.37":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.37","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.37","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"45aafc5352a58f89adf1972a3208174addada542","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.37.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.38":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.38","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.38","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d5c81d604819f49dea0175131a656522ff19e511","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.38.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.39":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.39","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.39","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9d28c4b0f990ec2c28e22c7fb47397dc8de72881","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.39.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.21":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.21","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.21","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8723bd669b19b291dca5b4278425b50fe19af90a","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.21.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.40":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.40","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.40","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"88908b35280fca955b787830934993e365fe72cc","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.40.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.42":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.42","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.42","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"2a95218075133bfa7ea43c73ab54a0cb8c78674d","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.42.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.43":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.43","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.43","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"3e7d45703a8dfdff9b0a125b11f58b1a2cacbfe3","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.43.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.44":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.44","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.44","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a41331165d49c1af143d135b287b903f81cce12b","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.44.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.45":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.45","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.45","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"7e7685bd107304fb771e72cb9fed78a423df5d73","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.45.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.46":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.46","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.46","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"7dce8545750e630f4284fc558840ce33dcc487c2","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.46.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.47":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.47","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.47","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d519ea24d57e22f1588566df34d07f0b537caeb6","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.47.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.48":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.48","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.48","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2598c0f947c0dc031b909e51f24ca3dd26be2191","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.48.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.49":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.49","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.49","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"717ac357dfbf02707fbbee6331cae6233575d7e2","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.49.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.50":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.50","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.50","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.3","_defaultsLoaded":true,"dist":{"shasum":"22547f4ce1a608ae69eeccdbe734ac1f36f7795b","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.50.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.51":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.51","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.51","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.3","_defaultsLoaded":true,"dist":{"shasum":"746998d723dac59f023314df55b3ec70b5df20af","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.51.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.52":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.52","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.52","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.3","_defaultsLoaded":true,"dist":{"shasum":"c9f91454394f148b4c0ddae978a9d9a07b191823","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.52.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.53":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.53","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.53","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.3","_defaultsLoaded":true,"dist":{"shasum":"04ca7d004b24d6edc507598dd00e34dcc8277a5d","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.53.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.54":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.54","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.54","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.3","_defaultsLoaded":true,"dist":{"shasum":"b6f22a3680e502d7e9e7af74c6dcc9be4f4772da","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.54.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.55":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.55","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_npmUser":{"name":"ishai","email":"ishai@empeeric.com"},"_id":"admin-with-forms@0.0.55","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.6","_defaultsLoaded":true,"dist":{"shasum":"edcf8c20193b1f9f686600630c03408b4fd8f11c","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.55.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.56":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.56","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.21","mongoose":"","underscore":"","async":"","jade":""},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_id":"admin-with-forms@0.0.56","readme":"ERROR: No README.md file found!","dist":{"shasum":"80605101b21c3e0f192b697c4b15f9b80619d062","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.56.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"directories":{}},"0.0.57":{"name":"admin-with-forms","description":"admin for mongoose and not mongoose projects which uses forms","version":"0.0.57","author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"dependencies":{"j-forms":">= 0.0.72","mongoose":"","underscore":"","async":"","jade":"","jest":">= 0.1.30"},"devDependencies":{"express":"","connect-mongo":"","ejs":""},"main":"index","keywords":["admin","forms","mongoose","django"],"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"engines":{"node":">= 0.4.1"},"_id":"admin-with-forms@0.0.57","readme":"ERROR: No README.md file found!","dist":{"shasum":"656705e1e9e4e8f58ec20ef16a483c049ec5f9be","tarball":"http://registry.npmjs.org/admin-with-forms/-/admin-with-forms-0.0.57.tgz"},"maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}]}},"readme":"# Mongoose-Admin\r\n\r\n [Mongoose-Admin](http://www.github.com/marccampbell/mongo-admin) is a plug in admin tool for [mongoose](http://learnboost.github.com/mongoose) for [node.js](http://nodejs.org).\r\n\r\n## Installation\r\n\r\n```bash\r\n$ npm install mongoose-admin\r\n```\r\n\r\n## Known Issues\r\n\r\n  - nested objects which contain nested objects cannot be created on new\r\n    documents\r\n  - no pagination of documents when listing\r\n\r\n\r\n## Features\r\n\r\n  - automatic templates for \r\n    - creating entities\r\n    - editing entities\r\n    - deleting entities\r\n  - listens on configurable port\r\n\r\n## Running Tests\r\n\r\nInstall development dependencies:\r\n\r\n```bash\r\n$ npm install\r\n```\r\n\r\nThen:\r\n\r\n```bash\r\n$ test/run\r\n```\r\n\r\nActively tested with node:\r\n\r\n  - 0.4.9\r\n\r\n## Authors\r\n\r\n  * Marc Campbell\r\n\r\n## License \r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2011 Marc Campbell &lt;marc.e.campbell@gmail.com&gt;\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n","maintainers":[{"name":"ishai","email":"ishai@empeeric.com"}],"time":{"modified":"2012-08-14T14:52:18.309Z","created":"2012-03-22T13:21:34.188Z","0.0.1":"2012-03-22T13:21:37.225Z","0.0.11":"2012-04-01T09:39:17.107Z","0.0.12":"2012-04-01T16:20:04.633Z","0.0.13":"2012-04-02T14:49:12.264Z","0.0.14":"2012-04-02T16:41:57.949Z","0.0.15":"2012-04-24T12:34:13.901Z","0.0.17":"2012-05-02T09:24:59.901Z","0.0.18":"2012-05-07T16:24:59.964Z","0.0.19":"2012-05-07T16:40:48.826Z","0.0.20":"2012-05-08T11:22:06.769Z","0.0.21":"2012-05-15T13:43:41.596Z","0.0.22":"2012-05-08T18:37:10.317Z","0.0.23":"2012-05-09T12:44:08.934Z","0.0.24":"2012-05-15T06:57:27.708Z","0.0.25":"2012-05-15T07:00:16.711Z","0.0.26":"2012-05-15T12:09:42.571Z","0.0.27":"2012-05-15T12:17:30.494Z","0.0.28":"2012-05-15T12:28:15.394Z","0.0.29":"2012-05-15T12:42:26.502Z","0.0.30":"2012-05-15T12:46:28.663Z","0.0.31":"2012-05-15T12:49:20.661Z","0.0.32":"2012-05-15T12:55:58.814Z","0.0.33":"2012-05-15T13:00:35.955Z","0.0.34":"2012-05-15T13:04:53.349Z","0.0.35":"2012-05-15T13:16:29.384Z","0.0.36":"2012-05-15T13:22:45.966Z","0.0.37":"2012-05-15T13:25:35.776Z","0.0.38":"2012-05-15T13:29:48.009Z","0.0.39":"2012-05-15T13:40:29.117Z","0.0.40":"2012-05-16T17:53:13.704Z","0.0.42":"2012-05-23T14:10:10.518Z","0.0.43":"2012-05-23T14:33:08.232Z","0.0.44":"2012-06-07T13:14:12.822Z","0.0.45":"2012-06-10T12:23:12.703Z","0.0.46":"2012-06-10T15:15:09.127Z","0.0.47":"2012-06-28T08:33:22.396Z","0.0.48":"2012-07-05T12:32:25.011Z","0.0.49":"2012-07-15T09:33:37.939Z","0.0.50":"2012-07-30T13:43:07.228Z","0.0.51":"2012-08-06T11:04:57.537Z","0.0.52":"2012-08-08T13:48:08.270Z","0.0.53":"2012-08-09T14:51:06.175Z","0.0.54":"2012-08-12T08:20:46.930Z","0.0.55":"2012-08-12T10:32:56.363Z","0.0.56":"2012-08-13T13:16:36.977Z","0.0.57":"2012-08-14T14:52:18.309Z"},"author":{"name":"Ishai Jaffe","email":"ishai@empeeric.com"},"repository":{"type":"git","url":"git@github.com:IshaiJaffe/admin-forms.git"},"users":{"fgribreau":true},"_attachments":{"admin-with-forms-0.0.57.tgz":{"content_type":"application/octet-stream","revpos":162,"digest":"md5-YJpR/qsf/320PqCGxJYNtw==","length":315923,"stub":true},"admin-with-forms-0.0.56.tgz":{"content_type":"application/octet-stream","revpos":144,"digest":"md5-ZwR5+F26Q2aPP/qzmnp0SA==","length":315139,"stub":true},"admin-with-forms-0.0.55.tgz":{"content_type":"application/octet-stream","revpos":142,"digest":"md5-MxoDliERBXpHdZZg82No0Q==","length":315003,"stub":true},"admin-with-forms-0.0.54.tgz":{"content_type":"application/octet-stream","revpos":140,"digest":"md5-S3Q/ciqgHPblmkDI/TxR9Q==","length":315012,"stub":true},"admin-with-forms-0.0.53.tgz":{"content_type":"application/octet-stream","revpos":138,"digest":"md5-vm4Tyd5+hJblvqZS5UstmQ==","length":315008,"stub":true},"admin-with-forms-0.0.52.tgz":{"content_type":"application/octet-stream","revpos":128,"digest":"md5-ysMAf1xaQyVo/kQfmjP3dA==","length":315007,"stub":true},"admin-with-forms-0.0.51.tgz":{"content_type":"application/octet-stream","revpos":126,"digest":"md5-E1gWBDoCaR7Tfo6kl12zXw==","length":315039,"stub":true},"admin-with-forms-0.0.50.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-5yeKAv6blW/On981tpP+DQ==","length":315016,"stub":true},"admin-with-forms-0.0.49.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-EnBIKKvhaEv4RSymBu0urQ==","length":314881,"stub":true},"admin-with-forms-0.0.48.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-wJeQrFyx9t1ZHnrKssE0eQ==","length":314892,"stub":true},"admin-with-forms-0.0.47.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-HIbVVIZZHLure72GwcrEgA==","length":315094,"stub":true},"admin-with-forms-0.0.46.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-qwu80M/K6IEtNPJv1DrSGg==","length":317440,"stub":true},"admin-with-forms-0.0.45.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-Hwcffthc6lrBtAzh25Aplg==","length":317440,"stub":true},"admin-with-forms-0.0.44.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-M2beGqaBzWCWvy+EgbdvpA==","length":316370,"stub":true},"admin-with-forms-0.0.43.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-tsQkKFsCHSKNTrXrAy2Rwg==","length":317440,"stub":true},"admin-with-forms-0.0.42.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-77dJwCB28eLz8fCCIL+4/w==","length":317440,"stub":true},"admin-with-forms-0.0.40.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-vx9fTSmFuyRywYl+XurYdQ==","length":645120,"stub":true},"admin-with-forms-0.0.21.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-tJLsl4PbI5GNBUnCYe9qqw==","length":327839,"stub":true},"admin-with-forms-0.0.39.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-LtO0gxDVhV+LghYW3GbXGw==","length":327849,"stub":true},"admin-with-forms-0.0.38.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-3POLogH3pSOrRuAFaWvJBQ==","length":327745,"stub":true},"admin-with-forms-0.0.37.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-pUKdYd0d4cxXSLriMo7lKw==","length":327357,"stub":true},"admin-with-forms-0.0.36.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-XlZS4lssXaqljB93wqwuUg==","length":327358,"stub":true},"admin-with-forms-0.0.35.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-AZRj/thK3oJGdU0Q9hH4TQ==","length":330236,"stub":true},"admin-with-forms-0.0.34.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-nY1yz0jsXuW7LxXqvwI1qw==","length":330400,"stub":true},"admin-with-forms-0.0.33.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-fqwU6GOk3cDrNfLwf3xZjw==","length":328326,"stub":true},"admin-with-forms-0.0.32.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-ZxbzbvsntGqWY8ycrRjyUw==","length":327671,"stub":true},"admin-with-forms-0.0.31.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-IoVrNu4jGP0sI1enLHhUWA==","length":327803,"stub":true},"admin-with-forms-0.0.30.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-WsDw70WUcCvuJwZDF/xA2w==","length":327782,"stub":true},"admin-with-forms-0.0.29.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-4+bsCK8PBZiBwF1s+9+crA==","length":327786,"stub":true},"admin-with-forms-0.0.28.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-LMq5VqhyvA/iZ2s1uG2MzA==","length":327725,"stub":true},"admin-with-forms-0.0.27.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-yAC+a+AxJEJy23mBnWanVg==","length":327690,"stub":true},"admin-with-forms-0.0.26.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-YpulPcTBlUEKWbyz77T93Q==","length":327705,"stub":true},"admin-with-forms-0.0.25.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-BTZJ9WY2VaCXV34roz3HQA==","length":327709,"stub":true},"admin-with-forms-0.0.24.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-3pTDIRQg06GTpZkbVu64kg==","length":327717,"stub":true},"admin-with-forms-0.0.23.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-xyos0p9E5u96RyIFMJ43dQ==","length":327680,"stub":true},"admin-with-forms-0.0.22.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-M2Mjqwh/5IT7JHVWQ858Qw==","length":327115,"stub":true},"admin-with-forms-0.0.20.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-w0QYsqtB/RIe+xlv5VXukQ==","length":327105,"stub":true},"admin-with-forms-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-AZmdnOrAXnsATHQJ+CU57g==","length":327680,"stub":true},"admin-with-forms-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-3E3KBQ8sdotQCnoCqFUexA==","length":327680,"stub":true},"admin-with-forms-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-AadsxJFIS9/RdWI+cphOnw==","length":327680,"stub":true},"admin-with-forms-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+VxenbUzdXnpjt1w7rhpNQ==","length":327680,"stub":true},"admin-with-forms-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6doauwWoSzJWXJxQPFYkkw==","length":327680,"stub":true},"admin-with-forms-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TSmcaER5NmYLtflX2WD4Pg==","length":327680,"stub":true},"admin-with-forms-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9JXxUYSSNN7pwh48v/VGBg==","length":327680,"stub":true},"admin-with-forms-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-voVZBHmQYs+uFhGfpkSchQ==","length":327680,"stub":true},"admin-with-forms-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-m0JuwDKVWAjwPJSsB50Fgw==","length":325926,"stub":true}}}},
{"id":"ads","key":"ads","value":{"rev":"5-86a70d0ffdef7112d01f7d6e2284cceb"},"doc":{"_id":"ads","_rev":"5-86a70d0ffdef7112d01f7d6e2284cceb","name":"ads","description":"Twincat ADS protocol implementation for NodeJS","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"ads","version":"0.0.1","description":"Twincat ADS protocol implementation for NodeJS","main":"ads.js","keywords":["twincat","plc","ads","beckhoff"],"author":{"name":"Roeland Moors"},"homepage":"https://github.com/roelandmoors/ads.js","bugs":{"name":"https://github.com/roelandmoors/ads.js/issues"},"repository":{"type":"git","url":"git://github.com/roelandmoors/ads.js.git"},"_npmUser":{"name":"roeland","email":"roeland@webding.org"},"_id":"ads@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4ebadabf85f3d5a4e03a3cf103a965d87296dd05","tarball":"http://registry.npmjs.org/ads/-/ads-0.0.1.tgz"},"maintainers":[{"name":"roeland","email":"roeland@webding.org"}]},"0.0.2":{"name":"ads","version":"0.0.2","description":"Twincat ADS protocol implementation for NodeJS","main":"ads.js","keywords":["twincat","plc","ads","beckhoff"],"author":{"name":"Roeland Moors"},"homepage":"https://github.com/roelandmoors/ads.js","bugs":{"url":"https://github.com/roelandmoors/ads.js/issues"},"licenses":[{"type":"MIT","url":"https://github.com/roelandmoors/ads.js/blob/master/README.md#license-mit"}],"repository":{"type":"git","url":"git://github.com/roelandmoors/ads.js.git"},"_npmUser":{"name":"roeland","email":"roeland@webding.org"},"_id":"ads@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"973d50622b45e6a26da60f1272f945d968e37078","tarball":"http://registry.npmjs.org/ads/-/ads-0.0.2.tgz"},"maintainers":[{"name":"roeland","email":"roeland@webding.org"}]}},"readme":"ads.js\n======\n\nA NodeJS implementation for the Twincat ADS protocol.  \n(Twincat and ADS is from Beckhoff &copy;. I'm not affiliated.)\n\n\nExamples\n--------\n\n### Hello machine\n\n```javascript\nvar ads = require('./ads.js');\n\nvar options = {\n    //The IP or hostname of the target machine\n    host: \"10.0.0.2\", \n    //The NetId of the target machine\n    amsNetIdTarget: \"5.1.204.160.1.1\",\n    //The NetId of the source machine.\n    //You can choose anything in the form of x.x.x.x.x.x,\n    //but on the target machine this must be added as a route.\n    amsNetIdSource: \"192.168.137.50.1.1\",\n};\n\nads.connect(options, function(){\n    this.readDeviceInfo(function(result) {\n        console.log(result);\n    });\n});\n```\n\n### Read something\n\n```javascript\nvar testHandle = {\n    //Handle name in twincat\n    symname: '.TESTINT',  \n    //An ads type object or an array of type objects.\n    //You can also specify a number or an array of numbers,\n    //the result will then be a buffer object.\n    bytelength: ads.INT,  \n    //The propery name where the value should be written.\n    //This can be an array with the same length as the array length of byteLength.      \n    propname: 'value'      \n};\n\nclient = ads.connect(options, function(){\n    this.read(testHandle, function(result){\n        //result is the testHandle object with the new properties filled in\n        console.log(result);\n    });\n\n});\n```\n\n\nLicense (MIT)\n-------------\nCopyright (c) 2012 Roeland Moors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"roeland","email":"roeland@webding.org"}],"time":{"modified":"2012-06-26T17:27:21.753Z","created":"2012-06-24T08:52:59.287Z","0.0.1":"2012-06-24T08:53:01.045Z","0.0.2":"2012-06-26T17:27:21.753Z"},"author":{"name":"Roeland Moors"},"repository":{"type":"git","url":"git://github.com/roelandmoors/ads.js.git"},"_attachments":{"ads-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-t2WmNyckdRcCtQBqzw3OXQ==","length":6242,"stub":true},"ads-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vyXLQrQKHvjDL7hZFuPsnQ==","length":5065,"stub":true}}}},
{"id":"adstream-data","key":"adstream-data","value":{"rev":"13-b983530d153de1517c53328c52dda629"},"doc":{"_id":"adstream-data","_rev":"13-b983530d153de1517c53328c52dda629","name":"adstream-data","description":"Framework for adstream.data compliant services","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.1":{"name":"adstream-data","version":"0.1.1","description":"Framework for adstream.data compliant services","author":{"name":"Max Motovilov","email":"max@motovilov.com"},"main":"index.js","files":["package.json","index.js","lib"],"dependencies":{"connect":">= 1.8.1","node-promise":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_npmUser":{"name":"...max...","email":"max@motovilov.com"},"_id":"adstream-data@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"8a958ef2fe459b529bdb1dfcdf29df150262deef","tarball":"http://registry.npmjs.org/adstream-data/-/adstream-data-0.1.1.tgz"},"maintainers":[{"name":"...max...","email":"max@motovilov.com"}]},"0.1.2":{"name":"adstream-data","version":"0.1.2","description":"Framework for adstream.data compliant services","author":{"name":"Max Motovilov","email":"max@motovilov.com"},"main":"index.js","files":["package.json","index.js","lib"],"dependencies":{"connect":">= 1.8.1","node-promise":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_npmUser":{"name":"...max...","email":"max@motovilov.com"},"_id":"adstream-data@0.1.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"369ec41c82414e8a5fae841900a47a40a621bd45","tarball":"http://registry.npmjs.org/adstream-data/-/adstream-data-0.1.2.tgz"},"readme":"","maintainers":[{"name":"...max...","email":"max@motovilov.com"}]},"0.1.3":{"name":"adstream-data","version":"0.1.3","description":"Framework for adstream.data compliant services","author":{"name":"Max Motovilov","email":"max@motovilov.com"},"main":"index.js","files":["package.json","index.js","lib"],"dependencies":{"connect":">= 1.8.1","node-promise":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_npmUser":{"name":"...max...","email":"max@motovilov.com"},"_id":"adstream-data@0.1.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"96757bd9cb02f332f9876707a7f93cc587135031","tarball":"http://registry.npmjs.org/adstream-data/-/adstream-data-0.1.3.tgz"},"readme":"","maintainers":[{"name":"...max...","email":"max@motovilov.com"}]},"0.1.4":{"name":"adstream-data","version":"0.1.4","description":"Framework for adstream.data compliant services","author":{"name":"Max Motovilov","email":"max@motovilov.com"},"main":"index.js","files":["package.json","index.js","lib"],"dependencies":{"connect":">= 1.8.1","node-promise":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_npmUser":{"name":"...max...","email":"max@motovilov.com"},"_id":"adstream-data@0.1.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"038b338c7cf2abe46ecebb84ebd9d9ec682cc88e","tarball":"http://registry.npmjs.org/adstream-data/-/adstream-data-0.1.4.tgz"},"readme":"","maintainers":[{"name":"...max...","email":"max@motovilov.com"}]},"0.1.5":{"name":"adstream-data","version":"0.1.5","description":"Framework for adstream.data compliant services","author":{"name":"Max Motovilov","email":"max@motovilov.com"},"main":"index.js","files":["package.json","index.js","lib"],"dependencies":{"connect":">= 1.8.1","node-promise":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_npmUser":{"name":"...max...","email":"max@motovilov.com"},"_id":"adstream-data@0.1.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a83547093e6e4dc2827805ee26c113fdd75ace1f","tarball":"http://registry.npmjs.org/adstream-data/-/adstream-data-0.1.5.tgz"},"readme":"","maintainers":[{"name":"...max...","email":"max@motovilov.com"}]},"0.1.6":{"name":"adstream-data","version":"0.1.6","description":"Framework for adstream.data compliant services","author":{"name":"Max Motovilov","email":"max@motovilov.com"},"main":"index.js","files":["package.json","index.js","lib"],"dependencies":{"connect":">= 1.8.1","node-promise":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_npmUser":{"name":"...max...","email":"max@motovilov.com"},"_id":"adstream-data@0.1.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"589631b51e8855b947aa293d5ad3c8375b2170a0","tarball":"http://registry.npmjs.org/adstream-data/-/adstream-data-0.1.6.tgz"},"readme":"","maintainers":[{"name":"...max...","email":"max@motovilov.com"}]}},"readme":null,"maintainers":[{"name":"...max...","email":"max@motovilov.com"}],"time":{"modified":"2012-05-11T13:05:41.199Z","created":"2012-01-17T16:14:42.897Z","0.1.1":"2012-01-17T16:14:45.605Z","0.1.2":"2012-02-01T03:17:04.065Z","0.1.3":"2012-02-14T22:21:01.823Z","0.1.4":"2012-02-14T22:59:02.023Z","0.1.5":"2012-04-18T14:35:20.622Z","0.1.6":"2012-05-11T13:05:41.199Z"},"author":{"name":"Max Motovilov","email":"max@motovilov.com"},"repository":{"type":"git","url":"git://github.com/MaxMotovilov/adstream-js-frameworks.git"},"_attachments":{"adstream-data-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-i56XCN3LeNyr1OVIXHHbWQ==","length":12124,"stub":true},"adstream-data-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-tTtrmQpiebfBG81Tnd0J9A==","length":12149,"stub":true},"adstream-data-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-KHatTMGYfzWBakdeRjfOHw==","length":12203,"stub":true},"adstream-data-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mrkaC2aGg2OIcqDm0GMnQw==","length":12216,"stub":true},"adstream-data-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-u98buCneEGbL62XBAYk4Gg==","length":12210,"stub":true},"adstream-data-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hJ/VWZVwetRdwzwiz0vBqw==","length":12048,"stub":true}}}},
{"id":"advice","key":"advice","value":{"rev":"3-1b704b3c269d02901aecb6fa1dff61a6"},"doc":{"_id":"advice","_rev":"3-1b704b3c269d02901aecb6fa1dff61a6","name":"advice","description":"Advice functional mixin based on Twitter's Angus Croll presentation (How we learned to stop worrying and love Javascript).","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"advice","description":"Advice functional mixin based on Twitter's Angus Croll presentation (How we learned to stop worrying and love Javascript).","version":"0.1.0","author":{"name":"Martin Angers","email":"martin.n.angers@gmail.com"},"private":false,"dependencies":{},"devDependencies":{"mocha":"1.x","expect.js":"0.x","sinon":"1.x"},"scripts":{"test":"make test"},"main":"./index","engines":{"node":">= 0.6"},"homepage":"https://github.com/PuerkitoBio/advice","repository":{"type":"git","url":"git://github.com/PuerkitoBio/advice.git"},"_id":"advice@0.1.0","dist":{"shasum":"d3efa896aa159612ebf1b6c5b2f38fca18449d0d","tarball":"http://registry.npmjs.org/advice/-/advice-0.1.0.tgz"},"readme":"","maintainers":[{"name":"puerkitobio","email":"martin.n.angers@gmail.com"}]}},"readme":"","maintainers":[{"name":"puerkitobio","email":"martin.n.angers@gmail.com"}],"time":{"modified":"2012-07-10T01:25:13.154Z","created":"2012-07-10T01:25:12.635Z","0.1.0":"2012-07-10T01:25:13.154Z"},"author":{"name":"Martin Angers","email":"martin.n.angers@gmail.com"},"repository":{"type":"git","url":"git://github.com/PuerkitoBio/advice.git"},"_attachments":{"advice-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OCIs6s1Y4ZBp94pe2IGE/g==","length":2936,"stub":true}}}},
{"id":"adwiki","key":"adwiki","value":{"rev":"3-30e0d4a3b0ee2e1272ed333359f84b05"},"doc":{"_id":"adwiki","_rev":"3-30e0d4a3b0ee2e1272ed333359f84b05","name":"adwiki","description":"autodafe component for generating documentation","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"adwiki","description":"autodafe component for generating documentation","keywords":["autodafe","component","jsdoc"],"version":"0.0.1","author":{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"},"main":"./components/jsdoc_parser.js","repository":{"type":"git","url":"git://github.com/VlVl/adwiki.git"},"dependencies":{},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"vlvl","email":"bvlvl2003@rambler.ru"},"_id":"adwiki@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"69d792870d100cda1c8d16596a0eeaeeb5d1d6b9","tarball":"http://registry.npmjs.org/adwiki/-/adwiki-0.0.1.tgz"},"maintainers":[{"name":"vlvl","email":"bvlvl2003@rambler.ru"}]}},"readme":null,"maintainers":[{"name":"vlvl","email":"bvlvl2003@rambler.ru"}],"time":{"modified":"2012-01-07T10:16:48.984Z","created":"2012-01-07T10:16:47.929Z","0.0.1":"2012-01-07T10:16:48.984Z"},"author":{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"},"repository":{"type":"git","url":"git://github.com/VlVl/adwiki.git"},"_attachments":{"adwiki-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-StlNzp+6dH16KBNQjA90Bg==","length":17254,"stub":true}}}},
{"id":"ae86","key":"ae86","value":{"rev":"16-54192fc2ba026f71d7f785d20dd0bee9"},"doc":{"_id":"ae86","_rev":"16-54192fc2ba026f71d7f785d20dd0bee9","name":"ae86","description":"Simplistic static website generator.","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"ae86","description":"Static website generator.","keywords":["static","website","generator"],"version":"0.0.2","homepage":"http://github.com/cliffano/ae86","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"ae86":"./bin/ae86"},"scripts":{"test":"vows --spec `find test -name \"*.js\"`"},"repository":{"type":"git","url":"git://github.com/cliffano/ae86.git"},"bugs":{"url":"http://github.com/cliffano/ae86/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"async":"0.1.15","dateformat":"1.0.2-1.2.3","file":"0.1.1","jazz":"0.0.14","ncp":"0.2.2","nomnom":"1.5.1","underscore":"1.2.2"},"devDependencies":{"sandboxed-module":"0.1.2","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/ae86/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"ae86@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"aff90b085b2c08ad575480385aa529631bc8b7f6","tarball":"http://registry.npmjs.org/ae86/-/ae86-0.0.2.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.3":{"name":"ae86","description":"Static website generator written in Node.js .","keywords":["static","website","generator"],"version":"0.0.3","homepage":"http://github.com/cliffano/ae86","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"ae86":"./bin/ae86"},"scripts":{"test":"vows --spec `find test -name \"*.js\"`"},"repository":{"type":"git","url":"git://github.com/cliffano/ae86.git"},"bugs":{"url":"http://github.com/cliffano/ae86/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.15","dateformat":"1.0.2-1.2.3","file":"0.1.1","jazz":"0.0.14","ncp":"0.2.2","nomnom":"1.5.1","underscore":"1.2.2","watch-tree":"0.1.1"},"devDependencies":{"sandboxed-module":"0.1.2","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/ae86/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"ae86@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"278b5c561dc3b2c43b49e2cde68b61a542731af8","tarball":"http://registry.npmjs.org/ae86/-/ae86-0.0.3.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.4":{"name":"ae86","description":"Static website generator written in Node.js .","keywords":["static","website","generator"],"version":"0.0.4","homepage":"http://github.com/cliffano/ae86","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"ae86":"./bin/ae86"},"scripts":{"test":"npm install -g bob; bob clean lint test coverage;"},"repository":{"type":"git","url":"git://github.com/cliffano/ae86.git"},"bugs":{"url":"http://github.com/cliffano/ae86/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.15","dateformat":"1.0.2-1.2.3","file":"0.2.0","jazz":"0.0.18","ncp":"0.2.2","nomnom":"1.5.1","underscore":"1.2.2","watch-tree-maintained":"0.1.2"},"devDependencies":{"sandboxed-module":"0.1.3","vows":"0.6.1"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/ae86/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"ae86@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"ef16a7f994b7a04bb7ffecb6c83877ea79aa5df8","tarball":"http://registry.npmjs.org/ae86/-/ae86-0.0.4.tgz"},"readme":"AE86 [![http://travis-ci.org/cliffano/ae86](https://secure.travis-ci.org/cliffano/ae86.png?branch=master)](http://travis-ci.org/cliffano/ae86)\n----\n\nAE86 is a static website generator written in Node.js .\n\nInstallation\n------------\n\n    npm install -g ae86\n\nUsage\n-----\n\nCreate new project with sample templates:\n\n    ae86 init\n\n* partials/ - directory containing partial templates\n* layouts/ - directory containing layout templates\n* pages/ - directory containing page templates\n* params.js - file containing custom tags and variables\n\nGenerate the website, website will be written to out/ directory:\n\n    ae86 gen\n\nWatch the project, website will automatically be regenerated everytime there's a modified file:\n\n    ae86 watch\n\nTemplate & Parameters\n---------------------\n\nAE86 uses [shinetech/jazz](https://github.com/shinetech/jazz) as its template engine, checkout Jazz for further syntax documentation.\n\n__Partials__\n\nPartial templates can be used for fragments of the website, e.g. website header, footer, and navigation, that appear on multiple pages. Partial templates can be included in other templates using the include tag.\n\n__Layouts__\n\nLayout templates are applied to each page. By default, all pages use layouts/default.html unless otherwise specified in params.js' sitemap. Page content is rendered in layout using {content} param.\n\n__Pages__\n\nEach page template will be applied a layout and evaluated into a static HTML page.\n\n__Static__\n\nPlace all static files (e.g. images, scripts, styles, robots.txt) in static directory. The directory structure of static files will be kept as-is. If there's any conflict with the page templates, the page template will overwrite the static file.\n\n__Parameters__\n\nWebsite parameters can be specified in exports.params object in params.js file:\n\n    exports.params = {\n      subtitle: 'Small, lightweight, since 1983.',\n      team: ['Keiichi Tsuchiya', 'Mitsu Ide', 'Dori-Kin']\n    }\n\nThese parameters can then be used in a template file:\n\n    <h2>{subtitle}</h2>\n    <ul>\n    {foreach person in team}\n      <li>{person}</li>\n    {end}\n    </ul>\n\nYou also need to specify the sitemap in params.js file. The key should match the page file names under the pages directory, title and layout can optionally be specified as the value. Layout value must be relative to layouts directory, e.g. layout: brochure.html uses layouts/brochure.html . If layout is not specified, then layouts/default.html will be used.\n\n    exports.params = {\n      sitemap: {\n        'index.html': { title: 'Home Page' },\n        'products/corolla.html': { title: 'Toyota Corolla', layout: 'brochure.html' },\n        'products/sprinter.html': { title: 'Toyota Sprinter', layout: 'brochure.html' },\n        'contact.html': { title: 'Contact Us' }\n      }\n    }\n\nNote that params.js is a Node.js module, so it can require other modules accordingly.\n\n__Custom Tags__\n\nCustom tag can be specified in params.js as a function:\n\n    exports.params = {\n      copyright: function (year, name, cb) {\n        cb('Copyright &copy; ' + year + ' ' + name + '. Some Rights Reserved.');\n      }\n    }\n\nNote that a custom tag function must have a callback(result) as the last argument, result will then be rendered on the template.\n\nThe custom tag can then be used in a template file:\n\n    <div id=\"footer\">\n      {copyright('2011', 'Toyota Motor Corporation')}\n    <div>\n\n__Built-in Tags & Variables__\n\nAE86 comes with a number of built-in tags and variables:\n\n* include(file)\n* title()\n* date(format)\n* relative(path)\n* __genId\n\n__include(file)__\n\nThis tag includes a partial template in another template. The file argument is relative to partials directory. E.g. include('header.html') includes partials/header.html file.\n\n    <div id=\"header\">\n      {include('header.html')}\n    </div>\n\nA partial template can also be included in another partial template.\n\n__title()__\n\nThis tag displays the current page's title as configured in sitemap param in params.js .\n\n    <title>{title()}</title>\n\n__date(format)__\n\nThis tag displays the current time with a specified format. Check out [felixge/node-dateformat](https://github.com/felixge/node-dateformat) README page for date format examples.\n\n    <div class=\"date\">{date('dddd dd/mm/yyyy hh:MM:ssTT')}</div>\n\n__relative(path)__\n\nThis tag renders a path relative to the location of the page template.\n\n    <script type=\"text/javascript\" src=\"{relative('scripts/global.js')}\"></script>\n\nWhich will be rendered as ../scripts/global.js from templates under subdirectories of pages directory, but it will be rendered as scripts/global.js from templates right under the pages directory.\n\n____genId__\n\nThis variable is an ID unique for each website generation (currently a timestamp). It's handy when you want to force the client browser to request a resource that should only be cached once for each version of the website, e.g. JavaScript, CSS, or image files.\n\n    <script type=\"text/javascript\" src=\"{relative('scripts/global.js')}?{__genId}\"></script>\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.\n","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.5":{"name":"ae86","description":"Simplistic static website generator.","keywords":["static","website","generator"],"version":"0.0.5","homepage":"http://github.com/cliffano/ae86","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"ae86":"./bin/ae86"},"repository":{"type":"git","url":"git://github.com/cliffano/ae86.git"},"bugs":{"url":"http://github.com/cliffano/ae86/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.22","bagofholding":"0.0.11","dateformat":"1.0.2-1.2.3","file":"0.2.0","jazz":"0.0.18","ncp":"0.2.6","underscore":"1.3.3","watch-tree-maintained":"0.1.2","wrench":"1.3.9"},"devDependencies":{"mocha":"1.2.1","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/ae86/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"ae86@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"44bdebdbfc809d20471ada6c3f630c94f9a9157d","tarball":"http://registry.npmjs.org/ae86/-/ae86-0.0.5.tgz"},"readme":"AE86 [![http://travis-ci.org/cliffano/ae86](https://secure.travis-ci.org/cliffano/ae86.png?branch=master)](http://travis-ci.org/cliffano/ae86)\n----\n\nAE86 is a simplistic static website generator written in Node.js .\n\nThis is handy when you want to create a static website by specifying simple templates, along with custom variables and template functions.\n\nInstallation\n------------\n\n    npm install -g ae86\n\nUsage\n-----\n\nCreate example AE86 project:\n\n    ae86 init\n\nAn AE86 project has the following structure:\n\n* partials/ - directory containing partial templates\n* layouts/ - directory containing layout templates\n* pages/ - directory containing page templates\n* params.js - file containing custom variables and template functions\n\nGenerate website (written to out/ directory):\n\n    ae86 gen\n\nWatch for changes and automatically regenerate website:\n\n    ae86 watch\n\nOr, for AE86 historian, use this alias for watch:\n\n    ae86 drift\n\nRemove website:\n\n    ae86 clean\n\nTemplate & Parameters\n---------------------\n\nAE86 uses [shinetech/jazz](https://github.com/shinetech/jazz) as its template engine, checkout Jazz documentation for further syntax documentation.\n\n__Partials__\n\nPartial templates can be used for fragments of the website, e.g. website header, footer, and navigation, which appear on multiple pages. Partial templates can be included in other templates using {include('partial.html')} template function.\n\n__Layouts__\n\nLayout templates are applied to each page. By default, all pages use layouts/default.html unless otherwise specified in params.js' sitemap. Page content is rendered in layout using {content} variable.\n\n__Pages__\n\nEach page template will be applied a layout, and evaluated into a static HTML page.\n\n__Static__\n\nPlace all static files (e.g. images, scripts, styles, robots.txt) in static directory. The directory structure of static files will be kept as-is. If there's any conflict with the page templates, the page template will overwrite the static file.\n\n__Custom Variables__\n\nWebsite custom variables and template functions can be specified in exports.params object in params.js file:\n\n    exports.params = {\n      subtitle: 'Small, lightweight, since 1983.',\n      team: ['Keiichi Tsuchiya', 'Mitsu Ide', 'Dori-Kin']\n    }\n\nThese parameters can then be used in a template file:\n\n    <h2>{subtitle}</h2>\n    <ul>\n    {foreach person in team}\n      <li>{person}</li>\n    {end}\n    </ul>\n\nYou also need to specify the sitemap in params.js file. The key should match the page file names under the pages directory, title and layout can optionally be specified as the value. Layout value must be relative to layouts directory, e.g. layout: brochure.html uses layouts/brochure.html . If layout is not specified, then layouts/default.html will be used.\n\n    exports.params = {\n      sitemap: {\n        'index.html': { title: 'Home Page' },\n        'products/corolla.html': { title: 'Toyota Corolla', layout: 'brochure.html' },\n        'products/sprinter.html': { title: 'Toyota Sprinter', layout: 'brochure.html' },\n        'contact.html': { title: 'Contact Us' }\n      }\n    }\n\nNote that params.js is a Node.js module, so it can require other modules accordingly.\n\n__Custom Template Functions__\n\nCustom template functions can be specified in params.js :\n\n    exports.params = {\n      copyright: function (year, name, cb) {\n        cb('Copyright &copy; ' + year + ' ' + name + '. Some Rights Reserved.');\n      }\n    }\n\nNote that a custom template function must have a callback(result) as the last argument, result will then be rendered on the template.\n\nThe custom copyright template function above can then be used in a template file:\n\n    <div id=\"footer\">\n      {copyright('2011', 'Toyota Motor Corporation')}\n    <div>\n\n__Built-in Variables & Template Functions__\n\nAE86 comes with a number of built-in variables and template functions:\n\n* include(file)\n* title()\n* date(format)\n* relative(path)\n* __genId\n\n__include(file)__\n\nThis template function includes a partial template within another template. The file argument is relative to partials directory. E.g. include('header.html') includes partials/header.html file.\n\n    <div id=\"header\">\n      {include('header.html')}\n    </div>\n\nA partial template can also be included in another partial template.\n\n__title()__\n\nThis template function displays the current page's title as configured in sitemap param in params.js file.\n\n    <title>{title()}</title>\n\n__date(format)__\n\nThis template function displays the current time with a specified format. Check out [felixge/node-dateformat](https://github.com/felixge/node-dateformat) README page for date format examples.\n\n    <div class=\"date\">{date('dddd dd/mm/yyyy hh:MM:ssTT')}</div>\n\n__relative(path)__\n\nThis template function renders a path relative to the location of the page template.\n\n    <script type=\"text/javascript\" src=\"{relative('scripts/global.js')}\"></script>\n\nWhich will be rendered as ../scripts/global.js from templates under the subdirectories of pages directory, but it will be rendered as scripts/global.js from templates right under the pages directory.\n\n____genId__\n\nThis variable is an ID unique for each website generation (currently a timestamp). It's handy when you want to force the client browser to request a resource that should only be cached once for each version of the generated website, e.g. JavaScript, CSS, or image files.\n\n    <script type=\"text/javascript\" src=\"{relative('scripts/global.js')}?{__genId}\"></script>\n","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.6":{"name":"ae86","description":"Simplistic static website generator.","keywords":["static","website","generator"],"version":"0.0.6","homepage":"http://github.com/cliffano/ae86","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"contributors":[{"name":"All contributors","url":"https://github.com/cliffano/ae86/graphs/contributors"}],"main":"./lib/ae86","bin":{"ae86":"./bin/ae86"},"repository":{"type":"git","url":"git://github.com/cliffano/ae86.git"},"bugs":{"url":"http://github.com/cliffano/ae86/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.22","bagofholding":"0.0.12","dateformat":"1.0.2-1.2.3","file":"0.2.1","jazz":"0.0.18","mkdirp":"0.3.3","ncp":"0.2.6","underscore":"1.3.3","watch-tree-maintained":"0.1.2","wrench":"1.3.9"},"devDependencies":{"mocha":"1.3.2","sandboxed-module":"0.1.3","should":"1.1.0"},"scripts":{},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/ae86/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"ae86@0.0.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3cd3bb239093534dbf812e6b7cc74ed95f29a215","tarball":"http://registry.npmjs.org/ae86/-/ae86-0.0.6.tgz"},"readme":"AE86 [![http://travis-ci.org/cliffano/ae86](https://secure.travis-ci.org/cliffano/ae86.png?branch=master)](http://travis-ci.org/cliffano/ae86)\n----\n\nAE86 is a simplistic static website generator written in Node.js .\n\nThis is handy when you want to create a static website by specifying simple templates, along with custom variables and template functions.\n\nInstallation\n------------\n\n    npm install -g ae86\n\nUsage\n-----\n\nCreate example AE86 project:\n\n    ae86 init\n\nAn AE86 project has the following structure:\n\n* partials/ - directory containing partial templates\n* layouts/ - directory containing layout templates\n* pages/ - directory containing page templates\n* params.js - file containing custom variables and template functions\n\nGenerate website (written to out/ directory):\n\n    ae86 gen\n\nWatch for changes and automatically regenerate website:\n\n    ae86 watch\n\nOr, for AE86 historians, use this alias for watch:\n\n    ae86 drift\n\nRemove website:\n\n    ae86 clean\n\nTemplate & Parameters\n---------------------\n\nAE86 uses [shinetech/jazz](https://github.com/shinetech/jazz) as its template engine, checkout Jazz documentation for further syntax documentation.\n\n__Partials__\n\nPartial templates can be used for fragments of the website, e.g. website header, footer, and navigation, which appear on multiple pages. Partial templates can be included in other templates using {include('partial.html')} template function.\n\n__Layouts__\n\nLayout templates are applied to each page. By default, all pages use layouts/default.html unless otherwise specified in params.js' sitemap. Page content is rendered in layout using {content} variable.\n\n__Pages__\n\nEach page template will be applied a layout, and evaluated into a static HTML page.\n\n__Static__\n\nPlace all static files (e.g. images, scripts, styles, robots.txt) in static directory. The directory structure of static files will be kept as-is. If there's any conflict with the page templates, the page template will overwrite the static file.\n\n__Custom Variables__\n\nWebsite custom variables and template functions can be specified in exports.params object in params.js file:\n\n    exports.params = {\n      subtitle: 'Small, lightweight, since 1983.',\n      team: ['Keiichi Tsuchiya', 'Mitsu Ide', 'Dori-Kin']\n    }\n\nThese parameters can then be used in a template file:\n\n    <h2>{subtitle}</h2>\n    <ul>\n    {foreach person in team}\n      <li>{person}</li>\n    {end}\n    </ul>\n\nYou also need to specify the sitemap in params.js file. The key should match the page file names under the pages directory, title and layout can optionally be specified as the value. Layout value must be relative to layouts directory, e.g. layout: brochure.html uses layouts/brochure.html . If layout is not specified, then layouts/default.html will be used.\n\n    exports.params = {\n      sitemap: {\n        'index.html': { title: 'Home Page' },\n        'products/corolla.html': { title: 'Toyota Corolla', layout: 'brochure.html' },\n        'products/sprinter.html': { title: 'Toyota Sprinter', layout: 'brochure.html' },\n        'contact.html': { title: 'Contact Us' }\n      }\n    }\n\nNote that params.js is a Node.js module, so it can require other modules accordingly.\n\n__Custom Template Functions__\n\nCustom template functions can be specified in params.js :\n\n    exports.params = {\n      copyright: function (year, name, cb) {\n        cb('Copyright &copy; ' + year + ' ' + name + '. Some Rights Reserved.');\n      }\n    }\n\nNote that a custom template function must have a callback(result) as the last argument, result will then be rendered on the template.\n\nThe custom copyright template function above can then be used in a template file:\n\n    <div id=\"footer\">\n      {copyright('2011', 'Toyota Motor Corporation')}\n    <div>\n\n__Built-in Variables & Template Functions__\n\nAE86 comes with a number of built-in variables and template functions:\n\n* include(file)\n* title()\n* date(format)\n* relative(path)\n* __genId\n\n__include(file)__\n\nThis template function includes a partial template within another template. The file argument is relative to partials directory. E.g. include('header.html') includes partials/header.html file.\n\n    <div id=\"header\">\n      {include('header.html')}\n    </div>\n\nA partial template can also be included in another partial template.\n\n__title()__\n\nThis template function displays the current page's title as configured in sitemap param in params.js file.\n\n    <title>{title()}</title>\n\n__date(format)__\n\nThis template function displays the current time with a specified format. Check out [felixge/node-dateformat](https://github.com/felixge/node-dateformat) README page for date format examples.\n\n    <div class=\"date\">{date('dddd dd/mm/yyyy hh:MM:ssTT')}</div>\n\n__relative(path)__\n\nThis template function renders a path relative to the location of the page template.\n\n    <script type=\"text/javascript\" src=\"{relative('scripts/global.js')}\"></script>\n\nWhich will be rendered as ../scripts/global.js from templates under the subdirectories of pages directory, but it will be rendered as scripts/global.js from templates right under the pages directory.\n\n<strong>__genId</strong>\n\nThis variable is an ID unique for each website generation (currently a timestamp). It's handy when you want to force the client browser to request a resource that should only be cached once for each version of the generated website, e.g. JavaScript, CSS, or image files.\n\n    <script type=\"text/javascript\" src=\"{relative('scripts/global.js')}?{__genId}\"></script>\n","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]}},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}],"time":{"modified":"2012-08-15T11:00:12.012Z","created":"2011-12-11T00:20:29.436Z","0.0.2":"2011-12-11T00:27:14.690Z","0.0.3":"2012-01-07T04:01:26.182Z","0.0.4":"2012-02-22T11:43:42.738Z","0.0.5":"2012-07-27T03:34:27.197Z","0.0.6":"2012-08-15T11:00:12.012Z"},"author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"repository":{"type":"git","url":"git://github.com/cliffano/ae86.git"},"users":{"fgribreau":true},"_attachments":{"ae86-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-AqQowG1lf6uuVQ54r5X+zg==","length":10972,"stub":true},"ae86-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fzr3Z7eTHZRQdqC8JEZlzQ==","length":10891,"stub":true},"ae86-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yNyEeaUNZVSES38J+mEBMA==","length":10234,"stub":true},"ae86-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+Tv5/SYCqpI2p2M3D11SFA==","length":10240,"stub":true},"ae86-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nN8+7jBUAi8PGuS5BRIpBg==","length":10240,"stub":true}}}},
{"id":"aegis","key":"aegis","value":{"rev":"3-ade51e124a24c862ce7e056ff49eaf3b"},"doc":{"_id":"aegis","_rev":"3-ade51e124a24c862ce7e056ff49eaf3b","name":"aegis","description":"Asynchronous lazy streams for everynyan.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Quildreen Motta","email":"quildreen@gmail.com","url":"http://killdream.github.com/"},"name":"aegis","description":"Asynchronous lazy streams for everynyan.","version":"0.1.0","main":"./src/index.js","repository":{"type":"git","url":"git://github.com/killdream/aegis.git"},"engines":{"node":"*"},"devDependencies":{"noire":"~0.2.1","sinon":"~1.3.4","mocha":"~1.1.0"},"dependencies":{"boo":"~1.2.0"},"optionalDependencies":{},"_npmUser":{"name":"killdream","email":"quildreen@gmail.com"},"_id":"aegis@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9169e1c4ee409ab0c2f680c59c35ec1a2f8cec06","tarball":"http://registry.npmjs.org/aegis/-/aegis-0.1.0.tgz"},"readme":"","maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}]}},"readme":"","maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}],"time":{"modified":"2012-06-10T00:48:37.204Z","created":"2012-06-10T00:48:32.682Z","0.1.0":"2012-06-10T00:48:37.204Z"},"author":{"name":"Quildreen Motta","email":"quildreen@gmail.com","url":"http://killdream.github.com/"},"repository":{"type":"git","url":"git://github.com/killdream/aegis.git"},"_attachments":{"aegis-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DAFvjrprPRiUlfIYIAQWjQ==","length":4201,"stub":true}}}},
{"id":"aejs","key":"aejs","value":{"rev":"7-4928e2ce6151067cd6c585c0ba3e0bc3"},"doc":{"_id":"aejs","_rev":"7-4928e2ce6151067cd6c585c0ba3e0bc3","name":"aejs","description":"Asynchroneous Embedded JavaScript Templates","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"aejs","description":"Asynchroneous Embedded JavaScript Templates","version":"0.1.0","repository":{"type":"git","url":"git://github.com/m1rr0r/aejs.git"},"author":{"name":"Stoyan Krastev","email":"stoyan.krastev@gmail.com"},"main":"./lib/aejs.js","keywords":["async","template","engine","ejs"],"_id":"aejs@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c3951924059f900bbe337e120034c215beea0d61","tarball":"http://registry.npmjs.org/aejs/-/aejs-0.1.0.tgz"}},"0.2.0":{"name":"aejs","description":"Asynchroneous Embedded JavaScript Templates","version":"0.2.0","repository":{"type":"git","url":"git://github.com/m1rr0r/aejs.git"},"author":{"name":"Stoyan Krastev","email":"stoyan.krastev@gmail.com"},"main":"./lib/aejs.js","keywords":["async","template","engine","ejs"],"_id":"aejs@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bce48c2ed832e882c93cd7a12887dfde26f294dc","tarball":"http://registry.npmjs.org/aejs/-/aejs-0.2.0.tgz"}},"0.2.1":{"name":"aejs","description":"Asynchroneous Embedded JavaScript Templates","version":"0.2.1","repository":{"type":"git","url":"git://github.com/m1rr0r/aejs.git"},"author":{"name":"Stoyan Krastev","email":"stoyan.krastev@gmail.com"},"main":"./lib/aejs.js","keywords":["async","template","engine","ejs"],"_id":"aejs@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8164a5cada5064ad7780ace10dcd1d4ff73aa1fe","tarball":"http://registry.npmjs.org/aejs/-/aejs-0.2.1.tgz"}}},"maintainers":[{"name":"m1rr0r","email":"stoyan.krastev@gmail.com"}],"time":{"modified":"2011-04-29T13:27:19.320Z","created":"2011-03-23T10:49:20.657Z","0.1.0":"2011-03-23T10:49:21.231Z","0.2.0":"2011-03-26T15:56:14.023Z","0.2.1":"2011-04-29T13:27:19.320Z"},"author":{"name":"Stoyan Krastev","email":"stoyan.krastev@gmail.com"},"repository":{"type":"git","url":"git://github.com/m1rr0r/aejs.git"},"_attachments":{"aejs-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-savNDBVzfmwwd807ISqcIQ==","length":6690,"stub":true},"aejs-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-O8J2fSc2HsIP50GVh489hA==","length":6352,"stub":true},"aejs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DurF/daxquWoK3rKxSnUaw==","length":4330,"stub":true}}}},
{"id":"aenoa-supervisor","key":"aenoa-supervisor","value":{"rev":"7-6d399675981e76cfdfb9144bc2f7fb6d"},"doc":{"_id":"aenoa-supervisor","_rev":"7-6d399675981e76cfdfb9144bc2f7fb6d","name":"aenoa-supervisor","description":"A supervisor program for running nodejs programs","dist-tags":{"latest":"0.1.34"},"versions":{"0.1.31":{"name":"aenoa-supervisor","version":"0.1.31","description":"A supervisor program for running nodejs programs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"contributors":[{"name":"Brian Ehmann","email":"behmann@gmail.com"},{"name":"David Taylor","email":"david@zensatellite.com"}],"main":"lib/supervisor.js","bin":{"node-supervisor":"lib/cli-wrapper.js","supervisor":"lib/cli-wrapper.js"},"engines":{"node":"~0.2.3 || 0.3 || 0.4 || 0.5"},"preferGlobal":true,"_id":"aenoa-supervisor@0.1.31","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"06ef94917920f0ab2fd767e04239e51622c855b4","tarball":"http://registry.npmjs.org/aenoa-supervisor/-/aenoa-supervisor-0.1.31.tgz"},"scripts":{}},"0.1.33":{"name":"aenoa-supervisor","version":"0.1.33","description":"A supervisor program for running nodejs programs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"contributors":[{"name":"Brian Ehmann","email":"behmann@gmail.com"},{"name":"David Taylor","email":"david@zensatellite.com"},{"name":"Xavier Laumonier","email":"contact@aenoa-systems.com"}],"main":"lib/supervisor.js","bin":{"node-supervisor":"lib/cli-wrapper.js","supervisor":"lib/cli-wrapper.js"},"engines":{"node":"~0.2.3 || 0.3 || 0.4 || 0.5"},"preferGlobal":true,"_id":"aenoa-supervisor@0.1.33","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1202a1742dedbf5ab4f8d9d8ffffe151231daef2","tarball":"http://registry.npmjs.org/aenoa-supervisor/-/aenoa-supervisor-0.1.33.tgz"},"scripts":{},"maintainers":[{"name":"xavierlaumonier","email":"dev@aenoa-systems.com"}]},"0.1.34":{"name":"aenoa-supervisor","version":"0.1.34","description":"A supervisor program for running nodejs programs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"contributors":[{"name":"Brian Ehmann","email":"behmann@gmail.com"},{"name":"David Taylor","email":"david@zensatellite.com"},{"name":"Xavier Laumonier","email":"contact@aenoa-systems.com"}],"main":"lib/supervisor.js","bin":{"node-supervisor":"lib/cli-wrapper.js","supervisor":"lib/cli-wrapper.js"},"engines":{"node":"~0.2.3 || 0.3 || 0.4 || 0.5"},"preferGlobal":true,"_id":"aenoa-supervisor@0.1.34","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"7d007a31802c4da243693ee6051d86700eb6213f","tarball":"http://registry.npmjs.org/aenoa-supervisor/-/aenoa-supervisor-0.1.34.tgz"},"scripts":{},"maintainers":[{"name":"xavierlaumonier","email":"dev@aenoa-systems.com"}]}},"maintainers":[{"name":"xavierlaumonier","email":"dev@aenoa-systems.com"}],"time":{"modified":"2011-09-09T10:59:47.575Z","created":"2011-07-27T13:22:27.497Z","0.1.31":"2011-07-27T13:22:28.154Z","0.1.33":"2011-09-09T10:54:48.326Z","0.1.34":"2011-09-09T10:59:47.575Z"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"_attachments":{"aenoa-supervisor-0.1.34.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nmTFH5pC9qHeWOrBjczLpQ==","length":4202,"stub":true},"aenoa-supervisor-0.1.33.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TSHr2iTh7Z8xrYQPLlQRUg==","length":4181,"stub":true},"aenoa-supervisor-0.1.31.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1u3Mf6S365L5VAvIHtzGYA==","length":3497,"stub":true}}}},
{"id":"aes-helper","key":"aes-helper","value":{"rev":"3-7c82300cc0ca45c195cef0f9738c9243"},"doc":{"_id":"aes-helper","_rev":"3-7c82300cc0ca45c195cef0f9738c9243","name":"aes-helper","description":"AES encryption & decryption drop-in helper","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Fabian Tollenaar"},"name":"aes-helper","description":"AES encryption & decryption drop-in helper","version":"0.0.1","repository":{"url":"https://github.com/fabdrol/node-aes-helper"},"main":"./lib/aes","engines":{"node":">=0.8"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"readme":"node-aes-helper\n===============\n\nAES encryption & decryption drop-in helper\n\n\nInstallation: \n\n``` \n\nnpm install aes-helper\n\n```\n\n\nUsage:\n\n```javascript\n\nvar aes = require('aes-helper');\n\nvar password  = 'pEm@@5M6~8rJ.c%3z*4=-{9};t7PP`j<0/KAC89t9V3Y57 >;(IrIb$K,w6`JV*|';\nvar plaintext = \"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.\";\n\nvar ciphertext = aes.encrypt(plaintext, password);\nvar decoded = aes.decrypt(ciphertext, password);\n\nconsole.log(\"Encrypted:\\n\" + ciphertext + \"\\n\");\nconsole.log(\"Decrypted:\\n\" + decoded + \"\\n\");\n\nconsole.log(\"Test:\");\nconsole.log((decoded === plaintext ? 'Text matches, all okay.' : 'Problems...'));\n\n```","_id":"aes-helper@0.0.1","dist":{"shasum":"07fdc4ab90f82fd38432a8ec0e900d428cb11848","tarball":"http://registry.npmjs.org/aes-helper/-/aes-helper-0.0.1.tgz"},"maintainers":[{"name":"fabdrol","email":"fabian@startingpoint.nl"}]}},"readme":"node-aes-helper\n===============\n\nAES encryption & decryption drop-in helper\n\n\nInstallation: \n\n``` \n\nnpm install aes-helper\n\n```\n\n\nUsage:\n\n```javascript\n\nvar aes = require('aes-helper');\n\nvar password  = 'pEm@@5M6~8rJ.c%3z*4=-{9};t7PP`j<0/KAC89t9V3Y57 >;(IrIb$K,w6`JV*|';\nvar plaintext = \"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.\";\n\nvar ciphertext = aes.encrypt(plaintext, password);\nvar decoded = aes.decrypt(ciphertext, password);\n\nconsole.log(\"Encrypted:\\n\" + ciphertext + \"\\n\");\nconsole.log(\"Decrypted:\\n\" + decoded + \"\\n\");\n\nconsole.log(\"Test:\");\nconsole.log((decoded === plaintext ? 'Text matches, all okay.' : 'Problems...'));\n\n```","maintainers":[{"name":"fabdrol","email":"fabian@startingpoint.nl"}],"time":{"modified":"2012-08-05T14:40:11.487Z","created":"2012-08-05T14:40:09.321Z","0.0.1":"2012-08-05T14:40:11.487Z"},"author":{"name":"Fabian Tollenaar"},"repository":{"url":"https://github.com/fabdrol/node-aes-helper"},"_attachments":{"aes-helper-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7qM5CzoajgreoGGVacIIcg==","length":1332,"stub":true}}}},
{"id":"affilinet","key":"affilinet","value":{"rev":"10-820f4e650512068837cf498d541ce6e8"},"doc":{"_id":"affilinet","_rev":"10-820f4e650512068837cf498d541ce6e8","name":"affilinet","description":"simple interface to the affilinet api","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"affilinet","description":"simple interface to the affilinet api","version":"0.0.1","repository":{"type":"git","url":"git://github.com/snd/node-affilinet.git"},"dependencies":{},"devDependencies":{"nodeunit":"0.7.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"affilinet@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"dfd8b3a79672cffe20d8e7c5d622f93d1248e3c0","tarball":"http://registry.npmjs.org/affilinet/-/affilinet-0.0.1.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]},"0.0.2":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"affilinet","description":"simple interface to the affilinet api","version":"0.0.2","repository":{"type":"git","url":"git://github.com/snd/node-affilinet.git"},"dependencies":{},"devDependencies":{"nodeunit":"0.7.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"affilinet@0.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"42b31e5bd181503b1a123da447af762fefb9276c","tarball":"http://registry.npmjs.org/affilinet/-/affilinet-0.0.2.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]},"0.0.3":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"affilinet","description":"simple interface to the affilinet api","version":"0.0.3","repository":{"type":"git","url":"git://github.com/snd/node-affilinet.git"},"dependencies":{},"devDependencies":{"nodeunit":"0.8.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"affilinet@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"5f51c3b206c78f5cbff14032bf3e7dc31a4273ad","tarball":"http://registry.npmjs.org/affilinet/-/affilinet-0.0.3.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]},"0.0.4":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"affilinet","description":"simple interface to the affilinet api","version":"0.0.4","repository":{"type":"git","url":"git://github.com/snd/node-affilinet.git"},"dependencies":{},"devDependencies":{"nodeunit":"0.8.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"affilinet@0.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"bf3e3dc19f93eb42da3808cf679d52f5f7cf286d","tarball":"http://registry.npmjs.org/affilinet/-/affilinet-0.0.4.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]}},"readme":"# affilinet\n\nnode wrapper for the affilinet php soap examples\n\n**this is very early work in progress**\n\n### Install\n\n    npm install affilinet\n\n### Use\n\n```coffeescript\n\nAffilinet = require 'affilinet'\n\naffilinet = new Affilinet\n    publisherId: '...'\n    productWebservicePassword: '...'\n    publisherWebservicePassword: '...'\n\naffilinet.getShops (err, shops) ->\n    throw err if err?\n    console.log shops\n\n    affilinet.getSalesForDayRange startDate, endDate, (err, sales) ->\n        throw err if err?\n        console.log sales\n```\n\n### License: MIT\n","maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}],"time":{"modified":"2012-08-02T17:22:25.688Z","created":"2012-07-20T12:25:18.492Z","0.0.1":"2012-07-20T12:25:20.001Z","0.0.2":"2012-07-25T15:20:22.606Z","0.0.3":"2012-07-31T14:22:09.837Z","0.0.4":"2012-08-02T17:22:25.688Z"},"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"repository":{"type":"git","url":"git://github.com/snd/node-affilinet.git"},"users":{"fgribreau":true},"_attachments":{"affilinet-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-5rTpvlR+VUvGhyLWOvnzHw==","length":3282,"stub":true},"affilinet-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gn2TtilqSM/Cakc2E2BVHA==","length":3118,"stub":true},"affilinet-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/G7mFHDR+ZggRqQKO2LcaQ==","length":2411,"stub":true},"affilinet-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/nPHone7vZdMwS3kV3e/Mg==","length":2253,"stub":true}}}},
{"id":"after","key":"after","value":{"rev":"33-d670b75fb176ad4922c5b85023c540f2"},"doc":{"_id":"after","_rev":"33-d670b75fb176ad4922c5b85023c540f2","name":"after","description":"after - tiny flow control","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"after","description":"after - tiny flow control","version":"0.1.0","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"vows":"0.5.9"},"keywords":["flowcontrol","after","flow"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"after","scripts":{},"engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/after/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"after@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"0bf9a392e78dbf23e7f3fafa9177ddc714dc54fe","tarball":"http://registry.npmjs.org/after/-/after-0.1.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"}},"0.1.3":{"name":"after","description":"after - tiny flow control","version":"0.1.3","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"vows-fluent":"0.1.1"},"keywords":["flowcontrol","after","flow"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"after","scripts":{},"engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/after/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"after@0.1.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"ab3d83f0513dbaac19b82434aa7bfda5813a9196","tarball":"http://registry.npmjs.org/after/-/after-0.1.3.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"}},"0.1.4":{"name":"after","description":"after - tiny flow control","version":"0.1.4","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"vows-fluent":"0.1.9"},"keywords":["flowcontrol","after","flow"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"after","scripts":{},"engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/after/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"after@0.1.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b40f2b9d172eadda53769b00dcb6369bbb1dfc03","tarball":"http://registry.npmjs.org/after/-/after-0.1.4.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"}},"0.1.5":{"name":"after","description":"after - tiny flow control","version":"0.1.5","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"vows-fluent":"0.1.9"},"keywords":["flowcontrol","after","flow"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"after","scripts":{},"engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/after/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"after@0.1.5","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"bea01692f875c192a16cc26c17826a783912c469","tarball":"http://registry.npmjs.org/after/-/after-0.1.5.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"}},"0.1.6":{"name":"after","description":"after - tiny flow control","version":"0.1.6","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"tester":"0.0.1"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"src/after","engines":{"node":"0.5.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/after/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"after@0.1.6","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.5.5","_defaultsLoaded":true,"dist":{"shasum":"9d344114fcb1f1616d583a42ba54e8ecaedcb873","tarball":"http://registry.npmjs.org/after/-/after-0.1.6.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"}},"0.1.7":{"name":"after","description":"after - tiny flow control","version":"0.1.7","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"tester":"0.0.3"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"src/after","engines":{"node":"0.6.x"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.1.7","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e392d8756630c005e36d0554ed4bea463da7c210","tarball":"http://registry.npmjs.org/after/-/after-0.1.7.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.1.8":{"name":"after","description":"after - tiny flow control","version":"0.1.8","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"devDependencies":{"tester":"0.0.4"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"src/after","engines":{"node":"0.6.x"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.1.8","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"27b9750e2103047b99128f306dceb16b7f0a1d81","tarball":"http://registry.npmjs.org/after/-/after-0.1.8.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.0":{"name":"after","description":"after - tiny flow control","version":"0.2.0","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"node test/main-test.js"},"devDependencies":{"tester":"0.0.4"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"src/after","engines":{"node":"0.6 || 0.4"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"bfdba338dbb670d6ca3f73cad6d7ff2db4acb71a","tarball":"http://registry.npmjs.org/after/-/after-0.2.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.3.1":{"name":"after","description":"after - tiny flow control","version":"0.3.1","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","engines":{"node":"0.6"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.3.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e8a1065f37c01d394d6922fc4f9c1e61a66ad46b","tarball":"http://registry.npmjs.org/after/-/after-0.3.1.tgz"},"readme":"# After [![Build Status][1]][2]\n\nAll the flow control you'll ever need\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\"),\n        next = after(3, logItWorks);\n\n    next();\n    next();\n    next(); // it works\n\n    function logItWorks() {\n        console.log(\"it works!\");\n    }\n\n## Motivation \n\nMinimal flow control. A lot of the libraries out there are over kill. I want a small tool that gives me fundamental concrete building blocks\n\n## Documentation\n\n### after(count, callback) <a name=\"after\" href=\"#after\"><small><sup>link</sup></small></a>\n\n`after` takes a count and a callback and returns a function `next`. The callback get's invoked when the `next` function is invoked count number of times. The callback aggregates the data given to `next` as un-ordered parameters.\n\n    var next = after(3, printData);\n\n    next(\"foo\", \"bar\", { ... })\n    next({ ... });\n    next(42);\n\n    function printData() {\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            console.log(arguments[i]);  \n        }\n        // in some order\n        // 42\n        // { ... }\n        // [ \"foo\", \"bar\", { ... }]\n    }\n\nNote that the internal counter is exposed as `next.count` so you can manually increment or decrement it in a dynamic fashion. This is useful for recursively algorithms that want to increment the counter.\n\n### after.unpack(arguments) <a name=\"unpack\" href=\"#unpack\"><small><sup>link</sup></small></a>\n\nUnpack data from after using a convention\n\n``` javascript\nvar next = after(2, function () {\n    var data = after.unpack(arguments); \n    /* data = { foo: \"bar\", baz: \"boz\"}; */\n});\n\nnext(\"foo\", \"bar\");\nnext(\"baz\", \"boz\");\n```\n\n### after set utilities\n\nThe following methods are asynchronous parallel versions of the `Array.prototype` methods.\n\nThey all take parameters `(set, iterator, optionalContext, finishedCallback)`\n\n - set : the set to operate on\n - iterator : iterator function that is called for every value in the set.\n    iterator has multiple signatures. Either `(callback)` or `(value, callback)` or `(value, index, callback)` or `(value, index, obj, callback)`. The last argument is always the callback. The callback should be invoked when your done iterating over that item. You may invoke the callback with `(err, result)`\n - optionalContext : optional parameter, if given it will be the value of `this` \n    inside the iterator\n - finishedCallback : this callback is invoked when every iterator has invoked it's\n    individual callback. It has a signature of `(err, result)`. The `err` parameter\n    is whatever passed an error first or `null`. The result parameter is specific\n    to each set utility function\n\nNote that `reduce` has an `optionalInitialValue` instead of an `optionalContext`.\n\nAlso reduce's signature is `(memo, value, index, obj, callback)` or any of the shorter forms like `(memo, value, callback)`.\n\nApart from reduce and reduceRight all of these set iterators run their iterators in parallel over the set\n\n### after.forEach(set, iterator, optionalContext, finishedCallback) <a name=\"after.forEach\" href=\"#after.forEach\"><small><sup>link</sup></small></a>\n\nFor `.forEach` the `result` parameter of the finishedCallback is always undefined.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.forEach(set, synchronizeOAuth, finished)\n\n    function synchronizeOAuth(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).sychronize(userObject, callback);\n    }\n\n    function finished(err) {\n        if (err) throw err;\n    }\n\n### after.map(set, iterator, optionalContext, finishedCallback) <a name=\"after.map\" href=\"#after.map\"><small><sup>link</sup></small></a>\n\nFor `.map` the `result` parameter of the finishedCalllback is the object your mapping too.\n\nmap will return a result that either inherits from your objects prototype or is an array depending on whether the call value is an object or an array\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.map(set, getOAuthUser, finished);\n\n    function getOauthUser(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).getUser(userObject, callback);\n    }\n\n    function finished (err, oAuthUserObjects) {\n        if (err) throw err;\n        for (var service in oAuthUserObjects) {\n            ...\n        }\n    }\n\n### after.reduce(set, iterator, optionalInitialValue, finishedCallback) <a name=\"after.reduce\" href=\"#after.reduce\"><small><sup>link</sup></small></a>\n\nFor `.reduce` the `result` parameter is the reduced value.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.reduce(set, aggregateFriends, 0, finished);\n\n    function aggregateFriends(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName)\n            .getNumberOfFriends(userObject, function (err, friends) {\n                callback(err, friends + memo);\n            });\n    }\n\n    function finished (err, numberOfFriends) {\n        if (err) throw err;\n        ...\n    }\n    \n### after.reduceRight(...) <a name=\"after.reduceRight\" href=\"#after.reduceRight\"><small><sup>link</sup></small></a>\n\n`.reduceRight` is the same as `reduce` excepts runs over the object in reverse.\n\n### after.filter(set, iterator, optionalContext, finishedCallback) <a name=\"after.filter\" href=\"#after.filter\"><small><sup>link</sup></small></a>\n\nFor `.filter` the `result` is the filtered object/array.\n\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.filter(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, usersThatExist) {\n        if (err) throw err;\n        ...\n    }\n\n### after.every(set, iterator, optionalContext, finishedCallback) <a name=\"after.every\" href=\"#after.every\"><small><sup>link</sup></small></a>\n\nEvery passes `true` to the finished callback if every callback in the iteration passed `true`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAllServices) {\n        if (err) throw err;\n        ...\n    }\n\n### After.some(set, iterator, optionalContext, finishedCallback) <a name=\"after.some\" href=\"#after.some\"><small><sup>link</sup></small></a>\n\nSome passes `false` to the finished callback if every callback in the iteration passed `false`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAnyServices) {\n        if (err) throw err;\n        ...\n    }\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n[Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.3.2":{"name":"after","description":"after - tiny flow control","version":"0.3.2","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","engines":{"node":"0.6"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.3.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9a26de3cf3650d6cdd395a2997531de3bd687c60","tarball":"http://registry.npmjs.org/after/-/after-0.3.2.tgz"},"readme":"# After [![Build Status][1]][2]\n\nAll the flow control you'll ever need\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\"),\n        next = after(3, logItWorks);\n\n    next();\n    next();\n    next(); // it works\n\n    function logItWorks() {\n        console.log(\"it works!\");\n    }\n\n## Motivation \n\nMinimal flow control. A lot of the libraries out there are over kill. I want a small tool that gives me fundamental concrete building blocks\n\n## Documentation\n\n### after(count, callback) <a name=\"after\" href=\"#after\"><small><sup>link</sup></small></a>\n\n`after` takes a count and a callback and returns a function `next`. The callback get's invoked when the `next` function is invoked count number of times. The callback aggregates the data given to `next` as un-ordered parameters.\n\n    var next = after(3, printData);\n\n    next(\"foo\", \"bar\", { ... })\n    next({ ... });\n    next(42);\n\n    function printData() {\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            console.log(arguments[i]);  \n        }\n        // in some order\n        // 42\n        // { ... }\n        // [ \"foo\", \"bar\", { ... }]\n    }\n\nNote that the internal counter is exposed as `next.count` so you can manually increment or decrement it in a dynamic fashion. This is useful for recursively algorithms that want to increment the counter.\n\n### after.unpack(arguments) <a name=\"unpack\" href=\"#unpack\"><small><sup>link</sup></small></a>\n\nUnpack data from after using a convention\n\n``` javascript\nvar next = after(2, function () {\n    var data = after.unpack(arguments); \n    /* data = { foo: \"bar\", baz: \"boz\"}; */\n});\n\nnext(\"foo\", \"bar\");\nnext(\"baz\", \"boz\");\n```\n\n### after set utilities\n\nThe following methods are asynchronous parallel versions of the `Array.prototype` methods.\n\nThey all take parameters `(set, iterator, optionalContext, finishedCallback)`\n\n - set : the set to operate on\n - iterator : iterator function that is called for every value in the set.\n    iterator has multiple signatures. Either `(callback)` or `(value, callback)` or `(value, index, callback)` or `(value, index, obj, callback)`. The last argument is always the callback. The callback should be invoked when your done iterating over that item. You may invoke the callback with `(err, result)`\n - optionalContext : optional parameter, if given it will be the value of `this` \n    inside the iterator\n - finishedCallback : this callback is invoked when every iterator has invoked it's\n    individual callback. It has a signature of `(err, result)`. The `err` parameter\n    is whatever passed an error first or `null`. The result parameter is specific\n    to each set utility function\n\nNote that `reduce` has an `optionalInitialValue` instead of an `optionalContext`.\n\nAlso reduce's signature is `(memo, value, index, obj, callback)` or any of the shorter forms like `(memo, value, callback)`.\n\nApart from reduce and reduceRight all of these set iterators run their iterators in parallel over the set\n\n### after.forEach(set, iterator, optionalContext, finishedCallback) <a name=\"after.forEach\" href=\"#after.forEach\"><small><sup>link</sup></small></a>\n\nFor `.forEach` the `result` parameter of the finishedCallback is always undefined.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.forEach(set, synchronizeOAuth, finished)\n\n    function synchronizeOAuth(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).sychronize(userObject, callback);\n    }\n\n    function finished(err) {\n        if (err) throw err;\n    }\n\n### after.map(set, iterator, optionalContext, finishedCallback) <a name=\"after.map\" href=\"#after.map\"><small><sup>link</sup></small></a>\n\nFor `.map` the `result` parameter of the finishedCalllback is the object your mapping too.\n\nmap will return a result that either inherits from your objects prototype or is an array depending on whether the call value is an object or an array\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.map(set, getOAuthUser, finished);\n\n    function getOauthUser(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).getUser(userObject, callback);\n    }\n\n    function finished (err, oAuthUserObjects) {\n        if (err) throw err;\n        for (var service in oAuthUserObjects) {\n            ...\n        }\n    }\n\n### after.reduce(set, iterator, optionalInitialValue, finishedCallback) <a name=\"after.reduce\" href=\"#after.reduce\"><small><sup>link</sup></small></a>\n\nFor `.reduce` the `result` parameter is the reduced value.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.reduce(set, aggregateFriends, 0, finished);\n\n    function aggregateFriends(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName)\n            .getNumberOfFriends(userObject, function (err, friends) {\n                callback(err, friends + memo);\n            });\n    }\n\n    function finished (err, numberOfFriends) {\n        if (err) throw err;\n        ...\n    }\n    \n### after.reduceRight(...) <a name=\"after.reduceRight\" href=\"#after.reduceRight\"><small><sup>link</sup></small></a>\n\n`.reduceRight` is the same as `reduce` excepts runs over the object in reverse.\n\n### after.filter(set, iterator, optionalContext, finishedCallback) <a name=\"after.filter\" href=\"#after.filter\"><small><sup>link</sup></small></a>\n\nFor `.filter` the `result` is the filtered object/array.\n\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.filter(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, usersThatExist) {\n        if (err) throw err;\n        ...\n    }\n\n### after.every(set, iterator, optionalContext, finishedCallback) <a name=\"after.every\" href=\"#after.every\"><small><sup>link</sup></small></a>\n\nEvery passes `true` to the finished callback if every callback in the iteration passed `true`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAllServices) {\n        if (err) throw err;\n        ...\n    }\n\n### After.some(set, iterator, optionalContext, finishedCallback) <a name=\"after.some\" href=\"#after.some\"><small><sup>link</sup></small></a>\n\nSome passes `false` to the finished callback if every callback in the iteration passed `false`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAnyServices) {\n        if (err) throw err;\n        ...\n    }\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n[Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.3.3":{"name":"after","description":"after - tiny flow control","version":"0.3.3","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","engines":{"node":"0.6"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.3.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"63e3c61be2049f8d752e87cbeff70f2c90eca474","tarball":"http://registry.npmjs.org/after/-/after-0.3.3.tgz"},"readme":"# After [![Build Status][1]][2]\n\nAll the flow control you'll ever need\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\"),\n        next = after(3, logItWorks);\n\n    next();\n    next();\n    next(); // it works\n\n    function logItWorks() {\n        console.log(\"it works!\");\n    }\n\n## Motivation \n\nMinimal flow control. A lot of the libraries out there are over kill. I want a small tool that gives me fundamental concrete building blocks\n\n## Documentation\n\n### after(count, callback) <a name=\"after\" href=\"#after\"><small><sup>link</sup></small></a>\n\n`after` takes a count and a callback and returns a function `next`. The callback get's invoked when the `next` function is invoked count number of times. The callback aggregates the data given to `next` as un-ordered parameters.\n\n    var next = after(3, printData);\n\n    next(\"foo\", \"bar\", { ... })\n    next({ ... });\n    next(42);\n\n    function printData() {\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            console.log(arguments[i]);  \n        }\n        // in some order\n        // 42\n        // { ... }\n        // [ \"foo\", \"bar\", { ... }]\n    }\n\nNote that the internal counter is exposed as `next.count` so you can manually increment or decrement it in a dynamic fashion. This is useful for recursively algorithms that want to increment the counter.\n\n### after.unpack(arguments) <a name=\"unpack\" href=\"#unpack\"><small><sup>link</sup></small></a>\n\nUnpack data from after using a convention\n\n``` javascript\nvar next = after(2, function () {\n    var data = after.unpack(arguments); \n    /* data = { foo: \"bar\", baz: \"boz\"}; */\n});\n\nnext(\"foo\", \"bar\");\nnext(\"baz\", \"boz\");\n```\n\n### after set utilities\n\nThe following methods are asynchronous parallel versions of the `Array.prototype` methods.\n\nThey all take parameters `(set, iterator, optionalContext, finishedCallback)`\n\n - set : the set to operate on\n - iterator : iterator function that is called for every value in the set.\n    iterator has multiple signatures. Either `(callback)` or `(value, callback)` or `(value, index, callback)` or `(value, index, obj, callback)`. The last argument is always the callback. The callback should be invoked when your done iterating over that item. You may invoke the callback with `(err, result)`\n - optionalContext : optional parameter, if given it will be the value of `this` \n    inside the iterator\n - finishedCallback : this callback is invoked when every iterator has invoked it's\n    individual callback. It has a signature of `(err, result)`. The `err` parameter\n    is whatever passed an error first or `null`. The result parameter is specific\n    to each set utility function\n\nNote that `reduce` has an `optionalInitialValue` instead of an `optionalContext`.\n\nAlso reduce's signature is `(memo, value, index, obj, callback)` or any of the shorter forms like `(memo, value, callback)`.\n\nApart from reduce and reduceRight all of these set iterators run their iterators in parallel over the set\n\n### after.forEach(set, iterator, optionalContext, finishedCallback) <a name=\"after.forEach\" href=\"#after.forEach\"><small><sup>link</sup></small></a>\n\nFor `.forEach` the `result` parameter of the finishedCallback is always undefined.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.forEach(set, synchronizeOAuth, finished)\n\n    function synchronizeOAuth(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).sychronize(userObject, callback);\n    }\n\n    function finished(err) {\n        if (err) throw err;\n    }\n\n### after.map(set, iterator, optionalContext, finishedCallback) <a name=\"after.map\" href=\"#after.map\"><small><sup>link</sup></small></a>\n\nFor `.map` the `result` parameter of the finishedCalllback is the object your mapping too.\n\nmap will return a result that either inherits from your objects prototype or is an array depending on whether the call value is an object or an array\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.map(set, getOAuthUser, finished);\n\n    function getOauthUser(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).getUser(userObject, callback);\n    }\n\n    function finished (err, oAuthUserObjects) {\n        if (err) throw err;\n        for (var service in oAuthUserObjects) {\n            ...\n        }\n    }\n\n### after.reduce(set, iterator, optionalInitialValue, finishedCallback) <a name=\"after.reduce\" href=\"#after.reduce\"><small><sup>link</sup></small></a>\n\nFor `.reduce` the `result` parameter is the reduced value.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.reduce(set, aggregateFriends, 0, finished);\n\n    function aggregateFriends(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName)\n            .getNumberOfFriends(userObject, function (err, friends) {\n                callback(err, friends + memo);\n            });\n    }\n\n    function finished (err, numberOfFriends) {\n        if (err) throw err;\n        ...\n    }\n    \n### after.reduceRight(...) <a name=\"after.reduceRight\" href=\"#after.reduceRight\"><small><sup>link</sup></small></a>\n\n`.reduceRight` is the same as `reduce` excepts runs over the object in reverse.\n\n### after.filter(set, iterator, optionalContext, finishedCallback) <a name=\"after.filter\" href=\"#after.filter\"><small><sup>link</sup></small></a>\n\nFor `.filter` the `result` is the filtered object/array.\n\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.filter(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, usersThatExist) {\n        if (err) throw err;\n        ...\n    }\n\n### after.every(set, iterator, optionalContext, finishedCallback) <a name=\"after.every\" href=\"#after.every\"><small><sup>link</sup></small></a>\n\nEvery passes `true` to the finished callback if every callback in the iteration passed `true`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAllServices) {\n        if (err) throw err;\n        ...\n    }\n\n### After.some(set, iterator, optionalContext, finishedCallback) <a name=\"after.some\" href=\"#after.some\"><small><sup>link</sup></small></a>\n\nSome passes `false` to the finished callback if every callback in the iteration passed `false`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAnyServices) {\n        if (err) throw err;\n        ...\n    }\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n[Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.3.4":{"name":"after","description":"after - tiny flow control","version":"0.3.4","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.3.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ecf9b46406744027fbc29e6c8c140a237938964c","tarball":"http://registry.npmjs.org/after/-/after-0.3.4.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.4.0":{"name":"after","description":"after - tiny flow control","version":"0.4.0","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.4.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"0a8fbc64aae49748e5abaae9f8bd5752170a159f","tarball":"http://registry.npmjs.org/after/-/after-0.4.0.tgz"},"readme":"# After [![Build Status][1]][2]\n\nAll the flow control you'll ever need\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\"),\n        next = after(3, logItWorks);\n\n    next();\n    next();\n    next(); // it works\n\n    function logItWorks() {\n        console.log(\"it works!\");\n    }\n\n## Motivation \n\nMinimal flow control. A lot of the libraries out there are over kill. I want a small tool that gives me fundamental concrete building blocks\n\n## Documentation\n\n### after(count, callback) <a name=\"after\" href=\"#after\"><small><sup>link</sup></small></a>\n\n`after` takes a count and a callback and returns a function `next`. The callback get's invoked when the `next` function is invoked count number of times. The callback aggregates the data given to `next` as un-ordered parameters.\n\n    var next = after(3, printData);\n\n    next(\"foo\", \"bar\", { ... })\n    next({ ... });\n    next(42);\n\n    function printData() {\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            console.log(arguments[i]);  \n        }\n        // in some order\n        // 42\n        // { ... }\n        // [ \"foo\", \"bar\", { ... }]\n    }\n\nNote that the internal counter is exposed as `next.count` so you can manually increment or decrement it in a dynamic fashion. This is useful for recursively algorithms that want to increment the counter.\n\n### after.unpack(arguments) <a name=\"unpack\" href=\"#unpack\"><small><sup>link</sup></small></a>\n\nUnpack data from after using a convention\n\n``` javascript\nvar next = after(2, function () {\n    var data = after.unpack(arguments); \n    /* data = { foo: \"bar\", baz: \"boz\"}; */\n});\n\nnext(\"foo\", \"bar\");\nnext(\"baz\", \"boz\");\n```\n\n### after set utilities\n\nThe following methods are asynchronous parallel versions of the `Array.prototype` methods.\n\nThey all take parameters `(set, iterator, optionalContext, finishedCallback)`\n\n - set : the set to operate on\n - iterator : iterator function that is called for every value in the set.\n    iterator has multiple signatures. Either `(callback)` or `(value, callback)` or `(value, index, callback)` or `(value, index, obj, callback)`. The last argument is always the callback. The callback should be invoked when your done iterating over that item. You may invoke the callback with `(err, result)`\n - optionalContext : optional parameter, if given it will be the value of `this` \n    inside the iterator\n - finishedCallback : this callback is invoked when every iterator has invoked it's\n    individual callback. It has a signature of `(err, result)`. The `err` parameter\n    is whatever passed an error first or `null`. The result parameter is specific\n    to each set utility function\n\nNote that `reduce` has an `optionalInitialValue` instead of an `optionalContext`.\n\nAlso reduce's signature is `(memo, value, index, obj, callback)` or any of the shorter forms like `(memo, value, callback)`.\n\nApart from reduce and reduceRight all of these set iterators run their iterators in parallel over the set\n\n### after.forEach(set, iterator, optionalContext, finishedCallback) <a name=\"after.forEach\" href=\"#after.forEach\"><small><sup>link</sup></small></a>\n\nFor `.forEach` the `result` parameter of the finishedCallback is always undefined.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.forEach(set, synchronizeOAuth, finished)\n\n    function synchronizeOAuth(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).sychronize(userObject, callback);\n    }\n\n    function finished(err) {\n        if (err) throw err;\n    }\n\n### after.map(set, iterator, optionalContext, finishedCallback) <a name=\"after.map\" href=\"#after.map\"><small><sup>link</sup></small></a>\n\nFor `.map` the `result` parameter of the finishedCalllback is the object your mapping too.\n\nmap will return a result that either inherits from your objects prototype or is an array depending on whether the call value is an object or an array\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.map(set, getOAuthUser, finished);\n\n    function getOauthUser(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).getUser(userObject, callback);\n    }\n\n    function finished (err, oAuthUserObjects) {\n        if (err) throw err;\n        for (var service in oAuthUserObjects) {\n            ...\n        }\n    }\n\n### after.reduce(set, iterator, optionalInitialValue, finishedCallback) <a name=\"after.reduce\" href=\"#after.reduce\"><small><sup>link</sup></small></a>\n\nFor `.reduce` the `result` parameter is the reduced value.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.reduce(set, aggregateFriends, 0, finished);\n\n    function aggregateFriends(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName)\n            .getNumberOfFriends(userObject, function (err, friends) {\n                callback(err, friends + memo);\n            });\n    }\n\n    function finished (err, numberOfFriends) {\n        if (err) throw err;\n        ...\n    }\n    \n### after.reduceRight(...) <a name=\"after.reduceRight\" href=\"#after.reduceRight\"><small><sup>link</sup></small></a>\n\n`.reduceRight` is the same as `reduce` excepts runs over the object in reverse.\n\n### after.filter(set, iterator, optionalContext, finishedCallback) <a name=\"after.filter\" href=\"#after.filter\"><small><sup>link</sup></small></a>\n\nFor `.filter` the `result` is the filtered object/array.\n\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.filter(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, usersThatExist) {\n        if (err) throw err;\n        ...\n    }\n\n### after.every(set, iterator, optionalContext, finishedCallback) <a name=\"after.every\" href=\"#after.every\"><small><sup>link</sup></small></a>\n\nEvery passes `true` to the finished callback if every callback in the iteration passed `true`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAllServices) {\n        if (err) throw err;\n        ...\n    }\n\n### After.some(set, iterator, optionalContext, finishedCallback) <a name=\"after.some\" href=\"#after.some\"><small><sup>link</sup></small></a>\n\nSome passes `false` to the finished callback if every callback in the iteration passed `false`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAnyServices) {\n        if (err) throw err;\n        ...\n    }\n\n### <a href=\"#flow\" name=\"flow\">After.flow(array, context)</a>\n\nCreates a flow through all the functions in the array. Each function in the array is passed in the next function as the last argument. Optionally pass in a context which will be the this value for all functions\n\nafter.flow([\n    function (next) {\n        next(\"foo\")\n    },\n    function (foo, next) {\n        assert.equal(foo, \"foo\")\n        next()\n    },\n    function () {\n        assert.deepEqual(this, context)\n    }\n], context)\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n[Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.4.1":{"name":"after","description":"after - tiny flow control","version":"0.4.1","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.4.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a5ebed013473d4665363412e565951c196095dba","tarball":"http://registry.npmjs.org/after/-/after-0.4.1.tgz"},"readme":"# After [![Build Status][1]][2]\n\nAll the flow control you'll ever need\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\"),\n        next = after(3, logItWorks);\n\n    next();\n    next();\n    next(); // it works\n\n    function logItWorks() {\n        console.log(\"it works!\");\n    }\n\n## Motivation \n\nMinimal flow control. A lot of the libraries out there are over kill. I want a small tool that gives me fundamental concrete building blocks\n\n## Documentation\n\n### after(count, callback) <a name=\"after\" href=\"#after\"><small><sup>link</sup></small></a>\n\n`after` takes a count and a callback and returns a function `next`. The callback get's invoked when the `next` function is invoked count number of times. The callback aggregates the data given to `next` as un-ordered parameters.\n\n    var next = after(3, printData);\n\n    next(\"foo\", \"bar\", { ... })\n    next({ ... });\n    next(42);\n\n    function printData() {\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            console.log(arguments[i]);  \n        }\n        // in some order\n        // 42\n        // { ... }\n        // [ \"foo\", \"bar\", { ... }]\n    }\n\nNote that the internal counter is exposed as `next.count` so you can manually increment or decrement it in a dynamic fashion. This is useful for recursively algorithms that want to increment the counter.\n\n### after.unpack(arguments) <a name=\"unpack\" href=\"#unpack\"><small><sup>link</sup></small></a>\n\nUnpack data from after using a convention\n\n``` javascript\nvar next = after(2, function () {\n    var data = after.unpack(arguments); \n    /* data = { foo: \"bar\", baz: \"boz\"}; */\n});\n\nnext(\"foo\", \"bar\");\nnext(\"baz\", \"boz\");\n```\n\n### after set utilities\n\nThe following methods are asynchronous parallel versions of the `Array.prototype` methods.\n\nThey all take parameters `(set, iterator, optionalContext, finishedCallback)`\n\n - set : the set to operate on\n - iterator : iterator function that is called for every value in the set.\n    iterator has multiple signatures. Either `(callback)` or `(value, callback)` or `(value, index, callback)` or `(value, index, obj, callback)`. The last argument is always the callback. The callback should be invoked when your done iterating over that item. You may invoke the callback with `(err, result)`\n - optionalContext : optional parameter, if given it will be the value of `this` \n    inside the iterator\n - finishedCallback : this callback is invoked when every iterator has invoked it's\n    individual callback. It has a signature of `(err, result)`. The `err` parameter\n    is whatever passed an error first or `null`. The result parameter is specific\n    to each set utility function\n\nNote that `reduce` has an `optionalInitialValue` instead of an `optionalContext`.\n\nAlso reduce's signature is `(memo, value, index, obj, callback)` or any of the shorter forms like `(memo, value, callback)`.\n\nApart from reduce and reduceRight all of these set iterators run their iterators in parallel over the set\n\n### after.forEach(set, iterator, optionalContext, finishedCallback) <a name=\"after.forEach\" href=\"#after.forEach\"><small><sup>link</sup></small></a>\n\nFor `.forEach` the `result` parameter of the finishedCallback is always undefined.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.forEach(set, synchronizeOAuth, finished)\n\n    function synchronizeOAuth(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).sychronize(userObject, callback);\n    }\n\n    function finished(err) {\n        if (err) throw err;\n    }\n\n### after.map(set, iterator, optionalContext, finishedCallback) <a name=\"after.map\" href=\"#after.map\"><small><sup>link</sup></small></a>\n\nFor `.map` the `result` parameter of the finishedCalllback is the object your mapping too.\n\nmap will return a result that either inherits from your objects prototype or is an array depending on whether the call value is an object or an array\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.map(set, getOAuthUser, finished);\n\n    function getOauthUser(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).getUser(userObject, callback);\n    }\n\n    function finished (err, oAuthUserObjects) {\n        if (err) throw err;\n        for (var service in oAuthUserObjects) {\n            ...\n        }\n    }\n\n### after.reduce(set, iterator, optionalInitialValue, finishedCallback) <a name=\"after.reduce\" href=\"#after.reduce\"><small><sup>link</sup></small></a>\n\nFor `.reduce` the `result` parameter is the reduced value.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.reduce(set, aggregateFriends, 0, finished);\n\n    function aggregateFriends(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName)\n            .getNumberOfFriends(userObject, function (err, friends) {\n                callback(err, friends + memo);\n            });\n    }\n\n    function finished (err, numberOfFriends) {\n        if (err) throw err;\n        ...\n    }\n    \n### after.reduceRight(...) <a name=\"after.reduceRight\" href=\"#after.reduceRight\"><small><sup>link</sup></small></a>\n\n`.reduceRight` is the same as `reduce` excepts runs over the object in reverse.\n\n### after.filter(set, iterator, optionalContext, finishedCallback) <a name=\"after.filter\" href=\"#after.filter\"><small><sup>link</sup></small></a>\n\nFor `.filter` the `result` is the filtered object/array.\n\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.filter(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, usersThatExist) {\n        if (err) throw err;\n        ...\n    }\n\n### after.every(set, iterator, optionalContext, finishedCallback) <a name=\"after.every\" href=\"#after.every\"><small><sup>link</sup></small></a>\n\nEvery passes `true` to the finished callback if every callback in the iteration passed `true`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAllServices) {\n        if (err) throw err;\n        ...\n    }\n\n### After.some(set, iterator, optionalContext, finishedCallback) <a name=\"after.some\" href=\"#after.some\"><small><sup>link</sup></small></a>\n\nSome passes `false` to the finished callback if every callback in the iteration passed `false`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAnyServices) {\n        if (err) throw err;\n        ...\n    }\n\n### <a href=\"#flow\" name=\"flow\">After.flow(array, context)</a>\n\nCreates a flow through all the functions in the array. Each function in the array is passed in the next function as the last argument. Optionally pass in a context which will be the this value for all functions\n\n    after.flow([\n        function (next) {\n            next(null, \"foo\")\n        },\n        function (err, foo, next) {\n            assert.equal(foo, \"foo\")\n            next()\n        },\n        function (next) {\n            assert.deepEqual(this, context)\n            next(new Error(\"an error\"))\n        },\n        function () {\n            assert(false, \"this is never called\")\n        }\n    ], context, function errorCallback(err) {\n        assert.equal(err.message, \"an error\")\n    })\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n[Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.5.0":{"name":"after","description":"after - tiny flow control","version":"0.5.0","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"after@0.5.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a6123f193524197bb8345c9ec19d225c0c0623aa","tarball":"http://registry.npmjs.org/after/-/after-0.5.0.tgz"},"readme":"# After [![Build Status][1]][2]\n\nAll the flow control you'll ever need\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\"),\n        next = after(3, logItWorks);\n\n    next();\n    next();\n    next(); // it works\n\n    function logItWorks() {\n        console.log(\"it works!\");\n    }\n\n## Motivation \n\nMinimal flow control. A lot of the libraries out there are over kill. I want a small tool that gives me fundamental concrete building blocks\n\n## Documentation\n\n### after(count, callback) <a name=\"after\" href=\"#after\"><small><sup>link</sup></small></a>\n\n`after` takes a count and a callback and returns a function `next`. The callback get's invoked when the `next` function is invoked count number of times. The callback aggregates the data given to `next` as un-ordered parameters.\n\n    var next = after(3, printData);\n\n    next(\"foo\", \"bar\", { ... })\n    next({ ... });\n    next(42);\n\n    function printData() {\n        for (var i = 0, len = arguments.length; i < len; i++) {\n            console.log(arguments[i]);  \n        }\n        // in some order\n        // 42\n        // { ... }\n        // [ \"foo\", \"bar\", { ... }]\n    }\n\nNote that the internal counter is exposed as `next.count` so you can manually increment or decrement it in a dynamic fashion. This is useful for recursively algorithms that want to increment the counter.\n\n### after.unpack(arguments) <a name=\"unpack\" href=\"#unpack\"><small><sup>link</sup></small></a>\n\nUnpack data from after using a convention\n\n``` javascript\nvar next = after(2, function () {\n    var data = after.unpack(arguments); \n    /* data = { foo: \"bar\", baz: \"boz\"}; */\n});\n\nnext(\"foo\", \"bar\");\nnext(\"baz\", \"boz\");\n```\n\n### after set utilities\n\nThe following methods are asynchronous parallel versions of the `Array.prototype` methods.\n\nThey all take parameters `(set, iterator, optionalContext, finishedCallback)`\n\n - set : the set to operate on\n - iterator : iterator function that is called for every value in the set.\n    iterator has multiple signatures. Either `(callback)` or `(value, callback)` or `(value, index, callback)` or `(value, index, obj, callback)`. The last argument is always the callback. The callback should be invoked when your done iterating over that item. You may invoke the callback with `(err, result)`\n - optionalContext : optional parameter, if given it will be the value of `this` \n    inside the iterator\n - finishedCallback : this callback is invoked when every iterator has invoked it's\n    individual callback. It has a signature of `(err, result)`. The `err` parameter\n    is whatever passed an error first or `null`. The result parameter is specific\n    to each set utility function\n\nNote that `reduce` has an `optionalInitialValue` instead of an `optionalContext`.\n\nAlso reduce's signature is `(memo, value, index, obj, callback)` or any of the shorter forms like `(memo, value, callback)`.\n\nApart from reduce and reduceRight all of these set iterators run their iterators in parallel over the set\n\n### after.forEach(set, iterator, optionalContext, finishedCallback) <a name=\"after.forEach\" href=\"#after.forEach\"><small><sup>link</sup></small></a>\n\nFor `.forEach` the `result` parameter of the finishedCallback is always undefined.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.forEach(set, synchronizeOAuth, finished)\n\n    function synchronizeOAuth(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).sychronize(userObject, callback);\n    }\n\n    function finished(err) {\n        if (err) throw err;\n    }\n\n### after.map(set, iterator, optionalContext, finishedCallback) <a name=\"after.map\" href=\"#after.map\"><small><sup>link</sup></small></a>\n\nFor `.map` the `result` parameter of the finishedCalllback is the object your mapping too.\n\nmap will return a result that either inherits from your objects prototype or is an array depending on whether the call value is an object or an array\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.map(set, getOAuthUser, finished);\n\n    function getOauthUser(userObject, oAuthName, callback) {\n        getOAuth(oAuthName).getUser(userObject, callback);\n    }\n\n    function finished (err, oAuthUserObjects) {\n        if (err) throw err;\n        for (var service in oAuthUserObjects) {\n            ...\n        }\n    }\n\n### after.reduce(set, iterator, optionalInitialValue, finishedCallback) <a name=\"after.reduce\" href=\"#after.reduce\"><small><sup>link</sup></small></a>\n\nFor `.reduce` the `result` parameter is the reduced value.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.reduce(set, aggregateFriends, 0, finished);\n\n    function aggregateFriends(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName)\n            .getNumberOfFriends(userObject, function (err, friends) {\n                callback(err, friends + memo);\n            });\n    }\n\n    function finished (err, numberOfFriends) {\n        if (err) throw err;\n        ...\n    }\n    \n### after.reduceRight(...) <a name=\"after.reduceRight\" href=\"#after.reduceRight\"><small><sup>link</sup></small></a>\n\n`.reduceRight` is the same as `reduce` excepts runs over the object in reverse.\n\n### after.filter(set, iterator, optionalContext, finishedCallback) <a name=\"after.filter\" href=\"#after.filter\"><small><sup>link</sup></small></a>\n\nFor `.filter` the `result` is the filtered object/array.\n\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.filter(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, usersThatExist) {\n        if (err) throw err;\n        ...\n    }\n\n### after.every(set, iterator, optionalContext, finishedCallback) <a name=\"after.every\" href=\"#after.every\"><small><sup>link</sup></small></a>\n\nEvery passes `true` to the finished callback if every callback in the iteration passed `true`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAllServices) {\n        if (err) throw err;\n        ...\n    }\n\n### After.some(set, iterator, optionalContext, finishedCallback) <a name=\"after.some\" href=\"#after.some\"><small><sup>link</sup></small></a>\n\nSome passes `false` to the finished callback if every callback in the iteration passed `false`.\n\n    var set = {\n        google: googleUser,\n        github: githubUser,\n        facebook: facebookUser\n    };\n\n    after.every(set, isRegistered, finished);\n\n    function isRegistered(memo, userObject, oAuthName, callback) {\n        getOAuth(oAuthName).userExists(userObject, callback);\n    }\n\n    function finished (err, registeredOnAnyServices) {\n        if (err) throw err;\n        ...\n    }\n\n### <a href=\"#flow\" name=\"flow\">After.flow(array, context)</a>\n\nCreates a flow through all the functions in the array. Each function in the array is passed in the next function as the last argument. Optionally pass in a context which will be the this value for all functions\n\n    after.flow([\n        function (next) {\n            next(null, \"foo\")\n        },\n        function (err, foo, next) {\n            assert.equal(foo, \"foo\")\n            next()\n        },\n        function (next) {\n            assert.deepEqual(this, context)\n            next(new Error(\"an error\"))\n        },\n        function () {\n            assert(false, \"this is never called\")\n        }\n    ], context, function errorCallback(err) {\n        assert.equal(err.message, \"an error\")\n    })\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n[Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.0":{"name":"after","description":"after - tiny flow control","version":"0.6.0","author":{"name":"Raynos","email":"raynos2@gmail.com"},"contributors":[{"name":"Raynos","email":"raynos2@gmail.com","url":"http://raynos.org"}],"scripts":{"test":"make test"},"devDependencies":{"mocha":"0.10.2"},"keywords":["flowcontrol","after","flow","control","arch"],"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"main":"lib/after","readme":"# After [![Build Status][1]][2]\n\nInvoke callback after n calls\n\n## Status: production ready\n\n## Example\n\n    var after = require(\"after\")\n        , next = after(3, logItWorks)\n\n    next()\n    next()\n    next() // it works\n\n    function logItWorks() {\n        console.log(\"it works!\")\n    }\n\n## Example with error handling\n\n    var after = require(\"after\")\n        , next = after(3, logError)\n\n    next()\n    next(new Error(\"oops\")) // logs oops\n    next() // does nothing\n\n    function logError(err) {\n        console.log(err)\n    }\n\n## After < 0.6.0\n\nOlder versions of after had iterators and flows in them.\n\nThese have been replaced with seperate modules\n\n - [iterators][8]\n - [composite][9]\n\n## Installation\n\n`npm install after`\n\n## Tests\n\n`make test`\n\n## Blog post\n\n - [Flow control in node.js][3]\n\n## Examples :\n\n - [Determining the end of asynchronous operations][4]\n - [In javascript what are best practices for executing multiple asynchronous functions][5]\n - [JavaScript performance long running tasks][6]\n - [Synchronous database queries with node.js][7]\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/after.js.png\n  [2]: http://travis-ci.org/Raynos/after.js\n  [3]: http://raynos.org/blog/2/Flow-control-in-node.js\n  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307\n  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031\n  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419\n  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091\n  [8]: http://github.com/Raynos/iterators\n  [9]: http://github.com/Raynos/composite","_id":"after@0.6.0","dist":{"shasum":"0e7a62d35ffe2eedb4eb4081d3905d4081e6fc20","tarball":"http://registry.npmjs.org/after/-/after-0.6.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2012-07-15T06:05:34.045Z","created":"2011-08-15T14:01:15.289Z","0.1.0":"2011-12-08T01:56:13.312Z","0.1.3":"2011-12-08T01:56:13.312Z","0.1.4":"2011-12-08T01:56:13.312Z","0.1.5":"2011-12-08T01:56:13.312Z","0.1.6":"2011-12-08T01:56:13.312Z","0.1.7":"2011-11-10T15:31:29.230Z","0.1.8":"2011-12-02T18:29:43.571Z","0.2.0":"2011-12-08T01:56:13.312Z","0.3.1":"2012-01-30T01:04:13.451Z","0.3.2":"2012-02-28T11:38:51.930Z","0.3.3":"2012-03-04T20:38:46.024Z","0.3.4":"2012-04-11T23:44:38.170Z","0.4.0":"2012-04-23T10:50:58.605Z","0.4.1":"2012-05-08T19:20:57.272Z","0.5.0":"2012-05-30T15:58:26.661Z","0.6.0":"2012-07-15T06:05:34.045Z"},"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/after.js.git"},"_attachments":{"after-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-5ezXB5ZslKRM6iv6q9WeKg==","length":2574,"stub":true},"after-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-iypfDxt+D8ezq+Oh7yk/ww==","length":6743,"stub":true},"after-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-d54Nco0ExHGUHtEzKiGIdw==","length":6912,"stub":true},"after-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-BrBbm+TvhfKSnfotnHVWSQ==","length":6677,"stub":true},"after-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-vDCGv7GjlWMBhHEuPU2N8g==","length":6452,"stub":true},"after-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-9Ekh69mNoqUpRAsx4BAA9w==","length":6092,"stub":true},"after-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-JRnI1CoVNsu7qLJCbBzapw==","length":6087,"stub":true},"after-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-9Jvt5MQJ/0ferTU4vCenfw==","length":6058,"stub":true},"after-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-NjemjYw8DNMtVqMiJpxrbQ==","length":3959,"stub":true},"after-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-jbWOmr4JJc6ZTFUBhfgQRQ==","length":1914,"stub":true},"after-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-x3CPxtMXG1VLYkh0eGtdBQ==","length":1742,"stub":true},"after-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-po9pPb8A/Qn2oB0YeTDA6Q==","length":1750,"stub":true},"after-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ryKvz70RKRPPvwQpZwgasw==","length":2054,"stub":true},"after-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-S3os8HvysCqDs6c7cxTKZg==","length":2000,"stub":true},"after-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-FLvR3F62ETxAwaDnx1FGBw==","length":1969,"stub":true},"after-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WgywVg0lVtlqztSThzYdpg==","length":1415,"stub":true}}}},
{"id":"ag","key":"ag","value":{"rev":"5-cdb9b8df69d0426bce356ec1f8893c45"},"doc":{"_id":"ag","_rev":"5-cdb9b8df69d0426bce356ec1f8893c45","name":"ag","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"author":{"name":"Tom MacWright","email":"tom@macwright.org","url":"http://macwright.org/"},"name":"ag","version":"0.0.0","homepage":"http://macwright.org/","repository":{"url":""},"engines":{"node":"~0.4.10"},"dependencies":{"optimist":"0.3.0","jsdom":"0.2.10","get":"1.1.2"},"devDependencies":{},"bin":{"ag":"./ag"},"_npmUser":{"name":"tmcw","email":"macwright@gmail.com"},"_id":"ag@0.0.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"56fe9405233fe4798fbd4e8c98f9b5c29a83e619","tarball":"http://registry.npmjs.org/ag/-/ag-0.0.0.tgz"},"maintainers":[{"name":"tmcw","email":"macwright@gmail.com"}]},"0.0.1":{"author":{"name":"Tom MacWright","email":"tom@macwright.org","url":"http://macwright.org/"},"name":"ag","version":"0.0.1","homepage":"https://github.com/tmcw/ag","repository":{"url":"git@github.com:tmcw/ag.git"},"engines":{"node":"~0.4.10"},"dependencies":{"optimist":"0.3.0","jsdom":"0.2.10"},"devDependencies":{},"preferGlobal":true,"bin":{"ag":"./ag"},"_npmUser":{"name":"tmcw","email":"macwright@gmail.com"},"_id":"ag@0.0.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5794b65ab6cc99be642344b7f5403496a5c937b7","tarball":"http://registry.npmjs.org/ag/-/ag-0.0.1.tgz"},"maintainers":[{"name":"tmcw","email":"macwright@gmail.com"}]}},"maintainers":[{"name":"tmcw","email":"macwright@gmail.com"}],"time":{"modified":"2011-12-22T20:47:22.214Z","created":"2011-12-22T20:29:17.223Z","0.0.0":"2011-12-22T20:29:17.522Z","0.0.1":"2011-12-22T20:47:22.214Z"},"author":{"name":"Tom MacWright","email":"tom@macwright.org","url":"http://macwright.org/"},"repository":{"url":"git@github.com:tmcw/ag.git"},"_attachments":{"ag-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Gc4GA3Og6VxYaisfAOZKSA==","length":10240,"stub":true},"ag-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xIc6xFibq6X5zs9HRELOKA==","length":10240,"stub":true}}}},
{"id":"agent","key":"agent","value":{"rev":"3-b03f97e3651df0c92b287c8d01eb279a"},"doc":{"_id":"agent","_rev":"3-b03f97e3651df0c92b287c8d01eb279a","name":"agent","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Valerio Proietti","email":"@kamicane","url":"http://mad4milk.net"},"name":"agent","version":"0.0.0","repository":{"url":""},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"kamicane","email":"kamicane@gmail.com"},"_id":"agent@0.0.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"11a80dba92b8d71f7ff2815f710a86b2fb4110d2","tarball":"http://registry.npmjs.org/agent/-/agent-0.0.0.tgz"},"readme":"","maintainers":[{"name":"kamicane","email":"kamicane@gmail.com"}]}},"readme":"","maintainers":[{"name":"kamicane","email":"kamicane@gmail.com"}],"time":{"modified":"2012-04-06T17:24:14.838Z","created":"2012-04-06T17:24:12.844Z","0.0.0":"2012-04-06T17:24:14.838Z"},"author":{"name":"Valerio Proietti","email":"@kamicane","url":"http://mad4milk.net"},"repository":{"url":""},"_attachments":{"agent-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oMP+uHBiV/7V+alQUOp3dw==","length":266,"stub":true}}}},
{"id":"agent.io","key":"agent.io","value":{"rev":"17-c96fa023bb3342e4f71ce34f04d14b33"},"doc":{"_id":"agent.io","_rev":"17-c96fa023bb3342e4f71ce34f04d14b33","name":"agent.io","description":"Real-time, scalable agent<->server messaging","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"agent.io","version":"0.1.0","description":"Real-time, scalable agent<->server messaging","author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"homepage":"https://github.com/dmelikyan/agent.io","keywords":["agent","server-side","real-time","messaging","long polling"],"contributors":[],"main":"./index.js","directories":{"lib":"./lib/agent.io"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"dependencies":{"request":"*"},"devDependencies":{"express":">=2.5.0","redis":">=0.7.0"},"engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://github.com/dmelikyan/agent.io/raw/master/LICENSE"}],"_npmUser":{"name":"rapidlogix","email":"dmitri@rapidlogix.com"},"_id":"agent.io@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"44edc5d4d8fd33cfec6c150b6ae04259e7733cc2","tarball":"http://registry.npmjs.org/agent.io/-/agent.io-0.1.0.tgz"},"maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}]},"0.1.1":{"name":"agent.io","version":"0.1.1","description":"Real-time, scalable agent<->server messaging","author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"homepage":"https://github.com/dmelikyan/agent.io","keywords":["agent","server-side","real-time","messaging","long polling"],"contributors":[],"main":"./index.js","directories":{"lib":"./lib/agent.io"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"dependencies":{"request":"*"},"devDependencies":{"express":">=2.5.0","redis":">=0.7.0"},"engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://github.com/dmelikyan/agent.io/raw/master/LICENSE"}],"_npmUser":{"name":"rapidlogix","email":"dmitri@rapidlogix.com"},"_id":"agent.io@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3718afeae6c51daabc8d5b7ab7cb8f365336ce2d","tarball":"http://registry.npmjs.org/agent.io/-/agent.io-0.1.1.tgz"},"maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}]},"0.1.2":{"name":"agent.io","version":"0.1.2","description":"Real-time, scalable agent<->server messaging","author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"homepage":"https://github.com/dmelikyan/agent.io","keywords":["agent","server-side","real-time","messaging","long polling"],"contributors":[],"main":"./index.js","directories":{"lib":"./lib/agent.io"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"dependencies":{"request":"*"},"devDependencies":{"express":">=2.5.0","redis":">=0.7.0"},"engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://github.com/dmelikyan/agent.io/raw/master/LICENSE"}],"_npmUser":{"name":"rapidlogix","email":"dmitri@rapidlogix.com"},"_id":"agent.io@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"58008fda0a308a360fccdeba69012782920054da","tarball":"http://registry.npmjs.org/agent.io/-/agent.io-0.1.2.tgz"},"maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}]},"0.1.3":{"name":"agent.io","version":"0.1.3","description":"Real-time, scalable agent<->server messaging","author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"homepage":"https://github.com/dmelikyan/agent.io","keywords":["agent","server-side","real-time","messaging","long polling"],"contributors":[],"main":"./index.js","directories":{"lib":"./lib/agent.io"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"dependencies":{"request":"*"},"devDependencies":{"express":">=2.5.0","redis":">=0.7.0"},"engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://github.com/dmelikyan/agent.io/raw/master/LICENSE"}],"_npmUser":{"name":"rapidlogix","email":"dmitri@rapidlogix.com"},"_id":"agent.io@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"edcdd66a0217c04c00ef30d14d76d0efb8168a76","tarball":"http://registry.npmjs.org/agent.io/-/agent.io-0.1.3.tgz"},"maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}]},"0.1.4":{"name":"agent.io","version":"0.1.4","description":"Real-time, scalable agent<->server messaging","author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"homepage":"https://github.com/dmelikyan/agent.io","keywords":["agent","server-side","real-time","messaging","long polling"],"contributors":[],"main":"./index.js","directories":{"lib":"./lib/agent.io"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"dependencies":{"request":"*"},"devDependencies":{"express":">=2.5.0","redis":">=0.7.0"},"engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://github.com/dmelikyan/agent.io/raw/master/LICENSE"}],"_npmUser":{"name":"rapidlogix","email":"dmitri@rapidlogix.com"},"_id":"agent.io@0.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"8515e6ef3770bb88579d10675c65636b30f803c1","tarball":"http://registry.npmjs.org/agent.io/-/agent.io-0.1.4.tgz"},"maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}]},"0.1.5":{"name":"agent.io","version":"0.1.5","description":"Real-time, scalable agent<->server messaging","author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"homepage":"https://github.com/dmelikyan/agent.io","keywords":["agent","server-side","real-time","messaging","long polling"],"contributors":[],"main":"./index.js","directories":{"lib":"./lib/agent.io"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"dependencies":{"request":"*"},"devDependencies":{"express":">=2.5.0","redis":">=0.7.0"},"engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://github.com/dmelikyan/agent.io/raw/master/LICENSE"}],"readme":"Agent.io - Real-time, scalable agent<->server messaging for Node.js\n========\n\nAgent.io is a simple long polling based Node.js messaging library. It is usefull for use cases, where agents having no inbound access have to talk to servers in both directions in real-time. \n\nThe server part currently relies on Express and Redis. Redis pubsub is used to enable scaling out of servers to serve more agents. Please make sure Redis library is installed `npm install redis`. Redis >= 2.6 is recommended if multiple servers are used.\n\nI might add WebSocket transport at some point if it is proved to be well supported and reliable for server to server use cases. \n\n\n## Installation and Usage\n\nInstall Agent.io with npm both on client and server\n\n    npm install agent.io \n\n\nAgent-side usage\n\n    var agentio = require('agent.io');\n\n    /* if no group name is specified, a unique id will be assigned to the agent */\n    var agent = agentio.createClient({group: 'group1', server: 'http://localhost:3000'});\n\n    /* listener for messages, which server sends to \"group1\" */\n    agent.on('message', function(msg) {\n    });\n\n    /* sending a message to the server */\n    agent.send({field: \"value\"});\n\n\n\nServer-side usage\n\n    /* agent.io */\n\n    var agentio = require('agent.io');\n\n    var server = agentio.createServer();\n\n    /* group1 message listener */\n    server.on('group1', function(msg) {\n    });\n\n    /* listener for messages from all groups */\n    server.on('message', function(group, msg) {\n    });\n\n    /* listener for messages from all groups. Returns an array of all \n     * messages sent during one second or single event loop cycle.\n     */\n    server.on('messages', function(group, msgs) {\n    });\n\n    \n    /* sending a message to agent */\n    server.send('group1', {field: \"value\"});\n\n\n\n    /* express app */\n\n    var express = require('express');\n    var app = express.createServer();\n\n    app.configure(function(){\n      app.use(express.methodOverride());\n      app.use(express.bodyParser());\n      app.use(server.middleware()); // agent.io server\n    });\n\n    app.get('/', function(req, res){\n      res.send('Hello World');\n    });\n\n    app.listen(3000);\n\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","_id":"agent.io@0.1.5","dist":{"shasum":"7b122f558581cd87c2ddabe7693ef129b3fa343f","tarball":"http://registry.npmjs.org/agent.io/-/agent.io-0.1.5.tgz"},"maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}]}},"readme":"Agent.io - Real-time, scalable agent<->server messaging for Node.js\n========\n\nAgent.io is a simple long polling based Node.js messaging library. It is usefull for cases, where agents having no inbound access have to talk to servers in both directions in real-time. \n\nThe server part currently relies on Express and Redis. Redis pubsub is used to enable scaling out of servers to serve more agents. Please make sure Redis library is installed `npm install redis`. Redis >= 2.6 is highly recommended if multiple servers are used.\n\nI might add WebSocket transport at some point if it is proved to be well supported and reliable for server to server use cases. \n\n\n## Installation and Usage\n\nInstall Nodetime with npm \n\n    npm install agent.io \n\n\nAgent-side usage\n\n    var agentio = require('agent.io');\n\n    /* if no group name is specified, a unique id will be assigned to the agent */\n    var agent = agentio.createClient({group: 'group1', server: 'http://localhost:3000'});\n\n    /* listener for messages which server sent to \"group1\" */\n    agent.on('message', function(msg) {\n    });\n\n    /* sending a message to server */\n    agent.send({field: \"value\"});\n\n\n\nServer-side usage\n\n    /* agent.io */\n\n    var agentio = require('agent.io');\n\n    var server = agentio.createServer();\n\n    /* group1 message listener */\n    server.on('group1', function(msg) {\n    });\n\n    /* listener for messages from all groups */\n    server.on('message', function(group, msg) {\n    });\n\n    /* listener for messages from all groups. Returns all messages \n     * sent during one second or single event loop cycle groupped in an array \n     */\n    server.on('messages', function(group, msgs) {\n    });\n\n    \n    /* sending a message to agent */\n    server.send('group1', {field: \"value\"});\n\n\n\n    /* express app */\n\n    var express = require('express');\n    var app = express.createServer();\n\n    app.configure(function(){\n      app.use(express.methodOverride());\n      app.use(express.bodyParser());\n      app.use(server.middleware()); // agent.io server\n    });\n\n    app.get('/', function(req, res){\n      res.send('Hello World');\n    });\n\n    app.listen(3000);\n\n\n\n## License\n\nCopyright (c) 2012 Dmitri Melikyan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"rapidlogix","email":"dmitri@rapidlogix.com"}],"time":{"modified":"2012-08-12T13:57:44.244Z","created":"2012-05-02T14:30:55.096Z","0.1.0":"2012-05-02T14:30:56.753Z","0.1.1":"2012-05-06T18:41:24.421Z","0.1.2":"2012-05-17T18:05:20.101Z","0.1.3":"2012-06-10T13:24:20.145Z","0.1.4":"2012-08-05T10:05:26.440Z","0.1.5":"2012-08-12T13:57:44.244Z"},"author":{"name":"Dmitri Melikyan","email":"dmitri@rapidlogix.com"},"repository":{"type":"git","url":"git://github.com/dmelikyan/agent.io.git"},"_attachments":{"agent.io-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-I83FkCBnO/SPe/WdylFi2w==","length":4752,"stub":true},"agent.io-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-eacvTzf0jKuQcgFaMBarfA==","length":4714,"stub":true},"agent.io-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-9AU0WFfvSaXLgkRXux/TTQ==","length":4708,"stub":true},"agent.io-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2hQyQbl3ninlJO2u8qHYAQ==","length":4724,"stub":true},"agent.io-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iWZk0wI4ECjFGh+V4xEkmw==","length":4707,"stub":true},"agent.io-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pc+SKlkvX4i9TP3DapjP1w==","length":4633,"stub":true}}}},
{"id":"aggie","key":"aggie","value":{"rev":"12-ca96b3aa207031d19f436ea1821e46d0"},"doc":{"_id":"aggie","_rev":"12-ca96b3aa207031d19f436ea1821e46d0","name":"aggie","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"aggie","version":"0.0.1","dependencies":{"express":"3.0.0"},"_npmUser":{"name":"soodorama","email":"soodorama@gmail.com"},"_id":"aggie@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"9113c1a14bffb6b4b2d841bf91b70d7113a39a1c","tarball":"http://registry.npmjs.org/aggie/-/aggie-0.0.1.tgz"},"maintainers":[{"name":"soodorama","email":"soodorama@gmail.com"}]},"0.0.2":{"name":"aggie","version":"0.0.2","dependencies":{"express":"3.0.0rc1"},"_npmUser":{"name":"soodorama","email":"soodorama@gmail.com"},"_id":"aggie@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f1e15663ecef5ee94c32f4b9741d2d4b326c7466","tarball":"http://registry.npmjs.org/aggie/-/aggie-0.0.2.tgz"},"maintainers":[{"name":"soodorama","email":"soodorama@gmail.com"}]},"0.0.3":{"name":"aggie","version":"0.0.3","dependencies":{"express":"3.0.0rc1"},"_npmUser":{"name":"soodorama","email":"soodorama@gmail.com"},"_id":"aggie@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6b6872f50397c58bbaf3761e9676bc3e8a3a4eac","tarball":"http://registry.npmjs.org/aggie/-/aggie-0.0.3.tgz"},"maintainers":[{"name":"soodorama","email":"soodorama@gmail.com"}]},"0.0.4":{"name":"aggie","version":"0.0.4","dependencies":{"express":"3.0.0rc1"},"_npmUser":{"name":"soodorama","email":"soodorama@gmail.com"},"_id":"aggie@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8891698bf14212d58681330b3b5b1828b9148c61","tarball":"http://registry.npmjs.org/aggie/-/aggie-0.0.4.tgz"},"maintainers":[{"name":"soodorama","email":"soodorama@gmail.com"}]},"0.0.5":{"name":"aggie","author":{"name":"Neil Sood","email":"soodorama@gmail.com"},"version":"0.0.5","dependencies":{"express":"3.0.0rc1"},"bin":{"aggie":"./bin/aggie"},"engines":{"node":"*"},"_npmUser":{"name":"soodorama","email":"soodorama@gmail.com"},"_id":"aggie@0.0.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"346f62bd41d930eefb02824341e3ffac8e2b252b","tarball":"http://registry.npmjs.org/aggie/-/aggie-0.0.5.tgz"},"maintainers":[{"name":"soodorama","email":"soodorama@gmail.com"}]}},"readme":"agg.js\n======\n\nCrawl APIs","maintainers":[{"name":"soodorama","email":"soodorama@gmail.com"}],"time":{"modified":"2012-08-02T13:44:14.196Z","created":"2012-07-26T17:48:37.434Z","0.0.1":"2012-07-26T17:48:39.047Z","0.0.2":"2012-07-26T17:53:21.825Z","0.0.3":"2012-07-26T18:06:55.752Z","0.0.4":"2012-07-26T18:08:35.070Z","0.0.5":"2012-07-26T18:10:59.827Z"},"author":{"name":"Neil Sood","email":"soodorama@gmail.com"},"users":{"fgribreau":true},"_attachments":{"aggie-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-niPPhg7m5wdf0UHYNlB4lA==","length":1314,"stub":true},"aggie-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1cDyspDcAWx3QaQmmice6w==","length":1259,"stub":true},"aggie-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SxSHA3YbRV7tcsRGPjfE/A==","length":1330,"stub":true},"aggie-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wFOW3vh/a7AGN6e/yqIDyQ==","length":1123,"stub":true},"aggie-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wW5+WzXCPjbRNo83aapt6w==","length":1112,"stub":true}}}},
{"id":"aggregate","key":"aggregate","value":{"rev":"9-5d110ef34fb57e41655ec020898811c9"},"doc":{"_id":"aggregate","_rev":"9-5d110ef34fb57e41655ec020898811c9","name":"aggregate","description":"Aggregate function calls accross a tick","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"aggregate","version":"0.0.1","description":"Aggregate function calls accross a tick","author":{"name":"Peter Kolloch","email":"kolloch.kpj@gmail.com"},"repository":{"type":"git","url":"git://github.com/kolloch/aggregate.git"},"license":"MIT/X11","scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":"*","winston":"*"},"devDependencies":{"mocha":"*","expect.js":"*"},"_npmUser":{"name":"pkolloch","email":"kolloch.kpj@gmail.com"},"_id":"aggregate@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"78b879eb96f2ab054ace7cfdfdee09cd304f2bb0","tarball":"http://registry.npmjs.org/aggregate/-/aggregate-0.0.1.tgz"},"readme":"","maintainers":[{"name":"pkolloch","email":"kolloch.kpj@gmail.com"}]},"0.0.2":{"name":"aggregate","version":"0.0.2","description":"Aggregate function calls accross a tick","author":{"name":"Peter Kolloch","email":"kolloch.kpj@gmail.com"},"repository":{"type":"git","url":"git://github.com/kolloch/aggregate.git"},"license":"MIT/X11","scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":"*","winston":"*"},"devDependencies":{"mocha":"*","expect.js":"*"},"_npmUser":{"name":"pkolloch","email":"kolloch.kpj@gmail.com"},"_id":"aggregate@0.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0b30e590b24eeba1cdae5983bfcc84b599ca93d4","tarball":"http://registry.npmjs.org/aggregate/-/aggregate-0.0.2.tgz"},"readme":"","maintainers":[{"name":"pkolloch","email":"kolloch.kpj@gmail.com"}]},"0.0.3":{"name":"aggregate","version":"0.0.3","description":"Aggregate function calls accross a tick","author":{"name":"Peter Kolloch","email":"kolloch.kpj@gmail.com"},"repository":{"type":"git","url":"git://github.com/kolloch/aggregate.git"},"license":"MIT/X11","scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":"*","winston":"*"},"devDependencies":{"mocha":"*","expect.js":"*"},"_npmUser":{"name":"pkolloch","email":"kolloch.kpj@gmail.com"},"_id":"aggregate@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b4a9ce9d99897d28591f83599cccafe31f6ae018","tarball":"http://registry.npmjs.org/aggregate/-/aggregate-0.0.3.tgz"},"readme":"","maintainers":[{"name":"pkolloch","email":"kolloch.kpj@gmail.com"}]},"0.1.0":{"name":"aggregate","version":"0.1.0","description":"Aggregate function calls accross a tick","author":{"name":"Peter Kolloch","email":"kolloch.kpj@gmail.com"},"repository":{"type":"git","url":"git://github.com/kolloch/aggregate.git"},"license":"MIT/X11","scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":"*","winston":"*"},"devDependencies":{"mocha":"*","expect.js":"*"},"_npmUser":{"name":"pkolloch","email":"kolloch.kpj@gmail.com"},"_id":"aggregate@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3bd3fd7aefb25d5c982a94fad92a7e2aebf36e0c","tarball":"http://registry.npmjs.org/aggregate/-/aggregate-0.1.0.tgz"},"readme":"","maintainers":[{"name":"pkolloch","email":"kolloch.kpj@gmail.com"}]}},"readme":"","maintainers":[{"name":"pkolloch","email":"kolloch.kpj@gmail.com"}],"time":{"modified":"2012-04-21T17:25:35.899Z","created":"2012-04-19T20:17:53.987Z","0.0.1":"2012-04-19T20:17:56.931Z","0.0.2":"2012-04-19T20:21:28.809Z","0.0.3":"2012-04-20T06:27:01.476Z","0.1.0":"2012-04-21T17:25:35.899Z"},"author":{"name":"Peter Kolloch","email":"kolloch.kpj@gmail.com"},"repository":{"type":"git","url":"git://github.com/kolloch/aggregate.git"},"_attachments":{"aggregate-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-G1CfdscWLuS68S5DQtPQWQ==","length":3787,"stub":true},"aggregate-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-B91XrNimrPB9S2xV94lmOA==","length":3262,"stub":true},"aggregate-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-u+4wkiLWVAJfs1r/KJpHWg==","length":3153,"stub":true},"aggregate-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-r5qAge4GXlLJ6JxUN5qHMQ==","length":3153,"stub":true}}}},
{"id":"agi","key":"agi","value":{"rev":"3-8827b408f62c19d6a49b105e0e767ff6"},"doc":{"_id":"agi","_rev":"3-8827b408f62c19d6a49b105e0e767ff6","name":"agi","description":"AGI (Asterisk Gateway Interface) for writing dialplan scripts","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Brian M. Carlson","email":"brian@enginode.com","url":"http://enginode.com"},"name":"agi","description":"AGI (Asterisk Gateway Interface) for writing dialplan scripts","version":"0.0.0","repository":{"type":"git","url":"git://github.com/brianc/node-agi.git"},"main":"lib/","scripts":{"test":"mocha -r should -R tap"},"engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{"mocha":"*","should":"*"},"_npmUser":{"name":"brianc","email":"brian.m.carlson@gmail.com"},"_id":"agi@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"64ca87c4110f5e00b1f9b20ed6e2611cb92e58f1","tarball":"http://registry.npmjs.org/agi/-/agi-0.0.0.tgz"},"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}]}},"readme":null,"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}],"time":{"modified":"2012-01-07T07:25:46.336Z","created":"2012-01-07T07:25:45.323Z","0.0.0":"2012-01-07T07:25:46.336Z"},"author":{"name":"Brian M. Carlson","email":"brian@enginode.com","url":"http://enginode.com"},"repository":{"type":"git","url":"git://github.com/brianc/node-agi.git"},"_attachments":{"agi-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oqCgDbuHjQc4VUYIy0c4uQ==","length":10240,"stub":true}}}},
{"id":"agro-jsonrpc-client","key":"agro-jsonrpc-client","value":{"rev":"3-1a0cb58d7997743dd87baf6c009494c6"},"doc":{"_id":"agro-jsonrpc-client","_rev":"3-1a0cb58d7997743dd87baf6c009494c6","name":"agro-jsonrpc-client","description":"The common (private) JSON-RPC client for Agrosica.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"contributors":[{"name":"David Ellis","email":"david.ellis@agrosica.com"},{"name":"Alain Rodriguez","email":"alain.rodriguez@agrosica.com"}],"name":"agro-jsonrpc-client","version":"0.1.0","description":"The common (private) JSON-RPC client for Agrosica.","main":"jsonrpc_client.js","dependencies":{"xmlhttprequest":"1.3.0"},"_npmUser":{"name":"dfellis","email":"d.f.ellis@ieee.org"},"_id":"agro-jsonrpc-client@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"54983432d0ace3e61ad411b5d051e2ca0fef6480","tarball":"http://registry.npmjs.org/agro-jsonrpc-client/-/agro-jsonrpc-client-0.1.0.tgz"},"readme":"","maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}]}},"readme":"","maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}],"time":{"modified":"2012-06-02T22:45:01.630Z","created":"2012-06-02T22:44:54.554Z","0.1.0":"2012-06-02T22:45:01.630Z"},"_attachments":{"agro-jsonrpc-client-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sIZPAC7C5Loh/QMNG299Wg==","length":3891,"stub":true}}}},
{"id":"agro-jsonrpc-server","key":"agro-jsonrpc-server","value":{"rev":"3-0d653f5b740be3f507479e782bb99a20"},"doc":{"_id":"agro-jsonrpc-server","_rev":"3-0d653f5b740be3f507479e782bb99a20","name":"agro-jsonrpc-server","description":"The common (private) JSON-RPC server for Agrosica.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"contributors":[{"name":"David Ellis","email":"david.ellis@agrosica.com"},{"name":"Alain Rodriguez","email":"alain.rodriguez@agrosica.com"}],"name":"agro-jsonrpc-server","version":"0.1.0","description":"The common (private) JSON-RPC server for Agrosica.","main":"jsonrpc_server.js","_npmUser":{"name":"dfellis","email":"d.f.ellis@ieee.org"},"_id":"agro-jsonrpc-server@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f2e9f342adb2f19dab29007694ded2c76f7f5d40","tarball":"http://registry.npmjs.org/agro-jsonrpc-server/-/agro-jsonrpc-server-0.1.0.tgz"},"readme":"","maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}]}},"readme":"","maintainers":[{"name":"dfellis","email":"d.f.ellis@ieee.org"}],"time":{"modified":"2012-06-02T22:45:14.806Z","created":"2012-06-02T22:45:12.903Z","0.1.0":"2012-06-02T22:45:14.806Z"},"_attachments":{"agro-jsonrpc-server-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6MdsCImi+2o+M3ZvAv8vHw==","length":3533,"stub":true}}}},
{"id":"ahr","key":"ahr","value":{"rev":"31-7e6d0b14bdde1e78a1cfa6e9d478db41"},"doc":{"_id":"ahr","_rev":"31-7e6d0b14bdde1e78a1cfa6e9d478db41","name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","dist-tags":{"latest":"0.9.12","stable":"0.9.3"},"versions":{"0.6.0":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":""},"lib":"lib","main":"./lib/ahr","version":"0.6.0","_id":"ahr@0.6.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ahr/-/ahr-0.6.0.tgz"}},"0.8.0":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":"","base64":""},"lib":"lib","main":"./lib/ahr","version":"0.8.0","_id":"ahr@0.8.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ahr/-/ahr-0.8.0.tgz"}},"0.8.1":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":""},"lib":"lib","main":"./lib/ahr","version":"0.8.1","_id":"ahr@0.8.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ahr/-/ahr-0.8.1.tgz"}},"0.9.0":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":""},"lib":"lib","main":"./lib/ahr","version":"0.9.0","_id":"ahr@0.9.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ahr/-/ahr-0.9.0.tgz"}},"0.9.1":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":""},"lib":"lib","main":"./lib/ahr","version":"0.9.1","_id":"ahr@0.9.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ahr/-/ahr-0.9.1.tgz"}},"0.9.2":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":""},"lib":"lib","main":"./lib/ahr","version":"0.9.2","_id":"ahr@0.9.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ahr/-/ahr-0.9.2.tgz"}},"0.9.3":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":"*"},"lib":"lib","main":"./lib/ahr","version":"0.9.3","_id":"ahr@0.9.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.2.0","dist":{"tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.3.tgz"}},"0.9.5":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","https","file","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":"*"},"lib":"lib","main":"./lib/ahr","version":"0.9.5","_id":"ahr@0.9.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.2.0","dist":{"tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.5.tgz"}},"0.9.6":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","https","file","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":"*"},"lib":"lib","main":"./lib/ahr","version":"0.9.6","_id":"ahr@0.9.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.2.0","dist":{"tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.6.tgz"}},"0.9.9":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","https","file","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":">= 1.9.0"},"lib":"lib","main":"./lib/ahr","version":"0.9.9","_id":"ahr@0.9.9","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.2.0","dist":{"tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.9.tgz"}},"0.9.10":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","https","file","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{"futures":">= 1.9.0","bufferjs":">= 0.0.0"},"lib":"lib","main":"./lib/ahr","version":"0.9.10","_id":"ahr@0.9.10","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.2.0","dist":{"tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.10.tgz"}},"0.9.11":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","https","file","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"browserDependencies":{"futures":"~v1.9.0"},"dependencies":{"futures":"~v1.9.0","bufferjs":">= 0.0.0"},"lib":"lib","main":"./lib/ahr","version":"0.9.11","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr@0.9.11","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1719823bed31b4cb10482fb0290bbc86fe452d09","tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.11.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"0.9.12":{"name":"ahr","description":"An Abstract Http Request which works on SSJS as well as in the browser.","url":"http://github.com/coolaj86/ahr/","keywords":["util","ahr","xmlhttprequest","http","https","file","server","client","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"browserDependencies":{"futures":"~v1.9.0","url":"~v0.4"},"dependencies":{"futures":"~v1.9.0","bufferjs":">= 0.0.0"},"lib":"lib","main":"./lib/ahr","version":"0.9.12","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr@0.9.12","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"45a08916c5a46ca22b7dde385efad5e63141ab8b","tarball":"http://registry.npmjs.org/ahr/-/ahr-0.9.12.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"time":{"modified":"2011-11-02T20:52:19.531Z","created":"2011-01-14T05:33:23.344Z","0.6.0":"2011-01-14T05:33:23.344Z","0.8.0":"2011-01-14T05:33:23.344Z","0.8.1":"2011-01-14T05:33:23.344Z","0.9.0":"2011-01-14T05:33:23.344Z","0.9.1":"2011-01-14T05:33:23.344Z","0.9.2":"2011-01-14T05:33:23.344Z","0.9.3":"2011-01-14T05:33:23.344Z","0.9.5":"2011-01-14T05:33:23.344Z","0.9.6":"2011-01-14T05:33:23.344Z","0.9.9":"2011-01-14T05:33:23.344Z","0.9.10":"2011-02-09T03:36:45.644Z","0.9.11":"2011-11-02T20:37:07.877Z","0.9.12":"2011-11-02T20:52:19.531Z"},"_attachments":{"ahr-0.9.12.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-z+UnR9jNU2DAOTbM5tZHjw==","length":61440,"stub":true},"ahr-0.9.11.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-SIqKpdOFom0Pc559wwl/cw==","length":61440,"stub":true},"ahr-0.9.10.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-4DNBPp+LXkFjaqHoXozqfQ==","length":52256,"stub":true},"ahr-0.9.9.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-4vzQW5spSxPgLkCnOrx3Hw==","length":52237,"stub":true},"ahr-0.9.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-16g+eg32+IVKhVjaiCoKMg==","length":30689,"stub":true},"ahr-0.9.5.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-4hi2bjkGfzACxTI7pBSWIw==","length":30077,"stub":true},"ahr-0.9.3.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-yiwv/QaKLyPhGLtTnUpzKQ==","length":24323,"stub":true},"ahr-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-9lvyJ3iMLz7Ntttx5hmP/w==","length":24427,"stub":true},"ahr-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-vpyeZMuQtBq0+JPStIwP8A==","length":23796,"stub":true},"ahr-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-HlH9m8Tx+iyogxI0b41DnA==","length":23769,"stub":true},"ahr-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-VnATulH8ex+6X8bvacQrFw==","length":19095,"stub":true},"ahr-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zWvWigfCHSjdMjq5/f7g2Q==","length":19104,"stub":true},"ahr-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LMHmrQ/s7U1zEt7F5ear4A==","length":12691,"stub":true}}}},
{"id":"ahr.browser","key":"ahr.browser","value":{"rev":"3-f7226aab4a1a3ab5f77379f92aae87f9"},"doc":{"_id":"ahr.browser","_rev":"3-f7226aab4a1a3ab5f77379f92aae87f9","name":"ahr.browser","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","dist-tags":{"latest":"2.1.0"},"versions":{"2.1.0":{"name":"ahr.browser","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"ahr.browser.request":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr.browser","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.browser/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.browser@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a2a3865b960b8ad236daa2924365e05f907afe8d","tarball":"http://registry.npmjs.org/ahr.browser/-/ahr.browser-2.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-19T19:02:04.265Z","created":"2011-07-19T19:02:03.886Z","2.1.0":"2011-07-19T19:02:04.265Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"_attachments":{"ahr.browser-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0KkXur0FPxj95trwXOzMXg==","length":568,"stub":true}}}},
{"id":"ahr.browser.jsonp","key":"ahr.browser.jsonp","value":{"rev":"3-abed17143cf5e3c451c3d7da457e6f5b"},"doc":{"_id":"ahr.browser.jsonp","_rev":"3-abed17143cf5e3c451c3d7da457e6f5b","name":"ahr.browser.jsonp","description":"`options` module of Abstract Http Request (AHR)","dist-tags":{"latest":"2.1.0"},"versions":{"2.1.0":{"name":"ahr.browser.jsonp","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{},"lib":".","directories":{"lib":"."},"main":"ahr.browser.jsonp","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.browser.jsonp/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.browser.jsonp@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"4fba51c9a67156a19bffb3139dfecb3979a1a6bc","tarball":"http://registry.npmjs.org/ahr.browser.jsonp/-/ahr.browser.jsonp-2.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-16T03:35:14.283Z","created":"2011-07-16T03:35:13.778Z","2.1.0":"2011-07-16T03:35:14.283Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"_attachments":{"ahr.browser.jsonp-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CXkPmjA3iB3gW13r1g81MA==","length":1717,"stub":true}}}},
{"id":"ahr.browser.request","key":"ahr.browser.request","value":{"rev":"7-fafd7b079d0415f388b64a20509a270b"},"doc":{"_id":"ahr.browser.request","_rev":"7-fafd7b079d0415f388b64a20509a270b","name":"ahr.browser.request","description":"`options` module of Abstract Http Request (AHR)","dist-tags":{"latest":"2.1.2"},"versions":{"2.1.0":{"name":"ahr.browser.request","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"url":">= 0.0.0","ahr.browser.jsonp":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr.browser.request","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.browser.request/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.browser.request@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d74b0006d929a0c99da4c75de06d5f2e50a571a8","tarball":"http://registry.npmjs.org/ahr.browser.request/-/ahr.browser.request-2.1.0.tgz"},"scripts":{}},"2.1.1":{"name":"ahr.browser.request","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"url":">= 0.0.0","ahr.browser.jsonp":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr.browser.request","version":"2.1.1","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.browser.request/2.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.browser.request@2.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"926672377a19e51d44b8bbae0cba0d97a79678e7","tarball":"http://registry.npmjs.org/ahr.browser.request/-/ahr.browser.request-2.1.1.tgz"},"scripts":{}},"2.1.2":{"name":"ahr.browser.request","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"url":">= 0.0.0","ahr.browser.jsonp":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr.browser.request","version":"2.1.2","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.browser.request/2.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.browser.request@2.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"83220024ee501153fca32cf636c6d172575b0052","tarball":"http://registry.npmjs.org/ahr.browser.request/-/ahr.browser.request-2.1.2.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-08-04T22:34:08.845Z","created":"2011-07-16T02:24:52.483Z","2.1.0":"2011-07-16T02:24:52.997Z","2.1.1":"2011-07-25T20:57:33.251Z","2.1.2":"2011-08-04T22:34:08.845Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"_attachments":{"ahr.browser.request-2.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-zL4JHcRgXh4WJzM+cTTBhw==","length":2921,"stub":true},"ahr.browser.request-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-230w8SygYw2zMMHp2x+M2Q==","length":2912,"stub":true},"ahr.browser.request-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1mV69kbBkJr0iNbJ18Yh9A==","length":2889,"stub":true}}}},
{"id":"ahr.node","key":"ahr.node","value":{"rev":"17-f487a4a9896bd3876a11f9dfa1c639a7"},"doc":{"_id":"ahr.node","_rev":"17-f487a4a9896bd3876a11f9dfa1c639a7","name":"ahr.node","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","dist-tags":{"latest":"2.2.0"},"versions":{"2.1.0":{"name":"ahr.node","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"ahr2":">= 2.1.0","bufferjs":">= 0.0.0","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","ahr.options":">= 0.0.0","ahr.utils":">= 0.0.0"},"lib":".","directories":{"lib":"."},"main":"request-node","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.node/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.node@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"c6ee6aa8f8cf51904e7ec9e07ca01fa905df0fe8","tarball":"http://registry.npmjs.org/ahr.node/-/ahr.node-2.1.0.tgz"},"scripts":{}},"2.2.0":{"name":"ahr.node","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"ahr2":">= 2.1.0","bufferjs":">= 0.0.0","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","ahr.utils":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"main":"request-node","version":"2.2.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.node/2.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.node@2.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f980631e5efc48b4ea3c790e5cd26079fb9ff11e","tarball":"http://registry.npmjs.org/ahr.node/-/ahr.node-2.2.0.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-08-04T22:49:48.771Z","created":"2011-07-15T23:02:36.406Z","2.1.0":"2011-07-15T23:02:36.792Z","2.2.0":"2011-08-04T22:34:31.166Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"_attachments":{"ahr.node-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-XwZRjWBEIxItO8jpSQA8LA==","length":4341,"stub":true},"ahr.node-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QPIC6c+MA9QLUWbMh4qLQw==","length":3664,"stub":true}}}},
{"id":"ahr.options","key":"ahr.options","value":{"rev":"15-d4cd1e10c81abe3d9e7078d7e6201839"},"doc":{"_id":"ahr.options","_rev":"15-d4cd1e10c81abe3d9e7078d7e6201839","name":"ahr.options","description":"`options` module of Abstract Http Request (AHR)","dist-tags":{"latest":"2.1.2"},"versions":{"2.1.0":{"name":"ahr.options","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"url":">= 0.0.0","ahr.utils":">= 0.0.0"},"lib":".","directories":{"lib":"."},"main":"ahr.options","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.options/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.options@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"beea5874c1faf1c61fd38d278ed4fd87a4c60f45","tarball":"http://registry.npmjs.org/ahr.options/-/ahr.options-2.1.0.tgz"},"scripts":{}},"2.1.1":{"name":"ahr.options","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"url":">= 0.0.0","ahr.utils":">= 0.0.0"},"lib":".","directories":{"lib":"."},"main":"ahr.options","version":"2.1.1","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.options/2.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.options@2.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b00bc68e46a03abadf2911c8b246ae273c1e809b","tarball":"http://registry.npmjs.org/ahr.options/-/ahr.options-2.1.1.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.1.2":{"name":"ahr.options","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`options` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"url":">= 0.0.0","ahr.utils":">= 0.0.0"},"lib":".","directories":{"lib":"."},"main":"ahr.options","version":"2.1.2","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.options/2.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.options@2.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"74ce714be6a15b44751fe1e6350b78519bc0ef5e","tarball":"http://registry.npmjs.org/ahr.options/-/ahr.options-2.1.2.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-09-24T05:10:28.271Z","created":"2011-07-25T20:16:44.249Z","2.1.0":"2011-07-25T20:16:44.596Z","2.1.1":"2011-08-04T23:00:58.099Z","2.1.2":"2011-09-24T05:10:28.271Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"_attachments":{"ahr.options-2.1.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-3iO49nckBrQMJxpMiq+5dA==","length":3831,"stub":true},"ahr.options-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-LslMg+n+UPR2bfWrGBgE3g==","length":3731,"stub":true},"ahr.options-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5yh+cbF3ilcDcJbkELeXsw==","length":3711,"stub":true}}}},
{"id":"ahr.utils","key":"ahr.utils","value":{"rev":"3-5f7b4104ea280d1fd36370c8f3356ead"},"doc":{"_id":"ahr.utils","_rev":"3-5f7b4104ea280d1fd36370c8f3356ead","name":"ahr.utils","description":"`utils` module of Abstract Http Request (AHR)","dist-tags":{"latest":"2.1.0"},"versions":{"2.1.0":{"name":"ahr.utils","homepage":"https://github.com/coolaj86/abstract-http-request","description":"`utils` module of Abstract Http Request (AHR)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["ahr"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{},"lib":".","directories":{"lib":"."},"main":"ahr.utils","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr.utils/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr.utils@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"723fd18ac1041dc3f9dcee21122c64c25da1360c","tarball":"http://registry.npmjs.org/ahr.utils/-/ahr.utils-2.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-28T04:52:23.246Z","created":"2011-07-28T04:52:22.108Z","2.1.0":"2011-07-28T04:52:23.246Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"_attachments":{"ahr.utils-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ig28RYMjUlL+unURY5URDQ==","length":1642,"stub":true}}}},
{"id":"ahr2","key":"ahr2","value":{"rev":"128-481c4396f6d01bd17ed2ab459e8b9854"},"doc":{"_id":"ahr2","_rev":"128-481c4396f6d01bd17ed2ab459e8b9854","name":"ahr2","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","dist-tags":{"latest":"2.3.2"},"versions":{"2.0.2":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"require-kiss":">= 1.0.5","futures":">= 1.9.4","bufferjs":">= 0.0.0","file-api":">= 0.0.0"},"lib":"lib","directories":{"lib":"lib"},"main":"./lib/ahr2","version":"2.0.2","_id":"ahr2@2.0.2","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.7","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a8ee851c4b01ab6cbb0d51944e64be86403cddf7","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.0.2.tgz"}},"2.0.3":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"require-kiss":">= 1.0.5","futures":">= 1.9.4","bufferjs":">= 0.0.0","file-api":">= 0.0.0"},"lib":"lib","directories":{"lib":"lib"},"main":"./lib/ahr2","version":"2.0.3","devDependencies":{},"_id":"ahr2@2.0.3","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"160f479b70e59f0f7577c11153eff0e79a4c3340","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.0.3.tgz"},"scripts":{}},"2.0.4":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"require-kiss":">= 1.0.5","futures":">= 1.9.4","bufferjs":">= 0.0.0","file-api":">= 0.0.0"},"lib":"lib","directories":{"lib":"lib"},"main":"./lib/ahr2","version":"2.0.4","_id":"ahr2@2.0.4","_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.4.7","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"beca573ad7c7be15bcdea1805101f9e27452bfc1","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.0.4.tgz"}},"2.1.0":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr.node` for Node and `ender install ahr2` for Ender. 'ahr2'. In both cases it should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","url":">= 0.0.0","events.node":">= 0.4.0","ahr.browser":">= 2.1.0","ahr.options":">= 2.1.0","ahr.utils":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr","version":"2.1.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr2/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr2@2.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"079d52aaf164160f158e9f1ec6a4e0635daaab34","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.1.0.tgz"},"scripts":{}},"2.1.1":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr.node` for Node and `ender install ahr2` for Ender. 'ahr2'. In both cases it should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","url":">= 0.0.0","events.node":">= 0.4.0","ahr.browser":">= 2.1.0","ahr.options":">= 2.1.0","ahr.utils":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr","version":"2.1.1","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr2/2.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr2@2.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"aace5dbc5da1b0f81f6a3aa1a528b818ae5180e6","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.1.1.tgz"},"scripts":{}},"2.1.2":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr.node` for Node and `ender install ahr2` for Ender. 'ahr2'. In both cases it should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"future":">= 2.1.0","querystring":">= 0.0.0","join":">= 2.1.0","url":">= 0.0.0","events.node":">= 0.4.0","ahr.browser":">= 2.1.0","ahr.options":">= 2.1.0","ahr.utils":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr","version":"2.1.2","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr2/2.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr2@2.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a542db3beec4871299cfdc238497342a099d89e0","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.1.2.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.1.3":{"name":"ahr2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr.node` for Node and `ender install ahr2` for Ender. 'ahr2'. In both cases it should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"dependencies":{"future":">= 2.1.0","querystring":">= 0.0.0","join":">= 2.1.0","url":">= 0.0.0","events.node":">= 0.4.0","ahr.browser":">= 2.1.0","ahr.options":">= 2.1.0","ahr.utils":">= 2.1.0"},"lib":".","directories":{"lib":"."},"main":"ahr","version":"2.1.3","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/ahr2/2.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ahr2@2.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"bff2008caf326f1abe6faec7275b84084c7730d7","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.1.3.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.0":{"name":"ahr2","main":"index","version":"2.2.0","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5b7c5505acbcbfab418674d359dec78f8378caad","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.0.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.1":{"name":"ahr2","main":"index","version":"2.2.1","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"13f3085c1dbd854b4926ff1928f071ce515e5c29","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.1.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.2":{"name":"ahr2","main":"index","version":"2.2.2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9cfdff076876df4d6eb1fe5a6aee62b209127323","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.2.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.3":{"name":"ahr2","main":"index","version":"2.2.3","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5edef78e1d5bcb87c1da8847b60dc79986e5d6f7","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.3.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.4":{"name":"ahr2","main":"index","version":"2.2.4","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f517554187bf7b4572a60130ce0063485529b797","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.4.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.5":{"name":"ahr2","main":"index","version":"2.2.5","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"300db9d2d52bbf619be1bf7aee5d54676a53d2a0","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.5.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.6":{"name":"ahr2","main":"index","version":"2.2.6","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","atob":"1.0.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"61882a6ff22b342ae50c7cbe798b7447f72c2ebf","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.6.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.8":{"name":"ahr2","main":"index","version":"2.2.8","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","btoa":"1.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.8","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"23c9e40cbc333a3c66bbb781568dfa327fc732f2","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.8.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.10":{"name":"ahr2","main":"index","version":"2.2.10","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","btoa":"1.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.10","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"9cebf21c85ee507ced88e72c2ff5939e89c519ae","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.10.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.11":{"name":"ahr2","main":"index","version":"2.2.11","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","btoa":"1.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.11","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"857c0268fa29a545df6d8cfb54e5bd5acbee680c","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.11.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.2.12":{"name":"ahr2","main":"index","version":"2.2.12","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">= 2.1.0","join":">= 2.1.0","btoa":"1.x","bufferjs":"1.0.x","File":">= 0.0.0","FileList":">= 0.0.0","FormData":">= 0.0.0","navigator":">= 0.0.0","location":">= 0.0.0"},"lib":".","directories":{"lib":"."},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"ahr2@2.2.12","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"78cca0cae8fc11851932be277187c11fdb55b443","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.2.12.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.3.0":{"name":"ahr2","main":"index","version":"2.3.0","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">=2.3.1 <2.4.0","join":">=2.3.1 <3.0.0","btoa":"1.x","bufferjs":"1.0.x","File":">=0.10.0 <0.11.0","FileList":">=0.10.0 <0.11.0","FormData":">=0.10.0 <0.11.0","navigator":">=1.0.1 <2.0.0","location":"=0.0.1"},"lib":".","directories":{"lib":"."},"_id":"ahr2@2.3.0","dist":{"shasum":"84c84ce1d8f723bfa071f84851d66376808ddb05","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.3.0.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.3.1":{"name":"ahr2","main":"index","version":"2.3.1","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">=2.3.1 <2.4.0","join":">=2.3.1 <3.0.0","btoa":"1.x","bufferjs":"1.0.x","File":">=0.10.0 <0.11.0","FileList":">=0.10.0 <0.11.0","FormData":">=0.10.0 <0.11.0","navigator":">=1.0.1 <2.0.0","location":"=0.0.1"},"lib":".","directories":{"lib":"."},"_id":"ahr2@2.3.1","dist":{"shasum":"64a68cb455508072aad442e26eb53b4e3fc866f5","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.3.1.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"2.3.2":{"name":"ahr2","main":"index","version":"2.3.2","homepage":"https://github.com/coolaj86/abstract-http-request","description":"An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`","repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"keywords":["xhr","ahr","xmlhttprequest","http","https","file","browser","xhr2","cors","xdm","jsonp"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"contributors":[{"name":"T. Jameson Little","email":"beatgammit@gmail.com"}],"engines":{"node":">= 0.4.0"},"browserDependencies":{"events.node":">= 0.4.0","url":">= 0.0.0","querystring":">= 0.0.0","future":">= 2.1.0","join":">= 2.1.0"},"dependencies":{"future":">=2.3.1 <2.4.0","join":">=2.3.1 <3.0.0","btoa":"1.x","bufferjs":"1.0.x","File":">=0.10.0 <0.11.0","FileList":">=0.10.0 <0.11.0","FormData":">=0.10.0 <0.11.0","navigator":">=1.0.1 <2.0.0","location":"=0.0.1"},"lib":".","directories":{"lib":"."},"devDependencies":{},"optionalDependencies":{},"_id":"ahr2@2.3.2","dist":{"shasum":"c74cbef881bd62c10fbb88a8261d11240c198010","tarball":"http://registry.npmjs.org/ahr2/-/ahr2-2.3.2.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2012-08-02T13:44:37.104Z","created":"2011-05-26T02:03:16.260Z","2.0.0":"2011-05-26T02:03:16.518Z","2.0.1":"2011-05-26T18:07:32.543Z","2.0.2":"2011-05-26T21:46:03.879Z","2.0.3":"2011-05-27T18:02:56.722Z","2.0.4":"2011-06-23T19:18:57.405Z","2.1.0":"2011-07-15T22:53:33.541Z","2.1.1":"2011-07-25T21:01:52.833Z","2.1.2":"2011-08-04T22:34:22.630Z","2.1.3":"2011-09-08T17:32:46.943Z","2.2.0":"2011-12-22T00:14:58.222Z","2.2.1":"2011-12-22T00:37:46.570Z","2.2.2":"2011-12-22T02:48:02.830Z","2.2.3":"2012-01-06T23:18:41.098Z","2.2.4":"2012-01-17T00:23:41.906Z","2.2.5":"2012-02-16T00:06:05.533Z","2.2.6":"2012-02-17T21:51:23.660Z","2.2.7":"2012-02-20T21:37:47.466Z","2.2.8":"2012-02-20T21:50:13.411Z","2.2.9":"2012-02-23T22:41:29.133Z","2.2.10":"2012-03-23T19:38:42.185Z","2.2.11":"2012-03-27T00:40:47.739Z","2.2.12":"2012-05-26T21:02:14.744Z","2.3.0":"2012-06-19T21:02:43.778Z","2.3.1":"2012-06-21T22:38:54.458Z","2.3.2":"2012-07-23T17:53:32.213Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/abstract-http-request.git"},"users":{"fgribreau":true},"_attachments":{"ahr2-2.3.2.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-fzCmFuVXnAafuLgJKWBVMA==","length":13413,"stub":true},"ahr2-2.3.1.tgz":{"content_type":"application/octet-stream","revpos":125,"digest":"md5-Ncv2iNPnzPa5N/ur2rGcTg==","length":13374,"stub":true},"ahr2-2.3.0.tgz":{"content_type":"application/octet-stream","revpos":123,"digest":"md5-quQLYCZ3rJ+qxKA3lxiCow==","length":13358,"stub":true},"ahr2-2.2.12.tgz":{"content_type":"application/octet-stream","revpos":121,"digest":"md5-mcdyT6CCcwo/f4ETDtYTNQ==","length":13227,"stub":true},"ahr2-2.2.11.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-a3bvYJyLZ99mhJyNaunFfw==","length":13335,"stub":true},"ahr2-2.2.10.tgz":{"content_type":"application/octet-stream","revpos":117,"digest":"md5-GUydTeWmyC8D10TexHsZSw==","length":13199,"stub":true},"ahr2-2.2.8.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-FnmHCHt2rWpNpOFRrX5Ykg==","length":13133,"stub":true},"ahr2-2.2.6.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-vSsNI66YWRz98VBFuTwrQQ==","length":13123,"stub":true},"ahr2-2.2.5.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-K4gFJopZkj4hCGihO3rlJg==","length":13121,"stub":true},"ahr2-2.2.4.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-Ds9IrWfG5nRjgTX+ksB1IQ==","length":13106,"stub":true},"ahr2-2.2.3.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-yHbkbcbuLnR44BMiil82Sg==","length":13094,"stub":true},"ahr2-2.2.2.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-yGD/JCTIpep0r9wmy6SdcA==","length":20480,"stub":true},"ahr2-2.2.1.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-nh68zaBxUOYXNQhExZ/Yzw==","length":20480,"stub":true},"ahr2-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-v23Jj0VJLHHO7OPLk5RGMw==","length":20480,"stub":true},"ahr2-2.1.3.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-7lFPmu4Q7qEpQVGih4TeFA==","length":2646,"stub":true},"ahr2-2.1.2.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-xz3KDixeGaigrtgnS2zwRg==","length":2615,"stub":true},"ahr2-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-cZmRbykbPtlXSvFYeWzQbw==","length":2554,"stub":true},"ahr2-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-d1qpZXWc6/0t2qXdKg6tSg==","length":2537,"stub":true},"ahr2-2.0.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-93pYC3UGSGlVqKylU84tUQ==","length":59182,"stub":true},"ahr2-2.0.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-X7EhkUA7pv1cMRI4PcV21g==","length":114710,"stub":true},"ahr2-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-AX5XN4DRyJE6Qk7P4pohdg==","length":127409,"stub":true}}}},
{"id":"ain","key":"ain","value":{"rev":"7-d840736668fb36e9be3c26a68c5cd411"},"doc":{"_id":"ain","_rev":"7-d840736668fb36e9be3c26a68c5cd411","name":"ain","description":"Syslog logging for node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"ain","description":"Syslog logging for node.js","version":"0.0.1","main":"./index","author":{"name":"Alexander Dorofeev"},"maintainers":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"}],"repository":{"type":"git","url":"http://github.com/akaspin/ain.git"},"bugs":{"url":"http://github.com/akaspin/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/akaspin/ain/master/LICENSE"}],"_id":"ain@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10-1","_nodeVersion":"v0.3.2-pre","dist":{"shasum":"57b3d1b5950484d7ec7fd9c2f4c7e81eab04e53b","tarball":"http://registry.npmjs.org/ain/-/ain-0.0.1.tgz"}}},"maintainers":[{"name":"akaspin","email":"aka.spin@gmail.com"}],"author":{"name":"Alexander Dorofeev"},"repository":{"type":"git","url":"http://github.com/akaspin/ain.git"},"_attachments":{"ain-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3LAm0R8UpX9f4y5SNUd4Uw==","length":4725,"stub":true}}}},
{"id":"ain-tcp","key":"ain-tcp","value":{"rev":"11-d18a1780bced8981d1d9dbd262ac4045"},"doc":{"_id":"ain-tcp","_rev":"11-d18a1780bced8981d1d9dbd262ac4045","name":"ain-tcp","description":"Syslog logging for node.js, with syslog/TCP support","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"ain-tcp","description":"Syslog logging for node.js, with syslog/TCP support","version":"0.0.2","main":"./index","contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"author":{"name":"Alexander Dorofeev"},"maintainers":[{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"repository":{"type":"git","url":"git://github.com/andry1/ain-tcp.git"},"bugs":{"url":"http://github.com/andry1/ain-tcp/issues"},"licenses":[{"type":"MIT","url":"http://github.com/andry1/ain-tcp/master/LICENSE"}],"dependencies":{},"_id":"ain-tcp@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"363d634f56a5da2bf9140c4053b204876d2d1695","tarball":"http://registry.npmjs.org/ain-tcp/-/ain-tcp-0.0.2.tgz"}},"0.0.3":{"name":"ain-tcp","description":"Syslog logging for node.js, with syslog/TCP support","version":"0.0.3","main":"./index","contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"author":{"name":"Alexander Dorofeev"},"maintainers":[{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"repository":{"type":"git","url":"git://github.com/andry1/ain-tcp.git"},"bugs":{"url":"http://github.com/andry1/ain-tcp/issues"},"licenses":[{"type":"MIT","url":"http://github.com/andry1/ain-tcp/master/LICENSE"}],"dependencies":{},"_id":"ain-tcp@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"359f73be58068da0ab010478d5cc65f6052b3849","tarball":"http://registry.npmjs.org/ain-tcp/-/ain-tcp-0.0.3.tgz"}},"0.0.4":{"name":"ain-tcp","description":"Syslog logging for node.js, with syslog/TCP support","version":"0.0.4","main":"./index","contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"author":{"name":"Alexander Dorofeev"},"maintainers":[{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"repository":{"type":"git","url":"git://github.com/andry1/ain-tcp.git"},"bugs":{"url":"http://github.com/andry1/ain-tcp/issues"},"licenses":[{"type":"MIT","url":"http://github.com/andry1/ain-tcp/master/LICENSE"}],"dependencies":{},"_id":"ain-tcp@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1297024a2b0710018f1589ca7aa1d67619b5b388","tarball":"http://registry.npmjs.org/ain-tcp/-/ain-tcp-0.0.4.tgz"}},"0.0.5":{"name":"ain-tcp","description":"Syslog logging for node.js, with syslog/TCP support","version":"0.0.5","main":"./index","contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"author":{"name":"Alexander Dorofeev"},"maintainers":[{"name":"andry1","email":"chris@noneofyo.biz"}],"repository":{"type":"git","url":"git://github.com/andry1/ain-tcp.git"},"bugs":{"url":"http://github.com/andry1/ain-tcp/issues"},"licenses":[{"type":"MIT","url":"http://github.com/andry1/ain-tcp/master/LICENSE"}],"dependencies":{},"_id":"ain-tcp@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.11","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"db727d46d85cad6a2b58495291b89c5a72557398","tarball":"http://registry.npmjs.org/ain-tcp/-/ain-tcp-0.0.5.tgz"}},"0.0.6":{"name":"ain-tcp","description":"Syslog logging for node.js, with syslog/TCP support","version":"0.0.6","main":"./index","contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Chris Ingrassia","email":"chris@noneofyo.biz"}],"author":{"name":"Alexander Dorofeev"},"maintainers":[{"name":"andry1","email":"chris@noneofyo.biz"}],"repository":{"type":"git","url":"git://github.com/andry1/ain-tcp.git"},"bugs":{"url":"http://github.com/andry1/ain-tcp/issues"},"licenses":[{"type":"MIT","url":"http://github.com/andry1/ain-tcp/master/LICENSE"}],"dependencies":{},"_id":"ain-tcp@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.11","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"03696b144b5c9c776e465813f0344ce4852eb542","tarball":"http://registry.npmjs.org/ain-tcp/-/ain-tcp-0.0.6.tgz"}}},"maintainers":[{"name":"andry1","email":"chris@noneofyo.biz"}],"time":{"modified":"2011-09-14T19:58:31.091Z","created":"2011-03-09T19:03:31.219Z","0.0.2":"2011-03-09T19:03:31.531Z","0.0.3":"2011-03-10T20:33:17.858Z","0.0.4":"2011-05-24T15:11:54.331Z","0.0.5":"2011-09-14T19:53:18.261Z","0.0.6":"2011-09-14T19:58:31.091Z"},"author":{"name":"Alexander Dorofeev"},"repository":{"type":"git","url":"git://github.com/andry1/ain-tcp.git"},"_attachments":{"ain-tcp-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-A/f+MUUwbkIilU5OGxIJqg==","length":73031,"stub":true},"ain-tcp-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-aa131e45Ox4PrVwfE45WOg==","length":73026,"stub":true},"ain-tcp-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WIuLffdFjk2sFjLt8iUe4w==","length":72958,"stub":true},"ain-tcp-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rQFyoDjco2uYE6Wl2w+6Ag==","length":19198,"stub":true},"ain-tcp-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wFGwyM1iKXAjARy1I9RjuA==","length":6453,"stub":true}}}},
{"id":"ain2","key":"ain2","value":{"rev":"15-5a1e9a86c9ee6745772c0eaa8d752584"},"doc":{"_id":"ain2","_rev":"15-5a1e9a86c9ee6745772c0eaa8d752584","name":"ain2","description":"Syslog logging for node.js. Continuation of ain","dist-tags":{"latest":"1.1.0"},"versions":{"0.0.2":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.2","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_id":"ain2@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.9-1","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"552711a090ff78f36541c8e50ab3d25a73e4fb67","tarball":"http://registry.npmjs.org/ain2/-/ain2-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]},"0.0.3":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.3","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"ain2@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"7b0d9e40390375c3df1e1ec9ab8a8125be879276","tarball":"http://registry.npmjs.org/ain2/-/ain2-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]},"0.1.0":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"0.1.0","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/phuesler/.npm/ain2/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ain2@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"34c05a8ef5719dbbf61d0bc3ec9255ce1ccd0f0d","tarball":"http://registry.npmjs.org/ain2/-/ain2-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]},"0.2.0":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"0.2.0","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"},{"name":"Parham Michael Ossareh","email":"ossareh@gmail.com"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/phuesler/.npm/ain2/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ain2@0.2.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"277dda3e4ea42165870ab2c2a6ef735450aea86c","tarball":"http://registry.npmjs.org/ain2/-/ain2-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]},"0.2.1":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"0.2.1","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"},{"name":"Parham Michael Ossareh","email":"ossareh@gmail.com"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"phuesler","email":"patrick.huesler@googlemail.com"},"_id":"ain2@0.2.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8154d26433fd74a3148f15324299d8c665788bd8","tarball":"http://registry.npmjs.org/ain2/-/ain2-0.2.1.tgz"},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]},"1.0.0":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"1.0.0","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"},{"name":"Parham Michael Ossareh","email":"ossareh@gmail.com"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"phuesler","email":"patrick.huesler@googlemail.com"},"_id":"ain2@1.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bad777d94071e224d9b250c6c3d02fb2f3a35009","tarball":"http://registry.npmjs.org/ain2/-/ain2-1.0.0.tgz"},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]},"1.1.0":{"name":"ain2","description":"Syslog logging for node.js. Continuation of ain","version":"1.1.0","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"},{"name":"Parham Michael Ossareh","email":"ossareh@gmail.com"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"phuesler","email":"patrick.huesler@googlemail.com"},"_id":"ain2@1.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7ad86218eeb95c86f5704bcaf9b65c005ca6545c","tarball":"http://registry.npmjs.org/ain2/-/ain2-1.1.0.tgz"},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}]}},"maintainers":[{"name":"phuesler","email":"patrick.huesler@googlemail.com"}],"time":{"modified":"2012-02-04T10:25:24.868Z","created":"2011-08-16T17:02:51.398Z","0.0.2":"2011-08-16T17:02:52.842Z","0.0.3":"2011-09-13T20:01:19.259Z","0.1.0":"2011-09-28T13:23:10.726Z","0.2.0":"2011-10-17T13:31:55.289Z","0.2.1":"2011-11-23T16:26:56.130Z","1.0.0":"2012-01-02T16:39:07.074Z","1.1.0":"2012-02-04T10:25:24.868Z"},"author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"_attachments":{"ain2-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-OxezlY2fSfT+POkT//oI6g==","length":10240,"stub":true},"ain2-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IIXVA06L8NGZmrz1OGZQTA==","length":10240,"stub":true},"ain2-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-A9gpGrqwhaJdR5tvF6P/sw==","length":10240,"stub":true},"ain2-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RIAO1jL/qWQwYu3To6CLqg==","length":6392,"stub":true},"ain2-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PvjYM4L65AzU07KsOBi7Dw==","length":5633,"stub":true},"ain2-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-P3mMX668w0RIjX2t9v6UVA==","length":5571,"stub":true},"ain2-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0J2EehWlqgvfboJa6mKpeQ==","length":5042,"stub":true}}}},
{"id":"ain2-fs","key":"ain2-fs","value":{"rev":"3-6d1069d64fbe0e838592866e5d5d6ccd"},"doc":{"_id":"ain2-fs","_rev":"3-6d1069d64fbe0e838592866e5d5d6ccd","name":"ain2-fs","description":"Syslog logging for node.js. Continuation of ain","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.4":{"name":"ain2-fs","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.4","main":"./index","author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"contributors":[{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},{"name":"Patrick Huesler","email":"patrick.huesler@googlemail.com"},{"name":"Mark Wubben","email":"mark@novemberborn.net"},{"name":"Parham Michael Ossareh","email":"ossareh@gmail.com"}],"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"bugs":{"url":"http://github.com/phuesler/ain/issues"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/ossareh/.npm/ain2-fs/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ain2-fs@0.0.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"084cad8f7b5f297b3a5a50c4be27145ded3d1cad","tarball":"http://registry.npmjs.org/ain2-fs/-/ain2-fs-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"ossareh","email":"ossareh@gmail.com"}]}},"maintainers":[{"name":"ossareh","email":"ossareh@gmail.com"}],"time":{"modified":"2011-10-03T02:00:11.718Z","created":"2011-10-03T02:00:11.227Z","0.0.4":"2011-10-03T02:00:11.718Z"},"author":{"name":"Alexander Dorofeev","email":"aka.spin@gmail.com"},"repository":{"type":"git","url":"git://github.com/phuesler/ain.git"},"_attachments":{"ain2-fs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-c3dIpZP89W51lf+UXL69WQ==","length":6217,"stub":true}}}},
{"id":"ain2-papandreou","key":"ain2-papandreou","value":{"rev":"17-c713ddc1ca8ca75f0df85765ec75e289"},"doc":{"_id":"ain2-papandreou","_rev":"17-c713ddc1ca8ca75f0df85765ec75e289","name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.7":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.7","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"dependencies":{"unix-dgram-papandreou":"=0.0.1"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"df160819bc7d090c87ab228f2043fa651754ca20","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.7.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.8":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.8","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"dependencies":{"unix-dgram-papandreou":"=0.0.1"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.8","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"d70993957bf8f8deca74ca914d374aefcf7b20ce","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.8.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.9":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.9","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"dependencies":{"unix-dgram":"=0.0.1"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"428b89418ac37ea83cb3f0893cddce636db0913b","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.9.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.6":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.6","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"f464584c422a06f64bc96e98edbeb77b2f73cad3","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.6.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.5":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.5","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"2a99df7265de48160b910d1c25800139194593c1","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.5.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.4":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.4","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"86eab5a9fd4efcbbbb391c2f398edaf402b5559c","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.4.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.3":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.3","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"5a588b414b1d824b5d40e69356e04243b467f414","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.3.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.10":{"name":"ain2-papandreou","description":"Syslog logging for node.js. Continuation of ain","version":"0.0.10","main":"./index","repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"licenses":[{"type":"MIT","url":"http://github.com/phuesler/ain/master/LICENSE"}],"dependencies":{"unix-dgram":"=0.0.1"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"ain2-papandreou@0.0.10","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9a4158d5835540dcf537da75d1668dc7885d546d","tarball":"http://registry.npmjs.org/ain2-papandreou/-/ain2-papandreou-0.0.10.tgz"},"readme":"","maintainers":[{"name":"papandreou","email":"andreas@one.com"}]}},"readme":null,"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2012-08-14T09:19:18.409Z","created":"2012-03-28T11:58:11.585Z","0.0.7":"2012-03-28T11:58:38.741Z","0.0.8":"2012-03-28T12:54:12.629Z","0.0.9":"2012-03-29T08:20:42.420Z","0.0.6":"2012-03-29T08:24:24.367Z","0.0.5":"2012-03-29T08:24:40.278Z","0.0.4":"2012-03-29T08:25:28.437Z","0.0.3":"2012-03-29T08:25:35.800Z","0.0.10":"2012-08-14T09:19:18.409Z"},"repository":{"type":"git","url":"git://github.com/papandreou/ain.git"},"_attachments":{"ain2-papandreou-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-MN/mdsgSguDD7V7/ty5j7w==","length":5883,"stub":true},"ain2-papandreou-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-B0Jn+6KpF3zwUv8nKiqHPQ==","length":5752,"stub":true},"ain2-papandreou-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-krvuwLEvYYb7juFi4EQK1g==","length":5888,"stub":true},"ain2-papandreou-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9vjoA8lBAC9j2W816X6V/Q==","length":5892,"stub":true},"ain2-papandreou-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-J02FDiErdcjMMr+xtTrQdQ==","length":5790,"stub":true},"ain2-papandreou-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-weDQL5RCvrvBQU/kr+1KSg==","length":5842,"stub":true},"ain2-papandreou-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3eDqdcM3xNkg0XGT50qNXA==","length":5847,"stub":true},"ain2-papandreou-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kjgcIvRD0dUL7nofPDfxSg==","length":5820,"stub":true}}}},
{"id":"air","key":"air","value":{"rev":"3-a5c36d7f88f2d2d8ffb8f16f4e0e1658"},"doc":{"_id":"air","_rev":"3-a5c36d7f88f2d2d8ffb8f16f4e0e1658","name":"air","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Jeffrey Zhao","email":"jeffz@live.com","url":"http://zhaojie.me/"},"homepage":"https://github.com/JeffreyZhao/air","bugs":{"url":"https://github.com/JeffreyZhao/air/issues","email":"jeffz@live.com"},"name":"air","version":"0.0.1","main":"air.js","_id":"air@0.0.1","dist":{"shasum":"8503e4700d2fa0870197a95ec5b6f53dec2ee0ae","tarball":"http://registry.npmjs.org/air/-/air-0.0.1.tgz"},"readme":"","maintainers":[{"name":"jeffz","email":"jeffz@live.com"}]}},"readme":"","maintainers":[{"name":"jeffz","email":"jeffz@live.com"}],"time":{"modified":"2012-08-09T10:13:05.990Z","created":"2012-08-09T10:13:01.453Z","0.0.1":"2012-08-09T10:13:05.990Z"},"author":{"name":"Jeffrey Zhao","email":"jeffz@live.com","url":"http://zhaojie.me/"},"_attachments":{"air-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YbvvOJ/NGCaDzQTwjwd+iQ==","length":2632,"stub":true}}}},
{"id":"air-drop","key":"air-drop","value":{"rev":"21-3f008cf1e7e10cee67031d95d01e0b2f"},"doc":{"_id":"air-drop","_rev":"21-3f008cf1e7e10cee67031d95d01e0b2f","name":"air-drop","description":"Utility for packaging, manipulating and delivering JS and CSS source to the browser","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"air-drop","version":"0.1.0","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","dependencies":{"async":"*","connect":"*","glob":"*","underscore":"*","coffee-script":"*","uglify-js":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"7fc348efcb2122176b234d3c28efe93b0899d2ca","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.1.0.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"directories":{}},"0.1.1":{"name":"air-drop","version":"0.1.1","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","dependencies":{"async":"*","connect":"*","glob":"*","underscore":"*","coffee-script":"*","uglify-js":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"engines":{"node":"*"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cae2b28ebfae832582bcf959ed9d6cc3a581e8a9","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.1.1.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"directories":{}},"0.1.2":{"name":"air-drop","version":"0.1.2","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","dependencies":{"async":"*","connect":"*","glob":"*","underscore":"*","coffee-script":"*","uglify-js":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"engines":{"node":"*"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6a84549ece006f679b69b72e81265d607c74b323","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.1.2.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"directories":{}},"0.1.3":{"name":"air-drop","version":"0.1.3","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","dependencies":{"async":"*","connect":"> 2.0.0","glob":"*","underscore":"*","coffee-script":"*","uglify-js":"*","burrito":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"7061f6dd406ba4dfb7c10cbeef494279aa9c44f1","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.1.3.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"directories":{}},"0.2.0":{"name":"air-drop","version":"0.2.0","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS and CSS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","dependencies":{"async":"*","connect":"> 2.0.0","glob":"*","underscore":"1.3.1","uglify-js":"*","burrito":"*","detective":"*","coffee-script":"*","stylus":"*","less":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"eb36639a34965a2c3ef06d445b3b27ec4d51ddd4","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.2.0.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"directories":{}},"0.2.1":{"name":"air-drop","version":"0.2.1","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS and CSS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","dependencies":{"async":"*","connect":"> 2.0.0","glob":"*","underscore":"1.3.1","uglify-js":"*","burrito":"*","detective":"*","coffee-script":"*","stylus":"*","less":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"bf1ac45b020bf17e1c5fe69c58ad6d5a02682056","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.2.1.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"directories":{}},"0.2.2":{"name":"air-drop","version":"0.2.2","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS and CSS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","bin":{"air-drop":"bin/cli.js"},"dependencies":{"async":"*","connect":"> 2.0.0","glob":"*","underscore":"1.3.1","uglify-js":"*","burrito":"*","detective":"*","coffee-script":"*","stylus":"*","less":"*"},"devDependencies":{"jasmine-node":"*"},"engine":{"node":">=0.4"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"60db643b7bb8925ab9e361b1886d697e1fe9b0bf","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.2.2.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}]},"0.2.3":{"name":"air-drop","version":"0.2.3","author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"description":"Utility for packaging, manipulating and delivering JS and CSS source to the browser","scripts":{"test":"jasmine-node --coffee spec"},"main":"./lib/air-drop.js","bin":{"air-drop":"bin/cli.js"},"dependencies":{"async":"*","connect":"> 2.0.0","glob":"*","underscore":"1.3.1","uglify-js":"*","burrito":"*","detective":"*","coffee-script":"*","stylus":"*","less":"*"},"devDependencies":{"jasmine-node":"*"},"repository":{"type":"git","url":"git://github.com/chrisjpowers/air-drop.git"},"engine":{"node":">=0.4"},"_npmUser":{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"},"_id":"air-drop@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"4433ae0077504307ac5e750978817cd5a3e66bcd","tarball":"http://registry.npmjs.org/air-drop/-/air-drop-0.2.3.tgz"},"maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}]}},"readme":"# AirDrop\n\n`AirDrop` is a Node.js Connect middleware for compiling, concatenating and minimizing\n your JS/Coffee source files and delivering them to the browser on-the-fly. \nPersonally I think this approach is preferable to using build scripts, file watchers, etc.\n\n## Install\n\nInstall with `npm`:\n\n```\nnpm install air-drop\n```\n\n## Including JS Files\n\nAll the following examples assume you have some kind of a Connect-compatible server:\n\n```javascript\nvar server = require(\"connect\").createServer();\n```\n\n`AirDrop` objects are instantiated with a package name that will be used in the package's\nURL. To include JS files, use the `include` method. Files will be added to the package\nin the order you include them.\n\n```javascript\nvar package = AirDrop(\"my-package\").include(\"public/js/jquery.js\")\n                                   .include(\"public/js/file1.js\")\n                                   .include(\"public/js/file2.js\");\nserver.use(package);\n```\n\nIn your client-side code, you can load your JS package with a script tag:\n\n```html\n<script type=\"text/javascript\" src=\"/air-drop/my-package.js\"></script>\n```\n\n## Globbing Paths\n\nRather than including paths one by one, you can use glob wildcards:\n\n```javascript\nvar package = AirDrop(\"my-package\").include(\"public/js/jquery.js\")\n                                   .include(\"public/js/**/*.js\")\n```\n\nThis will first add `jquery.js`, then any other JS files nested inside `public/js`.\nNOTE: Because `jquery.js` has already been included, it will not be included a\nsecond time by the glob include.\n\n## Requiring JS Modules\n\nSharing JS source files between Node and the browser is difficult because the browser\ndoes not natively implement Node's file loading system using `require` and `exports`.\nThis is easy with `AirDrop`, though -- just use the `require` method instead of `include`\nand `AirDrop` will wrap your modules in an AMD `define` block for use in the browser:\n\n```javascript\n// in lib/my-module.js\nexports.helloWorld = function() { return \"Hello World!\"; };\n\n// in public/js/demo.js\nvar MyModule = require(\"lib/my-module\");\nMyModule.helloWorld(); // \"Hello World!\"\n\n// in your Node script\nvar package = AirDrop(\"my-package\").require(\"lib/my-module.js\")\n                                   .include(\"public/js/demo.js\");\nserver.use(package);\n```\n\n## Packaging Your Code\n\nBy default, `AirDrop` does not package your code, as this makes debugging difficult\nin development. Rather, `/air-drop/my-package.js` will dynamically add a script tag\nfor each of your included scripts so that they will be loaded individually.\n\nWhen you are ready for your code to be packaged, use the `package` method:\n\n```javascript\nvar package = AirDrop(\"my-package\").require(\"lib/my-module.js\")\n                                   .include(\"public/js/demo.js\")\n                                   .package();\n```\n\nThe `package` method accepts an optional boolean so that you can package conditionally.\nFor example, you may only want to package your code if the NODE_ENV environment\nvariable is set to `production`:\n\n```javascript\nvar package = AirDrop(\"my-package\").require(\"lib/my-module.js\")\n                                   .include(\"public/js/demo.js\")\n                                   .package(process.env.NODE_ENV === \"production\");\n```\n\n## Minimizing Your Code\n\nMinimizing your client code is a good way to reducing file size as well as obfuscating\nit from prying eyes. Like the `package` method, the `minimize` method can be called\nwithout an argument, or with a boolean:\n\n```javascript\nvar package = AirDrop(\"my-package\").require(\"lib/my-module.js\")\n                                   .include(\"public/js/demo.js\")\n                                   .package(process.env.NODE_ENV === \"production\")\n                                   .minimize(process.env.NODE_ENV === \"production\");\n                                   // or just .minimize()\n```\n\n## Caching Your Packages\n\nSince building these packages can be an expensive operation, you will probably want to cache\nthe built packages in memory so they are only built once while your process is running.\nYou can do this using the `cache` method, which takes an optional boolean like `package`\nand `minimize`:\n\n\n```javascript\nvar package = AirDrop(\"my-package\").require(\"lib/my-module.js\")\n                                   .include(\"public/js/demo.js\")\n                                   .package(process.env.NODE_ENV === \"production\")\n                                   .minimize(process.env.NODE_ENV === \"production\")\n                                   .cache(process.env.NODE_ENV === \"production\");\n                                   // or just .cache()\n```\n\n## CoffeeScript\n\nUsing CoffeeScript? No problem, any CoffeeScripts will be automatically compiled for you!\n\n## TODO\n\n- Specs!\n- More flexibility in naming AMD modules other than by path\n- Ability to slice out \"server-only\" code from shared files\n- Improve caching mechanism to integrate storage outside of memory (flat files, memcached)\n","maintainers":[{"name":"chrisjpowers","email":"chrisjpowers@gmail.com"}],"time":{"modified":"2012-08-05T20:17:57.026Z","created":"2012-01-20T16:02:36.538Z","0.1.0":"2012-01-20T16:02:37.409Z","0.1.1":"2012-01-25T15:53:51.086Z","0.1.2":"2012-01-26T15:28:51.612Z","0.1.3":"2012-05-31T05:21:56.603Z","0.2.0":"2012-07-06T14:30:38.538Z","0.2.1":"2012-07-08T03:17:41.344Z","0.2.2":"2012-07-12T15:14:18.908Z","0.2.3":"2012-08-05T20:17:57.026Z"},"author":{"name":"Chris Powers","email":"chrisjpowers@gmail.com"},"repository":{"type":"git","url":"git://github.com/chrisjpowers/air-drop.git"},"_attachments":{"air-drop-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-VvJveFGbr8/R3nRYMWMhBQ==","length":28313,"stub":true},"air-drop-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-uClWtnG5JL+zpmIZTdLAHg==","length":28141,"stub":true},"air-drop-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-PYbmcI4PaB2/gLRZDxzRMA==","length":26607,"stub":true},"air-drop-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KB1cAV++l3aNxVrDbLbutQ==","length":25942,"stub":true},"air-drop-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-AQ3/xRnyWAVqQJ5RVeZV/Q==","length":17663,"stub":true},"air-drop-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AmqjUu7coaX920aiOWsBSg==","length":20480,"stub":true},"air-drop-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kPadp4CTsucVNotxwzVYEQ==","length":10240,"stub":true},"air-drop-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uULYxV/ed7cKTcnPBQ05Ug==","length":10240,"stub":true}}}},
{"id":"air-drop-flatiron","key":"air-drop-flatiron","value":{"rev":"5-5ee8e9a76b0fef6b5b03ee422582be77"},"doc":{"_id":"air-drop-flatiron","_rev":"5-5ee8e9a76b0fef6b5b03ee422582be77","name":"air-drop-flatiron","description":"air-drop for flatiron","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"air-drop-flatiron","version":"0.0.2","author":{"name":"Arnaud Mélon","email":"paztaga@gmail.com"},"description":"air-drop for flatiron","maintainers":[{"name":"amelon","email":"paztaga@gmail.com"}],"dependencies":{"air-drop":"0.2.x","flatiron":"0.2.x","union":"0.3.x"},"devDependencies":{"request":"2.x.x","ecstatic":"0.1.x","mocha":"1.3.x","expect.js":"0.1.x"},"engines":{"node":"0.8.x"},"scripts":{"test":"mocha"},"main":"./air-drop-flatiron","readme":"# AirDrop for flatiron\r\r> [AirDrop] is a Node.js Connect middleware for compiling, concatenating and minimizing your JS/Coffee source files and delivering them to the browser on-the-fly. \r\r> Personally I think this approach is preferable to using build scripts, file watchers, etc.\r\rNow it's for [flatiron] too.\r\r## Install\r\rInstall with `npm`:\r\r```\rnpm install air-drop-flatiron\r```\r\rYou can run the specs with `npm` as well:\r\r## API\rSee [AirDrop] repo\r\r## [Flatiron] integration\r\r```javascript\rvar flatiron  = require('flatiron')\r  , app       = flatiron.app\r  , AirDrop   = require('air-drop-flatiron')\r  , ecstatic  = require('ecstatic')\r  , package   = AirDrop('my-pack').require('js/jquery-1.7.2.js', {name: 'jquery'})\r                                  .require('js/jquerypp.js', {name: 'jquerypp'})\r                                  .require('js/can.jquery-1.0.5.js', {name: 'can'})\r                                  // .package().minimize().cache();    \r\rapp.use(flatiron.plugins.http, {\r  before: [\r    ecstatic(__dirname + '/public')\r  ]\r});\r\r//app is now AirDrop aware (app.AirDrop('foo-pack').include...)\r//you can defined AirDrop packages before app.use(flatiron.plugins.http) or after\rapp.use(AirDrop);\r\r//When a package is created AirDrop set automatically routes to Director for handling this package\rAirDrop('second-pack').include('public/js/**/*.js')\r\rapp.init(function () {  \r  app.start(3000);\r  console.log({\"starting\": \"on\", \"www\": \"http://localhost:3000\"}, \"info\");\r});\r```\r\r## Current issues\r### Windows\rCurrently, [AirDrop] is not working on windows because of path resolving (nightmare on windows: path `c:/foo/bar` is resolved as `c:\\\\foo\\\\bar`) and it makes bad things on Path AirDrop module.\r\rSecond issue on windows is usage of [glob].\rglob wants input with forward-slach (accept `/foo/bar` and not `\\\\foo\\\\bar`). Still path resolution in AirDrop has to fix path before using [glob].\r\rI sent a pull request to [AirDrop] to fix these issues.\r\rLast, but not the least, [glob] is not working with windows absolute path (eg: `glob('c:/foo/bar')`).\r\rI sent a pull request to [glob] to fix these issues.\r\r\r### AirDrop\r[AirDrop] accept required module to be named:\r\r```javascript\r// in your Node script\rvar package = AirDrop(\"my-package\").require(__dirname + \"/../node_modules/underscore/underscore.js\", {name: \"underscore\"});\r\r// in the browser\rvar _ = require(\"underscore\");\r```\r\rBut this currently only work if you use `.package()` otherwise option `{name: \"foo\"}` is not used.\rI sent a pull request to fix this issue and make it working with air-drop-flatiron.\r\r\r  [AirDrop]: https://github.com/chrisjpowers/air-drop\r  [flatiron]: https://github.com/flatiron/flatiron\r  [glob]: https://github.com/isaacs/node-glob.git\r","_id":"air-drop-flatiron@0.0.2","dist":{"shasum":"2be1ed70138c2b86c961d9a8dd3dfc4f91fc85d2","tarball":"http://registry.npmjs.org/air-drop-flatiron/-/air-drop-flatiron-0.0.2.tgz"}},"0.0.3":{"name":"air-drop-flatiron","version":"0.0.3","author":{"name":"Arnaud Mélon","email":"paztaga@gmail.com"},"description":"air-drop for flatiron","maintainers":[{"name":"amelon","email":"paztaga@gmail.com"}],"dependencies":{"air-drop":"0.2.x","flatiron":"0.2.x","union":"0.3.x"},"devDependencies":{"request":"2.x.x","ecstatic":"0.1.x","mocha":"1.3.x","expect.js":"0.1.x"},"repository":{"type":"git","url":"http://github.com/amelon/air-drop-flatiron.git"},"engines":{"node":">=0.6.x"},"scripts":{"test":"mocha"},"main":"./air-drop-flatiron","readme":"# AirDrop for flatiron\r\r> [AirDrop] is a Node.js Connect middleware for compiling, concatenating and minimizing your JS/Coffee source files and delivering them to the browser on-the-fly. \r\r> Personally I think this approach is preferable to using build scripts, file watchers, etc.\r\rNow it's for [flatiron] too.\r\r## Install\r\rInstall with `npm`:\r\r```\rnpm install air-drop-flatiron\r```\r\rYou can run the specs with `npm` as well:\r\r## API\rSee [AirDrop] repo\r\r## [Flatiron] integration\r\r```javascript\rvar flatiron  = require('flatiron')\r  , app       = flatiron.app\r  , AirDrop   = require('air-drop-flatiron')\r  , ecstatic  = require('ecstatic')\r  , package   = AirDrop('my-pack').require('js/jquery-1.7.2.js', {name: 'jquery'})\r                                  .require('js/jquerypp.js', {name: 'jquerypp'})\r                                  .require('js/can.jquery-1.0.5.js', {name: 'can'})\r                                  // .package().minimize().cache();    \r\rapp.use(flatiron.plugins.http, {\r  before: [\r    ecstatic(__dirname + '/public')\r  ]\r});\r\r//app is now AirDrop aware (app.AirDrop('foo-pack').include...)\r//you can defined AirDrop packages before app.use(flatiron.plugins.http) or after\rapp.use(AirDrop);\r\r//When a package is created AirDrop set automatically routes to Director for handling this package\rAirDrop('second-pack').include('public/js/**/*.js')\r\rapp.init(function () {  \r  app.start(3000);\r  console.log({\"starting\": \"on\", \"www\": \"http://localhost:3000\"}, \"info\");\r});\r```\r\r## Current issues\r### Windows\rCurrently, [AirDrop] is not working on windows because of path resolving (nightmare on windows: path `c:/foo/bar` is resolved as `c:\\\\foo\\\\bar`) and it makes bad things on Path AirDrop module.\r\rSecond issue on windows is usage of [glob].\rglob wants input with forward-slach (accept `/foo/bar` and not `\\\\foo\\\\bar`). Still path resolution in AirDrop has to fix path before using [glob].\r\rI sent a pull request to [AirDrop] to fix these issues.\r\rLast, but not the least, [glob] is not working with windows absolute path (eg: `glob('c:/foo/bar')`).\r\rI sent a pull request to [glob] to fix these issues.\r\r\r### AirDrop\r[AirDrop] accept required module to be named:\r\r```javascript\r// in your Node script\rvar package = AirDrop(\"my-package\").require(__dirname + \"/../node_modules/underscore/underscore.js\", {name: \"underscore\"});\r\r// in the browser\rvar _ = require(\"underscore\");\r```\r\rBut this currently only work if you use `.package()` otherwise option `{name: \"foo\"}` is not used.\rI sent a pull request to fix this issue and make it working with air-drop-flatiron.\r\r\r  [AirDrop]: https://github.com/chrisjpowers/air-drop\r  [flatiron]: https://github.com/flatiron/flatiron\r  [glob]: https://github.com/isaacs/node-glob.git\r","_id":"air-drop-flatiron@0.0.3","dist":{"shasum":"26e21f5a45df3cd8f843389935615b647779506a","tarball":"http://registry.npmjs.org/air-drop-flatiron/-/air-drop-flatiron-0.0.3.tgz"}}},"readme":"# AirDrop for flatiron\r\r> [AirDrop] is a Node.js Connect middleware for compiling, concatenating and minimizing your JS/Coffee source files and delivering them to the browser on-the-fly. \r\r> Personally I think this approach is preferable to using build scripts, file watchers, etc.\r\rNow it's for [flatiron] too.\r\r## Install\r\rInstall with `npm`:\r\r```\rnpm install air-drop-flatiron\r```\r\rYou can run the specs with `npm` as well:\r\r## API\rSee [AirDrop] repo\r\r## [Flatiron] integration\r\r```javascript\rvar flatiron  = require('flatiron')\r  , app       = flatiron.app\r  , AirDrop   = require('air-drop-flatiron')\r  , ecstatic  = require('ecstatic')\r  , package   = AirDrop('my-pack').require('js/jquery-1.7.2.js', {name: 'jquery'})\r                                  .require('js/jquerypp.js', {name: 'jquerypp'})\r                                  .require('js/can.jquery-1.0.5.js', {name: 'can'})\r                                  // .package().minimize().cache();    \r\rapp.use(flatiron.plugins.http, {\r  before: [\r    ecstatic(__dirname + '/public')\r  ]\r});\r\r//app is now AirDrop aware (app.AirDrop('foo-pack').include...)\r//you can defined AirDrop packages before app.use(flatiron.plugins.http) or after\rapp.use(AirDrop);\r\r//When a package is created AirDrop set automatically routes to Director for handling this package\rAirDrop('second-pack').include('public/js/**/*.js')\r\rapp.init(function () {  \r  app.start(3000);\r  console.log({\"starting\": \"on\", \"www\": \"http://localhost:3000\"}, \"info\");\r});\r```\r\r## Current issues\r### Windows\rCurrently, [AirDrop] is not working on windows because of path resolving (nightmare on windows: path `c:/foo/bar` is resolved as `c:\\\\foo\\\\bar`) and it makes bad things on Path AirDrop module.\r\rSecond issue on windows is usage of [glob].\rglob wants input with forward-slach (accept `/foo/bar` and not `\\\\foo\\\\bar`). Still path resolution in AirDrop has to fix path before using [glob].\r\rI sent a pull request to [AirDrop] to fix these issues.\r\rLast, but not the least, [glob] is not working with windows absolute path (eg: `glob('c:/foo/bar')`).\r\rI sent a pull request to [glob] to fix these issues.\r\r\r### AirDrop\r[AirDrop] accept required module to be named:\r\r```javascript\r// in your Node script\rvar package = AirDrop(\"my-package\").require(__dirname + \"/../node_modules/underscore/underscore.js\", {name: \"underscore\"});\r\r// in the browser\rvar _ = require(\"underscore\");\r```\r\rBut this currently only work if you use `.package()` otherwise option `{name: \"foo\"}` is not used.\rI sent a pull request to fix this issue and make it working with air-drop-flatiron.\r\r\r  [AirDrop]: https://github.com/chrisjpowers/air-drop\r  [flatiron]: https://github.com/flatiron/flatiron\r  [glob]: https://github.com/isaacs/node-glob.git\r","maintainers":[{"name":"amelon","email":"paztaga@gmail.com"}],"time":{"modified":"2012-07-19T22:02:44.111Z","created":"2012-07-19T21:56:32.420Z","0.0.2":"2012-07-19T21:56:35.204Z","0.0.3":"2012-07-19T22:02:44.111Z"},"author":{"name":"Arnaud Mélon","email":"paztaga@gmail.com"},"repository":{"type":"git","url":"http://github.com/amelon/air-drop-flatiron.git"},"_attachments":{"air-drop-flatiron-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4QYYn7jIwnhHpOl9HJeg4g==","length":3932,"stub":true},"air-drop-flatiron-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7tmnhs9Y+N9IJuEw8GCERw==","length":3892,"stub":true}}}},
{"id":"airbrake","key":"airbrake","value":{"rev":"50-ef6b8c5d5e6c7869dfe254e6f79f7664"},"doc":{"_id":"airbrake","_rev":"50-ef6b8c5d5e6c7869dfe254e6f79f7664","name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","dist-tags":{"latest":"0.2.9"},"versions":{"0.0.0":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly hoptoad.","version":"0.0.0","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.0","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"ae02cea2eba69aa70683aab47a1ccc54fce88da5","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.0.tgz"},"scripts":{},"directories":{}},"0.0.1":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly hoptoad.","version":"0.0.1","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.1","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"9efdb723ebff01b2476cb250322ab8970b60aa0c","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.1.tgz"},"scripts":{},"directories":{}},"0.0.2":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly hoptoad.","version":"0.0.2","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.2","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"d67d5f7fe03cf0a2d82eb0e430bacf2be94c5a2c","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.2.tgz"},"scripts":{},"directories":{}},"0.0.3":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly hoptoad.","version":"0.0.3","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.3","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"faa1c70d984b20894b7ff919af0c4f89c858751c","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.3.tgz"},"scripts":{},"directories":{}},"0.0.4":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly hoptoad.","version":"0.0.4","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.4","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"98fea8881c6647423dda7925e8918aa93ab9483d","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.4.tgz"},"scripts":{},"directories":{}},"0.0.5":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.0.5","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.5","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"cc477010bd108f26fa3b90edcbc5c457c9d31591","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.5.tgz"},"scripts":{},"directories":{}},"0.0.6":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.0.6","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.6","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"245a90f6c3f4c036d87cc3bfdb66d212a1442ab2","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.6.tgz"},"scripts":{},"directories":{}},"0.0.7":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.0.7","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.7","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"149e08e495214bdfd8864f3371d388d0e9190677","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.7.tgz"},"scripts":{},"directories":{}},"0.0.8":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.0.8","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.8","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"ae74c1adc636fd68710f02b98dd177b98519b723","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.8.tgz"},"scripts":{},"directories":{}},"0.0.9":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.0.9","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.0.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.0.9","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"9f5360daf9f41f8e7b99bb4305d1d9806055a72d","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.0.9.tgz"},"scripts":{},"directories":{}},"0.1.0":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.1.0","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.1.0","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"291d387bc5a4b9c0fe3265923242f33ed7050b72","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.1.0.tgz"},"scripts":{},"directories":{}},"0.1.1":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.1.1","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.1.1","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"97e6cbe9803eb1f7d93cccf3aab8c88059f8c46b","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.1.1.tgz"},"scripts":{},"directories":{}},"0.2.0":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.0","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.2.0","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"06ba5011d11dbbbfa5d7a2de6999281934034a9b","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.0.tgz"},"scripts":{},"directories":{}},"0.2.1":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.1","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","traverse":"0.4.4","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.2.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"49bf2f82401c2fee60d8cd885a766aee7548113c","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.2":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.2","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"https://github.com/felixge/xmlbuilder-js/tarball/4303eb2650a4b819a980b1dc9d2965862a1e9faf","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.2.2","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"35adf82fa2a4bd0ca305c018cda195732e0e4ad2","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.3":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.3","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmJsonOpts":{"file":"/Users/felix/.npm/airbrake/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"airbrake@0.2.3","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"57d6cb41bb2b158b49ec32ad3fcfbd5798389ab7","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.3.tgz"},"scripts":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.4":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.4","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"airbrake@0.2.4","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"70787ec2c2ca66ae6c5422272ba71fa5c6ff742b","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.4.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.5":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.5","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"optionalDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"airbrake@0.2.5","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"10152f484919f47444dce264b3f753be138cdd56","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.5.tgz"},"readme":"# airbrake\n\nNode.js client for [airbrakeapp.com][], formerly known as [hoptoadapp.com][].\n\n[airbrakeapp.com]: http://airbrakeapp.com/\n[hoptoadapp.com]: http://robots.thoughtbot.com/post/7665411707/hoptoad-is-now-airbrake\n\n## Install\n\n``` bash\nnpm install airbrake\n```\n\n## Basic usage\n\nThe common use case for this module is to catch all `'uncaughtException'`\nevents on the `process` object and send them to airbrake:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nairbrake.handleExceptions();\n\nthrow new Error('I am an uncaught exception');\n```\n\nPlease note that the above will re-throw the exception after it has been\nsuccessfully delivered to airbrake, caushing your process to exit with status 1.\n\nIf you want more control over the delivery of your errors, you can also\nmanually submit errors to airbrake.\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar err = new Error('Something went terribly wrong');\nairbrake.notify(err, function(err, url) {\n  if (err) throw err;\n\n  // Error has been delivered, url links to the error in airbrake\n});\n```\n\n## Screenshot\n\nThis screenshot shows an airbrake error send from this module:\n\n![screenshot](https://github.com/felixge/node-airbrake/raw/master/screenshot.png)\n\n## Features\n\n* Automatically add `process.env` as well as other information when sending notifications\n* Detect and fix circular references in error context information\n* Support for all features of the [2.1 notification API][2.1api]\n* Support for [long-stack-traces][]\n* Optional auto-handler for `uncaughtException` events\n* Provides notification url linking to airbrake in `notify()` callback\n* Timeout airbrake requests after 30 seconds, you never know\n\n[long-stack-traces]: https://github.com/tlrobinson/long-stack-traces\n\n[2.1api]: http://help.airbrakeapp.com/kb/api-2/notifier-api-version-21\n\n## Adding context to errors\n\nThe `notify()` method automatically adds the following context information to\neach delivered error:\n\n* **error.class:** (`err.type` string if set, or `'Error'`)\n* **error.message:** (`err.message` string)\n* **error.backtrace:** (`err.stack` as parsed by [stack-trace][])\n* **request.url:** (`err.url`, see `airbrake.url`);\n* **request.component:** (`err.component` string if set);\n* **request.action:** (`err.action` string if set);\n* **request.cgi-data:** (`process.env`, merged all other properties of `err`)\n* **request.params:** (`err.params` object if set)\n* **request.session:** (`err.session` object if set)\n* **server-environment.project-root:** (`airbrake.projectRoot` string if set)\n* **server-environment.environment-name:** (`airbrake.env` string)\n* **server-environment.app-version:** (`airbrake.appVersion string if set)\n* **server-environment.hostname:** (`airbrake.hostname` string if set)\n\nYou can add additional context information by modifying the error properties\nlisted above:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar http = require('http');\n\nhttp.createServer(function(req, res) {\n  if (req.headers['X-Secret'] !== 'my secret') {\n    var err = new Error('403 - Permission denied');\n    req.writeHead(403);\n    req.end(err.message);\n\n    err.url = req.url;\n    err.params = {ip: req.socket.remoteAddress};\n    airbrake.notify(err);\n  }\n});\n```\n\nUnfortunately `uncaughtException` events cannot be traced back to particular\nrequests, so you should still try to handle errors where they occur.\n\n[stack-trace]: https://github.com/felixge/node-stack-trace\n\n## Removing context from errors\n\nIn some scenarios you might want to filter some context to never show up in\nAirbrake. For example you might have a private key loaded in your environment\nmemory, or your user has some critical data in his session, and you want to\nhide that.\n\nThis can be done by hooking into the `'vars'` event like so:\n\n``` javascript\nairbrake.on('vars', function(type, vars) {\n  if (type === 'cgi-data') {\n    delete vars.SECRET;\n  }\n});\n```\n\n## Tracking deployments\n\nThis client supports airbrake's [deployment tracking][]:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar deployment = {\n  rev: '98103a8fa850d5eaf3666e419d8a0a93e535b1b2',\n  repo: 'git@github.com:felixge/node-airbrake.git',\n};\n\nairbrake.trackDeployment(deployment, function(err, params) {\n  if (err) {\n    throw err;\n  }\n\n  console.log('Tracked deployment of %s to %s', params.rev, params.env);\n});\n```\n\nCheck out the `airbrake.trackDeployment()` API docs below for a list of all\noptions.\n\n[deployment tracking]: http://help.airbrakeapp.com/kb/api-2/deploy-tracking\n\n## API\n\n### Airbreak.createClient(apiKey, [env])\n\nReturns a new Airbrake instance.\n\n### airbrake.key = null\n\nThe API key to use.\n\n### airbrake.env = process.env.NODE_ENV || 'development'\n\nThe name of the server environment this is running in.\n\n### airbrake.host = 'http://' + os.hostname()\n\nThe base url for errors. If `err.url` is not set, `airbrake.host` is used\ninstead. If `err.url` is a relative url starting with `'/'`, it is appended\nto `airbrake.host`. If `err.url` is an absolute url, `airbrake.host` is ignored.\n\n### airbrake.projectRoot = null\n\nThe root directory of this project.\n\n### airbrake.appVersion = null\n\nThe version of this app. Set to a semantic version number, or leave unset.\n\n### airbrake.protocol = 'http'\n\nThe protocol to use.\n\n### airbrake.timeout = 30 * 1000\n\nThe timeout after which to give up trying to notify airbrake in ms.\n\n### airbrake.handleExceptions()\n\nRegisters a `process.on('uncaughtException')` listener. When an uncaught\nexception occurs, the error is send to airbrake, and then re-thrown to\nkill the process.\n\n### airbrake.notify(err, [cb])\n\nSends the given `err` to airbrake.\n\nThe callback parameter receives two arguments, `err, url`. `err` is set if\nthe delivery to airbrake failed.\n\nIf no `cb` is given, and the delivery fails, an `error` event is emitted. If\nthere is no listener for this event, node will kill the process as well. This\nis done to avoid silent error delivery failure.\n\n### airbrake.trackDeployment([params, [cb]])\n\nNotifies airbrake about a deployment. `params` is an object with the following\noptions:\n\n* `env:` The environment being deployed, defaults to `airbrake.env`.\n* `user:` The user doing the deployment, defaults to `process.env.USER`.\n* `repo:` The github url of this repository. Defaults to `''`.\n* `rev:` The revision of this deployment. Defaults to `''`.\n\n## Alternative modules\n\nThis module is meant as a replacement for [hoptoad-notifier][], which does not\nsupport all features of the [2.1 API][2.1api].\n\n[hoptoad-notifier]: https://github.com/tristandunn/node-hoptoad-notifier\n\n## Contribute\n\nBesides bug fixes, I'd be happy to accept patches for:\n\n* Automatically parsing `repo` and `rev` from the local git repository when\n  calling `airbrake.trackDeployment()`. This can be done via `exec()`, but must\n  not be done when specifying `repo` / `rev` by hand, or if they are set to\n  `false`.\n\nIf you have other feature ideas, please open an issue first, so we can discuss\nit.\n\n## License\n\nairbrake is licensed under the MIT license.\n","maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.6":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.6","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"optionalDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"airbrake@0.2.6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18-pre","_defaultsLoaded":true,"dist":{"shasum":"6ab13efceda27472973e6c1f0b4abbf8b706cd10","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.6.tgz"},"readme":"# airbrake\n\nNode.js client for [airbrakeapp.com][], formerly known as [hoptoadapp.com][].\n\n[airbrakeapp.com]: http://airbrakeapp.com/\n[hoptoadapp.com]: http://robots.thoughtbot.com/post/7665411707/hoptoad-is-now-airbrake\n\n## Install\n\n``` bash\nnpm install airbrake\n```\n\n## Basic usage\n\nThe common use case for this module is to catch all `'uncaughtException'`\nevents on the `process` object and send them to airbrake:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nairbrake.handleExceptions();\n\nthrow new Error('I am an uncaught exception');\n```\n\nPlease note that the above will re-throw the exception after it has been\nsuccessfully delivered to airbrake, caushing your process to exit with status 1.\n\nIf you want more control over the delivery of your errors, you can also\nmanually submit errors to airbrake.\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar err = new Error('Something went terribly wrong');\nairbrake.notify(err, function(err, url) {\n  if (err) throw err;\n\n  // Error has been delivered, url links to the error in airbrake\n});\n```\n\n## Screenshot\n\nThis screenshot shows an airbrake error send from this module:\n\n![screenshot](https://github.com/felixge/node-airbrake/raw/master/screenshot.png)\n\n## Features\n\n* Automatically add `process.env` as well as other information when sending notifications\n* Detect and fix circular references in error context information\n* Support for all features of the [2.1 notification API][2.1api]\n* Support for [long-stack-traces][]\n* Optional auto-handler for `uncaughtException` events\n* Provides notification url linking to airbrake in `notify()` callback\n* Timeout airbrake requests after 30 seconds, you never know\n\n[long-stack-traces]: https://github.com/tlrobinson/long-stack-traces\n\n[2.1api]: http://help.airbrakeapp.com/kb/api-2/notifier-api-version-21\n\n## Adding context to errors\n\nThe `notify()` method automatically adds the following context information to\neach delivered error:\n\n* **error.class:** (`err.type` string if set, or `'Error'`)\n* **error.message:** (`err.message` string)\n* **error.backtrace:** (`err.stack` as parsed by [stack-trace][])\n* **request.url:** (`err.url`, see `airbrake.url`);\n* **request.component:** (`err.component` string if set);\n* **request.action:** (`err.action` string if set);\n* **request.cgi-data:** (`process.env`, merged all other properties of `err`)\n* **request.params:** (`err.params` object if set)\n* **request.session:** (`err.session` object if set)\n* **server-environment.project-root:** (`airbrake.projectRoot` string if set)\n* **server-environment.environment-name:** (`airbrake.env` string)\n* **server-environment.app-version:** (`airbrake.appVersion string if set)\n* **server-environment.hostname:** (`airbrake.hostname` string if set)\n\nYou can add additional context information by modifying the error properties\nlisted above:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar http = require('http');\n\nhttp.createServer(function(req, res) {\n  if (req.headers['X-Secret'] !== 'my secret') {\n    var err = new Error('403 - Permission denied');\n    req.writeHead(403);\n    req.end(err.message);\n\n    err.url = req.url;\n    err.params = {ip: req.socket.remoteAddress};\n    airbrake.notify(err);\n  }\n});\n```\n\nUnfortunately `uncaughtException` events cannot be traced back to particular\nrequests, so you should still try to handle errors where they occur.\n\n[stack-trace]: https://github.com/felixge/node-stack-trace\n\n## Removing context from errors\n\nIn some scenarios you might want to filter some context to never show up in\nAirbrake. For example you might have a private key loaded in your environment\nmemory, or your user has some critical data in his session, and you want to\nhide that.\n\nThis can be done by hooking into the `'vars'` event like so:\n\n``` javascript\nairbrake.on('vars', function(type, vars) {\n  if (type === 'cgi-data') {\n    delete vars.SECRET;\n  }\n});\n```\n\n## Tracking deployments\n\nThis client supports airbrake's [deployment tracking][]:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar deployment = {\n  rev: '98103a8fa850d5eaf3666e419d8a0a93e535b1b2',\n  repo: 'git@github.com:felixge/node-airbrake.git',\n};\n\nairbrake.trackDeployment(deployment, function(err, params) {\n  if (err) {\n    throw err;\n  }\n\n  console.log('Tracked deployment of %s to %s', params.rev, params.env);\n});\n```\n\nCheck out the `airbrake.trackDeployment()` API docs below for a list of all\noptions.\n\n[deployment tracking]: http://help.airbrakeapp.com/kb/api-2/deploy-tracking\n\n## API\n\n### Airbreak.createClient(apiKey, [env])\n\nReturns a new Airbrake instance.\n\n### airbrake.key = null\n\nThe API key to use.\n\n### airbrake.env = process.env.NODE_ENV || 'development'\n\nThe name of the server environment this is running in.\n\n### airbrake.host = 'http://' + os.hostname()\n\nThe base url for errors. If `err.url` is not set, `airbrake.host` is used\ninstead. If `err.url` is a relative url starting with `'/'`, it is appended\nto `airbrake.host`. If `err.url` is an absolute url, `airbrake.host` is ignored.\n\n### airbrake.projectRoot = null\n\nThe root directory of this project.\n\n### airbrake.appVersion = null\n\nThe version of this app. Set to a semantic version number, or leave unset.\n\n### airbrake.protocol = 'http'\n\nThe protocol to use.\n\n### airbrake.timeout = 30 * 1000\n\nThe timeout after which to give up trying to notify airbrake in ms.\n\n### airbrake.handleExceptions()\n\nRegisters a `process.on('uncaughtException')` listener. When an uncaught\nexception occurs, the error is send to airbrake, and then re-thrown to\nkill the process.\n\n### airbrake.notify(err, [cb])\n\nSends the given `err` to airbrake.\n\nThe callback parameter receives two arguments, `err, url`. `err` is set if\nthe delivery to airbrake failed.\n\nIf no `cb` is given, and the delivery fails, an `error` event is emitted. If\nthere is no listener for this event, node will kill the process as well. This\nis done to avoid silent error delivery failure.\n\n### airbrake.trackDeployment([params, [cb]])\n\nNotifies airbrake about a deployment. `params` is an object with the following\noptions:\n\n* `env:` The environment being deployed, defaults to `airbrake.env`.\n* `user:` The user doing the deployment, defaults to `process.env.USER`.\n* `repo:` The github url of this repository. Defaults to `''`.\n* `rev:` The revision of this deployment. Defaults to `''`.\n\n## Alternative modules\n\nThis module is meant as a replacement for [hoptoad-notifier][], which does not\nsupport all features of the [2.1 API][2.1api].\n\n[hoptoad-notifier]: https://github.com/tristandunn/node-hoptoad-notifier\n\n## Contribute\n\nBesides bug fixes, I'd be happy to accept patches for:\n\n* Automatically parsing `repo` and `rev` from the local git repository when\n  calling `airbrake.trackDeployment()`. This can be done via `exec()`, but must\n  not be done when specifying `repo` / `rev` by hand, or if they are set to\n  `false`.\n\nIf you have other feature ideas, please open an issue first, so we can discuss\nit.\n\n## License\n\nairbrake is licensed under the MIT license.\n","maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.7":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.7","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"1.9.8","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"optionalDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"airbrake@0.2.7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18-pre","_defaultsLoaded":true,"dist":{"shasum":"5ec5418b27236b1052cda7affcfcc748d96be1d0","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.7.tgz"},"readme":"# airbrake\n\nNode.js client for [airbrakeapp.com][], formerly known as [hoptoadapp.com][].\n\n[airbrakeapp.com]: http://airbrakeapp.com/\n[hoptoadapp.com]: http://robots.thoughtbot.com/post/7665411707/hoptoad-is-now-airbrake\n\n## Install\n\n``` bash\nnpm install airbrake\n```\n\n## Basic usage\n\nThe common use case for this module is to catch all `'uncaughtException'`\nevents on the `process` object and send them to airbrake:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nairbrake.handleExceptions();\n\nthrow new Error('I am an uncaught exception');\n```\n\nPlease note that the above will re-throw the exception after it has been\nsuccessfully delivered to airbrake, caushing your process to exit with status 1.\n\nIf you want more control over the delivery of your errors, you can also\nmanually submit errors to airbrake.\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar err = new Error('Something went terribly wrong');\nairbrake.notify(err, function(err, url) {\n  if (err) throw err;\n\n  // Error has been delivered, url links to the error in airbrake\n});\n```\n\n## Screenshot\n\nThis screenshot shows an airbrake error send from this module:\n\n![screenshot](https://github.com/felixge/node-airbrake/raw/master/screenshot.png)\n\n## Features\n\n* Automatically add `process.env` as well as other information when sending notifications\n* Detect and fix circular references in error context information\n* Support for all features of the [2.1 notification API][2.1api]\n* Support for [long-stack-traces][]\n* Optional auto-handler for `uncaughtException` events\n* Provides notification url linking to airbrake in `notify()` callback\n* Timeout airbrake requests after 30 seconds, you never know\n\n[long-stack-traces]: https://github.com/tlrobinson/long-stack-traces\n\n[2.1api]: http://help.airbrake.io/kb/api-2/notifier-api-version-21\n\n## Adding context to errors\n\nThe `notify()` method automatically adds the following context information to\neach delivered error:\n\n* **error.class:** (`err.type` string if set, or `'Error'`)\n* **error.message:** (`err.message` string)\n* **error.backtrace:** (`err.stack` as parsed by [stack-trace][])\n* **request.url:** (`err.url`, see `airbrake.url`);\n* **request.component:** (`err.component` string if set);\n* **request.action:** (`err.action` string if set);\n* **request.cgi-data:** (`process.env`, merged all other properties of `err`)\n* **request.params:** (`err.params` object if set)\n* **request.session:** (`err.session` object if set)\n* **server-environment.project-root:** (`airbrake.projectRoot` string if set)\n* **server-environment.environment-name:** (`airbrake.env` string)\n* **server-environment.app-version:** (`airbrake.appVersion string if set)\n* **server-environment.hostname:** (`airbrake.hostname` string if set)\n\nYou can add additional context information by modifying the error properties\nlisted above:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar http = require('http');\n\nhttp.createServer(function(req, res) {\n  if (req.headers['X-Secret'] !== 'my secret') {\n    var err = new Error('403 - Permission denied');\n    req.writeHead(403);\n    req.end(err.message);\n\n    err.url = req.url;\n    err.params = {ip: req.socket.remoteAddress};\n    airbrake.notify(err);\n  }\n});\n```\n\nUnfortunately `uncaughtException` events cannot be traced back to particular\nrequests, so you should still try to handle errors where they occur.\n\n[stack-trace]: https://github.com/felixge/node-stack-trace\n\n## Removing context from errors\n\nIn some scenarios you might want to filter some context to never show up in\nAirbrake. For example you might have a private key loaded in your environment\nmemory, or your user has some critical data in his session, and you want to\nhide that.\n\nThis can be done by hooking into the `'vars'` event like so:\n\n``` javascript\nairbrake.on('vars', function(type, vars) {\n  if (type === 'cgi-data') {\n    delete vars.SECRET;\n  }\n});\n```\n\n## Tracking deployments\n\nThis client supports airbrake's [deployment tracking][]:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar deployment = {\n  rev: '98103a8fa850d5eaf3666e419d8a0a93e535b1b2',\n  repo: 'git@github.com:felixge/node-airbrake.git',\n};\n\nairbrake.trackDeployment(deployment, function(err, params) {\n  if (err) {\n    throw err;\n  }\n\n  console.log('Tracked deployment of %s to %s', params.rev, params.env);\n});\n```\n\nCheck out the `airbrake.trackDeployment()` API docs below for a list of all\noptions.\n\n[deployment tracking]: http://help.airbrake.io/kb/api-2/deploy-tracking\n\n## API\n\n### Airbreak.createClient(apiKey, [env])\n\nReturns a new Airbrake instance.\n\n### airbrake.key = null\n\nThe API key to use.\n\n### airbrake.env = process.env.NODE_ENV || 'development'\n\nThe name of the server environment this is running in.\n\n### airbrake.host = 'http://' + os.hostname()\n\nThe base url for errors. If `err.url` is not set, `airbrake.host` is used\ninstead. If `err.url` is a relative url starting with `'/'`, it is appended\nto `airbrake.host`. If `err.url` is an absolute url, `airbrake.host` is ignored.\n\n### airbrake.projectRoot = null\n\nThe root directory of this project.\n\n### airbrake.appVersion = null\n\nThe version of this app. Set to a semantic version number, or leave unset.\n\n### airbrake.protocol = 'http'\n\nThe protocol to use.\n\n### airbrake.timeout = 30 * 1000\n\nThe timeout after which to give up trying to notify airbrake in ms.\n\n### airbrake.handleExceptions()\n\nRegisters a `process.on('uncaughtException')` listener. When an uncaught\nexception occurs, the error is send to airbrake, and then re-thrown to\nkill the process.\n\n### airbrake.notify(err, [cb])\n\nSends the given `err` to airbrake.\n\nThe callback parameter receives two arguments, `err, url`. `err` is set if\nthe delivery to airbrake failed.\n\nIf no `cb` is given, and the delivery fails, an `error` event is emitted. If\nthere is no listener for this event, node will kill the process as well. This\nis done to avoid silent error delivery failure.\n\n### airbrake.trackDeployment([params, [cb]])\n\nNotifies airbrake about a deployment. `params` is an object with the following\noptions:\n\n* `env:` The environment being deployed, defaults to `airbrake.env`.\n* `user:` The user doing the deployment, defaults to `process.env.USER`.\n* `repo:` The github url of this repository. Defaults to `''`.\n* `rev:` The revision of this deployment. Defaults to `''`.\n\n## Alternative modules\n\nThis module is meant as a replacement for [hoptoad-notifier][], which does not\nsupport all features of the [2.1 API][2.1api].\n\n[hoptoad-notifier]: https://github.com/tristandunn/node-hoptoad-notifier\n\n## Contribute\n\nBesides bug fixes, I'd be happy to accept patches for:\n\n* Automatically parsing `repo` and `rev` from the local git repository when\n  calling `airbrake.trackDeployment()`. This can be done via `exec()`, but must\n  not be done when specifying `repo` / `rev` by hand, or if they are set to\n  `false`.\n\nIf you have other feature ideas, please open an issue first, so we can discuss\nit.\n\n## License\n\nairbrake is licensed under the MIT license.\n","maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.8":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.8","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"2.9.202","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"optionalDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"airbrake@0.2.8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18-pre","_defaultsLoaded":true,"dist":{"shasum":"fc757b68fcc659fb39605243ddc21de1d8be1d59","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.8.tgz"},"readme":"# airbrake\n\nNode.js client for [airbrakeapp.com][], formerly known as [hoptoadapp.com][].\n\n[airbrakeapp.com]: http://airbrakeapp.com/\n[hoptoadapp.com]: http://robots.thoughtbot.com/post/7665411707/hoptoad-is-now-airbrake\n\n## Install\n\n``` bash\nnpm install airbrake\n```\n\n## Basic usage\n\nThe common use case for this module is to catch all `'uncaughtException'`\nevents on the `process` object and send them to airbrake:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nairbrake.handleExceptions();\n\nthrow new Error('I am an uncaught exception');\n```\n\nPlease note that the above will re-throw the exception after it has been\nsuccessfully delivered to airbrake, caushing your process to exit with status 1.\n\nIf you want more control over the delivery of your errors, you can also\nmanually submit errors to airbrake.\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar err = new Error('Something went terribly wrong');\nairbrake.notify(err, function(err, url) {\n  if (err) throw err;\n\n  // Error has been delivered, url links to the error in airbrake\n});\n```\n\n## Screenshot\n\nThis screenshot shows an airbrake error send from this module:\n\n![screenshot](https://github.com/felixge/node-airbrake/raw/master/screenshot.png)\n\n## Features\n\n* Automatically add `process.env` as well as other information when sending notifications\n* Detect and fix circular references in error context information\n* Support for all features of the [2.1 notification API][2.1api]\n* Support for [long-stack-traces][]\n* Optional auto-handler for `uncaughtException` events\n* Provides notification url linking to airbrake in `notify()` callback\n* Timeout airbrake requests after 30 seconds, you never know\n\n[long-stack-traces]: https://github.com/tlrobinson/long-stack-traces\n\n[2.1api]: http://help.airbrake.io/kb/api-2/notifier-api-version-21\n\n## Adding context to errors\n\nThe `notify()` method automatically adds the following context information to\neach delivered error:\n\n* **error.class:** (`err.type` string if set, or `'Error'`)\n* **error.message:** (`err.message` string)\n* **error.backtrace:** (`err.stack` as parsed by [stack-trace][])\n* **request.url:** (`err.url`, see `airbrake.url`);\n* **request.component:** (`err.component` string if set);\n* **request.action:** (`err.action` string if set);\n* **request.cgi-data:** (`process.env`, merged all other properties of `err`)\n* **request.params:** (`err.params` object if set)\n* **request.session:** (`err.session` object if set)\n* **server-environment.project-root:** (`airbrake.projectRoot` string if set)\n* **server-environment.environment-name:** (`airbrake.env` string)\n* **server-environment.app-version:** (`airbrake.appVersion string if set)\n* **server-environment.hostname:** (`airbrake.hostname` string if set)\n\nYou can add additional context information by modifying the error properties\nlisted above:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar http = require('http');\n\nhttp.createServer(function(req, res) {\n  if (req.headers['X-Secret'] !== 'my secret') {\n    var err = new Error('403 - Permission denied');\n    req.writeHead(403);\n    req.end(err.message);\n\n    err.url = req.url;\n    err.params = {ip: req.socket.remoteAddress};\n    airbrake.notify(err);\n  }\n});\n```\n\nUnfortunately `uncaughtException` events cannot be traced back to particular\nrequests, so you should still try to handle errors where they occur.\n\n[stack-trace]: https://github.com/felixge/node-stack-trace\n\n## Removing context from errors\n\nIn some scenarios you might want to filter some context to never show up in\nAirbrake. For example you might have a private key loaded in your environment\nmemory, or your user has some critical data in his session, and you want to\nhide that.\n\nThis can be done by hooking into the `'vars'` event like so:\n\n``` javascript\nairbrake.on('vars', function(type, vars) {\n  if (type === 'cgi-data') {\n    delete vars.SECRET;\n  }\n});\n```\n\n## Tracking deployments\n\nThis client supports airbrake's [deployment tracking][]:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar deployment = {\n  rev: '98103a8fa850d5eaf3666e419d8a0a93e535b1b2',\n  repo: 'git@github.com:felixge/node-airbrake.git',\n};\n\nairbrake.trackDeployment(deployment, function(err, params) {\n  if (err) {\n    throw err;\n  }\n\n  console.log('Tracked deployment of %s to %s', params.rev, params.env);\n});\n```\n\nCheck out the `airbrake.trackDeployment()` API docs below for a list of all\noptions.\n\n[deployment tracking]: http://help.airbrake.io/kb/api-2/deploy-tracking\n\n## API\n\n### Airbreak.createClient(apiKey, [env])\n\nReturns a new Airbrake instance.\n\n### airbrake.key = null\n\nThe API key to use.\n\n### airbrake.env = process.env.NODE_ENV || 'development'\n\nThe name of the server environment this is running in.\n\n### airbrake.host = 'http://' + os.hostname()\n\nThe base url for errors. If `err.url` is not set, `airbrake.host` is used\ninstead. If `err.url` is a relative url starting with `'/'`, it is appended\nto `airbrake.host`. If `err.url` is an absolute url, `airbrake.host` is ignored.\n\n### airbrake.projectRoot = null\n\nThe root directory of this project.\n\n### airbrake.appVersion = null\n\nThe version of this app. Set to a semantic version number, or leave unset.\n\n### airbrake.protocol = 'http'\n\nThe protocol to use.\n\n### airbrake.timeout = 30 * 1000\n\nThe timeout after which to give up trying to notify airbrake in ms.\n\n### airbrake.handleExceptions()\n\nRegisters a `process.on('uncaughtException')` listener. When an uncaught\nexception occurs, the error is send to airbrake, and then re-thrown to\nkill the process.\n\n### airbrake.notify(err, [cb])\n\nSends the given `err` to airbrake.\n\nThe callback parameter receives two arguments, `err, url`. `err` is set if\nthe delivery to airbrake failed.\n\nIf no `cb` is given, and the delivery fails, an `error` event is emitted. If\nthere is no listener for this event, node will kill the process as well. This\nis done to avoid silent error delivery failure.\n\n### airbrake.trackDeployment([params, [cb]])\n\nNotifies airbrake about a deployment. `params` is an object with the following\noptions:\n\n* `env:` The environment being deployed, defaults to `airbrake.env`.\n* `user:` The user doing the deployment, defaults to `process.env.USER`.\n* `repo:` The github url of this repository. Defaults to `''`.\n* `rev:` The revision of this deployment. Defaults to `''`.\n\n## Alternative modules\n\nThis module is meant as a replacement for [hoptoad-notifier][], which does not\nsupport all features of the [2.1 API][2.1api].\n\n[hoptoad-notifier]: https://github.com/tristandunn/node-hoptoad-notifier\n\n## Contribute\n\nBesides bug fixes, I'd be happy to accept patches for:\n\n* Automatically parsing `repo` and `rev` from the local git repository when\n  calling `airbrake.trackDeployment()`. This can be done via `exec()`, but must\n  not be done when specifying `repo` / `rev` by hand, or if they are set to\n  `false`.\n\nIf you have other feature ideas, please open an issue first, so we can discuss\nit.\n\n## License\n\nairbrake is licensed under the MIT license.\n","maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"directories":{}},"0.2.9":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"airbrake","description":"Node.js client for airbrakeapp.com, formerly known as hoptoadapp.com.","version":"0.2.9","homepage":"https://github.com/felixge/node-airbrake","repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"request":"2.9.202","xmlbuilder":"0.1.5","stack-trace":"0.0.5","hashish":"0.0.4"},"devDependencies":{"sinon":"1.1.1","far":"0.0.4"},"optionalDependencies":{},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"airbrake@0.2.9","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"aaf05d3e7669889767183053eecacd50007f8bc3","tarball":"http://registry.npmjs.org/airbrake/-/airbrake-0.2.9.tgz"},"readme":"# airbrake\n\nNode.js client for [airbrakeapp.com][], formerly known as [hoptoadapp.com][].\n\n[airbrakeapp.com]: http://airbrakeapp.com/\n[hoptoadapp.com]: http://robots.thoughtbot.com/post/7665411707/hoptoad-is-now-airbrake\n\n## Install\n\n``` bash\nnpm install airbrake\n```\n\n## Basic usage\n\nThe common use case for this module is to catch all `'uncaughtException'`\nevents on the `process` object and send them to airbrake:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nairbrake.handleExceptions();\n\nthrow new Error('I am an uncaught exception');\n```\n\nPlease note that the above will re-throw the exception after it has been\nsuccessfully delivered to airbrake, caushing your process to exit with status 1.\n\nIf you want more control over the delivery of your errors, you can also\nmanually submit errors to airbrake.\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar err = new Error('Something went terribly wrong');\nairbrake.notify(err, function(err, url) {\n  if (err) throw err;\n\n  // Error has been delivered, url links to the error in airbrake\n});\n```\n\n## Screenshot\n\nThis screenshot shows an airbrake error send from this module:\n\n![screenshot](https://github.com/felixge/node-airbrake/raw/master/screenshot.png)\n\n## Features\n\n* Automatically add `process.env` as well as other information when sending notifications\n* Detect and fix circular references in error context information\n* Support for all features of the [2.1 notification API][2.1api]\n* Support for [long-stack-traces][]\n* Optional auto-handler for `uncaughtException` events\n* Provides notification url linking to airbrake in `notify()` callback\n* Timeout airbrake requests after 30 seconds, you never know\n\n[long-stack-traces]: https://github.com/tlrobinson/long-stack-traces\n\n[2.1api]: http://help.airbrake.io/kb/api-2/notifier-api-version-21\n\n## Adding context to errors\n\nThe `notify()` method automatically adds the following context information to\neach delivered error:\n\n* **error.class:** (`err.type` string if set, or `'Error'`)\n* **error.message:** (`err.message` string)\n* **error.backtrace:** (`err.stack` as parsed by [stack-trace][])\n* **request.url:** (`err.url`, see `airbrake.url`);\n* **request.component:** (`err.component` string if set);\n* **request.action:** (`err.action` string if set);\n* **request.cgi-data:** (`process.env`, merged all other properties of `err`)\n* **request.params:** (`err.params` object if set)\n* **request.session:** (`err.session` object if set)\n* **server-environment.project-root:** (`airbrake.projectRoot` string if set)\n* **server-environment.environment-name:** (`airbrake.env` string)\n* **server-environment.app-version:** (`airbrake.appVersion string if set)\n* **server-environment.hostname:** (`airbrake.hostname` string if set)\n\nYou can add additional context information by modifying the error properties\nlisted above:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar http = require('http');\n\nhttp.createServer(function(req, res) {\n  if (req.headers['X-Secret'] !== 'my secret') {\n    var err = new Error('403 - Permission denied');\n    req.writeHead(403);\n    req.end(err.message);\n\n    err.url = req.url;\n    err.params = {ip: req.socket.remoteAddress};\n    airbrake.notify(err);\n  }\n});\n```\n\nUnfortunately `uncaughtException` events cannot be traced back to particular\nrequests, so you should still try to handle errors where they occur.\n\n[stack-trace]: https://github.com/felixge/node-stack-trace\n\n## Removing context from errors\n\nIn some scenarios you might want to filter some context to never show up in\nAirbrake. For example you might have a private key loaded in your environment\nmemory, or your user has some critical data in his session, and you want to\nhide that.\n\nThis can be done by hooking into the `'vars'` event like so:\n\n``` javascript\nairbrake.on('vars', function(type, vars) {\n  if (type === 'cgi-data') {\n    delete vars.SECRET;\n  }\n});\n```\n\n## Tracking deployments\n\nThis client supports airbrake's [deployment tracking][]:\n\n``` javascript\nvar airbrake = require('airbrake').createClient(\"your api key\");\nvar deployment = {\n  rev: '98103a8fa850d5eaf3666e419d8a0a93e535b1b2',\n  repo: 'git@github.com:felixge/node-airbrake.git',\n};\n\nairbrake.trackDeployment(deployment, function(err, params) {\n  if (err) {\n    throw err;\n  }\n\n  console.log('Tracked deployment of %s to %s', params.rev, params.env);\n});\n```\n\nCheck out the `airbrake.trackDeployment()` API docs below for a list of all\noptions.\n\n[deployment tracking]: http://help.airbrake.io/kb/api-2/deploy-tracking\n\n## API\n\n### Airbreak.createClient(apiKey, [env])\n\nReturns a new Airbrake instance.\n\n### airbrake.key = null\n\nThe API key to use.\n\n### airbrake.env = process.env.NODE_ENV || 'development'\n\nThe name of the server environment this is running in.\n\n### airbrake.host = 'http://' + os.hostname()\n\nThe base url for errors. If `err.url` is not set, `airbrake.host` is used\ninstead. If `err.url` is a relative url starting with `'/'`, it is appended\nto `airbrake.host`. If `err.url` is an absolute url, `airbrake.host` is ignored.\n\n### airbrake.projectRoot = null\n\nThe root directory of this project.\n\n### airbrake.appVersion = null\n\nThe version of this app. Set to a semantic version number, or leave unset.\n\n### airbrake.protocol = 'http'\n\nThe protocol to use.\n\n### airbrake.developmentEnvironments = []\n\nDo not post to Airbrake when running in these environments.\n\n### airbrake.timeout = 30 * 1000\n\nThe timeout after which to give up trying to notify airbrake in ms.\n\n### airbrake.handleExceptions()\n\nRegisters a `process.on('uncaughtException')` listener. When an uncaught\nexception occurs, the error is send to airbrake, and then re-thrown to\nkill the process.\n\n### airbrake.notify(err, [cb])\n\nSends the given `err` to airbrake.\n\nThe callback parameter receives two arguments, `err, url`. `err` is set if\nthe delivery to airbrake failed.\n\nIf no `cb` is given, and the delivery fails, an `error` event is emitted. If\nthere is no listener for this event, node will kill the process as well. This\nis done to avoid silent error delivery failure.\n\n### airbrake.trackDeployment([params, [cb]])\n\nNotifies airbrake about a deployment. `params` is an object with the following\noptions:\n\n* `env:` The environment being deployed, defaults to `airbrake.env`.\n* `user:` The user doing the deployment, defaults to `process.env.USER`.\n* `repo:` The github url of this repository. Defaults to `''`.\n* `rev:` The revision of this deployment. Defaults to `''`.\n\n## Alternative modules\n\nThis module is meant as a replacement for [hoptoad-notifier][], which does not\nsupport all features of the [2.1 API][2.1api].\n\n[hoptoad-notifier]: https://github.com/tristandunn/node-hoptoad-notifier\n\n## Contribute\n\nBesides bug fixes, I'd be happy to accept patches for:\n\n* Automatically parsing `repo` and `rev` from the local git repository when\n  calling `airbrake.trackDeployment()`. This can be done via `exec()`, but must\n  not be done when specifying `repo` / `rev` by hand, or if they are set to\n  `false`.\n\nIf you have other feature ideas, please open an issue first, so we can discuss\nit.\n\n## License\n\nairbrake is licensed under the MIT license.\n","maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]}},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"time":{"modified":"2012-06-03T20:29:02.717Z","created":"2011-07-20T07:11:54.559Z","0.0.0":"2011-07-20T07:11:55.175Z","0.0.1":"2011-07-20T17:08:03.369Z","0.0.2":"2011-07-20T17:11:28.667Z","0.0.3":"2011-07-20T17:34:48.727Z","0.0.4":"2011-07-20T17:36:57.948Z","0.0.5":"2011-07-20T17:40:33.789Z","0.0.6":"2011-07-20T18:35:01.956Z","0.0.7":"2011-07-20T18:57:26.030Z","0.0.8":"2011-07-20T19:08:52.256Z","0.0.9":"2011-07-20T19:20:37.977Z","0.1.0":"2011-07-20T21:04:08.749Z","0.1.1":"2011-07-21T15:48:44.632Z","0.2.0":"2011-07-25T10:29:19.532Z","0.2.1":"2011-08-19T14:20:13.430Z","0.2.2":"2011-09-06T17:13:25.570Z","0.2.3":"2011-09-19T12:40:26.405Z","0.2.4":"2011-11-14T10:55:48.339Z","0.2.5":"2012-05-03T06:04:22.061Z","0.2.6":"2012-05-22T10:53:30.191Z","0.2.7":"2012-06-03T16:25:59.438Z","0.2.8":"2012-06-03T20:06:47.690Z","0.2.9":"2012-06-03T20:29:02.717Z"},"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"repository":{"type":"git","url":"git://github.com/felixge/node-airbrake.git"},"users":{"pgte":true},"_attachments":{"airbrake-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-tK9IXI+wh2EiBiiAccdy1Q==","length":65207,"stub":true},"airbrake-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-a+4tJZRjTAoIitsi9b7I8g==","length":64739,"stub":true},"airbrake-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-1s3CI0SMqw+95NnZdaUrFQ==","length":64737,"stub":true},"airbrake-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-ZwCeDsqDlKL8CXKTwkOq4Q==","length":64790,"stub":true},"airbrake-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-ftBM86Bgce3J+tQlX19RcQ==","length":136861,"stub":true},"airbrake-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Ub+fK0eTd1ATVnEkYswvBw==","length":143360,"stub":true},"airbrake-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-MgZv644xuSxk8EezFr77kQ==","length":133315,"stub":true},"airbrake-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-B1HN9D8U9AedYU3/hdq+OQ==","length":136407,"stub":true},"airbrake-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-t8p9XD7EUcJK3WlyrisvJA==","length":166576,"stub":true},"airbrake-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Dx+g77vfcojrtvCYDzSz5A==","length":165321,"stub":true},"airbrake-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-TXgibEepWpdKpfFXMeNY9g==","length":155402,"stub":true},"airbrake-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-n2+TepVqYR37SAh05XIkjw==","length":155193,"stub":true},"airbrake-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-f6m8k7k2v/dSfFa0eavI4Q==","length":155724,"stub":true},"airbrake-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-hwssTsbQs6uNPzrnNFyZYA==","length":151546,"stub":true},"airbrake-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-kZMXPu2RQ4GE6zE+3oQ/4Q==","length":150387,"stub":true},"airbrake-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-G3ZKQaIolDfuLMsDzYjvsA==","length":149379,"stub":true},"airbrake-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-lYpVOKDLA4iRFk2hSjTUfQ==","length":146093,"stub":true},"airbrake-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-d3bin522AJUrAKE8POOWYw==","length":145869,"stub":true},"airbrake-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-3wnBWLjlcj6My28hMhi+iQ==","length":145529,"stub":true},"airbrake-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-cJHsVHfOxQU2TPkPNSAcEQ==","length":86500,"stub":true},"airbrake-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-85x/a6vFEY+HqW6MdSDw6Q==","length":85057,"stub":true},"airbrake-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0PVJ9cGdEfR96DT6IbQVXA==","length":393,"stub":true}}}},
{"id":"airflow","key":"airflow","value":{"rev":"3-d0cef12b9ecb869d1227b59c39669e6d"},"doc":{"_id":"airflow","_rev":"3-d0cef12b9ecb869d1227b59c39669e6d","name":"airflow","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Jeffrey Zhao","email":"jeffz@live.com","url":"http://zhaojie.me/"},"homepage":"https://github.com/JeffreyZhao/airflow","bugs":{"url":"https://github.com/JeffreyZhao/airflow/issues","email":"jeffz@live.com"},"name":"airflow","version":"0.0.1","main":"airflow.js","_id":"airflow@0.0.1","dist":{"shasum":"981cdd56abf2c2a1cb745c504f2a4aa83c966859","tarball":"http://registry.npmjs.org/airflow/-/airflow-0.0.1.tgz"},"readme":"","maintainers":[{"name":"jeffz","email":"jeffz@live.com"}]}},"readme":"","maintainers":[{"name":"jeffz","email":"jeffz@live.com"}],"time":{"modified":"2012-08-09T10:29:29.706Z","created":"2012-08-09T10:29:25.158Z","0.0.1":"2012-08-09T10:29:29.706Z"},"author":{"name":"Jeffrey Zhao","email":"jeffz@live.com","url":"http://zhaojie.me/"},"_attachments":{"airflow-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CyOhjBxLX3D2Paybh6Kk4A==","length":2634,"stub":true}}}},
{"id":"airlogger","key":"airlogger","value":{"rev":"3-132af7faeb2a8967d3e048efe7174fe4"},"doc":{"_id":"airlogger","_rev":"3-132af7faeb2a8967d3e048efe7174fe4","name":"airlogger","description":"A simple remote console log viewer for iOS","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"airlogger","version":"0.0.1","description":"A simple remote console log viewer for iOS","author":{"name":"Sylvain Rebaud","email":"c0diq@yahoo.com"},"main":"./airlogger","licenses":[{"type":"MIT","url":"http://github.com/c0diq/airlogger.node.js/blob/master/LICENSE"}],"bugs":{"url":"http://github.com/c0diq/airlogger.node.js/issues"},"repository":{"type":"git","url":"git://github.com/c0diq/airlogger.node.js.git"},"dependencies":{"fanout":">=0.3.2","mdns":">=0.0.3"},"_npmUser":{"name":"c0diq","email":"c0diq@yahoo.com"},"_id":"airlogger@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dfb1d970e72f8eedd3fcf7884e240ef9b2d6b259","tarball":"http://registry.npmjs.org/airlogger/-/airlogger-0.0.1.tgz"},"maintainers":[{"name":"c0diq","email":"c0diq@yahoo.com"}]}},"maintainers":[{"name":"c0diq","email":"c0diq@yahoo.com"}],"time":{"modified":"2011-11-10T04:08:30.471Z","created":"2011-11-10T04:08:29.238Z","0.0.1":"2011-11-10T04:08:30.471Z"},"author":{"name":"Sylvain Rebaud","email":"c0diq@yahoo.com"},"repository":{"type":"git","url":"git://github.com/c0diq/airlogger.node.js.git"},"_attachments":{"airlogger-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-73nYWj5Vwq9jX08ZSizB3w==","length":10240,"stub":true}}}},
{"id":"airplay","key":"airplay","value":{"rev":"5-bbb75cd49e789d29424f7fc959f049bf"},"doc":{"_id":"airplay","_rev":"5-bbb75cd49e789d29424f7fc959f049bf","name":"airplay","description":"Apple AirPlay client library","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"airplay","description":"Apple AirPlay client library","version":"0.0.1","author":{"name":"Ben Vanik","email":"ben.vanik@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/benvanik/node-airplay.git"},"keywords":["apple","mac","media","airplay"],"directories":{"lib":"./lib/airplay"},"main":"./lib/airplay","dependencies":{"plist":"https://github.com/benvanik/node-plist/tarball/master","mdns":"https://github.com/benvanik/node_mdns/tarball/master"},"scripts":{},"engines":{"node":">= 0.5.x"},"devDependencies":{},"_npmUser":{"name":"benvanik","email":"ben.vanik@gmail.com"},"_id":"airplay@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"c37c69753a48bca4dec57605b2a2f60e5fa42218","tarball":"http://registry.npmjs.org/airplay/-/airplay-0.0.1.tgz"},"maintainers":[{"name":"benvanik","email":"ben.vanik@gmail.com"}]},"0.0.2":{"name":"airplay","description":"Apple AirPlay client library","version":"0.0.2","author":{"name":"Ben Vanik","email":"ben.vanik@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/benvanik/node-airplay.git"},"keywords":["apple","mac","media","airplay"],"directories":{"lib":"./lib/airplay"},"main":"./lib/airplay","dependencies":{"plist":">=0.2.1","mdns":"https://github.com/benvanik/node_mdns/tarball/master"},"scripts":{},"engines":{"node":">= 0.5.x"},"devDependencies":{},"_npmUser":{"name":"benvanik","email":"ben.vanik@gmail.com"},"_id":"airplay@0.0.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1a705256d3b1fd3b953c9ab258431a25f9a58323","tarball":"http://registry.npmjs.org/airplay/-/airplay-0.0.2.tgz"},"maintainers":[{"name":"benvanik","email":"ben.vanik@gmail.com"}]}},"readme":"node-airplay -- AirPlay client library for node.js\n====================================\n\nnode-airplay is a client library for Apple's\n[AirPlay](http://en.wikipedia.org/wiki/AirPlay) remote playback protocol.\nIt implements a simple AirPlay device browser using mdns and command interface.\n\nCurrently supported features:\n\n* AirPlay device discovery\n* Support for audio and video playback\n\nComing soon (maybe):\n\n* Photo playback\n* Robust error handling\n* Better device information formatting (supported features/etc)\n\n## Quickstart\n\n    npm install airplay\n    node\n    > var airplay = require('airplay');\n    > var browser = airplay.createBrowser();\n    > browser.on('deviceOnline', function(device) {\n        device.play('http://host/somevideo.mp4', 0, function(res) {\n          if (res) {\n            console.log('playing!');\n          } else {\n            console.log('unable to play!');\n          }\n        });\n      });\n    > browser.start();\n\n## Installation\n\nWith [npm](http://npmjs.org):\n\n    npm install airplay\n\nFrom source:\n\n    cd ~\n    git clone https://benvanik@github.com/benvanik/node-airplay.git\n    npm link node-airplay/\n\nnode-airplay depends on both node_mdns and node-plist. Unfortunately neither\nstored in the npm repo work correctly, and as such the package points to forks\nI have made. Hopefully this will be resolved soon.\n\n## API\n\n### Browser\n\nThe browser is a discovery service that can be run to automatically detect the\nAirPlay-compatiable devices on the local network(s). Try only to create one\nbrowser per node instance, and if it's no longer needed stop it.\n\nCreate a browser using the `createBrowser` method:\n\n    var browser = require('airplay').createBrowser();\n\nAttach to the browser events to track device discovery:\n\n    browser.on('deviceOnline', function(device) {\n      console.log('device online: ' + device.id);\n    });\n    browser.on('deviceOffline', function(device) {\n      console.log('device offline: ' + device.id);\n    });\n\nStart or stop the discovery process:\n\n    browser.start();\n    browser.stop();\n\nIf you are running a server you can use the built-in device list instead of\nmaintaining your own via the events:\n\n    function myHandler() {\n      var devices = browser.getDevices();\n      console.log(devices);\n    }\n\n### Device\n\nA device instance represents a single AirPlay device on the local network.\nDevices are created either through the discovery process or by direct\nconnection. Each device has only a single control channel, and all methods are\nasynchronous.\n\nObtain devices using the browser API:\n\n    // Get all ready devices\n    var allDevices = browser.getDevices();\n    // Grab a device to play with\n    var device = allDevices[0];\n\n*TODO* At some point, you'll be able to connect directly:\n\n    var device = require('airplay').connect('hostname', port);\n    device.on('ready', function() {\n      // Ready to accept commands\n    });\n\nIf you are done with the device, close the connection (note that this will stop\nany playback):\n\n    device.close();\n\nIssue various device control calls. All calls are asynchronous and have an\noptional callback that provides the result - for most, it's an empty object if\nthe call was successful and null if the call failed.\n\n    // Get the current playback status\n    device.getStatus(function(res) {\n      // res = {\n      //   duration: number, -- in seconds\n      //   position: number, -- in seconds\n      //   rate: number, -- 0 = paused, 1 = playing\n      //   ...\n      // }\n      // or, if nothing is playing, res = {}\n    });\n\n    // Play the given content (audio/video/etc)\n    var content = 'http://host/content.mp4';\n    var startPosition = 0; // in seconds\n    device.play(content, startPosition, function(res) {\n      if (res) {\n        // playing\n      } else {\n        // failed to start playback\n      }\n    });\n\n    // Stop playback and return to the main menu\n    device.stop();\n\n    // Seek to the given offset in the media (if seek is supported)\n    var position = 500; // in seconds\n    device.scrub(position);\n\n    // Reverse playback direction (rewind)\n    // NOTE: may not be supported\n    device.reverse();\n\n    // Change the playback rate\n    // NOTE: only 0 and 1 seek to be supported for most media types\n    var rate = 0; // 0 = pause, 1 = resume\n    device.rate(rate);\n\n    // Adjust playback volume\n    // NOTE: may not be supported\n    device.volume(value);\n","maintainers":[{"name":"benvanik","email":"ben.vanik@gmail.com"}],"time":{"modified":"2011-11-06T21:43:01.082Z","created":"2011-11-06T06:57:22.381Z","0.0.1":"2011-11-06T06:57:24.639Z","0.0.2":"2011-11-06T21:43:01.082Z"},"author":{"name":"Ben Vanik","email":"ben.vanik@gmail.com"},"repository":{"type":"git","url":"git://github.com/benvanik/node-airplay.git"},"_attachments":{"airplay-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2bEcqd3UvGBcoeg6bK7uqw==","length":10240,"stub":true},"airplay-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wUyZgS+IRgdjRixnNjwrng==","length":10240,"stub":true}}}},
{"id":"airport","key":"airport","value":{"rev":"39-dcb157fbf2c32785cc528bb37e42870e"},"doc":{"_id":"airport","_rev":"39-dcb157fbf2c32785cc528bb37e42870e","name":"airport","description":"role-based port management for upnode","dist-tags":{"latest":"0.4.2"},"versions":{"0.0.0":{"name":"airport","description":"role-based port management for upnode","version":"0.0.0","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"0.1.x","seaport":"0.3.x"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bc963d47dea83e8af1d124e5d6994659aefbb166","tarball":"http://registry.npmjs.org/airport/-/airport-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.1.0":{"name":"airport","description":"role-based port management for upnode","version":"0.1.0","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"0.1.x","seaport":"0.5.x"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a5a610367333085df3aef6613957e107b8eb5e1a","tarball":"http://registry.npmjs.org/airport/-/airport-0.1.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.1.1":{"name":"airport","description":"role-based port management for upnode","version":"0.1.1","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","seaport":"~0.6.3"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f0dd6601e3ef6b9d833dc52cf489e815087e199e","tarball":"http://registry.npmjs.org/airport/-/airport-0.1.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.0":{"name":"airport","description":"role-based port management for upnode","version":"0.2.0","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0"},"devDependencies":{"tap":"0.1.x","seaport":"~0.6.3"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9d69144739c279bec26c525de33f20d500c6bb65","tarball":"http://registry.npmjs.org/airport/-/airport-0.2.0.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.0":{"name":"airport","description":"role-based port management for upnode","version":"0.3.0","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","deck":"~0.0.4"},"devDependencies":{"tap":"0.1.x","seaport":"~0.6.3"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b57ea7210da7e6be3faa2d5775f779e1188833cc","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.0.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.1":{"name":"airport","description":"role-based port management for upnode","version":"0.3.1","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.6.4"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"1a492a06d58d0fb61dbe3e57a7b6a1c671309b9f","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.1.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.2":{"name":"airport","description":"role-based port management for upnode","version":"0.3.2","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.6.4"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"ae03f1cea45cd467a4d61e2f4740f206b574f7fa","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.2.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.3":{"name":"airport","description":"role-based port management for upnode","version":"0.3.3","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.6.4"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"7a46ed6cd8c882aefbe8720babc042c26c7385b2","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.3.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.4":{"name":"airport","description":"role-based port management for upnode","version":"0.3.4","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.6.4"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c61d69476a54ef9b283e12b2bb59ecdc7957f3c9","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.4.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.5":{"name":"airport","description":"role-based port management for upnode","version":"0.3.5","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"0.9.x","upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.6.4"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"819910bcbfa151fcce12747c009f4c965646422c","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.5.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.6":{"name":"airport","description":"role-based port management for upnode","version":"0.3.6","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.7.1"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"554b9a6625abbdc1fcf09be1c59e3f9a2ad2e1a5","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.6.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.7":{"name":"airport","description":"role-based port management for upnode","version":"0.3.7","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.7.1"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"756e6c298c758f189fcf21f934e70b9bb8df3335","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.7.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.8":{"name":"airport","description":"role-based port management for upnode","version":"0.3.8","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.7.1"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"53bff4560ad2c1e64839cb9c745c8ab661b606f5","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.8.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.9":{"name":"airport","description":"role-based port management for upnode","version":"0.3.9","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.2.0","deck":"~0.0.4","seaport":"~0.7.1"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d1423f419b718b9eb9efe797d084c056e7bb3607","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.9.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.10":{"name":"airport","description":"role-based port management for upnode","version":"0.3.10","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","port","allocate","hub","roles"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.2.3","deck":"~0.0.4","seaport":"~0.7.5"},"devDependencies":{"tap":"~0.2.5"},"engines":{"node":">=0.6.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"airport@0.3.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"ca3ceefeb12eb17931d1174e282881b5434b4661","tarball":"http://registry.npmjs.org/airport/-/airport-0.3.10.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.4.0":{"name":"airport","description":"role-based port management for upnode","version":"0.4.0","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","seaport","port"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.3.1","deck":"~0.0.4","seaport":"~0.8.0"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.6.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"readme":"","_id":"airport@0.4.0","dist":{"shasum":"5ec952e1218c2650f5a1baf762fa794323842ecc","tarball":"http://registry.npmjs.org/airport/-/airport-0.4.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.4.1":{"name":"airport","description":"role-based port management for upnode","version":"0.4.1","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","seaport","port"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.4.1","deck":"~0.0.4","seaport":"~0.8.0"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.6.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"readme":"","_id":"airport@0.4.1","dist":{"shasum":"2997f53aa760cacf8afde0b5188c7214529d0892","tarball":"http://registry.npmjs.org/airport/-/airport-0.4.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.4.2":{"name":"airport","description":"role-based port management for upnode","version":"0.4.2","repository":{"type":"git","url":"git://github.com/substack/airport.git"},"main":"index.js","keywords":["upnode","dnode","seaport","port"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"upnode":"~0.4.1","deck":"~0.0.4","seaport":"~0.8.0"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.6.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"readme":"","_id":"airport@0.4.2","dist":{"shasum":"7b19026c7cc85cee725faf96b2b44ef69ad70a15","tarball":"http://registry.npmjs.org/airport/-/airport-0.4.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"readme":null,"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-08-06T14:49:39.611Z","created":"2012-01-28T09:17:50.499Z","0.0.0":"2012-01-28T09:17:51.811Z","0.1.0":"2012-02-15T04:42:28.782Z","0.1.1":"2012-03-25T03:57:03.918Z","0.2.0":"2012-03-25T04:41:28.791Z","0.3.0":"2012-03-26T20:57:19.539Z","0.3.1":"2012-03-26T21:07:50.611Z","0.3.2":"2012-03-27T01:34:42.732Z","0.3.3":"2012-04-07T01:56:08.834Z","0.3.4":"2012-04-15T21:29:45.199Z","0.3.5":"2012-04-22T08:57:48.375Z","0.3.6":"2012-05-08T17:59:54.255Z","0.3.7":"2012-05-21T13:53:07.967Z","0.3.8":"2012-05-21T14:03:31.633Z","0.3.9":"2012-05-24T10:04:31.726Z","0.3.10":"2012-05-24T10:11:21.937Z","0.4.0":"2012-07-28T13:16:44.747Z","0.4.1":"2012-08-06T01:29:56.048Z","0.4.2":"2012-08-06T01:41:50.728Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/airport.git"},"users":{"fgribreau":true,"sjonnet19":true},"_attachments":{"airport-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-KwsoRy+4/hW+/qwLbah6kQ==","length":6768,"stub":true},"airport-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-CEpM0y/myYO+/NgYyR5KTA==","length":4669,"stub":true},"airport-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-YsK77nwbKzZbwomxdUOq1g==","length":4602,"stub":true},"airport-0.3.10.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-J7YUKhRKKVPw5PYeBuo5EQ==","length":4605,"stub":true},"airport-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-zyCcdUrEcDXYQoq+fvVbhQ==","length":4608,"stub":true},"airport-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-QlBU95Z64HJOqgG93CCVyQ==","length":4264,"stub":true},"airport-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-uCLu2sRsPmTGNNSIPYmweA==","length":4251,"stub":true},"airport-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-o7hN91VobJ2w5JogveorIw==","length":3700,"stub":true},"airport-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-I4XU/dkiRPeMBRC9ROrlcQ==","length":3783,"stub":true},"airport-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Pmapo0iorlkFi7bAtxBGuw==","length":3755,"stub":true},"airport-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-H8LoMv0iGZv/1IYShiXsOg==","length":3727,"stub":true},"airport-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-jNoXD7ushe/G+SgtpPLUfQ==","length":3645,"stub":true},"airport-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Nu+HkKNxML2C/hGR4s4vWg==","length":3642,"stub":true},"airport-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-7ERc+j5bPMZg+yQpz+t6EQ==","length":3488,"stub":true},"airport-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-blDNgak0OM4bo46uH4GQTA==","length":2912,"stub":true},"airport-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-NfWl5nIsnQtnzf8JxKriKw==","length":2063,"stub":true},"airport-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dXL5lv06Yus/mrf7c2DQhQ==","length":2055,"stub":true},"airport-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZPkC1SmKxdqEC0NoaUCUIg==","length":2073,"stub":true}}}},
{"id":"airship","key":"airship","value":{"rev":"5-7385f60317c13fd5febc25501a03e90d"},"doc":{"_id":"airship","_rev":"5-7385f60317c13fd5febc25501a03e90d","name":"airship","description":"A wrapper for the UrbanAirship API","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"airship","description":"A wrapper for the UrbanAirship API","author":{"name":"James F. Herdman","email":"james.herdman@me.com"},"version":"0.1.0","keywords":["urban airship","api","push messages","airship"],"repository":{"type":"git","url":"git://github.com/jherdman/airship.git"},"bugs":{"url":"https://github.com/jherdman/airship/issues"},"engines":{"node":"~0.6.10"},"dependencies":{},"devDependencies":{"mocha":"~0.12.0","should":"~0.5.1","nock":"git://github.com/jherdman/nock.git#issue-41"},"main":"index","scripts":{"prepublish":"npm prune","test":"make spec"},"_npmUser":{"name":"jfh","email":"james.herdman@me.com"},"_id":"airship@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"8ae00d6b0639579531a0fc508dc00ffb37603277","tarball":"http://registry.npmjs.org/airship/-/airship-0.1.0.tgz"},"maintainers":[{"name":"jfh","email":"james.herdman@me.com"}]},"0.1.1":{"name":"airship","description":"A wrapper for the UrbanAirship API","author":{"name":"James F. Herdman","email":"james.herdman@me.com"},"version":"0.1.1","keywords":["urban airship","api","push messages","airship"],"repository":{"type":"git","url":"git://github.com/jherdman/airship.git"},"bugs":{"url":"https://github.com/jherdman/airship/issues"},"engines":{"node":"~0.6.3"},"dependencies":{},"devDependencies":{"mocha":"~1.0.0","should":"~0.6.0","nock":"~0.11.2"},"main":"index","scripts":{"prepublish":"npm prune && ./scripts/prepublish.js","test":"make spec"},"_npmUser":{"name":"jfh","email":"james.herdman@me.com"},"_id":"airship@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"cc4dc1837349fffe21254b8ac49e4a947167d2c8","tarball":"http://registry.npmjs.org/airship/-/airship-0.1.1.tgz"},"maintainers":[{"name":"jfh","email":"james.herdman@me.com"}]}},"readme":"# airship [![Build Status](https://secure.travis-ci.org/jherdman/airship.png)](http://travis-ci.org/jherdman/airship)\n\nA wrapper for the Urban Airship API. It's largely an experiment of mine to learn more about event-based programming in Node.js.\n\n# Usage\n\nPlease see examples in the `integration` directory for usage. Given that this is such an early release, I'm very open to suggestion on how to evolve the API of this library.\n\n# License\n\n## MIT License\n\nCopyright (c) 2012 James F. Herdman\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"jfh","email":"james.herdman@me.com"}],"time":{"modified":"2012-03-25T22:57:57.500Z","created":"2012-02-29T23:47:06.075Z","0.1.0":"2012-02-29T23:47:07.041Z","0.1.1":"2012-03-25T22:57:57.500Z"},"author":{"name":"James F. Herdman","email":"james.herdman@me.com"},"repository":{"type":"git","url":"git://github.com/jherdman/airship.git"},"_attachments":{"airship-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Jo3lO764Ru9pDTG3z1dbKw==","length":5618,"stub":true},"airship-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ov02Ea9VgWEdC0BxGp5nfA==","length":5319,"stub":true}}}},
{"id":"airtunes","key":"airtunes","value":{"rev":"25-58f15c0e5e46c0ee0fcb396bf70ca855"},"doc":{"_id":"airtunes","_rev":"25-58f15c0e5e46c0ee0fcb396bf70ca855","name":"airtunes","description":"an AirTunes v2 implementation: stream wirelessly to audio devices.","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"airtunes","description":"an AirTunes v2 implementation: stream wirelessly to audio devices.","keywords":["airtunes","airplay","raop","coreaudio","sound"],"version":"0.1.0","author":{"name":"Laurent Perrin"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/radioline/node-airtunes.git"},"licenses":[{"type":"BSD"}],"dependencies":{"async":"0.1.18"},"bugs":{"url":"https://github.com/radioline/node-airtunes/issues"},"_npmUser":{"name":"Radioline","email":"tech@radioline.fr"},"_id":"airtunes@0.1.0","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3bf94a6daf1073d11c92a256eb8fc74683a64732","tarball":"http://registry.npmjs.org/airtunes/-/airtunes-0.1.0.tgz"},"maintainers":[{"name":"Radioline","email":"tech@radioline.fr"}],"directories":{}},"0.1.1":{"name":"airtunes","description":"an AirTunes v2 implementation: stream wirelessly to audio devices.","keywords":["airtunes","airplay","raop","coreaudio","sound"],"version":"0.1.1","author":{"name":"Laurent Perrin"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/radioline/node_airtunes.git"},"licenses":[{"type":"BSD"}],"dependencies":{"async":"0.1.18"},"bugs":{"url":"https://github.com/radioline/node_airtunes/issues"},"_npmUser":{"name":"Radioline","email":"tech@radioline.fr"},"_id":"airtunes@0.1.1","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"fe7110b832ca1ff6fa092af8da715380c760a7ab","tarball":"http://registry.npmjs.org/airtunes/-/airtunes-0.1.1.tgz"},"maintainers":[{"name":"Radioline","email":"tech@radioline.fr"}]},"0.1.2":{"name":"airtunes","description":"an AirTunes v2 implementation: stream wirelessly to audio devices.","keywords":["airtunes","airplay","raop","coreaudio","sound"],"version":"0.1.2","author":{"name":"Laurent Perrin"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/radioline/node_airtunes.git"},"licenses":[{"type":"BSD"}],"dependencies":{"async":"0.1.18"},"bugs":{"url":"https://github.com/radioline/node_airtunes/issues"},"_npmUser":{"name":"Radioline","email":"tech@radioline.fr"},"_id":"airtunes@0.1.2","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"8c8369c022f93c7afced9450463ee7749428b062","tarball":"http://registry.npmjs.org/airtunes/-/airtunes-0.1.2.tgz"},"maintainers":[{"name":"Radioline","email":"tech@radioline.fr"}]},"0.1.3":{"name":"airtunes","description":"an AirTunes v2 implementation: stream wirelessly to audio devices.","keywords":["airtunes","airplay","raop","coreaudio","sound","audio"],"version":"0.1.3","author":{"name":"Laurent Perrin","email":"laurent.perrin@gmail.com"},"main":"./lib/index.js","repository":{"type":"git","url":"https://github.com/radioline/node_airtunes.git"},"licenses":[{"type":"BSD"}],"dependencies":{"async":"0.1.18"},"bugs":{"url":"https://github.com/radioline/node_airtunes/issues"},"scripts":{"install":"node-gyp rebuild"},"gypfile":true,"readme":"node-airtunes - a node.js implementation of AirTunes v2\n=======================================================\n\nI'm in a hurry\n--------------\n\nInstallation\n\n<pre>\n  npm install airtunes\n</pre>\n\nThe example folder contains several test scripts:\n\n* `cat sample.pcm | node play_stdin.js --host yourhost` will stream PCM data passed by stdin.\n* `play_ffmpeg.js` harnesses ffmpeg to stream from local audio files or remote URLs.\n* `scan_airtunes.js` will list nearby AirTunes devices (OS X only).\n\nWhat is AirTunes ?\n------------------\n\n[AirTunes](http://en.wikipedia.org/wiki/AirTunes$) is a proprietary audio streaming protocol developed by Apple Inc. It allows wireless streaming of audio between devices. It is used today as the audio-streaming portion of AirPlay.\n\nAirTunes, AirPlay, RAOP ?\n-------------------------\n\nWhen AirTunes was introduced in 2004, its underlying protocol was called [RAOP](http://en.wikipedia.org/wiki/RAOP). It was based on RTSP/RTP and used a TCP transport. It was reverse-engineered in 2004 by Jon Lech Johansen, which opened the way to projects like [Shairport](https://github.com/albertz/shairport).\n\nRAOP didn't support synchronisation between separate streams so AirTunes underwent a major revision in 2011 to include advanced timing features. Its name was also changed to AirPlay. AirTunes v2 still uses RTSP/RTP but now uses a UDP transport.\n\nMost of the available open projects implement AirTunes v1. This is a problem because newer devices tend to drop support for this protocol.\n\nOK, now what is node-airtunes ?\n-------------------------------\n\nNode-airtunes is a node.js implementation of AirTunes v2. It supports synchronized audio output to any number of\nAirTunes receivers (like Apple's AirPort Express or AirFoil Speakers).\n\nWhat about Core Audio ?\n-----------------------\n\nCore Audio is the name Apple gives to iOS/OS X low-level sound API. node-airtunes has bindings to Core Audio to allow synchronized local and remote playback (local sync is not perfect yet). Obviously, this will only work on OS X.\n\nCredits\n-------\n\n- [The Airtunes 2 Team](http://git.zx2c4.com/Airtunes2/about/)\n- Cl&eacute;ment Vasseur for [Air Speaker](https://github.com/nto/AirSpeaker)\n- [Rogue Amoeba Software, LLC](http://www.rogueamoeba.com/) for AirFoil\n- Julien Blache for this [blog post](http://blog.technologeek.org/airtunes-v2)\n- Apple Inc and [Apple Lossless Audio Codec](http://alac.macosforge.org/)\n\nUsage\n-----\n\n### Playback\n\n`airtunes` is a writable stream which accepts 16 bits, little-endian, stereo PCM data.\n\n```javascript\nvar airtunes = require('airtunes');\nmyPCMStream.pipe(airtunes);\n```\n\nThere is an internal circular buffer which allows to stream from a network source. The stream will ouput audio at the correct pace and  will pause/resume accordingly. `airtunes` emits 'buffer' events to help you monitor the buffer:\n\n* `'buffering'`: Silence is being played while the buffer fills with data.\n* `'playing'`: Real sound is being streamed to devices.\n* `'end'`: The buffer was closed by the input stream. Attempting to write more data will raise an exception.\n\nAfter an `end` event, you should close all devices with `airtunes.stopAll()` 2s later (AirTunes devices usually have a 2s delay). If you want to pipe several successive streams to airtunes, just pass `{end: false}` to `stream.pipe`.\n\n### AirTunes Devices\n\nYou can add devices at any time: sound will be synchronized between all devices. The second parameter is optional:\n\n```javascript\nvar device = airtunes.add(host, {\n  port: 5000,\n  volume: 100,\n  password: 'mypassword'\n});\n```\n\n* `host` and `port` are the location of the AirTunes device as reported by Zeroconf. The default port is 5000.\n* `volume` is the initial volume, which must be between 0 and 100. The default volume is 50.\n* AirTunes makes it possible to protect devices with a `password`, which is of course optional. Bonjour indicates if the device demands a password.\n\nAirTunes devices emit `'status'` events:\n\n* `'ready'`: The device connected and ready to stream.\n* `'stopped'`: The device was stopped and has been removed from the pool.\n\nThey also emit `'error'` events. After an error, a device will no longer emit any events.\n\n* `'timeout'`: The device did not reply within `'config.rtsp_timeout'`.\n* `'connection_refused'`: The device refused the connection on the given port.\n* `'busy'`: Another application is already streaming to this device.\n* `'disconnected'`: The device closed the connection. This usually happens at the user's request.\n* `'need_password'`: The device demands a password, but none was passed.\n* `'bad_password'`: The device refused the given password.\n* `'udp_ports'`: Could not bind UDP ports (these are required by AirPort v2).\n* `'rtsp_socket'`: Another unhandled RTSP error.\n\nYou can stop a device with:\n\n```javascript\ndevice.stop(function() {\n  // device was stopped\n});\n```\n\nYou can stop everything with:\n\n```javascript\nairtunes.stopAll(function() {\n  // everything stopped\n});\n```\n\n### Volume\n\nVolume must be between 0 and 100.\n\n```\ndevice.setVolume(volume);\n```\n\nSupport\n-------\n\nNode-airtunes was tested on the following devices:\n\n* AirPort Express\n* AirFoil Speakers\n* Air Speaker\n* Freebox Server\n* Apple TV\n* Zeppelin Air\n\nPing me to add more devices to this list.\n\nKnown Issues\n------------\n\nWhile synchronization works nicely with AirTunes devices, there are sometimes problems with Core Audio.\n\nLicense\n-------\n\nnode-airtunes is available under the BSD license.\n\nHow does it work ?\n------------------\n\nIf you want detailed information about AirTunes v2, you should read the excellent documentation written by the [Airtunes 2 Team](http://git.zx2c4.com/Airtunes2/about/). I'm including theses short explanations for those not familiar with audio streaming in general.\n\nWhile being promoted as a proprietary protocol, AirTunes is really built on several existing protocols (RTSP, RTP and NTP) with several quirks. Not reinventing the wheel is a good thing.\n\n### RTSP Handshake\n\nAirTunes starts with an RTSP negociation. it is an HTTP-like protocol. The major difference being that it uses different verbs. Several successive requests are made to exchange parameters tneeded later. The `'status' = 'ready'` event is emitted when this handshake successfully completes.\n\nWe follow this sequence:\n\n* `OPTIONS`: Apple added a proprietary `'Apple-Challenge'` header so that iTunes can check if the receiving device is legit. We do send the header, but we don't check the challenge response.\n* `ANNOUNCE`: Among other things, we send an AES key and an IV (injection vector). The AES key is encrypted with a public RSA key shared by all AirTunes device. It is used to encrypt the audio packets. For simplicity's sake, we always use the same key/IV.\n* `SETUP`: We send UDP ports for control and timing. These ports are chosen before the handshake starts. The device replies with ports of its own.\n* `RECORD`: During record, we send the initial sequence and RTP time. These values allow devices to synchronize themselves.\n* `SET_PARAMETER`: Used to change the volume.\n* `TEARDOWN`: Used to terminate the connection. The stop callback is called when the device replies to this query.\n\nThe RTSP socket stays open during the whole audio session. Since everything else is tranferred with UDP, closing this socket is the easiest way of letting the other peer know that the session is finished.\n\n### UDP Ports\n\nAirTunes v2 uses [RTP](http://en.wikipedia.org/wiki/Real-time_Transport_Protocol), which needs several UDP ports to transmit information. The ports are exchanged during the `SETUP` query.\n\nOn the client (us):\n\n* Control: Used to send synchronization events and to receive information about resend packets.\n* Timing: Devices send queries to this port to synchronize their clocks with the client. The format follows [NTP](http://en.wikipedia.org/wiki/Network_Time_Protocol).\n\nOn the device:\n\n* Control: every second, the client sends a synchronization message to all devices. This message contains the current time and says: \"you should be playing the packet with this timestamp right now\".\n* Timing: the port where we send timing replies.\n* Audio: Where we send the audio stream.\n\nEach port has a preferred value (starting from UDP/6002). Since ports can be used by other applications, we test increasing port numbers until we can bind both the control and the timing sockets. The sockets are bound only when there are active AirTunes devices.\n\n### Audio Streaming\n\nThe stream is first split in chunks by the circular buffer, each chunk containing exactly 352 frames. A PCM frame is just a single sample. We have 16 bits and 2 channels, so this translates into 4 bytes (chunks are 1408 bytes long).\n\nIt is then compressed with [Apple Lossless](http://fr.wikipedia.org/wiki/Apple_Lossless), which was made public by Apple. The ALAC packet is then encrypted with AES. The key is chosen by the client and sent to devices during the `ANNOUNCE` query. We use native code to compress and encrypt packets. A gotcha: AES works by encrypting 16-byte chunks and the remaining bytes are not encrypted.\n\nSince we have no congestion control (UDP, remember), packets must be sent at the right time. There are 44,100 frames per second, so we need to send around 125 packets per second. Ideally, we should send a packet every 7-8 ms, but node.js's timing is not reliable at this precision. To make it work, we trigger a timeout every `config.stream_latency` ms. At each iteration, we compute the sequence number of the packet that we should be sending right now and we catch-up by sending in a burst all the packets that should have been sent since the last iteration. A higher latency reduces the CPU usage, but results in larger UDP bursts.\n\n","_id":"airtunes@0.1.3","dist":{"shasum":"3c176915691ccc30963a668a8fb5ced8444dd0e3","tarball":"http://registry.npmjs.org/airtunes/-/airtunes-0.1.3.tgz"},"maintainers":[{"name":"Radioline","email":"tech@radioline.fr"}]}},"readme":"node-airtunes - a node.js implementation of AirTunes v2\n=======================================================\n\nI'm in a hurry\n--------------\n\nInstallation\n\n<pre>\n  npm install airtunes\n</pre>\n\nThe example folder contains several test scripts:\n\n* `cat sample.pcm | node play_stdin.js --host yourhost` will stream PCM data passed by stdin.\n* `play_ffmpeg.js` harnesses ffmpeg to stream from local audio files or remote URLs.\n* `scan_airtunes.js` will list nearby AirTunes devices (OS X only).\n\nWhat is AirTunes ?\n------------------\n\n[AirTunes](http://en.wikipedia.org/wiki/AirTunes$) is a proprietary audio streaming protocol developed by Apple Inc. It allows wireless streaming of audio between devices. It is used today as the audio-streaming portion of AirPlay.\n\nAirTunes, AirPlay, RAOP ?\n-------------------------\n\nWhen AirTunes was introduced in 2004, its underlying protocol was called [RAOP](http://en.wikipedia.org/wiki/RAOP). It was based on RTSP/RTP and used a TCP transport. It was reverse-engineered in 2004 by Jon Lech Johansen, which opened the way to projects like [Shairport](https://github.com/albertz/shairport).\n\nRAOP didn't support synchronisation between separate streams so AirTunes underwent a major revision in 2011 to include advanced timing features. Its name was also changed to AirPlay. AirTunes v2 still uses RTSP/RTP but now uses a UDP transport.\n\nMost of the available open projects implement AirTunes v1. This is a problem because newer devices tend to drop support for this protocol.\n\nOK, now what is node-airtunes ?\n-------------------------------\n\nNode-airtunes is a node.js implementation of AirTunes v2. It supports synchronized audio output to any number of\nAirTunes receivers (like Apple's AirPort Express or AirFoil Speakers). It also allows synchronized local playback with CoreAudio (OS X only).\n\nCredits\n-------\n\n- [The Airtunes 2 Team](http://git.zx2c4.com/Airtunes2/about/)\n- Cl&eacute;ment Vasseur for [Air Speaker](https://github.com/nto/AirSpeaker)\n- [Rogue Amoeba Software, LLC](http://www.rogueamoeba.com/) for AirFoil\n- Apple Inc and [Apple Lossless Audio Codec](http://alac.macosforge.org/)\n\nUsage\n-----\n\n### Playback\n\n`airtunes` is a writable stream which accepts 16 bits, little-endian, stereo PCM data.\n\n```javascript\nvar airtunes = require('airtunes');\nmyPCMStream.pipe(airtunes);\n```\n\nThere is an internal circular buffer which allows to stream from a network source. The stream will ouput audio at the correct pace and  will pause/resume accordingly. `airtunes` emits 'buffer' events to help you monitor the buffer:\n\n* `'buffering'`: Silence is being played while the buffer fills with data.\n* `'playing'`: Real sound is being streamed to devices.\n* `'end'`: The buffer was closed by the input stream. Attempting to write more data will raise an exception.\n\nAfter an `end` event, you should close all devices with `airtunes.stopAll()` after 2s (AirTunes devices usually have a 2s delay). If you want to pipe several successive streams to airtunes, you must pass `{end: false}` to `stream.pipe`.\n\n### AirTunes Devices\n\nYou can add devices at any time: sound will be synchronized between all devices. The second parameter is optional:\n\n```javascript\nvar device = airtunes.add(host, {\n  port: 5000,\n  volume: 100,\n  password: 'mypassword'\n});\n```\n\n* `host` and `port` are the location of the AirTunes device as reported by Zeroconf. The default port is 5000.\n* `volume` is the initial volume, which must be between 0 and 100. The default volume is 50.\n* AirTunes makes it possible to protect devices with a `password`, which is of course optional. Bonjour indicates if the device demands a password.\n\nAirTunes devices emit `'status'` events:\n\n* `'ready'`: The device connected and ready to stream.\n* `'stopped'`: The device was stopped and has been removed from the pool.\n\nThey also emit `'error'` events. After an error, a device will no longer emit any events.\n\n* `'timeout'`: The device did not reply within `'config.rtsp\\_timeout'`.\n* `'connection\\_refused'`: The device refused the connection on the given port.\n* `'busy'`: Another application is already streaming to this device.\n* `'disconnected'`: The device closed the connection. This usually happens at the user's request.\n* `'need\\_password'`: The device demands a password, but none was passed.\n* `'bad\\_password'`: The device refused the given password.\n* `'udp\\_ports'`: Could not bind UDP ports (these are required by AirPort v2).\n* `'rtsp\\_socket'`: Another unhandled RTSP error.\n\nYou can stop a device with:\n\n```javascript\ndevice.stop(function() {\n  // device was stopped\n});\n```\n\nYou can stop everything with:\n\n```javascript\nairtunes.stopAll(function() {\n  // everything stopped\n});\n```\n\n### Volume\n\nVolume must be between 0 and 100.\n\n```\ndevice.setVolume(volume);\n```\n\nSupport\n-------\n\nNode-airtunes was tested on the following devices:\n\n* AirPort Express\n* AirFoil Speakers\n* Air Speaker\n* Freebox Server\n\nPing me to add more devices to this list.\n\nKnown Issues\n------------\n\nWhile synchronization works nicely with AirTunes devices, there are sometimes problems with Core Audio.\n\nHow does it work ?\n------------------\n\nIf you want detailed information about AirTunes v2, you should read the excellent documentation written by the [Airtunes 2 Team](http://git.zx2c4.com/Airtunes2/about/). I'm including this short explanations for those not familiar with audio streaming in general.\n\nWhile being promoted as a proprietary protocol, AirTunes is really built on several existing protocols (RTSP, RTP and NTP) with a several quirks. Not reinventing the wheel is a good thing.\n\n### RTSP Handshake\n\nAirTunes starts with an RTSP negociation. it is an HTTP-like protocol. The major difference being that it uses different verbs. Several successive requests are made to exchange parameters tneeded later. The `'status' = 'ready'` event is emitted when this handshake successfully completes.\n\nIn our case, we follow this sequence:\n\n* `OPTIONS`: Apple added a proprietary 'Apple-Challenge' header so that iTunes can check if the receiving device is legit. We do send the header, but we don't check the challenge response.\n* `ANNOUNCE`: Among other things, we send an AES key and an IV (injection vector). The AES key is encrypted with a public RSA key shared by all AirTunes device. It is used to encrypt the audio packets. For simplicity's sake, we always use the same key/IV.\n* `SETUP`: We send UDP ports for control and timing. These ports are chosen before the handshake starts. The device replies with ports of its own.\n* `RECORD`: During record, we send the initial sequence and RTP time. These values allow devices to synchronize themselves.\n* `SET\\_PARAMETER`: Used to change the volume.\n* `TEARDOWN`: Used to terminate the connection. The stop callback is called when the device replies to this query.\n\nThe RTSP socket stays open during the whole audio session. Since everything else is tranferred with UDP, closing this socket is the easiest way of letting the other peer know that the session is finished.\n\n### UDP Ports\n\nAirTunes v2 uses [RTP](http://en.wikipedia.org/wiki/Real-time_Transport_Protocol), which needs several UDP ports to transmit information. The ports are exchanged during the `SETUP` query.\n\nOn the client (us):\n\n* Control: Used to send synchronization events and to receive information about resend packets.\n* Timing: Devices send queries to this port to synchronize their clocks with the client. The format follows [NTP](http://en.wikipedia.org/wiki/Network_Time_Protocol).\n\nOn the device:\n\n* Control: every second, the client sends a synchronization message to all devices. This message contains the current time and says: \"you should be playing the packet with this timestamp right now\".\n* Timing: the port where we send timing replies.\n* Audio: Where we send the audio stream.\n\nEach port has a preferred value (starting from UDP/6002). Since ports can be used by other applications, we test increasing port numbers until we can bind both the control and the timing sockets. The sockets are bound only when there are active AirTunes devices.\n\n### Audio Streaming\n\nThe stream is first split in chunks by the circular buffer, each chunk containing exactly 352 frames. A PCM frame is just a single sample. We have 16 bits and 2 channels, so this translates into 4 bytes (chunks are 1408 bytes long).\n\nIt is then compressed with [Apple Lossless](http://fr.wikipedia.org/wiki/Apple_Lossless), which was made public by Apple. The ALAC packet is then encrypted with AES. The key is chosen by the client and sent to devices during the `ANNOUNCE` query. We use native code to compress and encrypt packets. A gotcha: AES works by encrypting 16-byte chunks and the remaining bytes are not encrypted.\n\nSince we have no congestion control (UDP, remember), packets must be sent at the right time. There are 44,100 frames per second, so we need to send around 125 packets per second. Ideally, we should send a packet every 7-8 ms, but node.js's timing is not reliable at this precision. To make it work, we trigger a timeout every `config.stream\\_latency` ms. At each iteration, we compute the sequence number of the packet that we should be sending right now and we catch-up by sending in a burst all the packets that should have been sent since the last iteration. A higher latency reduces the CPU usage, but results in larger UDP bursts.\n\n","maintainers":[{"name":"Radioline","email":"tech@radioline.fr"}],"time":{"modified":"2012-07-20T11:04:10.900Z","created":"2012-03-19T14:42:03.957Z","0.1.0":"2012-03-19T14:42:05.670Z","0.1.1":"2012-03-19T15:59:42.529Z","0.1.2":"2012-03-21T22:00:56.111Z","0.1.3":"2012-07-20T11:04:10.900Z"},"author":{"name":"Laurent Perrin","email":"laurent.perrin@gmail.com"},"repository":{"type":"git","url":"https://github.com/radioline/node_airtunes.git"},"_attachments":{"airtunes-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-PKMDu1/30mVzCI/6G7oAKg==","length":591625,"stub":true},"airtunes-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-OuLbtVp+z/urmxCN7CBvgg==","length":422711,"stub":true},"airtunes-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-oQSKaKNxBqtOLng5p2F/aw==","length":425215,"stub":true},"airtunes-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ghT2vs3Z7IbIFBaG2lyMFg==","length":411512,"stub":true}}}},
{"id":"ajaj","key":"ajaj","value":{"rev":"13-8d1bfaf767b5011c2d5201938eab1929"},"doc":{"_id":"ajaj","_rev":"13-8d1bfaf767b5011c2d5201938eab1929","name":"ajaj","description":"Basic JSON-based AJAX helper","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"ajaj","version":"0.0.1","description":"Basic JSON-based AJAX helper","keywords":["ender","ajax","json"],"author":{"name":"Andrew McCollum","email":"amccollum@gmail.com"},"url":"http://github.com/amccollum/ajaj","repositories":[{"type":"git","url":"https://github.com/amccollum/ajaj.git"}],"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"ender":"lib/ender.js","directories":{"lib":"lib"},"dependencies":{"reqwest":"*"},"devDependencies":{"coffee-script":"*"},"_npmUser":{"name":"amccollum","email":"amccollum+npm@gmail.com"},"_id":"ajaj@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0e4e8a7ea48480ea01b41726a4eda107f8beb288","tarball":"http://registry.npmjs.org/ajaj/-/ajaj-0.0.1.tgz"},"maintainers":[{"name":"amccollum","email":"amccollum+npm@gmail.com"}]},"0.0.2":{"name":"ajaj","version":"0.0.2","description":"Basic JSON-based AJAX helper","keywords":["ender","ajax","json"],"author":{"name":"Andrew McCollum","email":"amccollum@gmail.com"},"url":"http://github.com/amccollum/ajaj","repositories":[{"type":"git","url":"https://github.com/amccollum/ajaj.git"}],"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"main":"lib/index.js","ender":"lib/ender.js","directories":{"lib":"lib"},"dependencies":{"reqwest":"*"},"devDependencies":{"coffee-script":"*"},"_npmUser":{"name":"amccollum","email":"amccollum+npm@gmail.com"},"_id":"ajaj@0.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"11df985b3f6f101105ff6c95f6c877a653b5c7ff","tarball":"http://registry.npmjs.org/ajaj/-/ajaj-0.0.2.tgz"},"maintainers":[{"name":"amccollum","email":"amccollum+npm@gmail.com"}]},"0.0.3":{"name":"ajaj","version":"0.0.3","description":"Basic JSON-based AJAX helper","keywords":["ender","ajax","json"],"author":{"name":"Andrew McCollum","email":"amccollum@gmail.com"},"url":"http://github.com/amccollum/ajaj","repositories":[{"type":"git","url":"https://github.com/amccollum/ajaj.git"}],"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"main":"lib/index.js","ender":"lib/ender.js","directories":{"lib":"lib"},"dependencies":{"reqwest":"*"},"devDependencies":{"coffee-script":"*"},"_npmUser":{"name":"amccollum","email":"amccollum+npm@gmail.com"},"_id":"ajaj@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6ea033ec3d83d8e303e04e22febc8a7800a91acc","tarball":"http://registry.npmjs.org/ajaj/-/ajaj-0.0.3.tgz"},"maintainers":[{"name":"amccollum","email":"amccollum+npm@gmail.com"}]},"0.0.4":{"name":"ajaj","version":"0.0.4","description":"Basic JSON-based AJAX helper","keywords":["ender","ajax","json"],"author":{"name":"Andrew McCollum","email":"amccollum@gmail.com"},"url":"http://github.com/amccollum/ajaj","repositories":[{"type":"git","url":"https://github.com/amccollum/ajaj.git"}],"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"main":"lib/index.js","ender":"lib/ender.js","directories":{"lib":"lib"},"dependencies":{"reqwest":"*"},"devDependencies":{"coffee-script":"*"},"_npmUser":{"name":"amccollum","email":"amccollum+npm@gmail.com"},"_id":"ajaj@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"523173e258636fc891a4612f68753ee153cdf97a","tarball":"http://registry.npmjs.org/ajaj/-/ajaj-0.0.4.tgz"},"maintainers":[{"name":"amccollum","email":"amccollum+npm@gmail.com"}]}},"readme":"ajaj\n===\n\nAdd a basic package to add JSON-based AJAX requests to Ender.\n\n    $.ajaj","maintainers":[{"name":"amccollum","email":"amccollum+npm@gmail.com"}],"time":{"modified":"2012-08-09T00:26:11.357Z","created":"2012-05-16T00:06:03.452Z","0.0.1":"2012-05-16T00:06:04.961Z","0.0.2":"2012-05-16T00:28:24.167Z","0.0.3":"2012-08-08T23:44:39.467Z","0.0.4":"2012-08-09T00:26:11.357Z"},"author":{"name":"Andrew McCollum","email":"amccollum@gmail.com"},"_attachments":{"ajaj-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3fwhnUxcy4kWI2EcZYWDtw==","length":10240,"stub":true},"ajaj-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-nUP+KOyJLw+cWfY5RAnpSw==","length":10240,"stub":true},"ajaj-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pmJYutx2lk+0DcXFH+2ZTg==","length":1850,"stub":true},"ajaj-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XDzRsYGtQnpESK0fu9QpGw==","length":1783,"stub":true}}}},
{"id":"ajax","key":"ajax","value":{"rev":"5-5d20b12b5ef76e1a8e4c6ccc8175b633"},"doc":{"_id":"ajax","_rev":"5-5d20b12b5ef76e1a8e4c6ccc8175b633","name":"ajax","description":"Utilities for loading JSON and XML.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"ajax","description":"Utilities for loading JSON and XML.","version":"0.0.1","homepage":"http://github.com/joehewitt/ajax","repository":{"type":"git","url":"git://github.com/joehewitt/ajax.git"},"keywords":["xhr","ajax"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"underscore":""},"engines":{"node":">=0.4.0"},"main":"./lib/ajax","directories":{},"devDependencies":{},"_id":"ajax@0.0.1","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5d148d5d14554d7f9eb053bea9c6ba4b993f5f9b","tarball":"http://registry.npmjs.org/ajax/-/ajax-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.2":{"name":"ajax","description":"Utilities for loading JSON and XML.","version":"0.0.2","homepage":"http://github.com/joehewitt/ajax","repository":{"type":"git","url":"git://github.com/joehewitt/ajax.git"},"keywords":["xhr","ajax"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"underscore":""},"engines":{"node":">=0.4.0"},"main":"./lib/ajax","directories":{},"devDependencies":{},"_npmUser":{"name":"joehewitt","email":"joe@joehewitt.com"},"_id":"ajax@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"dac356ade41ec48eb403f338da776b8543475d13","tarball":"http://registry.npmjs.org/ajax/-/ajax-0.0.2.tgz"},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]}},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}],"time":{"modified":"2012-04-17T01:21:16.833Z","created":"2011-10-10T02:50:35.626Z","0.0.1":"2011-10-10T02:50:37.899Z","0.0.2":"2012-04-17T01:21:16.833Z"},"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"repository":{"type":"git","url":"git://github.com/joehewitt/ajax.git"},"_attachments":{"ajax-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-b0+zKd2OndiSAJhPIgh66g==","length":10240,"stub":true},"ajax-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aRY3bgDpjAxUd7DQmQIdLw==","length":1715,"stub":true}}}},
{"id":"ajaxrunner","key":"ajaxrunner","value":{"rev":"2-17e6a5de4f0339f4e6ce0b7681d0ba0c"},"doc":{"_id":"ajaxrunner","_rev":"2-17e6a5de4f0339f4e6ce0b7681d0ba0c","name":"ajaxrunner","description":"Easy performance testing of browser based AJAX, HTML, Javascript and Mobile applications.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"ajaxrunner","description":"Easy performance testing of browser based AJAX, HTML, Javascript and Mobile applications.","version":"0.0.1","maintainers":[{"name":"Mark Fink","url":"http://www.testing-software.org"}],"contributors":[],"repository":{"type":"git","url":"http://www.testing-software.org"},"keywords":["Testing","Performance","Ajax"],"licenses":[{"type":"BSD","url":"./ajaxrunner/raw/master/LICENSE_BSD"}],"dependencies":{"redis":">=0.5.4","jake":">=0.1.10"},"devDependencies":{"coffee-script":">= 1.0.0"},"scripts":{"test":"nodeunit ."},"directories":{"lib":"./build/lib","debs":"./build/debs","man":"./man1","bin":"./bin","doc":"./doc"},"bin":{"ajaxrunner":"./bin/ajaxrunner"},"_id":"ajaxrunner@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"man":[],"dist":{"shasum":"795462249a6f5112831f1f2b0c44aa3b969e2094","tarball":"http://registry.npmjs.org/ajaxrunner/-/ajaxrunner-0.0.1.tgz"}}},"maintainers":[{"name":"mark","email":"mark@mark-fink.de"}],"time":{"modified":"2011-03-29T20:31:24.260Z","created":"2011-03-29T20:31:23.820Z","0.0.1":"2011-03-29T20:31:24.260Z"},"repository":{"type":"git","url":"http://www.testing-software.org"}}},
{"id":"ajfabriq","key":"ajfabriq","value":{"rev":"3-d6eb4f5a46864e60bcdd2ec5eb1d73e5"},"doc":{"_id":"ajfabriq","_rev":"3-d6eb4f5a46864e60bcdd2ec5eb1d73e5","name":"ajfabriq","description":"Distributed applications using messages","dist-tags":{"latest":"0.0.1-alfa"},"versions":{"0.0.1-alfa":{"name":"ajfabriq","description":"Distributed applications using messages","keywords":["distributed","nodejs","javascript"],"version":"0.0.1-alfa","author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjFabriqNode.git"},"main":"./lib/ajfabriq.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ajlopez","email":"webmaster@ajlopez.com"},"_id":"ajfabriq@0.0.1-alfa","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7fc6e0efc1b0ff2b6d403a9f59ecd040e3660039","tarball":"http://registry.npmjs.org/ajfabriq/-/ajfabriq-0.0.1-alfa.tgz"},"maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}]}},"readme":"# AjFabriq\r\n\r\nAjFabriq is a Node.JS project that helps to write a distributed application, based on applications, nodes\r\nand actions. It uses JSON message passing and Net Socket for communication.\r\n\r\n## Posts\r\n\r\n[AjFabriq on NodeJs (Part 1) Introduction](http://ajlopez.wordpress.com/2011/08/25/ajfabriq-on-nodejs-part-1-introduction/)\r\n\r\n[AjFabriq on NodeJs (Part 2) A local Simple Application](http://ajlopez.wordpress.com/2011/09/08/ajfabriq-on-nodejs-part-2-a-local-simple-application/)\r\n\r\n[AjFabriq on NodeJs (Part 3) A Distributed Simple Application](http://ajlopez.wordpress.com/2011/09/09/ajfabriq-on-nodejs-part-3-a-distributed-simple-application/)\r\n\r\n### License\r\n\r\nBSD License\r\n\r\nCopyright (c) 2011, Angel J Lopez\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n    * Redistributions of source code must retain the above copyright\r\n      notice, this list of conditions and the following disclaimer.\r\n    * Redistributions in binary form must reproduce the above copyright\r\n      notice, this list of conditions and the following disclaimer in the\r\n      documentation and/or other materials provided with the distribution.\r\n    * Neither the name of the AjFabriqJs nor the\r\n      names of its contributors may be used to endorse or promote products\r\n      derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n","maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}],"time":{"modified":"2012-05-31T09:35:49.014Z","created":"2012-05-31T09:35:45.758Z","0.0.1-alfa":"2012-05-31T09:35:49.014Z"},"author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjFabriqNode.git"},"_attachments":{"ajfabriq-0.0.1-alfa.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5q3g2f3v4k6vXYj8k6ycaA==","length":3437,"stub":true}}}},
{"id":"ajgenesis","key":"ajgenesis","value":{"rev":"3-830ca23905e4e3b4858e191ecab65c3b"},"doc":{"_id":"ajgenesis","_rev":"3-830ca23905e4e3b4858e191ecab65c3b","name":"ajgenesis","description":"AjGenesis Code Generation","dist-tags":{"latest":"0.0.1-beta"},"versions":{"0.0.1-beta":{"name":"ajgenesis","description":"AjGenesis Code Generation","keywords":["codegeneration","nodejs"],"version":"0.0.1-beta","author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjGenesisNode.git"},"main":"./lib/ajgenesis.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{"test":"node ./test.js"},"dependencies":{"simpletpl":"*","node-uuid":">= 1.3.3"},"devDependencies":{},"_npmUser":{"name":"ajlopez","email":"webmaster@ajlopez.com"},"_id":"ajgenesis@0.0.1-beta","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d1e228f7441505bfeb9e5569d371f9ae1263ab4a","tarball":"http://registry.npmjs.org/ajgenesis/-/ajgenesis-0.0.1-beta.tgz"},"maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}]}},"readme":"# AjGenesisNode\r\n\r\nAjGenesisNode is a reimplementation of AjGenesis code generation engine, in Javascript/Node.js.\r\n\r\n[Original Project AjGenesis](http://ajgenesis.codeplex.com/)\r\n\r\n[Posts about Original Project](http://ajlopez.wordpress.com/category/ajgenesis/)\r\n\r\n## Installation\r\nVia npm on Node:\r\n```\r\nnpm install ajgenesis\r\n```\r\n\r\nReference in your program:\r\n```js\r\nvar ajgenesis = require('ajgenesis');\r\n```\r\n\r\n## Development\r\n```\r\ngit clone git://github.com/ajlopez/AjGenesisNode.git\r\ncd AjGenesisNode\r\nnpm install\r\nnpm test\r\n```\r\n\r\n## Samples\r\n\r\nTBD\r\n\r\n## Contribution\r\n\r\nFeel free to [file issues](https://github.com/ajlopez/AjGenesisNode) and submit\r\n[pull requests](https://github.com/ajlopez/AjGenesisNode/pulls) � contributions are\r\nwelcome.\r\n\r\nIf you submit a pull request, please be sure to add or update corresponding\r\ntest cases, and ensure that `npm test` continues to pass.\r\n","maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}],"time":{"modified":"2012-06-10T13:57:00.700Z","created":"2012-06-10T13:56:57.324Z","0.0.1-beta":"2012-06-10T13:57:00.700Z"},"author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjGenesisNode.git"},"_attachments":{"ajgenesis-0.0.1-beta.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qQQQDU0zWkm0Owelx3WUiA==","length":2760,"stub":true}}}},
{"id":"ajlisp","key":"ajlisp","value":{"rev":"3-e8964b5c389481f122344ca1f27412b8"},"doc":{"_id":"ajlisp","_rev":"3-e8964b5c389481f122344ca1f27412b8","name":"ajlisp","description":"Lisp interpreter implemented in Javascript, for browser and Node.js","dist-tags":{"latest":"0.0.1-alfa"},"versions":{"0.0.1-alfa":{"name":"ajlisp","description":"Lisp interpreter implemented in Javascript, for browser and Node.js","keywords":["lisp","nodejs","javascript","browser"],"version":"0.0.1-alfa","author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjLispJs.git"},"main":"./lib/ajlisp.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{"test":"nodeunit test"},"dependencies":{},"devDependencies":{"nodeunit":">= 0.7.4"},"_npmUser":{"name":"ajlopez","email":"webmaster@ajlopez.com"},"_id":"ajlisp@0.0.1-alfa","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d2159cf6a260cbf17f432536f39a02dbe7b07cc1","tarball":"http://registry.npmjs.org/ajlisp/-/ajlisp-0.0.1-alfa.tgz"},"maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}]}},"readme":"# AjLispJs\r\n\r\nLisp interpreter written in Javascript, using TDD (QUnit).\r\n\r\nPosts:\r\n\r\n[AjLisp in Javascript (Part 1) Atoms, Lists and TDD](http://ajlopez.wordpress.com/2011/08/19/ajlisp-in-javascript-part-1-atoms-lists-and-tdd/)\r\n\r\n[AjLisp in Javascript (Part 2) List Evaluation, Forms and Special Forms](http://ajlopez.wordpress.com/2011/08/30/ajlisp-in-javascript-part-1-list-evaluation-form-and-special-forms/)\r\n\r\n","maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}],"time":{"modified":"2012-05-30T09:02:21.001Z","created":"2012-05-30T09:02:17.911Z","0.0.1-alfa":"2012-05-30T09:02:21.001Z"},"author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjLispJs.git"},"_attachments":{"ajlisp-0.0.1-alfa.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rjSBH9WZUfE6wsQP2VYD3g==","length":56178,"stub":true}}}},
{"id":"ajlogo","key":"ajlogo","value":{"rev":"3-d451aa1ccd0a43161e58cd47bddb2990"},"doc":{"_id":"ajlogo","_rev":"3-d451aa1ccd0a43161e58cd47bddb2990","name":"ajlogo","description":"Logo Programming Language implemented in Javascript, for browser and Node.js","dist-tags":{"latest":"0.0.1-alfa"},"versions":{"0.0.1-alfa":{"name":"ajlogo","description":"Logo Programming Language implemented in Javascript, for browser and Node.js","keywords":["logo","nodejs","javascript","browser"],"version":"0.0.1-alfa","author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjLogoJs.git"},"main":"./lib/ajlogo.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{"test":"nodeunit test"},"dependencies":{},"devDependencies":{"nodeunit":">= 0.7.4"},"_npmUser":{"name":"ajlopez","email":"webmaster@ajlopez.com"},"_id":"ajlogo@0.0.1-alfa","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"96bb72d5f98de516dad9a59905b87ae700d3e65b","tarball":"http://registry.npmjs.org/ajlogo/-/ajlogo-0.0.1-alfa.tgz"},"maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}]}},"readme":"# AjLogoJs\r\n\r\nLogo interpreter written in Javascript, using TDD (Node assert).\r\n\r\n## Simple Assert Tests\r\n\r\nThere are simple tests using node built-in assert module\r\n\r\n```\r\nnode tests\\tests\r\n```\r\n\r\nIn Windows, you have a command file:\r\n\r\n```\r\ntests.cmd\r\n```\r\n\r\n## NodeUnit Tests\r\n\r\nInstall NodeUnit using npm from project folder\r\n\r\n```\r\nnpm install nodeunit\r\n```\r\n\r\nThen run all tests in test folder\r\n\r\n```\r\nnodeunit test\r\n```\r\n\r\n(In Windows, there is a nodeunit.cmd that calls the nodeunit script)\r\n\r\n\r\n","maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}],"time":{"modified":"2012-05-30T08:59:38.971Z","created":"2012-05-30T08:59:35.575Z","0.0.1-alfa":"2012-05-30T08:59:38.971Z"},"author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjLogoJs.git"},"_attachments":{"ajlogo-0.0.1-alfa.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-X1ZqZDSr2lwBmjmTjClbLQ==","length":12752,"stub":true}}}},
{"id":"ajn-session","key":"ajn-session","value":{"rev":"12-68873a7eb1796d730bf5f5db5d794f10"},"doc":{"_id":"ajn-session","_rev":"12-68873a7eb1796d730bf5f5db5d794f10","name":"ajn-session","description":"A very simple and lightweight session manager","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajn-session","description":"A very simple and lightweight session manager","version":"0.0.1","repository":{"url":"git://github.com/Ajnasz/ajn-session.git"},"dependencies":{"ajncookie":">=0.0.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajn-session@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"69762d0655bd568af62171ac9207e8570e47b7f3","tarball":"http://registry.npmjs.org/ajn-session/-/ajn-session-0.0.1.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]},"0.0.2":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajn-session","description":"A very simple and lightweight session manager","version":"0.0.2","repository":{"url":"git://github.com/Ajnasz/ajn-session.git"},"dependencies":{"ajncookie":">=0.0.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajn-session@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"47360873b776377b73b4249e0135998b44bd5753","tarball":"http://registry.npmjs.org/ajn-session/-/ajn-session-0.0.2.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]},"0.0.3":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajn-session","description":"A very simple and lightweight session manager","version":"0.0.3","repository":{"url":"git://github.com/Ajnasz/ajn-session.git"},"dependencies":{"ajncookie":">=0.0.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajn-session@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d2651a61823254515854baaa4ed36138c08ba5c9","tarball":"http://registry.npmjs.org/ajn-session/-/ajn-session-0.0.3.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]},"0.0.4":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajn-session","description":"A very simple and lightweight session manager","version":"0.0.4","repository":{"url":"git://github.com/Ajnasz/ajn-session.git"},"dependencies":{"ajncookie":">=0.0.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajn-session@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"43e8ae2e567991c2aa4057777192fdeb7786dcd3","tarball":"http://registry.npmjs.org/ajn-session/-/ajn-session-0.0.4.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]},"0.0.5":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajn-session","description":"A very simple and lightweight session manager","version":"0.0.5","repository":{"url":"git://github.com/Ajnasz/ajn-session.git"},"dependencies":{"ajncookie":">=0.0.1"},"devDependencies":{},"optionalDependencies":{},"readme":"","_id":"ajn-session@0.0.5","dist":{"shasum":"ee172d45a842d93fb842124289afe0820fbb07d8","tarball":"http://registry.npmjs.org/ajn-session/-/ajn-session-0.0.5.tgz"},"maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]}},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}],"time":{"modified":"2012-08-09T11:58:21.763Z","created":"2012-03-17T18:11:38.158Z","0.0.1":"2012-03-17T18:11:40.024Z","0.0.2":"2012-03-18T16:29:51.658Z","0.0.3":"2012-03-22T06:40:00.682Z","0.0.4":"2012-05-27T15:45:23.895Z","0.0.5":"2012-08-09T11:58:21.763Z"},"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"repository":{"url":"git://github.com/Ajnasz/ajn-session.git"},"users":{"yazgazan":true},"_attachments":{"ajn-session-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-JnF5BpHbuzxwmEOaVtISeg==","length":2405,"stub":true},"ajn-session-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-zx+Cqe/buP/ImC93dYowhw==","length":2260,"stub":true},"ajn-session-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-JJ+hV2VEObwDKBDq/bofyA==","length":1409,"stub":true},"ajn-session-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-e61dMULp5KtMK+vCr4gxPA==","length":1448,"stub":true},"ajn-session-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9zNVajfskNSLz1KaQnDCjg==","length":1206,"stub":true}}}},
{"id":"ajncookie","key":"ajncookie","value":{"rev":"8-70298a538545f80974066f21ab2d9dbf"},"doc":{"_id":"ajncookie","_rev":"8-70298a538545f80974066f21ab2d9dbf","name":"ajncookie","description":"A very basic cookie setter and getter","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajncookie","description":"A very basic cookie setter and getter","version":"0.0.1","repository":{"type":"git","url":"git://github.com/Ajnasz/ajncookie.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajncookie@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"cedcebfebb50ab6f00da230a525b197653231c89","tarball":"http://registry.npmjs.org/ajncookie/-/ajncookie-0.0.1.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]},"0.0.2":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajncookie","description":"A very basic cookie setter and getter","version":"0.0.2","repository":{"type":"git","url":"git://github.com/Ajnasz/ajncookie.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajncookie@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"320453e8dc1d49f24d8e2d875d6303cb78ddf571","tarball":"http://registry.npmjs.org/ajncookie/-/ajncookie-0.0.2.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]},"0.0.3":{"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"name":"ajncookie","description":"A very basic cookie setter and getter","version":"0.0.3","repository":{"type":"git","url":"git://github.com/Ajnasz/ajncookie.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ajnasz","email":"ajnasz@ajnasz.hu"},"_id":"ajncookie@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"6492efc503fa592148b1386abc5516093c08368c","tarball":"http://registry.npmjs.org/ajncookie/-/ajncookie-0.0.3.tgz"},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}]}},"readme":"","maintainers":[{"name":"ajnasz","email":"ajnasz@ajnasz.hu"}],"time":{"modified":"2012-07-08T15:13:57.734Z","created":"2012-03-17T17:57:29.314Z","0.0.1":"2012-03-17T17:57:31.283Z","0.0.2":"2012-05-28T15:14:46.107Z","0.0.3":"2012-07-08T15:13:57.734Z"},"author":{"name":"Lajos Koszti","email":"ajnasz@ajnasz.hu","url":"http://ajnasz.hu"},"repository":{"type":"git","url":"git://github.com/Ajnasz/ajncookie.git"},"users":{"yazgazan":true},"_attachments":{"ajncookie-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-ztDnlwD6wLLPqjod1i7URg==","length":1845,"stub":true},"ajncookie-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-XG4rE+t3qA+3/VTDoOFMaw==","length":1855,"stub":true},"ajncookie-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QoJ4T6oE6eB14TOSqjZ/yw==","length":612,"stub":true}}}},
{"id":"ajs","key":"ajs","value":{"rev":"13-063a29dec829fdaf4ca63d622137d1c6"},"doc":{"_id":"ajs","_rev":"13-063a29dec829fdaf4ca63d622137d1c6","name":"ajs","description":"Experimental asyncronous templating in Node","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"ajs","description":"Experimental asyncronous templating in Node","keywords":["ajs","ejs","template","view","asyncronous"],"version":"0.0.1","author":{"name":"Evan Owen","email":"kainosnoema@gmail.com"},"main":"index","dependencies":{"cli":">= 0.3.6 < 0.5.0","connect":">= 1.3.0 < 1.5.0"},"repository":{"type":"git","url":"git://github.com/kainosnoema/ajs.git"},"bin":{"ajs":"./bin/cli.js"},"engines":{"node":">=0.4.6"},"devDependencies":{},"_id":"ajs@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a714b0b69f681f59cdc1d25494e8e2b66f9562bb","tarball":"http://registry.npmjs.org/ajs/-/ajs-0.0.1.tgz"},"scripts":{},"directories":{}},"0.0.2":{"name":"ajs","description":"Experimental asyncronous templating in Node","keywords":["ajs","ejs","template","view","asyncronous"],"version":"0.0.2","author":{"name":"Evan Owen","email":"kainosnoema@gmail.com"},"main":"index","dependencies":{"cli":">= 0.3.6 < 0.5.0","connect":">= 1.3.0 < 1.5.0"},"repository":{"type":"git","url":"git://github.com/kainosnoema/ajs.git"},"bin":{"ajs":"./bin/cli.js"},"engines":{"node":">=0.4.6"},"devDependencies":{},"_id":"ajs@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"faa961c037747ddc46d6de191d5b43eff2e555f7","tarball":"http://registry.npmjs.org/ajs/-/ajs-0.0.2.tgz"},"scripts":{},"directories":{}},"0.0.3":{"name":"ajs","description":"Experimental asyncronous templating in Node","keywords":["ajs","ejs","template","view","asyncronous"],"version":"0.0.3","author":{"name":"Evan Owen","email":"kainosnoema@gmail.com"},"main":"index","dependencies":{"cli":">= 0.3.6 < 0.5.0","connect":">= 1.3.0 < 1.5.0"},"repository":{"type":"git","url":"git://github.com/kainosnoema/ajs.git"},"bin":{"ajs":"./bin/cli.js"},"engines":{"node":">=0.4.6"},"devDependencies":{},"_id":"ajs@0.0.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"095a95de2db3c67aaaa7143bca3623fbcbb504ba","tarball":"http://registry.npmjs.org/ajs/-/ajs-0.0.3.tgz"},"scripts":{},"directories":{}},"0.0.4":{"name":"ajs","description":"Experimental asyncronous templating in Node","keywords":["ajs","ejs","template","view","asyncronous"],"version":"0.0.4","author":{"name":"Evan Owen","email":"kainosnoema@gmail.com"},"main":"index","dependencies":{"cli":">= 0.3.6 < 0.5.0","connect":">= 1.3.0 < 1.5.0"},"repository":{"type":"git","url":"git://github.com/kainosnoema/ajs.git"},"bin":{"ajs":"./bin/cli.js"},"engines":{"node":">=0.4.6"},"devDependencies":{},"_id":"ajs@0.0.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"30c78e6ad059f47e3712383e2e120fddeeb178c0","tarball":"http://registry.npmjs.org/ajs/-/ajs-0.0.4.tgz"},"scripts":{}}},"maintainers":[{"name":"kainosnoema","email":"kainosnoema@gmail.com"}],"time":{"modified":"2011-06-08T04:35:13.660Z","created":"2011-06-07T03:13:26.205Z","0.0.1":"2011-06-07T03:13:26.591Z","0.0.2":"2011-06-07T17:59:42.948Z","0.0.3":"2011-06-08T00:15:11.838Z","0.0.4":"2011-06-08T03:02:20.181Z"},"author":{"name":"Evan Owen","email":"kainosnoema@gmail.com"},"repository":{"type":"git","url":"git://github.com/kainosnoema/ajs.git"},"_attachments":{"ajs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-BtCNu7liopDhAVKjR5EWow==","length":28242,"stub":true},"ajs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Bv4xIEqs/G5YlD3nznu/EA==","length":27646,"stub":true},"ajs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GwFVIVxzb4+1il/+kN5r0w==","length":27383,"stub":true},"ajs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cNx53OkYnG8JhP4T8UtJMw==","length":26885,"stub":true}}}},
{"id":"ajs-xgettext","key":"ajs-xgettext","value":{"rev":"3-cd4bbcc1c9d87fa7119d3bbbca99b793"},"doc":{"_id":"ajs-xgettext","_rev":"3-cd4bbcc1c9d87fa7119d3bbbca99b793","name":"ajs-xgettext","description":"Extract localised text from AJS templates","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"ajs-xgettext","version":"0.1.0","description":"Extract localised text from AJS templates","main":"lib/extract","bin":{"ajs-xgettext":"bin/ajs-xgettext"},"dependencies":{"ajs":">=0.0.4","async":">=0.1.6","nomnom":">=1.0.0","underscore":">=1.1.6"},"devDependencies":{"bufferstream":">=0.4.6","expresso":">=0.8.1","temp":">=0.2.0"},"scripts":{"test":"expresso"},"engines":{"node":">=0.4.8"},"author":{"name":"Duane Griffin","email":"duaneg@dghda.com"},"keywords":["ajs","ejs","template","i18n","l10n","gettext"],"repository":{"type":"git","url":"git://github.com/duaneg/ajs-xgettext.git"},"_npmJsonOpts":{"file":"/home/duaneg/.npm/ajs-xgettext/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ajs-xgettext@0.1.0","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"3f7494f71de3979ec0e0b2ece96c36c78023e412","tarball":"http://registry.npmjs.org/ajs-xgettext/-/ajs-xgettext-0.1.0.tgz"},"maintainers":[{"name":"duaneg","email":"duaneg@dghda.com"}]}},"maintainers":[{"name":"duaneg","email":"duaneg@dghda.com"}],"time":{"modified":"2011-08-26T19:33:34.230Z","created":"2011-08-26T19:33:33.478Z","0.1.0":"2011-08-26T19:33:34.230Z"},"author":{"name":"Duane Griffin","email":"duaneg@dghda.com"},"repository":{"type":"git","url":"git://github.com/duaneg/ajs-xgettext.git"},"_attachments":{"ajs-xgettext-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FoR6CDZqMzxJN0JSXwZ1Zw==","length":6229,"stub":true}}}},
{"id":"ajtalk","key":"ajtalk","value":{"rev":"3-f5ad8b7602e10fc080aa7bd4a3bbc028"},"doc":{"_id":"ajtalk","_rev":"3-f5ad8b7602e10fc080aa7bd4a3bbc028","name":"ajtalk","description":"Smalltalk VM implemented in Javascript, for browser and Node.js","dist-tags":{"latest":"0.0.1-alfa"},"versions":{"0.0.1-alfa":{"name":"ajtalk","description":"Smalltalk VM implemented in Javascript, for browser and Node.js","keywords":["smalltalk","nodejs","javascript","browser"],"version":"0.0.1-alfa","author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjTalkJs.git"},"main":"./lib/ajtalk.js","engines":{"node":">= 0.6.0 && < 0.9.0"},"scripts":{"test":"nodeunit test"},"dependencies":{},"devDependencies":{"nodeunit":">= 0.7.4"},"_npmUser":{"name":"ajlopez","email":"webmaster@ajlopez.com"},"_id":"ajtalk@0.0.1-alfa","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"440b6afecae07c0a2e51e1beee4f3018503a4036","tarball":"http://registry.npmjs.org/ajtalk/-/ajtalk-0.0.1-alfa.tgz"},"maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}]}},"readme":"# AjTalkJs\n\nSmalltalk bytecode Virtual Machine, written in Javascript. It can compile Smalltalk fileOut. Work in Progress.\n\nSee my other project (in C#): https://github.com/ajlopez/AjTalk\n\nBlog posts about AjTalk implementations: http://ajlopez.wordpress.com/category/ajtalk\n\n## Simple Assert Tests\n\nI wrote simple test using node built-in assert module\n\n```\nnode tests\\tests\n```\n\nIn Windows, you have a command file:\n\n```\ntests.cmd\n```\n\n## NodeUnit Tests\n\nInstall NodeUnit using npm from project folder\n\n```\nnpm install nodeunit\n```\n\nThen run all tests in test folder\n\n```\nnodeunit test\n```\n\n(In Windows, there is a nodeunit.cmd that calls the nodeunit script)\n\n\n","maintainers":[{"name":"ajlopez","email":"webmaster@ajlopez.com"}],"time":{"modified":"2012-05-30T09:58:40.549Z","created":"2012-05-30T09:58:37.132Z","0.0.1-alfa":"2012-05-30T09:58:40.549Z"},"author":{"name":"Angel 'Java' Lopez","email":"webmaster@ajlopez.com","url":"http://www.ajlopez.com"},"repository":{"type":"git","url":"git://github.com/ajlopez/AjTalkJs.git"},"_attachments":{"ajtalk-0.0.1-alfa.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-S8efd9wMOHB32PDwzjPSfw==","length":167907,"stub":true}}}},
{"id":"akismet","key":"akismet","value":{"rev":"13-a144e15dd6c2b13177572e80a526edd1"},"doc":{"_id":"akismet","_rev":"13-a144e15dd6c2b13177572e80a526edd1","name":"akismet","description":"Akismet API client for node.js","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"akismet","version":"0.0.1","description":"Akismet library for node.js","author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/oozcitak/akismet-js.git"}],"bugs":{"web":"http://github.com/oozcitak/akismet-js/issues"},"directories":{"lib":"./lib"},"dependencies":{},"_id":"akismet@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/akismet/-/akismet-0.0.1.tgz"}},"0.0.2":{"name":"akismet","version":"0.0.2","description":"Akismet library for node.js","author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/oozcitak/akismet-js.git"}],"bugs":{"web":"http://github.com/oozcitak/akismet-js/issues"},"directories":{"lib":"./lib"},"dependencies":{},"_id":"akismet@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/akismet/-/akismet-0.0.2.tgz"}},"0.0.3":{"name":"akismet","version":"0.0.3","description":"Akismet API client for node.js","author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com","url":"http://ozgur.ozcitak.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/oozcitak/akismet-js.git"}],"bugs":{"url":"http://github.com/oozcitak/akismet-js/issues"},"directories":{"lib":"./lib"},"_id":"akismet@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.13","_nodeVersion":"v0.3.3-pre","dist":{"shasum":"62d81b09761b11fb6868582030963de867032073","tarball":"http://registry.npmjs.org/akismet/-/akismet-0.0.3.tgz"}},"0.0.4":{"name":"akismet","version":"0.0.4","description":"Akismet API client for node.js","author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com","url":"http://ozgur.ozcitak.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/oozcitak/akismet-js.git"}],"bugs":{"url":"http://github.com/oozcitak/akismet-js/issues"},"directories":{"lib":"./lib"},"engines":{"node":">=0.2.5"},"_id":"akismet@0.0.4","_engineSupported":true,"_npmVersion":"0.2.13","_nodeVersion":"v0.3.3-pre","dist":{"shasum":"e5a9814c0508fdb4a7b46a235c6bafc2f2ced460","tarball":"http://registry.npmjs.org/akismet/-/akismet-0.0.4.tgz"}},"0.0.5":{"name":"akismet","version":"0.0.5","description":"Akismet API client for node.js","author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com","url":"http://ozgur.ozcitak.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/oozcitak/akismet-js.git"}],"bugs":{"url":"http://github.com/oozcitak/akismet-js/issues"},"directories":{"lib":"./lib"},"main":"./lib/akismet","engines":{"node":">=0.2.5"},"_id":"akismet@0.0.5","_engineSupported":true,"_npmVersion":"0.2.13","_nodeVersion":"v0.3.3-pre","dist":{"shasum":"8c8c9a48badac14d15a1a38185219a11a301b46e","tarball":"http://registry.npmjs.org/akismet/-/akismet-0.0.5.tgz"}},"0.0.6":{"name":"akismet","version":"0.0.6","description":"Akismet API client for node.js","author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com","url":"http://ozgur.ozcitak.com"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/oozcitak/akismet-js.git"}],"bugs":{"url":"http://github.com/oozcitak/akismet-js/issues"},"directories":{"lib":"./lib"},"main":"./lib/akismet","engines":{"node":">=0.2.5"},"_id":"akismet@0.0.6","_nodeSupported":false,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/akismet/-/akismet-0.0.6.tgz"}}},"maintainers":[{"name":"oozcitak","email":"oozcitak@gmail.com"}],"author":{"name":"Ozgur Ozcitak","email":"oozcitak@gmail.com","url":"http://ozgur.ozcitak.com"},"time":{"modified":"2010-12-28T13:40:25.537Z","created":"2010-12-26T23:13:38.483Z","0.0.1":"2010-12-26T23:13:38.483Z","0.0.2":"2010-12-26T23:13:38.483Z","0.0.3":"2010-12-26T23:13:38.483Z","0.0.4":"2010-12-26T23:48:50.652Z","0.0.5":"2010-12-27T00:15:33.519Z","0.0.6":"2010-12-28T13:40:25.537Z"},"_attachments":{"akismet-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zNSTEjHh4LHuLHa8eQ1LiA==","length":1420,"stub":true},"akismet-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ODDK0/gXT+j8HHU6XxDGCw==","length":1443,"stub":true},"akismet-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/XTiyfCm1C30k4mpAPpLVw==","length":2609,"stub":true},"akismet-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-384ZZ6uLn+/AXjNzBEJLyQ==","length":3332,"stub":true},"akismet-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hvwBmmiGyzbHZwb2UIRClg==","length":3253,"stub":true},"akismet-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PffC6VPXsOhKRxwkkWKrCg==","length":2877,"stub":true}}}},
{"id":"al-papi","key":"al-papi","value":{"rev":"5-870d181ea4fbc70ab356893a54b42c11"},"doc":{"_id":"al-papi","_rev":"5-870d181ea4fbc70ab356893a54b42c11","name":"al-papi","description":"AuthorityLabs Partner API wrapper.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Chavez"},"name":"al-papi","description":"AuthorityLabs Partner API wrapper.","version":"0.0.1","homepage":"http://github.com/mtchavez/node-al-papi","keywords":["AuthorityLabs","Partner API","AuthorityLabs API"],"repository":{"type":"git","url":"git://github.com/mtchavez/node-al-papi.git"},"main":"lib/AlPapi","directories":{"lib":"./lib"},"engines":{"node":"~v0.6.7"},"dependencies":{"request":"2.9.x"},"devDependencies":{"vows":"*","supervisor":"*","watch":"*","uglify-js":"*"},"_npmUser":{"name":"mtchavez","email":"nailsbrokeandfell@gmail.com"},"_id":"al-papi@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ff7c6278b7948e64c81f07b018c52bbdc1e8ae7d","tarball":"http://registry.npmjs.org/al-papi/-/al-papi-0.0.1.tgz"},"maintainers":[{"name":"mtchavez","email":"nailsbrokeandfell@gmail.com"}]},"0.0.2":{"author":{"name":"Chavez"},"name":"al-papi","description":"AuthorityLabs Partner API wrapper.","version":"0.0.2","homepage":"http://github.com/mtchavez/node-al-papi","keywords":["AuthorityLabs","Partner API","AuthorityLabs API"],"repository":{"type":"git","url":"git://github.com/mtchavez/node-al-papi.git"},"main":"lib/AlPapi","directories":{"lib":"./lib"},"engines":{"node":"~v0.6.7"},"dependencies":{"request":"2.9.x"},"devDependencies":{"vows":"*","supervisor":"*","watch":"*","uglify-js":"*"},"_npmUser":{"name":"mtchavez","email":"nailsbrokeandfell@gmail.com"},"_id":"al-papi@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bfc8d0d9b62d61df3a2d88b213abb26969d252e1","tarball":"http://registry.npmjs.org/al-papi/-/al-papi-0.0.2.tgz"},"maintainers":[{"name":"mtchavez","email":"nailsbrokeandfell@gmail.com"}]}},"readme":"Node.js AuthorityLabs Partner API Package\n=========================================\n\nA wrapper around the Partner API calls. Allows post, priority post and get calls.\n\n* Github: http://github.com/mtchavez/node-al-papi\n\n## Install\n\n    npm install al-papi\n\n## Usage\n\nMake a request object using your api key:\n    \n    // Require al-papi\n    var al = require('al-papi');\n    \n    // Configure using your api-key\n    al.AlConfig('yRR2tB39jStovMy6y6xP');\n    \n    // Make request object to make api calls\n    var req = new al.AlRequest();\n\n### POST\n\nPost your keyword-engine-locale combination to the API:\n\n    req.post({'keyword' : 'Centaur Soirée'}, function(response) {\n\n      console.log(response.statusCode);\n      console.log(response.url);\n      console.log(response.params);\n      \n      if (response.success) {\n        console.log(response.body);\n      }\n      else {\n        console.log(response.errorMessage);\n      }\n    });\n\n### Priority POST\n\nPost your keyword to the priority queue if you need results in a more timely manner:\n\n    req.priority_post({'keyword' : 'Centaur Soirée'}, function(response) {\n\n      console.log(response.statusCode);\n      console.log(response.url);\n      console.log(response.params);\n      \n      if (response.success) {\n        console.log(response.body);\n      }\n      else {\n        console.log(response.errorMessage);\n      }\n    });\n\n### GET\n\nWhen you are ready to get your results you can do a GET request for your keyword-engine-locale combo:\n\n    req.get({'keyword' : 'Centaur Soirée'}, function(response) {\n\n      console.log(response.statusCode);\n      console.log(response.url);\n      console.log(response.params);\n      \n      if (response.success) {\n        console.log(response.body);\n      }\n      else {\n        console.log(response.errorMessage);\n      }\n    });\n\n### Response\n\nWhen making an API request a response object is returned with any errors, http response code and http reponse body.\n\n    req.get({'keyword' : 'Centaur Soirée'}, function(response) {\n\n      console.log(response.statusCode); // Status code of response\n      console.log(response.url);        // The URL used for your request\n      console.log(response.params);     // Original params given\n      \n      // success is a true/false of if the request received a 200 response code\n      if (response.success) {\n        // Body will be the parsed JSON response\n        console.log(response.body);\n      }\n      else {\n        // Error message if one exists\n        console.log(response.errorMessage);\n      }\n    });\n    \n## License\n\nWritten by Chavez\n\nReleased under the MIT License: http://www.opensource.org/licenses/mit-license.php\n","maintainers":[{"name":"mtchavez","email":"nailsbrokeandfell@gmail.com"}],"time":{"modified":"2012-06-14T05:45:38.504Z","created":"2012-04-07T04:38:40.323Z","0.0.1":"2012-04-07T04:38:41.447Z","0.0.2":"2012-06-14T05:45:38.504Z"},"author":{"name":"Chavez"},"repository":{"type":"git","url":"git://github.com/mtchavez/node-al-papi.git"},"_attachments":{"al-papi-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Rn195f0szPVq0QB5Zan8TQ==","length":3805,"stub":true},"al-papi-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-W05h6bx0nlB745nl40I5KA==","length":3348,"stub":true}}}},
{"id":"alamid","key":"alamid","value":{"rev":"3-bde8c9e0e2efca747d341f76d61646d5"},"doc":{"_id":"alamid","_rev":"3-bde8c9e0e2efca747d341f76d61646d5","name":"alamid","description":"Framework for RESTful JavaScript web applications that run both on the server- and clientside.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"alamid","description":"Framework for RESTful JavaScript web applications that run both on the server- and clientside.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/pandaa/alamid.git"},"author":{"name":"pandaa"},"main":"./lib/core/index.js","keywords":["client","server","framework","rest","web application"],"engines":{"node":"0.6.x"},"dependencies":{"underscore":"1.1.x","async":"0.1.x","connect":"1.x","fshelpers":"git://github.com/pandaa/fshelpers.git","node2browser":"git://github.com/pandaa/node2browser.git","toSrc":"0.1.x","nodeclass":"git://github.com/pandaa/nodeclass.git"},"devDependencies":{"expect.js":"0.1.x","mocha":"0.12.x"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"alamid@0.1.0","optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.24","_nodeVersion":"v0.7.10-pre","_defaultsLoaded":true,"dist":{"shasum":"17688543a7f01746d828bb8ed49a7683ca2bf340","tarball":"http://registry.npmjs.org/alamid/-/alamid-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"isaacs","email":"i@izs.me"}]}},"readme":"alamid\r\n========\r\n\r\nFramework for RESTful JavaScript web applications that run both on the server- and clientside.\r\n\r\nFurther documentation comming soon...","maintainers":[{"name":"isaacs","email":"i@izs.me"}],"time":{"modified":"2012-06-05T15:34:12.889Z","created":"2012-06-05T15:34:11.417Z","0.1.0":"2012-06-05T15:34:12.889Z"},"author":{"name":"pandaa"},"repository":{"type":"git","url":"git://github.com/pandaa/alamid.git"},"_attachments":{"alamid-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ve0krjWh9lBjTN7cNudsDA==","length":24274,"stub":true}}}},
{"id":"albers","key":"albers","value":{"rev":"3-bd74468e37b83c656452211ae4cb4e99"},"doc":{"_id":"albers","_rev":"3-bd74468e37b83c656452211ae4cb4e99","name":"albers","description":"Nested, scalable layout system for Bauhaus library","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"albers","version":"0.1.0","url":"http://www.unifiedapplications.com/github/Albers","description":"Nested, scalable layout system for Bauhaus library","keywords":["functional","underscore","array","javascript","nodejs","lists","list","data","data structures","ui"],"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"main":"albers","engines":{"node":">= 0.6.1"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Albers.git"},"_npmUser":{"name":"sandropasquali","email":"spasquali@gmail.com"},"_id":"albers@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"1337cff8203d262b4d26b03041ee95b1e92ed748","tarball":"http://registry.npmjs.org/albers/-/albers-0.1.0.tgz"},"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}]}},"readme":null,"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}],"time":{"modified":"2012-01-31T15:21:05.438Z","created":"2012-01-31T15:21:03.924Z","0.1.0":"2012-01-31T15:21:05.438Z"},"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Albers.git"},"_attachments":{"albers-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-icL3sG2mJZKuJL9DfBIh5g==","length":589,"stub":true}}}},
{"id":"alchemist","key":"alchemist","value":{"rev":"3-33e8324cfc6772020cfcab53ba2f7712"},"doc":{"_id":"alchemist","_rev":"3-33e8324cfc6772020cfcab53ba2f7712","name":"alchemist","description":"Serve & manage multiple static sites from one UI.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com"},"name":"alchemist","description":"Serve & manage multiple static sites from one UI.","version":"0.0.1","repository":{"type":"git","url":"git://github.com/logicalparadox/alchemist.git"},"main":"index","scripts":{"test":"sherlock test/*.test.js","prepublish":"npm prune"},"engines":{"node":">= 0.4.8"},"dependencies":{"tea":"0.1.x","seed":"0.1.x","seed-filestore":"0.0.x","optimist":"0.2.x","colors":"0.5.x","connect":"1.7.x","http-proxy":"0.7.x"},"devDependencies":{"sherlock":"0.1.x"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"alchemist@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f49d60362b0327c6469087c41ab67a58f2fe1317","tarball":"http://registry.npmjs.org/alchemist/-/alchemist-0.0.1.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]}},"readme":"# Alchemist\n\nServe and manage all of your static sites from one tool.\n\n## Components\n\n* \n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Jake Luer <jake@alogicalparadox.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}],"time":{"modified":"2011-11-11T16:54:30.173Z","created":"2011-11-11T16:54:29.543Z","0.0.1":"2011-11-11T16:54:30.173Z"},"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com"},"repository":{"type":"git","url":"git://github.com/logicalparadox/alchemist.git"},"_attachments":{"alchemist-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DIzgUVaj8Fedk/hK5RVy3g==","length":10240,"stub":true}}}},
{"id":"alchemy","key":"alchemy","value":{"rev":"3-627409fa23e2590a7f968b296d98b038"},"doc":{"_id":"alchemy","_rev":"3-627409fa23e2590a7f968b296d98b038","name":"alchemy","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"alchemy","version":"0.1.0","dependencies":{"elemental":"*","node-uuid":"*"},"_npmUser":{"name":"pyrotechnick","email":"pyrotechnick@gmail.com"},"_id":"alchemy@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"3181aa1964bcaa22fb25ba9bb7f7b82025728323","tarball":"http://registry.npmjs.org/alchemy/-/alchemy-0.1.0.tgz"},"readme":"","maintainers":[{"name":"pyrotechnick","email":"pyrotechnick@gmail.com"}]}},"readme":"","maintainers":[{"name":"pyrotechnick","email":"pyrotechnick@gmail.com"}],"time":{"modified":"2012-06-17T17:21:58.011Z","created":"2012-06-17T17:21:53.684Z","0.1.0":"2012-06-17T17:21:58.011Z"},"_attachments":{"alchemy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UC291AEmreM/Qu7O9DjFKg==","length":766,"stub":true}}}},
{"id":"alchemy-api","key":"alchemy-api","value":{"rev":"5-04cdcd7941a042db2a7789c67c1f6d8b"},"doc":{"_id":"alchemy-api","_rev":"5-04cdcd7941a042db2a7789c67c1f6d8b","name":"alchemy-api","description":"An Alchemy API library for Node.js","dist-tags":{"latest":"0.6.0"},"versions":{"0.5.0":{"name":"alchemy-api","description":"An Alchemy API library for Node.js","tags":["Alchemy","Natural Language Processing","util"],"version":"0.5.0","author":{"name":"Jason Morgan","email":"jason@framingeinstein.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/framingeinstein/node-alchemy.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"_npmUser":{"name":"framingeinstein","email":"jason@framingeinstein.com"},"_id":"alchemy-api@0.5.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"079143b9f3a0394ec535e9d6fc65c19fe7b86915","tarball":"http://registry.npmjs.org/alchemy-api/-/alchemy-api-0.5.0.tgz"},"maintainers":[{"name":"framingeinstein","email":"jason@framingeinstein.com"}]},"0.6.0":{"name":"alchemy-api","description":"An Alchemy API library for Node.js","tags":["Alchemy","Natural Language Processing","util"],"version":"0.6.0","author":{"name":"Jason Morgan","email":"jason@framingeinstein.com"},"contributors":[],"repository":{"type":"git","url":"http://github.com/framingeinstein/node-alchemy.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"readme":" alchemy-api - An Alchemy API library for Node.js\n====================\n[![Build Status](https://secure.travis-ci.org/framingeinstein/node-alchemy.png)](http://travis-ci.org/framingeinstein/node-alchemy)\n\nThis module provides calls to the [Alchemy](http://www.alchemyapi.com/) API for [Nodejs](http://nodejs.org).\nFor more information on the API request and responses visit the [Alchemy API docs](http://www.alchemyapi.com/api/).  To use the module you will need to obtain an api key from [Alchemy](http://www.alchemyapi.com/api/register.html).\n\nInstallation\n------------\n\nYou can also install via git by cloning: `git clone https://github.com/framingeinstein/node-alchemy.git /path/to/alchemy-api`\n\nUsage\n-----\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.sentiment('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/ for format of returned object\n      var sentiment = response.docSentiment;\n\n      // Do something with data\n    });\n\nTests\n-----\nTo run tests type `npm test`\n\nAlchemyAPI Features\n---------------\nThis module does NOT support the optional parameters of the Alchemy API methods.  There is an options argument that will be utilized to enable these features in the future.\n\nNamed Entity Extraction\n-----------------------\n \tvar AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.entities('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/entity/htmlc.html for format of returned object\n      var entities = response.entities;\n\n      // Do something with data\n    });\n\nSentiment Analysis\n------------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.sentiment('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/sentiment/htmlc.html for format of returned object\n      var sentiment = response.docSentiment;\n\n      // Do something with data\n    });\n\nRelation Extraction\n-------------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.relations('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/relation/htmlc.html for format of returned object\n      var relations = response.relations;\n\n      // Do something with data\n    });\n\nConcept Tagging\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.concepts('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/concept/htmlc.html for format of returned object\n      var concepts = response.concepts;\n\n      // Do something with data\n    });\n\nKeyword / Terminology Extraction\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.keywords('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/keyword/htmlc.html for format of returned object\n      var keywords = response.keywords;\n\n      // Do something with data\n    });\n\nTopic Categorization\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.category('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/categ/htmlc.html for format of returned object\n      var category = response.category;\n\n      // Do something with data\n    });\n\nLanguage Detection\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.language('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/lang/htmlc.html for format of returned object\n      var language = response.language;\n\n      // Do something with data\n    });\n\nAuthor Extraction\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.author('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/author/htmlc.html for format of returned object\n      var author = response.author;\n\n      // Do something with data\n    });\n\nText Extraction / Web Page Cleaning\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.text('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/text/htmlc.html for format of returned object\n      var text = response.text;\n\n      // Do something with data\n    });\n\nStructured Content Scraping\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.scrape('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/scrape/htmlc.html for format of returned object\n      var results = response.queryResults;\n\n      // Do something with data\n    });\n\nMicroformats\n------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.microformats('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/mformat/htmlc.html for format of returned object\n      var microformats = response.microformats;\n\n      // Do something with data\n    });\n\nRSS / ATOM Feed Discovery\n----------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.feeds('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/feed/htmlc.html for format of returned object\n      var feeds = response.feeds;\n\n      // Do something with data\n    });","_id":"alchemy-api@0.6.0","dist":{"shasum":"0e04a0bad236ce342fb8b608afd56a675cfc212b","tarball":"http://registry.npmjs.org/alchemy-api/-/alchemy-api-0.6.0.tgz"},"maintainers":[{"name":"framingeinstein","email":"jason@framingeinstein.com"}]}},"readme":" alchemy-api - An Alchemy API library for Node.js\n====================\n[![Build Status](https://secure.travis-ci.org/framingeinstein/node-alchemy.png)](http://travis-ci.org/framingeinstein/node-alchemy)\n\nThis module provides calls to the [Alchemy](http://www.alchemyapi.com/) API for [Nodejs](http://nodejs.org).\nFor more information on the API request and responses visit the [Alchemy API docs](http://www.alchemyapi.com/api/).  To use the module you will need to obtain an api key from [Alchemy](http://www.alchemyapi.com/api/register.html).\n\nInstallation\n------------\n\nYou can also install via git by cloning: `git clone https://github.com/framingeinstein/node-alchemy.git /path/to/alchemy-api`\n\nUsage\n-----\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.sentiment('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/ for format of returned object\n      var sentiment = response.docSentiment;\n\n      // Do something with data\n    });\n\nTests\n-----\nTo run tests type `npm test`\n\nAlchemyAPI Features\n---------------\nThis module does NOT support the optional parameters of the Alchemy API methods.  There is an options argument that will be utilized to enable these features in the future.\n\nNamed Entity Extraction\n-----------------------\n \tvar AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.entities('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/entity/htmlc.html for format of returned object\n      var entities = response.entities;\n\n      // Do something with data\n    });\n\nSentiment Analysis\n------------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.sentiment('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/sentiment/htmlc.html for format of returned object\n      var sentiment = response.docSentiment;\n\n      // Do something with data\n    });\n\nRelation Extraction\n-------------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.relations('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/relation/htmlc.html for format of returned object\n      var relations = response.relations;\n\n      // Do something with data\n    });\n\nConcept Tagging\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.concepts('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/concept/htmlc.html for format of returned object\n      var concepts = response.concepts;\n\n      // Do something with data\n    });\n\nKeyword / Terminology Extraction\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.keywords('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/keyword/htmlc.html for format of returned object\n      var keywords = response.keywords;\n\n      // Do something with data\n    });\n\nTopic Categorization\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.category('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/categ/htmlc.html for format of returned object\n      var category = response.category;\n\n      // Do something with data\n    });\n\nLanguage Detection\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.language('<URL|HTML|TEXT>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/lang/htmlc.html for format of returned object\n      var language = response.language;\n\n      // Do something with data\n    });\n\nAuthor Extraction\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.author('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/author/htmlc.html for format of returned object\n      var author = response.author;\n\n      // Do something with data\n    });\n\nText Extraction / Web Page Cleaning\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.text('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/text/htmlc.html for format of returned object\n      var text = response.text;\n\n      // Do something with data\n    });\n\nStructured Content Scraping\n---------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.scrape('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/scrape/htmlc.html for format of returned object\n      var results = response.queryResults;\n\n      // Do something with data\n    });\n\nMicroformats\n------------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.microformats('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/mformat/htmlc.html for format of returned object\n      var microformats = response.microformats;\n\n      // Do something with data\n    });\n\nRSS / ATOM Feed Discovery\n----------\n    var AlchemyAPI = require('alchemy-api');\n    var alchemy = new AlchemyAPI('<YOUR API KEY>');\n    alchemy.feeds('<URL|HTML>', {}, function(err, response) {\n      if (err) throw err;\n\n      // See http://www.alchemyapi.com/api/feed/htmlc.html for format of returned object\n      var feeds = response.feeds;\n\n      // Do something with data\n    });","maintainers":[{"name":"framingeinstein","email":"jason@framingeinstein.com"}],"time":{"modified":"2012-08-13T23:25:16.712Z","created":"2012-08-13T00:57:09.257Z","0.5.0":"2012-08-13T00:57:10.211Z","0.6.0":"2012-08-13T23:25:16.712Z"},"author":{"name":"Jason Morgan","email":"jason@framingeinstein.com"},"repository":{"type":"git","url":"http://github.com/framingeinstein/node-alchemy.git"},"_attachments":{"alchemy-api-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wcA2KA2EyHyIRmRxxnPRnQ==","length":5596,"stub":true},"alchemy-api-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VJ4XT+jtYQJ2SaXTqLzLhA==","length":5567,"stub":true}}}},
{"id":"alexa","key":"alexa","value":{"rev":"5-c363d348b544c5fc65149066e613a2c9"},"doc":{"_id":"alexa","_rev":"5-c363d348b544c5fc65149066e613a2c9","name":"alexa","description":"Amazon Alexa Web Information Service API","dist-tags":{"latest":"0.0.1a"},"versions":{"0.0.1":{"author":{"name":"Egor M.","email":"egor@ixvar.com"},"name":"alexa","description":"Amazon Alexa Web Information Service API","version":"0.0.1","homepage":"https://github.com/dsx/node-alexa","repository":{"url":"https://github.com/dsx/node-alexa.git"},"dependencies":{"underscore":"","qs":"","request":"","libxml-to-js":"","sequence":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"main":"index.js","scripts":{"test":"make test"},"_npmUser":{"name":"dsx","email":"egor@ixvar.com"},"_id":"alexa@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"c4ae41109453408cd1e628ccf53f91b3eda72924","tarball":"http://registry.npmjs.org/alexa/-/alexa-0.0.1.tgz"},"maintainers":[{"name":"dsx","email":"egor@ixvar.com"}]},"0.0.1a":{"author":{"name":"Egor M.","email":"egor@ixvar.com"},"name":"alexa","description":"Amazon Alexa Web Information Service API","version":"0.0.1a","homepage":"https://github.com/ixvar/node-alexa","repository":{"url":"https://github.com/ixvar/node-alexa.git"},"dependencies":{"underscore":"","qs":"","request":"","libxml-to-js":"","sequence":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"main":"index.js","scripts":{"test":"make test"},"_npmUser":{"name":"dsx","email":"egor@ixvar.com"},"_id":"alexa@0.0.1a","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"137525cf43f79215e4b4d4d891e9340f1dd733c6","tarball":"http://registry.npmjs.org/alexa/-/alexa-0.0.1a.tgz"},"maintainers":[{"name":"dsx","email":"egor@ixvar.com"}]}},"readme":"Amazon Alexa Web Information Service module\n===========================================\n\nAPI\n---\nCurrently this project is well documented in JavaScript language. But that _is_ going to change. Really. No jokes.\n\nTest\n----\n0. npm install mocha\n1. AMAZON_ACCESS_KEY='123' AMAZON_SECRET_KEY='456' npm test\n\n\nBugs\n----\nNobody's perfect. Feel free to submit bugreports at [GitHub Issues page](https://github.com/ixvar/node-alexa/issues \"GitHub Issues page\") and pull requests.\n","maintainers":[{"name":"dsx","email":"egor@ixvar.com"}],"time":{"modified":"2012-06-13T21:30:05.759Z","created":"2012-06-13T20:51:50.567Z","0.0.1":"2012-06-13T20:51:51.053Z","0.0.1a":"2012-06-13T21:30:05.759Z"},"author":{"name":"Egor M.","email":"egor@ixvar.com"},"repository":{"url":"https://github.com/ixvar/node-alexa.git"},"_attachments":{"alexa-0.0.1a.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2YHQNQFC9Ww4po90CB7fgQ==","length":8573,"stub":true},"alexa-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oA8d4SivIUNY3tFPHhsDLg==","length":8634,"stub":true}}}},
{"id":"alfred","key":"alfred","value":{"rev":"45-9a69041b18d2587c016b1b1deccdb2ce"},"doc":{"_id":"alfred","_rev":"45-9a69041b18d2587c016b1b1deccdb2ce","name":"alfred","description":"In-process key-value store","dist-tags":{"latest":"0.5.4"},"versions":{"0.1.0beta4":{"name":"alfred","description":"In-process key-value store","version":"0.1.0beta4","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.0.4"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.1.0beta4","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"68ecaf64e00239dd62fe4f65c5a7034b4ae32481","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.1.0beta4.tgz"}},"0.1.0beta5":{"name":"alfred","description":"In-process key-value store","version":"0.1.0beta5","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.0.4","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.1.0beta5","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"f67fd5816d6d42b9bd2e71654e7583965ef67919","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.1.0beta5.tgz"}},"0.1.0beta6":{"name":"alfred","description":"In-process key-value store","version":"0.1.0beta6","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.1.0beta6","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"a420bfe348084994b91b476bb6b6eca3cc184f02","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.1.0beta6.tgz"}},"0.1.0beta7":{"name":"alfred","description":"In-process key-value store","version":"0.1.0beta7","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.1.0beta7","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"2bf1db6daa25602e753cb5e1c659d685b79827da","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.1.0beta7.tgz"}},"0.1.0beta8":{"name":"alfred","description":"In-process key-value store","version":"0.1.0beta8","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.1.0beta8","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"795bd2f0aea528d545cf8a29859f7aa5e94c2d2e","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.1.0beta8.tgz"}},"0.3.0b1":{"name":"alfred","description":"In-process key-value store","version":"0.3.0b1","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.3.0b1","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"5e8a801a722b389dbf73d97256caf7bebaa7817f","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.3.0b1.tgz"}},"0.3.0b2":{"name":"alfred","description":"In-process key-value store","version":"0.3.0b2","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.3.0b2","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"f0cc63f3212e4391c5ff22032a41f4c2dca612fe","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.3.0b2.tgz"}},"0.3.0b3":{"name":"alfred","description":"In-process key-value store","version":"0.3.0b3","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.3.0b3","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.3.3","dist":{"shasum":"6d98ea2b747a5a8e733a557a1d8122478845193e","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.3.0b3.tgz"}},"0.5.0b1":{"name":"alfred","description":"In-process key-value store","version":"0.5.0b1","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.0b1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","modules":{"cached_key_map.js":"lib/alfred/cached_key_map.js","collection.js":"lib/alfred/collection.js","index.js":"lib/alfred/index.js","indexed_key_map.js":"lib/alfred/indexed_key_map.js","key_map.js":"lib/alfred/key_map.js","files/alfred_check_error.js":"lib/alfred/files/alfred_check_error.js","files/buffered_file.js":"lib/alfred/files/buffered_file.js","files/file.js":"lib/alfred/files/file.js","files/temp_file.js":"lib/alfred/files/temp_file.js","indexes/key_index.js":"lib/alfred/indexes/key_index.js","indexes/ordered_index.js":"lib/alfred/indexes/ordered_index.js","indexes/unordered_index.js":"lib/alfred/indexes/unordered_index.js","util/cache.js":"lib/alfred/util/cache.js","util/compact_coordinator.js":"lib/alfred/util/compact_coordinator.js","util/coordinator.js":"lib/alfred/util/coordinator.js","util/index_key_interceptor.js":"lib/alfred/util/index_key_interceptor.js","util/index_key_unitor.js":"lib/alfred/util/index_key_unitor.js","util/mixin.js":"lib/alfred/util/mixin.js","util/options_merger.js":"lib/alfred/util/options_merger.js","util/promise.js":"lib/alfred/util/promise.js","meta/database.js":"lib/alfred/meta/database.js","meta/finder.js":"lib/alfred/meta/finder.js","meta/finder_stream.js":"lib/alfred/meta/finder_stream.js","meta/index_wrapper.js":"lib/alfred/meta/index_wrapper.js","meta/commands/add_index.js":"lib/alfred/meta/commands/add_index.js","meta/commands/attach_key_map.js":"lib/alfred/meta/commands/attach_key_map.js","meta/commands/detach_key_map.js":"lib/alfred/meta/commands/detach_key_map.js","meta/commands/drop_index.js":"lib/alfred/meta/commands/drop_index.js","meta/commands/ensure_key_map_attached.js":"lib/alfred/meta/commands/ensure_key_map_attached.js","meta/commands/replicate_from.js":"lib/alfred/meta/commands/replicate_from.js","meta/model/document.js":"lib/alfred/meta/model/document.js","meta/model/model.js":"lib/alfred/meta/model/model.js","meta/model/registrar.js":"lib/alfred/meta/model/registrar.js","meta/model/schema.js":"lib/alfred/meta/model/schema.js","meta/model/validator.js":"lib/alfred/meta/model/validator.js","meta/operators/$eq.js":"lib/alfred/meta/operators/$eq.js","meta/operators/$gt.js":"lib/alfred/meta/operators/$gt.js","meta/operators/$gte.js":"lib/alfred/meta/operators/$gte.js","meta/operators/$in.js":"lib/alfred/meta/operators/$in.js","meta/operators/$lt.js":"lib/alfred/meta/operators/$lt.js","meta/operators/$lte.js":"lib/alfred/meta/operators/$lte.js","meta/operators/$neq.js":"lib/alfred/meta/operators/$neq.js","meta/operators/$nin.js":"lib/alfred/meta/operators/$nin.js","meta/operators/$or.js":"lib/alfred/meta/operators/$or.js","meta/operators/$range.js":"lib/alfred/meta/operators/$range.js","meta/replication/index.js":"lib/alfred/meta/replication/index.js","meta/replication/log_stream.js":"lib/alfred/meta/replication/log_stream.js","meta/replication/logger.js":"lib/alfred/meta/replication/logger.js","meta/replication/master.js":"lib/alfred/meta/replication/master.js","meta/replication/commands/sync.js":"lib/alfred/meta/replication/commands/sync.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c467dee852ff3962b6bf49c01ff34e8c35c5e27a","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.0b1.tgz"}},"0.5.0b2":{"name":"alfred","description":"In-process key-value store","version":"0.5.0b2","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.0b2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","modules":{"cached_key_map.js":"lib/alfred/cached_key_map.js","collection.js":"lib/alfred/collection.js","index.js":"lib/alfred/index.js","indexed_key_map.js":"lib/alfred/indexed_key_map.js","key_map.js":"lib/alfred/key_map.js","files/alfred_check_error.js":"lib/alfred/files/alfred_check_error.js","files/buffered_file.js":"lib/alfred/files/buffered_file.js","files/file.js":"lib/alfred/files/file.js","files/temp_file.js":"lib/alfred/files/temp_file.js","indexes/key_index.js":"lib/alfred/indexes/key_index.js","indexes/ordered_index.js":"lib/alfred/indexes/ordered_index.js","indexes/unordered_index.js":"lib/alfred/indexes/unordered_index.js","util/cache.js":"lib/alfred/util/cache.js","util/compact_coordinator.js":"lib/alfred/util/compact_coordinator.js","util/coordinator.js":"lib/alfred/util/coordinator.js","util/index_key_interceptor.js":"lib/alfred/util/index_key_interceptor.js","util/index_key_unitor.js":"lib/alfred/util/index_key_unitor.js","util/mixin.js":"lib/alfred/util/mixin.js","util/options_merger.js":"lib/alfred/util/options_merger.js","util/promise.js":"lib/alfred/util/promise.js","util/promises.js":"lib/alfred/util/promises.js","meta/database.js":"lib/alfred/meta/database.js","meta/finder.js":"lib/alfred/meta/finder.js","meta/finder_stream.js":"lib/alfred/meta/finder_stream.js","meta/index_wrapper.js":"lib/alfred/meta/index_wrapper.js","meta/commands/add_index.js":"lib/alfred/meta/commands/add_index.js","meta/commands/attach_key_map.js":"lib/alfred/meta/commands/attach_key_map.js","meta/commands/detach_key_map.js":"lib/alfred/meta/commands/detach_key_map.js","meta/commands/drop_index.js":"lib/alfred/meta/commands/drop_index.js","meta/commands/ensure_key_map_attached.js":"lib/alfred/meta/commands/ensure_key_map_attached.js","meta/commands/replicate_from.js":"lib/alfred/meta/commands/replicate_from.js","meta/model/document.js":"lib/alfred/meta/model/document.js","meta/model/model.js":"lib/alfred/meta/model/model.js","meta/model/registrar.js":"lib/alfred/meta/model/registrar.js","meta/model/schema.js":"lib/alfred/meta/model/schema.js","meta/model/validator.js":"lib/alfred/meta/model/validator.js","meta/operators/$eq.js":"lib/alfred/meta/operators/$eq.js","meta/operators/$gt.js":"lib/alfred/meta/operators/$gt.js","meta/operators/$gte.js":"lib/alfred/meta/operators/$gte.js","meta/operators/$in.js":"lib/alfred/meta/operators/$in.js","meta/operators/$lt.js":"lib/alfred/meta/operators/$lt.js","meta/operators/$lte.js":"lib/alfred/meta/operators/$lte.js","meta/operators/$neq.js":"lib/alfred/meta/operators/$neq.js","meta/operators/$nin.js":"lib/alfred/meta/operators/$nin.js","meta/operators/$or.js":"lib/alfred/meta/operators/$or.js","meta/operators/$range.js":"lib/alfred/meta/operators/$range.js","meta/replication/index.js":"lib/alfred/meta/replication/index.js","meta/replication/log_stream.js":"lib/alfred/meta/replication/log_stream.js","meta/replication/logger.js":"lib/alfred/meta/replication/logger.js","meta/replication/master.js":"lib/alfred/meta/replication/master.js","meta/replication/commands/sync.js":"lib/alfred/meta/replication/commands/sync.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fa7ea3d880800cd4f0aafdb9aaf81e547fef157e","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.0b2.tgz"}},"0.5.1b2":{"name":"alfred","description":"In-process key-value store","version":"0.5.1b2","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"main":"./index","engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.1b2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8","modules":{"cached_key_map.js":"lib/alfred/cached_key_map.js","collection.js":"lib/alfred/collection.js","index.js":"lib/alfred/index.js","indexed_key_map.js":"lib/alfred/indexed_key_map.js","key_map.js":"lib/alfred/key_map.js","files/alfred_check_error.js":"lib/alfred/files/alfred_check_error.js","files/buffered_file.js":"lib/alfred/files/buffered_file.js","files/file.js":"lib/alfred/files/file.js","files/temp_file.js":"lib/alfred/files/temp_file.js","indexes/key_index.js":"lib/alfred/indexes/key_index.js","indexes/ordered_index.js":"lib/alfred/indexes/ordered_index.js","indexes/unordered_index.js":"lib/alfred/indexes/unordered_index.js","util/cache.js":"lib/alfred/util/cache.js","util/compact_coordinator.js":"lib/alfred/util/compact_coordinator.js","util/coordinator.js":"lib/alfred/util/coordinator.js","util/index_key_interceptor.js":"lib/alfred/util/index_key_interceptor.js","util/index_key_unitor.js":"lib/alfred/util/index_key_unitor.js","util/mixin.js":"lib/alfred/util/mixin.js","util/options_merger.js":"lib/alfred/util/options_merger.js","util/promise.js":"lib/alfred/util/promise.js","util/promises.js":"lib/alfred/util/promises.js","meta/database.js":"lib/alfred/meta/database.js","meta/finder.js":"lib/alfred/meta/finder.js","meta/finder_stream.js":"lib/alfred/meta/finder_stream.js","meta/index_wrapper.js":"lib/alfred/meta/index_wrapper.js","meta/commands/add_index.js":"lib/alfred/meta/commands/add_index.js","meta/commands/attach_key_map.js":"lib/alfred/meta/commands/attach_key_map.js","meta/commands/detach_key_map.js":"lib/alfred/meta/commands/detach_key_map.js","meta/commands/drop_index.js":"lib/alfred/meta/commands/drop_index.js","meta/commands/ensure_key_map_attached.js":"lib/alfred/meta/commands/ensure_key_map_attached.js","meta/commands/replicate_from.js":"lib/alfred/meta/commands/replicate_from.js","meta/model/document.js":"lib/alfred/meta/model/document.js","meta/model/model.js":"lib/alfred/meta/model/model.js","meta/model/registrar.js":"lib/alfred/meta/model/registrar.js","meta/model/schema.js":"lib/alfred/meta/model/schema.js","meta/model/validator.js":"lib/alfred/meta/model/validator.js","meta/operators/$eq.js":"lib/alfred/meta/operators/$eq.js","meta/operators/$gt.js":"lib/alfred/meta/operators/$gt.js","meta/operators/$gte.js":"lib/alfred/meta/operators/$gte.js","meta/operators/$in.js":"lib/alfred/meta/operators/$in.js","meta/operators/$lt.js":"lib/alfred/meta/operators/$lt.js","meta/operators/$lte.js":"lib/alfred/meta/operators/$lte.js","meta/operators/$neq.js":"lib/alfred/meta/operators/$neq.js","meta/operators/$nin.js":"lib/alfred/meta/operators/$nin.js","meta/operators/$or.js":"lib/alfred/meta/operators/$or.js","meta/operators/$range.js":"lib/alfred/meta/operators/$range.js","meta/replication/index.js":"lib/alfred/meta/replication/index.js","meta/replication/log_stream.js":"lib/alfred/meta/replication/log_stream.js","meta/replication/logger.js":"lib/alfred/meta/replication/logger.js","meta/replication/master.js":"lib/alfred/meta/replication/master.js","meta/replication/commands/sync.js":"lib/alfred/meta/replication/commands/sync.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7cbe1b04d51de3ae60968fcc9f4694d3c7fde23c","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.1b2.tgz"}},"0.5.2b1":{"name":"alfred","description":"In-process key-value store","version":"0.5.2b1","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"main":"./index","engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.2b1","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1d9e92bf392341bacf58c4d74f9b9507410a64ff","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.2b1.tgz"}},"0.5.2b2":{"name":"alfred","description":"In-process key-value store","version":"0.5.2b2","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"main":"./index","engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.2b2","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7b67f9e30174089f2e112538c5413989e9673cac","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.2b2.tgz"}},"0.5.2b3":{"name":"alfred","description":"In-process key-value store","version":"0.5.2b3","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"http://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"main":"./index","engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.2b3","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ee2ac1642ebf138a423acd79e4dc5f4dd91f1cbf","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.2b3.tgz"}},"0.5.3":{"name":"alfred","description":"In-process key-value store","version":"0.5.3","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"git://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"main":"./index.js","engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_id":"alfred@0.5.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d014bfcf56b1f3597f257e0f43d6a4c7faf415f5","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.3.tgz"}},"0.5.4":{"name":"alfred","description":"In-process key-value store","version":"0.5.4","homepage":"http://pgte.github.com/alfred","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"contributors":[{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"}],"repository":{"type":"git","url":"git://github.com/pgte/alfred.git"},"bugs":{"email":"pedro.teixeira@gmail.com","url":"http://github.com/pgte/alfred/issues"},"directories":{"lib":"./lib/alfred"},"main":"./index.js","engines":{"node":">=0.3.1"},"scripts":{},"dependencies":{"step":">=0.0.3","carrier":">= 0.1.0","crc":">= 0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/pgte/alfred/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/alfred/0.5.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"alfred@0.5.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7816fb432942c9c4553f7bed7e7365c4bcc8ccb1","tarball":"http://registry.npmjs.org/alfred/-/alfred-0.5.4.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2011-09-09T23:13:13.306Z","created":"2011-01-06T00:30:11.053Z","0.1.0beta1":"2011-01-06T00:30:11.615Z","0.1.0beta2":"2011-01-06T09:50:41.833Z","0.1.0beta4":"2011-01-06T15:34:34.935Z","0.1.0beta5":"2011-01-07T15:34:15.783Z","0.1.0beta6":"2011-01-10T13:56:09.472Z","0.1.0beta7":"2011-01-12T18:49:42.485Z","0.1.0beta8":"2011-01-13T16:25:24.339Z","0.3.0b1":"2011-01-21T17:34:34.573Z","0.3.0b2":"2011-01-22T00:35:04.738Z","0.3.0b3":"2011-01-24T16:52:45.249Z","0.5.0b1":"2011-01-28T20:40:05.061Z","0.5.0b2":"2011-01-31T18:14:26.342Z","0.5.1b2":"2011-02-09T09:26:58.885Z","0.5.2b1":"2011-02-18T14:36:53.528Z","0.5.2b2":"2011-02-21T15:24:24.169Z","0.5.2b3":"2011-02-21T16:02:46.881Z","0.5.3":"2011-05-23T11:24:02.136Z","0.5.4":"2011-09-09T23:13:13.306Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com","url":"http://metaduck.com"},"repository":{"type":"git","url":"git://github.com/pgte/alfred.git"},"_attachments":{"alfred-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-wLm3UOf6ZE3omU33NqvFAg==","length":643124,"stub":true},"alfred-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-xtEz4AIPVzbuMscBZPS4WQ==","length":36996,"stub":true},"alfred-0.5.2b3.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-8oOkrdS3Po/qWaTqIYWeNQ==","length":40539,"stub":true},"alfred-0.5.2b2.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-DFtnmOQ9aG75eVpWNYwfWQ==","length":40775,"stub":true},"alfred-0.5.2b1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-WFFuQiuaHEW1ea3tNbB5MA==","length":40610,"stub":true},"alfred-0.5.1b2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-CBfpwFqK3/Nf4vyAVXk82w==","length":39022,"stub":true},"alfred-0.5.0b2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-q2msLriJ1GQlXdlXP04Svg==","length":38747,"stub":true},"alfred-0.5.0b1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-hvxxBcDrUDKlaUXpH8vumw==","length":38057,"stub":true},"alfred-0.3.0b3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-8mhjGjEGhB5pchD2OSMdeg==","length":32992,"stub":true},"alfred-0.3.0b2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Yl9OQ9wTr2Do6Zhv2+rVTA==","length":31663,"stub":true},"alfred-0.3.0b1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-8cYEeH8O4YtDZcJXvSM7fA==","length":31612,"stub":true},"alfred-0.1.0beta8.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Hxgrrytrh5Il0lhc7DzcpQ==","length":30939,"stub":true},"alfred-0.1.0beta7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-X6IycJCExDoMtg/JI0pIgw==","length":30880,"stub":true},"alfred-0.1.0beta6.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-bifzcK9HBv9juP+NTs8FGw==","length":30907,"stub":true},"alfred-0.1.0beta5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-foeBkHOsvtbzcGTO4zgs9g==","length":30496,"stub":true},"alfred-0.1.0beta4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-9YYrRZx1XDByyIND79Gyog==","length":412111,"stub":true}}}},
{"id":"alfred-bcrypt","key":"alfred-bcrypt","value":{"rev":"11-7ed10ef318e5515d1ef7c040818ddb22"},"doc":{"_id":"alfred-bcrypt","_rev":"11-7ed10ef318e5515d1ef7c040818ddb22","name":"alfred-bcrypt","description":"A bcrypt library for NodeJS.","dist-tags":{"latest":"0.1.2-1"},"versions":{"0.1.2-1":{"name":"alfred-bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.1.2-1","author":{"name":"Nick Campbell","url":"http://github.com/alfredwesterveld"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/alfredwesterveld/node.bcrypt.js.git"},"directories":{"lib":"."},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/alfredwesterveld/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.3.1"},"_id":"alfred-bcrypt@0.1.2-1","_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"417e15fd6aa56de72d2602eae530f73b1fe884be","tarball":"http://registry.npmjs.org/alfred-bcrypt/-/alfred-bcrypt-0.1.2-1.tgz","bin":{"0.4-darwin-10.7.0":{"shasum":"60e4f55ea4bb36f4422698b0be7e6ce835b0ec64","tarball":"http://registry.npmjs.org/alfred-bcrypt/-/alfred-bcrypt-0.1.2-1-0.4-darwin-10.7.0.tgz"}}}}},"maintainers":[{"name":"alfredwesterveld","email":"alfredwesterveld@gmail.com"}],"time":{"modified":"2011-03-31T21:21:57.033Z","created":"2011-03-31T21:17:42.140Z","0.1.2":"2011-03-31T21:17:42.679Z","0.1.2-1":"2011-03-31T21:19:15.943Z"},"author":{"name":"Nick Campbell","url":"http://github.com/alfredwesterveld"},"repository":{"type":"git","url":"git://github.com/alfredwesterveld/node.bcrypt.js.git"},"_attachments":{"alfred-bcrypt-0.1.2-1-0.4-darwin-10.7.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jZRmhsxwrt/eQefmQcdRxA==","length":81672,"stub":true},"alfred-bcrypt-0.1.2-1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8qvcWl0hTTgGGLZgzuPq5Q==","length":16964,"stub":true}}}},
{"id":"algorithm","key":"algorithm","value":{"rev":"3-9ec0b38298cc15b0f295152de8763358"},"doc":{"_id":"algorithm","_rev":"3-9ec0b38298cc15b0f295152de8763358","name":"algorithm","description":"A collection of Data Structures & Algorithms in javascript","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"algorithm","version":"0.0.2","main":"./algorithm.js","description":"A collection of Data Structures & Algorithms in javascript","author":{"name":"Dhruv Matani"},"dependencies":{},"repositories":[{"type":"git","path":"https://directidhruv@github.com/directidhruv/algorithm-js.git"}],"homepage":"https://github.com/directidhruv/algorithm-js","bugs":{"name":"https://github.com/directidhruv/algorithm-js/issues"},"maintainers":[{"name":"Dhruv","email":"dhruvbird@gmail.com","url":"http://dhruvbird.com/"}],"contributors":[],"licenses":[{"type":"MIT"}],"engine":"node","_id":"algorithm@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c49598d1c87b9f0dfd44be4ac164c7642216ade9","tarball":"http://registry.npmjs.org/algorithm/-/algorithm-0.0.2.tgz"}}},"maintainers":[{"name":"dhruvbird","email":"dhruvbird@gmail.com"}],"time":{"modified":"2011-04-01T11:53:41.838Z","created":"2011-04-01T11:53:40.328Z","0.0.2":"2011-04-01T11:53:41.838Z"},"author":{"name":"Dhruv Matani"},"_attachments":{"algorithm-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Rbi2SKU1Tk64uMUEnudnoA==","length":7146,"stub":true}}}},
{"id":"algorithm-js","key":"algorithm-js","value":{"rev":"9-dd7496b7ec2e3b23cc7bb182ae3aac6d"},"doc":{"_id":"algorithm-js","_rev":"9-dd7496b7ec2e3b23cc7bb182ae3aac6d","name":"algorithm-js","description":"A collection of Data Structures & Algorithms in javascript","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"algorithm-js","version":"0.0.2","main":"./algorithm.js","description":"A collection of Data Structures & Algorithms in javascript","author":{"name":"Dhruv Matani"},"dependencies":{},"repositories":[{"type":"git","path":"https://directidhruv@github.com/directidhruv/algorithm-js.git"}],"homepage":"https://github.com/directidhruv/algorithm-js","bugs":{"name":"https://github.com/directidhruv/algorithm-js/issues"},"maintainers":[{"name":"Dhruv","email":"dhruvbird@gmail.com","url":"http://dhruvbird.com/"}],"contributors":[],"licenses":[{"type":"MIT"}],"engine":"node","_id":"algorithm-js@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fc4f47ad7d3f94558ac5ad58c0a83c32438f3361","tarball":"http://registry.npmjs.org/algorithm-js/-/algorithm-js-0.0.2.tgz"}},"0.0.4":{"name":"algorithm-js","version":"0.0.4","main":"./algorithm.js","description":"A collection of Data Structures & Algorithms in javascript","author":{"name":"Dhruv Matani"},"dependencies":{},"repositories":[{"type":"git","path":"https://directidhruv@github.com/directidhruv/algorithm-js.git"}],"homepage":"https://github.com/directidhruv/algorithm-js","bugs":{"name":"https://github.com/directidhruv/algorithm-js/issues"},"maintainers":[{"name":"Dhruv","email":"dhruvbird@gmail.com","url":"http://dhruvbird.com/"}],"contributors":[],"licenses":[{"type":"MIT"}],"engine":"node","_id":"algorithm-js@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cfe8c474ebb03bddb663a63eda6470b73be73a67","tarball":"http://registry.npmjs.org/algorithm-js/-/algorithm-js-0.0.4.tgz"}},"0.0.5":{"name":"algorithm-js","version":"0.0.5","main":"./algorithm.js","description":"A collection of Data Structures & Algorithms in javascript","author":{"name":"Dhruv Matani"},"dependencies":{},"repositories":[{"type":"git","path":"https://directidhruv@github.com/directidhruv/algorithm-js.git"}],"homepage":"https://github.com/directidhruv/algorithm-js","bugs":{"name":"https://github.com/directidhruv/algorithm-js/issues"},"maintainers":[{"name":"Dhruv","email":"dhruvbird@gmail.com","url":"http://dhruvbird.com/"}],"contributors":[],"licenses":[{"type":"MIT"}],"engine":"node","_id":"algorithm-js@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"28697f8cc60e6ed130f0309babe2921a448fbaa2","tarball":"http://registry.npmjs.org/algorithm-js/-/algorithm-js-0.0.5.tgz"}},"0.0.6":{"name":"algorithm-js","version":"0.0.6","main":"./algorithm.js","description":"A collection of Data Structures & Algorithms in javascript","author":{"name":"Dhruv Matani"},"dependencies":{},"repositories":[{"type":"git","path":"https://directidhruv@github.com/directidhruv/algorithm-js.git"}],"homepage":"https://github.com/directidhruv/algorithm-js","bugs":{"name":"https://github.com/directidhruv/algorithm-js/issues"},"maintainers":[{"name":"Dhruv","email":"dhruvbird@gmail.com","url":"http://dhruvbird.com/"}],"contributors":[],"licenses":[{"type":"MIT"}],"engine":"node","_id":"algorithm-js@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b33b13c74632375611b260e4d627449f63d9688b","tarball":"http://registry.npmjs.org/algorithm-js/-/algorithm-js-0.0.6.tgz"}}},"maintainers":[{"name":"dhruvbird","email":"dhruvbird@gmail.com"}],"time":{"modified":"2011-05-12T18:39:24.452Z","created":"2011-04-01T11:54:46.816Z","0.0.2":"2011-04-01T11:54:47.580Z","0.0.4":"2011-05-07T07:53:15.307Z","0.0.5":"2011-05-08T09:37:35.292Z","0.0.6":"2011-05-12T18:39:24.452Z"},"author":{"name":"Dhruv Matani"},"_attachments":{"algorithm-js-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-a05AL0RfDxNEkTEL8NVS5A==","length":14083,"stub":true},"algorithm-js-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fVS0ezZLZjKm+UhTQMPQMw==","length":14014,"stub":true},"algorithm-js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pAaxMJKOGBhY/JkYr6CzVw==","length":13346,"stub":true},"algorithm-js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oJ9E+TiPTjsPNFL4KW/8JQ==","length":7147,"stub":true}}}},
{"id":"alice-proxy","key":"alice-proxy","value":{"rev":"43-805311a0404c1c79802ebf3cab79554e"},"doc":{"_id":"alice-proxy","_rev":"43-805311a0404c1c79802ebf3cab79554e","name":"alice-proxy","description":"Alice - Http proxy","dist-tags":{"latest":"0.0.20"},"versions":{"0.0.1":{"name":"alice-proxy","version":"0.0.1","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"devDependencies":{"redis":">=0.7.1","hiredis":">=0.1.13"},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3cdcd6d594c212eb52488141f01daaf6ca5d0339","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.1.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.2":{"name":"alice-proxy","version":"0.0.2","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"devDependencies":{"redis":">=0.7.1","hiredis":">=0.1.13"},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7dcebc94ea682675a73d6d24ee425474525ff076","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.2.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.3":{"name":"alice-proxy","version":"0.0.3","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"devDependencies":{"redis":">=0.7.1","hiredis":">=0.1.13"},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ed5357ee571bd0ebcc173bb8445af5b70bcd0427","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.3.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.4":{"name":"alice-proxy","version":"0.0.4","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"devDependencies":{"redis":">=0.7.1","hiredis":">=0.1.13"},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7c5e1bc8bda6b669998b0a0879a67f13f2f54072","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.4.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.5":{"name":"alice-proxy","version":"0.0.5","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"devDependencies":{"redis":">=0.7.1","hiredis":">=0.1.13"},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9c2807a49e1ad3c4066e1e03f744e91b7d7a8cce","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.5.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.6":{"name":"alice-proxy","version":"0.0.6","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f63a7e2ee74c55ca99a9be8aedad3d408942ae4f","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.6.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.7":{"name":"alice-proxy","version":"0.0.7","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"674ff7aec469c299386732959712f2566f65c0da","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.7.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.8":{"name":"alice-proxy","version":"0.0.8","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"0423394d625056412bae4a2cc40bc251ba0ffe42","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.8.tgz"},"maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.9":{"name":"alice-proxy","version":"0.0.9","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.9","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5341cefb06f5c319acd67da1b6e6dc0e6de3cb24","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.9.tgz"},"maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.10":{"name":"alice-proxy","version":"0.0.10","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.10","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ffee83b295780d7a1a0fd120870ce39235691fe4","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.10.tgz"},"maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.11":{"name":"alice-proxy","version":"0.0.11","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.11","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"2d8b2c911a1598edacdb142bc1d21daad0c77a46","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.11.tgz"},"maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.12":{"name":"alice-proxy","version":"0.0.12","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.12","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"7a5b325c6cae4f3e9fceb053c2626bea86e661d3","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.12.tgz"},"maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.13":{"name":"alice-proxy","version":"0.0.13","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.13","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5f3e076da8bd9dffc206bd6c80fb9389451f620c","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.13.tgz"},"maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.14":{"name":"alice-proxy","version":"0.0.14","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.14","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"80a7faadd1c2180f47bbc19c5656d7724a6b55e1","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.14.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.15":{"name":"alice-proxy","version":"0.0.15","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.15","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d41dd6e7b097466715d311786ef79f4202745b89","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.15.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.16":{"name":"alice-proxy","version":"0.0.16","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"simonmenke","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.16","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c0e406feb520541ad2e6fe822ec4ad3f9122fc2e","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.16.tgz"},"readme":"","maintainers":[{"name":"simonmenke","email":"simon.menke@gmail.com"}]},"0.0.17":{"name":"alice-proxy","version":"0.0.17","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"fd","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.17","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1528edea0a640569cee4247bb1f8ff5df9f15f07","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.17.tgz"},"readme":"","maintainers":[{"name":"fd","email":"simon.menke@gmail.com"}]},"0.0.18":{"name":"alice-proxy","version":"0.0.18","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"fd","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.18","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8cfea185cdfb6cfaa7e5fde19f70cada82d1aa3a","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.18.tgz"},"readme":"","maintainers":[{"name":"fd","email":"simon.menke@gmail.com"}]},"0.0.19":{"name":"alice-proxy","version":"0.0.19","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"fd","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.19","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1f3ddd50f783e1a61b87de89b103d69afdf2213d","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.19.tgz"},"readme":"","maintainers":[{"name":"fd","email":"simon.menke@gmail.com"}]},"0.0.20":{"name":"alice-proxy","version":"0.0.20","description":"Alice - Http proxy","author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"contributors":[],"main":"./src/proxy.js","scripts":{},"repository":{"url":""},"_npmUser":{"name":"fd","email":"simon.menke@gmail.com"},"_id":"alice-proxy@0.0.20","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"647d2799e630957905909904711ed8228e9995a0","tarball":"http://registry.npmjs.org/alice-proxy/-/alice-proxy-0.0.20.tgz"},"readme":"","maintainers":[{"name":"fd","email":"simon.menke@gmail.com"}]}},"readme":"","maintainers":[{"name":"fd","email":"simon.menke@gmail.com"}],"time":{"modified":"2012-01-30T14:49:28.606Z","created":"2011-12-30T11:59:57.272Z","0.0.1":"2011-12-30T11:59:59.492Z","0.0.2":"2011-12-30T15:07:09.615Z","0.0.3":"2012-01-01T16:33:09.041Z","0.0.4":"2012-01-01T19:00:49.518Z","0.0.5":"2012-01-01T19:32:52.958Z","0.0.6":"2012-01-01T19:40:04.358Z","0.0.7":"2012-01-02T22:59:50.930Z","0.0.8":"2012-01-05T15:01:31.861Z","0.0.9":"2012-01-05T16:23:19.246Z","0.0.10":"2012-01-05T16:25:24.925Z","0.0.11":"2012-01-05T16:38:52.167Z","0.0.12":"2012-01-05T16:43:21.301Z","0.0.13":"2012-01-05T16:48:11.278Z","0.0.14":"2012-01-09T10:36:05.125Z","0.0.15":"2012-01-10T19:43:19.761Z","0.0.16":"2012-01-11T09:06:27.136Z","0.0.17":"2012-01-19T12:01:35.254Z","0.0.18":"2012-01-23T15:43:32.891Z","0.0.19":"2012-01-27T09:27:32.294Z","0.0.20":"2012-01-30T14:49:28.606Z"},"author":{"name":"Simon Menke","email":"simon.menke@gmail.com"},"repository":{"url":""},"_attachments":{"alice-proxy-0.0.20.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-ZREtbsl8LLseDzfsP2BXaw==","length":2707,"stub":true},"alice-proxy-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-6KzJ2HoN6vRd5gZanlaNWg==","length":2715,"stub":true},"alice-proxy-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-yABjaPhfFacIKYhc7GWX1A==","length":2650,"stub":true},"alice-proxy-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-f4Q+DjfsrTSCCoSV34yRsg==","length":2617,"stub":true},"alice-proxy-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Oe8iM687jUWliwdEAUH2yA==","length":2617,"stub":true},"alice-proxy-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-IDBj8tAGLbOQF59NSrUp/w==","length":2554,"stub":true},"alice-proxy-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-X+GLzu7WRSzXcBZuIkxbBA==","length":2544,"stub":true},"alice-proxy-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-bR5E9Kdx84P/C+OlegqUeA==","length":10240,"stub":true},"alice-proxy-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-YaMby6sLEsi966jq34X7Yw==","length":10240,"stub":true},"alice-proxy-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1n4yyt7TgYDn8M9x98mYOw==","length":10240,"stub":true},"alice-proxy-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-+oUX8mEMwPrzVnTfqIdIXA==","length":10240,"stub":true},"alice-proxy-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-2QxpVqnIC1n72asfCwuAQQ==","length":10240,"stub":true},"alice-proxy-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-R1x1K+pHgTZp2LkbVWm4mA==","length":10240,"stub":true},"alice-proxy-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Y5u8SkLj+w2z5oeyJY2oUw==","length":2526,"stub":true},"alice-proxy-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-65izbM+r4C2zSy/SWboBFQ==","length":2496,"stub":true},"alice-proxy-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-8i8Jhi1mwibMU8hpa9EyyQ==","length":2540,"stub":true},"alice-proxy-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-EqxVnn1NBJOZlc5zVznChw==","length":2500,"stub":true},"alice-proxy-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2OOiUBCX+5DX5+8+liIMng==","length":2150,"stub":true},"alice-proxy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5/D/h4h2/EV62fFwyNhkCQ==","length":2049,"stub":true},"alice-proxy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3oz63+S4EWq6R5cXw6T5Qg==","length":2004,"stub":true}}}},
{"id":"alicejs","key":"alicejs","value":{"rev":"3-aa018cf7a2f6ae72426f432f5ab5ad57"},"doc":{"_id":"alicejs","_rev":"3-aa018cf7a2f6ae72426f432f5ab5ad57","name":"alicejs","description":"Micro JS library focused on using hardware-accelerated capabilities (NPM Dist)","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"alicejs","description":"Micro JS library focused on using hardware-accelerated capabilities (NPM Dist)","author":{"name":"Mike Bevz","url":"myb@theappfellas.com"},"url":"https://bitbucket.org/mikebevz/alicejs","keywords":["alicejs","alice","animation","css"],"version":"0.2.0","main":"./index","engines":{"node":"*"},"_npmUser":{"name":"mikebevz","email":"myb@theappfellas.com"},"_id":"alicejs@0.2.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b1f0fdd11fb5ae7a892ff57756e760549725469e","tarball":"http://registry.npmjs.org/alicejs/-/alicejs-0.2.0.tgz"},"maintainers":[{"name":"mikebevz","email":"myb@theappfellas.com"}]}},"readme":null,"maintainers":[{"name":"mikebevz","email":"myb@theappfellas.com"}],"time":{"modified":"2012-04-17T11:48:11.832Z","created":"2012-04-17T11:48:07.535Z","0.2.0":"2012-04-17T11:48:11.832Z"},"author":{"name":"Mike Bevz","url":"myb@theappfellas.com"},"_attachments":{"alicejs-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4+76wTiqr32gr4Qg+M/rSw==","length":10240,"stub":true}}}},
{"id":"alists","key":"alists","value":{"rev":"7-7d5063d5564a0f4ceaad8d40bc6c274a"},"doc":{"_id":"alists","_rev":"7-7d5063d5564a0f4ceaad8d40bc6c274a","name":"alists","description":"Some helper functions to work with associative lists.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"name":"alists","description":"Some helper functions to work with associative lists.","version":"0.0.0","repository":{"type":"git","url":"git://github.com/jesusabdullah/node-alists.git"},"main":"alists.js","engines":{"node":"=0.4.x"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/josh/.npm/alists/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"alists@0.0.0","dependencies":{},"_engineSupported":false,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"d6a3979356a5a87e625cb1a45e64611d04d66a33","tarball":"http://registry.npmjs.org/alists/-/alists-0.0.0.tgz"},"scripts":{}},"0.0.1":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"name":"alists","description":"Some helper functions to work with associative lists.","version":"0.0.1","repository":{"type":"git","url":"git://github.com/jesusabdullah/node-alists.git"},"main":"alists.js","engines":{"node":"0.4.x"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/josh/.npm/alists/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"alists@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"61f2ef4a337fbd5b7248f8b87b71bb7d0ac03cf4","tarball":"http://registry.npmjs.org/alists/-/alists-0.0.1.tgz"},"scripts":{}},"0.0.2":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"name":"alists","description":"Some helper functions to work with associative lists.","version":"0.0.2","repository":{"type":"git","url":"git://github.com/jesusabdullah/node-alists.git"},"main":"alists.js","engines":{"node":"*"},"devDependencies":{},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"alists@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"bdf40c0477d0ce84b84df5641195dc1355060aec","tarball":"http://registry.npmjs.org/alists/-/alists-0.0.2.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}]}},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"time":{"modified":"2011-12-08T23:17:00.776Z","created":"2011-07-12T01:01:49.906Z","0.0.0":"2011-07-12T01:01:51.239Z","0.0.1":"2011-07-12T01:09:35.707Z","0.0.2":"2011-12-08T23:17:00.776Z"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"repository":{"type":"git","url":"git://github.com/jesusabdullah/node-alists.git"},"_attachments":{"alists-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ifZBG95/ZyoeJc17j0JIbg==","length":1069,"stub":true},"alists-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JcdrAzbnoJabrhzHrsaxdA==","length":1068,"stub":true},"alists-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6sLwyS3lI6ZWFvzlK1LOhQ==","length":1073,"stub":true}}}},
{"id":"alive","key":"alive","value":{"rev":"7-33e4cddf2bb0d3f68f5a4a60ebae7e1e"},"doc":{"_id":"alive","_rev":"7-33e4cddf2bb0d3f68f5a4a60ebae7e1e","name":"alive","description":"A JS implementation of Conway's Game of Life.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"author":{"name":"Jamison Dance","email":"jergason@gmail.com","url":"http://jamisondance.com/"},"name":"alive","description":"A JS implementation of Conway's Game of Life.","keywords":["game","life","conway"],"version":"0.0.2","repository":{"type":"git","url":"git://github.com/jergason/alive.git"},"main":"./alive.js","scripts":{"test":"vows --spec test/*"},"engines":{"node":">=0.4.x"},"dependencies":{},"devDependencies":{"vows":"0.6.x"},"_npmUser":{"name":"jergason","email":"jergason@gmail.com"},"_id":"alive@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6ba3bd60801a64d6e73303d69f65bc11f433fe07","tarball":"http://registry.npmjs.org/alive/-/alive-0.0.2.tgz"},"maintainers":[{"name":"jergason","email":"jergason@gmail.com"}],"directories":{}}},"readme":"# Life.js\n\nLife.js is an implementation of Conway's Game of Life in JavaScript. It should\nwork in both the browser and node.js.\n\n\n## Installation\n\n```bash\nnpm install life\n```\n\n## Usage\n\nLife.js is packaged as a CommonJS module, which means it exports a function to a\nglobal `module.exports` object. To use it in Node.js, just `require` it.\n\n```JavaScript\n// Node.js\nvar Life = require('alive')\n  , life\n```\nTo use in the browser, you need to define a global `module` object before you\nload Alive.\n\n```HTML\n<head>\n  <script type='text/javascript'>\n    window.module = {};\n  </script>\n  <script type='text/javascript' src='alive.js'></script>\n```\n\nYour actual app code would look something like this.\n\n```JavaScript\n// size of the grid\nlife = new Life(64);\nlife.getCell(0, 0); // initialized to zero\nlife.setCell(0, 0, 1); // turn on a cell\nlife.setCell(0, 1, 1);\nlife.setCell(1, 1, 1);\nlife.tick()\n```\n","maintainers":[{"name":"jergason","email":"jergason@gmail.com"}],"time":{"modified":"2012-02-21T06:32:26.641Z","created":"2012-01-30T10:09:17.272Z","0.0.2":"2012-01-30T10:09:18.562Z","0.0.3":"2012-02-21T06:12:49.840Z"},"author":{"name":"Jamison Dance","email":"jergason@gmail.com","url":"http://jamisondance.com/"},"repository":{"type":"git","url":"git://github.com/jergason/alive.git"},"_attachments":{"alive-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jCAG5GOtn+01tsXLVKqZtg==","length":10240,"stub":true}}}},
{"id":"alleup","key":"alleup","value":{"rev":"17-2356020affc1c8ba769ace8df372239a"},"doc":{"_id":"alleup","_rev":"17-2356020affc1c8ba769ace8df372239a","name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","version":"0.0.1","keywords":["upload","image","imagemagick","amazon","aws","s3","resize","file"],"homepage":"https://github.com/tih-ra/alleup","repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"engines":{"node":"~0.4.11"},"dependencies":{"formidable":"~1.0.7","imagemagick":"~0.1.2","knox":"~0.0.9"},"devDependencies":{},"_npmUser":{"name":"andriy","email":"andriy.bazyuta@gmail.com"},"_id":"alleup@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fd1941043312f514456118561489236f01a5a004","tarball":"http://registry.npmjs.org/alleup/-/alleup-0.0.1.tgz"},"maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","version":"0.0.2","keywords":["upload","image","imagemagick","amazon","aws","s3","resize","file"],"homepage":"https://github.com/tih-ra/alleup","repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"engines":{"node":">= 0.4.1 < 0.7.0"},"dependencies":{"formidable":"~1.0.7","imagemagick":"~0.1.2","knox":"~0.0.9"},"devDependencies":{},"_npmUser":{"name":"andriy","email":"andriy.bazyuta@gmail.com"},"_id":"alleup@0.0.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"90d7a41ae2c5e52f5b61eec9635618ace5a81404","tarball":"http://registry.npmjs.org/alleup/-/alleup-0.0.2.tgz"},"maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","version":"0.0.3","keywords":["upload","image","imagemagick","amazon","aws","s3","resize","file"],"homepage":"https://github.com/tih-ra/alleup","repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"engines":{"node":">= 0.4.1 < 0.7.0"},"dependencies":{"formidable":"~1.0.7","imagemagick":"~0.1.2","knox":"~0.0.9"},"devDependencies":{},"_npmUser":{"name":"andriy","email":"andriy.bazyuta@gmail.com"},"_id":"alleup@0.0.3","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e9896509c70d13007f681d4247e35f59531342e8","tarball":"http://registry.npmjs.org/alleup/-/alleup-0.0.3.tgz"},"maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}],"directories":{}},"0.0.5":{"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","version":"0.0.5","keywords":["upload","image","imagemagick","amazon","aws","s3","resize","file"],"homepage":"https://github.com/tih-ra/alleup","repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"engines":{"node":">= 0.4.1 < 0.7.0"},"dependencies":{"formidable":"~1.0.7","imagemagick":"~0.1.2","knox":"~0.0.9"},"devDependencies":{},"_npmUser":{"name":"andriy","email":"andriy.bazyuta@gmail.com"},"_id":"alleup@0.0.5","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"cc45bc68c25319a31fe54784a9cd53e39c67d5ae","tarball":"http://registry.npmjs.org/alleup/-/alleup-0.0.5.tgz"},"maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}]},"0.1.0":{"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","version":"0.1.0","keywords":["upload","image","imagemagick","amazon","aws","s3","resize","file"],"homepage":"https://github.com/tih-ra/alleup","repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"engines":{"node":">= 0.4.1 < 0.7.0"},"dependencies":{"formidable":"~1.0.7","imagemagick":"~0.1.2","knox":"~0.0.9"},"devDependencies":{},"_npmUser":{"name":"andriy","email":"andriy.bazyuta@gmail.com"},"_id":"alleup@0.1.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"05f642306f959212a2e72dd737e1237a79e7c3fd","tarball":"http://registry.npmjs.org/alleup/-/alleup-0.1.0.tgz"},"maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}]},"0.1.1":{"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"name":"alleup","description":"Flexible way to resize and upload images to Amazon S3 or file system storages","version":"0.1.1","keywords":["upload","image","imagemagick","amazon","aws","s3","resize","file"],"homepage":"https://github.com/tih-ra/alleup","repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"engines":{"node":">= 0.4.1 <= 0.8.6"},"dependencies":{"formidable":"~1.0.7","imagemagick":"~0.1.2","knox":"~0.0.9"},"devDependencies":{},"_npmUser":{"name":"andriy","email":"andriy.bazyuta@gmail.com"},"_id":"alleup@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2c0a1c7a1174bb5d0123a10e54a2ac73f1e72cff","tarball":"http://registry.npmjs.org/alleup/-/alleup-0.1.1.tgz"},"maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}]}},"readme":"Alleup\n=============\n\nFlexible way to resize and upload images to Amazon S3 or file system storages for Node.js. Possible  to add different versions of the same file in cropped or resized variant.\n\n## Installation\n    $ npm install alleup\n\n## Quick Start\n\n1. **You need to create alleup configuration file with image variants and your storages**\nExample:\n\n    ```javascript\n    {\n\t\t\"variants\": {\n\t\t\t\"resize\": {\n\t\t\t\t\"mini\" : \"300x200\",\n\t\t\t\t\"preview\": \"800x600\"\n\t\t\t},\n\t\t\t\"crop\": {\n\t\t\t\t\"thumb\": \"200x200\"\n\t\t\t}\n\t\t},\n\n\t\t\"storage\": {\n\t\t\t\"aws\": {\n\t\t\t\t\"key\" : \"AWS_KEY\",\n\t\t\t\t\"secret\" : \"AWS_SECRET\",\n\t\t\t\t\"bucket\" : \"AWS_BUCKET\"\n\t\t\t},\n\t\t\t\"dir\": {\n\t\t\t\t\"path\" : \"./public/images/\" \n\t\t\t}\n\t\t}\n\t}\n\t\n2. **Now you can use Alleup**\n  \n    ```javascript\n    var  Alleup = require('alleup');\n    var alleup = new Alleup({storage : \"aws\", config_file: \"path_to_alleup_config.json\"})\n\t\n  You can use `storage: 'aws'` for store files on Amazon S3 or `storage: 'dir'` for store files in filesystem\n\n## UPLOAD, URL and DELETE\n\t\n1. **Upload example:**\n\t\n    ```javascript\n    app.post('/upload',  function(req, res) {\n      alleup.upload(req, res, function(err, file, res){\n\n          console.log(\"FILE UPLOADED: \" + file);\n          // THIS YOU CAN SAVE FILE TO DATABASE FOR EXAMPLE\n          res.end();\n      });\n    });\n\n2. **Remove uploaded file example:**\n\n    ```javascript\n    app.get('/delete',  function(req, res) {\n      alleup.remove('1322506647.jpg', function(err) {\n\n          // THIS YOU CAN DELETE FILE FROM DATABASE FOR EXAMPLE\n          res.end();\n      });\n    });\n\n3. **Get file url example:**\n\n    ```javascript\n    alleup.url(file, variant);\n\n`file` - The name of the file you uploaded, saved for example in database (`345621345.jpg`), `variant` - one of your image variants names from alleup_congig.json\n\t\n### Contribution\n**Pull requests are welcome!!!**\n\n### License\n(The MIT License)\n\nCopyright (c) 2011 Andriy Bazyuta &lt;andriy.bazyuta@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---\n### Author\nAndriy Bazyuta","maintainers":[{"name":"andriy","email":"andriy.bazyuta@gmail.com"}],"time":{"modified":"2012-08-08T14:32:21.724Z","created":"2011-11-28T21:55:55.848Z","0.0.1":"2011-11-28T21:55:57.829Z","0.0.2":"2011-11-28T22:54:53.991Z","0.0.3":"2011-12-02T00:59:51.245Z","0.0.5":"2011-12-03T02:42:40.411Z","0.1.0":"2011-12-25T16:37:42.255Z","0.1.1":"2012-08-08T14:32:21.724Z"},"author":{"name":"Andriy Bazuta","email":"andriy.bazyuta@gmail.com","url":"http://andriy.bazyuta.me"},"repository":{"type":"git","url":"git://github.com/tih-ra/alleup.git"},"_attachments":{"alleup-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-v+v+lsfJ5CtDnMxBBPzu9Q==","length":10240,"stub":true},"alleup-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-7g52UNY5RmWVQDz5Bs9nSw==","length":10240,"stub":true},"alleup-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-llZBGuOddRZxyUUOzYdqKQ==","length":10240,"stub":true},"alleup-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-XiVqd8qzVkYOaZbM3RLimQ==","length":10240,"stub":true},"alleup-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dQMC3IRjnlyyddTsbltSQQ==","length":10240,"stub":true},"alleup-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Y8JKlHpiDdLJia/MZMQrOw==","length":10240,"stub":true}}}},
{"id":"allium","key":"allium","value":{"rev":"9-7f506f87e470a4cae6ba7b0fe58e8386"},"doc":{"_id":"allium","_rev":"9-7f506f87e470a4cae6ba7b0fe58e8386","name":"allium","description":"Simpler Gherkin parsing","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"allium","version":"0.1.0","description":"Simpler Gherkin parsing","keywords":["gherkin","cucumber","bdd","parsing"],"homepage":"http://github.com/anneli/allium","bugs":{"email":"a@unnali.com","url":"http://github.com/anneli/allium/issues"},"author":{"name":"Arlen Cuss","email":"a@unnali.com","url":"http://unnali.com"},"main":"lib/allium.js","dependencies":{"underscore":"~1.3.3","underscore.string":"~2.2.0rc"},"devDependencies":{"coffee-script":"~1.3.1","mocha":"~1.0.2","docco":"~0.3.0"},"repository":{"type":"git","url":"git://github.com/anneli/allium.git"},"_npmUser":{"name":"unnali","email":"a@unnali.com"},"_id":"allium@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"46cbb727f414adf9e1abf348114f7a58217d4ca1","tarball":"http://registry.npmjs.org/allium/-/allium-0.1.0.tgz"},"maintainers":[{"name":"unnali","email":"a@unnali.com"}]},"0.2.0":{"name":"allium","version":"0.2.0","description":"Simpler Gherkin parsing","keywords":["gherkin","cucumber","bdd","parsing"],"homepage":"http://github.com/anneli/allium","bugs":{"email":"a@unnali.com","url":"http://github.com/anneli/allium/issues"},"author":{"name":"Arlen Cuss","email":"a@unnali.com","url":"http://unnali.com"},"main":"lib/allium.js","dependencies":{"underscore":"~1.3.3","underscore.string":"~2.2.0rc"},"devDependencies":{"coffee-script":"~1.3.1","mocha":"~1.0.2","docco":"~0.3.0"},"repository":{"type":"git","url":"git://github.com/anneli/allium.git"},"_npmUser":{"name":"unnali","email":"a@unnali.com"},"_id":"allium@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b8e118702d8e3a6498ce4ac7512dd615c134e44c","tarball":"http://registry.npmjs.org/allium/-/allium-0.2.0.tgz"},"maintainers":[{"name":"unnali","email":"a@unnali.com"}]},"0.2.1":{"name":"allium","version":"0.2.1","description":"Simpler Gherkin parsing","keywords":["gherkin","cucumber","bdd","parsing"],"homepage":"http://github.com/anneli/allium","bugs":{"email":"a@unnali.com","url":"http://github.com/anneli/allium/issues"},"author":{"name":"Arlen Cuss","email":"a@unnali.com","url":"http://unnali.com"},"main":"lib/allium.js","dependencies":{"underscore":"~1.3.3","underscore.string":"~2.2.0rc"},"devDependencies":{"coffee-script":"~1.3.1","mocha":"~1.0.2","docco":"~0.3.0"},"repository":{"type":"git","url":"git://github.com/anneli/allium.git"},"_npmUser":{"name":"unnali","email":"a@unnali.com"},"_id":"allium@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b824a93a26217da9dac748816a0b559e85f93d72","tarball":"http://registry.npmjs.org/allium/-/allium-0.2.1.tgz"},"maintainers":[{"name":"unnali","email":"a@unnali.com"}]},"0.2.2":{"name":"allium","version":"0.2.2","description":"Simpler Gherkin parsing","keywords":["gherkin","cucumber","bdd","parsing"],"homepage":"http://github.com/unnali/allium","bugs":{"email":"a@unnali.com","url":"http://github.com/unnali/allium/issues"},"author":{"name":"Arlen Cuss","email":"a@unnali.com","url":"http://unnali.com"},"main":"lib/allium.js","dependencies":{"underscore":"~1.3.3","underscore.string":"~2.2.0rc","mocha":"~1.0.2"},"devDependencies":{"coffee-script":"~1.3.1","docco":"~0.3.0"},"repository":{"type":"git","url":"git://github.com/unnali/allium.git"},"scripts":{"test":"mocha"},"_npmUser":{"name":"unnali","email":"a@unnali.com"},"_id":"allium@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"59d15b74b202dacf694239fd90588f1550ed1836","tarball":"http://registry.npmjs.org/allium/-/allium-0.2.2.tgz"},"maintainers":[{"name":"unnali","email":"a@unnali.com"}]}},"readme":"# allium\n\nSimpler Gherkin parsing for Node.js.\n\nRead the [literate source code](http://anneli.github.com/allium/) to find out how it works.\n\n## installation\n\nSoon to be on NPM.\n","maintainers":[{"name":"unnali","email":"a@unnali.com"}],"time":{"modified":"2012-05-16T22:48:45.671Z","created":"2012-04-29T12:11:06.348Z","0.1.0":"2012-04-29T12:11:11.105Z","0.2.0":"2012-04-29T12:41:03.793Z","0.2.1":"2012-04-29T12:49:36.169Z","0.2.2":"2012-05-16T22:48:45.671Z"},"author":{"name":"Arlen Cuss","email":"a@unnali.com","url":"http://unnali.com"},"repository":{"type":"git","url":"git://github.com/unnali/allium.git"},"_attachments":{"allium-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ONFXieR2FZy6vu5ynpaeMA==","length":17331,"stub":true},"allium-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9/tdGF9u2JiZE6whBowibA==","length":17087,"stub":true},"allium-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BMBzTlkbRFlO/Nn6lerZTA==","length":5201,"stub":true},"allium-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qnzIh+ZKEtXs54vHb5pnwg==","length":5200,"stub":true}}}},
{"id":"allocine","key":"allocine","value":{"rev":"41-7b9e1452b7fdd0996f03fa3952cc2d9d"},"doc":{"_id":"allocine","_rev":"41-7b9e1452b7fdd0996f03fa3952cc2d9d","name":"allocine","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.1":{"name":"allocine","version":"0.0.1","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./src/Allocine.js","dependencies":{"underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"69fb17b03113a848081bab33faba55a898e5c1b6","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.0.1.tgz"},"readme":"","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}],"directories":{}},"0.0.2":{"name":"allocine","version":"0.0.2","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./src/Allocine.js","dependencies":{"underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d7ec6f8ca67f542a40fea3807ca7a5e030062250","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.0.2.tgz"},"readme":"","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}],"directories":{}},"0.0.3":{"name":"allocine","version":"0.0.3","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./src/Allocine.js","dependencies":{"underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"786fb9da26dd0460462ea79d744b3342bbaf7029","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.0.3.tgz"},"readme":"","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}],"directories":{}},"0.0.4":{"name":"allocine","version":"0.0.4","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./src/Allocine.js","dependencies":{"underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6ce15356d5c725b6ec26d1e8f5c0b6d44d89ff31","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.0.4.tgz"},"readme":"","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}],"directories":{}},"0.0.5":{"name":"allocine","version":"0.0.5","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./lib/Allocine.js","dependencies":{"moment":"latest","promised-io":"latest","underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"218900d3e351542401d6b0ccd3acb911df4f2b0e","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.0.5.tgz"},"readme":"","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}]},"0.1.0":{"name":"allocine","version":"0.1.0","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./lib/Allocine.js","dependencies":{"moment":"latest","promised-io":"latest","underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8faa95692922f09d94e01d4c8f89b9e20721a664","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.1.0.tgz"},"readme":"js.node-allocine\n================","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}]},"0.1.1":{"name":"allocine","version":"0.1.1","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./lib/Allocine.js","dependencies":{"moment":"latest","promised-io":"latest","underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.1.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"223dbe1b717b3d5b4e944614063129492cc37a5b","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.1.1.tgz"},"readme":"js.node-allocine\n================","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}]},"0.1.2":{"name":"allocine","version":"0.1.2","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./lib/Allocine.js","dependencies":{"moment":"latest","promised-io":"latest","underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.1.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b10c5d1d2630446bf8c324764638d5c7f798dbbc","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.1.2.tgz"},"readme":"js.node-allocine\n================","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}]},"0.1.3":{"name":"allocine","version":"0.1.3","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./lib/Allocine.js","dependencies":{"moment":"latest","promised-io":"latest","underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.1.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"143fc312ba630ff95dae2858c99fe99639325c09","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.1.3.tgz"},"readme":"js.node-allocine\n================","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}]},"0.1.4":{"name":"allocine","version":"0.1.4","author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"main":"./lib/Allocine.js","dependencies":{"moment":"latest","promised-io":"latest","underscore":"latest"},"_npmUser":{"name":"arcanis","email":"nison.mael@gmail.com"},"_id":"allocine@0.1.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a372bf0a6dbbfda80ab646bec1e8cc2aee6286b6","tarball":"http://registry.npmjs.org/allocine/-/allocine-0.1.4.tgz"},"readme":"js.node-allocine\n================","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}]}},"readme":"","maintainers":[{"name":"arcanis","email":"nison.mael@gmail.com"}],"time":{"modified":"2012-06-08T00:55:54.605Z","created":"2012-06-03T02:03:02.312Z","0.0.1":"2012-06-03T02:03:05.889Z","0.0.2":"2012-06-04T14:12:43.047Z","0.0.3":"2012-06-04T22:46:55.259Z","0.0.4":"2012-06-05T10:26:39.038Z","0.0.5":"2012-06-06T00:23:57.003Z","0.1.0":"2012-06-07T10:22:49.726Z","0.1.1":"2012-06-07T22:38:02.129Z","0.1.2":"2012-06-08T00:10:15.879Z","0.1.3":"2012-06-08T00:21:40.807Z","0.1.4":"2012-06-08T00:55:54.605Z"},"author":{"name":"Maël Nison","email":"nison.mael@gmail.com"},"_attachments":{"allocine-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-wSue8rFZJZAIlpUviL/+uw==","length":2294,"stub":true},"allocine-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-jN7LnIp95sQsXGXhc4rcMg==","length":2275,"stub":true},"allocine-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-gFS86coDMA+v3aY9ndp1GQ==","length":2252,"stub":true},"allocine-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-5IufVzZXc8KK/tPM9dJv+A==","length":2224,"stub":true},"allocine-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-No/gYXDx0MsNQxsyYx0LUA==","length":2012,"stub":true},"allocine-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-OPVhiAc3mClC0/ADVN78SQ==","length":1859,"stub":true},"allocine-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-/P4J53muWLQfUlEPkF+tmg==","length":2536109,"stub":true},"allocine-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-KS9ZlmQO9TOzOqJGXnEPBA==","length":2536096,"stub":true},"allocine-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2uaZvFl2JMfQXVNcTb3jzQ==","length":2536244,"stub":true},"allocine-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-c6N7G4E1f3B0W+pmD7vS5Q==","length":2536212,"stub":true}}}},
{"id":"alloy","key":"alloy","value":{"rev":"74-d15729e3b09b19d7bca378c8223291be"},"doc":{"_id":"alloy","_rev":"74-d15729e3b09b19d7bca378c8223291be","name":"alloy","description":"Appcelerator Titanium MVC Framework","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.0","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"jhaynie","email":"jhaynie@appcelerator.com"},"_id":"alloy@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9f8faa63d7ca8d62eb4f1c21e829ef3244ba830d","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.1","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"476d81959e04c34b039dc4ffa00b2c510d2fc33d","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.1.tgz"},"directories":{}},"0.1.2":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.2","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a6adbd580ac845573945dcffca8221074411a7a3","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.2.tgz"},"directories":{}},"0.1.3":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.3","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"},"_id":"alloy@0.1.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8fbed9cceb1ba17739452582337b80bdaa7bff24","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.3.tgz"},"directories":{}},"0.1.4":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.4","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"6cd7cc15aeaf53aaf65a4493b6218c1d50f11a69","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.4.tgz"},"directories":{}},"0.1.5":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.5","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"ec1398d3aba952c409b1f4d45fe7ad4857c68b7b","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.5.tgz"},"directories":{}},"0.1.6":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.6","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"jhaynie","email":"jhaynie@appcelerator.com"},"_id":"alloy@0.1.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f9bac76f3ccc13485326b3de9ecb65b858a357f5","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.6.tgz"},"directories":{}},"0.1.7":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.7","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"jhaynie","email":"jhaynie@appcelerator.com"},"_id":"alloy@0.1.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f8cd179e4040a13623b31fb2a7820c402ff01c50","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.7.tgz"},"directories":{}},"0.1.8":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.8","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.8","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"520b16ff29558ceae1b371bfac995316e31d5273","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.8.tgz"},"directories":{}},"0.1.10":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.10","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.10","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"23a762e65e2223e2163b7c45733da3de85e967b9","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.10.tgz"},"directories":{}},"0.1.11":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.11","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.11","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b04e23523040607368f863257484f398c957c5ce","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.11.tgz"},"directories":{}},"0.1.12":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.12","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.12","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"bd266bd5b4d796a1403818c7fdd4b0745572d12c","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.12.tgz"},"directories":{}},"0.1.13":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.13","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.13","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"ba6d64996ed09be2d83be12155926a32dd27907e","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.13.tgz"},"directories":{}},"0.1.14":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.14","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.14","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"ee83ac57acc28687c34a0189b39bcad193a72132","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.14.tgz"},"directories":{}},"0.1.15":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.15","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"jhaynie","email":"jhaynie@appcelerator.com"},"_id":"alloy@0.1.15","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"97cd2f9c02e76dad0e7e86fbff545eb34f69b015","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.15.tgz"}},"0.1.16":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.16","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.16","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"7673798aed76a06ae0468e2e3f4761866feceffc","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.16.tgz"}},"0.1.17":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.17","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.17","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"cf5e2133f47fd324ba0a70f0dae87c878ca293c8","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.17.tgz"}},"0.1.19":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.19","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.19","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a38ea7ad699a9c711f4ab58f70b7018a587f4c3e","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.19.tgz"}},"0.1.20":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.20","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.20","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"35f95797854a3012b04f3025ea1f9119b089e45f","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.20.tgz"}},"0.1.21":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.21","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.21","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"37647b918b7063feaa5f7894d8326d36ac35b7ba","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.21.tgz"}},"0.1.22":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.22","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.22","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d2e4b13cd6a8bf45521663a64d977cc3952b1700","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.22.tgz"}},"0.1.23":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.23","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.23","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4c881f33af42c44f0e1d1b23eefff0ef73b8888c","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.23.tgz"}},"0.1.24":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.24","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.24","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"94f0256021b01fc7dca67bd9a7113a978a3003ce","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.24.tgz"}},"0.1.25":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.25","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9","jake":">=0.3"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.25","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3441a6a1cdb9d5831f7b1369b829e9c919479de4","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.25.tgz"}},"0.1.26":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.26","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9","jake":">=0.3"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.26","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b59018156a302204656f07419be0f30cfee40fea","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.26.tgz"}},"0.1.27":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.27","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9","jake":">=0.3"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.27","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"6f90da9173a60a7d3984aee3f2c78830be90cfb4","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.27.tgz"}},"0.1.28":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.28","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9","jake":">=0.3"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.28","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"21b1764b061d9c468363d1ce89f4c858065d9a70","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.28.tgz"}},"0.1.29":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.1.29","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","optimist":"0.3.4","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9","jake":">=0.3"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.1.29","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"79828ff4cac75f2294b7745c1c2638fb40bf309b","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.1.29.tgz"}},"0.2.0":{"name":"alloy","description":"Appcelerator Titanium MVC Framework","keywords":["appcelerator","titanium","alloy","mobile","ios","iphone","android","blackberry","html5","mobileweb"],"version":"0.2.0","author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"contributors":[{"name":"Jeff Haynie","email":"jhaynie@appcelerator.com"},{"name":"Kevin Whinnery","email":"kwhinnery@appcelerator.com"}],"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"preferGlobal":true,"dependencies":{"colors":"0.6.0-1","pkginfo":"0.2.2","commander":"0.6.1","wrench":"1.3.9","xmldom":"0.1.9","jake":">=0.3"},"license":"Apache Public License v2","bin":{"alloy":"./bin/alloy"},"main":"./Alloy/alloy","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},"_id":"alloy@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"cd9a9379993a796f37cfcf37c06bfdc942160728","tarball":"http://registry.npmjs.org/alloy/-/alloy-0.2.0.tgz"}}},"readme":"Alloy\n=====\n\nAlloy is a new application framework by [Appcelerator](http://www.appcelerator.com) for [Titanium](http://www.appcelerator.com/platform).\n\nIt provides a nice [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) framework for developers \nthat are building Titanium apps.  \n\nCurrent Status\n--------------\n\n*June 10, 2012* - _Unstable_\n\n\nGoals\n------\n\nThe following are the main goals for Alloy:\n\n- *Productivity*: it's important that Titanium developers are productive and productive developers write less code. The main goal of Alloy is to provide a rapid framework for building robust applications.\n- *Maintainability*:  it's important that Titanium apps can be maintained and sustained - not just by the original developer, but by others that are on the team, that come along afterwards or by others in the Titanium community.  Alloy should provide a framework that anyone can drop into and become productive once they understand the basics of Alloy.\n- *Best Practices*: it's important that Alloy provide a clean separation of concerns for application design, provide a framework that encapsulates the best practices for Titanium and provides a mechanism for reusable application building blocks called `Widgets`.\n\nInstallation\n-------------\n\nAlloy is available as a Node.JS NPM module by running the following command:\n\n\t[sudo] npm install -g alloy\n\nLocal Installation\n------------------\n\nTo install your own local copy (with executable), clone this repository, navigate to the top level directory, and install via:\n\n\t[sudo] npm install -g .\n\t\n\t\nCreating an App\n---------------\n\nTo create an Alloy enabled app, you must first create a project in Titanium Studio or via the Titanium CLI.  While in a console, \nnavigate to the root directory of your application and run the following command in the console\n\n\talloy new .\n\t\nAlternatively, you can specify an argument as the second parameter to the location of a Titanium project directory.\n\nAs part of Alloy-enabling your Titanium project, Alloy will install a special compiler plugin that will help Studio or the CLI know how to use the Alloy compiler.  _NOTE: this currently only works on OSX and will be resolved prior to the production release._\n\nYour new Alloy project will have a new folder named `app` that will contain the skeleton Alloy app.\n\nDirectory Structure\n--------------------\n\nAlloy has directories that should be familiar if you've used any of the popular web MVC frameworks like Ruby on Rails.  \n\nAlloy prefers to use convention over configuration for simplicity.  \n\n- *views* - this is where your views should go in the format _*view*.xml_\n- *controllers* - this is where your controllers should go in the format _*view*.js_. \n- *styles* - this is where your view styling logic should go in the format _*view*.json_.\n- *models* - this is where your model files will go.\n- *assets* - this is where you should put your image assets and other misc. files that you want copied into the _Resources_ directory.\n- *migrations* - this is where your database migration files will be stored.\n- *lib* - this is where you should put application specific files, typically in the CommonJS format.\n- *vendor* - this is where you should put any vendor specific modules, typically in the CommonJS format.  Do not place native modules in this folder.\n- *config* - _RESERVED FOR FUTURE USE_.  This is currently not used but will eventually contain application specific config.\n\nCompiling an App\n----------------\n\nYou can run a Titanium project that is using Alloy like any normal build.  However, you can also use Alloy's command line tool to build from the command line.\n\n\talloy compile\n\nIf you run this from the projects directory, it will compile the files to the correct location automatically.\n\t\n\t\nGenerating Views\n-----------------\n\nTo generate an empty view and the associated style files, you can run the following command:\n\n\talloy generate view <name>\n\nGenerating Controllers\n---------------------\n\nTo generate an empty controller, you can run the following command:\n\n\talloy generate controller <name>\n\nGenerating Models\n---------------------\n\nTo generate a model, you can run the following command:\n\n\talloy generate model <name> [column_name:type, ...]\n\t\nFor example:\n\n\talloy generate model todo name:string active:boolean\n\t\nWhen you generate a model, a migration file is automatically provided with the initial model details.\n\nGenerating Migrations\n---------------------\n\nTo generate a standalone migration for a specific model, you can run the following command:\n\n\talloy generate migration <name>\n\nThis will create a timestamp-ordered migration file for the model specified.\t\n\n\nDeveloping in Alloy\n-------------------\n\nYou are required to only define one file at a minimum, which is the default view file, `index.xml`, which must be placed in the `views` folder.  \n\nIn Alloy, the controller (which is optional) must be named with the same name as the view with the `.js` file extension and placed in the `controllers` folder.\n\nIn alloy, you do not provide an `app.js` as it will be automatically generated.\n\nIn Alloy, any view styles will automatically be loaded from a file with the same name as the view and an `.json` file extension and located in the `styles` directory.  The file format is JSON.  Each of the objects in the view that you want to be referenceable either through styling or programmatically must have an `id` attribute on the object.\n\nYou define a style in the JSON like this:\n\n```json\n{\n\t\"#a\" : {\n\t\t\"backgroundColor\" : \"red\",\n\t\t\"width\": Ti.UI.FILL,\n\t\t\"height\": \"100\"\n\t},\n\t\"#b\" : {\n\t\t\"width\":Ti.UI.FIT,\n\t\t\"height\":Ti.UI.FIT\n\t},\n\t\"#t\" : {\n\t\t\"width\":Ti.UI.FILL,\n\t\t\"height\":Ti.UI.FIT,\n\t\t\"color\":\"black\"\n\t}\n}\n```\n\t\nAnd then you would define the view such as:\n\n```xml\n<View id=\"a\">\n\t<Button id=\"b\">Hello</Button>\n\t<Label id=\"t\"></Label>\n</View>\n```\n\nNote, you can use `Titanium.UI` constants in your JSON file.\n\nIn your controller, you can reference the view such as:\n\n```javascript\n$.a.backgroundColor = \"blue\";\n$.b.addEventListener(\"click\",function(e){\n\t$.t.text = \"You clicked a button\";\n});\n```\n\nAll objects which have an `id` in your view will automatically be defined and available as a property in the special variable `$` in your controller.  For example, if you use the id `foo`, your object would be available as `$.foo`.\n\nView Styling\n-----------\n\nAlloy separates the structural elements of a View from the styling components of the View -- much like the difference between HTML and CSS.  \n\nYou can use the following CSS attributes in your style name: Classes (prefix by `.`), Object Name (name of the Object Type such as `Button`) or ID (prefix by `#`).  The ID attribute will always take precedence.\n\nFor example:\n\n```json\n{\n\t\"Button\": {\n\t\t\"width\":Ti.UI.FIT,\n\t\t\"height\":Ti.UI.FIT,\n\t\t\"borderColor\":\"red\"\n\t},\n\t\n\t\".b\" : {\n\t\t\"width\": \"100\",\n\t\t\"b\":true\n\t},\n\t\n\t\".c\" : {\n\t\t\"height\": \"50\",\n\t\t\"b\":false\n\t},\n\t\n\t\"#b\" : {\n\t\t\"width\": Ti.UI.FILL,\n\t\t\"borderColor\":null\n\t}\n}\n```\n\t\nWith the following XML:\n\n```xml\n<View>\n\t<Button id=\"b\" class=\"b c\" />\n</View>\n```\n\t\nShould result in the following code properties when merged:\n\n```json\n{\n\t\"width\": Ti.UI.FILL,\n\t\"height\":Ti.UI.FIT,\n\t\"b\":false\n}\n```\n\t\nA few notes on the code generation and style merging:\n\n- any `null` values will be removed in any final styles to optimize code generation.  \n- classes can be separated by multiple spaces\n- classes will be merged in order\n- the order of precedence is: Object Type, Classes, ID\n\nTitanium Namespacing\n--------------------\n\nBy default, all UI components specified in your markup will be prefixed with the `Ti.UI` namespace for convenince. \n\n```xml\n<Button id=\"mybutton\">button title</Button>\n```\n\nThe above snippet would create a `Ti.UI.Button`. If you want to add a UI component to your markup hierarchy that is _not_ part of the `Ti.UI` namespace, you can use the `ns` attribute.\n\n```xml\n<View ns=\"Ti.Map\" id=\"map\"/>\n```\n\nThe above snippet would use `Ti.Map` as its namespace prefix, instead of the default `Ti.UI`, which would then give you a `Ti.Map.View` in your app.\n\nDe-composing complex Views\n--------------------------\n\nAlloy allows you to decompose a View into multiple subviews.  You would use the `require` attribute on a View element to import a separate view by name.  \n\n```xml\n<View>\n\t<View require=\"first\" id=\"first\"/>\n\t<View require=\"second\" id=\"second\"/>\n\t<View require=\"third\" id=\"third\"/>\n</View>\n```\n\nIn the above example, you should have 3 other view files named `first.xml`, `second.xml` and `third.xml`.  Of course, these subviews could also import their own subviews, too.\n\nWorking with Models & Collections\n-----------------------------------\n\nFor models, we specify the schema of our model using JSON as the name of the model ending with `.json`.\n\nYou should generate a model using the `alloy generate model` command so that you can get automatic migration support.\n\nAll model classes are automatically defined and available in your controller scope as the name of the model.\n\nFor example, if you defined a model named `todo`, it would be available as the same variable name under the `$.` object.\n\nTo create a new model object:\n\n```javascript\nvar todo = new $.Todo({\n\tname:\"hello\",\n\tdone:false\n});\n\ntodo.save();\n```\n\nModels inherit from Backbone.Model. _NOTE: if the first character of a model is lower case, it will be automatically converted to uppercase for referencing the Model class._\n\nCollections of your models are automatically also created with the plural name of your model class. For example, if you defined a model named `todo`, you could automatically create a collection of models by using the following code:\n\n```javascript\nvar list = new $.TodoCollection();\nvar results = list.find();\n```\n\nCollections inherit from Backbone.Collections.\n\t\n\nBuilding Application Logic\n--------------------------\n\nIn Alloy, you separate the application logic from the View logic (the `C` part of `MVC`) with `Controllers`.  \n\nControllers automagically will have pre-defined your View objects, as long as you've added a unique `id` attribute on the XML.\n\nEach `id` value will reference the corresponding Titanium object in your controller automatically.\n\nFor example, if you have a view named `index.xml` with the following:\n\n```xml\n<View>\n\t<Button id=\"b\"></Button>\n</View>\n```\n\t\nYou would then define a controller named `index.js` and you could automatically bind events inline in your controller code:\n\n```javascript\n$.b.addEventListener(\"click\",function(){\n\talert(\"You clicked the button\");\n});\n```\n\nIf you don't add an `id` attribute to an element, it will not be referencable directly in your controller.\n\n_NOTE: it's import that you use unique `id` attributes across all your view files.  If you don't, you will get a compiler error._\n\nExporting Properties & Functions from Controllers\n-------------------------------------------------\n\nSometimes it's necessary to provide properties and functions in your controller that can be used by other controllers as a well defined API.\n\nTo export them, you would set the in the `exports` object which is predefined for you in your controller.\n\n```javascript\nexports.foo = function()\n{\n\treturn 'a';\n}\n```\n\nYou would then use the name of the controller to reference this method such as:\n\n```javascript\n$.index.foo();\n```\n\nBuilding Re-usable Application Widgets\n---------------------------------------\n\nAlloy supports the concept of a `widget` which is a package of MVC logic that can be reused inside an application.\n\nThe widget is defined in a separate 'widgets' subdirectory, but we would also support a widget distribution packaging much like modules today so that you could simply reference them and then they would automatically be found and imported either by searching for local widgets in the folder of the app or by scanning the titanium distribution, etc.\n\nThe widget would define its own views and controllers and they would work very similar to any normal application.\n\nThe widget controller would be able to export zero or more properties or methods that define the public interface for the widget.\n\nExample of importing a widget:\n\n```xml\n<View>\n\t<Widget require=\"com.foo.widget\" id=\"foo\"/>\n</View>\n```\n\nThe widget view styles can also be imported by the views JSON file by using a special widget ID pattern: <#widget_id #id>.\n\nFor example, if the widget was imported to the name `foo` and the internal ID of a control was `b` - the reference would be '#foo:#b'.\n\nIf your widget would like to export properties and/or functions, it should assign them to the `exports` variable of the `widget.js`.\n\nIn your app controller, you would then be able to access them referencing the widget reference and the name of the property.\n\nFor example, in your `widget.js`:\n\n```javascript\nexports.calculatePie = function() \n{ \n\treturn 3.14; \n}\n```\n\t\nNow, if your widget reference was `foo` as in the example above, you would access your function in your app controller such as:\n\n```javascript\n$.foo.calculatePie();\n```\n\nSee the [Widget Example](https://github.com/appcelerator/alloy/tree/master/examples/widget) for an example of building and using a widget.\n\n_NOTE: we have not finalized the distribution packaging for an Alloy widget but it will be similar to native modules._\n\nProject Configurations\n----------------------\n\nAlloy provides an ability to have project configurations stored as JSON which will be compiled and conditionalized at build time.\nThe configuration will be available in your app at runtime in the property `$.CFG`.  The config file is generated under the config folder with the name `config.json`.\n\nIn the config file, you can specify a set of global key/value pairs, as well as conditional configuration based on build environment and/or operating system target.  The order of precedence for key merging is `global`, `env` and then `os`.\n\nExample config:\n\n```json\n{\n\t\"global\":\n\t{\n\t\t\"foo\":1\n\t},\n\t\n\t\"env:development\":\n\t{\n\t\t\"foo\":2\n\t},\n\n\t\"env:test\":\n\t{\n\t\t\"foo\":3\n\t},\n\n\t\"env:production\":\n\t{\n\t\t\"foo\":4\n\t},\n\t\n\t\"os:ios\":\n\t{\n\t\t\"foo\":5\n\t},\n\n\t\"os:android\":\n\t{\n\t\t\"foo\":6\n\t}\n}\n```\n\nThen, you can reference configuration at runtime in your code:\n\n```javascript\nalert($.CFG.foo);\n```\n\nIn the above example, when running under the iOS simulator, you should see `5` in the alert dialog box.\n\n\nConditional Code\n-----------------\n\nAlloy introduces a set of special variables which act like compiler directives.  If you use these compiler constants, your code will be optimized at code generation/compilation and any non-reachable code will be removed. This allows you to specify code blocks which are efficiently handled or dynamically processed based on these compiler constants.\n\nThe following are the constants which are defined by Alloy:\n\n- *OS_IOS* : true if the current compiler target is iOS\n- *OS_ANDROID*: true if the current compiler target is Android\n- *OS_MOBILEWEB*: true if the current compiler target is Mobile Web\n- *ENV_DEV*: true if the current compiler target is build for development (running in simulator/emulator)\n- *ENV_TEST*: true if the current compiler target is build for test (run on device)\n- *ENV_PRODUCTION*: true if the current compiler target is build for product (run after packaged for install)\n\nExample of usage:\n\n```javascript\nif (ENV_DEV && OS_IOS)\n{\n\talert(\"You are running iOS in the simulator\");\n}\n```\n\nPer Project Build Customization\n-------------------------------\n\nAlloy provides an ability for the project to hook and customize the compile process using a special JS file in the project root directory named `alloy.jmk`.  This file can be used for common administration tasks or to fine tune the build process.  \n\nThe JMK file is loaded automatically by the Alloy command line during compilation.  To customize the build process, you call the `task` function with the event name and provide a function callback which will be called when the event is triggered by the compiler.\n\nCurrently, there are 3 main compiler tasks:\n\n- *pre:compile* - called before the compiler gets started\n- *post:compile* - called after the compiler is complete, but before it exits\n- *compile:app.js* - called just after the compilation of the main app.js file but before the code is written to disk. you can return new code which will be used or `null` or `undefined` to write the code unchanged.\n\nThe function callback provides two arguments: `event` and `logger`.\n\nThe `event` object provides a set of values which may be useful for building tasks. \nThe `logger` object provides a reference to the logger which defins the following methods: `debug`, `info`, `warn`, `error`.\n\nAn example of a build file:\n\n```javascript\ntask(\"pre:compile\",function(event,logger){\n\tlogger.info('building project at '+event.projectDir);\n});\n\ntask(\"post:compile\",function(event,logger){\n\tlogger.info('compile finished!');\n});\n```\n\nAlloy compiler configuration\n-----------------------------\n\nYou can control some settings of the compiler on a per project basis by modifying settings in the `alloy.json` in your root alloy app directory.\n\n\nTODO\n----\n\nThere's a lot of work to get Alloy to a release state.  The following are some of the major items:\n\n- integration into Titanium Studio wizards\n- DB migration support implementation [TEST]\n- support for SQLite backed Model implementation [TEST]\n- support for ACS backed Model implementation\n- uglify all JS files, not just the app.js\n- generation of scaffolding\n- add support for TDD testing (possibly Jasmine?)\n- possible view template support?\n- full implementation of different views based on os, screen size, etc.\n- widget packaging implementation, spec and tooling\n- ability to better integrate native modules and reference them\n- controller, view and model lifecycle events\n\t\nCredits\n-------\n\nMany credits should be noted in the development of Alloy.\n\n- The Titanium community.  It's been a number of years and probably well over 50+ application frameworks that have been built around Titanium and we finally felt that it made sense for Appcelerator to work to build and support an official framework.  Thanks to everyone for their innovations, input and feedback.\n- Jeff Haynie and Nolan Wright.  For their initial inspiration for Titanium and continued pushing to make it better. Codestrong.\n- Kevin Whinnery.  For his passionate and persistent pushing to come up with a \"standard way\" and his many initial ideas.\n- Russ McMahon. For his initial R&D work with Nolan to come up with the early versions and ideation and for leading the Alloy team.\n- Tony Lukasavage.  For helping provide the JS ninja coding skills and for being on the Alloy team.\n- Gabriel Tavridis. For helping provide the \"herding of the engineering LOLcats\" as the product manager for Alloy.\n\nLegal\n------\n\nAlloy is developed by Appcelerator and the community and is Copyright (c) 2012 by Appcelerator, Inc. All Rights Reserved.\nAlloy is made available under the Apache Public License, version 2.  See the [LICENSE](https://github.com/appcelerator/alloy/blob/master/LICENSE) file for more information.\n\n","maintainers":[{"name":"jhaynie","email":"jhaynie@appcelerator.com"},{"name":"tonylukasavage","email":"anthony.lukasavage@gmail.com"},{"name":"mtnlife999","email":"rmcmahon@appcelerator.com"}],"time":{"modified":"2012-08-10T17:43:10.294Z","created":"2012-06-12T07:57:37.479Z","0.1.0":"2012-06-12T07:57:38.955Z","0.1.1":"2012-06-15T16:43:59.873Z","0.1.2":"2012-06-15T16:51:12.118Z","0.1.3":"2012-06-18T21:31:02.157Z","0.1.4":"2012-06-20T03:56:30.095Z","0.1.5":"2012-06-20T22:31:11.980Z","0.1.6":"2012-06-22T04:45:48.091Z","0.1.7":"2012-06-22T05:52:57.161Z","0.1.8":"2012-06-22T18:32:14.457Z","0.1.10":"2012-06-23T11:31:47.921Z","0.1.11":"2012-06-23T12:48:56.796Z","0.1.12":"2012-06-25T19:50:44.930Z","0.1.13":"2012-06-25T21:26:36.113Z","0.1.14":"2012-06-27T12:10:32.630Z","0.1.15":"2012-06-27T20:38:28.113Z","0.1.16":"2012-06-27T21:35:30.229Z","0.1.17":"2012-07-02T18:15:47.521Z","0.1.19":"2012-07-03T13:42:42.253Z","0.1.20":"2012-07-06T12:52:32.972Z","0.1.21":"2012-07-17T23:17:03.122Z","0.1.22":"2012-07-23T18:03:15.388Z","0.1.23":"2012-07-24T18:34:56.588Z","0.1.24":"2012-07-25T17:03:39.044Z","0.1.25":"2012-07-25T17:54:41.251Z","0.1.26":"2012-07-26T19:21:41.607Z","0.1.27":"2012-07-26T21:57:53.461Z","0.1.28":"2012-07-27T17:53:27.186Z","0.1.29":"2012-07-30T14:20:15.253Z","0.2.0":"2012-08-10T17:43:10.294Z"},"author":{"name":"Appcelerator, Inc.","email":"info@appcelerator.com"},"repository":{"type":"git","url":"git://github.com/appcelerator/alloy.git"},"users":{"fgribreau":true},"_attachments":{"alloy-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-JaKgHVjccD6Z2b1/Itq+3w==","length":1149258,"stub":true},"alloy-0.1.29.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-cRAp/gLjyauwSXw1Q2hhjQ==","length":720438,"stub":true},"alloy-0.1.28.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-KzaTgE3pjd6BIex5y5N/Pg==","length":720274,"stub":true},"alloy-0.1.27.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-bq9Jnd97v2/Qx/OXZo1XFw==","length":719635,"stub":true},"alloy-0.1.26.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-2HddKNdsWrzW58qhPlKzvQ==","length":719833,"stub":true},"alloy-0.1.25.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-TSuT9F5efxClubLa3Iuwwg==","length":719653,"stub":true},"alloy-0.1.24.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-Yrs0DxB6HGsQE0eNbmlfCw==","length":719648,"stub":true},"alloy-0.1.23.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-f4eXfaUf91pvTNwdQ422eQ==","length":717611,"stub":true},"alloy-0.1.22.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-VGV86DOGFiANcY5G0GDZSw==","length":589537,"stub":true},"alloy-0.1.21.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-I251J92mgCrrAgcEpLpMjQ==","length":397243,"stub":true},"alloy-0.1.20.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-6cPdpRYCuUFmNv4fuxCQWg==","length":367050,"stub":true},"alloy-0.1.19.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-hF+DAopo8mhRdGvLbrQ8fw==","length":366014,"stub":true},"alloy-0.1.17.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-1lrW4CP3LTklSbi3N/GwoA==","length":363505,"stub":true},"alloy-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-0hudfi98gXcHCZPDuYE36Q==","length":354456,"stub":true},"alloy-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-YupqrqwAFB21ghD8DeVfbg==","length":353071,"stub":true},"alloy-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-e1qhCk65ZwcjP829qH/UZQ==","length":335821,"stub":true},"alloy-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-qc/zbmp79jX8mRrzPUCCDQ==","length":334406,"stub":true},"alloy-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-fO8Ba/l75Pii/HUd8l5Mcw==","length":335222,"stub":true},"alloy-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-FYZ7uH0eJQcZTh2OgFZ9VQ==","length":333066,"stub":true},"alloy-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-PCC8Zx37F+ZJquTv89G+0g==","length":332984,"stub":true},"alloy-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-39cgQZF6h+sL2o8KzZPq7w==","length":334094,"stub":true},"alloy-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Vz2zC9dqfNGsi3eAAue5jQ==","length":332504,"stub":true},"alloy-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Q/l63jiN6UlFe/+JZCm5+g==","length":321010,"stub":true},"alloy-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-9Z+4RutoKWTlMtT/ZFmjqw==","length":297032,"stub":true},"alloy-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wlR4VRUhs+asF5yEFJylFA==","length":294879,"stub":true},"alloy-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-n+dJ+RKo2Rrn42zR6fgj1A==","length":302137,"stub":true},"alloy-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-NtdXduTOag6th/CxwQ30YA==","length":296578,"stub":true},"alloy-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-n+VJsMOKyMtqP9y7SRHV2Q==","length":296564,"stub":true},"alloy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CzfONU1iJLiM5eieVnNExQ==","length":219575,"stub":true}}}},
{"id":"almond","key":"almond","value":{"rev":"9-be333df9844ac7b8199d967fe49c31e8"},"doc":{"_id":"almond","_rev":"9-be333df9844ac7b8199d967fe49c31e8","name":"almond","description":"A minimal AMD API implementation for use in optimized browser builds.","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.3":{"name":"almond","description":"A minimal AMD API implementation for use in optimized browser builds.","version":"0.0.3","homepage":"http://github.com/jrburke/almond","author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"licenses":[{"type":"BSD","url":"https://github.com/jrburke/almond/blob/master/LICENSE"},{"type":"MIT","url":"https://github.com/jrburke/almond/blob/master/LICENSE"}],"main":"almond.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"jrburke","email":"jrburke@gmail.com"},"_id":"almond@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"811abad832d8b3ee1c55dd808e5ff7659ca292c7","tarball":"http://registry.npmjs.org/almond/-/almond-0.0.3.tgz"},"readme":"","maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}]},"0.1.0":{"name":"almond","description":"A minimal AMD API implementation for use in optimized browser builds.","version":"0.1.0","homepage":"http://github.com/jrburke/almond","author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"licenses":[{"type":"BSD","url":"https://github.com/jrburke/almond/blob/master/LICENSE"},{"type":"MIT","url":"https://github.com/jrburke/almond/blob/master/LICENSE"}],"main":"almond.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"jrburke","email":"jrburke@gmail.com"},"_id":"almond@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b382d5c5f95bce6306b5f1f8fa8b91245ccf0d7a","tarball":"http://registry.npmjs.org/almond/-/almond-0.1.0.tgz"},"readme":"","maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}]},"0.1.1":{"name":"almond","description":"A minimal AMD API implementation for use in optimized browser builds.","version":"0.1.1","homepage":"http://github.com/jrburke/almond","author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"licenses":[{"type":"BSD","url":"https://github.com/jrburke/almond/blob/master/LICENSE"},{"type":"MIT","url":"https://github.com/jrburke/almond/blob/master/LICENSE"}],"main":"almond.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"jrburke","email":"jrburke@gmail.com"},"_id":"almond@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a1a6c18c25641f10a31d84d3d7b67770d2d69077","tarball":"http://registry.npmjs.org/almond/-/almond-0.1.1.tgz"},"readme":"","maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}]},"0.1.2":{"name":"almond","description":"A minimal AMD API implementation for use in optimized browser builds.","version":"0.1.2","homepage":"http://github.com/jrburke/almond","author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"licenses":[{"type":"BSD","url":"https://github.com/jrburke/almond/blob/master/LICENSE"},{"type":"MIT","url":"https://github.com/jrburke/almond/blob/master/LICENSE"}],"main":"almond.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"jrburke","email":"jrburke@gmail.com"},"_id":"almond@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"0d98753ff8e0be87512a785c04de44f72c2d2d9c","tarball":"http://registry.npmjs.org/almond/-/almond-0.1.2.tgz"},"readme":"","maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}]}},"readme":"","maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}],"time":{"modified":"2012-08-08T22:23:35.942Z","created":"2012-04-21T23:03:37.511Z","0.0.3":"2012-04-21T23:03:39.272Z","0.1.0":"2012-05-28T20:56:27.202Z","0.1.1":"2012-06-01T21:31:41.790Z","0.1.2":"2012-08-08T22:23:35.942Z"},"author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"_attachments":{"almond-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ktcSI/bkL4OE01fzoULy0w==","length":5145,"stub":true},"almond-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fng9ix1stV4/LCMn/wpJNw==","length":5008,"stub":true},"almond-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AjNmxqUEr0U0rM9evvdiZQ==","length":6326,"stub":true},"almond-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xBtFCMb/+QfRGnQr3gGlqQ==","length":4601,"stub":true}}}},
{"id":"alonso-counter","key":"alonso-counter","value":{"rev":"3-8322c93444b51ead1f6820a832196760"},"doc":{"_id":"alonso-counter","_rev":"3-8322c93444b51ead1f6820a832196760","name":"alonso-counter","description":"Distributed log file aggregation, with persistence","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Noah H. Smith","email":"nsmith@rendergardenmedia.com"},"name":"alonso-counter","description":"Distributed log file aggregation, with persistence","version":"0.1.0","repository":{"type":"git","url":"git://github.com/noazark/alonso-counter.git"},"main":"./lib/alonso-counter","bin":{"alonso-counter":"./bin/alonso-counter"},"engines":{"node":"~0.6.8"},"dependencies":{"hook.io":"0.8.9","redis":"0.7.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"noazark","email":"nsmith@rendergardenmedia.com"},"_id":"alonso-counter@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"f015b77289c838023a596269481f4f292ef562f3","tarball":"http://registry.npmjs.org/alonso-counter/-/alonso-counter-0.1.0.tgz"},"maintainers":[{"name":"noazark","email":"nsmith@rendergardenmedia.com"}]}},"readme":"alonso-counter\n==============","maintainers":[{"name":"noazark","email":"nsmith@rendergardenmedia.com"}],"time":{"modified":"2012-04-20T20:34:18.211Z","created":"2012-04-20T20:34:16.825Z","0.1.0":"2012-04-20T20:34:18.211Z"},"author":{"name":"Noah H. Smith","email":"nsmith@rendergardenmedia.com"},"repository":{"type":"git","url":"git://github.com/noazark/alonso-counter.git"},"_attachments":{"alonso-counter-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5qrDVuuuRI5BtiKjPextoQ==","length":1259,"stub":true}}}},
{"id":"alonso-follower","key":"alonso-follower","value":{"rev":"3-7aba3b1bfe65c23e2b0425e694b83e8a"},"doc":{"_id":"alonso-follower","_rev":"3-7aba3b1bfe65c23e2b0425e694b83e8a","name":"alonso-follower","description":"Distributed log file aggregation, with persistence","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Noah H. Smith","email":"nsmith@rendergardenmedia.com"},"name":"alonso-follower","description":"Distributed log file aggregation, with persistence","version":"0.1.0","repository":{"type":"git","url":"git://github.com/noazark/alonso-follower.git"},"main":"./lib/alonso-follower","bin":{"alonso-follower":"./bin/alonso-follower"},"engines":{"node":"~0.6.8"},"dependencies":{"hook.io":"0.8.9"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"noazark","email":"nsmith@rendergardenmedia.com"},"_id":"alonso-follower@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"abee8573d9c9d9a9203aa6f302a25cb4c02a3bdb","tarball":"http://registry.npmjs.org/alonso-follower/-/alonso-follower-0.1.0.tgz"},"maintainers":[{"name":"noazark","email":"nsmith@rendergardenmedia.com"}]}},"readme":"alonso-follower\n===============","maintainers":[{"name":"noazark","email":"nsmith@rendergardenmedia.com"}],"time":{"modified":"2012-04-20T20:36:29.529Z","created":"2012-04-20T20:36:27.730Z","0.1.0":"2012-04-20T20:36:29.529Z"},"author":{"name":"Noah H. Smith","email":"nsmith@rendergardenmedia.com"},"repository":{"type":"git","url":"git://github.com/noazark/alonso-follower.git"},"_attachments":{"alonso-follower-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mW8QawzhSz7szG4PhJYlkg==","length":1130,"stub":true}}}},
{"id":"alonso-harvester","key":"alonso-harvester","value":{"rev":"3-8570dfa99252b81f826f677d4ff734cb"},"doc":{"_id":"alonso-harvester","_rev":"3-8570dfa99252b81f826f677d4ff734cb","name":"alonso-harvester","description":"Distributed log file aggregation, with persistence","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Noah H. Smith","email":"nsmith@rendergardenmedia.com"},"name":"alonso-harvester","description":"Distributed log file aggregation, with persistence","version":"0.1.0","repository":{"type":"git","url":"git://github.com/noazark/alonso-harvester.git"},"main":"./lib/alonso-harvester","bin":{"alonso-harvester":"./bin/alonso-harvester"},"engines":{"node":"~0.6.8"},"dependencies":{"hook.io":"0.8.9","mongodb":"0.9.9-8"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"noazark","email":"nsmith@rendergardenmedia.com"},"_id":"alonso-harvester@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"6408edab3b9f2007d20dc6ed141cb5347dd1ef7c","tarball":"http://registry.npmjs.org/alonso-harvester/-/alonso-harvester-0.1.0.tgz"},"maintainers":[{"name":"noazark","email":"nsmith@rendergardenmedia.com"}]}},"readme":"alonso-harvester\n================","maintainers":[{"name":"noazark","email":"nsmith@rendergardenmedia.com"}],"time":{"modified":"2012-04-20T20:37:23.446Z","created":"2012-04-20T20:37:22.145Z","0.1.0":"2012-04-20T20:37:23.446Z"},"author":{"name":"Noah H. Smith","email":"nsmith@rendergardenmedia.com"},"repository":{"type":"git","url":"git://github.com/noazark/alonso-harvester.git"},"_attachments":{"alonso-harvester-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vrGUvHNDfOdeYdNbjjvjag==","length":1209,"stub":true}}}},
{"id":"alpha_simprini","key":"alpha_simprini","value":{"rev":"3-5cbbf7b0f591ba288d033a0dd386e9fe"},"doc":{"_id":"alpha_simprini","_rev":"3-5cbbf7b0f591ba288d033a0dd386e9fe","name":"alpha_simprini","description":"Core libraries for Alpha Simprini based applications.","dist-tags":{"latest":"0.0.4-6-g621932e"},"versions":{"0.0.4-6-g621932e":{"author":{"name":"Collin Miller","email":"collintmiller@gmail.com"},"name":"alpha_simprini","description":"Core libraries for Alpha Simprini based applications.","version":"0.0.4-6-g621932e","repository":{"type":"git","url":"git://github.com/collin/alpha_simprini.git"},"engines":{"node":"~0.6"},"main":"lib/alpha_simprini.coffee","dependencies":{"underscore":">= 1.2.0","underscore.string":">= 2.0.0","share":"https://github.com/collin/ShareJs/tarball/master","jQuery":">= 1.6","jwerty":">= 0.3","rangy-core":"0.2.2"},"devDependencies":{"jsdom":">= 0.2"},"_npmUser":{"name":"collintmiller","email":"collintmiller@gmail.com"},"_id":"alpha_simprini@0.0.4-6-g621932e","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"665ad02796980b81ac76a69b8d6995722a4591b9","tarball":"http://registry.npmjs.org/alpha_simprini/-/alpha_simprini-0.0.4-6-g621932e.tgz"},"maintainers":[{"name":"collintmiller","email":"collintmiller@gmail.com"}]}},"readme":null,"maintainers":[{"name":"collintmiller","email":"collintmiller@gmail.com"}],"time":{"modified":"2011-12-23T12:09:22.181Z","created":"2011-12-23T12:09:21.632Z","0.0.4-6-g621932e":"2011-12-23T12:09:22.181Z"},"author":{"name":"Collin Miller","email":"collintmiller@gmail.com"},"repository":{"type":"git","url":"git://github.com/collin/alpha_simprini.git"},"_attachments":{"alpha_simprini-0.0.4-6-g621932e.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GorDmk/P0UcYGwVqHpPdvg==","length":51200,"stub":true}}}},
{"id":"alter-ego","key":"alter-ego","value":{"rev":"3-16fc7a58de71caa53db664265613820d"},"doc":{"_id":"alter-ego","_rev":"3-16fc7a58de71caa53db664265613820d","name":"alter-ego","description":"Extensible type definitions","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"alter-ego","id":"alter-ego","version":"0.0.1","description":"Extensible type definitions","keywords":["alter-ego","type","class","prototype","inheritance"],"author":{"name":"Irakli Gozalishvili","email":"rfobic@gmail.com","url":"http://jeditoolkit.com"},"homepage":"https://github.com/Gozala/alter-ego","repository":{"type":"git","url":"git://github.com/Gozala/alter-ego.git","web":"https://github.com/Gozala/alter-ego"},"bugs":{"url":"http://github.com/Gozala/alter-ego/issues/"},"devDependencies":{"test":">=0.4.4","repl-utils":">=1.0.0","swank-js":">=0.0.1"},"scripts":{"test":"node tests/test-all.js","repl":"node node_modules/repl-utils","swank":"node node_modules/swank-js"},"licenses":[{"type":"MIT","url":"http://jeditoolkit.com/LICENSE"}],"_npmUser":{"name":"gozala","email":"rfobic@gmail.com"},"_id":"alter-ego@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9610e8c3de6aa0b0feb63c89fd2c737d31b0a8fd","tarball":"http://registry.npmjs.org/alter-ego/-/alter-ego-0.0.1.tgz"},"maintainers":[{"name":"gozala","email":"rfobic@gmail.com"}]}},"readme":"# alter-ego\n\n[![Build Status](https://secure.travis-ci.org/Gozala/alter-ego.png)](http://travis-ci.org/Gozala/alter-ego)\n\nThis library provides simple but very extensible way to define types / classes /\nconstructors in JS. It comes a very small set of functions to do that, but any\nfunction can be incorporated to allow more complex definitions.\n\n## Usage\n\nIt's quite common to have constructors that just set given arguments as\nproperties of the instance, providing rest of the API through prototype\nmethods. This library makes this task simple by reducing all the machinery\ncode:\n\n### define record\n\n```js\nvar Point = define(record, [ 'x', 'y' ])\n```\n\nCode above will produce constructor which is equivalent of:\n\n```js\nvar Point = function Point(x, y) {\n  this.x = x\n  ths.y = y\n}\n```\n\n### define prototype\n\nCommonly you will want to define some methods for the `Point` type, that\ncan be done as follows:\n\n```js\nvar Point = define(\n  record, [ 'x', 'y' ],\n  implement, {\n    clear: function() {\n      this.x = 0\n      this.y = 0\n    }\n  })\n```\n\n### extend type\n\nYou could also extend existing types in similar way:\n\n\n```js\nvar Pixel = define(\n  record, [ 'x', 'y', 'color' ],\n  extend, Point,\n  implement, {\n    draw: function() {\n      // ...\n    }\n  })\n```\n\n### custom constructor\n\nNow `record` is limited to a very specific scenarios, but more generic use\ncases are also covered:\n\n\n```js\nvar Dog = define(\n  construct, function(options) {\n    this.name = options.name\n    // ...\n  },\n  extend, Animal,\n  implement, {\n    bark: function() {\n      // ....\n    }\n  })\n```\n\n### refine existing types\n\nYou could also refine existing types in a same way:\n\n```js\ndefine(\n  over, EventEmitter,\n  implement, {\n    twice: function(type, listener) {\n      var times = 0\n      this.on(type, listener)\n      this.on(type, function limiter() {\n        if (++ times === 2) {\n          this.removeListener(type, listener)\n          this.removeListener(type, limiter)\n        }\n      })\n    }\n  })\n```\n\n## Extension\n\nWhile this tiny library provides some core functionailty for building and\nextending types / constructors / classes, there is no way it could cover all\nuse cases. That's not an issues since all the functionality is defined in\nvia simple functions like `extend`, `implement`, `record`... You could\nincorporate your own functions to do more sophisticated things. For example\nadding [aspect oriented programming](http://en.wikipedia.org/wiki/Aspect-oriented_programming)\nconcepts is very easy:\n\n```js\nfunction after(type, methods) {\n  var prototype = type.prototype\n  Object.keys(methods).forEach(function(name) {\n    var before = prototype[name]\n    var after = methods[name]\n    prototype[name] = function() {\n      before.apply(this, arguments)\n      return after.call(this)\n    }\n  })\n\n  return type\n}\n\nvar Point3D = define(\n  record, [ 'x', 'y', 'z' ],\n  extend, Point,\n  after, {\n    clear: function() {\n      this.z = 0\n    }\n  })\n\n// EventEmitter2\ndefine(\n  over, EventEmitter,\n  after, {\n    emit: function(type) {\n      if (type !== '*')\n        this.emit.apply(this, ['*'].concat(Array.prototype.slice.call(arguments))\n    }\n  })\n```\n\nYou could in fact do so much more! Enforce API contracts using\n[guards](https://github.com/Gozala/guards), define extensions on built-ins\ntypes without changing their prototypes via [type based dispatch]\n(https://github.com/Gozala/protocol) or do a [pattern based dispatch]\n(https://github.com/Gozala/dispatcher/) or maybe something entirely new!\n\n## Install\n\n    npm install alter-ego\n","maintainers":[{"name":"gozala","email":"rfobic@gmail.com"}],"time":{"modified":"2012-05-07T23:45:19.567Z","created":"2012-05-07T23:45:18.265Z","0.0.1":"2012-05-07T23:45:19.567Z"},"author":{"name":"Irakli Gozalishvili","email":"rfobic@gmail.com","url":"http://jeditoolkit.com"},"repository":{"type":"git","url":"git://github.com/Gozala/alter-ego.git","web":"https://github.com/Gozala/alter-ego"},"_attachments":{"alter-ego-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-d26f8aMb5ZAENjh2FHOBAg==","length":50640,"stub":true}}}},
{"id":"altshift","key":"altshift","value":{"rev":"56-fcf17b2b0088bba692208795e305a9ea"},"doc":{"_id":"altshift","_rev":"56-fcf17b2b0088bba692208795e305a9ea","name":"altshift","description":"Altshift open source framework","dist-tags":{"latest":"0.3.11-1"},"versions":{"0.1.0":{"name":"altshift","version":"0.1.0","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/node-altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/node-altshift/issues"},"directories":{"lib":"lib","test":"test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/node-altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.1.0","_nodeSupported":true,"_npmVersion":"0.2.12","_nodeVersion":"v0.3.1","dist":{"shasum":"a45a261a53ab18be90d7181bddb5cb98acd31834","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.1.0.tgz"}},"0.1.1":{"name":"altshift","version":"0.1.1","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift","directories":{"lib":"lib","test":"test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.1.1","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"e53a866e40fe2ac223aeebdbf07182873e65794d","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.1.1.tgz"}},"0.1.2":{"name":"altshift","version":"0.1.2","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.1.2","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"0d8daa1f304e0ffa158b95feeae05f0df81b402d","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.1.2.tgz"}},"0.1.3":{"name":"altshift","version":"0.1.3","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.1.3","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"4fda7e4d60977c2bd2f501fe7a6239c00e390106","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.1.3.tgz"}},"0.2.0":{"name":"altshift","version":"0.2.0","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.2.0","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.3.3","modules":{"uri.js":"lib/altshift/uri.js","promise.js":"lib/altshift/promise.js","jsgi.js":"lib/altshift/jsgi.js","index.js":"lib/altshift/index.js","fs.js":"lib/altshift/fs.js","http/client.js":"lib/altshift/http/client.js","core/class.js":"lib/altshift/core/class.js","core/index.js":"lib/altshift/core/index.js","core/dictionary.js":"lib/altshift/core/dictionary.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"84f1d425ba3ad60eee50a3d8f5f3dc7660927ce8","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.2.0.tgz"}},"0.3.0":{"name":"altshift","version":"0.3.0","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.0","_engineSupported":true,"_npmVersion":"0.2.14-5","_nodeVersion":"v0.3.3","modules":{"uri.js":"lib/altshift/uri.js","promise.js":"lib/altshift/promise.js","jsgi.js":"lib/altshift/jsgi.js","index.js":"lib/altshift/index.js","fs.js":"lib/altshift/fs.js","finder.js":"lib/altshift/finder.js","core/class.js":"lib/altshift/core/class.js","core/index.js":"lib/altshift/core/index.js","core/dictionary.js":"lib/altshift/core/dictionary.js","http/client.js":"lib/altshift/http/client.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"01e72cb7f65884ce83d5e4b5f474289fbde5b76d","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.0.tgz"}},"0.3.0-2":{"name":"altshift","version":"0.3.0-2","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.0-2","_engineSupported":true,"_npmVersion":"0.2.14-5","_nodeVersion":"v0.3.3","modules":{"uri.js":"lib/altshift/uri.js","promise.js":"lib/altshift/promise.js","jsgi.js":"lib/altshift/jsgi.js","index.js":"lib/altshift/index.js","fs.js":"lib/altshift/fs.js","finder.js":"lib/altshift/finder.js","core/class.js":"lib/altshift/core/class.js","core/index.js":"lib/altshift/core/index.js","core/dictionary.js":"lib/altshift/core/dictionary.js","http/client.js":"lib/altshift/http/client.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8c108f4b5f4c0bf4af26ba56708643185accd6ba","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.0-2.tgz"}},"0.3.0-3":{"name":"altshift","version":"0.3.0-3","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.0-3","_engineSupported":true,"_npmVersion":"0.2.14-5","_nodeVersion":"v0.3.3","modules":{"uri.js":"lib/altshift/uri.js","promise.js":"lib/altshift/promise.js","jsgi.js":"lib/altshift/jsgi.js","index.js":"lib/altshift/index.js","fs.js":"lib/altshift/fs.js","finder.js":"lib/altshift/finder.js","core/class.js":"lib/altshift/core/class.js","core/index.js":"lib/altshift/core/index.js","core/dictionary.js":"lib/altshift/core/dictionary.js","http/client.js":"lib/altshift/http/client.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6a11a9a6f352fc1e3ecc26c33e25e8ac15e0cf88","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.0-3.tgz"}},"0.3.0-4":{"name":"altshift","version":"0.3.0-4","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.0-4","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.3.5","modules":{"uri.js":"lib/altshift/uri.js","promise.js":"lib/altshift/promise.js","jsgi.js":"lib/altshift/jsgi.js","index.js":"lib/altshift/index.js","fs.js":"lib/altshift/fs.js","finder.js":"lib/altshift/finder.js","core/class.js":"lib/altshift/core/class.js","core/dictionary.js":"lib/altshift/core/dictionary.js","core/index.js":"lib/altshift/core/index.js","http/client.js":"lib/altshift/http/client.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5a5d275c56a543e8aec27e97059802fec01ce52c","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.0-4.tgz"}},"0.3.1-1":{"name":"altshift","version":"0.3.1-1","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.1-1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.3.4","modules":{"io.js":"lib/altshift/io.js","uri.js":"lib/altshift/uri.js","promise.js":"lib/altshift/promise.js","jsgi.js":"lib/altshift/jsgi.js","index.js":"lib/altshift/index.js","fs.js":"lib/altshift/fs.js","finder.js":"lib/altshift/finder.js","core/class.js":"lib/altshift/core/class.js","core/index.js":"lib/altshift/core/index.js","core/dictionary.js":"lib/altshift/core/dictionary.js","http/client.js":"lib/altshift/http/client.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"561f668ebae4b0437f7b1ff65e75f89ff0b0ad35","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.1-1.tgz"}},"0.3.3":{"name":"altshift","version":"0.3.3","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.3","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b2f2d22976461f5b9c9d1fdee209970fffab7412","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.3.tgz"}},"0.3.2-2":{"name":"altshift","version":"0.3.2-2","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.2-2","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.1","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"828e7b37558890feb4e9759a87319bcd0ed77006","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.2-2.tgz"}},"0.3.3-2":{"name":"altshift","version":"0.3.3-2","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.3-2","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.1","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3e04c591d052fad3399c9feea788178e295328be","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.3-2.tgz"}},"0.3.4":{"name":"altshift","version":"0.3.4","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.2.0"},"_id":"altshift@0.3.4","_engineSupported":true,"_npmVersion":"0.3.4","_nodeVersion":"v0.4.1","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3ecbdbdf55fdbd390b7735d28bacc07f45af066c","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.4.tgz"}},"0.3.4-2":{"name":"altshift","version":"0.3.4-2","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift/index.js","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.0"},"_id":"altshift@0.3.4-2","_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"aae8222bc8f6a0c3a825bdc1ff65e43f2413e0c7","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.4-2.tgz"}},"0.3.4-3":{"name":"altshift","version":"0.3.4-3","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift/index.js","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{},"engines":{"node":">=0.4.0"},"_id":"altshift@0.3.4-3","_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.4.1","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c412ac0053bf07ca94183908a23965ab5777ba6f","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.4-3.tgz"}},"0.3.7":{"name":"altshift","version":"0.3.7","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift/index.js","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{},"engines":{"node":">=0.4.3"},"_id":"altshift@0.3.7","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fdc7fdca68b04b00333fad07ade6c4c364050f9e","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.7.tgz"}},"0.3.7-2":{"name":"altshift","version":"0.3.7-2","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift/index.js","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{},"engines":{"node":">=0.4.3"},"_id":"altshift@0.3.7-2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","dist":{"shasum":"de79baef553f6ca2832787fd2eeb1dcfb3b577f0","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.7-2.tgz"}},"0.3.7-3":{"name":"altshift","version":"0.3.7-3","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"./lib/altshift/index.js","directories":{"lib":"./lib/altshift","test":"./test","bin":"./bin"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{},"engines":{"node":">=0.4.3"},"_id":"altshift@0.3.7-3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","bin":{"altshift":"bin/altshift"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f5789edc25dfa0b7d163e55281e66ee01bae7265","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.7-3.tgz"}},"0.3.8":{"name":"altshift","version":"0.3.8","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"index","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{},"devDependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.3"},"_id":"altshift@0.3.8","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"158751ca91e4d98ec15728b380165dc82f2857bd","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.8.tgz"},"scripts":{}},"0.3.9":{"name":"altshift","version":"0.3.9","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/as-jpolo/altshift.git"},"bugs":{"url":"http://github.com/as-jpolo/altshift/issues"},"main":"index","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/as-jpolo/altshift/blob/master//LICENSE"}],"dependencies":{},"devDependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.3"},"_id":"altshift@0.3.9","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"afc5be3e2395c9a329fc84181e120b99a9e3040d","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.9.tgz"},"scripts":{}},"0.3.9-1":{"name":"altshift","version":"0.3.9-1","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/altshift/altshift.git"},"bugs":{"url":"http://github.com/altshift/altshift/issues"},"main":"index","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/altshift/altshift/blob/master//LICENSE"}],"dependencies":{},"devDependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.3"},"_npmJsonOpts":{"file":"/home/jpolo/.npm/altshift/0.3.9-1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"altshift@0.3.9-1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"263ad222259aa65d514b4021c4b13a74629ceaee","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.9-1.tgz"},"scripts":{}},"0.3.10":{"name":"altshift","version":"0.3.10","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/altshift/altshift.git"},"bugs":{"url":"http://github.com/altshift/altshift/issues"},"main":"index","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/altshift/altshift/blob/master//LICENSE"}],"dependencies":{},"devDependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.3"},"_npmJsonOpts":{"file":"/home/jpolo/.npm/altshift/0.3.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"altshift@0.3.10","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"18abb29b42dd5c312aa2d9aace7c024eb6eef659","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.10.tgz"},"scripts":{}},"0.3.11":{"name":"altshift","version":"0.3.11","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/altshift/altshift.git"},"bugs":{"url":"http://github.com/altshift/altshift/issues"},"main":"index","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/altshift/altshift/blob/master//LICENSE"}],"dependencies":{},"devDependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.3"},"_npmJsonOpts":{"file":"/home/jpolo/.npm/altshift/0.3.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"altshift@0.3.11","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"46d4d91f88d216c4bc7af7c2cc2b046d689bdfdc","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.11.tgz"},"scripts":{}},"0.3.11-1":{"name":"altshift","version":"0.3.11-1","author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"description":"Altshift open source framework","keywords":["framework","jsclass"],"repository":{"type":"git","url":"git://github.com/altshift/altshift.git"},"bugs":{"url":"http://github.com/altshift/altshift/issues"},"main":"index","directories":{"lib":"./lib/altshift","test":"./test"},"licenses":[{"type":"MIT","url":"http://github.com/altshift/altshift/blob/master//LICENSE"}],"dependencies":{},"devDependencies":{"vows":"*","lint":"*"},"engines":{"node":">=0.4.3"},"_npmUser":{"name":"as-jpolo","email":"julien.polo@altshift.fr"},"_id":"altshift@0.3.11-1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cacc3edc221201df7b5d4bb0303545bc9a8fcd4d","tarball":"http://registry.npmjs.org/altshift/-/altshift-0.3.11-1.tgz"},"maintainers":[{"name":"as-jpolo","email":"julien.polo@altshift.fr"}]}},"maintainers":[{"name":"as-jpolo","email":"julien.polo@altshift.fr"},{"name":"jpolo","email":"julien.polo@gmail.com"}],"author":{"name":"Julien Polo","email":"julien.polo@altshift.fr"},"repository":{"type":"git","url":"git://github.com/altshift/altshift.git"},"time":{"modified":"2012-01-03T14:33:38.411Z","created":"2011-01-07T17:37:50.173Z","0.1.0":"2011-01-07T17:37:50.173Z","0.1.1":"2011-01-07T17:37:50.173Z","0.1.2":"2011-01-07T17:37:50.173Z","0.1.3":"2011-01-07T17:37:50.173Z","0.2.0":"2011-01-07T17:37:50.173Z","0.3.0":"2011-01-11T17:20:48.526Z","0.3.0-2":"2011-01-12T09:51:14.490Z","0.3.0-3":"2011-01-12T15:54:33.193Z","0.3.0-4":"2011-01-17T11:07:06.270Z","0.3.1-1":"2011-01-18T18:12:00.222Z","0.3.3":"2011-02-16T15:06:45.871Z","0.3.2-2":"2011-02-20T18:42:44.432Z","0.3.3-2":"2011-02-20T18:43:38.232Z","0.3.4":"2011-02-22T15:53:08.969Z","0.3.4-2":"2011-02-23T09:36:29.524Z","0.3.4-3":"2011-02-24T16:57:49.636Z","0.3.7":"2011-03-25T10:12:17.460Z","0.3.7-2":"2011-04-14T16:16:10.914Z","0.3.7-3":"2011-04-15T15:56:31.586Z","0.3.8":"2011-05-03T16:35:00.340Z","0.3.9":"2011-05-10T12:40:00.350Z","0.3.9-1":"2011-07-05T16:42:09.536Z","0.3.10":"2011-07-28T12:20:45.805Z","0.3.11":"2011-07-29T13:34:45.915Z","0.3.11-1":"2011-10-21T13:25:41.951Z"},"_attachments":{"altshift-0.3.11-1.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-VxNFdOX/gjuLGVX0/dhI9g==","length":64826,"stub":true},"altshift-0.3.11.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-7frDKdfuYFVuRDIonSfgew==","length":64828,"stub":true},"altshift-0.3.10.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-qdqEXht6z3hcMi5ePUpb+g==","length":64461,"stub":true},"altshift-0.3.9-1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-jJ3U0ihFwMj97OekGhTvRw==","length":64317,"stub":true},"altshift-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-Divt3LJFw1xoQzxVL7N8Og==","length":64299,"stub":true},"altshift-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-faw3JUQEVDOK3Tc1GEn1AA==","length":64301,"stub":true},"altshift-0.3.7-3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-e4dJUfOCH64Zi9pI8Icusw==","length":86804,"stub":true},"altshift-0.3.7-2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-ustsZUeyF6omHeTFcnD6IQ==","length":86657,"stub":true},"altshift-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-GDibUWDJ9cKOmhAArl3usg==","length":86449,"stub":true},"altshift-0.3.4-3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-tDLxEwT1jgDLqvtuf42yTg==","length":60048,"stub":true},"altshift-0.3.4-2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-nuppAGR4nV90hIF4tRTqsQ==","length":59913,"stub":true},"altshift-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Mfhu6O2RPA+M1kExRHWH5Q==","length":59468,"stub":true},"altshift-0.3.3-2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-kN2X2ibvwW2ekjlsWDpLCw==","length":58722,"stub":true},"altshift-0.3.2-2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-+/IQ+FP/iismlZ2ArmGj9g==","length":58725,"stub":true},"altshift-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-E1S3nLE61labNjU1reQGZg==","length":59895,"stub":true},"altshift-0.3.1-1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-aHMwl8PUgnxZ3B4JqZbGOQ==","length":57490,"stub":true},"altshift-0.3.0-4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-mOpN7yPNH2eF7xw6vMGpVw==","length":56113,"stub":true},"altshift-0.3.0-3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-k3v6/Yj08qTfQBXXsenZZw==","length":55728,"stub":true},"altshift-0.3.0-2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-IpUcH350AnFE3ogqehMgVw==","length":55080,"stub":true},"altshift-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-XqxToYsHoposypMxbRw42A==","length":54911,"stub":true},"altshift-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-2uvZXMbBwz3ViMj7pIS/Ug==","length":50738,"stub":true},"altshift-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hk6q1zM/H71AIf9eRwzv6A==","length":38080,"stub":true},"altshift-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AcBKbD+VCPtp+fI22GX8fA==","length":38079,"stub":true},"altshift-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-j7ZbJ17SCTai2f30S10Enw==","length":38085,"stub":true},"altshift-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DD2gw2PhgdxgS6sH56GLyA==","length":29419,"stub":true}}}},
{"id":"always","key":"always","value":{"rev":"45-09490da9625ffaf5f0e6c216f2e917d1"},"doc":{"_id":"always","_rev":"45-09490da9625ffaf5f0e6c216f2e917d1","name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","dist-tags":{"latest":"2.0.0"},"versions":{"0.2.0":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"A CLI & Daemon tool to run a NodeJS process Forever, restarting on file changes & crashes with piping to stdout or log files.","version":"0.2.0","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.4.12 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.0"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"0fa0d26e548653546c81a89ddf8b42afc4cc1e2a","tarball":"http://registry.npmjs.org/always/-/always-0.2.0.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.2.1":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"A CLI & Daemon tool to run a NodeJS process Forever, restarting on file changes & crashes with piping to stdout or log files.","version":"0.2.1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.4.12 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.0"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.2.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"fda4ca7988719de3797f196db3045404f7081c5c","tarball":"http://registry.npmjs.org/always/-/always-0.2.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.2.2":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"A CLI & Daemon tool to run a NodeJS process Forever, restarting on file changes & crashes with piping to stdout or log files.","version":"0.2.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.4.12 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.0"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"bb0e0d0b40344fe74c961b897f610ab206142053","tarball":"http://registry.npmjs.org/always/-/always-0.2.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.2.3":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"A CLI & Daemon tool to run a NodeJS process Forever, restarting on file changes & crashes with piping to stdout or log files.","version":"0.2.3","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.4.12 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.0"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.2.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"11ea478041819bc329175eef2a44b2e2b10e0f6d","tarball":"http://registry.npmjs.org/always/-/always-0.2.3.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.4.0":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI & Daemon tool to run a NodeJS process always, restarting on file changes & crashes with piping to stderr/stdout or log files","version":"0.4.0","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.6 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.0"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"node test/cli.test.js"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.4.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5b0d392469425ac9d4a3647ea4ba1b9bb72faf46","tarball":"http://registry.npmjs.org/always/-/always-0.4.0.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.4.1":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI & Daemon tool to run a NodeJS process always, restarting on file changes & crashes with piping to stderr/stdout or log files","version":"0.4.1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.6 < 0.8.0"},"dependencies":{"vows":"0.6.0"},"devDependencies":{},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.4.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ab63ca5e78d729bb2335975788512692569afde4","tarball":"http://registry.npmjs.org/always/-/always-0.4.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.4.2":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI & Daemon tool to run a NodeJS process, restarting on file changes & crashes","version":"0.4.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.6 < 0.8.0"},"dependencies":{"vows":"0.6.0"},"devDependencies":{},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.4.2","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"87b6a796bf41f18b20a968ec83de3961908dcf8a","tarball":"http://registry.npmjs.org/always/-/always-0.4.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.4.3":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"0.4.3","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.4.11 < 0.8.0"},"dependencies":{"vows":"0.6.0"},"devDependencies":{},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"always@0.4.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"616cb52bc0aee0bb3c5be15eeacb4a56d0931bf0","tarball":"http://registry.npmjs.org/always/-/always-0.4.3.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.4.4":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"0.4.4","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.12 < 0.7.0"},"dependencies":{"vows":"0.6.2"},"devDependencies":{},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"always@0.4.4","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"007c799b8e8838233289a73aba4d690864ad48ee","tarball":"http://registry.npmjs.org/always/-/always-0.4.4.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.5.0":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"0.5.0","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.12 < 0.7.0"},"dependencies":{"vows":"0.6.2"},"devDependencies":{},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"always@0.5.0","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f83952de6509af1acaf4baacd6bf4bea9184db60","tarball":"http://registry.npmjs.org/always/-/always-0.5.0.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.5.1":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"0.5.1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.12 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"always@0.5.1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"27579da3dcdfbff92bc62c51c1d653dd27b1875b","tarball":"http://registry.npmjs.org/always/-/always-0.5.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"0.5.2":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"0.5.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.12 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"main":"","licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"always@0.5.2","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"07a3f2e4fa824558c4710ec584823bb6573d7f47","tarball":"http://registry.npmjs.org/always/-/always-0.5.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"1.0.0":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"1.0.0","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.4.0 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edwardhotchkiss@me.com"},"_id":"always@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b015dcbcd756649fa1637719e37d8cb15704cbf8","tarball":"http://registry.npmjs.org/always/-/always-1.0.0.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"1.1.0":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"1.1.0","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.19 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edwardhotchkiss@me.com"},"_id":"always@1.1.0","optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"23bc8b8287b998809eea9b2238d686aa578a0081","tarball":"http://registry.npmjs.org/always/-/always-1.1.0.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"1.1.1":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"1.1.1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"},{"name":"MikeMayer"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.19 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edwardhotchkiss@me.com"},"_id":"always@1.1.1","optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"72d6d9f8e6c9e3317d89b7e9014bb02ea328d5f6","tarball":"http://registry.npmjs.org/always/-/always-1.1.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"1.1.2":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"1.1.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"},{"name":"MikeMayer"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edwardhotchkiss@me.com"},"_id":"always@1.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"899a23b3776e55c0dcafbbb0712dc83f50319cb7","tarball":"http://registry.npmjs.org/always/-/always-1.1.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"1.1.3":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"1.1.3","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"},{"name":"MikeMayer"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"readme":"\n# always - [![Build Status](https://secure.travis-ci.org/edwardhotchkiss/always.png)](http://travis-ci.org/edwardhotchkiss/always)\n\n> CLI Tool to run a Node.JS Process, Restarting on File Changes & Crashes\n\n## Installation\n\n```bash\n$ [sudo] npm install always -g\n```\n\n## Usage (Realtime Editing & Development)\n\n```bash\n$ always app.js\n```\n\n## Help\n\n```bash\nUsage: always <app.js>\n=> always app.js\n\nOptions:\n  -v, --version    current `always` version\n  -h, --help       help!\n```\n\n## Run Tests\n\n``` bash\n$ npm test\n```\n\n## License (MIT)\n\nCopyright (c) 2011, Edward Hotchkiss.\n\n## Author: [Edward Hotchkiss][0]\n\n[0]: http://edwardhotchkiss.com/\n","_id":"always@1.1.3","dist":{"shasum":"f9c6a78e4c87bbf6ac182b285bd3949c3245607f","tarball":"http://registry.npmjs.org/always/-/always-1.1.3.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"directories":{}},"2.0.0":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"always","description":"CLI Tool to run a NodeJS Process, Restarting on File Changes & Crashes","version":"2.0.0","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"homepage":"http://edwardhotchkiss.github.com/always","contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},{"name":"mugenen","email":"https://twitter.com/#!/Scaled_Wurm"},{"name":"MikeMayer"},{"name":"Wronex"}],"keywords":["always","process","forever","error","uncaught"],"engines":{"node":">= 0.6.0"},"dependencies":{},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/always/issues"},"bin":{"always":"./bin/always.js"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/always/LICENSE"}],"preferGlobal":"true","scripts":{"test":"vows test/*.test.js --spec"},"readme":"\n# always - [![Build Status](https://secure.travis-ci.org/edwardhotchkiss/always.png)](http://travis-ci.org/edwardhotchkiss/always)\n\n> CLI Tool to run a Node.JS Process, Restarting on File Changes & Crashes\n\n## Installation\n\n```bash\n$ [sudo] npm install always -g\n```\n\n## Usage (Realtime Editing & Development)\n\n```bash\n$ always app.js\n```\n\n## Help\n\n```bash\nUsage: always <app.js>\n=> always app.js\n\nOptions:\n  -v, --version    current `always` version\n  -h, --help       help!\n```\n\n## Run Tests\n\n``` bash\n$ npm test\n```\n\n## License (MIT)\n\nCopyright (c) 2011, Edward Hotchkiss.\n\n## Author: [Edward Hotchkiss][0]\n\n[0]: http://edwardhotchkiss.com/\n","_id":"always@2.0.0","dist":{"shasum":"eb0f1f4ae654c63d15fedb438ddab2031f91daa4","tarball":"http://registry.npmjs.org/always/-/always-2.0.0.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]}},"readme":"\n# Always - [![Build Status](https://secure.travis-ci.org/edwardhotchkiss/always.png)](http://travis-ci.org/edwardhotchkiss/always)\n\n> A CLI & Daemon tool to run a NodeJS process Forever, restarting on file changes & crashes with piping to stdout or log files.\n\n## Installation\n\n```bash\n$ [sudo] npm install always -g\n```\n\n## Usage\n\n### Realtime Editing & Development\n\n```bash\n$ always app.js\n```\n\n## Run Tests\n\n``` bash\n$ npm test\n```\n\n## License (MIT)\n\nCopyright (c) 2011, Edward Hotchkiss.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n## Author: [Edward Hotchkiss][0]\n\n[0]: http://ingklabs.com/\n","maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"time":{"modified":"2012-08-04T13:39:44.597Z","created":"2011-12-12T21:37:19.414Z","0.2.0":"2011-12-12T21:37:20.015Z","0.2.1":"2011-12-14T01:27:34.441Z","0.2.2":"2011-12-14T06:23:47.418Z","0.2.3":"2011-12-14T07:40:17.140Z","0.4.0":"2011-12-18T22:43:26.596Z","0.4.1":"2011-12-20T02:54:39.239Z","0.4.2":"2011-12-23T22:07:19.187Z","0.4.3":"2011-12-25T17:57:06.162Z","0.4.4":"2012-03-11T14:05:11.134Z","0.5.0":"2012-03-13T12:15:33.920Z","0.5.1":"2012-03-13T12:17:34.438Z","0.5.2":"2012-03-22T05:24:42.524Z","1.0.0":"2012-05-01T02:34:56.973Z","1.1.0":"2012-06-09T20:36:56.366Z","1.1.1":"2012-06-10T11:36:13.660Z","1.1.2":"2012-06-26T10:48:49.006Z","1.1.3":"2012-06-29T23:06:28.465Z","2.0.0":"2012-08-04T13:39:44.597Z"},"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"repository":{"type":"git","url":"git://github.com/edwardhotchkiss/always.git"},"_attachments":{"always-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-k1xtTYZQhT5wJ/tZHSNtlg==","length":7211,"stub":true},"always-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-vZ1A7ROuO2Q8KT3JppyFjw==","length":6773,"stub":true},"always-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-xCU4FQE3ySeZnF8tEAAzTg==","length":6704,"stub":true},"always-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-QNz+C7uMVB3HxYVM9DI7nw==","length":6671,"stub":true},"always-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-deDRCjDpq50+3rwuPVX8hQ==","length":6447,"stub":true},"always-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-HBraLHt80L+97sa3lGEH/Q==","length":6501,"stub":true},"always-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-O10pJTQlx6Sm981BN5qAYw==","length":10240,"stub":true},"always-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-C+yZMF4Qn1JNHD3SS4n7Uw==","length":10240,"stub":true},"always-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-cit3eVOhpek1P1lLgydCpw==","length":10240,"stub":true},"always-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-E0wO6JiRqo9JYLMXDt6Qeg==","length":10240,"stub":true},"always-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-MZXWl8WTxA7B6lDaN/lTCQ==","length":6102,"stub":true},"always-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-MnaZtk4xIUjlanBzI7zzkw==","length":10240,"stub":true},"always-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3zfYCK/X0G4RIy6KcNGFMw==","length":6077,"stub":true},"always-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KjkM42/9BNStt5cSU3QIww==","length":5961,"stub":true},"always-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ldo3h5+jp9CYKZxt0jqgyw==","length":10240,"stub":true},"always-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-G5jnDpcZecuJ+GnDn09Sqw==","length":10240,"stub":true},"always-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8vYtVlZnitXPlt5liUnzSw==","length":10240,"stub":true},"always-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GtcrekLhHmfunDwL+aSuLA==","length":10240,"stub":true}}}},
{"id":"amaca","key":"amaca","value":{"rev":"5-fab6443df3b7f293cfc1596a2b63c391"},"doc":{"_id":"amaca","_rev":"5-fab6443df3b7f293cfc1596a2b63c391","name":"amaca","description":"Webserver with http/https proxy to spawn applications. Using forever and hook.io for a multiprocess talking :-)","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"private":false,"preferGlobal":true,"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"amaca","description":"Node server manager","version":"0.0.1","repository":{"type":"git","url":"git://github.com/behere/amaca.git"},"main":"./lib/amaca","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"amaca@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ea2a6fc968fe52a57199b41a873bc50775ef4da6","tarball":"http://registry.npmjs.org/amaca/-/amaca-0.0.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]},"0.1.0":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"amaca","description":"Webserver with http/https proxy to spawn applications. Using forever and hook.io for a multiprocess talking :-)","version":"0.1.0","repository":{"type":"git","url":"git://github.com/behere/amaca.git"},"main":"./lib/amaca.js","scripts":{"prepublish":"npm prune","test":"make test"},"dependencies":{"bouncy":"*","portfinder":"*","forever":"*","hook.io":"*","jsDAV":"*","asyncjs":"0.0.9","node-sftp":"~0.1.1","jsftp":"~0.3.3"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"bin":{"amaca":"./bin/amaca"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"amaca@0.1.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"3d987fb4fe70898f01e3d5fbe78a3900b5112030","tarball":"http://registry.npmjs.org/amaca/-/amaca-0.1.0.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]}},"readme":"Amaca\r\n=====\r\n\r\nNode server manager\r\n\r\n## Contributors\r\n\r\n    Gabriele Di Stefano <gabriele.ds@gmail.com>","maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"time":{"modified":"2012-07-02T23:24:06.197Z","created":"2012-06-13T17:24:01.182Z","0.0.1":"2012-06-13T17:24:48.177Z","0.1.0":"2012-07-02T23:24:06.197Z"},"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"repository":{"type":"git","url":"git://github.com/behere/amaca.git"},"_attachments":{"amaca-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nfZRgd4JqELOwK2lO1gVMQ==","length":4958,"stub":true},"amaca-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-54C1TeE53xgJn1GdA2NroA==","length":535,"stub":true}}}},
{"id":"amanda","key":"amanda","value":{"rev":"23-bd1a2eb551147de4c5ddc2bf6f5b6b80"},"doc":{"_id":"amanda","_rev":"23-bd1a2eb551147de4c5ddc2bf6f5b6b80","name":"amanda","description":"JSON Schema validator","dist-tags":{"latest":"0.4.2"},"versions":{"0.0.1":{"name":"amanda","description":"JSON Schema validator","version":"0.0.1","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"nodeunit":"0.5.1","async":"0.1.15"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./src/amanda.js","engines":{"node":">= 0.3.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"nodeunit tests/* tests/validators/type/*"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6d63f48a624c585ddd6e18027e671321a4a100ab","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.0.1.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{}},"0.2.0":{"name":"amanda","description":"JSON Schema validator","version":"0.2.0","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"nodeunit":"0.5.1"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./src/amanda.js","engines":{"node":">= 0.3.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"nodeunit tests/addValidator.js tests/errorObject.js tests/validation/* tests/validators/*"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"216316fe03ff8aedf543cd5c9c30f32feafbb694","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.2.0.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{}},"0.2.1":{"name":"amanda","description":"JSON Schema validator","version":"0.2.1","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"nodeunit":"0.5.1"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./src/amanda.js","engines":{"node":">= 0.3.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"nodeunit tests/addValidator.js tests/errorObject.js tests/validation/* tests/validators/*"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.2.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ae625c0d16b4ded1fc2a1cfe44d47e43b7334e7e","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.2.1.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{}},"0.2.2":{"name":"amanda","description":"JSON Schema validator","version":"0.2.2","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"nodeunit":"0.5.1"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./src/amanda.js","engines":{"node":">= 0.3.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"nodeunit tests/addValidator.js tests/errorObject.js tests/validation/* tests/validators/*"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.2.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f59ca94f9dedeb1e4be477b9456a6ba76fb6c3dc","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.2.2.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{}},"0.3.0":{"name":"amanda","description":"JSON Schema validator","version":"0.3.0","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"nodeunit":"0.6.4"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./src/amanda.js","engines":{"node":">= 0.6.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"nodeunit tests/addValidator.js tests/errorMessages.js tests/errorObject.js tests/validation/* tests/validators/*"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.3.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"bffddbe0f7feb73a9fea108d45a9dc21352cf704","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.3.0.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{}},"0.4.0":{"name":"amanda","description":"JSON Schema validator","version":"0.4.0","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","debug":"0.5.0","async":"0.1.18","uglify-js":"1.2.5"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./releases/latest/amanda.js","engines":{"node":">= 0.6.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"mocha --ui tdd --reporter spec ./tests/json/attributes/required/*.js ./tests/json/attributes/format/*.js ./tests/json/attributes/type/*.js ./tests/json/attributes/*.js ./tests/json/*.js"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.4.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5a30a9a18730e940ac07d25eac7e8a9c6f023aed","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.4.0.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{},"deprecated":"fix custom error messages"},"0.4.1":{"name":"amanda","description":"JSON Schema validator","version":"0.4.1","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","debug":"0.5.0","async":"0.1.18","uglify-js":"1.2.5"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./releases/latest/amanda.js","engines":{"node":">= 0.6.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"mocha --ui tdd --reporter spec ./tests/json/attributes/required/*.js ./tests/json/attributes/format/*.js ./tests/json/attributes/type/*.js ./tests/json/attributes/*.js ./tests/json/*.js"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.4.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"39071ffc4e432bd82ff672fda8c8fffe57ad91c7","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.4.1.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"directories":{},"deprecated":"fix the ‘required’ attribute"},"0.4.2":{"name":"amanda","description":"JSON Schema validator","version":"0.4.2","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","debug":"0.5.0","async":"0.1.18","uglify-js":"1.2.5"},"keywords":["JSON","JSON Schema","schema","validator","validate","JSON validator","schema validator","async","browser"],"homepage":"https://github.com/Baggz/Amanda","repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"main":"./releases/latest/amanda.js","engines":{"node":">= 0.6.0"},"bugs":{"email":"hello@frantisekhaba.com","url":"https://github.com/Baggz/Amanda/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Amanda/blob/master/README.md"}],"scripts":{"test":"mocha --ui tdd --reporter spec ./tests/json/attributes/required/*.js ./tests/json/attributes/format/*.js ./tests/json/attributes/type/*.js ./tests/json/attributes/*.js ./tests/json/*.js"},"_npmUser":{"name":"baggz","email":"hello@frantisekhaba.com"},"_id":"amanda@0.4.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a833bb28d579a411632a782e51d701b4d3feae6a","tarball":"http://registry.npmjs.org/amanda/-/amanda-0.4.2.tgz"},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}]}},"readme":"# Amanda\n\n[Amanda](https://github.com/Baggz/Amanda) validates data against JSON Schema. \n\n#### Features\n\n* You can create **your own validators**\n* Fully **asynchronous**\n* Can be used with **Node.js** and **in the browser**\n* Amanda has **no dependencies**\n* **AMD compatible**, you can load it via [RequireJS](https://github.com/jrburke/requirejs)\n* Lightweight\n* Fully **documented**\n* Tested\n\n<a name=\"download\"></a>\n## Download\n\nTo install **Amanda**, use [NPM](http://npmjs.org/).\n\n```\n$ npm install amanda\n```\n\nReleases are available for download from GitHub.\n\n| **Version** | **Description** | **Size** | **Action** |\n|:------------|:----------------|:---------|:-----------|\n| `amanda.js` | *uncompressed, with comments* | 8.85 KB (2.26 KB gzipped) | [Download](https://raw.github.com/Baggz/Amanda/master/src/amanda.js) |\n| `amanda.min.js` | *compressed, without comments* | 4.16 KB (1.5 KB gzipped) | [Download](https://raw.github.com/Baggz/Amanda/master/dist/amanda.min.js) |\n\n<a name=\"documentation\"></a>\n# Documentation\n\n**Methods**\n\n* [validate](#validate)\n* [addValidator](#addValidator)\n\n**Objects**\n\n* [schema](#schema)\n* [error](#error)\n\n<a name=\"validate\"></a>\n## Validate\n\n### validate(data, schema, callback)\n\nThe `callback` gets one argument which is an `error` object (see [error](#error) below for more information).\n\n**Example**\n\n```javascript\n/**\n * Schema\n */\nvar schema = {\n  type: 'object',\n  properties: {\n    user: {\n      name: {\n        type: 'string',\n        length: [2, 45],\n        required: true\n      },\n      surname: {\n        type: 'string',\n        length: [2, 45],\n        required: true\n      }\n    }\n  }\n};\n\n/**\n * Data\n */\nvar ata = {\n  user: {\n    name: 'František',\n    surname: 'Hába'\n  }\n};\n\n// Validate\namanda.validate(data, schema, function(error) {\n  if (error) {\n    // Do something...\n  } else {\n    // Do something else...\n  }\n});\n```\n\n<a name=\"addValidator\"></a>\n## AddValidator\n\n### addValidator(name, fn)\n\nThis method allows you to add a custom validator.\n\n**Example**\n\n```javascript\nvar evenValidator = function(paramName, paramValue, validator, validators, callback) {\n  \n  // If ‘even: true’\n  if ( validator ) {\n    \n    if (typeof paramValue === 'number' && (paramValue % 2) === 0) {\n      // No problem, the number is event\n      callback(null);\n    } else {\n      // Ou, ou, the number is not even\n      callback('Sorry, but ‘' + paramName + '’ is not even.');\n    }\n\n  }\n\n};\n\n// Add a new validator\namanda.addValidator('even', evenValidator);\n\nvar schema = {\n  type: 'object',\n  properties: {\n    name: {\n      type: 'string',\n      length: [2, 45],\n      even: true // <= That's your validator\n    }\n  }\n}\n\n```\n\n<a name=\"schema\"></a>\n## Schema\n\n**Validators**\n\n* [required](#required)\n* [length](#length)\n* [type](#type)\n* [values](#values)\n* [except](#except)\n* [min](#min)\n* [max](#max)\n* [patter](#pattern)\n\n<a name=\"required\"></a>\n### Required\n\n```javascript\nvar schema = {\n  type: 'object',\n  properties: {\n    username: {\n      required: true\n    }\n  }\n};\n```\n\n<a name=\"length\"></a>\n### Length\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'object',\n  properties: {\n    username: {\n      type: 'string',\n      length: [2, 45]\n    }\n  }\n};\n```\n\n<a name=\"type\"></a>\n### Type\n\n**Supported Types**\n\n* `string`\n* `number`\n* function`\n* `object`\n* `boolean`\n* `array`\n* `alpha`\n* `alphanumeric`\n* `ipv4`\n* `ipv6`\n* `ip`\n* `email`\n* `url`\n* `date`\n* `decimal`\n* `int`\n* `percentage`\n* `port`\n* `regexp`\n* `unsignedInt`\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'object',\n  properties: {\n    username: {\n      type: 'string'\n    },\n    email: {\n      type: 'email'\n    },\n    contacts: {\n      type: 'array',\n      items: {\n        type: 'string'\n      }\n    }\n  }\n};\n```\n\n<a name=\"values\"></a>\n### Values\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'object',\n  properties: {\n    sex: {\n      type: 'string',\n      values: ['female', 'male']\n    }\n  }\n};\n```\n\n<a name=\"except\"></a>\n### Except\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'object',\n  properties: {\n    username: {\n      type: 'string',\n      except: ['admin', 'administrator']\n    }\n  }\n};\n```\n\n<a name=\"min\"></a>\n### Min\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'number',\n  min: 100\n};\n```\n\n<a name=\"max\"></a>\n### Max\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'number',\n  max: 100\n};\n```\n\n<a name=\"pattern\"></a>\n### Pattern\n\n**Example**\n\n```javascript\nvar schema = {\n  type: 'string',\n  pattern: /^[a]{2,4}$/\n};\n```\n\n<a name=\"error\"></a>\n## Error\n\n```javascript\n{\n  paramName: ...\n  paramValue: ...\n  validatorName: ...\n  validatorValue: ...\n}\n```\n\n<a name=\"compatibility\"></a>\n# Compatibility\n\n### Node.js\n\nFrom version **0.4.11**.\n\n### Browsers\n\n**Desktop**\n\n| **Browser** | **Supported** | **Version** |\n|:------------|:-----------:|:------------|\n| Google Chrome | ✔ | 12+ |\n| Safari | n/a | *Not tested* |\n| Firefox | n/a | *Not tested* |\n| Opera | n/a | *Not tested* |\n| Internet Explorer | ✕ | *Not tested* |\n\n**Mobile**\n\n\n<a name=\"tests\"></a>\n# Running Tests\n\n```\n$ npm tests/\n```\n\n<a name=\"contributors\"></a>\n# Contributors\n\nThe following are the major contributors of Amanda (in alphabetical order).\n\n* František Hába ([@Baggz](https://github.com/Baggz))\n\n<a name=\"license\"></a>\n# License\n\n(The MIT License)\n\nCopyright (c) 2011 František Hába &lt;hello@frantisekhaba.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"time":{"modified":"2012-03-16T20:25:17.666Z","created":"2011-11-18T11:19:23.919Z","0.0.1":"2011-11-18T11:19:26.053Z","0.2.0":"2011-11-24T14:24:20.369Z","0.2.1":"2011-11-24T17:57:34.097Z","0.2.2":"2011-11-29T17:40:07.610Z","0.3.0":"2012-02-22T11:14:45.079Z","0.4.0":"2012-03-15T22:59:44.389Z","0.4.1":"2012-03-16T06:22:18.869Z","0.4.2":"2012-03-16T20:25:17.666Z"},"author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"repository":{"type":"git","url":"git://github.com/Baggz/Amanda.git"},"_attachments":{"amanda-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-3X7tB8Fuef5IZGGn2jx8Og==","length":70937,"stub":true},"amanda-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Kp10KiWnEGni4/RJMStw2A==","length":59804,"stub":true},"amanda-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-qXgTu3L5zuu9rtumxkMVDg==","length":48625,"stub":true},"amanda-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-chraXisONyQKmuej9zQ2ng==","length":9732,"stub":true},"amanda-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-2hOLYa5ztlFubHQG4LY8Tw==","length":10240,"stub":true},"amanda-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Hp3nX+suo6YG5KKs2XD50g==","length":10240,"stub":true},"amanda-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-w5Abd/TWP4JZhnOQJk8fIg==","length":10240,"stub":true},"amanda-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HgOAYbBhq5xRHnOzGBz9Ig==","length":10240,"stub":true}}}},
{"id":"amazon","key":"amazon","value":{"rev":"8-f533f1553550fa6f8ee24f9a822dec90"},"doc":{"_id":"amazon","_rev":"8-f533f1553550fa6f8ee24f9a822dec90","name":"amazon","description":"The full API of every Amazon AWS service for Node.js.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"amazon","description":"The full API of every Amazon AWS service for Node.js.","keywords":["aws","ec2","amazon"],"version":"0.0.0","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"dependencies":{"node-xml":">=1.0.0"},"devDependencies":{"proof":"0.0.8"},"scripts":{"test":"proof t/*/*.t"},"engines":{"node":"> 0.6.0"},"bin":{"amazon":"./bin/amazon"},"readme":"# Node Amazon [![Build Status](https://secure.travis-ci.org/bigeasy/amazon.png?branch=master)](http://travis-ci.org/bigeasy/amazon)\n\nEvented Node.js bindings to the Amaozn AWS Query API.\n\n * **Node Amazon** is a minimal Node.js API with a pinch of sugar.\n * **Node Amazon** creates a signed request from a AWS AWS command name a plain old\nJavaScript object of command parameters.\n * **Node Amazon** parses the XML response and converts it into JSON.\n * **Node Amazon** does **not** define control flow, so use your favorite control flow\nlibrary.\n * **Node Amazon** lets Amazon AWS do all the error checking in one place, then\n   returns the errors as an `Error` to a Node.js style callback.\n\nBecause **Node Amazon** is such a thin layer over the Amazon AWS API you can use\nthe [Amazon API\nReference](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?query-apis.html)\nto find your way around. **Node Amazon** calls translate directly to Amazon Query API.\n\n## Synopsis\n\nAn example using\n[RunInstances](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-RunInstances.html) to launch a 32-bit Fedora 17 instance in Virginia.\n\nOur program reads the AWS secrets from a file named '~/.aws' that contains the\nkey and secret as JSON.\n\n```\n{ 'key': 'EXAMPLE'\n, 'secret': 'EXAMPLE'\n}\n```\n\nOur program launches and instance, then calls `'DescribeInstances'` until it is\nready to use. When it's read it prints the TK host name for use with `ssh`.\n\n```javascript\n// Require Amazon.\nvar amazon = require('amazon')\n  , fs = require('fs')\n  , path = require('path')\n  , configuration = path.resolve(process.env.HOME, '.aws')\n  ;\n\n// Read in the configuration above.\nvar configuration = JSON.parse(fs.readFileSync(configuration, 'utf8'));\n\n// Create an ec2 function that uses your configuration.\nconfiguration.service = 'ec2';\nec2 = amazon(configuration)\n\n// Run an instance and wait for it to become ready.\nec2('RunInstances', {\n  ImageId: 'ami-2d4aa444', KeyName: 'launch_key', MinCount: 1, MaxCount: 1\n}, running);\n\n\nvar reservationId, instanceId;\nfunction running (error, response) {\n  if (error) throw error;\n  reservationId = response.reservationId\n  instanceId = response.instancesSet[0].instanceId;\n  describe();\n}\n\nfunction describe () {\n  ec2('DescribeInstances', {}, starting);\n}\n\nfunction starting (error, response) {\n  if (error) throw error;\n  var reservation, instance;\n  reservation = response.reservationSet.filter(function (reservation) {\n    return reservation.reservationId == reservationId;\n  })[0];\n  instance = reservation.instancesSet.filter(function (instance) {\n    return instance.instanceId == instanceId;\n  })[0];\n  if (instance.instanceState.name == 'running') ready();\n  else setTimeout(describe, 2500);\n}\n\nfunction ready () {\n  console.log('Instance created with id: ' + instanceId);\n}\n```\n\nI'm afraid you'll find that working with Amazon AWS is a bit wordy. The XML\ndocuments seem to gravitate toward the longest possible element name that could\npossibly describe the property.\n\n## Installing\n\nThe easiest way to install is using npm.\n\n```\nnpm install amazon\n```\n\nYou can also checkout the source code for using `git`. It has only one\ndependency, the wonderful little XML parser `node-xml`.\n\n## Initialization\n\n**Node Amazon** exports a function you can use to build a function to connect to\nthe AWS service of your choice. You can call it directly from `require('amazon')`\nto build an `amazon` function configured for your application.\n\n```javascript\nvar sdb = require('amazon')({ key: '<REDACTED>'\n                            , secret: '<REDACTED>'\n                            , serivce: 'sdb' });\n\nsdb('ListDomains', {}, function (error, result) {\n  if (error) throw error;\n  console.log(result)\n});\n```\n\nThe above example creates a SimpleDB function and lists the domains in the\ndefault region, `'us-east-1'`.\n\nOptions to the `amazon` function are:\n\n * `key` &mdash; Your Amazon AWS key.\n * `secret` &mdash; Your Amazon AWS secret key, which you should always keep\n   secret.\n * `service` &mdash; The Amazon AWS service identifier.\n * `region` &mdash; Either the region identifier or else the fully qualified\n   domain name of the AWS server.\n\nThe service identifiers are one of the following.\n\n * cloudformation &mdash; [AWS CloudFormation](http://aws.amazon.com/documentation/cloudformation/).\n * cloudfront &mdash; [Amazon CloudFront](http://aws.amazon.com/documentation/cloudfront/).\n * monitoring: &mdash; [Amazon CloudWatch](http://aws.amazon.com/documentation/cloudwatch/).\n * is: &mdash; [Amazon DevPay](http://aws.amazon.com/documentation/devpay/).\n * dynamodb: [Amazon DynamoDB](http://aws.amazon.com/documentation/dynamodb/).\n * ec2: [Amazon Elastic Compute Cloud (EC2)](http://aws.amazon.com/documentation/ec2/).\n * elasticmapreduce: [Amazon Elastic MapReduce](http://aws.amazon.com/documentation/elasticmapreduce/).\n * elasticache: [Amazon ElastiCache](http://aws.amazon.com/documentation/elasticache/).\n * fps: [Amazon Flexible Payments Service (FPS and ASP)](http://aws.amazon.com/documentation/fps/).\n * mechanicalturk: [Amazon Mechanical Turk](http://aws.amazon.com/documentation/mturk/).\n * rds: [Amazon Relational Database Service (RDS)](http://aws.amazon.com/documentation/rds/).\n * route53: [Amazon Route 53](http://aws.amazon.com/documentation/route53/).\n * email: [Amazon Simple Email Service (SES)](http://aws.amazon.com/documentation/ses/).\n * sdb: [Amazon SimpleDB](http://aws.amazon.com/documentation/simpledb/).\n * sns: [Amazon Simple Notification Service (SNS)](http://aws.amazon.com/documentation/sns/).\n * sqs: [Amazon Simple Queue Service (SQS)](http://aws.amazon.com/documentation/sqs/).\n * s3: [Amazon Simple Storage Service (S3)](http://aws.amazon.com/documentation/s3/).\n * autoscaling: [Auto Scaling](http://aws.amazon.com/documentation/autoscaling/).\n * elasticbeanstalk: [AWS Elastic Beanstalk](http://aws.amazon.com/documentation/elasticbeanstalk/).\n * iam: [AWS Identity and Access Management (IAM)](http://aws.amazon.com/documentation/iam/).\n * importexport: [AWS Import/Export](http://aws.amazon.com/documentation/importexport/).\n * sts: [AWS Security Token Service](http://aws.amazon.com/documentation/iam/).\n * storagegateway: [AWS Storage Gateway](http://aws.amazon.com/documentation/storagegateway/).\n * elasticloadbalancing: [Elastic Load Balancing](http://aws.amazon.com/documentation/elasticloadbalancing/).\n\nThe region identifiers are one of the following.\n\n * `us-west-2` &mdash; Oregon.\n * `us-west-1` &mdash; California.\n * `us-east-1` &mdash; Virginia.\n * `sa-east-1` &mdash; Sao Paluo.\n * `ap-northeast-1` &mdash; Tokyo.\n * `ap-southeast-1` &mdash; Singapore.\n * `eu-west-1` &mdash; Ireland.\n * `us-gov-west-1` &mdash; US Government.\n\nIf you do not specify `region` when you construct your `amazon` function, you\ncan specify it later when you call your `amazon` function.\n\n## Invocation\n\nInvoke **Node Amazon** by passing a command name, command parameters in an\nobject, and a callback.\n\n```javascript\nvar ec2 = require('amazon')({ key: '<REDACTED>'\n                            , secret: '<REDACTED>'\n                            , region: 'us-east-1'\n                            , service: 'ec2'\n                            })\n  , parameters;\n\nparameters =\n{ ImageId: 'ami-2d4aa444'\n, KeyName: 'launch_key'\n, MinCount: 1\n, MaxCount: 1\n};\n\nec2('RunInstances', parameters, function (error, result) {\n  if (error) throw error;\n  console.log(result)\n});\n```\n\nYou can override configuration details by passing an options object as the first\nargument to the **Node Amazon** function.\n\n```javascript\nvar ec2 = require('amazon')({ key: '<REDACTED>'\n                            , secret: '<REDACTED>'\n                            , region: 'us-east-1'\n                            })\n  , parameters;\n\nparameters =\n{ ImageId: 'ami-e269e5d2'\n, KeyName: 'launch_key'\n, MinCount: 1\n, MaxCount: 1\n};\n\nec2({ region: 'us-west-2' }, 'RunInstances', parameters, function (error, result) {\n  if (error) throw error;\n  console.log(result)\n});\n```\n\nYou can also create a new **Node Amazon** function that extends configuration of an\n**Node Amazon** function. You can use this to create a base function that holds\nyour credentials, and specific functions for the specific regions.\n\n```javascript\nvar ec2 = require('ec2')({ key: '<REDACTED>' , secret: '<REDACTED>' })\n  , ec2east = ec2({ region: 'us-east-1' })\n  , ec2west = ec2({ region: 'us-west-2' })\n  , parameters\n  ;\n\nparameters =\n{ ImageId: 'ami-e269e5d2'\n, KeyName: 'launch_key'\n, MinCount: 1\n, MaxCount: 1\n};\n\nec2east('RunInstances', parameters, function (error, eastern) {\n  if (error) throw error;\n  parameters.ImageId = 'ami-e269e5d2';\n  ec2west('RunInstances', parameters, function (error, western) {\n    if (error) throw error;\n    console.log(eastern, western);\n  });\n});\n```\n\n## Why So Simple?\n\nAnother implementation might set out to define a library of functions, one for\neach function provided by the AWS Amazon API. This way, you could validate the\ncommand name and parameters before you call.\n\nWe believe that if there's something wrong with your request, you'll find out\nsoon enough. The Amazon AWS server that handles your request will do a bang up\njob of error checking, and it will be able to do all the error checking in one\nplace.\n\nOn the client side, we could validate parameter names, but on the AWS site\nvalidation goes beyond semantics to authorization, service availability, etc.\n\nIf the Amazon service you're using adds a dozen new features overnight, you\ndon't have to wait for a new version of **Node Amazon** to use them.\n\nBecause of this, there is a one to one mapping between the Amazon Query API and\nthe actions provided by **Node Amazon**. Changes to the Amazon Query API are\navailable immediately to **Node Amazon** applications.\n\nYou can learn more about node-ec2 at the node-ec2 GitHub web page and by reading\nthe wiki.\n\n## Command Line Interface\n\n**Node Amazon** also comes with a command line interface. The command line\ninterface is very helpful if you want to examine the JSON results of an Amazon\nAWS AWS API call.\n\nThe `amazon` program will look for a configuration file at `~/.aws` or else use\nthe value of the `AWS_CONFIG` environment variable as the path to the\nconfiguration file. The configuration file is the JSON file used to create a\n**Node Amazon** function described above. It contains your key, secret key and\nthe service endpoint.\n\n```\n$ amazon ec2 DescribeKeyPairs\n{\n  \"requestId\": \"1d42624e-a3c8-4dca-8d42-6ac0a11f4468\",\n  \"keySet\": [\n    {\n      \"keyName\": \"automation_key\",\n      \"keyFingerprint\": \"82:a4:69:ca:89:31:8f:58:75:ae:24:eb:e5:71:78:56:32:09:3a:24\"\n    },\n    {\n      \"keyName\": \"temporary_key\",\n      \"keyFingerprint\": \"c0:14:ff:06:23:dd:52:6a:4d:29:e9:0f:1f:54:13:73:e1:c8:fd:90\"\n    },\n    {\n      \"keyName\": \"launch_key\",\n      \"keyFingerprint\": \"8c:cf:71:0d:84:05:19:cd:7d:89:ca:62:7e:8f:51:0b:16:df:f4:c0\"\n    }\n  ]\n}\n```\n\nInvocation is first the command name, then command arguments just as they appear\nin the Amazon AWS API. Note that some arguments in the API require a number\nappended to the argument name.\n\n```\n$ amazon ec2 RunInstances ImageId ami-08d97e61 KeyName launch_key MinCount 1 MaxCount 1\n{\n  \"requestId\": \"7aa586a5-c658-4735-9152-72ad20cb3282\",\n  \"reservationId\": \"r-de7200bb\",\n  \"ownerId\": \"341264201128\",\n  \"groupSet\": [\n    {\n      \"groupId\": \"sg-c8f72da7\",\n      \"groupName\": \"default\"\n    }\n  ],\n  \"instancesSet\": [\n    {\n      \"instanceId\": \"i-2af0e253\",\n      \"imageId\": \"ami-08d97e61\",\n      \"instanceState\": {\n        \"code\": \"0\",\n        \"name\": \"pending\"\n      },\n      \"privateDnsName\": null,\n      \"dnsName\": null,\n      \"reason\": null,\n      \"keyName\": \"launch_key\",\n      \"amiLaunchIndex\": \"0\",\n      \"productCodes\": null,\n      \"instanceType\": \"m1.small\",\n      \"launchTime\": \"2012-06-28T18:29:55.000Z\",\n      \"placement\": {\n        \"availabilityZone\": \"us-east-1a\",\n        \"groupName\": null,\n        \"tenancy\": \"default\"\n      },\n      \"kernelId\": \"aki-407d9529\",\n      \"monitoring\": {\n        \"state\": \"disabled\"\n      },\n      \"groupSet\": [\n        {\n          \"groupId\": \"sg-c8f72da7\",\n          \"groupName\": \"default\"\n        }\n      ],\n      \"stateReason\": {\n        \"code\": \"pending\",\n        \"message\": \"pending\"\n      },\n      \"architecture\": \"i386\",\n      \"rootDeviceType\": \"ebs\",\n      \"rootDeviceName\": \"/dev/sda1\",\n      \"blockDeviceMapping\": null,\n      \"virtualizationType\": \"paravirtual\",\n      \"clientToken\": null,\n      \"hypervisor\": \"xen\"\n    }\n  ]\n}\n```\n\n## Change Log\n\nChanges for each release.\n\n### Version 0.0.0\n\nReleased: Mon Jul 23 07:25:52 UTC 2012\n\n * Build at Travis CI. #11.\n * Specify region on the command line. #8.\n * Specify service on the command line. #7.\n * Map services to API versions. #6.\n * Initial release of Node EC2 expanded to cover all services. #2.\n","_id":"amazon@0.0.0","dist":{"shasum":"3816ebf9b51d818877faf4466fd40f2bfbf55d15","tarball":"http://registry.npmjs.org/amazon/-/amazon-0.0.0.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}],"directories":{}}},"readme":"# Node EC2 [![Build Status](https://secure.travis-ci.org/bigeasy/node-ec2.png?branch=master)](http://travis-ci.org/bigeasy/node-ec2)\n\nEvended Node.js bindings to the EC2 Query API.\n\n * Home: http://bigeasy.github.com/node-ec2\n * Source: http://github.com/bigeasy/node-ec2\n * Documentation: http://github.com/bigeasy/node-ec2/wiki\n\n * Health: http://travis-ci.org/bigeasy/node-ec2\n\n * Discuss: http://groups.google.com/group/nodejs\n * Issues: http://github.com/bigeasy/node-ec2/issues\n\n * License: The MIT License\n\n## Purpose\n\nLaunch Amazon EC2 instances from Node.js and execute callbacks when the\ninstances are available.\n\nnode-ec2 is a minimal Node.js API with absolutely no sugar. node-ec2 signs your\nget requests and converts the XML responses to JSON. Becasue of this, there is a\none to one mapping between the Amazon Query API and the actions provided by\nnode-ec2 and changes to the Amazon Query API are available immediately to\nnode-ec2 applications.\n\nYou can learn more about node-ec2 at the node-ec2 GitHub web page and by reading\nthe wiki.\n\n","maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}],"time":{"modified":"2012-08-02T13:44:39.533Z","created":"2012-05-24T08:38:22.423Z","0.0.1":"2012-05-24T08:38:25.504Z","0.0.0":"2012-07-23T07:26:40.186Z"},"author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"users":{"fgribreau":true},"_attachments":{"amazon-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-fnZmvEYeAPgcjAD4GC/J9w==","length":16689,"stub":true}}}},
{"id":"amazon-associate","key":"amazon-associate","value":{"rev":"7-314c65c25a53358676bc1575f33997f6"},"doc":{"_id":"amazon-associate","_rev":"7-314c65c25a53358676bc1575f33997f6","name":"amazon-associate","description":"simple interface to amazon associate reports","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"amazon-associate","description":"simple interface to amazon associate reports","version":"0.1.0","repository":{"type":"git","url":"git://github.com/snd/node-amazon-associate.git"},"dependencies":{"underscore":"1.3.3","moment":"1.6.2","sax":"0.4.0"},"devDependencies":{"nodeunit":"0.7.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"amazon-associate@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"89204c33a46569399480c03433f2c9ce4a99732a","tarball":"http://registry.npmjs.org/amazon-associate/-/amazon-associate-0.1.0.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]},"0.1.1":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"amazon-associate","description":"simple interface to amazon associate reports","version":"0.1.1","repository":{"type":"git","url":"git://github.com/snd/node-amazon-associate.git"},"dependencies":{"underscore":"1.3.3","moment":"1.6.2","sax":"0.4.0"},"devDependencies":{"nodeunit":"0.7.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"amazon-associate@0.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"44a9d3152986f8c1d5314a2182f83d56f54f5106","tarball":"http://registry.npmjs.org/amazon-associate/-/amazon-associate-0.1.1.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]},"0.1.2":{"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"name":"amazon-associate","description":"simple interface to amazon associate reports","version":"0.1.2","repository":{"type":"git","url":"git://github.com/snd/node-amazon-associate.git"},"dependencies":{"underscore":"1.3.3","moment":"1.6.2","sax":"0.4.0"},"devDependencies":{"nodeunit":"0.7.4"},"_npmUser":{"name":"snd","email":"kruemaxi@googlemail.com"},"_id":"amazon-associate@0.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d65b96aa477345a286d3ea41f6f8a85b4625e08e","tarball":"http://registry.npmjs.org/amazon-associate/-/amazon-associate-0.1.2.tgz"},"maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}]}},"readme":"# amazon-associate\n\nsimple interface to amazon associate reports\n\n**this is very much work in progress**\n\n### Install\n\n    npm install amazon-associate\n\n### Use\n\n```coffeescript\n\nAmazon = require 'amazon-associate'\n\namazon = new Amazon\n    associateId: 'your amazon associate id'\n    password: 'your password'\n    # debug: true\n\namazon.getReports (err, reports) ->\n    throw err if err?\n    console.log reports\n\n    amazon.getEarnings (new Date 2012, 5, 22), (err, earnings) ->\n        throw err if err?\n        console.log earnings\n\n        amazon.getOrders (new Date 2012, 5, 22), (err, orders) ->\n            throw err if err?\n            console.log orders\n```\n\n### License: MIT\n","maintainers":[{"name":"snd","email":"kruemaxi@googlemail.com"}],"time":{"modified":"2012-06-27T20:11:50.081Z","created":"2012-06-27T12:56:00.339Z","0.1.0":"2012-06-27T12:56:01.745Z","0.1.1":"2012-06-27T13:05:41.593Z","0.1.2":"2012-06-27T20:11:50.081Z"},"author":{"name":"Maximilian Krüger","email":"kruemaxi@googlemail.com","url":"http://github.com/snd"},"repository":{"type":"git","url":"git://github.com/snd/node-amazon-associate.git"},"_attachments":{"amazon-associate-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YBigWwHtl4d0MHw89g8Epg==","length":5774,"stub":true},"amazon-associate-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-d/kD8IphUTxvNjf0V4/Qtg==","length":5087,"stub":true},"amazon-associate-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/k8Xe/ruJCbOLpBGER/SKQ==","length":5117,"stub":true}}}},
{"id":"amazon-lib","key":"amazon-lib","value":{"rev":"5-7d482dc14d7ad9be928e4e6db63d11ee"},"doc":{"_id":"amazon-lib","_rev":"5-7d482dc14d7ad9be928e4e6db63d11ee","name":"amazon-lib","description":"AWS Library","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"amazon-lib","description":"AWS Library","version":"0.0.1","keywords":["Amazon","AWS","SQS","SNS"],"repository":{"type":"git","url":"git@github.com:doug-martin/amazon-lib.git"},"author":{"name":"Doug Martin"},"main":"index.js","dependencies":{"comb":">=0.0.3","xml2js":">=0.1.11"},"directories":{"lib":"lib"},"engines":{"node":">= 0.4.4"},"_npmJsonOpts":{"file":"/Users/eds/.npm/amazon-lib/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amazon-lib@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"35b597ca0e802ed4b8a50a98cb4cc87952eea12a","tarball":"http://registry.npmjs.org/amazon-lib/-/amazon-lib-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"damartin","email":"doug@dougamartin.com"}]},"0.0.2":{"name":"amazon-lib","description":"AWS Library","version":"0.0.2","keywords":["Amazon","AWS","SQS","SNS"],"repository":{"type":"git","url":"git@github.com:doug-martin/amazon-lib.git"},"author":{"name":"Doug Martin"},"main":"index.js","dependencies":{"comb":">=0.0.5","xml2js":">=0.1.11"},"directories":{"lib":"lib"},"engines":{"node":">= 0.4.4"},"_npmUser":{"name":"damartin","email":"doug@dougamartin.com"},"_id":"amazon-lib@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"28cc38d13af84d5a20ac249fcb63bb894522db0e","tarball":"http://registry.npmjs.org/amazon-lib/-/amazon-lib-0.0.2.tgz"},"maintainers":[{"name":"damartin","email":"doug@dougamartin.com"}]}},"maintainers":[{"name":"damartin","email":"doug@dougamartin.com"}],"time":{"modified":"2011-11-18T07:49:10.585Z","created":"2011-10-17T14:51:11.867Z","0.0.1":"2011-10-17T14:51:12.961Z","0.0.2":"2011-11-18T07:49:10.585Z"},"author":{"name":"Doug Martin"},"repository":{"type":"git","url":"git@github.com:doug-martin/amazon-lib.git"},"_attachments":{"amazon-lib-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-w1C12FoVT28VfGom5Om6Jg==","length":10240,"stub":true},"amazon-lib-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TwiYMnw1NwrujWb6boksGg==","length":6147,"stub":true}}}},
{"id":"amazon-s3-url-signer","key":"amazon-s3-url-signer","value":{"rev":"10-0ea939adaebb18521fbfcd38d31a331f"},"doc":{"_id":"amazon-s3-url-signer","_rev":"10-0ea939adaebb18521fbfcd38d31a331f","name":"amazon-s3-url-signer","description":"Module to sign urls to allow access to resources in the S3","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"amazon-s3-url-signer","version":"0.0.1","description":"Module to sign urls to allow access to resources in the S3","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://github.com/dyashkir/amazon-S3-url-signer"},"keywords":["amazon","S3","url","signing"],"author":{"name":"Dmytro Yashkir"},"license":"BSD","readme":"Amazon S3 url signer\n\nModule to sign urls to allow access to resources in the S3\n","_id":"amazon-s3-url-signer@0.0.1","dist":{"shasum":"9caf24f25b8e763edc7eabf1d546181aed30b699","tarball":"http://registry.npmjs.org/amazon-s3-url-signer/-/amazon-s3-url-signer-0.0.1.tgz"},"maintainers":[{"name":"dyashkir","email":"dima.yashkir@gmail.com"}]},"0.0.2":{"name":"amazon-s3-url-signer","version":"0.0.2","description":"Module to sign urls to allow access to resources in the S3","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://github.com/dyashkir/amazon-s3-url-signer"},"keywords":["amazon","S3","url","signing"],"author":{"name":"Dmytro Yashkir"},"license":"BSD","readme":"##Amazon S3 url signer\n\nModule to sign urls to allow access to the private resources in the S3\n\n###To install\n\n    npm install amazon-s3-url-signer\n\n###Use example\n\n    var sig= require('amazon-s3-url-signer');\n\n    var bucket1 = sig.urlSigner('my key', 'my secret');\n    var bucket1 = sig.urlSigner('my key2', 'my secret2');\n    \n    var url1 = bucket1.getUrl('GET', 'somefile.png', 'mybucket', 10); //url expires in 10 minutes\n    var url2 = bucket2.getUrl('PUT', 'somefile.png', 'mybucketonotheraccount', 10); //url expires in 100 minutes\n\n","_id":"amazon-s3-url-signer@0.0.2","dist":{"shasum":"0fa0072480b064eddda08a0ff22e17d3d57fe6c6","tarball":"http://registry.npmjs.org/amazon-s3-url-signer/-/amazon-s3-url-signer-0.0.2.tgz"},"maintainers":[{"name":"dyashkir","email":"dima.yashkir@gmail.com"}]},"0.0.3":{"name":"amazon-s3-url-signer","version":"0.0.3","description":"Module to sign urls to allow access to resources in the S3","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git://github.com/dyashkir/amazon-s3-url-signer.git"},"keywords":["amazon","S3","url","signing"],"author":{"name":"Dmytro Yashkir"},"license":"BSD","_npmUser":{"name":"dyashkir","email":"dima.yashkir@gmail.com"},"_id":"amazon-s3-url-signer@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"152274be3e97149a4d7e653e39796d53f5638caf","tarball":"http://registry.npmjs.org/amazon-s3-url-signer/-/amazon-s3-url-signer-0.0.3.tgz"},"maintainers":[{"name":"dyashkir","email":"dima.yashkir@gmail.com"}]},"0.0.4":{"name":"amazon-s3-url-signer","version":"0.0.4","description":"Module to sign urls to allow access to resources in the S3","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git://github.com/dyashkir/amazon-s3-url-signer.git"},"keywords":["amazon","S3","url","signing"],"author":{"name":"Dmytro Yashkir"},"license":"BSD","_npmUser":{"name":"dyashkir","email":"dima.yashkir@gmail.com"},"_id":"amazon-s3-url-signer@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"bca62f3ed1a9601cf37399084b49c72d204dcbf3","tarball":"http://registry.npmjs.org/amazon-s3-url-signer/-/amazon-s3-url-signer-0.0.4.tgz"},"maintainers":[{"name":"dyashkir","email":"dima.yashkir@gmail.com"}]}},"readme":"Amazon S3 url signer\n\nModule to sign urls to allow access to resources in the S3\n","maintainers":[{"name":"dyashkir","email":"dima.yashkir@gmail.com"}],"time":{"modified":"2012-08-13T00:05:06.567Z","created":"2012-07-27T18:26:40.261Z","0.0.1":"2012-07-27T18:26:40.722Z","0.0.2":"2012-07-27T21:32:38.135Z","0.0.3":"2012-08-13T00:01:04.535Z","0.0.4":"2012-08-13T00:05:06.567Z"},"author":{"name":"Dmytro Yashkir"},"repository":{"type":"git","url":"git://github.com/dyashkir/amazon-s3-url-signer.git"},"users":{"fgribreau":true},"_attachments":{"amazon-s3-url-signer-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-LQGm4tm5L/EDNiXdexf6GA==","length":1174,"stub":true},"amazon-s3-url-signer-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-QTVsR9g/IzZIsMJjwOo3NA==","length":1170,"stub":true},"amazon-s3-url-signer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nF87ipCMQkU8mD58bGndCw==","length":1702,"stub":true},"amazon-s3-url-signer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3UW3kRpiVc7IsYxMyqnOSQ==","length":1558,"stub":true}}}},
{"id":"amazon-search","key":"amazon-search","value":{"rev":"5-d01299ba4a61efbf4032538487899c0e"},"doc":{"_id":"amazon-search","_rev":"5-d01299ba4a61efbf4032538487899c0e","name":"amazon-search","description":"Searches amazon.com. Returns prices, ratings etc.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"author":{"name":"Robbie Clarken","url":"http://github.com/RobbieClarken"},"name":"amazon-search","description":"Searches amazon.com. Returns prices, ratings etc","version":"0.0.1","repository":{"url":"git://github.com/RobbieClarken/amazon-search.git"},"main":"./main","dependencies":{"request":"~2.9.202","jQuery":"~1.7.2","jsdom":"~0.2.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"RobbieClarken","email":"rob.clarken@gmail.com"},"_id":"amazon-search@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"46ff9b5eef7c5af7275b1d0f4b104f1b58fc0e32","tarball":"http://registry.npmjs.org/amazon-search/-/amazon-search-0.0.1.tgz"},"maintainers":[{"name":"RobbieClarken","email":"rob.clarken@gmail.com"}]},"0.1.0":{"author":{"name":"Robbie Clarken","email":"rob.clarken@gmail.com"},"name":"amazon-search","description":"Searches amazon.com. Returns prices, ratings etc.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/RobbieClarken/amazon-search.git"},"main":"./main","scripts":{"test":"./node_modules/.bin/mocha -t 6000 test/*.js"},"dependencies":{"request":"2.x.x","jQuery":"1.7.x"},"devDependencies":{"mocha":"1.x.x","should":">= 0.6.3"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"RobbieClarken","email":"rob.clarken@gmail.com"},"_id":"amazon-search@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b4f58a4755bbd1e39085dd25a8214c43d301d722","tarball":"http://registry.npmjs.org/amazon-search/-/amazon-search-0.1.0.tgz"},"maintainers":[{"name":"RobbieClarken","email":"rob.clarken@gmail.com"}]}},"readme":"## Install\n\n<pre>\n  npm install amazon-search\n</pre>\n","maintainers":[{"name":"RobbieClarken","email":"rob.clarken@gmail.com"}],"time":{"modified":"2012-06-10T15:35:33.843Z","created":"2012-06-09T16:56:40.759Z","0.0.1":"2012-06-09T16:56:44.237Z","0.1.0":"2012-06-10T15:35:33.843Z"},"author":{"name":"Robbie Clarken","email":"rob.clarken@gmail.com"},"repository":{"type":"git","url":"git://github.com/RobbieClarken/amazon-search.git"},"_attachments":{"amazon-search-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4mfnit3mdaMwi+PzXJdDtw==","length":3355,"stub":true},"amazon-search-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EYEgXzJE5jSKCophJUqBtw==","length":2079,"stub":true}}}},
{"id":"amazon-ses","key":"amazon-ses","value":{"rev":"7-da8ad8732755c8102cd9a2d54bb114ab"},"doc":{"_id":"amazon-ses","_rev":"7-da8ad8732755c8102cd9a2d54bb114ab","name":"amazon-ses","description":"Simple Amazon SES Mailer","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"amazon-ses","description":"Simple Amazon SES Mailer","version":"0.0.1","author":{"name":"Jim Jenkins","email":"jim.jenkins@gmail.com"},"dependencies":{"request":"1.9.5","underscore":"1.1.5","xml2js":"0.1.5"},"keywords":["email","amazon","sms"],"repository":{"type":"git","url":"git://github.com/jjenkins/node-amazon-ses.git"},"main":"main","engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"amazon-ses@0.0.1","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"97490ad2626c40e6f9028c524b3d5c7ddbe25ab4","tarball":"http://registry.npmjs.org/amazon-ses/-/amazon-ses-0.0.1.tgz"}},"0.0.2":{"name":"amazon-ses","description":"Simple Amazon SES Mailer","version":"0.0.2","author":{"name":"Jim Jenkins","email":"jim.jenkins@gmail.com"},"licenses":["MIT"],"dependencies":{"request":"1.9.5","underscore":"1.1.5","xml2js":"0.1.5"},"keywords":["email","amazon","ses"],"repository":{"type":"git","url":"git://github.com/jjenkins/node-amazon-ses.git"},"main":"main","engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"amazon-ses@0.0.2","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d595dea1bce9d9efe4523e4a11fd4808648f3ee2","tarball":"http://registry.npmjs.org/amazon-ses/-/amazon-ses-0.0.2.tgz"}},"0.0.3":{"name":"amazon-ses","description":"Simple Amazon SES Mailer","version":"0.0.3","author":{"name":"Jim Jenkins","email":"jim.jenkins@gmail.com"},"dependencies":{"request":"2.1.1","underscore":"1.2.1","xml2js":"0.1.11"},"keywords":["email","amazon","ses"],"repository":{"type":"git","url":"git://github.com/jjenkins/node-amazon-ses.git"},"main":"main","engines":{"node":">= 0.4.1"},"_npmUser":{"name":"jjenkins","email":"jim.jenkins@gmail.com"},"_id":"amazon-ses@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"4c8483daa37235813a016c0aa8e22f49797ebc73","tarball":"http://registry.npmjs.org/amazon-ses/-/amazon-ses-0.0.3.tgz"},"maintainers":[{"name":"jjenkins","email":"jim.jenkins@gmail.com"}]}},"maintainers":[{"name":"jjenkins","email":"jim.jenkins@gmail.com"}],"time":{"modified":"2011-10-31T17:35:23.758Z","created":"2011-04-15T04:27:54.293Z","0.0.1":"2011-04-15T04:27:54.591Z","0.0.2":"2011-04-16T15:40:11.230Z","0.0.3":"2011-10-31T17:35:23.758Z"},"author":{"name":"Jim Jenkins","email":"jim.jenkins@gmail.com"},"repository":{"type":"git","url":"git://github.com/jjenkins/node-amazon-ses.git"},"_attachments":{"amazon-ses-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-lf8sjROFkYszFUFq/5SwRg==","length":3277,"stub":true},"amazon-ses-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pmBVmGhnHdVXOApfU2N0Wg==","length":3279,"stub":true},"amazon-ses-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AGCm5maCsRRnkl4dqyjCyg==","length":3135,"stub":true}}}},
{"id":"ambrosia","key":"ambrosia","value":{"rev":"3-8c648ec7393cf842838c20e2c5d9bce4"},"doc":{"_id":"ambrosia","_rev":"3-8c648ec7393cf842838c20e2c5d9bce4","name":"ambrosia","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"ambrosia","version":"0.0.0","author":{"name":"Lucas Wojciechowski","email":"lucas@lucaswoj.com","url":"http://lucaswoj.com"},"main":"src/server/index.coffee","directories":{"lib":"."},"scripts":{"test":"cake test"},"engines":{"node":"*"},"_id":"ambrosia@0.0.0","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.4.7","dist":{"shasum":"7009ec6da98f53c1f5daf9283b478e8621fa0f4d","tarball":"http://registry.npmjs.org/ambrosia/-/ambrosia-0.0.0.tgz"}}},"maintainers":[{"name":"lucaswoj","email":"lucas@lucaswoj.com"}],"time":{"modified":"2011-06-30T01:01:37.083Z","created":"2011-06-30T01:01:36.913Z","0.0.0":"2011-06-30T01:01:37.083Z"},"author":{"name":"Lucas Wojciechowski","email":"lucas@lucaswoj.com","url":"http://lucaswoj.com"},"_attachments":{"ambrosia-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SNF2c4lB30VKs60z36tWjg==","length":7402,"stub":true}}}},
{"id":"ambulance","key":"ambulance","value":{"rev":"7-f3d50592a65d589542499e960320e8a1"},"doc":{"_id":"ambulance","_rev":"7-f3d50592a65d589542499e960320e8a1","name":"ambulance","description":"MongoDB restore from S3 to remote database","dist-tags":{"latest":"0.1.12"},"versions":{"0.1.0":{"author":{"name":"Fouad Matin","email":"fm@fouadmat.in"},"name":"ambulance","description":"MongoDB Restore S3 -> Database","version":"0.1.0","bin":{"truck":"./bin/truck"},"scripts":{"test":"test"},"dependencies":{"commander":"0.5.2","cli-color":"0.1.7","knox":"0.0.9","findit":"0.1.2","aws2js":"0.6.19","underscore":"1.3.3","underscore.string":"2.2.0"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"fouad","email":"fm@fouadmat.in"},"_id":"ambulance@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f259f15e690d234a7f5f6e43f1b18e064bdfe461","tarball":"http://registry.npmjs.org/ambulance/-/ambulance-0.1.0.tgz"},"maintainers":[{"name":"fouad","email":"fm@fouadmat.in"}]},"0.1.11":{"author":{"name":"Fouad Matin","email":"fm@fouadmat.in"},"name":"ambulance","description":"MongoDB restore from S3 to remote database","version":"0.1.11","bin":{"ambulance":"./bin/ambulance"},"dependencies":{"commander":"0.5.2","cli-color":"0.1.7","findit":"0.1.2","awssum":"0.6.1","underscore":"1.3.3","underscore.string":"2.1.1","aws2js":"0.6.19"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"fouad","email":"fm@fouadmat.in"},"_id":"ambulance@0.1.11","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4dd4febf09240db6db34f63bc413120a5edfe790","tarball":"http://registry.npmjs.org/ambulance/-/ambulance-0.1.11.tgz"},"maintainers":[{"name":"fouad","email":"fm@fouadmat.in"}]},"0.1.12":{"author":{"name":"Fouad Matin","email":"fm@fouadmat.in"},"name":"ambulance","description":"MongoDB restore from S3 to remote database","version":"0.1.12","bin":{"ambulance":"./bin/ambulance"},"dependencies":{"commander":"0.5.2","cli-color":"0.1.7","findit":"0.1.2","awssum":"0.6.1","underscore":"1.3.3","underscore.string":"2.1.1","aws2js":"0.6.19"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"fouad","email":"fm@fouadmat.in"},"_id":"ambulance@0.1.12","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"dc4750ff12b4023d69195875fcf80741542b3356","tarball":"http://registry.npmjs.org/ambulance/-/ambulance-0.1.12.tgz"},"maintainers":[{"name":"fouad","email":"fm@fouadmat.in"}]}},"readme":"#Ambulance\n\nAmbulance is a MongoDB restore from S3 to remote database written using node.js and leveraging `mongorestore`\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Fouad Matin &lt;fm@fouadmat.in&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"fouad","email":"fm@fouadmat.in"}],"time":{"modified":"2012-06-28T23:15:50.748Z","created":"2012-06-28T21:51:48.016Z","0.1.0":"2012-06-28T21:51:57.995Z","0.1.11":"2012-06-28T22:56:40.682Z","0.1.12":"2012-06-28T23:15:50.748Z"},"author":{"name":"Fouad Matin","email":"fm@fouadmat.in"},"_attachments":{"ambulance-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-W03/QbOfyLsjz7dWbWpp1Q==","length":4871,"stub":true},"ambulance-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-PmLMV1a7LpoWFPeKsk8j0A==","length":4874,"stub":true},"ambulance-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jLi0J+xjnr1G3QGQ8evWXA==","length":4894,"stub":true}}}},
{"id":"amd","key":"amd","value":{"rev":"3-d78c4df97a577af598a7def2a38379fa"},"doc":{"_id":"amd","_rev":"3-d78c4df97a577af598a7def2a38379fa","name":"amd","description":"Async Module Definition - module loader/bunder for node + browser","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"amd","description":"Async Module Definition - module loader/bunder for node + browser","version":"0.0.0","repository":{"type":"git","url":"git://github.com/dominictarr/amd.git"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"bit.ly/dominictarr"},"main":"amd.js","directories":{"lib":"."},"bin":{"amd":"go.js"},"scripts":{"test":"meta-test test/*.js"},"engines":{"node":"*"},"files":[""],"homepage":"https://github.com/dominictarr/amd","dependencies":{},"devDependencies":{},"_id":"amd@0.0.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"98983413d1f15ebbfb2ea72786b8d4fc60b5f611","tarball":"http://registry.npmjs.org/amd/-/amd-0.0.0.tgz"}}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2011-05-29T21:53:15.676Z","created":"2011-05-29T21:53:14.813Z","0.0.0":"2011-05-29T21:53:15.676Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"bit.ly/dominictarr"},"repository":{"type":"git","url":"git://github.com/dominictarr/amd.git"},"_attachments":{"amd-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FgGzXGikL136NvnLEHHuEQ==","length":3125,"stub":true}}}},
{"id":"amd-loader","key":"amd-loader","value":{"rev":"13-9de3b37f412769390fa507f7816052ea"},"doc":{"_id":"amd-loader","_rev":"13-9de3b37f412769390fa507f7816052ea","name":"amd-loader","description":"Add the capability to load AMD (Asynchronous Module Definition) modules to node.js","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"amd-loader","version":"0.0.1","description":"Add the capability to load AMD (Asynchronous Module Definition) modules to node.js","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@ajax.org"}],"repository":{"type":"git","url":"git://github.com/ajaxorg/node-amd-loader.git"},"main":"./lib/amd-loader","scripts":{"test":"node test/test.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"amd-loader@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"957b794c132e83e1b9754588f01654cf5e7cffe1","tarball":"http://registry.npmjs.org/amd-loader/-/amd-loader-0.0.1.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"directories":{}},"0.0.2":{"name":"amd-loader","version":"0.0.2","description":"Add the capability to load AMD (Asynchronous Module Definition) modules to node.js","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@ajax.org"}],"repository":{"type":"git","url":"git://github.com/ajaxorg/node-amd-loader.git"},"main":"./lib/amd-loader","scripts":{"test":"node test/test.js"},"engines":{"node":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://github.com/ajaxorg/node-amd-loader/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"amd-loader@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c880669cc37a3df71fc796dfdd69cf6621617439","tarball":"http://registry.npmjs.org/amd-loader/-/amd-loader-0.0.2.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"directories":{}},"0.0.3":{"name":"amd-loader","version":"0.0.3","description":"Add the capability to load AMD (Asynchronous Module Definition) modules to node.js","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@ajax.org"}],"repository":{"type":"git","url":"git://github.com/ajaxorg/node-amd-loader.git"},"main":"./lib/amd-loader","scripts":{"test":"node test/test.js"},"engines":{"node":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://github.com/ajaxorg/node-amd-loader/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"amd-loader@0.0.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bebad8d970a84de15903f4068ad9de52eacd6872","tarball":"http://registry.npmjs.org/amd-loader/-/amd-loader-0.0.3.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"directories":{}},"0.0.4":{"name":"amd-loader","version":"0.0.4","description":"Add the capability to load AMD (Asynchronous Module Definition) modules to node.js","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@ajax.org"}],"repository":{"type":"git","url":"git://github.com/ajaxorg/node-amd-loader.git"},"main":"./lib/amd-loader","scripts":{"test":"node test/test.js"},"engines":{"node":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://github.com/ajaxorg/node-amd-loader/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"amd-loader@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"816fc7095a79d85ef69f7ae2ec7696fdc7329527","tarball":"http://registry.npmjs.org/amd-loader/-/amd-loader-0.0.4.tgz"},"readme":"AMD loader for node.js\n======================\n\nnode-amd-loader adds the capability to load unmodified AMD (Asynchronous Module DefinitionAsynchronous Module Definition) from node.js applications.\n\nInstallation\n------------\n\n`node-amd-loader` can be easily installed using [npm](http://npmjs.org).\n\n    npm install amd-loader\n    \nBefore being able to load AMD modules the `amd-loader` module has to be required.\n\n    require(\"amd-loader\");\n    \nThis needs to be done only once.\n\nFeatures\n--------\n\n### load modules which use AMD define() ###\n\nLoad modules which are written using  AMD [define](http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition#define.28.29_function) from node.js node.\n\namd.js\n\n```javascript\n    define(function(require, exports, module) {\n        exports.B = \"B\";\n    });\n```\n\nmain.js\n\n```\n    require(\"amd-loader\");\n    var amd = require(\"./amd\");\n```\n\n### support requireJS asyncronous loading syntax ###\n\nFrom within an AMD modules the async require syntax introduced by [requireJS](http://requirejs.org) can be used.\n\n```javascript\n    require([\"fs\"], function(fs) {\n        fs.readFile(...);\n    })\n```\n\n### support requireJS text plugin ###\n\nFrom within an AMD module the requireJS text plugin is supported.\n\n```javascript\n    var readme = require(\"text!./readme.md\");\n```\n\nContinuous Integration status\n-----------------------------\n\nThis project is tested with [Travis CI](http://travis-ci.org)\n[![Build Status](https://secure.travis-ci.org/ajaxorg/node-amd-loader.png)](http://travis-ci.org/ajaxorg/node-amd-loader)\n\nCredits\n-------\n\n[Kris Zip](https://github.com/kriszyp) came up the the initial [idea](https://gist.github.com/650000) how to hijack the node module loading.\n\nLicense\n-------\n\nMIT license. See the LICENSE file for details.","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]}},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"time":{"modified":"2012-03-05T18:16:41.452Z","created":"2011-11-01T17:07:27.348Z","0.0.1":"2011-11-01T17:07:29.991Z","0.0.2":"2011-11-02T10:03:23.897Z","0.0.3":"2011-11-10T09:26:44.614Z","0.0.4":"2012-03-05T18:16:41.452Z"},"author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"repository":{"type":"git","url":"git://github.com/ajaxorg/node-amd-loader.git"},"_attachments":{"amd-loader-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-XYBd6ARLIIv3KCYnScH2PA==","length":3332,"stub":true},"amd-loader-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZyFW6V1dd7GNHYF1HGLVOg==","length":10240,"stub":true},"amd-loader-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8Sonj7b4d8bcfReBtpMWfQ==","length":10240,"stub":true},"amd-loader-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PLakyha1SlF3/dZDZ5nY8Q==","length":10240,"stub":true}}}},
{"id":"amd-utils","key":"amd-utils","value":{"rev":"9-367fa7211ded18aabe9f7bf25a137e79"},"doc":{"_id":"amd-utils","_rev":"9-367fa7211ded18aabe9f7bf25a137e79","name":"amd-utils","description":"Utility methods written in the AMD format","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"amd-utils","description":"Utility methods written in the AMD format","homepage":"http://millermedeiros.github.com/amd-utils/","keywords":["utilities","functional"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/millermedeiros/amd-utils.git"},"devDependencies":{"mdoc":">= 0.3.1","handlebars":">= 1.0.1"},"_npmUser":{"name":"millermedeiros","email":"miller@millermedeiros.com"},"_id":"amd-utils@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"f642dc9de23d2e732ea75c67853dc01bf8d49eec","tarball":"http://registry.npmjs.org/amd-utils/-/amd-utils-0.0.1.tgz"},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}],"directories":{}},"0.1.0":{"name":"amd-utils","description":"Utility methods written in the AMD format","version":"0.1.0","homepage":"http://millermedeiros.github.com/amd-utils/","author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com"},"keywords":["utilities","functional"],"repository":{"type":"git","url":"git://github.com/millermedeiros/amd-utils.git"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"bugs":{"url":"https://github.com/millermedeiros/amd-utils/issues/"},"main":"./pkg/index.js","dependencies":{"amdefine":">= 0.0.2"},"scripts":{"install":"node ./_build/convert.js"},"directories":{"doc":"./doc/mdown","lib":"./pkg"},"devDependencies":{"wrench":"~1.3.9","mdoc":"~0.3.2","handlebars":"~1.0.6"},"readme":"","_id":"amd-utils@0.1.0","dist":{"shasum":"ea2eb0ef925377be0cbb9f5d5c7e4828d76b258f","tarball":"http://registry.npmjs.org/amd-utils/-/amd-utils-0.1.0.tgz"},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}]}},"readme":null,"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}],"time":{"modified":"2012-08-08T03:44:34.899Z","created":"2012-04-16T19:55:21.076Z","0.0.1":"2012-04-16T19:55:22.966Z","0.1.0":"2012-08-08T03:44:34.899Z"},"repository":{"type":"git","url":"git://github.com/millermedeiros/amd-utils.git"},"author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com"},"_attachments":{"amd-utils-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/QldJdKoMpQ3FbLYmIBsIA==","length":278898,"stub":true},"amd-utils-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tUQ828t3OJB5Dnyb+nrjEg==","length":268639,"stub":true}}}},
{"id":"amdefine","key":"amdefine","value":{"rev":"5-b7f7e12a1642f5af4f08ce6a394f1f7b"},"doc":{"_id":"amdefine","_rev":"5-b7f7e12a1642f5af4f08ce6a394f1f7b","name":"amdefine","description":"Provide AMD's define() API for declaring modules in the AMD format","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"amdefine","description":"Provide AMD's define() API for declaring modules in the AMD format","version":"0.0.1","homepage":"http://github.com/jrburke/amdefine.js","author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"licenses":[{"type":"BSD","url":"https://github.com/jrburke/amdefine/blob/master/LICENSE"},{"type":"MIT","url":"https://github.com/jrburke/amdefine/blob/master/LICENSE"}],"main":"./amdefine.js","engines":{"node":">=0.6.0"},"_npmUser":{"name":"jrburke","email":"jrburke@gmail.com"},"_id":"amdefine@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"20add952bf0f8941ae2765386c92310679d4a954","tarball":"http://registry.npmjs.org/amdefine/-/amdefine-0.0.1.tgz"},"maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}]},"0.0.2":{"name":"amdefine","description":"Provide AMD's define() API for declaring modules in the AMD format","version":"0.0.2","homepage":"http://github.com/jrburke/amdefine.js","author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"licenses":[{"type":"BSD","url":"https://github.com/jrburke/amdefine/blob/master/LICENSE"},{"type":"MIT","url":"https://github.com/jrburke/amdefine/blob/master/LICENSE"}],"main":"./amdefine.js","engines":{"node":">=0.4.2"},"_npmUser":{"name":"jrburke","email":"jrburke@gmail.com"},"_id":"amdefine@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e857fddd8f9f35706d79ea749769260eec8aaf64","tarball":"http://registry.npmjs.org/amdefine/-/amdefine-0.0.2.tgz"},"readme":"","maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}]}},"readme":null,"maintainers":[{"name":"jrburke","email":"jrburke@gmail.com"}],"time":{"modified":"2012-02-28T22:11:53.033Z","created":"2011-12-10T01:16:02.521Z","0.0.1":"2011-12-10T01:16:03.912Z","0.0.2":"2012-02-28T22:11:53.033Z"},"author":{"name":"James Burke","email":"jrburke@gmail.com","url":"http://github.com/jrburke"},"_attachments":{"amdefine-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wxZMDBP5pnETQrUkHYYf3g==","length":3775,"stub":true},"amdefine-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KTV81BBZYjPBoPBKYthpLw==","length":10240,"stub":true}}}},
{"id":"amdtools","key":"amdtools","value":{"rev":"5-06a97a99e230c80a75425039120644dd"},"doc":{"_id":"amdtools","_rev":"5-06a97a99e230c80a75425039120644dd","name":"amdtools","description":"Tools for Asynchronous Module Dispatch","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"amdtools","description":"Tools for Asynchronous Module Dispatch","version":"0.1.0","author":{"name":"Thomas Yandell","email":"tom.deletethis@yandell.me.uk","url":"http://tom.yandell.me.uk/blog/"},"maintainers":[{"name":"richardhodgson","email":"contact@rhodgson.co.uk"}],"bin":{"commonjs-to-amd":"./bin/commonjs-to-amd"},"main":"./lib/amdtools","engines":{"node":">= 0.4.7"},"dependencies":{"promised-io":">= 0.2.3"},"repository":{"type":"git","url":"git://github.com/usenode/amdtools.js.git"},"homepage":"http://github.com/usenode/amdtools.js","_npmJsonOpts":{"file":"/Users/richardhodgson/.npm/amdtools/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amdtools@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c86df173f7b9ad8c26a4f124243d486f6911f7f4","tarball":"http://registry.npmjs.org/amdtools/-/amdtools-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"amdtools","description":"Tools for Asynchronous Module Dispatch","version":"0.1.1","author":{"name":"Thomas Yandell","email":"tom.deletethis@yandell.me.uk","url":"http://tom.yandell.me.uk/blog/"},"maintainers":[{"name":"richardhodgson","email":"contact@rhodgson.co.uk"}],"bin":{"commonjs-to-amd":"./bin/commonjs-to-amd"},"main":"./lib/amdtools","engines":{"node":">= 0.4.7"},"dependencies":{"promised-io":">= 0.2.3"},"repository":{"type":"git","url":"git://github.com/usenode/amdtools.js.git"},"homepage":"http://github.com/usenode/amdtools.js","_npmJsonOpts":{"file":"/Users/richardhodgson/.npm/amdtools/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amdtools@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"fce54436b31a946a7b87a47c97a64588dde066e9","tarball":"http://registry.npmjs.org/amdtools/-/amdtools-0.1.1.tgz"},"scripts":{}}},"maintainers":[{"name":"richardhodgson","email":"contact@rhodgson.co.uk"}],"time":{"modified":"2011-10-23T21:05:01.549Z","created":"2011-10-23T21:00:00.843Z","0.1.0":"2011-10-23T21:00:01.654Z","0.1.1":"2011-10-23T21:05:01.549Z"},"author":{"name":"Thomas Yandell","email":"tom.deletethis@yandell.me.uk","url":"http://tom.yandell.me.uk/blog/"},"repository":{"type":"git","url":"git://github.com/usenode/amdtools.js.git"},"_attachments":{"amdtools-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SAF6xYyXGP7sj34J217Ipg==","length":5598,"stub":true},"amdtools-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-y1h9RAIahUTIlBvD3GoUjw==","length":5427,"stub":true}}}},
{"id":"ametrine-view","key":"ametrine-view","value":{"rev":"7-01caa513fe54844694240318567279d8"},"doc":{"_id":"ametrine-view","_rev":"7-01caa513fe54844694240318567279d8","name":"ametrine-view","description":"Ametrine component for handling and compiling views","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"ametrine-view","description":"Ametrine component for handling and compiling views","version":"0.0.1","keywords":["views","view","ejs","coffeekup","coffee","jade"],"author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"dependencies":{"ejs":"*","coffeekup":"*","eco":"*","hamljs":"*","jade":"*","mu":"*"},"main":"","engines":{"node":"0.4.x"},"_npmUser":{"name":"vdemedes","email":"sbioko@gmail.com"},"_id":"ametrine-view@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9f30d1853386e7ebf9295dd622e2710761656921","tarball":"http://registry.npmjs.org/ametrine-view/-/ametrine-view-0.0.1.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}],"directories":{}}},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}],"time":{"modified":"2012-03-21T18:41:42.510Z","created":"2011-10-29T09:22:51.267Z","0.0.1":"2011-10-29T09:22:52.789Z","0.0.2":"2011-10-29T09:26:42.589Z"},"author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"_attachments":{"ametrine-view-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pce/KecWRoN+L/a3vnFizg==","length":10240,"stub":true}}}},
{"id":"ami","key":"ami","value":{"rev":"7-01977b2b0f8a3b9bf9cee6539b2e685e"},"doc":{"_id":"ami","_rev":"7-01977b2b0f8a3b9bf9cee6539b2e685e","name":"ami","description":"asterisk ami client","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Brian M. Carlson","email":"brian@enginode.com","url":"enginode.com"},"name":"ami","description":"asterisk ami client","version":"0.0.0","repository":{"type":"git","url":"git://github.com/brianc/node-ami.git"},"main":"lib/","scripts":{"test":"mocha -r should"},"engines":{"node":"~0.6.3"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"brianc","email":"brian.m.carlson@gmail.com"},"_id":"ami@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"2f273bda70ae513109bb71bd38f7194aacf19009","tarball":"http://registry.npmjs.org/ami/-/ami-0.0.0.tgz"},"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}]},"0.0.1":{"author":{"name":"Brian M. Carlson","email":"brian@enginode.com","url":"enginode.com"},"name":"ami","description":"asterisk ami client","version":"0.0.1","repository":{"type":"git","url":"git://github.com/brianc/node-ami.git"},"main":"lib/","scripts":{"test":"mocha -r should"},"engines":{"node":"~0.6.3"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"brianc","email":"brian.m.carlson@gmail.com"},"_id":"ami@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"7c3430ded9dbc96af884465f0b9c444fd515788d","tarball":"http://registry.npmjs.org/ami/-/ami-0.0.1.tgz"},"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}]},"0.0.2":{"author":{"name":"Brian M. Carlson","email":"brian@enginode.com","url":"enginode.com"},"name":"ami","description":"asterisk ami client","version":"0.0.2","repository":{"type":"git","url":"git://github.com/brianc/node-ami.git"},"main":"lib/","scripts":{"test":"mocha -r should -R tap -t 100"},"engines":{"node":"~0.6.0"},"dependencies":{},"devDependencies":{"memory-socket":"*"},"_npmUser":{"name":"brianc","email":"brian.m.carlson@gmail.com"},"_id":"ami@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"e891bfc60fc79b490f13683877726966cf7112c4","tarball":"http://registry.npmjs.org/ami/-/ami-0.0.2.tgz"},"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}]}},"readme":null,"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}],"time":{"modified":"2012-01-07T06:47:19.660Z","created":"2011-12-31T07:05:29.178Z","0.0.0":"2011-12-31T07:05:30.189Z","0.0.1":"2011-12-31T07:08:12.643Z","0.0.2":"2012-01-07T06:47:19.660Z"},"author":{"name":"Brian M. Carlson","email":"brian@enginode.com","url":"enginode.com"},"repository":{"type":"git","url":"git://github.com/brianc/node-ami.git"},"_attachments":{"ami-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-KNdgIVOx7NXapAxMKO48kw==","length":10240,"stub":true},"ami-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sRW6trY9gkM8tX/PXxD3Gg==","length":10240,"stub":true},"ami-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HPmIhu2PSY0ngqhKIRWoPg==","length":10240,"stub":true}}}},
{"id":"amico","key":"amico","value":{"rev":"7-fae4845385ddf6ae6fca1fa913c0afcf"},"doc":{"_id":"amico","_rev":"7-fae4845385ddf6ae6fca1fa913c0afcf","name":"amico","description":"Relationships (e.g. friendships) backed by Redis","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.2":{"author":{"name":"Andrew Nordman","email":"anordman@majorleaguegaming.com"},"name":"amico","description":"Relationships (e.g. friendships) backed by Redis","version":"0.0.2","homepage":"http://github.com/agoragames/node-amico","repository":{"type":"git","url":"git://github.com/agoragames/node-amico.git"},"scripts":{"test":"make test"},"engines":{"node":"~0.6.6"},"dependencies":{"redis":"~0.7.0","hashish":"0.0.4","coffee-script":">= 1.2.0"},"devDependencies":{"mocha":"0.12.1","should":"0.5.1","redis-protocol":"0.1.9"},"_npmUser":{"name":"cadwallion","email":"cadwallion@gmail.com"},"_id":"amico@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"4b6bfed9d1ad3f1a05098720d6a0b66cbae711c8","tarball":"http://registry.npmjs.org/amico/-/amico-0.0.2.tgz"},"readme":"","maintainers":[{"name":"cadwallion","email":"cadwallion@gmail.com"}]},"0.0.3":{"author":{"name":"Andrew Nordman","email":"anordman@majorleaguegaming.com"},"name":"amico","description":"Relationships (e.g. friendships) backed by Redis","version":"0.0.3","homepage":"http://github.com/agoragames/node-amico","repository":{"type":"git","url":"git://github.com/agoragames/node-amico.git"},"main":"./lib/index","scripts":{"test":"make test"},"engines":{"node":"~0.6.6"},"dependencies":{"redis":"~0.7.0","hashish":"0.0.4","coffee-script":">= 1.2.0"},"devDependencies":{"mocha":"0.12.1","should":"0.5.1","redis-protocol":"0.1.9"},"_npmUser":{"name":"cadwallion","email":"cadwallion@gmail.com"},"_id":"amico@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"90aff205f2ff8100c58d1e2abaa712d60b95601b","tarball":"http://registry.npmjs.org/amico/-/amico-0.0.3.tgz"},"readme":"","maintainers":[{"name":"cadwallion","email":"cadwallion@gmail.com"}]},"0.1.0":{"author":{"name":"Andrew Nordman","email":"anordman@majorleaguegaming.com"},"name":"amico","description":"Relationships (e.g. friendships) backed by Redis","version":"0.1.0","homepage":"http://github.com/agoragames/node-amico","repository":{"type":"git","url":"git://github.com/agoragames/node-amico.git"},"main":"./lib/index","scripts":{"test":"make test"},"engines":{"node":"~0.6.6"},"dependencies":{"redis":"~0.7.0","hashish":"0.0.4","coffee-script":">= 1.2.0"},"devDependencies":{"mocha":"0.12.1","should":"0.5.1","redis-protocol":"0.1.9"},"_npmUser":{"name":"cadwallion","email":"cadwallion@gmail.com"},"_id":"amico@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"cde7820c372f5ca27a75ea25def886801c70da9c","tarball":"http://registry.npmjs.org/amico/-/amico-0.1.0.tgz"},"readme":"","maintainers":[{"name":"cadwallion","email":"cadwallion@gmail.com"}]}},"readme":"","maintainers":[{"name":"cadwallion","email":"cadwallion@gmail.com"}],"time":{"modified":"2012-03-08T19:51:14.650Z","created":"2012-02-16T15:01:47.821Z","0.0.2":"2012-02-16T15:01:57.642Z","0.0.3":"2012-03-06T19:41:29.010Z","0.1.0":"2012-03-08T19:51:14.650Z"},"author":{"name":"Andrew Nordman","email":"anordman@majorleaguegaming.com"},"repository":{"type":"git","url":"git://github.com/agoragames/node-amico.git"},"_attachments":{"amico-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YNPFcN7M95J+aCal0nTctw==","length":3933,"stub":true},"amico-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OijTqAEEq30ZdIhEkTqImA==","length":3654,"stub":true},"amico-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qujZdA5dC/OoUHUgSVlp0A==","length":3556,"stub":true}}}},
{"id":"amigen","key":"amigen","value":{"rev":"29-2d81a4b41927db28b5f4d3c5b91ba5a1"},"doc":{"_id":"amigen","_rev":"29-2d81a4b41927db28b5f4d3c5b91ba5a1","name":"amigen","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"amigen","version":"0.0.1","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"www.perfectapi.com","bugs":{"email":"steve@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ed384ded7af610502d1126fbfba788888930dbfd","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.1.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.2":{"name":"amigen","version":"0.0.2","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"www.perfectapi.com","bugs":{"email":"steve@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2670e3b55a28293ba13787c09c8b3b28b54e1d2a","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.2.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.3":{"name":"amigen","version":"0.0.3","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"steve@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.3","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dfa0744efb78a24c7bc040b27630fa08ac4c9727","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.3.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.4":{"name":"amigen","version":"0.0.4","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.4","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c614a470eb5731fc30aadb25203ebcdb834b3260","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.4.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.5":{"name":"amigen","version":"0.0.5","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.5","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"1e06ba623c5642e03a5e6ef67127ae87ce18ed46","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.5.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.6":{"name":"amigen","version":"0.0.6","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.6","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b6f15248b1374ca450b0e571f74929bd5d24b513","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.6.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.7":{"name":"amigen","version":"0.0.7","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.7","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"36531dde30422aa79615f6e212ca6ecf6ec22c5b","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.7.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.8":{"name":"amigen","version":"0.0.8","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.8","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"f515c4782d35456c7587a3d484507148e7f7408d","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.8.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.9":{"name":"amigen","version":"0.0.9","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.9","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8aed0bac017d61eeaf0e7bba7f6400e5e8917d9a","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.9.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.10":{"name":"amigen","version":"0.0.10","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.10","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"06515ca69123e6dce23b3643bf702e93ecee2466","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.10.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.11":{"name":"amigen","version":"0.0.11","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.11","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5a4d68da4d4ba0416e24e130d388f38d218474c3","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.11.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.12":{"name":"amigen","version":"0.0.12","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.4.12"},"dependencies":{"ec2":">=0.0.8","commander":">=0.5.0"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.12","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b5691dd588d6bbf1bcbefdb28220c3abf0dca71d","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.12.tgz"},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"0.0.13":{"name":"amigen","version":"0.0.13","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.6.5"},"dependencies":{"ec2":">=0.0.8","perfectapi":">=0.0.2"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@0.0.13","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a0ffdd54594bfcd105db38ba899694ea8e167575","tarball":"http://registry.npmjs.org/amigen/-/amigen-0.0.13.tgz"},"scripts":{},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]},"1.0.0":{"name":"amigen","version":"1.0.0","description":"Tool for generating Amazon EC2 AMI images with pre-installed software","author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"keywords":["AMI,AWS,EC2,Amazon"],"homepage":"http://www.perfectapi.com/","bugs":{"email":"amigen@perfectapi.com","url":"https://github.com/perfectapi/ami-generator/issues"},"main":"modules/generator/generator.js","bin":{"amigen":"./bin/amigen.js"},"engines":{"node":">=0.6.5"},"dependencies":{"ec2":">=0.0.8","perfectapi":">=0.0.4"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_npmUser":{"name":"perfectapi","email":"steve@perfectapi.com"},"_id":"amigen@1.0.0","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"3b5d2133cc3017f4a3fbb8a93808b435f7434563","tarball":"http://registry.npmjs.org/amigen/-/amigen-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}]}},"readme":null,"maintainers":[{"name":"perfectapi","email":"steve@perfectapi.com"}],"time":{"modified":"2012-01-04T01:57:32.656Z","created":"2011-12-10T17:58:47.119Z","0.0.1":"2011-12-10T17:58:47.326Z","0.0.2":"2011-12-10T18:11:03.227Z","0.0.3":"2011-12-11T01:21:57.748Z","0.0.4":"2011-12-12T23:27:40.346Z","0.0.5":"2011-12-19T20:16:42.081Z","0.0.6":"2011-12-20T01:24:59.727Z","0.0.7":"2011-12-20T01:35:17.140Z","0.0.8":"2011-12-20T01:39:43.842Z","0.0.9":"2011-12-20T05:13:24.195Z","0.0.10":"2011-12-20T15:10:03.132Z","0.0.11":"2011-12-21T01:02:03.072Z","0.0.12":"2011-12-21T01:03:52.576Z","0.0.13":"2011-12-28T21:26:11.793Z","1.0.0":"2012-01-04T01:57:32.656Z"},"author":{"name":"Steve Campbell","email":"steve@perfectapi.com"},"repository":{"type":"git","url":"git://github.com/perfectapi/ami-generator.git"},"_attachments":{"amigen-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-nGj8QCu6bV6HjcHiliZ+Ww==","length":14410,"stub":true},"amigen-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ucuAIW3Ytf/4YQtW7JZgkw==","length":11776,"stub":true},"amigen-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-pecOFdC9Q1E4vMe4NGH+Rg==","length":10199,"stub":true},"amigen-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-s5ELA1DjYWGDH+rCowg6ow==","length":9622,"stub":true},"amigen-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-dyxL9ZU+nlugOqwGsOvA+g==","length":10213,"stub":true},"amigen-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-mnoT07+TqOP6ij7Pplqp9w==","length":10223,"stub":true},"amigen-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-XHNDLkVEiqNkdIvEIFZ9Yw==","length":10065,"stub":true},"amigen-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Lsv8n5EXDQUNJSkmtIiRhg==","length":10065,"stub":true},"amigen-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wLgnNL13dtHxi56RjdIPfg==","length":9945,"stub":true},"amigen-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-iFag6CAwMcPO+fuCg5nmVQ==","length":10695,"stub":true},"amigen-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-bPRM2W2NlMmmFeH9hgeT+g==","length":7741,"stub":true},"amigen-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-idM9BmQp/YqMUYcCYfgy/A==","length":7692,"stub":true},"amigen-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pAvhG/RXPkdBMQQAsT6dcg==","length":466599,"stub":true},"amigen-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pOUZNlqdfg+9Jlb2qe1U6w==","length":466118,"stub":true}}}},
{"id":"amino","key":"amino","value":{"rev":"44-41bc1322412baab842465a54b5c6a37a"},"doc":{"_id":"amino","_rev":"44-41bc1322412baab842465a54b5c6a37a","name":"amino","description":"Clustered application creation toolkit","dist-tags":{"latest":"0.13.5"},"versions":{"0.1.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.1.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0"},"devDependencies":{"mocha":"~1.0.3","amino-pubsub-redis":"~0.1.0","amino-queue-amqp":"~0.1.0","amino-request-http":"~0.1.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"8644c47831333ed2a038ca55a77d25d019332801","tarball":"http://registry.npmjs.org/amino/-/amino-0.1.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.1.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.1.1","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0"},"devDependencies":{"mocha":"*","amino-pubsub-redis":"~0.1.0","amino-queue-amqp":"~0.1.0","amino-request-http":"~0.1.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"ce2693aa7e58a9299ea91075a6ed392b934958a0","tarball":"http://registry.npmjs.org/amino/-/amino-0.1.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.2.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.2.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0","nconf":"~0.5.1","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.2.0"},"devDependencies":{"mocha":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.2.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.2.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"020ee15f140d66fcb4d6c0900aee9c5436a01d90","tarball":"http://registry.npmjs.org/amino/-/amino-0.2.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.3.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0","nconf":"~0.5.1","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.2.0"},"devDependencies":{"mocha":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.2.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.3.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"8abe30a40f3cb48d1e85e4de604b9562cb931315","tarball":"http://registry.npmjs.org/amino/-/amino-0.3.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.4.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.4.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0","nconf":"~0.5.1","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.3.0"},"devDependencies":{"mocha":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.3.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.4.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"2bdb67fdaf83a90cc222116ed72b02a5a46d5ac7","tarball":"http://registry.npmjs.org/amino/-/amino-0.4.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.5.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.5.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0","nconf":"~0.5.1","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.3.0"},"devDependencies":{"mocha":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.3.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.5.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"8bd7f7e3da95ac77d8a4884bd47af476f030a979","tarball":"http://registry.npmjs.org/amino/-/amino-0.5.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.5.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.5.1","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"async":"~0.1.18","inherits":"~1.0.0","nconf":"~0.5.1","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.4.0"},"devDependencies":{"mocha":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"~0.4.0"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.5.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"e96e40d825334cc54e362038e2da168e8b4d3997","tarball":"http://registry.npmjs.org/amino/-/amino-0.5.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.6.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.6.1","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.6.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"0d64b1a240f507c1bd856c0fad12ed6e5428c125","tarball":"http://registry.npmjs.org/amino/-/amino-0.6.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.7.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.7.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.7.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"f4464680aac27670d8687504ec058ed67ac361f8","tarball":"http://registry.npmjs.org/amino/-/amino-0.7.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.8.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.8.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.8.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"2ddf343bc81e2cbec2fce1010f001373e3c36eea","tarball":"http://registry.npmjs.org/amino/-/amino-0.8.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.9.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.9.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.9.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"0a614d3e528959848624dee37550e40ca222a4d0","tarball":"http://registry.npmjs.org/amino/-/amino-0.9.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.10.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.10.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.2.0","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.10.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"6d62a1d151a85994869d7a0d424a9187dbae5e2d","tarball":"http://registry.npmjs.org/amino/-/amino-0.10.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.11.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.11.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.11.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4332456d08722e4ec7c0267eb00c7a6f9e523cb4","tarball":"http://registry.npmjs.org/amino/-/amino-0.11.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.11.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.11.1","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.11.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4d165a35d016f63970128da7bd6bf38c27582ec0","tarball":"http://registry.npmjs.org/amino/-/amino-0.11.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.12.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.12.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.12.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"cad2810c1e30d8b515ce72b37398e492a1017fa0","tarball":"http://registry.npmjs.org/amino/-/amino-0.12.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.12.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.12.1","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.12.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"aa49f1344b935a426caef4e3819e15fbf2621628","tarball":"http://registry.npmjs.org/amino/-/amino-0.12.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.13.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.13.0","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","hash_ring":"~0.2.1","idgen":"~1.0.2","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.13.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"22076ca2e4566718e68c75308079a890f4144fa0","tarball":"http://registry.npmjs.org/amino/-/amino-0.13.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.13.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.13.1","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.5.1","semver":"~1.0.13","hash_ring":"~0.2.1","idgen":"~1.0.2","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.13.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"693941d3dcc7e7c0b164c0c64eaa6b49ccd00d91","tarball":"http://registry.npmjs.org/amino/-/amino-0.13.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.13.3":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.13.3","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.6.4","semver":"~1.0.13","hash_ring":"~0.2.1","idgen":"~1.0.2","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.13.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"c6feb9a1b9e529c1a6e2454c31f96336a422aefb","tarball":"http://registry.npmjs.org/amino/-/amino-0.13.3.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.13.4":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.13.4","repository":{"type":"git","url":"git://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.6.4","semver":"~1.0.13","hash_ring":"~0.2.1","idgen":"~1.0.2","amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.1","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino@0.13.4","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"20deb2e4f5205c15d3f640e096c9bebba06435c9","tarball":"http://registry.npmjs.org/amino/-/amino-0.13.4.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.13.5":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino","description":"Clustered application creation toolkit","version":"0.13.5","repository":{"type":"git","url":"http://github.com/cantina/amino.git"},"main":"lib/amino.js","dependencies":{"inherits":"~1.0.0","nconf":"~0.6.4","semver":"~1.0.13","hash_ring":"~0.2.1","idgen":"~1.0.2","amino-driver-redis":"~0.3.5","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"devDependencies":{"mocha":"*","async":"*"},"optionalDependencies":{"amino-driver-redis":"~0.3.5","amino-driver-amqp":"~0.2.0","amino-driver-http":"0.4.1"},"engines":{"node":">= 0.6.0"},"scripts":{"test":"make test"},"readme":"Amino\n=====\n\nClustered application creation toolkit\n\nIdea\n----\n\nAmino is a toolkit for building scalable, fault-taulerant apps in Node.js.\nBy using its simple API, you can harness the power of pub/sub, job queuing,\nand auto-load-balancing without any of the fuss and dependence on particular\ntechnologies.\n\nThe API provides:\n\n  - **pubsub** -- Use `amino.publish()` and `amino.subscribe()` to send events\n    between nodes in your cluster. (default driver: [redis](https://github.com/mranney/node_redis))\n  - **queue** -- Use `amino.queue()` and `amino.process()` to queue jobs and\n    process them. (default driver: [amqp](https://github.com/postwait/node-amqp), i.e. RabbitMQ)\n  - **request** -- Use `amino.request()` and `amino.respond()` to easily create REST\n    APIs with auto-load-balancing and failover. (default driver: HTTP, uses pub/sub)\n  - **service** -- Advanced: Use `amino.createService()` to register a service, and receive a port\n    to listen on. This allows you to create generic TCP services.\n\nSetup\n-----\n\nIf you have redis and RabbitMQ servers running locally on the default ports, all\nyou need to get started is:\n\n```bash\n$ npm install amino\n```\n\n```javascript\nvar amino = require('amino');\n\n// Use amino API\n```\n\nAmino uses a configuration file (in JSON format) to determine what drivers to use. It looks\nlike this (default conf located in `etc/amino.json`)\n\n```json\n{\n  \"amino\": {\n    \"pubsub\": {\n      \"enable\": true,\n      \"driver\": \"redis\",\n      \"options\": {\n        \"nodes\": [\"localhost:6379\"]\n      }\n    },\n    \"queue\": {\n      \"enable\": false,\n      \"driver\": \"amqp\",\n      \"options\": {\n        \"url\": \"amqp://localhost\"\n      }\n    },\n    \"request\": {\n      \"enable\": true,\n      \"driver\": \"http\"\n    },\n    \"range\": [50000, 60000]\n  }\n}\n```\n\nTo override this, you can do:\n\n```bash\n$ node myapp.js --conf /path/to/my/amino.json\n```\n\nOr to use an app-level conf, copy `amino.json` to an `etc` folder in your process's\n`cwd`. Alternatively, it can be named `app.json` or `conf.json`.\n\nOr to use a system-wide conf, you can put one at `/etc/amino.json`.\n\n__At the moment, there are no other selectable drivers. More coming soon!__\n\nAPI\n---\n\n### publish/subscribe\n\n**publisher.js**\n\n```javascript\n// Tell other nodes my name when I start.\nvar amino = require('amino');\n\namino.publish('myname', 'amino99');\n```\n\n**subscriber.js**\n\n```javascript\n// Greet other nodes as they come up.\nvar amino = require('amino');\n\namino.subscribe('myname', function(name) {\n  console.log('hello, ' + name + '!');\n});\n```\n\n### queue/process\n\n__Note: you must set `\"queue\": { \"enable\": true }` in `amino.json` to use the\nqueue interface.__ \n\n**order-sprocket.js**\n\n```javascript\n// Add sprocket request to a queue. These things take time.\nvar amino = require('amino');\n\namino.queue('orders', {type: 'sprocket-b', spokes: 5});\nconsole.log('Your order is processing!');\n```\n\n**make-sprockets.js**\n\n```javascript\n// Fulfill sprocket requests.\nvar amino = require('amino');\n\namino.process('orders', function(order, next) {\n  makeSprocket(order, function(err, sprocket) {\n    if (sprocket) {\n      console.log('Created sprocket with id ' + sprocket.id);\n    }\n    next(err);\n  });\n});\n```\n\n### request/respond\n\n**serve-sprocket.js**\n\n```javascript\n// Create a sprocket service.\nvar amino = require('amino');\n\n// \"sprockets\" will be our virtual host. We'll also tag it with\n// a version (2.1.0) for requests to filter by.\namino.respond('sprockets@2.1.0', function(router, spec) {\n  // router is a director router.\n  // @see https://github.com/flatiron/director\n  router.get('/:id', function(id) {\n    // amino adds the helpers json(), text(), and html().\n    this.res.json({id: id});\n  });\n});\n```\n\n**get-sprocket.js**\n\n```javascript\n// Request a sprocket from the sprocket service.\nvar amino = require('amino');\n\n// amino.request() is the same as github.com/mikeal/request, except\n// it can handle the amino:// protocol, which uses virtual hosts defined\n// with amino.respond().\namino.request('amino://sprockets/af920c').pipe(process.stdout);\n\n// To limit the request to hosts running sprockets v2.x, we can use a special header:\namino.request({url: 'amino://sprockets/af920c', headers: {'x-amino-version': '2.x'}}).pipe(process.stdout);\n```\n\n### createService (Advanced)\n\n**create-service.js**\n\n```javascript\n// Create a TCP service which sends \"hello world\"\nvar amino = require('amino')\n  , net = require('net');\n\nvar server = net.createServer(function(socket) {\n  socket.write(\"hello world\");\n});\nvar service = amino.createService('hello@1.1.0', function(spec) {\n  server.listen(spec.port);\n  console.log('listening on port ' + spec.port);\n});\n```\n\n**use-service.js**\n\n```javascript\n// Connect to the hello service\nvar amino = require('amino')\n  , net = require('net')\n  , req\n  , socket\n  ;\n\nreq = amino.requestService('hello', '1.x');\nreq.on('spec', function(spec) {\n  socket = net.createConnection(spec.port);\n  socket.on('connect', function() {\n    console.log('connected to hello service version ' + spec.version);\n  });\n  socket.setEncoding('utf8');\n  socket.on('data', function(data) {\n    // data should be \"hello world\"\n    console.log(data);\n  });\n});\n```\n","_id":"amino@0.13.5","dist":{"shasum":"1ad600851b36ef67485c99281b5a2ef49ce75216","tarball":"http://registry.npmjs.org/amino/-/amino-0.13.5.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"amino\n=====\n\nClustered application creation toolkit\n\n**amino** provides a simple API for communicating between nodes in a cluster:\n\n- **publish/subcribe** - aka \"events\"\n- **queue/process** - aka \"job queue\"\n- **request/respond** - aka \"REST\"\n\nMix and match these patterns to create your own distributed application!\n\npublish/subscribe\n-----------------\n\n**publisher.js**\n\n```javascript\n// Tell other nodes my name when I start.\nvar amino = require('amino')\n  .use(require('amino-pubsub-redis'));\n\namino.publish('myname', 'amino99');\n```\n\n**subscriber.js**\n\n```javascript\n// Greet other nodes as they come up.\nvar amino = require('amino')\n  .use(require('amino-pubsub-redis'));\n\namino.subscribe('myname', function(name) {\n  console.log('hello, ' + name + '!');\n});\n```\n\nqueue/process\n-------------\n\n**order-sprocket.js**\n\n```javascript\n// Add sprocket request to a queue. These things take time.\nvar amino = require('amino')\n  .use(require('amino-queue-amqp'));\n\namino.queue('orders', {type: 'sprocket-b', spokes: 5});\nconsole.log('Your order is processing!');\n```\n\n**make-sprockets.js**\n\n```javascript\n// Fulfill sprocket requests.\nvar amino = require('amino')\n  .use(require('amino-queue-amqp'));\n\namino.process('orders', function(order, next) {\n  makeSprocket(order, function(err, sprocket) {\n    if (sprocket) {\n      console.log('Created sprocket with id ' + sprocket.id);\n    }\n    next(err);\n  });\n});\n```\n\nrequest/respond\n---------------\n\n**serve-sprocket.js**\n\n```javascript\n// Create a sprocket service.\nvar amino = require('amino')\n  .use(require('amino-request-http'))\n  .use(require('amino-pubsub-redis'));\n\namino.respond('sprockets', function(router, spec) {\n  // router is a director router.\n  // @see https://github.com/flatiron/director\n  router.get('/:id', function(id) {\n    // amino adds the helpers json(), text(), and html().\n    this.res.json({id: id});\n  });\n});\n```\n\n**get-sprocket.js**\n\n```javascript\n// Request a sprocket from the sprocket service.\nvar amino = require('amino')\n  .use(require('amino-request-http'))\n  .use(require('amino-pubsub-redis'));\n\n// amino.request() is the same as github.com/mikeal/request, except\n// it can handle the amino:// protocol, which uses virtual hosts defined\n// with amino.respond().\namino.request('amino://sprockets/af920c').pipe(process.stdout);\n```","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-08-09T00:38:40.313Z","created":"2012-05-01T01:35:27.014Z","0.1.0":"2012-05-01T01:35:28.532Z","0.1.1":"2012-05-01T04:41:30.629Z","0.2.0":"2012-05-03T01:04:28.088Z","0.3.0":"2012-05-03T03:48:42.123Z","0.4.0":"2012-05-04T03:32:50.081Z","0.5.0":"2012-05-04T19:23:07.148Z","0.5.1":"2012-05-04T19:27:11.462Z","0.6.1":"2012-05-05T01:10:19.298Z","0.7.0":"2012-05-07T22:01:43.504Z","0.8.0":"2012-05-08T23:34:15.096Z","0.9.0":"2012-05-21T19:44:09.513Z","0.10.0":"2012-05-24T19:57:50.333Z","0.11.0":"2012-06-18T22:02:46.459Z","0.11.1":"2012-06-20T19:59:25.618Z","0.12.0":"2012-06-26T18:57:35.787Z","0.12.1":"2012-07-13T18:28:31.453Z","0.13.0":"2012-07-17T22:32:49.373Z","0.13.1":"2012-07-17T23:02:27.845Z","0.13.3":"2012-07-18T02:02:37.793Z","0.13.4":"2012-07-26T00:00:56.511Z","0.13.5":"2012-08-09T00:38:40.313Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"http://github.com/cantina/amino.git"},"users":{"fgribreau":true},"_attachments":{"amino-0.13.5.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-htdg9Fi59FjdknO4qKytEw==","length":17735,"stub":true},"amino-0.13.4.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-dF1oeCqztszlgF8tfPJRpw==","length":18511,"stub":true},"amino-0.13.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-vj4CBGnyaM1raBOGJ1xKbA==","length":18489,"stub":true},"amino-0.13.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-UggLd25WcKhqvnKmXfdwyQ==","length":18243,"stub":true},"amino-0.13.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-mAMjZXXCqvOG+v0uEMxnYA==","length":18218,"stub":true},"amino-0.12.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-9e80iOooSIIogFmzmgH2YA==","length":17654,"stub":true},"amino-0.12.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-wj3r/p8hJAvBtEwdph7l4w==","length":17663,"stub":true},"amino-0.11.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-27ImhrNUhbR39xUJmlLYEA==","length":17543,"stub":true},"amino-0.11.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-0XgyMfCw0fRNoKcMJGnatw==","length":17542,"stub":true},"amino-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-99TqaMdeej6PfcOleikvRg==","length":17652,"stub":true},"amino-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-fs0+l60VJu6lQ/fGpVc69w==","length":17212,"stub":true},"amino-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-fHGCQDUMP/NHkUuQTfyqbQ==","length":17020,"stub":true},"amino-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-phLPtkfHEsdFt440s/pwlQ==","length":16436,"stub":true},"amino-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-+2UQUH1H/5qoLdHY3q9OQw==","length":14771,"stub":true},"amino-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-UimQMiYY29zrci82+ZBJqg==","length":13656,"stub":true},"amino-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+XnTlF7h4lAfUfw0CegUkQ==","length":13661,"stub":true},"amino-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9wC7RFMRGYT1btbkZIxmUw==","length":12637,"stub":true},"amino-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NpGS0zWhP5S3OT0SIVPupg==","length":10909,"stub":true},"amino-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-jN/M6MEu/HlRMALlrWkyLw==","length":10851,"stub":true},"amino-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lX0PbHplWsLhYy7I/r4CPw==","length":9528,"stub":true},"amino-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nrUVdR+K2YK5/3B+i2P+tw==","length":9622,"stub":true}}}},
{"id":"amino-driver-amqp","key":"amino-driver-amqp","value":{"rev":"3-73816d2c0ce84226d08dae447cfd496d"},"doc":{"_id":"amino-driver-amqp","_rev":"3-73816d2c0ce84226d08dae447cfd496d","name":"amino-driver-amqp","description":"AMQP driver for amino","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-amqp","description":"AMQP driver for amino","version":"0.2.0","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-amqp.git"},"dependencies":{"amqp":"git+http://github.com/cantina/node-amqp.git#master","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-amqp/issues"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-amqp@0.2.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a464831fda401cceead51eb72d4656c4e5a7be78","tarball":"http://registry.npmjs.org/amino-driver-amqp/-/amino-driver-amqp-0.2.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"amino-queue-amqp allows you to use an AMQP server (such as\n[RabbitMQ](http://www.rabbitmq.com/) as a queue backend for\n[amino](https://github.com/cantina/amino).\n\nUsage\n-----\n\n**order-sprocket.js**\n\n```javascript\n// Add sprocket request to a queue. These things take time.\nvar amino = require('amino')\n  .use(require('amino-queue-amqp'), {url: 'amqp://my-server'});\n\namino.queue('orders', {type: 'sprocket-b', spokes: 5});\nconsole.log('Your order is processing!');\n```\n\n**make-sprockets.js**\n\n```javascript\n// Fulfill sprocket requests.\nvar amino = require('amino')\n  .use(require('amino-queue-amqp'), {url: 'amqp://my-server'});\n\namino.process('orders', function(order, next) {\n  makeSprocket(order, function(err, sprocket) {\n    if (sprocket) {\n      console.log('Created sprocket with id ' + sprocket.id);\n    }\n    next(err);\n  });\n});\n```","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-05-03T01:02:54.561Z","created":"2012-05-03T01:02:51.624Z","0.2.0":"2012-05-03T01:02:54.561Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/cantina/amino-driver-amqp.git"},"_attachments":{"amino-driver-amqp-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oa9YMF5ntFLb2oNaWjPiXA==","length":5327,"stub":true}}}},
{"id":"amino-driver-http","key":"amino-driver-http","value":{"rev":"9-455454c5eb1e250fb6f24094360664d0"},"doc":{"_id":"amino-driver-http","_rev":"9-455454c5eb1e250fb6f24094360664d0","name":"amino-driver-http","description":"HTTP driver for amino","dist-tags":{"latest":"0.4.1"},"versions":{"0.2.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-http","description":"HTTP driver for amino","version":"0.2.0","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-http.git"},"dependencies":{"request":"~2.9.202","director":"~1.0.9-1","inherits":"~1.0.0"},"bugs":{"url":"https://github.com/cantina/amino-driver-http/issues"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-http@0.2.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"bea0f3f85f87a02c01b10efa356de61a3ab7dc92","tarball":"http://registry.npmjs.org/amino-driver-http/-/amino-driver-http-0.2.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-http","description":"HTTP driver for amino","version":"0.3.0","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-http.git"},"dependencies":{"request":"~2.9.202","director":"~1.0.9-1","inherits":"~1.0.0"},"bugs":{"url":"https://github.com/cantina/amino-driver-http/issues"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-http@0.3.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"9ff173464b47e7cdcde5142a817cabc57d0ed434","tarball":"http://registry.npmjs.org/amino-driver-http/-/amino-driver-http-0.3.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.4.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-http","description":"HTTP driver for amino","version":"0.4.0","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-http.git"},"dependencies":{"request":"~2.9.202","director":"~1.0.9-1","inherits":"~1.0.0"},"bugs":{"url":"https://github.com/cantina/amino-driver-http/issues"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-http@0.4.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"fbcfe67f29867a8746c0ac15339702e07c294cc7","tarball":"http://registry.npmjs.org/amino-driver-http/-/amino-driver-http-0.4.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.4.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-http","description":"HTTP driver for amino","version":"0.4.1","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-http.git"},"dependencies":{"request":"~2.9.202","director":"~1.0.9-1","inherits":"~1.0.0"},"bugs":{"url":"https://github.com/cantina/amino-driver-http/issues"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-http@0.4.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"9f6275bde4d6d38e54fbef2fea9d1a9c3e54c179","tarball":"http://registry.npmjs.org/amino-driver-http/-/amino-driver-http-0.4.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"amino-request-http allows you to use HTTP as a transport for\n[amino](https://github.com/cantina/amino) requests.\n\n**note: this driver must be used in conjunction with a pub/sub driver. See\n[amino-pubsub-redis](https://github.com/cantina/amino-pubsub-redis) as an\nexample.\n\nUsage\n-----\n\n**serve-sprocket.js**\n\n```javascript\n// Create a sprocket service.\nvar amino = require('amino')\n  .use(require('amino-request-http'))\n  .use(require('amino-pubsub-redis'), {host: 'localhost', port: 6379});\n\namino.respond('sprockets', function(router, spec) {\n  // router is a director router.\n  // @see https://github.com/flatiron/director\n  router.get('/:id', function(id) {\n    // amino adds the helpers json(), text(), and html().\n    this.res.json({id: id});\n  });\n});\n```\n\n**get-sprocket.js**\n\n```javascript\n// Request a sprocket from the sprocket service.\nvar amino = require('amino')\n  .use(require('amino-request-http'))\n  .use(require('amino-pubsub-redis'), {host: 'localhost', port: 6379});\n\n// amino.request() is the same as github.com/mikeal/request, except\n// it can handle the amino:// protocol, which uses virtual hosts defined\n// with amino.respond().\namino.request('amino://sprockets/af920c').pipe(process.stdout);\n```","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-05-05T01:11:18.507Z","created":"2012-05-03T01:03:29.543Z","0.2.0":"2012-05-03T01:03:32.512Z","0.3.0":"2012-05-04T03:32:09.389Z","0.4.0":"2012-05-04T19:25:33.197Z","0.4.1":"2012-05-05T01:11:18.507Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/cantina/amino-driver-http.git"},"_attachments":{"amino-driver-http-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-C3YS17uuGM9y5GKINC1VQQ==","length":6148,"stub":true},"amino-driver-http-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-k6N+0eKhGeheweB1uE0How==","length":6143,"stub":true},"amino-driver-http-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-oARijJTm1d4H54bnD1iRnA==","length":6950,"stub":true},"amino-driver-http-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nbSgmvC/u1qWohTpAA2Acw==","length":8104,"stub":true}}}},
{"id":"amino-driver-redis","key":"amino-driver-redis","value":{"rev":"13-96cbace56be4cb1dd614f4fb0edb693e"},"doc":{"_id":"amino-driver-redis","_rev":"13-96cbace56be4cb1dd614f4fb0edb693e","name":"amino-driver-redis","description":"Redis driver for amino","dist-tags":{"latest":"0.3.5"},"versions":{"0.2.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-redis","description":"Redis driver for amino","version":"0.2.0","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-redis.git"},"dependencies":{"redis":"~0.7.1","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-redis/issues"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-redis@0.2.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"1d9ee8a3a294d27a7ada9ea888da4ef301ce3806","tarball":"http://registry.npmjs.org/amino-driver-redis/-/amino-driver-redis-0.2.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-redis","description":"Redis driver for amino","version":"0.3.0","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-redis.git"},"dependencies":{"haredis":"git+https://github.com/carlos8f/haredis.git#v0.1.1","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-redis/issues"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-redis@0.3.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7b9ec949534187bfc6822f234e7702ff974ea830","tarball":"http://registry.npmjs.org/amino-driver-redis/-/amino-driver-redis-0.3.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-redis","description":"Redis driver for amino","version":"0.3.1","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-redis.git"},"dependencies":{"haredis":"git+https://github.com/carlos8f/haredis.git#v0.1.2","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-redis/issues"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-redis@0.3.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f514e8ee6f5fdec97764c0646938b343a136361c","tarball":"http://registry.npmjs.org/amino-driver-redis/-/amino-driver-redis-0.3.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.2":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-redis","description":"Redis driver for amino","version":"0.3.2","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-redis.git"},"dependencies":{"haredis":"git+https://github.com/carlos8f/haredis.git","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-redis/issues"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-redis@0.3.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d04d89ecb6d2b609088de784127e5d5c64aa1932","tarball":"http://registry.npmjs.org/amino-driver-redis/-/amino-driver-redis-0.3.2.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.4":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-redis","description":"Redis driver for amino","version":"0.3.4","repository":{"type":"git","url":"git://github.com/cantina/amino-driver-redis.git"},"dependencies":{"haredis":"~0.2.0","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-redis/issues"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-driver-redis@0.3.4","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"eae016e5398d0017dd74361feaed9298c9e0fa36","tarball":"http://registry.npmjs.org/amino-driver-redis/-/amino-driver-redis-0.3.4.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.5":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-driver-redis","description":"Redis driver for amino","version":"0.3.5","repository":{"type":"git","url":"http://github.com/cantina/amino-driver-redis.git"},"dependencies":{"haredis":"~0.2.0","inherits":"~1.0.0"},"devDependencies":{},"optionalDependencies":{},"bugs":{"url":"https://github.com/cantina/amino-driver-redis/issues"},"engines":{"node":">= 0.6.0"},"readme":"amino-pubsub-redis allows you to use [redis](http://redis.io/) as a pub/sub\nbackend for [amino](https://github.com/cantina/amino).\n\nUsage\n-----\n\n**publisher.js**\n\n```javascript\n// Tell other nodes my name when I start.\nvar amino = require('amino')\n  .use(require('amino-pubsub-redis'), {host: 'localhost', port: 6379});\n\namino.publish('myname', 'amino99');\n```\n\n**subscriber.js**\n\n```javascript\n// Greet other nodes as they come up.\nvar amino = require('amino')\n  .use(require('amino-pubsub-redis'), {host: 'localhost', port: 6379});\n\namino.subscribe('myname', function(name) {\n  console.log('hello, ' + name + '!');\n});\n```","_id":"amino-driver-redis@0.3.5","dist":{"shasum":"2b0ac4cd2f242ff0336294f365fbbc613a16f09d","tarball":"http://registry.npmjs.org/amino-driver-redis/-/amino-driver-redis-0.3.5.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"amino-pubsub-redis allows you to use [redis](http://redis.io/) as a pub/sub\nbackend for [amino](https://github.com/cantina/amino).\n\nUsage\n-----\n\n**publisher.js**\n\n```javascript\n// Tell other nodes my name when I start.\nvar amino = require('amino')\n  .use(require('amino-pubsub-redis'), {host: 'localhost', port: 6379});\n\namino.publish('myname', 'amino99');\n```\n\n**subscriber.js**\n\n```javascript\n// Greet other nodes as they come up.\nvar amino = require('amino')\n  .use(require('amino-pubsub-redis'), {host: 'localhost', port: 6379});\n\namino.subscribe('myname', function(name) {\n  console.log('hello, ' + name + '!');\n});\n```","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-08-08T23:06:22.945Z","created":"2012-05-03T01:01:57.787Z","0.2.0":"2012-05-03T01:01:59.971Z","0.3.0":"2012-06-18T21:55:22.823Z","0.3.1":"2012-06-18T21:58:43.756Z","0.3.2":"2012-06-18T22:43:33.940Z","0.3.4":"2012-06-19T01:40:45.086Z","0.3.5":"2012-08-08T23:06:22.945Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"http://github.com/cantina/amino-driver-redis.git"},"_attachments":{"amino-driver-redis-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-TEnv2gVJ5rcHZOgwPi+mdA==","length":5342,"stub":true},"amino-driver-redis-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+KpBY1BHnGE4uHskbyUesg==","length":5346,"stub":true},"amino-driver-redis-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-N+h2/anPQzQKGCTvKZ5h9Q==","length":5355,"stub":true},"amino-driver-redis-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Ih9IWFLOXNAaVyfIJZY7iQ==","length":5365,"stub":true},"amino-driver-redis-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9dp9ac01DeUerrINMbRI4g==","length":5365,"stub":true},"amino-driver-redis-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HEeHVAfrnPfzmGjvYOeDKQ==","length":5351,"stub":true}}}},
{"id":"amino-gateway","key":"amino-gateway","value":{"rev":"35-79650b421f2c3dd4dec596d7297208b0"},"doc":{"_id":"amino-gateway","_rev":"35-79650b421f2c3dd4dec596d7297208b0","name":"amino-gateway","description":"Clusterable http proxy for amino services","dist-tags":{"latest":"0.7.1"},"versions":{"0.1.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.1.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"nconf":"~0.5.1","amino":"~0.1.0","amino-pubsub-redis":"~0.1.0","amino-request-http":"~0.1.0"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.1.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"5b13a44a752e14eea97838c0ca52551bc8152a05","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.1.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.2.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.2.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.2.0"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.2.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"cc604599e0da4ed7c4fa0063e380b17255e16b18","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.2.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.3.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.3.0"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.3.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"06aff06c76e1c6a3f5bb16d872582f4fbc78a292","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.3.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.3.1","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.3.0"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.3.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"50f519af2669111c5ee22e22ee33618e47ddb1d5","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.3.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.2":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.3.2","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.8.0"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.3.2","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"7da9b01f485aaf07a971725899ffa23b69279801","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.3.2.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.3":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.3.3","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"*","bouncy":"~1.3.1"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.3.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"86e5568c1604114c4588f692360f757da99daf0a","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.3.3.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.4":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.3.4","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"*","bouncy":"~1.3.1"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.3.4","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"507653b59347cb879a8bffda15f2bcadad676493","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.3.4.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.5":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.3.5","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"*","bouncy":"git+https://github.com/carlos8f/bouncy.git"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.3.5","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5f0f3baa81153e1b1a915d36b313e3e862adaecb","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.3.5.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.4.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.4.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"*","bouncy":"git+https://github.com/carlos8f/bouncy.git"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.4.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"9048e7d49e1575ca7783db87084ecaad580d1f25","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.4.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.4.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.4.1","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"*","bouncy":"git+https://github.com/carlos8f/bouncy.git"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.4.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"123a7f44c8695167de357aeb512696fa12fc06f3","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.4.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.5.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.5.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","bouncy":"git+https://github.com/carlos8f/bouncy.git","cookie":"~0.0.4"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.5.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"617ce149fca1f9218f7186cd918f87b18cd42a4c","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.5.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.5.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.5.1","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","bouncy":"git+https://github.com/carlos8f/bouncy.git","cookie":"~0.0.4"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.5.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"3589719a194dc38abedcaa2de9a982810316231c","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.5.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.5.2":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.5.2","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","bouncy":"git+https://github.com/carlos8f/bouncy.git","cookie":"~0.0.4"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.5.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"aa0302d89565e3019e5d7b1c4af543f01c3f3b19","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.5.2.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.5.3":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.5.3","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","bouncy":"git+https://github.com/carlos8f/bouncy.git","cookie":"~0.0.4"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-gateway@0.5.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"1d1cd8ec437d9fe74bba0504d8a10a341a38197d","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.5.3.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.6.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.6.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","bouncy":"git+https://github.com/carlos8f/bouncy.git","cookie":"~0.0.4"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"license":"MIT","engines":{"node":">= 0.6.0"},"readme":"amino-gateway\n=============\n\nClusterable http proxy for [Amino](https://github.com/cantina/amino) services\n\nIdea\n----\n\n  - First, use Amino's `respond()` API to create an \"app\" service.\n  - Start one or more of those servers.\n  - Start one or more `amino-gateway` servers.\n  - HTTP requests to your gateway servers will pipe to your app servers,\n    auto-loadbalancing between them without any further configuration. Easy!\n\nRequirements\n------------\n\nYou'll also need one or more Amino processes implementing the `respond()` API\nto provide an \"app\" service (or a service specified by `--service`).\n\nSee [Amino](https://github.com/cantina/amino) for more information.\n\nInstall\n-------\n\n```bash\n$ npm install -g amino-gateway\n```\n\nAlso make sure you have an `/etc/amino.conf` set up which has the same drivers/options\nas used by your app services.\n\nUsage\n-----\n\n```bash\n$ amino-gateway [[--port] [--service] [--threads] [--conf]]\n```\n\nExamples\n--------\n\n**Start a gateway with default settings:**\n\n```bash\n$ amino-gateway\n```\n\n**Start a gateway on port 8000:**\n\n```bash\n$ amino-gateway -p 8000\n```\n\n**Start a gateway to proxy to \"foo\" service:**\n\n```bash\n$ amino-gateway --service foo\n```\n\n**Run on specific number of threads**\n\n```bash\n$ amino-gateway --threads=8\n```\n\n**Specify a conf file:**\n\nSee `etc/gateway.json` for the file's syntax.\n\n```bash\n$ amino-gateway --conf ../path/to/my/conf.json\n```\n\nThe conf file can also have an \"amino\" key, corresponding to the Amino configuration to\nuse. This will override `/etc/amino.conf`.\n\nIf you'd rather not pass a conf path every time, you can put a system-wide conf at\n`/etc/amino/gateway.json`.\n\nSticky Sessions\n---------------\n\n`amino-gateway` supports\n[consistent hash](http://en.wikipedia.org/wiki/Consistent_hashing)-based sticky\nsessions.\n\n__To enable sticky sessions, first add `\"stickyEnable\": true` to your\n`gateway.json`.__\n\nYou may use **one** of the following methods:\n\n- cookie: Add `\"stickyCookie\": \"your_cookie_name\"` to maintain sticky sessions\n  based on the value of a cookie.\n- IP: Add `\"stickyIP\": true` to hash sticky sessions based on the remote IP\n  address.\n- query string: Add `\"stickyQuery\": \"your_querystring_variable_name\"` to hash\n  sticky sessions based on the value of a GET variable.\n\nLICENSE\n-------\n\nMIT","_id":"amino-gateway@0.6.0","dist":{"shasum":"26de2f6d674928109a1ef4a8465219a3d76525f5","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.6.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.7.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.7.0","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","cookie":"~0.0.4","http-proxy":"~0.8.2"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"license":"MIT","engines":{"node":">= 0.6.0"},"readme":"amino-gateway\n=============\n\nClusterable http proxy for [Amino](https://github.com/cantina/amino) services\n\nIdea\n----\n\n  - First, use Amino's `respond()` API to create an \"app\" service.\n  - Start one or more of those servers.\n  - Start one or more `amino-gateway` servers.\n  - HTTP requests to your gateway servers will pipe to your app servers,\n    auto-loadbalancing between them without any further configuration. Easy!\n\nRequirements\n------------\n\nYou'll also need one or more Amino processes implementing the `respond()` API\nto provide an \"app\" service (or a service specified by `--service`).\n\nSee [Amino](https://github.com/cantina/amino) for more information.\n\nInstall\n-------\n\n```bash\n$ npm install -g amino-gateway\n```\n\nAlso make sure you have an `/etc/amino.conf` set up which has the same drivers/options\nas used by your app services.\n\nUsage\n-----\n\n```bash\n$ amino-gateway [[--port] [--service] [--threads] [--conf]]\n```\n\nExamples\n--------\n\n**Start a gateway with default settings:**\n\n```bash\n$ amino-gateway\n```\n\n**Start a gateway on port 8000:**\n\n```bash\n$ amino-gateway -p 8000\n```\n\n**Start a gateway to proxy to \"foo\" service:**\n\n```bash\n$ amino-gateway --service foo\n```\n\n**Run on specific number of threads**\n\n```bash\n$ amino-gateway --threads=8\n```\n\n**Specify a conf file:**\n\nSee `etc/gateway.json` for the file's syntax.\n\n```bash\n$ amino-gateway --conf ../path/to/my/conf.json\n```\n\nThe conf file can also have an \"amino\" key, corresponding to the Amino configuration to\nuse. This will override `/etc/amino.conf`.\n\nIf you'd rather not pass a conf path every time, you can put a system-wide conf at\n`/etc/amino/gateway.json`.\n\nSticky Sessions\n---------------\n\n`amino-gateway` supports\n[consistent hash](http://en.wikipedia.org/wiki/Consistent_hashing)-based sticky\nsessions.\n\n__To enable sticky sessions, first add `\"stickyEnable\": true` to your\n`gateway.json`.__\n\nYou may use **one** of the following methods:\n\n- cookie: Add `\"stickyCookie\": \"your_cookie_name\"` to maintain sticky sessions\n  based on the value of a cookie.\n- IP: Add `\"stickyIP\": true` to hash sticky sessions based on the remote IP\n  address.\n- query string: Add `\"stickyQuery\": \"your_querystring_variable_name\"` to hash\n  sticky sessions based on the value of a GET variable.\n\nLICENSE\n-------\n\nMIT","_id":"amino-gateway@0.7.0","dist":{"shasum":"e50444bf304e7acb19274cd0d88c2d0126fce328","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.7.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.7.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-gateway","description":"Clusterable http proxy for amino services","version":"0.7.1","repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"bin":{"amino-gateway":"./bin/gateway.js"},"dependencies":{"amino":"~0.13.0","cookie":"~0.0.4","http-proxy":"~0.8.2"},"devDependencies":{"mocha":"*","idgen":"~1.0.2"},"bugs":{"url":"https://github.com/cantina/amino-gateway/issues"},"optionalDependencies":{},"license":"MIT","engines":{"node":">= 0.6.0"},"readme":"amino-gateway\n=============\n\nClusterable http proxy for [Amino](https://github.com/cantina/amino) services\n\nIdea\n----\n\n  - First, use Amino's `respond()` API to create an \"app\" service.\n  - Start one or more of those servers.\n  - Start one or more `amino-gateway` servers.\n  - HTTP requests to your gateway servers will pipe to your app servers,\n    auto-loadbalancing between them without any further configuration. Easy!\n\nRequirements\n------------\n\nYou'll also need one or more Amino processes implementing the `respond()` API\nto provide an \"app\" service (or a service specified by `--service`).\n\nSee [Amino](https://github.com/cantina/amino) for more information.\n\nInstall\n-------\n\n```bash\n$ npm install -g amino-gateway\n```\n\nAlso make sure you have an `/etc/amino.conf` set up which has the same drivers/options\nas used by your app services.\n\nUsage\n-----\n\n```bash\n$ amino-gateway [[--port] [--service] [--threads] [--conf]]\n```\n\nExamples\n--------\n\n**Start a gateway with default settings:**\n\n```bash\n$ amino-gateway\n```\n\n**Start a gateway on port 8000:**\n\n```bash\n$ amino-gateway -p 8000\n```\n\n**Start a gateway to proxy to \"foo\" service:**\n\n```bash\n$ amino-gateway --service foo\n```\n\n**Run on specific number of threads**\n\n```bash\n$ amino-gateway --threads=8\n```\n\n**Specify a conf file:**\n\nSee `etc/gateway.json` for the file's syntax.\n\n```bash\n$ amino-gateway --conf ../path/to/my/conf.json\n```\n\nThe conf file can also have an \"amino\" key, corresponding to the Amino configuration to\nuse. This will override `/etc/amino.conf`.\n\nIf you'd rather not pass a conf path every time, you can put a system-wide conf at\n`/etc/amino/gateway.json`.\n\nSticky Sessions\n---------------\n\n`amino-gateway` supports\n[consistent hash](http://en.wikipedia.org/wiki/Consistent_hashing)-based sticky\nsessions.\n\n__To enable sticky sessions, first add `\"stickyEnable\": true` to your\n`gateway.json`.__\n\nYou may use **one** of the following methods:\n\n- cookie: Add `\"stickyCookie\": \"your_cookie_name\"` to maintain sticky sessions\n  based on the value of a cookie.\n- IP: Add `\"stickyIP\": true` to hash sticky sessions based on the remote IP\n  address.\n- query string: Add `\"stickyQuery\": \"your_querystring_variable_name\"` to hash\n  sticky sessions based on the value of a GET variable.\n\nLICENSE\n-------\n\nMIT","_id":"amino-gateway@0.7.1","dist":{"shasum":"81ea2189221756b7a39b89b3dfd098afccaad28d","tarball":"http://registry.npmjs.org/amino-gateway/-/amino-gateway-0.7.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"amino-gateway\n===============\n\nClusterable http proxy for [amino](https://github.com/cantina/amino) services\n\nUsage\n-----\n\n  - First, use amino's `respond()` API to create an \"app\" service.\n  - Start one or more of those servers.\n  - Start one or more `amino-gateway` servers.\n  - HTTP requests to your gateway servers will pipe to your app servers,\n    auto-loadbalancing between them without any further configuration. Easy!\n\n**Start a gateway with default settings:**\n\n```bash\n$ ./bin/gateway.js\n```\n\n**Start a gateway on port 8000:**\n\n```bash\n$ ./bin/gateway.js -p 8000\n```\n\n**Start a gateway to proxy to \"foo\" service:**\n\n```bash\n$ ./bin/gateway.js --service foo\n```\n\n**Specify a conf file:**\n\n```bash\n$ ./bin/gateway.js --conf ../path/to/my/conf.json\n```","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-08-15T02:10:33.582Z","created":"2012-05-02T04:55:15.082Z","0.1.0":"2012-05-02T04:55:18.840Z","0.2.0":"2012-05-03T03:43:01.418Z","0.3.0":"2012-05-03T03:50:23.122Z","0.3.1":"2012-05-03T07:13:12.809Z","0.3.2":"2012-05-08T23:31:58.437Z","0.3.3":"2012-06-19T18:27:17.579Z","0.3.4":"2012-07-12T18:54:46.610Z","0.3.5":"2012-07-12T19:43:49.947Z","0.4.0":"2012-07-13T01:21:43.121Z","0.4.1":"2012-07-13T01:28:17.825Z","0.5.0":"2012-07-18T02:04:14.810Z","0.5.1":"2012-07-18T02:09:45.259Z","0.5.2":"2012-07-18T02:27:17.007Z","0.5.3":"2012-07-21T00:30:06.579Z","0.6.0":"2012-08-09T21:14:45.831Z","0.7.0":"2012-08-15T02:05:02.182Z","0.7.1":"2012-08-15T02:10:33.582Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/cantina/amino-gateway.git"},"_attachments":{"amino-gateway-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-dkH8yfjiRTnHDj3hV0HsUA==","length":5125,"stub":true},"amino-gateway-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-RcOjjN3ZZuqjboRLyddSjg==","length":5137,"stub":true},"amino-gateway-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-3d7qXGd83yr8odDJA7tO8Q==","length":4933,"stub":true},"amino-gateway-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-VUuiFFL+hySxsCWBedrjmg==","length":4560,"stub":true},"amino-gateway-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-FzT6GFAl9JLiiUvaPnm4qQ==","length":4547,"stub":true},"amino-gateway-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-vG5Wi/q0IuXVXsYTvQiO9w==","length":4524,"stub":true},"amino-gateway-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-LDZplw2RXIOPBxGVuhxduA==","length":4468,"stub":true},"amino-gateway-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-mAvZ/4oRwItnwz1r5mRsQg==","length":3567,"stub":true},"amino-gateway-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-T436h4c5YR+iB5KN0QeZYQ==","length":3534,"stub":true},"amino-gateway-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-E8Va0b2VyHmyLFmCw6ZR9Q==","length":3295,"stub":true},"amino-gateway-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-vCcCCw1cnkm3cEdZvsxf8g==","length":3278,"stub":true},"amino-gateway-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-MLX4hRZrXzQ/e7jbEM5BmA==","length":3263,"stub":true},"amino-gateway-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-INhWE0wjIUKdVgP/jT47jA==","length":3289,"stub":true},"amino-gateway-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-bAuEP7jP49rm21OyDb4MdA==","length":2841,"stub":true},"amino-gateway-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1Sv07ayfS3yw2ApSQupt7A==","length":2705,"stub":true},"amino-gateway-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-LC8FwnKJBpRWZC61UU3+gQ==","length":2706,"stub":true},"amino-gateway-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kcPXfaXXZZYKFRlRR2Z/zw==","length":2733,"stub":true}}}},
{"id":"amino-service","key":"amino-service","value":{"rev":"3-55f280888ee096de146c6dcb47e763bc"},"doc":{"_id":"amino-service","_rev":"3-55f280888ee096de146c6dcb47e763bc","name":"amino-service","description":"Run an amino service on behalf of any HTTP daemon","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"amino-service","description":"Run an amino service on behalf of any HTTP daemon","version":"0.1.0","repository":{"type":"git","url":"git://github.com/cantina/amino-service.git"},"bin":{"amino-service":"./bin/service.js"},"dependencies":{"amino":"~0.10.0"},"devDependencies":{"mocha":"*"},"bugs":{"url":"https://github.com/cantina/amino-service/issues"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"amino-service@0.1.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"24262d4fa3869a975112ec82208d9fab756db710","tarball":"http://registry.npmjs.org/amino-service/-/amino-service-0.1.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"amino-service\n===============\n\nRun an [Amino](https://github.com/cantina/amino) service on behalf of any HTTP daemon\n\nIdea\n----\n\n  - Say you have a few dozen HTTP daemons each running on separate hosts.\n  - The daemons might be running riak, elasticsearch, node, apache, whatever.\n  - You'd like to use those daemons as an army to help you dominate the world.\n  - For each daemon, start up an `amino-service` daemon, give it the host and\n    port of the HTTP daemon, and the Amino service name you want it to run under.\n  - You can now make `amino://` requests to your cluster, with auto load-balancing\n    and failover!\n  - Use [amino-gateway](https://github.com/cantina/amino-gateway) to create an\n    HTTP proxy for each one of your service clusters. Holy cow!\n\nRequirements\n------------\n\nYou'll need to set up [Amino](https://github.com/cantina/amino) on each host.\n\nInstall\n-------\n\n```bash\n$ npm install -g amino-service\n```\n\nExample\n-------\n\n** Create a proxy for a riak cluster **\n\n```bash\n$ (first set up a riak cluster with nodes on ports 8098, 9099, and 9100)\n$ amino-service -s riak -p 8098 &\n$ amino-service -s riak -p 8099 &\n$ amino-service -s riak -p 8100 &\n$ amino-gateway --service riak\n$ curl --url http://localhost:8080/\n```\n\nResult: you'll get round-robin load-balancing to your riak cluster, with failover!\n\nIf you add riak nodes to the cluster, just start up a new `amino-service` for\neach, and it will enter the gateway's rotation.","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-05-24T23:17:07.507Z","created":"2012-05-24T23:17:06.003Z","0.1.0":"2012-05-24T23:17:07.507Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/cantina/amino-service.git"},"_attachments":{"amino-service-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8QuQOZ5M0aZrspZuSxF2JQ==","length":1622,"stub":true}}}},
{"id":"amionline","key":"amionline","value":{"rev":"3-a62887a632523700402b0f4ebb896812"},"doc":{"_id":"amionline","_rev":"3-a62887a632523700402b0f4ebb896812","name":"amionline","description":"For WebApps (especially offline-enabled apps) to determine online / offline status using browser, origin, amazon favicon.ico mechanizms","dist-tags":{"latest":"0.5.0"},"versions":{"0.5.0":{"name":"amionline","description":"For WebApps (especially offline-enabled apps) to determine online / offline status using browser, origin, amazon favicon.ico mechanizms","version":"0.5.0","homepage":"https://github.com/coolaj86/iphone-html5-offline-app-demo","repository":{"type":"git","url":"git://github.com/coolaj86/iphone-html5-offline-app-demo.git"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info/"},"engines":{"node":"*"},"main":"index","dependencies":{"ahr2":">= 2.1.0","events.node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/coolaj86/.npm/amionline/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amionline@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"fe2caceb3e90e78cc7c12579b04a71748faea7e9","tarball":"http://registry.npmjs.org/amionline/-/amionline-0.5.0.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-09-05T19:45:05.125Z","created":"2011-09-05T19:45:04.098Z","0.5.0":"2011-09-05T19:45:05.125Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info/"},"repository":{"type":"git","url":"git://github.com/coolaj86/iphone-html5-offline-app-demo.git"},"_attachments":{"amionline-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ka2hLV6pPW3ziZ66w/k18Q==","length":1013,"stub":true}}}},
{"id":"amo-version-reduce","key":"amo-version-reduce","value":{"rev":"3-05f6956269e5e921ca3486d3d6ea74b0"},"doc":{"_id":"amo-version-reduce","_rev":"3-05f6956269e5e921ca3486d3d6ea74b0","name":"amo-version-reduce","description":"Simple utility that reduces the detailed host application version statistics","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"amo-version-reduce","description":"Simple utility that reduces the detailed host application version statistics","version":"1.0.0","keywords":["amo extension version statistics"],"repository":{"type":"git","url":"git://github.com/kpdecker/amo-version-reduce.git"},"engines":{"node":">=0.4.7"},"dependencies":{"optimist":"~0.2","lines":"~1.0"},"devDependencies":{},"bin":{"amo-version-reduce":"bin/amo-version-reduce"},"preferGlobal":true,"_npmJsonOpts":{"file":"/Users/kdecker/.npm/amo-version-reduce/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amo-version-reduce@1.0.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"fab41be105c2015ff80f3633ac9a64104f901075","tarball":"http://registry.npmjs.org/amo-version-reduce/-/amo-version-reduce-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}]}},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"time":{"modified":"2011-09-03T22:50:15.112Z","created":"2011-09-03T22:50:14.831Z","1.0.0":"2011-09-03T22:50:15.112Z"},"repository":{"type":"git","url":"git://github.com/kpdecker/amo-version-reduce.git"},"_attachments":{"amo-version-reduce-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PEYQXh3TqmVnoOcifB3gaw==","length":3026,"stub":true}}}},
{"id":"amon","key":"amon","value":{"rev":"14-d5cc26134b5d469150be6c9bfd8e0832"},"doc":{"_id":"amon","_rev":"14-d5cc26134b5d469150be6c9bfd8e0832","name":"amon","description":"node.js module for Amon","dist-tags":{"latest":"0.5.0"},"versions":{"0.2.0":{"name":"amon","version":"0.2.0","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"bugs":{"email":"martin@amon.cx","url":"http://github.com/martinrusev/amon-node/issues"},"main":"./lib/amon","engines":{"node":">=0.4.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"_npmUser":{"name":"martinrusev","email":"martinmcloud@gmail.com"},"_id":"amon@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b261af9d51c40da3c62397b91c60ad657d805990","tarball":"http://registry.npmjs.org/amon/-/amon-0.2.0.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]},"0.2.1":{"name":"amon","version":"0.2.1","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"bugs":{"email":"martin@amon.cx","url":"http://github.com/martinrusev/amon-node/issues"},"main":"./lib/amon","engines":{"node":">=0.4.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"_npmUser":{"name":"martinrusev","email":"martinmcloud@gmail.com"},"_id":"amon@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a271d5214b2b67519bdb7cde8dd1d72c61009385","tarball":"http://registry.npmjs.org/amon/-/amon-0.2.1.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]},"0.2.2":{"name":"amon","version":"0.2.2","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"bugs":{"email":"martin@amon.cx","url":"http://github.com/martinrusev/amon-node/issues"},"main":"./lib/amon","engines":{"node":">=0.4.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"_npmUser":{"name":"martinrusev","email":"martinmcloud@gmail.com"},"_id":"amon@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"857f657871d1863fa63e31642335bcc4d398c37b","tarball":"http://registry.npmjs.org/amon/-/amon-0.2.2.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]},"0.3.0":{"name":"amon","version":"0.3.0","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"bugs":{"email":"martin@amon.cx","url":"http://github.com/martinrusev/amon-node/issues"},"main":"./lib/amon","engines":{"node":">=0.4.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"_npmUser":{"name":"martinrusev","email":"martinmcloud@gmail.com"},"_id":"amon@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9b565f0c8cc98228c050b7c27c85c44651767e06","tarball":"http://registry.npmjs.org/amon/-/amon-0.3.0.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]},"0.3.1":{"name":"amon","version":"0.3.1","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"bugs":{"email":"martin@amon.cx","url":"http://github.com/martinrusev/amon-node/issues"},"main":"./lib/amon","engines":{"node":">=0.4.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"contributors":[{"name":"Michael Heap","email":"m@michaelheap.com","url":"http://michaelheap.com"}],"_npmUser":{"name":"martinrusev","email":"martinmcloud@gmail.com"},"_id":"amon@0.3.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fb728a9eae3cbb8e38b6ef4111f578197ad5cb46","tarball":"http://registry.npmjs.org/amon/-/amon-0.3.1.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]},"0.5.0":{"name":"amon","version":"0.5.0","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"http://github.com/martinrusev/amon-node.git"},"bugs":{"url":"http://github.com/martinrusev/amon-node/issues","mail":"martin@amon.cx"},"main":"./lib/amon","engines":{"node":">=0.4.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"contributors":[{"name":"Michael Heap","email":"m@michaelheap.com","url":"http://michaelheap.com"}],"readme":"## Install\n\nYou can install the node.js client with <span class='code'>npm install amon</span>\n<br/>\n<br/>\nIf you want to use the client from the command line, you can install it globally with\n<span class=\"code\">sudo npm install amon -g</span> and then link it to your project with\n<span class='code'>npm link amon</span>\n\n## Usage\n\n\n### Logging\n\n\n\tvar amon = require('amon').Amon; \n\n\t// By default the client will try to send the log data on http://127.0.0.1:2464\n\t// You can change that with:\n\tamon.host = 'http://127.0.0.1';\n\tamon.port = 2464;\n\n\tamon.log('node.js message')\n\tamon.log('node.js debug message', 'debug')\n\n\t# Arrays\n\tamon.log(['data', 'more data'], 'debug')\n\n\t# Tagged logging\n\tamon.log(message, ['debug', 'info'])\n\n\n\n### Exception handling\n\nYou can capture exceptions from your node application, by adding these lines in your main file. For example, if you start\nyour project with <span class=\"code\">node server.js</span>, add them to <span class=\"code\">server.js</span>\n\n\n\tvar amon = require('amon').Amon; \n\tprocess.addListener('uncaughtException', function(err) {\n\t\tamon.handle(err);\n\t});\n\n\t\n## Bugs\n\nIf you find a bug in the node client, you can use the the github issues page to report it: \n[https://github.com/martinrusev/amon-node/issue](https://github.com/martinrusev/amon-node/issue)\n\n","_id":"amon@0.5.0","dist":{"shasum":"f8005093018ff95838647fca33c6d5b8271805be","tarball":"http://registry.npmjs.org/amon/-/amon-0.5.0.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]}},"readme":null,"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}],"time":{"modified":"2012-08-02T13:43:25.383Z","created":"2011-11-09T22:04:48.887Z","0.2.0":"2011-11-09T22:04:50.976Z","0.2.1":"2011-11-10T20:24:48.016Z","0.2.2":"2012-01-04T11:31:51.475Z","0.3.0":"2012-02-23T19:27:58.517Z","0.3.1":"2012-02-26T21:04:55.635Z","0.5.0":"2012-08-02T10:16:18.088Z"},"author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"http://github.com/martinrusev/amon-node.git"},"users":{"fgribreau":true},"_attachments":{"amon-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-qmyYJ+NLJyH94MzsHU65xA==","length":2585,"stub":true},"amon-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-yqkzB+/ZFpMnd0UJFbAb9w==","length":2284,"stub":true},"amon-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YqWRmLJXofijAkSDHH20Yg==","length":2189,"stub":true},"amon-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-VmVwxdkhKMVH377nkqLHsw==","length":2106,"stub":true},"amon-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QeuxBJPclzFAncLqfoXmoA==","length":1870,"stub":true},"amon-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0XOlNu6aiX054zwwRAAtLQ==","length":1696,"stub":true}}}},
{"id":"amon-node","key":"amon-node","value":{"rev":"3-afee9e8572b78e3528d708ca4db450aa"},"doc":{"_id":"amon-node","_rev":"3-afee9e8572b78e3528d708ca4db450aa","name":"amon-node","description":"node.js module for Amon","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"amon-node","version":"0.0.1","description":"node.js module for Amon","homepage":"http://amon.cx","author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"bugs":{"email":"martin@amon.cx","url":"http://github.com/martinrusev/amon-node/issues"},"main":"./lib/amon","engines":{"node":">=0.2.0"},"scripts":{"test":"test/amon-test.js"},"dependencies":{},"licenses":[{"type":"BSD","url":"http://github.com/martinrusev/amon-node"}],"_npmUser":{"name":"martinrusev","email":"martinmcloud@gmail.com"},"_id":"amon-node@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"eb28e5c7c274c892811bda89f6357b515b8b712d","tarball":"http://registry.npmjs.org/amon-node/-/amon-node-0.0.1.tgz"},"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}]}},"readme":null,"maintainers":[{"name":"martinrusev","email":"martinmcloud@gmail.com"}],"time":{"modified":"2011-11-09T16:15:04.442Z","created":"2011-11-09T16:15:01.202Z","0.0.1":"2011-11-09T16:15:04.442Z"},"author":{"name":"Martin Rusev","email":"martin@amon.cx"},"repository":{"type":"git","url":"git://github.com/martinrusev/amon-node.git"},"_attachments":{"amon-node-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GsNsK/DTZHfNS5OHZVZhQg==","length":1140,"stub":true}}}},
{"id":"ampache","key":"ampache","value":{"rev":"9-59ec8f6ef066cdd0a24bfa7ea66c490c"},"doc":{"_id":"ampache","_rev":"9-59ec8f6ef066cdd0a24bfa7ea66c490c","name":"ampache","description":"Communicate to an Ampache server using the API","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.0":{"name":"ampache","description":"Communicate to an Ampache server using the API","version":"0.0.0","author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/bahamas10/node-ampache.git"},"scripts":{"test":"for f in auth.js ping.js artists.js; do echo \"$f\"; node \"tests/$f\" || exit 1; done; echo 'Passed!'; exit 0"},"dependencies":{"request":"~ 2.10.0","xml2js":"~ 0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"keywords":["ampache","owncloud","viridian"],"readme":"Ampache\n=======\n\nCommunicate to an Ampache server using the API\n\nUsage\n-----\n\n``` js\nvar AmpacheSession = require('ampache');\nvar conn = new AmpacheSession('user', 'pass', 'http://example.com/server/xml.server.php');\n```\n\nExamples\n--------\n\nAuthenticate to an ampache server (assumes `conn` is set from the above usage)\n\n``` js\nconn.authenticate(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"auth\": \"510b0a5f0f0e076ebab1df731acbbaeb\",\n  \"api\": \"350001\",\n  \"update\": \"2012-05-23T03:32:01+00:00\",\n  \"add\": \"2012-08-07T09:32:17+00:00\",\n  \"clean\": \"2012-08-07T09:32:29+00:00\",\n  \"songs\": \"8043\",\n  \"albums\": \"862\",\n  \"artists\": \"372\",\n  \"playlists\": \"0\",\n  \"videos\": \"9\"\n}\n```\n\nGet a list of artists\n\n``` js\nconn.get_artists(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"391\": {\n    \"@\": {\n      \"id\": \"391\"\n    },\n    \"name\": \"The American Dollar\",\n    \"tag\": {\n      \"#\": \"Post-Rock\",\n      \"@\": {\n        \"id\": \"7\",\n        \"count\": \"\"\n      }\n    },\n    \"albums\": \"2\",\n    \"songs\": \"24\",\n    \"preciserating\": {},\n    \"rating\": \"0\"\n  },\n  \"392\": {...},\n}\n```\n\nQuery the Ampache server for a given artist id\n\n``` js\nconn.get_artist(249, function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"@\": {\n    \"id\": \"249\"\n  },\n  \"name\": \"Lights\",\n  \"tag\": {\n    \"#\": \"Pop\",\n    \"@\": {\n      \"id\": \"11\",\n      \"count\": \"\"\n    }\n  },\n  \"albums\": \"1\",\n  \"songs\": \"13\",\n  \"preciserating\": {},\n  \"rating\": \"0\"\n}\n```\n\nPing the ampache server to prolong your session\n\n``` js\nconn.ping(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"session_expire\": \"Fri, 10 Aug 2012 07:05:09 +0000\",\n  \"server\": \"3.6-Alpha1-DEV\",\n  \"version\": \"350001\",\n  \"compatible\": \"350001\"\n}\n```\n\nFunctions\n---------\n\n### new AmpacheServer(user, pass, url, [opts])\n\nCreate a new `AmpacheServer` object.  `opts` is an object with the following keys.\n\n`opts.debug`: `boolean` - defaults to false - whether to write debug messages to stderr\n\n---\n\nThe following functions require an `AmpacheServer` object to run\n\nAll callbacks are optional\n\n### conn.authenticate(callback(err, body))\n\nAuthenticate to the server, storing the auth data in the object, and return\nthe body\n\n### conn.ping(callback(err, body))\n\nExtend the session on the server by sending a keep-alive\n\n### conn.get\\_artists, conn.get\\_albums, conn.get\\_songs([search], callback(err, res))\n\nGet a list of all artists/albums/songs on the server, returns a list of objects\n\n`search` is an optional string to filter the results\n\n### conn.get\\_artist, conn.get\\_album, conn.get\\_song(id, callback(err, res))\n\nGet a single artist/album/song by its ID on the server\n\nInstall\n-------\n\n    npm install ampache\n\nTests\n-----\n\nTo test this module, you must copy the `config.json.dist` file in the tests/ folder\nto `config.json`, and populate it with your Ampache server credentials.\n\n    cp tests/config.json{.dist,}\n    $EDITOR tests/config.json\n\nAnd then you can run the tests manually\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"ampache@0.0.0","dist":{"shasum":"bc3b080199c474abb22b4a668e0e08cfbda8bff0","tarball":"http://registry.npmjs.org/ampache/-/ampache-0.0.0.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]},"0.1.0":{"name":"ampache","description":"Communicate to an Ampache server using the API","version":"0.1.0","author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/bahamas10/node-ampache.git"},"scripts":{"test":"for f in auth.js ping.js artists.js; do echo \"$f\"; node \"tests/$f\" || exit 1; done; echo 'Passed!'; exit 0"},"dependencies":{"request":"~ 2.10.0","xml2js":"~ 0.1.14"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"keywords":["ampache","owncloud","viridian"],"readme":"Ampache\n=======\n\nCommunicate to an Ampache server using the API\n\nUsage\n-----\n\n``` js\nvar AmpacheSession = require('ampache');\nvar conn = new AmpacheSession('user', 'pass', 'http://example.com/server/xml.server.php');\n```\n\nExamples\n--------\n\n#### Authenticate to an ampache server (assumes `conn` is set from the above usage)\n\n``` js\nconn.authenticate(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"auth\": \"510b0a5f0f0e076ebab1df731acbbaeb\",\n  \"api\": \"350001\",\n  \"update\": \"2012-05-23T03:32:01+00:00\",\n  \"add\": \"2012-08-07T09:32:17+00:00\",\n  \"clean\": \"2012-08-07T09:32:29+00:00\",\n  \"songs\": \"8043\",\n  \"albums\": \"862\",\n  \"artists\": \"372\",\n  \"playlists\": \"0\",\n  \"videos\": \"9\"\n}\n```\n\nThe dates in the above examples are JavaScript `Date` objects\n\n#### Get a list of artists\n\n``` js\nconn.get_artists(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"391\": {\n    \"@\": {\n      \"id\": \"391\"\n    },\n    \"name\": \"The American Dollar\",\n    \"tag\": {\n      \"#\": \"Post-Rock\",\n      \"@\": {\n        \"id\": \"7\",\n        \"count\": \"\"\n      }\n    },\n    \"albums\": \"2\",\n    \"songs\": \"24\",\n    \"preciserating\": {},\n    \"rating\": \"0\"\n  },\n  \"392\": {...},\n}\n```\n\n#### Query the Ampache server for a given artist id\n\n``` js\nconn.get_artist(249, function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"@\": {\n    \"id\": \"249\"\n  },\n  \"name\": \"Lights\",\n  \"tag\": {\n    \"#\": \"Pop\",\n    \"@\": {\n      \"id\": \"11\",\n      \"count\": \"\"\n    }\n  },\n  \"albums\": \"1\",\n  \"songs\": \"13\",\n  \"preciserating\": {},\n  \"rating\": \"0\"\n}\n```\n\n#### Ping the ampache server to prolong your session\n\n``` js\nconn.ping(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"session_expire\": \"Fri, 10 Aug 2012 07:05:09 +0000\",\n  \"server\": \"3.6-Alpha1-DEV\",\n  \"version\": \"350001\",\n  \"compatible\": \"350001\"\n}\n```\n\nThe date in the above example is a JavaScript `Date` object\n\nFunctions\n---------\n\n### new AmpacheServer(user, pass, url, [opts])\n\nCreate a new `AmpacheServer` object.  `opts` is an object with the following keys.\n\n`opts.debug`: `boolean` - defaults to false - whether to write debug messages to stderr\n\n---\n\nThe following functions require an `AmpacheServer` object to run\n\nAll callbacks are optional\n\n### conn.authenticate(callback(err, body))\n\nAuthenticate to the server, storing the auth data in the object, and return\nthe body\n\n### conn.ping(callback(err, body))\n\nExtend the session on the server by sending a keep-alive\n\n### conn.get\\_artists, conn.get\\_albums, conn.get\\_songs([search], callback(err, res))\n\nGet a list of all artists/albums/songs on the server, returns a list of objects\n\n`search` is an optional string to filter the results\n\n### conn.get\\_artist, conn.get\\_album, conn.get\\_song(id, callback(err, res))\n\nGet a single artist/album/song by its ID on the server\n\nInstall\n-------\n\n    npm install ampache\n\nTests\n-----\n\nTo test this module, you must copy the `config.json.dist` file in the tests/ folder\nto `config.json`, and populate it with your Ampache server credentials.\n\n    cp tests/config.json{.dist,}\n    $EDITOR tests/config.json\n\nAnd then you can run the tests manually\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"ampache@0.1.0","dist":{"shasum":"83693fa0bc3f2988e6277a0f78a10a5a9b7eb416","tarball":"http://registry.npmjs.org/ampache/-/ampache-0.1.0.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]},"0.1.1":{"name":"ampache","description":"Communicate to an Ampache server using the API","version":"0.1.1","author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/bahamas10/node-ampache.git"},"scripts":{"test":"for f in auth.js ping.js artists.js; do echo \"$f\"; node \"tests/$f\" || exit 1; done; echo 'Passed!'; exit 0"},"dependencies":{"request":"~ 2.10.0","xml2js":"~ 0.1.14","autocast":"~ 0.0.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"keywords":["ampache","owncloud","viridian"],"readme":"Ampache\n=======\n\nCommunicate to an Ampache server using the API\n\nUsage\n-----\n\n``` js\nvar AmpacheSession = require('ampache');\nvar conn = new AmpacheSession('user', 'pass', 'http://example.com/server/xml.server.php');\n```\n\nExamples\n--------\n\n#### Authenticate to an ampache server (assumes `conn` is set from the above usage)\n\n``` js\nconn.authenticate(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"auth\": \"510b0a5f0f0e076ebab1df731acbbaeb\",\n  \"api\": 350001,\n  \"update\": \"2012-05-23T03:32:01+00:00\",\n  \"add\": \"2012-08-07T09:32:17+00:00\",\n  \"clean\": \"2012-08-07T09:32:29+00:00\",\n  \"songs\": 8043,\n  \"albums\": 862,\n  \"artists\": 372,\n  \"playlists\": 0,\n  \"videos\": 9\n}\n```\n\nThe dates in the above examples are JavaScript `Date` objects\n\n#### Get a list of artists\n\n``` js\nconn.get_artists(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"391\": {\n    \"@\": {\n      \"id\": \"391\"\n    },\n    \"name\": \"The American Dollar\",\n    \"tag\": {\n      \"#\": \"Post-Rock\",\n      \"@\": {\n        \"id\": \"7\",\n        \"count\": \"\"\n      }\n    },\n    \"albums\": \"2\",\n    \"songs\": \"24\",\n    \"preciserating\": {},\n    \"rating\": \"0\"\n  },\n  \"392\": {...},\n}\n```\n\n#### Query the Ampache server for a given artist id\n\n``` js\nconn.get_artist(249, function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"@\": {\n    \"id\": \"249\"\n  },\n  \"name\": \"Lights\",\n  \"tag\": {\n    \"#\": \"Pop\",\n    \"@\": {\n      \"id\": \"11\",\n      \"count\": \"\"\n    }\n  },\n  \"albums\": \"1\",\n  \"songs\": \"13\",\n  \"preciserating\": {},\n  \"rating\": \"0\"\n}\n```\n\n#### Ping the ampache server to prolong your session\n\n``` js\nconn.ping(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"session_expire\": \"Fri, 10 Aug 2012 07:05:09 +0000\",\n  \"server\": \"3.6-Alpha1-DEV\",\n  \"version\": \"350001\",\n  \"compatible\": \"350001\"\n}\n```\n\nThe date in the above example is a JavaScript `Date` object\n\nFunctions\n---------\n\n### new AmpacheServer(user, pass, url, [opts])\n\nCreate a new `AmpacheServer` object.  `opts` is an object with the following keys.\n\n`opts.debug`: `boolean` - defaults to false - whether to write debug messages to stderr\n\n---\n\nThe following functions require an `AmpacheServer` object to run\n\nAll callbacks are optional\n\n### conn.authenticate(callback(err, body))\n\nAuthenticate to the server, storing the auth data in the object, and return\nthe body\n\n### conn.ping(callback(err, body))\n\nExtend the session on the server by sending a keep-alive\n\n### conn.get\\_artists, conn.get\\_albums, conn.get\\_songs([search], callback(err, res))\n\nGet a list of all artists/albums/songs on the server, returns a list of objects\n\n`search` is an optional string to filter the results\n\n### conn.get\\_artist, conn.get\\_album, conn.get\\_song(id, callback(err, res))\n\nGet a single artist/album/song by its ID on the server\n\nInstall\n-------\n\n    npm install ampache\n\nTests\n-----\n\nTo test this module, you must copy the `config.json.dist` file in the tests/ folder\nto `config.json`, and populate it with your Ampache server credentials.\n\n    cp tests/config.json{.dist,}\n    $EDITOR tests/config.json\n\nAnd then you can run the tests manually\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"ampache@0.1.1","dist":{"shasum":"797b93202645f554888301e4e928940c4cc58247","tarball":"http://registry.npmjs.org/ampache/-/ampache-0.1.1.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]},"0.1.2":{"name":"ampache","description":"Communicate to an Ampache server using the API","version":"0.1.2","author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/bahamas10/node-ampache.git"},"scripts":{"test":"for f in auth.js ping.js artists.js; do echo \"$f\"; node \"tests/$f\" || exit 1; done; echo 'Passed!'; exit 0"},"dependencies":{"request":"~ 2.10.0","xml2js":"~ 0.1.14","autocast":"~ 0.0.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"keywords":["ampache","owncloud","viridian"],"readme":"Ampache\n=======\n\nCommunicate to an Ampache server using the API\n\nUsage\n-----\n\n``` js\nvar AmpacheSession = require('ampache');\nvar conn = new AmpacheSession('user', 'pass', 'http://example.com/server/xml.server.php');\n```\n\nExamples\n--------\n\n#### Authenticate to an ampache server (assumes `conn` is set from the above usage)\n\n``` js\nconn.authenticate(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"auth\": \"510b0a5f0f0e076ebab1df731acbbaeb\",\n  \"api\": 350001,\n  \"update\": \"2012-05-23T03:32:01+00:00\",\n  \"add\": \"2012-08-07T09:32:17+00:00\",\n  \"clean\": \"2012-08-07T09:32:29+00:00\",\n  \"songs\": 8043,\n  \"albums\": 862,\n  \"artists\": 372,\n  \"playlists\": 0,\n  \"videos\": 9\n}\n```\n\nThe dates in the above examples are JavaScript `Date` objects\n\n#### Get a list of artists\n\n``` js\nconn.get_artists(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"391\": {\n    \"@\": {\n      \"id\": \"391\"\n    },\n    \"name\": \"The American Dollar\",\n    \"tag\": {\n      \"#\": \"Post-Rock\",\n      \"@\": {\n        \"id\": \"7\",\n        \"count\": \"\"\n      }\n    },\n    \"albums\": \"2\",\n    \"songs\": \"24\",\n    \"preciserating\": {},\n    \"rating\": \"0\"\n  },\n  \"392\": {...},\n}\n```\n\n#### Query the Ampache server for a given artist id\n\n``` js\nconn.get_artist(249, function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"@\": {\n    \"id\": \"249\"\n  },\n  \"name\": \"Lights\",\n  \"tag\": {\n    \"#\": \"Pop\",\n    \"@\": {\n      \"id\": \"11\",\n      \"count\": \"\"\n    }\n  },\n  \"albums\": \"1\",\n  \"songs\": \"13\",\n  \"preciserating\": {},\n  \"rating\": \"0\"\n}\n```\n\n#### Ping the ampache server to prolong your session\n\n``` js\nconn.ping(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"session_expire\": \"Fri, 10 Aug 2012 07:05:09 +0000\",\n  \"server\": \"3.6-Alpha1-DEV\",\n  \"version\": \"350001\",\n  \"compatible\": \"350001\"\n}\n```\n\nThe date in the above example is a JavaScript `Date` object\n\nFunctions\n---------\n\n### new AmpacheServer(user, pass, url, [opts])\n\nCreate a new `AmpacheServer` object.  `opts` is an object with the following keys.\n\n`opts.debug`: `boolean` - defaults to false - whether to write debug messages to stderr\n\n---\n\nThe following functions require an `AmpacheServer` object to run\n\nAll callbacks are optional\n\n### conn.authenticate(callback(err, body))\n\nAuthenticate to the server, storing the auth data in the object, and return\nthe body\n\n### conn.ping(callback(err, body))\n\nExtend the session on the server by sending a keep-alive\n\n### conn.get\\_artists, conn.get\\_albums, conn.get\\_songs([search], callback(err, res))\n\nGet a list of all artists/albums/songs on the server, returns a list of objects\n\n`search` is an optional string to filter the results\n\n### conn.get\\_artist, conn.get\\_album, conn.get\\_song(id, callback(err, res))\n\nGet a single artist/album/song by its ID on the server\n\nInstall\n-------\n\n    npm install ampache\n\nTests\n-----\n\nTo test this module, you must copy the `config.json.dist` file in the tests/ folder\nto `config.json`, and populate it with your Ampache server credentials.\n\n    cp tests/config.json{.dist,}\n    $EDITOR tests/config.json\n\nAnd then you can run the tests manually\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"ampache@0.1.2","dist":{"shasum":"2bab68ae39d008c02c6d7244e67d8d2ab9a114ff","tarball":"http://registry.npmjs.org/ampache/-/ampache-0.1.2.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]}},"readme":"Ampache\n=======\n\nCommunicate to an Ampache server using the API\n\nUsage\n-----\n\n``` js\nvar AmpacheSession = require('ampache');\nvar conn = new AmpacheSession('user', 'pass', 'http://example.com/server/xml.server.php');\n```\n\nExamples\n--------\n\nAuthenticate to an ampache server (assumes `conn` is set from the above usage)\n\n``` js\nconn.authenticate(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"auth\": \"510b0a5f0f0e076ebab1df731acbbaeb\",\n  \"api\": \"350001\",\n  \"update\": \"2012-05-23T03:32:01+00:00\",\n  \"add\": \"2012-08-07T09:32:17+00:00\",\n  \"clean\": \"2012-08-07T09:32:29+00:00\",\n  \"songs\": \"8043\",\n  \"albums\": \"862\",\n  \"artists\": \"372\",\n  \"playlists\": \"0\",\n  \"videos\": \"9\"\n}\n```\n\nGet a list of artists\n\n``` js\nconn.get_artists(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"391\": {\n    \"@\": {\n      \"id\": \"391\"\n    },\n    \"name\": \"The American Dollar\",\n    \"tag\": {\n      \"#\": \"Post-Rock\",\n      \"@\": {\n        \"id\": \"7\",\n        \"count\": \"\"\n      }\n    },\n    \"albums\": \"2\",\n    \"songs\": \"24\",\n    \"preciserating\": {},\n    \"rating\": \"0\"\n  },\n  \"392\": {...},\n}\n```\n\nQuery the Ampache server for a given artist id\n\n``` js\nconn.get_artist(249, function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"@\": {\n    \"id\": \"249\"\n  },\n  \"name\": \"Lights\",\n  \"tag\": {\n    \"#\": \"Pop\",\n    \"@\": {\n      \"id\": \"11\",\n      \"count\": \"\"\n    }\n  },\n  \"albums\": \"1\",\n  \"songs\": \"13\",\n  \"preciserating\": {},\n  \"rating\": \"0\"\n}\n```\n\nPing the ampache server to prolong your session\n\n``` js\nconn.ping(function(err, body) {\n  console.log(body);\n});\n```\nyields\n``` json\n{\n  \"session_expire\": \"Fri, 10 Aug 2012 07:05:09 +0000\",\n  \"server\": \"3.6-Alpha1-DEV\",\n  \"version\": \"350001\",\n  \"compatible\": \"350001\"\n}\n```\n\nFunctions\n---------\n\n### new AmpacheServer(user, pass, url, [opts])\n\nCreate a new `AmpacheServer` object.  `opts` is an object with the following keys.\n\n`opts.debug`: `boolean` - defaults to false - whether to write debug messages to stderr\n\n---\n\nThe following functions require an `AmpacheServer` object to run\n\nAll callbacks are optional\n\n### conn.authenticate(callback(err, body))\n\nAuthenticate to the server, storing the auth data in the object, and return\nthe body\n\n### conn.ping(callback(err, body))\n\nExtend the session on the server by sending a keep-alive\n\n### conn.get\\_artists, conn.get\\_albums, conn.get\\_songs([search], callback(err, res))\n\nGet a list of all artists/albums/songs on the server, returns a list of objects\n\n`search` is an optional string to filter the results\n\n### conn.get\\_artist, conn.get\\_album, conn.get\\_song(id, callback(err, res))\n\nGet a single artist/album/song by its ID on the server\n\nInstall\n-------\n\n    npm install ampache\n\nTests\n-----\n\nTo test this module, you must copy the `config.json.dist` file in the tests/ folder\nto `config.json`, and populate it with your Ampache server credentials.\n\n    cp tests/config.json{.dist,}\n    $EDITOR tests/config.json\n\nAnd then you can run the tests manually\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}],"time":{"modified":"2012-08-11T05:46:01.852Z","created":"2012-08-10T07:22:31.786Z","0.0.0":"2012-08-10T07:22:33.171Z","0.1.0":"2012-08-10T07:46:38.925Z","0.1.1":"2012-08-11T03:35:21.309Z","0.1.2":"2012-08-11T05:46:01.852Z"},"author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"repository":{"type":"git","url":"git://github.com/bahamas10/node-ampache.git"},"_attachments":{"ampache-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-PVzOzs6ficSXKPTFRNHvlw==","length":4354,"stub":true},"ampache-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-l0GYgg5AI6So4zklVpI7Wg==","length":4313,"stub":true},"ampache-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5ezpVg/2MRZnKQIKqiU48w==","length":3982,"stub":true},"ampache-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ywrr1sdfQVwiEfK/pJN4Lw==","length":3775,"stub":true}}}},
{"id":"amphibian","key":"amphibian","value":{"rev":"5-1a864e76d844e90bf6c63cb94303b593"},"doc":{"_id":"amphibian","_rev":"5-1a864e76d844e90bf6c63cb94303b593","name":"amphibian","description":"pipe an ssh session to your browser","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"amphibian","description":"pipe an ssh session to your browser","version":"0.0.0","repository":{"type":"git","url":"git://github.com/ecto/amphibian.git"},"engines":{"node":"*"},"bin":{"amp":"amphibian.js"},"dependencies":{"director":"*","broomstick":"*","socket.io":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"amphibian@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"e10cd5215ce822ff8bf6243f5e2cae848fce6c2a","tarball":"http://registry.npmjs.org/amphibian/-/amphibian-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.0.1":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"amphibian","description":"pipe an ssh session to your browser","version":"0.0.1","repository":{"type":"git","url":"git://github.com/ecto/amphibian.git"},"engines":{"node":"*"},"bin":{"amp":"amphibian.js"},"dependencies":{"director":"*","broomstick":"*","socket.io":"*","optimist":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"amphibian@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"9f0225d00facd8e061742e6227a0d7acfc26db77","tarball":"http://registry.npmjs.org/amphibian/-/amphibian-0.0.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"readme":"![](http://i.imgur.com/gIK0a.png)\n\npipe an ssh session to your browser with socket.io\n\n##install\n\n    npm install -g amphibian\n\n##tap on some keys\n\n````\namp -h\namp myServer -p 3000 &\n````\n\n##there's a catch\n\nthis only supports passwordless connections, so you have to have your `~/.ssh/config` set up properly\n\n##license\n\n(The MIT License)\n\nCopyright (c) 2011 Cam Pedersen <cam@onswipe.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2012-02-04T06:24:55.688Z","created":"2012-02-04T06:06:49.540Z","0.0.0":"2012-02-04T06:06:50.441Z","0.0.1":"2012-02-04T06:24:55.688Z"},"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/amphibian.git"},"_attachments":{"amphibian-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hFG4a1D6M+wKZOhNds4xEg==","length":36674,"stub":true},"amphibian-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/UQUmaeYREAEc6rQHGv9UQ==","length":36499,"stub":true}}}},
{"id":"amplifyjsify","key":"amplifyjsify","value":{"rev":"7-bf9fff6b289ae847985a9f7d68492207"},"doc":{"_id":"amplifyjsify","_rev":"7-bf9fff6b289ae847985a9f7d68492207","name":"amplifyjsify","description":"AmplifyJS lib for browsers - AmplifyJS v1.1.0","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"amplifyjsify","description":"AmplifyJS lib for browsers","version":"0.0.1","keywords":["AmplifyJS"],"repository":{"type":"git","url":"git://github.com/AbleCoder/amplifyjsify.git"},"dependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/appendto/amplify/blob/master/MIT-LICENSE.txt"}],"bugs":{"url":"https://github.com/AbleCoder/amplifyjsify/issues"},"homepage":"https://github.com/AbleCoder/amplifyjsify","engines":{"node":"*"},"author":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com","url":"http://AbleCoder.com"},"main":"core","_npmUser":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"},"_id":"amplifyjsify@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"0fa9077fbbe5b38945039cf22b1570f4ed5f28c8","tarball":"http://registry.npmjs.org/amplifyjsify/-/amplifyjsify-0.0.1.tgz"},"readme":"","maintainers":[{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"}]},"0.0.2":{"name":"amplifyjsify","description":"AmplifyJS lib for browsers","version":"0.0.2","keywords":["AmplifyJS"],"repository":{"type":"git","url":"git://github.com/AbleCoder/amplifyjsify.git"},"dependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/appendto/amplify/blob/master/MIT-LICENSE.txt"}],"bugs":{"url":"https://github.com/AbleCoder/amplifyjsify/issues"},"homepage":"https://github.com/AbleCoder/amplifyjsify","engines":{"node":"*"},"author":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com","url":"http://AbleCoder.com"},"main":"./core.js","_npmUser":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"},"_id":"amplifyjsify@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"905bd638825dbee467553188fcefc4159de0bb64","tarball":"http://registry.npmjs.org/amplifyjsify/-/amplifyjsify-0.0.2.tgz"},"readme":"","maintainers":[{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"}]},"0.0.3":{"name":"amplifyjsify","description":"AmplifyJS lib for browsers - AmplifyJS v1.1.0","version":"0.0.3","keywords":["AmplifyJS"],"repository":{"type":"git","url":"git://github.com/AbleCoder/amplifyjsify.git"},"dependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/appendto/amplify/blob/master/MIT-LICENSE.txt"}],"bugs":{"url":"https://github.com/AbleCoder/amplifyjsify/issues"},"homepage":"https://github.com/AbleCoder/amplifyjsify","engines":{"node":"*"},"author":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com","url":"http://AbleCoder.com"},"main":"./index.js","_npmUser":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"},"_id":"amplifyjsify@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"aa71c96285028e740ff327ab427222c4a00a5b9c","tarball":"http://registry.npmjs.org/amplifyjsify/-/amplifyjsify-0.0.3.tgz"},"readme":"","maintainers":[{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"}]}},"readme":"","maintainers":[{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com"}],"time":{"modified":"2012-03-25T10:34:25.338Z","created":"2012-03-25T09:09:45.560Z","0.0.1":"2012-03-25T09:09:46.758Z","0.0.2":"2012-03-25T10:21:53.874Z","0.0.3":"2012-03-25T10:34:25.338Z"},"author":{"name":"AbleCoder","email":"brandon.orther+ablecoder@gmail.com","url":"http://AbleCoder.com"},"repository":{"type":"git","url":"git://github.com/AbleCoder/amplifyjsify.git"},"_attachments":{"amplifyjsify-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-j5X2B4QqVpt+dO55h8D8mw==","length":6198,"stub":true},"amplifyjsify-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8ObO+8TDMAtEmCaaiwbyfw==","length":6147,"stub":true},"amplifyjsify-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UT9tHcBPwmh1JJ+hPR72UA==","length":6150,"stub":true}}}},
{"id":"amqp","key":"amqp","value":{"rev":"24-401000174e124d0ec6c10b88ae69ea8e"},"doc":{"_id":"amqp","_rev":"24-401000174e124d0ec6c10b88ae69ea8e","name":"amqp","description":"AMQP driver for node","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"name":"amqp","version":"0.0.1","description":"amqp bindings for RabbitMQ","author":{"name":"Ryan Dahl"},"main":"./amqp","_id":"amqp@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/amqp/-/amqp-0.0.1.tgz"}},"0.0.2":{"name":"amqp","version":"0.0.2","description":"amqp bindings for RabbitMQ","author":{"name":"Ryan Dahl"},"main":"./amqp","_id":"amqp@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/amqp/-/amqp-0.0.2.tgz"}},"0.0.2-squaremo01.184010":{"name":"amqp","version":"0.0.2-squaremo01.184010","description":"amqp bindings for RabbitMQ","author":{"name":"Ryan Dahl"},"main":"./amqp","_id":"amqp@0.0.2-squaremo01.184010","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/amqp/-/amqp-0.0.2-squaremo01.184010.tgz"}},"0.0.6":{"name":"amqp","description":"AMQP driver for node","keywords":["amqp"],"version":"0.0.6","preferGlobal":true,"author":{"name":"Ryan Dahl"},"contributors":[{"name":"Vasili Sviridov"},{"name":"Theo Schlossnagle"},{"name":"Vincent Desjardins"},{"name":"Liang-Chi Hsieh"},{"name":"Tim Baga"},{"name":"Stéphane Alnet"},{"name":"Alen Mujezinovic"},{"name":"Michael Bridgen"}],"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"bugs":{"url":"http://github.com/postwait/node-amqp/issues"},"main":"./amqp","engines":{"node":"0.4 || 0.5"},"licenses":[{"type":"MIT","url":"http://github.com/postwait/node-amqp/raw/master/LICENSE-MIT"}],"dependencies":{},"devDependencies":{},"_id":"amqp@0.0.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.5-pre","_defaultsLoaded":true,"dist":{"shasum":"47618a88756cccce2ab49e80f258af9630be2293","tarball":"http://registry.npmjs.org/amqp/-/amqp-0.0.6.tgz"},"scripts":{}},"0.0.7":{"name":"amqp","description":"AMQP driver for node","keywords":["amqp"],"version":"0.0.7","preferGlobal":true,"author":{"name":"Ryan Dahl"},"contributors":[{"name":"Vasili Sviridov"},{"name":"Theo Schlossnagle"},{"name":"Vincent Desjardins"},{"name":"Liang-Chi Hsieh"},{"name":"Tim Baga"},{"name":"Stéphane Alnet"},{"name":"Alen Mujezinovic"},{"name":"Michael Bridgen"},{"name":"Chris Bond"}],"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"bugs":{"url":"http://github.com/postwait/node-amqp/issues"},"main":"./amqp","engines":{"node":"0.4 || 0.5"},"licenses":[{"type":"MIT","url":"http://github.com/postwait/node-amqp/raw/master/LICENSE-MIT"}],"dependencies":{},"devDependencies":{},"_id":"amqp@0.0.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.5-pre","_defaultsLoaded":true,"dist":{"shasum":"3c86069872befffa5d8477a308d5e96fb83d2310","tarball":"http://registry.npmjs.org/amqp/-/amqp-0.0.7.tgz"},"scripts":{}},"0.1.0":{"name":"amqp","description":"AMQP driver for node","keywords":["amqp"],"version":"0.1.0","preferGlobal":true,"author":{"name":"Ryan Dahl"},"contributors":[{"name":"Vasili Sviridov"},{"name":"Theo Schlossnagle"},{"name":"Vincent Desjardins"},{"name":"Liang-Chi Hsieh"},{"name":"Tim Baga"},{"name":"Stéphane Alnet"},{"name":"Alen Mujezinovic"},{"name":"Michael Bridgen"},{"name":"Chris Bond"}],"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"bugs":{"url":"http://github.com/postwait/node-amqp/issues"},"main":"./amqp","engines":{"node":"0.4 || 0.5"},"licenses":[{"type":"MIT","url":"http://github.com/postwait/node-amqp/raw/master/LICENSE-MIT"}],"dependencies":{},"devDependencies":{},"_id":"amqp@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.5-pre","_defaultsLoaded":true,"dist":{"shasum":"2a7717252f1bac92ffc8d44c49badc64b12b9719","tarball":"http://registry.npmjs.org/amqp/-/amqp-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"amqp","description":"AMQP driver for node","keywords":["amqp"],"version":"0.1.1","preferGlobal":true,"author":{"name":"Ryan Dahl"},"contributors":[{"name":"Vasili Sviridov"},{"name":"Theo Schlossnagle"},{"name":"Vincent Desjardins"},{"name":"Liang-Chi Hsieh"},{"name":"Tim Baga"},{"name":"Stéphane Alnet"},{"name":"Alen Mujezinovic"},{"name":"Michael Bridgen"},{"name":"Chris Bond"}],"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"bugs":{"url":"http://github.com/postwait/node-amqp/issues"},"main":"./amqp","engines":{"node":"0.4 || 0.5 || 0.6"},"licenses":[{"type":"MIT","url":"http://github.com/postwait/node-amqp/raw/master/LICENSE-MIT"}],"_npmUser":{"name":"postwait","email":"jesus@omniti.com"},"_id":"amqp@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.5.9-pre","_defaultsLoaded":true,"dist":{"shasum":"06c22703fc8dddb40478c6f3b553f6b55cc2f71a","tarball":"http://registry.npmjs.org/amqp/-/amqp-0.1.1.tgz"},"maintainers":[{"name":"ry","email":"ry@tinyclouds.org"},{"name":"postwait","email":"jesus@omniti.com"}]},"0.1.2":{"name":"amqp","description":"AMQP driver for node","keywords":["amqp"],"version":"0.1.2","preferGlobal":true,"author":{"name":"Ryan Dahl"},"contributors":[{"name":"Vasili Sviridov"},{"name":"Theo Schlossnagle"},{"name":"Vincent Desjardins"},{"name":"Liang-Chi Hsieh"},{"name":"Tim Baga"},{"name":"Stéphane Alnet"},{"name":"Alen Mujezinovic"},{"name":"Michael Bridgen"},{"name":"Chris Bond"}],"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"bugs":{"url":"http://github.com/postwait/node-amqp/issues"},"main":"./amqp","engines":{"node":"0.4 || 0.5 || 0.6"},"licenses":[{"type":"MIT","url":"http://github.com/postwait/node-amqp/raw/master/LICENSE-MIT"}],"_npmUser":{"name":"postwait","email":"jesus@omniti.com"},"_id":"amqp@0.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.5.9-pre","_defaultsLoaded":true,"dist":{"shasum":"d5bfa2bdad1fd6f59990d6aeab162637f5d32058","tarball":"http://registry.npmjs.org/amqp/-/amqp-0.1.2.tgz"},"maintainers":[{"name":"ry","email":"ry@tinyclouds.org"},{"name":"postwait","email":"jesus@omniti.com"}]},"0.1.3":{"name":"amqp","description":"AMQP driver for node","keywords":["amqp"],"version":"0.1.3","preferGlobal":true,"author":{"name":"Ryan Dahl"},"contributors":[{"name":"Vasili Sviridov"},{"name":"Theo Schlossnagle"},{"name":"Vincent Desjardins"},{"name":"Liang-Chi Hsieh"},{"name":"Tim Baga"},{"name":"Stéphane Alnet"},{"name":"Alen Mujezinovic"},{"name":"Michael Bridgen"},{"name":"Chris Bond"},{"name":"Andrei Vereha"},{"name":"Mike Bardzinski"},{"name":"James Carr"}],"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"bugs":{"url":"http://github.com/postwait/node-amqp/issues"},"main":"./amqp","engines":{"node":"0.4 || 0.5 || 0.6"},"licenses":[{"type":"MIT","url":"http://github.com/postwait/node-amqp/raw/master/LICENSE-MIT"}],"_npmUser":{"name":"postwait","email":"jesus@omniti.com"},"_id":"amqp@0.1.3","dependencies":{},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"af812565b40f0b515001986483849b3642f07d74","tarball":"http://registry.npmjs.org/amqp/-/amqp-0.1.3.tgz"},"readme":"# node-amqp\n\nIMPORTANT: This module only works with node v0.4.0 and later.\n\nThis is a client for RabbitMQ (and maybe other servers?). It partially\nimplements the 0.9.1 version of the AMQP protocol.\n\n## Installation\n\n    npm install amqp\n\n## Synopsis\n\nAn example of connecting to a server and listening on a queue.\n\n```javascript\nvar amqp = require('amqp');\n\nvar connection = amqp.createConnection({ host: 'dev.rabbitmq.com' });\n\n// Wait for connection to become established.\nconnection.on('ready', function () {\n  // Create a queue and bind to all messages.\n  // Use the default 'amq.topic' exchange\n  connection.queue('my-queue', function(q){\n      // Catch all messages\n      q.bind('#');\n    \n      // Receive messages\n      q.subscribe(function (message) {\n        // Print messages to stdout\n        console.log(message);\n      });\n  });\n});\n```\n\n## Connection\n\n`new amqp.Connection()` Instantiates a new connection. Use\n`connection.connect()` to connect to a server.\n\n`amqp.createConnection()` returns an instance of `amqp.Connection`, which is\na subclass of `net.Stream`. All the event and methods which work on\n`net.Stream` can also be used on an `amqp.Connection` instance. (e.g., the\nevents `'connected'` and `'closed'`.)\n\n### Connection options and URL\n\n`amqp.createConnection([options, [implOptions]])` takes two options\nobjects as parameters.  The first options object has these defaults:\n\n    { host: 'localhost'\n    , port: 5672\n    , login: 'guest'\n    , password: 'guest'\n    , vhost: '/'\n    }\n\nAll of these can be passed in a single URL of the form\n\n    amqp[s]://[user:password@]hostname[:port][/vhost]\n\nNote that the vhost must be URL-encoded and appear as the only segment\nof the path, i.e., the only unencoded slash is that leading; leaving\nthe path entirely empty indicates that the vhost `/`, as\nabove, should be used (it could also be supplied as the path `/%2f`).\n\nThis URL is supplied as the field `url` in the options; for example\n\n```javascript\nvar conn =\n  amqp.createConnection({url: \"amqp://guest:guest@localhost:5672\"});\n\n```\n\n\nOptions provided as individual fields will override values given in\nthe URL.\n\nThe second options are specific to the node AMQP implementation. It has\nthe default values:\n\n    { defaultExchangeName: '' }\n\nThe defaultExchangeName is the default exchange to which\nconnection.publish will publish. In the past, the default exchange was\n`amq.topic`, which is not ideal.  To emulate this behaviour, one can\ncreate a connection like:\n\n```javascript\nvar conn =\n  amqp.createConnection({url: \"amqp://guest:guest@localhost:5672\"},\n                        {defaultExchangeName: \"amq.topic\"});\n```\n\n\nAfter a connection is established the `'connect'` event is fired as it is\nwith any `net.Connection` instance. AMQP requires a 7-way handshake which\nmust be completed before any communication can begin. `net.Connection` does\nthe handshake automatically and emits the `'ready'` event when the handshaking\nis complete.\n\nFor backward compatability, two additional options are available. Older\nversions of this library placed the routingKey and deliveryTag for incoming\nmessages into the JSON payload received. This module was changed to\nleave inbound JSON payloads pristine.  Some applications may need the\nold behaviour. If the key 'routingKeyInPayload' is set to true in the\nconnection options, the messages resulting from a subscribe call will\ninclude a 'routingKey' key in the JSON payload.  If the key\n'devliryTagInPayload' is set to true in the connection options, the\ndeliveryTag of the incoming message will be placed in the JSON payload.\n\n\n### connection.publish(queueName, body)\n\nPublishes a message to the default exchange; if the defaultExchange is\nleft as `''`, this effectively publishes the message to the queue\nnamed.\n\n### connection.end()\n\n`amqp.Connection` is derived from `net.Stream` and has all the same methods.\nSo use `connection.end()` to terminate a connection gracefully.\n\n\n\n\n## Queue\n\nEvents: A queue will call the callback given to the `connection.queue()`\nmethod once it is usable. For example:\n\n```javascript\nvar q = connection.queue('my-queue', function (queue) {\n  console.log('Queue ' + queue.name + ' is open');\n});\n```\n\n\nDeclaring a queue with an empty name will make the server generate a\nrandom name.\n\n### connection.queue(name, options, openCallback)\n\nReturns a reference to a queue. The options are\n\n- `passive`: boolean, default false.\n    If set, the server will not create the queue.  The client can use\n    this to check whether a queue exists without modifying the server\n    state.\n- `durable`: boolean, default false.\n    Durable queues remain active when a server restarts.\n    Non-durable queues (transient queues) are purged if/when a\n    server restarts.  Note that durable queues do not necessarily\n    hold persistent messages, although it does not make sense to\n    send persistent messages to a transient queue.\n- `exclusive`: boolean, default false.\n    Exclusive queues may only be consumed from by the current connection.\n    Setting the 'exclusive' flag always implies 'autoDelete'.\n- `autoDelete`: boolean, default true.\n    If set, the queue is deleted when all consumers have finished\n    using it. Last consumer can be cancelled either explicitly or because\n    its channel is closed. If there was no consumer ever on the queue, it\n    won't be deleted.\n\n### queue.subscribe([options,] listener)\n\nAn easy subscription command. It works like this\n\n```javascript\nq.subscribe(function (message, headers, deliveryInfo) {\n  console.log('Got a message with routing key ' + deliveryInfo.routingKey);\n});\n    \n```\n\nIt will automatically acknowledge receipt of each message.\n\nThere are several options available.  Setting the options argument to\n`{ ack: true }` (which defaults to false) will make it so that the AMQP\nserver only delivers a single message at a time. When you want the next\nmessage, call `q.shift()`. When `ack` is false then you will receive\nmessages as fast as they come in. \n\nYou can also use the prefetchCount option to increase the window of how\nmany messages the server will send you before you need to ack (quality of service).\n'{ ack: true, prefetchCount: 1 }' is the default and will only send you one\nmessage before you ack. Setting prefetchCount to 0 will make that window unlimited.\n\nThe 'routingKeyInPayload' and 'deliveryKeyInPayload' options determine\nif the reception process will inject the routingKey and deliveryKey,\nrespectively, into the JSON payload received.  These default to unset\nthus adopting the parent connection's values (which default to false).\nSetting these to true provide backward compability for older\napplications.\n\nThis method will emit `'basicQosOk'` when ready.\n\n\n### queue.subscribeRaw([options,] listener)\n\nSubscribes to a queue. The `listener` argument should be a function which\nreceives a message. This is a low-level interface - the message that the\nlistener receives will be a stream of binary data. You probably want to use\n`subscribe` instead. For now this low-level interface is left undocumented.\nLook at the source code if you need to do this.\n\nThis method will emit `'basicConsumeOk'` when ready.\n\n### queue.unsubscribe(consumerTag)\n\nUnsubscribe from a queue, given the consumer tag. The consumer tag is\nsupplied to the *promise callback* of `Queue.subscribeRaw` or\n`Queue.subscribe`:\n\n```javascript\nconnection.queue('foo', function(queue) {\n  var ctag;\n  queue.subscribe(function(msg) {...})\n    .addCallback(function(ok) { ctag = ok.consumerTag; });\n  // ... and in some other callback\n  queue.unsubscribe(ctag);\n});\n```\n\nNote that `Queue.unsubscribe` will not requeue messages that have not\nbeen acknowledged. You need to close the queue or connection for that\nto happen. You may also receive messages after calling `unsubscribe`;\nyou will **not** receive messages from the queue after the unsubscribe\npromise callback has been invoked, however.\n\n### queue.shift()\n\nFor use with `subscribe({ack: true}, fn)`. Acknowledges the last\nmessage.\n\n\n### queue.bind([exchange,] routing)\n\nThis method binds a queue to an exchange.  Until a queue is\nbound it will not receive any messages, unless they are sent through\nthe unnamed exchange (see `defaultExchangeName` above).\n\nIf the `exchange` argument is left out `'amq.topic'` will be used.\n\nThis method will emit `'queueBindOk'` when ready.\n\n### queue.bind_headers([exchange,] routing)\n\nThis method binds a queue to an exchange.  Until a queue is\nbound it will not receive any messages.\n\nThis method is to be used on an \"headers\"-type exchange. The routing\nargument must contain the routing keys and the `x-match` value (`all` or `any`).\n\nIf the `exchange` argument is left out `'amq.headers'` will be used.\n\n### queue.destroy(options)\n\nDelete the queue. Without options, the queue will be deleted even if it has\npending messages or attached consumers. If +options.ifUnused+ is true, then\nthe queue will only be deleted if there are no consumers. If\n+options.ifEmpty+ is true, the queue will only be deleted if it has no\nmessages.\n\n\n\n\n## Exchange\n\nEvents: An exchange will call the callback given to the `connection.exchange()`\nmethod once it is usable. For example:\n\n```javascript\nvar exc = connection.exchange('my-exchange', function (exchange) {\n  console.log('Exchange ' + exchange.name + ' is open');\n});\n```\n\n### exchange.on('open', callback)\n\nThe open event is emitted when the exchange is declared and ready to\nbe used. This interface is considered deprecated.\n\n\n### connection.exchange()\n### connection.exchange(name, options={}, openCallback)\n\nAn exchange can be created using `connection.exchange()`. The method returns\nan `amqp.Exchange` object.\n\nWithout any arguments, this method returns the default exchange.\nOtherwise a string, `name`, is given as the first argument and an `options`\nobject for the second. The options are\n\n- `type`: the type of exchange `'direct'`, `'fanout'`, or `'topic'` (default).\n- `passive`: boolean, default false.\n    If set, the server will not create the exchange.  The client can use\n    this to check whether an exchange exists without modifying the server\n    state.\n- `durable`: boolean, default false.\n    If set when creating a new exchange, the exchange will be marked as\n    durable.  Durable exchanges remain active when a server restarts.\n    Non-durable exchanges (transient exchanges) are purged if/when a\n    server restarts.\n- `autoDelete`: boolean, default true.\n    If set, the exchange is deleted when there are no longer queues\n    bound to it.\n\nAn exchange will emit the `'open'` event when it is finally declared.\n\n\n### exchange.publish(routingKey, message, options)\n\nPublishes a message to the exchange. The `routingKey` argument is a string\nwhich helps routing in `topic` and `direct` exchanges. The `message` can be\neither a Buffer or Object. A Buffer is used for sending raw bytes; an Object\nis converted to JSON.\n\n`options` is an object with any of the following\n\n- `mandatory`: boolean, default false.\n    This flag tells the server how to react if the message cannot be\n    routed to a queue.  If this flag is set, the server will return an\n    unroutable message with a Return method.  If this flag is false, the\n    server silently drops the message.\n- `immediate`: boolean, default false.\n    This flag tells the server how to react if the message cannot be\n    routed to a queue consumer immediately.  If this flag is set, the\n    server will return an undeliverable message with a Return method.\n    If this flag is false, the server will queue the message, but with\n    no guarantee that it will ever be consumed.\n- `contentType`: default `'application/octet-stream'`\n- `contentEncoding`: default null.\n- `headers`: default `{}`. Arbitrary application-specific message headers.\n- `deliveryMode`: Non-persistent (1) or persistent (2)\n- `priority`: The message priority, 0 to 9.\n- `replyTo`: Usually used to name a reply queue for a request message.\n\n### exchange.destroy(ifUnused = true)\n\nDeletes an exchange.\nIf the optional boolean second argument is set, the server will only\ndelete the exchange if it has no queue bindings. If the exchange has queue\nbindings the server does not delete it but raises a channel exception\ninstead.\n","maintainers":[{"name":"ry","email":"ry@tinyclouds.org"},{"name":"postwait","email":"jesus@omniti.com"}]}},"maintainers":[{"name":"ry","email":"ry@tinyclouds.org"},{"name":"postwait","email":"jesus@omniti.com"}],"author":{"name":"Ryan Dahl"},"time":{"modified":"2012-08-02T13:34:18.305Z","created":"2011-05-26T17:36:58.769Z","0.0.1":"2011-05-26T17:36:58.769Z","0.0.2":"2011-05-26T17:36:58.769Z","0.0.2-squaremo01.184010":"2011-05-26T17:36:58.769Z","0.0.6":"2011-05-26T17:38:23.766Z","0.0.7":"2011-06-02T21:41:24.522Z","0.1.0":"2011-07-30T13:48:49.682Z","0.1.1":"2011-11-09T10:13:16.126Z","0.1.2":"2012-02-03T21:06:40.789Z","0.1.3":"2012-04-17T13:35:29.358Z"},"repository":{"type":"git","url":"git://github.com/postwait/node-amqp.git"},"users":{"fgribreau":true},"_attachments":{"amqp-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-QMqQrZulQ3OCzneiEAN/5Q==","length":54493,"stub":true},"amqp-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-oxNM6i0wPqWF2848l3I9MA==","length":61440,"stub":true},"amqp-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-vOYi0B7Ux2CTnKhqBfYxFw==","length":61440,"stub":true},"amqp-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-IY3CA09XGOzhVNoLg5HlqQ==","length":51381,"stub":true},"amqp-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-m5dnOB6lliiKqMCoZ9woUg==","length":48866,"stub":true},"amqp-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-JzR4gOYdOVEOdkQrq5wF9w==","length":44811,"stub":true},"amqp-0.0.2-squaremo01.184010.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-dOgpfD/5NtGXNxPcEGbQyQ==","length":45553,"stub":true},"amqp-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-LTVKiuf5/3dI4LLg4Zql/g==","length":51933,"stub":true},"amqp-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R0CanZlpcYyCwtbu02ireg==","length":50462,"stub":true}}}},
{"id":"amqp-dsl","key":"amqp-dsl","value":{"rev":"5-096a2c05045117bb4f1cc342232a88d5"},"doc":{"_id":"amqp-dsl","_rev":"5-096a2c05045117bb4f1cc342232a88d5","name":"amqp-dsl","description":"Amqp-DSL - Fluent interface for node-amqp","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"amqp-dsl","description":"Amqp-DSL - Fluent interface for node-amqp","keywords":["amqp","dsl"],"version":"1.0.0","homepage":"https://github.com/FGRibreau/node-amqp-dsl","repository":"","dependencies":{"coffee-script":"1.0.0","async":"0.1.x","amqp":"0.1.x","docco":"0.3.x"},"devDependencies":{"vows":"0.6.x"},"scripts":{"test":"./node_modules/vows/bin/vows --spec"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"main":"lib/AmqpDsl","engines":{"node":">= 0.4.12"},"_npmUser":{"name":"fgribreau","email":"npm@fgribreau.com"},"_id":"amqp-dsl@1.0.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"120b6359de3951d47ed2c572590da6a857ac84b4","tarball":"http://registry.npmjs.org/amqp-dsl/-/amqp-dsl-1.0.0.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]},"1.0.1":{"name":"amqp-dsl","description":"Amqp-DSL - Fluent interface for node-amqp","keywords":["amqp","dsl"],"version":"1.0.1","homepage":"https://github.com/FGRibreau/node-amqp-dsl","repository":"","dependencies":{"coffee-script":"1.0.0","async":"0.1.x","amqp":"0.1.x","docco":"0.3.x"},"devDependencies":{"vows":"0.6.x"},"scripts":{"test":"./node_modules/vows/bin/vows --spec"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"main":"lib/AmqpDsl","engines":{"node":">= 0.4.12"},"_npmUser":{"name":"fgribreau","email":"npm@fgribreau.com"},"_id":"amqp-dsl@1.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"e19b43f6966429829910d15b85e40cf491519776","tarball":"http://registry.npmjs.org/amqp-dsl/-/amqp-dsl-1.0.1.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]}},"readme":"## Fluent Interface for dealing with AMQP on NodeJS [![Build Status](https://secure.travis-ci.org/FGRibreau/node-amqp-dsl.png)](http://travis-ci.org/FGRibreau/node-amqp-dsl) ##\n\nAMQP-DSL is a [fluent interface](http://en.wikipedia.org/wiki/Fluent_interface) wrapper for [node-amqp](https://github.com/postwait/node-amqp) and help you write AMQP binding code in a clean and efficient way.\n\n## Installation\n\n    $ npm install amqp-dsl\n\n## Usage overview\n\n### Simple connection (more details: `docs/example-connection`)\n\n```coffeescript\n\namqp = require 'amqp-dsl'\n\namqp.login(\n\n  login: 'user'\n  password: 'password'\n  host: 'localhost'\n\n).connect((err, amqp) ->\n\n  if err\n    throw err\n    return\n  \n  console.log 'We are connected !'\n  \n)\n```\n\n### Simple example (more details: `docs/example-simple`)\n\n```coffeescript\n\nAmqpDsl = require 'amqp-dsl'\n\nAmqpDsl.login(\n  login: 'legen'\n  password: 'dary'\n)\n.on( 'close', () -> console.error \"RabbitMQ connection closed\" )\n.on( 'error', (err) -> console.error \"RabbitMQ error\", err )\n.on( 'ready', () -> console.log \"Connected to RabbitMQ\" )\n\n.queue( 'testQueue', (queue) -> console.log \"Connected to Queue\", queue.name )\n  .bind( 'stream', '#' )\n  .subscribe( (message, header, deliveryInfo) -> )\n\n.queue( 'queue2' )\n  .bind( 'search', '#.ok' )\n\n.queue( 'queue3', passive:true )\n\n.connect( (err, amqp) ->\n\n  if err\n    throw err\n    return\n\n  # Do other stuff with `amqp` like subscribing to a queue\n\n  queue3 = amqp.queues.queue3\n  \n  queue3.subscribe( ack:true, ( message, header, deliveryInfo ) ->\n    console.log \"Hey ! We got one new message !\"\n    queue3.shift()\n  )\n\n)\n```\n\nSee `examples/` and `docs/` for more information.\n\n## API\n\n### .login\n * `login( options = {} )`\n\n### .on\n * `on( event, listener )`\n\n### .exchange\n * `.exchange( name, options )`\n * `.exchange( name, callback(exchange) )`\n * `.exchange( name, options, callback(exchange) )`\n\n### .queue\n * `.queue( name, options )`\n * `.queue( name, callback(queue) )`\n * `.queue( name, options, callback(queue) )`\n\n### .queue(...).subscribe\n * `.subscribe( callback(message, header, deliveryInfo) )`\n * `.subscribe( options, callback(message, header, deliveryInfo) )`\n\n### .queue(...).bind\n * `.bind( name, routingKey )`\n\n### .connect\n * `.connect( amqp, callback(err, amqp) )`\n * `.connect( callback(err, amqp) )`\n \nThe `amqp` argument is simply hashtable with the following properties:\n\n * queues (hashtable of `AMQP::queues`)\n * exchanges (hashtable of `AMQP::Exchange`)\n * connection (`AMQP::Connection`)\n\n\n## Documentation\n\n### Build documentation\n    $ cake doc\n\n... and browse `docs/`\n\n## Test\n  \n    $ npm test","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}],"time":{"modified":"2011-12-01T14:41:29.173Z","created":"2011-12-01T14:27:59.828Z","1.0.0":"2011-12-01T14:28:01.478Z","1.0.1":"2011-12-01T14:41:29.173Z"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"_attachments":{"amqp-dsl-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Cs2/uyJ2AbM/VRKk8K6kSA==","length":20480,"stub":true},"amqp-dsl-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7pt5v+siGuQzuU+vmDQ3+g==","length":20480,"stub":true}}}},
{"id":"amqp-mock","key":"amqp-mock","value":{"rev":"3-0f0c388eb8cab7003cb15b86fdb0a834"},"doc":{"_id":"amqp-mock","_rev":"3-0f0c388eb8cab7003cb15b86fdb0a834","name":"amqp-mock","description":"AMQP mocking and expectations library","dist-tags":{"latest":"0.1.3-1"},"versions":{"0.1.3-1":{"name":"amqp-mock","author":{"name":"Ricardo Stuven","email":"rstuven@gmail.com"},"description":"AMQP mocking and expectations library","version":"0.1.3-1","repository":{"type":"git","url":"git://github.com/rstuven/node-amqp-mock.git"},"main":"lib/intercept","scripts":{"test":"mocha -R spec"},"dependencies":{"amqp":"=0.1.3"},"devDependencies":{"mocha":"*","sinon":"*","chai":"*","sinon-chai":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"rstuven","email":"rstuven@gmail.com"},"_id":"amqp-mock@0.1.3-1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"658c92cb278ac3a66997c627670df858cef7d240","tarball":"http://registry.npmjs.org/amqp-mock/-/amqp-mock-0.1.3-1.tgz"},"maintainers":[{"name":"rstuven","email":"rstuven@gmail.com"}]}},"readme":"# node-amqp-mock\n\nThis is a mocking and expectations library for node-amqp\ninspired by [nock](https://github.com/flatiron/nock).\n\n## Usage\n\nOn your test, you can setup your mocking object like this:\n\n```javascript\n    var amqp = require('amqp');\n    var amqpmock = require('amqp-mock');\n\n    var scope = amqpmock({url: 'amqp://guest:guest@localhost:5672'})\n        .exchange('topic_animals', {type: 'topic'})\n            .publish('quick.orange.rabbit', 'Hello')\n            .publish('lazy.brown.fox', 'World')\n        .exchange('work', {type: 'fanout'})\n            .publish('', 'approve', {ack: true}) // expect to be acknowledged\n            .publish('', 'disapprove', {ack: false}) // expect to be not acknowledged\n        ;\n\n    var connection = amqp.createConnection({url: 'amqp://guest:guest@localhost:5672'});\n\n    connection.on('ready', function(){\n        connection.exchange('topic_animals', {type:'topic'}, function(exchange){\n            connection.queue('', function(queue){\n\n                queue.bind(exchange.name, '*.*.rabbit');\n                queue.bind(exchange.name, 'lazy.#');\n\n                queue.subscribe({ack: false}, function(message){\n                    console.log(message.data);\n                });\n            });\n        });\n        connection.exchange('work', {type:'fanout'}, function(exchange){\n            connection.queue('', function(queue){\n\n                queue.bind(exchange.name, '');\n\n                queue.subscribe({ack: true}, function(message){\n                    console.log(message.data);\n                    if (message.data === 'approve')\n                        queue.shift();\n                });\n            });\n        });\n    });\n\n    setTimeout(function(){\n        // This will assert that all specified calls on the scope were performed.\n        scope.done();\n    }, 10);\n```\n\n## Versioning\n\nSince we depend on node-amqp internals and public API, node-amqp-mock version number\nis aligned with node-amqp version. A build number is added to specify updates.\n\nFor example, node-amqp-mock 0.1.2-3 would be the third revision compatible\nwith node-amqp 0.1.2\n\n","maintainers":[{"name":"rstuven","email":"rstuven@gmail.com"}],"time":{"modified":"2012-04-30T03:47:24.805Z","created":"2012-04-30T03:47:24.088Z","0.1.3-1":"2012-04-30T03:47:24.805Z"},"author":{"name":"Ricardo Stuven","email":"rstuven@gmail.com"},"repository":{"type":"git","url":"git://github.com/rstuven/node-amqp-mock.git"},"_attachments":{"amqp-mock-0.1.3-1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qhP6W3WHx3hAmOt23+FcAw==","length":3350,"stub":true}}}},
{"id":"amqp-stats","key":"amqp-stats","value":{"rev":"8-1f434051d47e12e951eb09bd3a8bb77f"},"doc":{"_id":"amqp-stats","_rev":"8-1f434051d47e12e951eb09bd3a8bb77f","name":"amqp-stats","description":"Interface for RabbitMQ Management statistics. http://www.rabbitmq.com/management.html","dist-tags":{"latest":"0.0.12"},"versions":{"0.0.0":{"author":{"name":"Tim Atkinson","email":"tim@gochime.com","url":"http://timisbusy.com"},"name":"amqp-stats","description":"Interface for RabbitMQ Management statistics. http://www.rabbitmq.com/management.html","version":"0.0.0","repository":{"url":""},"main":"index.js","engines":{"node":"~0.6.9"},"dependencies":{"request":"2.9.200","qs":"0.4.2"},"devDependencies":{},"_npmUser":{"name":"timisbusy","email":"timisbusy@gmail.com"},"_id":"amqp-stats@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4f4fe5a83d23ad6819c72a073e53d31670476a85","tarball":"http://registry.npmjs.org/amqp-stats/-/amqp-stats-0.0.0.tgz"},"maintainers":[{"name":"timisbusy","email":"timisbusy@gmail.com"}]},"0.0.11":{"author":{"name":"Tim Atkinson","email":"tim@gochime.com","url":"http://timisbusy.com"},"name":"amqp-stats","description":"Interface for RabbitMQ Management statistics. http://www.rabbitmq.com/management.html","version":"0.0.11","repository":{"url":"https://github.com/timisbusy/node-amqp-stats"},"main":"index.js","engines":{"node":"~0.6.9"},"dependencies":{"request":"2.9.200","qs":"0.4.2"},"devDependencies":{},"_npmUser":{"name":"timisbusy","email":"timisbusy@gmail.com"},"_id":"amqp-stats@0.0.11","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"6fa0145c917088c123136cd4805320cbfc85d68b","tarball":"http://registry.npmjs.org/amqp-stats/-/amqp-stats-0.0.11.tgz"},"maintainers":[{"name":"timisbusy","email":"timisbusy@gmail.com"}]},"0.0.12":{"author":{"name":"Tim Atkinson","email":"tim@gochime.com","url":"http://timisbusy.com"},"name":"amqp-stats","description":"Interface for RabbitMQ Management statistics. http://www.rabbitmq.com/management.html","version":"0.0.12","repository":{"url":"https://github.com/timisbusy/node-amqp-stats"},"main":"index.js","engines":{"node":"~0.6.0"},"dependencies":{"request":"2.9.200","qs":"0.4.2"},"devDependencies":{},"_npmUser":{"name":"timisbusy","email":"timisbusy@gmail.com"},"_id":"amqp-stats@0.0.12","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"b82d96435dcf14f715ba5f29003ca7192aa51a2c","tarball":"http://registry.npmjs.org/amqp-stats/-/amqp-stats-0.0.12.tgz"},"maintainers":[{"name":"timisbusy","email":"timisbusy@gmail.com"}]}},"readme":"# Node.js Interface for RabbitMQ Management Statistics\n\n### This package creates an easy interface for getting statistics from a RabbitMQ instance with the management plugin installed. Read more about the management plugin here:\n\n- http://www.rabbitmq.com/management.html\n- http://hg.rabbitmq.com/rabbitmq-management/raw-file/rabbitmq_v2_8_1/priv/www/api/index.html\n\n## Required\n\nYou will need:\n\n1. An instance of RabbitMQ (running locally or in the cloud)\n2. The Management Plugin\n\n## Installation\n\n    npm install amqp-stats\n\n## Usage\n\nRequire the amqp-stats package: \n\n    var AMQPStats = require('amqp-stats');\n\nInstantiate and provide authentication details (defaults to standard setup for a local instance). \n\n    var stats = new AMQPStats({\n      username: \"AMQP_USERNAME\", // default: guest\n      password: \"AMQP_PASSWORD\", // default: guest\n      hostname: \"AMQP_HOSTNAME\"  // default: localhost:55672\n    });\n\nNOTE: for AMQP instances running on heroku, the hostname should look something like: \n\n    heroku.srs.rabbitmq.com/rabbitmq/sdaewywqh\n\nFrom there you can use the stats instance to get data about your system's usage:\n\n    stats.overview(function(err, res, data){\n      if (err) { throw err; }\n      console.log('data: ', data);\n    });\n\nThis will return a list of your queues with lots of data about their rate of use, total messages sent, etc:\n\n    stats.queues(callback);\n\nNote that when you lack admin priviledges (on heroku instances for example) you may not be able to get at certain parts of this API. You can check your status with:\n    \n    stats.whoami(callback);","maintainers":[{"name":"timisbusy","email":"timisbusy@gmail.com"}],"time":{"modified":"2012-08-02T13:44:15.793Z","created":"2012-04-24T14:15:49.967Z","0.0.0":"2012-04-24T14:15:50.886Z","0.0.11":"2012-04-24T17:56:28.377Z","0.0.12":"2012-07-26T13:37:29.830Z"},"author":{"name":"Tim Atkinson","email":"tim@gochime.com","url":"http://timisbusy.com"},"repository":{"url":"https://github.com/timisbusy/node-amqp-stats"},"users":{"fgribreau":true},"_attachments":{"amqp-stats-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-IqX8Zp8RKHOniKP4eixvTw==","length":2542,"stub":true},"amqp-stats-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/u+ttPy0irVlf/65U2veaQ==","length":2537,"stub":true},"amqp-stats-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kRSKq/qZlIK5M9v0cfFaaQ==","length":2515,"stub":true}}}},
{"id":"amqp-tool","key":"amqp-tool","value":{"rev":"7-c5502191cecc54f0ee90b78653f6c0bd"},"doc":{"_id":"amqp-tool","_rev":"7-c5502191cecc54f0ee90b78653f6c0bd","name":"amqp-tool","description":"Rabbitmq-tool - import/export data from a RabbitMQ broker","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"amqp-tool","description":"Rabbitmq-tool - import/export data from a RabbitMQ broker","keywords":["amqp","rabbitmq","tool","export","import"],"version":"0.0.1","homepage":"https://github.com/FGRibreau/node-amqp-tool","repository":{"type":"git","url":"git://github.com/FGRibreau/node-amqp-tool.git"},"dependencies":{"optimist":"0.3.0","amqp-dsl":"*","lazy":"1.0.7"},"bin":{"amqp-tool":"./bin/amqp-tool","rabbitmq-tool":"./bin/amqp-tool"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"engines":{"node":">= 0.4.12"},"_npmUser":{"name":"fgribreau","email":"npm@fgribreau.com"},"_id":"amqp-tool@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a1110661bfaf56a01b7a6f5265662cdbc490081c","tarball":"http://registry.npmjs.org/amqp-tool/-/amqp-tool-0.0.1.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]},"0.0.2":{"name":"amqp-tool","description":"Rabbitmq-tool - import/export data from a RabbitMQ broker","keywords":["amqp","rabbitmq","tool","export","import"],"version":"0.0.2","homepage":"https://github.com/FGRibreau/node-amqp-tool","repository":{"type":"git","url":"git://github.com/FGRibreau/node-amqp-tool.git"},"dependencies":{"optimist":"0.3.0","amqp-dsl":"*","lazy":"1.0.7"},"bin":{"amqp-tool":"./bin/amqp-tool","rabbitmq-tool":"./bin/amqp-tool"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"engines":{"node":">= 0.4.12"},"_npmUser":{"name":"fgribreau","email":"npm@fgribreau.com"},"_id":"amqp-tool@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"90fc638d0a5558e4ddb8caf04705c9597a051280","tarball":"http://registry.npmjs.org/amqp-tool/-/amqp-tool-0.0.2.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]},"0.0.3":{"name":"amqp-tool","description":"Rabbitmq-tool - import/export data from a RabbitMQ broker","keywords":["amqp","rabbitmq","tool","export","import"],"version":"0.0.3","homepage":"https://github.com/FGRibreau/node-amqp-tool","repository":{"type":"git","url":"git://github.com/FGRibreau/node-amqp-tool.git"},"dependencies":{"optimist":"0.3.0","amqp-dsl":"*","lazy":"1.0.7"},"bin":{"amqp-tool":"./bin/amqp-tool","rabbitmq-tool":"./bin/amqp-tool"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"engines":{"node":">= 0.4.12"},"_npmUser":{"name":"fgribreau","email":"npm@fgribreau.com"},"_id":"amqp-tool@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3f7ad556870d4903b2b30c5d3c612cc8e9c3d93c","tarball":"http://registry.npmjs.org/amqp-tool/-/amqp-tool-0.0.3.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]}},"readme":"## (Work in Progress, will be released through npm soon) ##\n\n## Installation\n\n    $ npm install amqp-tool -g\n\n## Usage overview\n\n```bash\nUsage: node ./bin/amqp-tool [options] [-import | -export]\n\nOptions:\n  --host          host                                                           [default: \"localhost\"]\n  --user, -u      username                                                       [default: \"guest\"]\n  --password, -p  password                                                       [default: \"guest\"]\n  --port          port                                                           [default: 5672]\n  --vhost         vhost                                                          [default: \"/\"]\n  --queue, -q     queue's name to work with                                      [required]\n  --passive       set it to true if the queue already exist                      [default: true]\n  --durable       the queue will survive a borker restart\n  --autoDelete    the queue will be deleted when there is no more subscriptions\n  --export        export [filename], export queue's content to filename          [default: \"stdout\"]\n  --import        import [filename], export file content into the queue          [default: \"stdin\"]\n  --count         limit the number of message to export/import\n  -v, --verbose   verbose mode                                                   [default: false]\n  -h, --help      produce this help message\n```\n\n### Export the first 5000 messages of a queue\ninto a file ...\n\n    amqp-tool --host rabbitmq.local -u user -p azerty -q queuetest --count 5000 --export dump.json\n\n... or to `stdout`\n\n    amqp-tool --host rabbitmq.local -u user -p azerty -q queuetest --count 5000 --export > dump.json\n\n\n### Continuously export a queue into a file\n\n    amqp-tool --host rabbitmq.local -u user -p azerty -q queuetest --export > dump.json\n\n\n### Import all messages to a queue\nfrom a file...\n\n    amqp-tool --host rabbitmq.local -u user -p azerty -q queuetest --import dump.json\n\n...or from `stdin`\n\n    cat dump.json | amqp-tool --host rabbitmq.local -u user -p azerty -q queuetest --import\n\n### Import the first 10 messages of a file into a queue\n\n    head -n10 500messages.json | amqp-tool --host rabbitmq.local -u user -p azerty -q queuetest --import\n\n### Continuously transfer message between two RabbitMQ Server (just for fun)\n\n    amqp-tool --host rabbitmq1.local -u user -p azerty -q queue1 --export | amqp-tool \\\n    --host rabbitmq2.local -u user -p azerty -q queue2 --import\n    ue from a file.json or `stdout`\n","maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}],"time":{"modified":"2011-12-15T20:38:43.244Z","created":"2011-12-13T22:37:24.926Z","0.0.1":"2011-12-13T22:37:26.596Z","0.0.2":"2011-12-13T22:44:03.234Z","0.0.3":"2011-12-15T20:38:43.244Z"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"repository":{"type":"git","url":"git://github.com/FGRibreau/node-amqp-tool.git"},"_attachments":{"amqp-tool-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FTA/ZXa/WxQD2JV+qBUg8w==","length":10240,"stub":true},"amqp-tool-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9an4u5OW5HZJJxWD1jEjzg==","length":10240,"stub":true},"amqp-tool-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5jDMceUflmkMsKkD+qKWyQ==","length":10240,"stub":true}}}},
{"id":"amqp-watcher","key":"amqp-watcher","value":{"rev":"9-2baa850b3e74aed80d45c1705119fe68"},"doc":{"_id":"amqp-watcher","_rev":"9-2baa850b3e74aed80d45c1705119fe68","name":"amqp-watcher","description":"A tool to get and send messages from an amqp server from the command line","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"amqp-watcher","preferGlobal":"true","version":"0.0.1","author":{"name":"Phillip Neumann","email":"pneumann@gmail.com"},"description":"Let you watch whats comming into an amqp exchange and send data to it","homepage":"https://github.com/killfill/amqp-watcher","bin":{"amqp-watcher":"./bin/amqp-watcher"},"main":"./lib","repository":{"type":"git","url":"git://github.com/killfill/amqp-watcher.git"},"keywords":["cli","amqp","rabbitmq","log","see","watcher"],"dependencies":{"amqp":"*","commander":"*"},"license":"MIT","_npmUser":{"name":"killfill","email":"pneumann@gmail.com"},"_id":"amqp-watcher@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0b239299eed36642cffdc5e8522cdfba68da4ad6","tarball":"http://registry.npmjs.org/amqp-watcher/-/amqp-watcher-0.0.1.tgz"},"maintainers":[{"name":"killfill","email":"pneumann@gmail.com"}],"directories":{}},"0.0.2":{"name":"amqp-watcher","preferGlobal":"true","version":"0.0.2","author":{"name":"Phillip Neumann","email":"pneumann@gmail.com"},"description":"A tool to get and send messages from an amqp server from the command line","homepage":"https://github.com/killfill/amqp-watcher","bin":{"amqp-watcher":"./bin/amqp-watcher"},"main":"./lib","repository":{"type":"git","url":"git://github.com/killfill/amqp-watcher.git"},"keywords":["cli","amqp","rabbitmq","log","see","watcher"],"dependencies":{"amqp":"*","commander":"*","carrier":"*"},"license":"MIT","_npmUser":{"name":"killfill","email":"pneumann@gmail.com"},"_id":"amqp-watcher@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"23627f2b87c8eef18369e044c56c68460e4181a5","tarball":"http://registry.npmjs.org/amqp-watcher/-/amqp-watcher-0.0.2.tgz"},"maintainers":[{"name":"killfill","email":"pneumann@gmail.com"}]}},"readme":"# Amqp Watcher\n\n  A simple watcher, that connects to an amqp server, binds an exchange to a queue, and outputs the activity.\n  \n  It can also send strings to the exchange.\n  \n\n## Installation\n\n\t$ npm install amqp-watcher -g\n\n## Options\n```\nOptions:\n\n  -h, --help                          output usage information\n  -V, --version                       output the version number\n  -s, --server <servername>           Hostname of the server [localhost]\n  -u, --url <url>                     Url to connect to. For example amqp://user:pass@localhost:port/vhost]\n  -e, --exchange <name:type:durable>  Exchange type to bind to [amq.topic:topic:true]\n  -b, --body <text>                   Send a message with the specified body. Will quit after\n  -k, --key [routing key]             Set the value of the routing key [#]\n  -c, --count <n>                     Repeat the msg n times [1]\n```\n\n## Examples\n\nBind to myExchange, all messages:\n\n\t$ amqp-watcher -s myhost -e myExchange\n\nBind to myExchange, ad listen to messages comming with routing key 'this.route':\n\n\t$ amqp-watcher -s myhost -e myExchange -k 'this.route'\n\nSend 10 'hello world' to myExchange:\n\n\t$ amqp-watcher -s myhost -e myExchange -b 'hello world' -c 10\n\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Phillip Neumann &lt;pneumann@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"killfill","email":"pneumann@gmail.com"}],"time":{"modified":"2012-03-23T02:34:53.597Z","created":"2012-02-05T21:34:01.645Z","0.0.1":"2012-02-05T21:34:03.753Z","0.0.2":"2012-03-23T02:34:53.597Z"},"author":{"name":"Phillip Neumann","email":"pneumann@gmail.com"},"repository":{"type":"git","url":"git://github.com/killfill/amqp-watcher.git"},"_attachments":{"amqp-watcher-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6uZXzgbYW1euMprwtfPASg==","length":10240,"stub":true},"amqp-watcher-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1YaqW4mbV8gcKt291bZWAQ==","length":10240,"stub":true}}}},
{"id":"amqpsnoop","key":"amqpsnoop","value":{"rev":"3-36a1c45647bcfb2f56cf68dbc24b0426"},"doc":{"_id":"amqpsnoop","_rev":"3-36a1c45647bcfb2f56cf68dbc24b0426","name":"amqpsnoop","description":"snoop AMQP messages","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"amqpsnoop","description":"snoop AMQP messages","version":"0.0.1","repository":{"type":"git","url":"git://github.com/davepacheco/node-amqpsnoop.git"},"author":{"name":"Dave Pacheco","email":"dap@cs.brown.edu"},"engines":{"node":"*"},"bin":{"amqpsnoop":"./lib/amqpsnoop.js"},"keywords":["amqp","snoop","command","tool"],"dependencies":{"posix-getopt":">=0.0.1","amqp":">=0.0.6"},"_id":"amqpsnoop@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"1bbfc32a3fa82b340c6634480a483efa83ff1dc8","tarball":"http://registry.npmjs.org/amqpsnoop/-/amqpsnoop-0.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"dap","email":"dap@cs.brown.edu"}],"time":{"modified":"2011-05-28T00:49:26.787Z","created":"2011-05-28T00:49:26.350Z","0.0.1":"2011-05-28T00:49:26.787Z"},"author":{"name":"Dave Pacheco","email":"dap@cs.brown.edu"},"repository":{"type":"git","url":"git://github.com/davepacheco/node-amqpsnoop.git"},"_attachments":{"amqpsnoop-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DbVKzYZKKAXso6fbYnXVeQ==","length":2863,"stub":true}}}},
{"id":"ams","key":"ams","value":{"rev":"64-42e48ca77d21834d7a39aceb8de1f79d"},"doc":{"_id":"ams","_rev":"64-42e48ca77d21834d7a39aceb8de1f79d","name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","dist-tags":{"latest":"0.0.21"},"versions":{"0.0.1":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.1","repository":"git://github.com/kof/node-ams.git","keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"main":"index","directories":{"lib":"lib","bin":"./bin"},"engines":{"node":">= 0.3.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.1","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.3.3-pre","modules":{"b/build.js":"lib/build.js","b/deps.js":"lib/deps.js","b/server.js":"lib/server.js","b/tracker.js":"lib/tracker.js","b/utils.js":"lib/utils.js","b/processors/abscsspaths.js":"lib/processors/abscsspaths.js","b/processors/cssmin.js":"lib/processors/cssmin.js","b/processors/dataimg.js":"lib/processors/dataimg.js","b/processors/placeholder.js":"lib/processors/placeholder.js","b/processors/transport.js":"lib/processors/transport.js","b/processors/uglifyjs.js":"lib/processors/uglifyjs.js","b/processors/vendorcss.js":"lib/processors/vendorcss.js"},"bin":{"test":"bin/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"20e0969407d04a16ff89e75df6dd2215cf23f0cd","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.1.tgz"}},"0.0.2":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.2","repository":"git://github.com/kof/node-ams.git","keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"main":"index","directories":{"lib":"lib","bin":"./bin"},"engines":{"node":">= 0.3.0"},"dependencies":{"connect":">= 0.5.6","natives":">= 0.0.5","qunit":">= 0.1.3","sharedjs":">= 0.0.1","uglify-js":">= 0.0.1"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.2","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.3.3-pre","modules":{"b/build.js":"lib/build.js","b/deps.js":"lib/deps.js","b/server.js":"lib/server.js","b/tracker.js":"lib/tracker.js","b/utils.js":"lib/utils.js","b/processors/abscsspaths.js":"lib/processors/abscsspaths.js","b/processors/cssmin.js":"lib/processors/cssmin.js","b/processors/dataimg.js":"lib/processors/dataimg.js","b/processors/placeholder.js":"lib/processors/placeholder.js","b/processors/transport.js":"lib/processors/transport.js","b/processors/uglifyjs.js":"lib/processors/uglifyjs.js","b/processors/vendorcss.js":"lib/processors/vendorcss.js"},"bin":{"test":"bin/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"60c219970255561ba09c68b842bc936bf0dd1f47","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.2.tgz"}},"0.0.3":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.3","repository":"git://github.com/kof/node-ams.git","keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"main":"index","directories":{"lib":"lib","bin":"./bin"},"engines":{"node":">= 0.3.0"},"dependencies":{"connect":">= 0.5.6","natives":">= 0.0.5","qunit":">= 0.1.3","sharedjs":">= 0.0.1","uglify-js":">= 0.0.1"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.3","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.3.6","modules":{"b/build.js":"lib/build.js","b/deps.js":"lib/deps.js","b/server.js":"lib/server.js","b/tracker.js":"lib/tracker.js","b/utils.js":"lib/utils.js","b/processors/cssabspaths.js":"lib/processors/cssabspaths.js","b/processors/cssdataimg.js":"lib/processors/cssdataimg.js","b/processors/cssimport.js":"lib/processors/cssimport.js","b/processors/cssmin.js":"lib/processors/cssmin.js","b/processors/cssvendor.js":"lib/processors/cssvendor.js","b/processors/jstransport.js":"lib/processors/jstransport.js","b/processors/placeholder.js":"lib/processors/placeholder.js","b/processors/uglifyjs.js":"lib/processors/uglifyjs.js"},"bin":{"test":"bin/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"25cde0a0a262a9fb7a2dc72bfd9501daadbe19f1","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.3.tgz"}},"0.0.4":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.4","repository":"git://github.com/kof/node-ams.git","keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"main":"index","directories":{"lib":"lib","bin":"./bin"},"engines":{"node":">= 0.3.0"},"dependencies":{"connect":">= 0.5.6","natives":">= 0.0.5","qunit":">= 0.1.3","sharedjs":">= 0.0.1","uglify-js":">= 0.0.1"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.4","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.3.6","modules":{"b/build.js":"lib/build.js","b/deps.js":"lib/deps.js","b/server.js":"lib/server.js","b/tracker.js":"lib/tracker.js","b/utils.js":"lib/utils.js","b/processors/csscdn.js":"lib/processors/csscdn.js","b/processors/cssdataimg.js":"lib/processors/cssdataimg.js","b/processors/cssimport.js":"lib/processors/cssimport.js","b/processors/cssmin.js":"lib/processors/cssmin.js","b/processors/cssvendor.js":"lib/processors/cssvendor.js","b/processors/jstransport.js":"lib/processors/jstransport.js","b/processors/placeholder.js":"lib/processors/placeholder.js","b/processors/uglifyjs.js":"lib/processors/uglifyjs.js"},"bin":{"test":"bin/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6136b93ac4b496d0df5ddd89f87dd44df89a4428","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.4.tgz"}},"0.0.5":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.5","repository":"git://github.com/kof/node-ams.git","keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"main":"index","directories":{"lib":"lib","bin":"./bin"},"engines":{"node":">= 0.3.0"},"dependencies":{"connect":">= 0.5.6","natives":">= 0.0.5","qunit":">= 0.1.3","sharedjs":">= 0.0.1","uglify-js":">= 0.0.1"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.5","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.3.6","modules":{"b/build.js":"lib/build.js","b/deps.js":"lib/deps.js","b/server.js":"lib/server.js","b/tracker.js":"lib/tracker.js","b/utils.js":"lib/utils.js","b/processors/csscdn.js":"lib/processors/csscdn.js","b/processors/cssdataimg.js":"lib/processors/cssdataimg.js","b/processors/cssimport.js":"lib/processors/cssimport.js","b/processors/cssmin.js":"lib/processors/cssmin.js","b/processors/cssvendor.js":"lib/processors/cssvendor.js","b/processors/jstransport.js":"lib/processors/jstransport.js","b/processors/placeholder.js":"lib/processors/placeholder.js","b/processors/uglifyjs.js":"lib/processors/uglifyjs.js"},"bin":{"test":"bin/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f08c335c8b091b2fd9d8a0bc5e91bbcc84f41742","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.5.tgz"}},"0.0.6":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.6","repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"main":"index","directories":{"lib":"lib","bin":"./bin"},"engines":{"node":">= 0.3.0"},"dependencies":{"connect":">= 0.5.6","natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.3"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.6","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.0","bin":{"test":"bin/test.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2dc49a055ab9609912141c7709357a9ebfc2d8fd","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.6.tgz"}},"0.0.7":{"name":"ams","description":"ams - asset management system. It is a build tool and static server in one.","version":"0.0.7","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"connect":">= 0.5.6","natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.3"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.7","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.0","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"22fb448af0598d8ad8667725b6ef989a723cb615","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.7.tgz"}},"0.0.8":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.8","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.3"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.8","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ad698a945e0e66d2f3a4d286c357a8817d2dc288","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.8.tgz"}},"0.0.9":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.9","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.9","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"04c6eaf60495f19d8df3106e16cea304e2eb208e","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.9.tgz"}},"0.0.10":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.10","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"ams@0.0.10","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"b098cacb1158c159e848f4532eaac94385e2af4f","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.10.tgz"},"scripts":{},"directories":{}},"0.0.11":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.11","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmJsonOpts":{"file":"/Users/kof/.npm/ams/0.0.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ams@0.0.11","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b6218f5292f768f2447d229e157bdbd32df3209b","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.11.tgz"},"scripts":{},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}],"directories":{}},"0.0.12":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.12","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmJsonOpts":{"file":"/Users/kof/.npm/ams/0.0.12/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ams@0.0.12","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c01b21b3478de5b3cd94d6c97bed08f16ceeae57","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.12.tgz"},"scripts":{},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}],"directories":{}},"0.0.13":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.13","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.13","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"49d3570a5534f8d78b049b8c2676d520eb3c013b","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.13.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}],"directories":{}},"0.0.14":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.14","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.14","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"cd5f9cc20088cd9348ade52792b4b4b51b3f0098","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.14.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}],"directories":{}},"0.0.15":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.15","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.15","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"9a0a37324c0510eb2c776616f6528e9ec3a566be","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.15.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]},"0.0.16":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.16","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.16","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"7fdf6ce734b8406a7c17209eb86ce9238aa4c578","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.16.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]},"0.0.17":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.17","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.17","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d0d481f66ca0b6bf37cf3662bdc7da3b0d327f58","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.17.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]},"0.0.18":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.18","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.18","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f741b3c061320969afa9522ce90938edc1b84981","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.18.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]},"0.0.19":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.19","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.19","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c22c98f39a28b9124645a20892c336d9c69ce973","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.19.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]},"0.0.20":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.20","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":">= 0.3.0"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":">= 0.0.5"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.20","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"eab7eac539e347f720aa8d5e5380798c3078ab64","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.20.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]},"0.0.21":{"name":"ams","description":"ams - asset management system - plugin enabled build tool with jquery like API","version":"0.0.21","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"keywords":["build","tool","static server","minify","minifier","compressor","processor","base64","cssmin","uglifyjs","vendor css","amd","transport","dependencies manager"],"engines":{"node":"0.6.x"},"bin":{},"dependencies":{"natives":">= 0.0.5","sharedjs":">= 0.0.2","uglify-js":"1.2.x"},"devDependencies":{"qunit":">= 0.1.5"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"kof","email":"oleg008@gmail.com"},"_id":"ams@0.0.21","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e0491c83725c431157a19a49e9eaed11a5b2d395","tarball":"http://registry.npmjs.org/ams/-/ams-0.0.21.tgz"},"readme":"## About\nams - asset management system for nodejs. The goal is to have a flexible and powerful system for dependency management and preprocessing of static files.\n\n## What is ams?\n\n- very flexible build tool\n- dependency detector to combine files (using @import for css and require('module') for javascript)\n- easy extendable preprocessing framework\n- enables you to write your js code for the client in the same way as the nodejs server (commonjs modules)\n\n## Features\n- Expressive API\n- Find your files\n  - static dependencies detection (looks for commonjs 'require' calls)\n  - finder using regexp\n- process\n  - minify js (using uglifyjs)\n  - minify css (using cssmin from yahoo)\n  - wrap js with commonjs module definition string (requirejs compatible) for transport\n  - add vendor css prefixes (-o, -ms, -moz, -webkit)\n  - inline small images in css using base64 data encoding\n  - combine css files using @import declaration\n  - add host to background image paths and external css (@import), to load it from cdn\n  - add your own preprocessor ...\n- combine\n- write to disk\n\n## Installation\n\n\tnpm install ams\n\n## API\n\n### require ams\n\n\tvar ams = require('ams');\n\n### ams.build.create(root)\nCreate a build instance from passed root path. Returns build Instance.\nInstance properties are:\n\n- `this.root` - passed path to the src dir.\n- `this.options` - current options object, contains all options for all methods.\n- `this.paths` - like require.paths.\n- `this.data` - key/value hash of path/contents\n\nExample:\n\n\tvar build = ams.build.create('/path/to/src');\n\n### Build#find(options)\nFind files to be added to the build instance. Returns build Instance.\n\nDefaults are:\n\n\t{\n        detect: null, // path to the file, where static 'require' dependencies tracking should start from,\n        pattern: /\\.[\\w]+$/, // regexp to match files, is used if detect is not defined\n        filter: null, // regexp to filter files, is used if detect is not defined\n        rec: true, // recursive search, is used if detect is not defined\n        paths: null // like require.paths to resolve deps\n    }\n\nExample:\n\n\tbuild.find();\n\n### Build#add(path, [targetDir]);\nAdd file or files (array) from given path, optionally define the target dir. Returns build Instance.\n\nExample:\n\n\tbuild.add('/path/to/file');\n\t// or\n\tbuild.add(['/path/to/file1', '/path/to/file2']);\n\n### Build#process(options)\nRun processors over files previously added to the build instance. Returns build Instance.\n\nDefaults are:\n\n    {\n        uglifyjs: true, // minify javascript using uglifyjs\n        cssvendor: true, // add css vendor prefixes like -webkit, -moz etc.\n        dataimage: true, // inline small images using data:image base64 encoded data for css and html\n        cssimport: true, // parse @import declarations and inline css files\n        cssabspath: true, // absolutize paths in css files (relative to the root)\n        htmlabspath: true, // absolutize paths in html files (relative to the root)\n        cssmin: true, // minify css using js port of yahoos compressor for css\n        jstransport: true, // wrap javascript code in commonjs transport proposal, can be used with requirejs later\n        texttransport: true // wrap any data into js transport string, f.e. to load html templates using requirejs from cdn\n    }\n\nYou can turn off any processor, add your own, or set any options for every processor.\n\nExample:\n\n\tbuild.process({\n\t\tuglifyjs: false,\n\t\tcssabspath: {\n\t\t\thost: 'http://localhost:8888',\n            verbose: true\n\t\t}\n\t})\n\nIf options is a function, it will be called for each file and act like a custom preprocessor.\n\nExample:\n\n\tbuild.process(function(path, data) {\n\t\t// `path` is path to the file\n\t\t// `data` is contents of the file\n\t\t// `this` is reference to build instance\n\t});\n\n### Build#combine(options)\nCombine all files of current build instance to one, of course without mixing css and js etc. Returns build Instance.\n\nExample:\n\n\tbuild.combine({\n\t\tjs: 'main.js',\n\t\tcss: 'main.css'\n\t});\n\n### Build#cleanup(dir)\nRemove all files and dirs from given dir. Returns build Instance.\n\nExample:\n\n\tbuild.cleanup('/path/to/dir');\n\n### Build.write(dir)\nWrite proccessed files to disk in passed dir. Returns build Instance.\n\nExample:\n\n\tbuild.write('/path/to/public/dir');\n\n### Build.end([message])\nWrite a success message to stdout, pass a message string optionally. Returns build Instance.\n\n### Example of complete build script:\n\n\tvar ams = require('ams');\n\n\tvar publ = __dirname + '/public',\n\t    src = __dirname + '/src',\n\t    host = 'http://localhost:8888';\n\n\tams.build\n\t\t// create a build for the dir\n\t    .create(src)\n\t    // find all files in it\n\t    .find()\n\t    // change processors options\n\t    .process({\n\t        cssabspath: {\n\t            host: host,\n                verbose: true\n\t        },\n\t        htmlabspath: {\n\t            host: host,\n                verbose: true\n\t        },\n\t        texttransport: false,\n            uglifyjs: {\n                verbose: true\n            }\n\t    })\n\t    // combine all js files\n\t    .combine({\n\t        js: 'main.js'\n\t    })\n\t    // write them to disk\n\t    .write(publ)\n\t    // stdout success message\n\t    .end();\n","maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]}},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}],"time":{"modified":"2012-05-31T15:49:48.337Z","created":"2011-01-26T19:31:38.394Z","0.0.1":"2011-01-26T19:31:38.930Z","0.0.2":"2011-01-26T20:11:56.769Z","0.0.3":"2011-01-28T13:19:05.585Z","0.0.4":"2011-01-29T14:04:32.892Z","0.0.5":"2011-01-29T19:07:31.663Z","0.0.6":"2011-03-14T15:21:30.585Z","0.0.7":"2011-03-19T17:14:29.129Z","0.0.8":"2011-03-25T11:12:58.692Z","0.0.9":"2011-03-30T10:27:10.610Z","0.0.10":"2011-05-29T18:08:34.872Z","0.0.11":"2011-09-19T08:41:57.898Z","0.0.12":"2011-09-24T11:04:53.862Z","0.0.13":"2012-01-27T18:44:57.803Z","0.0.14":"2012-01-27T20:46:07.211Z","0.0.15":"2012-01-27T22:03:08.764Z","0.0.16":"2012-01-27T22:19:05.943Z","0.0.17":"2012-01-28T00:09:30.426Z","0.0.18":"2012-01-29T13:09:36.450Z","0.0.19":"2012-02-15T11:22:24.395Z","0.0.20":"2012-02-17T17:56:52.875Z","0.0.21":"2012-05-31T15:49:48.337Z"},"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-ams.git"},"_attachments":{"ams-0.0.21.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-OdOAedOiCm3Uq0mtqyNsZQ==","length":1028940,"stub":true},"ams-0.0.20.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-0LO24TBanS+ATenUsF2DMQ==","length":1034240,"stub":true},"ams-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-gBznOynIO+S6VbTg54wAiQ==","length":1034240,"stub":true},"ams-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-1YySfv40fbbvdALbrLtqrQ==","length":1034240,"stub":true},"ams-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-/Jm/NAJ5e7XNpOiM9xs0fg==","length":1034240,"stub":true},"ams-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-gl+mYt2+Djf2LEZ6453Ujg==","length":1034240,"stub":true},"ams-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-vqVAZJajLOoTizsrtdS2nQ==","length":1034240,"stub":true},"ams-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-Y1e4ju6e3ER2kAVQJC4g8g==","length":1034240,"stub":true},"ams-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-pIFZu5qojf+Htba2jLJqdQ==","length":1034240,"stub":true},"ams-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-/7CGOkfUoYAvU0xrBF5GSg==","length":1026154,"stub":true},"ams-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-c/FTI9JvUhozelUDerQlgQ==","length":1133583,"stub":true},"ams-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-aPwkESiABSY52E/E1JHklg==","length":1133409,"stub":true},"ams-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-i5XbYu43MiVsa9uzX6R8dQ==","length":1133678,"stub":true},"ams-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-cwPfz28fionWpO5JYZqwSQ==","length":1133560,"stub":true},"ams-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-7r33AFFQj5a8nc3sRJlQhw==","length":1134348,"stub":true},"ams-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-3ydCvzIsM5KsPyf96doU1A==","length":1134638,"stub":true},"ams-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-4yogMtuMbqq/cUppr8j4bg==","length":1033131,"stub":true},"ams-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-ppxowOfeoCGcr9phq6tY9A==","length":1032961,"stub":true},"ams-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-v1wb3ESeaiHwsfb/kJvJqQ==","length":1030447,"stub":true},"ams-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zk6tMVcbS4HMoVbQDdk/8g==","length":1029020,"stub":true},"ams-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Rhc0btsQiTwoaFhP9DB2FQ==","length":1220430,"stub":true}}}},
{"id":"amulet","key":"amulet","value":{"rev":"20-b7dcb5d4d350f03677b697b876df54b8"},"doc":{"_id":"amulet","_rev":"20-b7dcb5d4d350f03677b697b876df54b8","name":"amulet","description":"As-soon-as-possible streaming async Mustache templating","dist-tags":{"latest":"0.2.4"},"versions":{"0.1.5":{"name":"amulet","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"version":"0.1.5","homepage":"http://github.com/chbrown/amulet","author":{"name":"Christopher Brown","email":"io@henrian.com"},"main":"./lib/amulet.js","_npmJsonOpts":{"file":"/Users/chbrown/.npm/amulet/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amulet@0.1.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6f426d328141770dd288392d674c2fa6387cdf4f","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.1.5.tgz"},"scripts":{},"maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"directories":{}},"0.1.6":{"name":"amulet","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"version":"0.1.6","homepage":"http://github.com/chbrown/amulet","author":{"name":"Christopher Brown","email":"io@henrian.com"},"main":"./lib/amulet.js","_npmJsonOpts":{"file":"/Users/chbrown/.npm/amulet/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amulet@0.1.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c788fe8d7d3407457935404a6d888e7d7b5ed24b","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.1.6.tgz"},"maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"directories":{}},"0.1.7":{"name":"amulet","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"version":"0.1.7","repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"homepage":"http://github.com/chbrown/amulet","author":{"name":"Christopher Brown","email":"io@henrian.com"},"main":"./lib/amulet.js","_npmJsonOpts":{"file":"/Users/chbrown/.npm/amulet/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amulet@0.1.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f0a8f675e9f1cc708631f10fe0f25d3dd0d28fcc","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.1.7.tgz"},"maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"directories":{}},"0.1.8":{"name":"amulet","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"version":"0.1.8","repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"homepage":"http://github.com/chbrown/amulet","author":{"name":"Christopher Brown","email":"io@henrian.com"},"main":"./lib/amulet.js","_npmJsonOpts":{"file":"/Users/chbrown/.npm/amulet/0.1.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"amulet@0.1.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"91e9604046c3879f846a116302b1c5f9a17f1da0","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.1.8.tgz"},"maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"directories":{}},"0.1.9":{"name":"amulet","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"version":"0.1.9","repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"homepage":"http://github.com/chbrown/amulet","author":{"name":"Christopher Brown","email":"io@henrian.com"},"main":"./lib/amulet.js","_npmUser":{"name":"chbrown","email":"io@henrian.com"},"_id":"amulet@0.1.9","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"bc1330538ee84f081618a29a67ce88e1b50418b1","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.1.9.tgz"},"maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"directories":{}},"0.2.1":{"name":"amulet","version":"0.2.1","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"homepage":"http://github.com/chbrown/amulet","bugs":{"email":"Christopher Brown <io@henrian.com","url":"http://github.com/chbrown/amulet/issues"},"repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"author":{"name":"Christopher Brown","email":"io@henrian.com","url":"http://henrian.com"},"main":"./lib/render.js","devDependencies":{"optimist":"x.x.x","js-yaml":"0.x.x"},"scripts":{"test":"./tests/test.js"},"_npmUser":{"name":"chbrown","email":"io@henrian.com"},"_id":"amulet@0.2.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"611ead22b28560b5bef049f4a598f2a1a6b2099a","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.2.1.tgz"},"readme":"# Amulet - Mustache templating for Node.js\n\nMustache is a simple, restricted, fast template language inspired by [ctemplate](http://code.google.com/p/google-ctemplate/). There is a great introduction to the language [here on github](http://mustache.github.com/mustache.5.html). And a nice overview of the different tags at the [ruby implementation](http://github.com/defunkt/mustache/).\n\nAmulet began as a fork of the v2 branch of [raycmorgan](https://github.com/raycmorgan)'s [Mu](https://github.com/raycmorgan/Mu). I eventually changed so much of the API that I decided to rename it. \nAmulet attempts/intends to implement all of the Mustache specification, except that it does not always honor the whitespace requirements, which, for the purposes of HTML, does not matter. (Obeying the white-space conventions is on the to-do list.)\n\n### Quickstart guide:\n\n*layout.mu*\n\n\t<!DOCTYPE html>\n\t<meta name=\"engine\" content=\"amulet\">\n\t<div id=\"container\">\n\t\t{{<}}\n\t</div>\n\n*hello.mu*\n\n\t<p>Hello world!</p>\n\t\n*fib.mu*\n\n\t<h2>{{header}}</h2>            {{{spacer}}}\n\t<!-- the spacers are there just to convince \n\t\t your browser that it has enough content \n\t\t to merit rendering -->\n\t\n\t<p>One: {{one}}</p>            {{{spacer}}}\n\t<p>Ten: {{ten}}</p>            {{{spacer}}}\n\t<p>Hundred: {{hundred}}</p>    {{{spacer}}}\n\t<p>Thousand: {{thousand}}</p>\n\n*app.js*\n\n\tvar amulet = require('amulet');\n\tvar spacer = (new Array(100)).join('&nbsp;');\n\trequire('http').createServer(function(req, res) {\n\t  if (req.url === '/fib') {\n\t    res.writeHead(200, {'Content-Type': 'text/html'});\n\t    var context = {header: 'Fibonacci sequence', spacer: spacer};\n\t    var renderer = amulet.render(res, ['layout.mu', 'fib.mu'], context, true);\n\t    var a = 0, b = 1, c = -1, i = 0;\n\t    (function next() {\n\t      for (var j = 0; j < 500000; j++) {\n\t        var dummy = Math.random();\n\t      }\n\t      c = a + b;\n\t      a = b;\n\t      b = c;\n\t      if (i === 1)\n\t        renderer.extendContext({one: c});\n\t      if (i === 10)\n\t        renderer.extendContext({ten: c});\n\t      if (i === 100)\n\t        renderer.extendContext({hundred: c});\n\t      if (i === 1000)\n\t        renderer.extendContext({thousand: c});\n\t      i++;\n\t      if (i < 1001)\n\t        process.nextTick(next);\n\t    })();\n\t  }\n\t  else {\n\t    amulet.render(res, ['layout.mu', 'hello.mu']);\n\t  }\n\t}).listen(8080);\n\nThis example code can be found in `example/`\n\nThe main function, `amulet.render`, can be called in a few variations. The basic signature is `function(output, templates, context, asap, callback)`, but a number of the arguments are optional (`output` is the only required argument):\n\nWith callback:\n\n    amulet.render(res, ['layout.mu', 'page.mu'], context, true, function() {\n        console.log(\"Done rendering!\");\n    });\n\n`asap` defaults to false:\n\n    amulet.render(res, 'static.mu', function() { console.log(\"Done!\"); });\n\nWith single template:\n\n    var renderer = amulet.render(res, 'one.mu', {first: 'Chris'}, true);\n\n`amulet.render` always returns a Renderer object, which is useful if you want a way to add context or force it to end.\n\n*one.mu*\n    \n    <h3>{{first}} {{last}}</h3>\n    <p>{{description}}</p>\n\n*app.js (snippet)*:\n\n    renderer.extendContext({last: 'Brown'});\n\nAt this point, the renderer would output up to the `<p>`\nand then pause, waiting for the description variable to be filled.\nBut if you decide you want it to skip over the missing variables,\nas any basic Mustache spec would do:\n\n    renderer.force();\n\nWhich sets `asap` to false, and immediately streams through the rest of your template.\n\n\n\n## Why Amulet when there's [Mu](https://github.com/raycmorgan/Mu)?\n\n[Mu](https://github.com/raycmorgan/Mu) is faster for certain benchmarks, because the template rendering itself is synchronous. Amulet does everything A.S.A.P. (as soon as possible), so it will start rendering your templates before any of your context variables are available, only halting when it encounters a missing variable. This functionality is optional -- if you want to render a template with one command, you still can. \n\nPHP appears so fast (while sucking so much at everything else) because it renders as soon as possible, so that the top 90% of the page gets rendered before some cpu-intensive bit gets called to render the footer. That's what Amulet does, too, basically.\n\nLike Mu, Amulet\n\n* Is very fast\n* Supports asynchronous parsing and compiling\n* Renders streamingly\n\nBeyond Mu, Amulet\n\n* Supports template hierarchies\n* Renders as soon as possible, pausing only to wait for missing variables from the controller\n* Adds a number of helpers to the Mustache specification\n\n# Additives\n\nAmulet is Mustache and then some:\n\n### Piping\n\nIf a method is in global scope, you can pipe a variable through it:\n\n\t<pre>{{doc | JSON.stringify}}</pre>\n\nWhich would return something like \n\n\t<pre>{\"_id\": \"0x1\"}</pre>\n\n### Object notation\n\nInstead of having to nest sections to dig into an object:\n\n\t{{#obj}}\n\t\t{{#prop}}\n\t\t\t{{val}}\n\t\t{{/prop}}\n\t{{/obj}}\n\t\nYou can just dot a path. Like javascript.\n\n\t{{obj.prop.val}}\n\t\n### DRY\n\nDon't repeat yourself; namely, don't use XML-type redundancy. A Mustache template is a directed acyclic graph (DAG), meaning that a closing node is never ambiguous. You needn't tell the parser what you're closing in Amulet. It already knows.\n\n\t{{#obj}}\n\t\t{{#prop}}\n\t\t\t{{val}}\n\t\t{{/}}\n\t{{/}}\n\n### Yields\n\nWhen rendering a template hierarchy, use a `<` in your master layout (the opposite of the partial symbol `>`):\n\n*layout.mu*\n\n\t<!DOCTYPE html>\n\t{{<}}\n\n*index.mu*\n\n\t<p>Just the facts.</p>\n\t\nOutput of `amulet.render(response, ['layout.mu', 'index.mu'])`:\n\n\t<!DOCTYPE html>\n\t<p>Just the facts.</p>\n\t\nTo make it easier to remember what `<` does, you can also write `{{<yield}}` or even `{{<yield/>}}` to make your syntax highlighter happy.\n\n### Arrows\n\nTo keep better track of scope, you can name your sectioned variables with the `->` symbol:\n\n\t{{#people -> person}}\n\t\t{{person.first_name}}\n\t{{/}}\n\n\n# License\n\nMIT Licensed, 2010-2011\n\nSee <https://github.com/chbrown/amulet/blob/master/LICENSE>\n","maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"directories":{}},"0.2.3":{"name":"amulet","version":"0.2.3","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"homepage":"http://github.com/chbrown/amulet","bugs":{"email":"Christopher Brown <io@henrian.com","url":"http://github.com/chbrown/amulet/issues"},"repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"author":{"name":"Christopher Brown","email":"io@henrian.com","url":"http://henrian.com"},"main":"./lib/rendering.js","devDependencies":{"optimist":"x.x.x","js-yaml":"0.x.x"},"scripts":{"test":"./tests/test.js"},"_npmUser":{"name":"chbrown","email":"io@henrian.com"},"_id":"amulet@0.2.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7d82200e5aea871e7bedf9d506b65856ea2dec9d","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.2.3.tgz"},"readme":"# Amulet - Mustache templating for Node.js\n\nMustache is a simple, restricted, fast template language inspired by [ctemplate](http://code.google.com/p/google-ctemplate/). There is a great introduction to the language [here on github](http://mustache.github.com/mustache.5.html). And a nice overview of the different tags at the [ruby implementation](http://github.com/defunkt/mustache/).\n\nAmulet began as a fork of the v2 branch of [raycmorgan](https://github.com/raycmorgan)'s [Mu](https://github.com/raycmorgan/Mu). I eventually changed so much of the API that I decided to rename it. \nAmulet attempts/intends to implement all of the Mustache specification, except that it does not always honor the whitespace requirements, which, for the purposes of HTML, does not matter. (Obeying the white-space conventions is on the to-do list.)\n\n### Quickstart guide:\n\n*layout.mu*\n\n\t<!DOCTYPE html>\n\t<meta name=\"engine\" content=\"amulet\">\n\t<div id=\"container\">\n\t\t{{<}}\n\t</div>\n\n*hello.mu*\n\n\t<p>Hello world!</p>\n\t\n*fib.mu*\n\n\t<h2>{{header}}</h2>            {{{spacer}}}\n\t<!-- the spacers are there just to convince \n\t\t your browser that it has enough content \n\t\t to merit rendering -->\n\t\n\t<p>One: {{one}}</p>            {{{spacer}}}\n\t<p>Ten: {{ten}}</p>            {{{spacer}}}\n\t<p>Hundred: {{hundred}}</p>    {{{spacer}}}\n\t<p>Thousand: {{thousand}}</p>\n\n*app.js*\n\n\tvar amulet = require('amulet');\n\tvar spacer = (new Array(100)).join('&nbsp;');\n\trequire('http').createServer(function(req, res) {\n\t  if (req.url === '/fib') {\n\t    res.writeHead(200, {'Content-Type': 'text/html'});\n\t    var context = {header: 'Fibonacci sequence', spacer: spacer};\n\t    var renderer = amulet.render(res, ['layout.mu', 'fib.mu'], context, true);\n\t    var a = 0, b = 1, c = -1, i = 0;\n\t    (function next() {\n\t      for (var j = 0; j < 500000; j++) {\n\t        var dummy = Math.random();\n\t      }\n\t      c = a + b;\n\t      a = b;\n\t      b = c;\n\t      if (i === 1)\n\t        renderer.extendContext({one: c});\n\t      if (i === 10)\n\t        renderer.extendContext({ten: c});\n\t      if (i === 100)\n\t        renderer.extendContext({hundred: c});\n\t      if (i === 1000)\n\t        renderer.extendContext({thousand: c});\n\t      i++;\n\t      if (i < 1001)\n\t        process.nextTick(next);\n\t    })();\n\t  }\n\t  else {\n\t    amulet.render(res, ['layout.mu', 'hello.mu']);\n\t  }\n\t}).listen(8080);\n\nThis example code can be found in `example/`\n\nThe main function, `amulet.render`, can be called in a few variations. The basic signature is `function(output, templates, context, asap, callback)`, but a number of the arguments are optional (`output` is the only required argument):\n\nWith callback:\n\n    amulet.render(res, ['layout.mu', 'page.mu'], context, true, function() {\n        console.log(\"Done rendering!\");\n    });\n\n`asap` defaults to false:\n\n    amulet.render(res, 'static.mu', function() { console.log(\"Done!\"); });\n\nWith single template:\n\n    var renderer = amulet.render(res, 'one.mu', {first: 'Chris'}, true);\n\n`amulet.render` always returns a Renderer object, which is useful if you want a way to add context or force it to end.\n\n*one.mu*\n    \n    <h3>{{first}} {{last}}</h3>\n    <p>{{description}}</p>\n\n*app.js (snippet)*:\n\n    renderer.extendContext({last: 'Brown'});\n\nAt this point, the renderer would output up to the `<p>`\nand then pause, waiting for the description variable to be filled.\nBut if you decide you want it to skip over the missing variables,\nas any basic Mustache spec would do:\n\n    renderer.force();\n\nWhich sets `asap` to false, and immediately streams through the rest of your template.\n\n\n\n## Why Amulet when there's [Mu](https://github.com/raycmorgan/Mu)?\n\n[Mu](https://github.com/raycmorgan/Mu) is faster for certain benchmarks, because the template rendering itself is synchronous. Amulet does everything A.S.A.P. (as soon as possible), so it will start rendering your templates before any of your context variables are available, only halting when it encounters a missing variable. This functionality is optional -- if you want to render a template with one command, you still can. \n\nPHP appears so fast (while sucking so much at everything else) because it renders as soon as possible, so that the top 90% of the page gets rendered before some cpu-intensive bit gets called to render the footer. That's what Amulet does, too, basically.\n\nLike Mu, Amulet\n\n* Is very fast\n* Supports asynchronous parsing and compiling\n* Renders streamingly\n\nBeyond Mu, Amulet\n\n* Supports template hierarchies\n* Renders as soon as possible, pausing only to wait for missing variables from the controller\n* Adds a number of helpers to the Mustache specification\n\n# Additives\n\nAmulet is Mustache and then some:\n\n### Piping\n\nIf a method is in global scope, you can pipe a variable through it:\n\n\t<pre>{{{doc | JSON.stringify}}}</pre>\n\nWhich would return something like \n\n\t<pre>{\"_id\": \"0x1\"}</pre>\n\n### Object notation\n\nInstead of having to nest sections to dig into an object:\n\n\t{{#obj}}\n\t\t{{#prop}}\n\t\t\t{{val}}\n\t\t{{/prop}}\n\t{{/obj}}\n\t\nYou can just dot a path. Like javascript.\n\n\t{{obj.prop.val}}\n\t\n### DRY\n\nDon't repeat yourself; namely, don't use XML-type redundancy. A Mustache template is a directed acyclic graph (DAG), i.e. a tree, meaning that a closing node is never ambiguous. You needn't tell the Amulet parser what you're closing. It already knows.\n\n\t{{#obj}}\n\t\t{{#prop}}\n\t\t\t{{val}}\n\t\t{{/}}\n\t{{/}}\n\n### Yields\n\nWhen rendering a template hierarchy, use a `<` in your master layout (the opposite of the partial symbol `>`):\n\n*layout.mu*\n\n\t<!DOCTYPE html>\n\t{{<}}\n\n*index.mu*\n\n\t<p>Just the facts.</p>\n\t\nOutput of `amulet.render(response, ['layout.mu', 'index.mu'])`:\n\n\t<!DOCTYPE html>\n\t<p>Just the facts.</p>\n\t\nTo make it easier to remember what `<` does, you can also write `{{<yield}}` or even `{{<yield/>}}` to make your syntax highlighter happy. As soon as the parser sees the `<` character, it will skip to the end of the mustache tag.\n\n### Arrows\n\nTo keep better track of scope, you can name your sectioned variables with the `->` symbol:\n\n\t{{#people -> person}}\n\t\t{{person.first_name}}\n\t{{/}}\n\nOtherwise, you can access the local scope nakedly or with a `_`:\n\n  {{#people}}\n    {{_.first_name}}\n    {{last_name}}\n  {{/}}\n\n\n# License\n\nMIT Licensed, 2010-2012\n\nSee <https://github.com/chbrown/amulet/blob/master/LICENSE>\n","maintainers":[{"name":"chbrown","email":"io@henrian.com"}]},"0.2.4":{"name":"amulet","version":"0.2.4","description":"As-soon-as-possible streaming async Mustache templating","keywords":["template","mustache","mu","asynchronous","streaming","nodeps"],"homepage":"http://github.com/chbrown/amulet","bugs":{"email":"Christopher Brown <io@henrian.com","url":"http://github.com/chbrown/amulet/issues"},"repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"author":{"name":"Christopher Brown","email":"io@henrian.com","url":"http://henrian.com"},"main":"./lib/rendering.js","devDependencies":{"optimist":"x.x.x","js-yaml":"0.x.x"},"scripts":{"test":"./tests/test.js"},"_npmUser":{"name":"chbrown","email":"io@henrian.com"},"_id":"amulet@0.2.4","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"a7badcf50ddae50a79758e550f0777c86e2a1f74","tarball":"http://registry.npmjs.org/amulet/-/amulet-0.2.4.tgz"},"readme":"# Amulet - Mustache templating for Node.js\n\nMustache is a simple, restricted, fast template language inspired by [ctemplate](http://code.google.com/p/google-ctemplate/). There is a great introduction to the language [here on github](http://mustache.github.com/mustache.5.html). And a nice overview of the different tags at the [ruby implementation](http://github.com/defunkt/mustache/).\n\nAmulet began as a fork of the v2 branch of [raycmorgan](https://github.com/raycmorgan)'s [Mu](https://github.com/raycmorgan/Mu). I eventually changed so much of the API that I decided to rename it. \nAmulet attempts/intends to implement all of the Mustache specification, except that it does not always honor the whitespace requirements, which, for the purposes of HTML, does not matter. (Obeying the white-space conventions is on the to-do list.)\n\n### Quickstart guide:\n\n*layout.mu*\n\n\t<!DOCTYPE html>\n\t<meta name=\"engine\" content=\"amulet\">\n\t<div id=\"container\">\n\t\t{{<}}\n\t</div>\n\n*hello.mu*\n\n\t<p>Hello world!</p>\n\t\n*fib.mu*\n\n\t<h2>{{header}}</h2>            {{{spacer}}}\n\t<!-- the spacers are there just to convince \n\t\t your browser that it has enough content \n\t\t to merit rendering -->\n\t\n\t<p>One: {{one}}</p>            {{{spacer}}}\n\t<p>Ten: {{ten}}</p>            {{{spacer}}}\n\t<p>Hundred: {{hundred}}</p>    {{{spacer}}}\n\t<p>Thousand: {{thousand}}</p>\n\n*app.js*\n\n\tvar amulet = require('amulet');\n\tvar spacer = (new Array(100)).join('&nbsp;');\n\trequire('http').createServer(function(req, res) {\n\t  if (req.url === '/fib') {\n\t    res.writeHead(200, {'Content-Type': 'text/html'});\n\t    var context = {header: 'Fibonacci sequence', spacer: spacer};\n\t    var renderer = amulet.render(res, ['layout.mu', 'fib.mu'], context, true);\n\t    var a = 0, b = 1, c = -1, i = 0;\n\t    (function next() {\n\t      for (var j = 0; j < 500000; j++) {\n\t        var dummy = Math.random();\n\t      }\n\t      c = a + b;\n\t      a = b;\n\t      b = c;\n\t      if (i === 1)\n\t        renderer.extendContext({one: c});\n\t      if (i === 10)\n\t        renderer.extendContext({ten: c});\n\t      if (i === 100)\n\t        renderer.extendContext({hundred: c});\n\t      if (i === 1000)\n\t        renderer.extendContext({thousand: c});\n\t      i++;\n\t      if (i < 1001)\n\t        process.nextTick(next);\n\t    })();\n\t  }\n\t  else {\n\t    amulet.render(res, ['layout.mu', 'hello.mu']);\n\t  }\n\t}).listen(8080);\n\nThis example code can be found in `example/`\n\nThe main function, `amulet.render`, can be called in a few variations. The basic signature is `function(output, templates, context, asap, callback)`, but a number of the arguments are optional (`output` is the only required argument):\n\nWith callback:\n\n    amulet.render(res, ['layout.mu', 'page.mu'], context, true, function() {\n        console.log(\"Done rendering!\");\n    });\n\n`asap` defaults to false:\n\n    amulet.render(res, 'static.mu', function() { console.log(\"Done!\"); });\n\nWith single template:\n\n    var renderer = amulet.render(res, 'one.mu', {first: 'Chris'}, true);\n\n`amulet.render` always returns a Renderer object, which is useful if you want a way to add context or force it to end.\n\n*one.mu*\n    \n    <h3>{{first}} {{last}}</h3>\n    <p>{{description}}</p>\n\n*app.js (snippet)*:\n\n    renderer.extendContext({last: 'Brown'});\n\nAt this point, the renderer would output up to the `<p>`\nand then pause, waiting for the description variable to be filled.\nBut if you decide you want it to skip over the missing variables,\nas any basic Mustache spec would do:\n\n    renderer.force();\n\nWhich sets `asap` to false, and immediately streams through the rest of your template.\n\n\n\n## Why Amulet when there's [Mu](https://github.com/raycmorgan/Mu)?\n\n[Mu](https://github.com/raycmorgan/Mu) is faster for certain benchmarks, because the template rendering itself is synchronous. Amulet does everything A.S.A.P. (as soon as possible), so it will start rendering your templates before any of your context variables are available, only halting when it encounters a missing variable. This functionality is optional -- if you want to render a template with one command, you still can. \n\nPHP appears so fast (while sucking so much at everything else) because it renders as soon as possible, so that the top 90% of the page gets rendered before some cpu-intensive bit gets called to render the footer. That's what Amulet does, too, basically.\n\nLike Mu, Amulet\n\n* Is very fast\n* Supports asynchronous parsing and compiling\n* Renders streamingly\n\nBeyond Mu, Amulet\n\n* Supports template hierarchies\n* Renders as soon as possible, pausing only to wait for missing variables from the controller\n* Adds a number of helpers to the Mustache specification\n\n# Additives\n\nAmulet is Mustache and then some:\n\n### Piping\n\nIf a method is in global scope, you can pipe a variable through it:\n\n\t<pre>{{{doc | JSON.stringify}}}</pre>\n\nWhich would return something like \n\n\t<pre>{\"_id\": \"0x1\"}</pre>\n\n### Object notation\n\nInstead of having to nest sections to dig into an object:\n\n\t{{#obj}}\n\t\t{{#prop}}\n\t\t\t{{val}}\n\t\t{{/prop}}\n\t{{/obj}}\n\t\nYou can just dot a path. Like javascript.\n\n\t{{obj.prop.val}}\n\t\n### DRY\n\nDon't repeat yourself; namely, don't use XML-type redundancy. A Mustache template is a directed acyclic graph (DAG), i.e. a tree, meaning that a closing node is never ambiguous. You needn't tell the Amulet parser what you're closing. It already knows.\n\n\t{{#obj}}\n\t\t{{#prop}}\n\t\t\t{{val}}\n\t\t{{/}}\n\t{{/}}\n\n### Yields\n\nWhen rendering a template hierarchy, use a `<` in your master layout (the opposite of the partial symbol `>`):\n\n*layout.mu*\n\n\t<!DOCTYPE html>\n\t{{<}}\n\n*index.mu*\n\n\t<p>Just the facts.</p>\n\t\nOutput of `amulet.render(response, ['layout.mu', 'index.mu'])`:\n\n\t<!DOCTYPE html>\n\t<p>Just the facts.</p>\n\t\nTo make it easier to remember what `<` does, you can also write `{{<yield}}` or even `{{<yield/>}}` to make your syntax highlighter happy. As soon as the parser sees the `<` character, it will skip to the end of the mustache tag.\n\n### Arrows\n\nTo keep better track of scope, you can name your sectioned variables with the `->` symbol:\n\n\t{{#people -> person}}\n\t\t{{person.first_name}}\n\t{{/}}\n\nOtherwise, you can access the local scope nakedly or with a `_`:\n\n  {{#people}}\n    {{_.first_name}}\n    {{last_name}}\n  {{/}}\n\n\n# License\n\nMIT Licensed, 2010-2012\n\nSee <https://github.com/chbrown/amulet/blob/master/LICENSE>\n","maintainers":[{"name":"chbrown","email":"io@henrian.com"}]}},"maintainers":[{"name":"chbrown","email":"io@henrian.com"}],"time":{"modified":"2012-06-29T18:00:04.864Z","created":"2011-08-24T20:49:38.532Z","0.1.5":"2011-08-24T20:49:39.725Z","0.1.6":"2011-09-03T19:26:20.266Z","0.1.7":"2011-09-05T03:06:28.259Z","0.1.8":"2011-10-10T17:45:32.380Z","0.1.9":"2012-01-01T21:14:30.291Z","0.2.1":"2012-05-06T04:57:16.010Z","0.2.2":"2012-05-08T14:24:17.466Z","0.2.3":"2012-05-08T16:53:43.014Z","0.2.4":"2012-06-29T18:00:04.864Z"},"author":{"name":"Christopher Brown","email":"io@henrian.com","url":"http://henrian.com"},"repository":{"type":"git","url":"git://github.com/chbrown/amulet.git"},"_attachments":{"amulet-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-PpIxKa/KwFA2ogNMF8dl0Q==","length":30788,"stub":true},"amulet-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-Yq/+BNEBZqxCcIofQXbSig==","length":30786,"stub":true},"amulet-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-t4Jfm8CW2dIVX7o8Utd4Jg==","length":30713,"stub":true},"amulet-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-u1LXMJVPMElQ9Eak+ThMyw==","length":31030,"stub":true},"amulet-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qBgU1ZbNcFb2hyVpTOtbSg==","length":29985,"stub":true},"amulet-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-inufuRXX2NHgTWp2NyEYIA==","length":29734,"stub":true},"amulet-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1+dYXOg30fY4tUQ7fkUN/Q==","length":29705,"stub":true},"amulet-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Yg34jDkVNB0hZW1M09p5+w==","length":15968,"stub":true}}}},
{"id":"amz","key":"amz","value":{"rev":"17-24997b8ae89d8bc2c91b6490f575719e"},"doc":{"_id":"amz","_rev":"17-24997b8ae89d8bc2c91b6490f575719e","name":"amz","description":"Amazon EC2 cli on coffee-script","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.9a":{"name":"amz","preferGlobal":"true","version":"0.0.9a","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engine":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.0.9a","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"537d689aaa5e36bb3e2ce727cab16050e8049508","tarball":"http://registry.npmjs.org/amz/-/amz-0.0.9a.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.1.0":{"name":"amz","preferGlobal":"true","version":"0.1.0","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d346db14976e4defa6c4e1b648ce567ee3cd7f06","tarball":"http://registry.npmjs.org/amz/-/amz-0.1.0.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.1.1":{"name":"amz","preferGlobal":"true","version":"0.1.1","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"bc42bbae488166e031378bbc14f2b0c027a36605","tarball":"http://registry.npmjs.org/amz/-/amz-0.1.1.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.1.2":{"name":"amz","preferGlobal":"true","version":"0.1.2","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"dc898af3fdea0d0a71353a5f6833e7f7e4edd3f9","tarball":"http://registry.npmjs.org/amz/-/amz-0.1.2.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.2.0":{"name":"amz","preferGlobal":"true","version":"0.2.0","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","colors":">= 0.5.x","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"383703ee41876c2cc0b7f6e3477867d3fd2361ae","tarball":"http://registry.npmjs.org/amz/-/amz-0.2.0.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.2.1":{"name":"amz","preferGlobal":"true","version":"0.2.1","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","colors":">= 0.5.x","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d2ee5b7ea17a4b7d8369cee140def591e9497e10","tarball":"http://registry.npmjs.org/amz/-/amz-0.2.1.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.3.0":{"name":"amz","preferGlobal":"true","version":"0.3.0","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","colors":">= 0.5.x","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8b61659e0ea9a98f925569030882ee1005594d5a","tarball":"http://registry.npmjs.org/amz/-/amz-0.3.0.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.4.0":{"name":"amz","preferGlobal":"true","version":"0.4.0","description":"Amazon EC2 cli on coffee-script","keywords":["amazon","ec2","cli"],"author":{"name":"Temnov Kirill, @selead"},"dependencies":{"aws-lib":"0.0.x","coffee-script":">=1.0.1","colors":">= 0.5.x","optimist":">= 0.3.x"},"bin":{"amz":"./bin/amz.coffee"},"main":"index","engines":{"node":">= 0.4  <= 0.7"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"license":"MIT","_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"amz@0.4.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8c64a678ddc1caac26cc302d0782279da518fb83","tarball":"http://registry.npmjs.org/amz/-/amz-0.4.0.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]}},"readme":null,"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"time":{"modified":"2012-01-31T16:39:45.067Z","created":"2011-12-30T10:07:45.198Z","0.0.9a":"2011-12-30T10:08:29.717Z","0.1.0":"2012-01-03T20:36:33.034Z","0.1.1":"2012-01-12T16:52:07.303Z","0.1.2":"2012-01-12T17:06:43.919Z","0.2.0":"2012-01-12T22:46:14.314Z","0.2.1":"2012-01-13T13:19:43.141Z","0.3.0":"2012-01-30T18:13:11.040Z","0.4.0":"2012-01-31T16:39:45.067Z"},"author":{"name":"Temnov Kirill, @selead"},"repository":{"type":"git","url":"git://github.com/selead/amz.git"},"_attachments":{"amz-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-IZLrGyagwr9uAADtdvJHig==","length":10240,"stub":true},"amz-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-0ifaFwYDPKdT3E8Pa9DYUA==","length":10240,"stub":true},"amz-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-YcA+yCL+GHvpRfytNLtR9A==","length":10240,"stub":true},"amz-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Yq8ufj9Qs1jrnDZ8lKOVMg==","length":10240,"stub":true},"amz-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-3iGkbPRvNP9CQn/FJ+MNFw==","length":10240,"stub":true},"amz-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MhrkIXjFVOUP/oCmH38F5g==","length":10240,"stub":true},"amz-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-d1GUyEVompJcIN32XUaXlQ==","length":10240,"stub":true},"amz-0.0.9a.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i9NS/5JI0Z3+UpZCAP9cdA==","length":10240,"stub":true}}}},
{"id":"an.hour.ago","key":"an.hour.ago","value":{"rev":"3-cce20d9aabf13c7cf78274357212621b"},"doc":{"_id":"an.hour.ago","_rev":"3-cce20d9aabf13c7cf78274357212621b","name":"an.hour.ago","description":"DSL for expressing and comparing dates and times","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"an.hour.ago","version":"0.1.0","description":"DSL for expressing and comparing dates and times","author":{"name":"David Chambers","email":"dc@hashify.me"},"licenses":[{"type":"WTFPL","url":"https://raw.github.com/davidchambers/an.hour.ago/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/davidchambers/an.hour.ago.git"},"bugs":{"name":"https://github.com/davidchambers/an.hour.ago/issues"},"devDependencies":{"coffee-script":"1.3.x","jessie":"0.4.x","uglify-js":"1.2.x"},"scripts":{"bytes":"node_modules/uglify-js/bin/uglifyjs an.hour.ago.js | gzip -9f | wc -c","test":"node_modules/jessie/bin/jessie spec","uglify":"node_modules/uglify-js/bin/uglifyjs -o an.hour.ago.min.js an.hour.ago.js"},"_npmUser":{"name":"davidchambers","email":"dc@hashify.me"},"_id":"an.hour.ago@0.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d56fc4d1692b2026f618bc296d27f369b3a7f223","tarball":"http://registry.npmjs.org/an.hour.ago/-/an.hour.ago-0.1.0.tgz"},"maintainers":[{"name":"davidchambers","email":"dc@hashify.me"}]}},"readme":null,"maintainers":[{"name":"davidchambers","email":"dc@hashify.me"}],"time":{"modified":"2012-06-09T05:51:40.325Z","created":"2012-06-09T05:51:39.047Z","0.1.0":"2012-06-09T05:51:40.325Z"},"author":{"name":"David Chambers","email":"dc@hashify.me"},"repository":{"type":"git","url":"git://github.com/davidchambers/an.hour.ago.git"},"_attachments":{"an.hour.ago-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-U90RhsDrxIOLbKC7rsJr5A==","length":10240,"stub":true}}}},
{"id":"anachronism","key":"anachronism","value":{"rev":"15-7a1e9c9df9804a67a6faf2ab04c29cd7"},"doc":{"_id":"anachronism","_rev":"15-7a1e9c9df9804a67a6faf2ab04c29cd7","name":"anachronism","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0":{"name":"anachronism","version":"0.0.0","main":"index.js","dependencies":{"underscore":"~1.1.7"},"_id":"anachronism@0.0.0","scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"2159c6a206be5c6dcc3ccdd0b95dcfc08d421bb1","tarball":"http://registry.npmjs.org/anachronism/-/anachronism-0.0.0.tgz"},"maintainers":[{"name":"twisol","email":"twisolar@gmail.com"}],"directories":{}},"0.0.1":{"name":"anachronism","version":"0.0.1","main":"index.js","dependencies":{"underscore":"~1.1.7"},"_id":"anachronism@0.0.1","scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"64b3c970b60b8234d9c73dee5150e69ab3cf3aae","tarball":"http://registry.npmjs.org/anachronism/-/anachronism-0.0.1.tgz"},"maintainers":[{"name":"twisol","email":"twisolar@gmail.com"}],"directories":{}},"0.1.0":{"name":"anachronism","version":"0.1.0","main":"index.js","dependencies":{"underscore":"~1.1.7","class-42":"~1.0.0"},"_id":"anachronism@0.1.0","scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"f31bc692bf5d2cbc9cd4ca8770bf4239928c99cd","tarball":"http://registry.npmjs.org/anachronism/-/anachronism-0.1.0.tgz"},"maintainers":[{"name":"twisol","email":"twisolar@gmail.com"}]},"0.1.1":{"name":"anachronism","version":"0.1.1","main":"index.js","dependencies":{"underscore":"~1.1.7","class-42":"~1.0.0"},"_id":"anachronism@0.1.1","scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"add61f59dc84b48b50e13849d74f2c5134e11192","tarball":"http://registry.npmjs.org/anachronism/-/anachronism-0.1.1.tgz"},"maintainers":[{"name":"twisol","email":"twisolar@gmail.com"}]},"0.2.0":{"name":"anachronism","version":"0.2.0","keywords":["telnet"],"description":"A binding to the 'anachronism' Telnet library.","main":"index.js","dependencies":{"underscore":"~1.1.7","class-42":"~1.0.0"},"_npmUser":{"name":"twisol","email":"twisolar@gmail.com"},"_id":"anachronism@0.2.0","scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e50439f01f2120193f6395d23cd6d4f46e9b6ac0","tarball":"http://registry.npmjs.org/anachronism/-/anachronism-0.2.0.tgz"},"maintainers":[{"name":"twisol","email":"twisolar@gmail.com"}]}},"maintainers":[{"name":"twisol","email":"twisolar@gmail.com"}],"time":{"modified":"2011-10-27T05:27:14.355Z","created":"2011-08-06T04:52:09.753Z","0.0.0":"2011-08-06T04:52:10.281Z","0.0.1":"2011-08-06T04:55:25.764Z","0.1.0":"2011-09-20T08:05:45.755Z","0.1.1":"2011-10-01T03:57:27.448Z","0.2.0":"2011-10-27T05:27:14.355Z"},"description":"A binding to the 'anachronism' Telnet library.","_attachments":{"anachronism-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-vZdEuXNSYXCng325FgyM/Q==","length":149703,"stub":true},"anachronism-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-z7EljMUqZ0ce3UW0+8CaCg==","length":149171,"stub":true},"anachronism-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-sRUB0ZwEgbKC9oGtynraPg==","length":149163,"stub":true},"anachronism-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0/TP98mD5doR7S2jDmDrYw==","length":149090,"stub":true},"anachronism-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0vRvJ3PlzTinqvXmGgglyg==","length":149144,"stub":true}}}},
{"id":"anagram","key":"anagram","value":{"rev":"19-f0b82abe097fe97f29d17a84cbc63305"},"doc":{"_id":"anagram","_rev":"19-f0b82abe097fe97f29d17a84cbc63305","name":"anagram","description":"a simple anagram generator","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"anagram","version":"0.1.0","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/nodeagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram"},"scripts":{"test":"vows test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/nodeagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"fe0a9ebf3cf97a171bdf1c232d0c9af56f4c52ea","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.1.0.tgz"},"readme":"","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}],"directories":{}},"0.1.1":{"name":"anagram","version":"0.1.1","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/nodeagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram"},"scripts":{"test":"vows test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/nodeagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"ed47551a4e13cfc290f54f40b7733f183c5c7648","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.1.1.tgz"},"readme":"","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}],"directories":{}},"0.2.0":{"name":"anagram","version":"0.2.0","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/nodeagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1","optimist":"0.3.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram"},"scripts":{"test":"vows --spec test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/nodeagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"f30360de762a7a3b758aab61bca5f847c3dc7f22","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.2.0.tgz"},"readme":"","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}],"directories":{}},"0.2.1":{"name":"anagram","version":"0.2.1","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/nodeagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1","optimist":"0.3.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram"},"scripts":{"test":"vows --spec test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/nodeagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"758c38aeb12c4736a8f50d00266ac4281fecda6a","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.2.1.tgz"},"readme":"","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}],"directories":{}},"0.2.2":{"name":"anagram","version":"0.2.2","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/nodeagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1","optimist":"0.3.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram","anagram-build":"./bin/anagram-build"},"scripts":{"test":"vows --spec test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/nodeagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"8baea6dd09c6b77baaa4961bf4663104fd39a1b5","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.2.2.tgz"},"readme":"","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}],"directories":{}},"0.3.0":{"name":"anagram","version":"0.3.0","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/anagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1","optimist":"0.3.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram","anagram-build":"./bin/anagram-build"},"scripts":{"test":"vows --spec test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/anagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"618c92456f4583a65784761d82ea26d8ae02ac41","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.3.0.tgz"},"readme":"\n# anagram\n\n  A simple anagram generation library for use with nodejs. Forked from [jeresig/trie-js](https://github.com/jeresig/trie-js) by John Resig.\n\n## Installation\n\n\t$ npm install anagram\n\n## Examples\n\n```js\nvar anagram = require('anagram');\n\nanagram.init('../dict/twl06.js', function(err) {\n    if (err) throw err;\n    anagram.findAnagrams('dog', function(err, anagrams) {\n    \tconsole.log('`%s`: found %d anagrams', anagrams.input, anagrams.count);\n    \tconsole.log(anagrams);\n    });\n});\n```\n\n## Executables\n\n  anagram comes packed with two executables: `anagram` and `anagram-build`\n\n```shell\n$ anagram-build -f dict/twl06.txt > dict/twl06.js\n\n$ anagram -d dict/twl06.js -w anagr?m\n```\n\n## Running tests\n\n  Install development dependencies:\n  \n    $ npm install -d\n\n  Run the tests:\n\n    $ npm test\n\n## License\n\nCopyright (c) 2012 Ryan Nauman\n\nMIT Licensed","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}]},"0.4.0":{"name":"anagram","version":"0.4.0","author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"description":"a simple anagram generator","repository":{"type":"git","url":"git://github.com/ryan-nauman/anagram.git"},"keywords":["anagram","scrabble","nodeagram"],"dependencies":{"node.extend":"0.0.1","optimist":"0.3.1"},"devDependencies":{"vows":"*"},"license":"MIT","main":"index","bin":{"anagram":"./bin/anagram","anagram-build":"./bin/anagram-build"},"scripts":{"test":"vows --spec test/*"},"engines":{"node":"0.6.x"},"optionalDependencies":{},"homepage":"https://github.com/ryan-nauman/anagram","_npmUser":{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"},"_id":"anagram@0.4.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d81eb8c572d7f8d9a96097e15a70519af220bf9e","tarball":"http://registry.npmjs.org/anagram/-/anagram-0.4.0.tgz"},"readme":"\n# anagram\n\n  A simple anagram generation library for use with nodejs. Forked from [jeresig/trie-js](https://github.com/jeresig/trie-js) by John Resig.\n\n## Installation\n\n\t$ npm install anagram\n\n## Examples\n\n```js\nvar anagram = require('anagram');\n\nanagram.init('../dict/twl06.js', function(err) {\n    if (err) throw err;\n    anagram.findAnagrams('dog', function(err, anagrams) {\n    \tconsole.log('`%s`: found %d anagrams', anagrams.input, anagrams.count);\n    \tconsole.log(anagrams);\n    });\n});\n```\n\n## Executables\n\n  anagram comes packed with two executables: `anagram` and `anagram-build`\n\n```shell\n$ anagram-build -f dict/twl06.txt > dict/twl06.js\n\n$ anagram -d dict/twl06.js -w anagr?m\n```\n\n## Running tests\n\n  Install development dependencies:\n  \n    $ npm install -d\n\n  Run the tests:\n\n    $ npm test\n\n## License\n\nCopyright (c) 2012 Ryan Nauman\n\nMIT Licensed","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}]}},"readme":"","maintainers":[{"name":"ryan-nauman","email":"ryanjnauman@gmail.com"}],"time":{"modified":"2012-04-19T03:24:11.472Z","created":"2012-02-15T00:39:34.076Z","0.1.0":"2012-02-15T00:39:40.358Z","0.1.1":"2012-02-18T02:32:57.147Z","0.2.0":"2012-02-18T02:33:16.834Z","0.2.1":"2012-02-18T02:33:29.961Z","0.2.2":"2012-02-18T02:33:43.226Z","0.3.0":"2012-02-18T16:54:17.803Z","0.4.0":"2012-04-19T03:24:11.472Z"},"author":{"name":"Ryan Nauman","email":"ryanjnauman@gmail.com"},"repository":{"type":"git","url":"git://github.com/ryan-nauman/anagram.git"},"_attachments":{"anagram-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-qgdrx1hG/1qiU5oQRsBAXQ==","length":4214,"stub":true},"anagram-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ju9Oyqu4PaL9SpVpjiWsWw==","length":4080,"stub":true},"anagram-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-e6JoV8XRAESFxhYKkS+2eg==","length":3783,"stub":true},"anagram-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-0jes7ff6UYe9mm7ZvHZhsw==","length":3645,"stub":true},"anagram-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-52UnJjF0mIK8Rk9XjmdvlA==","length":2921,"stub":true},"anagram-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DAcsA+gwJSTrvGhuTVY02g==","length":2946,"stub":true},"anagram-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/m2qTH2daRUa+YSfYbAXsA==","length":2956,"stub":true}}}},
{"id":"analytics","key":"analytics","value":{"rev":"3-a143ccdd863b5f7dbee4d2f7732390b3"},"doc":{"_id":"analytics","_rev":"3-a143ccdd863b5f7dbee4d2f7732390b3","name":"analytics","description":"Analytics Module","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"analytics","version":"0.0.1","description":"Analytics Module","author":{"name":"Alex Sexton","email":"alexsexton@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/SlexAxton/node-analytics.git"},"dependencies":{},"devDependencies":{},"_id":"analytics@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"bcaa19acafb56831e3d9e85ce990489e75efd8f7","tarball":"http://registry.npmjs.org/analytics/-/analytics-0.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"slexaxton","email":"alexsexton@gmail.com"}],"time":{"modified":"2011-05-05T21:30:32.490Z","created":"2011-05-05T21:30:31.532Z","0.0.1":"2011-05-05T21:30:32.490Z"},"author":{"name":"Alex Sexton","email":"alexsexton@gmail.com"},"repository":{"type":"git","url":"git://github.com/SlexAxton/node-analytics.git"},"_attachments":{"analytics-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-B4/e/u6fzOb3PNgGhHGmiQ==","length":452,"stub":true}}}},
{"id":"ancestrydna-grunt-contrib","key":"ancestrydna-grunt-contrib","value":{"rev":"3-cdf48caa9d72fec952926f97351afc13"},"doc":{"_id":"ancestrydna-grunt-contrib","_rev":"3-cdf48caa9d72fec952926f97351afc13","name":"ancestrydna-grunt-contrib","description":"A collection of common grunt tasks as used by AncestryDNA.","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.7":{"name":"ancestrydna-grunt-contrib","description":"A collection of common grunt tasks as used by AncestryDNA.","version":"0.1.7","homepage":"https://github.com/ancestrydna/grunt-contrib","author":{"name":"AncestryDNA","url":"http://ancestrydna.github.com/grunt-contrib/"},"repository":{"type":"git","url":"git://github.com/AncestryDNA/grunt-contrib.git"},"bugs":{"url":"https://github.com/AncestryDNA/grunt-contrib/issues"},"licenses":[{"type":"MIT","url":"https://github.com/AncestryDNA/grunt-contrib/blob/master/LICENSE-MIT"}],"main":"grunt.js","bin":{"ancestrydna-grunt-contrib":"bin/grunt-contrib"},"engines":{"node":"*"},"scripts":{"test":"grunt --base ./test/ --config ./test/grunt.js"},"dependencies":{"grunt":"~0.3.10","rimraf":"~2.0.2","clean-css":"~0.4.1","zipstream":"~0.2.1","tar":"~0.1.13","fstream":"~0.1.18","handlebars":"~1.0.4","yuidocjs":"~0.3.14","underscore":"~1.3.3"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["gruntplugin"],"readme":"# grunt-contrib (as used by AncestryDNA)\r\n\r\nLatest version: 0.1.7\r\n[![Build Status](https://secure.travis-ci.org/AncestryDNA/grunt-contrib.png)](http://travis-ci.org/AncestryDNA/grunt-contrib)\r\n\r\nA collection of general use grunt tasks used by AncestryDNA. All tasks are designed with cross platform support in mind and dependencies that can easily be managed through npm.\r\n\r\n## Getting Started\r\nInstall this grunt plugin next to your project's [grunt.js gruntfile][getting_started] with: `npm install ancestrydna-grunt-contrib`\r\n\r\nThen add this line to your project's `grunt.js` gruntfile:\r\n\r\n```javascript\r\ngrunt.loadNpmTasks('ancestrydna-grunt-contrib');\r\n```\r\n\r\n[grunt]: https://github.com/cowboy/grunt\r\n[getting_started]: https://github.com/cowboy/grunt/blob/master/docs/getting_started.md\r\n\r\n## Included Tasks\r\n#### [`clean`](/ancestrydna/grunt-contrib/blob/master/docs/clean.md)\r\nClear files and folders.\r\n\r\n#### [`compress`](/ancestrydna/grunt-contrib/blob/master/docs/compress.md)\r\nCompress files and folders using gzip or zip.\r\n\r\n#### [`copy`](/ancestrydna/grunt-contrib/blob/master/docs/copy.md)\r\nCopy files into another directory.\r\n\r\n#### [`handlebars`](/ancestrydna/grunt-contrib/blob/master/docs/handlebars.md)\r\nCompile handlebars templates to JST file.\r\n\r\n#### [`mincss`](/ancestrydna/grunt-contrib/blob/master/docs/mincss.md)\r\nMinify CSS files.\r\n\r\n#### [`yuidoc`](/ancestrydna/grunt-contrib/blob/master/docs/yuidoc.md)\r\nCompile YUIDoc Documentation.\r\n\r\n## Included Helpers\r\n### [`options`](/ancestrydna/grunt-contrib/blob/master/docs/helpers.md#options)\r\nUnified options retrieval, will be replaced with grunt's built-in `this.options` in the near future.\r\n\r\n## Bugs\r\n\r\nHelp us squash them by submitting an issue that describes how you encountered it; please be as specific as possible including operating system, node, grunt, and grunt-contrib versions.\r\n\r\n## Contributing\r\n\r\n#### Checklist\r\n\r\n1. Ensure your task meets the submission guidelines.\r\n2. Ensure your task follows the code style guide.\r\n3. Submit your pull request against `master`, unless otherwise instructed.\r\n4. Ensure your pull request only touches what your changing and that it's squashed (ie `git rebase`).\r\n\r\n#### Submission Guidelines\r\n\r\n* task should work out of box, cross platform, with a simple `npm install`\r\n* task should fill a general need and ideally be pure JavaScript\r\n* task should include tests that cover, at minimal, its basic features\r\n* task should be linted by running `grunt` at root of project\r\n* task should use any built-in helpers first for consistency\r\n\r\n#### Code Style Guide\r\n\r\n* code should be indented with 2 spaces\r\n* commas should be followed by a single space (function params, etc)\r\n\r\n#### Tests\r\n\r\n* tests should be added to the config in `test/grunt.js`\r\n* see existing tests for guidance\r\n\r\n*Currently, testing with grunt is a bit cumbersome--this will be addressed in a future release.*\r\n\r\n#### Running Tests\r\n```bash\r\nnpm install grunt -g\r\nnpm install\r\nnpm test\r\n```\r\n\r\n## Release History\r\n\r\nsee [CHANGELOG](/ancestrydna/grunt-contrib/blob/master/CHANGELOG).\r\n\r\n## License\r\nCopyright (c) 2012 AncestryDNA.\r\nLicensed under the MIT license.","_id":"ancestrydna-grunt-contrib@0.1.7","dist":{"shasum":"7291dfa368e4111b236e34eba7bb304b9d8316dd","tarball":"http://registry.npmjs.org/ancestrydna-grunt-contrib/-/ancestrydna-grunt-contrib-0.1.7.tgz"},"maintainers":[{"name":"jdobry","email":"jason.dobry@gmail.com"}]}},"readme":"# grunt-contrib (as used by AncestryDNA)\r\n\r\nLatest version: 0.1.7\r\n[![Build Status](https://secure.travis-ci.org/AncestryDNA/grunt-contrib.png)](http://travis-ci.org/AncestryDNA/grunt-contrib)\r\n\r\nA collection of general use grunt tasks used by AncestryDNA. All tasks are designed with cross platform support in mind and dependencies that can easily be managed through npm.\r\n\r\n## Getting Started\r\nInstall this grunt plugin next to your project's [grunt.js gruntfile][getting_started] with: `npm install ancestrydna-grunt-contrib`\r\n\r\nThen add this line to your project's `grunt.js` gruntfile:\r\n\r\n```javascript\r\ngrunt.loadNpmTasks('ancestrydna-grunt-contrib');\r\n```\r\n\r\n[grunt]: https://github.com/cowboy/grunt\r\n[getting_started]: https://github.com/cowboy/grunt/blob/master/docs/getting_started.md\r\n\r\n## Included Tasks\r\n#### [`clean`](/ancestrydna/grunt-contrib/blob/master/docs/clean.md)\r\nClear files and folders.\r\n\r\n#### [`compress`](/ancestrydna/grunt-contrib/blob/master/docs/compress.md)\r\nCompress files and folders using gzip or zip.\r\n\r\n#### [`copy`](/ancestrydna/grunt-contrib/blob/master/docs/copy.md)\r\nCopy files into another directory.\r\n\r\n#### [`handlebars`](/ancestrydna/grunt-contrib/blob/master/docs/handlebars.md)\r\nCompile handlebars templates to JST file.\r\n\r\n#### [`mincss`](/ancestrydna/grunt-contrib/blob/master/docs/mincss.md)\r\nMinify CSS files.\r\n\r\n#### [`yuidoc`](/ancestrydna/grunt-contrib/blob/master/docs/yuidoc.md)\r\nCompile YUIDoc Documentation.\r\n\r\n## Included Helpers\r\n### [`options`](/ancestrydna/grunt-contrib/blob/master/docs/helpers.md#options)\r\nUnified options retrieval, will be replaced with grunt's built-in `this.options` in the near future.\r\n\r\n## Bugs\r\n\r\nHelp us squash them by submitting an issue that describes how you encountered it; please be as specific as possible including operating system, node, grunt, and grunt-contrib versions.\r\n\r\n## Contributing\r\n\r\n#### Checklist\r\n\r\n1. Ensure your task meets the submission guidelines.\r\n2. Ensure your task follows the code style guide.\r\n3. Submit your pull request against `master`, unless otherwise instructed.\r\n4. Ensure your pull request only touches what your changing and that it's squashed (ie `git rebase`).\r\n\r\n#### Submission Guidelines\r\n\r\n* task should work out of box, cross platform, with a simple `npm install`\r\n* task should fill a general need and ideally be pure JavaScript\r\n* task should include tests that cover, at minimal, its basic features\r\n* task should be linted by running `grunt` at root of project\r\n* task should use any built-in helpers first for consistency\r\n\r\n#### Code Style Guide\r\n\r\n* code should be indented with 2 spaces\r\n* commas should be followed by a single space (function params, etc)\r\n\r\n#### Tests\r\n\r\n* tests should be added to the config in `test/grunt.js`\r\n* see existing tests for guidance\r\n\r\n*Currently, testing with grunt is a bit cumbersome--this will be addressed in a future release.*\r\n\r\n#### Running Tests\r\n```bash\r\nnpm install grunt -g\r\nnpm install\r\nnpm test\r\n```\r\n\r\n## Release History\r\n\r\nsee [CHANGELOG](/ancestrydna/grunt-contrib/blob/master/CHANGELOG).\r\n\r\n## License\r\nCopyright (c) 2012 AncestryDNA.\r\nLicensed under the MIT license.","maintainers":[{"name":"jdobry","email":"jason.dobry@gmail.com"}],"time":{"modified":"2012-08-10T22:36:06.406Z","created":"2012-08-10T22:36:04.545Z","0.1.7":"2012-08-10T22:36:06.406Z"},"author":{"name":"AncestryDNA","url":"http://ancestrydna.github.com/grunt-contrib/"},"repository":{"type":"git","url":"git://github.com/AncestryDNA/grunt-contrib.git"},"_attachments":{"ancestrydna-grunt-contrib-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qb2uvSFi1WgceqtmsX6VxQ==","length":13587,"stub":true}}}},
{"id":"and1","key":"and1","value":{"rev":"3-3efbf65cc19ceaf259882d6bc1fd1301"},"doc":{"_id":"and1","_rev":"3-3efbf65cc19ceaf259882d6bc1fd1301","name":"and1","description":"Queues your asynchronous calls in the order they were made.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"and1","version":"0.1.0","engines":{"node":">= 0.4.0"},"description":"Queues your asynchronous calls in the order they were made.","author":{"name":"Jacob Swartwood"},"keywords":["and1","queue","promise","when","async"],"main":"and1.js","repository":{"type":"git","web":"http://github.com/jswartwood/and1.git","url":""},"dependencies":{"when":"https://github.com/briancavalier/when.js/tarball/0.10.4"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"./node_modules/.bin/mocha --require should --reporter list"},"bugs":{"url":"http://github.com/jswartwood/and1/issues"},"licenses":[{"type":"MIT","url":"http://jacob.swartwood.info/license/"}],"_npmUser":{"name":"jswartwood","email":"jswartwood@gmail.com"},"_id":"and1@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2a9a0d314f46ff1cac18627729a7c7b4bc120809","tarball":"http://registry.npmjs.org/and1/-/and1-0.1.0.tgz"},"maintainers":[{"name":"jswartwood","email":"jswartwood@gmail.com"}]}},"readme":"And1 - Turn Async to Sync\n=========================\n\n...\n\nLicense\n-------\n\n    * Copyright (c) 2012 Jacob Swartwood\n    * Licensed under the MIT license\n    * http://jacob.swartwood.info/license/\n","maintainers":[{"name":"jswartwood","email":"jswartwood@gmail.com"}],"time":{"modified":"2012-02-10T15:11:35.904Z","created":"2012-02-10T15:11:35.436Z","0.1.0":"2012-02-10T15:11:35.904Z"},"author":{"name":"Jacob Swartwood"},"repository":{"type":"git","web":"http://github.com/jswartwood/and1.git","url":""},"_attachments":{"and1-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VS61FjQcVsSARy8qE7uRzA==","length":10240,"stub":true}}}},
{"id":"andlog","key":"andlog","value":{"rev":"5-c87baac09eb5510685318631f9684a6e"},"doc":{"_id":"andlog","_rev":"5-c87baac09eb5510685318631f9684a6e","name":"andlog","description":"Super-simple, client-side CommonJS logging thingy","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"andlog","version":"0.0.2","author":{"name":"Henrik Joreteg","email":"henrik@andyet.net"},"description":"Super-simple, client-side CommonJS logging thingy","main":"andlog.js","repository":{"type":"git","url":"git@github.com:HenrikJoreteg/andlog.git"},"_id":"andlog@0.0.2","dist":{"shasum":"09ba9c4e75f1412e785b9f40eef4b940ce0b6399","tarball":"http://registry.npmjs.org/andlog/-/andlog-0.0.2.tgz"},"maintainers":[{"name":"henrikjoreteg","email":"henrik@andyet.net"}]},"0.0.3":{"name":"andlog","version":"0.0.3","author":{"name":"Henrik Joreteg","email":"henrik@andyet.net"},"description":"Super-simple, client-side CommonJS logging thingy","main":"andlog.js","repository":{"type":"git","url":"git@github.com:HenrikJoreteg/andlog.git"},"_id":"andlog@0.0.3","dist":{"shasum":"e71e7b0b166eae8e2a544429560827a8a176bc80","tarball":"http://registry.npmjs.org/andlog/-/andlog-0.0.3.tgz"},"maintainers":[{"name":"henrikjoreteg","email":"henrik@andyet.net"}]}},"readme":"# &log\n\nSuper simple, but solves these pain points:\n\n- Lets you leave log statements in production, client-side code.\n- It won't log anything unless `localStorage.debug` is set.\n- Uses native `console` rather than trying to wrap it in something (which makes the output ugly).\n- Works with CommonJS.\n- It's just a selective alias for the `window.console` so the normal API applies.\n\n## How to use it:\n\n\nStep 1. include it:\n\n```html\n<script src=\"andlog.js\"></script>\n```\n\nStep 2. Use the `console` in your code as usual:\n\n```javascript\nconsole.log(\"hello\");\n```\n\nStep 3. If you want to see log output set a value called `debug` in `localStorage` by doing typing this in console:\n\n```javascript\nlocalStorage.debug = true\n```\n\nStep 4. Refresh the page, you should now see logs.\n\nStep 5. To turn off console, just delete the localStorage flag:\n\n```javascript\ndelete localStorage.debug\n```\n\nStep 6. Feel free to deploy to production with console stuff in there.\n\n\n## CommonJS Version\n\nIf you're using this on the client but your project is in node.js you can install this with: https://github.com/henrikjoreteg/clientmodules and npm. \n\n```javascript\nvar logger = require('&log');\n\nlogger.log('hello');\n```\n\nThis is identical to:\n\n```javascript\nconsole.log('hello');\n```\n\nYou *could* even get fancy and call it `console`. However by doing this you take the risk that you'll forget to `require` it and it'll still work and you'll ship it to production. However, obviously this would work as well:\n\n```javascript\nvar console = require('&log');\n\nconsole.log('hello');\n```\n\n## License\n\nMIT\n\nIf you like this, follow [@HenrikJoreteg](http://twitter.com/henrikjoreteg) on the twitterwebz.","maintainers":[{"name":"henrikjoreteg","email":"henrik@andyet.net"}],"time":{"modified":"2012-08-15T06:29:39.975Z","created":"2012-08-15T06:24:22.388Z","0.0.2":"2012-08-15T06:24:23.889Z","0.0.3":"2012-08-15T06:29:39.975Z"},"author":{"name":"Henrik Joreteg","email":"henrik@andyet.net"},"repository":{"type":"git","url":"git@github.com:HenrikJoreteg/andlog.git"},"_attachments":{"andlog-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Ab7G1f0ZUFqJit5C9nRoEQ==","length":1673,"stub":true},"andlog-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xTdMy0XHLxJM45kyr/k3Vg==","length":1709,"stub":true}}}},
{"id":"andreyvit-gently","key":"andreyvit-gently","value":{"rev":"3-30e40645bda863dbe20bbc7020904b80"},"doc":{"_id":"andreyvit-gently","_rev":"3-30e40645bda863dbe20bbc7020904b80","name":"andreyvit-gently","dist-tags":{"latest":"0.9.2andreyvit1"},"versions":{"0.9.2andreyvit1":{"name":"andreyvit-gently","version":"0.9.2andreyvit1","directories":{"lib":"./lib/gently"},"main":"./lib/gently/index","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"andreyvit","email":"andreyvit@me.com"},"_id":"andreyvit-gently@0.9.2andreyvit1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"f174bca0c3895504b912d7d4281bcc53527aa6f5","tarball":"http://registry.npmjs.org/andreyvit-gently/-/andreyvit-gently-0.9.2andreyvit1.tgz"},"maintainers":[{"name":"andreyvit","email":"andreyvit@me.com"}]}},"readme":"# Gently\n\n## Purpose\n\nA node.js module that helps with stubbing and behavior verification. It allows you to test the most remote and nested corners of your code while keeping being fully unobtrusive.\n\n## Features\n\n* Overwrite and stub individual object functions\n* Verify that all expected calls have been made in the expected order\n* Restore stubbed functions to their original behavior\n* Detect object / class names from obj.constructor.name and obj.toString()\n* Hijack any required module function or class constructor\n\n## Installation\n\nVia [npm](http://github.com/isaacs/npm):\n\n    npm install gently@latest\n\n## Example\n\nMake sure your dog is working properly:\n\n    function Dog() {}\n\n    Dog.prototype.seeCat = function() {\n      this.bark('whuf, whuf');\n      this.run();\n    }\n\n    Dog.prototype.bark = function(bark) {\n      require('sys').puts(bark);\n    }\n\n    var gently = new (require('gently'))\n      , assert = require('assert')\n      , dog = new Dog();\n\n    gently.expect(dog, 'bark', function(bark) {\n      assert.equal(bark, 'whuf, whuf');\n    });\n    gently.expect(dog, 'run');\n\n    dog.seeCat();\n\nYou can also easily test event emitters with this, for example a simple sequence of 2 events emitted by `fs.WriteStream`:\n\n    var gently = new (require('gently'))\n      , stream = new (require('fs').WriteStream)('my_file.txt');\n\n    gently.expect(stream, 'emit', function(event) {\n      assert.equal(event, 'open');\n    });\n\n    gently.expect(stream, 'emit', function(event) {\n      assert.equal(event, 'drain');\n    });\n\nFor a full read world example, check out this test case: [test-incoming-form.js](http://github.com/felixge/node-formidable/blob/master/test/simple/test-incoming-form.js) (in [node-formdiable](http://github.com/felixge/node-formidable)).\n\n## API\n\n### Gently\n\n#### new Gently()\n\nCreates a new gently instance. It listens to the process `'exit'` event to make sure all expectations have been verified.\n\n#### gently.expect(obj, method, [[count], stubFn])\n\nCreates an expectation for an objects method to be called. You can optionally specify the call `count` you are expecting, as well as `stubFn` function that will run instead of the original function.\n\nReturns a reference to the function that is getting overwritten.\n\n#### gently.expect([count], stubFn)\n\nReturns a function that is supposed to be executed `count` times, delegating any calls to the provided `stubFn` function. Naming your stubFn closure will help to properly diagnose errors that are being thrown:\n\n    childProcess.exec('ls', gently.expect(function lsCallback(code) {\n      assert.equal(0, code);\n    }));\n\n#### gently.restore(obj, method)\n\nRestores an object method that has been previously overwritten using `gently.expect()`.\n\n#### gently.hijack(realRequire)\n\nReturns a new require functions that catches a reference to all required modules into `gently.hijacked`.\n\nTo use this function, include a line like this in your `'my-module.js'`.\n\n    if (global.GENTLY) require = GENTLY.hijack(require);\n\n    var sys = require('sys');\n    exports.hello = function() {\n      sys.log('world');\n    };\n\nNow you can write a test for the module above:\n\n    var gently = global.GENTLY = new (require('gently'))\n      , myModule = require('./my-module');\n\n    gently.expect(gently.hijacked.sys, 'log', function(str) {\n      assert.equal(str, 'world');\n    });\n\n    myModule.hello();\n\n#### gently.stub(location, [exportsName])\n\nReturns a stub class that will be used instead of the real class from the module at `location` with the given `exportsName`.\n\nThis allows to test an OOP version of the previous example, where `'my-module.js'`.\n\n    if (global.GENTLY) require = GENTLY.hijack(require);\n\n    var World = require('./world');\n\n    exports.hello = function() {\n      var world = new World();\n      world.hello();\n    }\n\nAnd `world.js` looks like this:\n\n    var sys = require('sys');\n\n    function World() {\n\n    }\n    module.exports = World;\n\n    World.prototype.hello = function() {\n      sys.log('world');\n    };\n\nTesting `'my-module.js'` can now easily be accomplished:\n\n    var gently = global.GENTLY = new (require('gently'))\n      , WorldStub = gently.stub('./world')\n      , myModule = require('./my-module')\n      , WORLD;\n\n    gently.expect(WorldStub, 'new', function() {\n      WORLD = this;\n    });\n\n    gently.expect(WORLD, 'hello');\n\n    myModule.hello();\n\n#### gently.hijacked\n\nAn object that holds the references to all hijacked modules.\n\n#### gently.verify([msg])\n\nVerifies that all expectations of this gently instance have been satisfied. If not called manually, this method is called when the process `'exit'` event is fired.\n\nIf `msg` is given, it will appear in any error that might be thrown.\n\n## License\n\nGently is licensed under the MIT license.","maintainers":[{"name":"andreyvit","email":"andreyvit@me.com"}],"time":{"modified":"2012-04-09T05:22:40.300Z","created":"2012-04-09T05:22:37.105Z","0.9.2andreyvit1":"2012-04-09T05:22:40.300Z"},"_attachments":{"andreyvit-gently-0.9.2andreyvit1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-roPYnt+owLESNcquoVimVA==","length":5544,"stub":true}}}},
{"id":"andtan-node-hid","key":"andtan-node-hid","value":{"rev":"6-a207180ca7722ed17be284d1d5c95ab2"},"doc":{"_id":"andtan-node-hid","_rev":"6-a207180ca7722ed17be284d1d5c95ab2","name":"andtan-node-hid","dist-tags":{"latest":"0.0.12"},"versions":{"0.0.1":{"author":"","name":"andtan-node-hid","version":"0.0.1","repository":{"type":"git","url":"git://github.com/andtan/node-hid.git"},"scripts":{"install":"cd ./src/ && node-waf configure build"},"main":"./index.js","engines":{"node":"~0.6.11"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"gorillatron","email":"jornandretangen@gmail.com"},"_id":"andtan-node-hid@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d5b14a1043af33c252fdb62c588c43bda0b27393","tarball":"http://registry.npmjs.org/andtan-node-hid/-/andtan-node-hid-0.0.1.tgz"},"maintainers":[{"name":"gorillatron","email":"jornandretangen@gmail.com"}]},"0.0.11":{"author":"","name":"andtan-node-hid","version":"0.0.11","repository":{"type":"git","url":"git://github.com/andtan/node-hid.git"},"scripts":{"install":"git submodule init && git submodule update && cd ./src/ && node-waf configure build"},"main":"./index.js","engines":{"node":"~0.6.11"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"gorillatron","email":"jornandretangen@gmail.com"},"_id":"andtan-node-hid@0.0.11","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"eebb529a1104757ff175ce233b095694209e291a","tarball":"http://registry.npmjs.org/andtan-node-hid/-/andtan-node-hid-0.0.11.tgz"},"maintainers":[{"name":"gorillatron","email":"jornandretangen@gmail.com"}]},"0.0.12":{"author":"","name":"andtan-node-hid","version":"0.0.12","repository":{"type":"git","url":"git://github.com/andtan/node-hid.git"},"scripts":{"install":"cd ./src/ && node-waf configure build"},"main":"./index.js","engines":{"node":"~0.6.11"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"gorillatron","email":"jornandretangen@gmail.com"},"_id":"andtan-node-hid@0.0.12","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"468426e0e83c9ba3eb0be95f3aa709a286aaef9f","tarball":"http://registry.npmjs.org/andtan-node-hid/-/andtan-node-hid-0.0.12.tgz"},"maintainers":[{"name":"gorillatron","email":"jornandretangen@gmail.com"}]}},"readme":"# node-hid - Access USB HID devices from node.js #\n\nPrerequisites:\n\nMac OS (I use 10.6.8) or Linux (I use Ubuntu 11.10 with Linux 3.0 on x86_64)\nnode.js v0.6, built from source.\n\nPull the required submodule:\n\ngit submodule init\ngit submodule update\n\nBuild the extension:\n\n```\n$ cd src/\n$ node-waf configure build\n```\n\nTry it:\n\n```\n$ node show-devices.js\ndevices: [ { vendorId: 1452,\n    productId: 595,\n    path: 'USB_05ac_0253_0x100a148e0',\n    serialNumber: '',\n    manufacturer: 'Apple Inc.',\n    product: 'Apple Internal Keyboard / Trackpad',\n    release: 280,\n    interface: -1 },\n  { vendorId: 1452,\n    productId: 595,\n    path: 'USB_05ac_0253_0x100a14e20',\n    serialNumber: '',\n    manufacturer: 'Apple Inc.',\n    product: 'Apple Internal Keyboard / Trackpad',\n    release: 280,\n    interface: -1 },\n<and more>\n```\n\nIf you need help, send me an email (hans.huebner@gmail.com)\n","maintainers":[{"name":"gorillatron","email":"jornandretangen@gmail.com"}],"time":{"modified":"2012-04-09T00:24:06.221Z","created":"2012-04-09T00:09:16.263Z","0.0.1":"2012-04-09T00:09:18.152Z","0.0.11":"2012-04-09T00:13:50.599Z","0.0.12":"2012-04-09T00:24:06.221Z"},"repository":{"type":"git","url":"git://github.com/andtan/node-hid.git"},"_attachments":{"andtan-node-hid-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-2W5gaYovqT/Uf5KKczl7oA==","length":1792000,"stub":true},"andtan-node-hid-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-jn4Z62XFrThyD3Ng9NVA6g==","length":1792000,"stub":true}}}},
{"id":"angular","key":"angular","value":{"rev":"13-9626dde1e7f747bff045a035ee59c1bf"},"doc":{"_id":"angular","_rev":"13-9626dde1e7f747bff045a035ee59c1bf","name":"angular","description":"Node.JS + AngularJS project generator","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"angular","author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"}],"homepage":"http://github.com/edwardhotchkiss/node-angular","description":"Node.JS + Angular.JS project generator","version":"0.0.1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/node-angular.git"},"keywords":["mvc","angular","routing","angular.js"],"engines":{"node":">= 0.6.0 < 0.7.0"},"main":"./lib/index","bin":{"angular":"./bin/angular.js"},"dependencies":{"mongoose":"2.5.13","express":"2.5.8","colors":"0.6.0-1"},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/node-angular/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/node-angular/LICENSE"}],"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"angular@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fcbf5beccc72292ac82f74ca34cc6797e7830817","tarball":"http://registry.npmjs.org/angular/-/angular-0.0.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}],"directories":{}},"0.0.1-1":{"name":"angular","author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"}],"homepage":"http://github.com/edwardhotchkiss/node-angular","description":"Node.JS + AngularJS project generator","version":"0.0.1-1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/node-angular.git"},"keywords":["mvc","angular","routing","angular.js"],"engines":{"node":">= 0.6.0 < 0.7.0"},"main":"./lib/index","bin":{"angular":"./bin/angular.js"},"dependencies":{"mongoose":"2.5.13","express":"2.5.8","colors":"0.6.0-1"},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/node-angular/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/node-angular/LICENSE"}],"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"angular@0.0.1-1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"6ad8700f8cf255f8b588ad69163d5507a85b7c3e","tarball":"http://registry.npmjs.org/angular/-/angular-0.0.1-1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}],"directories":{}},"0.0.1-2":{"name":"angular","author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"}],"homepage":"http://github.com/edwardhotchkiss/node-angular","description":"Node.JS + AngularJS project generator","version":"0.0.1-2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/node-angular.git"},"keywords":["mvc","angular","routing","angular.js"],"engines":{"node":">= 0.6.0 < 0.7.0"},"main":"./lib/index","bin":{"angular":"./bin/angular.js"},"dependencies":{"mongoose":"2.5.13","express":"2.5.8","colors":"0.6.0-1"},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/node-angular/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/node-angular/LICENSE"}],"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"angular@0.0.1-2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"36d921ba451b31720a6b74a6dd8f8c20aa78c3e8","tarball":"http://registry.npmjs.org/angular/-/angular-0.0.1-2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}],"directories":{}},"0.0.2":{"name":"angular","author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"contributors":[{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"}],"homepage":"http://github.com/edwardhotchkiss/node-angular","description":"Node.JS + AngularJS project generator","version":"0.0.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/node-angular.git"},"keywords":["mvc","angular","routing","angular.js"],"engines":{"node":">= 0.6.0"},"main":"./lib/index","bin":{"angular":"./bin/angular.js"},"dependencies":{"mongoose":"2.5.13","express":"2.5.10","colors":"0.6.0-1"},"devDependencies":{"vows":"0.6.2"},"bugs":{"url":"https://github.com/edwardhotchkiss/node-angular/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edwardhotchkiss/node-angular/LICENSE"}],"scripts":{"test":"vows test/*.test.js --spec"},"readme":"\n# node-angular [![Build Status](https://secure.travis-ci.org/edwardhotchkiss/node-angular.png)](http://travis-ci.org/edwardhotchkiss/node-angular)\n\n> Node.JS + Angular.JS project generator\n\nInstall:\n\n```bash\n$ sudo npm install angular -g\n```\n\nGenerate New Project:\n\n```bash\n$ angular new myapp && cd myapp\n$ npm install\n$ npm test\n$ angular server 9000\n$ open http://localhost:9000/\n```\n\n## License (MIT)\n\nCopyright (c) 2012, Edward Hotchkiss.\n\n### Author: [Edward Hotchkiss][0]\n\n[0]: http://edwardhotchkiss.com/\n","_id":"angular@0.0.2","dist":{"shasum":"e454bcc2221dee9465a00ece4313393bf5656389","tarball":"http://registry.npmjs.org/angular/-/angular-0.0.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}]}},"readme":"\n# node-angular [![Build Status](https://secure.travis-ci.org/edwardhotchkiss/node-angular.png)](http://travis-ci.org/edwardhotchkiss/node-angular)\n\n> Node.JS + Angular.JS project generator\n\nInstall:\n\n```bash\n$ sudo npm install angular -g\n```\n\nGenerate New Project:\n\n```bash\n$ angular new myapp && cd myapp\n$ npm install\n$ npm test\n$ angular server 9000\n$ open http://localhost:9000/\n```\n\n## License (MIT)\n\nCopyright (c) 2012, Edward Hotchkiss.\n\n### Author: [Edward Hotchkiss][0]\n\n[0]: http://edwardhotchkiss.com/\n","maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}],"time":{"modified":"2012-07-16T09:23:25.432Z","created":"2012-03-28T11:40:21.575Z","0.0.1":"2012-03-28T11:40:22.074Z","0.0.1-1":"2012-03-29T01:29:44.290Z","0.0.1-2":"2012-03-31T21:22:46.505Z","0.0.2":"2012-07-16T09:23:25.432Z"},"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"repository":{"type":"git","url":"git://github.com/edwardhotchkiss/node-angular.git"},"_attachments":{"angular-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-U9Su30bwKsUAmo/LDt3sYw==","length":37401,"stub":true},"angular-0.0.1-2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BEZhivFuafVKc0F1kPVqXA==","length":37793,"stub":true},"angular-0.0.1-1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-B9u9xUCXjrR0hp0mUfCKSQ==","length":37792,"stub":true},"angular-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-e6dbES/S9E+tSIqon132IA==","length":37822,"stub":true}}}},
{"id":"animation","key":"animation","value":{"rev":"13-cf7d7f0e574b50e2e1d54422dc926bd6"},"doc":{"_id":"animation","_rev":"13-cf7d7f0e574b50e2e1d54422dc926bd6","name":"animation","description":"animation timing & handling","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"name":"animation","description":"animation timing & handling","version":"0.0.1","homepage":"https://github.com/dodo/node-animation","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"main":"animation.js","engines":{"node":">= 0.4.x"},"keywords":["request","animation","frame","interval","node","browser"],"scripts":{"prepublish":"cake build"},"dependencies":{"ms":">= 0.1.0","request-animation-frame":">= 0.0.1"},"devDependencies":{"muffin":">= 0.2.6","coffee-script":">= 1.1.2"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"animation@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5a2561296c8f48718113c872348427036251b923","tarball":"http://registry.npmjs.org/animation/-/animation-0.0.1.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.0.2":{"name":"animation","description":"animation timing & handling","version":"0.0.2","homepage":"https://github.com/dodo/node-animation","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"main":"animation.js","engines":{"node":">= 0.4.x"},"keywords":["request","animation","frame","interval","node","browser"],"scripts":{"prepublish":"cake build"},"dependencies":{"ms":">= 0.1.0","request-animation-frame":">= 0.0.1"},"devDependencies":{"muffin":">= 0.2.6","coffee-script":">= 1.1.2"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"animation@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b427205b3c7c7e612aeb0ae264e7b54261908674","tarball":"http://registry.npmjs.org/animation/-/animation-0.0.2.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.1.0":{"name":"animation","description":"animation timing & handling","version":"0.1.0","homepage":"https://github.com/dodo/node-animation","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"main":"animation.js","engines":{"node":">= 0.4.x"},"keywords":["request","animation","frame","interval","node","browser"],"scripts":{"prepublish":"cake build"},"dependencies":{"ms":">= 0.1.0","request-animation-frame":">= 0.1.0"},"devDependencies":{"muffin":">= 0.2.6","coffee-script":">= 1.1.2"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"animation@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bf24adc79a1971d9f7e97cbe3d59174240a5e6dc","tarball":"http://registry.npmjs.org/animation/-/animation-0.1.0.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.1.1":{"name":"animation","description":"animation timing & handling","version":"0.1.1","homepage":"https://github.com/dodo/node-animation","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"main":"animation.js","engines":{"node":">= 0.4.x"},"keywords":["request","animation","frame","interval","node","browser"],"scripts":{"prepublish":"cake build"},"dependencies":{"ms":">= 0.1.0","request-animation-frame":">= 0.1.0"},"devDependencies":{"muffin":">= 0.2.6","coffee-script":">= 1.1.2"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"animation@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"34c4236e8c9e0093f94733d5244467802eadea03","tarball":"http://registry.npmjs.org/animation/-/animation-0.1.1.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.1.2":{"name":"animation","description":"animation timing & handling","version":"0.1.2","homepage":"https://github.com/dodo/node-animation","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"main":"animation.js","engines":{"node":">= 0.4.x"},"keywords":["request","animation","frame","interval","node","browser"],"scripts":{"prepublish":"cake build"},"dependencies":{"ms":">= 0.1.0","request-animation-frame":">= 0.1.0"},"devDependencies":{"muffin":">= 0.2.6","coffee-script":">= 1.1.2"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"animation@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"bb1e310a077e20237f9dff4a6dac4d8fe3277b45","tarball":"http://registry.npmjs.org/animation/-/animation-0.1.2.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.1.3":{"name":"animation","description":"animation timing & handling","version":"0.1.3","homepage":"https://github.com/dodo/node-animation","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"main":"animation.js","engines":{"node":">= 0.4.x"},"keywords":["request","animation","frame","interval","node","browser"],"scripts":{"prepublish":"cake build"},"dependencies":{"ms":">= 0.1.0","request-animation-frame":">= 0.1.0"},"devDependencies":{"muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","coffee-script":">= 1.1.2"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"animation@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"132bdfde017464b0daa7dfa138eec0608770e45e","tarball":"http://registry.npmjs.org/animation/-/animation-0.1.3.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]}},"readme":"# [animation](https://github.com/dodo/node-animation/)\n\nHandles Animation Timing and Handling for you.\n\nUses requesAnimationFrame when running on browser side.\n\n## Installation\n\n```bash\n$ npm install animation\n```\n\n## Usage\n\n```javascript\nanimation = new Animation({frame:'100ms'});\nanimation.on('tick', function (dt) { … });\nanimation.start();\n```\n\n[surrender-cube](https://github.com/dodo/node-surrender-cube/blob/master/src/index.coffee) uses this module to draw a rotating wireframe cube in terminal.\n\n## Animation\n\n```javascript\nanimation = new Animation({\n    // defaults\n    execution: '5ms', // allowed execution time per animation tick\n    timeout:   null,  // maximum time of a animation tick interval\n    toggle:    false, // if true animation pauses and resumes itself when render queue gets empty or filled\n    frame:     '16ms' // time per frame\n});\n```\n\nCreates a new Animation controller.\n\n### animation.start\n\n```javascript\nanimation.start();\n```\n\nStarts animation.\n\n### animation.stop\n\n```javascript\nanimation.stop();\n```\n\nStops animation.\n\n### animation.pause\n\n```javascript\nanimation.pause();\n```\nWhen autotoggle is enabled the Animation pauses itself if the render queue is empty.\n\n### animation.resume\n\n```javascript\nanimation.resume();\n```\n\nWhen autotoggle is enabled the Animation resumes itself when the render queue gets filled again after it was emtpy.\n\n### animation.nextTick\n\n```javascript\nanimation.nextTick(function (dt) { … });\n```\n\nGiven callback gets called on next animation tick when running and not paused.\n\n## Events\n\n### 'start'\n\n```javascript\nanimation.on('start', function () { … });\n```\n\nEmits `start` event every time the animation gets started.\n\n### 'stop'\n\n```javascript\nanimation.on('stop', function () { … });\n```\n\nEmits `stop` event every time the animation gets stopped.\n\n### 'pause'\n\n```javascript\nanimation.on('pause', function () { … });\n```\n\nEmits `pause` event every time the animation gets paused.\n\n### 'resume'\n\n```javascript\nanimation.on('resume', function () { … });\n```\n\nEmits `resume` event every time the animation gets resumed.\n\n### 'tick'\n\n```javascript\nanimation.on('tick', function (dt) { … });\n```\n\nEmits `tick` event every time the animation executes a animation tick.\n\n`dt` is the time since last animation tick.\n\nUse this to do your animation stuff.\n\n\n\n\n\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"time":{"modified":"2012-07-15T02:34:48.720Z","created":"2012-02-12T23:07:07.612Z","0.0.1":"2012-02-12T23:07:09.384Z","0.0.2":"2012-02-13T11:19:24.540Z","0.1.0":"2012-02-14T21:25:04.269Z","0.1.1":"2012-04-23T21:15:21.873Z","0.1.2":"2012-04-26T19:15:38.073Z","0.1.3":"2012-07-15T02:34:48.720Z"},"author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-animation.git"},"_attachments":{"animation-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vZ0aXDG+6fOInkxM8K8uIA==","length":742618,"stub":true},"animation-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZGYF+eoWHXxG8by+gG0kOg==","length":2990,"stub":true},"animation-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-D4i0CjUsCB1IPnDLYP6wUA==","length":3007,"stub":true},"animation-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tPbnOg0yNBwA4HonvKkK0w==","length":2495,"stub":true},"animation-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-08lHIOHvjapqIJO4wppHig==","length":2601,"stub":true},"animation-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lPvNVG3LkHoLv30kHXKBJA==","length":2698,"stub":true}}}},
{"id":"ankur","key":"ankur","value":{"rev":"4-ab38e2a838411437e6a96863dddca840"},"doc":{"_id":"ankur","_rev":"4-ab38e2a838411437e6a96863dddca840","name":"ankur","description":"Test","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Ankur Agarwal","email":"ankur@debuggify.net","url":"http://www.debuggify.net/"},"name":"ankur","description":"Test","version":"0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"ankur","email":"ankur@debuggify.net"},"_id":"ankur@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"04cdf24a3d1faa0c936f5a4e5c856e20659b845a","tarball":"http://registry.npmjs.org/ankur/-/ankur-0.0.1.tgz"},"readme":"","maintainers":[{"name":"ankur","email":"ankur@debuggify.net"}]}},"readme":"","maintainers":[{"name":"ankur","email":"ankur@debuggify.net"}],"time":{"modified":"2012-08-02T13:43:40.316Z","created":"2012-07-31T21:19:10.470Z","0.0.1":"2012-07-31T21:19:13.709Z"},"author":{"name":"Ankur Agarwal","email":"ankur@debuggify.net","url":"http://www.debuggify.net/"},"users":{"fgribreau":true},"_attachments":{"ankur-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EEtdsF5Ou79xhr0sZJgVkw==","length":291,"stub":true}}}},
{"id":"ann","key":"ann","value":{"rev":"9-41f00594d6216c439f05f7116a697cac"},"doc":{"_id":"ann","_rev":"9-41f00594d6216c439f05f7116a697cac","name":"ann","description":"IRC bot made to announce and for convenience.","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"ann","description":"IRC bot made to announce and for convenience.","keywords":["irc","bot"],"version":"0.1.0","homepage":"https://github.com/fent/Ann","repository":{"type":"git","url":"git://github.com/fent/Ann.git"},"author":{"name":"Roly Fentanes","url":"https://github.com/fent"},"main":"./lib/Ann.js","directories":{"lib":"./lib"},"engines":{"node":"*"},"dependencies":{"irc":">=0.2.0","async":">=0.1.9"},"devDependencies":{"cli-color":">=0.1.1","sprintf":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/fent/ann/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/prism/.npm/ann/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ann@0.1.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"68dd37a2f505a747fba428fc5248d956e4f4b940","tarball":"http://registry.npmjs.org/ann/-/ann-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"ann","description":"IRC bot made to announce and for convenience.","keywords":["irc","bot"],"version":"0.1.1","homepage":"https://github.com/fent/Ann","repository":{"type":"git","url":"git://github.com/fent/Ann.git"},"author":{"name":"Roly Fentanes","url":"https://github.com/fent"},"main":"./lib/Ann.js","directories":{"lib":"./lib"},"engines":{"node":"*"},"dependencies":{"irc":">=0.2.0","async":">=0.1.9"},"devDependencies":{"cli-color":">=0.1.1","sprintf":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/fent/ann/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/prism/.npm/ann/0.1.1/package/package.json","wscript":false,"serverjs":false,"contributors":false},"_id":"ann@0.1.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"5bd024c05761080b69b2530980fa94a6472936a9","tarball":"http://registry.npmjs.org/ann/-/ann-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"ann","description":"IRC bot made to announce and for convenience.","keywords":["irc","bot"],"version":"0.1.2","homepage":"https://github.com/fent/Ann","repository":{"type":"git","url":"git://github.com/fent/Ann.git"},"author":{"name":"Roly Fentanes","url":"https://github.com/fent"},"main":"./lib/Ann.js","directories":{"lib":"./lib"},"engines":{"node":"*"},"dependencies":{"irc":">=0.2.0","async":">=0.1.9"},"devDependencies":{"cli-color":">=0.1.1","sprintf":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/fent/ann/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/prism/.npm/ann/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ann@0.1.2","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"99371a427a1be76ae584353e586cccdcee60fb65","tarball":"http://registry.npmjs.org/ann/-/ann-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"ann","description":"IRC bot made to announce and for convenience.","keywords":["irc","bot"],"version":"0.1.3","homepage":"https://github.com/fent/Ann","repository":{"type":"git","url":"git://github.com/fent/Ann.git"},"author":{"name":"Roly Fentanes","url":"https://github.com/fent"},"main":"./lib/Ann.js","directories":{"lib":"./lib"},"engines":{"node":"*"},"dependencies":{"irc":">=0.2.0","async":">=0.1.9","cli-color":">=0.1.1","sprintf":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/fent/ann/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/prism/.npm/ann/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ann@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"bb0db0ac007362f7fa5605aea2d57a059a084a6c","tarball":"http://registry.npmjs.org/ann/-/ann-0.1.3.tgz"},"scripts":{}}},"maintainers":[{"name":"neat","email":"wrapper476@gmail.com"}],"time":{"modified":"2011-07-28T13:37:27.122Z","created":"2011-07-28T11:39:25.605Z","0.1.0":"2011-07-28T11:39:26.322Z","0.1.1":"2011-07-28T11:49:34.406Z","0.1.2":"2011-07-28T13:24:52.076Z","0.1.3":"2011-07-28T13:37:27.122Z"},"author":{"name":"Roly Fentanes","url":"https://github.com/fent"},"repository":{"type":"git","url":"git://github.com/fent/Ann.git"},"_attachments":{"ann-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SqLs46OXaWz+7KwQS4H2yA==","length":16495,"stub":true},"ann-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fLxCz1vmqm/BvLoasr7Lsw==","length":16354,"stub":true},"ann-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vv9vQAV6OhEud8oW9+IV9w==","length":16354,"stub":true},"ann-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-T5n36Bgr7sV1QZjxdHYo7w==","length":16479,"stub":true}}}},
{"id":"annotator","key":"annotator","value":{"rev":"3-06fce0efe626f31d00e781efaa0da2c5"},"doc":{"_id":"annotator","_rev":"3-06fce0efe626f31d00e781efaa0da2c5","name":"annotator","description":"Inline annotation for the web. Select text, images, or (nearly) anything else, and add your notes.","dist-tags":{"latest":"1.2.2"},"versions":{"1.2.2":{"name":"annotator","version":"1.2.2","description":"Inline annotation for the web. Select text, images, or (nearly) anything else, and add your notes.","repositories":[{"type":"git","url":"https://github.com/okfn/annotator.git"}],"devDependencies":{"coffee-script":"1.2.0","node-ffi":"0.5.0","uglify-js":"1.2.5","uglifycss":"0.0.5"},"engines":{"node":"~0.6.0"},"_npmUser":{"name":"nickstenning","email":"nick@whiteink.com"},"_id":"annotator@1.2.2","contributors":[{"name":"Aron Carroll","email":"hello@aroncarroll.com"},{"name":"Rufus Pollock","email":"rufus.pollock@okfn.org"},{"name":"Nick Stenning","email":"nick@whiteink.com"}],"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a320bcfa708c986f3e7654c79caf4d37d385d3ca","tarball":"http://registry.npmjs.org/annotator/-/annotator-1.2.2.tgz"},"readme":"","maintainers":[{"name":"nickstenning","email":"nick@whiteink.com"}]}},"readme":"","maintainers":[{"name":"nickstenning","email":"nick@whiteink.com"}],"time":{"modified":"2012-03-30T14:23:48.548Z","created":"2012-03-30T14:23:46.860Z","1.2.2":"2012-03-30T14:23:48.548Z"},"_attachments":{"annotator-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OlYiytHU0nxzt93dGopsOw==","length":336831,"stub":true}}}},
{"id":"announce.js","key":"announce.js","value":{"rev":"39-193a121335b31d05638a7bf83e94b939"},"doc":{"_id":"announce.js","_rev":"39-193a121335b31d05638a7bf83e94b939","name":"announce.js","description":"Add real-time push notifications to your existing web application","dist-tags":{"latest":"0.2.31"},"versions":{"0.1.0":{"name":"announce.js","version":"0.1.0","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.8.7","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.1.0","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"97b8f89e2d5b033e89f71bde2ce718d8d6d1a6b9","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.1.0.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.1.1":{"name":"announce.js","version":"0.1.1","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.1.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5b517a36a6987ccc80d90afc2cb390acbcc38082","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.1.1.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.1.2":{"name":"announce.js","version":"0.1.2","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.1.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c5d39000c47da61f08f03a62a051196a3e7ea574","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.1.2.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.1.21":{"name":"announce.js","version":"0.1.21","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.1.21","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6dadb70f7de64548fd0b88cffb0d76aba1382f0f","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.1.21.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.0":{"name":"announce.js","version":"0.2.0","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.0","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"370f5db188b6aa28331b50836f5820ca053ca09b","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.0.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.1":{"name":"announce.js","version":"0.2.1","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"c7a4473c8470dbfabb9728b184dad2df989c01f4","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.1.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.11":{"name":"announce.js","version":"0.2.11","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.11","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"d16f0cc4a119c06dbc5bb8f9df827a1f3c254ffe","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.11.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.12":{"name":"announce.js","version":"0.2.12","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.12","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"be88f53795746f2b33ada324336692defb9e1622","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.12.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.13":{"name":"announce.js","version":"0.2.13","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.13","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ab5493daf69c235009536bf50b1a9bc5688a84d4","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.13.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.14":{"name":"announce.js","version":"0.2.14","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.14","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ac254bc4f436001b76207dc098df99f939a9f098","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.14.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.15":{"name":"announce.js","version":"0.2.15","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.15","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0d688f06c1a173ef89bbbad5bb3323de8f4f2e27","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.15.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.2":{"name":"announce.js","version":"0.2.2","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f47dfabd959c9f4d39151987537a1435eed1aa74","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.2.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.21":{"name":"announce.js","version":"0.2.21","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.21","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"cdb97310ba817243eb281a1a4d15a92c66b617a9","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.21.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.22":{"name":"announce.js","version":"0.2.22","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.2","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.22","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"151b2dd3eeb0a196a2ccdd44482d3fffbfff40f8","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.22.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.23":{"name":"announce.js","version":"0.2.23","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.6","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.23","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"5d44377a6f02f0f0a018657ca0ea03d7167cdf7a","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.23.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.24":{"name":"announce.js","version":"0.2.24","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.6","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.24","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b2116306d9774e051dd04a4678f5d57c1768885a","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.24.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.25":{"name":"announce.js","version":"0.2.25","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","engines":["node >= 0.6.11"],"main":"server.js","dependencies":{"config":"0.4.11","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.6","node-uuid":"1.3.3"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.25","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e2a0b40710d944c245bb619d63c7226964f56080","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.25.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.3":{"name":"announce.js","author":{"name":"Oz Katz","email":"oz.katz@ripplify.com"},"version":"0.2.3","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","bin":{"announce":"./server.js"},"engines":["node >= 0.6.11"],"keywords":["server","websocket","realtime","http","socket.io"],"license":"MIT","repository":{"type":"git","url":"git://github.com/ozkatz/announce.js.git"},"dependencies":{"optimist":"0.3.4","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.6","node-uuid":"1.3.3"},"devDependencies":{"expresso":"0.9.2","socket.io-client":"0.9.6"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.3","scripts":{"start":"node server.js"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"1bf3a521e36ac30d0932ca68a31bac1d3f9812c4","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.3.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]},"0.2.31":{"name":"announce.js","author":{"name":"Oz Katz","email":"oz.katz@ripplify.com"},"version":"0.2.31","description":"Add real-time push notifications to your existing web application","homepage":"http://github.com/ozkatz/announce.js","bin":{"announce":"./server.js"},"engines":["node >= 0.6.11"],"keywords":["server","websocket","realtime","http","socket.io"],"license":"MIT","repository":{"type":"git","url":"git://github.com/ozkatz/announce.js.git"},"dependencies":{"optimist":"0.3.4","express":"2.5.8","hiredis":"0.1.14","redis":"0.7.1","socket.io":"0.9.6","node-uuid":"1.3.3"},"devDependencies":{"expresso":"0.9.2","socket.io-client":"0.9.6"},"_npmUser":{"name":"ozkatz","email":"oz.katz@ripplify.com"},"_id":"announce.js@0.2.31","scripts":{"start":"node server.js"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a1981be5fdbf574bf800b47d6b551f38cbd56c96","tarball":"http://registry.npmjs.org/announce.js/-/announce.js-0.2.31.tgz"},"maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}]}},"readme":"# Announce.js\n\nannounce.js is node.js + socket.io server used for adding real-time push notifications to your existing web application.\n\n## what does that mean exactly? \n\nSay you have an awesome web app you developed in Django\\Rails\\PHP\\Perl\\Java\\Bash\\Awk.\nYou one day wake up and decide you want to add support for push (real-time) notifications.\nSure, you can run periodic AJAX calls, do long-polling, or utilize WebSockets yourself.\nBut that's a lot of work, and that's what [Socket.IO](http://socket.io/ \"Socket.IO\") is for.\n\nannounce.js lets you seamlessly (well, almost) integrate your existing framework with the power of node and socket.io.\njust install it, add the proper client for your web framework of choice (currently, it's Django only),\nand send those realtime messages from your own code, in your own language, inside your own views.\n\n## Awesome, How does it work?\n\nWell, it's basically a proxy server. when your web app calls Announce.js, it does so over an internal HTTP API.\nOn the client side, your client is also connected to the announce.js sever, using socket.io.\nSo when you, inside your webapp, send a request (lets say, send a message \"you rock!\" to user A)\nthe announce.js API takes that request, looks the appropriate socket for a client called \"A\", and emits\nthat message. that's the basic workflow.\n\n## Dependencies\n\nAnnounce.js requires the following software installed and configured:\n\n* [Node.js](http://nodejs.org/ \"Node.js\")\n* [NPM](http://npmjs.org/ \"NPM\") (automatically installs all 3rd party libraries this project depends on.)\n* [Redis](http://redis.io/ \"Redis\") (optional, but highly recommended. see *Configuration* below).\n\n\n## Installation\n\ninstalling is pretty simple.\n\n```bash\nnpm install announce.js\n```\n\n\n## Run the server\n\n```bash\nnode node_modules/announce.js/server.js\n```\n\n\n## Configuration\n\nConfiguring announce is done by creating a json file inside `announce.js/config/`.\nthe name of that file should be `<environment name>.json`. where `<environment name>` is replaced\nby the value of the environment variable `NODE_ENV`. If it isn't set, the default would be `development.json`.\nto run with anything else (say, production) start your node server like this:\n\n```bash\nNODE_ENV=production node server.js\n```\n\nFor most cases, all the above is not required as announce.js has some pretty sane defaults.\nin any case, these config parameters are supported:\n\n* `storage` - which storage backend to use. options are either `mem` or `redis`. defaults to `redis`, which also happens to be the preffered backend. the local memory backend should only be used for testing.\n* `redis_host` - the host used for Redis connections. defaults to `'localhost'`.\n* `redis_port` - the port used for Redis connections. defaults to `6379`.\n* `api_host` - the host to listen on for the internal API. this should be the same value used in your webapp to connect to announce.js. defaults to `'localhost'`.\n* `api_port` - the port to listen on for the internal API. this should be the same value used in your webapp to connect to announce.js. defaults to `6600`.\n* `socket_host` - the host to listen on for the external socket.IO server. defaults to `'0.0.0.0'` (so it will be available from the \"outside\").\n* `socket_port` - the port to listen on for the external socket.IO server. this should be open in your firewall for traffic coming in from the internet. defaults to `5500`.\n* `ssl_key` - path to an optional SSL key file. Add this and `ssl_certificate` if you want to server Announce.js over HTTPS.\n* `ssl_certificate` - path to an SSL certificate file. the server will start in SSL mode only if both `ssl_key` and `ssl_certificate` are provided, and both are valid. else, it will start in regular, unencrypted HTTP. so pay attention.\n* `sockets_volatile` - whether or not to buffer messages when sending to a client. read more about volatile mode [here](volatile \"Socket.IO wiki\"). defaults to `false`.\n\n\n## Authorization\n\nThe announce.js authorization model works like this:\n\n1. client A makes a request to your webapp.\n2. your webapp turns to announce.js's internal API and requests a token for that user's ID.\n3. upon receiving the token, the webapp sets a cookie called `announceToken` to the value of the token, and renders the requested page back to client A.\n4. the requested page (containing the announce.js javascript include) uses this cookie to retrieve the token, and validates it against the announce.js server.\n5. upon successful validation, a connection is established and your client will start listening on channels and events you define.\n\nSteps 2,3,4,5 (requesting the token, setting the cookie, including the JS file, validating the token from the client)\nare all handled by your platform's announce.js client.\n\n\n## Usage Example (using the Django client)\n\n* install the announce.js server as described above, and run it.\n* add `announce` to `INSTALLED_APPS` in your settings.py file.\n* add `'announce.middleware.AnnounceCookieMiddleware'` to your `MIDDLEWARE_CLASSES`settings. right above `SessionMiddleware`. this will take care of setting the authentication cookie.\n* in your templates, add `{% load announcetags %}` at the top of the template. inside your `<head>` tag, add `{% announce_js %}`. this will include the proper `<script>` tags for you. place this tag above any js files that use the announce.js client.\n* the following optional settings are availabe:\n    * `ANNOUNCE_CLIENT_ADDR` - defaults to `'localhost:5500'`. *should probably be changed for production.*\n    * `ANNOUNCE_API_ADDR` - defaults to `'localhost:6600'`.\n    * `ANNOUNCE_HTTPS` - defaults to `False`. HTTPS is not yet implemented.\n\nNow, from a view, emit a message to a user:\n\n```python\nfrom announce import AnnounceClient\nannounce_client = AnnounceClient()\n\n# This is our pseudo view code\ndef comment_on_blog(request):\n    post = Post.objects.get(...)\n    # Process stuff, handle forms, do whatever you want.\n    announce_client.emit(\n        post.author.pk,\n        'notifications',\n        data={ 'msg' : 'You have a new comment!' }\n    )\n    # Some other things happening here..\n    return render_to_response('blog_post.html', ctx)\n```\n\nIn your HTML code, add the following JS snippet, to receive this notification on the client's side:\n\n```js\n// use .on() to add a listener. you can add as many listeners as you want.\nannounce.on('notifications', function(data){\n    alert(data.msg);\n});\n\n// .init() will authenticate against the announce.js server, and open the WebSocket connection.\nannounce.init();\n```\n\nYour client should receive an alert with the notification. the channel name (`notifications`) and the data you send\nare completley up to you, so be creative and use it wisely.\n\nIf you have more than one channel we want to listen on, we can also chain these calls:\n\n```js\nannounce.on('notifications', function(data){\n    popupNotification(data.msg);\n\n}).on('alerts', function(data)}{\n    alert(data.alert_msg);\n\n}).on('something-else', function(data){\n    $('#someDiv').html(data.htmlContent);\n    \n}).init();\n```\n\n## TODO\n\nWell, announce.js is still brand new, and there are many ways to improve it.\nHere are some ideas that come to mind:\n\n* documentation. this README might be enough to get started, but we need good API reference, a getting started tutorial,\n and real world examples.\n* MOAR CLIENTS! support more languages and frameworks: RoR, PHP, etc.\n* Maybe rethink the authorization model. Need to better understand the security behind the cookie based token mechanism.\n* Add support for full duplex? i.e. client could also send events to the server. not sure about this one yet.\n* probably many other things to come.\n","maintainers":[{"name":"ozkatz","email":"oz.katz@ripplify.com"}],"time":{"modified":"2012-06-06T21:56:56.333Z","created":"2012-03-11T22:42:34.098Z","0.1.0":"2012-03-11T22:42:36.679Z","0.1.1":"2012-03-13T17:43:35.767Z","0.1.2":"2012-03-28T18:39:22.406Z","0.1.21":"2012-03-28T18:43:03.217Z","0.2.0":"2012-05-01T17:56:36.222Z","0.2.1":"2012-05-06T00:11:24.120Z","0.2.11":"2012-05-06T13:45:12.333Z","0.2.12":"2012-05-06T23:08:52.794Z","0.2.13":"2012-05-07T11:20:18.422Z","0.2.14":"2012-05-09T13:19:02.859Z","0.2.15":"2012-05-10T08:09:05.414Z","0.2.2":"2012-05-15T09:11:47.681Z","0.2.21":"2012-05-21T22:58:16.361Z","0.2.22":"2012-05-22T13:33:22.955Z","0.2.23":"2012-05-23T18:22:19.806Z","0.2.24":"2012-05-23T23:57:34.054Z","0.2.25":"2012-05-24T09:53:47.432Z","0.2.3":"2012-06-01T00:38:22.781Z","0.2.31":"2012-06-06T21:56:56.333Z"},"author":{"name":"Oz Katz","email":"oz.katz@ripplify.com"},"repository":{"type":"git","url":"git://github.com/ozkatz/announce.js.git"},"_attachments":{"announce.js-0.2.31.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-zX2UMlVpj+G2SV9POROSag==","length":15510,"stub":true},"announce.js-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-lAwAdl7YQ5ZQVKwDORNMDg==","length":15512,"stub":true},"announce.js-0.2.25.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-SXW3BvwNrdtG06QzVb7CNA==","length":14478,"stub":true},"announce.js-0.2.24.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-ggNcmIpYNK07fLT50ERQEw==","length":14407,"stub":true},"announce.js-0.2.23.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-jeKO08O+g2Xuj62hDq5bPg==","length":14359,"stub":true},"announce.js-0.2.22.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-3oVhM7IyqhvS0SxaHumk3A==","length":14329,"stub":true},"announce.js-0.2.21.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-y3T/SVbzhKVIO4cK7R39kA==","length":14183,"stub":true},"announce.js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-hQgQAIiQbvQ//fQxoKW+EA==","length":14187,"stub":true},"announce.js-0.2.15.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-bKQL1OTF4EE2rczP9xmTtw==","length":14110,"stub":true},"announce.js-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-vKsEqZ6Sus3q0EnNIrzXIA==","length":14133,"stub":true},"announce.js-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-wfvwWXT+cVxSUV8k468kHQ==","length":14002,"stub":true},"announce.js-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-trWzqAGNiynN2ow+8D6T1g==","length":14008,"stub":true},"announce.js-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-6B/28PsHPgMp8H0U3ZfzTg==","length":13978,"stub":true},"announce.js-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Dc8jaDL7KeINvmC5kqpSfw==","length":13909,"stub":true},"announce.js-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-EOXBgaEr3Ok8bID7X8kREw==","length":13799,"stub":true},"announce.js-0.1.21.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-c4qjY03TB2cdW8czBIqwMQ==","length":12304,"stub":true},"announce.js-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-T/mbW55VHXVUTZpX3lJn4w==","length":12305,"stub":true},"announce.js-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HgDDPatNzTIeKUwETExBIQ==","length":12302,"stub":true},"announce.js-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+rk/TRR9XR7g1TONs0RJhQ==","length":12302,"stub":true}}}},
{"id":"anode","key":"anode","value":{"rev":"11-8b31e18070b9d41279264ff85ebb7e6c"},"doc":{"_id":"anode","_rev":"11-8b31e18070b9d41279264ff85ebb7e6c","name":"anode","description":"Humus inspired actor framework for Node.js","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.2":{"name":"anode","description":"Humus inspired actor framework for Node.js","version":"0.1.2","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"contributors":[{"name":"Dale Schumacher","email":"dale.schumacher@gmail.com"}],"keywords":["actor","actors","scala","erlang","message passing"],"main":"./lib/actor.js","engines":{"node":">= 0.6.x"},"dependencies":{"async-events":"0.1.1","coffee-script":"1.1.2","pkginfo":"0.2.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"anode@0.1.2","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"2f9f7ab2accd445f85334e15dd95e1392424d394","tarball":"http://registry.npmjs.org/anode/-/anode-0.1.2.tgz"},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]},"0.1.3":{"name":"anode","description":"Humus inspired actor framework for Node.js","version":"0.1.3","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"contributors":[{"name":"Dale Schumacher","email":"dale.schumacher@gmail.com"}],"keywords":["actor","actors","scala","erlang","message passing"],"main":"./lib/actor.js","engines":{"node":">= 0.4.x"},"dependencies":{"async-events":"0.1.1","coffee-script":"1.1.2","pkginfo":"0.2.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"anode@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"d976d9c9ed7ef569e1324e8c84f00018bcba307e","tarball":"http://registry.npmjs.org/anode/-/anode-0.1.3.tgz"},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]},"0.1.4":{"name":"anode","description":"Humus inspired actor framework for Node.js","version":"0.1.4","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"contributors":[{"name":"Dale Schumacher","email":"dale.schumacher@gmail.com"}],"keywords":["actor","actors","scala","erlang","message passing"],"main":"./lib/actor.js","engines":{"node":">= 0.4.x"},"dependencies":{"async-events":"0.1.x","coffee-script":"1.1.2","pkginfo":"0.2.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"anode@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"3f3cdc264e883b65565e018c47c2931ad8a19cd4","tarball":"http://registry.npmjs.org/anode/-/anode-0.1.4.tgz"},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]},"0.1.5":{"name":"anode","description":"Humus inspired actor framework for Node.js","version":"0.1.5","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"contributors":[{"name":"Dale Schumacher","email":"dale.schumacher@gmail.com"}],"keywords":["actor","actors","scala","erlang","message passing"],"main":"./lib/anode.js","engines":{"node":">= 0.4.x"},"dependencies":{"async-events":"0.1.x","coffee-script":"1.1.2","pkginfo":"0.2.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"anode@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"033a3315ee37c8ae13186f69ea80b47a947f6517","tarball":"http://registry.npmjs.org/anode/-/anode-0.1.5.tgz"},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]},"0.2.0":{"name":"anode","description":"Humus inspired actor framework for Node.js","version":"0.2.0","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"contributors":[{"name":"Dale Schumacher","email":"dale.schumacher@gmail.com"}],"keywords":["actor","actors","scala","erlang","message passing"],"main":"./lib/anode.js","engines":{"node":">= 0.4.x"},"dependencies":{"async-events":"0.1.x","coffee-script":"1.1.2","pkginfo":"0.2.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"anode@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6784854f27b8a3a57adc1106d5f368447c714b03","tarball":"http://registry.npmjs.org/anode/-/anode-0.2.0.tgz"},"readme":"# anode\n\nHumus inspired actor framework for Node.js\n\n## Installation\n\n### Installing node\nFollow instructions at `http://nodejs.org/`\n\n### Installing npm (node package manager)\n<pre>\n  curl http://npmjs.org/install.sh | sh\n</pre>\n\n### Installing anode\n<pre>\n  npm install anode\n</pre>\n\n### Getting Started\n\nA quick note about `CoffeeScript`... Because of how `anode` actors are implemented, the code relies heavily on the `this` keyword. There is nothing preventing you from writing anode actors in `JavaScript`, however, the `CoffeeScript` syntax just happens to perfectly fit what each actor behavior is trying to express, so I highly recommend taking look at `anode` through the `CoffeeScript` lens.\n\nTaking a pointer from Node.js, here is an example webserver in anode included in `examples/helloworld.example.coffee`\n  \n```coffeescript\nanode = require 'anode'\n\ncnf = new anode.Configuration()\n\nhttpServer = cnf.actor anode.http.server_beh()\nhelloworld = cnf.actor anode.behavior( 'httpServer'\n\n  '#start' : ->\n    @send( @, '#listen', 8080, '127.0.0.1' ).to @httpServer\n\n  '$httpServer, #listen' : ->\n    @send( 'Server running at http://127.0.0.1:8080/' ).to cnf.console.log\n\n  '$httpServer, #request, request, response' : ->\n    @send( null, '#end', 'Hello Actor World\\n' ).to @response  \n\n)( httpServer ) # helloworld\n\ncnf.send( '#start' ).to helloworld\n```\n\nTo run the server, go into the `examples` directory and execute it with `coffee`:\n\n    % coffee helloworld.example.coffee\n    Server running at http://127.0.0.1:8080/\n\n*note: not all of the Node.js `'http'` functionality has been wrapped yet.\n\nA more involved echo server using sockets directly can be found in `examples/echoserver.example.coffee`\n\n```coffeescript\nanode = require 'anode'\n\n# set debug mode to see the messages\ncnf = new anode.Configuration debug : true\n\n# we are naming our actors here to make debug output friendlier\nnetServer = cnf.actor 'netServer', anode.net.server_beh()\nechoServer = cnf.actor 'echoServer', anode.beh( 'netServer'\n\n  '#start' : ->\n\n    @send( @, '#listen', 8124 ).to @netServer\n\n  '$netServer, #listen' : ->\n\n    @send( 'server bound' ).to cnf.console.log\n\n  '$netServer, #connection, socket' : ->\n\n    @send( 'server connected' ).to cnf.console.log\n\n    # request ack after #write completes by including self (@)\n    @send( @, '#write', 'hello\\r\\n' ).to @socket\n\n  'socket, #end' : ->\n\n    @send( 'server disconnected' ).to cnf.console.log\n\n  # once socket gives us its socket object\n  'socket, #socket, socketObj' : ->\n  \n    # pipe the socket to itself to echo\n    # don't care about confirmation so send null as customer\n    @send( null, '#pipe', @socketObj ).to @socket\n\n  # write ack\n  'socket, #write, _' : ->\n\n    # request the actual socket object so we can pipe to it\n    @send( @, '#socket' ).to @socket\n\n)( netServer ) # echoServer\n\ncnf.send( '#start' ).to echoServer\n```\n\nTo run the server, go into the `examples` directory and execute it with `coffee`:\n\n    % coffee echoserver.example.coffee\n    server bound\n\nYou can connect to it using `telnet`:\n\n    % telnet localhost 8124\n\n### Actors\n\nThe intent behind `anode` is to provide a way to write \"pure\" actors in JavaScript. Over the years, the idea of what actors are has evolved quite a bit. In the context of what `anode` is trying to provide, \"pure\" actors are actors as defined by [Carl Hewitt](http://hdl.handle.net/1721.1/6272) and elaborated by [Gul Agha](http://hdl.handle.net/1721.1/6952). Dale Schumacher (the author of pure actor language Humus on which `anode` is inspired) provides an excellent introduction to this perspective on actors on his blog [here](http://www.dalnefre.com/wp/2010/05/deconstructing-the-actor-model/).\n\n#### tl;dr\n\nActor processing starts on receipt of a message. In response to a message, an actor can do three things:\n\n1. send a finite number of new messages (`@send`)\n2. create a finite number of new actors (`@create`)\n3. designate a new behavior to process subsequent messages (`@become`)\n\n### More Examples\n\nI've begun a tutorial to demonstrate some of the elementary concepts of coding actors in `anode`. It is documented in code in `examples/tutorial/one.coffee`.\n\nTake a look at the examples in the `examples` folder. As of this writing, there\nare three non-trivial examples of setting up an actor configuration:\n\n1. `erlangMailbox.coffee` is an implementation of Erlang-style mailbox modeled on Dale's [blog post](http://www.dalnefre.com/wp/2011/10/erlang-style-mailboxes/), run `coffee erlangMailbox.example.coffee`\n2. `lambda1.coffee` is an implementation of lambda calculus modeled on Dale's [blog post](http://www.dalnefre.com/wp/2010/08/evaluating-expressions-part-1-core-lambda-calculus/), run `coffee lambda1.example.coffee` (you should see `42`)\n3. `lambda2.coffee` is a follow-on implementation of lambda calculus modeled on the second [blog post](http://www.dalnefre.com/wp/2010/09/evaluating-expressions-part-2-conditional-special-form/) in that series, run `coffee lambda2.example.coffee` (you should see `true` and `false`)\n\nOther examples show simpler functionality:\n\n1. `console.warn.example.coffee` demonstrates actor wrappers around node.js console, run `coffee console.warn.example.coffee`\n2. `valuematch.example.coffee` shows how `$` syntax matches pattern by evaluating the variable, run `coffee valuematch.example.coffee`\n3. `simple.example.coffee` shows a simple counter system, run `coffee simple.example.coffee`\n4. `optional.example.coffee` shows use of optional parameters in a message, run `coffee optional.example.coffee`\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Tristan Slominski\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]}},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}],"time":{"modified":"2011-12-18T23:40:54.838Z","created":"2011-12-18T00:46:31.207Z","0.1.2":"2011-12-18T00:46:32.075Z","0.1.3":"2011-12-18T00:57:39.049Z","0.1.4":"2011-12-18T01:02:37.884Z","0.1.5":"2011-12-18T01:05:47.118Z","0.2.0":"2011-12-18T23:40:54.838Z"},"author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"_attachments":{"anode-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6/RUt5dhVFF785yXLUUCZQ==","length":16232,"stub":true},"anode-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-aGNBdtDUY19q3UilTa2LrA==","length":20480,"stub":true},"anode-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2uHo5RYKQ3HfFlt6TwCMRQ==","length":20480,"stub":true},"anode-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-EDERq+scv4X3PDmTw9IX3Q==","length":20480,"stub":true},"anode-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-G94FyUfg6aMsSDSP4VQS4g==","length":20480,"stub":true}}}},
{"id":"another_npm_package_example","key":"another_npm_package_example","value":{"rev":"3-bc2b8af0432a609cc8531688eebef486"},"doc":{"_id":"another_npm_package_example","_rev":"3-bc2b8af0432a609cc8531688eebef486","name":"another_npm_package_example","description":"just another simple npm package example","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"another_npm_package_example","description":"just another simple npm package example","version":"0.0.1","homepage":"https://github.com/shawjia/another_npm_package_example","author":{"name":"shawjia","email":"shawjia@gmail.com"},"repository":{"type":"git","url":"git://github.com/shawjia/another_npm_package_example.git"},"bugs":{"url":"https://github.com/shawjia/another_npm_package_example/issues"},"licenses":[{"type":"MIT","url":"https://github.com/shawjia/another_npm_package_example/blob/master/LICENSE-MIT"}],"main":"lib/another_npm_package_example","engines":{"node":"~0.6.18"},"scripts":{"test":"grunt test"},"dependencies":{},"devDependencies":{"grunt":"~0.3.9"},"keywords":[],"_npmUser":{"name":"shawjia","email":"shawjia@gmail.com"},"_id":"another_npm_package_example@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"aec2a3d7c1f2472cd540aeb4e760dbff18016b50","tarball":"http://registry.npmjs.org/another_npm_package_example/-/another_npm_package_example-0.0.1.tgz"},"maintainers":[{"name":"shawjia","email":"shawjia@gmail.com"}]}},"readme":"# another_npm_package_example\n\njust another simple npm package example\n\n## Getting Started\nInstall the module with: `npm install another_npm_package_example`\n\n```javascript\nvar another_npm_package_example = require('another_npm_package_example');\nanother_npm_package_example.awesome(); // \"awesome\"\n```\n\n## Documentation\n_(Coming soon)_\n\n## Examples\n_(Coming soon)_\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt](https://github.com/cowboy/grunt).\n\n## Release History\n_(Nothing yet)_\n\n## License\nCopyright (c) 2012 shawjia  \nLicensed under the MIT license.\n","maintainers":[{"name":"shawjia","email":"shawjia@gmail.com"}],"time":{"modified":"2012-05-25T17:11:47.547Z","created":"2012-05-25T17:11:16.894Z","0.0.1":"2012-05-25T17:11:47.547Z"},"author":{"name":"shawjia","email":"shawjia@gmail.com"},"repository":{"type":"git","url":"git://github.com/shawjia/another_npm_package_example.git"},"_attachments":{"another_npm_package_example-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BEKyyVTARNGvescqqUcq/Q==","length":2169,"stub":true}}}},
{"id":"ansi","key":"ansi","value":{"rev":"22-ef4d2b7385e0d9515500523edf477884"},"doc":{"_id":"ansi","_rev":"22-ef4d2b7385e0d9515500523edf477884","name":"ansi","description":"Advanced ANSI formatting tool for Node.js","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"ansi","description":"ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.0.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","scripts":{"test":"mocha --reporter spec"},"dependencies":{"debug":"*"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":">= 0.4.0 && < 0.7.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"ansi@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"ce0b2850d8f805dcb551812c9008c960d604e1aa","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.0.1.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.2":{"name":"ansi","description":"Advanced ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.0.2","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","scripts":{"test":"mocha --reporter spec","start":"node server.js"},"dependencies":{"debug":"*"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":">= 0.4.0 && < 0.9.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"ansi@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"444d7b2ea83bb7979376184c6dd82229e6b41d09","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.0.2.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.3":{"name":"ansi","description":"Advanced ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.0.3","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","scripts":{"test":"mocha --reporter spec","start":"node server.js"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":">= 0.4.0 && < 0.9.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"ansi@0.0.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.2","_defaultsLoaded":true,"dist":{"shasum":"480cb4fc9e526e7dcbaa0723e18f4aa9e89e6d47","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.0.3.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.0.4":{"name":"ansi","description":"Advanced ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.0.4","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","scripts":{"test":"mocha --reporter spec","start":"node server.js"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":">= 0.4.0 && < 0.9.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"ansi@0.0.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8fdff8639522fa84eb52d0857e34b89f6146d920","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.0.4.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.1.0":{"name":"ansi","description":"Advanced ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.1.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","bin":{"beep":"./examples/beep/index.js","clear":"./examples/clear/index.js","imgcat":"./examples/imgcat/index.js"},"scripts":{"test":"mocha --reporter spec"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":">= 0.4.0 && < 0.9.0"},"_npmUser":{"name":"tootallnate","email":"nathan@tootallnate.net"},"_id":"ansi@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"c757144e2207d17b8ca89e48e95922da3d5de4c6","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.1.0.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"directories":{}},"0.1.1":{"name":"ansi","description":"Advanced ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.1.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","bin":{"beep":"./examples/beep/index.js","clear":"./examples/clear/index.js","imgcat":"./examples/imgcat/index.js","starwars":"./examples/starwars.js"},"scripts":{"test":"mocha --reporter spec"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":"*"},"_npmUser":{"name":"tootallnate","email":"nathan@tootallnate.net"},"_id":"ansi@0.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f258896cadb1103c9d6403c1c31a0793b15ea104","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.1.1.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}]},"0.1.2":{"name":"ansi","description":"Advanced ANSI formatting tool for Node.js","keywords":["ansi","formatting","cursor","color","terminal","rgb","256","stream"],"version":"0.1.2","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"main":"./lib/ansi.js","bin":{"beep":"./examples/beep/index.js","clear":"./examples/clear/index.js","imgcat":"./examples/imgcat/index.js","starwars":"./examples/starwars.js"},"scripts":{"test":"mocha --reporter spec"},"devDependencies":{"mocha":"*","canvas":"*"},"engines":{"node":"*"},"_npmUser":{"name":"tootallnate","email":"nathan@tootallnate.net"},"_id":"ansi@0.1.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"dist":{"shasum":"2627e29498f06e2a1c2ece9c21e28fd494430827","tarball":"http://registry.npmjs.org/ansi/-/ansi-0.1.2.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}]}},"readme":"ansi.js\n=========\n### ANSI formatting tool for Node.js\n\n![](http://f.cl.ly/items/0D3w3d1W443f2z3X361G/Screen%20Shot%202012-01-26%20at%202.18.31%20AM.png)\n\n`ansi.js` is a module for Node.js that writes provides an easy-to-use API for\nwriting ANSI escape codes to `Stream` instances. ANSI escape codes are used to do\nfancy things in a terminal window, like render text in colors, delete characters,\nlines, the entire window, or hide and show the cursor, and lots more!\n\nThe code for the example in the screenshot above can be found in the `examples`\ndirectory.\n\n#### Features:\n\n * 256 color support for the terminal!\n * Works with *any* writable `Stream` instance.\n * Allows you to move the cursor anywhere on the terminal window.\n * Allows you to delete existing contents from the terminal window.\n * Allows you to hide and show the cursor.\n * Converts CSS color codes and RGB values into ANSI escape codes.\n * Low-level; you are in control of when escape codes are used, it's not abstracted.\n * Optional automatic cleanup of stream by before closing (still TODO).\n\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install ansi\n```\n\n\nExample\n-------\n\n``` js\nvar ansi = require('ansi')\n  , cursor = ansi(process.stdout);\n\n// Set the font color to rgb(22, 254, 109)\ncursor.rgb(22, 254, 109);\n\nconsole.log('this will be colored text!');\n\n// Set the background color to bright red\ncursor.bg.rgb(255, 0, 0);\n\nconsole.log('this will be colored text with a red background!');\n\ncursor.reset();\n\nconsole.log('this will be regular text');\n```\n","maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"time":{"modified":"2012-08-06T15:37:30.837Z","created":"2012-01-26T10:32:11.002Z","0.0.1":"2012-01-26T10:32:12.452Z","0.0.2":"2012-01-31T18:19:31.216Z","0.0.3":"2012-02-06T20:25:13.405Z","0.0.4":"2012-02-10T07:41:17.364Z","0.1.0":"2012-03-16T20:58:37.492Z","0.1.1":"2012-04-25T22:06:51.811Z","0.1.2":"2012-04-26T04:19:47.357Z"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/ansi.js.git"},"users":{"dylang":true,"sjonnet19":true},"_attachments":{"ansi-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-pG7scFwUmV+DgIKOxPk1eg==","length":8280,"stub":true},"ansi-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-9J9xDdcX/ELcaQqu6tOFJA==","length":8160,"stub":true},"ansi-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3gTzdD9f4GYjV1dKy5VZYQ==","length":7696,"stub":true},"ansi-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-Rw5og/xS/zQ88BOLRoLgug==","length":36725,"stub":true},"ansi-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-Fy3YQdwxN6m3+OrUdnf30A==","length":36670,"stub":true},"ansi-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-vNk0tlhU1tXMkKrZrQAbCw==","length":36662,"stub":true},"ansi-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nW1lCxSrNpWhH3z0nqT/xA==","length":34811,"stub":true}}}},
{"id":"ansi-color","key":"ansi-color","value":{"rev":"6-d6f02b32525c1909d5134afa20f470de"},"doc":{"_id":"ansi-color","_rev":"6-d6f02b32525c1909d5134afa20f470de","name":"ansi-color","description":"This module provides basic ANSI color code support, to allow you to format your console output with foreground and background colors as well as providing bold, italic and underline support.","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.1":{"name":"ansi-color","description":"This module provides basic ANSI color code support, to allow you to format your console output with foreground and background colors as well as providing bold, italic and underline support.","version":"0.2.1","author":{"name":"James Smith","email":"james@loopj.com"},"keywords":["ansi","color","console"],"directories":{"lib":"./lib"},"repositories":[{"type":"git","url":"git://github.com/loopj/commonjs-ansi-color.git"}],"main":"./lib/ansi-color","_id":"ansi-color@0.2.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz"},"mtime":"2010-11-09T23:16:05Z","ctime":"2010-11-09T23:16:05Z"}},"maintainers":[{"name":"loopj","email":"james@loopj.com"}],"mtime":"2010-11-09T23:16:05Z","ctime":"2010-11-09T23:16:05Z","author":{"name":"James Smith","email":"james@loopj.com"},"_attachments":{"ansi-color-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Eh7pcQcQT48gks0/DA8WYA==","length":2523,"stub":true}}}},
{"id":"ansi-font","key":"ansi-font","value":{"rev":"5-0ec8fcf4f309241548d675d4571fdb5f"},"doc":{"_id":"ansi-font","_rev":"5-0ec8fcf4f309241548d675d4571fdb5f","name":"ansi-font","description":"ANSI font styling utils","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"ansi-font","id":"ansi-font","version":"0.0.1","description":"ANSI font styling utils","keywords":["ANSI","font","style","colors"],"author":{"name":"Irakli Gozalishvili","email":"rfobic@gmail.com","url":"http://jeditoolkit.com"},"homepage":"https://github.com/Gozala/ansi-font","repository":{"type":"git","url":"git://github.com/Gozala/ansi-font.git","web":"https://github.com/Gozala/ansi-font"},"bugs":{"url":"http://github.com/Gozala/ansi-font/issues/"},"main":"./index.js","engines":{"node":">=0.4.x"},"licenses":[{"type":"MIT","url":"http://jeditoolkit.com/LICENSE"}],"_npmJsonOpts":{"file":"/Users/gozala/.npm/ansi-font/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ansi-font@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5867692cd12b0062dbb23c987f0a8f5ed43003e1","tarball":"http://registry.npmjs.org/ansi-font/-/ansi-font-0.0.1.tgz"},"scripts":{}},"0.0.2":{"name":"ansi-font","id":"ansi-font","version":"0.0.2","description":"ANSI font styling utils","keywords":["ANSI","font","style","colors"],"author":{"name":"Irakli Gozalishvili","email":"rfobic@gmail.com","url":"http://jeditoolkit.com"},"homepage":"https://github.com/Gozala/ansi-font","repository":{"type":"git","url":"git://github.com/Gozala/ansi-font.git","web":"https://github.com/Gozala/ansi-font"},"bugs":{"url":"http://github.com/Gozala/ansi-font/issues/"},"main":"./index.js","engines":{"node":">=0.4.x"},"licenses":[{"type":"MIT","url":"http://jeditoolkit.com/LICENSE"}],"_npmUser":{"name":"gozala","email":"rfobic@gmail.com"},"_id":"ansi-font@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"890301bd5841462fd39c0b7709afd1f525143331","tarball":"http://registry.npmjs.org/ansi-font/-/ansi-font-0.0.2.tgz"},"maintainers":[{"name":"gozala","email":"rfobic@gmail.com"}]}},"maintainers":[{"name":"gozala","email":"rfobic@gmail.com"}],"time":{"modified":"2011-11-14T23:03:49.703Z","created":"2011-07-10T11:25:41.460Z","0.0.1":"2011-07-10T11:25:42.421Z","0.0.2":"2011-11-14T23:03:49.703Z"},"author":{"name":"Irakli Gozalishvili","email":"rfobic@gmail.com","url":"http://jeditoolkit.com"},"repository":{"type":"git","url":"git://github.com/Gozala/ansi-font.git","web":"https://github.com/Gozala/ansi-font"},"_attachments":{"ansi-font-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Zp6QHOXvDATA+/tAPTq60A==","length":10240,"stub":true},"ansi-font-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Oc3mWHdEa7kUh96V/li6HA==","length":2738,"stub":true}}}},
{"id":"ansi-pansi","key":"ansi-pansi","value":{"rev":"15-4987598ab1ab0691233d0c072d9f1638"},"doc":{"_id":"ansi-pansi","_rev":"15-4987598ab1ab0691233d0c072d9f1638","name":"ansi-pansi","description":"Basic ansi formatting, foreground and background colours for use with CLIs.","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.1","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d365382d19fbe9740d10f65a350e0b9676fc6bd3","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.1.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]},"0.0.2":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.2","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d26ad7754f9cb11dc69224a96f55af2afcd610ed","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.2.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]},"0.0.3":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.3","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e3bf3701fa3ad587323b7f20a1b6e09034ef6847","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.3.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]},"0.0.4":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.4","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4bf67cc233f14b6f53b09697cd19bcc141741adb","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.4.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]},"0.0.5":{"author":{"name":"constantology","email":"constantology@gmail.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.5","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a36acc675d07d5e61c3de47b72aaf2cfe652813a","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.5.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]},"0.0.6":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.6","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4b0a9e18afa20c2c93dca01c19388ec6ece113cb","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.6.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]},"0.0.7":{"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"description":"Basic ansi formatting, foreground and background colours for use with CLIs.","keywords":["ansi","color","colour","cli","console"],"licenses":[{"type":"MIT","url":"https://raw.github.com/constantology/ansi-pansi/master/LICENSE"}],"main":"./ansi-pansi.js","name":"ansi-pansi","repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"version":"0.0.7","_npmUser":{"name":"constantology","email":"constantology@gmail.com"},"_id":"ansi-pansi@0.0.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"45c5a48a87a31ddd0e2d5cccd08d0b7bb4f1c08d","tarball":"http://registry.npmjs.org/ansi-pansi/-/ansi-pansi-0.0.7.tgz"},"maintainers":[{"name":"constantology","email":"constantology@gmail.com"}]}},"readme":"# ansi pansi\n\nBasic ansi formatting, foreground and background colours for use with CLIs.\n\n## installation\n\n```\n\n   npm install ansi-pansi\n\n```\n\n## usage\n\n```javascript\n\n   var ansiformat = require( 'ansi-pansi' );\n\n   console.log( ansiformat( 'foo', 'bold blue bg_yellow' ) );\n   // prints => 'foo' to the console in blue, bold on a yellow background.\n\n```\n\n## formatting and colour options\nYou can use the below codes concatenated with either a plus `+` or a space ` ` character as shown in the example above.\n\n### formatting\n`bold`, `italic`, `underline`, `blink`, `reverse`, `hidden`.\n\n### foreground colours\n`black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`\n\n### background colours\n`bg_black`, `bg_red`, `bg_green`, `bg_yellow`, `bg_blue`, `bg_magenta`, `bg_cyan`, `bg_white`\n\n## License\n\n(The MIT License)\n\nCopyright &copy; 2012 christos \"constantology\" constandinou http://muigui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"constantology","email":"constantology@gmail.com"}],"time":{"modified":"2012-04-01T09:18:38.494Z","created":"2012-02-29T22:12:03.285Z","0.0.1":"2012-02-29T22:12:04.638Z","0.0.2":"2012-02-29T22:16:59.833Z","0.0.3":"2012-02-29T23:00:43.120Z","0.0.4":"2012-03-01T19:57:57.725Z","0.0.5":"2012-03-02T15:59:30.450Z","0.0.6":"2012-03-18T22:26:02.646Z","0.0.7":"2012-04-01T09:18:38.494Z"},"author":{"name":"constantology","email":"christos@muigui.com","url":"http://muigui.com"},"repository":{"type":"git","url":"git@github.com:constantology/ansi-pansi.git"},"_attachments":{"ansi-pansi-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-XF785j6JQ76RamQLubKX2Q==","length":3089,"stub":true},"ansi-pansi-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-lHOWZ6UsJyvbBcyuyqeoQA==","length":3104,"stub":true},"ansi-pansi-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-7UvM0SmU3AsIMTqpDOFkIw==","length":3127,"stub":true},"ansi-pansi-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-P2F724oYklPT8uM87PvnaQ==","length":2150,"stub":true},"ansi-pansi-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+PHOU1jkokVLsOoSuJarOw==","length":2083,"stub":true},"ansi-pansi-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-n2V/AUmZ5HU/e37Z3CfTBg==","length":1990,"stub":true},"ansi-pansi-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0m811IXI4eVGyY2egibKwg==","length":1988,"stub":true}}}},
{"id":"ansi2html","key":"ansi2html","value":{"rev":"3-5801d5896bb893fb74c188e1383c3289"},"doc":{"_id":"ansi2html","_rev":"3-5801d5896bb893fb74c188e1383c3289","name":"ansi2html","description":"Convert text with ANSI escape sequences to HTML markup","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"name":"ansi2html","description":"Convert text with ANSI escape sequences to HTML markup","version":"0.0.0","homepage":"https://github.com/agnoster/ansi2html-js","repository":{"url":""},"main":"./lib/ansi2html","engines":{"node":">0.4"},"dependencies":{},"devDependencies":{"vows":"~0.5.8"},"scripts":{"test":"./node_modules/vows/bin/vows test/*_spec.js --spec"},"readme":"# ansi2html.js [![build status](https://secure.travis-ci.org/agnoster/ansi2html.png?branch=master)](http://travis-ci.org/agnoster/ansi2html)\n\n\nConvert text with ANSI escape sequences to styled HTML.\n\n## Example\n\n```\ntest[1mBold[32mGreen[31mRed[0mNone\n```\n    \nbecomes\n\n```html\ntest<span style=\"font-weight:bold\">Bold</span><span style=\"font-weight:bold;color:green\">Green</span><span style=\"font-weight:bold;color:red\">Red</span>None\n```\n\n## Usage\n\nIn Node.js:\n\n```js\nvar ansi2html = require('ansi2html')\n\nconsole.log(ansi2html(\"test[1mBold\"))\n```\n\nIn the browser:\n\n```js\n<pre id=\"test\"></pre>\n<script type=\"text/javascript\" src=\"ansi2html.js\"></script>\n<script type=\"text/javascript\">\ndocument.getElementById('test').innerHTML = ansi2html(\"test[1mBold\")\n</script>\n```\n\nThat's right, ansi2html.js works in Node *and* in the browser, in more or less the same way.\n\n## MIT License\n\nCopyright (C) 2011 by Isaac Wolkerstorfer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n","_id":"ansi2html@0.0.0","dist":{"shasum":"8d7d6da60d4057fa2707695c4f36128da16ae8d6","tarball":"http://registry.npmjs.org/ansi2html/-/ansi2html-0.0.0.tgz"},"maintainers":[{"name":"agnoster","email":"agnoster@gmail.com"}]}},"readme":"# ansi2html.js [![build status](https://secure.travis-ci.org/agnoster/ansi2html.png?branch=master)](http://travis-ci.org/agnoster/ansi2html)\n\n\nConvert text with ANSI escape sequences to styled HTML.\n\n## Example\n\n```\ntest[1mBold[32mGreen[31mRed[0mNone\n```\n    \nbecomes\n\n```html\ntest<span style=\"font-weight:bold\">Bold</span><span style=\"font-weight:bold;color:green\">Green</span><span style=\"font-weight:bold;color:red\">Red</span>None\n```\n\n## Usage\n\nIn Node.js:\n\n```js\nvar ansi2html = require('ansi2html')\n\nconsole.log(ansi2html(\"test[1mBold\"))\n```\n\nIn the browser:\n\n```js\n<pre id=\"test\"></pre>\n<script type=\"text/javascript\" src=\"ansi2html.js\"></script>\n<script type=\"text/javascript\">\ndocument.getElementById('test').innerHTML = ansi2html(\"test[1mBold\")\n</script>\n```\n\nThat's right, ansi2html.js works in Node *and* in the browser, in more or less the same way.\n\n## MIT License\n\nCopyright (C) 2011 by Isaac Wolkerstorfer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n","maintainers":[{"name":"agnoster","email":"agnoster@gmail.com"}],"time":{"modified":"2012-08-14T23:37:04.375Z","created":"2012-08-14T23:37:02.631Z","0.0.0":"2012-08-14T23:37:04.375Z"},"author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"repository":{"url":""},"_attachments":{"ansi2html-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Li88T1bKElI2hR6wMuBQAQ==","length":2731,"stub":true}}}},
{"id":"ansidiff","key":"ansidiff","value":{"rev":"3-2b1d8f08cb6541fa1a13ae532e53f165"},"doc":{"_id":"ansidiff","_rev":"3-2b1d8f08cb6541fa1a13ae532e53f165","name":"ansidiff","description":"ANSI colored text diffs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"ansidiff","version":"1.0.0","description":"ANSI colored text diffs","main":"./lib/ansidiff.js","repository":{"type":"git","url":"git://github.com/trentm/node-ansidiff.git"},"engines":["node >=0.4.0"],"keywords":["diff","ansi","color","colour","console"],"dependencies":{"diff":"1.0"},"devDependencies":{"tap":"0.2"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"ansidiff@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d4a3ed89ab1670f20c097def759f34d944478aab","tarball":"http://registry.npmjs.org/ansidiff/-/ansidiff-1.0.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}]}},"readme":"ansidiff -- a small node.js library for ANSI colored text diffs\n\n\n# Usage\n\n    var ansidiff = require('ansidiff');\n    var log = console.log;\n    log( ansidiff.chars('will work for food', 'will code for foo') );\n    log( ansidiff.words('will work for food', 'will code for foo') );\n    log( ansidiff.lines('one\\ntwo\\nthree', 'one\\ndeux\\ntrois\\nthree') );\n    log( ansidiff.css('#body { color: blue }', '.content { color: blue }') );\n\nThese are using the default `bright` colorer. You can use the `subtle`\none if you wish:\n\n    log( ansidiff.words('will work for food', 'will code for foo', ansidiff.subtle) );\n\nIn my terminal that looks like this:\n\n* * *\n\n![ansi color diffs](https://github.com/trentm/node-ansidiff/raw/master/examples.png)\n\n* * *\n\n\n# Install\n\n    npm install ansidiff\n\n\n# License\n\nMIT.\n\n\nvar ansidiff = require('ansidiff');\nvar log = console.log;\nlog( ansidiff.chars('will work for food', 'will code for foo') );\nlog( ansidiff.words('will work for food', 'will code for foo') );\nlog( ansidiff.lines('one\\ntwo\\nthree', 'one\\ndeux\\ntrois\\nthree') );\nlog( ansidiff.css('#body { color: blue }', '.content { color: blue }') );\n","maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"time":{"modified":"2012-03-13T07:19:34.830Z","created":"2012-03-13T07:19:33.181Z","1.0.0":"2012-03-13T07:19:34.830Z"},"repository":{"type":"git","url":"git://github.com/trentm/node-ansidiff.git"},"_attachments":{"ansidiff-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1yrwYRIPyOkEr+xCbEsxPg==","length":48010,"stub":true}}}},
{"id":"ansimator","key":"ansimator","value":{"rev":"3-41b1b84025352fe6d909d3df08bdb1a5"},"doc":{"_id":"ansimator","_rev":"3-41b1b84025352fe6d909d3df08bdb1a5","name":"ansimator","description":"Throw down some ANSI animations!","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"name":"ansimator","description":"Throw down some ANSI animations!","version":"0.0.0","homepage":"https://github.com/jesusabdullah/ansimator","repository":{"type":"git","url":"git@github.com:jesusabdullah/ansimator.git"},"main":"lib/ansimator.js","scripts":{"test":"node examples/allthethings.js"},"engines":{"node":"*"},"dependencies":{"charm":"v0.0.x"},"devDependencies":{},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"ansimator@0.0.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"02070018b955bcc569e6710273726769d672f2bb","tarball":"http://registry.npmjs.org/ansimator/-/ansimator-0.0.0.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}]}},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"time":{"modified":"2011-10-28T03:39:26.806Z","created":"2011-10-28T03:39:24.779Z","0.0.0":"2011-10-28T03:39:26.806Z"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"repository":{"type":"git","url":"git@github.com:jesusabdullah/ansimator.git"},"_attachments":{"ansimator-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WVSzDlKjAVPUcH1mCk9AHA==","length":2198,"stub":true}}}},
{"id":"ansinception","key":"ansinception","value":{"rev":"5-1ebde8f82ffff145b131eaf79c462735"},"doc":{"_id":"ansinception","_rev":"5-1ebde8f82ffff145b131eaf79c462735","name":"ansinception","description":"Colorful exception handler for Node.js with CoffeeScript support and improved nodemon/supervisor compatibility","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"ansinception","version":"0.1.0","description":"Colorful exception handler for Node.js with CoffeeScript support and improved nodemon/supervisor compatibility","author":{"name":"Dennis Kehrig"},"keywords":["exception","handler","node","nodemon","supervisor","coffeescript"],"repository":{"type":"git","url":"git://github.com/DennisKehrig/ANSInception.git"},"bugs":{"name":"https://github.com/DennisKehrig/ANSInception/issues"},"engines":{"node":"*"},"devDependencies":{"coffee-script":">=1.3.0"},"main":"./lib/exception-handler","_npmUser":{"name":"DennisKehrig","email":"mailnpm@denniskehrig.de"},"_id":"ansinception@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7a3e147d6d466fbdd97355240f85d0277b645aed","tarball":"http://registry.npmjs.org/ansinception/-/ansinception-0.1.0.tgz"},"maintainers":[{"name":"DennisKehrig","email":"mailnpm@denniskehrig.de"}]},"0.1.1":{"name":"ansinception","version":"0.1.1","description":"Colorful exception handler for Node.js with CoffeeScript support and improved nodemon/supervisor compatibility","author":{"name":"Dennis Kehrig"},"keywords":["exception","handler","node","nodemon","supervisor","coffeescript"],"repository":{"type":"git","url":"git://github.com/DennisKehrig/ANSInception.git"},"bugs":{"name":"https://github.com/DennisKehrig/ANSInception/issues"},"engines":{"node":"*"},"devDependencies":{"coffee-script":">=1.3.0"},"main":"./lib/exception-handler","_npmUser":{"name":"DennisKehrig","email":"mailnpm@denniskehrig.de"},"_id":"ansinception@0.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8b83183e2eae4f5e94887f329fe05c301ee8c12c","tarball":"http://registry.npmjs.org/ansinception/-/ansinception-0.1.1.tgz"},"maintainers":[{"name":"DennisKehrig","email":"mailnpm@denniskehrig.de"}]}},"readme":"ANSInception\r\n============\r\n\r\nColorful exception handler for Node.js with CoffeeScript support and improved nodemon/supervisor compatibility\r\n\r\n![Screenshot](https://github.com/DennisKehrig/ANSInception/raw/master/screenshot.png)\r\n\r\nFeatures\r\n--------\r\n\r\n* Quits after a delay to prevent nodemon, supervisor, etc. from eating console.log output sent shortly before the exception was thrown\r\n* Shows up to five lines of code from each entry in the stack trace\r\n* Color codes the offending part of the code (based on the column number)\r\n* Compiles CoffeeScript to show the actual offending code (otherwise the line numbers don't make sense)\r\n* Highlights the file name in stack trace paths\r\n* Uses different colors depending on the location of the code\r\n  (<span style=\"background-color:black;color:#0f0\">green:</span> your code, <span style=\"background-color:black;color:#ff0\">yellow:</span> local module, <span style=\"background-color:black;color:#f0f\">pink:</span> global module/node.js internals)\r\n\r\nUnfortunately registering with 'uncaughtException' has no effect until the next tick.\r\nSo in order to benefit from the exception handler right away, you need to postpone execution of your code.\r\nYou can either do this manually or use the convience version (see below)\r\n\r\nUsage with CoffeeScript\r\n-----------------------\r\n\r\n__Short version:__\r\n\r\n\trequire('ansinception') ->\r\n\t\t# Your code\r\n\r\n__Long version:__\r\n\r\n\tprocess.on 'uncaughtException', require 'ansinception'\r\n\tprocess.nextTick ->\r\n\t\t# Your code\r\n\r\nUsage with JavaScript\r\n---------------------\r\n\r\n__Short version:__\r\n\r\n\trequire('ansinception')(function() {\r\n\t\t// Your code\r\n\t});\r\n\r\n__Long version:__\r\n\r\n\tprocess.on('uncaughtException', require('ansinception'));\r\n\tprocess.nextTick(function() {\r\n\t\t// Your code\r\n\t});\r\n","maintainers":[{"name":"DennisKehrig","email":"mailnpm@denniskehrig.de"}],"time":{"modified":"2012-05-14T20:32:39.189Z","created":"2012-05-04T00:33:45.559Z","0.1.0":"2012-05-04T00:33:47.756Z","0.1.1":"2012-05-14T20:32:39.189Z"},"author":{"name":"Dennis Kehrig"},"repository":{"type":"git","url":"git://github.com/DennisKehrig/ANSInception.git"},"_attachments":{"ansinception-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gFYgxno4isfsYyCn9W/o0w==","length":30174,"stub":true},"ansinception-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5u20BU6CJtyxwVOFP6rS1A==","length":30709,"stub":true}}}},
{"id":"ansiparse","key":"ansiparse","value":{"rev":"13-ad408c02201f5810505cbde8ee495efa"},"doc":{"_id":"ansiparse","_rev":"13-ad408c02201f5810505cbde8ee495efa","name":"ansiparse","description":"Parse ANSI color codes","dist-tags":{"latest":"0.0.5-1"},"versions":{"0.0.1":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansiparse","description":"Parse ANSI color codes","version":"0.0.1","repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"main":"./lib/ansiparse","scripts":{"test":"vows --spec"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansiparse@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"3800f5b87cda0981e234a0a29e94e7c82cf2a84c","tarball":"http://registry.npmjs.org/ansiparse/-/ansiparse-0.0.1.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.2":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansiparse","description":"Parse ANSI color codes","version":"0.0.2","repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"main":"./lib/ansiparse","scripts":{"test":"vows --spec"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansiparse@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"9165456773b2df7a765f26298111c1f016a64955","tarball":"http://registry.npmjs.org/ansiparse/-/ansiparse-0.0.2.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.3":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansiparse","description":"Parse ANSI color codes","version":"0.0.3","repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"main":"./lib/ansiparse","scripts":{"test":"vows --spec"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansiparse@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"910ea2424943665570f496f271799f7576733768","tarball":"http://registry.npmjs.org/ansiparse/-/ansiparse-0.0.3.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.4":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansiparse","description":"Parse ANSI color codes","version":"0.0.4","repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"main":"./lib/ansiparse","scripts":{"test":"vows --spec"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansiparse@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"61f5fe20131e087a1a2b9be8791f4fceff4c0cb5","tarball":"http://registry.npmjs.org/ansiparse/-/ansiparse-0.0.4.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.5":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansiparse","description":"Parse ANSI color codes","version":"0.0.5","repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"main":"./lib/ansiparse","scripts":{"test":"vows --spec"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"me@mmalecki.com"},"_id":"ansiparse@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"7a842e4f358a4f94ab5565dc058edac8a49d40cb","tarball":"http://registry.npmjs.org/ansiparse/-/ansiparse-0.0.5.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.5-1":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansiparse","description":"Parse ANSI color codes","version":"0.0.5-1","repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"main":"./lib/ansiparse","scripts":{"test":"vows --spec"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"me@mmalecki.com"},"_id":"ansiparse@0.0.5-1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"bc2ba7fd1227c02eeefacb367e6a18bff2ee7293","tarball":"http://registry.npmjs.org/ansiparse/-/ansiparse-0.0.5-1.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]}},"readme":"# ansiparse\nCopyright (C) 2011 by Maciej Małecki  \nMIT License (see LICENSE file)\n\n**ansiparse** parses ANSI color codes.\n\n## Installation\n\n    npm install ansiparse\n\n## Usage\n```js\nvar ansiparse = require('ansiparse');\nrequire('colors');\nansiparse('red'.red + ' ' + 'green'.green);\n  // => [ { foreground: '31', text: 'red' }, { text: ' ' }, { foreground: '32', text: 'green' } ]\n```\n\n","maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}],"time":{"modified":"2012-06-01T15:32:45.107Z","created":"2011-11-28T01:04:30.018Z","0.0.1":"2011-11-28T01:04:31.947Z","0.0.2":"2011-11-28T01:32:48.027Z","0.0.3":"2011-12-04T11:11:13.112Z","0.0.4":"2011-12-16T18:32:37.840Z","0.0.5":"2012-06-01T15:16:34.361Z","0.0.5-1":"2012-06-01T15:32:45.107Z"},"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"repository":{"type":"git","url":"git://github.com/mmalecki/ansiparse.git"},"_attachments":{"ansiparse-0.0.5-1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-eUUocofO7uYyl38upBD0RA==","length":3400,"stub":true},"ansiparse-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-eynCEX8Wq4CUBJ2/hWy+Rw==","length":3391,"stub":true},"ansiparse-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YBcVAzpW0gxeKaDRcL3UAQ==","length":10240,"stub":true},"ansiparse-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nsQuPDiPVgzT8nuNwuU9JA==","length":3144,"stub":true},"ansiparse-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-uqeUpmeVMGJTAnKP7Cjo5Q==","length":3057,"stub":true},"ansiparse-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Awxn5ruKqc1+1cUAY9m4gA==","length":2868,"stub":true}}}},
{"id":"ansispan","key":"ansispan","value":{"rev":"9-3265bfca78f5759678223317ec47b046"},"doc":{"_id":"ansispan","_rev":"9-3265bfca78f5759678223317ec47b046","name":"ansispan","description":"Change your ANSI color codes into HTML `<span>`s","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.0":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansispan","description":"Change your ANSI color codes into HTML `<span>`s","version":"0.0.0","main":"./lib/ansispan","repository":{"type":"git","url":"git://github.com/mmalecki/ansispan.git"},"engines":{"node":">= 0.4"},"scripts":{"test":"vows --spec"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansispan@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"1a72eb72c051d49faf3096541745fe304e2c65ad","tarball":"http://registry.npmjs.org/ansispan/-/ansispan-0.0.0.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.1":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansispan","description":"Change your ANSI color codes into HTML `<span>`s","version":"0.0.1","main":"./lib/ansispan","repository":{"type":"git","url":"git://github.com/mmalecki/ansispan.git"},"engines":{"node":">= 0.4"},"scripts":{"test":"vows --spec"},"bin":{"ansispan":"./bin/ansispan"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansispan@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"082ad120fac8d1e3924329a9bdb4c2c3fd39c2e3","tarball":"http://registry.npmjs.org/ansispan/-/ansispan-0.0.1.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.2":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansispan","description":"Change your ANSI color codes into HTML `<span>`s","version":"0.0.2","main":"./lib/ansispan","repository":{"type":"git","url":"git://github.com/mmalecki/ansispan.git"},"engines":{"node":">= 0.4"},"scripts":{"test":"vows --spec"},"bin":{"ansispan":"./bin/ansispan"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansispan@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"b7778bc6c3744ff5dccf31040e85c5f811c1fc7c","tarball":"http://registry.npmjs.org/ansispan/-/ansispan-0.0.2.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.3":{"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"name":"ansispan","description":"Change your ANSI color codes into HTML `<span>`s","version":"0.0.3","main":"./lib/ansispan","repository":{"type":"git","url":"git://github.com/mmalecki/ansispan.git"},"engines":{"node":">= 0.4"},"scripts":{"test":"vows --spec"},"bin":{"ansispan":"./bin/ansispan"},"dependencies":{},"devDependencies":{"colors":"0.5.x","vows":"0.6.x"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"ansispan@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.7.6-pre","_defaultsLoaded":true,"dist":{"shasum":"684a84961ca9d4e74088b0d3399f8ff95e429b48","tarball":"http://registry.npmjs.org/ansispan/-/ansispan-0.0.3.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]}},"readme":"# ansispan\nCopyright (C) 2011 by Maciej Małecki  \nMIT License (see LICENSE file)\n\nChange your ANSI color codes into HTML `<span>`s\n\n## Installation\n\n    npm install ansispan\n\n## Usage\n\n```javascript\nvar ansispan = require('ansispan');\nrequire('colors');\n\nansispan('green!'.green); // => '<span style=\"color: green\">green!</span>'\n```\n\n","maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}],"time":{"modified":"2012-03-11T23:10:07.456Z","created":"2011-11-27T13:26:04.994Z","0.0.0":"2011-11-27T13:26:07.038Z","0.0.1":"2011-11-27T13:50:00.225Z","0.0.2":"2011-11-27T14:35:56.338Z","0.0.3":"2012-03-11T23:10:07.456Z"},"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"repository":{"type":"git","url":"git://github.com/mmalecki/ansispan.git"},"_attachments":{"ansispan-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-xgQcW5OZ1K2uO92zlQhpCQ==","length":2455,"stub":true},"ansispan-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3oEhu17wLrafmJ0BvOckTg==","length":10240,"stub":true},"ansispan-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5yWlJ5DPV0BMIxojIcIVCw==","length":10240,"stub":true},"ansispan-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sr0tL3HruK1mke+XGApMXA==","length":10240,"stub":true}}}},
{"id":"ant","key":"ant","value":{"rev":"11-1c2623ba70894c2e90d8e1d196ba9652"},"doc":{"_id":"ant","_rev":"11-1c2623ba70894c2e90d8e1d196ba9652","name":"ant","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0":{"name":"ant","main":"package.json","version":"0.0.0","_npmJsonOpts":{"file":"/home/nickolay/.npm/ant/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ant@0.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"f07cc335a0bce58c508163bcb046a033cf16760e","tarball":"http://registry.npmjs.org/ant/-/ant-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"samuraijack","email":"nickolay8@gmail.com"}],"directories":{}},"0.2.0":{"name":"ant","description":"Apache Ant Adapter, execute Ant tasks from node","keywords":["ant","build","java"],"homepage":"http://github.com/millermedeiros/node-ant/","version":"0.2.0","author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com/"},"repository":{"type":"git","url":"https://github.com/millermedeiros/node-ant.git"},"main":"index.js","bugs":{"url":"https://github.com/millermedeiros/node-ant/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"engines":{"node":"~0.8.0"},"readme":"# node-ant\n\nExperimental [Apache Ant](http://ant.apache.org/) adapter for\n[node.js](http://nodejs.org).\n\nThis is a proof-of-concept more than anything else. Still unsure if it will\nactually work on multiple environments and if it is really a good idea.\n\n\n\n## Why?\n\nMany people been using [node.js to run build\nscripts](http://blog.millermedeiros.com/node-js-as-a-build-script/) and\neveryone is writting the same tasks for the most basic stuff like\ncopying/concateneting/deleting/ziping files and it will take a long time before\n*someone* implements [all the tasks present on\nAnt](http://ant.apache.org/manual/tasksoverview.html).\n\nProjects like [grunt](https://github.com/cowboy/grunt),\n[gear](https://github.com/yahoo/gear), [jake](https://github.com/mde/jake),\n[rivet](https://github.com/jaredhanson/rivet),\n[roto](https://github.com/diy/roto) and many others are all writting their own\ntasks to do the same things. TBH I think a better approach would be to create\nseparate libs that could do each task (or a group of tasks) and that wasn't\ntied to a specific build tool, and create tools that abused this (no need to\nconvert 3rd party lib into a plugin or author a new module just to use the\nmethods inside your build files).\n\nAnt contains [many advanced tasks](http://ant.apache.org/manual/tasksoverview.html)\nand is *battle tested* so it makes sense to reuse them instead of reinventing\nthe wheel.\n\nAnt is also not that easy to install on Windows since you need to configure the\n`ANT_HOME`, `CLASSPATH` and `JAVA_HOME` paths. So it's easier to use\na standalone version of Ant that is distributed together with the\n[npm](http://npmjs.org) package. The Java Runtime is avaialble on most\ncomputers so calling the ant executable should work out of the box on most\ncases.\n\nThe idea is not to write multiple ant `<target>`s, but to treat Ant as\na standalone lib that can be called from a node.js script. Performance isn't\nthat great (since JVM isn't as fast as node) but it is still better than\nwritting error-prone tasks that gets half of the job done.\n\nBuild tools based solely on configuration are doomed to \"fail\" the same way as\nAnt did \"failed\". You can't express all edge-cases with configuration without\ncreating an overly complex system. Some things that could be easily done with\na `for` loop and a few `if/else` are a huge PITA with a descriptive syntax\n(XML/JSON). The main reason why I moved my build scripts to node.js is to the\nget freedom to write new tasks by myself without major pains, locking down your\nbuild to a system that can only be extended by writting plugins that accepts\na simple config object won't scale up. Let's use Ant for what it is good for\n(broad amount of battle tested tasks with flexible config options) and use\nplain JavaScript for those tasks that aren't covered by Ant.\n\nMaybe this project will motivate someone to port the most important Ant tasks\nto plain JavaScript. I still haven't found a single node task that is as\ncomplete the ones provided by Ant, see for instance all the options available\non the [copy task](http://ant.apache.org/manual/Tasks/copy.html) (multiple\n`include`/`exclude`, `filter`, `globmapper`, download internet files,\n`flatten`, etc...).\n\n\n\n## How?\n\nThe idea is to use the Ant as if it was a standalone library that can be called\nfrom node.js, that way you can reuse them in your custom node.js build files\nwhen necessary.\n\nIt will simply convert JSON-like objects into a temporary XML file and execute\nthe standalone version of Ant passing the custom arguments. This tool is just\na \"bridge\" between Node.js and the Ant JAR file.\n\n\n\n## Example\n\nExecute the test file to see a very basic example:\n\n    node test\n\nYou can run it from another node.js program:\n\n```js\nvar ant = require('ant');\n\nant.exec({\n    // concat task (http://ant.apache.org/manual/Tasks/concat.html)\n    concat : {\n        fileset : {\n            '@dir' : '.',\n            include : {\n                '@name' : '*.js'\n            }\n        }\n    }\n}, function(err, stdout, stderror){\n    // it doesn't throw any errors and also doesn't log the stdout by\n    // default that way you can control what you want to do.\n    if (stdout) console.log(stdout);\n    if (stderror) console.log(stderror);\n    if (err) throw err;\n});\n```\n\n\n\n## Documentation\n\nRight now it contains a single method `exec()` that accepts an object with each\ntask and a callback. The tasks are just JSON-like representation of the XML\nmarkup needed to execute each task, `node-ant` will convert it back to XML\nduring the `exec`.\n\n\n### `ant.exec(tasks, [args], callback)`\n\n - **tasks**:\n   - JSON-like object containing Ant tasks to be executed.\n - **[args]**:\n   - Command line arguments passed to the ant executable.\n - **callback**\n   - Function executed after `exec` finishes. Will receive the following\n     arguments: (err, stdout, stderr).\n\n\n### JXON syntax\n\nAttributes starts with `@`.\n\n    > { foo : { '@bar' : 123 }}\n    <foo bar=\"123\" />\n\nThe XML node text value is stored as the actual key value if node doesn't\ncontain attributes and/or child nodes or on a special property `keyValue`.\n\n    > {\n        foo : 'Lorem Ipsum'\n    }\n    <foo>Lorem Ipsum</foo>\n\n    > {\n        foo : {\n            '@bar' : 123,\n            keyValue : 'Lorem Ipsum'\n        }\n    }\n    <foo bar=\"123\">Lorem Ipsum</foo>\n\n    > {\n        concat : {\n            fileset : {\n                '@dir' : '.',\n                include : {\n                    '@name' : '*.js'\n                }\n            }\n        }\n    }\n    <concat><fileset dir=\".\"><include name=\"*.js\" /></fileset></concat>\n\nUse the [Ant tasks\ndocumentation](http://ant.apache.org/manual/tasksoverview.html) as reference.\n\n\n\n## Important\n\nThis project is on early experimental phase. The way that `ant.exec` is called\nmight change in the future, specially since the\n[JXON](https://developer.mozilla.org/en/JXON) format currently used doesn't\nallow XML nodes with same name that aren't adjacent to each other (object can't\nhave multiple properties with the same key). So I might end up changing the\nformat to something closer to [JSONML](http://www.jsonml.org/) or use some sort\nof special token to differentiate duplicates (eg. `echo#1`, `echo#2`).\n\n\n\n## TODO\n\n - Test on a computer that doesn't have JDK installed.\n - Check if it is possible to ship with a standalone version of JDK for the\n   advanced tasks.\n - Make it possible to log to console without waiting the whole task to finish.\n\n\n\n## Requirements\n\n - node.js 0.8.0+\n - Java\n - JDK 1.4+ (depending on which task you use)\n\n\n\n## Changelog\n\n### v0.2.0 (2012/08/03)\n\n - add support to functions on tasks (for [script](http://ant.apache.org/manual/Tasks/script.html) task). [Thanks to @Diullei](https://gist.github.com/3245017)\n - small refactor to jxon to improve readability and autoclose empty tags.\n\n\n### v0.1.0 (2012/08/02)\n\n - initial release.\n\n\n\n## License\n\nnode-ant is distributed under the MIT license.\n\nApache Ant is distributed under the Apache License.\n","_id":"ant@0.2.0","dist":{"shasum":"f4abbe0d6f9cc4f63db5d3a557450288a0f0a394","tarball":"http://registry.npmjs.org/ant/-/ant-0.2.0.tgz"},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}]}},"maintainers":[{"name":"millermedeiros","email":"miller@millermedeiros.com"}],"time":{"modified":"2012-08-03T17:18:55.090Z","created":"2011-09-05T06:40:07.619Z","0.0.0":"2011-09-05T06:40:08.462Z","0.2.0":"2012-08-03T17:18:55.090Z"},"description":"Apache Ant Adapter, execute Ant tasks from node","author":{"name":"Miller Medeiros","url":"http://blog.millermedeiros.com/"},"repository":{"type":"git","url":"https://github.com/millermedeiros/node-ant.git"},"_attachments":{"ant-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-kScN9yZAE3QrnevexyZYmA==","length":5459183,"stub":true},"ant-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zDb8jBR4KUfXaxe1huFpkg==","length":178,"stub":true}}}},
{"id":"anthill","key":"anthill","value":{"rev":"5-25eb5068f45aa5f319dc73d19d60a2dc"},"doc":{"_id":"anthill","_rev":"5-25eb5068f45aa5f319dc73d19d60a2dc","name":"anthill","description":"IPC-based publish / subscribe server architecture","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"author":{"name":"Petr Janda","email":"petrjanda@me.com"},"name":"anthill","description":"IPC-based publish / subscribe server architecture","version":"0.0.2","repository":{"type":"git","url":"git://github.com/petrjanda/anthill.git"},"engines":{"node":"~0.6.2"},"dependencies":{"dnode":"*","eventemitter2":"*"},"devDependencies":{"jasmine-node":"*"},"scripts":{"test":"./jasmine-node spec/"},"_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"anthill@0.0.2","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"607f55a5644b7349e322eb3ff281bca707d1aec3","tarball":"http://registry.npmjs.org/anthill/-/anthill-0.0.2.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.0.3":{"author":{"name":"Petr Janda","email":"petrjanda@me.com"},"name":"anthill","description":"IPC-based publish / subscribe server architecture","version":"0.0.3","repository":{"type":"git","url":"git://github.com/petrjanda/anthill.git"},"engines":{"node":"~0.6.2"},"dependencies":{"dnode":"*","eventemitter2":"*"},"devDependencies":{"jasmine-node":"*"},"scripts":{"test":"./jasmine-node spec/"},"_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"anthill@0.0.3","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"e210e630a4a5bee544e2d6b8b11cc171fc8d71a8","tarball":"http://registry.npmjs.org/anthill/-/anthill-0.0.3.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]}},"readme":"# ANTHILL - IPC publish / subscribe architecture for node.js\n\n## Motivation\n\nNode.js application run in a single process. Its essential of how node.js work and can probably handle thousands of concurrent connections. Nevertheless development of one monolithic app has certaion disadvantages:\n\n* One failing piece of app can take it all down\n* Can be harder to plugin new component\n* Its harder to decouple system components\n* Make it more difficult to manage the whole development\n* etc.\n\nThe other way around is to split your app into pieces. In node.js that could be the separate processes. One process then take care about certain thing, certain subset of domain logic you intend to solve.\n\n## Architecture\n\nThe whole solution build on top of Dnode by James Halliday, the RPC library to allow inter process communication. It works even with Ruby, Perl or Java. Anthill builds on top of that and add publish / subscribe architecture. Your processes do their work themselves, and emit the events to outside world in case something important happened. There might be someone else interested about that. Other process then just subscribe for a given events.\n\n## License\n\nCopyright (c) 2011 Petr Janda\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}],"time":{"modified":"2011-12-04T23:37:28.022Z","created":"2011-12-03T18:13:35.717Z","0.0.2":"2011-12-03T18:13:39.678Z","0.0.3":"2011-12-04T23:37:28.022Z"},"author":{"name":"Petr Janda","email":"petrjanda@me.com"},"repository":{"type":"git","url":"git://github.com/petrjanda/anthill.git"},"_attachments":{"anthill-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xDX5HhsFKr7wnmtQyC+XgQ==","length":10240,"stub":true},"anthill-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XpXT1oP9WRBgVB53YtLgLw==","length":10240,"stub":true}}}},
{"id":"antlr3","key":"antlr3","value":{"rev":"7-391b206536ef3e91b5c93e17732b7268"},"doc":{"_id":"antlr3","_rev":"7-391b206536ef3e91b5c93e17732b7268","name":"antlr3","description":"ANTLR3 JavaScript Runtime Library","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"antlr3","version":"0.0.1","description":"ANTLR3 JavaScript Runtime Library","main":"antlr3.js","keywords":["antlr","antlr3","runtime"],"repository":{"type":"git","url":"git://github.com/herry13/npm-antlr3.git"},"_npmUser":{"name":"herry13","email":"herry13@gmail.com"},"_id":"antlr3@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"61d78bccdd6e3f24c58625b217a79779788e670e","tarball":"http://registry.npmjs.org/antlr3/-/antlr3-0.0.1.tgz"},"maintainers":[{"name":"herry13","email":"herry13@gmail.com"}]},"0.0.2":{"name":"antlr3","version":"0.0.2","description":"ANTLR3 JavaScript Runtime Library","main":"index.js","keywords":["antlr","antlr3","runtime"],"repository":{"type":"git","url":"git://github.com/herry13/npm-antlr3.git"},"_npmUser":{"name":"herry13","email":"herry13@gmail.com"},"_id":"antlr3@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"13d8b26ccd003759ba1074e830d9c23a14404bf6","tarball":"http://registry.npmjs.org/antlr3/-/antlr3-0.0.2.tgz"},"maintainers":[{"name":"herry13","email":"herry13@gmail.com"}]},"0.0.3":{"name":"antlr3","version":"0.0.3","description":"ANTLR3 JavaScript Runtime Library","main":"antlr3.js","author":{"name":"Herry","email":"herry13@gmail.com","url":"http://github.com/herry13/"},"keywords":["antlr","antlr3","runtime"],"repository":{"type":"git","url":"git://github.com/herry13/npm-antlr3.git"},"_npmUser":{"name":"herry13","email":"herry13@gmail.com"},"_id":"antlr3@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"29eafeaa23022ac4470bf2a3c251901f01740a63","tarball":"http://registry.npmjs.org/antlr3/-/antlr3-0.0.3.tgz"},"maintainers":[{"name":"herry13","email":"herry13@gmail.com"}]}},"readme":"npm-antlr3\n==========\n\nNPM package of ANTLR3 JavaScript Runtime Library","maintainers":[{"name":"herry13","email":"herry13@gmail.com"}],"time":{"modified":"2012-06-12T15:15:16.857Z","created":"2012-06-11T02:18:09.033Z","0.0.1":"2012-06-11T02:18:10.441Z","0.0.2":"2012-06-11T02:20:42.291Z","0.0.3":"2012-06-12T15:15:16.857Z"},"repository":{"type":"git","url":"git://github.com/herry13/npm-antlr3.git"},"author":{"name":"Herry","email":"herry13@gmail.com","url":"http://github.com/herry13/"},"_attachments":{"antlr3-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DIhjQeHj9gW4r9C8PLb4BA==","length":50411,"stub":true},"antlr3-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-s752rcN9WUX6YpZrnFdi7A==","length":50385,"stub":true},"antlr3-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-whDvZAwPC70xoJoLNDdISA==","length":50382,"stub":true}}}},
{"id":"anvil.coffee","key":"anvil.coffee","value":{"rev":"13-bdb15002ba52e23bbffac955dd291f5a"},"doc":{"_id":"anvil.coffee","_rev":"13-bdb15002ba52e23bbffac955dd291f5a","name":"anvil.coffee","description":"CoffeeScript compiler plugin for anvil.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.coffee","description":"CoffeeScript compiler plugin for anvil.js","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arobson/anvil.coffee.git"},"engines":{"node":"~0.6.10"},"main":"./lib/plugin.js","dependencies":{"coffee-script":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.coffee@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"26732d727ca685eb3f0ae804bb64dc8ece88029d","tarball":"http://registry.npmjs.org/anvil.coffee/-/anvil.coffee-0.0.1.tgz"},"readme":"","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"directories":{}},"0.0.2":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.coffee","description":"CoffeeScript compiler plugin for anvil.js","version":"0.0.2","repository":{"type":"git","url":"git://github.com/arobson/anvil.coffee.git"},"engines":{"node":"~0.8.3"},"main":"./lib/plugin.js","dependencies":{"coffee-script":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"readme":"## Anvil Coffee Plugin\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.coffee\n\n## Usage\n\nIf this plugin is installed and enabled, it will automatically 'compile' files ending in .coffee and output .js files in your output folder.","_id":"anvil.coffee@0.0.2","dist":{"shasum":"2daa37a359bd7b1d82491e3416b8f632489406e8","tarball":"http://registry.npmjs.org/anvil.coffee/-/anvil.coffee-0.0.2.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]}},"readme":"","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"time":{"modified":"2012-07-22T04:39:32.828Z","created":"2012-07-20T16:01:38.731Z","0.0.1":"2012-07-20T16:01:39.182Z","0.0.2":"2012-07-22T04:39:32.828Z"},"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"repository":{"type":"git","url":"git://github.com/arobson/anvil.coffee.git"},"_attachments":{"anvil.coffee-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-HdEY4118pwUcE+AbLKrqog==","length":1091,"stub":true},"anvil.coffee-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8AJ1ai63hm+JwxGwQN8WGw==","length":817,"stub":true}}}},
{"id":"anvil.http","key":"anvil.http","value":{"rev":"3-59b4baf5a7c2645956e098a6fc0789a7"},"doc":{"_id":"anvil.http","_rev":"3-59b4baf5a7c2645956e098a6fc0789a7","name":"anvil.http","description":"Http host for anvil.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.http","description":"Http host for anvil.js","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arobson/anvil.http.git"},"engines":{"node":"~0.8.3"},"main":"./lib/plugin.js","dependencies":{"express":"~3.0","socket.io":"~0.9"},"optionalDependencies":{},"readme":"## Anvil HTTP Plugin\nProvides an integrated web host using express and socket.io. Extends anvil with functionality to allow other plugins to host features and content.\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.http\n\n## Usage\n\n\tanvil --host\n\n## Configuration\nConfiguration can be changed by adding any of the three properties to the build file under \"anvil.http\": {}.\n\n### \"contentTypes\"\nA hash where the key is the extension of the requested file and the value is the mimeType specification. In general, this is only necessary if you're adding support for a file extension that needs to be compiled on the fly. \n\nExample:\n\t\"contentTypes\": { \n\t\t\".coffee\": \"application/javascript\"\n\t}\n\n### \"port\"\nSpecifies what port the server will listen to. The default is 3080.\n\nExample:\n\n\t\"port\": 3080\n\t\t\t\n### \"paths\"\nA hash where the key is the relative url to map to a specific directory or file. The following example shows the default setting which causes the output directory to get mapped to the top level.\n\nExample:\n\t\t\t\n\t\"paths\": {\n\t\t\"/\": anvil.config.output\n\t}\n\n## API\nCurrently the only call that this plugin adds to anvil is registerPath.\n\n### registerPath( url, filePath )\nThis lets you register static files to serve at a specific relative url","_id":"anvil.http@0.0.1","dist":{"shasum":"4ba6d339b1eeb20f3e373e53ff9672154f69708d","tarball":"http://registry.npmjs.org/anvil.http/-/anvil.http-0.0.1.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]}},"readme":"## Anvil HTTP Plugin\nProvides an integrated web host using express and socket.io. Extends anvil with functionality to allow other plugins to host features and content.\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.http\n\n## Usage\n\n\tanvil --host\n\n## Configuration\nConfiguration can be changed by adding any of the three properties to the build file under \"anvil.http\": {}.\n\n### \"contentTypes\"\nA hash where the key is the extension of the requested file and the value is the mimeType specification. In general, this is only necessary if you're adding support for a file extension that needs to be compiled on the fly. \n\nExample:\n\t\"contentTypes\": { \n\t\t\".coffee\": \"application/javascript\"\n\t}\n\n### \"port\"\nSpecifies what port the server will listen to. The default is 3080.\n\nExample:\n\n\t\"port\": 3080\n\t\t\t\n### \"paths\"\nA hash where the key is the relative url to map to a specific directory or file. The following example shows the default setting which causes the output directory to get mapped to the top level.\n\nExample:\n\t\t\t\n\t\"paths\": {\n\t\t\"/\": anvil.config.output\n\t}\n\n## API\nCurrently the only call that this plugin adds to anvil is registerPath.\n\n### registerPath( url, filePath )\nThis lets you register static files to serve at a specific relative url","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"time":{"modified":"2012-08-03T05:44:18.264Z","created":"2012-08-03T05:44:17.532Z","0.0.1":"2012-08-03T05:44:18.264Z"},"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"repository":{"type":"git","url":"git://github.com/arobson/anvil.http.git"},"_attachments":{"anvil.http-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-d/bDfZ2OPhoEIvBfEdKUpw==","length":2659,"stub":true}}}},
{"id":"anvil.jade","key":"anvil.jade","value":{"rev":"4-6a28b10f22dfd8a0d0639bd975cc5cdc"},"doc":{"_id":"anvil.jade","_rev":"4-6a28b10f22dfd8a0d0639bd975cc5cdc","name":"anvil.jade","description":"Jade compiler plugin for anvil.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.jade","description":"Jade compiler plugin for anvil.js","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arobson/anvil.jade.git"},"engines":{"node":"~0.8.3"},"main":"./lib/plugin.js","dependencies":{"jade":"~0.27"},"devDependencies":{"anvil.js":"~0.8"},"optionalDependencies":{},"readme":"## Anvil Coffee Plugin\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.jade\n\n## Usage\n\nIf this plugin is installed and enabled, it will automatically 'compile' files ending in .jade and output .html files in your output folder.","_id":"anvil.jade@0.0.1","dist":{"shasum":"4574e9b7bc9236f7555f8f8424baa187726b8e28","tarball":"http://registry.npmjs.org/anvil.jade/-/anvil.jade-0.0.1.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]}},"readme":"## Anvil Coffee Plugin\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.jade\n\n## Usage\n\nIf this plugin is installed and enabled, it will automatically 'compile' files ending in .jade and output .html files in your output folder.","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"time":{"modified":"2012-08-02T13:43:29.498Z","created":"2012-08-02T02:58:47.350Z","0.0.1":"2012-08-02T02:58:47.989Z"},"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"repository":{"type":"git","url":"git://github.com/arobson/anvil.jade.git"},"users":{"fgribreau":true},"_attachments":{"anvil.jade-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QO7uRHolYG+4Gjcf37Q1FQ==","length":1097,"stub":true}}}},
{"id":"anvil.js","key":"anvil.js","value":{"rev":"77-1fd9381139582df2aee0671af9e1ce56"},"doc":{"_id":"anvil.js","_rev":"77-1fd9381139582df2aee0671af9e1ce56","name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","dist-tags":{"latest":"0.7.9"},"versions":{"0.2.0":{"name":"anvil.js","description":"Simple javascript build utility","version":"0.2.0","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","zlib-sync":">=0.0.1","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5e75c51e85a82ab619307a7007180cd4cc1805ff","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.2.2":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.2.2","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","zlib-sync":">=0.0.1","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.2.2/package/package.json","contributors":false,"wscript":false,"serverjs":false},"_id":"anvil.js@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"278cc9ab1532e4296f1a98d4dae3e640571176f3","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.2.3":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.2.3","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/home/alex/.npm/anvil.js/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0e83137f4b6076be2c2bb177650b90f3abdffa2f","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.2.3.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.4.0":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.4.0","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","qunit":"0.1.3","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/home/alex/.npm/anvil.js/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.4.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b0e810a2d7debfec5f2e55501d9ebdad80d779b6","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.4.0.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.4.1":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.4.1","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","qunit":"0.1.3","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.4.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.4.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"55f3399d365a8591036fa61524e3bfe6357524ce","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.4.1.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.4.2":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.4.2","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","qunit":"0.1.3","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.4.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.4.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2fa24133759087919dfb80f75e250fb81d15dde5","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.4.2.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.4.3":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.4.3","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","qunit":"0.1.3","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.4.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.4.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"205a4c5f22ac41ac4ca3f1f766e088e627f5edd7","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.4.3.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.4.4":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.4.4","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","qunit":"0.1.3","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.4.4/package/package.json","contributors":false,"serverjs":false,"wscript":false},"_id":"anvil.js@0.4.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c5013c6ae1417a3b5e81a6ab24839ad410891a26","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.4.4.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.5.0":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.5.0","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/Users/arobson/.npm/anvil.js/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"794ea1997acd5bac517f97503b7437083089fb5a","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.5.0.tgz"},"scripts":{},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.5.1":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.5.1","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmJsonOpts":{"file":"/home/alex/.npm/anvil.js/0.5.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"anvil.js@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"26f073ef999196884af77d210dd48eac0659a453","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.5.1.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.5.3":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.5.3","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.5.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e8394259db97367ad3eef1c3f009cf146d6a7450","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.5.3.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.5.4":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.5.4","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.5.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4cf05e50e8353730bd7038009b1276f420524f3c","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.5.4.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.5.5":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.5.5","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.4.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.5.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"639e21f48141ae7c806d8006eca13461e0785c0b","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.5.5.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.6.0":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.6.0","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.6.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4fddd53381a40ad98c88c4378db4251fe9c1dff6","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.6.0.tgz"},"readme":"# Anvil\n\nI wanted a way to build a single javascript module from several source files. Jake/Rake/Make aren't really doing enough for me. Everything else I found that came close was also trying to enforce how that output got used (Ender, Require, etc.).\n\nI built anvil for myself, but I hope others find it useful.\n\n## What Does It Do?\n\nHere's the current feature list:\n\n* Create simple directory structure for new projects\n* Create build.json files\n* Combine multiple js or coffee files\n* Compile coffee files into js (can be turned off to maintain coffee output)\n* Lint resulting file(s)\n* Uglify resulting file(s)\n* Gzip resulting file(s)\n* Run in a CI mode where anvil will re-compile the project on source file changes\n* Dynamically generate a pavlov test page\n    * Hosted on localhost:1580\n    * Auto-refresh of the test page on code changes (thanks to @ifandelse\n* Host integration pages at 3080\n    * Defaults to hosting ./html at / in the uri\n    * Now configurable and can host multiple directories at specified URIs\n* Create integration page stubs including all external dependencies and build output\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will make assumptions. Here's the list:\n\n* All your source will be in ./src\n* Your output will go to ./lib\n* You want .coffee files compiled to .js\n* Your final files will get run through lint\n* Your final files will then be uglified as *.min.js\n* Your final files will then be gzipped as *.min.gz.js\n\nThere isn't a wrapper by convention.\n\n## The Build File\n\n    {\n        \"source\": \"src\",\n        \"output\": \"build\",\n        \"lint\": {},\n        \"uglify\": {},\n        \"gzip\": {},\n        \"extensions\": { \"uglify\": \"min\", \"gzip\": \"gz\" },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"(function(context) {\",\n            \"suffix|suffix-file\": \"})(this);\"\n        },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        }\n    }\n\n* source is where Anvil expects *all* your code. Don't get fancy or Anvil can't help you :(\n* output is where Anvil will write all the build output and temp files. This should NOT be the same as source.\n* lint specifies that you want your output files run through JSLint before Uglify and Gzip occur.\n* uglify specifies that you want your output uglified. (happens before gzip)\n* gzip specifies that you want your output gzipped.\n\n* wrap\n    * prefix prepends the following string to your output files.\n    * suffix appends the following string to your output files.\n    * If prefix-file or suffix-file is provided instead, the file will be read and the contents used\n\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * If header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n\nThere's also another option called justCoffee that will cause anvil to maintain all output in coffeescript instead of compiling it to js.\n\n## Jumpstart New Projects\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n    anvil -n <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    //import(\"dependency.js\");\n\n**Coffeescript**\n\n    ###import \"dependency.js\" ###\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular import statements and it will break the world if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file type\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file, you can just type the following:\n\n    anvil -t <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\n## Hosting\n\nAnvil provides local hosting for pavlov test specification and integration tests via express.\n\n### External Dependencies\n\nExternal dependencies get included in pavlov host pages and integration pages. The default directory these are stored in is \"ext\"\n\n### Fun With Coffee\n\nExternal dependencies, lib files and specs can all be written in coffee script provided the files have a .coffee file extension. Anvil will translate these on-the-fly and serve the js to the browser.\n\n### Pavlov Hosting\n\nAnvil will generate a pavlov test page for your output and host it in express at port 1580. All scripts in the lib, ext and spec folders will be included in this test page. The pavlov, qunit and jquery resources are symlinked into your root directory so that express will load these files correctly.\n\nThanks to a contribution from @ifandelse, if you're using the CI feature, the test page will automatically refresh itself after each successful build.\n\n    anvil -p\n\nIf you've written your specs and source files correctly, you can also provide a 's' switch to tell the test runner to test against the source directory instead of the output directory.\n\n    anvil -p -s\n\n### Integration Hosting\n\nAnvil can also host files from the lib, ext, and other folders at port 3080. Unlike the pavlov host, there is no default page so the URL has to be page specific.\n\n    anvil -h\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### Generating Stub Integration Files\n\nI am incredibly lazy. The thought of typing a bunch of script tags makes me tired. Therefore, anvil will do this for you.\n\n    anvil --html integration\n\nWould create an integration.html file with script tags for all files found in lib and ext named integration.html\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n## Demo\n\nIf you have the source, check out the demo directory. It's intended to play around and test different features out. If you've installed anvil from npm, all you have to do is type:\n\n    cd demo\n    anvil\n\nand watch how anvil builds the demo project.\n\nIf you've pulled the repository down, then try this:\n    cd demo\n    ../bin/anvil\n\nIf all's well, you should get some console output and the build directory should have three output files.\n\nI suggest testing the --ci and -p arguments here. There's a silly test included in the spec folder to demonstrate the\npavlov host.\n\n## To Do\n\n* Provide advanced uglify configuration options\n* Provide advanced JSLint configuration options\n* Support pavlov tests for node projects","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.6.5":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.6.5","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.6.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0e6dd71b6d764efe21d736ab7b8c20af497d9aec","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.6.5.tgz"},"readme":"# Anvil\n\nI wanted a way to build a single javascript module from several source files. Jake/Rake/Make aren't really doing enough for me. Everything else I found that came close was also trying to enforce how that output got used (Ender, Require, etc.).\n\nI built anvil for myself, but I hope others find it useful.\n\n## What Does It Do?\n\nHere's the current feature list:\n\n* Create simple directory structure for new projects\n* Create build.json files\n* Combine multiple js or coffee files\n* Supports multiple, distinct output files\n* Customized file names for output\n* Compile coffee files into js (can be turned off to maintain coffee output)\n* Lint resulting file(s)\n* Uglify resulting file(s)\n* Gzip resulting file(s)\n* Run in a CI mode where anvil will re-compile the project on source file changes\n* Dynamically generate a pavlov test page\n    * Hosted on localhost:1580\n    * Auto-refresh of the test page on code changes (thanks to @ifandelse\n* Host integration pages at 3080\n    * Defaults to hosting ./html at / in the uri\n    * Now configurable and can host multiple directories at specified URIs\n* Create integration page stubs including all external dependencies and build output\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will make assumptions. Here's the list:\n\n* All your source will be in ./src\n* Your output will go to ./lib\n* You want .coffee files compiled to .js\n* Your final files will get run through lint\n* Your final files will then be uglified as *.min.js\n* Your final files will then be gzipped as *.min.gz.js\n\nThere isn't a wrapper by convention.\n\n## The Build File\n\n    {\n        \"source\": \"src\",\n        \"output\": \"build\",\n        \"lint\": {},\n        \"uglify\": {},\n        \"gzip\": {},\n        \"extensions\": { \"uglify\": \"min\", \"gzip\": \"gz\" },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"(function(context) {\",\n            \"suffix|suffix-file\": \"})(this);\"\n        },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"name\": \"custom-name.js\"\n    }\n\n* source is where Anvil expects *all* your code. Don't get fancy or Anvil can't help you :(\n* output is where Anvil will write all the build output and temp files. This should NOT be the same as source.\n* lint specifies that you want your output files run through JSLint before Uglify and Gzip occur.\n* uglify specifies that you want your output uglified. (happens before gzip)\n* gzip specifies that you want your output gzipped.\n\n* wrap\n    * prefix prepends the following string to your output files.\n    * suffix appends the following string to your output files.\n    * If prefix-file or suffix-file is provided instead, the file will be read and the contents used\n\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * If header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n\nThere's also another option called justCoffee that will cause anvil to maintain all output in coffeescript instead of compiling it to js.\n\n## Jumpstart New Projects\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n    anvil -n <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    //import(\"dependency.js\");\n\n**Coffeescript**\n\n    ###import \"dependency.js\" ###\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular import statements and it will break the world if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file type\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file, you can just type the following:\n\n    anvil -t <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\n## Hosting\n\nAnvil provides local hosting for pavlov test specification and integration tests via express.\n\n### External Dependencies\n\nExternal dependencies get included in pavlov host pages and integration pages. The default directory these are stored in is \"ext\"\n\n### Fun With Coffee\n\nExternal dependencies, lib files and specs can all be written in coffee script provided the files have a .coffee file extension. Anvil will translate these on-the-fly and serve the js to the browser.\n\n### Pavlov Hosting\n\nAnvil will generate a pavlov test page for your output and host it in express at port 1580. All scripts in the lib, ext and spec folders will be included in this test page. The pavlov, qunit and jquery resources are symlinked into your root directory so that express will load these files correctly.\n\nThanks to a contribution from @ifandelse, if you're using the CI feature, the test page will automatically refresh itself after each successful build.\n\n    anvil -p\n\nIf you've written your specs and source files correctly, you can also provide a 's' switch to tell the test runner to test against the source directory instead of the output directory.\n\n    anvil -p -s\n\n### Integration Hosting\n\nAnvil can also host files from the lib, ext, and other folders at port 3080. Unlike the pavlov host, there is no default page so the URL has to be page specific.\n\n    anvil -h\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### Generating Stub Integration Files\n\nI am incredibly lazy. The thought of typing a bunch of script tags makes me tired. Therefore, anvil will do this for you.\n\n    anvil --html integration\n\nWould create an integration.html file with script tags for all files found in lib and ext named integration.html. You need\nto provide the full path to the file you want it to create (minus the .html extension) and the path must already exist.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n## Demo\n\nIf you have the source, check out the demo directory. It's intended to play around and test different features out. If you've installed anvil from npm, all you have to do is type:\n\n    cd demo\n    anvil\n\nand watch how anvil builds the demo project.\n\nIf you've pulled the repository down, then try this:\n    cd demo\n    ../bin/anvil\n\nIf all's well, you should get some console output and the build directory should have three output files.\n\nI suggest testing the --ci and -p arguments here. There's a silly test included in the spec folder to demonstrate the\npavlov host.\n\n## To Do\n\n* Provide advanced uglify configuration options\n* Provide advanced JSLint configuration options\n* Support pavlov tests for node projects","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.6.6":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.6.6","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.6.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"989d30cb3fa38f9b72527975c7125bfb84c75501","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.6.6.tgz"},"readme":"# Anvil\n\nI wanted a way to build a single javascript module from several source files. Jake/Rake/Make aren't really doing enough for me. Everything else I found that came close was also trying to enforce how that output got used (Ender, Require, etc.).\n\nI built anvil for myself, but I hope others find it useful.\n\n## What Does It Do?\n\nHere's the current feature list:\n\n* Create simple directory structure for new projects\n* Create build.json files\n* Combine multiple js or coffee files\n* Supports multiple, distinct output files\n* Customized file names for output\n* Compile coffee files into js (can be turned off to maintain coffee output)\n* Lint resulting file(s)\n* Uglify resulting file(s)\n* Gzip resulting file(s)\n* Run in a CI mode where anvil will re-compile the project on source file changes\n* Dynamically generate a pavlov test page\n    * Hosted on localhost:1580\n    * Auto-refresh of the test page on code changes (thanks to @ifandelse\n* Host integration pages at 3080\n    * Defaults to hosting ./html at / in the uri\n    * Now configurable and can host multiple directories at specified URIs\n* Create integration page stubs including all external dependencies and build output\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will make assumptions. Here's the list:\n\n* All your source will be in ./src\n* Your output will go to ./lib\n* You want .coffee files compiled to .js\n* Your final files will get run through lint\n* Your final files will then be uglified as *.min.js\n* Your final files will then be gzipped as *.min.gz.js\n\nThere isn't a wrapper by convention.\n\n## The Build File\n\n    {\n        \"source\": \"src\",\n        \"output\": \"build\",\n        \"lint\": {},\n        \"uglify\": {},\n        \"gzip\": {},\n        \"extensions\": { \"uglify\": \"min\", \"gzip\": \"gz\" },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"(function(context) {\",\n            \"suffix|suffix-file\": \"})(this);\"\n        },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"name\": \"custom-name.js\"\n    }\n\n* source is where Anvil expects *all* your code. Don't get fancy or Anvil can't help you :(\n* output is where Anvil will write all the build output and temp files. This should NOT be the same as source.\n* lint specifies that you want your output files run through JSLint before Uglify and Gzip occur.\n* uglify specifies that you want your output uglified. (happens before gzip)\n* gzip specifies that you want your output gzipped.\n\n* wrap\n    * prefix prepends the following string to your output files.\n    * suffix appends the following string to your output files.\n    * If prefix-file or suffix-file is provided instead, the file will be read and the contents used\n\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * If header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n\nThere's also another option called justCoffee that will cause anvil to maintain all output in coffeescript instead of compiling it to js.\n\n## Jumpstart New Projects\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n    anvil -n <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    //import(\"dependency.js\");\n\n**Coffeescript**\n\n    ###import \"dependency.js\" ###\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular import statements and it will break the world if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file type\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file, you can just type the following:\n\n    anvil -t <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\n## Hosting\n\nAnvil provides local hosting for pavlov test specification and integration tests via express.\n\n### External Dependencies\n\nExternal dependencies get included in pavlov host pages and integration pages. The default directory these are stored in is \"ext\"\n\n### Fun With Coffee\n\nExternal dependencies, lib files and specs can all be written in coffee script provided the files have a .coffee file extension. Anvil will translate these on-the-fly and serve the js to the browser.\n\n### Pavlov Hosting\n\nAnvil will generate a pavlov test page for your output and host it in express at port 1580. All scripts in the lib, ext and spec folders will be included in this test page. The pavlov, qunit and jquery resources are symlinked into your root directory so that express will load these files correctly.\n\nThanks to a contribution from @ifandelse, if you're using the CI feature, the test page will automatically refresh itself after each successful build.\n\n    anvil -p\n\nIf you've written your specs and source files correctly, you can also provide a 's' switch to tell the test runner to test against the source directory instead of the output directory.\n\n    anvil -p -s\n\n### Integration Hosting\n\nAnvil can also host files from the lib, ext, and other folders at port 3080. Unlike the pavlov host, there is no default page so the URL has to be page specific.\n\n    anvil -h\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### Generating Stub Integration Files\n\nI am incredibly lazy. The thought of typing a bunch of script tags makes me tired. Therefore, anvil will do this for you.\n\n    anvil --html integration\n\nWould create an integration.html file with script tags for all files found in lib and ext named integration.html. You need\nto provide the full path to the file you want it to create (minus the .html extension) and the path must already exist.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n## Demo\n\nIf you have the source, check out the demo directory. It's intended to play around and test different features out. If you've installed anvil from npm, all you have to do is type:\n\n    cd demo\n    anvil\n\nand watch how anvil builds the demo project.\n\nIf you've pulled the repository down, then try this:\n    cd demo\n    ../bin/anvil\n\nIf all's well, you should get some console output and the build directory should have three output files.\n\nI suggest testing the --ci and -p arguments here. There's a silly test included in the spec folder to demonstrate the\npavlov host.\n\n## To Do\n\n* Provide advanced uglify configuration options\n* Provide advanced JSLint configuration options\n* Support pavlov tests for node projects","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.6.7":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.6.7","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4","ape":">=0.3.6","docco":">=0.3.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.6.7","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4c620edfc8bd934c795658e2fb2be51f8b1ced84","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.6.7.tgz"},"readme":"# Anvil\n\nI wanted a way to build a single javascript module from several source files. Jake/Rake/Make aren't really doing enough for me. Everything else I found that came close was also trying to enforce how that output got used (Ender, Require, etc.).\n\nI built anvil for myself, but I hope others find it useful.\n\n## What Does It Do?\n\nHere's the current feature list:\n\n* Create simple directory structure for new projects\n* Create build.json files\n* Combine multiple js or coffee files\n* Supports multiple, distinct output files\n* Customized file names for output\n* Compile coffee files into js (can be turned off to maintain coffee output)\n* Lint resulting file(s)\n* Uglify resulting file(s)\n* Gzip resulting file(s)\n* Run in a CI mode where anvil will re-compile the project on source file changes\n* Dynamically generate a pavlov test page\n    * Hosted on localhost:1580\n    * Auto-refresh of the test page on code changes (thanks to @ifandelse\n* Host integration pages at 3080\n    * Defaults to hosting ./html at / in the uri\n    * Now configurable and can host multiple directories at specified URIs\n* Create integration page stubs including all external dependencies and build output\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will make assumptions. Here's the list:\n\n* All your source will be in ./src\n* Your output will go to ./lib\n* You want .coffee files compiled to .js\n* Your final files will get run through lint\n* Your final files will then be uglified as *.min.js\n* Your final files will then be gzipped as *.min.gz.js\n\nThere isn't a wrapper by convention.\n\n## The Build File\n\n    {\n        \"source\": \"src\",\n        \"output\": \"build\",\n        \"lint\": {},\n        \"uglify\": {},\n        \"gzip\": {},\n        \"extensions\": { \"uglify\": \"min\", \"gzip\": \"gz\" },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"(function(context) {\",\n            \"suffix|suffix-file\": \"})(this);\"\n        },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"name\": \"custom-name.js\"\n    }\n\n* source is where Anvil expects *all* your code. Don't get fancy or Anvil can't help you :(\n* output is where Anvil will write all the build output and temp files. This should NOT be the same as source.\n* lint specifies that you want your output files run through JSLint before Uglify and Gzip occur.\n* uglify specifies that you want your output uglified. (happens before gzip)\n* gzip specifies that you want your output gzipped.\n\n* wrap\n    * prefix prepends the following string to your output files.\n    * suffix appends the following string to your output files.\n    * If prefix-file or suffix-file is provided instead, the file will be read and the contents used\n\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * If header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n\nThere's also another option called justCoffee that will cause anvil to maintain all output in coffeescript instead of compiling it to js.\n\n## Jumpstart New Projects\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n    anvil -n <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    //import(\"dependency.js\");\n\n**Coffeescript**\n\n    ###import \"dependency.js\" ###\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular import statements and it will break the world if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file type\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file, you can just type the following:\n\n    anvil -t <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\n## Hosting\n\nAnvil provides local hosting for pavlov test specification and integration tests via express.\n\n### External Dependencies\n\nExternal dependencies get included in pavlov host pages and integration pages. The default directory these are stored in is \"ext\"\n\n### Fun With Coffee\n\nExternal dependencies, lib files and specs can all be written in coffee script provided the files have a .coffee file extension. Anvil will translate these on-the-fly and serve the js to the browser.\n\n### Pavlov Hosting\n\nAnvil will generate a pavlov test page for your output and host it in express at port 1580. All scripts in the lib, ext and spec folders will be included in this test page. The pavlov, qunit and jquery resources are symlinked into your root directory so that express will load these files correctly.\n\nThanks to a contribution from @ifandelse, if you're using the CI feature, the test page will automatically refresh itself after each successful build.\n\n    anvil -p\n\nIf you've written your specs and source files correctly, you can also provide a 's' switch to tell the test runner to test against the source directory instead of the output directory.\n\n    anvil -p -s\n\n### Integration Hosting\n\nAnvil can also host files from the lib, ext, and other folders at port 3080. Unlike the pavlov host, there is no default page so the URL has to be page specific.\n\n    anvil -h\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### Generating Stub Integration Files\n\nI am incredibly lazy. The thought of typing a bunch of script tags makes me tired. Therefore, anvil will do this for you.\n\n    anvil --html integration\n\nWould create an integration.html file with script tags for all files found in lib and ext named integration.html. You need\nto provide the full path to the file you want it to create (minus the .html extension) and the path must already exist.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n## Demo\n\nIf you have the source, check out the demo directory. It's intended to play around and test different features out. If you've installed anvil from npm, all you have to do is type:\n\n    cd demo\n    anvil\n\nand watch how anvil builds the demo project.\n\nIf you've pulled the repository down, then try this:\n    cd demo\n    ../bin/anvil\n\nIf all's well, you should get some console output and the build directory should have three output files.\n\nI suggest testing the --ci and -p arguments here. There's a silly test included in the spec folder to demonstrate the\npavlov host.\n\n## To Do\n\n* Provide advanced uglify configuration options\n* Provide advanced JSLint configuration options\n* Support pavlov tests for node projects","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.6.8":{"name":"anvil.js","description":"Static javascript / coffeescript build utility","version":"0.6.8","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static"],"main":"./lib/anvil.js","homepage":"http://arobson.github.com/anvil","repository":{"type":"git","url":"git://github.com/arobson/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","gzip":">=0.1.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.0.7","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","express-resource":">=0.2.2","DOMBuilder":"2.0.1","dive":"0.0.3","argparser":"0.0.9","socket.io":">=0.8.4","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.6.8","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"7279ed1ab10509dbcabfc1f808d56feb0fbaa939","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.6.8.tgz"},"readme":"# Anvil\n\nI wanted a way to build a single javascript module from several source files. Jake/Rake/Make aren't really doing enough for me. Everything else I found that came close was also trying to enforce how that output got used (Ender, Require, etc.).\n\nI built anvil for myself, but I hope others find it useful.\n\n## What Does It Do?\n\nHere's the current feature list:\n\n* Create simple directory structure for new projects\n* Create build.json files\n* Combine multiple js or coffee files\n* Supports multiple, distinct output files\n* Customized file names for output\n* Compile coffee files into js (can be turned off to maintain coffee output)\n* Lint resulting file(s)\n* Uglify resulting file(s)\n* Gzip resulting file(s)\n* Run in a CI mode where anvil will re-compile the project on source file changes\n* Dynamically generate a pavlov test page\n    * Hosted on localhost:1580\n    * Auto-refresh of the test page on code changes (thanks to @ifandelse\n* Host integration pages at 3080\n    * Defaults to hosting ./html at / in the uri\n    * Now configurable and can host multiple directories at specified URIs\n* Create integration page stubs including all external dependencies and build output\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will make assumptions. Here's the list:\n\n* All your source will be in ./src\n* Your output will go to ./lib\n* You want .coffee files compiled to .js\n* Your final files will get run through lint\n* Your final files will then be uglified as *.min.js\n* Your final files will then be gzipped as *.min.gz.js\n\nThere isn't a wrapper by convention.\n\n## The Build File\n\n    {\n        \"source\": \"src\",\n        \"output\": \"build\",\n        \"lint\": {},\n        \"uglify\": {},\n        \"gzip\": {},\n        \"extensions\": { \"uglify\": \"min\", \"gzip\": \"gz\" },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"(function(context) {\",\n            \"suffix|suffix-file\": \"})(this);\"\n        },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"name\": \"custom-name.js\"\n    }\n\n* source is where Anvil expects *all* your code. Don't get fancy or Anvil can't help you :(\n* output is where Anvil will write all the build output and temp files. This should NOT be the same as source.\n* lint specifies that you want your output files run through JSLint before Uglify and Gzip occur.\n* uglify specifies that you want your output uglified. (happens before gzip)\n* gzip specifies that you want your output gzipped.\n\n* wrap\n    * prefix prepends the following string to your output files.\n    * suffix appends the following string to your output files.\n    * If prefix-file or suffix-file is provided instead, the file will be read and the contents used\n\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * If header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n\nThere's also another option called justCoffee that will cause anvil to maintain all output in coffeescript instead of compiling it to js.\n\n## Jumpstart New Projects\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n    anvil -n <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    //import(\"dependency.js\");\n\n**Coffeescript**\n\n    ###import \"dependency.js\" ###\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular import statements and it will break the world if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file type\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file, you can just type the following:\n\n    anvil -t <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\n## Hosting\n\nAnvil provides local hosting for pavlov test specification and integration tests via express.\n\n### External Dependencies\n\nExternal dependencies get included in pavlov host pages and integration pages. The default directory these are stored in is \"ext\"\n\n### Fun With Coffee\n\nExternal dependencies, lib files and specs can all be written in coffee script provided the files have a .coffee file extension. Anvil will translate these on-the-fly and serve the js to the browser.\n\n### Pavlov Hosting\n\nAnvil will generate a pavlov test page for your output and host it in express at port 1580. All scripts in the lib, ext and spec folders will be included in this test page. The pavlov, qunit and jquery resources are symlinked into your root directory so that express will load these files correctly.\n\nThanks to a contribution from @ifandelse, if you're using the CI feature, the test page will automatically refresh itself after each successful build.\n\n    anvil -p\n\nIf you've written your specs and source files correctly, you can also provide a 's' switch to tell the test runner to test against the source directory instead of the output directory.\n\n    anvil -p -s\n\n### Integration Hosting\n\nAnvil can also host files from the lib, ext, and other folders at port 3080. Unlike the pavlov host, there is no default page so the URL has to be page specific.\n\n    anvil -h\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### Generating Stub Integration Files\n\nI am incredibly lazy. The thought of typing a bunch of script tags makes me tired. Therefore, anvil will do this for you.\n\n    anvil --html integration\n\nWould create an integration.html file with script tags for all files found in lib and ext named integration.html. You need\nto provide the full path to the file you want it to create (minus the .html extension) and the path must already exist.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n## Demo\n\nIf you have the source, check out the demo directory. It's intended to play around and test different features out. If you've installed anvil from npm, all you have to do is type:\n\n    cd demo\n    anvil\n\nand watch how anvil builds the demo project.\n\nIf you've pulled the repository down, then try this:\n    cd demo\n    ../bin/anvil\n\nIf all's well, you should get some console output and the build directory should have three output files.\n\nI suggest testing the --ci and -p arguments here. There's a silly test included in the spec folder to demonstrate the\npavlov host.\n\n## To Do\n\n* Provide advanced uglify configuration options\n* Provide advanced JSLint configuration options\n* Support pavlov tests for node projects","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.0":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.0","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","argparser":"0.0.9","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2c24cb25893d776b790839eccdad4b41b7f48536","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.0.tgz"},"readme":"# Anvil\n\nI initially built Anvil for myself. I wanted a nice way to combine/compile/minify/test my JS/Coffee projects.\n\nThen I landed a sweet gig with appendTo and my focus broadened to included web app development and noticed there are a lot of similarities but Anvil had been built with a very limited scope.\n\nIn the end, I think the philosophy is simple: build web and node projects the way you want and Anvil will help you package it the way you need.\n\n## What Does It Do?\n\nHere's the current feature list:\n\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, Markdown and CoffeeKup\n* Combine resource files into output files via import syntax (varies by language and file type)\n* Compress JS and CSS resources (maybe images one day)\n* Continously perform these steps in the background as files change\n* Run tests with QUnit, Pavlov or Mocha after each build\n* Kick-off new projects with simple scaffolding\n* Create new build.json configurations\n* Customized file names for output\n* Create integration page stubs that include all external dependencies and build output\n* Host any set of directories in the project at custom URL paths (port 3080)\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will make assumptions. Here's the list:\n\n* All your source will be in ./src and get output to ./lib and ./site/js\n* All your styles will be in ./style and get output to ./css and ./site/css\n* All your markup will be in ./markup and get output to ./site\n* All resources will be compiled to JS, CSS and HTML\n* All JS and CSS will be minified\n* If the project includes a markup or style folder, you're building a site, not a lib\n\n## The Build File ( large example showing all options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        }\n        \"lint\": {},\n        \"uglify\": {},\n        \"gzip\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\", \"gzip\": \"gz\" },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\"\n        },\n        \"name\": \"custom-name.js\",\n        \"testWith\": \"mocha|pavlov\",\n        \"continuous\": true,\n        \"host\": true\n    }\n\n* source is where Anvil expects *all* your code. Don't get fancy or Anvil can't help you :(\n* output is where Anvil will write all the build output and temp files. This should NOT be the same as source.\n* lint specifies that you want your output files run through JSLint before Uglify and Gzip occur.\n* uglify specifies that you want your output uglified. (happens before gzip)\n* gzip specifies that you want your output gzipped.\n\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * If header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n\nThere's also another option called justCoffee that will cause anvil to maintain all output in coffeescript instead of compiling it to js.\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    //import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ###import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    import \"dependency.{ext}\"\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file type\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, HAML and CoffeeKup are all converted at request time if they are requested.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding \"testWith\": \"mocha\" to your build.json file.\n\n### Pavlov Hosting\n\nAnvil will generate a pavlov test page for your output and host it in express at port 1580. All scripts in the lib, ext and spec folders will be included in this test page. The pavlov, qunit and jquery resources are symlinked into your root directory so that express will load these files correctly.\n\nThanks to a contribution from @ifandelse, if you're using the CI feature, the test page will automatically refresh itself after each successful build.\n\n    anvil -p\n\nor\n    anvil --pavlov\n\n### Generating Stub Integration Files\n\nI am incredibly lazy. The thought of typing a bunch of script tags makes me tired. Therefore, anvil will do this for you.\n\n    anvil --html integration\n\nWould create an integration.html file with script tags for all files found in lib and ext named integration.html. You need\nto provide the full path to the file you want it to create (minus the .html extension) and the path must already exist.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.1":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.1","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","argparser":"0.0.9","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2e5224432fb87948e864fcc94512e0221de67283","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.1.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        }\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap:\" {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\", \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.2":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.2","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","argparser":"0.0.9","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1369037f196ced93f14532f342409d67f0abcfa7","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.2.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        }\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap:\" {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\", \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.3":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.3","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","argparser":"0.0.9","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"37be932953acf3cb245e9229dd645c496ed446cc","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.3.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        }\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap:\" {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\", \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.4":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.4","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","commander":">=0.6.0","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"dd900ddabf8b1cecd7bd1bbad70d3f09fbe54a2d","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.4.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        \"output\": {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        }\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap:\" {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\", \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.5":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.5","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","commander":">=0.6.0","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d20680aad9a477fe8ea440f51803b971df7752d1","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.5.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        \"output\": {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        }\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize:\" {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap:\" {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\", \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.6":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.6","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","commander":">=0.6.0","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","docco":"https://github.com/andtan/flocco/tarball/master","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"23da329a6d526f808e016adf846f0b2e3b7a25b6","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.6.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        \"output\": {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        },\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize\": {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\": \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.7":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.7","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","commander":">=0.6.0","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.7","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"3360f3d2da2d57d55241882f45b2a11bec4cee0b","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.7.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        \"output\": {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        },\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize\": {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\": \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.8":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.8","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","commander":">=0.6.0","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.8","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b6949365ed71cbfd7ccde20f4ef8cc9df48232e4","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.8.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        \"output\": {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        },\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize\": {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\": \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n# Contributors\n\nSpecial thanks to the following individuals who have contributed source code or ideas to help make Anvil.js less buggy and more useful:\n\n * Jim Cowart\n * Aaron McCall\n * Mike Stenhouse\n * Robert Messerle\n * Mike Hostetler\n * Doug Neiner\n * Derick Bailey","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.7.9":{"name":"anvil.js","description":"A continuous integration tool for JS, CSS and HTML.","version":"0.7.9","authors":["Alex Robson <@A_Robson>"],"keywords":["build","compile","static","ci"],"main":"./lib/anvil.js","homepage":"http://anvil-js.org","repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"directories":{"lib":"./lib"},"engines":{"node":">=0.6.0"},"dependencies":{"colors":">=0.5.0","readyjslint":">=0.0.4","mkdirp":">=0.0.7","uglify-js":">=1.2.6","underscore":">=1.1.7","coffee-script":"1.1.2","express":">=2.4.6","commander":">=0.6.0","socket.io":">=0.8.4","stylus":">=0.24.0","cssmin":">=0.3.1","less":">=1.3.0","marked":">=0.2.3","haml":">=0.4.2","coffeekup":">=0.3.1","ape":">=0.3.6","mocha":">=0.12.1","should":">=0.6.0"},"preferGlobal":true,"bin":{"anvil":"./bin/anvil"},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.js@0.7.9","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"78677cf1e1d4d00bef5ba2bad57b07e62e950a00","tarball":"http://registry.npmjs.org/anvil.js/-/anvil.js-0.7.9.tgz"},"readme":"# Anvil\n\nAnvil started as a way to build a single javascript module from several source files. Build tools that require a lot of explicit/declarative instructions distract from getting work on the project done.\n\nAnvil is currently being rewritten as CI tool for JS, CSS and HTML.\n\n## What Does It Do?\n\nHere are the main features:\n\n* Create simple directory structure / scaffolding for new projects\n* Combine resource files through a comment-based import syntax\n* 'Compile' CoffeeScript, Stylus, LESS, HAML, and Markdown\n* Minify JS and CSS resources\n* Generate annotated JS or CoffeeScript source with docco or ape\n* Continously perform these steps in the background as files change\n* Mocha test runner\n* Host static content\n * Compiles CoffeeScript, Stylus, LESS, Markdown and HAML on the fly\n * Useful for hosting browser test suites\n * Simple hook script to cause page refreshes after every build\n\n## Installation\n\n    npm install anvil.js -g\n\n## By Convention\n\nWithout a build file, Anvil will use its default conventions to attempt to build your project.\n\n## The Build File ( large example showing lots of options )\n\n    {\n        \"source\": \"src\",\n        \"style\": \"style\",\n        \"markup\": \"markup\",\n        \"output\": {\n            \"source\": [ \"lib\", \"site/js\" ],\n            \"style\": [ \"css\", \"site/css\" ],\n            \"markup\": \"site/\"\n        },\n        \"lint\": {},\n        \"uglify\": {},\n        \"cssmin\": {},\n        \"extensions\": { \"uglify\": \"min\" },\n        \"finalize\": {\n            \"header|header-file\": \"this is some unprocessed text or a file name\",\n            \"footer|footer-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"wrap\": {\n            \"prefix|prefix-file\": \"this is some unprocessed text or a file name\",\n            \"suffix|suffix-file\": \"this is some unprocessed text or a file name\"\n        },\n        \"hosts\": {\n          \"/\": \"site\",\n          \"/docs\": \"docs\"\n        },\n        \"name\": \"custom-name.js\",\n        \"mocha\": { \"reporter\": \"spec\" },\n        \"docs\": { \"generator\": \"ape\", \"output\": \"docs\" }\n    }\n\n* source is your JS and CS code.\n* output is where build outputs go.\n* lint will run output files run through JSLint before Uglify occurs (JS only).\n* uglify specifies that you want your JS output uglified.\n* cssmin minifies CSS output.\n* wrap\n    * happens before minification\n    * provides a means to wrap all output files of a type with a prefix and suffix before minification\n    * if prefix-file or suffix-file is provided, the file will be read and the contents used\n    * this feature is primarily a convenience method included for legacy reasons\n* finalize\n    * header prepends the following string to the final output ONLY.\n    * footer appends the following string to the final output ONLY.\n    * if header-file or footer-file is provided, the file will be read and the contents used\n    * this section was added to support adding boiler plate text headers to minified/gzipped output\n* name\n    * for projects with a single file output, this will replace the name of the output file\n    * for projects with multiple file outputs, you can provide a lookup hash to over-write\n        each specific file name\n* mocha\n\t* allows you to provide customizations to how the mocha tests will run\n * docs\n \t* generate annotated source documents for your project\n\n## Jumpstart New Projects\n\nThere are two ways to do this now - one for lib projects and one for sites.\n\nAnvil will build a set of standard project directories for you and even spit out a build.json file based on the conventional use.\n\n### Lib Projects\n\n    anvil --lib <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-lib\n        |-spec\n        build.json\n\n\n### Site Projects\n\n    anvil --site <projectName>\n\nWill produce a directory structure that looks like this:\n\n    -projectName\n        |-ext\n        |-src\n        |-site\n            |-js\n            |-css\n        |-style\n        |-markup\n        |-lib\n        |-css\n        |-spec\n        build.json\n\n## Building By Convention\n\nIf you don't specify your own build file, anvil assumes you intend to use a build.json file. If one isn't present, it will use its own conventions to build your project. If that's all you need, great! Chances are you'll want a build.json that's configured for your specific project. \n\nNow that there are two types of projects, Anvil infers the project type based on the folders you have.\n\n## Combining source files\n\nAnvil allows you to combine source files by using a commented command\n\n**Javascript**\n\n    // import(\"dependency.{ext}\");\n\n**Coffeescript**\n\n    ### import \"dependency.{ext}\" ###\n\n**Stylus, LESS, CSS**\n\n    CSS: \t\t\t/* import \"dependency.{ext}\" */ \n    LESS, Stylus:\t// import \"dependency.{ext}\n\nWhen you use Anvil to compile your project, it will traverse all the files in your source directory and combine them so that your top level files are what get output. **Warning** Currently, Anvil is not clever enough to detect circular dependencies created via import statements and it will _shatter your world_ if you do this.\n\n## Building With Specific Build Files\n\nTo build with a specific build file\n\n    anvil -b <buildfile>\n\n## Creating New / Additional Build Files\n\nTo create a build file for lib projects, you can just type the following:\n\n    anvil --libfile <buildfile>\n\nor for a site project\n\n    anvil --sitefile <buildfile>\n\nand it will create the build file for you. If you don't include the file name, anvil will create a build.json (possibly overwriting your existing one, be careful!)\n\n## Custom Naming\n\nFor projects with a single file output, you can provide a name property which will override the default name of the file:\n\n    \"name\": \"my-custom-name.js\"\n\nFor projects where there are multiple files in the output, you must provide a hash object that will tell anvil how to rename each specific file. For example, if you have a build producing 'one.js' and 'two.js' you would need to provide a hash object that would tell anvil how to name each:\n\n    \"name\": {\n        \"one.js\" : \"main.js\",\n        \"two.js\" : \"plugin.js\"\n    }\n\n## Continuous Integration\n\nAnvil will watch your source directory for changes and rebuild the project in the event any changes are saved to the files in the directory.\n\n    anvil --ci\n\nRemember, if you intend to always run in this mode, you can put a \"continuous\": true in your build.json file.\n\n## Hosting\n\nAnvil provides local hosting based on the \"hosts\" config block. Adding -h, --host argument or a \"host\": true block to your build.json file will cause Anvil to host your project's directories (according to configuration) at port 3080 via express.\n\n    anvil -h\n\nor\n\n    anvil --host\n\nCoffee, Stylus, LESS, Mardown, and HAML are all converted at request time if they are referenced directly.\n\nThe hosts key in the build.json file is where you can control what each folder will be hosted at in the relative url.\n\n    \"hosts\": {\n        \"/example1\" : \"./examples/example1\",\n        \"/example2\" : \"./examples/example2\"\n    }\n\nThe block above would host the folder ./example/example1 at http://localhost:3080/example1 and folder ./example/example2 at http://localhost:3080/example2\n\n### External Dependencies\n\nExternal dependencies get included in all hosting scenarios.\n\n### Testing With Mocha\n\nMocha might be the best thing ever. You can tell Anvil to run your spec files with mocha from the command line\n\n    anvil --mocha\n\nor by adding a \"mocha\" configuration block to your build.json file.\n\n## Too chatty?\n\nYou can tell anvil to run in quiet mode (it will still print errors (red) and step completions (green) )\n\n    anvil -q\n\n# Contributors\n\nSpecial thanks to the following individuals who have contributed source code or ideas to help make Anvil.js less buggy and more useful:\n\n * Jim Cowart\n * Aaron McCall\n * Mike Stenhouse\n * Robert Messerle\n * Mike Hostetler\n * Doug Neiner\n * Derick Bailey","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]}},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"time":{"modified":"2012-06-12T05:45:33.543Z","created":"2011-09-14T22:01:22.667Z","0.2.0":"2011-09-14T22:01:23.170Z","0.2.2":"2011-09-15T00:27:31.044Z","0.2.3":"2011-09-15T04:45:29.072Z","0.4.0":"2011-09-20T05:46:54.421Z","0.4.1":"2011-09-20T17:07:05.613Z","0.4.2":"2011-09-20T17:36:40.548Z","0.4.3":"2011-09-20T17:57:55.026Z","0.4.4":"2011-09-20T19:20:53.259Z","0.5.0":"2011-09-21T17:27:31.120Z","0.5.1":"2011-09-28T02:40:06.526Z","0.5.2":"2011-10-27T13:39:06.066Z","0.5.3":"2011-10-27T13:40:45.955Z","0.5.4":"2011-10-30T16:36:28.673Z","0.5.5":"2011-11-28T19:41:26.947Z","0.6.0":"2012-02-22T02:10:35.474Z","0.6.5":"2012-02-22T04:15:21.270Z","0.6.6":"2012-02-22T21:17:27.517Z","0.6.7":"2012-03-29T01:08:50.531Z","0.6.8":"2012-03-30T04:43:36.818Z","0.7.0":"2012-04-11T09:42:07.744Z","0.7.1":"2012-04-12T01:47:37.086Z","0.7.2":"2012-04-12T03:49:16.970Z","0.7.3":"2012-04-12T16:04:37.031Z","0.7.4":"2012-04-16T04:41:21.769Z","0.7.5":"2012-04-18T22:28:55.726Z","0.7.6":"2012-04-28T00:52:55.249Z","0.7.7":"2012-05-16T13:30:02.554Z","0.7.8":"2012-06-07T02:09:18.080Z","0.7.9":"2012-06-12T05:45:33.543Z"},"repository":{"type":"git","url":"git://github.com/appendto/anvil.js.git"},"_attachments":{"anvil.js-0.7.9.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-Nm0EuyqjjKnz+C2Cx128NA==","length":136089,"stub":true},"anvil.js-0.7.8.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-MXwH05I4dkOOL3bFC6XGaA==","length":136607,"stub":true},"anvil.js-0.7.7.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-b6er1ICVfJgmoKIL04CvWg==","length":134810,"stub":true},"anvil.js-0.7.6.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-vciQdpf2hwK4YiN1uY0dpQ==","length":149347,"stub":true},"anvil.js-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-40QVMhZi2R+rb/vdeS6xHA==","length":121636,"stub":true},"anvil.js-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-ae9ArtPljBtyqhi0eQCVXg==","length":119986,"stub":true},"anvil.js-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-OnihhYEGPPdXqgB56GcXhg==","length":116931,"stub":true},"anvil.js-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-74qD+XSEyXqVtQdPbpDt/w==","length":116659,"stub":true},"anvil.js-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-JTMuXNqHp8UdqWbOux5XQQ==","length":110988,"stub":true},"anvil.js-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-knk6aDCLcgpbKiLx0dSm/w==","length":90869,"stub":true},"anvil.js-0.6.8.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-b3oAeujQ+v1eBrgIKE0EIQ==","length":118361,"stub":true},"anvil.js-0.6.7.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ejP6aCUsk4PW3mcFXu6v9g==","length":118241,"stub":true},"anvil.js-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-CdHZ2RlH4kXALE8MrdLKaA==","length":68421,"stub":true},"anvil.js-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-m0Uv6A6E/zMKJhEzpfd3LA==","length":68439,"stub":true},"anvil.js-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-rEecZFPX9hN2vHEeoyNwzQ==","length":67874,"stub":true},"anvil.js-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-MP24StkxCGPvmbD56S5B7A==","length":71680,"stub":true},"anvil.js-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-qejB1B4qqC6rApXNttTwqA==","length":71680,"stub":true},"anvil.js-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-GdlBnRWcarJpOVCOOdu6MQ==","length":74998,"stub":true},"anvil.js-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-TDK5IHKC3BXL0YG9W7+nzQ==","length":66643,"stub":true},"anvil.js-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-f/EDvjDv2fyWWUp/NxXCbg==","length":64273,"stub":true},"anvil.js-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Y8KsDmiJfduhjc91+hcMQQ==","length":63267,"stub":true},"anvil.js-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-jrhyXuXq3StiUo8/svBWEw==","length":63199,"stub":true},"anvil.js-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-aUX1nA07J+7uDMLwTNoVTw==","length":63204,"stub":true},"anvil.js-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-eX/KIWxwo2rQ0SwuL6ZiDw==","length":72089,"stub":true},"anvil.js-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-CqH9T8izQeRDifSBIsZivg==","length":75487,"stub":true},"anvil.js-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8nzKZll2jbW1NOmjs8Sr0Q==","length":9209,"stub":true},"anvil.js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zTb7TeSc9MB+nD+Ku/ZxIw==","length":9109,"stub":true},"anvil.js-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Asmr8IRQxHCfOkSKuReA/w==","length":8359,"stub":true}}}},
{"id":"anvil.mocha","key":"anvil.mocha","value":{"rev":"28-669bd2838f68770429ea960252eef4db"},"doc":{"_id":"anvil.mocha","_rev":"28-669bd2838f68770429ea960252eef4db","name":"anvil.mocha","description":"Mocha test runner for anvil.js","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.mocha","description":"Mocha test runner for anvil.js","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arobson/anvil.mocha.git"},"engines":{"node":"~0.6.10"},"main":"./lib/plugin.js","dependencies":{"mocha":"~1.3.0"},"devDependencies":{"anvil.js":"~0.8.0"},"optionalDependencies":{},"_npmUser":{"name":"a_robson","email":"alex@sharplearningcurve.com"},"_id":"anvil.mocha@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0ebb06c916249845eba088fecf47542d0dea7ad5","tarball":"http://registry.npmjs.org/anvil.mocha/-/anvil.mocha-0.0.1.tgz"},"readme":"","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"directories":{}},"0.0.2":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.mocha","description":"Mocha test runner for anvil.js","version":"0.0.2","repository":{"type":"git","url":"git://github.com/arobson/anvil.mocha.git"},"engines":{"node":"~0.8.3"},"main":"./lib/plugin.js","dependencies":{"mocha":"~1.3.0"},"devDependencies":{"anvil.js":"~0.8.0"},"optionalDependencies":{},"readme":"## Anvil Mocha Plugin\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.mocha\n\n## Usage\n\n\tanvil --mocha","_id":"anvil.mocha@0.0.2","dist":{"shasum":"731d1876919e815bee589b06ff44281712affe7f","tarball":"http://registry.npmjs.org/anvil.mocha/-/anvil.mocha-0.0.2.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]},"0.0.3":{"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"name":"anvil.mocha","description":"Mocha test runner for anvil.js","version":"0.0.3","repository":{"type":"git","url":"git://github.com/arobson/anvil.mocha.git"},"engines":{"node":"~0.8.3"},"main":"./lib/plugin.js","dependencies":{"mocha":"~1.3.0"},"devDependencies":{"anvil.js":"~0.8.0"},"optionalDependencies":{},"requiredPlugins":["anvil.http"],"readme":"## Anvil Mocha Plugin\n\nThis plugin requires anvil.js version 0.8.* or greater.\n\n## Installation\n\n\tanvil install anvil.mocha\n\n## Usage\n\n\tanvil --mocha","_id":"anvil.mocha@0.0.3","dist":{"shasum":"f79c5be1ee2de6ce2b39f448fc00d19ad4af1454","tarball":"http://registry.npmjs.org/anvil.mocha/-/anvil.mocha-0.0.3.tgz"},"maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}]}},"readme":"","maintainers":[{"name":"a_robson","email":"alex@sharplearningcurve.com"}],"time":{"modified":"2012-08-04T17:08:42.230Z","created":"2012-07-20T16:49:43.467Z","0.0.1":"2012-07-20T16:49:43.854Z","0.0.2":"2012-08-04T03:13:45.921Z","0.0.3":"2012-08-04T17:08:42.230Z"},"author":{"name":"Alex Robson","email":"alex@sharplearningcurve.com","url":"http://sharplearningcurve.com"},"repository":{"type":"git","url":"git://github.com/arobson/anvil.mocha.git"},"users":{"fgribreau":true},"_attachments":{"anvil.mocha-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-vOuwfYXvHUZ5TnXX0CMxpQ==","length":1471,"stub":true},"anvil.mocha-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-5nNYB980H/MAF42wVo8Seg==","length":1449,"stub":true},"anvil.mocha-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7KG32nxQz84V7t+aIOHSMw==","length":1180,"stub":true}}}},
{"id":"aonx","key":"aonx","value":{"rev":"64-a4570d7d87b39a415c86ea94d6ddb785"},"doc":{"_id":"aonx","_rev":"64-a4570d7d87b39a415c86ea94d6ddb785","name":"aonx","description":"very opinionated application framework","dist-tags":{"latest":"0.4.8"},"versions":{"0.0.1":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.1","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"cd29754ce4c45f7d28fba13d4c8cc37e7a6ba0b5","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.1.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.2":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.2","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","express":">= 2.5.9"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3b299b9a54bf68e36b17210faf3f3f811a2e63a6","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.2.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.3":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.3","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","express":">= 2.5.9","underscore":">= 1.3.3"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5f7761eb1351f26bff67d1497beb41b212fc16e3","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.3.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.4":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.4","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","express":">= 2.5.9","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f976d630db75acca986b50e3e54ef9a37ce6d3bb","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.4.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.5":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.5","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","express":">= 2.5.9","express-resource":">= 0.2.4","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"514d954df59b46bb9dd23cb491ed050a2d0e9536","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.5.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.6":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.6","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7761fb51d046b8af34d3daf3c9caa2e3563cc63c","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.6.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.7":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.7","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"bc5b7fe59f6683a28eec82b3351f4455532f8eff","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.7.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.8":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.8","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c83a6ed4c8bc4560d149607c2fdd04407547a6dd","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.8.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.9":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.0.9","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.0.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"fe44c8e7dc2f796a5c252f90779f669f68f748a7","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.0.9.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.0":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.0","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"64d665ac112cf201cc96b6260a05b4911ac25994","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.0.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.1":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.1","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7ed954981b18535bc06cd8d8efaf73575636746e","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.1.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.2":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.2","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a9c6367f4bf686db7cec2e4045c20bc9ba7a2c45","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.2.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.3":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.3","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"273a748da42f23b5bd278ac49577633432debe85","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.3.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.4":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.4","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"41f15ed25157763265069ddc46de0cda199568c5","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.4.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.5":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.5","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"780d89ab4ed2ae10f74053fad6fc393c840a8248","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.5.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.6":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.1.6","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.1.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7d6bcd8a4009fbb9bcc079418f32958e7e9a5d2d","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.1.6.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.2.0":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.2.0","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d1f0c6632c5792a14d05b5e4939eccc62949865f","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.2.0.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.2.1":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.2.1","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","mongoose-plugins":">= 0.0.1","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"81904972968d5455090cde3fa52a0d8bb130070e","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.2.1.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.3.0":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.3.0","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.6.2","mongoose-plugins":">= 0.1.0","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ef24842b7f109ea3475e9a617fe880e027c02346","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.3.0.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.3.1":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.3.1","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.1.1","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e0d9f0095b86cd8a2d5010c06bf4d9ada871870b","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.3.1.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.3.2":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.3.2","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a97f2ab4506a258f89d33c811449c81430fd4062","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.3.2.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.3.3":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.3.3","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.5.11","underscore":">= 1.3.3","connect-mongodb":">= 1.1.3","express":">= 2.5.9","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.4"},"devDependencies":{},"keywords":["express","api","framework","server"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.3.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"13a31e97fbde7ea7b122c032953673c3f3463b99","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.3.3.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.0":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.0","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":">= 2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","cluster2":">= 0.3.1","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"004bac646f03ff2eae089973e66414119673e246","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.0.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.1":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.1","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":">= 2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","cluster2":">= 0.3.1","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ff969de25fa1db0c53db699f8e6317ad5c398cce","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.1.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.2":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.2","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":">= 2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","cluster2":">= 0.3.1","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"6c80722f1f4f4f7c5019e1d70bbfca7e723aade7","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.2.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.3":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.3","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":">= 2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1db6f37b89aa3193d16ad046cfa767d2e12dbc78","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.3.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.4":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.4","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":">= 2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"38b30db0b76f825441a9ca4a11a280190d23780c","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.4.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.5":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.5","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":">= 2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"059073c77256708387762fab3201999f2405a5cf","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.5.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.6":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.6","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":"2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"048c384efd5192f0e9634e2da5a2f8a7a37ae7ae","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.6.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.7":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.7","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":"2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1f53977a4686f84adc431bafc255f9a38b234625","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.7.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.4.8":{"name":"aonx","description":"very opinionated application framework","homepage":"https://github.com/truepattern/aonx","version":"0.4.8","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"winston":">= 0.6.2","underscore":">= 1.3.3","connect-mongodb":">= 1.1.4","express":"2.5.11","express-resource":">= 0.2.4","express-messages":">= 0.0.2","mongoose":">= 2.7.0","mongoose-plugins":">= 0.3.3","gzippo":">= 0.1.7"},"devDependencies":{},"keywords":["express","api","framework","server","cluster"],"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"main":"index","bin":{"aonx":"./bin/aonx"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"aonx@0.4.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d8e3874ae95c2e7955d97dfa7025b444e574e6ed","tarball":"http://registry.npmjs.org/aonx/-/aonx-0.4.8.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]}},"readme":"# aonx\nHighly opinionated application framework.\n\n# Features\n * API server\n\n**ALPHA product, use at your risk**\n","maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}],"time":{"modified":"2012-08-02T13:44:25.064Z","created":"2012-05-01T18:11:35.119Z","0.0.1":"2012-05-01T18:11:36.535Z","0.0.2":"2012-05-01T20:07:39.282Z","0.0.3":"2012-05-01T20:33:52.198Z","0.0.4":"2012-05-01T21:10:40.831Z","0.0.5":"2012-05-01T21:28:42.533Z","0.0.6":"2012-05-04T04:44:10.263Z","0.0.7":"2012-05-04T06:54:36.861Z","0.0.8":"2012-05-04T07:00:12.990Z","0.0.9":"2012-05-17T07:33:31.935Z","0.1.0":"2012-05-18T16:45:15.294Z","0.1.1":"2012-05-19T09:14:33.372Z","0.1.2":"2012-05-22T09:33:30.522Z","0.1.3":"2012-05-28T06:02:19.145Z","0.1.4":"2012-05-28T06:57:53.697Z","0.1.5":"2012-05-28T10:58:07.114Z","0.1.6":"2012-05-29T21:10:29.809Z","0.2.0":"2012-06-02T07:35:49.282Z","0.2.1":"2012-06-09T18:30:56.109Z","0.3.0":"2012-06-10T09:40:39.581Z","0.3.1":"2012-06-22T06:00:13.426Z","0.3.2":"2012-07-08T06:04:07.877Z","0.3.3":"2012-07-08T09:46:59.694Z","0.4.0":"2012-07-11T06:59:43.623Z","0.4.1":"2012-07-12T06:39:04.063Z","0.4.2":"2012-07-12T09:02:48.379Z","0.4.3":"2012-07-12T21:29:31.612Z","0.4.4":"2012-07-12T21:38:49.051Z","0.4.5":"2012-07-19T06:57:49.075Z","0.4.6":"2012-07-19T07:04:38.086Z","0.4.7":"2012-07-19T07:14:21.966Z","0.4.8":"2012-07-25T09:00:39.681Z"},"author":{"name":"truepattern","email":"admin@truepattern.com"},"repository":{"type":"git","url":"git://github.com/truepattern/aonx.git"},"users":{"fgribreau":true},"_attachments":{"aonx-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-lpo8xbLDpay2UR49Xi++0g==","length":6979,"stub":true},"aonx-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-QYPS6TfurvUldCcmeq+eBw==","length":6788,"stub":true},"aonx-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-5LLcvk4jkCDtKQqsMxNmkA==","length":6793,"stub":true},"aonx-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-rW8jwAWe+oHF8fNLw8D+bQ==","length":6789,"stub":true},"aonx-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-p9CRT6yWL4s5UgESHJ1BGg==","length":6698,"stub":true},"aonx-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-bYHrEWR0jEtvMCyJ6c+Jxw==","length":6653,"stub":true},"aonx-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-srdg3eQauFxAfLiaYXA7Rg==","length":6634,"stub":true},"aonx-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-fb1bs0UiKrCQ20XhR8sM3w==","length":6592,"stub":true},"aonx-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-fS2yYcI1QDcWRFF2v78OXw==","length":6572,"stub":true},"aonx-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-pxjpS0oRDlT2HI5wzdMYlg==","length":5765,"stub":true},"aonx-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-dkdMFr9gB0w4SnsM7oQeCg==","length":5751,"stub":true},"aonx-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-omnVR8fd6FXK5+suWN4fCw==","length":5323,"stub":true},"aonx-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-Up7ENJV9hhgZoJLoa4852Q==","length":5320,"stub":true},"aonx-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ts63ikeAkkFnGEctczD6tw==","length":5263,"stub":true},"aonx-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-R1tN8noDaH/JIN87VcdHcw==","length":6459,"stub":true},"aonx-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Vo7RhzJLqdciTJNr3yVIXw==","length":6332,"stub":true},"aonx-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-gUdOoT44jP6TNiSauZ8muw==","length":6351,"stub":true},"aonx-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-HVkXkmutpCRmXoiNWvd2EQ==","length":6103,"stub":true},"aonx-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ncUovNjlWfRJ4+heQ6mOgg==","length":5988,"stub":true},"aonx-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-6IC677Rin3ZIjRWlAofh4Q==","length":5892,"stub":true},"aonx-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-l3ImDGZnG6ASo2y0lqlXAQ==","length":5731,"stub":true},"aonx-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-J/inH7Zj4EYs9cRcM0NdIQ==","length":5632,"stub":true},"aonx-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-a3leVsZSObjTk00q0Gp3ZA==","length":5590,"stub":true},"aonx-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-zfYEzd1dyD+S9tzEDSL6ag==","length":4661,"stub":true},"aonx-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-VI41xKeTrbeDVKa5j1Upcw==","length":4652,"stub":true},"aonx-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-1VSC6mQ5HI3+6aMrc7fBQw==","length":4372,"stub":true},"aonx-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-zGcRC/AdhPa+NgPNZ6qXUQ==","length":4110,"stub":true},"aonx-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SrZe/qmPpUA+CBN0MDMG8Q==","length":4088,"stub":true},"aonx-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OfNrAoSSKxMFsxdlQFmn+g==","length":3133,"stub":true},"aonx-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-x+JxZqZ6525VQC6aO2PYlQ==","length":2863,"stub":true},"aonx-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-90/yq+76Y+BMWpSsu2+SoQ==","length":1464,"stub":true}}}},
{"id":"aop","key":"aop","value":{"rev":"9-9acc0139df57a1db2604f13f12b500f2"},"doc":{"_id":"aop","_rev":"9-9acc0139df57a1db2604f13f12b500f2","name":"aop","description":"Simple AOP realization for async applications","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"aop","version":"0.1.0","description":"Simple AOP realization for async applications","keywords":["aop"],"author":{"name":"Vadim M. Baryshev","email":"vadimbaryshev@gmail.com"},"repository":{"type":"git","url":"git://github.com/baryshev/aop.git"},"main":"index","engines":{"node":">= 0.2.0"},"_npmJsonOpts":{"file":"/home/vadim/.npm/aop/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aop@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"1379bdab4dd63225cf760d8b7be6aadff335d9a2","tarball":"http://registry.npmjs.org/aop/-/aop-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"baryshev","email":"vadimbaryshev@gmail.com"}]},"0.1.1":{"name":"aop","version":"0.1.1","description":"Simple AOP realization for async applications","keywords":["aop"],"author":{"name":"Vadim M. Baryshev","email":"vadimbaryshev@gmail.com"},"repository":{"type":"git","url":"git://github.com/baryshev/aop.git"},"main":"index","engines":{"node":">= 0.2.0"},"_npmJsonOpts":{"file":"/home/vadim/.npm/aop/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aop@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"09b39b19a577e096b76e9d215298d2cf636cba19","tarball":"http://registry.npmjs.org/aop/-/aop-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"baryshev","email":"vadimbaryshev@gmail.com"}]},"0.1.2":{"name":"aop","version":"0.1.2","description":"Simple AOP realization for async applications","keywords":["aop"],"author":{"name":"Vadim M. Baryshev","email":"vadimbaryshev@gmail.com"},"repository":{"type":"git","url":"git://github.com/baryshev/aop.git"},"main":"index","engines":{"node":">= 0.2.0"},"_npmJsonOpts":{"file":"/home/vadim/.npm/aop/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aop@0.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5bc3cf517576a661068fccea4dabbedbadac41a2","tarball":"http://registry.npmjs.org/aop/-/aop-0.1.2.tgz"},"scripts":{},"maintainers":[{"name":"baryshev","email":"vadimbaryshev@gmail.com"}]},"0.1.3":{"name":"aop","version":"0.1.3","description":"Simple AOP realization for async applications","keywords":["aop"],"author":{"name":"Vadim M. Baryshev","email":"vadimbaryshev@gmail.com"},"repository":{"type":"git","url":"git://github.com/baryshev/aop.git"},"main":"index","engines":{"node":">= 0.2.0"},"_npmUser":{"name":"baryshev","email":"vadimbaryshev@gmail.com"},"_id":"aop@0.1.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0f6f4bcefd2924a1ff93f95a3f466b9ff129058f","tarball":"http://registry.npmjs.org/aop/-/aop-0.1.3.tgz"},"readme":"","maintainers":[{"name":"baryshev","email":"vadimbaryshev@gmail.com"}]}},"maintainers":[{"name":"baryshev","email":"vadimbaryshev@gmail.com"}],"time":{"modified":"2012-02-04T13:24:15.752Z","created":"2011-09-17T14:10:02.459Z","0.1.0":"2011-09-17T14:10:04.774Z","0.1.1":"2011-09-17T14:16:16.028Z","0.1.2":"2011-09-17T14:47:38.772Z","0.1.3":"2012-02-04T13:24:15.752Z"},"author":{"name":"Vadim M. Baryshev","email":"vadimbaryshev@gmail.com"},"repository":{"type":"git","url":"git://github.com/baryshev/aop.git"},"_attachments":{"aop-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SzG/mV0hRJy63A/jQK5kfQ==","length":1298,"stub":true},"aop-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RhrPAgV/c7HIjnOL++D+dw==","length":1261,"stub":true},"aop-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-anRrNpUgYwA9Xm3b6CM5Ow==","length":592,"stub":true},"aop-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tzOI5h8+4epZmEpPQ9j3aw==","length":594,"stub":true}}}},
{"id":"ap","key":"ap","value":{"rev":"5-b4ecb9c767060aa34c106692bfd26edf"},"doc":{"_id":"ap","_rev":"5-b4ecb9c767060aa34c106692bfd26edf","name":"ap","description":"Currying in javascript. Like .bind() without also setting `this`.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"ap","version":"0.0.1","description":"Currying in javascript. Like .bind() without also setting `this`.","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-ap.git"},"keywords":["curry","apply","ap","bind","function","functional"],"devDependencies":{"expresso":">=0.6.0"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"ap@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c245b2a2b97457c05f56e4d3a91138c6fe68af82","tarball":"http://registry.npmjs.org/ap/-/ap-0.0.1.tgz"}},"0.1.0":{"name":"ap","version":"0.1.0","description":"Currying in javascript. Like .bind() without also setting `this`.","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"http://github.com/substack/node-ap.git"},"keywords":["curry","apply","ap","bind","function","functional"],"devDependencies":{"tap":"0.2.5"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"tap ./test"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"","_id":"ap@0.1.0","dist":{"shasum":"d8a3f26615379398a1b53ca6cc1a666a0fbfe150","tarball":"http://registry.npmjs.org/ap/-/ap-0.1.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-06-25T06:12:44.343Z","created":"2011-02-25T03:32:08.710Z","0.0.1":"2011-02-25T03:32:09.086Z","0.1.0":"2012-06-25T06:12:44.343Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"http://github.com/substack/node-ap.git"},"_attachments":{"ap-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1B9VyohXPhl6Mr0mgyPaBQ==","length":1682,"stub":true},"ap-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3CuJvlb8izIrQ5dFf3LTSQ==","length":1308,"stub":true}}}},
{"id":"apa","key":"apa","value":{"rev":"3-ed67d1175937bf417872db81df497410"},"doc":{"_id":"apa","_rev":"3-ed67d1175937bf417872db81df497410","name":"apa","description":"A client libraray for the Amazon Product Advertising API.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"apa","version":"0.0.0","description":"A client libraray for the Amazon Product Advertising API.","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":"","author":{"name":"Matt Bell","email":"mappum@gmail.com"},"license":"BSD","dependencies":{"xml2js":"*"},"_id":"apa@0.0.0","readme":"","dist":{"shasum":"9c68bdf8e9d4fcdfafd1f05613d3a86237008e1b","tarball":"http://registry.npmjs.org/apa/-/apa-0.0.0.tgz"},"maintainers":[{"name":"mappum","email":"mappum@gmail.com"}]}},"readme":"","maintainers":[{"name":"mappum","email":"mappum@gmail.com"}],"time":{"modified":"2012-08-08T23:38:20.858Z","created":"2012-08-08T23:38:18.356Z","0.0.0":"2012-08-08T23:38:20.858Z"},"author":{"name":"Matt Bell","email":"mappum@gmail.com"},"_attachments":{"apa-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2p8i44nosq87oEq/5I+nnA==","length":1047,"stub":true}}}},
{"id":"apac","key":"apac","value":{"rev":"18-4fd81b45ba608f86f566165474717fa0"},"doc":{"_id":"apac","_rev":"18-4fd81b45ba608f86f566165474717fa0","name":"apac","description":"Amazon Product Advertising API Client for Node","dist-tags":{"latest":"0.0.11"},"versions":{"0.0.1":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.1","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"bugs":{"web":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_id":"apac@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/apac/-/apac-0.0.1.tgz"}},"0.0.2":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.2","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"bugs":{"web":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","dependencies":{"vows":">=0.5.0","xml2js":"*"},"engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_id":"apac@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/apac/-/apac-0.0.2.tgz"}},"0.0.3":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.3","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"bugs":{"url":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","dependencies":{"vows":">=0.5.0","xml2js":"*"},"engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_id":"apac@0.0.3","_engineSupported":true,"_npmVersion":"0.2.13-3","_nodeVersion":"v0.2.6","dist":{"shasum":"ee0ada209f96f0715a7125d18f8d10d3933cb443","tarball":"http://registry.npmjs.org/apac/-/apac-0.0.3.tgz"}},"0.0.4":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.4","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"bugs":{"url":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","dependencies":{"vows":">=0.5.0","xml2js":"*"},"engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_id":"apac@0.0.4","_engineSupported":true,"_npmVersion":"0.2.13-3","_nodeVersion":"v0.2.6","dist":{"shasum":"815a648985582fa13c8fe617926b1a14ce8ce5a3","tarball":"http://registry.npmjs.org/apac/-/apac-0.0.4.tgz"}},"0.0.9":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.9","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/joelvh/node-apac.git"},"bugs":{"url":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","dependencies":{"vows":">=0.5.0","xml2js":">=0.1.7"},"engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_npmUser":{"name":"dmcquay","email":"dmcquay@gmail.com"},"_id":"apac@0.0.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"11aa3787b09fa98df700106934d680d964200652","tarball":"http://registry.npmjs.org/apac/-/apac-0.0.9.tgz"},"maintainers":[{"name":"dmcquay","email":"dmcquay@gmail.com"}]},"0.0.10":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.10","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"bugs":{"url":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","dependencies":{"vows":">=0.5.0","xml2js":">=0.1.7"},"engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_npmUser":{"name":"dmcquay","email":"dmcquay@gmail.com"},"_id":"apac@0.0.10","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cf3f558a40b4c94c5f8bf81acf8c54220af614d4","tarball":"http://registry.npmjs.org/apac/-/apac-0.0.10.tgz"},"maintainers":[{"name":"dmcquay","email":"dmcquay@gmail.com"}]},"0.0.11":{"name":"apac","description":"Amazon Product Advertising API Client for Node","version":"0.0.11","author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"bugs":{"url":"http://github.com/dmcquay/node-apac/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/apac","dependencies":{"vows":">=0.5.0","xml2js":">=0.1.7"},"engines":{"node":">=0.1.97"},"licenses":[{"type":"MIT","url":"http://github.com/dmcquay/node-apac/raw/master/LICENSE"}],"_npmUser":{"name":"dmcquay","email":"dmcquay@gmail.com"},"_id":"apac@0.0.11","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b8428e8e8e313b1c83fb9ba140aefdbe0eb45850","tarball":"http://registry.npmjs.org/apac/-/apac-0.0.11.tgz"},"maintainers":[{"name":"dmcquay","email":"dmcquay@gmail.com"}]}},"maintainers":[{"name":"dmcquay","email":"dmcquay@gmail.com"}],"author":{"name":"Dustin McQuay","email":"dmcquay@gmail.com"},"repository":{"type":"git","url":"git://github.com/dmcquay/node-apac.git"},"time":{"modified":"2012-05-24T06:39:48.547Z","created":"2011-01-23T16:28:34.050Z","0.0.1":"2011-01-23T16:28:34.050Z","0.0.2":"2011-01-23T16:28:34.050Z","0.0.3":"2011-01-23T16:28:34.050Z","0.0.4":"2011-02-16T02:52:34.541Z","0.0.9":"2012-05-08T18:27:22.948Z","0.0.10":"2012-05-08T18:35:52.298Z","0.0.11":"2012-05-24T06:39:48.547Z"},"_attachments":{"apac-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-3AwPqdiwdLoH1kEmtMFkrg==","length":10240,"stub":true},"apac-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-dyF3GY0dU1rFQo6XsF11kA==","length":10240,"stub":true},"apac-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-fjQ7Lp6w30IWYHM1/x5ewg==","length":10240,"stub":true},"apac-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-CS2mFFL0WcogJEXRyJa+yg==","length":5545,"stub":true},"apac-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-JluJqSnDa+HIFG5OXxpx8Q==","length":5629,"stub":true},"apac-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zKk53xhaMF8CIOE7eSBFpA==","length":5257,"stub":true},"apac-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ig3vC2kJ5tAlEvheXZdOHg==","length":4594,"stub":true}}}},
{"id":"aparser","key":"aparser","value":{"rev":"5-cb35cfc9184ace6642413dad97e49dca"},"doc":{"_id":"aparser","_rev":"5-cb35cfc9184ace6642413dad97e49dca","name":"aparser","description":"An async ARGV parser","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"aparser","description":"An async ARGV parser","version":"0.0.1","author":{"name":"Andrea Brancaleoni","email":"null@gmx.it"},"repository":{"type":"git","url":"git://github.com/thyphon/aparser.git"},"keyword":["async","argv","cli","parser","prompt"],"engines":{"node":">= 0.4.x"},"_npmJsonOpts":{"file":"/home/gattuso/.npm/aparser/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aparser@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"601a67fc6d1287606849155cc277eb861b0b8fe0","tarball":"http://registry.npmjs.org/aparser/-/aparser-0.0.1.tgz"},"maintainers":[{"name":"thyphon","email":"null@gmx.it"}]},"0.0.2":{"name":"aparser","description":"An async ARGV parser","version":"0.0.2","author":{"name":"Andrea Brancaleoni","email":"null@gmx.it"},"repository":{"type":"git","url":"git://github.com/thypon/aparser.git"},"keyword":["async","argv","cli","parser","prompt"],"engines":{"node":">= 0.4.x"},"_npmJsonOpts":{"file":"/home/gattuso/.npm/aparser/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aparser@0.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b3c980b4fc69ebad0501089833c922be7263cf83","tarball":"http://registry.npmjs.org/aparser/-/aparser-0.0.2.tgz"},"maintainers":[{"name":"thyphon","email":"null@gmx.it"}]}},"maintainers":[{"name":"thyphon","email":"null@gmx.it"}],"time":{"modified":"2011-09-10T19:32:16.670Z","created":"2011-09-10T18:26:17.768Z","0.0.1":"2011-09-10T18:26:19.957Z","0.0.2":"2011-09-10T19:32:16.670Z"},"author":{"name":"Andrea Brancaleoni","email":"null@gmx.it"},"repository":{"type":"git","url":"git://github.com/thypon/aparser.git"},"_attachments":{"aparser-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KuBW+vElDn58UGI0SOoL6g==","length":1301,"stub":true},"aparser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rM1P1Mn9b9yOdAeeSzizDg==","length":1181,"stub":true}}}},
{"id":"ape","key":"ape","value":{"rev":"27-8fc6f05630b4a0ed0f625b61460470c4"},"doc":{"_id":"ape","_rev":"27-8fc6f05630b4a0ed0f625b61460470c4","name":"ape","description":"API documentation generator with github-flavored-markdown output","dist-tags":{"latest":"0.3.6"},"versions":{"0.1.0":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.1.0","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"09bca8175334cb20dacc59dd6b09f2f60610c0ef","tarball":"http://registry.npmjs.org/ape/-/ape-0.1.0.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}],"directories":{}},"0.2.0":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.2.0","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":"","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"80bbe000d10cbd8e6e2dcd810d0734e25d540f6b","tarball":"http://registry.npmjs.org/ape/-/ape-0.2.0.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.0":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.0","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":"","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8368e820e7929b0d416fc9327320025aebac7423","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.0.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.1":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.1","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":"","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a8da748e0cdd7f9dcbf780a8181ccfd3445ed0eb","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.1.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.2":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.2","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":"","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"947bc531de1ba9edcb8958449775aa53061f6068","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.2.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.3":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.3","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":"","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3e594912f83e0295541a1a25d592639c354a6ae3","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.3.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.4":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.4","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/andyet/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":">= 6.1.3","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3c99f1d1ff5eb44f260fd19703ffe71f61b41c75","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.4.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.5":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.5","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/nathan-lafreniere/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":">= 6.1.3","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"faebc35c9e14bd7bbf7900840bec639b904d445c","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.5.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]},"0.3.6":{"name":"ape","description":"API documentation generator with github-flavored-markdown output","author":{"name":"Nathan LaFreniere"},"version":"0.3.6","main":"./lib/ape.js","bin":{"ape":"./bin/ape"},"repository":{"type":"git","url":"git://github.com/nathan-lafreniere/ape.git"},"dependencies":{"async":"","walk":"","ghm":"","jade":"","hljs":">= 6.1.3","optimist":""},"_npmUser":{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"},"_id":"ape@0.3.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"92791eeab1c540565aec2c4b38a777fd2afab64c","tarball":"http://registry.npmjs.org/ape/-/ape-0.3.6.tgz"},"maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}]}},"readme":"ape\n===\n\nAPI docs? Nope, ape docs!\n\nape generates API documentation in github-flavored-markup from comments in your code, and places them in line with the actual code. This allows for very easy integration with github.\n","maintainers":[{"name":"nathan-lafreniere","email":"quitlahok@gmail.com"}],"time":{"modified":"2012-03-19T16:15:03.319Z","created":"2012-02-01T22:33:28.626Z","0.1.0":"2012-02-01T22:33:30.115Z","0.2.0":"2012-02-03T01:12:07.801Z","0.3.0":"2012-02-09T00:15:13.214Z","0.3.1":"2012-02-13T17:44:38.294Z","0.3.2":"2012-02-13T20:12:29.595Z","0.3.3":"2012-02-25T03:12:40.387Z","0.3.4":"2012-03-09T23:47:44.367Z","0.3.5":"2012-03-12T18:07:43.005Z","0.3.6":"2012-03-19T16:15:03.319Z"},"author":{"name":"Nathan LaFreniere"},"repository":{"type":"git","url":"git://github.com/nathan-lafreniere/ape.git"},"_attachments":{"ape-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-oIDE6vJFxaX0HvsAZUjaWw==","length":7725,"stub":true},"ape-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-qpWSBO4JzrR0H+VeCx4aFA==","length":6621,"stub":true},"ape-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-CVdBBPZLUSPkIM6SQSjqtQ==","length":6626,"stub":true},"ape-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-LCmSkC5jklYuvpKiUeeuoA==","length":6537,"stub":true},"ape-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-vpcGOoAa0xKQPyeZOfzgTA==","length":6543,"stub":true},"ape-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-APzneI7oq0Azy52Mq+d2vA==","length":6549,"stub":true},"ape-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-1NFsI9ujcw6eLVNxDc4OqQ==","length":6090,"stub":true},"ape-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-DBBx24I3JjZ0w4lXPUOZew==","length":5741,"stub":true},"ape-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tcZYz3xlxlm8R1VoTOz49w==","length":3958,"stub":true}}}},
{"id":"api","key":"api","value":{"rev":"23-cd6b0b365194e44142067e29eff61475"},"doc":{"_id":"api","_rev":"23-cd6b0b365194e44142067e29eff61475","name":"api","description":"A server framework for easy routing","dist-tags":{"latest":"0.3.1"},"versions":{"0.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server for RESTful APIs","tags":["REST","API","server"],"version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"api.js","engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/home/paul/.npm/api/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"api@0.0.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e6bbb178943b631ca840c071c7be7264f3232ae8","tarball":"http://registry.npmjs.org/api/-/api-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"api.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9af3fa56453517cede3f93885a8ef74c48edd607","tarball":"http://registry.npmjs.org/api/-/api-0.1.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.1.1","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"api.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"81882ea4c6d5d8f2f3468c8efb58ce0cefe403e4","tarball":"http://registry.npmjs.org/api/-/api-0.1.1.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.1.2","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"api.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"482b5ee3f604e408a2726e438da7317ade6dd0ad","tarball":"http://registry.npmjs.org/api/-/api-0.1.2.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.1.3","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"api.js","engines":{"node":">=0.4.0"},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.1.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"fd5e4e41450bb1fcb5946f0780f9787682d78bb3","tarball":"http://registry.npmjs.org/api/-/api-0.1.3.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.2.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"./api.js","bin":{"api":"./bin/api.js"},"engines":{"node":">=0.4.0"},"dependencies":{"confdir":">=0.0.2","ejs":">=0.6.1"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"21706d66a3819c3b43acdaed98168777d82c54d7","tarball":"http://registry.npmjs.org/api/-/api-0.2.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.2.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.2.1","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"./api.js","bin":{"api":"./bin/api.js"},"engines":{"node":">=0.4.0"},"dependencies":{"confdir":">=0.0.2","ejs":">=0.6.1"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"aae00326a2b541b05724e82ea878d571541e1643","tarball":"http://registry.npmjs.org/api/-/api-0.2.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.3.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.3.0","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"./api.js","bin":{"api":"./bin/api.js"},"engines":{"node":">=0.4.0"},"dependencies":{"confdir":">=0.0.2","ejs":">=0.6.1","stoopid":">=0.0.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"api@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"5d2fd9f422b71fe34c5eed830be0c87500e05190","tarball":"http://registry.npmjs.org/api/-/api-0.3.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.3.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"name":"api","description":"A server framework for easy routing","tags":["server","middleware","router"],"version":"0.3.1","repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"bugs":{"url":"https://github.com/pvorb/node-api/issues"},"main":"./api.js","bin":{"api":"./bin/api.js"},"engines":{"node":">=0.4.0"},"dependencies":{"confdir":">=0.0.2","ejs":">=0.6.1","stoopid":">=0.0.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"readme":"api\n===\n\nis a module for easily providing several pluggable RESTful APIs and other\ndynamic content on a single server. It extends\n[`http.Server`](http://nodejs.org/api/http.html#http_class_http_server).\n\nInstallation\n------------\n\n`npm install -g api`\n\nUsage\n-----\n\napi comes with an executable. If you run `api` from your console, the script\nwalks up the path of your current working directory and looks for a directory\nnamed `.conf` that contains a file named `api.json`. This file must contain\nseveral values. Here's an annotated version of such a file.\n\n``` javascript\n{\n  \"protocol\": \"http\",               // \"http\" or \"https\"\n  \"connection\": {                   // host and port of that server\n    \"hostname\": \"localhost\",\n    \"port\": 1337\n  },\n  \"directories\": {\n    \"modules\": \".conf/modules\"      // directory that contains submodules\n  },\n  \"modules\": [\n    \"example\"                       // modules that are loaded on startup\n  ],\n  \"errorPages\": {                   // error pages\n    \"404\": \".conf/error/404.html\",\n    \"500\": \".conf/error/500.html\"\n  },\n  \"logFile\": \".conf/api.log\"        // the log file\n}\n```\n\nJust copy & paste this file to `.conf/api.json`, if you want to use it, but\ndon’t forget to remove the comments. JSON files are not allowed to contain\ncomments for some reason.\n\nThis example configuration starts a server at `http://localhost:1337`. It also\ndefines `.conf/module` as the directory for submodules and registers one module\n\"example\". To add code for that module, you have to create the file\n`.conf/modules/example.js`. A module must export a single function\n(`function (app, logger, conf, globalConf, started)`).\n\n  * `app` is a reference of the Server object.\n  * `logger` is a [stoopid][] logger.\n  * `conf` is a module specific configuration object.\n  * `globalConf` is the global configuration object from `.conf/api.json`.\n  * `started` is a callback (`function (err)`), that is used to return errors\n    or let _api_ know, that the module has been started.\n\n[stoopid]: https://github.com/mikeal/stoopid\n\n\n`.conf/modules/example.js`:\n\n``` javascript\nmodule.exports = function example(app, logger, conf, globalConf, started) {\n  // register request listeners\n  app.get('^/hello-world.html', function helloWorld(req, resp) {\n    logger.info('Somebody visited \"/hello-world.html\".');\n    resp.writeHead(200, { 'Content-Type': 'text/html' });\n    resp.end('<b>Hello World!</b>');\n  });\n\n  started(); // send the callback after everything has been set up.\n}\n```\n\nYou can try the example by starting `api` from the console. You should see the\nfollowing output on `stdout`:\n\n    [process] - Server up and running.\n    [process] - Starting module \"example\".\n    [process] - Module \"example\" up and running.\n\nNow you can visit `http://localhost:1337/hello-world.html` and you should see\n\n**Hello World!**\n\nas well as\n\n    [process] - Somebody visited \"/hello-world.html\"\n\nAPI\n---\n\nThe api `Server` object has all the methods of\n[`http.Server`](http://nodejs.org/api/http.html#http_class_http_server) (or\n`https.Server`, if you configured it with https). There are also some additional\nmethods, that are more or less shortcuts for common events:\n\n  * `on(path, callback)` handles any requests that match `path`, no matter which\n    http method is used.\n  * `get(path, callback)` handles all GET request that match `path`.\n  * `post(path, callback)` handles all POST requests that match `path`.\n  * `put(path, callback)` handles all PUT requests that match `path`.\n  * `delete(path, callback)` handles all DELETE requests that match `path`.\n  * `head(path, callback)` handles all HEAD requests that match `path`.\n\n`path` is a string representation of that `RegExp` object.\nSlashes (`/`) don’t need to be escaped.\n\n`callback` is a callback function (`function (req, resp)`) just like in the\n[http 'request' event](http://nodejs.org/api/http.html#http_event_request).\n\nBugs and Issues\n---------------\n\nIf you encounter any bugs or issues, feel free to open an issue at\n[github](//github.com/pvorb/node-api/issues) or send me an e-mail to\npaul(at)vorb.de.\n\nLicense\n-------\n\nCopyright © 2011-2012 Paul Vorbach\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the “Software”), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"api@0.3.1","dist":{"shasum":"a77e2613efa74c2f4ad678864da2f58396db96d0","tarball":"http://registry.npmjs.org/api/-/api-0.3.1.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-08-07T19:00:21.982Z","created":"2011-09-27T16:59:57.135Z","0.0.0":"2011-09-27T16:59:59.716Z","0.1.0":"2011-11-17T16:27:11.125Z","0.1.1":"2011-11-20T23:16:17.303Z","0.1.2":"2011-11-20T23:22:35.554Z","0.1.3":"2011-11-24T15:55:17.116Z","0.2.0":"2012-02-27T00:04:56.195Z","0.2.1":"2012-02-28T15:00:39.895Z","0.3.0":"2012-03-04T13:44:08.157Z","0.3.1":"2012-08-07T19:00:21.982Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"https://vorb.de/"},"repository":{"type":"git","url":"git://github.com/pvorb/node-api.git"},"_attachments":{"api-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-3OIMZa70iryUxvamLD98/w==","length":4616,"stub":true},"api-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-1oUwjkjVPTe7n9chy4fm1w==","length":3704,"stub":true},"api-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-VttGFkW9eCTACe1/4yfZfw==","length":3725,"stub":true},"api-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-dJBnAQq7TskVjC4N9EjAXQ==","length":3713,"stub":true},"api-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-JFm9JF5K9F7TCumkTBai5Q==","length":2800,"stub":true},"api-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-noWoSZGjihFMDe3gzOTh2w==","length":2792,"stub":true},"api-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+CTO1/l3AQxORH9IdXRyuQ==","length":2802,"stub":true},"api-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-3nxMb5Ej0qqeec3YWgPZYA==","length":2780,"stub":true},"api-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DiS11qnUdVMmAnCbusCwgQ==","length":2212,"stub":true}}}},
{"id":"api-easy","key":"api-easy","value":{"rev":"34-39a04efb54325ab2a9778db082a42a4c"},"doc":{"_id":"api-easy","_rev":"34-39a04efb54325ab2a9778db082a42a4c","name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","dist-tags":{"latest":"0.3.7"},"versions":{"0.2.3":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.2.3","author":{"name":"Charlie Robbins","email":"charlie.robbins@gmail.com"},"repository":{"type":"git","url":"git://github.com/indexzero/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"request":">= 1.9.0","vows":">= 0.5.2"},"devDependencies":{"journey":">= 0.4.0-pre-2"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_id":"api-easy@0.2.3","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"fbf8244e5215073bc93f6bf0d193d6ba31c91b17","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.2.3.tgz"},"directories":{}},"0.2.4":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.2.4","author":{"name":"Charlie Robbins","email":"charlie.robbins@gmail.com"},"repository":{"type":"git","url":"git://github.com/indexzero/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"request":"2.x.x","vows":"0.5.x"},"devDependencies":{"journey":">= 0.4.0-pre-2"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmJsonOpts":{"file":"/Users/Charlie/.npm/api-easy/0.2.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"api-easy@0.2.4","_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2ad1ddcef47ca0ef8b423eb28d4b29644963e5f3","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.2.4.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.3.0":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.0","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.5.x"},"devDependencies":{"journey":">= 0.4.0-pre-2","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c386fb47b6ffd086a5a8a3689c60758ba62cb5bf","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.0.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.3.1":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.1","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.5.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2a9e663341289b3539b822ddf9f494f572879803","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.1.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.3.2":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.2","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.6.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"91013ae6dcac54484400970f92a7c1d75a0c0323","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.2.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.3.3":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.3","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.6.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0d98a953c1ef9334f229296ba67c32f77326e1d0","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.3.tgz"},"readme":"# APIeasy [![Build Status](https://secure.travis-ci.org/flatiron/api-easy.png)](http://travis-ci.org/flatiron/api-easy)\n\nA fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing APIeasy\n``` bash\n  $ [sudo] npm install api-easy\n```\n\n## Purpose\nAPIeasy is designed to be a simple way to test RESTful APIs in [node.js][0] and Javascript. The primary design goal was to reduce the number of lines of test code required to fully cover all primary and edge use cases of a given API over HTTP. \n\n## Getting Started\nMost of the documentation for this library is available through the [annotated source code, available here][1] thanks to [jashkenas][2] and [docco][3]. If you're not feeling up for that, just keep reading here. tldr;? [Read how to use APIeasy in your own projects][4]\n\nIf you're going to use APIeasy (and I hope you do), it's worth taking a moment to understand the way that [vows][5] manages flow control. Read up here on [vowsjs.org][5] (Under \"Structure of a test suite\"), or just remember vows uses this grammatical structure:\n\n```\n  Suite   → Batch*\n  Batch   → Context*\n  Context → Topic? Vow* Context*\n```\n\nGot it? Good. There is a 1-to-1 relationship between a APIeasy suite and a vows suite; APIeasy is essentially a simpler syntax to manage a particular set of vows-based tests that conform to this pattern:\n\n1. Tests are performed by making HTTP requests against an API server\n2. Assertions are made against the HTTP response and JSON response body\n3. Rinse. Repeat.\n\nHere's a sample of the boilerplate code that APIeasy eliminates:\n\n``` js\n  var request = require('request'),\n      vows = require('vows'),\n      assert = require('assert');\n  \n  vows.describe('your/awesome/api').addBatch({\n    \"When using your awesome api\": {\n      \"and your awesome resource\": {\n        \"A POST to /awesome\": {\n          topic: function () {\n            request({\n              uri: 'http://localhost:8080/awesome',\n              method: 'POST',\n              body: JSON.stringify({ test: 'data' }),\n              headers: {\n                'Content-Type': 'application/json'\n              }\n            }, this.callback)\n          },\n          \"should respond with 200\": function (err, res, body) {\n            assert.equal(res.statusCode, 200);\n          },\n          \"should respond with ok\": function (err, res, body) {\n            var result = JSON.parse(body);\n            assert.equal(result.ok, true);\n          },\n          \"should respond with x-test-header\": function (err, res, body) {\n            assert.include(res.headers, 'x-test-header');\n          }\n        }\n      }\n    }\n  }).export(module);\n```\n\nThis same code can be implemented like this using APIeasy:\n\n``` js\n  var APIeasy = require('api-easy'),\n      assert = require('assert');\n      \n  var suite = APIeasy.describe('your/awesome/api');\n  \n  suite.discuss('When using your awesome API')\n       .discuss('and your awesome resource')\n       .use('localhost', 8080)\n       .setHeader('Content-Type', 'application/json')\n       .post({ test: 'data' })\n         .expect(200, { ok: true })\n         .expect('should respond with x-test-header', function (err, res, body) {\n           assert.include(res.headers, 'x-test-header');\n         })\n       .export(module);\n```\n\n<a name=\"using-api-easy\">\n## Using APIeasy in your own project\nThere are two ways to use APIeasy in your own project:\n\n1. Using npm\n2. Using vows directly\n\n### Using APIeasy with npm\nIf you've used the `npm test` command in [npm][7] before, this should be nothing new. You can read more about the [npm test command here][8]. All you need to do is add the following to your `package.json` file:\n\n``` js\n {\n   \"dependencies\": {\n     \"api-easy\": \"0.2.x\"\n   },\n   \"scripts\": {\n     \"test\": \"vows test/*-test.js\"\n   }\n }\n```\n\n**Note:** `test/*-test.js` is at your discretion. It's just an expression for all test files in your project. \n\nAfter adding this to your `package.json` file you can run the following to execute your tests:\n\n``` bash\n  $ cd path/to/your/project\n  $ npm install\n  $ npm test\n```\n\nThere is also a full working sample of how to use this approach [here][9].\n\n### Using APIeasy with vows\nWhen you install APIeasy or take it as a dependency in your `package.json` file it will not install [vows][5] globally, so to use vows you must install it globally.\n\n``` bash\n  $ [sudo] npm install vows -g\n```\n\nAfter installing vows you can simply run it from inside your project:\n\n``` bash\n  $ cd /path/to/your/project\n  $ vows\n```\n\n## Roadmap\n\n1. [Get feedback][6] on what else could be exposed through this library.\n2. Improve it.\n3. Repeat (1) + (2).\n\n## Run Tests\n<pre>\n  npm test\n</pre>\n\n#### Author: [Charlie Robbins](http://nodejitsu.com)\n\n[0]: http://nodejs.org\n[1]: http://flatiron.github.com/api-easy\n[2]: http://github.com/jashkenas\n[3]: http://github.com/jashkenas/docco\n[4]: #using-api-easy\n[5]: http://vowsjs.org\n[6]: http://github.com/flatiron/api-easy/issues\n[7]: http://npmjs.org\n[8]: https://github.com/isaacs/npm/blob/master/doc/test.md\n[9]: https://gist.github.com/1039425\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.3.4":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.4","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.6.x","qs":"0.4.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f8d41e7ba670b3644345ff9c52cf09e6d16495bd","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.4.tgz"},"readme":"# APIeasy [![Build Status](https://secure.travis-ci.org/flatiron/api-easy.png)](http://travis-ci.org/flatiron/api-easy)\n\nA fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing APIeasy\n``` bash\n  $ [sudo] npm install api-easy\n```\n\n## Purpose\nAPIeasy is designed to be a simple way to test RESTful APIs in [node.js][0] and Javascript. The primary design goal was to reduce the number of lines of test code required to fully cover all primary and edge use cases of a given API over HTTP. \n\n## Getting Started\nMost of the documentation for this library is available through the [annotated source code, available here][1] thanks to [jashkenas][2] and [docco][3]. If you're not feeling up for that, just keep reading here. tldr;? [Read how to use APIeasy in your own projects][4]\n\nIf you're going to use APIeasy (and I hope you do), it's worth taking a moment to understand the way that [vows][5] manages flow control. Read up here on [vowsjs.org][5] (Under \"Structure of a test suite\"), or just remember vows uses this grammatical structure:\n\n```\n  Suite   → Batch*\n  Batch   → Context*\n  Context → Topic? Vow* Context*\n```\n\nGot it? Good. There is a 1-to-1 relationship between a APIeasy suite and a vows suite; APIeasy is essentially a simpler syntax to manage a particular set of vows-based tests that conform to this pattern:\n\n1. Tests are performed by making HTTP requests against an API server\n2. Assertions are made against the HTTP response and JSON response body\n3. Rinse. Repeat.\n\nHere's a sample of the boilerplate code that APIeasy eliminates:\n\n``` js\n  var request = require('request'),\n      vows = require('vows'),\n      assert = require('assert');\n  \n  vows.describe('your/awesome/api').addBatch({\n    \"When using your awesome api\": {\n      \"and your awesome resource\": {\n        \"A POST to /awesome\": {\n          topic: function () {\n            request({\n              uri: 'http://localhost:8080/awesome',\n              method: 'POST',\n              body: JSON.stringify({ test: 'data' }),\n              headers: {\n                'Content-Type': 'application/json'\n              }\n            }, this.callback)\n          },\n          \"should respond with 200\": function (err, res, body) {\n            assert.equal(res.statusCode, 200);\n          },\n          \"should respond with ok\": function (err, res, body) {\n            var result = JSON.parse(body);\n            assert.equal(result.ok, true);\n          },\n          \"should respond with x-test-header\": function (err, res, body) {\n            assert.include(res.headers, 'x-test-header');\n          }\n        }\n      }\n    }\n  }).export(module);\n```\n\nThis same code can be implemented like this using APIeasy:\n\n``` js\n  var APIeasy = require('api-easy'),\n      assert = require('assert');\n      \n  var suite = APIeasy.describe('your/awesome/api');\n  \n  suite.discuss('When using your awesome API')\n       .discuss('and your awesome resource')\n       .use('localhost', 8080)\n       .setHeader('Content-Type', 'application/json')\n       .post({ test: 'data' })\n         .expect(200, { ok: true })\n         .expect('should respond with x-test-header', function (err, res, body) {\n           assert.include(res.headers, 'x-test-header');\n         })\n       .export(module);\n```\n\n<a name=\"using-api-easy\">\n## Using APIeasy in your own project\nThere are two ways to use APIeasy in your own project:\n\n1. Using npm\n2. Using vows directly\n\n### Using APIeasy with npm\nIf you've used the `npm test` command in [npm][7] before, this should be nothing new. You can read more about the [npm test command here][8]. All you need to do is add the following to your `package.json` file:\n\n``` js\n {\n   \"dependencies\": {\n     \"api-easy\": \"0.2.x\"\n   },\n   \"scripts\": {\n     \"test\": \"vows test/*-test.js\"\n   }\n }\n```\n\n**Note:** `test/*-test.js` is at your discretion. It's just an expression for all test files in your project. \n\nAfter adding this to your `package.json` file you can run the following to execute your tests:\n\n``` bash\n  $ cd path/to/your/project\n  $ npm install\n  $ npm test\n```\n\nThere is also a full working sample of how to use this approach [here][9].\n\n### Using APIeasy with vows\nWhen you install APIeasy or take it as a dependency in your `package.json` file it will not install [vows][5] globally, so to use vows you must install it globally.\n\n``` bash\n  $ [sudo] npm install vows -g\n```\n\nAfter installing vows you can simply run it from inside your project:\n\n``` bash\n  $ cd /path/to/your/project\n  $ vows\n```\n\n## Roadmap\n\n1. [Get feedback][6] on what else could be exposed through this library.\n2. Improve it.\n3. Repeat (1) + (2).\n\n## Run Tests\n<pre>\n  npm test\n</pre>\n\n#### Author: [Charlie Robbins](http://nodejitsu.com)\n\n[0]: http://nodejs.org\n[1]: http://flatiron.github.com/api-easy\n[2]: http://github.com/jashkenas\n[3]: http://github.com/jashkenas/docco\n[4]: #using-api-easy\n[5]: http://vowsjs.org\n[6]: http://github.com/flatiron/api-easy/issues\n[7]: http://npmjs.org\n[8]: https://github.com/isaacs/npm/blob/master/doc/test.md\n[9]: https://gist.github.com/1039425\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.3.5":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.5","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.6.x","qs":"0.4.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7e06e8d880e58a8df981a70ec05cf50d3e096b55","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.5.tgz"},"readme":"# APIeasy [![Build Status](https://secure.travis-ci.org/flatiron/api-easy.png)](http://travis-ci.org/flatiron/api-easy)\n\nA fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing APIeasy\n``` bash\n  $ [sudo] npm install api-easy\n```\n\n## Purpose\nAPIeasy is designed to be a simple way to test RESTful APIs in [node.js][0] and Javascript. The primary design goal was to reduce the number of lines of test code required to fully cover all primary and edge use cases of a given API over HTTP. \n\n## Getting Started\nMost of the documentation for this library is available through the [annotated source code, available here][1] thanks to [jashkenas][2] and [docco][3]. If you're not feeling up for that, just keep reading here. tldr;? [Read how to use APIeasy in your own projects][4]\n\nIf you're going to use APIeasy (and I hope you do), it's worth taking a moment to understand the way that [vows][5] manages flow control. Read up here on [vowsjs.org][5] (Under \"Structure of a test suite\"), or just remember vows uses this grammatical structure:\n\n```\n  Suite   → Batch*\n  Batch   → Context*\n  Context → Topic? Vow* Context*\n```\n\nGot it? Good. There is a 1-to-1 relationship between a APIeasy suite and a vows suite; APIeasy is essentially a simpler syntax to manage a particular set of vows-based tests that conform to this pattern:\n\n1. Tests are performed by making HTTP requests against an API server\n2. Assertions are made against the HTTP response and JSON response body\n3. Rinse. Repeat.\n\nHere's a sample of the boilerplate code that APIeasy eliminates:\n\n``` js\n  var request = require('request'),\n      vows = require('vows'),\n      assert = require('assert');\n  \n  vows.describe('your/awesome/api').addBatch({\n    \"When using your awesome api\": {\n      \"and your awesome resource\": {\n        \"A POST to /awesome\": {\n          topic: function () {\n            request({\n              uri: 'http://localhost:8080/awesome',\n              method: 'POST',\n              body: JSON.stringify({ test: 'data' }),\n              headers: {\n                'Content-Type': 'application/json'\n              }\n            }, this.callback)\n          },\n          \"should respond with 200\": function (err, res, body) {\n            assert.equal(res.statusCode, 200);\n          },\n          \"should respond with ok\": function (err, res, body) {\n            var result = JSON.parse(body);\n            assert.equal(result.ok, true);\n          },\n          \"should respond with x-test-header\": function (err, res, body) {\n            assert.include(res.headers, 'x-test-header');\n          }\n        }\n      }\n    }\n  }).export(module);\n```\n\nThis same code can be implemented like this using APIeasy:\n\n``` js\n  var APIeasy = require('api-easy'),\n      assert = require('assert');\n      \n  var suite = APIeasy.describe('your/awesome/api');\n  \n  suite.discuss('When using your awesome API')\n       .discuss('and your awesome resource')\n       .use('localhost', 8080)\n       .setHeader('Content-Type', 'application/json')\n       .post({ test: 'data' })\n         .expect(200, { ok: true })\n         .expect('should respond with x-test-header', function (err, res, body) {\n           assert.include(res.headers, 'x-test-header');\n         })\n       .export(module);\n```\n\n<a name=\"using-api-easy\">\n## Using APIeasy in your own project\nThere are two ways to use APIeasy in your own project:\n\n1. Using npm\n2. Using vows directly\n\n### Using APIeasy with npm\nIf you've used the `npm test` command in [npm][7] before, this should be nothing new. You can read more about the [npm test command here][8]. All you need to do is add the following to your `package.json` file:\n\n``` js\n {\n   \"dependencies\": {\n     \"api-easy\": \"0.2.x\"\n   },\n   \"scripts\": {\n     \"test\": \"vows test/*-test.js\"\n   }\n }\n```\n\n**Note:** `test/*-test.js` is at your discretion. It's just an expression for all test files in your project. \n\nAfter adding this to your `package.json` file you can run the following to execute your tests:\n\n``` bash\n  $ cd path/to/your/project\n  $ npm install\n  $ npm test\n```\n\nThere is also a full working sample of how to use this approach [here][9].\n\n### Using APIeasy with vows\nWhen you install APIeasy or take it as a dependency in your `package.json` file it will not install [vows][5] globally, so to use vows you must install it globally.\n\n``` bash\n  $ [sudo] npm install vows -g\n```\n\nAfter installing vows you can simply run it from inside your project:\n\n``` bash\n  $ cd /path/to/your/project\n  $ vows\n```\n\n## Roadmap\n\n1. [Get feedback][6] on what else could be exposed through this library.\n2. Improve it.\n3. Repeat (1) + (2).\n\n## Run Tests\n<pre>\n  npm test\n</pre>\n\n#### Author: [Charlie Robbins](http://nodejitsu.com)\n\n[0]: http://nodejs.org\n[1]: http://flatiron.github.com/api-easy\n[2]: http://github.com/jashkenas\n[3]: http://github.com/jashkenas/docco\n[4]: #using-api-easy\n[5]: http://vowsjs.org\n[6]: http://github.com/flatiron/api-easy/issues\n[7]: http://npmjs.org\n[8]: https://github.com/isaacs/npm/blob/master/doc/test.md\n[9]: https://gist.github.com/1039425\n"},"0.3.6":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.6","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.6.x","qs":"0.4.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e1639fc5980a7691fd4f035a12776848145588e3","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.6.tgz"},"readme":"# APIeasy [![Build Status](https://secure.travis-ci.org/flatiron/api-easy.png)](http://travis-ci.org/flatiron/api-easy)\n\nA fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing APIeasy\n``` bash\n  $ [sudo] npm install api-easy\n```\n\n## Purpose\nAPIeasy is designed to be a simple way to test RESTful APIs in [node.js][0] and Javascript. The primary design goal was to reduce the number of lines of test code required to fully cover all primary and edge use cases of a given API over HTTP. \n\n## Getting Started\nMost of the documentation for this library is available through the [annotated source code, available here][1] thanks to [jashkenas][2] and [docco][3]. If you're not feeling up for that, just keep reading here. tldr;? [Read how to use APIeasy in your own projects][4]\n\nIf you're going to use APIeasy (and I hope you do), it's worth taking a moment to understand the way that [vows][5] manages flow control. Read up here on [vowsjs.org][5] (Under \"Structure of a test suite\"), or just remember vows uses this grammatical structure:\n\n```\n  Suite   → Batch*\n  Batch   → Context*\n  Context → Topic? Vow* Context*\n```\n\nGot it? Good. There is a 1-to-1 relationship between a APIeasy suite and a vows suite; APIeasy is essentially a simpler syntax to manage a particular set of vows-based tests that conform to this pattern:\n\n1. Tests are performed by making HTTP requests against an API server\n2. Assertions are made against the HTTP response and JSON response body\n3. Rinse. Repeat.\n\nHere's a sample of the boilerplate code that APIeasy eliminates:\n\n``` js\n  var request = require('request'),\n      vows = require('vows'),\n      assert = require('assert');\n  \n  vows.describe('your/awesome/api').addBatch({\n    \"When using your awesome api\": {\n      \"and your awesome resource\": {\n        \"A POST to /awesome\": {\n          topic: function () {\n            request({\n              uri: 'http://localhost:8080/awesome',\n              method: 'POST',\n              body: JSON.stringify({ test: 'data' }),\n              headers: {\n                'Content-Type': 'application/json'\n              }\n            }, this.callback)\n          },\n          \"should respond with 200\": function (err, res, body) {\n            assert.equal(res.statusCode, 200);\n          },\n          \"should respond with ok\": function (err, res, body) {\n            var result = JSON.parse(body);\n            assert.equal(result.ok, true);\n          },\n          \"should respond with x-test-header\": function (err, res, body) {\n            assert.include(res.headers, 'x-test-header');\n          }\n        }\n      }\n    }\n  }).export(module);\n```\n\nThis same code can be implemented like this using APIeasy:\n\n``` js\n  var APIeasy = require('api-easy'),\n      assert = require('assert');\n      \n  var suite = APIeasy.describe('your/awesome/api');\n  \n  suite.discuss('When using your awesome API')\n       .discuss('and your awesome resource')\n       .use('localhost', 8080)\n       .setHeader('Content-Type', 'application/json')\n       .post({ test: 'data' })\n         .expect(200, { ok: true })\n         .expect('should respond with x-test-header', function (err, res, body) {\n           assert.include(res.headers, 'x-test-header');\n         })\n       .export(module);\n```\n\n<a name=\"using-api-easy\">\n## Using APIeasy in your own project\nThere are two ways to use APIeasy in your own project:\n\n1. Using npm\n2. Using vows directly\n\n### Using APIeasy with npm\nIf you've used the `npm test` command in [npm][7] before, this should be nothing new. You can read more about the [npm test command here][8]. All you need to do is add the following to your `package.json` file:\n\n``` js\n {\n   \"dependencies\": {\n     \"api-easy\": \"0.2.x\"\n   },\n   \"scripts\": {\n     \"test\": \"vows test/*-test.js\"\n   }\n }\n```\n\n**Note:** `test/*-test.js` is at your discretion. It's just an expression for all test files in your project. \n\nAfter adding this to your `package.json` file you can run the following to execute your tests:\n\n``` bash\n  $ cd path/to/your/project\n  $ npm install\n  $ npm test\n```\n\nThere is also a full working sample of how to use this approach [here][9].\n\n### Using APIeasy with vows\nWhen you install APIeasy or take it as a dependency in your `package.json` file it will not install [vows][5] globally, so to use vows you must install it globally.\n\n``` bash\n  $ [sudo] npm install vows -g\n```\n\nAfter installing vows you can simply run it from inside your project:\n\n``` bash\n  $ cd /path/to/your/project\n  $ vows\n```\n\n## Roadmap\n\n1. [Get feedback][6] on what else could be exposed through this library.\n2. Improve it.\n3. Repeat (1) + (2).\n\n## Run Tests\n<pre>\n  npm test\n</pre>\n\n#### Author: [Charlie Robbins](http://nodejitsu.com)\n\n[0]: http://nodejs.org\n[1]: http://flatiron.github.com/api-easy\n[2]: http://github.com/jashkenas\n[3]: http://github.com/jashkenas/docco\n[4]: #using-api-easy\n[5]: http://vowsjs.org\n[6]: http://github.com/flatiron/api-easy/issues\n[7]: http://npmjs.org\n[8]: https://github.com/isaacs/npm/blob/master/doc/test.md\n[9]: https://gist.github.com/1039425\n"},"0.3.7":{"name":"api-easy","description":"Fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.","version":"0.3.7","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"keywords":["testing","api","REST","vows"],"dependencies":{"pkginfo":"0.2.x","request":"2.x.x","vows":"0.6.x","qs":"0.5.x"},"devDependencies":{"director":"~1.0.3","formidable":"1.0.2","mkdirp":"0.2.x"},"main":"./lib/api-easy","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.4.3"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"api-easy@0.3.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"924ac4f68ff63d19a2787918b9f768fc7d8cba4e","tarball":"http://registry.npmjs.org/api-easy/-/api-easy-0.3.7.tgz"},"readme":"# APIeasy [![Build Status](https://secure.travis-ci.org/flatiron/api-easy.png)](http://travis-ci.org/flatiron/api-easy)\n\nA fluent (i.e. chainable) syntax for generating vows tests against RESTful APIs.\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing APIeasy\n``` bash\n  $ [sudo] npm install api-easy\n```\n\n## Purpose\nAPIeasy is designed to be a simple way to test RESTful APIs in [node.js][0] and Javascript. The primary design goal was to reduce the number of lines of test code required to fully cover all primary and edge use cases of a given API over HTTP. \n\n## Getting Started\nMost of the documentation for this library is available through the [annotated source code, available here][1] thanks to [jashkenas][2] and [docco][3]. If you're not feeling up for that, just keep reading here. tldr;? [Read how to use APIeasy in your own projects][4]\n\nIf you're going to use APIeasy (and I hope you do), it's worth taking a moment to understand the way that [vows][5] manages flow control. Read up here on [vowsjs.org][5] (Under \"Structure of a test suite\"), or just remember vows uses this grammatical structure:\n\n```\n  Suite   → Batch*\n  Batch   → Context*\n  Context → Topic? Vow* Context*\n```\n\nGot it? Good. There is a 1-to-1 relationship between a APIeasy suite and a vows suite; APIeasy is essentially a simpler syntax to manage a particular set of vows-based tests that conform to this pattern:\n\n1. Tests are performed by making HTTP requests against an API server\n2. Assertions are made against the HTTP response and JSON response body\n3. Rinse. Repeat.\n\nHere's a sample of the boilerplate code that APIeasy eliminates:\n\n``` js\n  var request = require('request'),\n      vows = require('vows'),\n      assert = require('assert');\n  \n  vows.describe('your/awesome/api').addBatch({\n    \"When using your awesome api\": {\n      \"and your awesome resource\": {\n        \"A POST to /awesome\": {\n          topic: function () {\n            request({\n              uri: 'http://localhost:8080/awesome',\n              method: 'POST',\n              body: JSON.stringify({ test: 'data' }),\n              headers: {\n                'Content-Type': 'application/json'\n              }\n            }, this.callback)\n          },\n          \"should respond with 200\": function (err, res, body) {\n            assert.equal(res.statusCode, 200);\n          },\n          \"should respond with ok\": function (err, res, body) {\n            var result = JSON.parse(body);\n            assert.equal(result.ok, true);\n          },\n          \"should respond with x-test-header\": function (err, res, body) {\n            assert.include(res.headers, 'x-test-header');\n          }\n        }\n      }\n    }\n  }).export(module);\n```\n\nThis same code can be implemented like this using APIeasy:\n\n``` js\n  var APIeasy = require('api-easy'),\n      assert = require('assert');\n      \n  var suite = APIeasy.describe('your/awesome/api');\n  \n  suite.discuss('When using your awesome API')\n       .discuss('and your awesome resource')\n       .use('localhost', 8080)\n       .setHeader('Content-Type', 'application/json')\n       .post({ test: 'data' })\n         .expect(200, { ok: true })\n         .expect('should respond with x-test-header', function (err, res, body) {\n           assert.include(res.headers, 'x-test-header');\n         })\n       .export(module);\n```\n\n<a name=\"using-api-easy\">\n## Using APIeasy in your own project\nThere are two ways to use APIeasy in your own project:\n\n1. Using npm\n2. Using vows directly\n\n### Using APIeasy with npm\nIf you've used the `npm test` command in [npm][7] before, this should be nothing new. You can read more about the [npm test command here][8]. All you need to do is add the following to your `package.json` file:\n\n``` js\n {\n   \"dependencies\": {\n     \"api-easy\": \"0.2.x\"\n   },\n   \"scripts\": {\n     \"test\": \"vows test/*-test.js\"\n   }\n }\n```\n\n**Note:** `test/*-test.js` is at your discretion. It's just an expression for all test files in your project. \n\nAfter adding this to your `package.json` file you can run the following to execute your tests:\n\n``` bash\n  $ cd path/to/your/project\n  $ npm install\n  $ npm test\n```\n\nThere is also a full working sample of how to use this approach [here][9].\n\n### Using APIeasy with vows\nWhen you install APIeasy or take it as a dependency in your `package.json` file it will not install [vows][5] globally, so to use vows you must install it globally.\n\n``` bash\n  $ [sudo] npm install vows -g\n```\n\nAfter installing vows you can simply run it from inside your project:\n\n``` bash\n  $ cd /path/to/your/project\n  $ vows\n```\n\n## Roadmap\n\n1. [Get feedback][6] on what else could be exposed through this library.\n2. Improve it.\n3. Repeat (1) + (2).\n\n## Run Tests\n<pre>\n  npm test\n</pre>\n\n#### Author: [Charlie Robbins](http://nodejitsu.com)\n\n[0]: http://nodejs.org\n[1]: http://flatiron.github.com/api-easy\n[2]: http://github.com/jashkenas\n[3]: http://github.com/jashkenas/docco\n[4]: #using-api-easy\n[5]: http://vowsjs.org\n[6]: http://github.com/flatiron/api-easy/issues\n[7]: http://npmjs.org\n[8]: https://github.com/isaacs/npm/blob/master/doc/test.md\n[9]: https://gist.github.com/1039425\n"}},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"time":{"modified":"2012-08-02T13:44:28.921Z","created":"2011-04-18T03:15:00.507Z","0.2.0":"2011-04-18T03:15:00.666Z","0.2.1":"2011-05-25T05:38:09.272Z","0.2.2":"2011-06-11T21:08:29.997Z","0.2.3":"2011-06-11T21:17:18.608Z","0.2.4":"2011-10-03T22:57:04.356Z","0.3.0":"2011-11-24T03:37:31.158Z","0.3.1":"2011-11-24T04:46:15.441Z","0.3.2":"2011-12-08T23:43:37.456Z","0.3.3":"2012-02-11T06:19:38.237Z","0.3.4":"2012-03-12T22:07:46.910Z","0.3.5":"2012-06-07T01:32:02.121Z","0.3.6":"2012-06-27T04:22:52.446Z","0.3.7":"2012-07-24T20:13:48.000Z"},"author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"repository":{"type":"git","url":"git://github.com/flatiron/api-easy.git"},"users":{"fgribreau":true},"_attachments":{"api-easy-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-gdIiFHRcEEcggjOSr/6rgg==","length":22387,"stub":true},"api-easy-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-PhheajLEOv8xawkr2vfCXw==","length":22378,"stub":true},"api-easy-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-M6aCO1ZLscYwg4BNfIuWXw==","length":22036,"stub":true},"api-easy-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-5KreG1hkz4nxAG4VJizp6w==","length":21922,"stub":true},"api-easy-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-JANNTzas2y+TEOacb0Zncg==","length":21906,"stub":true},"api-easy-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-5Dtwr3/p0kwCs+8+hpi7Cg==","length":30720,"stub":true},"api-easy-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-KZ1pcEd2Ful2UpUGfyALaQ==","length":30720,"stub":true},"api-easy-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-MvHlqQRauRyCV94RDyI2Yg==","length":30720,"stub":true},"api-easy-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-zX5+dk3LUeahrS/dz24EHA==","length":19433,"stub":true},"api-easy-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-gpCgUpSjnpWINmunPAw3kA==","length":18920,"stub":true}}}},
{"id":"api-node","key":"api-node","value":{"rev":"3-a2e2fb527c4c6a211a862c3b11a778bb"},"doc":{"_id":"api-node","_rev":"3-a2e2fb527c4c6a211a862c3b11a778bb","name":"api-node","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"name":"api-node","version":"0.1.1","private":false,"dependencies":{"prompt":">=0.2.1"},"repository":{"type":"git","url":"git://github.com/ordrin/api-node.git"},"main":"./main","_npmUser":{"name":"ordr.in","email":"tech@ordrin.com"},"_id":"api-node@0.1.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"02dd99fea49623ec90b1fa6aea25232117fc1319","tarball":"http://registry.npmjs.org/api-node/-/api-node-0.1.1.tgz"},"maintainers":[{"name":"ordr.in","email":"tech@ordrin.com"}]}},"readme":"# Ordr.in Node Library\n\n## About\nA node library for the ordr.in API  \nSee full API documantation at <a href=\"http://ordr.in/developers\">http://ordr.in/developers</a>\nAlso check out a working demo of all the api calls by running demo.js\n\n## Installation\nThe simplest way to install is with npm:  \n<pre>\n  npm install ordrin-api\n</pre>\n\n\n## Usage  \n\n### Initialization\n<pre>\n  var ordrinApi = require(\"ordrin-api\");\n\n  var ordrin = ordrinApi.init({\n    apiKey: \"YOUR-ORDRIN-API-KEY\",\n    restaurantUrl: \"r-test.ordr.in\",\n    userUrl: \"u-test.ordr.in\",\n    orderUrl: \"o-test.ordr.in\"\n  });\n</pre>\nNote that for the Urls https:// and the trailing / are all implied. DO NOT include them in the Url strings. The ordr.in API only supports https requests.\n\n### Callbacks\nBecause node is async every function call you make to the ordrin api includes a callback. This will be called when the api has finished your request. The format of this callback is always the same.  \nIt takes two parameters: error and data.  \nIf there's no error than error will be false, otherwise it will be an object.  \nData is an object containing the data returned from the ordr.in api as described in the API documentation located at <a href=\"http://ordr.in/developers\">http://ordr.in/developers</a>.\n\nExample function callback:  \n<pre>\n  var callback = function(error, data){\n    if (error){\n      console.error(\"Ordr.in API error\", error.msg);\n    }else{\n      // program logic\n    }\n  }\n</pre>\n\n### Data Structures\nThe following classes are part of the library and are used whenever you need to pass an address, credit card, user, tray item, or tray to a library function.\n\n<pre>\n  Address = {\n    addr: String,\n    city: String,\n    state: String,\n    zip: Number,\n    phone: Number,\n    addr2: String\n  }\n\n  CreditCard = {\n    name: String,\n    expiryMonth: Number,\n    expiryYear: Number,\n    billAddress: String, // An object of the above address class\n    number: Number,\n    cvc: Number\n  }\n\n  UserLogin = {\n    email: String,\n    password: String // this is always an unencoded password \n  }\n\n  TrayItem = {\n    itemId: Number,\n    quantity: Number,\n    options: Array // array of option ids\n  }\n\n  Tray = {\n    items: Array // array of trayItem objects of the above class\n  }\n</pre>\nYou can create an object of one of these classes like so:\n<pre>\n  var user = new Ordrin.UserLogin(\"example@example.com\", \"password\");\n</pre>\n\n### Validation\nEach of the above Data Structers throw errors if you pass invalid values to their constructors. The errors are children \nof the javascript Error class, and include the additional property fieldErrors. This describes the \ndifferent validation errors that occured. \nExample\n<pre>\n  try{\n    var address = new Ordrin.Address(\"1 Main Street\", \"College Station\", \"RDS\", 7765, 1234);\n  }catch (e){\n    console.log(e.fieldErrors);\n  }\n<pre>\nThe above example will print out an object that contains the properties: state, zip, and phone since those were the invalid properties. And a short message with each one that describes what was invalid. \nYou can see validation in action in the demo script.\n\n\n### Restaurant API\n<pre>\n  ordrin.restaurant.getDeliveryList(dateTime, address, callback);\n  \n  ordrin.restaurant.getDeliveryCheck(restaurantId, dateTime, address, callback);\n\n  ordrin.restaurant.getFee(restaurantId, subtotal, tip, dateTime, address, callback);\n\n  ordrin.restaurant.getDetails(restuarantId, callback);\n</pre>\n\n### User API\n<pre>\n  ordrin.user.getUser(userLogin, callback);\n\n  ordrin.user.createUser(userLogin, firstName, lastName, callback);\n\n  ordrin.user.getAllAddresses(userLogin, callback);\n\n  ordrin.user.getAddress(userLogin, addressName, callback);\n\n  ordrin.user.setAddress(userLogin, addressName, address, callback);\n\n  ordrin.user.removeAddress(userLogin, addressName, callback);\n\n  ordrin.user.getAllCreditCards(userLogin, callback);\n\n  ordrin.user.getCreditCard(userLogin, cardName, callback);\n\n  ordrin.user.setCreditCard(userLogin, cardName, creditCard, callback);\n\n  ordrin.user.removeCreditCard(userLogin, cardName, callback);\n\n  ordrin.user.getOrderHistory(userLogin, callback);\n\n  ordrin.user.getOrderDetails(userLogin, orderId, callback);\n\n  ordrin.user.setPassword(userLogin, newPassword, callback);\n</pre>\n\n### Order API\nThe Order API includes the ability to create a new user when you place the order. If you want to do that just pass in the new user's login credentials in the user object, and set createUser to true.\n\nIf you don't want the order to be associated with a user account then pass in false as the password inside the user object, and setCreateUser to false.\n\n<pre>\n  ordrin.order.placeOrder(restaurantId, tray, tip, deliveryTime, firstName, lastName, address, creditCard, user, createUser, callback)\n</pre>\n","maintainers":[{"name":"ordr.in","email":"tech@ordrin.com"}],"time":{"modified":"2012-06-19T19:06:10.472Z","created":"2012-06-19T19:06:10.045Z","0.1.1":"2012-06-19T19:06:10.472Z"},"repository":{"type":"git","url":"git://github.com/ordrin/api-node.git"},"_attachments":{"api-node-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vk3v9/DiwqoLmCUs1uTuxA==","length":9500,"stub":true}}}},
{"id":"api.js","key":"api.js","value":{"rev":"11-2c7fa1d071a5d18c015a47ce137fd2fe"},"doc":{"_id":"api.js","_rev":"11-2c7fa1d071a5d18c015a47ce137fd2fe","name":"api.js","description":"Framework for HTTP REST APIs","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"api.js","description":"Framework for HTTP REST APIs","homepage":"http://github.com/joehewitt/api.js","repository":{"type":"git","url":"git://github.com/joehewitt/api.js.git"},"keywords":["http","rest","api"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","dandy":"","express":"","underscore":"","vows":">=0.5.4"},"version":"0.0.1","main":"./lib/apijs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"api.js@0.0.1","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0ba93d13b09846ea30696a6ac30bedd80c8d3077","tarball":"http://registry.npmjs.org/api.js/-/api.js-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.2":{"name":"api.js","description":"Framework for HTTP REST APIs","version":"0.0.2","homepage":"http://github.com/joehewitt/api.js","repository":{"type":"git","url":"git://github.com/joehewitt/api.js.git"},"keywords":["http","rest","api"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","dandy":"","express":"","underscore":"","vows":">=0.5.4"},"main":"./lib/apijs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"api.js@0.0.2","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4245e355fd56ca5b2d01c9d20b79753fe5be78b3","tarball":"http://registry.npmjs.org/api.js/-/api.js-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.3":{"name":"api.js","description":"Framework for HTTP REST APIs","version":"0.0.3","homepage":"http://github.com/joehewitt/api.js","repository":{"type":"git","url":"git://github.com/joehewitt/api.js.git"},"keywords":["http","rest","api"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","dandy":"","express":"","underscore":"","vows":">=0.5.4"},"main":"./lib/apijs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"api.js@0.0.3","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"63ae97ea6ffc2f6db0a795da3482d06376e8f5c6","tarball":"http://registry.npmjs.org/api.js/-/api.js-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.4":{"name":"api.js","description":"Framework for HTTP REST APIs","version":"0.0.4","homepage":"http://github.com/joehewitt/api.js","repository":{"type":"git","url":"git://github.com/joehewitt/api.js.git"},"keywords":["http","rest","api"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","dandy":"","express":"","underscore":"","vows":">=0.5.4"},"main":"./lib/apijs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"joehewitt","email":"joe@joehewitt.com"},"_id":"api.js@0.0.4","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"623261ff56eff1ce4d518313355eeebc788a6298","tarball":"http://registry.npmjs.org/api.js/-/api.js-0.0.4.tgz"},"readme":"api.js\n========\n\nA framework for writing HTTP REST APIs.\n\nInstallation\n------------\n\n    $ npm install apijs\n\nLicense \n-------\n\nCopyright 2011 Joe Hewitt\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n \n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.5":{"name":"api.js","description":"Framework for HTTP REST APIs","version":"0.0.5","homepage":"http://github.com/joehewitt/api.js","repository":{"type":"git","url":"git://github.com/joehewitt/api.js.git"},"keywords":["http","rest","api"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","dandy":"","express":"","underscore":"","vows":">=0.5.4"},"main":"./lib/apijs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"joehewitt","email":"joe@joehewitt.com"},"_id":"api.js@0.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"196c0b5cc20e0d7cfd0aad335810ca2e571b08d1","tarball":"http://registry.npmjs.org/api.js/-/api.js-0.0.5.tgz"},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]}},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}],"time":{"modified":"2012-04-17T01:16:58.772Z","created":"2011-09-05T17:03:02.334Z","0.0.1":"2011-09-05T17:03:02.887Z","0.0.2":"2011-09-12T23:39:33.515Z","0.0.3":"2011-10-02T02:45:50.463Z","0.0.4":"2012-04-14T21:12:45.709Z","0.0.5":"2012-04-17T01:16:58.772Z"},"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"repository":{"type":"git","url":"git://github.com/joehewitt/api.js.git"},"_attachments":{"api.js-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-P+jXeFxSqJTqHlVBx0pBOw==","length":10240,"stub":true},"api.js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-45FztChvOWdsjNWDHFJkMw==","length":3211,"stub":true},"api.js-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Z813bD4pwpk6rZSSdUDpDQ==","length":3177,"stub":true},"api.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ov2blKcTS3I5Tdl37VcHGA==","length":3077,"stub":true},"api.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YyyS13dtMEWIUdVkNwQMMg==","length":3145,"stub":true}}}},
{"id":"api_botnik_com","key":"api_botnik_com","value":{"rev":"3-f274062e937a6312a234b1c226538136"},"doc":{"_id":"api_botnik_com","_rev":"3-f274062e937a6312a234b1c226538136","name":"api_botnik_com","description":"New read me","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"api_botnik_com","version":"0.0.1","engines":{"node":"0.6.10","npm":"1.0.106"},"dependencies":{"async":"0.1.15","connect":"2.4.2","express":"3.0","mongodb":"0.9.7-1.4","request":"2.9.100","yql":"0.4.6","apn":"1.2.2","ql.io-engine":"0.7.3"},"scripts":{"start":"node server.js"},"readme":"New read me","_id":"api_botnik_com@0.0.1","description":"New read me","dist":{"shasum":"1119c5ddd4ecce19a768360d6468ec418f178857","tarball":"http://registry.npmjs.org/api_botnik_com/-/api_botnik_com-0.0.1.tgz"},"maintainers":[{"name":"mkhurrumq","email":"mkhurrumq@gmail.com"}]}},"readme":"New read me","maintainers":[{"name":"mkhurrumq","email":"mkhurrumq@gmail.com"}],"time":{"modified":"2012-08-12T07:12:13.370Z","created":"2012-08-12T07:12:08.071Z","0.0.1":"2012-08-12T07:12:13.370Z"},"_attachments":{"api_botnik_com-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zMUEDLqOGJNjzsz20DSfgw==","length":119397,"stub":true}}}},
{"id":"api_request","key":"api_request","value":{"rev":"9-e6fd72ee5d416ab6f5643c6b97a1dafb"},"doc":{"_id":"api_request","_rev":"9-e6fd72ee5d416ab6f5643c6b97a1dafb","name":"api_request","description":"Wrapper for the http client to make beautiful, readable requests.","dist-tags":{"latest":"0.5.4"},"versions":{"0.5.0":{"name":"api_request","description":"Wrapper for the http client to make beautiful, readable requests.","version":"0.5.0","homepage":"https://github.com/adaburrows/api_request","keywords":["api","wrapper","http_request"],"author":{"name":"Jill Burrows","email":"jill@adaburrows.com"},"contibutors":[],"repository":{"type":"git","url":"git://github.com/adaburrows/api_request.git"},"main":"./lib/api_request","directories":{"lib":"lib"},"_npmJsonOpts":{"file":"/root/.npm/api_request/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"api_request@0.5.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.5.1-pre","_defaultsLoaded":true,"dist":{"shasum":"bc7c1cf98da3ef99f0fbf6f0da25d5aa1b0a24ea","tarball":"http://registry.npmjs.org/api_request/-/api_request-0.5.0.tgz"},"scripts":{},"maintainers":[{"name":"adaburrows","email":"jill@adaburrows.com"}]},"0.5.2":{"name":"api_request","description":"Wrapper for the http client to make beautiful, readable requests.","version":"0.5.2","homepage":"https://github.com/adaburrows/api_request","keywords":["api","wrapper","http_request"],"author":{"name":"Jill Burrows","email":"jill@adaburrows.com"},"contibutors":[],"repository":{"type":"git","url":"git://github.com/adaburrows/api_request.git"},"main":"./lib/api_request","directories":{"lib":"lib"},"_npmJsonOpts":{"file":"/root/.npm/api_request/0.5.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"api_request@0.5.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.5.1-pre","_defaultsLoaded":true,"dist":{"shasum":"b2c14b21d3ec612b55af2c2356013e93835b61db","tarball":"http://registry.npmjs.org/api_request/-/api_request-0.5.2.tgz"},"scripts":{},"maintainers":[{"name":"adaburrows","email":"jill@adaburrows.com"}]},"0.5.3":{"name":"api_request","description":"Wrapper for the http client to make beautiful, readable requests.","version":"0.5.3","homepage":"https://github.com/adaburrows/api_request","keywords":["api","wrapper","http_request"],"author":{"name":"Jill Burrows","email":"jill@adaburrows.com"},"contibutors":[],"repository":{"type":"git","url":"git://github.com/adaburrows/api_request.git"},"main":"./lib/api_request","directories":{"lib":"lib"},"_npmJsonOpts":{"file":"/root/.npm/api_request/0.5.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"api_request@0.5.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.5.1-pre","_defaultsLoaded":true,"dist":{"shasum":"4ad474ed25db9a3bc44811e8ff11fa75ead8f483","tarball":"http://registry.npmjs.org/api_request/-/api_request-0.5.3.tgz"},"scripts":{},"maintainers":[{"name":"adaburrows","email":"jill@adaburrows.com"}]},"0.5.4":{"name":"api_request","description":"Wrapper for the http client to make beautiful, readable requests.","version":"0.5.4","homepage":"https://github.com/adaburrows/api_request","keywords":["api","wrapper","http_request"],"author":{"name":"Jill Burrows","email":"jill@adaburrows.com"},"contibutors":[],"repository":{"type":"git","url":"git://github.com/adaburrows/api_request.git"},"main":"./lib/api_request","directories":{"lib":"lib"},"_npmUser":{"name":"adaburrows","email":"jill@adaburrows.com"},"_id":"api_request@0.5.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.1-pre","_defaultsLoaded":true,"dist":{"shasum":"5f384ff009ad0605e89591019c80d7fb3fde04e2","tarball":"http://registry.npmjs.org/api_request/-/api_request-0.5.4.tgz"},"maintainers":[{"name":"adaburrows","email":"jill@adaburrows.com"}]}},"maintainers":[{"name":"adaburrows","email":"jill@adaburrows.com"}],"time":{"modified":"2011-10-28T13:31:16.244Z","created":"2011-08-02T18:19:33.148Z","0.5.0":"2011-08-02T18:19:33.711Z","0.5.2":"2011-10-21T20:35:27.732Z","0.5.3":"2011-10-21T21:18:49.150Z","0.5.4":"2011-10-28T13:31:16.244Z"},"author":{"name":"Jill Burrows","email":"jill@adaburrows.com"},"repository":{"type":"git","url":"git://github.com/adaburrows/api_request.git"},"_attachments":{"api_request-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-KcYrNNgcPc7JzTh56wkDHA==","length":10240,"stub":true},"api_request-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8Kphb3LkF9P9vv567tZ3IQ==","length":3808,"stub":true},"api_request-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7WyeQkSp3DKxFTuT4tvDcQ==","length":3808,"stub":true},"api_request-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DWAGgCvJfZz/OWxmYe3LNQ==","length":3668,"stub":true}}}},
{"id":"apiary","key":"apiary","value":{"rev":"3-045d37ff8ecb7cfeb5ec9c526a1500a7"},"doc":{"_id":"apiary","_rev":"3-045d37ff8ecb7cfeb5ec9c526a1500a7","name":"apiary","description":"Spawn multi-system multi-user node.js clouds, on your own hardware and/or with 3rd party virtual servers","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"apiary","description":"Spawn multi-system multi-user node.js clouds, on your own hardware and/or with 3rd party virtual servers","version":"0.0.2","author":{"name":"Tolsma Telematica Consultancy","email":"code at tolsma.net"},"repository":{"type":"git","url":"git://github.com/stolsma/apiary.git"},"keywords":["distributed","cloud computing","automated deployment","platform-as-a-service"],"dependencies":{"async":"0.1.x","clip":"0.1.x","colors":"0.5.x","dnode":"0.7.x","eventemitter2":"0.4.x","eyes":"0.1.x","forever":"0.6.x","haibu":"0.4.x >=0.4.4","haibu-carapace":"0.2.x >=0.2.4","hook.io":"0.6.x >=0.6.0","mkdirp":"0.0.x","nconf":"0.3.x","optimist":"0.2.x","rimraf":"1.0.x"},"main":"./lib/apiary","bin":{"apiary":"./bin/apiary"},"engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/home/sander/.npm/apiary/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apiary@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"4cfa3cb1f633b5fad27ea1462a04de4bb08dca1e","tarball":"http://registry.npmjs.org/apiary/-/apiary-0.0.2.tgz"},"maintainers":[{"name":"stolsma","email":"npm@tolsma.net"}]}},"maintainers":[{"name":"stolsma","email":"npm@tolsma.net"}],"time":{"modified":"2011-09-26T16:02:27.757Z","created":"2011-09-26T16:02:26.166Z","0.0.2":"2011-09-26T16:02:27.757Z"},"author":{"name":"Tolsma Telematica Consultancy","email":"code at tolsma.net"},"repository":{"type":"git","url":"git://github.com/stolsma/apiary.git"},"_attachments":{"apiary-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5JTZKGNZ7tS7HptnmLTF5g==","length":408575,"stub":true}}}},
{"id":"apiaxle","key":"apiaxle","value":{"rev":"3-fb46243376335d3183972dff965d82d7"},"doc":{"_id":"apiaxle","_rev":"3-fb46243376335d3183972dff965d82d7","name":"apiaxle","description":"API gateway","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"name":"apiaxle","description":"API gateway","version":"0.0.1","repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.git"},"scripts":{"test":"cake test"},"engines":{"node":">0.4.8"},"dependencies":{"request":"~2.1.1","parseopt":"1.0.0","async":"~0.1.9","coffee-script":"~1.1.2","express":"~2.5","underscore":"~1.1.7","redis":"~0.7","hiredis":"~0.1","libxmljs":"~0.5","apiaxle.base":"~0"},"devDependencies":{"twerp":"=1.0.7","sinon":"~1.1.1"},"_npmUser":{"name":"philjackson","email":"phil@shellarchive.co.uk"},"_id":"apiaxle@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c31a4a8d60c6ddc3f7bccc92103acad08c5039ba","tarball":"http://registry.npmjs.org/apiaxle/-/apiaxle-0.0.1.tgz"},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}]}},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}],"time":{"modified":"2012-04-19T19:48:45.168Z","created":"2012-04-19T19:48:43.334Z","0.0.1":"2012-04-19T19:48:45.168Z"},"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.git"},"_attachments":{"apiaxle-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9xKqJmxbwVjWqb1+1PGYKg==","length":128921,"stub":true}}}},
{"id":"apiaxle.api","key":"apiaxle.api","value":{"rev":"3-5f3a70d114b6a142f77d4ed1818608cf"},"doc":{"_id":"apiaxle.api","_rev":"3-5f3a70d114b6a142f77d4ed1818608cf","name":"apiaxle.api","description":"Provisioning API for apiaxle","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"name":"apiaxle.api","description":"Provisioning API for apiaxle","version":"0.0.1","repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.api.git"},"scripts":{"test":"cake test"},"engines":{"node":">0.4.8"},"dependencies":{"async":"~0.1.9","coffee-script":"~1.1.2","express":"~2.5","underscore":"~1.1.7","redis":"0.6.7","hiredis":"0.1.12"},"devDependencies":{"twerp":"=1.0.7","sinon":"~1.1.1"},"_npmUser":{"name":"philjackson","email":"phil@shellarchive.co.uk"},"_id":"apiaxle.api@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"eaa7b6849f1aca688090de5db766bc9e77288503","tarball":"http://registry.npmjs.org/apiaxle.api/-/apiaxle.api-0.0.1.tgz"},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}]}},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}],"time":{"modified":"2012-04-19T19:46:59.045Z","created":"2012-04-19T19:46:57.277Z","0.0.1":"2012-04-19T19:46:59.045Z"},"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.api.git"},"_attachments":{"apiaxle.api-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EAiQyGkL5nVrv1cM1IYckQ==","length":7371,"stub":true}}}},
{"id":"apiaxle.base","key":"apiaxle.base","value":{"rev":"9-1d25ec37769627c566076beb1f1b05fc"},"doc":{"_id":"apiaxle.base","_rev":"9-1d25ec37769627c566076beb1f1b05fc","name":"apiaxle.base","description":"Basic Application class for apiaxle.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"name":"apiaxle.base","description":"Basic Application class for apiaxle.","version":"0.0.1","main":"index","repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.base.git"},"scripts":{"test":"cake test"},"engines":{"node":">=0.4.8"},"dependencies":{"coffee-script":"~1.2","async":"~0.1","express":"~2","underscore":"~1","redis":"~0","schema":"~0","hiredis":"~0.1","date-utils":"~1","libxmljs":"~0","js2xml":"~0"},"devDependencies":{"twerp":"=1.0.7","sinon":"~1.1.1"},"_npmUser":{"name":"philjackson","email":"phil@shellarchive.co.uk"},"_id":"apiaxle.base@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ab1203415a7dacf95501ceaecd64f468a6ada395","tarball":"http://registry.npmjs.org/apiaxle.base/-/apiaxle.base-0.0.1.tgz"},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}],"directories":{}},"0.0.2":{"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"name":"apiaxle.base","description":"Basic Application class for apiaxle.","version":"0.0.2","main":"index","repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.base.git"},"scripts":{"test":"cake test"},"engines":{"node":">=0.4.8"},"dependencies":{"coffee-script":"~1.2","async":"~0.1","express":"~2","underscore":"~1","redis":"~0","schema":"~0","hiredis":"~0.1","date-utils":"~1","libxmljs":"~0","js2xml":"0.0.2"},"devDependencies":{"twerp":"=1.0.7","sinon":"~1.1.1"},"_npmUser":{"name":"philjackson","email":"phil@shellarchive.co.uk"},"_id":"apiaxle.base@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d43ce967c70cd36bcd18a3e5da4281a010061b23","tarball":"http://registry.npmjs.org/apiaxle.base/-/apiaxle.base-0.0.2.tgz"},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}]}},"readme":"","maintainers":[{"name":"philjackson","email":"phil@shellarchive.co.uk"}],"time":{"modified":"2012-04-19T20:38:05.306Z","created":"2012-04-19T19:45:02.737Z","0.0.1":"2012-04-19T19:45:04.435Z","0.0.2":"2012-04-19T20:38:05.306Z"},"author":{"name":"Phil Jackson","email":"phil@shellarchive.co.uk"},"repository":{"type":"git","url":"https://philjackson@bitbucket.org/philjackson/apiaxle.base.git"},"_attachments":{"apiaxle.base-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SMV/sPQOkb+JLy8MoNRnUQ==","length":13546,"stub":true},"apiaxle.base-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L+ELq90M2gK1XM+nKvDbbQ==","length":13539,"stub":true}}}},
{"id":"apic.js","key":"apic.js","value":{"rev":"33-aeef66a3ef168f063a42357746f0623a"},"doc":{"_id":"apic.js","_rev":"33-aeef66a3ef168f063a42357746f0623a","name":"apic.js","description":"REST API JavaScript Client Generator","dist-tags":{"latest":"0.1.5"},"versions":{"0.0.1":{"name":"apic.js","description":"JavaScript REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"contributors":[],"version":"0.0.1","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"57d65f230f54a68e9d8035de96b8fd6bbf4db095","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.1.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}],"directories":{}},"0.0.2":{"name":"apic.js","description":"JavaScript REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"contributors":[],"version":"0.0.2","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"173d174faddb24a54d94778e2bff15b7fdae1ee9","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.2.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}],"directories":{}},"0.0.3":{"name":"apic.js","description":"JavaScript REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"contributors":[],"version":"0.0.3","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d6fcbce5aa8f4629455384d79bce7428902c40d2","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.3.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}],"directories":{}},"0.0.4":{"name":"apic.js","description":"JavaScript REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.0.4","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"26536a13393a5f4fad29ab871a49dd90846931b6","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.4.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.0.5":{"name":"apic.js","description":"JavaScript REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.0.5","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"2a98d5b72365d12aec4c2a5c4d37532af544c5ac","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.5.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.0.6":{"name":"apic.js","description":"JavaScript REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.0.6","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"4dfd00372a4c0ffc91f4400480ff09691ca2c512","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.6.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.0.8":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.0.8","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.8","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"87654a4b8829be234e83e4a2a04b8617cbc8e3dd","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.8.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.0.9":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.0.9","_npmUser":{"name":"temich","email":"a.gurtovoy@gmail.com"},"_id":"apic.js@0.0.9","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b97b94c6cfa7c16715246b5b3d6c325aa5ca87ce","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.0.9.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.1.0":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.1.0","_id":"apic.js@0.1.0","dist":{"shasum":"601c880bff5f511849f55b5b5ca635124b9f23b2","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.1.0.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.1.1":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.1.1","_id":"apic.js@0.1.1","dist":{"shasum":"0ab87c15e0ca9295d429c011b5f2c42656d067ed","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.1.1.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.1.2":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.1.2","_id":"apic.js@0.1.2","dist":{"shasum":"323f6861fd4233920287451c7528389ab6ed9d5f","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.1.2.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.1.3":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.1.3","_id":"apic.js@0.1.3","dist":{"shasum":"10e4d813612bda790f7f8a40236a0b8df7f097cf","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.1.3.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.1.4":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.1.4","_id":"apic.js@0.1.4","dist":{"shasum":"bdc67b049b8d299b28416c4952e1dba9b65c3447","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.1.4.tgz"},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]},"0.1.5":{"name":"apic.js","description":"REST API JavaScript Client Generator","keywords":["js","REST","api","client"],"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"repositiry":{"type":"git","url":"https://temich@github.com/temich/apic.js.git"},"contributors":[],"version":"0.1.5","readme":"apic.js � REST API JavaScript Client Generator\r\n=======\r\n\r\nabout\r\n-----\r\nDescribe your REST API using WADL <http://www.w3.org/Submission/wadl/> and get complete JavaScript client.\r\n\r\nCurrent early version is a CommonJS module (RequireJS compatible) with jquery dependency.","_id":"apic.js@0.1.5","dist":{"shasum":"91516c10d36961e59f066f85163964fede305ec1","tarball":"http://registry.npmjs.org/apic.js/-/apic.js-0.1.5.tgz"},"maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}]}},"readme":"","maintainers":[{"name":"temich","email":"a.gurtovoy@gmail.com"}],"time":{"modified":"2012-08-06T14:34:00.785Z","created":"2012-05-03T08:38:39.665Z","0.0.1":"2012-05-03T08:38:42.841Z","0.0.2":"2012-05-04T06:16:04.431Z","0.0.3":"2012-05-04T09:21:24.041Z","0.0.4":"2012-05-04T13:42:56.151Z","0.0.5":"2012-05-04T18:33:05.866Z","0.0.6":"2012-05-05T09:35:09.202Z","0.0.8":"2012-07-03T13:12:02.994Z","0.0.9":"2012-07-04T10:03:31.908Z","0.1.0":"2012-07-12T12:28:45.530Z","0.1.1":"2012-07-16T14:58:20.925Z","0.1.2":"2012-07-17T08:33:14.847Z","0.1.3":"2012-07-19T05:43:29.622Z","0.1.4":"2012-07-19T07:25:11.131Z","0.1.5":"2012-08-06T14:34:00.785Z"},"author":{"name":"Artem Gurtovoy","email":"tema.gurtovoy@gmail.com"},"_attachments":{"apic.js-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-d8+IzF5qkRWbW7YCH8ka1A==","length":3257,"stub":true},"apic.js-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-zL8cLboU/boKE2HWFDfMdQ==","length":3066,"stub":true},"apic.js-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-8/ShAz0PTeyBVWrRTAYF8w==","length":3067,"stub":true},"apic.js-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-SrTGiv7acG++UPmS//ZEZg==","length":3008,"stub":true},"apic.js-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-NIGUhWXr9TUGQtp7YKscuw==","length":3006,"stub":true},"apic.js-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-KqY/jW9lIl4RX0jPi3Go4w==","length":3009,"stub":true},"apic.js-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-I1QFXOD3grA5uGH7MByEVg==","length":5820,"stub":true},"apic.js-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-uussFT4km8hvQ2/Ebai/aw==","length":2700,"stub":true},"apic.js-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-e7mG/PznsYOJdFIayflaFg==","length":2665,"stub":true},"apic.js-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-4ZahWKcOPSnvKY1bi/19/A==","length":2663,"stub":true},"apic.js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IpKqmU3XS5/5F5xX8+os3g==","length":2758,"stub":true},"apic.js-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-xq4fm+AsadlTbItHcJijmw==","length":2638,"stub":true},"apic.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-FTOABubYHNwpDa6Nmky9DA==","length":2616,"stub":true},"apic.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QitVz8rgdq2sLqq7o5zRYw==","length":2605,"stub":true}}}},
{"id":"apimaker","key":"apimaker","value":{"rev":"3-bdbd4a2ebf5b67276d89ea73eaa20025"},"doc":{"_id":"apimaker","_rev":"3-bdbd4a2ebf5b67276d89ea73eaa20025","name":"apimaker","description":"uri-string to api conversion tool","dist-tags":{"latest":"0.0.1-0"},"versions":{"0.0.1-0":{"name":"apimaker","description":"uri-string to api conversion tool","url":"https://github.com/franzenzenhofer/apimaker","keywords":["API","URI","URL"],"author":{"name":"Franz Enzenhofer","email":"f.enzenhofer@gmail.com"},"contributors":[],"licenses":[{"type":"MIT"}],"dependencies":{},"main":"./apimaker.js","version":"0.0.1-0","devDependencies":{},"_id":"apimaker@0.0.1-0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6e0de9788340c733e563105c552cd3199284bfe3","tarball":"http://registry.npmjs.org/apimaker/-/apimaker-0.0.1-0.tgz"},"scripts":{}}},"maintainers":[{"name":"franzenzenhofer","email":"f.enzenhofer@gmail.com"}],"time":{"modified":"2011-05-05T19:32:27.100Z","created":"2011-05-05T19:32:26.278Z","0.0.1-0":"2011-05-05T19:32:27.100Z"},"author":{"name":"Franz Enzenhofer","email":"f.enzenhofer@gmail.com"},"_attachments":{"apimaker-0.0.1-0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-azM20DdloGrZtZr7+bxj/w==","length":4774,"stub":true}}}},
{"id":"apis","key":"apis","value":{"rev":"3-e4a634d1a5e31b5233318fae5e79e6cd"},"doc":{"_id":"apis","_rev":"3-e4a634d1a5e31b5233318fae5e79e6cd","name":"apis","description":"Library for creation web and websocket restful APIs","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"apis","version":"0.0.1","description":"Library for creation web and websocket restful APIs","keywords":["api","rest","web","websocket"],"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"preferGlobal":false,"private":false,"dependencies":{"nerr":"~0.0.1","valid":"~0.0.2","units":"~0.0.1","authen":"~0.0.1"},"engines":{"node":"~0.8.0"},"repository":{"type":"git","url":"https://github.com/dimsmol/apis"},"directories":{"lib":"./lib"},"main":"./lib/index","_id":"apis@0.0.1","dist":{"shasum":"97f74c584789e5cca5f97ff743ea9c55d4d90b35","tarball":"http://registry.npmjs.org/apis/-/apis-0.0.1.tgz"},"maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}]}},"readme":"## Handlers\n\nHandler interface:\n\n* `setup(chain)` - can be used to perform some interaction between handlers of chain, used by `Impl` and `Ret`\n* `handle(ctx)` - async handle, must not throw any exceptions, use `ctx.error()` instead, usually must call `ctx.next()` at some point\n\nHandlerSync interface:\n\n* `setup(chain)` - same as in Handler\n* `handle(ctx)` - do not override in regular handlers, use `handleSync(ctx)` instead\n* `handleSync(ctx)` - sync handle, must not use `ctx.next`, `ctx.error` and `ctx.cb` directly or indirectly, but can throw exceptions and return value will be used as argument of `ctx.next` automatically\n","maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}],"time":{"modified":"2012-08-14T15:33:46.861Z","created":"2012-08-14T15:33:44.885Z","0.0.1":"2012-08-14T15:33:46.861Z"},"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"repository":{"type":"git","url":"https://github.com/dimsmol/apis"},"_attachments":{"apis-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OJ++Qhh2rBKKDSLepmrQZw==","length":19121,"stub":true}}}},
{"id":"apiserver","key":"apiserver","value":{"rev":"17-54e0dd8c01af3bb09166a31b8eca8184"},"doc":{"_id":"apiserver","_rev":"17-54e0dd8c01af3bb09166a31b8eca8184","name":"apiserver","description":"A ready to go, modular, JSON(P) API Server.","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.1":{"name":"apiserver","description":"A ready to go modular http API Server.","main":"./lib/apiserver.js","version":"0.1.1","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"dependencies":{"bufferjoiner":"0.1.0"},"author":"","_npmJsonOpts":{"file":"/Users/kilian/.npm/apiserver/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apiserver@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4f2ed25dc0e39057b05734ca5b3720d5612227f3","tarball":"http://registry.npmjs.org/apiserver/-/apiserver-0.1.1.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"directories":{}},"0.1.2":{"name":"apiserver","description":"A ready to go modular http API Server.","main":"./lib/apiserver.js","version":"0.1.2","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"dependencies":{"bufferjoiner":"0.1.0"},"author":"","_npmJsonOpts":{"file":"/Users/kilian/.npm/apiserver/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apiserver@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"29a5440d65114cd782ede9f71ba993c9923a1adf","tarball":"http://registry.npmjs.org/apiserver/-/apiserver-0.1.2.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"directories":{}},"0.1.3":{"name":"apiserver","description":"A ready to go modular http API Server.","main":"./lib/apiserver.js","version":"0.1.3","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"dependencies":{"bufferjoiner":"0.1.0"},"author":"","_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver@0.1.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"91daf7178573636126718a72c4f87331e9183bb1","tarball":"http://registry.npmjs.org/apiserver/-/apiserver-0.1.3.tgz"},"readme":"# node-apiserver ![project status](http://dl.dropbox.com/u/2208502/maintained.png)\n\nA ready to go modular http API Server.\n\n#transports\n\n- JSON\n- JSONP,\n- JSONP+iFrame _(you can make cross-domain POST inside the same parent domain: 's1.example.com, s2.example.com, ...')_\n\n## Dependencies\n\n- nodejs v0.4.11+\n- node-bufferjoiner [repository](https://github.com/kilianc/node-bufferjoiner)\n\n## Installation as submodule\n\n    $ git clone git://github.com/kilian/node-apiserver.git\n\n## Installation with npm\n\n    $ npm install apiserver\n\n## Usage\n```javascript\n    var util = require('util'),\n        querystring = require('querystring'),\n        ApiServer = require('node-apiserver'),\n        ApiModule = require('node-apiserver').ApiModule;\n\n    ...\n\n    var UserModule = function(userCollection, myotherObj, myCustomConfig) {\n        ...\n        this.userCollection = userCollection;\n        ApiModule.call(this);\n    };\n\n    util.inherits(UserModule, ApiModule);\n\n    // this is a private method, it means that you must send a right Authorization header within your request.\n    // your method can be reached to http://yourserver.com/user/my_first_camel_case_method\n    UserModule.prototype.myFirstCamelCaseMethodPrivate = function(request, response) {\n\n        var self = this;\n        var postData = this.parsePost(request); //inherited from ApiModule.\n\n        if(!/^([a-z0-9_\\.\\-])+\\@(([a-z0-9\\-])+\\.)+([a-z0-9]{2,4})+$/.test(postData.email)){\n            self.emit('responseReady', request, response, 200, null, { success: false, reason: 'email not valid' });\n            return this;\n        }\n\n        this.userCollection.insert({ email: postData.email }, { safe: true }, function(err, user) {\n\n            if(err){\n                self.emit('responseReady', request, response, 200, 'this is the http status message', { success: false, reason: 'email not unique' });\n                return this;\n            } \n\n            self.emit('responseReady', request, response, 200, 'this is the http status message', { email: postData.email, success: true });\n        });\n    };\n\n    // this is a public method\n    // the server will check for the [Private|Public] word at the end of the method name.\n    // your method can be reached to http://yourserver.com/user/my_second_camel_case_method\n    UserModule.prototype.mySecondCamelCaseMethodPublic = function(request, response) {\n\n        var self = this;\n        var postData = this.parsePost(request);\n\n        if(!/^([a-z0-9_\\.\\-])+\\@(([a-z0-9\\-])+\\.)+([a-z0-9]{2,4})+$/.test(postData.email)){\n            self.emit('responseReady', request, response, 200, null, { success: false, reason: 'email not valid' });\n            return this;\n        }\n\n\t        this.userCollection.insert({ email: postData.email }, { safe: true }, function(err, user) {\n\n            if(err){\n                self.emit('responseReady', request, response, 200, 'this is the http status message', { success: false, reason: 'email not unique' });\n                return this;\n            } \n\n            self.emit('responseReady', request, response, 200, 'this is the http status message', { email: postData.email, success: true });\n        });\n    };\n\n    ...\n\n    var apiServer = new ApiServer('mydomain.com', standardHeaders, \"username:password\");\n    apiServer.addModule('user', new UserModule(new mongodb.Collection(mongodbClient, 'users'), { foo: 'bar' }, { cool: 'sure' }));\n    apiServer.listen(80);\n\n    ...\n```\n## License\n\n_This software is released under the MIT license cited below_.\n\n    Copyright (c) 2010 Kilian Ciuffolo, me@nailik.org. All Rights Reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the 'Software'), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n    \n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver","description":"A ready to go, modular, JSON(P) API Server.","keywords":["api","server","rest","json","jsonp"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{"json-transport":"0.1.x","apiserver-router":"0.1.x","buffered-request":"0.1.x","fnchain":"0.1.1","bufferjoiner":"0.1.x","formidable":"1.0.x","qs":"0.4.x","mime":"1.2.x"},"devDependencies":{"mocha":"1.0.x","should":"0.6.1","request":"2.9.x"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"28100298a6d2dd43eeff89923bb1cfa3ef45894a","tarball":"http://registry.npmjs.org/apiserver/-/apiserver-0.2.0.tgz"},"readme":"# apiserver [![build status](https://secure.travis-ci.org/kilianc/node-apiserver.png?branch=refactor)](http://travis-ci.org/kilianc/node-apiserver)\n\nA ready to go, modular, multi transport, streaming friendly, JSON(P) API Server.\n\n## Why use ApiServer and not [restify](https://github.com/mcavage/node-restify) or [express](https://github.com/visionmedia/express)?\n\nStrong competitors I guess.\n\n__Express__ targets web applications providing support for templates, views, and all the facilities the you probably need if you're writing a web app. __Restify__ let you \"build \"strict\" API services\" but it's too big and it concentrates on server to server API, that will not be consumed by your browser.\n\n__ApiServer__ is rad. It is a slim, fast, minimal API framework, built to provide you a flexible API consumable both in the browser and from other apps. It ships with JSON, JSONP [__(GET/POST)__](https://github.com/kilianc/node-json-transport) transports and a powerful [fast routing engine](https://github.com/kilianc/node-apiserver-router) OOTB. The source code is small, heavily tested and decoupled. Your API source will be well organized in context objects, allowing you to keep it in a meaningful maintainable way.\n\n### Killer features\n\n* Streaming JSON(P) transport GET/POST browser friendly\n* Fast routing system with cached routes\n* API modules as Objects/Classes\n* Payload paused by default\n* Transports decoupled from the core\n* Router decoupled from the core\n* Compatible with [express](https://github.com/visionmedia/express) middleware\n\n## Installation\n\n    ⚡ npm install apiserver\n\n```javascript\nvar ApiServer = require('apiserver')\n```\n## Table Of Contents\n\n* [Methods](#class-method-constructor)\n  * [#()](#class-method-constructor)\n  * [#addModule(version, moduleName, apiModule)](#class-method-addmodule)\n  * [#use(route, middleware)](#class-method-use)\n  * [#listen([port], [callback])](#class-method-listen)\n  * [#close([callback])](#class-method-close)\n* [Modules](#modules)\n  * [Interface](#modules-interface)\n  * [Examples](#modules-examples)\n* [Middleware](#middleware)\n  * [Interface](#middleware-interface)\n  * [Transports](#transports)\n* [Router](#router)\n  * [Interface](#router-interface)\n* [Bundled Middleware](#bundled-middleware)\n  * [JSONTransport](#jsontransport)\n  * [httpAuth](#httpauth)\n  * [mutipartParser](#mutipartparser)\n  * [payloadParser](#payloadparser)\n* [How to contribute](#how-to-contribute)\n* [License](#license)\n\n## Class Method: constructor\n\n### Syntax:\n\n```javascript\nnew ApiServer([options])\n```\n\n### Available Options:\n\n* __port__ - (`Number|String`: defaults to 8080) the server binding port\n* __server__ - (`http(s).Server`: defaults http.Server)\n* __timeout__ - (`Number`: defaults to 15000) milliseconds to wait before arbitrary closing the connection\n* __router__ - (`Object`: defaults to the standard [router](#router)) the routes manager conforms to the [router interface](#router-interface)\n* __standardHeaders__ - (`Object`: below the default) response headers defaults, can be overwritten by the [transport](#transports)\n\n```javascript\n{\n  'cache-control': 'max-age=0, no-cache, no-store, must-revalidate',\n  'expires': 0,\n  'pragma': 'no-cache',\n  'x-server': 'ApiServer v' + ApiServer.version + ' raging on nodejs ' + process.version\n}\n```\n\n### Example:\n\n```javascript\nvar https = require('https'),\n    ApiServer = require('apiserver')\n\napiserver = new ApiServer({\n  port: 80,\n  server: https.createServer(),\n  standardHeaders: {\n    'cache-control': 'max-age=0, no-cache, no-store, must-revalidate',\n    'x-awesome-field': 'awezing value'\n  },\n  timeout: 2000\n})\n```\n\n## Class Method: addModule\n\n### Syntax:\n\n```javascript\nApiServer.prototype.addModule(version, moduleName, apiModule)\n```\n\n### Arguments:\n\n* __version__ - (`String`) the version of the API you want to add your module to, it will be the first part of the url\n* __moduleName__ - (`String`) the name of the module, this will be the second part of your derived routes, after a [case conversion](#modules)\n* __apiModule__ - (`Object`) the module object conform to the [modules interface](#module-interface)\n\n### Examples:\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.addModule('v1', 'user', userModule)\napiserver.addModule('v1', 'pages', pageModule)\napiserver.addModule('v2', 'user', userModule2)\n```\n\n## Class Method: use\n\nAdds a middleware object to the [middleware chain](#middleware-chain).\n\nEach middleware is associated to a `RegExp` used to test the API end-point route. If the route matches the `RegExp` the middleware will be a part of the chain and will be executed.\n\nRead more about middleware [here](#middleware).\n\n### Syntax:\n\n```javascript\nApiServer.prototype.use(route, middleware)\n```\n\n### Arguments:\n\n* __route__ - (`RegExp`) regular expression that the route should match\n* __middleware__ - (`Object`) the middleware object conforms to the [middleware interface](#middleware-interface)\n\n### Examples:\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/./, new MyMiddleWare({ foo: 'bar', bar: true }))\napiserver.use(/(signin|signup)/, ApiServer.payloadParser())\napiserver.use(/^\\/v1\\/files\\/upload$/, ApiServer.multipartParser())\n```\n\n## Class Method: listen\nBind the server to a port\n\n### Syntax:\n\n```javascript\nApiServer.prototype.listen([port], [callback])\n```\n\n### Arguments:\n\n* __port__ - (`Number|String`) overwrite the constructor __port__ parameter\n* __callback__ - (`Function`) called when the port is actually bound to the server\n\n### Example:\n_From this point on, all the examples will take the require statements as assumption_\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.listen(80, function (err) {\n  if (err) {\n    console.error('Something terrible happened: %s', err.message)\n  } else {\n    console.log('Successful bound to port %s', this.port)\n  }\n})\n```\n\n## Class Method: close\nUnbind the server from the current port\n\n### Syntax:\n\n```javascript\nApiServer.prototype.close([callback])\n```\n\n### Arguments:\n\n* __callback__ - (`Function`) called when the port is actually unbound from the server\n\n### Example:\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.listen(80, onListen)\n\nfunction onListen(err) {\n  if (err) {\n    console.error('Something terrible happened: %s', err.message)\n  } else {\n    setTimeout(function () {\n      apiserver.close(onClose)\n    }, 5000)\n  }\n}\n\nfunction onClose() {\n  console.log('port unbound correctly')\n}\n```\n\n# Modules\n\nA module is a set of API __end-points__ grouped in the same __context__:\n\n* __context__: a simple object\n* __end-point__: function/method accessible by the object and scoped within the object\n\n## Modules Interface\n\nEach module method (API end-point) must implement this interface and expect request and response parameters\n\n```javascript\nfunction (request, response)\n```\n\nThe request object is [\"extendend\" ootb](https://github.com/kilianc/node-apiserver/blob/master/lib/apiserver.js#L102]) with the following members:\n\n* __requestedAt__: timestamp of the request\n* __parsedUrl__: a parsed version of the request url\n* __pathname__: the pathname that corresponds to the end-point route\n* __querystring__: the querystring object parsed with [visionmedia/node-querystring](https://github.com/visionmedia/node-querystring)\n\nAs you can see, there is no callback to call, you have to deal directly with the response.\n\nTake a look at your [transport documentation](#transports) and use the right method that ships within the response object. You can also roughly close and write to the response __stream__ in an edge case.\n\n## Modules Examples\n\n### Object literal\n\n```javascript\nvar apiserver = new ApiServer()\n```\n\n```javascript\nvar userModule = {\n  signin: function (request, response) {\n    // rough approach\n    response.writeHead(200)\n    response.end('ok')\n  },\n  signout: function (request, response) {\n    // JSON transport\n    response.serveJSON({ foo: 'bar' })\n  }\n}\n```\n\n```javascript\napiserver.addModule('v1', 'user', userModule)\n```\n\n### Class\n\n```javascript\nvar apiserver = new ApiServer()\n```\n\n```javascript\nvar UserModule = function (options) {\n  this.database = options.database\n  this.serviceName = options.serviceName\n}\n\nUserModule.prototype.signin = function (request, response) {\n  var self = this\n  self.database.searchUser(request.querystring.username, function (err) {\n    if (err) {\n      response.serveJSON({ success: true, err: err.message })\n    } else {\n      response.serveJSON({ success: true, message: 'welcome to ' + self.serviceName })\n    }\n  })\n}\n\nUserModule.prototype.signout = function (request, response) {\n  // you can use the response as usual\n  // a redirect for example\n  response.writeHead(302, {\n    'location': 'http://example.org/logout_suceesful'\n  })\n  response.end()\n}\n```\n\n```javascript\nvar database = /* your db object*/\napiserver.addModule('v1', 'user', new UserModule(database, 'My Awesome Service'))\n```\n\n# Middleware\n\nThe concept of middleware is not new at all, you can find the same pattern in [visionmedia/express](https://github.com/visionmedia/express) in  [mcavage/node-restify](https://github.com/mcavage/node-restify) and in many others. A [middleware](http://en.wikipedia.org/wiki/Middleware) is a piece of software that adds (or patches) a feature into another software. Usually there is a common interface to implement, because the caller software, in this case our __ApiServer__, should know how to interact with the middleware.\n\n_You should check out the [source code](https://github.com/kilianc/node-apiserver/tree/master/lib/middleware) for a large understanding, middleware is relatively easy to code._\n\n## Middleware Chain\n\nThe __ApiServer__ uses [kilianc/node-fnchain](https://github.com/kilianc/node-fnchain) to [execute all the active middleware](https://github.com/kilianc/node-apiserver/blob/master/lib/apiserver.js#L131) and reach the API method (that actually is the last ring of the chain). This means that the order of the execution depends on the order you activated the middleware.\n\nEach middleware can both exit with an error or explicitly stop the chain (not reaching your API method). This is useful in case of a precondition check (auth, sessions, DoS attack filter...), or just because you packed some shared code as middleware which must be executed before your API method.\n\nAt the middleware execution level, the response object is already patched with the default transport methods, so you can use these methods to write and close the response. Is a good practice to leave at the top of the chain the extra transports middleware.\n\n```javascript\n// constructor adds the default transport automatically\nvar apiserver = new ApiServer()\n\n// lets ad first our custom transports\napiserver.use(/\\.xml$/, myXMLTransport())\napiserver.use(/\\.csv$/, myCSVTransport())\napiserver.use(/\\.yml$/, myYAMLTransport())\n\n// now activate our middleware\napiserver.use(/form/, ApiServer.payloadParser())\napiserver.use(/upload/, ApiServer.multipartParser())\n\n...\n```\n\n__The request payload (the `data` event) is paused by default and can be resumed calling `request.resume()` at any level of execution: middleware, module, transport.__ Why? Because you should explicitly accept or refuse a payload, this way you will save memory not buffering useless data.\n\nTake a look at both the [pause](http://nodejs.org/api/all.html#all_request_pause) and [resume](http://nodejs.org/api/all.html#all_request_resume) official docs.\n\n_ApiServer is using [this patch](https://github.com/kilianc/node-buffered-request) to provide a robust buffered pause resume method, so you don't have do deal with the flying chunks after the pause call_\n\n## Middleware Interface\n\nEach middleware must implement this interface.\n\n```javascript\nmodule.exports = function (options) {\n  return function (request, response, next) {\n    // do sometihng async and when you're done call the callback\n    options.count++\n    next()\n  }\n}\n```\n\nA middleware basically, is a function that returns another function, this one must declare 3 paramaters:\n\n* __request__: the server request already extended by the server\n* __response__: the server response already extended by the transports\n* __next__: a callback in the following form `function (err, stop)`\n\nThe `next` callback expects 2 parameters:\n\n* __err__ - (`Error`) an error object that will throw a server error event and will close the response\n* __stop__ - (`Boolean`) a flag that stops the internal chain, that means that your API method will never be called and your middleware should be able to correctly close the response. At this point you already have all the transports available, and you can freely use them.\n\n## Transports\n\nA transport is a particular middleware that \"extends\" the response object. It can provide new methods that allow you to serve your data to the client in different ways. \n\nUsually this is how you send data back to the client:\n\n```javascript\nfunction (request, response) {\n  response.writeHead(200, {\n    'content-type': 'application/json'\n  })\n  response.end(JSON.stringify({ foo: 'bar' }))\n})\n```\n\nThis is for example how the default [JSONTransport](https://github.com/kilianc/node-json-transport) simplify the process\n\n```javascript\nfunction (request, response) {\n  response.serveJSON({ foo: 'bar' })\n})\n```\n\nBasically what a transport does, is to wrap your data around a meaningful format (JSON, JSONP, HTML, XML, CSV, ...) understandable by your clients. It takes care of all the small things that the raw response needs (headers, status codes, buffering, ...)\n\nTransports must be at the top of the middleware chain, in order to allow other middleware to use them.\n\n[JSONTransport](https://github.com/kilianc/node-json-transport) is the default one, is attached before the middleware chain execution and then is available at every level of execution. You don't need to allocate it directly, the server itself will allocate the transport passing as options the __ApiServer__ [constructor](#class-method-constructor) options object.\n\n### Example\n\n```javascript\nmodule.exports = function (options) {\n  function serve<FORMAT>(request, response, data, options) {\n    response.writeHead(200, {\n      'content-type': 'application/<FORMAT>'\n    })\n    response.end(<FORMAT>.stringify(data))\n  }\n  return function (request, response) {\n    // attach some new method to the response\n    response.serve<FORMAT> = serve<FORMAT>.bind(this, request, response)\n  }\n}\n```\n\nwhere `<FORMAT>` is the formatting method of your data.\n\n# Router\n\nApiserver uses [apiserver-router](https://github.com/kilianc/node-apiserver-router) as default router, a fast routing system with integrated caching. It basically translates your API methods names in routes, doing some convenient case conversion.\n\nYou can change the default behavior passing a custom router as `router` option in the Apiserver [constructor](#class-method-constructor).\n\n## Example\n\n```javascript\nvar UserModule = function (options) {\n  this.options = options\n}\n\n// will be translated into /1/random_photo_module/create_album\nUserModule.prototype.createAlbum = function (request, response) { ... }\n\n// will be translated into /1/random_photo_module/upload_photo\nUserModule.prototype.uploadPhoto = function (request, response) { ... }\n\n// private method, skipped by the router\nUserModule.prototype._checkFileExtension = function (request, response) { ... }\n\n```\n\n```javascript\napiserver.addModule('1', 'randomPhotoModule', new UserModule())\n```\n\nN.B. the `moduleName` also will be translated\n\n## Router Interface\n\n```javascript\nnew Router()\nRouter.prototype.update(modules, middlewareList)\nRouter.prototype.get(pathname)\n```\n# Bundled Middleware\n\n## JSONTransport\n\n[JSONTransport](https://github.com/kilianc/node-json-transport) is the default transport bundled with ApiServer and we can call it the real __killer feature__.\n\nIt provides JSON and JSONP that work with both GET / POST methods.\n\n### Examples\n\n```javascript\n// decontextualized API method\nfunction (request, response) {\n  response.serveJSON({ foo: 'bar' })\n})\n```\n\n```javascript\n// decontextualized API method\nfunction (request, response) {\n  response.serveJSON(['foo','bar', ...], {\n    httpStatusCode: 404,\n    httpStatusMessage: 'maybe.. you\\'re lost',\n    headers: {\n      'x-value': 'foo'\n    }\n  })\n})\n```\n```javascript\n// decontextualized API method\nfunction (request, response) {\n  var count = 3\n  var interval = setInterval(function () {\n    if (count === 0) {\n      clearInterval(interval)\n      response.streamJSON()\n    } else {\n      count--\n      response.streamJSON({ foo: 'bar' })\n    }\n  }, 200)\n})\n```\n\nyields\n\n```javascript\n[\n   { \"foo\": \"bar\" },\n   { \"foo\": \"bar\" },\n   { \"foo\": \"bar\" }\n]\n```\n\nRead the full docs [here](https://github.com/kilianc/node-json-transport)\n\n## payloadParser\n\nThe payload parser automatically `resume()` the payload, __buffer it__ and parse it. It only works with __PUT POST OPTIONS__ http methods, because they are the only that can carryout a payload by specs definition.\n\nTwo kinds of payload can be parsed:\n\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThe following attributes will be attached to the request object:\n\n* __body__: an object containing the parsed data\n* __rawBody__: the raw payload as binary [buffer](http://nodejs.org/api/all.html#all_buffer)\n* __parseError__: can be `null` or `Error` in case of parse error\n\n### Syntax\n\n```javascript\nApiServer.payloadParser()\n```\n\n### Example\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/1\\/my_module\\/my_method_api$/, ApiServer.payloadParser())\napiserver.addModule('1', 'myModule', {\n  'my_method_api': function (request, response) {\n    if (request.parseError) {\n      // :(\n      console.error(request.parseError.message)\n    } else {\n      request.body // an object containing the parsed data\n      request.rawBody // contains a binary buffer with your payload\n    }\n  }\n})\n```\n\n## multipartParser\n\nThe multipart-parser automatically `resume()` the payload, and attach it to a [felixge/node-formidable](https://github.com/felixge/node-formidable) `IncomingForm` object. It only works with __PUT POST OPTIONS__ http methods, because they are the only that can carryout a payload by specs definition.\n\nOnly a `multipart/form-data` payload is parsed and the following attribute will be attached to the request object:\n\n* __form__ an IncomingForm object, [read how to deal with it](https://github.com/felixge/node-formidable)\n\n### Syntax\n\n```javascript\nApiServer.multipartParser()\n```\n\n### Example\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/1\\/my_module\\/my_method_api$/, ApiServer.multipartParser())\napiserver.addModule('1', 'myModule', {\n  'my_method_api': function (request, response) {\n    var fields = Object.create(null)\n    request.form.on('field', function (name, value) {\n      fields[name] = value\n    })\n    request.form.on('file', function (name, file) {\n      fields[name] = fs.readFileSync(file.path, 'utf8')\n    })\n    request.form.once('end', function () {\n      // do something with your data\n    })\n  }\n})\n```\n\n## httpAuth\n\nThe httpauth middleware acts as an auth precondition, checking the `authorization` headers sent with the request.\n\nIf the request doesn't pass the authorization check, httpauth [will close the response](https://github.com/kilianc/node-apiserver/blob/refactor/lib/middleware/httpauth.js#L34) using the standard JSONTransport:\n\n```javascript\nresponse.serveJSON(null, {\n  httpStatusCode: 401,\n  headers: { 'www-authenticate': 'Basic realm=\\'' + realm + '\\'' }\n})\n```\n\nThis will trigger a user/password prompt in your browser\n\n### Syntax\n\n```javascript\nApiServer.httpauth([options])\n```\n\n### Options\n* __realm__: (`String`) the name of your service, this is used by the browser when it prompts for username and password\n* __credentials__ - (`Array`) a list of strings (credentials), if your client is a browser you must use the form _username:password_\n* __encode__: (`Boolean`: defaults to false) set to true if your client is a browser (will base64 encode)\n\n### Example\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/1\\/admin\\/.+/, ApiServer.httpauth({\n  realm: 'signin please',\n  credentials: ['foo:password','bar:password', ...],\n  encode: true // we suppose that at the other end of the wire we have a browser\n}))\napiserver.addModule('1', 'admin', {\n  'protectedApi': function (request, response) {\n    // this will executed only if you provide valid credentials\n  }\n})\n```\n\n# How to contribute\n\n__ApiServer__ follows the awesome [Vincent Driessen](http://nvie.com/about/) [branching model](http://nvie.com/posts/a-successful-git-branching-model/).\n\n* You must add new features on the develop branch (and pull-request to it)\n* You must contribute to hot-fixing directly into the master branch (and pull-request to it)\n\nApiServer follows (more or less) the [Felix's Node.js Style Guide](http://nodeguide.com/style.html), your contribution must be consistent with this style.\n\nThe test suite is written on top of [visionmedia/mocha](http://visionmedia.github.com/mocha/) and it took hours of hard work. Please use the tests to check if your contribution is breaking some part of the library and add new tests for each new feature.\n\n    ⚡ npm test\n\nand for your test coverage\n\n    ⚡ make test-cov\n\n## License\n\n_This software is released under the MIT license cited below_.\n\n    Copyright (c) 2010 Kilian Ciuffolo, me@nailik.org. All Rights Reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the 'Software'), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n    \n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"directories":{}},"0.2.1":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver","description":"A ready to go, modular, JSON(P) API Server.","keywords":["api","server","rest","json","jsonp"],"version":"0.2.1","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{"json-transport":"0.1.x","apiserver-router":"0.1.x","buffered-request":"0.1.x","fnchain":"0.1.1","bufferjoiner":"0.1.x","formidable":"1.0.x","qs":"0.4.x","mime":"1.2.x"},"devDependencies":{"mocha":"1.0.x","should":"0.6.1","request":"2.9.x"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"258d359bfc681c1e9407ceb3c6198b9f437f6ce2","tarball":"http://registry.npmjs.org/apiserver/-/apiserver-0.2.1.tgz"},"readme":"# apiserver [![build status](https://secure.travis-ci.org/kilianc/node-apiserver.png?branch=master)](http://travis-ci.org/kilianc/node-apiserver)\n\nA ready to go, modular, multi transport, streaming friendly, JSON(P) API Server.\n\n## Why use ApiServer and not [restify](https://github.com/mcavage/node-restify) or [express](https://github.com/visionmedia/express)?\n\nStrong competitors I guess.\n\n__Express__ targets web applications providing support for templates, views, and all the facilities the you probably need if you're writing a web app. __Restify__ let you \"build \"strict\" API services\" but it's too big and it concentrates on server to server API, that will not be consumed by your browser.\n\n__ApiServer__ is rad. It is a slim, fast, minimal API framework, built to provide you a flexible API consumable both in the browser and from other apps. It ships with JSON, JSONP [__(GET/POST)__](https://github.com/kilianc/node-json-transport) transports and a powerful [fast routing engine](https://github.com/kilianc/node-apiserver-router) OOTB. The source code is small, heavily tested and decoupled. Your API source will be well organized in context objects, allowing you to keep it in a meaningful maintainable way.\n\n### Killer features\n\n* Streaming JSON(P) transport GET/POST browser friendly\n* Fast routing system with cached routes\n* API modules as Objects/Classes\n* Payload paused by default\n* Transports decoupled from the core\n* Router decoupled from the core\n* Compatible with [express](https://github.com/visionmedia/express) middleware\n\n## Installation\n\n    ⚡ npm install apiserver\n\n```javascript\nvar ApiServer = require('apiserver')\n```\n## Table Of Contents\n\n* [Methods](#class-method-constructor)\n  * [#()](#class-method-constructor)\n  * [#addModule(version, moduleName, apiModule)](#class-method-addmodule)\n  * [#use(route, middleware)](#class-method-use)\n  * [#listen([port], [callback])](#class-method-listen)\n  * [#close([callback])](#class-method-close)\n* [Modules](#modules)\n  * [Interface](#modules-interface)\n  * [Examples](#modules-examples)\n* [Middleware](#middleware)\n  * [Interface](#middleware-interface)\n  * [Transports](#transports)\n* [Router](#router)\n  * [Interface](#router-interface)\n* [Bundled Middleware](#bundled-middleware)\n  * [JSONTransport](#jsontransport)\n  * [httpAuth](#httpauth)\n  * [mutipartParser](#mutipartparser)\n  * [payloadParser](#payloadparser)\n* [How to contribute](#how-to-contribute)\n* [License](#license)\n\n# Class Methods\n\n## Class Method: constructor\n\n### Syntax:\n\n```javascript\nnew ApiServer([options])\n```\n\n### Available Options:\n\n* __port__ - (`Number|String`: defaults to 8080) the server binding port\n* __server__ - (`http(s).Server`: defaults http.Server)\n* __timeout__ - (`Number`: defaults to 15000) milliseconds to wait before arbitrary closing the connection\n* __router__ - (`Object`: defaults to the standard [router](#router)) the routes manager conforms to the [router interface](#router-interface)\n* __standardHeaders__ - (`Object`: below the default) response headers defaults, can be overwritten by the [transport](#transports)\n\n```javascript\n{\n  'cache-control': 'max-age=0, no-cache, no-store, must-revalidate',\n  'expires': 0,\n  'pragma': 'no-cache',\n  'x-server': 'ApiServer v' + ApiServer.version + ' raging on nodejs ' + process.version\n}\n```\n\n### Example:\n\n```javascript\nvar https = require('https'),\n    ApiServer = require('apiserver')\n\napiserver = new ApiServer({\n  port: 80,\n  server: https.createServer(),\n  standardHeaders: {\n    'cache-control': 'max-age=0, no-cache, no-store, must-revalidate',\n    'x-awesome-field': 'awezing value'\n  },\n  timeout: 2000\n})\n```\n\n## Class Method: addModule\n\nAdds a new [module](#modules) to to the current API set. It triggers the `router.update` method.\n\n### Syntax:\n\n```javascript\nApiServer.prototype.addModule(version, moduleName, apiModule)\n```\n\n### Arguments:\n\n* __version__ - (`String`) the version of the API you want to add your module to, it will be the first part of the url\n* __moduleName__ - (`String`) the name of the module, this will be the second part of your derived routes, after a [case conversion](#modules)\n* __apiModule__ - (`Object`) the module object conform to the [modules interface](#module-interface)\n\n### Examples:\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.addModule('v1', 'user', userModule)\napiserver.addModule('v1', 'pages', pageModule)\napiserver.addModule('v2', 'user', userModule2)\n```\n\n## Class Method: use\n\nAdds a middleware object to the [middleware chain](#middleware-chain). It triggers the `router.update` method.\n\nEach middleware is associated to a `RegExp` used to test the API end-point route. If the route matches the `RegExp` the middleware will be a part of the chain and will be executed.\n\nRead more about middleware [here](#middleware).\n\n### Syntax:\n\n```javascript\nApiServer.prototype.use(route, middleware)\n```\n\n### Arguments:\n\n* __route__ - (`RegExp`) regular expression that the route should match\n* __middleware__ - (`Object`) the middleware object conforms to the [middleware interface](#middleware-interface)\n\n### Examples:\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/./, new MyMiddleWare({ foo: 'bar', bar: true }))\napiserver.use(/(signin|signup)/, ApiServer.payloadParser())\napiserver.use(/^\\/v1\\/files\\/upload$/, ApiServer.multipartParser())\n```\n\n## Class Method: listen\nBind the server to a port\n\n### Syntax:\n\n```javascript\nApiServer.prototype.listen([port], [callback])\n```\n\n### Arguments:\n\n* __port__ - (`Number|String`) overwrite the constructor __port__ parameter\n* __callback__ - (`Function`) called when the port is actually bound to the server\n\n### Example:\n_From this point on, all the examples will take the require statements as assumption_\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.listen(80, function (err) {\n  if (err) {\n    console.error('Something terrible happened: %s', err.message)\n  } else {\n    console.log('Successful bound to port %s', this.port)\n  }\n})\n```\n\n## Class Method: close\nUnbind the server from the current port\n\n### Syntax:\n\n```javascript\nApiServer.prototype.close([callback])\n```\n\n### Arguments:\n\n* __callback__ - (`Function`) called when the port is actually unbound from the server\n\n### Example:\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.listen(80, onListen)\n\nfunction onListen(err) {\n  if (err) {\n    console.error('Something terrible happened: %s', err.message)\n  } else {\n    setTimeout(function () {\n      apiserver.close(onClose)\n    }, 5000)\n  }\n}\n\nfunction onClose() {\n  console.log('port unbound correctly')\n}\n```\n\n# Class Events\n\n## Class Event: requestEnd\n\nEmitted when an API method closes the response, even with `response.end`.\n\n### Event data\n\n```javascript\napiserver.on('requestEnd', function (url, responseTime) {\n  \n})\n```\n\n  * __url__ (`String`) - the `request.url`\n  * __responseTime__ (`Number`) - how log the API method took for closing the response\n\n## Class Event: timeout\n\nEmitted when an API method exceed the maximum allowed time ([see `timenout` option](#class-method-constructor)), before closing the response.\n\n### Event data\n\n```javascript\napiserver.on('timenout', function (url) {\n\n})\n```\n\n  * __url__ (`String`) - the `request.url`\n\n## Class Event: error\n\nEmitted when a __sync__ error is triggered during the [middleware chain](#middleware-chain) execution, can be both your API, a transport or a simple middleware.\n\n_You still have to deal with async errors_\n\n### Event data\n\n```javascript\napiserver.on('error', function (url, err) {\n  \n})\n```\n\n  * __url__ (`String`) - the `request.url`\n  * __err__ (`Error`) - the error which triggered the event\n\n# Modules\n\nA module is a set of API __end-points__ grouped in the same __context__:\n\n* __context__: a simple object\n* __end-point__: function/method accessible by the object and scoped within the object\n\n## Modules Interface\n\nEach module method (API end-point) must implement this interface and expect request and response parameters\n\n```javascript\nfunction (request, response)\n```\n\nThe request object is [\"extendend\" ootb](https://github.com/kilianc/node-apiserver/blob/master/lib/apiserver.js#L102]) with the following members:\n\n* __requestedAt__: timestamp of the request\n* __parsedUrl__: a parsed version of the request url\n* __pathname__: the pathname that corresponds to the end-point route\n* __querystring__: the querystring object parsed with [visionmedia/node-querystring](https://github.com/visionmedia/node-querystring)\n\nAs you can see, there is no callback to call, you have to deal directly with the response.\n\nTake a look at your [transport documentation](#transports) and use the right method that ships within the response object. You can also roughly close and write to the response __stream__ in an edge case.\n\n## Modules Examples\n\n### Object literal\n\n```javascript\nvar apiserver = new ApiServer()\n```\n\n```javascript\nvar userModule = {\n  signin: function (request, response) {\n    // rough approach\n    response.writeHead(200)\n    response.end('ok')\n  },\n  signout: function (request, response) {\n    // JSON transport\n    response.serveJSON({ foo: 'bar' })\n  }\n}\n```\n\n```javascript\napiserver.addModule('v1', 'user', userModule)\n```\n\n### Class\n\n```javascript\nvar apiserver = new ApiServer()\n```\n\n```javascript\nvar UserModule = function (options) {\n  this.database = options.database\n  this.serviceName = options.serviceName\n}\n\nUserModule.prototype.signin = function (request, response) {\n  var self = this\n  self.database.searchUser(request.querystring.username, function (err) {\n    if (err) {\n      response.serveJSON({ success: true, err: err.message })\n    } else {\n      response.serveJSON({ success: true, message: 'welcome to ' + self.serviceName })\n    }\n  })\n}\n\nUserModule.prototype.signout = function (request, response) {\n  // you can use the response as usual\n  // a redirect for example\n  response.writeHead(302, {\n    'location': 'http://example.org/logout_suceesful'\n  })\n  response.end()\n}\n```\n\n```javascript\nvar database = /* your db object*/\napiserver.addModule('v1', 'user', new UserModule(database, 'My Awesome Service'))\n```\n\n# Middleware\n\nThe concept of middleware is not new at all, you can find the same pattern in [visionmedia/express](https://github.com/visionmedia/express) in  [mcavage/node-restify](https://github.com/mcavage/node-restify) and in many others. A [middleware](http://en.wikipedia.org/wiki/Middleware) is a piece of software that adds (or patches) a feature into another software. Usually there is a common interface to implement, because the caller software, in this case our __ApiServer__, should know how to interact with the middleware.\n\n_You should check out the [source code](https://github.com/kilianc/node-apiserver/tree/master/lib/middleware) for a large understanding, middleware is relatively easy to code._\n\n## Middleware Chain\n\nThe __ApiServer__ uses [kilianc/node-fnchain](https://github.com/kilianc/node-fnchain) to [execute all the active middleware](https://github.com/kilianc/node-apiserver/blob/master/lib/apiserver.js#L131) and reach the API method (that actually is the last ring of the chain). This means that the order of the execution depends on the order you activated the middleware.\n\nEach middleware can both exit with an error or explicitly stop the chain (not reaching your API method). This is useful in case of a precondition check (auth, sessions, DoS attack filter...), or just because you packed some shared code as middleware which must be executed before your API method.\n\nAt the middleware execution level, the response object is already patched with the default transport methods, so you can use these methods to write and close the response. Is a good practice to leave at the top of the chain the extra transports middleware.\n\n```javascript\n// constructor adds the default transport automatically\nvar apiserver = new ApiServer()\n\n// lets ad first our custom transports\napiserver.use(/\\.xml$/, myXMLTransport())\napiserver.use(/\\.csv$/, myCSVTransport())\napiserver.use(/\\.yml$/, myYAMLTransport())\n\n// now activate our middleware\napiserver.use(/form/, ApiServer.payloadParser())\napiserver.use(/upload/, ApiServer.multipartParser())\n\n...\n```\n\n__The request payload (the `data` event) is paused by default and can be resumed calling `request.resume()` at any level of execution: middleware, module, transport.__ Why? Because you should explicitly accept or refuse a payload, this way you will save memory not buffering useless data.\n\nTake a look at both the [pause](http://nodejs.org/api/all.html#all_request_pause) and [resume](http://nodejs.org/api/all.html#all_request_resume) official docs.\n\n_ApiServer is using [this patch](https://github.com/kilianc/node-buffered-request) to provide a robust buffered pause resume method, so you don't have do deal with the flying chunks after the pause call_\n\n## Middleware Interface\n\nEach middleware must implement this interface.\n\n```javascript\nmodule.exports = function (options) {\n  return function (request, response, next) {\n    // do sometihng async and when you're done call the callback\n    options.count++\n    next()\n  }\n}\n```\n\nA middleware basically, is a function that returns another function, this one must declare 3 paramaters:\n\n* __request__: the server request already extended by the server\n* __response__: the server response already extended by the transports\n* __next__: a callback in the following form `function (err, stop)`\n\nThe `next` callback expects 2 parameters:\n\n* __err__ - (`Error`) an error object that will throw a server error event and will close the response\n* __stop__ - (`Boolean`) a flag that stops the internal chain, that means that your API method will never be called and your middleware should be able to correctly close the response. At this point you already have all the transports available, and you can freely use them.\n\n## Transports\n\nA transport is a particular middleware that \"extends\" the response object. It can provide new methods that allow you to serve your data to the client in different ways. \n\nUsually this is how you send data back to the client:\n\n```javascript\nfunction (request, response) {\n  response.writeHead(200, {\n    'content-type': 'application/json'\n  })\n  response.end(JSON.stringify({ foo: 'bar' }))\n})\n```\n\nThis is for example how the default [JSONTransport](https://github.com/kilianc/node-json-transport) simplify the process\n\n```javascript\nfunction (request, response) {\n  response.serveJSON({ foo: 'bar' })\n})\n```\n\nBasically what a transport does, is to wrap your data around a meaningful format (JSON, JSONP, HTML, XML, CSV, ...) understandable by your clients. It takes care of all the small things that the raw response needs (headers, status codes, buffering, ...)\n\nTransports must be at the top of the middleware chain, in order to allow other middleware to use them.\n\n[JSONTransport](https://github.com/kilianc/node-json-transport) is the default one, is attached before the middleware chain execution and then is available at every level of execution. You don't need to allocate it directly, the server itself will allocate the transport passing as options the __ApiServer__ [constructor](#class-method-constructor) options object.\n\n### Example\n\n```javascript\nmodule.exports = function (options) {\n  function serve<FORMAT>(request, response, data, options) {\n    response.writeHead(200, {\n      'content-type': 'application/<FORMAT>'\n    })\n    response.end(<FORMAT>.stringify(data))\n  }\n  return function (request, response) {\n    // attach some new method to the response\n    response.serve<FORMAT> = serve<FORMAT>.bind(this, request, response)\n  }\n}\n```\n\nwhere `<FORMAT>` is the formatting method of your data.\n\n# Router\n\nApiserver uses [apiserver-router](https://github.com/kilianc/node-apiserver-router) as default router, a fast routing system with integrated caching. It basically translates your API methods names in routes, doing some convenient case conversion.\n\nYou can change the default behavior passing a custom router as `router` option in the Apiserver [constructor](#class-method-constructor).\n\n## Example\n\n```javascript\nvar UserModule = function (options) {\n  this.options = options\n}\n\n// will be translated into /1/random_photo_module/create_album\nUserModule.prototype.createAlbum = function (request, response) { ... }\n\n// will be translated into /1/random_photo_module/upload_photo\nUserModule.prototype.uploadPhoto = function (request, response) { ... }\n\n// private method, skipped by the router\nUserModule.prototype._checkFileExtension = function (request, response) { ... }\n\n```\n\n```javascript\napiserver.addModule('1', 'randomPhotoModule', new UserModule())\n```\n\nN.B. the `moduleName` also will be translated\n\n## Router Interface\n\n```javascript\nnew Router()\nRouter.prototype.update(modules, middlewareList)\nRouter.prototype.get(request)\n```\n# Bundled Middleware\n\n## JSONTransport\n\n[JSONTransport](https://github.com/kilianc/node-json-transport) is the default transport bundled with ApiServer and we can call it the real __killer feature__.\n\nIt provides JSON and JSONP that work with both GET / POST methods.\n\n### Examples\n\n```javascript\n// decontextualized API method\nfunction (request, response) {\n  response.serveJSON({ foo: 'bar' })\n})\n```\n\n```javascript\n// decontextualized API method\nfunction (request, response) {\n  response.serveJSON(['foo','bar', ...], {\n    httpStatusCode: 404,\n    httpStatusMessage: 'maybe.. you\\'re lost',\n    headers: {\n      'x-value': 'foo'\n    }\n  })\n})\n```\n```javascript\n// decontextualized API method\nfunction (request, response) {\n  var count = 3\n  var interval = setInterval(function () {\n    if (count === 0) {\n      clearInterval(interval)\n      response.streamJSON()\n    } else {\n      count--\n      response.streamJSON({ foo: 'bar' })\n    }\n  }, 200)\n})\n```\n\nyields\n\n```javascript\n[\n   { \"foo\": \"bar\" },\n   { \"foo\": \"bar\" },\n   { \"foo\": \"bar\" }\n]\n```\n\nRead the full docs [here](https://github.com/kilianc/node-json-transport)\n\n## payloadParser\n\nThe payload parser automatically `resume()` the payload, __buffer it__ and parse it. It only works with __PUT POST OPTIONS__ http methods, because they are the only that can carryout a payload by specs definition.\n\nTwo kinds of payload can be parsed:\n\n* `application/x-www-form-urlencoded`\n* `application/json`\n\nThe following attributes will be attached to the request object:\n\n* __body__: an object containing the parsed data\n* __rawBody__: the raw payload as binary [buffer](http://nodejs.org/api/all.html#all_buffer)\n* __parseError__: can be `null` or `Error` in case of parse error\n\n### Syntax\n\n```javascript\nApiServer.payloadParser()\n```\n\n### Example\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/1\\/my_module\\/my_method_api$/, ApiServer.payloadParser())\napiserver.addModule('1', 'myModule', {\n  'my_method_api': function (request, response) {\n    if (request.parseError) {\n      // :(\n      console.error(request.parseError.message)\n    } else {\n      request.body // an object containing the parsed data\n      request.rawBody // contains a binary buffer with your payload\n    }\n  }\n})\n```\n\n## multipartParser\n\nThe multipart-parser automatically `resume()` the payload, and attach it to a [felixge/node-formidable](https://github.com/felixge/node-formidable) `IncomingForm` object. It only works with __PUT POST OPTIONS__ http methods, because they are the only that can carryout a payload by specs definition.\n\nOnly a `multipart/form-data` payload is parsed and the following attribute will be attached to the request object:\n\n* __form__ an IncomingForm object, [read how to deal with it](https://github.com/felixge/node-formidable)\n\n### Syntax\n\n```javascript\nApiServer.multipartParser()\n```\n\n### Example\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/1\\/my_module\\/my_method_api$/, ApiServer.multipartParser())\napiserver.addModule('1', 'myModule', {\n  'my_method_api': function (request, response) {\n    var fields = Object.create(null)\n    request.form.on('field', function (name, value) {\n      fields[name] = value\n    })\n    request.form.on('file', function (name, file) {\n      fields[name] = fs.readFileSync(file.path, 'utf8')\n    })\n    request.form.once('end', function () {\n      // do something with your data\n    })\n  }\n})\n```\n\n## httpAuth\n\nThe httpauth middleware acts as an auth precondition, checking the `authorization` headers sent with the request.\n\nIf the request doesn't pass the authorization check, httpauth [will close the response](https://github.com/kilianc/node-apiserver/blob/refactor/lib/middleware/httpauth.js#L34) using the standard JSONTransport:\n\n```javascript\nresponse.serveJSON(null, {\n  httpStatusCode: 401,\n  headers: { 'www-authenticate': 'Basic realm=\\'' + realm + '\\'' }\n})\n```\n\nThis will trigger a user/password prompt in your browser\n\n### Syntax\n\n```javascript\nApiServer.httpauth([options])\n```\n\n### Options\n* __realm__: (`String`) the name of your service, this is used by the browser when it prompts for username and password\n* __credentials__ - (`Array`) a list of strings (credentials), if your client is a browser you must use the form _username:password_\n* __encode__: (`Boolean`: defaults to false) set to true if your client is a browser (will base64 encode)\n\n### Example\n\n```javascript\nvar apiserver = new ApiServer()\napiserver.use(/1\\/admin\\/.+/, ApiServer.httpauth({\n  realm: 'signin please',\n  credentials: ['foo:password','bar:password', ...],\n  encode: true // we suppose that at the other end of the wire we have a browser\n}))\napiserver.addModule('1', 'admin', {\n  'protectedApi': function (request, response) {\n    // this will executed only if you provide valid credentials\n  }\n})\n```\n\n# How to contribute\n\n__ApiServer__ follows the awesome [Vincent Driessen](http://nvie.com/about/) [branching model](http://nvie.com/posts/a-successful-git-branching-model/).\n\n* You must add a new feature on his own topic branch\n* You must contribute to hot-fixing directly into the master branch (and pull-request to it)\n\nApiServer follows (more or less) the [Felix's Node.js Style Guide](http://nodeguide.com/style.html), your contribution must be consistent with this style.\n\nThe test suite is written on top of [visionmedia/mocha](http://visionmedia.github.com/mocha/) and it took hours of hard work. Please use the tests to check if your contribution is breaking some part of the library and add new tests for each new feature.\n\n    ⚡ npm test\n\nand for your test coverage\n\n    ⚡ make test-cov\n\n## License\n\n_This software is released under the MIT license cited below_.\n\n    Copyright (c) 2010 Kilian Ciuffolo, me@nailik.org. All Rights Reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the 'Software'), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n    \n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.2.2":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver","description":"A ready to go, modular, JSON(P) API Server.","keywords":["api","server","rest","json","jsonp"],"version":"0.2.2","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{"json-transport":"0.1.x","apiserver-router":"0.2.x","buffered-request":"0.1.x","fnchain":"0.1.1","bufferjoiner":"0.1.x","formidable":"1.0.x","qs":"0.4.x","mime":"1.2.x"},"devDependencies":{"mocha":"1.0.x","should":"0.6.1","request":"2.9.x"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cb622c3afca01bd6543139d6c4bb94b2babd4726","tarball":"http://registry.npmjs.org/apiserver/-/apiserver-0.2.2.tgz"},"readme":"","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]}},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"time":{"modified":"2012-06-16T16:53:14.410Z","created":"2011-10-15T15:03:33.220Z","0.1.1":"2011-10-15T15:03:35.267Z","0.1.2":"2011-10-15T15:28:12.451Z","0.1.3":"2012-02-06T12:55:51.874Z","0.2.0":"2012-05-01T02:42:27.501Z","0.2.1":"2012-05-22T14:57:27.656Z","0.2.2":"2012-06-16T16:53:14.410Z"},"repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver.git"},"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"_attachments":{"apiserver-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ffFOarYiKcqewL7GecIYYw==","length":4376,"stub":true},"apiserver-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-2M303f2mFwCOw0soumJaxw==","length":34101,"stub":true},"apiserver-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pri4LqO1bioNG7K+YfKTqQ==","length":34090,"stub":true},"apiserver-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0YgF3FmSlfvMrmnI8WV3TQ==","length":4527,"stub":true},"apiserver-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5ziQOejAuK9M4yNiVx0HNA==","length":4470,"stub":true},"apiserver-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TBrsFll3PO8DciscZhJ94Q==","length":4465,"stub":true}}}},
{"id":"apiserver-router","key":"apiserver-router","value":{"rev":"9-3aefae697d015d64838abae1bf39ba59"},"doc":{"_id":"apiserver-router","_rev":"9-3aefae697d015d64838abae1bf39ba59","name":"apiserver-router","description":"A fast API router with integrated caching system","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver-router","description":"A fast API router with integrated caching system","keywords":["apiserver","cache","router"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver-router.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{},"devDependencies":{"mocha":"1.0.x","should":"0.6.1"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver-router@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8b9ad97d2fa33860e16df8eae2d8b4a3849b8b51","tarball":"http://registry.npmjs.org/apiserver-router/-/apiserver-router-0.1.0.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.1.1":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver-router","description":"A fast API router with integrated caching system","keywords":["apiserver","cache","router"],"version":"0.1.1","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver-router.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{},"devDependencies":{"mocha":"1.0.x","should":"0.6.1"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver-router@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"da4c7fe22f3b98af673185b5b2300de02eab2648","tarball":"http://registry.npmjs.org/apiserver-router/-/apiserver-router-0.1.1.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.2.0":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver-router","description":"A fast API router with integrated caching system","keywords":["apiserver","cache","router"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver-router.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{"xregexp":"2.0.x"},"devDependencies":{"mocha":"1.0.x","should":"0.6.1"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver-router@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"aa2584d5ebc457b2bfa63119288e03a47a12ab11","tarball":"http://registry.npmjs.org/apiserver-router/-/apiserver-router-0.2.0.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.2.1":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"apiserver-router","description":"A fast API router with integrated caching system","keywords":["apiserver","cache","router"],"version":"0.2.1","repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver-router.git"},"main":"./","scripts":{"test":"make test"},"engines":{"node":">= v0.6.x"},"dependencies":{"xregexp":"2.0.x"},"devDependencies":{"mocha":"1.0.x","should":"0.6.1"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"apiserver-router@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ddbe2e5993f18757c943790f9520fc86cb6faa13","tarball":"http://registry.npmjs.org/apiserver-router/-/apiserver-router-0.2.1.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]}},"readme":"# apiserver-router [![build status](https://secure.travis-ci.org/kilianc/node-apiserver-router.png?branch=master)](http://travis-ci.org/kilianc/node-apiserver-router)\n\nA fast API router with integrated caching system bundled with [ApiServer](https://github.com/kilianc/node-apiserver)\n\n## Installation\n\n    ⚡ npm install apiserver-router\n\n```javascript\nvar Router = require('apiserver-router')\n```\n\n## Example\n\n```javascript\nvar UserModule = function (options) {\n  this.options = options\n}\n\n// will be translated into /1/random_photo_module/create_album\nUserModule.prototype.createAlbum = function (request, response) { ... }\n\n// will be translated into /1/random_photo_module/upload_photo\nUserModule.prototype.uploadPhoto = function (request, response) { ... }\n\n// private method, skipped\nUserModule.prototype._checkFileExtension = function (request, response) { ... }\n\n```\n\n```javascript\nrouter.update({ '1': { randomPhotoModule: UserModule } })\nrouter.get('/1/random_photo_module/upload_photo') // returns the associated chain\n```\n\n## Class Method: constructor\n\n### Syntax:\n\n```javascript\nnew Router()\n```\n\n## Class Method: update\n\nBuilds and caches the routes. You must call it every time a middleware or a module changes.\n\n### Syntax:\n\n```javascript\nRouter.prototype.update(modules[, middlewareList])\n```\n\n### Arguments:\n\n* __modules__ - (`Object`) an hashtable of [API modules](https://github.com/kilianc/node-apiserver/tree/master#modules)\n* __middlewareList__ - (`Array`) a list of [middleware](https://github.com/kilianc/node-apiserver/tree/master#middleware)\n\n### Example:\n\n```javascript\n...\nvar router = new Router()\nrouter.update({\n  v1: {\n    user: {\n      signin: function (request, response) { /* function body */ },\n      signout: function (request, response) { /* function body */ },\n      signup: function (request, response) { /* function body */ }\n    }\n  }\n}, [\n  { route: /signup/, handle: randomMiddleware1 },\n  { route: /sign/, handle: randomMiddleware2 }\n])\n...\n```\n\n## Class Method: get\n\nThis method returns a list of functions that will be executed with [fnchain](https://github.com/kilianc/node-fnchain). The list will contain all the middleware active for the API endpoint reached by `pathname` and as last ring of the chain the API method to execute.\n\n### Syntax:\n\n```javascript\nRouter.prototype.get(pathname)\n```\n\n### Arguments:\n\n* __pathname__ - (`String`)\n\n### Example:\n\n```javascript\n...\nrouter.get('/v1/users/signup')\n...\n```\n\n# How to contribute\n\nThis repository follows (more or less) the [Felix's Node.js Style Guide](http://nodeguide.com/style.html), your contribution must be consistent with this style.\n\nThe test suite is written on top of [visionmedia/mocha](http://visionmedia.github.com/mocha/) and it took hours of hard work. Please use the tests to check if your contribution breaks some part of the library and add new tests for each new feature.\n\n    ⚡ npm test\n\nand for your test coverage\n\n    ⚡ make test-cov\n\n## License\n\n_This software is released under the MIT license cited below_.\n\n    Copyright (c) 2010 Kilian Ciuffolo, me@nailik.org. All Rights Reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the 'Software'), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n    \n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"time":{"modified":"2012-06-16T16:43:28.090Z","created":"2012-05-01T02:58:48.498Z","0.1.0":"2012-05-01T02:58:49.946Z","0.1.1":"2012-05-22T14:51:28.461Z","0.2.0":"2012-06-03T15:17:34.199Z","0.2.1":"2012-06-16T16:43:28.090Z"},"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"repository":{"type":"git","url":"git://github.com/kilianc/node-apiserver-router.git"},"_attachments":{"apiserver-router-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-8G5enJ1djg3yh1gefReaIQ==","length":3612,"stub":true},"apiserver-router-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-F6wQwYcQwmRTzvW2+1grFQ==","length":27213,"stub":true},"apiserver-router-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-liJF1Qp0ZIfqbkOBqWUqOg==","length":17789,"stub":true},"apiserver-router-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XC//5/30rnrx4xnrXcMh1A==","length":17695,"stub":true}}}},
{"id":"apitree","key":"apitree","value":{"rev":"5-4cbeb652d6ccc30f7e02d583140bbb41"},"doc":{"_id":"apitree","_rev":"5-4cbeb652d6ccc30f7e02d583140bbb41","name":"apitree","description":"Creates a SocketStream-style API tree from a file system directory","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"author":{"name":"Andrey Tarantsov","email":"andreyvit@me.com"},"name":"apitree","description":"Creates a SocketStream-style API tree from a file system directory","version":"1.0.0","homepage":"https://github.com/andreyvit/apitree.js","repository":{"type":"git","url":"git://github.com/andreyvit/apitree.js.git"},"bugs":{"name":"http://github.com/andreyvit/apitree.js/issues"},"main":"lib/apitree.js","directories":{"lib":"lib","example":"example"},"scripts":{"test":"./node_modules/.bin/mocha"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"mocha":">=0.3.1"},"_npmUser":{"name":"andreyvit","email":"andreyvit@me.com"},"_id":"apitree@1.0.0","_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.5","_defaultsLoaded":true,"dist":{"shasum":"664e5480051ee48d36f8cee0997163559fd93bcd","tarball":"http://registry.npmjs.org/apitree/-/apitree-1.0.0.tgz"},"maintainers":[{"name":"andreyvit","email":"andreyvit@me.com"}]},"1.1.0":{"author":{"name":"Andrey Tarantsov","email":"andreyvit@me.com"},"name":"apitree","description":"Creates a SocketStream-style API tree from a file system directory","version":"1.1.0","homepage":"https://github.com/andreyvit/apitree.js","repository":{"type":"git","url":"git://github.com/andreyvit/apitree.js.git"},"bugs":{"name":"http://github.com/andreyvit/apitree.js/issues"},"main":"lib/apitree.js","directories":{"lib":"lib","example":"example"},"scripts":{"test":"./node_modules/.bin/mocha"},"engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{"mocha":"~1.0","coffee-script":"~1.3"},"_npmUser":{"name":"andreyvit","email":"andreyvit@me.com"},"_id":"apitree@1.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5815bb5beeb2a84dadf6e241ccc52e003f1c556f","tarball":"http://registry.npmjs.org/apitree/-/apitree-1.1.0.tgz"},"readme":"apitree.js\n===========\n\nNode.js module to create a SocketStream-style API tree from a file system directory.\n\n\nInstallation\n------------\n\n    npm install apitree\n\n\nUsage\n-----\n\nCall `createApiTree` to load all files in the given directory (and its subdirectories) and return an object, such that `returnedObject.foo.bar.boz.fubar` equals to exported function `fubar` of file `boz` in subdirectory `foo/bar` of the given directory. (Some of the described details are customizable via optional callbacks.)\n\nExample:\n\n    var apitree = require('apitree');\n    var path    = require('path');\n\n    var api = apitree.createApiTree(path.join(__dirname, 'apiroot'))\n\n    api.somefile.func1(42);\n    api.sub.folder.anotherfile.func2(24);\n\ncreateApiTree function accepts 2 arguments:\n\n    apitree.createApiTree(directory, options)\n\nwhere options is an optional object with 3 possible keys:\n\n* `options.loadItem(path)` loads the contents of file at `path`; returns either `null` or an object that will be merged into the tree; the default value is `require`.\n* `options.filter(name, names)` determines whether given file should be processed or ignored; other names from the same directory are provided as the second argument; the default implementation returns true for .js files and files with a registered extension in require.extensions which don't have corresponding .js files. (Exludes .json files)\n* `options.nameToKey(name)` returns a key to use in the tree object for the given file or folder name; the default implementation strips the file extension and replaces any non-identifier characters with underscores.\n\nAdditionally, `options.readdirSync(directory)` and `options.isDirectory(path)` can be provided to override the standard behavior of reading from the file system.\n\n\nSomewhat more realistic example\n-------------------------------\n\nSee example/ directory. In CoffeeScript:\n\n    global.DB =\n      put: (collection, object) ->\n        @[collection].push object\n        console.log \"Added to #{collection}: #{JSON.stringify(object)}\"\n\n    path = require 'path'\n    global.S = require('apitree').createApiTree(path.join(__dirname, 'server'))\n\n    S.app.init()\n    userId = S.users.create(name: 'admin', password: 'admin123')\n    postId = S.blog.posts.publish(authorId: userId, title: \"Hello!\", body: \"Hey! This is my first post.\")\n    S.blog.comments.publish(postId: postId, author: \"Random Visitor\", body: \"Very excited about your new blog.\")\n    S.blog.comments.publish(postId: postId, author: \"spa.m@mer.go.ddam.it\", body: \"Send Your Name, Address...\")\n\nexample/server/app.coffee:\n\n    exports.init = ->\n      DB.users    = []\n      DB.posts    = []\n      DB.comments = []\n\nexample/server/users.coffee:\n\n    exports.create = ({ name, password }) ->\n      user = { name, password, id: DB.users.length }\n      DB.put 'users', user\n      user.id\n\nexample/server/blog/posts.coffee:\n\n    exports.publish = ({authorId, title, body}) ->\n      post = { authorId, title, body, id: DB.posts.length }\n      DB.put 'posts', post\n      post.id\n\nexample/server/blog/comments.coffee:\n\n    exports.publish = ({postId, author, body}) ->\n      comment = { postId, author, body, id: DB.comments.length }\n      DB.put 'comments', comment\n      comment.id\n\n\nSpec\n----\n\nUses mocha, run `npm test` to execute tests.\n\n    API tree\n        when given an empty folder\n          ✓ should return an empty tree\n        when given a folder with a single file\n          ✓ should put the file node under the tree root\n          ✓ should strip the extension when naming the tree node\n          ✓ should put the file's contents under its node\n        when given a file and a subfolder\n          ✓ should put the file and subfolder nodes together under the tree root\n        when given a file and a subfolder which have the same name after stripping extensions\n          ✓ should merge the file and the subfolder into a single node under the tree root\n        when given a folder hierarchy with nested subfolders\n          ✓ should reproduce the folder hierarachy inside the API tree\n        loadItem callback\n          ✓ should be used to obtain file contents\n        nameToKey callback\n          ✓ should accept file name as the only argument\n          ✓ should be used to translate file names into tree keys\n          ✓ should be used to translate subfolder names into tree keys\n          ✓ should not be used to modify keys returned by loadItem\n        default nameToKey callback\n          ✓ should strip file extension\n          ✓ should replace any non-identifier characters with underscores\n          ✓ should replace runs of multiple non-identifier characters with a single underscore\n        filter callback\n          ✓ should accept file name as the first argument\n          ✓ should accept the list of all file names in the same folder as the second argument\n          ✓ should be used to choose which files to process\n          ✓ should have no effect on which folders are processed\n        default filter callback\n          ✓ should include .js files\n          ✓ should include .coffee files that don't have corresponding .js files\n          ✓ should include registered extension files that don't have corresponding .js files\n          ✓ should only include .js file when both .js and .coffee files exist\n          ✓ should only include .js file when both registered extension file and .js files exist\n          ✓ should not include any other files\n\n    ✔ 25 tests complete (47ms)\n\n\nLicense\n-------\n\nMIT license. Copyright 2011–2012, [Andrey Tarantsov](andrey@tarantsov.com).\n","maintainers":[{"name":"andreyvit","email":"andreyvit@me.com"}]}},"maintainers":[{"name":"andreyvit","email":"andreyvit@me.com"}],"time":{"modified":"2012-07-17T18:38:25.525Z","created":"2011-12-13T21:31:53.281Z","1.0.0":"2011-12-13T21:31:55.926Z","1.1.0":"2012-07-17T18:38:25.525Z"},"author":{"name":"Andrey Tarantsov","email":"andreyvit@me.com"},"repository":{"type":"git","url":"git://github.com/andreyvit/apitree.js.git"},"_attachments":{"apitree-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-YVYTmLNqPb+6E4QXLm57YQ==","length":6766,"stub":true},"apitree-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ww78u7eWn4UmtjqLhDhwKw==","length":10240,"stub":true}}}},
{"id":"apn","key":"apn","value":{"rev":"75-39baf78898d24ed3803df97d0d564370"},"doc":{"_id":"apn","_rev":"75-39baf78898d24ed3803df97d0d564370","name":"apn","description":"A Node.js module for interfacing with the Apple Push Notification service.","dist-tags":{"stable":"1.2.4","latest":"1.2.4","beta":"1.2.0"},"versions":{"1.1.1":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.1","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_id":"apn@1.1.1","_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.1.1.tgz"},"directories":{}},"1.0.6":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.6","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0 <0.4.0"},"_id":"apn@1.0.6","_nodeSupported":false,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.6.tgz"},"directories":{}},"1.1.0":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.0","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_id":"apn@1.1.0","_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.1.0.tgz"},"directories":{}},"1.0.5":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.5","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0 <0.4.0"},"_id":"apn@1.0.5","_nodeSupported":false,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.5.tgz"},"directories":{}},"1.0.4":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.4","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0 <0.4.0"},"_id":"apn@1.0.4","_nodeSupported":false,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.4.tgz"},"directories":{}},"1.0.3":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.3","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0"},"_id":"apn@1.0.3","_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.3.tgz"},"directories":{}},"1.0.2":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.2","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0"},"_id":"apn@1.0.2","_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.2.tgz"},"directories":{}},"1.0.1":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.1","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0"},"_id":"apn@1.0.1","_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.1.tgz"},"directories":{}},"1.0.0":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.0","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"lib/apn","repository":{"type":"git","url":"http://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0"},"_id":"apn@1.0.0","_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.5.0-pre","dist":{"tarball":"http://registry.npmjs.org/apn/-/apn-1.0.0.tgz"},"directories":{}},"1.1.2":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.2","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/argon/.npm/apn/1.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apn@1.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"32f8440ff9a725b720d7f6e7439b58ce9977cf41","tarball":"http://registry.npmjs.org/apn/-/apn-1.1.2.tgz"},"scripts":{},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}],"directories":{}},"1.0.7":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.0.7","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.2.0 <0.4.0"},"_npmJsonOpts":{"file":"/Users/argon/.npm/apn/1.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apn@1.0.7","dependencies":{},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"261720bb0b955c67be7cefecc925c71c0364e6bf","tarball":"http://registry.npmjs.org/apn/-/apn-1.0.7.tgz"},"scripts":{},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}],"directories":{}},"1.1.3":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.3","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"argon","email":"argon@mkbot.net"},"_id":"apn@1.1.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"90a138eb0076d608a3aa9f0eb8fd5828c2ef0eb1","tarball":"http://registry.npmjs.org/apn/-/apn-1.1.3.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.1.4":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.4","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"argon","email":"argon@mkbot.net"},"_id":"apn@1.1.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"711757b8c15a5a25b88d171ba118a1cff3be1db9","tarball":"http://registry.npmjs.org/apn/-/apn-1.1.4.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.1.5":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.5","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"argon","email":"argon@mkbot.net"},"_id":"apn@1.1.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"dde32235e1364be8d33928c543bd1e73a9bd513a","tarball":"http://registry.npmjs.org/apn/-/apn-1.1.5.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.1.6":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.6","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"argon","email":"argon@mkbot.net"},"_id":"apn@1.1.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"520d801520e6aaa0a1b62ae06e4ae1d9d8d991a0","tarball":"http://registry.npmjs.org/apn/-/apn-1.1.6.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.1.7":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.1.7","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"argon","email":"argon@mkbot.net"},"_id":"apn@1.1.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e8dac016e5c8837a0eac0aba598f054d08b17ff7","tarball":"http://registry.npmjs.org/apn/-/apn-1.1.7.tgz"},"readme":"#node-apn\n\nA Node.js module for interfacing with the Apple Push Notification service.\n\n## Features\n\n- Maintains a connection to the server to maximise notification batching\n- Enhanced binary interface support with error handling\n- Automatically sends unsent notifications if an error occurs\n- Feedback service support\n\n## Installation\n\nVia [npm][]:\n\n\t$ npm install apn\n\t\nAs a submodule of your project\n\n\t$ git submodule add http://github.com/argon/node-apn.git apn\n\t$ git submodule update --init\n\n## Usage\n### Load in the module\n\n\tvar apns = require('apn');\n\n### Exported Objects\n- Connection\n- Notification\n- Device\n- Feedback\n- errors\n\n### Connecting\nCreate a new connection to the gateway server using a dictionary of options. The defaults are listed below:\n\n\tvar options = {\n\t\tcert: 'cert.pem',                 /* Certificate file */\n\t\tcertData: null,                   /* Optional: if supplied uses this instead of Certificate File */\n\t\tkey:  'key.pem',                  /* Key file */\n\t\tkeyData: null,                    /* Optional: if supplied uses this instead of Key file */\n\t\tpassphrase: null,                 /* Optional: A passphrase for the Key file */\n\t\tgateway: 'gateway.push.apple.com',/* gateway address */\n\t\tport: 2195,                       /* gateway port */\n\t\tenhanced: true,                   /* enable enhanced format */\n\t\terrorCallback: undefined,         /* Callback when error occurs */\n\t\tcacheLength: 5                    /* Number of notifications to cache for error purposes */\n\t};\n\n\tvar apnsConnection = new apns.Connection(options);\n\n### Sending a notification\nTo send a notification first create a `Device` object. Pass it the device token as either a hexadecimal string, or alternatively as a `Buffer` object containing the binary token, setting the second argument to `false`.\n\n\tvar myDevice = new apns.Device(token /*, ascii=true*/);\n\nNext create a notification object and set parameters. See the [payload documentation][pl] for more details\n\n\tvar note = new apns.Notification();\n\t\n\tnote.badge = 3;\n\tnote.sound = \"ping.aiff\";\n\tnote.alert = \"You have a new message\";\n\tnote.payload = {'messageFrom': 'Caroline'};\n\tnote.device = myDevice;\n\t\n\tapnsConnection.sendNotification(note);\n\t\nThe above options will compile the following dictionary to send to the device:\n\n\t{\"messageFrom\":\"Caroline\",\"aps\":{\"badge\":3,\"sound\":\"ping.aiff\",\"alert\":\"You have a new message\"}}\n\t\n\\* N.B.: If you wish to send notifications containing emoji or other multi-byte characters you will need to set `note.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\t\n### Handling Errors\n\nIf the enhanced binary interface is enabled and an error occurs when sending a message then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments.\n\n1. The error number as returned from Apple. This can be compared to the predefined values in the `Errors` object.\n1. The notification object as it existed when the notification was converted and sent to the server.\n\n\\* N.B.: The `cacheLength` option specifies the number of sent notifications which will be cached for error handling purposes. At present if more than the specified number of notifications have been sent between the incorrect notification being sent and the error being received then no resending will occur. This is only envisaged within very high volume environments and a higher cache number might be desired.\n### Setting up the feedback service\n\nApple recommends checking the feedback service periodically for a list of devices for which there were failed delivery attempts.\n\nUsing the `Feedback` object it is possible to periodically query the server for the list. You should provide a function which will accept two arguments, the `time` returned by the server (epoch time) and a `Device` object containing the device token. You can also set the query interval in seconds. Again the default options are shown below.\n\n\tvar options = {\n\t\tcert: 'cert.pem',                   /* Certificate file */\n\t\tcertData: null,                     /* Certificate file contents */\n\t\tkey:  'key.pem',                    /* Key file */\n\t\tkeyData: null,                      /* Key file contents */\n\t\tpassphrase: null,                   /* Optional: A passphrase for the Key file */\n\t\taddress: 'feedback.push.apple.com', /* feedback address */\n\t\tport: 2196,                         /* feedback port */\n\t\tfeedback: false,                    /* enable feedback service, set to callback */\n\t\tinterval: 3600                      /* interval in seconds to connect to feedback service */\n\t};\n\n\tvar feedback = new apns.Feedback(options);\n\n## Converting your APNs Certificate\n\nAfter requesting the certificate from Apple export your private key as a .p12 file and download the .cer file from the iOS Provisioning Portal.\n\nNow in the directory containing cert.cer and key.p12 execute the following commands to generate your .pem files:\n\n\t$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem\n\t$ openssl pkcs12 -in key.p12 -out key.pem -nodes\n\t\nIf you are using a development certificate you may wish to name them differently to enable fast switching between development and production. The filenames are configurable within the module options, so feel free to name them something more appropriate.\n\n## Credits\n\nWritten and maintained by [Andrew Naylor][mphys].\n\nContributors: [Ian Babrou][bobrik], [dgthistle][dgthistle], [Keith Larsen][keithnlarsen], [Mike P][mypark]\n\nSpecial thanks to [Ben Noordhuis][bnoordhuis] for `invoke_after` code.\n\n## License\n\nReleased under the MIT License\n\nCopyright (c) 2010 Andrew Naylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[pl]: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1 \"Local and Push Notification Programming Guide: Apple Push Notification Service\"\n[mphys]: http://mphys.com\n[bnoordhuis]: http://bnoordhuis.nl\n[npm]: https://github.com/isaacs/npm\n[bobrik]: http://bobrik.name\n[dgthistle]: https://github.com/dgthistle\n[keithnlarsen]: https://github.com/keithnlarsen\n[mypark]: https://github.com/mypark\n\n## Changelog\n\n1.1.7:\n* Fixes a problem with sockets being closed on transmission error causing EPIPE errors in node.\n* Issues #29, #30\n\n1.1.6:\n* Fixes a regression from v1.1.5 causing connections to stall and messages to not be sent.\n\n1.1.5:\n\n* Feature: Certificate and Key data can be passed directly when creating a new connection instead of providing a file name on disk. (See: `certData` and `keyData` options)\n* Deliver whole write buffer if the socket is ready.\n* Fixed some global memory leaks.\n* Tidied up some code formatting glitches flagged by jslint\n* Fixes #16, #17, #18, #19, #20\n\n1.1.4:\n\n* Fixes #15: Sending unified emoji via apn; Added encoding parameter when sending notification\n\n1.1.3:\n\n* Fixes #11,#12,#13,#14: Ensure delivery of notifications to Apple even under heavy load.\n\n1.1.2:\n\n* Fixes #9, Addresses an issue if the socket disconnects with queued notifications it would be reinitialised before its teardown is completed leaving the system in an undefined state.\n\n1.1.1:\n\n* Fixes issue #6 where a socket emitting an error could bring down the whole node instance as the exception is uncaught.\n\n1.1.0:\n\n* First shot at node-0.4.0 compatibility with new tls API.\n* Fixed a bug with parsing device token which could cause an out-of-bounds error.\n\n1.0.4:\n\n* The 1.0.x tree is now a maintenance branch as the TLS API used has been deprecated as of node 0.4.0\n* Changed package.json to specify the inoperability of this version with node > 0.4.0\n\n1.0.3:\n\n* Fixes a typo in the documentation in this very file\n\n1.0.2:\n\n* Fixes critical issue with error callback not firing (Issue #1)\n\n1.0.1:\n\n* Moved some object methods into the prototype to save memory\n* Tidied up some connecting code\n* Introduced an `index.js` to make module loading tidier\n* Fixed a couple of typos. \n\n1.0.0: \n \n* Well I created a module; Version 0.0.0 had no code, and now it does, and it works, so that's pretty neat, right?\n","maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.2.0":{"name":"apn","description":"An interface to the Apple Push Notification service for Node.js","version":"1.2.0","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","bugs":{"email":"argon@mkbot.net","url":"https://github.com/argon/node-apn/issues"},"repository":{"type":"git","url":"git://github.com/argon/node-apn.git"},"dependencies":{"q":">=0.8.5"},"engines":{"node":">= 0.6.6"},"license":"MIT","_npmUser":{"name":"argon","email":"argon@mkbot.net"},"_id":"apn@1.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"926132276e3afd093ad745d256c1ee7be8b22b8d","tarball":"http://registry.npmjs.org/apn/-/apn-1.2.0.tgz"},"readme":"#node-apn\n\nA Node.js module for interfacing with the Apple Push Notification service.\n\n## Features\n\n- Maintains a connection to the server to maximise notification batching\n- Enhanced binary interface support with error handling\n- Automatically sends unsent notifications if an error occurs\n- Feedback service support\n\n## Installation\n\nVia [npm][]:\n\n\t$ npm install apn\n\t\nAs a submodule of your project (you will also need to install [q][q])\n\n\t$ git submodule add http://github.com/argon/node-apn.git apn\n\t$ git submodule update --init\n\n## Usage\n### Load in the module\n\n\tvar apns = require('apn');\n\n### Exported Objects\n- Connection\n- Notification\n- Device\n- Feedback\n- Errors\n\n### Connecting\nCreate a new connection to the gateway server using a dictionary of options. The defaults are listed below:\n\n\tvar options = {\n\t\tcert: 'cert.pem',                 /* Certificate file path */\n\t\tcertData: null,                   /* String or Buffer containing certificate data, if supplied uses this instead of cert file path */\n\t\tkey:  'key.pem',                  /* Key file path */\n\t\tkeyData: null,                    /* String or Buffer containing key data, as certData */\n\t\tpassphrase: null,                 /* A passphrase for the Key file */\n\t\tca: null\t\t\t\t\t\t  /* String or Buffer of CA data to use for the TLS connection */\n\t\tgateway: 'gateway.push.apple.com',/* gateway address */\n\t\tport: 2195,                       /* gateway port */\n\t\tenhanced: true,                   /* enable enhanced format */\n\t\terrorCallback: undefined,         /* Callback when error occurs function(err,notification) */\n\t\tcacheLength: 100                  /* Number of notifications to cache for error purposes */\n\t};\n\n\tvar apnsConnection = new apns.Connection(options);\n\t\n**Important:** In a development environment you must set `gateway` to `gateway.sandbox.push.apple.com`.\n\n### Sending a notification\nTo send a notification first create a `Device` object. Pass it the device token as either a hexadecimal string, or alternatively as a `Buffer` object containing the token in binary form.\n\n\tvar myDevice = new apns.Device(token);\n\nNext, create a notification object and set parameters. See the [payload documentation][pl] for more details.\n\n\tvar note = new apns.Notification();\n\t\n\tnote.expiry = 60;\n\tnote.badge = 3;\n\tnote.sound = \"ping.aiff\";\n\tnote.alert = \"You have a new message\";\n\tnote.payload = {'messageFrom': 'Caroline'};\n\tnote.device = myDevice;\n\t\n\tapnsConnection.sendNotification(note);\n\t\nAs of version 1.2.0 it is also possible to use a set of methods provided by Notification object (`setAlertText`, `setActionLocKey`, `setLocKey`, `setLocArgs`, `setLaunchImage`) to aid the creation of the alert parameters. For applications which provide Newsstand capability there is a new boolean parameter `note.newsstandAvailable` to specify `content-available` in the payload.\n\nThe above options will compile the following dictionary to send to the device:\n\n\t{\"messageFrom\":\"Caroline\",\"aps\":{\"badge\":3,\"sound\":\"ping.aiff\",\"alert\":\"You have a new message\"}}\n\t\n**\\*N.B.:** If you wish to send notifications containing emoji or other multi-byte characters you will need to set `note.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\t\n### Handling Errors\n\nIf the enhanced binary interface is enabled and an error occurs - as defined in Apple's documentation - when sending a message, then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments `(err, notification)`\n\nIf a notification fails to be sent because a connection error occurs then the `errorCallback` will be called for each notification waiting for the connection which failed. In this case the first parameter will be an Error object instead of an error number.\n\n`errorCallback` will be called in 3 situations with the parameters shown.\n\n1. The notification has been rejected by Apple (or determined to have an invalid device token or payload before sending) for one of the reasons shown in Table 5-1 [here][errors] `errorCallback(errorCode, notification)`\n1. A notification has been rejected by Apple but it has been removed from the cache so it is not possible to identify which. In this case subsequent notifications may be lost. **If this happens you should consider increasing your `cacheLength` value to prevent data loss** `errorCallback(255, null)`\n1. A connection error has occurred before the notification can be sent. `errorCallback(Error object, notification)`\n\n**\\*N.B.:** The `cacheLength` option for the connection specifies the number of sent notifications which will be cached, on a FIFO basis for error handling purposes. If `cacheLength` is not set to a large enough value, then in high volume environments, a notification - possibly including some subsequent notifications - may be removed from the cache before Apple returns an error associated with it. In this case the `errorCallback` will still be called, but with a `null` notification and error code 255. If this happens you should consider increasing `cacheLength` to prevent losing notifications. All the notifications still residing in the cache will be resent automatically.\n\n### Setting up the feedback service\n\nApple recommends checking the feedback service periodically for a list of devices for which there were failed delivery attempts.\n\nUsing the `Feedback` object it is possible to periodically query the server for the list. You should provide a function `feedback` which will accept two arguments, the `time` returned by the server (epoch time) and a `Buffer` object containing the device token. You can also set the query interval in seconds. The default options are shown below.\n\n\tvar options = {\n\t\tcert: 'cert.pem',                   /* Certificate file */\n\t\tcertData: null,                     /* Certificate file contents (String|Buffer) */\n\t\tkey:  'key.pem',                    /* Key file */\n\t\tkeyData: null,                      /* Key file contents (String|Buffer) */\n\t\tpassphrase: null,                   /* A passphrase for the Key file */\n\t\tca: null,\t\t\t\t\t\t\t/* Certificate authority data to pass to the TLS connection */\n\t\taddress: 'feedback.push.apple.com', /* feedback address */\n\t\tport: 2196,                         /* feedback port */\n\t\tfeedback: false,                    /* enable feedback service, set to callback */\n\t\tinterval: 3600                      /* interval in seconds to connect to feedback service */\n\t};\n\n\tvar feedback = new apns.Feedback(options);\n\nThis will automatically start a timer to check with Apple every `interval` seconds. You can cancel the interval by calling `feedback.cancel()`. If you do not wish to have the service automatically queried then set `interval` to 0 and use `feedback.start()`.\n\n**Important:** In a development environment you must set `address` to `feedback.sandbox.push.apple.com`.\n\nMore information about the feedback service can be found in the [feedback service documentation][fs].\n\n## Converting your APNs Certificate\n\nAfter requesting the certificate from Apple, export your private key as a .p12 file and download the .cer file from the iOS Provisioning Portal.\n\nNow, in the directory containing cert.cer and key.p12 execute the following commands to generate your .pem files:\n\n\t$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem\n\t$ openssl pkcs12 -in key.p12 -out key.pem -nodes\n\t\nIf you are using a development certificate you may wish to name them differently to enable fast switching between development and production. The filenames are configurable within the module options, so feel free to name them something more appropriate.\n\n## Credits\n\nWritten and maintained by [Andrew Naylor][andrewnaylor].\n\nContributors: [Ian Babrou][bobrik], [dgthistle][dgthistle], [Keith Larsen][keithnlarsen], [Mike P][mypark]\n\n## License\n\nReleased under the MIT License\n\nCopyright (c) 2010 Andrew Naylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[errors]:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 \"The Binary Interface and Notification Formats\"\n[pl]: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1 \"Local and Push Notification Programming Guide: Apple Push Notification Service\"\n[fs]:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3 \"Communicating With APS\"\n[andrewnaylor]: http://andrewnaylor.co.uk\n[bnoordhuis]: http://bnoordhuis.nl\n[npm]: https://github.com/isaacs/npm\n[bobrik]: http://bobrik.name\n[dgthistle]: https://github.com/dgthistle\n[keithnlarsen]: https://github.com/keithnlarsen\n[mypark]: https://github.com/mypark\n[q]: https://github.com/kriskowal/q\n\n## Changelog\n\n1.2.0:\n\n* Complete rewrite of the connection handling.\n* [q][q] is now required.\n* Change in the error handling logic. When a notification errors and it cannot be found in the cache, then all notifications in the cache will be resent instead of being discarded.\n* `errorCallback` will also be invoked for connection errors.\n* New methods on `Notification` to aid settings the alert properties.\n* `content-available` can now be set for Newsstand applications by setting the `newsstandAvailable` property on the Notification object.\n* `Notification` objects now have a `.clone(device)` method to assist you in sending the same notification to multiple devices.\n* Included some js-doc tags in the source.\n* Device object now provides a `.toString()` method to return the hex representation of the device token.\n* Fixes #23, #28, #32, #34, #35, #40, #42\n\n1.1.7:\n\n* Fixes a problem with sockets being closed on transmission error causing EPIPE errors in node.\n* Issues #29, #30\n\n1.1.6:\n\n* Fixes a regression from v1.1.5 causing connections to stall and messages to not be sent.\n\n1.1.5:\n\n* Feature: Certificate and Key data can be passed directly when creating a new connection instead of providing a file name on disk. (See: `certData` and `keyData` options)\n* Deliver whole write buffer if the socket is ready.\n* Fixed some global memory leaks.\n* Tidied up some code formatting glitches flagged by jslint\n* Fixes #16, #17, #18, #19, #20\n\n1.1.4:\n\n* Fixes #15: Sending unified emoji via apn; Added encoding parameter when sending notification\n\n1.1.3:\n\n* Fixes #11,#12,#13,#14: Ensure delivery of notifications to Apple even under heavy load.\n\n1.1.2:\n\n* Fixes #9, Addresses an issue if the socket disconnects with queued notifications it would be reinitialised before its teardown is completed leaving the system in an undefined state.\n\n1.1.1:\n\n* Fixes issue #6 where a socket emitting an error could bring down the whole node instance as the exception is uncaught.\n\n1.1.0:\n\n* First shot at node-0.4.0 compatibility with new tls API.\n* Fixed a bug with parsing device token which could cause an out-of-bounds error.\n\n1.0.4:\n\n* The 1.0.x tree is now a maintenance branch as the TLS API used has been deprecated as of node 0.4.0\n* Changed package.json to specify the inoperability of this version with node > 0.4.0\n\n1.0.3:\n\n* Fixes a typo in the documentation in this very file\n\n1.0.2:\n\n* Fixes critical issue with error callback not firing (Issue #1)\n\n1.0.1:\n\n* Moved some object methods into the prototype to save memory\n* Tidied up some connecting code\n* Introduced an `index.js` to make module loading tidier\n* Fixed a couple of typos. \n\n1.0.0: \n \n* Well I created a module; Version 0.0.0 had no code, and now it does, and it works, so that's pretty neat, right?\n","maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.2.1":{"name":"apn","description":"A Node.js module for interfacing with the Apple Push Notification service.","version":"1.2.1","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","bugs":{"email":"argon@mkbot.net","url":"https://github.com/argon/node-apn/issues"},"repository":{"type":"git","url":"https://github.com/argon/node-apn.git"},"dependencies":{"q":">=0.8.5"},"engines":{"node":">= 0.6.6"},"license":"MIT","readme":"#node-apn\n\nA Node.js module for interfacing with the Apple Push Notification service.\n\n## Features\n\n- Maintains a connection to the server to maximise notification batching\n- Enhanced binary interface support with error handling\n- Automatically sends unsent notifications if an error occurs\n- Feedback service support\n\n## Installation\n\nVia [npm][]:\n\n\t$ npm install apn\n\t\nAs a submodule of your project (you will also need to install [q][q])\n\n\t$ git submodule add http://github.com/argon/node-apn.git apn\n\t$ git submodule update --init\n\n## Usage\n### Load in the module\n\n\tvar apns = require('apn');\n\n### Exported Objects\n- Connection\n- Notification\n- Device\n- Feedback\n- Errors\n\n### Connecting\nCreate a new connection to the gateway server using a dictionary of options. The defaults are listed below:\n\n\tvar options = {\n\t\tcert: 'cert.pem',                 /* Certificate file path */\n\t\tcertData: null,                   /* String or Buffer containing certificate data, if supplied uses this instead of cert file path */\n\t\tkey:  'key.pem',                  /* Key file path */\n\t\tkeyData: null,                    /* String or Buffer containing key data, as certData */\n\t\tpassphrase: null,                 /* A passphrase for the Key file */\n\t\tca: null\t\t\t\t\t\t  /* String or Buffer of CA data to use for the TLS connection */\n\t\tgateway: 'gateway.push.apple.com',/* gateway address */\n\t\tport: 2195,                       /* gateway port */\n\t\tenhanced: true,                   /* enable enhanced format */\n\t\terrorCallback: undefined,         /* Callback when error occurs function(err,notification) */\n\t\tcacheLength: 100                  /* Number of notifications to cache for error purposes */\n\t};\n\n\tvar apnsConnection = new apns.Connection(options);\n\t\n**Important:** In a development environment you must set `gateway` to `gateway.sandbox.push.apple.com`.\n\n### Sending a notification\nTo send a notification first create a `Device` object. Pass it the device token as either a hexadecimal string, or alternatively as a `Buffer` object containing the token in binary form.\n\n\tvar myDevice = new apns.Device(token);\n\nNext, create a notification object and set parameters. See the [payload documentation][pl] for more details.\n\n\tvar note = new apns.Notification();\n\t\n\tnote.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.\n\tnote.badge = 3;\n\tnote.sound = \"ping.aiff\";\n\tnote.alert = \"You have a new message\";\n\tnote.payload = {'messageFrom': 'Caroline'};\n\tnote.device = myDevice;\n\t\n\tapnsConnection.sendNotification(note);\n\t\nAs of version 1.2.0 it is also possible to use a set of methods provided by Notification object (`setAlertText`, `setActionLocKey`, `setLocKey`, `setLocArgs`, `setLaunchImage`) to aid the creation of the alert parameters. For applications which provide Newsstand capability there is a new boolean parameter `note.newsstandAvailable` to specify `content-available` in the payload.\n\nThe above options will compile the following dictionary to send to the device:\n\n\t{\"messageFrom\":\"Caroline\",\"aps\":{\"badge\":3,\"sound\":\"ping.aiff\",\"alert\":\"You have a new message\"}}\n\t\n**\\*N.B.:** If you wish to send notifications containing emoji or other multi-byte characters you will need to set `note.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\t\n### Handling Errors\n\nIf the enhanced binary interface is enabled and an error occurs - as defined in Apple's documentation - when sending a message, then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments `(err, notification)`\n\nIf a notification fails to be sent because a connection error occurs then the `errorCallback` will be called for each notification waiting for the connection which failed. In this case the first parameter will be an Error object instead of an error number.\n\n`errorCallback` will be called in 3 situations with the parameters shown.\n\n1. The notification has been rejected by Apple (or determined to have an invalid device token or payload before sending) for one of the reasons shown in Table 5-1 [here][errors] `errorCallback(errorCode, notification)`\n1. A notification has been rejected by Apple but it has been removed from the cache so it is not possible to identify which. In this case subsequent notifications may be lost. **If this happens you should consider increasing your `cacheLength` value to prevent data loss** `errorCallback(255, null)`\n1. A connection error has occurred before the notification can be sent. `errorCallback(Error object, notification)`\n\n**\\*N.B.:** The `cacheLength` option for the connection specifies the number of sent notifications which will be cached, on a FIFO basis for error handling purposes. If `cacheLength` is not set to a large enough value, then in high volume environments, a notification - possibly including some subsequent notifications - may be removed from the cache before Apple returns an error associated with it. In this case the `errorCallback` will still be called, but with a `null` notification and error code 255. If this happens you should consider increasing `cacheLength` to prevent losing notifications. All the notifications still residing in the cache will be resent automatically.\n\n### Setting up the feedback service\n\nApple recommends checking the feedback service periodically for a list of devices for which there were failed delivery attempts.\n\nUsing the `Feedback` object it is possible to periodically query the server for the list. You should provide a function `feedback` which will accept two arguments, the `time` returned by the server (epoch time) and a `Buffer` object containing the device token. You can also set the query interval in seconds. The default options are shown below.\n\n\tvar options = {\n\t\tcert: 'cert.pem',                   /* Certificate file */\n\t\tcertData: null,                     /* Certificate file contents (String|Buffer) */\n\t\tkey:  'key.pem',                    /* Key file */\n\t\tkeyData: null,                      /* Key file contents (String|Buffer) */\n\t\tpassphrase: null,                   /* A passphrase for the Key file */\n\t\tca: null,\t\t\t\t\t\t\t/* Certificate authority data to pass to the TLS connection */\n\t\taddress: 'feedback.push.apple.com', /* feedback address */\n\t\tport: 2196,                         /* feedback port */\n\t\tfeedback: false,                    /* enable feedback service, set to callback */\n\t\tinterval: 3600                      /* interval in seconds to connect to feedback service */\n\t};\n\n\tvar feedback = new apns.Feedback(options);\n\nThis will automatically start a timer to check with Apple every `interval` seconds. You can cancel the interval by calling `feedback.cancel()`. If you do not wish to have the service automatically queried then set `interval` to 0 and use `feedback.start()`.\n\n**Important:** In a development environment you must set `address` to `feedback.sandbox.push.apple.com`.\n\nMore information about the feedback service can be found in the [feedback service documentation][fs].\n\n## Converting your APNs Certificate\n\nAfter requesting the certificate from Apple, export your private key as a .p12 file and download the .cer file from the iOS Provisioning Portal.\n\nNow, in the directory containing cert.cer and key.p12 execute the following commands to generate your .pem files:\n\n\t$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem\n\t$ openssl pkcs12 -in key.p12 -out key.pem -nodes\n\t\nIf you are using a development certificate you may wish to name them differently to enable fast switching between development and production. The filenames are configurable within the module options, so feel free to name them something more appropriate.\n\n## Credits\n\nWritten and maintained by [Andrew Naylor][andrewnaylor].\n\nContributors: [Ian Babrou][bobrik], [dgthistle][dgthistle], [Keith Larsen][keithnlarsen], [Mike P][mypark], [Greg Bergé][neoziro]\n\n## License\n\nReleased under the MIT License\n\nCopyright (c) 2010 Andrew Naylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[errors]:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 \"The Binary Interface and Notification Formats\"\n[pl]: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1 \"Local and Push Notification Programming Guide: Apple Push Notification Service\"\n[fs]:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3 \"Communicating With APS\"\n[andrewnaylor]: http://andrewnaylor.co.uk\n[bnoordhuis]: http://bnoordhuis.nl\n[npm]: https://github.com/isaacs/npm\n[bobrik]: http://bobrik.name\n[dgthistle]: https://github.com/dgthistle\n[keithnlarsen]: https://github.com/keithnlarsen\n[mypark]: https://github.com/mypark\n[neoziro]: https://github.com/neoziro\n[q]: https://github.com/kriskowal/q\n\n## Changelog\n\n1.2.1:\n\n* Earlier versions had some incorrect logic in the handling of reconnection. This should be fixed now\n* Issue #46 ```.clone()``` did not set the badge property correctly.\n\n1.2.0:\n\n* Complete rewrite of the connection handling.\n* [q][q] is now required.\n* Change in the error handling logic. When a notification errors and it cannot be found in the cache, then all notifications in the cache will be resent instead of being discarded.\n* `errorCallback` will also be invoked for connection errors.\n* New methods on `Notification` to aid settings the alert properties.\n* `content-available` can now be set for Newsstand applications by setting the `newsstandAvailable` property on the Notification object.\n* `Notification` objects now have a `.clone(device)` method to assist you in sending the same notification to multiple devices.\n* Included some js-doc tags in the source.\n* Device object now provides a `.toString()` method to return the hex representation of the device token.\n* Fixes #23, #28, #32, #34, #35, #40, #42\n\n1.1.7:\n\n* Fixes a problem with sockets being closed on transmission error causing EPIPE errors in node.\n* Issues #29, #30\n\n1.1.6:\n\n* Fixes a regression from v1.1.5 causing connections to stall and messages to not be sent.\n\n1.1.5:\n\n* Feature: Certificate and Key data can be passed directly when creating a new connection instead of providing a file name on disk. (See: `certData` and `keyData` options)\n* Deliver whole write buffer if the socket is ready.\n* Fixed some global memory leaks.\n* Tidied up some code formatting glitches flagged by jslint\n* Fixes #16, #17, #18, #19, #20\n\n1.1.4:\n\n* Fixes #15: Sending unified emoji via apn; Added encoding parameter when sending notification\n\n1.1.3:\n\n* Fixes #11,#12,#13,#14: Ensure delivery of notifications to Apple even under heavy load.\n\n1.1.2:\n\n* Fixes #9, Addresses an issue if the socket disconnects with queued notifications it would be reinitialised before its teardown is completed leaving the system in an undefined state.\n\n1.1.1:\n\n* Fixes issue #6 where a socket emitting an error could bring down the whole node instance as the exception is uncaught.\n\n1.1.0:\n\n* First shot at node-0.4.0 compatibility with new tls API.\n* Fixed a bug with parsing device token which could cause an out-of-bounds error.\n\n1.0.4:\n\n* The 1.0.x tree is now a maintenance branch as the TLS API used has been deprecated as of node 0.4.0\n* Changed package.json to specify the inoperability of this version with node > 0.4.0\n\n1.0.3:\n\n* Fixes a typo in the documentation in this very file\n\n1.0.2:\n\n* Fixes critical issue with error callback not firing (Issue #1)\n\n1.0.1:\n\n* Moved some object methods into the prototype to save memory\n* Tidied up some connecting code\n* Introduced an `index.js` to make module loading tidier\n* Fixed a couple of typos. \n\n1.0.0: \n \n* Well I created a module; Version 0.0.0 had no code, and now it does, and it works, so that's pretty neat, right?\n","_id":"apn@1.2.1","dist":{"shasum":"f182cdbe149dbe877a14ae82fec42194f44b7436","tarball":"http://registry.npmjs.org/apn/-/apn-1.2.1.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.2.2":{"name":"apn","description":"A Node.js module for interfacing with the Apple Push Notification service.","version":"1.2.2","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","bugs":{"email":"argon@mkbot.net","url":"https://github.com/argon/node-apn/issues"},"repository":{"type":"git","url":"https://github.com/argon/node-apn.git"},"dependencies":{"q":">=0.8.5"},"engines":{"node":">= 0.6.6"},"license":"MIT","readme":"#node-apn\n\nA Node.js module for interfacing with the Apple Push Notification service.\n\n## Features\n\n- Maintains a connection to the server to maximise notification batching\n- Enhanced binary interface support with error handling\n- Automatically sends unsent notifications if an error occurs\n- Feedback service support\n\n## Installation\n\nVia [npm][]:\n\n\t$ npm install apn\n\t\nAs a submodule of your project (you will also need to install [q][q])\n\n\t$ git submodule add http://github.com/argon/node-apn.git apn\n\t$ git submodule update --init\n\n## Usage\n### Load in the module\n\n\tvar apns = require('apn');\n\n### Exported Objects\n- Connection\n- Notification\n- Device\n- Feedback\n- Errors\n\n### Connecting\nCreate a new connection to the gateway server using a dictionary of options. The defaults are listed below:\n\n\tvar options = {\n\t\tcert: 'cert.pem',                 /* Certificate file path */\n\t\tcertData: null,                   /* String or Buffer containing certificate data, if supplied uses this instead of cert file path */\n\t\tkey:  'key.pem',                  /* Key file path */\n\t\tkeyData: null,                    /* String or Buffer containing key data, as certData */\n\t\tpassphrase: null,                 /* A passphrase for the Key file */\n\t\tca: null\t\t\t\t\t\t  /* String or Buffer of CA data to use for the TLS connection */\n\t\tgateway: 'gateway.push.apple.com',/* gateway address */\n\t\tport: 2195,                       /* gateway port */\n\t\tenhanced: true,                   /* enable enhanced format */\n\t\terrorCallback: undefined,         /* Callback when error occurs function(err,notification) */\n\t\tcacheLength: 100                  /* Number of notifications to cache for error purposes */\n\t};\n\n\tvar apnsConnection = new apns.Connection(options);\n\t\n**Important:** In a development environment you must set `gateway` to `gateway.sandbox.push.apple.com`.\n\n### Sending a notification\nTo send a notification first create a `Device` object. Pass it the device token as either a hexadecimal string, or alternatively as a `Buffer` object containing the token in binary form.\n\n\tvar myDevice = new apns.Device(token);\n\nNext, create a notification object and set parameters. See the [payload documentation][pl] for more details.\n\n\tvar note = new apns.Notification();\n\t\n\tnote.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.\n\tnote.badge = 3;\n\tnote.sound = \"ping.aiff\";\n\tnote.alert = \"You have a new message\";\n\tnote.payload = {'messageFrom': 'Caroline'};\n\tnote.device = myDevice;\n\t\n\tapnsConnection.sendNotification(note);\n\t\nAs of version 1.2.0 it is also possible to use a set of methods provided by Notification object (`setAlertText`, `setActionLocKey`, `setLocKey`, `setLocArgs`, `setLaunchImage`) to aid the creation of the alert parameters. For applications which provide Newsstand capability there is a new boolean parameter `note.newsstandAvailable` to specify `content-available` in the payload.\n\nThe above options will compile the following dictionary to send to the device:\n\n\t{\"messageFrom\":\"Caroline\",\"aps\":{\"badge\":3,\"sound\":\"ping.aiff\",\"alert\":\"You have a new message\"}}\n\t\n**\\*N.B.:** If you wish to send notifications containing emoji or other multi-byte characters you will need to set `note.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\t\n### Handling Errors\n\nIf the enhanced binary interface is enabled and an error occurs - as defined in Apple's documentation - when sending a message, then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments `(err, notification)`\n\nIf a notification fails to be sent because a connection error occurs then the `errorCallback` will be called for each notification waiting for the connection which failed. In this case the first parameter will be an Error object instead of an error number.\n\n`errorCallback` will be called in 3 situations with the parameters shown.\n\n1. The notification has been rejected by Apple (or determined to have an invalid device token or payload before sending) for one of the reasons shown in Table 5-1 [here][errors] `errorCallback(errorCode, notification)`\n1. A notification has been rejected by Apple but it has been removed from the cache so it is not possible to identify which. In this case subsequent notifications may be lost. **If this happens you should consider increasing your `cacheLength` value to prevent data loss** `errorCallback(255, null)`\n1. A connection error has occurred before the notification can be sent. `errorCallback(Error object, notification)`\n\n**\\*N.B.:** The `cacheLength` option for the connection specifies the number of sent notifications which will be cached, on a FIFO basis for error handling purposes. If `cacheLength` is not set to a large enough value, then in high volume environments, a notification - possibly including some subsequent notifications - may be removed from the cache before Apple returns an error associated with it. In this case the `errorCallback` will still be called, but with a `null` notification and error code 255. If this happens you should consider increasing `cacheLength` to prevent losing notifications. All the notifications still residing in the cache will be resent automatically.\n\n### Setting up the feedback service\n\nApple recommends checking the feedback service periodically for a list of devices for which there were failed delivery attempts.\n\nUsing the `Feedback` object it is possible to periodically query the server for the list. You should provide a function `feedback` which will accept two arguments, the `time` returned by the server (epoch time) and a `Buffer` object containing the device token. You can also set the query interval in seconds. The default options are shown below.\n\n\tvar options = {\n\t\tcert: 'cert.pem',                   /* Certificate file */\n\t\tcertData: null,                     /* Certificate file contents (String|Buffer) */\n\t\tkey:  'key.pem',                    /* Key file */\n\t\tkeyData: null,                      /* Key file contents (String|Buffer) */\n\t\tpassphrase: null,                   /* A passphrase for the Key file */\n\t\tca: null,\t\t\t\t\t\t\t/* Certificate authority data to pass to the TLS connection */\n\t\taddress: 'feedback.push.apple.com', /* feedback address */\n\t\tport: 2196,                         /* feedback port */\n\t\tfeedback: false,                    /* enable feedback service, set to callback */\n\t\tinterval: 3600                      /* interval in seconds to connect to feedback service */\n\t};\n\n\tvar feedback = new apns.Feedback(options);\n\nThis will automatically start a timer to check with Apple every `interval` seconds. You can cancel the interval by calling `feedback.cancel()`. If you do not wish to have the service automatically queried then set `interval` to 0 and use `feedback.start()`.\n\n**Important:** In a development environment you must set `address` to `feedback.sandbox.push.apple.com`.\n\nMore information about the feedback service can be found in the [feedback service documentation][fs].\n\n## Converting your APNs Certificate\n\nAfter requesting the certificate from Apple, export your private key as a .p12 file and download the .cer file from the iOS Provisioning Portal.\n\nNow, in the directory containing cert.cer and key.p12 execute the following commands to generate your .pem files:\n\n\t$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem\n\t$ openssl pkcs12 -in key.p12 -out key.pem -nodes\n\t\nIf you are using a development certificate you may wish to name them differently to enable fast switching between development and production. The filenames are configurable within the module options, so feel free to name them something more appropriate.\n\n## Credits\n\nWritten and maintained by [Andrew Naylor][andrewnaylor].\n\nContributors: [Ian Babrou][bobrik], [dgthistle][dgthistle], [Keith Larsen][keithnlarsen], [Mike P][mypark], [Greg Bergé][neoziro]\n\n## License\n\nReleased under the MIT License\n\nCopyright (c) 2010 Andrew Naylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[errors]:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 \"The Binary Interface and Notification Formats\"\n[pl]: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1 \"Local and Push Notification Programming Guide: Apple Push Notification Service\"\n[fs]:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3 \"Communicating With APS\"\n[andrewnaylor]: http://andrewnaylor.co.uk\n[bnoordhuis]: http://bnoordhuis.nl\n[npm]: https://github.com/isaacs/npm\n[bobrik]: http://bobrik.name\n[dgthistle]: https://github.com/dgthistle\n[keithnlarsen]: https://github.com/keithnlarsen\n[mypark]: https://github.com/mypark\n[neoziro]: https://github.com/neoziro\n[q]: https://github.com/kriskowal/q\n\n## Changelog\n\n1.2.1:\n\n* Earlier versions had some incorrect logic in the handling of reconnection. This should be fixed now\n* Issue #46 ```.clone()``` did not set the badge property correctly.\n\n1.2.0:\n\n* Complete rewrite of the connection handling.\n* [q][q] is now required.\n* Change in the error handling logic. When a notification errors and it cannot be found in the cache, then all notifications in the cache will be resent instead of being discarded.\n* `errorCallback` will also be invoked for connection errors.\n* New methods on `Notification` to aid settings the alert properties.\n* `content-available` can now be set for Newsstand applications by setting the `newsstandAvailable` property on the Notification object.\n* `Notification` objects now have a `.clone(device)` method to assist you in sending the same notification to multiple devices.\n* Included some js-doc tags in the source.\n* Device object now provides a `.toString()` method to return the hex representation of the device token.\n* Fixes #23, #28, #32, #34, #35, #40, #42\n\n1.1.7:\n\n* Fixes a problem with sockets being closed on transmission error causing EPIPE errors in node.\n* Issues #29, #30\n\n1.1.6:\n\n* Fixes a regression from v1.1.5 causing connections to stall and messages to not be sent.\n\n1.1.5:\n\n* Feature: Certificate and Key data can be passed directly when creating a new connection instead of providing a file name on disk. (See: `certData` and `keyData` options)\n* Deliver whole write buffer if the socket is ready.\n* Fixed some global memory leaks.\n* Tidied up some code formatting glitches flagged by jslint\n* Fixes #16, #17, #18, #19, #20\n\n1.1.4:\n\n* Fixes #15: Sending unified emoji via apn; Added encoding parameter when sending notification\n\n1.1.3:\n\n* Fixes #11,#12,#13,#14: Ensure delivery of notifications to Apple even under heavy load.\n\n1.1.2:\n\n* Fixes #9, Addresses an issue if the socket disconnects with queued notifications it would be reinitialised before its teardown is completed leaving the system in an undefined state.\n\n1.1.1:\n\n* Fixes issue #6 where a socket emitting an error could bring down the whole node instance as the exception is uncaught.\n\n1.1.0:\n\n* First shot at node-0.4.0 compatibility with new tls API.\n* Fixed a bug with parsing device token which could cause an out-of-bounds error.\n\n1.0.4:\n\n* The 1.0.x tree is now a maintenance branch as the TLS API used has been deprecated as of node 0.4.0\n* Changed package.json to specify the inoperability of this version with node > 0.4.0\n\n1.0.3:\n\n* Fixes a typo in the documentation in this very file\n\n1.0.2:\n\n* Fixes critical issue with error callback not firing (Issue #1)\n\n1.0.1:\n\n* Moved some object methods into the prototype to save memory\n* Tidied up some connecting code\n* Introduced an `index.js` to make module loading tidier\n* Fixed a couple of typos. \n\n1.0.0: \n \n* Well I created a module; Version 0.0.0 had no code, and now it does, and it works, so that's pretty neat, right?\n","_id":"apn@1.2.2","dist":{"shasum":"ca19a31679963d1e9716d24162d568fc02800f2b","tarball":"http://registry.npmjs.org/apn/-/apn-1.2.2.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.2.3":{"name":"apn","description":"A Node.js module for interfacing with the Apple Push Notification service.","version":"1.2.3","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","bugs":{"email":"argon@mkbot.net","url":"https://github.com/argon/node-apn/issues"},"repository":{"type":"git","url":"https://github.com/argon/node-apn.git"},"dependencies":{"q":">=0.8.5"},"engines":{"node":">= 0.6.6"},"license":"MIT","readme":"#node-apn\n\nA Node.js module for interfacing with the Apple Push Notification service.\n\n## Features\n\n- Maintains a connection to the server to maximise notification batching\n- Enhanced binary interface support with error handling\n- Automatically sends unsent notifications if an error occurs\n- Feedback service support\n\n## Installation\n\nVia [npm][]:\n\n\t$ npm install apn\n\t\nAs a submodule of your project (you will also need to install [q][q])\n\n\t$ git submodule add http://github.com/argon/node-apn.git apn\n\t$ git submodule update --init\n\n## Usage\n### Load in the module\n\n\tvar apns = require('apn');\n\n### Exported Objects\n- Connection\n- Notification\n- Device\n- Feedback\n- Errors\n\n### Connecting\nCreate a new connection to the gateway server using a dictionary of options. The defaults are listed below:\n\n\tvar options = {\n\t\tcert: 'cert.pem',                 /* Certificate file path */\n\t\tcertData: null,                   /* String or Buffer containing certificate data, if supplied uses this instead of cert file path */\n\t\tkey:  'key.pem',                  /* Key file path */\n\t\tkeyData: null,                    /* String or Buffer containing key data, as certData */\n\t\tpassphrase: null,                 /* A passphrase for the Key file */\n\t\tca: null\t\t\t\t\t\t  /* String or Buffer of CA data to use for the TLS connection */\n\t\tgateway: 'gateway.push.apple.com',/* gateway address */\n\t\tport: 2195,                       /* gateway port */\n\t\tenhanced: true,                   /* enable enhanced format */\n\t\terrorCallback: undefined,         /* Callback when error occurs function(err,notification) */\n\t\tcacheLength: 100                  /* Number of notifications to cache for error purposes */\n\t};\n\n\tvar apnsConnection = new apns.Connection(options);\n\t\n**Important:** In a development environment you must set `gateway` to `gateway.sandbox.push.apple.com`.\n\n### Sending a notification\nTo send a notification first create a `Device` object. Pass it the device token as either a hexadecimal string, or alternatively as a `Buffer` object containing the token in binary form.\n\n\tvar myDevice = new apns.Device(token);\n\nNext, create a notification object and set parameters. See the [payload documentation][pl] for more details.\n\n\tvar note = new apns.Notification();\n\t\n\tnote.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.\n\tnote.badge = 3;\n\tnote.sound = \"ping.aiff\";\n\tnote.alert = \"You have a new message\";\n\tnote.payload = {'messageFrom': 'Caroline'};\n\tnote.device = myDevice;\n\t\n\tapnsConnection.sendNotification(note);\n\t\nAs of version 1.2.0 it is also possible to use a set of methods provided by Notification object (`setAlertText`, `setActionLocKey`, `setLocKey`, `setLocArgs`, `setLaunchImage`) to aid the creation of the alert parameters. For applications which provide Newsstand capability there is a new boolean parameter `note.newsstandAvailable` to specify `content-available` in the payload.\n\nThe above options will compile the following dictionary to send to the device:\n\n\t{\"messageFrom\":\"Caroline\",\"aps\":{\"badge\":3,\"sound\":\"ping.aiff\",\"alert\":\"You have a new message\"}}\n\t\n**\\*N.B.:** If you wish to send notifications containing emoji or other multi-byte characters you will need to set `note.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\t\n### Handling Errors\n\nIf the enhanced binary interface is enabled and an error occurs - as defined in Apple's documentation - when sending a message, then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments `(err, notification)`\n\nIf a notification fails to be sent because a connection error occurs then the `errorCallback` will be called for each notification waiting for the connection which failed. In this case the first parameter will be an Error object instead of an error number.\n\n`errorCallback` will be called in 3 situations with the parameters shown.\n\n1. The notification has been rejected by Apple (or determined to have an invalid device token or payload before sending) for one of the reasons shown in Table 5-1 [here][errors] `errorCallback(errorCode, notification)`\n1. A notification has been rejected by Apple but it has been removed from the cache so it is not possible to identify which. In this case subsequent notifications may be lost. **If this happens you should consider increasing your `cacheLength` value to prevent data loss** `errorCallback(255, null)`\n1. A connection error has occurred before the notification can be sent. `errorCallback(Error object, notification)`\n\n**\\*N.B.:** The `cacheLength` option for the connection specifies the number of sent notifications which will be cached, on a FIFO basis for error handling purposes. If `cacheLength` is not set to a large enough value, then in high volume environments, a notification - possibly including some subsequent notifications - may be removed from the cache before Apple returns an error associated with it. In this case the `errorCallback` will still be called, but with a `null` notification and error code 255. If this happens you should consider increasing `cacheLength` to prevent losing notifications. All the notifications still residing in the cache will be resent automatically.\n\n### Setting up the feedback service\n\nApple recommends checking the feedback service periodically for a list of devices for which there were failed delivery attempts.\n\nUsing the `Feedback` object it is possible to periodically query the server for the list. You should provide a function `feedback` which will accept two arguments, the `time` returned by the server (epoch time) and a `Buffer` object containing the device token. You can also set the query interval in seconds. The default options are shown below.\n\n\tvar options = {\n\t\tcert: 'cert.pem',                   /* Certificate file */\n\t\tcertData: null,                     /* Certificate file contents (String|Buffer) */\n\t\tkey:  'key.pem',                    /* Key file */\n\t\tkeyData: null,                      /* Key file contents (String|Buffer) */\n\t\tpassphrase: null,                   /* A passphrase for the Key file */\n\t\tca: null,\t\t\t\t\t\t\t/* Certificate authority data to pass to the TLS connection */\n\t\taddress: 'feedback.push.apple.com', /* feedback address */\n\t\tport: 2196,                         /* feedback port */\n\t\tfeedback: false,                    /* enable feedback service, set to callback */\n\t\tinterval: 3600                      /* interval in seconds to connect to feedback service */\n\t};\n\n\tvar feedback = new apns.Feedback(options);\n\nThis will automatically start a timer to check with Apple every `interval` seconds. You can cancel the interval by calling `feedback.cancel()`. If you do not wish to have the service automatically queried then set `interval` to 0 and use `feedback.start()`.\n\n**Important:** In a development environment you must set `address` to `feedback.sandbox.push.apple.com`.\n\nMore information about the feedback service can be found in the [feedback service documentation][fs].\n\n## Converting your APNs Certificate\n\nAfter requesting the certificate from Apple, export your private key as a .p12 file and download the .cer file from the iOS Provisioning Portal.\n\nNow, in the directory containing cert.cer and key.p12 execute the following commands to generate your .pem files:\n\n\t$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem\n\t$ openssl pkcs12 -in key.p12 -out key.pem -nodes\n\t\nIf you are using a development certificate you may wish to name them differently to enable fast switching between development and production. The filenames are configurable within the module options, so feel free to name them something more appropriate.\n\n## Credits\n\nWritten and maintained by [Andrew Naylor][andrewnaylor].\n\nContributors: [Ian Babrou][bobrik], [dgthistle][dgthistle], [Keith Larsen][keithnlarsen], [Mike P][mypark], [Greg Bergé][neoziro]\n\n## License\n\nReleased under the MIT License\n\nCopyright (c) 2010 Andrew Naylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[errors]:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 \"The Binary Interface and Notification Formats\"\n[pl]: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1 \"Local and Push Notification Programming Guide: Apple Push Notification Service\"\n[fs]:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3 \"Communicating With APS\"\n[andrewnaylor]: http://andrewnaylor.co.uk\n[bnoordhuis]: http://bnoordhuis.nl\n[npm]: https://github.com/isaacs/npm\n[bobrik]: http://bobrik.name\n[dgthistle]: https://github.com/dgthistle\n[keithnlarsen]: https://github.com/keithnlarsen\n[mypark]: https://github.com/mypark\n[neoziro]: https://github.com/neoziro\n[q]: https://github.com/kriskowal/q\n\n## Changelog\n\n1.2.3:\n\n* Added some more error handling to the connection methods.\n* Fixed a problem where an error handler was not bound to the correct context and wouldn't fire.\n\n1.2.2:\n\n* Fixes issue #47, Syntax Error in feedback.js\n\n1.2.1:\n\n* Earlier versions had some incorrect logic in the handling of reconnection. This should be fixed now\n* Issue #46 ```.clone()``` did not set the badge property correctly.\n\n1.2.0:\n\n* Complete rewrite of the connection handling.\n* [q][q] is now required.\n* Change in the error handling logic. When a notification errors and it cannot be found in the cache, then all notifications in the cache will be resent instead of being discarded.\n* `errorCallback` will also be invoked for connection errors.\n* New methods on `Notification` to aid settings the alert properties.\n* `content-available` can now be set for Newsstand applications by setting the `newsstandAvailable` property on the Notification object.\n* `Notification` objects now have a `.clone(device)` method to assist you in sending the same notification to multiple devices.\n* Included some js-doc tags in the source.\n* Device object now provides a `.toString()` method to return the hex representation of the device token.\n* Fixes #23, #28, #32, #34, #35, #40, #42\n\n1.1.7:\n\n* Fixes a problem with sockets being closed on transmission error causing EPIPE errors in node.\n* Issues #29, #30\n\n1.1.6:\n\n* Fixes a regression from v1.1.5 causing connections to stall and messages to not be sent.\n\n1.1.5:\n\n* Feature: Certificate and Key data can be passed directly when creating a new connection instead of providing a file name on disk. (See: `certData` and `keyData` options)\n* Deliver whole write buffer if the socket is ready.\n* Fixed some global memory leaks.\n* Tidied up some code formatting glitches flagged by jslint\n* Fixes #16, #17, #18, #19, #20\n\n1.1.4:\n\n* Fixes #15: Sending unified emoji via apn; Added encoding parameter when sending notification\n\n1.1.3:\n\n* Fixes #11,#12,#13,#14: Ensure delivery of notifications to Apple even under heavy load.\n\n1.1.2:\n\n* Fixes #9, Addresses an issue if the socket disconnects with queued notifications it would be reinitialised before its teardown is completed leaving the system in an undefined state.\n\n1.1.1:\n\n* Fixes issue #6 where a socket emitting an error could bring down the whole node instance as the exception is uncaught.\n\n1.1.0:\n\n* First shot at node-0.4.0 compatibility with new tls API.\n* Fixed a bug with parsing device token which could cause an out-of-bounds error.\n\n1.0.4:\n\n* The 1.0.x tree is now a maintenance branch as the TLS API used has been deprecated as of node 0.4.0\n* Changed package.json to specify the inoperability of this version with node > 0.4.0\n\n1.0.3:\n\n* Fixes a typo in the documentation in this very file\n\n1.0.2:\n\n* Fixes critical issue with error callback not firing (Issue #1)\n\n1.0.1:\n\n* Moved some object methods into the prototype to save memory\n* Tidied up some connecting code\n* Introduced an `index.js` to make module loading tidier\n* Fixed a couple of typos. \n\n1.0.0: \n \n* Well I created a module; Version 0.0.0 had no code, and now it does, and it works, so that's pretty neat, right?\n","_id":"apn@1.2.3","dist":{"shasum":"8129b5c772a055e8563725d179517ea332c8ed9c","tarball":"http://registry.npmjs.org/apn/-/apn-1.2.3.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]},"1.2.4":{"name":"apn","description":"A Node.js module for interfacing with the Apple Push Notification service.","version":"1.2.4","author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"contributors":[{"name":"Andrew Naylor","email":"argon@mkbot.net"}],"keywords":["apple","push","push notifications","iOS","apns"],"main":"index.js","bugs":{"email":"argon@mkbot.net","url":"https://github.com/argon/node-apn/issues"},"repository":{"type":"git","url":"https://github.com/argon/node-apn.git"},"dependencies":{"q":">=0.8.5"},"engines":{"node":">= 0.6.6"},"license":"MIT","readme":"#node-apn\n\nA Node.js module for interfacing with the Apple Push Notification service.\n\n## Features\n\n- Maintains a connection to the server to maximise notification batching\n- Enhanced binary interface support with error handling\n- Automatically sends unsent notifications if an error occurs\n- Feedback service support\n\n## Installation\n\nVia [npm][]:\n\n\t$ npm install apn\n\t\nAs a submodule of your project (you will also need to install [q][q])\n\n\t$ git submodule add http://github.com/argon/node-apn.git apn\n\t$ git submodule update --init\n\n## Usage\n### Load in the module\n\n\tvar apns = require('apn');\n\n### Exported Objects\n- Connection\n- Notification\n- Device\n- Feedback\n- Errors\n\n### Connecting\nCreate a new connection to the gateway server using a dictionary of options. The defaults are listed below:\n\n\tvar options = {\n\t\tcert: 'cert.pem',                 /* Certificate file path */\n\t\tcertData: null,                   /* String or Buffer containing certificate data, if supplied uses this instead of cert file path */\n\t\tkey:  'key.pem',                  /* Key file path */\n\t\tkeyData: null,                    /* String or Buffer containing key data, as certData */\n\t\tpassphrase: null,                 /* A passphrase for the Key file */\n\t\tca: null,\t\t\t\t\t\t  /* String or Buffer of CA data to use for the TLS connection */\n\t\tgateway: 'gateway.push.apple.com',/* gateway address */\n\t\tport: 2195,                       /* gateway port */\n\t\tenhanced: true,                   /* enable enhanced format */\n\t\terrorCallback: undefined,         /* Callback when error occurs function(err,notification) */\n\t\tcacheLength: 100                  /* Number of notifications to cache for error purposes */\n\t};\n\n\tvar apnsConnection = new apns.Connection(options);\n\t\n**Important:** In a development environment you must set `gateway` to `gateway.sandbox.push.apple.com`.\n\n### Sending a notification\nTo send a notification first create a `Device` object. Pass it the device token as either a hexadecimal string, or alternatively as a `Buffer` object containing the token in binary form.\n\n\tvar myDevice = new apns.Device(token);\n\nNext, create a notification object and set parameters. See the [payload documentation][pl] for more details.\n\n\tvar note = new apns.Notification();\n\t\n\tnote.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.\n\tnote.badge = 3;\n\tnote.sound = \"ping.aiff\";\n\tnote.alert = \"You have a new message\";\n\tnote.payload = {'messageFrom': 'Caroline'};\n\tnote.device = myDevice;\n\t\n\tapnsConnection.sendNotification(note);\n\t\nAs of version 1.2.0 it is also possible to use a set of methods provided by Notification object (`setAlertText`, `setActionLocKey`, `setLocKey`, `setLocArgs`, `setLaunchImage`) to aid the creation of the alert parameters. For applications which provide Newsstand capability there is a new boolean parameter `note.newsstandAvailable` to specify `content-available` in the payload.\n\nThe above options will compile the following dictionary to send to the device:\n\n\t{\"messageFrom\":\"Caroline\",\"aps\":{\"badge\":3,\"sound\":\"ping.aiff\",\"alert\":\"You have a new message\"}}\n\t\n**\\*N.B.:** If you wish to send notifications containing emoji or other multi-byte characters you will need to set `note.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\t\n### Handling Errors\n\nIf the enhanced binary interface is enabled and an error occurs - as defined in Apple's documentation - when sending a message, then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments `(err, notification)`\n\nIf a notification fails to be sent because a connection error occurs then the `errorCallback` will be called for each notification waiting for the connection which failed. In this case the first parameter will be an Error object instead of an error number.\n\n`errorCallback` will be called in 3 situations with the parameters shown.\n\n1. The notification has been rejected by Apple (or determined to have an invalid device token or payload before sending) for one of the reasons shown in Table 5-1 [here][errors] `errorCallback(errorCode, notification)`\n1. A notification has been rejected by Apple but it has been removed from the cache so it is not possible to identify which. In this case subsequent notifications may be lost. **If this happens you should consider increasing your `cacheLength` value to prevent data loss** `errorCallback(255, null)`\n1. A connection error has occurred before the notification can be sent. `errorCallback(Error object, notification)`\n\n**\\*N.B.:** The `cacheLength` option for the connection specifies the number of sent notifications which will be cached, on a FIFO basis for error handling purposes. If `cacheLength` is not set to a large enough value, then in high volume environments, a notification - possibly including some subsequent notifications - may be removed from the cache before Apple returns an error associated with it. In this case the `errorCallback` will still be called, but with a `null` notification and error code 255. If this happens you should consider increasing `cacheLength` to prevent losing notifications. All the notifications still residing in the cache will be resent automatically.\n\n### Setting up the feedback service\n\nApple recommends checking the feedback service periodically for a list of devices for which there were failed delivery attempts.\n\nUsing the `Feedback` object it is possible to periodically query the server for the list. You should provide a function `feedback` which will accept two arguments, the `time` returned by the server (epoch time) and a `Buffer` object containing the device token. You can also set the query interval in seconds. The default options are shown below.\n\n\tvar options = {\n\t\tcert: 'cert.pem',                   /* Certificate file */\n\t\tcertData: null,                     /* Certificate file contents (String|Buffer) */\n\t\tkey:  'key.pem',                    /* Key file */\n\t\tkeyData: null,                      /* Key file contents (String|Buffer) */\n\t\tpassphrase: null,                   /* A passphrase for the Key file */\n\t\tca: null,\t\t\t\t\t\t\t/* Certificate authority data to pass to the TLS connection */\n\t\taddress: 'feedback.push.apple.com', /* feedback address */\n\t\tport: 2196,                         /* feedback port */\n\t\tfeedback: false,                    /* enable feedback service, set to callback */\n\t\tinterval: 3600                      /* interval in seconds to connect to feedback service */\n\t};\n\n\tvar feedback = new apns.Feedback(options);\n\nThis will automatically start a timer to check with Apple every `interval` seconds. You can cancel the interval by calling `feedback.cancel()`. If you do not wish to have the service automatically queried then set `interval` to 0 and use `feedback.start()`.\n\n**Important:** In a development environment you must set `address` to `feedback.sandbox.push.apple.com`.\n\nMore information about the feedback service can be found in the [feedback service documentation][fs].\n\n## Converting your APNs Certificate\n\nAfter requesting the certificate from Apple, export your private key as a .p12 file and download the .cer file from the iOS Provisioning Portal.\n\nNow, in the directory containing cert.cer and key.p12 execute the following commands to generate your .pem files:\n\n\t$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem\n\t$ openssl pkcs12 -in key.p12 -out key.pem -nodes\n\t\nIf you are using a development certificate you may wish to name them differently to enable fast switching between development and production. The filenames are configurable within the module options, so feel free to name them something more appropriate.\n\n## Debugging\n\nIf you experience difficulties sending notifications or using the feedback service you can enable debug messages within the library by running your application with `DEBUG=apn` or `DEBUG=apnfb`.\n\nYou will need the `debug` module which can be installed with `npm install debug`.\n\n## Credits\n\nWritten and maintained by [Andrew Naylor][andrewnaylor].\n\nContributors: [Ian Babrou][bobrik], [dgthistle][dgthistle], [Keith Larsen][keithnlarsen], [Mike P][mypark], [Greg Bergé][neoziro], [Asad ur Rehman][AsadR]\n\n## License\n\nReleased under the MIT License\n\nCopyright (c) 2010 Andrew Naylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[errors]:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 \"The Binary Interface and Notification Formats\"\n[pl]: https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1 \"Local and Push Notification Programming Guide: Apple Push Notification Service\"\n[fs]:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3 \"Communicating With APS\"\n[andrewnaylor]: http://andrewnaylor.co.uk\n[bnoordhuis]: http://bnoordhuis.nl\n[npm]: https://github.com/isaacs/npm\n[bobrik]: http://bobrik.name\n[dgthistle]: https://github.com/dgthistle\n[keithnlarsen]: https://github.com/keithnlarsen\n[mypark]: https://github.com/mypark\n[neoziro]: https://github.com/neoziro\n[AsadR]: https://github.com/AsadR\n[q]: https://github.com/kriskowal/q\n\n## Changelog\n\n1.2.4:\n\n* Fixed some typos in the feedback methods\n* Added some debug messages available during development, see debug section above.\n\n1.2.3:\n\n* Added some more error handling to the connection methods.\n* Fixed a problem where an error handler was not bound to the correct context and wouldn't fire.\n\n1.2.2:\n\n* Fixes issue #47, Syntax Error in feedback.js\n\n1.2.1:\n\n* Earlier versions had some incorrect logic in the handling of reconnection. This should be fixed now\n* Issue #46 ```.clone()``` did not set the badge property correctly.\n\n1.2.0:\n\n* Complete rewrite of the connection handling.\n* [q][q] is now required.\n* Change in the error handling logic. When a notification errors and it cannot be found in the cache, then all notifications in the cache will be resent instead of being discarded.\n* `errorCallback` will also be invoked for connection errors.\n* New methods on `Notification` to aid settings the alert properties.\n* `content-available` can now be set for Newsstand applications by setting the `newsstandAvailable` property on the Notification object.\n* `Notification` objects now have a `.clone(device)` method to assist you in sending the same notification to multiple devices.\n* Included some js-doc tags in the source.\n* Device object now provides a `.toString()` method to return the hex representation of the device token.\n* Fixes #23, #28, #32, #34, #35, #40, #42\n\n1.1.7:\n\n* Fixes a problem with sockets being closed on transmission error causing EPIPE errors in node.\n* Issues #29, #30\n\n1.1.6:\n\n* Fixes a regression from v1.1.5 causing connections to stall and messages to not be sent.\n\n1.1.5:\n\n* Feature: Certificate and Key data can be passed directly when creating a new connection instead of providing a file name on disk. (See: `certData` and `keyData` options)\n* Deliver whole write buffer if the socket is ready.\n* Fixed some global memory leaks.\n* Tidied up some code formatting glitches flagged by jslint\n* Fixes #16, #17, #18, #19, #20\n\n1.1.4:\n\n* Fixes #15: Sending unified emoji via apn; Added encoding parameter when sending notification\n\n1.1.3:\n\n* Fixes #11,#12,#13,#14: Ensure delivery of notifications to Apple even under heavy load.\n\n1.1.2:\n\n* Fixes #9, Addresses an issue if the socket disconnects with queued notifications it would be reinitialised before its teardown is completed leaving the system in an undefined state.\n\n1.1.1:\n\n* Fixes issue #6 where a socket emitting an error could bring down the whole node instance as the exception is uncaught.\n\n1.1.0:\n\n* First shot at node-0.4.0 compatibility with new tls API.\n* Fixed a bug with parsing device token which could cause an out-of-bounds error.\n\n1.0.4:\n\n* The 1.0.x tree is now a maintenance branch as the TLS API used has been deprecated as of node 0.4.0\n* Changed package.json to specify the inoperability of this version with node > 0.4.0\n\n1.0.3:\n\n* Fixes a typo in the documentation in this very file\n\n1.0.2:\n\n* Fixes critical issue with error callback not firing (Issue #1)\n\n1.0.1:\n\n* Moved some object methods into the prototype to save memory\n* Tidied up some connecting code\n* Introduced an `index.js` to make module loading tidier\n* Fixed a couple of typos. \n\n1.0.0: \n \n* Well I created a module; Version 0.0.0 had no code, and now it does, and it works, so that's pretty neat, right?\n","_id":"apn@1.2.4","dist":{"shasum":"a05ff300662cd39881285b22b9687f697f299d5f","tarball":"http://registry.npmjs.org/apn/-/apn-1.2.4.tgz"},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}]}},"maintainers":[{"name":"argon","email":"argon@mkbot.net"}],"time":{"modified":"2012-08-02T17:36:18.169Z","created":"2011-05-03T16:35:46.160Z","1.1.1":"2011-05-03T16:35:46.578Z","1.0.6":"2011-05-03T16:36:17.534Z","1.1.0":"2011-05-03T16:37:43.406Z","1.0.5":"2011-05-03T16:39:10.485Z","1.0.4":"2011-05-03T16:39:29.756Z","1.0.3":"2011-05-03T16:39:45.536Z","1.0.2":"2011-05-03T16:39:57.856Z","1.0.1":"2011-05-03T16:40:08.209Z","1.0.0":"2011-05-03T16:40:16.279Z","1.1.2":"2011-08-31T22:40:19.807Z","1.0.7":"2011-08-31T22:40:50.806Z","1.1.3":"2011-11-25T00:11:28.094Z","1.1.4":"2011-11-25T00:22:43.765Z","1.1.5":"2012-01-06T18:23:09.959Z","1.1.6":"2012-01-21T17:16:42.521Z","1.1.7":"2012-05-09T21:33:10.494Z","1.2.0":"2012-06-16T12:14:01.781Z","1.2.1":"2012-06-28T22:24:33.455Z","1.2.2":"2012-06-29T07:31:29.187Z","1.2.3":"2012-07-07T09:45:52.704Z","1.2.4":"2012-08-02T17:21:28.971Z"},"author":{"name":"Andrew Naylor","email":"argon@mkbot.net"},"repository":{"type":"git","url":"https://github.com/argon/node-apn.git"},"_attachments":{"apn-1.2.4.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-vgTnFcBmHdBb0aKFWjR0dw==","length":11949,"stub":true},"apn-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-Niwvs4aRG6wFq3RLjkovJA==","length":11729,"stub":true},"apn-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":66,"digest":"md5-pZY74a5Ap6nIuk2mHtZX/Q==","length":11266,"stub":true},"apn-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-svnuvmgZI8oVT4Frqqv8Dw==","length":11263,"stub":true},"apn-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-MlbdAq2mXTQLNjky69QrcA==","length":10799,"stub":true},"apn-1.1.7.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-VqrNDX929LE3gtZ8DvyoQg==","length":7650,"stub":true},"apn-1.1.6.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-ddpqrb8ECmhIwk4AkL0swQ==","length":10240,"stub":true},"apn-1.1.5.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-kZZcPfk2MgdmFYKS+hqs/g==","length":10240,"stub":true},"apn-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-mnqmsMGua5x/3coAf8O0FQ==","length":10240,"stub":true},"apn-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-ExLVmU6jjfFZC584a0UOEA==","length":10240,"stub":true},"apn-1.0.7.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-7F3qQNrpZZSSCFUYHbKWEQ==","length":6550,"stub":true},"apn-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-yD6GCnecws//LcNVFKifkw==","length":6634,"stub":true},"apn-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-2zjucGxnEXLNTUW/fcShdQ==","length":6420,"stub":true},"apn-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-hlSkOttQXlTonwE36gbCvA==","length":7046,"stub":true},"apn-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-kNlbQEEnzQLf2BBeiYLJdw==","length":7087,"stub":true},"apn-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-nov2JEIAXv8e3OqT1EqRKA==","length":7103,"stub":true},"apn-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-ugOUJnsvd6TSHVdvTZCQIQ==","length":7195,"stub":true},"apn-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-6+Q/KKV5Ax51MVt5e8hx8Q==","length":7239,"stub":true},"apn-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-Vtadk5wyZ9lJKHDQE05qBQ==","length":7294,"stub":true},"apn-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Bx7aMIBtQiz6TVwaosVxUA==","length":7302,"stub":true},"apn-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pYa4hEkoUh2WjS0rnZKaZg==","length":7369,"stub":true}}}},
{"id":"apns","key":"apns","value":{"rev":"3-8c326c601fa951e7e7d0c52b36d3e837"},"doc":{"_id":"apns","_rev":"3-8c326c601fa951e7e7d0c52b36d3e837","name":"apns","description":"APNS (Apple Push Notification Service) interface written in node.js","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"apns","description":"APNS (Apple Push Notification Service) interface written in node.js","version":"0.1.0","keywords":["apple","push","notification","iOS","apns"],"author":{"name":"Bergé Greg","email":"berge.greg@gmail.com","url":"http://www.neoziro.com/"},"main":"./index","repository":{"type":"git","url":"git://github.com/neoziro/node-apns.git"},"bugs":{"email":"berge.greg@gmail.com","url":"https://github.com/neoziro/node-apns/issues"},"dependencies":{"q":">=0.8.5"},"engines":{"node":">=0.6.5"},"license":"MIT","_npmUser":{"name":"neoziro","email":"berge.greg@gmail.com"},"_id":"apns@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"86f408d71a922dbea8dbfd16e2fe770ad2b0d102","tarball":"http://registry.npmjs.org/apns/-/apns-0.1.0.tgz"},"maintainers":[{"name":"neoziro","email":"berge.greg@gmail.com"}]}},"readme":"node-apns\n=========\n\nnode-apns is a very effective and resilient APNS (Apple Push Notification Service) interface written in node.js\n\nIt's simple to use, catch error and send notifications !\n\nHow to use it ?\n---------------\n\n````javascript\nvar apns = require(\"apns\"), options, connection, notification;\n\noptions = {\n   keyFile : \"conf/key.pem\",\n   certFile : \"conf/cert.pem\",\n   debug : true\n};\n\nconnection = new apns.Connection(options);\n\nnotification = new apns.Notification();\nnotification.device = new apns.Device(\"iphone_token\");\nnotification.alert = \"Hello World !\";\n\nconnection.sendNotification(notification);\n````\n\nInstallation\n============\n\nVia [npm][]:\n\n     $ npm install apns\n\t\nAs a submodule of your project\n\n\t$ git submodule add http://github.com/neoziro/node-apns.git apns\n\t$ git submodule update --init\n\t\n[npm]: https://github.com/isaacs/npm\n\nAPI\n===\n\nnew Notification()\n------------------\n\nCreate a notification to send throw a connection.\n\n* `notification.payload` : Notification payload.\n* `notification.badge` : The number on the badge.\n* `notification.sound` : The sound to use.\n* `notification.alert` : Alert text.\n* `notification.device` : The device where notification is sent.\n* `notification.encoding` : The encoding of the notification, default `utf8`. If you wish to send notifications containing emoji or other multi-byte characters you will need to set `notification.encoding = 'ucs2'`. This tells node to send the message with 16bit characters, however it also means your message payload will be limited to 127 characters.\n\n````javascript\nvar apns = require(\"apns\"), notification;\n\nnotification = new apns.Notification();\nnotification.payload = {\"description\" : \"A good news !\"};\nnotification.badge = 1;\nnotification.sound = \"dong.aiff\";\nnotification.alert = \"Hello World !\";\nnotification.device = new apns.Device(\"iphone_token\");\n````\n\nnew Device(token)\n-----------------\n\nThe device where notification is sent.\n\n* `token` : The token in Buffer or string.\n\n````javascript\nvar apns = require(\"apns\"), device;\n\ndevice = new apns.Device(\"iphone_token\");\n````\n\nnew Connection(options)\n----------------\n\nCreate a connection to open a socket and send notification.\n\nOptions avalaible are :\n\n* `certData` : Cert as Buffer.\n* `keyData` : Key as Buffer.\n* `certFile` : Path to the cert file (only if you don't use certData).\n* `keyFile` : Path to the key file (only if you don't use keyData).\n* `passphrase` : Passphrase used to connect.\n* `gateway` : Apple gateway, default `gateway.push.apple.com`.\n* `port` : Connection port, default `2195`.\n* `enhanced` : Use enhanced mode to catch error, default `true`.\n* `errorCallback` : Error callback.\n* `cacheLength` : The number of notification to see if an error occur, if you don't know, let as default. Default `1000`.\n* `connectionTimeout` : Time in ms before connection close, 10 minutes, is the time advised. Default `600000`.\n* `debug` : Active debug mode (log main step to stdout), default `false`.\n\n````javascript\nvar apns = require(\"apns\");\n\nvar options = {\n   keyFile : \"conf/key.pem\",\n   certFile : \"conf/cert.pem\",\n   debug : true\n};\n\nvar connection = new apns.Connection(options);\n````\n\nconnection.send(notification)\n----------------------------\n\nSend a notification.\n\n* `notification` : The notification to send.\n\n````javascript\nvar apns = require(\"apns\"), notification, options, connection;\n\noptions = {\n   keyFile : \"conf/key.pem\",\n   certFile : \"conf/cert.pem\",\n   debug : true\n};\n\nconnection = new apns.Connection(options);\n\nnotification = new apns.Notification();\nnotification.alert = \"Hello World !\";\nnotification.device = new apns.Device(\"iphone_token\");\n\nconnection.sendNotification(notification);\n````\n\nHandling errors\n===============\n\nIf the enhanced binary interface is enabled and an error occurs when sending a message then subsequent messages will be automatically resent* and the connection will be re-established. If an `errorCallback` is also specified in the connection options then it will be invoked with 2 arguments.\n\n1. The error number as returned from Apple. This can be compared to the predefined values in the `Errors` object.\n1. The notification object as it existed when the notification was converted and sent to the server.\n\n\\* N.B.: The `cacheLength` option specifies the number of sent notifications which will be cached for error handling purposes. At present if more than the specified number of notifications have been sent between the incorrect notification being sent and the error being received then no resending will occur. This is only envisaged within very high volume environments and a higher cache number might be desired.\n\nLicense\n=======\n\nCopyright (c) 2012 Bergé Greg\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nCredits\n=======\n\nWritten and maintained by [Greg Bergé][neoziro].\n\nLargely inspired by [node-apn][node-apn].\n\nPreviously i used node-apn, but it revealed that it was not stable in case of big volumes, so i fork it, and finally I modified the code a lot, so I decided to create a more resilient module.\n\n[neoziro]: http://github.com/neoziro\n[node-apn]: https://github.com/argon/node-apn\n","maintainers":[{"name":"neoziro","email":"berge.greg@gmail.com"}],"time":{"modified":"2012-06-12T23:37:51.248Z","created":"2012-06-12T23:37:49.683Z","0.1.0":"2012-06-12T23:37:51.248Z"},"author":{"name":"Bergé Greg","email":"berge.greg@gmail.com","url":"http://www.neoziro.com/"},"repository":{"type":"git","url":"git://github.com/neoziro/node-apns.git"},"_attachments":{"apns-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tpyxEfpF+rH2/p+ikG5UcQ==","length":6808,"stub":true}}}},
{"id":"apoxusbcan","key":"apoxusbcan","value":{"rev":"7-8115c9dc1866ccf75965c22216d910e9"},"doc":{"_id":"apoxusbcan","_rev":"7-8115c9dc1866ccf75965c22216d910e9","name":"apoxusbcan","description":"Apox Controls USB-CAN module driver","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"apoxusbcan","version":"0.0.1","description":"Apox Controls USB-CAN module driver","author":{"name":"Georges-Etienne Legendre","email":"legege@legege.com","url":"http://legege.com"},"repository":{"type":"git","url":"git://github.com/legege/node-apoxusbcan.git"},"main":"./apoxusbcan","scripts":{"install":"node-gyp configure build"},"dependencies":{"bindings":"0.3.x"},"engines":{"node":">=0.7.0"},"_npmUser":{"name":"legege","email":"legege@legege.com"},"_id":"apoxusbcan@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"dist":{"shasum":"71825da2add3e5d645e88836cf00ee55679659a8","tarball":"http://registry.npmjs.org/apoxusbcan/-/apoxusbcan-0.0.1.tgz"},"maintainers":[{"name":"legege","email":"legege@legege.com"}]},"0.0.2":{"name":"apoxusbcan","version":"0.0.2","description":"Apox Controls USB-CAN module driver","author":{"name":"Georges-Etienne Legendre","email":"legege@legege.com","url":"http://legege.com"},"repository":{"type":"git","url":"git://github.com/legege/node-apoxusbcan.git"},"main":"./apoxusbcan","scripts":{"install":"node-gyp configure build"},"dependencies":{"bindings":"0.3.x"},"engines":{"node":">=0.8.0"},"readme":"node-apoxusbcan\n===============\n\nA node.js module for Apox Controls USB-CAN devices. Most important features of this device are\nsupported (e.g. switching to main code, and ability to send/receive CAN Bus messages).\n\nThis project has been developed with [node-xanbus](https://github.com/legege/node-xanbus) in mind.\nHowever, it would probably be useful for something else, hence the reason I'm releasing this module\nindependently.\n\nInstallation\n------------\n\nFrom npm:\n\n``` bash\n$ npm install apoxcanusb\n```\n\nFrom source:\n\n``` bash\n$ git clone https://github.com/legege/node-apoxusbcan.git\n$ cd node-apoxusbcan\n$ npm install\n```\n\nExample\n-------\n\nTo receive CAN Bus messages:\n\n``` js\nvar usbcan = new ApoxUsbCan();\n\nusbcan.on('canbusmessage', function(timestamp, rtr, id, extended, flags, data) {\n  console.log('CANBus message: timestamp =', timestamp, 'rtr =', rtr, 'id =', id, 'extended =', extended, 'flags =', flags, 'data =', data);\n});\n\nusbcan.open();\n\nusbcan.switchToMainCode(function(err) {\n  if (err) {\n    console.log('Failed to switch to main code:', err);\n    return;\n  }\n});\n```\n\nAPI\n---\n\n### ApoxUsbCan\n\n``` js\nvar usbcan = new ApoxUsbCan();\n``` \n\n#### usbcan.open()\n\n``` js\nusbcan.open();\n```\n\n  * ignored if `usbcan` is already opened\n\n#### usbcan.close()\n\n``` js\nusbcan.close();\n```\n\n  * ignored if `usbcan` is not opened or already closed\n\n#### usbcan.reset(callback)\n\n``` js\nusbcan.reset(function(err) {\n  if (err) {\n    console.log('Failed to reset:', err);\n    return;\n  }\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.isMainCodeRunning(callback)\n\n``` js\nusbcan.isMainCodeRunning(function(err) {\n  if (err) {\n    console.log('Failed to determine if main code is running:', err);\n    return;\n  }\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.switchToMainCode(callback)\n\n``` js\nusbcan.switchToMainCode(function(err, mainCodeRunning) {\n  if (err) {\n    console.log('Failed to switch to main code:', err);\n    return;\n  }\n  console.log('Is main code running?', mainCodeRunning);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.getHardwareVersion(callback)\n\n``` js\nusbcan.getHardwareVersion(function(err, version) {\n  if (err) {\n    console.log('Failed to get hardware version:', err);\n    return;\n  }\n  console.log('Hardware version:', version);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.getFirmwareVersion(callback)\n\n``` js\nusbcan.getFirmwareVersion(function(err, version) {\n  if (err) {\n    console.log('Failed to get firmware version:', err);\n    return;\n  }\n  console.log('Firmware version:', version);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.sendBoardMessage(requestCommand)\n\n``` js\nusbcan.sendBoardMessage(0x43);\n```\n\n  * It's not recommanded to use this method directly. The list of supported request commands is provided in source code.\n  * `usbcan` must be opened\n\n#### usbcan.sendBoardMessageAndReceive(requestCommand, callback, [retryCount, responseMatcher])\n\n``` js\nusbcan.sendBoardMessageAndReceive(0x43, function(err, data) {\n  if (err) {\n    console.log('Failed to send board message:', err);\n    return;\n  }\n});\n```\n  * It's not recommanded to use this method directly. The list of supported request commands is provided in source code.\n  * `retryCount` is optional, but not if `responseMatcher` is provided\n  * `responseMatcher` is optional. Example of signature below.\n\n``` js\nfunction(id, responseCommand, data) {\n  return id == 0xFF && data[0] == 0x63;\n}\n```\n\n#### usbcan.sendCanBusMessage([rtr], canId, [extendedCanId], [canData])\n\n``` js\nusbcan.sendCanBusMessage(418053888, new Buffer([0x00, 0xee, 0x00]));\nusbcan.sendCanBusMessage(418053888, true, new Buffer([0x00, 0xee, 0x00]));\nusbcan.sendCanBusMessage(false, 418053888, true, new Buffer([0x00, 0xee, 0x00]));\n```\n\n  * `usbcan` must be opened\n  * `rtr` is optional (default: `false`)\n  * `extendedCanId` is optional (default: detected based on `canId` length)\n  * `canData` is optional (default: empty `Buffer`)\n\n#### Event: 'canbusmessage'\n\n``` js\nfunction(timestamp, rtr, id, extended, flags, data) { }\n```\n\n#### Event: 'boardmessage'\n\n``` js\nfunction(id, command, data) { }\n``` \n \n#### Event: 'error'\n\n``` js\nfunction(message) { }\n```\n\nReferences\n----------\n\n  * http://www.apoxcontrols.com/USBCANmenu.htm\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (C) 2012, Georges-Etienne Legendre <legege@legege.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n\nA different license may apply to other software included in this package, \nincluding libftdi and libusb. Please consult their respective license files\nfor the terms of their individual licenses.\n","_id":"apoxusbcan@0.0.2","dist":{"shasum":"fcd1f82195f954f6ecae55e897a14cbfaec86f48","tarball":"http://registry.npmjs.org/apoxusbcan/-/apoxusbcan-0.0.2.tgz"},"maintainers":[{"name":"legege","email":"legege@legege.com"}]},"0.0.3":{"name":"apoxusbcan","version":"0.0.3","description":"Apox Controls USB-CAN module driver","author":{"name":"Georges-Etienne Legendre","email":"legege@legege.com","url":"http://legege.com"},"repository":{"type":"git","url":"git://github.com/legege/node-apoxusbcan.git"},"main":"./apoxusbcan","scripts":{"install":"node-gyp rebuild"},"dependencies":{"bindings":"0.3.x"},"engines":{"node":">=0.8.0"},"readme":"node-apoxusbcan\n===============\n\nA node.js module for Apox Controls USB-CAN devices. Most important features of this device are\nsupported (e.g. switching to main code, and ability to send/receive CAN Bus messages).\n\nThis project has been developed with [node-xanbus](https://github.com/legege/node-xanbus) in mind.\nHowever, it would probably be useful for something else, hence the reason I'm releasing this module\nindependently.\n\nInstallation\n------------\n\nFrom npm:\n\n``` bash\n$ npm install apoxcanusb\n```\n\nFrom source:\n\n``` bash\n$ git clone https://github.com/legege/node-apoxusbcan.git\n$ cd node-apoxusbcan\n$ npm install\n```\n\nExample\n-------\n\nTo receive CAN Bus messages:\n\n``` js\nvar usbcan = new ApoxUsbCan();\n\nusbcan.on('canbusmessage', function(timestamp, rtr, id, extended, flags, data) {\n  console.log('CANBus message: timestamp =', timestamp, 'rtr =', rtr, 'id =', id, 'extended =', extended, 'flags =', flags, 'data =', data);\n});\n\nusbcan.open();\n\nusbcan.switchToMainCode(function(err) {\n  if (err) {\n    console.log('Failed to switch to main code:', err);\n    return;\n  }\n});\n```\n\nAPI\n---\n\n### ApoxUsbCan\n\n``` js\nvar usbcan = new ApoxUsbCan();\n``` \n\n#### usbcan.open()\n\n``` js\nusbcan.open();\n```\n\n  * ignored if `usbcan` is already opened\n\n#### usbcan.close()\n\n``` js\nusbcan.close();\n```\n\n  * ignored if `usbcan` is not opened or already closed\n\n#### usbcan.reset(callback)\n\n``` js\nusbcan.reset(function(err) {\n  if (err) {\n    console.log('Failed to reset:', err);\n    return;\n  }\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.isMainCodeRunning(callback)\n\n``` js\nusbcan.isMainCodeRunning(function(err) {\n  if (err) {\n    console.log('Failed to determine if main code is running:', err);\n    return;\n  }\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.switchToMainCode(callback)\n\n``` js\nusbcan.switchToMainCode(function(err, mainCodeRunning) {\n  if (err) {\n    console.log('Failed to switch to main code:', err);\n    return;\n  }\n  console.log('Is main code running?', mainCodeRunning);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.getHardwareVersion(callback)\n\n``` js\nusbcan.getHardwareVersion(function(err, version) {\n  if (err) {\n    console.log('Failed to get hardware version:', err);\n    return;\n  }\n  console.log('Hardware version:', version);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.getFirmwareVersion(callback)\n\n``` js\nusbcan.getFirmwareVersion(function(err, version) {\n  if (err) {\n    console.log('Failed to get firmware version:', err);\n    return;\n  }\n  console.log('Firmware version:', version);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.sendBoardMessage(requestCommand)\n\n``` js\nusbcan.sendBoardMessage(0x43);\n```\n\n  * It's not recommanded to use this method directly. The list of supported request commands is provided in source code.\n  * `usbcan` must be opened\n\n#### usbcan.sendBoardMessageAndReceive(requestCommand, callback, [retryCount, responseMatcher])\n\n``` js\nusbcan.sendBoardMessageAndReceive(0x43, function(err, data) {\n  if (err) {\n    console.log('Failed to send board message:', err);\n    return;\n  }\n});\n```\n  * It's not recommanded to use this method directly. The list of supported request commands is provided in source code.\n  * `retryCount` is optional, but not if `responseMatcher` is provided\n  * `responseMatcher` is optional. Example of signature below.\n\n``` js\nfunction(id, responseCommand, data) {\n  return id == 0xFF && data[0] == 0x63;\n}\n```\n\n#### usbcan.sendCanBusMessage([rtr], canId, [extendedCanId], [canData])\n\n``` js\nusbcan.sendCanBusMessage(418053888, new Buffer([0x00, 0xee, 0x00]));\nusbcan.sendCanBusMessage(418053888, true, new Buffer([0x00, 0xee, 0x00]));\nusbcan.sendCanBusMessage(false, 418053888, true, new Buffer([0x00, 0xee, 0x00]));\n```\n\n  * `usbcan` must be opened\n  * `rtr` is optional (default: `false`)\n  * `extendedCanId` is optional (default: detected based on `canId` length)\n  * `canData` is optional (default: empty `Buffer`)\n\n#### Event: 'canbusmessage'\n\n``` js\nfunction(timestamp, rtr, id, extended, flags, data) { }\n```\n\n#### Event: 'boardmessage'\n\n``` js\nfunction(id, command, data) { }\n``` \n \n#### Event: 'error'\n\n``` js\nfunction(message) { }\n```\n\nReferences\n----------\n\n  * http://www.apoxcontrols.com/USBCANmenu.htm\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (C) 2012, Georges-Etienne Legendre <legege@legege.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n\nA different license may apply to other software included in this package, \nincluding libftdi and libusb. Please consult their respective license files\nfor the terms of their individual licenses.\n","_id":"apoxusbcan@0.0.3","dist":{"shasum":"c26096dfb80b4f07ea3542e65985dad440879af5","tarball":"http://registry.npmjs.org/apoxusbcan/-/apoxusbcan-0.0.3.tgz"},"maintainers":[{"name":"legege","email":"legege@legege.com"}]}},"readme":"node-apoxusbcan\n===============\n\nA node.js module for Apox Controls USB-CAN devices. Most important features of this device are\nsupported (e.g. switching to main code, and ability to send/receive CAN Bus messages).\n\nThis project has been developed with [node-xanbus](https://github.com/legege/node-xanbus) in mind.\nHowever, it would probably be useful for something else, hence the reason I'm releasing this module\nindependently.\n\nInstallation\n------------\n\nFrom npm:\n\n``` bash\n$ npm install apoxcanusb\n```\n\nFrom source:\n\n``` bash\n$ git clone https://github.com/legege/node-apoxusbcan.git\n$ cd node-apoxusbcan\n$ npm install\n```\n\nExample\n-------\n\nTo receive CAN Bus messages:\n\n``` js\nvar usbcan = new ApoxUsbCan();\n\nusbcan.on('canbusmessage', function(timestamp, rtr, id, extended, flags, data) {\n  console.log('CANBus message: timestamp =', timestamp, 'rtr =', rtr, 'id =', id, 'extended =', extended, 'flags =', flags, 'data =', data);\n});\n\nusbcan.open();\n\nusbcan.switchToMainCode(function(err) {\n  if (err) {\n    console.log('Failed to switch to main code:', err);\n    return;\n  }\n});\n```\n\nAPI\n---\n\n### ApoxUsbCan\n\n``` js\nvar usbcan = new ApoxUsbCan();\n``` \n\n#### usbcan.open()\n\n``` js\nusbcan.open();\n```\n\n  * ignored if `usbcan` is already opened\n\n#### usbcan.close()\n\n``` js\nusbcan.close();\n```\n\n  * ignored if `usbcan` is not opened or already closed\n\n#### usbcan.reset(callback)\n\n``` js\nusbcan.reset(function(err) {\n  if (err) {\n    console.log('Failed to reset:', err);\n    return;\n  }\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.isMainCodeRunning(callback)\n\n``` js\nusbcan.isMainCodeRunning(function(err) {\n  if (err) {\n    console.log('Failed to determine if main code is running:', err);\n    return;\n  }\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.switchToMainCode(callback)\n\n``` js\nusbcan.switchToMainCode(function(err, mainCodeRunning) {\n  if (err) {\n    console.log('Failed to switch to main code:', err);\n    return;\n  }\n  console.log('Is main code running?', mainCodeRunning);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.getHardwareVersion(callback)\n\n``` js\nusbcan.getHardwareVersion(function(err, version) {\n  if (err) {\n    console.log('Failed to get hardware version:', err);\n    return;\n  }\n  console.log('Hardware version:', version);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.getFirmwareVersion(callback)\n\n``` js\nusbcan.getFirmwareVersion(function(err, version) {\n  if (err) {\n    console.log('Failed to get firmware version:', err);\n    return;\n  }\n  console.log('Firmware version:', version);\n});\n```\n\n  * `usbcan` must be opened\n\n#### usbcan.sendBoardMessage(requestCommand)\n\n``` js\nusbcan.sendBoardMessage(0x43);\n```\n\n  * It's not recommanded to use this method directly. The list of supported request commands is provided in source code.\n  * `usbcan` must be opened\n\n#### usbcan.sendBoardMessageAndReceive(requestCommand, callback, [retryCount, responseMatcher])\n\n``` js\nusbcan.sendBoardMessageAndReceive(0x43, function(err, data) {\n  if (err) {\n    console.log('Failed to send board message:', err);\n    return;\n  }\n});\n```\n  * It's not recommanded to use this method directly. The list of supported request commands is provided in source code.\n  * `retryCount` is optional, but not if `responseMatcher` is provided\n  * `responseMatcher` is optional. Example of signature below.\n\n``` js\nfunction(id, responseCommand, data) {\n  return id == 0xFF && data[0] == 0x63;\n}\n```\n\n#### usbcan.sendCanBusMessage([rtr], canId, [extendedCanId], [canData])\n\n``` js\nusbcan.sendCanBusMessage(418053888, new Buffer([0x00, 0xee, 0x00]));\nusbcan.sendCanBusMessage(418053888, true, new Buffer([0x00, 0xee, 0x00]));\nusbcan.sendCanBusMessage(false, 418053888, true, new Buffer([0x00, 0xee, 0x00]));\n```\n\n  * `usbcan` must be opened\n  * `rtr` is optional (default: `false`)\n  * `extendedCanId` is optional (default: detected based on `canId` length)\n  * `canData` is optional (default: empty `Buffer`)\n\n#### Event: 'canbusmessage'\n\n``` js\nfunction(timestamp, rtr, id, extended, flags, data) { }\n```\n\n#### Event: 'boardmessage'\n\n``` js\nfunction(id, command, data) { }\n``` \n \n#### Event: 'error'\n\n``` js\nfunction(message) { }\n```\n\nReferences\n----------\n\n  * http://www.apoxcontrols.com/USBCANmenu.htm\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (C) 2012, Georges-Etienne Legendre <legege@legege.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n\nA different license may apply to other software included in this package, \nincluding libftdi and libusb. Please consult their respective license files\nfor the terms of their individual licenses.\n","maintainers":[{"name":"legege","email":"legege@legege.com"}],"time":{"modified":"2012-08-06T22:36:52.778Z","created":"2012-05-15T12:07:07.708Z","0.0.1":"2012-05-15T12:07:08.260Z","0.0.2":"2012-07-17T01:43:32.760Z","0.0.3":"2012-08-06T22:36:52.778Z"},"author":{"name":"Georges-Etienne Legendre","email":"legege@legege.com","url":"http://legege.com"},"repository":{"type":"git","url":"git://github.com/legege/node-apoxusbcan.git"},"_attachments":{"apoxusbcan-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0LoPtNhYjLPwnjH4uAGRZQ==","length":313501,"stub":true},"apoxusbcan-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MtF5A4WXnRxGJX12HtlFvw==","length":313484,"stub":true},"apoxusbcan-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xaRHlQufhvcK6UJ08vzx1w==","length":313378,"stub":true}}}},
{"id":"app","key":"app","value":{"rev":"3-7923bd59e098e6f08f3e79fc2c92d592"},"doc":{"_id":"app","_rev":"3-7923bd59e098e6f08f3e79fc2c92d592","name":"app","description":"mirco web app framework","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"app","main":"lib/index.js","author":{"name":"Roland Poulter"},"version":"0.1.0","keywords":["micro","web","app"],"homepage":"https://github.com/rolandpoulter/app","repository":{"type":"git","url":"git://github.com/rolandpoulter/app.git"},"description":"mirco web app framework","contributors":[],"dependencies":{"cornerstone":"x","app-client":"x","uglify-js":"x","optimist":"x","mongoose":"x","connect":"x","mime":"x"},"_npmUser":{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"},"_id":"app@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"793e12f51f7cce0922c23165261543786a747fea","tarball":"http://registry.npmjs.org/app/-/app-0.1.0.tgz"},"maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}]}},"readme":"# app\n\nJavaScript web application development framework\nbuilt on [node](http://nodejs.org) and [Connect](http://github.com/senchalabs/connect).\n\n\tvar App = require('app'),\n\t    app = new App();\n\t\n\tapp.routes({'': function (req, res, next){\n\t  res.send('Hello World');\n\t});\n\t\n\tapp.listen();\n\n## Installation\n\n\t$ npm install app\n\n## Running Tests\n\n\t$ node test\n\n## License \n\nCopyright (C) 2011 by Roland Poulter\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}],"time":{"modified":"2011-11-20T01:48:35.198Z","created":"2011-11-20T01:48:33.928Z","0.1.0":"2011-11-20T01:48:35.198Z"},"author":{"name":"Roland Poulter"},"repository":{"type":"git","url":"git://github.com/rolandpoulter/app.git"},"_attachments":{"app-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hejcN9GI+DNIBYrTghyD7g==","length":10240,"stub":true}}}},
{"id":"app-client","key":"app-client","value":{"rev":"3-ee11275bd5b75ac0e17834c5001cfe0c"},"doc":{"_id":"app-client","_rev":"3-ee11275bd5b75ac0e17834c5001cfe0c","name":"app-client","description":"","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"app-client","main":"index.js","author":{"name":"Roland Poulter"},"version":"0.1.0","keywords":[],"homepage":"https://github.com/rolandpoulter/app-client","repository":{"type":"git","url":"git://github.com/rolandpoulter/app-client.git"},"description":"","contributors":[],"dependencies":{"cornerstone":"x","optimist":"x","connect":"x","modulator":"x"},"_npmUser":{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"},"_id":"app-client@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"2b5a4e7b1702aa65fdd8c9ce668378a35860709d","tarball":"http://registry.npmjs.org/app-client/-/app-client-0.1.0.tgz"},"maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}]}},"readme":"# app-client\n\nThe client side of [app](http://github.com/rolandpoulter/app)\n\n## Installation\n\n\t$ npm install app-client\n\n## Running Tests\n\n\t$ node test\n\n## License \n\nCopyright (C) 2011 by Roland Poulter\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}],"time":{"modified":"2011-11-24T07:37:39.006Z","created":"2011-11-24T07:37:37.722Z","0.1.0":"2011-11-24T07:37:39.006Z"},"author":{"name":"Roland Poulter"},"repository":{"type":"git","url":"git://github.com/rolandpoulter/app-client.git"},"_attachments":{"app-client-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KfM7RAnXOt04Ci9KoKHT1Q==","length":10240,"stub":true}}}},
{"id":"app-template","key":"app-template","value":{"rev":"3-530a9139e6ae37f12e61a4e59eca3e44"},"doc":{"_id":"app-template","_rev":"3-530a9139e6ae37f12e61a4e59eca3e44","name":"app-template","description":"template application","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"app-template","main":"app.js","author":{"name":"Roland Poulter"},"version":"0.1.0","keywords":[],"homepage":"https://github.com/rolandpoulter/node-app-template","repository":{"type":"git","url":"git://github.com/rolandpoulter/node-app-template.git"},"description":"template application","contributors":[],"dependencies":{"app":"0","optimist":"0","ezcrypto":"0"},"_npmUser":{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"},"_id":"app-template@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"e65b5f7f5740b4ca0940d6640d04c15b5ccebc63","tarball":"http://registry.npmjs.org/app-template/-/app-template-0.1.0.tgz"},"maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}]}},"readme":"# app-template\n\nExample template user login [app](http://github.com/rolandpoulter/app)\n\n## Running Tests\n\n\t$ node test\n\n## License \n\nCopyright (C) 2011 by Roland Poulter\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}],"time":{"modified":"2011-11-20T01:49:02.520Z","created":"2011-11-20T01:49:01.277Z","0.1.0":"2011-11-20T01:49:02.520Z"},"author":{"name":"Roland Poulter"},"repository":{"type":"git","url":"git://github.com/rolandpoulter/node-app-template.git"},"_attachments":{"app-template-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ohEkNalDmLnA8ZNyxS01sg==","length":10240,"stub":true}}}},
{"id":"app.js","key":"app.js","value":{"rev":"19-0507e288de2565ac075bc1f43442fd39"},"doc":{"_id":"app.js","_rev":"19-0507e288de2565ac075bc1f43442fd39","name":"app.js","description":"Packages Node modules as browser apps.","dist-tags":{"latest":"0.0.11"},"versions":{"0.0.1":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.1","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.1","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f26e998fe2fdfacaaefb42858ce5e69b9e6f6b24","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.3":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.3","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.3","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a992f9509958959e0febfc1ce33f3859e8a0b868","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.4":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.4","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.4","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"07d1fbd8035ba01ff3b3c4c8fbefa8329655fa80","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.5":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.5","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.5","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"60f434495a44c85e5376d7e0aec049181f86da70","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.6":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.6","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.6","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"37f4c761f19fcb778f489ea2ba984e817a45d7ba","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.7":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.7","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.7","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"284bfff3eabdd0eb064a1749e588bb1a941b79a4","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.7.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.8":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.8","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_id":"app.js@0.0.8","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f39524141f2f6e45a5cc967cfa9eb2b33c72a59c","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.8.tgz"},"scripts":{},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.10":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.10","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"_npmUser":{"name":"joehewitt","email":"joe@joehewitt.com"},"_id":"app.js@0.0.10","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"81b5a2e1ef48270dab9b27715841bf29f6feb6c0","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.10.tgz"},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]},"0.0.11":{"name":"app.js","description":"Packages Node modules as browser apps.","version":"0.0.11","homepage":"http://github.com/joehewitt/app.js","repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"keywords":["compressor"],"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"contributors":[],"dependencies":{"async":"","cssmin":"","dandy":"","diskcache":"","hascan":"","express":"","express-cache":"","express-logger":"","express-rewrite":"","jsdom":"0.2.2","mime":"","optimist":"","transformjs":"","uglify-js":"","underscore":"","vows":">=0.5.4"},"bin":{"appjs":"./bin/appjs"},"main":"./lib/appjs","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"joehewitt","email":"joe@joehewitt.com"},"_id":"app.js@0.0.11","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1aecfd23ce69f33af2422982ba8ee7d899d8695e","tarball":"http://registry.npmjs.org/app.js/-/app.js-0.0.11.tgz"},"readme":"app.js\n========\n\nTurns Node.js modules into web apps and optionally serves them for you too.\n\nStatus\n------\n\nApp.js is a work-in-progress and is only intended for my personal use at this time.\n\nInstallation\n------------\n\n    $ npm install app.js\n\nLicense \n-------\n\nCopyright 2011 Joe Hewitt\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n \n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}]}},"maintainers":[{"name":"joehewitt","email":"joe@joehewitt.com"}],"time":{"modified":"2012-04-14T21:10:42.864Z","created":"2011-09-12T23:07:00.929Z","0.0.1":"2011-09-12T23:07:01.514Z","0.0.3":"2011-09-30T05:42:03.930Z","0.0.4":"2011-10-01T00:04:31.111Z","0.0.5":"2011-10-02T23:58:25.391Z","0.0.6":"2011-10-05T21:38:09.731Z","0.0.7":"2011-10-10T06:52:10.297Z","0.0.8":"2011-10-23T04:02:07.766Z","0.0.10":"2011-11-29T09:26:16.872Z","0.0.11":"2012-04-14T21:10:42.864Z"},"author":{"name":"Joe Hewitt","email":"joe@joehewitt.com"},"repository":{"type":"git","url":"git://github.com/joehewitt/app.js.git"},"_attachments":{"app.js-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-52S4T1tf8oXkaEMvdJyfcg==","length":27867,"stub":true},"app.js-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-QTiuf8TmHoUdbjdYj10SzA==","length":30720,"stub":true},"app.js-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-UQV6WRP5By1dGrO5qQBOfw==","length":26495,"stub":true},"app.js-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-L+kKHJhQpRIX5i1Meclu5g==","length":34176,"stub":true},"app.js-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-NcSITJEsqmO4qrR54AalHA==","length":34146,"stub":true},"app.js-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-eUL9ueuH/Wnp8+Mv6A2cpA==","length":34142,"stub":true},"app.js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SEPHN5baEIT82pisi6GmGg==","length":33967,"stub":true},"app.js-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-E4y9vzPl88Api2jty1rqhg==","length":33961,"stub":true},"app.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+r3y4TkgueCIU4BTtqgZAg==","length":33961,"stub":true}}}},
{"id":"apparatus","key":"apparatus","value":{"rev":"13-579091ca4c63cfadff9dd0093201ad05"},"doc":{"_id":"apparatus","_rev":"13-579091ca4c63cfadff9dd0093201ad05","name":"apparatus","description":"various machine learning routines for node","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"apparatus","description":"machine learning routines","version":"0.0.1","engines":{"node":">=0.2.6"},"dependencies":{"sylvester":">= 0.0.8"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"keywords":["machine","learning","ml"],"main":"./lib/apparatus/index.js","maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"_npmUser":{"name":"chrisumbel","email":"chris@chrisumbel.com"},"_id":"apparatus@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ed3f06d02b6e97376c4032662e8c9cd03ed85b7b","tarball":"http://registry.npmjs.org/apparatus/-/apparatus-0.0.1.tgz"}},"0.0.2":{"name":"apparatus","description":"various machine learning routines for node","version":"0.0.2","engines":{"node":">=0.2.6"},"dependencies":{"sylvester":">= 0.0.8"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"keywords":["machine","learning","ml","classifier","clustering","bayes","k-means","logistic","regression"],"main":"./lib/apparatus/index.js","maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"_npmUser":{"name":"chrisumbel","email":"chris@chrisumbel.com"},"_id":"apparatus@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8592d2b319f13ef3865afd629f32a289e91e7ebe","tarball":"http://registry.npmjs.org/apparatus/-/apparatus-0.0.2.tgz"}},"0.0.3":{"name":"apparatus","description":"various machine learning routines for node","version":"0.0.3","engines":{"node":">=0.2.6"},"dependencies":{"sylvester":">= 0.0.8"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"keywords":["machine","learning","ml","classifier","clustering","bayes","k-means","logistic","regression"],"main":"./lib/apparatus/index.js","maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"_npmUser":{"name":"chrisumbel","email":"chris@chrisumbel.com"},"_id":"apparatus@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"83a7499cff3982319aa32902b53e01a1ef3545fd","tarball":"http://registry.npmjs.org/apparatus/-/apparatus-0.0.3.tgz"}},"0.0.4":{"name":"apparatus","description":"various machine learning routines for node","version":"0.0.4","engines":{"node":">=0.2.6"},"dependencies":{"sylvester":">= 0.0.8"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"keywords":["machine","learning","ml","classifier","clustering","bayes","k-means","logistic","regression"],"main":"./lib/apparatus/index.js","maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"_npmUser":{"name":"chrisumbel","email":"chris@chrisumbel.com"},"_id":"apparatus@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b128258d3f6a07ee0b8ec194af592daa8fbdff72","tarball":"http://registry.npmjs.org/apparatus/-/apparatus-0.0.4.tgz"}},"0.0.5":{"name":"apparatus","description":"various machine learning routines for node","version":"0.0.5","engines":{"node":">=0.2.6"},"dependencies":{"sylvester":">= 0.0.8"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"keywords":["machine","learning","ml","classifier","clustering","bayes","k-means","logistic","regression"],"main":"./lib/apparatus/index.js","maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"_npmUser":{"name":"chrisumbel","email":"chris@chrisumbel.com"},"_id":"apparatus@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"60420841337664fe67b4e1f687038725c64271b1","tarball":"http://registry.npmjs.org/apparatus/-/apparatus-0.0.5.tgz"}},"0.0.6":{"name":"apparatus","description":"various machine learning routines for node","version":"0.0.6","engines":{"node":">=0.2.6"},"dependencies":{"sylvester":">= 0.0.8"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"keywords":["machine","learning","ml","classifier","clustering","bayes","k-means","logistic","regression"],"main":"./lib/apparatus/index.js","maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"_npmUser":{"name":"chrisumbel","email":"chris@chrisumbel.com"},"_id":"apparatus@0.0.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"09a586c8d679a313079c08e1f3e000ccb5682240","tarball":"http://registry.npmjs.org/apparatus/-/apparatus-0.0.6.tgz"}}},"readme":null,"maintainers":[{"name":"chrisumbel","email":"chris@chrisumbel.com"}],"time":{"modified":"2012-02-17T04:33:12.476Z","created":"2011-11-27T04:19:14.316Z","0.0.1":"2011-11-27T04:19:15.341Z","0.0.2":"2011-11-27T21:00:50.739Z","0.0.3":"2011-11-27T21:52:00.314Z","0.0.4":"2011-11-28T01:41:07.582Z","0.0.5":"2011-12-17T11:26:12.568Z","0.0.6":"2012-02-17T04:33:12.476Z"},"author":{"name":"Chris Umbel","email":"chris@chrisumbel.com"},"_attachments":{"apparatus-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zUgWrJozBLLK7mzl9IIP+A==","length":10240,"stub":true},"apparatus-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-EHbP6L7wSQ+WZQeyykOWyA==","length":10240,"stub":true},"apparatus-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fJwT/Rbqck2HNTbub1QunA==","length":10240,"stub":true},"apparatus-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-riux0EuxyFYDX/imkYI/Lw==","length":10240,"stub":true},"apparatus-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/VX612aOSbtmuP+AawMVIA==","length":10240,"stub":true},"apparatus-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KZQ977M+9WgM8qJwTpcQXA==","length":10240,"stub":true}}}},
{"id":"appboard","key":"appboard","value":{"rev":"9-e4b53cf6c4e58ae696858a34af8ba90b"},"doc":{"_id":"appboard","_rev":"9-e4b53cf6c4e58ae696858a34af8ba90b","name":"appboard","description":"RESTful HTTP API for pushing your data to appboard.me dashboard for node.js","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"appboard","version":"0.0.1","description":"RESTful HTTP API for pushing your data to appboard.me dashboard for node.js","keywords":["dashboard","client","charting","chart","charts","infographic","metrics","analytics","notification","alert","api"],"author":{"name":"Eugene Solomka","email":"eugene@appboard.me"},"repository":{"type":"git","url":"git@github.com:appboard/appboard-node.git"},"dependencies":{},"devDependencies":{},"main":"appboard","engines":{"node":"*"},"_npmUser":{"name":"appboard","email":"eugene@appboard.me"},"_id":"appboard@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7b2923d83ac348713ddf4ee8d13566607d3d2d21","tarball":"http://registry.npmjs.org/appboard/-/appboard-0.0.1.tgz"},"maintainers":[{"name":"appboard","email":"eugene@appboard.me"}]},"0.0.2":{"name":"appboard","version":"0.0.2","description":"RESTful HTTP API for pushing your data to appboard.me dashboard for node.js","keywords":["dashboard","client","charting","chart","charts","infographic","metrics","analytics","notification","alert","api"],"author":{"name":"Eugene Solomka","email":"eugene@appboard.me"},"repository":{"type":"git","url":"git@github.com:appboard/appboard-node.git"},"dependencies":{},"devDependencies":{},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"appboard","email":"eugene@appboard.me"},"_id":"appboard@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9613119f3b19db66cf6871c9723350f2fd112f9a","tarball":"http://registry.npmjs.org/appboard/-/appboard-0.0.2.tgz"},"maintainers":[{"name":"appboard","email":"eugene@appboard.me"}]},"0.0.3":{"name":"appboard","version":"0.0.3","description":"RESTful HTTP API for pushing your data to appboard.me dashboard for node.js","keywords":["dashboard","client","charting","chart","charts","infographic","metrics","analytics","notification","alert","api"],"author":{"name":"Eugene Solomka","email":"eugene@appboard.me"},"repository":{"type":"git","url":"git@github.com:appboard/appboard-node.git"},"dependencies":{},"devDependencies":{},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"appboard","email":"eugene@appboard.me"},"_id":"appboard@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"dd5d09bdf30c58a441394f6b5551848b55f0cba4","tarball":"http://registry.npmjs.org/appboard/-/appboard-0.0.3.tgz"},"maintainers":[{"name":"appboard","email":"eugene@appboard.me"}]},"0.0.4":{"name":"appboard","version":"0.0.4","description":"RESTful HTTP API for pushing your data to appboard.me dashboard for node.js","keywords":["dashboard","client","charting","chart","charts","infographic","metrics","analytics","notification","alert","api"],"author":{"name":"Eugene Solomka","email":"eugene@appboard.me"},"repository":{"type":"git","url":"git@github.com:appboard/appboard-node.git"},"dependencies":{},"devDependencies":{},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"appboard","email":"eugene@appboard.me"},"_id":"appboard@0.0.4","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"834599ce8b09f427e5b3a6aaea78817389679de7","tarball":"http://registry.npmjs.org/appboard/-/appboard-0.0.4.tgz"},"maintainers":[{"name":"appboard","email":"eugene@appboard.me"}]}},"readme":"\r\n","maintainers":[{"name":"appboard","email":"eugene@appboard.me"}],"time":{"modified":"2012-02-06T16:18:02.383Z","created":"2012-01-29T17:00:01.661Z","0.0.1":"2012-01-29T17:00:05.319Z","0.0.2":"2012-01-30T13:35:08.667Z","0.0.3":"2012-01-30T20:47:30.438Z","0.0.4":"2012-02-06T16:18:02.383Z"},"author":{"name":"Eugene Solomka","email":"eugene@appboard.me"},"repository":{"type":"git","url":"git@github.com:appboard/appboard-node.git"},"_attachments":{"appboard-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-UucWv8FB9PZxnibeU7cvbA==","length":36833,"stub":true},"appboard-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1CbgckASI2pKHXlVqU0UMg==","length":9295,"stub":true},"appboard-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-941i92MKkFYy3FK33NkKyg==","length":8633,"stub":true},"appboard-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7SLDfGXJEyUAavg/FAtXTg==","length":5672,"stub":true}}}},
{"id":"appborg","key":"appborg","value":{"rev":"33-84a067b51046c94ed244d48a50a2578f"},"doc":{"_id":"appborg","_rev":"33-84a067b51046c94ed244d48a50a2578f","name":"appborg","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","dist-tags":{"latest":"0.0.17"},"versions":{"0.0.1":{"name":"appborg","version":"0.0.1","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"lib/appborg.js","dependencies":{"linestream":">=0.2.1"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f8f31a2f8011dd055062bc522016056dbfb953fb","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.2":{"name":"appborg","version":"0.0.2","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"lib/appborg.js","dependencies":{"linestream":">=0.2.1"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8703246b7c52a45beb1e2968c77e31c46a793d1e","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.3":{"name":"appborg","version":"0.0.3","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"lib/appborg.js","dependencies":{"linestream":">=0.2.1"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9ee0c4864d02be371cc358871ed8702d1b58fdb6","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.4":{"name":"appborg","version":"0.0.4","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"lib/appborg.js","dependencies":{"linestream":">=0.2.1"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ce3abd1736932fdd9fbcb452277c6ef2d977ac10","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.5":{"name":"appborg","version":"0.0.5","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"140479c83b4fd5fac53da2951a53897f146ea8c3","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.6":{"name":"appborg","version":"0.0.6","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.12"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4498b3a0709bb01a09997c5fcf470fe7c869dd33","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.7":{"name":"appborg","version":"0.0.7","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.12"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2fd45891f2b8adf30776bc61c1181eac6f0dbf31","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.7.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.8":{"name":"appborg","version":"0.0.8","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.12"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2fcf2ae2645125b0462290d3bb70cbda52f6a5e7","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.8.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.9":{"name":"appborg","version":"0.0.9","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.12"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_id":"appborg@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8accd65466558ff585214973bb2df8e751c8629d","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.9.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.11":{"name":"appborg","version":"0.0.11","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"615f3fb21d8bbd09b6aeca7617dd56fe95e86e2f","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.11.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.12":{"name":"appborg","version":"0.0.12","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"751cd1cadbdc71e6a25285a7df065653a976dac1","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.12.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.13":{"name":"appborg","version":"0.0.13","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":">=0.2.1","underscore":">=1.2.0","async":">=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"99b062ac8b3459c7ebd861af2832a1240ce73aaa","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.13.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.14":{"name":"appborg","version":"0.0.14","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":"=0.2.2","underscore":"=1.2.0","async":"=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"345c90de831ea8bc428b19a26fe367c244f5812a","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.14.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.15":{"name":"appborg","version":"0.0.15","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":"=0.2.2","underscore":"=1.2.0","async":"=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.15","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"94650d166e1bceac2dfccd16c9ce359f21ea1df4","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.15.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.16":{"name":"appborg","version":"0.0.16","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/andrewschaaf/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":"=0.2.2","underscore":"=1.2.0","async":"=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"78a927b8d1237a543e3a2206b20d88401e5144c6","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.16.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.17":{"name":"appborg","version":"0.0.17","description":"appborg helps you build hybrid apps: native + webkit* + subprocess*","url":"https://github.com/shopkeep/appborg","main":"js/lib/appborg.js","dependencies":{"linestream":"=0.2.2","underscore":"=1.2.0","async":"=0.1.10"},"devDependencies":{"tafa-misc-util":"=0.1.6"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/shopkeep/appborg.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"appborg@0.0.17","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bc14b8fe8c6151a83ab37b0dfd2cf1676e0a0e15","tarball":"http://registry.npmjs.org/appborg/-/appborg-0.0.17.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]}},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}],"time":{"modified":"2011-11-26T00:58:34.904Z","created":"2011-10-03T18:33:15.569Z","0.0.1":"2011-10-03T18:33:15.829Z","0.0.2":"2011-10-11T14:17:08.036Z","0.0.3":"2011-10-11T15:32:19.839Z","0.0.4":"2011-10-11T15:40:50.452Z","0.0.5":"2011-10-17T14:45:26.832Z","0.0.6":"2011-10-18T19:36:35.622Z","0.0.7":"2011-10-19T14:05:33.504Z","0.0.8":"2011-10-24T23:11:49.097Z","0.0.9":"2011-10-25T19:08:56.255Z","0.0.11":"2011-10-27T09:43:51.641Z","0.0.12":"2011-11-04T10:46:50.727Z","0.0.13":"2011-11-10T17:58:40.674Z","0.0.14":"2011-11-10T22:03:52.099Z","0.0.15":"2011-11-17T21:56:58.262Z","0.0.16":"2011-11-21T13:09:03.080Z","0.0.17":"2011-11-26T00:58:34.904Z"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/shopkeep/appborg.git"},"_attachments":{"appborg-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-EsSJLHNnDeULu1T4m3Q7VQ==","length":40960,"stub":true},"appborg-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-KWaMrsXMkt+7n5xK8MdUZg==","length":40960,"stub":true},"appborg-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-tIB3geNhywadCLKqdiU8cw==","length":40960,"stub":true},"appborg-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-pfcP05IUZ6X8zhXBjZ58JA==","length":30720,"stub":true},"appborg-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-bNbfOwoLVKtQrRlbB2eUgQ==","length":30720,"stub":true},"appborg-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-TZCpl3Eq14yGD6zLoMtreg==","length":30720,"stub":true},"appborg-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-7Y+AwH1VsfkV9j1Wv15B5w==","length":30720,"stub":true},"appborg-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-NS47nEuZwCoQ8/yvTs6MsA==","length":28989,"stub":true},"appborg-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-zVEJHl38YqmxghkxfsR7qw==","length":28970,"stub":true},"appborg-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-OGcLfwcEcfki+PLf1kGpGA==","length":27891,"stub":true},"appborg-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-RXvwMPOyUqv9Zcj7NmZN0w==","length":27859,"stub":true},"appborg-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ksi9PlrjZQ6ZxKRDcNcxYQ==","length":27616,"stub":true},"appborg-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-JqOh9NbSDGsREF/7fP3Ikg==","length":5873,"stub":true},"appborg-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FrQN/pBLkSddsEqhLs4KxA==","length":5053,"stub":true},"appborg-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-r4tyHWhLpJ1HevmQPKmtEA==","length":4207,"stub":true},"appborg-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-s8FFncgEfXYSRNI6qBfjVA==","length":4427,"stub":true}}}},
{"id":"appcache-brunch","key":"appcache-brunch","value":{"rev":"3-7e89545ef0e15b610c8f4611c06c51e5"},"doc":{"_id":"appcache-brunch","_rev":"3-7e89545ef0e15b610c8f4611c06c51e5","name":"appcache-brunch","description":"Adds HTML5 .appcache generation to brunch.","dist-tags":{"latest":"1.4.0"},"versions":{"1.4.0":{"name":"appcache-brunch","version":"1.4.0","description":"Adds HTML5 .appcache generation to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/coffee-script-brunch","repository":{"type":"git","url":"git@github.com:brunch/coffee-script-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"# appcache-brunch\nAdds [brunch](http://brunch.io) compilation time to HTML5 appcache file.\n\nIf `appcache.appcache` exists in any of your `assets/` directory,\nplugin will add build time on bottom of the file after every build.\n\n## Usage\nAdd `\"appcache-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"appcache-brunch\": \"git+ssh://git@github.com:brunch/appcache-brunch.git\"`.\n","_id":"appcache-brunch@1.4.0","dist":{"shasum":"b6dda41c0b78cf27ceaede87039249588c718675","tarball":"http://registry.npmjs.org/appcache-brunch/-/appcache-brunch-1.4.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]}},"readme":"# appcache-brunch\nAdds [brunch](http://brunch.io) compilation time to HTML5 appcache file.\n\nIf `appcache.appcache` exists in any of your `assets/` directory,\nplugin will add build time on bottom of the file after every build.\n\n## Usage\nAdd `\"appcache-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"appcache-brunch\": \"git+ssh://git@github.com:brunch/appcache-brunch.git\"`.\n","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-07-15T17:14:06.887Z","created":"2012-07-15T17:14:05.229Z","1.4.0":"2012-07-15T17:14:06.887Z"},"author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"repository":{"type":"git","url":"git@github.com:brunch/coffee-script-brunch.git"},"_attachments":{"appcache-brunch-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-A59FV+RsaimbCo/f3wWs3Q==","length":2201,"stub":true}}}},
{"id":"appcelerator","key":"appcelerator","value":{"rev":"4-b3929364f302a94da69858d7409a4b38"},"doc":{"_id":"appcelerator","_rev":"4-b3929364f302a94da69858d7409a4b38","name":"appcelerator","description":"Appcelerator ACS API package for Node.js","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"appcelerator","version":"1.0.1","description":"Appcelerator ACS API package for Node.js","keywords":["appcelerator","acs","javascript"],"maintainers":[{"name":"benedmunds","email":"ben.edmunds@gmail.com"}],"contributors":[{"name":"Ben Edmunds","email":"ben.edmunds@gmail.com","url":"http://benedmunds.com"}],"bugs":{"email":"ben.edmunds@gmail.com","url":"http://github.com/benedmunds/Node-Appcelerator/issues"},"repositories":[{"type":"git","url":"http://github.com/benedmunds/Node-Appcelerator.git"}],"dependencies":{"request":">=2.2.0"},"engines":{"node":">=0.1.9"},"directories":{"lib":"./lib"},"main":"./lib/appcelerator","devDependencies":{},"optionalDependencies":{},"author":{"name":"Ben Edmunds","email":"ben@dbltaplabs.com","url":"http://benedmunds.com"},"homepage":"http://github.com/DblTapLabs/Node-Appcelerator","repository":{"type":"git","url":"git://github.com/DblTapLabs/Node-Appcelerator.git"},"_npmUser":{"name":"benedmunds","email":"ben.edmunds@gmail.com"},"_id":"appcelerator@1.0.1","_engineSupported":true,"_npmVersion":"1.1.14","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"bd84bb70c088ecd2917b21d034b526129226f1e9","tarball":"http://registry.npmjs.org/appcelerator/-/appcelerator-1.0.1.tgz"}}},"readme":"#Appcelerator ACS API Node.js Module\nA Node.js module that is a simple port of the Appcelerator ACS Javascript SDK to Node  \n\n\n##Setup\nInstall the module  \n\n\t$ npm install appcelerator\n\nInclude it in package.json\n\n\t\"dependencies\": {\n    \t  \"appcelerator\": \"*\"\n  \t},\n\n\n##Usage\nHere are a couple of example routes for reading and setting a users status\n  \n\t// get a user's statuses\n\tapp.get('/status', function(req, res){\n\n\t    var app_key  = '1234';\n\t    var email    = 'ben.edmunds@gmail.com';\n\t    var password = '12345678';\n\n\t    var appcelerator = require('appcelerator')(app_key, email, password);\n\n\t    var data = {'user_id': '4f9eb57a0020440def0056d3'};\n\n\t    var output = appcelerator.sendRequest('statuses/query.json', 'GET', data, false, function(res){\n\t      \n\t      console.log(res.body);\n\n\t    });\n\n\t  });\n\n\t  // create a new status\n\t  app.get('/create_status', function(req, res){\n\n\t    // Create a user statuses\n\t    var app_key  = '1234';\n\t    var email    = 'ben.edmunds@gmail.com';\n\t    var password = '12345678';\n\n\t    var appcelerator = require('appcelerator')(app_key, email, password);\n\n\t    var data = {'message': 'node.js test message'};\n\n\t    var output = appcelerator.sendRequest('statuses/create.json', 'POST', data, false, function(res){\n\t      \n\t      console.log(res.body);\n\n\t    });\n\n\t  });\n\n\nSee [the Appcelerator documentation](http://cloud.appcelerator.com/docs/api/v1/statuses/info) for API details.\n\nModule created by [Ben Edmunds](http://benedmunds.com) for [DblTap Labs](http://dbltaplabs.com).","maintainers":[{"name":"benedmunds","email":"ben.edmunds@gmail.com"}],"time":{"modified":"2012-08-02T13:44:22.448Z","created":"2012-07-25T15:23:56.609Z","1.0.1":"2012-07-25T15:23:57.793Z"},"author":{"name":"Ben Edmunds","email":"ben@dbltaplabs.com","url":"http://benedmunds.com"},"repository":{"type":"git","url":"git://github.com/DblTapLabs/Node-Appcelerator.git"},"users":{"fgribreau":true},"_attachments":{"appcelerator-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dtSKTI6O0EA37URRzvmF5g==","length":3057,"stub":true}}}},
{"id":"appcloud","key":"appcloud","value":{"rev":"10-f6583243a6792e06595b5605f41d07e6"},"doc":{"_id":"appcloud","_rev":"10-f6583243a6792e06595b5605f41d07e6","name":"appcloud","description":"A lightweight web server to developer your App Cloud apps against, along with scaffolding to generate your apps.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"appcloud","version":"0.0.1","description":"A lightweight web server to developer your App Cloud apps against, along with scaffolding to generate your apps.","preferGlobal":"true","bin":{"appcloud":"appcloud.js"},"author":{"name":"Jesse Streb"},"engines":{"node":"0.8.*"},"readme":"Overview\n======================\n\nThe App Cloud module provides two key services.  The first is that provides a command line interface to allow developers to quickly generate new App Cloud apps.  (Scaffolding)  Additionally, the command line interface also includes a command to generate code a for a [express](http://expressjs.com/) web server.  The web server provides a central place\nto organize your apps, create new apps and view / download demos.\n\nInstallation\n======================\n\n* If not already installed, install version 0.8.* of node.js.\n* Simply run `npm install appcloud`.\n\nUsage\n======================\n\nTo see the options available to you run `appcloud -h`, which will print:\n\n  Usage: appcloud [options]\n\n   Options:\n\n     -h, --help                output usage information\n     -V, --version             output the version number\n     -c, --create-server       Create the app cloud web server.\n     -s, --start-server        Start the app cloud web server.\n     -a, --create-app          Create a new app\n     -n, --app-name [appName]  The name of the application\n     -v, --views [views]       A list of views to auto-generate\n     -P, --server-path [path]  The path of where the server exists or where to create the server.  If the App Cloud Server is in the current directory, this is not necessary.\n     -p, --app-path [path]     The path to put the generated application.  This should only be set if you wish to put the application somewhere other then within the packaged web server.\n     -k, --sdk-version         The version of the App Cloud SDK.\n     \nThe typical flow for getting started is to simply run `appcloud -c`, to generate the appcloud packaged web server.  (A lightweight [express](http://expressjs.com/) web server).  After that if you `cd appcloud` and then run `node app.js`, you will start the appcloud web server.  When you first start the server it will look like:\n\n![App Cloud Web Server](http://f.cl.ly/items/180I1o3H210F2W1d1l1H/Screen%20Shot%202012-07-27%20at%2012.55.31%20PM.png)\n\nYou then have the option to either create applications using the command line with `appcloud -a -n name -v foo,bar` or using the UI to create a new application.  After creating an app, you can then click the app to be taken a to page that presents you with a QR code for the application.  Using the App Cloud Workshop application, can be installed from either the iOS App Store or the Android Marketplace, scan the QR code.  The screen with the QR code should look like this:\n\n![App Cloud Web Server](http://f.cl.ly/items/1P1g3i3S0I2u2C173Q22/Screen%20Shot%202012-07-27%20at%201.03.09%20PM.png)","_id":"appcloud@0.0.1","dist":{"shasum":"e0a1c395d15ea3e49b53137cf9cf30ff100c7de7","tarball":"http://registry.npmjs.org/appcloud/-/appcloud-0.0.1.tgz"},"maintainers":[{"name":"jstreb","email":"jesse.streb@gmail.com"}]},"0.0.2":{"name":"appcloud","version":"0.0.2","description":"A lightweight web server to developer your App Cloud apps against, along with scaffolding to generate your apps.","preferGlobal":"true","bin":{"appcloud":"appcloud.js"},"author":{"name":"Jesse Streb","email":"jesse.streb@gmail.com"},"engines":{"node":"0.8.*"},"dependencies":{"wrench":"1.3.9","commander":"1.0.0"},"readme":"Overview\n======================\n\nThe App Cloud module provides two key services.  The first is that provides a command line interface to allow developers to quickly generate new App Cloud apps.  (Scaffolding)  Additionally, the command line interface also includes a command to generate code a for a [express](http://expressjs.com/) web server.  The web server provides a central place\nto organize your apps, create new apps and view / download demos.\n\nInstallation\n======================\n\n* If not already installed, install version 0.8.* of node.js.\n* Simply run `npm install appcloud`.\n\nUsage\n======================\n\nTo see the options available to you run `appcloud -h`, which will print:\n\n  Usage: appcloud [options]\n\n   Options:\n\n     -h, --help                output usage information\n     -V, --version             output the version number\n     -c, --create-server       Create the app cloud web server.\n     -s, --start-server        Start the app cloud web server.\n     -a, --create-app          Create a new app\n     -n, --app-name [appName]  The name of the application\n     -v, --views [views]       A list of views to auto-generate\n     -P, --server-path [path]  The path of where the server exists or where to create the server.  If the App Cloud Server is in the current directory, this is not necessary.\n     -p, --app-path [path]     The path to put the generated application.  This should only be set if you wish to put the application somewhere other then within the packaged web server.\n     -k, --sdk-version         The version of the App Cloud SDK.\n     \nThe typical flow for getting started is to simply run `appcloud -c`, to generate the appcloud packaged web server.  (A lightweight [express](http://expressjs.com/) web server).  After that if you `cd appcloud` and then run `node app.js`, you will start the appcloud web server.  When you first start the server it will look like:\n\n![App Cloud Web Server](http://f.cl.ly/items/180I1o3H210F2W1d1l1H/Screen%20Shot%202012-07-27%20at%2012.55.31%20PM.png)\n\nYou then have the option to either create applications using the command line with `appcloud -a -n name -v foo,bar` or using the UI to create a new application.  After creating an app, you can then click the app to be taken a to page that presents you with a QR code for the application.  Using the App Cloud Workshop application, can be installed from either the iOS App Store or the Android Marketplace, scan the QR code.  The screen with the QR code should look like this:\n\n![App Cloud Web Server](http://f.cl.ly/items/1P1g3i3S0I2u2C173Q22/Screen%20Shot%202012-07-27%20at%201.03.09%20PM.png)","_id":"appcloud@0.0.2","dist":{"shasum":"461dc75e3cdd30cb543b657684b234e2c335cbf7","tarball":"http://registry.npmjs.org/appcloud/-/appcloud-0.0.2.tgz"},"maintainers":[{"name":"jstreb","email":"jesse.streb@gmail.com"}]},"0.0.3":{"name":"appcloud","version":"0.0.3","description":"A lightweight web server to developer your App Cloud apps against, along with scaffolding to generate your apps.","preferGlobal":"true","bin":{"appcloud":"appcloud.js"},"author":{"name":"Jesse Streb","email":"jesse.streb@gmail.com"},"engines":{"node":"0.8.*"},"dependencies":{"wrench":"1.3.9","commander":"1.0.0"},"readme":"Overview\n======================\n\nThe App Cloud module provides two key services.  The first is that provides a command line interface to allow developers to quickly generate new App Cloud apps.  (Scaffolding)  Additionally, the command line interface also includes a command to generate code an [express](http://expressjs.com/) web server.  The web server provides a central place\nto organize your apps, create new apps and view / download demos.\n\nInstallation\n======================\n\n* If not already installed, install version 0.8.* of node.js.\n* Simply run `npm install -g appcloud`.  (The -g makes this globally available command.)\n\nUsage\n======================\n\nTo see the options available to you run `appcloud -h`, which will print:\n\n  Usage: appcloud [options]\n\n   Options:\n\n     -h, --help                output usage information\n     -V, --version             output the version number\n     -c, --create-server       Create the app cloud web server.\n     -n, --app-name [appName]  The name of the application\n     -v, --views [views]       A list of views to auto-generate\n     -P, --server-path [path]  The path of where the server exists or where to create the server.  If the App Cloud Server is in the current directory, this is not necessary.\n     -p, --app-path [path]     The path to put the generated application.  This should only be set if you wish to put the application somewhere other then within the packaged web server.\n     -k, --sdk-version         The version of the App Cloud SDK.\n     \nThe typical flow for getting started is to simply run `appcloud -c`, to generate the appcloud packaged web server.  (A lightweight [express](http://expressjs.com/) web server).  After that if you `cd appcloud` and then run `node app.js`, you will start the appcloud web server.  When you first start the server it will look like:\n\n![App Cloud Web Server](http://f.cl.ly/items/180I1o3H210F2W1d1l1H/Screen%20Shot%202012-07-27%20at%2012.55.31%20PM.png)\n\nYou then have the option to either create applications using the command line with `appcloud -n name -v foo,bar` or using the UI to create a new application.  After creating an app, you can then click the app to be taken a to page that presents you with a QR code for the application.  Using the App Cloud Workshop application, can be installed from either the iOS App Store or the Android Marketplace, scan the QR code.  The screen with the QR code should look like this:\n\n![App Cloud Web Server](http://f.cl.ly/items/1P1g3i3S0I2u2C173Q22/Screen%20Shot%202012-07-27%20at%201.03.09%20PM.png)","_id":"appcloud@0.0.3","dist":{"shasum":"33b8a1ff18cbc688d41cd46d0832a702da72fcce","tarball":"http://registry.npmjs.org/appcloud/-/appcloud-0.0.3.tgz"},"maintainers":[{"name":"jstreb","email":"jesse.streb@gmail.com"}]},"0.0.4":{"name":"appcloud","version":"0.0.4","description":"A lightweight web server to developer your App Cloud apps against, along with scaffolding to generate your apps.","preferGlobal":"true","bin":{"appcloud":"appcloud.js"},"author":{"name":"Jesse Streb","email":"jesse.streb@gmail.com"},"engines":{"node":"0.8.*"},"dependencies":{"wrench":"1.3.9","commander":"1.0.0"},"readme":"Overview\n======================\n\nThe App Cloud module provides two key services.  The first is that provides a command line interface to allow developers to quickly generate new App Cloud apps.  (Scaffolding)  Additionally, the command line interface also includes a command to generate code an [express](http://expressjs.com/) web server.  The web server provides a central place\nto organize your apps, create new apps and view / download demos.\n\nInstallation\n======================\n\n* If not already installed, install version 0.8.* of node.js.\n* Simply run `npm install -g appcloud`.  (The -g makes this globally available command.)\n\nUsage\n======================\n\nTo see the options available to you run `appcloud -h`, which will print:\n\n  Usage: appcloud [options]\n\n   Options:\n\n     -h, --help                output usage information\n     -V, --version             output the version number\n     -c, --create-server       Create the app cloud web server.\n     -n, --app-name [appName]  The name of the application\n     -v, --views [views]       A list of views to auto-generate\n     -P, --server-path [path]  The path of where the server exists or where to create the server.  If the App Cloud Server is in the current directory, this is not necessary.\n     -p, --app-path [path]     The path to put the generated application.  This should only be set if you wish to put the application somewhere other then within the packaged web server.\n     -k, --sdk-version         The version of the App Cloud SDK.\n     \nThe typical flow for getting started is to simply run `appcloud -c`, to generate the appcloud packaged web server.  (A lightweight [express](http://expressjs.com/) web server).  After that `cd appcloud` and then run `npm install`, to install the necessary packages for the web server.  Once that completes run `node app.js`, which will start the appcloud web server.  When you first start the server it will look like:\n\n![App Cloud Web Server](http://f.cl.ly/items/180I1o3H210F2W1d1l1H/Screen%20Shot%202012-07-27%20at%2012.55.31%20PM.png)\n\nYou then have the option to either create applications using the command line with `appcloud -n name -v foo,bar` or using the UI to create a new application.  After creating an app, you can then click the app to be taken a to page that presents you with a QR code for the application.  Using the App Cloud Workshop application, can be installed from either the iOS App Store or the Android Marketplace, scan the QR code.  The screen with the QR code should look like this:\n\n![App Cloud Web Server](http://f.cl.ly/items/1P1g3i3S0I2u2C173Q22/Screen%20Shot%202012-07-27%20at%201.03.09%20PM.png)","_id":"appcloud@0.0.4","dist":{"shasum":"6e9b1145225711d8e42a97785dca122bb64de179","tarball":"http://registry.npmjs.org/appcloud/-/appcloud-0.0.4.tgz"},"maintainers":[{"name":"jstreb","email":"jesse.streb@gmail.com"}]}},"readme":"Overview\n======================\n\nThe App Cloud module provides two key services.  The first is that provides a command line interface to allow developers to quickly generate new App Cloud apps.  (Scaffolding)  Additionally, the command line interface also includes a command to generate code a for a [express](http://expressjs.com/) web server.  The web server provides a central place\nto organize your apps, create new apps and view / download demos.\n\nInstallation\n======================\n\n* If not already installed, install version 0.8.* of node.js.\n* Simply run `npm install appcloud`.\n\nUsage\n======================\n\nTo see the options available to you run `appcloud -h`, which will print:\n\n  Usage: appcloud [options]\n\n   Options:\n\n     -h, --help                output usage information\n     -V, --version             output the version number\n     -c, --create-server       Create the app cloud web server.\n     -s, --start-server        Start the app cloud web server.\n     -a, --create-app          Create a new app\n     -n, --app-name [appName]  The name of the application\n     -v, --views [views]       A list of views to auto-generate\n     -P, --server-path [path]  The path of where the server exists or where to create the server.  If the App Cloud Server is in the current directory, this is not necessary.\n     -p, --app-path [path]     The path to put the generated application.  This should only be set if you wish to put the application somewhere other then within the packaged web server.\n     -k, --sdk-version         The version of the App Cloud SDK.\n     \nThe typical flow for getting started is to simply run `appcloud -c`, to generate the appcloud packaged web server.  (A lightweight [express](http://expressjs.com/) web server).  After that if you `cd appcloud` and then run `node app.js`, you will start the appcloud web server.  When you first start the server it will look like:\n\n![App Cloud Web Server](http://f.cl.ly/items/180I1o3H210F2W1d1l1H/Screen%20Shot%202012-07-27%20at%2012.55.31%20PM.png)\n\nYou then have the option to either create applications using the command line with `appcloud -a -n name -v foo,bar` or using the UI to create a new application.  After creating an app, you can then click the app to be taken a to page that presents you with a QR code for the application.  Using the App Cloud Workshop application, can be installed from either the iOS App Store or the Android Marketplace, scan the QR code.  The screen with the QR code should look like this:\n\n![App Cloud Web Server](http://f.cl.ly/items/1P1g3i3S0I2u2C173Q22/Screen%20Shot%202012-07-27%20at%201.03.09%20PM.png)","maintainers":[{"name":"jstreb","email":"jesse.streb@gmail.com"}],"time":{"modified":"2012-08-03T11:46:23.879Z","created":"2012-08-01T15:51:27.330Z","0.0.1":"2012-08-01T15:51:27.726Z","0.0.2":"2012-08-01T17:51:12.681Z","0.0.3":"2012-08-01T19:36:51.600Z","0.0.4":"2012-08-03T11:46:23.879Z"},"author":{"name":"Jesse Streb","email":"jesse.streb@gmail.com"},"users":{"fgribreau":true},"_attachments":{"appcloud-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-9dwyfFnItB4nMCkQcIVA9Q==","length":2178573,"stub":true},"appcloud-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-UzAQfjEq+wbrM87rWLajYg==","length":2190251,"stub":true},"appcloud-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Kxk93li79ASRGxFa5HVaWQ==","length":2190362,"stub":true},"appcloud-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2jIpI5IaitHH/DjKfeSzyw==","length":2189931,"stub":true}}}},
{"id":"appdotcouch","key":"appdotcouch","value":{"rev":"3-54d3fffc0e50d838ab84c5ca812f4078"},"doc":{"_id":"appdotcouch","_rev":"3-54d3fffc0e50d838ab84c5ca812f4078","name":"appdotcouch","description":"Export global app.net stream to CouchDB","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"appdotcouch","description":"Export global app.net stream to CouchDB","author":{"name":"Damien Klinnert","email":"mail@damienklinnert.com"},"licence":"MIT","version":"0.1.0","engines":{"node":"~0.8.0"},"dependencies":{"request":"~2.10.0","couch-client":"~0.0.4","commander":"~1.0.1"},"devDependencies":{"mocha":"~1.3.2","should":"~1.1.0"},"main":"./lib/appdotcouch.js","bin":{"appdotcouch":"./bin/appdotcouch"},"scripts":{"test":"./node_modules/.bin/mocha --reporter spec --require should"},"repository":{"type":"git","url":"git://github.com/damienklinnert/appdotcouch.git"},"keywords":["app","app.net","appdotnet","appnet","export","global","post","couchdb","dump","save"],"readme":"appdotcouch\n===========\n\nExport global app.net stream to CouchDB.\n\n\n\nRequirements\n------------\n\nYou need a valid access token from app.net. See here how to gain one https://github.com/appdotnet/api-spec/blob/master/auth.md#server-side-flow-ruby-python-php-java-etc.\n\nThen run `npm install -g appdotcouch` to install this script.\n\n\n\nCLI\n---\n\n  Usage: appdotcouch [options]\n\n  Options:\n\n    -h, --help                    output usage information\n    -V, --version                 output the version number\n    --token [value]               app.net auth token\n    --db [value]                  uri to couch db\n    --uri [value]                 app.net api uri for global stream\n    --minid [value]               api parameter min_id\n    --maxid [value]               api parameter max_id\n    --count [value]               api parameter count\n    --includeuser [value]         api parameter include_user\n    --includeannotations [value]  api parameter include_annotations\n    --includereplies [value]      api parameter include_replies\n\n\n\nCode\n----\n\nYou can also use this module in your own code directly – just `require('appdotcouch')`.\n\n    var AppDotCouch = require('appdotcouch'),\n        config = require('config.json'),\n        obj = AppDotCouch.create(config);\n\n    obj.dump();\n\nAll options in config should exectly be named like they are in the CLI.\n\n\n\nAPI\n---   \n \n### AppDotCouch()\n\nCreate a new AppDotCouch object with `cfg`.\n\n### Params: \n\n* **Object** *cfg* configuration\n\n### Return:\n\n* **Object** new AppDotCouch object\n\n## AppDotCouch.create(cfg)\n\nConvenience constructor for `AppDotCouch`.\n\n### Params: \n\n* **Object** *cfg* configuration\n\n### Return:\n\n* **Object** new AppDotCouch object\n\n## obj.dump(cb)\n\nDump the latest posts from app.net to couch db and callback `cb(err)`.\n\n### Params: \n\n* **Function** *cb* \n\n\n\nDevelopers\n----------\n\nFeel free to contribute to this project. There are some unit tests included in this project, type `npm test` and be sure to have a local couch db without username and password and an empty database called `appdotcouch`. Just be sure to set an access token in `test/appdotcouch.js.\n","_id":"appdotcouch@0.1.0","dist":{"shasum":"370dbe892b45d256e84ae881ebf8e20684816064","tarball":"http://registry.npmjs.org/appdotcouch/-/appdotcouch-0.1.0.tgz"},"maintainers":[{"name":"damienklinnert","email":"mail@damienklinnert.com"}]}},"readme":"appdotcouch\n===========\n\nExport global app.net stream to CouchDB.\n\n\n\nRequirements\n------------\n\nYou need a valid access token from app.net. See here how to gain one https://github.com/appdotnet/api-spec/blob/master/auth.md#server-side-flow-ruby-python-php-java-etc.\n\nThen run `npm install -g appdotcouch` to install this script.\n\n\n\nCLI\n---\n\n  Usage: appdotcouch [options]\n\n  Options:\n\n    -h, --help                    output usage information\n    -V, --version                 output the version number\n    --token [value]               app.net auth token\n    --db [value]                  uri to couch db\n    --uri [value]                 app.net api uri for global stream\n    --minid [value]               api parameter min_id\n    --maxid [value]               api parameter max_id\n    --count [value]               api parameter count\n    --includeuser [value]         api parameter include_user\n    --includeannotations [value]  api parameter include_annotations\n    --includereplies [value]      api parameter include_replies\n\n\n\nCode\n----\n\nYou can also use this module in your own code directly – just `require('appdotcouch')`.\n\n    var AppDotCouch = require('appdotcouch'),\n        config = require('config.json'),\n        obj = AppDotCouch.create(config);\n\n    obj.dump();\n\nAll options in config should exectly be named like they are in the CLI.\n\n\n\nAPI\n---   \n \n### AppDotCouch()\n\nCreate a new AppDotCouch object with `cfg`.\n\n### Params: \n\n* **Object** *cfg* configuration\n\n### Return:\n\n* **Object** new AppDotCouch object\n\n## AppDotCouch.create(cfg)\n\nConvenience constructor for `AppDotCouch`.\n\n### Params: \n\n* **Object** *cfg* configuration\n\n### Return:\n\n* **Object** new AppDotCouch object\n\n## obj.dump(cb)\n\nDump the latest posts from app.net to couch db and callback `cb(err)`.\n\n### Params: \n\n* **Function** *cb* \n\n\n\nDevelopers\n----------\n\nFeel free to contribute to this project. There are some unit tests included in this project, type `npm test` and be sure to have a local couch db without username and password and an empty database called `appdotcouch`. Just be sure to set an access token in `test/appdotcouch.js.\n","maintainers":[{"name":"damienklinnert","email":"mail@damienklinnert.com"}],"time":{"modified":"2012-08-15T00:28:29.045Z","created":"2012-08-15T00:28:27.404Z","0.1.0":"2012-08-15T00:28:29.045Z"},"author":{"name":"Damien Klinnert","email":"mail@damienklinnert.com"},"repository":{"type":"git","url":"git://github.com/damienklinnert/appdotcouch.git"},"_attachments":{"appdotcouch-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0lZcQVmlIvFY9GWTNJalxA==","length":3373,"stub":true}}}},
{"id":"appdotnet","key":"appdotnet","value":{"rev":"5-714fcb495cc2d547828d3a53a9e2d0fe"},"doc":{"_id":"appdotnet","_rev":"5-714fcb495cc2d547828d3a53a9e2d0fe","name":"appdotnet","description":"Wrapper for the App.net HTTP Stream API, following node idioms.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"appdotnet","version":"0.0.1","description":"Wrapper for the App.net HTTP Stream API, following node idioms.","author":{"name":"Damien Klinnert","email":"mail@damienklinnert.com"},"licence":"MIT","main":"lib/appdotnet.js","engines":{"node":"~0.8.6"},"dependencies":{"request":"~2.10.0"},"devDependencies":{"mocha":"~1.3.2","should":"~1.1.0"},"scripts":{"test":"./node_modules/.bin/mocha --reporter spec --require should"},"repository":{"type":"git","url":"git://github.com/damienklinnert/appdotnet.git"},"keywords":["app","dot","net","appdotnet","app.net","api","stream","node","wrapper","async","http"],"readme":"[![Build Status](https://secure.travis-ci.org/damienklinnert/appdotnet.png?branch=master)](http://travis-ci.org/damienklinnert/appdotnet)\n\nappdotnet\n=========\n\nA wrapper for the App.net HTTP Stream API, following node idioms. See https://github.com/appdotnet/api-spec for a API description.\n","_id":"appdotnet@0.0.1","dist":{"shasum":"dbd283016c9a00113faf8cb4b41e8ede0376463e","tarball":"http://registry.npmjs.org/appdotnet/-/appdotnet-0.0.1.tgz"},"maintainers":[{"name":"damienklinnert","email":"mail@damienklinnert.com"}]},"0.0.2":{"name":"appdotnet","version":"0.0.2","description":"Wrapper for the App.net HTTP Stream API, following node idioms.","author":{"name":"Damien Klinnert","email":"mail@damienklinnert.com"},"licence":"MIT","main":"lib/appdotnet.js","engines":{"node":"~0.6.18"},"dependencies":{"request":"~2.10.0"},"devDependencies":{"mocha":"~1.3.2","should":"~1.1.0"},"scripts":{"test":"./node_modules/.bin/mocha --reporter spec --require should"},"repository":{"type":"git","url":"git://github.com/damienklinnert/appdotnet.git"},"keywords":["app","dot","net","appdotnet","app.net","api","stream","node","wrapper","async","http"],"readme":"appdotnet\n=========\n\nA wrapper for the App.net HTTP Stream API, following node idioms. See https://github.com/appdotnet/api-spec for a API description.\n\n\n\nCurrent State\n-------------\n\napp.net's api is not yet stable and so is this package. There's no generated documentation for this right now, so be sure to checkout the examples/ directory.\n\nUntil now, we only support a tiny part of the api, just look at the code to see which ones.\n\n\n\nAPI Overview\n------------\n\n * AppDotNet.createAuthenticationUri(…)\n * AppDotNet.requestAccessToken(…)\n\n\n\nDevelopers\n----------\n\nThere will be some unit tests in the future. To use and test this module, you have to register an application on app.net.\n","_id":"appdotnet@0.0.2","dist":{"shasum":"c4058d75af744d90add64e1228c91c791e793a60","tarball":"http://registry.npmjs.org/appdotnet/-/appdotnet-0.0.2.tgz"},"maintainers":[{"name":"damienklinnert","email":"mail@damienklinnert.com"}]}},"readme":"[![Build Status](https://secure.travis-ci.org/damienklinnert/appdotnet.png?branch=master)](http://travis-ci.org/damienklinnert/appdotnet)\n\nappdotnet\n=========\n\nA wrapper for the App.net HTTP Stream API, following node idioms. See https://github.com/appdotnet/api-spec for a API description.\n","maintainers":[{"name":"damienklinnert","email":"mail@damienklinnert.com"}],"time":{"modified":"2012-08-15T10:06:56.789Z","created":"2012-08-13T07:15:13.223Z","0.0.1":"2012-08-13T07:15:14.662Z","0.0.2":"2012-08-15T10:06:56.789Z"},"author":{"name":"Damien Klinnert","email":"mail@damienklinnert.com"},"repository":{"type":"git","url":"git://github.com/damienklinnert/appdotnet.git"},"_attachments":{"appdotnet-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TJWZcf1lmJehGoO0x85YgQ==","length":2751,"stub":true},"appdotnet-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ylW3dlnkuZxNBt97la58sA==","length":1492,"stub":true}}}},
{"id":"append","key":"append","value":{"rev":"13-d7b2abb9d67305d942cba841ca2c52cb"},"doc":{"_id":"append","_rev":"13-d7b2abb9d67305d942cba841ca2c52cb","name":"append","description":"append the properties from one object to another","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"append","description":"append the properties from one object to another","version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-append.git"},"bugs":{"url":"https://github.com/pvorb/node-append/issues"},"main":"append.js","engines":{"node":"*"},"dependencies":{},"_npmJsonOpts":{"file":"/home/paul/.npm/append/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"append@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"bd88f4102e3ca8c6d954c6d076c2a44b3f49258e","tarball":"http://registry.npmjs.org/append/-/append-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"append","description":"append the properties from one object to another","version":"0.0.1","repository":{"type":"git","url":"git://github.com/pvorb/node-append.git"},"bugs":{"url":"https://github.com/pvorb/node-append/issues"},"main":"append.js","engines":{"node":"*"},"tags":["object","prototype","append"],"_npmJsonOpts":{"file":"/home/paul/.npm/append/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"append@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"747b6d5980ccd1622a9b541a03cde612f4ec9788","tarball":"http://registry.npmjs.org/append/-/append-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"append","description":"append the properties from one object to another","version":"0.1.0","repository":{"type":"git","url":"git://github.com/pvorb/node-append.git"},"bugs":{"url":"https://github.com/pvorb/node-append/issues"},"main":"append.js","engines":{"node":"*"},"tags":["object","append"],"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"append@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"28682a02b6dd3a38b9d385ee574e506e923917d2","tarball":"http://registry.npmjs.org/append/-/append-0.1.0.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]},"0.1.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"append","description":"append the properties from one object to another","version":"0.1.1","repository":{"type":"git","url":"git://github.com/pvorb/node-append.git"},"bugs":{"url":"https://github.com/pvorb/node-append/issues"},"main":"append.js","engines":{"node":"*"},"tags":["object","append"],"dependencies":{},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"append@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7e5dd327747078d877286fbb624b1e8f4d2b396b","tarball":"http://registry.npmjs.org/append/-/append-0.1.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2011-12-22T00:27:20.396Z","created":"2011-08-29T14:20:01.095Z","0.0.0":"2011-08-29T14:20:03.348Z","0.0.1":"2011-08-29T14:39:18.690Z","0.1.0":"2011-11-03T16:45:16.600Z","0.1.1":"2011-12-22T00:27:20.396Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-append.git"},"_attachments":{"append-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-QFu20V3/m1iBBp9JAqelFQ==","length":1367,"stub":true},"append-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-NN1FjuGyz0GWrOM8qmJW1g==","length":1373,"stub":true},"append-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-t1xnZkA9ZKjwFug9eKxSzw==","length":1455,"stub":true},"append-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-K6PXuYhG0+AsVKLmxAvOtg==","length":1450,"stub":true}}}},
{"id":"appfront-examples","key":"appfront-examples","value":{"rev":"5-65d61f4c4a09105651bd38ffe05b4856"},"doc":{"_id":"appfront-examples","_rev":"5-65d61f4c4a09105651bd38ffe05b4856","name":"appfront-examples","description":"examples for using doctape appfront in different languages","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"author":{"name":"doctape","email":"doctape@tape.io","url":"http://www.doctape.com"},"name":"appfront-examples","description":"examples for using doctape appfront in different languages","version":"0.0.0","homepage":"https://github.com/doctape/appfront-examples","repository":{"type":"git","url":"git://github.com/doctape/appfront-examples.git"},"dependencies":{"jade":"0.26.1","express":"2.5.9"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"doctape","email":"doctape@tape.io"},"_id":"appfront-examples@0.0.0","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"58b282b7fda05686e1cfb37cf2bc2cd1af87a332","tarball":"http://registry.npmjs.org/appfront-examples/-/appfront-examples-0.0.0.tgz"},"readme":"","maintainers":[{"name":"doctape","email":"doctape@tape.io"}]},"0.1.0":{"author":{"name":"doctape","email":"doctape@tape.io","url":"http://www.doctape.com"},"name":"appfront-examples","description":"examples for using doctape appfront in different languages","version":"0.1.0","homepage":"https://github.com/doctape/appfront-examples","repository":{"type":"git","url":"git://github.com/doctape/appfront-examples.git"},"dependencies":{"jade":"0.26.x","express":"2.5.x"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"0.6.19"},"_npmUser":{"name":"doctape","email":"doctape@tape.io"},"_id":"appfront-examples@0.1.0","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"68130a54202942092d863e0ef75a548e63b7c1d7","tarball":"http://registry.npmjs.org/appfront-examples/-/appfront-examples-0.1.0.tgz"},"readme":"","maintainers":[{"name":"doctape","email":"doctape@tape.io"}]}},"readme":"","maintainers":[{"name":"doctape","email":"doctape@tape.io"}],"time":{"modified":"2012-06-27T15:29:32.417Z","created":"2012-06-11T19:32:45.926Z","0.0.0":"2012-06-11T19:32:47.478Z","0.1.0":"2012-06-27T15:29:32.417Z"},"author":{"name":"doctape","email":"doctape@tape.io","url":"http://www.doctape.com"},"repository":{"type":"git","url":"git://github.com/doctape/appfront-examples.git"},"_attachments":{"appfront-examples-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dRqTyZqjt+ArHfT64ShtCw==","length":72579,"stub":true},"appfront-examples-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-I1h9YTDfX1V7ydzyvSVPpA==","length":72502,"stub":true}}}},
{"id":"appjs","key":"appjs","value":{"rev":"63-3edafc4590d4d84af255d49da34ec99c"},"doc":{"_id":"appjs","_rev":"63-3edafc4590d4d84af255d49da34ec99c","name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.18"},"versions":{"0.0.2":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.2","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"preinstall":"./bin/configure || true; node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.2","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"bin":{"configure":"bin/configure"},"dist":{"shasum":"0732aac3cfc4d55145e7b2ef180082403c3f8106","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.2.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.3":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.3","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"./bin/configure || true; node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.3","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"bin":{"configure":"bin/configure"},"dist":{"shasum":"4f3f3a0a2ee15543a3a012530edb843f8a068be3","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.3.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.4":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.4","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.4","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"ece20da7af800c39bb7e1b463c7aee3fd0952057","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.4.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.5":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.5","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.5","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"93566a9fc285a47b0ba343c459f2614a387266a3","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.5.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.6":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.6","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.6","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"b431908b1040f3285847265bd762addad22cc93e","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.6.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.7":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.7","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"b2b4b1f50dba2e628dc11a3bba834054c6aee70f","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.7.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.8":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.8","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/isaacs/npm.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"b43082fc8ba4ce5212c1a9a912d102d0bb05bcb7","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.8.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.9":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.9","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://github.com/milani/appjs","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.9","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"a36f90ea214e6d26d5dcb98e02f094562eef688f","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.9.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.10":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.10","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.7 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.10","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"43730692aab2b539f97da5f72068b6b1e770b832","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.10.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.11":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.11","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.11","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"69be0021b0ff4bbfb462f149f8a4c5f759b4cfc4","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.11.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.12":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.12","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.12","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"825a86bbd7fb1588bab1dbe88fac4cc92e9d6073","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.12.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.12-fixed":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.12-fixed","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13"},"devDependencies":{},"optionalDependencies":{},"scripts":{"install":"node cli/configure.js && node-gyp rebuild"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.12-fixed","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"2c904a453b4517998a75227dc9fd0fecfa7b18a8","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.12-fixed.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.13":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.13","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"target":"mac","homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"directories":{},"main":"./index.js","engines":{"node":"0.6 || 0.8"},"scripts":{"install":"node-gyp rebuild"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.13","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"eb1b925fabbce43adbbcb295a7e10a6d354fdb19","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.13.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.17":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.17","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./lib/index.js","engines":{"node":">=0.8"},"dependencies":{"mime":"1.2.5","request":"2.9.x","tar":">= 0.1.13","npm":"~1.1.41","appjs-win":"0.0.17","appjs-mac":"0.0.17","appjs-linux":"0.0.17"},"optionalDependencies":{"appjs-win":"0.0.17","appjs-mac":"0.0.17","appjs-linux":"0.0.17"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.17","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"c88500e0e6fa07746c9d7a6f7afbcfb3677f43bd","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.17.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.17-fixed":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.17-fixed","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./lib/index.js","engines":{"node":">=0.8"},"dependencies":{"mime":"1.2.5","appjs-win":"0.0.17","appjs-mac":"0.0.17","appjs-linux-x64":"0.0.17","appjs-linux-ia32":"0.0.17"},"optionalDependencies":{"appjs-win":"0.0.17","appjs-mac":"0.0.17","appjs-linux-x64":"0.0.17","appjs-linux-ia32":"0.0.17"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.17-fixed","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"22b73713bf4ec2cb43897d234596ab9c95a4aa26","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.17-fixed.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.18":{"name":"appjs","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.18","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","bin":"./bin","test":"./tests"},"main":"./lib/index.js","engines":{"node":">=0.8"},"dependencies":{"mime":">=1.2.5"},"scripts":{"postinstall":"node cli/postinstall.js"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs@0.0.18","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"3254c451e5e33ba2a97a474b012d05dacfb02628","tarball":"http://registry.npmjs.org/appjs/-/appjs-0.0.18.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]}},"readme":"# AppJS\n\n![AppJS](https://github.com/milani/appjs/raw/master/appjs.png \"AppJS\") AppJS is an SDK to develop desktop applications using node. Or at least\nit is going to be!\n\nThe goal is to facilitate native app development using\ntools every developer is familiar with nowadays: HTML/CSS/JS\n\n_Attention:_ You should not use AppJS before we bump version to \nv0.1.0, it is under heavy development.\n\n![Hello World](https://github.com/milani/appjs/raw/master/examples/output.png \"Hello World\")\n\n## How to install\n\n** Only Linux version works for now. Pull requests for other platforms are very welcome **\n\nUsing npm:\n\n    $ npm install appjs\n\nUsing git:\n\n    $ git clone https://github.com/milani/appjs\n    $ cd appjs/bin\n    $ ./configure\n\n## How to use\n\nThere is a complete example in the `examples/` folder.\n\nHere is a simple one:\n\n\tvar appjs = require('appjs');\n\n\tvar window;\n\n\t// Initialize appjs.\n    var app = appjs.init();\n\n    // Called when page load finishes.\n    app.on(\"ready\",function(){\n\t  console.log(\"Event Ready called\");\n\n\t  // Runs a script in browser context.\n\t  window.runInBrowser(function(){\n\t    var body = document.body;\n\t    body.style.color=\"#f60\";\n\t  });\n\n\t  // Show created window ( see below )\n\t  window.show();\n\t});\n\n\t// Routing:\n\n\t// you can use a static router:\n\t// app.use(app.staticRouter('./public'));\n\n\t// or you can handle requests manually:\n\tapp.get(\"/\",function(req,res,next){\n\t  res.send(\"\\\n\t  \t<html>\\\n\t  \t\t<head><title>Hello World</title></head>\\\n\t  \t\t<body>Hello World</body>\\\n\t  \t</html>\\\n\t  \")\n\t});\n\n\t// Creates a new window. Its invisible until window.show() get called.\n    window = app.createWindow(\"appjs://app/\",{autoResize:false});\n\n## Thanks to\n\n* Brandon Benvie: He helps me with CEF.\n* Ali Farhadi: He helps me with AppJS.\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}],"time":{"modified":"2012-08-05T06:34:29.902Z","created":"2012-05-12T13:56:37.808Z","0.0.2":"2012-05-12T13:56:48.290Z","0.0.3":"2012-05-12T17:27:23.252Z","0.0.4":"2012-05-13T14:45:47.754Z","0.0.5":"2012-05-14T03:27:21.181Z","0.0.6":"2012-05-14T15:04:48.749Z","0.0.7":"2012-05-19T18:21:57.510Z","0.0.8":"2012-06-03T10:43:34.669Z","0.0.9":"2012-06-04T20:27:21.427Z","0.0.10":"2012-06-07T20:01:39.881Z","0.0.11":"2012-06-15T16:29:30.344Z","0.0.12":"2012-06-26T14:55:24.366Z","0.0.12-fixed":"2012-06-27T10:08:25.314Z","0.0.13":"2012-06-29T11:34:32.787Z","0.0.17":"2012-07-25T06:08:04.108Z","0.0.17-fixed":"2012-07-26T22:35:40.300Z","0.0.18":"2012-08-05T06:34:29.902Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"users":{"fgribreau":true},"_attachments":{"appjs-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-bzOu7gj2/7s6xRxneYjHWQ==","length":813712,"stub":true},"appjs-0.0.17-fixed.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-bTTs8pPozbAn57S+W0jmIQ==","length":1023730,"stub":true},"appjs-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-jaCz8fSg1XhIszqDc2XwQA==","length":1108036,"stub":true},"appjs-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-XiV55TRjDPduVnUtJvkf8A==","length":795,"stub":true},"appjs-0.0.12-fixed.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-iJgsx200DO42arwRui7RHA==","length":915486,"stub":true},"appjs-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-XedOVDJhh/49MK6BLAhAoA==","length":914814,"stub":true},"appjs-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-6niGj8lvBdif4pCl7Xak+A==","length":879545,"stub":true},"appjs-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-FbM+zSB/BpcdCsGnX2c3Lg==","length":876773,"stub":true},"appjs-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-eqSOdeuOFrbMgzaOngeeRQ==","length":555721,"stub":true},"appjs-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-E9RoHsYyeNAJ1+SenYwcuA==","length":1559394,"stub":true},"appjs-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-uuEdAZPgyAx4gcmKbAAOsg==","length":101816,"stub":true},"appjs-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-WokpUQ/bYtKHXSZwFsbTmA==","length":42691,"stub":true},"appjs-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VevnXWwzCGAYHnc8wxi/0g==","length":42600,"stub":true},"appjs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qSbkSZDgfWNig94Bge2kpg==","length":42501,"stub":true},"appjs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pZQvIeBC7nNscjXD7BbpYQ==","length":40674,"stub":true},"appjs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wvCh38LQa2Y/Dq4bxFE76A==","length":40671,"stub":true}}}},
{"id":"appjs-darwin","key":"appjs-darwin","value":{"rev":"3-6a71ea0dc82226e9fd4a537a81c647c1"},"doc":{"_id":"appjs-darwin","_rev":"3-6a71ea0dc82226e9fd4a537a81c647c1","name":"appjs-darwin","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.18"},"versions":{"0.0.18":{"name":"appjs-darwin","os":["darwin"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.18","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{},"scripts":{"install":"node cli/configure.js && node cli/build.js"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-darwin@0.0.18","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"4952bccd02b28d57c6445defaf67e147b511802d","tarball":"http://registry.npmjs.org/appjs-darwin/-/appjs-darwin-0.0.18.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]}},"readme":"# AppJS - Mac\nThis is the Mac package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}],"time":{"modified":"2012-08-05T05:58:26.590Z","created":"2012-08-05T05:58:22.584Z","0.0.18":"2012-08-05T05:58:26.590Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"_attachments":{"appjs-darwin-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TzJI3Ye5mGor2h9Fj8ljZA==","length":17476308,"stub":true}}}},
{"id":"appjs-linux","key":"appjs-linux","value":{"rev":"3-be241ada4303a9fe07b81e75e9c3aeff"},"doc":{"_id":"appjs-linux","_rev":"3-be241ada4303a9fe07b81e75e9c3aeff","name":"appjs-linux","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.13"},"versions":{"0.0.13":{"name":"appjs-linux","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.13","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.8"},"dependencies":{"mime":"1.2.5"},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-linux@0.0.13","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"41425e0738367ee22f61fbdd2674061359a69bc5","tarball":"http://registry.npmjs.org/appjs-linux/-/appjs-linux-0.0.13.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]}},"readme":"# AppJS\n\nAppJS is an SDK to develop desktop applications using node. Or at least\nit is going to be!\n\nThe goal is to facilitate native app development using\ntools every developer is familiar with nowadays: HTML/CSS/JS\n\n## How to use\n\nThis is ready to use AppJS module. It contains everything you need to build and test\nyour application.\n\nFor more information visit http://appjs.org and/or https://github.com/milani/appjs\n\n\n**Attention:** AppJS is under heavy development. API changes a lot until we bump version to v0.1.0\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}],"time":{"modified":"2012-06-29T10:40:08.437Z","created":"2012-06-29T10:40:03.431Z","0.0.13":"2012-06-29T10:40:08.437Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"_attachments":{"appjs-linux-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/Wn5pYfmfm53w2mSQ2M6Mg==","length":22040103,"stub":true}}}},
{"id":"appjs-linux-ia32","key":"appjs-linux-ia32","value":{"rev":"9-e13a56748f8f436e1c65d914b9eb547c"},"doc":{"_id":"appjs-linux-ia32","_rev":"9-e13a56748f8f436e1c65d914b9eb547c","name":"appjs-linux-ia32","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.18"},"versions":{"0.0.17":{"name":"appjs-linux-ia32","os":["linux"],"cpu":["ia32"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.17","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{"mime":"1.2.5"},"scripts":{"install":"node cli/configure.js && node cli/build.js"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-linux-ia32@0.0.17","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"6f06e667c5d9dbb88b4bbed4277ed77e0b329f07","tarball":"http://registry.npmjs.org/appjs-linux-ia32/-/appjs-linux-ia32-0.0.17.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.18":{"name":"appjs-linux-ia32","os":["linux"],"cpu":["ia32"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.18","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"lib":"./lib"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-linux-ia32@0.0.18","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"90e472283e333db4f8c7bab9ff01695d30b9a7e0","tarball":"http://registry.npmjs.org/appjs-linux-ia32/-/appjs-linux-ia32-0.0.18.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]}},"readme":"# AppJS - Linux\nThis is the Linux package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}],"time":{"modified":"2012-08-05T05:56:29.695Z","created":"2012-07-26T22:00:47.692Z","0.0.17":"2012-07-26T22:01:06.025Z","0.0.18":"2012-08-05T05:56:29.695Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"users":{"fgribreau":true},"_attachments":{"appjs-linux-ia32-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-h6TnKhAP/MDtRCnVlYc/SA==","length":21956867,"stub":true},"appjs-linux-ia32-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jKUR9fO0ilG0rSnKHJ/SEg==","length":22136015,"stub":true}}}},
{"id":"appjs-linux-x64","key":"appjs-linux-x64","value":{"rev":"9-32129d95e923ee2ac0dfd07797332277"},"doc":{"_id":"appjs-linux-x64","_rev":"9-32129d95e923ee2ac0dfd07797332277","name":"appjs-linux-x64","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.18"},"versions":{"0.0.17":{"name":"appjs-linux-x64","os":["linux"],"cpu":["x64"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.17","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{"mime":"1.2.5"},"scripts":{"install":"node cli/configure.js && node cli/build.js"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-linux-x64@0.0.17","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"2ce00ac14409d0fd33f2f3fcfc4f5ebf9e920ca6","tarball":"http://registry.npmjs.org/appjs-linux-x64/-/appjs-linux-x64-0.0.17.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]},"0.0.18":{"name":"appjs-linux-x64","os":["linux"],"cpu":["x64"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.18","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"lib":"./lib"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-linux-x64@0.0.18","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"172193d416ed6ca7fe14350080afd7629654d28b","tarball":"http://registry.npmjs.org/appjs-linux-x64/-/appjs-linux-x64-0.0.18.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]}},"readme":"# AppJS - Linux\nThis is the Linux package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}],"time":{"modified":"2012-08-05T05:53:16.797Z","created":"2012-07-26T20:47:19.596Z","0.0.17":"2012-07-26T20:47:43.872Z","0.0.18":"2012-08-05T05:53:16.797Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"git://github.com/appjs/appjs.git"},"users":{"fgribreau":true},"_attachments":{"appjs-linux-x64-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-xN304ExBnxXiErFZmlT7VQ==","length":22430315,"stub":true},"appjs-linux-x64-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3sTcQh6kCatCcWqQD7zjZg==","length":22634219,"stub":true}}}},
{"id":"appjs-mac","key":"appjs-mac","value":{"rev":"3-aa53d03e9d4ed511f3fa7138357e9c11"},"doc":{"_id":"appjs-mac","_rev":"3-aa53d03e9d4ed511f3fa7138357e9c11","name":"appjs-mac","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.13"},"versions":{"0.0.13":{"name":"appjs-mac","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.13","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.8"},"dependencies":{"mime":"1.2.5"},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"_npmUser":{"name":"milani","email":"mrtz.milani@gmail.com"},"_id":"appjs-mac@0.0.13","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"602c044e3b79ee7c7bec1c8f9af1bf2bd1400887","tarball":"http://registry.npmjs.org/appjs-mac/-/appjs-mac-0.0.13.tgz"},"maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}]}},"readme":"# AppJS\n\nAppJS is an SDK to develop desktop applications using node. Or at least\nit is going to be!\n\nThe goal is to facilitate native app development using\ntools every developer is familiar with nowadays: HTML/CSS/JS\n\n## How to use\n\nThis is ready to use AppJS module. It contains everything you need to build and test\nyour application.\n\nFor more information visit http://appjs.org and/or https://github.com/milani/appjs\n\n\n**Attention:** AppJS is under heavy development. API changes a lot until we bump version to v0.1.0\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"milani","email":"mrtz.milani@gmail.com"}],"time":{"modified":"2012-06-29T13:06:20.878Z","created":"2012-06-29T13:06:15.536Z","0.0.13":"2012-06-29T13:06:20.878Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"git://github.com/milani/appjs.git"},"_attachments":{"appjs-mac-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NYdtLQcY1UdYrP+wGuncQQ==","length":16531523,"stub":true}}}},
{"id":"appjs-win","key":"appjs-win","value":{"rev":"8-8264df1cc485bf66f78d5eb966461fca"},"doc":{"_id":"appjs-win","_rev":"8-8264df1cc485bf66f78d5eb966461fca","name":"appjs-win","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.17"},"versions":{"0.0.13":{"name":"appjs-win","description":"AppJS is an SDK to develop desktop applications using node. Or at least it is going to be!","version":"0.0.13","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"https://github.com/milani/appjs"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":"0.6 || 0.8"},"dependencies":{"mime":"1.2.5"},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"readme":"# AppJS\n\nAppJS is an SDK to develop desktop applications using node. Or at least\nit is going to be!\n\nThe goal is to facilitate native app development using\ntools every developer is familiar with nowadays: HTML/CSS/JS\n\n## How to use\n\nThis is ready to use AppJS module. It contains everything you need to build and test\nyour application.\n\nFor more information visit http://appjs.org and/or https://github.com/milani/appjs\n\n\n**Attention:** AppJS is under heavy development. API changes a lot until we bump version to v0.1.0\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"appjs-win@0.0.13","dist":{"shasum":"8823f4f1fe2fed40586b50e9e3f82b21ec55a618","tarball":"http://registry.npmjs.org/appjs-win/-/appjs-win-0.0.13.tgz"},"maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}]},"0.1.0":{"name":"appjs-win","os":["win32"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.1.0","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"https://github.com/appjs/appjs"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{"mime":"1.2.5"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"readme":"# AppJS - Windows\nThis is the Windows package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","_id":"appjs-win@0.1.0","dist":{"shasum":"ebfd28426fa9343dc9403d46a793dccf8f6a4a04","tarball":"http://registry.npmjs.org/appjs-win/-/appjs-win-0.1.0.tgz"},"maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}]},"0.0.17":{"name":"appjs-win","os":["win32"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.17","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"https://github.com/appjs/appjs"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{"mime":"1.2.5"},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"readme":"# AppJS - Windows\nThis is the Windows package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","_id":"appjs-win@0.0.17","dist":{"shasum":"0eeb7119c6438763cc412835720cdb0a5833ae9f","tarball":"http://registry.npmjs.org/appjs-win/-/appjs-win-0.0.17.tgz"},"maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}]}},"readme":"# AppJS\n\nAppJS is an SDK to develop desktop applications using node. Or at least\nit is going to be!\n\nThe goal is to facilitate native app development using\ntools every developer is familiar with nowadays: HTML/CSS/JS\n\n## How to use\n\nThis is ready to use AppJS module. It contains everything you need to build and test\nyour application.\n\nFor more information visit http://appjs.org and/or https://github.com/milani/appjs\n\n\n**Attention:** AppJS is under heavy development. API changes a lot until we bump version to v0.1.0\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}],"time":{"modified":"2012-08-02T13:44:25.773Z","created":"2012-06-29T10:41:36.956Z","0.0.13":"2012-06-29T10:41:37.612Z","0.1.0":"2012-07-24T12:59:30.102Z","0.0.17":"2012-07-25T05:47:47.757Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"https://github.com/appjs/appjs"},"users":{"fgribreau":true},"_attachments":{"appjs-win-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7FaWjCIadJbtV1RM4DnEVw==","length":17904237,"stub":true},"appjs-win-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-v2Kil/41wx0PxvX+6QaB9g==","length":17904104,"stub":true},"appjs-win-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hFNCeKlYtFE2xO0FYfZx9A==","length":17028492,"stub":true}}}},
{"id":"appjs-win32","key":"appjs-win32","value":{"rev":"3-c01352fb9a5fb3d18b0bc6d50b529d66"},"doc":{"_id":"appjs-win32","_rev":"3-c01352fb9a5fb3d18b0bc6d50b529d66","name":"appjs-win32","description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","dist-tags":{"latest":"0.0.18"},"versions":{"0.0.18":{"name":"appjs-win32","os":["win32"],"description":"AppJS is a SDK on top of nodejs to develop desktop applications using HTML/CSS/JS","version":"0.0.18","keywords":["cef","webkit","browser","canvas","html5","desktop","native","gtk","ui","sdk"],"homepage":"http://appjs.org","repository":{"type":"git","url":"https://github.com/appjs/appjs"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"contributors":[{"name":"Ali Farhadi","email":"a.farhadi@gmail.com"},{"name":"Brandon Benvie","email":"brandon@bbenvie.com"}],"directories":{"doc":"./doc","lib":"./lib","test":"./tests"},"main":"./index.js","engines":{"node":">=0.8"},"dependencies":{},"licenses":[{"type":"MIT","url":"https://github.com/milani/appjs/blob/master/LICENSE"}],"readme":"# AppJS - Windows\nThis is the Windows package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","_id":"appjs-win32@0.0.18","dist":{"shasum":"ba2fcbbc702fef9eb2e4dd1ddcae213259d5df71","tarball":"http://registry.npmjs.org/appjs-win32/-/appjs-win32-0.0.18.tgz"},"maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}]}},"readme":"# AppJS - Windows\nThis is the Windows package for AppJS. See the included appjs folder for the full README.\n\n---\n\n* __Site: [appjs.org](http://appjs.org)__\n* __Community: [mailing list](https://groups.google.com/forum/#!forum/appjs-dev)__\n\n---\n\n\n\n## License\n( The MIT License )\n\nCopyright (c) 2012 Morteza Milani and other AppJS contributors\n\nSee the LICENSE file for details.\n","maintainers":[{"name":"benvie","email":"brandon@bbenvie.com"}],"time":{"modified":"2012-08-05T01:42:50.603Z","created":"2012-08-05T01:42:49.873Z","0.0.18":"2012-08-05T01:42:50.603Z"},"author":{"name":"Morteza Milani","email":"mrtz.milani@gmail.com"},"repository":{"type":"git","url":"https://github.com/appjs/appjs"},"_attachments":{"appjs-win32-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NkF5AsniPhw6Jce+2SVOPg==","length":17812742,"stub":true}}}},
{"id":"appkit","key":"appkit","value":{"rev":"3-38a338b82eeaaf799a8df426e73fb9ad"},"doc":{"_id":"appkit","_rev":"3-38a338b82eeaaf799a8df426e73fb9ad","name":"appkit","description":"Extensions for building applications using Spine.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"appkit","description":"Extensions for building applications using Spine.js","version":"1.0.0","author":{"name":"Vojtech Rinik","email":"vojto@rinik.net"},"main":"./index.js","dependencies":{"spine":"1.0.6","haml-coffee":"0.5.5","coffee-script":"1.2.0"},"_npmUser":{"name":"vojto","email":"vojto@rinik.net"},"_id":"appkit@1.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4cfef4e2bf2050badac02c3ecc8bc9ac9929ba0e","tarball":"http://registry.npmjs.org/appkit/-/appkit-1.0.0.tgz"},"readme":"","maintainers":[{"name":"vojto","email":"vojto@rinik.net"}]}},"readme":"","maintainers":[{"name":"vojto","email":"vojto@rinik.net"}],"time":{"modified":"2012-04-23T20:30:13.959Z","created":"2012-04-23T20:30:12.519Z","1.0.0":"2012-04-23T20:30:13.959Z"},"author":{"name":"Vojtech Rinik","email":"vojto@rinik.net"},"_attachments":{"appkit-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BBF9077i0yQvZiBvb4EgPA==","length":6405,"stub":true}}}},
{"id":"apple","key":"apple","value":{"rev":"3-5078f45b3db468e3ae510ff8f50a22fe"},"doc":{"_id":"apple","_rev":"3-5078f45b3db468e3ae510ff8f50a22fe","name":"apple","description":"hi","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"apple","version":"0.0.0","description":"hi","main":"index.js","repository":"","author":"","license":"BSD","readme":"hi\n","_id":"apple@0.0.0","dist":{"shasum":"fecd95a7d5961ffa1784a87747b8fb73dbf74a03","tarball":"http://registry.npmjs.org/apple/-/apple-0.0.0.tgz"},"maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}]}},"readme":"hi\n","maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}],"time":{"modified":"2012-08-09T13:57:35.389Z","created":"2012-08-09T13:57:28.072Z","0.0.0":"2012-08-09T13:57:35.389Z"},"_attachments":{"apple-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HimLZGK1OXj3ryll00OBiA==","length":4347,"stub":true}}}},
{"id":"applescript","key":"applescript","value":{"rev":"11-e7d916f88a71a734a12422ca6b95f05a"},"doc":{"_id":"applescript","_rev":"11-e7d916f88a71a734a12422ca6b95f05a","name":"applescript","description":"Easily execute arbitrary AppleScript code on OS X through NodeJS.","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"applescript","description":"Easily execute arbitrary AppleScript code on OS X through NodeJS.","version":"0.1.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},"keywords":["applescript","mac","osx"],"main":"./lib/applescript","lib":"./lib","engines":{"node":">= 0.2.0"},"_id":"applescript@0.1.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/applescript/-/applescript-0.1.0.tgz"}},"0.2.0":{"name":"applescript","description":"Easily execute arbitrary AppleScript code on OS X through NodeJS.","version":"0.2.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},"keywords":["applescript","mac","osx"],"main":"./lib/applescript","lib":"./lib","engines":{"node":">= 0.2.0"},"_id":"applescript@0.2.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/applescript/-/applescript-0.2.0.tgz"}},"0.2.1":{"name":"applescript","description":"Easily execute arbitrary AppleScript code on OS X through NodeJS.","version":"0.2.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},"keywords":["applescript","mac","osx"],"main":"./lib/applescript","lib":"./lib","engines":{"node":">= 0.2.0"},"_id":"applescript@0.2.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/applescript/-/applescript-0.2.1.tgz"}}},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},"time":{"modified":"2012-03-09T03:52:37.554Z","created":"2012-03-09T03:52:37.554Z","0.1.0":"2012-03-09T03:52:37.554Z","0.2.0":"2012-03-09T03:52:37.554Z","0.2.1":"2012-03-09T03:52:37.554Z"},"_attachments":{"applescript-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sE8iSXvjFftEeua6C+edBg==","length":4798,"stub":true},"applescript-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-R+4FfwSci9eGoFnXo5yr3Q==","length":4965,"stub":true},"applescript-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qWS4oHFFYHi5ZkTgfkN/Zw==","length":4365,"stub":true}}}},
{"id":"application","key":"application","value":{"rev":"27-57d50c7de5a57f0e02dc6be25f545d31"},"doc":{"_id":"application","_rev":"27-57d50c7de5a57f0e02dc6be25f545d31","name":"application","description":"unified http and websocket api","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.0":{"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum"},"name":"application","description":"controllers for node.js","version":"0.0.0","repository":{"url":""},"engines":{"node":"~0.6.5"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tblobaum","email":"tblobaum@gmail.com"},"_id":"application@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"197ee46b292506f1b6f72d2ec31d3f578b82a8fa","tarball":"http://registry.npmjs.org/application/-/application-0.0.0.tgz"},"maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"name":"application","description":"unified http and websocket api","version":"0.1.0","homepage":"https://github.com/tblobaum/node-application/","repository":{"type":"git","url":"git://github.com/tblobaum/node-application.git"},"dependencies":{"error-page":"0.0.3","routes":"~0.1.1","node-static":"~0.5.9","dnode":"~0.9.11","long-stack-traces":"~0.1.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tblobaum","email":"tblobaum@gmail.com"},"_id":"application@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"84a1a6144bb90dc33dbf7a5a140a697747abc78f","tarball":"http://registry.npmjs.org/application/-/application-0.1.0.tgz"},"readme":"# application\n\nunified http and websocket api\n\n[![Build Status](https://secure.travis-ci.org/tblobaum/node-application.png)](http://travis-ci.org/tblobaum/node-application)\n\n## Install\n\n`npm install application`\n\n## Example\n\n```js\n\n\n```\n\n## API\n\n### application\n\n### .listen\n\n## Tests\n\n`npm install -g tap && npm test`\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Thomas Blobaum <tblobaum@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"name":"application","description":"unified http and websocket api","version":"0.1.2","homepage":"https://github.com/tblobaum/node-application/","repository":{"type":"git","url":"git://github.com/tblobaum/node-application.git"},"scripts":{"test":"tap test/*.test.js"},"dependencies":{"error-page":"0.0.3","node-static":"~0.5.9","dnode":"~0.9.11","cookies":"~0.3.0","redsess":"0.0.6","keygrip":"~0.2.0","templar":"0.0.5","ejs":"~0.7.1"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tblobaum","email":"tblobaum@gmail.com"},"_id":"application@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f131770dc60427247a999c423cfa9a9df2b04b02","tarball":"http://registry.npmjs.org/application/-/application-0.1.2.tgz"},"readme":"# application\n\nunified http and websocket api\n\n[![Build Status](https://secure.travis-ci.org/tblobaum/node-application.png)](http://travis-ci.org/tblobaum/node-application)\n\n## Install\n\n`npm install application`\n\n## Example\n\n```js\n\n\n```\n\n## API\n\n### application\n\n### .listen\n\n## Tests\n\n`npm install -g tap && npm test`\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Thomas Blobaum <tblobaum@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"name":"application","description":"unified http and websocket api","version":"0.1.3","homepage":"https://github.com/tblobaum/node-application/","repository":{"type":"git","url":"git://github.com/tblobaum/node-application.git"},"scripts":{"test":"tap test/*.test.js"},"dependencies":{"error-page":"0.0.3","node-static":"~0.5.9","dnode":"~0.9.11","cookies":"~0.3.0","redsess":"0.0.6","keygrip":"~0.2.0","templar":"0.0.5","ejs":"~0.7.1"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tblobaum","email":"tblobaum@gmail.com"},"_id":"application@0.1.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fc606cae07a8035db6adbe244152cd0a6798e6e3","tarball":"http://registry.npmjs.org/application/-/application-0.1.3.tgz"},"readme":"# application\n\nunified http and websocket api\n\n[![Build Status](https://secure.travis-ci.org/tblobaum/node-application.png)](http://travis-ci.org/tblobaum/node-application)\n\n## Install\n\n`npm install application`\n\n## Example\n\n```js\n\n\n```\n\n## API\n\n### application\n\n### .listen\n\n## Tests\n\n`npm install -g tap && npm test`\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Thomas Blobaum <tblobaum@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"directories":{}},"0.1.4":{"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"name":"application","description":"unified http and websocket api","version":"0.1.4","homepage":"https://github.com/tblobaum/node-application/","repository":{"type":"git","url":"git://github.com/tblobaum/node-application.git"},"scripts":{"test":"tap test/*.test.js"},"dependencies":{"error-page":"0.0.3","node-static":"~0.5.9","dnode":"~0.9.11","cookies":"~0.3.0","redsess":"0.0.6","keygrip":"~0.2.0","templar":"0.0.5","ejs":"~0.7.1","formidable":"~1.0.11"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tblobaum","email":"tblobaum@gmail.com"},"_id":"application@0.1.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"06f9a73ce51192ade18892214a46901ce99aaf52","tarball":"http://registry.npmjs.org/application/-/application-0.1.4.tgz"},"readme":"# application\n\nunified http and websocket api\n\n[![Build Status](https://secure.travis-ci.org/tblobaum/node-application.png)](http://travis-ci.org/tblobaum/node-application)\n\n## Install\n\n`npm install application`\n\n## Example\n\n```js\n\n\n```\n\n## API\n\n### application\n\n### .listen\n\n## Tests\n\n`npm install -g tap && npm test`\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Thomas Blobaum <tblobaum@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}]}},"readme":null,"maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"time":{"modified":"2012-06-12T13:08:08.161Z","created":"2011-12-19T19:13:23.243Z","0.0.0":"2011-12-19T19:13:25.948Z","0.1.0":"2012-05-08T02:28:54.964Z","0.1.2":"2012-05-10T23:47:44.822Z","0.1.3":"2012-06-12T05:56:52.793Z","0.1.4":"2012-06-12T13:08:08.161Z"},"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum/"},"repository":{"type":"git","url":"git://github.com/tblobaum/node-application.git"},"_attachments":{"application-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-IlbJ32t0xu6L2YCOBfbODw==","length":318705,"stub":true},"application-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-T+EkG5repAPcpIJ5D1+mGQ==","length":318542,"stub":true},"application-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-GuWe8uQEQ4nY+0eAEJ8lLw==","length":318172,"stub":true},"application-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TsWVppFQRv407tBkLmJQzQ==","length":44093,"stub":true},"application-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-g1Xt28/al7aIGkLG0vIPfQ==","length":342,"stub":true}}}},
{"id":"application-name","key":"application-name","value":{"rev":"3-09c59fb2910cd2421448b125bd39b522"},"doc":{"_id":"application-name","_rev":"3-09c59fb2910cd2421448b125bd39b522","name":"application-name","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"application-name","version":"0.0.1","private":false,"dependencies":{"express":"2.4.7","jade":">= 0.0.1","jqtpl":">= 0.0.1"},"_npmUser":{"name":"diopib","email":"diopib@gmail.com"},"_id":"application-name@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"02289e95832a8f5d35b2b77b65a311c9548fce61","tarball":"http://registry.npmjs.org/application-name/-/application-name-0.0.1.tgz"},"maintainers":[{"name":"diopib","email":"diopib@gmail.com"}]}},"maintainers":[{"name":"diopib","email":"diopib@gmail.com"}],"time":{"modified":"2011-10-10T23:40:22.168Z","created":"2011-10-10T23:40:21.662Z","0.0.1":"2011-10-10T23:40:22.168Z"},"_attachments":{"application-name-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3GVMR5F2eumurw0pJZgu1A==","length":3099,"stub":true}}}},
{"id":"applious-draft","key":"applious-draft","value":{"rev":"3-6ffd4c14fb8b6ca4054381f72a161419"},"doc":{"_id":"applious-draft","_rev":"3-6ffd4c14fb8b6ca4054381f72a161419","name":"applious-draft","description":"A draft site scaffold for rapid front-end development using CoffeeScript, Eco and Stylus.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"applious-draft","description":"A draft site scaffold for rapid front-end development using CoffeeScript, Eco and Stylus.","author":{"name":"Jim Fleming","email":"jim@freeflow.io","url":"http://jimfleming.me"},"contributors":[{"name":"Danielle Swank","email":"danielle@freeflow.io","url":"http://danielleswank.com"}],"preferGlobal":true,"keywords":["coffee-script","eco","stylus"],"version":"0.0.1","scripts":{"start":"coffee app.coffee"},"bugs":{"email":"us@freeflow.io","url":"https://github.com/Applious/draft/issues"},"main":"./lib/app.coffee","bin":{"applious-draft":"./bin/applious-draft"},"dependencies":{"coffee-script":"*","stylus":"*","eco":"*","express":"*","underscore":"*","optimist":"*"},"engines":{"node":"0.6 || 0.7 || 0.8","npm":"1"},"_npmUser":{"name":"jimfleming","email":"jimmy.fleming@gmail.com"},"_id":"applious-draft@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"446346e413d7edaa6bab12587a09adb760142466","tarball":"http://registry.npmjs.org/applious-draft/-/applious-draft-0.0.1.tgz"},"maintainers":[{"name":"jimfleming","email":"jimmy.fleming@gmail.com"}]}},"readme":"DRAFT\n=====\n\nA draft site scaffold for rapid front-end development. Its a simple static node server for our front-end stack (coffee-script, stylus, eco).\n\nCan run a static site in any directory from a single server: `draft --port 8000`\n\n\nExamples\n--------\n\n* `draft`\n* `draft --port 8000`\n* `draft -p 80`\n* `draft --port 8000 ~/Projects/MyApp/`\n\n\nExpects\n-------\n\nA `public` directory with any static assets such as javascript, css\nand html. A `src` directory with compilable files such as coffee-script, stylus, eco.\n\nEco templates should be inside a `templates` directory in `src` and\nmay optionally provide a parent template (`layout.eco`) to be applied\nto all templates.\n\nExample file structure:\n\n* public/\n  * index.html\n  * styles/\n    * home.css\n  * scripts/\n    * jquery.js\n    * main.js\n* src/\n  * styles/\n    * home.styl\n  * scripts/\n    * main.coffee\n  * templates/\n    * layout.eco\n    * about.eco\n","maintainers":[{"name":"jimfleming","email":"jimmy.fleming@gmail.com"}],"time":{"modified":"2012-06-23T15:23:17.848Z","created":"2012-06-23T15:23:16.520Z","0.0.1":"2012-06-23T15:23:17.848Z"},"author":{"name":"Jim Fleming","email":"jim@freeflow.io","url":"http://jimfleming.me"},"_attachments":{"applious-draft-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0iDVxqJGVQZ3P3RWqjiXlw==","length":1905,"stub":true}}}},
{"id":"appload-dns","key":"appload-dns","value":{"rev":"9-e9d219af67417fb7566b4888bda9d0ca"},"doc":{"_id":"appload-dns","_rev":"9-e9d219af67417fb7566b4888bda9d0ca","name":"appload-dns","description":"DNS library in node.js","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"appload-dns","description":"DNS library in node.js","version":"0.1.0","homepage":"https://github.com/appload/dns","repository":{"type":"git","url":"git://github.com/appload/dns.git"},"author":{"name":"Rafał Sobota"},"directories":{"lib":"lib"},"engines":{"node":"*"},"main":"index","dependencies":{"underscore":">= 1.2.2"},"_npmUser":{"name":"rafalsobota","email":"ravsobota@gmail.com"},"_id":"appload-dns@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f9c84da3c840a55943ed53c1f8762cca4449f7a0","tarball":"http://registry.npmjs.org/appload-dns/-/appload-dns-0.1.0.tgz"},"maintainers":[{"name":"rafalsobota","email":"ravsobota@gmail.com"}]},"0.1.1":{"name":"appload-dns","description":"DNS library in node.js","version":"0.1.1","homepage":"https://github.com/appload/dns","repository":{"type":"git","url":"git://github.com/appload/dns.git"},"author":{"name":"Rafał Sobota"},"directories":{"lib":"lib"},"engines":{"node":"*"},"main":"index","dependencies":{"underscore":">= 1.2.2"},"_npmUser":{"name":"rafalsobota","email":"ravsobota@gmail.com"},"_id":"appload-dns@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"73aab322c98eacee21d50549ae45100cdd4645c3","tarball":"http://registry.npmjs.org/appload-dns/-/appload-dns-0.1.1.tgz"},"maintainers":[{"name":"rafalsobota","email":"ravsobota@gmail.com"}]},"0.1.2":{"name":"appload-dns","description":"DNS library in node.js","version":"0.1.2","homepage":"https://github.com/appload/dns","repository":{"type":"git","url":"git://github.com/appload/dns.git"},"author":{"name":"Rafał Sobota"},"directories":{"lib":"lib"},"engines":{"node":"*"},"main":"index","dependencies":{"underscore":">= 1.2.2"},"_npmUser":{"name":"rafalsobota","email":"ravsobota@gmail.com"},"_id":"appload-dns@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"3e543aa2d6ea33b4830ddabe61eb9c5aa29e3a2f","tarball":"http://registry.npmjs.org/appload-dns/-/appload-dns-0.1.2.tgz"},"maintainers":[{"name":"rafalsobota","email":"ravsobota@gmail.com"}]},"0.1.3":{"name":"appload-dns","description":"DNS library in node.js","version":"0.1.3","homepage":"https://github.com/appload/dns","repository":{"type":"git","url":"git://github.com/appload/dns.git"},"author":{"name":"Rafał Sobota"},"directories":{"lib":"lib"},"engines":{"node":"*"},"main":"index","dependencies":{"underscore":">= 1.2.2"},"_npmUser":{"name":"rafalsobota","email":"ravsobota@gmail.com"},"_id":"appload-dns@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"1b7355e63e06f6b5aa2e9352bba5a9e8e5f47600","tarball":"http://registry.npmjs.org/appload-dns/-/appload-dns-0.1.3.tgz"},"maintainers":[{"name":"rafalsobota","email":"ravsobota@gmail.com"}]}},"readme":"Appload DNS\n==============================\n\nFork of ndns by Jeremy Johnstone created for Appload platform.\n\nExample in Coffeescript:\n\n    dns = require \"appload-dns\"\n    zones =\n      \"appload.pl\":\n        admin: \"rafal@appload.pl\"\n        records: [\n          {class: \"A\", value: \"192.168.1.100\"}\n          {class: \"NS\", value: \"dns1.appload.pl.\"}\n          {class: \"NS\", value: \"dns2.appload.pl.\"}\n          {prefix: \"dns1\", value: \"192.168.1.100\"}\n          {prefix: \"dns2\", value: \"192.168.1.101\"}\n          {prefix: \"sample\", value: \"192.168.1.104\"}\n          {prefix: \"another-sample\", value: \"192.168.1.105\"}\n          {class: \"MX\", value: \"10 aspmx.l.google.com.\"}\n          {class: \"TXT\", value: \"hello npm\"}\n        ]\n      \"zaqpki.pl\":\n        admin: \"rafal@appload.pl\"\n        records: [\n          {class: \"NS\", value: \"dns1.zaqpki.pl.\"}\n          {class: \"NS\", value: \"dns2.zaqpki.pl.\"}\n          {prefix: \"dns1\", value: \"192.168.1.100\"}\n          {prefix: \"dns2\", value: \"192.168.1.101\"}\n          {class: \"A\", value: \"192.168.1.100\"}\n        ]\n\n    server = dns.createServer(zones)\n    server.listen(53)\n\nZones configuration can be replaced in real-time by __reload__ method.\n\n    server.reload(zones)\n\nConnection can be closed by __close__ method.\n\n    server.close()\n    \n        ","maintainers":[{"name":"rafalsobota","email":"ravsobota@gmail.com"}],"time":{"modified":"2012-01-08T05:49:31.155Z","created":"2011-12-03T21:27:30.405Z","0.1.0":"2011-12-03T21:27:34.398Z","0.1.1":"2011-12-03T22:00:19.427Z","0.1.2":"2012-01-08T05:24:48.481Z","0.1.3":"2012-01-08T05:49:31.155Z"},"author":{"name":"Rafał Sobota"},"repository":{"type":"git","url":"git://github.com/appload/dns.git"},"_attachments":{"appload-dns-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-JWJc3RqgFnhh0vKo7pODSA==","length":30720,"stub":true},"appload-dns-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OyVfIMj9sQqciMdGWgibjQ==","length":30720,"stub":true},"appload-dns-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iG01WmjY0Gcdvxx4GZ+rJA==","length":30720,"stub":true},"appload-dns-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ItHFjso5+p3z47d0MhWJSQ==","length":30720,"stub":true}}}},
{"id":"apply","key":"apply","value":{"rev":"3-2f49932ddd4440ca4eb3aa0117f17c21"},"doc":{"_id":"apply","_rev":"3-2f49932ddd4440ca4eb3aa0117f17c21","name":"apply","description":"Better version of Function.prototype.apply","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Daniel Brockman","email":"@dbrock"},"name":"apply","description":"Better version of Function.prototype.apply","version":"0.0.0","main":"apply.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dbrock","email":"daniel@brockman.se"},"_id":"apply@0.0.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"94ea44fa7bc8cfc53e862ef5d58a9c09323b5688","tarball":"http://registry.npmjs.org/apply/-/apply-0.0.0.tgz"},"readme":"","maintainers":[{"name":"dbrock","email":"daniel@brockman.se"}]}},"readme":"","maintainers":[{"name":"dbrock","email":"daniel@brockman.se"}],"time":{"modified":"2012-05-04T09:40:34.611Z","created":"2012-05-04T09:40:32.545Z","0.0.0":"2012-05-04T09:40:34.611Z"},"author":{"name":"Daniel Brockman","email":"@dbrock"},"_attachments":{"apply-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cFjyt2OzhqU5bLpyhgNrVA==","length":389,"stub":true}}}},
{"id":"apprentice","key":"apprentice","value":{"rev":"35-0f90b8e30263dfcf4a69f98497ebb5b0"},"doc":{"_id":"apprentice","_rev":"35-0f90b8e30263dfcf4a69f98497ebb5b0","name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","dist-tags":{"latest":"0.3.3"},"versions":{"0.1.0":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.1.0","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"routes":"git://github.com/aaronblohowiak/routes.js.git"},"devDependencies":{},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"71d0054b64597c41d6f6337db85dfece25f08aca","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.1.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.0":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.0","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"routes":"git://github.com/aaronblohowiak/routes.js.git"},"devDependencies":{"request":"~2.9.202"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"a8bc84250111b7bc90a55132d29b3c13d110a949","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.1":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.1","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.0","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c1623092b18417437ceff1e43356993d03692195","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.2":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.2","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.0","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"27cc179459ebf81f5f0fe24b996b6ba0314f8773","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.2.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.3":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.3","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.0","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"22af0667d70b53046cb7ca74d094724d7b1b2f09","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.3.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.4":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.4","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.0","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"171449e5c20f9f4d5ab20c672b12ee51ab2aa0d7","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.4.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.5":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.5","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.0","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b2a827622d21e03cdddafdd7d864b5af91819d65","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.5.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.6":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.6","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.0","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"515162d4df58e450d4a7a2d850889ec3c6c33d40","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.6.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.7":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.7","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.1","qs":"~0.4.2"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"6670991b8a44cf0709c3afeb830196b8e63f359d","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.7.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.8":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.8","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.1","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"6237cf1bce0d82d65bb6cd1560a49159a5170fa9","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.8.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.9":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.9","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.1","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4bb8358854882ea1c0fd4048d873fd96575d6559","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.9.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.10":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.10","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.2.1","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"58c84fc4e2eb771be35e46c9b1e52c14c592b90c","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.10.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.2.11":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.2.11","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.3.0","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.2.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a267e79f8373f52282055440a7ef0b48fa4f2092","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.2.11.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.3.0":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.3.0","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.3.0","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"513190028290ebeb9095cfb0567aa4ae28840752","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.3.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.3.1":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.3.1","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.3.0","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d4dd75863c35e7c9fb91b4fb27765b15ea0ebf9a","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.3.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.3.2":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.3.2","repository":{"url":""},"engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.3.0","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d8be0266595c038380c91f9130fe266cd733c57a","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.3.2.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.3.3":{"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"name":"apprentice","description":"[Experimental] web library that adds some sugar to routing","version":"0.3.3","engines":{"node":"0.6 || 0.7"},"dependencies":{"linchpin":"0.3.0","qs":"~0.4.2","filed":"0.0.6"},"devDependencies":{"request":"~2.9.202","coffee-script":"~1.3.1","mocha":"~1.0.0"},"optionalDependencies":{},"repository":{"type":"git","url":"git://github.com/twilson63/apprentice.git"},"homepage":"http://github.com/twilson63/apprentice","_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"apprentice@0.3.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"63c3b5a37b0bf295add91728335cb8cae68cd22e","tarball":"http://registry.npmjs.org/apprentice/-/apprentice-0.3.3.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]}},"readme":"# Appentice - Web Library\n\nThis is a small 12 line project that takes routes.js and add some semantic sugar to reduce the redundancy for a web application.  This project is a very minimalistic approach to rest driven api web services.  \n\n# Usage \n\nComing Soon","maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"time":{"modified":"2012-06-03T12:00:09.835Z","created":"2012-04-23T03:33:53.724Z","0.1.0":"2012-04-23T03:33:54.613Z","0.2.0":"2012-04-23T20:17:01.805Z","0.2.1":"2012-04-24T13:58:41.022Z","0.2.2":"2012-04-24T14:30:28.790Z","0.2.3":"2012-04-25T11:57:41.200Z","0.2.4":"2012-04-26T19:50:52.569Z","0.2.5":"2012-04-26T19:54:30.679Z","0.2.6":"2012-04-28T11:09:10.041Z","0.2.7":"2012-04-30T02:13:11.546Z","0.2.8":"2012-04-30T03:20:41.894Z","0.2.9":"2012-04-30T03:38:15.679Z","0.2.10":"2012-04-30T03:48:40.886Z","0.2.11":"2012-04-30T14:56:00.240Z","0.3.0":"2012-04-30T16:16:11.603Z","0.3.1":"2012-04-30T16:22:10.260Z","0.3.2":"2012-04-30T16:25:32.846Z","0.3.3":"2012-06-03T12:00:09.835Z"},"author":{"name":"Tom Wilson","email":"tom@jackhq.com"},"repository":{"type":"git","url":"git://github.com/twilson63/apprentice.git"},"_attachments":{"apprentice-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Qjvxieu0drRtjoZ+7J9KxA==","length":3344,"stub":true},"apprentice-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-MltlYNEoQ5P3/l5d3BpslA==","length":3230,"stub":true},"apprentice-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-IwS3gr2/N0OzbSTlzf/kmg==","length":3232,"stub":true},"apprentice-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-SBTttKENI1+ts5M+E0KaNA==","length":3238,"stub":true},"apprentice-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-dVPrAqrJ9PQzFK7356jHkg==","length":3276,"stub":true},"apprentice-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-cx9zZ7yh8/8fNPezYcSSOw==","length":3247,"stub":true},"apprentice-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-47jA13gkeijEf03D7CtsSw==","length":3244,"stub":true},"apprentice-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-CZyy+7a/S8krSZrkPxIbeA==","length":3239,"stub":true},"apprentice-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-N2pvyWGrlv6cey1uxZCnIQ==","length":3175,"stub":true},"apprentice-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-rQrgvh5As+FKL6zJBrZyyg==","length":3062,"stub":true},"apprentice-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-D7RwZG0S915ywZcYCLAROw==","length":1983,"stub":true},"apprentice-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-dpJujnP/FQLhFlVqSwUcCw==","length":1977,"stub":true},"apprentice-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-3ZRdaxVDycHCUewmZ65/RA==","length":1960,"stub":true},"apprentice-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qIW25jUJpXtRo84shJjpiQ==","length":1875,"stub":true},"apprentice-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Hvzi75JBoT3PTUUv9aDr0w==","length":1796,"stub":true},"apprentice-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GZAZdYi7en8BIGMgGlySuw==","length":1465,"stub":true},"apprentice-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/7OrBK255PT9iJDwUo0dXg==","length":968,"stub":true}}}},
{"id":"apps","key":"apps","value":{"rev":"3-4a057716f986549cfa2544bff711b78b"},"doc":{"_id":"apps","_rev":"3-4a057716f986549cfa2544bff711b78b","name":"apps","description":"hi baidu","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"apps","version":"0.0.0","description":"hi baidu","main":"index.js","repository":"","author":"","license":"BSD","readme":"hi baidu\n","_id":"apps@0.0.0","dist":{"shasum":"0c064944403b44ffb2ca79e15bd0764ad022ae6a","tarball":"http://registry.npmjs.org/apps/-/apps-0.0.0.tgz"},"maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}]}},"readme":"hi baidu\n","maintainers":[{"name":"flashsoft","email":"flashsoft@126.com"}],"time":{"modified":"2012-08-10T01:53:24.296Z","created":"2012-08-10T01:53:15.264Z","0.0.0":"2012-08-10T01:53:24.296Z"},"_attachments":{"apps-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-l/qh5lExSE9Amts1yQogRA==","length":252,"stub":true}}}},
{"id":"appserv","key":"appserv","value":{"rev":"3-5c5434027806353e6c69dde662d2ee8e"},"doc":{"_id":"appserv","_rev":"3-5c5434027806353e6c69dde662d2ee8e","name":"appserv","description":"A simple package that allows you to create a static async file-server vor you apps.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"appserv","version":"0.1.0","author":{"name":"Zeror","email":"zero@gmx.de"},"description":"A simple package that allows you to create a static async file-server vor you apps.","main":"./lip/appserv.js","repository":{"type":"git","url":"http://github.com/zeror/appserv.git"},"keywords":["app","static","http","server","appserver"],"homepage":"http://github.com/zeror/appserv","engines":{"node":">= 0.4.1"},"license":"MIT/X11","dependencies":{"optimist":">=0.3.x","node-static":">=0.6.x"},"devDependencies":{},"preferGlobal":"true","bin":{"appserv":"./bin/appserv"},"scripts":{"start":"node ./bin/appserv"},"readme":"# appserv: App-Server #\n\nA simple package that allows you to create a static async file-server vor you apps.\n\n\n\n# Installing globally #\n\nInstallation via `npm`.  \n\t\n\tnpm install appserv -g\n    \n\n# Start #\n\t\n\tappserv [options]\n\n# Serving App on #\n\t\n\t127.0.0.1:8080\n\n# Available Options #\n\n`-f` `--folder`  Folder default: '.'\n\n`-p` `--port` Port default: 8080\n\n`-i` `--ip` IP  default: '127.0.0.1'\n\n`-n` `--nolog` Nolog default: false\n\n`-h` `--help` Help\n","_id":"appserv@0.1.0","dist":{"shasum":"618658d8a648434a698e419be964ba8fa3c24e9d","tarball":"http://registry.npmjs.org/appserv/-/appserv-0.1.0.tgz"},"maintainers":[{"name":"zeror","email":"zeror@gmx.de"}]}},"readme":"# appserv: App-Server #\n\nA simple package that allows you to create a static async file-server vor you apps.\n\n\n\n# Installing globally #\n\nInstallation via `npm`.  \n\t\n\tnpm install appserv -g\n    \n\n# Start #\n\t\n\tappserv [options]\n\n# Serving App on #\n\t\n\t127.0.0.1:8080\n\n# Available Options #\n\n`-f` `--folder`  Folder default: '.'\n\n`-p` `--port` Port default: 8080\n\n`-i` `--ip` IP  default: '127.0.0.1'\n\n`-n` `--nolog` Nolog default: false\n\n`-h` `--help` Help\n","maintainers":[{"name":"zeror","email":"zeror@gmx.de"}],"time":{"modified":"2012-07-15T14:40:53.947Z","created":"2012-07-15T14:40:49.059Z","0.1.0":"2012-07-15T14:40:53.947Z"},"author":{"name":"Zeror","email":"zero@gmx.de"},"repository":{"type":"git","url":"http://github.com/zeror/appserv.git"},"_attachments":{"appserv-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-j5GZNhiQ5a4TFrXR8D7rsA==","length":1340,"stub":true}}}},
{"id":"appzone","key":"appzone","value":{"rev":"31-92ee071e7fc5b2f608ca3a15f6124318"},"doc":{"_id":"appzone","_rev":"31-92ee071e7fc5b2f608ca3a15f6124318","name":"appzone","description":"Appzone NodeJS Client","dist-tags":{"latest":"0.2.8"},"versions":{"0.1.0beta":{"name":"appzone","version":"0.1.0beta","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.0beta","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"74b9184919ab94bd593e2474d8b399f6a34e61ec","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.0beta.tgz"}},"0.1.1beta":{"name":"appzone","version":"0.1.1beta","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"express":">= 1.0.7 < 2.0.0","restler":">= 0.2.1","xml2js":">= 0.1.5"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.1beta","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"640a3079d5da59c9ea9dac590f728bf67c69eb21","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.1beta.tgz"}},"0.1.2":{"name":"appzone","version":"0.1.2","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"express":"=1.0.7","restler":">= 0.2.1","xml2js":">= 0.1.5"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8f3b8a732a0ef8ebf0014efb8e2a0131f87efa95","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.2.tgz"}},"0.1.3":{"name":"appzone","version":"0.1.3","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"express":">= 2.2.1","restler":">= 0.2.1","xml2js-expat":">= 0.2.0"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"68cf070c7778a83ce3608803de1ae14bad402816","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.3.tgz"}},"0.1.4":{"name":"appzone","version":"0.1.4","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"express":">= 2.2.1","restler":">= 0.2.1","xml2js-expat":">= 0.2.0"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d99a62f09bb9352d921f6658b67245bdf3a8bc2c","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.4.tgz"}},"0.1.5":{"name":"appzone","version":"0.1.5","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c4f2a623f701c2d04a3c3ba74a7439d56619f98e","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.5.tgz"}},"0.1.6":{"name":"appzone","version":"0.1.6","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c0de0532c15179b2f1a1df636d49d2b3e137664b","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.1.6.tgz"}},"0.2.1beta":{"name":"appzone","version":"0.2.1beta","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.2.1beta","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b795d67bfe8696f8fa04a9989b26968352379df2","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.1beta.tgz"}},"0.2.2beta":{"name":"appzone","version":"0.2.2beta","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_id":"appzone@0.2.2beta","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4e6def8cf16be6d377e6bb47552f3201655a5b06","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.2beta.tgz"}},"0.2.3":{"name":"appzone","version":"0.2.3","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0","qbox":">= 0.1.3"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_npmJsonOpts":{"file":"/home/arunoda/.npm/appzone/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"appzone@0.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"454721ae5237d0d2c772530cdf3a944030909b87","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.3.tgz"},"scripts":{},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}]},"0.2.4":{"name":"appzone","version":"0.2.4","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0","qbox":">= 0.1.3"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_npmJsonOpts":{"file":"/home/arunoda/.npm/appzone/0.2.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"appzone@0.2.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9f9f393ad8a24e51e96493f0750a8642069e2b97","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.4.tgz"},"scripts":{},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}]},"0.2.5":{"name":"appzone","version":"0.2.5","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","xml2js-expat":">= 0.2.0","qbox":">= 0.1.3"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_npmUser":{"name":"arunoda","email":"arunoda.susiripala@gmail.com"},"_id":"appzone@0.2.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bb682f3993aad1fdb021fbc5546438603bfb45da","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.5.tgz"},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}]},"0.2.6":{"name":"appzone","version":"0.2.6","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","ltx":">= 0.1.2","qbox":">= 0.1.3"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_npmUser":{"name":"arunoda","email":"arunoda.susiripala@gmail.com"},"_id":"appzone@0.2.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a5c8819f9673d459fd1586eef89ce2952c1a6cf7","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.6.tgz"},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}]},"0.2.7":{"name":"appzone","version":"0.2.7","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","ltx":">= 0.1.2","qbox":">= 0.1.3"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_npmUser":{"name":"arunoda","email":"arunoda.susiripala@gmail.com"},"_id":"appzone@0.2.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a11ed04ca7ef4397b533807c3c0b8d63aeda3646","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.7.tgz"},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}]},"0.2.8":{"name":"appzone","version":"0.2.8","directories":{"lib":"./lib"},"main":"./lib/appzone","description":"Appzone NodeJS Client","author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"homepage":"https://github.com/arunoda/Appzone-NodeJS","licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"dependencies":{"connect":">= 1.3.0","restler":">= 0.2.1","ltx":">= 0.1.2","qbox":">= 0.1.3"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_npmUser":{"name":"arunoda","email":"arunoda.susiripala@gmail.com"},"_id":"appzone@0.2.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9f143ea9a88df26ab3c005da2f17e50e230477ab","tarball":"http://registry.npmjs.org/appzone/-/appzone-0.2.8.tgz"},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}]}},"maintainers":[{"name":"arunoda","email":"arunoda.susiripala@gmail.com"}],"time":{"modified":"2012-01-06T12:01:03.410Z","created":"2011-04-01T01:01:50.686Z","0.1.0beta":"2011-04-01T01:01:52.545Z","0.1.1beta":"2011-04-07T03:51:46.984Z","0.1.2":"2011-04-11T12:12:32.782Z","0.1.3":"2011-04-11T15:00:49.731Z","0.1.4":"2011-04-12T16:28:01.358Z","0.1.5":"2011-04-12T21:04:42.012Z","0.1.6":"2011-04-14T15:50:13.068Z","0.2.1beta":"2011-05-17T23:15:38.540Z","0.2.2beta":"2011-05-31T21:09:56.134Z","0.2.3":"2011-08-30T03:54:42.348Z","0.2.4":"2011-10-07T18:13:00.227Z","0.2.5":"2011-12-19T14:19:22.862Z","0.2.6":"2011-12-30T17:04:57.441Z","0.2.7":"2011-12-30T17:13:01.246Z","0.2.8":"2012-01-06T12:01:03.410Z"},"author":{"name":"Arunoda Susiripala","email":"arunoda.susiripala@gmail.com"},"repository":{"type":"git","url":"git@github.com:arunoda/Appzone-NodeJS.git"},"_attachments":{"appzone-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-UTO+nsdtKlS8vwNeTXgP8w==","length":12646,"stub":true},"appzone-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-YotvNAlU8xOm98bAlQpxfw==","length":23686,"stub":true},"appzone-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-WOqqw868FeHDOPIHIdR3zw==","length":23685,"stub":true},"appzone-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-VqF7z3397XeTe8ms4YA3AQ==","length":24495,"stub":true},"appzone-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-xc2i2qyhSkMjna4UNKDs9g==","length":25926,"stub":true},"appzone-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-WfryPq9C/2xf/7LJJwUpOg==","length":25914,"stub":true},"appzone-0.2.2beta.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-j0BElv8If2sIwdCoYhseRg==","length":26027,"stub":true},"appzone-0.2.1beta.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-odg4g4ckHEco2pMXng7r4g==","length":17285,"stub":true},"appzone-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-t2PHxr/QUpsAkOTSIIIXOQ==","length":3159,"stub":true},"appzone-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-teQuwdvu2naI9SQpo9ropw==","length":3143,"stub":true},"appzone-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9GzdcLIGxZ6kImdRaq8a2g==","length":2879,"stub":true},"appzone-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6t7cgkZ6MLXiBdLec0QZ/g==","length":2879,"stub":true},"appzone-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7ZZUbRfaiDLYna97ZR3CJw==","length":2881,"stub":true},"appzone-0.1.1beta.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-assj40QHOqwe3BW6fvz8vQ==","length":2931,"stub":true},"appzone-0.1.0beta.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VUne9i6mmT3v4hPra4oUJg==","length":2521,"stub":true}}}},
{"id":"apres","key":"apres","value":{"rev":"3-f18222e07f86c0ffa5ff37f095760d7d"},"doc":{"_id":"apres","_rev":"3-f18222e07f86c0ffa5ff37f095760d7d","name":"apres","description":"Embarrassingly Client-Side Web Apps.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"apres","version":"0.0.1","description":"Embarrassingly Client-Side Web Apps.","author":{"name":"Casey Duncan","email":"apres.project@gmail.com"},"contributors":[{"name":"Niall O'Higgins"}],"repository":{"type":"git","url":"git://github.com/apres/apres.github.com.git"},"license":"MIT","keywords":["RAD","MVC","browser"],"dependencies":{"node-static":"0.5.x","express":"2.5.x","request":"2.9.x"},"devDependencies":{"requirejs":"1.0.x","jquery":"1.7.x","mocha":"1.1.x","chai":"1.0.x","node-inspector":"0.1.x"},"scripts":{"dtest":"./node_modules/.bin/mocha --reporter tap --ui qunit --debug-brk","test":"./node_modules/.bin/mocha --reporter tap --ui qunit","start":"node server.js"},"_npmUser":{"name":"caseman","email":"casey.duncan@gmail.com"},"_id":"apres@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"85e6f59cc50dfe1be401c3bbb6a53568fd9e38d5","tarball":"http://registry.npmjs.org/apres/-/apres-0.0.1.tgz"},"maintainers":[{"name":"caseman","email":"casey.duncan@gmail.com"}]}},"readme":"# Apres #\n\n_Embarrassingly Client-Side Web Apps._\n\nApres is an integrated suite of tools for building web applications that can run entirely in your browser. Its modular design allows you to build your application brick-by-brick, and also allows you complete freedom to customize the components or invent your own from scratch.\n\nApres has a compact core that provides a foundation for modular web development with a focus on declarative programming for common tasks. However, it hides none of the full power that the underlying browser environment provides. Instead, Apres provides leverage to make it possible to build complex systems from simple parts.\n\n## Client-side web development should be fun, really. ##\n\nDevelopment should be about solving your problems, and building your app. Often times this can seem secondary to a myriad of other obstacles and distractions. Apres aims to bring the focus back where it belongs.\n\n## The batteries should not only be included, but fully charged and ready for use. ##\n\nThere are an astounding number of excellent open-source tools that you could leverage to make your app great. But finding and integrating all of these pieces is a major undertaking. Apres comes loaded with an assortment of modules ready for you to use right away, and more are being added all the time.\n\n## If you don't need it, it shouldn't be in your way. ##\n\nHaving such an assortment of functionality is a burden if you have to worry about it even if your app doesn't use it. You don't want to be weighed down by things you don't need. Apres' modular approach means that you only pay for what you eat, and you can learn as you go.\n\n## Modularity matters. ##\n\nA global namespace is no place to build a modern app. Coupled with asynchronous script loading, and manual dependency management the standard browser runtime is no paradise for complex applications made of many interdependent parts. Apres leverages the powerful, and popular requirejs AMD module loader to create a firm foundation for modular apps. Apres provides AMD-compliant versions of many popular libraries. Requirejs can also automatically adapt many non-AMD modules for use with Apres.\n\n## Use standards. ##\n\nThere's no lack of ways to do things in software development. Leveraging existing standards means there are less things to develop, debug, document, and learn about.\n\n- Apres views are html5 pages, with dynamic functionality declared in html data attributes.\n- Apres works with any standard web server, static, or dynamic. It plugs easily into node.js via an included express middleware adapter. Middleware for other popular application servers are planned.\nApres uses standard AMD javascript modules.\n- Apres prefers composition over inheritance for application code. This means less dependence and tight coupling between your code and Apres since you can use plain objects.\n\n## License ##\n\nApres is released under the MIT license.\n\n## Site ##\n\nhttp://apres.github.com/\n\n","maintainers":[{"name":"caseman","email":"casey.duncan@gmail.com"}],"time":{"modified":"2012-06-23T16:38:19.197Z","created":"2012-06-23T16:38:13.664Z","0.0.1":"2012-06-23T16:38:19.197Z"},"author":{"name":"Casey Duncan","email":"apres.project@gmail.com"},"repository":{"type":"git","url":"git://github.com/apres/apres.github.com.git"},"_attachments":{"apres-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qHKd2VdkvjdODMcTQAbG3Q==","length":565075,"stub":true}}}},
{"id":"apricot","key":"apricot","value":{"rev":"16-a1448514ee045b707a8ad8714b722de1"},"doc":{"_id":"apricot","_rev":"16-a1448514ee045b707a8ad8714b722de1","name":"apricot","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"apricot","version":"0.0.1","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"Rob Ellis","email":"rob@silentrob.me","web":"http://silentrob.me"}],"bugs":{"mail":"rob@silentrob.me","web":"http://github.com/silentrob/Apricot/issues"},"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":">= 0.0.1"},"os":["linux","macos","win"],"cpu":["x86","ppc","x86_64"],"engines":["node"],"directories":{"lib":"lib"},"main":"./lib/apricot","_id":"apricot@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/apricot/-/apricot-0.0.1.tgz"}},"0.0.2":{"name":"apricot","version":"0.0.2","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"Rob Ellis","email":"rob@silentrob.me","web":"http://silentrob.me"}],"bugs":{"mail":"rob@silentrob.me","web":"http://github.com/silentrob/Apricot/issues"},"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":">= 0.0.1"},"os":["linux","macos","win"],"cpu":["x86","ppc","x86_64"],"engines":["node"],"scripts":{"postinstall":"./scripts/fetch_htmlparser"},"directories":{"lib":"lib"},"main":"./lib/apricot","_id":"apricot@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/apricot/-/apricot-0.0.2.tgz"}},"0.0.4":{"name":"apricot","version":"0.0.4","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"Rob Ellis","email":"rob@silentrob.me","web":"http://silentrob.me"}],"bugs":{"mail":"rob@silentrob.me","web":"http://github.com/silentrob/Apricot/issues"},"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":"= 0.1.2","htmlparser":"= 1.6.2"},"os":["linux","macos","win"],"cpu":["x86","ppc","x86_64"],"engines":["node"],"directories":{"lib":"lib"},"main":"./lib/apricot","_id":"apricot@0.0.4","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/apricot/-/apricot-0.0.4.tgz"}},"0.0.4-1-patched-by-isaacs-for-path-issue":{"name":"apricot","version":"0.0.4-1-patched-by-isaacs-for-path-issue","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"Rob Ellis","email":"rob@silentrob.me","url":"http://silentrob.me"}],"bugs":{"email":"rob@silentrob.me","url":"http://github.com/silentrob/Apricot/issues"},"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":"= 0.1.2","htmlparser":"= 1.6.2"},"os":["linux","macos","win"],"cpu":["x86","ppc","x86_64"],"engines":["node"],"directories":{"lib":"lib"},"main":"./lib/apricot","_npmJsonOpts":{"file":"/Users/isaacs/.npm/apricot/0.0.4-1-patched-by-isaacs-for-path-issue/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apricot@0.0.4-1-patched-by-isaacs-for-path-issue","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"2913b22e2cbfe1dc48904fee772f49fe7137d2c6","tarball":"http://registry.npmjs.org/apricot/-/apricot-0.0.4-1-patched-by-isaacs-for-path-issue.tgz"},"scripts":{}},"0.0.5":{"name":"apricot","version":"0.0.5","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"Rob Ellis","email":"rob@silentrob.me","url":"http://silentrob.me"}],"bugs":{"email":"rob@silentrob.me","url":"http://github.com/silentrob/Apricot/issues"},"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":"= 0.1.2","htmlparser":"= 1.6.2"},"os":["linux","macos","win"],"cpu":["x86","ppc","x86_64"],"engines":["node"],"directories":{"lib":"lib"},"main":"./lib/apricot","_npmJsonOpts":{"file":"/Users/ironman/.npm/apricot/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"apricot@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"ca2a964f93f47e25ebafb6d3d5a6b95cb9a0cac6","tarball":"http://registry.npmjs.org/apricot/-/apricot-0.0.5.tgz"},"scripts":{}},"0.0.6":{"name":"apricot","version":"0.0.6","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"silentrob","email":"rob@silentrob.me"}],"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":"> 0.2","node-sizzle":"*"},"os":["linux","macos","darwin","win"],"cpu":["x86","ppc","x86_64","x64"],"engines":["node"],"directories":{"lib":"lib"},"main":"./lib/apricot","_npmUser":{"name":"silentrob","email":"rob@silentrob.me"},"_id":"apricot@0.0.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"21ea903f197aa7fb1ede0c8eb5301a0bb47e8ebc","tarball":"http://registry.npmjs.org/apricot/-/apricot-0.0.6.tgz"},"readme":"Apricot\n===\n\nApricot is a HTML / DOM parser, scraper for Nodejs.\nIt is inspired by [rubys hpricot](http://github.com/whymirror/hpricot) and designed to fetch, iterate, and augment html or html fragments.\n\n\nInstall\n---\n\n    npm install apricot\n\n    \nGetting Started\n---\n    Apricot.parse(\"<p id='test'>An HTML Fragment</p>\", function(err, doc) {\n      // Do something awesome here..\n    });\n    \n    // OR Open a remote website, or local file\n    \n    Apricot.open(\"http://my_awesome_website.com\", function(err, doc) {\n      // Do something awesome here..\n    });    \n\n    // Experimental Live Code, third param.\n    // Live mode will evaluate all javascript in the context of the page.\n    \n    Apricot.open( file, callback, live_mode)\n    Apricot.open(\"http://my_awesome_website.com\", function(doc) {\n      // Do something awesome here..\n    },true);\n\nPacked with Awesomeness (API)\n---\n\nParse and Open both return a Apricot Object, a HTML DOM, created by JSDOM, with all the power of the [Sizzle Selector Engine](http://wiki.github.com/jeresig/sizzle/), and [XUI Framework](http://github.com/silentrob/xui) for Augmentation.\n\n    Apricot.parse(\"<p id='test'>An HTML Fragment</p>\", function(doc) {\n      doc.find(\"selector\");     // Populates internal collection, See Sizzle selector syntax (rules)\n      doc.each(callback);       // Itterates over the collection, applying a callback to each match (element)\n      doc.remove();             // Removes all elements in the internal collection (See XUI Syntax)\n    \n      doc.inner(\"fragment\");    // See XUI Syntax\n      doc.outer(\"fragment\");    // See XUI Syntax    \n      doc.top(\"fragment\");      // See XUI Syntax\n      doc.bottom(\"fragment\");   // See XUI Syntax\n      doc.before(\"fragment\");   // See XUI Syntax\n      doc.after(\"fragment\");    // See XUI Syntax\n      doc.hasClass(\"class\");    // See XUI Syntax      \n      doc.addClass(\"class\");    // See XUI Syntax            \n      doc.removeClass(\"class\"); // See XUI Syntax            \n      \n      doc.toHTML;               // Returns the HTML\n      doc.innerHTML;            // Returns the innerHTML of the body.\n      doc.toDOM;                // Returns the DOM representation\n      \n      // Most methods are chainable, so this works\n      doc.find(\"selector\").addClass('foo').after(\", just because\");\n      \n    });\n    \n\nProblems?\n---\nApricot requires [JSDom](http://github.com/tmpvar/jsdom) and [htmlparser](http://github.com/tautologistics/node-htmlparser), these should be brought in via npm when you install apricot, but if you have problems\n\n    $ npm install jsdom\n    $ npm install htmlparser    \n\nContributors\n---\n* alexkappa \n* lancefisher\n* brog45\n* vrutberg \n* chandlerkent\n* jamesaduncan\n\nTODO \n---\n* Cleanup Code, hide privates, etc.\n* Tests\n\nLICENSE (MIT)\n---\n\n_Copyright (c) 2010 Rob Ellis_\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"}},"maintainers":[{"name":"silentrob","email":"rob@silentrob.me"}],"time":{"modified":"2012-05-11T03:42:42.467Z","created":"2011-06-24T16:23:22.690Z","0.0.1":"2011-06-24T16:23:22.690Z","0.0.2":"2011-06-24T16:23:22.690Z","0.0.4":"2011-06-24T16:23:22.690Z","0.0.4-1-patched-by-isaacs-for-path-issue":"2011-06-24T16:23:22.690Z","0.0.5":"2011-06-24T20:25:48.040Z","0.0.6":"2012-05-11T03:42:42.467Z"},"_attachments":{"apricot-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-MzPBENkuI4yMvyECBN5zDg==","length":14219,"stub":true},"apricot-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-zBOv+xbAxHidamw2UF8umg==","length":13890,"stub":true},"apricot-0.0.4-1-patched-by-isaacs-for-path-issue.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-tSZ+fowpKigoOn/HK7kAZw==","length":13455,"stub":true},"apricot-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-T5oP73j7g/nP4Vmwi5b1uw==","length":14099,"stub":true},"apricot-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4/Q49Ohh5FzxQ/MWPpjKhA==","length":13611,"stub":true},"apricot-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TVq9meEXcmmwKzj3kvtmXg==","length":13393,"stub":true}}}},
{"id":"apricot64","key":"apricot64","value":{"rev":"3-68ea4dee825b9dcc2153e74bb9f111af"},"doc":{"_id":"apricot64","_rev":"3-68ea4dee825b9dcc2153e74bb9f111af","name":"apricot64","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.5":{"name":"apricot64","version":"0.0.5","description":"Apricot is a HTML / DOM parser, scraper for Nodejs. It is inspired by rubys hpricot and designed to fetch, iterate, and augment html or html fragments.","keywords":["dom","javascript","xui"],"maintainers":[{"name":"diorahman","email":"diorahman@gmail.com"}],"bugs":{"email":"rob@silentrob.me","url":"http://github.com/silentrob/Apricot/issues"},"licenses":[{"type":"MIT","url":"http://github.com/silentrob/Apricot/blob/master/LICENSE.txt"}],"repositories":[{"type":"git","url":"http://github.com/silentrob/Apricot.git"}],"dependencies":{"jsdom":"= 0.1.2","htmlparser":"= 1.6.2"},"os":["linux","macos","win"],"cpu":["x86","ppc","x86_64","x64"],"engines":["node"],"directories":{"lib":"lib"},"main":"./lib/apricot","_npmUser":{"name":"diorahman","email":"diorahman@gmail.com"},"_id":"apricot64@0.0.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"3dfc252ff8bce2b7ae39fc409d1f9bf536057574","tarball":"http://registry.npmjs.org/apricot64/-/apricot64-0.0.5.tgz"}}},"readme":"Apricot\n===\n\nApricot is a HTML / DOM parser, scraper for Nodejs.\nIt is inspired by [rubys hpricot](http://github.com/whymirror/hpricot) and designed to fetch, iterate, and augment html or html fragments.\n\n\nInstall\n---\n\n    npm install apricot\n\n    \nGetting Started\n---\n    Apricot.parse(\"<p id='test'>An HTML Fragment</p>\", function(err, doc) {\n      // Do something awesome here..\n    });\n    \n    // OR Open a remote website, or local file\n    \n    Apricot.open(\"http://my_awesome_website.com\", function(err, doc) {\n      // Do something awesome here..\n    });    \n\n    // Expieremental Live Code, third param.\n    // Live mode will evaluate all javascript in the context of the page.\n    \n    Apricot.open( file, callback, live_mode)\n    Apricot.open(\"http://my_awesome_website.com\", function(doc) {\n      // Do something awesome here..\n    },true);\n\nPacked with Awesomeness (API)\n---\n\nParse and Open both return a Apricot Object, a HTML DOM, created by JSDOM, with all the power of the [Sizzle Selector Engine](http://wiki.github.com/jeresig/sizzle/), and [XUI Framework](http://github.com/silentrob/xui) for Augmentation.\n\n    Apricot.parse(\"<p id='test'>An HTML Fragment</p>\", function(doc) {\n      doc.find(\"selector\");     // Populates internal collection, See Sizzle selector syntax (rules)\n      doc.each(callback);       // Itterates over the collection, applying a callback to each match (element)\n      doc.remove();             // Removes all elements in the internal collection (See XUI Syntax)\n    \n      doc.inner(\"fragment\");    // See XUI Syntax\n      doc.outer(\"fragment\");    // See XUI Syntax    \n      doc.top(\"fragment\");      // See XUI Syntax\n      doc.bottom(\"fragment\");   // See XUI Syntax\n      doc.before(\"fragment\");   // See XUI Syntax\n      doc.after(\"fragment\");    // See XUI Syntax\n      doc.hasClass(\"class\");    // See XUI Syntax      \n      doc.addClass(\"class\");    // See XUI Syntax            \n      doc.removeClass(\"class\"); // See XUI Syntax            \n      \n      doc.toHTML;               // Returns the HTML\n      doc.innerHTML;            // Returns the innerHTML of the body.\n      doc.toDOM;                // Returns the DOM representation\n      \n      // Most methods are chainable, so this works\n      doc.find(\"selector\").addClass('foo').after(\", just because\");\n      \n    });\n    \n\nProblems?\n---\nApricot requires [JSDom](http://github.com/tmpvar/jsdom) and [htmlparser](http://github.com/tautologistics/node-htmlparser), these should be brought in via npm when you install apricot, but if you have problems\n\n    $ npm install jsdom\n    $ npm install htmlparser    \n\n\nTODO \n---\n* Cleanup Code, hide privates, etc.\n* Tests\n\nLICENSE (MIT)\n---\n\n_Copyright (c) 2010 Rob Ellis_\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"diorahman","email":"diorahman@gmail.com"}],"time":{"modified":"2012-03-16T04:26:16.415Z","created":"2012-03-16T04:26:08.008Z","0.0.5":"2012-03-16T04:26:16.415Z"},"_attachments":{"apricot64-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OZeLGJ/PrTzxOC1uEq9udQ==","length":14072,"stub":true}}}},
{"id":"apw","key":"apw","value":{"rev":"22-a1cabf3dc1bcf613752cff841dae9326"},"doc":{"_id":"apw","_rev":"22-a1cabf3dc1bcf613752cff841dae9326","name":"apw","dist-tags":{"latest":"0.3.5"},"versions":{"0.1.0":{"name":"apw","version":"0.1.0","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/core","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"qq":"0.3.x","coa":"0.3.x","inherit":"1","vows":"0.6.x"},"devDependencies":{},"optionalDependencies":{},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"afelix","email":"skryzhanovsky@gmail.com"},"_id":"apw@0.1.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"7704c0136194abb72d4d6ae0081b2560faaf9e72","tarball":"http://registry.npmjs.org/apw/-/apw-0.1.0.tgz"}},"0.2.0":{"name":"apw","version":"0.2.0","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"qq":"0.3.x","coa":"0.3.x","inherit":"1","vows":"0.6.x"},"devDependencies":{},"optionalDependencies":{},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.2.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"c1113937ff791b96dccfef6daacb7fba9f0f0302","tarball":"http://registry.npmjs.org/apw/-/apw-0.2.0.tgz"}},"0.2.1":{"name":"apw","version":"0.2.1","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"qq":"0.3.x","coa":"0.3.x","inherit":"1","vows":"0.6.x"},"devDependencies":{},"optionalDependencies":{},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.2.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"aabf3f2b2e68f7acacb19f78f530bcafbac0034b","tarball":"http://registry.npmjs.org/apw/-/apw-0.2.1.tgz"}},"0.3.0":{"name":"apw","version":"0.3.0","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"qq":"0.3.x","coa":"0.3.x","inherit":"1","vows":"0.6.x"},"devDependencies":{},"optionalDependencies":{},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.3.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"42785e6e7c64990eb6b6b791418594a081c47436","tarball":"http://registry.npmjs.org/apw/-/apw-0.3.0.tgz"}},"0.3.1":{"name":"apw","version":"0.3.1","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"qq":"0.3.x","coa":"0.3.x","inherit":"1","vows":"0.6.x"},"devDependencies":{},"optionalDependencies":{},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.3.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8ab611c653fbe7b3187f673b5c1eba90c9237273","tarball":"http://registry.npmjs.org/apw/-/apw-0.3.1.tgz"}},"0.3.2":{"name":"apw","version":"0.3.2","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"q":"~0.8.5","coa":"0.3.x","inherit":"1"},"devDependencies":{"mocha":"1.0.x","visionmedia-jscoverage":"*"},"optionalDependencies":{},"scripts":{"test":"make test","test-cover":"make test-cover"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.3.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6f0b171dd4d9834e5d1a91f061fbbb244aa3fa9f","tarball":"http://registry.npmjs.org/apw/-/apw-0.3.2.tgz"}},"0.3.3":{"name":"apw","version":"0.3.3","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"q":"~0.8.5","coa":"0.3.x","inherit":"1"},"devDependencies":{"mocha":"1.0.x","visionmedia-jscoverage":"*"},"optionalDependencies":{},"scripts":{"test":"make test","test-cover":"make test-cover"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.3.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"033d428dac7d637a1db7fdcba04d5e68c2ef56ae","tarball":"http://registry.npmjs.org/apw/-/apw-0.3.3.tgz"}},"0.3.4":{"name":"apw","version":"0.3.4","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"q":"~0.8.5","coa":"0.3.x","inherit":"1"},"devDependencies":{"mocha":"1.0.x","visionmedia-jscoverage":"*"},"optionalDependencies":{},"scripts":{"test":"make test","test-cover":"make test-cover"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"apw@0.3.4","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d9f647e0bf0581c97dc77bcac0406e181cec16fc","tarball":"http://registry.npmjs.org/apw/-/apw-0.3.4.tgz"}},"0.3.5":{"name":"apw","version":"0.3.5","homepage":"http://github.com/bem/apw","author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"bugs":{"url":"http://github.com/bem/apw/issues"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"main":"./lib/apw","bin":{"apw":"./bin/apw"},"engines":{"node":"0.6 | 0.7"},"dependencies":{"q":"~0.8.5","coa":"0.3.x","inherit":"1"},"devDependencies":{"mocha":"1.0.x","visionmedia-jscoverage":"*"},"optionalDependencies":{},"scripts":{"test":"make test","test-cover":"make test-cover"},"readme":"APW (Arch-Plans-Workers) [![Build Status](https://secure.travis-ci.org/bem/apw.png?branch=master)](http://travis-ci.org/bem/apw)\n========================\n\nSee [russian](/bem/apw/blob/master/README.ru.md) docs for now.\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n","_id":"apw@0.3.5","description":"APW (Arch-Plans-Workers) [![Build Status](https://secure.travis-ci.org/bem/apw.png?branch=master)](http://travis-ci.org/bem/apw) ========================","dist":{"shasum":"fd0bb3aa00cdcf1138d1718f1119967ddfa2d56b","tarball":"http://registry.npmjs.org/apw/-/apw-0.3.5.tgz"}}},"readme":"APW (Arch-Plans-Workers)\n========================\n\nSee [russian](/bem/apw/blob/master/README.ru.md) docs for now.\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n","maintainers":[{"name":"afelix","email":"skryzhanovsky@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"time":{"modified":"2012-08-02T13:44:17.577Z","created":"2012-03-23T08:53:24.511Z","0.1.0":"2012-03-23T08:53:26.836Z","0.2.0":"2012-05-05T07:19:49.594Z","0.2.1":"2012-05-16T08:33:34.587Z","0.3.0":"2012-05-16T08:34:42.539Z","0.3.1":"2012-05-17T19:44:37.522Z","0.3.2":"2012-05-25T12:34:21.544Z","0.3.3":"2012-06-06T14:11:57.283Z","0.3.4":"2012-06-13T14:51:12.123Z","0.3.5":"2012-07-26T09:20:05.469Z"},"author":{"name":"Sergey Kryzhanovsky","email":"skryzhanovsky@ya.ru","url":"http://github.com/afelix"},"repository":{"type":"git","url":"git://github.com/bem/apw.git"},"description":"APW (Arch-Plans-Workers) [![Build Status](https://secure.travis-ci.org/bem/apw.png?branch=master)](http://travis-ci.org/bem/apw) ========================","users":{"fgribreau":true},"_attachments":{"apw-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-mORH+XOhXfUlqrBbCniSxg==","length":19695,"stub":true},"apw-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-AuoO63WzL/D54uzla7YexA==","length":21776,"stub":true},"apw-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-BIQBBQ+1+IdMsdIl8ObH8Q==","length":21413,"stub":true},"apw-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Ab+Ill+fJPaMnjkISQwsvg==","length":21444,"stub":true},"apw-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-sJk0oMGqnqzIoS4v19Hjeg==","length":21189,"stub":true},"apw-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-7lyNSPiPY9cA4Qz4fcl8MA==","length":19446,"stub":true},"apw-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-u5x6cOQoxiWu+oAjsS7Zgg==","length":19458,"stub":true},"apw-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-jXR6CDbXcBM6HqtuVwCFOg==","length":18627,"stub":true},"apw-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sjbwHLccOu/RSSHt3iSCUw==","length":49501,"stub":true}}}},
{"id":"aq","key":"aq","value":{"rev":"13-9d11406483918136e9aea61da08b2838"},"doc":{"_id":"aq","_rev":"13-9d11406483918136e9aea61da08b2838","name":"aq","description":"App which automates QUnit tests","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"aq","version":"0.0.1","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"MIT","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"aq@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"c5bd301d920000a78c5f9e985e939e6703718d19","tarball":"http://registry.npmjs.org/aq/-/aq-0.0.1.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]},"0.0.2":{"name":"aq","version":"0.0.2","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"MIT","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"aq@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"f34f5f116e4bfdb29ef333e5486b799386803730","tarball":"http://registry.npmjs.org/aq/-/aq-0.0.2.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]},"0.0.3":{"name":"aq","version":"0.0.3","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"MIT","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"aq@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"7874ca1371939bd11fc615778c213cbf75c95b41","tarball":"http://registry.npmjs.org/aq/-/aq-0.0.3.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]},"0.0.4":{"name":"aq","version":"0.0.4","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"Apache License, Version 2.0","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"aq@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"5f85cd221a9b7c0d9b38edfbb2094731dfdb1cc8","tarball":"http://registry.npmjs.org/aq/-/aq-0.0.4.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]},"0.0.5":{"name":"aq","version":"0.0.5","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":">= 0.3.1"},"main":"index","license":"Apache License, Version 2.0","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"aq@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"3295f260e56420f61898433a3a6da79738a2ff97","tarball":"http://registry.npmjs.org/aq/-/aq-0.0.5.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]},"0.0.6":{"name":"aq","version":"0.0.6","description":"App which automates QUnit tests","author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"dependencies":{"socket.io":">= 0.9.0","optimist":"0.3.1"},"main":"index","license":"Apache License, Version 2.0","_npmUser":{"name":"krisk","email":"kirollos@gmail.com"},"_id":"aq@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"33bf3f8c325f059bef8729be1afb2df2a10e7cc1","tarball":"http://registry.npmjs.org/aq/-/aq-0.0.6.tgz"},"maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}]}},"readme":"Automate QUnit tests","maintainers":[{"name":"krisk","email":"kirollos@gmail.com"}],"time":{"modified":"2012-05-13T00:48:15.879Z","created":"2012-04-26T03:22:02.852Z","0.0.1":"2012-04-26T03:22:04.439Z","0.0.2":"2012-04-26T05:41:32.476Z","0.0.3":"2012-04-26T16:50:16.234Z","0.0.4":"2012-04-27T18:28:09.680Z","0.0.5":"2012-04-29T18:56:59.811Z","0.0.6":"2012-05-13T00:48:15.879Z"},"author":{"name":"Kirollos Risk","email":"kirollos@gmail.com"},"repository":{"type":"git","url":"git://github.com/krisk/aq.git"},"_attachments":{"aq-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-14yf94nELiTzE1WkdGo4bg==","length":10240,"stub":true},"aq-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-5uqFTCS+zTScPlS06iOWIQ==","length":10240,"stub":true},"aq-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-D17G/ZoHjzvypmiXcZVndw==","length":10240,"stub":true},"aq-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qtv41uXupVvsfOw7UgPK3g==","length":10240,"stub":true},"aq-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SM3kbCw/u/teYhBUACj60g==","length":10240,"stub":true},"aq-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WXp+i34PWBRJ4vDxYLs7ZA==","length":10240,"stub":true}}}},
{"id":"aql","key":"aql","value":{"rev":"9-666ad612944be831dfe4448f47cf4471"},"doc":{"_id":"aql","_rev":"9-666ad612944be831dfe4448f47cf4471","name":"aql","description":"A wrapper around AQL's APIs (SMS/Fax/VoIP)","dist-tags":{"latest":"0.0.3-alpha"},"versions":{"0.0.1":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"www.dan-jenkins.co.uk"},"name":"aql","description":"A wrapper around AQL's APIs (SMS/Fax/VoIP)","version":"0.0.1","homepage":"https://github.com/holidayextras/node-aql","repository":{"type":"git","url":"git://github.com/holidayextras/node-aql.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"aql@0.0.1","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"504c7f6d88b0b8b205d1011ee301d1a9912bf9fc","tarball":"http://registry.npmjs.org/aql/-/aql-0.0.1.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.2":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"www.dan-jenkins.co.uk"},"name":"aql","description":"A wrapper around AQL's APIs (SMS/Fax/VoIP)","version":"0.0.2","homepage":"https://github.com/holidayextras/node-aql","repository":{"type":"git","url":"git://github.com/holidayextras/node-aql.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"aql@0.0.2","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"1af823b723756af51b1a7fb11311ed59d3188aa8","tarball":"http://registry.npmjs.org/aql/-/aql-0.0.2.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.3":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"www.dan-jenkins.co.uk"},"name":"aql","description":"A wrapper around AQL's APIs (SMS/Fax/VoIP)","version":"0.0.3","homepage":"https://github.com/holidayextras/node-aql","repository":{"type":"git","url":"git://github.com/holidayextras/node-aql.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"aql@0.0.3","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"5882de81a8b52f260fdd9361a740fbd203acbbf2","tarball":"http://registry.npmjs.org/aql/-/aql-0.0.3.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.3-alpha":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"www.dan-jenkins.co.uk"},"name":"aql","description":"A wrapper around AQL's APIs (SMS/Fax/VoIP)","version":"0.0.3-alpha","homepage":"https://github.com/holidayextras/node-aql","repository":{"type":"git","url":"git://github.com/holidayextras/node-aql.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"aql@0.0.3-alpha","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9be6b2b928d9213e7cfa5dc5a38b2b9a43945259","tarball":"http://registry.npmjs.org/aql/-/aql-0.0.3-alpha.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]}},"readme":"node-aql\n========\n\nAn interface into AQL's APIs\n\nA complete work in progress at the moment, I wouldn't look at using this one yet but hopefully within a week or so it will be in a better place.\n\nUnfortunately, I've had to publish this module to npm in order to fully develop it due to the delivery reports/inbound sms needing a publicly available host (in which case I need npm for easy development on dotcloud)","maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}],"time":{"modified":"2012-05-23T12:56:35.046Z","created":"2012-05-12T12:27:59.399Z","0.0.1":"2012-05-12T12:28:00.834Z","0.0.2":"2012-05-12T12:53:05.490Z","0.0.3":"2012-05-12T15:50:37.946Z","0.0.3-alpha":"2012-05-23T12:56:35.046Z"},"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"www.dan-jenkins.co.uk"},"repository":{"type":"git","url":"git://github.com/holidayextras/node-aql.git"},"_attachments":{"aql-0.0.3-alpha.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NG3oitTMbU7vj6BSuYHvXw==","length":2669,"stub":true},"aql-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZyGDUlTPMie7+McAwXMS/g==","length":2660,"stub":true},"aql-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wb4pFDQijpkJuP5zo65aZA==","length":2597,"stub":true},"aql-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-H/7xWPAN7di/5k1Ujf8zsg==","length":2598,"stub":true}}}},
{"id":"arango.client","key":"arango.client","value":{"rev":"5-5a7b4024e977a5e64fdd5429182cc3e2"},"doc":{"_id":"arango.client","_rev":"5-5a7b4024e977a5e64fdd5429182cc3e2","name":"arango.client","description":"ArangoDB node.js module","dist-tags":{"latest":"0.3.2"},"versions":{"0.3.1":{"name":"arango.client","version":"0.3.1","description":"ArangoDB node.js module","keywords":["arangodb","nosql"],"author":{"name":"Kaerus","email":"contact@kaerus.com","url":"http://kaerus.com"},"contributors":[{"name":"anders elo","email":"anders@kaerus.com"}],"dependencies":{},"devDependencies":{"mocha":"1.2.1","chai":"1.1.1","browserify":"~1.13.6"},"scripts":{"test":"make test"},"browserify":"browser/index.js","bugs":{"url":"https://github.com/kaerus/arango-client/issues"},"repository":{"type":"git","url":"git://github.com/kaerus/arango-client.git"},"main":"index.js","license":"MIT","readme":"arango-client\n=============\nArangoDB client node.js module\n\nExamples\n--------\n\n```javascript\nvar arango = require('arango.client'), util = require('util');\n \n/* Prepare a connection with 'test' as default collection */ \ndb = new arango.Connection(\"http://127.0.0.1/test\");\n\n/* Create the 'test' collection */\ndb.collection.create(function(err,ret){\n  console.log(\"error(%s): \", err, ret);\n});\n\n/* create a new document in 'test' collection */\ndb.document.create({a:'test',b:123,c:Date()},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* get a list of all documents in collection */\ndb.document.list(function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n \n/* create a new document and create a new collection on demand */\ndb.document.create(true,\"newcollection\",{a:\"test\"},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* create another document in the new collection */\ndb.document.create(\"newcollection\",{b:\"test\"},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* alternate style utilizing events */\ndb.document.list(\"newcollection\").on('result',function(result){\n  console.log(util.inspect(result));\n}).on('error',function(error){\n  console.log(\"error(%s):\", error.code, error.message);\n});\n\n/* simple query string */\ndb.query.exec(\"FOR u in test RETURN u\",function(err,ret){\n  console.log(\"err(%s):\", err, ret);\n});\n\n/* using the experimental query builder */\nquery = db.query.for('u').in('users')\n          .filter('u.contact.address.state == @state')\n          .collect('region = u.contact.region').into('group')\n          .sort('LENGTH(group) DESC').limit('0, 5')\n          .return('{\"region\": region, \"count\": LENGTH(group)}');\n\n/* show the query string */\nconsole.log(\"Arango query:\", query.string);\n                \n/* test the query */\nquery.test(function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n\n/* execute the query and set the variable 'state' */\nquery.exec({state: \"CA\"}, function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n\n/* nested queries embedded as functions(){} */\nquery = db.query.for('likes').in(function() {\n    this.for('u').in('users')\n    .filter('u.gender == @gender && @likes')\n    .from('u.likes').include(function() {\n      this.from('value').in('u.likes')\n      .filter('value != @likes')\n      .return('value');\n    });\n  }).collect('what = likes').into('group')\n  .sort('LENGTH(group) DESC')\n  .limit('0, 5')\n  .return('{\"what\": what, \"count\": LENGTH(group)}');\n\n\nquery.exec({gender:\"female\",likes:\"running\"},function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n```\n\n","_id":"arango.client@0.3.1","dist":{"shasum":"cfe45c6b378dcbf66184fbb97e9d086502345254","tarball":"http://registry.npmjs.org/arango.client/-/arango.client-0.3.1.tgz"},"_from":"git://github.com/kaerus/arango-client","maintainers":[{"name":"kaerus","email":"anders@kaerus.com"}]},"0.3.2":{"name":"arango.client","version":"0.3.2","description":"ArangoDB node.js module","keywords":["arangodb","nosql"],"author":{"name":"Kaerus","email":"contact@kaerus.com","url":"http://kaerus.com"},"contributors":[{"name":"anders elo","email":"anders@kaerus.com"}],"dependencies":{},"devDependencies":{"mocha":"1.2.1","chai":"1.1.1","browserify":"~1.13.6"},"scripts":{"test":"make test"},"browserify":"browser/index.js","bugs":{"url":"https://github.com/kaerus/arango-client/issues"},"repository":{"type":"git","url":"git://github.com/kaerus/arango-client.git"},"main":"index.js","license":"MIT","readme":"ArangoDB client\n===============\nA client for the ArangoDB nosql database.\n\nInstall\n-------\n```\nnpm install arango.client\n```\n\nTest\n----\n```\nnpm test\n```\n\nUsage\n-----\nEither as node.js module or from the browser (using browserify).\n\n\nCallbacks gets error, result (or message on error) and headers. \n```javascript\ndb.document.get(docid,function(err,ret,hdr){\n  console.log(\"headers:\", util.inspect(hdr));\n  if(err) console.log(\"err(%s):\", err, ret);\n  else console.log(\"result: \", util.inspect(ret));\n});\n```\nWhen using Events, on 'error' passes an error object with error.code and error.message\n```javascript\ndb.document.get(\"error\").on('error',function(error){\n  console.log(\"err(%s):\",error.code, error.message);\n});\n```\nOn 'result' event gets result data and headers (if needed).\n```javascript\ndb.document.list().on('result',function(result){\n  console.log(\"result:\", util.inspect(result));\n});\n```\nBy default the 'error' event is being logged to console.\nFor details regarding the ArangoDB interface check out lib/api/ \nand use the node console to experiment.\n```javascript\nnode\narango = require('arango.client')\n{ Connection: [Function] }\ndb = new arango.Connection\n```\n\nExamples\n--------\n```javascript\nvar arango = require('arango.client'), util = require('util');\n \n/* Prepare a connection with 'test' as default collection */ \ndb = new arango.Connection(\"http://127.0.0.1/test\");\n\n/* Create the 'test' collection */\ndb.collection.create(function(err,ret){\n  console.log(\"error(%s): \", err, ret);\n});\n\n/* create a new document in 'test' collection */\ndb.document.create({a:'test',b:123,c:Date()},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* get a list of all documents in collection */\ndb.document.list(function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n \n/* create a new document and create a new collection on demand */\ndb.document.create(true,\"newcollection\",{a:\"test\"},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* create another document in the new collection */\ndb.document.create(\"newcollection\",{b:\"test\"},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* alternate style utilizing events */\ndb.document.list(\"newcollection\").on('result',function(result){\n  console.log(util.inspect(result));\n}).on('error',function(error){\n  console.log(\"error(%s):\", error.code, error.message);\n});\n\n/* simple query string */\ndb.query.exec(\"FOR u in test RETURN u\",function(err,ret){\n  console.log(\"err(%s):\", err, ret);\n});\n\n/* using the experimental query builder */\nquery = db.query.for('u').in('users')\n          .filter('u.contact.address.state == @state')\n          .collect('region = u.contact.region').into('group')\n          .sort('LENGTH(group) DESC').limit('0, 5')\n          .return('{\"region\": region, \"count\": LENGTH(group)}');\n\n/* show the query string */\nconsole.log(\"Arango query:\", query.string);\n                \n/* test the query */\nquery.test(function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n\n/* execute the query and set the variable 'state' */\nquery.exec({state: \"CA\"}, function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n\n/* nested queries embedded as functions(){} */\nquery = db.query.for('likes').in(function() {\n    this.for('u').in('users')\n    .filter('u.gender == @gender && @likes')\n    .from('u.likes').include(function() {\n      this.from('value').in('u.likes')\n      .filter('value != @likes')\n      .return('value');\n    });\n  }).collect('what = likes').into('group')\n  .sort('LENGTH(group) DESC')\n  .limit('0, 5')\n  .return('{\"what\": what, \"count\": LENGTH(group)}');\n\n\nquery.exec({gender:\"female\",likes:\"running\"},function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n```\n\n","_id":"arango.client@0.3.2","dist":{"shasum":"587fd39d15fe2b87a73feb91a38ab59dedad7939","tarball":"http://registry.npmjs.org/arango.client/-/arango.client-0.3.2.tgz"},"_from":"git://github.com/kaerus/arango-client.git","maintainers":[{"name":"kaerus","email":"anders@kaerus.com"}]}},"readme":"arango-client\n=============\nArangoDB client node.js module\n\nExamples\n--------\n\n```javascript\nvar arango = require('arango.client'), util = require('util');\n \n/* Prepare a connection with 'test' as default collection */ \ndb = new arango.Connection(\"http://127.0.0.1/test\");\n\n/* Create the 'test' collection */\ndb.collection.create(function(err,ret){\n  console.log(\"error(%s): \", err, ret);\n});\n\n/* create a new document in 'test' collection */\ndb.document.create({a:'test',b:123,c:Date()},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* get a list of all documents in collection */\ndb.document.list(function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n \n/* create a new document and create a new collection on demand */\ndb.document.create(true,\"newcollection\",{a:\"test\"},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* create another document in the new collection */\ndb.document.create(\"newcollection\",{b:\"test\"},function(err,ret){\n  if(err) console.log(\"error(%s): \", err, ret);\n  else console.log(util.inspect(ret));\n});\n\n/* alternate style utilizing events */\ndb.document.list(\"newcollection\").on('result',function(result){\n  console.log(util.inspect(result));\n}).on('error',function(error){\n  console.log(\"error(%s):\", error.code, error.message);\n});\n\n/* simple query string */\ndb.query.exec(\"FOR u in test RETURN u\",function(err,ret){\n  console.log(\"err(%s):\", err, ret);\n});\n\n/* using the experimental query builder */\nquery = db.query.for('u').in('users')\n          .filter('u.contact.address.state == @state')\n          .collect('region = u.contact.region').into('group')\n          .sort('LENGTH(group) DESC').limit('0, 5')\n          .return('{\"region\": region, \"count\": LENGTH(group)}');\n\n/* show the query string */\nconsole.log(\"Arango query:\", query.string);\n                \n/* test the query */\nquery.test(function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n\n/* execute the query and set the variable 'state' */\nquery.exec({state: \"CA\"}, function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n\n/* nested queries embedded as functions(){} */\nquery = db.query.for('likes').in(function() {\n    this.for('u').in('users')\n    .filter('u.gender == @gender && @likes')\n    .from('u.likes').include(function() {\n      this.from('value').in('u.likes')\n      .filter('value != @likes')\n      .return('value');\n    });\n  }).collect('what = likes').into('group')\n  .sort('LENGTH(group) DESC')\n  .limit('0, 5')\n  .return('{\"what\": what, \"count\": LENGTH(group)}');\n\n\nquery.exec({gender:\"female\",likes:\"running\"},function(err,ret){\n  console.log(\"err(%s):\",err,ret);\n});\n```\n\n","maintainers":[{"name":"kaerus","email":"anders@kaerus.com"}],"time":{"modified":"2012-08-09T12:49:02.322Z","created":"2012-08-09T12:04:32.758Z","0.3.1":"2012-08-09T12:04:34.594Z","0.3.2":"2012-08-09T12:49:02.322Z"},"author":{"name":"Kaerus","email":"contact@kaerus.com","url":"http://kaerus.com"},"repository":{"type":"git","url":"git://github.com/kaerus/arango-client.git"},"_attachments":{"arango.client-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rUOrJeEa517RVciC5/dFRA==","length":11190,"stub":true},"arango.client-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XvAS2xg8yS0W2vyL3uPnGQ==","length":10701,"stub":true}}}},
{"id":"arbiter","key":"arbiter","value":{"rev":"5-f0b60ea307a90524e1245e13fddaee93"},"doc":{"_id":"arbiter","_rev":"5-f0b60ea307a90524e1245e13fddaee93","name":"arbiter","description":"Lightweight html5 history pushState library","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"arbiter","description":"Lightweight html5 history pushState library","version":"0.0.1","homepage":"https://github.com/iamdustan/arbiter","author":{"name":"Dustan Kasten","email":"dustan.kasten@gmail.com"},"keywords":["ender","history","pushState","html5"],"main":"./arbiter.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/iamdustan/arbiter.git"},"_npmUser":{"name":"iamdustan","email":"dustan@skookum.com"},"_id":"arbiter@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e91bcd4bb5875c4a055f99b420ef2a154b89f001","tarball":"http://registry.npmjs.org/arbiter/-/arbiter-0.0.1.tgz"},"maintainers":[{"name":"iamdustan","email":"dustan@skookum.com"}]},"0.0.2":{"name":"arbiter","description":"Lightweight html5 history pushState library","version":"0.0.2","homepage":"https://github.com/iamdustan/arbiter","author":{"name":"Dustan Kasten","email":"dustan.kasten@gmail.com"},"keywords":["ender","history","pushState","html5"],"main":"./arbiter.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/iamdustan/arbiter.git"},"_npmUser":{"name":"iamdustan","email":"dustan@skookum.com"},"_id":"arbiter@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"60df2256a1276eefb2281dd83394eb9601858edb","tarball":"http://registry.npmjs.org/arbiter/-/arbiter-0.0.2.tgz"},"maintainers":[{"name":"iamdustan","email":"dustan@skookum.com"}]}},"readme":"\n# be the arbiter of your history\nArbiter is a super-lightweight enhancement library for your html5 apps.\nThis isn’t a catch-all-own-the-world solution like History.js by\nbalupton\n\n## usage\nTo be used with ender and being dependent upon a dom utility, event,\nand ajax libs, it’s as simple as calling the $.change function with the\npath you’d like to load.\n\n```\n$('body').delegate('#slider a', 'click', function (e) {\n  e.stop()\n  $.change(this.href)\n})\n```\nCurrently only supports html get requests to your current origin with.\n\n## todo\n\n* Add callback methods (who doesn’t like custom animations on load?\n* Clean up code\n* Write tests\n* Test browsers\n* Eat a doughnut\n\n\n\n","maintainers":[{"name":"iamdustan","email":"dustan@skookum.com"}],"time":{"modified":"2012-03-09T22:14:31.881Z","created":"2012-03-02T17:53:57.557Z","0.0.1":"2012-03-02T17:53:58.655Z","0.0.2":"2012-03-09T22:14:31.881Z"},"author":{"name":"Dustan Kasten","email":"dustan.kasten@gmail.com"},"repository":{"type":"git","url":"git://github.com/iamdustan/arbiter.git"},"_attachments":{"arbiter-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wGmGCa++42epuWh2SqXQ6Q==","length":3579,"stub":true},"arbiter-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4LQZ/brxqqbAl1mRGtrhsg==","length":10240,"stub":true}}}},
{"id":"arc","key":"arc","value":{"rev":"4-ae5a4830af71a23ec6cb9419a278af56"},"doc":{"_id":"arc","_rev":"4-ae5a4830af71a23ec6cb9419a278af56","name":"arc","description":"draw great circle arcs","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"arc","description":"draw great circle arcs","url":"https://github.com/springmeyer/arc.js","keywords":["maps","spherical","globe","rhumb line","crow flies","great circle"],"contributors":[{"name":"Dane Springmeyer","email":"dane@dbsgeo.com"}],"version":"0.0.1","licenses":[{"type":"BSD"}],"main":"./index","engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"springmeyer","email":"dane@dbsgeo.com"},"_id":"arc@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"e4d0544d578384d165db6a888996a3b48e9f5087","tarball":"http://registry.npmjs.org/arc/-/arc-0.0.1.tgz"},"maintainers":[{"name":"springmeyer","email":"dane@dbsgeo.com"}]}},"readme":"# arc.js\n\nCalculate great circles routes.\n\nAlgorithms from http://williams.best.vwh.net/avform.htm#Intermediate\n\n\n# Installation\n\nFor NodeJS usage, install with npm:\n\n    npm install -g\n\n\n# Usage\n\nThe idea is you may have one or many start and end points.\n\nCreate Coordinate pairs from the longitude (x) and latitude (y) values\nof each place and pass these (and optionally a properties object), to the GreatCircle\nconstructor:\n \n    var arc = require('arc');\n    var start = new arc.Coord(-122, 48);\n    var end = new arc.Coord(-77, 39);\n    var gc = new arc.GreatCircle(start, end, {'name': 'Seattle to DC'});\n    var line = gc.Arc(6);\n\nThen `line` will be a raw sequence of the start and end coordinates plus an arc of\nintermediate coordinate pairs.\n\n    > line\n    { properties: { name: 'Seattle to DC' },\n      coords: \n       [ [ -122, 48.00000000000001 ],\n         [ -112.06161978373486, 47.7241672604096 ],\n         [ -102.38404317022653, 46.60813199882492 ],\n         [ -93.22718895342909, 44.716217302635705 ],\n         [ -84.74823988299501, 42.14415510795357 ],\n         [ -77, 38.99999999999999 ] ],\n      length: 6 }\n\n\nYou can then serialize to a GeoJSON geometry format:\n\n    > line.json();\n    { geometry: \n       { type: 'LineString',\n         coordinates: [ [Object], [Object], [Object], [Object], [Object], [Object] ] },\n      type: 'Feature',\n      properties: { name: 'Seattle to DC' } }\n    \nOr to WKT (Well known text):\n\n    > line.wkt();\n    'LINESTRING(-122 48.00000000000001,-112.06161978373486 47.7241672604096,-102.38404317022653 46.60813199882492,-93.22718895342909 44.716217302635705,-84.74823988299501 42.14415510795357,-77 38.99999999999999)'\n    \nIt is then up to you to add up these features to create fully fledged geodata. See the examples/ directory\nfor sample code to create a GeoJSON file from multiple routes.\n\n","maintainers":[{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"tmcw","email":"macwright@gmail.com"}],"time":{"modified":"2011-11-19T04:45:04.153Z","created":"2011-11-19T04:44:05.137Z","0.0.1":"2011-11-19T04:44:06.457Z"},"_attachments":{"arc-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7JRq2XOqaAfxoKkMuF/y3Q==","length":30720,"stub":true}}}},
{"id":"arca","key":"arca","value":{"rev":"15-ef82f095978f1b9367fc11297da731f9"},"doc":{"_id":"arca","_rev":"15-ef82f095978f1b9367fc11297da731f9","name":"arca","description":"little tool to download files from a public dropbox folder","dist-tags":{"latest":"2.0.3"},"versions":{"1.0.0":{"name":"arca","version":"1.0.0","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.2.9","async":"0.1.15","rimraf":"1.0.9"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@1.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4f10d1675993affe903ff655957ec955e7ca2af6","tarball":"http://registry.npmjs.org/arca/-/arca-1.0.0.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]},"1.0.1":{"name":"arca","version":"1.0.1","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.2.9","async":"0.1.15","rimraf":"1.0.9"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@1.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1a9decabed1ed0152eef1310ae423c3b3c423a1b","tarball":"http://registry.npmjs.org/arca/-/arca-1.0.1.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]},"1.0.3":{"name":"arca","version":"1.0.3","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.2.9","async":"0.1.15","rimraf":"1.0.9"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@1.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f02e5e86aeade8381f614bdf5bc163f6783363fa","tarball":"http://registry.npmjs.org/arca/-/arca-1.0.3.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]},"2.0.0":{"name":"arca","version":"2.0.0","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.9.3","async":"0.1.15","file":"0.1.1","ezcrypto":"0.0.3","sugar":"1.1.3"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@2.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ca18d99642361f2d02dba335881dc03be501ab98","tarball":"http://registry.npmjs.org/arca/-/arca-2.0.0.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]},"2.0.1":{"name":"arca","version":"2.0.1","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.9.3","async":"0.1.15","file":"0.1.1","ezcrypto":"0.0.3","sugar":"1.1.3","debug":"0.1.0"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@2.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"aebd6a08bccc6213b46f072cb9f2d9a69b5c28de","tarball":"http://registry.npmjs.org/arca/-/arca-2.0.1.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]},"2.0.2":{"name":"arca","version":"2.0.2","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.9.3","async":"0.1.15","file":"0.1.1","ezcrypto":"0.0.3","sugar":"1.1.3","debug":"0.1.0"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@2.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fbaa23f49ee1a935ef8ed67ded8aac7fd257b190","tarball":"http://registry.npmjs.org/arca/-/arca-2.0.2.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]},"2.0.3":{"name":"arca","version":"2.0.3","description":"little tool to download files from a public dropbox folder","keywords":["dropbox"],"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"dependencies":{"scraper":"0.0.9","request":"2.9.3","async":"0.1.15","file":"0.1.1","ezcrypto":"0.0.3","sugar":"1.1.3"},"main":"arca","engines":{"node":">=0.4.12"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"arca@2.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"efeb1856079a602b92a5eb87f1d0f88108249b77","tarball":"http://registry.npmjs.org/arca/-/arca-2.0.3.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]}},"readme":"# arca\nSmall tool to download files from a public dropbox folder.\n\n## installation\n\tnpm install arca\n\n## usage\n\n\tarca = require('arca');\n\t\n\tarca.set('https://www.dropbox.com/s/i3nu0semiguzh98', '\\.md|\\.markdown');\n\n\tarca.sync(function (e, path) {\n\t\tconsole.log('Path with the downloaded files: ' + path);\n\t});","maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}],"time":{"modified":"2012-01-19T21:54:37.598Z","created":"2011-12-20T03:47:02.140Z","1.0.0":"2011-12-20T03:47:09.628Z","1.0.1":"2011-12-20T23:21:43.764Z","1.0.3":"2011-12-21T00:23:37.539Z","2.0.0":"2012-01-15T05:02:52.217Z","2.0.1":"2012-01-19T18:06:35.301Z","2.0.2":"2012-01-19T21:14:24.242Z","2.0.3":"2012-01-19T21:54:37.598Z"},"author":{"name":"Sergio Ramos","email":"mail@sergioramos.me"},"_attachments":{"arca-2.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-cxEUMX3MhHDpD7bWbrZlhw==","length":10240,"stub":true},"arca-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Abq/UnJb7A6fZ/J51SvXIQ==","length":10240,"stub":true},"arca-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-/b24bjNuotMVcCQHzsiAKQ==","length":10240,"stub":true},"arca-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-03UV1MMouCP06gBFI2Qskg==","length":10240,"stub":true},"arca-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-O/arLmDrwgkGZIIOQnFGZg==","length":10240,"stub":true},"arca-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eDnCZWO6DSty07MFHshNCw==","length":10240,"stub":true},"arca-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tzGj17b7O7G0a9pcs/MsfA==","length":10240,"stub":true}}}},
{"id":"arcabouco-js","key":"arcabouco-js","value":{"rev":"54-13b8c94beabc0faa5d671ff5fd7ebfac"},"doc":{"_id":"arcabouco-js","_rev":"54-13b8c94beabc0faa5d671ff5fd7ebfac","name":"arcabouco-js","description":"scalable microframework in node.js","dist-tags":{"latest":"0.9.1"},"versions":{"0.0.1":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.0.1","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.0.1","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8183b38ed676acbdf6ae2596716f3ead4991122a","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.0.1.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}],"directories":{}},"0.0.2":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.0.2","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.0.2","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5675fbcaecec2344498d0e9d69f2faa6426156fc","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.0.2.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}],"directories":{}},"0.0.3":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.0.3","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./lib/arcabouco.coffee","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4b5679242c5c9cc7032cf3eba65352c288c04c1b","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.0.3.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.0.4":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.0.4","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"649d955e65e73050f6cceb99e04f88a5a28494a2","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.0.4.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.5.0":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.5.0","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"7b9a2d9b2a0d7b3fe3315ed560c8e113319a09eb","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.5.0.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.5.1":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.5.1","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b77f6d9f3dc803f0695cbedae5c20c96a1023d16","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.5.1.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.5.2":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.5.2","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","vows":">=0.5.12","zombie":">=0.10.2","async":">=0.1.12","stylus":">=0.19.0"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.5.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"aed6535769604f1bda66fb4d51973969f03ec2f2","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.5.2.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.5.333":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.5.333","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.5.333","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5a76fcff5a00c21f830c196963482ed9ae3965e6","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.5.333.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.5.4":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.5.4","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.5.4","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"31960b008a085f1d0f32180959b66b6248d4e5a8","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.5.4.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.5.9":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.5.9","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.5.9","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6e335586cbc97e406ceae06bd088ba8303c523a4","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.5.9.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.6.0":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.6.0","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.6.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8179b5b8f825086c981a8ccc0e71677372c200ac","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.6.0.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.6.1":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.6.1","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.6.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9307ae6db196514d37ff794b11f53a4ce20c7671","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.6.1.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.6.2":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.6.2","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.6.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"beace7c110b343744d386ff376554a7056eaf1c8","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.6.2.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.6.6":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.6.6","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.6.6","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d6f5f67bd7049322d289cc1e83cdce7eb654ed0b","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.6.6.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.6.7":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.6.7","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.6.7","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"ffe8503aef546b526d2f01bdbfd44636336b9364","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.6.7.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.6.8":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.6.8","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.6.8","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b10d7af073e754382ac30ffeb2ac8c58d460b62d","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.6.8.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.1":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.1","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b5d37b80e8a250af2d98c7ff5653464b137f476b","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.1.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.2":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.2","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f3409dee8026c5c97049deec1a86dd5854c1b49d","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.2.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.3":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.3","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.3","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5a50487df1ab52816de1645c04374d9e2a876cad","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.3.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.4":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.4","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.4","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8c44ab1d3f49401f01642330167c92100dd6c136","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.4.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.5":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.5","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.5","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"dfc3ad1fbe58d1de0aee630c7fc6102b9e8b176f","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.5.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.7":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.7","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.7","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"513b7383e0a5b6223a2b68de61ac4fdd2b92c5fb","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.7.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.8.9":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.8.9","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.4.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.8.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"ca195ca4f705018356efe4e33484f248f35a1eec","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.8.9.tgz"},"readme":"node.js - Arcabouco.JS microframework\n\nWarning: Alpha Version - Do not use in production\n\nArcabouco.JS is a microframework designed to run on top of node.js to automate large scale applications with self-scalability / monitoring\n\n","maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.9.0":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.9.0","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.6.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.9.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b91c5f8991257418902a5d3ad67f52ea55632506","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.9.0.tgz"},"readme":"node.js - Arcabouco.JS microframework\n\nWarning: Alpha Version - Do not use in production\n\nArcabouco.JS is a microframework designed to run on top of node.js to automate large scale applications with self-scalability / monitoring\n\n","maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.9.1":{"name":"arcabouco-js","description":"scalable microframework in node.js","version":"0.9.1","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{"haml-js":"https://github.com/creationix/haml-js/tarball/master","coffee-script":">=1.1.2","underscore":">=1.2.1","i18n":">=0.3.0","async":">=0.1.12","stylus":">=0.19.0"},"devDependencies":{"zombie":">=0.10.2","vows":">=0.5.12","sinon":"1.2.0"},"keywords":["framework","web","footprint","lightweight"],"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"engines":{"node":">= 0.6.0 < 1.0.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-js@0.9.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e0f611dc3f1a2f8515f4e753c249c9bfeddf5802","tarball":"http://registry.npmjs.org/arcabouco-js/-/arcabouco-js-0.9.1.tgz"},"readme":"node.js - Arcabouco.JS microframework\n\nWarning: Alpha Version - Do not use in production\n\nArcabouco.JS is a microframework designed to run on top of node.js to automate large scale applications with self-scalability / monitoring\n\n","maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]}},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}],"time":{"modified":"2012-03-02T13:44:11.524Z","created":"2011-11-04T19:36:57.922Z","0.0.1":"2011-11-04T19:43:54.218Z","0.0.2":"2011-11-04T19:54:00.418Z","0.0.3":"2011-11-04T20:05:51.105Z","0.0.4":"2011-11-04T20:16:30.308Z","0.5.0":"2011-11-09T13:32:19.029Z","0.5.1":"2011-11-09T13:40:31.939Z","0.5.2":"2011-11-09T13:51:50.658Z","0.5.333":"2011-11-09T15:04:08.543Z","0.5.4":"2011-11-09T15:38:41.349Z","0.5.9":"2011-11-09T16:32:33.651Z","0.6.0":"2011-11-09T17:33:08.119Z","0.6.1":"2011-11-10T20:26:54.815Z","0.6.2":"2011-11-11T19:33:06.333Z","0.6.6":"2011-11-18T16:07:57.350Z","0.6.7":"2011-11-22T19:17:50.181Z","0.6.8":"2011-11-25T19:30:33.965Z","0.8.1":"2012-01-20T19:38:44.794Z","0.8.2":"2012-01-27T13:51:59.445Z","0.8.3":"2012-01-27T14:04:43.672Z","0.8.4":"2012-01-31T13:04:20.309Z","0.8.5":"2012-02-02T13:59:56.734Z","0.8.7":"2012-02-27T19:38:48.561Z","0.8.8":"2012-02-29T18:24:59.559Z","0.8.9":"2012-02-29T18:31:30.835Z","0.9.0":"2012-03-01T13:54:10.646Z","0.9.1":"2012-03-02T13:44:11.524Z"},"author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js.git"},"_attachments":{"arcabouco-js-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-pdfnfd5+lHVKh21/hr7irQ==","length":10028,"stub":true},"arcabouco-js-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-yjbtJN4dypyYDJvnvtNFOA==","length":9937,"stub":true},"arcabouco-js-0.8.9.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-fZsCI1l/irGd9KAMdg6gng==","length":9825,"stub":true},"arcabouco-js-0.8.7.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-lbnXEG4oRNhsZhjhzKVeLg==","length":9597,"stub":true},"arcabouco-js-0.8.5.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-ZoNsrPJkrB5FIk5kxjS/Bw==","length":9538,"stub":true},"arcabouco-js-0.8.4.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-Zz20p0RNwNlmyD6IowWvXw==","length":9291,"stub":true},"arcabouco-js-0.8.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-5eH5woCpc61ls04QLPpjdQ==","length":9229,"stub":true},"arcabouco-js-0.8.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-F045f8aJV+MLQqj69J9gOw==","length":9234,"stub":true},"arcabouco-js-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-E5V2C9gPzGdIrU9PLlZgYA==","length":9237,"stub":true},"arcabouco-js-0.6.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-3/vZxPnHoBV2GercMoW7YQ==","length":6755,"stub":true},"arcabouco-js-0.6.7.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-lOPGqg+rXN6FjO2/fjdpkw==","length":6733,"stub":true},"arcabouco-js-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-g+5gW1eV4Is2dd7K4/syvA==","length":6459,"stub":true},"arcabouco-js-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-/qruXI+O9eZHdUzu6dEQxA==","length":5526,"stub":true},"arcabouco-js-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-ztDDU0m22P0v9BNONBkG4A==","length":5171,"stub":true},"arcabouco-js-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-tS9P6QLl/s9RSejgHoFiRQ==","length":5035,"stub":true},"arcabouco-js-0.5.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-sKDDMhk8joIH3AljA3Mj4Q==","length":4967,"stub":true},"arcabouco-js-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-s08maDtoqiWkRAimV/e6Ow==","length":4885,"stub":true},"arcabouco-js-0.5.333.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ZSay4Adf9C1fX0mtCI97ow==","length":4809,"stub":true},"arcabouco-js-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-3K7CBcrA+XIUgZwYdu7W7Q==","length":4720,"stub":true},"arcabouco-js-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-WTAlBueo53dhfWAPbvz86A==","length":4718,"stub":true},"arcabouco-js-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-H201pXIk2HIjNV86zQJMuw==","length":4798,"stub":true},"arcabouco-js-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-yCQ4cZ9htBy68iYCelsGOA==","length":10240,"stub":true},"arcabouco-js-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yuzhzJtQq3N5bVm4YOcT0A==","length":10240,"stub":true},"arcabouco-js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XNerVbKB1klU7xGpnZsdUA==","length":10240,"stub":true},"arcabouco-js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gIg21HT8vF0rCW6vc3H8cQ==","length":10240,"stub":true}}}},
{"id":"arcabouco-tasks","key":"arcabouco-tasks","value":{"rev":"5-16d31699a2b225f17a029438da7e26bf"},"doc":{"_id":"arcabouco-tasks","_rev":"5-16d31699a2b225f17a029438da7e26bf","name":"arcabouco-tasks","description":"async handlers for arcabouco-js","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"arcabouco-tasks","description":"async handlers for arcabouco-js","version":"0.1.1","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js-tasks","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js-tasks.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-tasks@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c76006d3685fa82f71778e6c96b3f3dfed897096","tarball":"http://registry.npmjs.org/arcabouco-tasks/-/arcabouco-tasks-0.1.1.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]},"0.1.2":{"name":"arcabouco-tasks","description":"async handlers for arcabouco-js","version":"0.1.2","author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"homepage":"http://github.com/pnegri/arcabouco-js-tasks","contributors":[],"main":"./main.js","directories":{"lib":"./lib"},"dependencies":{},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js-tasks.git"},"engines":{"node":">= 0.4.0 < 0.7.0"},"_npmUser":{"name":"patricknegri","email":"patrick@iugu.com.br"},"_id":"arcabouco-tasks@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3cb26cc1b2130afcf4dd93a704c2f399bd69292a","tarball":"http://registry.npmjs.org/arcabouco-tasks/-/arcabouco-tasks-0.1.2.tgz"},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}]}},"maintainers":[{"name":"patricknegri","email":"patrick@iugu.com.br"}],"time":{"modified":"2012-02-27T19:32:34.612Z","created":"2012-02-27T18:26:17.458Z","0.1.1":"2012-02-27T18:26:19.739Z","0.1.2":"2012-02-27T19:32:34.612Z"},"author":{"name":"Patrick Negri","email":"patrick@iugu.com.br"},"repository":{"type":"git","url":"git://github.com/pnegri/arcabouco-js-tasks.git"},"_attachments":{"arcabouco-tasks-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-bu1Yavsi2BbeNds6WG0X+w==","length":804,"stub":true},"arcabouco-tasks-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-f7QXbpxgNZu94Ln334nEig==","length":727,"stub":true}}}},
{"id":"arcane","key":"arcane","value":{"rev":"3-f846c96e890ed6150d4271c93cc05a24"},"doc":{"_id":"arcane","_rev":"3-f846c96e890ed6150d4271c93cc05a24","name":"arcane","description":"Simple crypt/decrypt text tool for node","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"arcane","version":"0.1.0","description":"Simple crypt/decrypt text tool for node","repository":{"type":"git","url":"git://github.com/goatslacker/Arcane.git"},"author":{"name":"Josh Perez","email":"josh@goatslacker.com"},"licenses":["MIT"],"dependencies":{},"bin":{"arcane":"./bin/arcane.js"},"devDependencies":{},"_id":"arcane@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"fa71937be230e77a937e1b9f26573dd98a9b87bf","tarball":"http://registry.npmjs.org/arcane/-/arcane-0.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"goatslacker","email":"josh@goatslacker.com"}],"time":{"modified":"2011-06-04T23:53:14.131Z","created":"2011-06-04T23:53:13.289Z","0.1.0":"2011-06-04T23:53:14.131Z"},"author":{"name":"Josh Perez","email":"josh@goatslacker.com"},"repository":{"type":"git","url":"git://github.com/goatslacker/Arcane.git"},"_attachments":{"arcane-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-od3+e4HQCR1hWixsYR2aGQ==","length":1648,"stub":true}}}},
{"id":"arch","key":"arch","value":{"rev":"5-4f2acf88dd6cd38ea07dce3506a6c402"},"doc":{"_id":"arch","_rev":"5-4f2acf88dd6cd38ea07dce3506a6c402","name":"arch","description":"A small toolkit-framework","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"arch","version":"0.0.1","description":"A small toolkit-framework","keywords":["server","http","framework","toolkit","arch"],"author":{"name":"Jake Verbaten","email":"raynos2@gmail.com"},"dependencies":{"stak":"0.0.2","error":"0.0.1","rest":"0.0.1","fcombine":"0.0.3","after":"0.1.6","pd":"0.2.1"},"devDependencies":{"tester":"0.0.2"},"main":"src/arch","engines":{"node":"0.5.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/arch/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arch@0.0.1","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"26cb6401c3aa678f44207cd909cb03d97e968563","tarball":"http://registry.npmjs.org/arch/-/arch-0.0.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.0.2":{"name":"arch","version":"0.0.2","description":"A small toolkit-framework","keywords":["server","http","framework","toolkit","arch"],"author":{"name":"Jake Verbaten","email":"raynos2@gmail.com"},"dependencies":{"stak":"0.0.2","error":"0.0.1","rest":"0.0.1","fcombine":"0.0.3","after":"0.1.6","pd":"0.2.1"},"devDependencies":{"tester":"0.0.2"},"main":"src/arch","engines":{"node":"0.5.x"},"_npmJsonOpts":{"file":"/home/raynos/.npm/arch/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arch@0.0.2","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"68adfb63ff9fe68774f13ae5f4b1bf354a0de14c","tarball":"http://registry.npmjs.org/arch/-/arch-0.0.2.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2011-10-19T17:49:30.935Z","created":"2011-10-19T17:39:01.173Z","0.0.1":"2011-10-19T17:39:03.326Z","0.0.2":"2011-10-19T17:49:30.935Z"},"author":{"name":"Jake Verbaten","email":"raynos2@gmail.com"},"_attachments":{"arch-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AJMtUDaB+Q6WYskrceZi1Q==","length":2605,"stub":true},"arch-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WMpy5e+vXmyjU+w2G59d5A==","length":2604,"stub":true}}}},
{"id":"archetype","key":"archetype","value":{"rev":"3-441336def3b7aade89c8c1c19a84f56d"},"doc":{"_id":"archetype","_rev":"3-441336def3b7aade89c8c1c19a84f56d","name":"archetype","description":"A web framework leveraging Node.js","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.4":{"name":"archetype","version":"0.0.4","author":{"name":"Jeff Trudeau","email":"jeff.trudeau@gmail.com"},"bin":{"archetype":"./cli.js"},"dependencies":{"hiredis":"<=0.1.12","memcached":"<=0.0.1","optimist":"<=0.0.3","redis":"<=0.6.6"},"description":"A web framework leveraging Node.js","directories":{"lib":"./lib"},"engines":{"node":">=0.5.0-pre <0.6","npm":">=1 <1.1"},"licenses":[{"type":"GPL v2","url":"http://www.gnu.org/licenses/gpl-2.0.txt"}],"main":"./archetype.js","repository":{"type":"git","url":"git://github.com/jefftrudeau/archetype.git"},"_id":"archetype@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.12","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e5ec26c8620390425efb04c1f0e784d33799a897","tarball":"http://registry.npmjs.org/archetype/-/archetype-0.0.4.tgz"},"scripts":{}}},"maintainers":[{"name":"jefftrudeau","email":"jeff.trudeau@gmail.com"}],"time":{"modified":"2011-07-22T01:35:26.320Z","created":"2011-07-22T01:35:25.778Z","0.0.4":"2011-07-22T01:35:26.320Z"},"author":{"name":"Jeff Trudeau","email":"jeff.trudeau@gmail.com"},"repository":{"type":"git","url":"git://github.com/jefftrudeau/archetype.git"},"_attachments":{"archetype-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uP06X2YQt6SdisShBpDm9g==","length":11639,"stub":true}}}},
{"id":"archie","key":"archie","value":{"rev":"3-057379f676bab64c43a5df856e512430"},"doc":{"_id":"archie","_rev":"3-057379f676bab64c43a5df856e512430","name":"archie","description":"Simple archetypes inspired by mvn archetype:generate.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"archie","preferGlobal":"true","description":"Simple archetypes inspired by mvn archetype:generate.","author":{"name":"Ian Macalinao","email":"ianmacalinao@gmail.com"},"version":"0.0.1","scripts":{"test":"make test"},"keywords":["skeleton","archetype","scaffold","generator"],"main":"bootstrap","repository":{"type":"git","url":"git://github.com/simplyianm/archie.git"},"bin":{"archie":"./bin/archie"},"dependencies":{"coffee-script":"*","mkdirp":"*","mocha":"*","should":"*","optimist":"*","rimraf":"*","superagent":"*"},"license":"Apache","engine":{"node":">=0.4"},"_npmUser":{"name":"simplyianm","email":"ianmacalinao@gmail.com"},"_id":"archie@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"602eb320a0b593dd1512e5fb9aa6fa8afac865d0","tarball":"http://registry.npmjs.org/archie/-/archie-0.0.1.tgz"},"readme":"","maintainers":[{"name":"simplyianm","email":"ianmacalinao@gmail.com"}]}},"readme":"","maintainers":[{"name":"simplyianm","email":"ianmacalinao@gmail.com"}],"time":{"modified":"2012-06-02T07:08:17.369Z","created":"2012-06-02T07:08:16.611Z","0.0.1":"2012-06-02T07:08:17.369Z"},"author":{"name":"Ian Macalinao","email":"ianmacalinao@gmail.com"},"repository":{"type":"git","url":"git://github.com/simplyianm/archie.git"},"_attachments":{"archie-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xroqyhj4ZlbaVC7t7DJDKg==","length":6391,"stub":true}}}},
{"id":"architect","key":"architect","value":{"rev":"19-aa41f79cb38babc027f44559bda3e405"},"doc":{"_id":"architect","_rev":"19-aa41f79cb38babc027f44559bda3e405","name":"architect","description":"A Simple yet powerful plugin system for node applications","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.1":{"name":"architect","version":"0.0.1","description":"Framework for Plugin based JavaScript applications","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@c9.io"}],"repository":{"type":"git","url":"git://github.com/c9/architect.git"},"dependencies":{"remoteagent-protocol":"0.0.x"},"devDependencies":{"asyncjs":"0.0.x"},"main":"lib/architect","engines":{"node":"0.6.x"},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"architect@0.0.1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9b77d9e9effde1abf9ec7718f1c30ee055f17421","tarball":"http://registry.npmjs.org/architect/-/architect-0.0.1.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"directories":{}},"0.0.3":{"name":"architect","description":"A Simple yet powerful plugin system for large-scale node applications","version":"0.0.3","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Tim Caswell","email":"tim@c9.io"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Christoph Dorn","email":"christoph@christophdorn.com"}],"main":"architect.js","repository":{"type":"git","url":"git://github.com/c9/architect.git"},"dependencies":{"architect-agent":"~0.2.0","architect-socket-transport":"~0.2.0"},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"sergi","email":"sergi.mansilla@gmail.com"},"_id":"architect@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0a6a0ae33ea2f775ef66a5915863b5174edd3d41","tarball":"http://registry.npmjs.org/architect/-/architect-0.0.3.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"},{"name":"sergi","email":"sergi.mansilla@gmail.com"}]},"0.1.1":{"name":"architect","description":"A Simple yet powerful plugin system for node applications","version":"0.1.1","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Tim Caswell","email":"tim@c9.io"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Christoph Dorn","email":"christoph@christophdorn.com"}],"main":"architect.js","repository":{"type":"git","url":"git://github.com/c9/architect.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"architect@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"ff5848427c03ce9c8bccf588fcd02903dcf2e784","tarball":"http://registry.npmjs.org/architect/-/architect-0.1.1.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"},{"name":"sergi","email":"sergi.mansilla@gmail.com"}]},"0.1.2":{"name":"architect","description":"A Simple yet powerful plugin system for node applications","version":"0.1.2","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Tim Caswell","email":"tim@c9.io"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Christoph Dorn","email":"christoph@christophdorn.com"}],"main":"architect.js","repository":{"type":"git","url":"git://github.com/c9/architect.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"architect@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"49519f6b208445ccf24762948d374d2e22ef5661","tarball":"http://registry.npmjs.org/architect/-/architect-0.1.2.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"},{"name":"sergi","email":"sergi.mansilla@gmail.com"}]},"0.1.3":{"name":"architect","description":"A Simple yet powerful plugin system for node applications","version":"0.1.3","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Tim Caswell","email":"tim@c9.io"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Christoph Dorn","email":"christoph@christophdorn.com"}],"main":"architect.js","repository":{"type":"git","url":"git://github.com/c9/architect.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"zef","email":"zef@c9.io"},"_id":"architect@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"c6d276c52402a37c02cf3e586a67a07854c07926","tarball":"http://registry.npmjs.org/architect/-/architect-0.1.3.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"},{"name":"sergi","email":"sergi.mansilla@gmail.com"},{"name":"zef","email":"zef@c9.io"}]},"0.1.4":{"name":"architect","description":"A Simple yet powerful plugin system for node applications","version":"0.1.4","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Tim Caswell","email":"tim@c9.io"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Christoph Dorn","email":"christoph@christophdorn.com"}],"main":"architect.js","repository":{"type":"git","url":"git://github.com/c9/architect.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"cadorn","email":"christoph@christophdorn.com"},"_id":"architect@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b081d6d4ada9e963819b3e9e6426054d52be7849","tarball":"http://registry.npmjs.org/architect/-/architect-0.1.4.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"},{"name":"sergi","email":"sergi.mansilla@gmail.com"},{"name":"zef","email":"zef@c9.io"},{"name":"cadorn","email":"christoph@christophdorn.com"}]}},"readme":"Node server plugin system\n=========================\n\nEverything is either a plugin or a library. Libaries are passive and provide functionality, which can be consumed by others. Plugins in contrast add functionality to the application. Plugins can add to the functionality of an application by adding services or by contributing to extension points defined by other plugins.\n\nThis plugin framework is inspired by the OSGI and Eclipse plugin systems. The core concepts are:\n\n1. Live Cycle Management\n2. Dependency Management\n3. Services\n4. Extension Points\n\nLive Cycle Management\n=====================\n\nThe plugin manager takes care of locating plugins on disc and of starting and\nstopping them.\n\nDependency Management\n=====================\n\nPlugins have two kinds of dependencies:\n\n1. Code dependencies\n2. Runtime dependencies\n\nCode dependencies basically define, which code the plugin references. In node.js this is usually done using npm in the package.json. This is also the approach taken here. OSGI does fancy shit to resolve code dependencies and to allow different versions of a libary be used at the same time by different plugins. With npm we get all that for free.\n\nRuntime dependencies are more interesting. Here we want to interact with running instances of other plugins. This is done by using services.\n\nServices\n========\n\nThis is basically an implementation of a SOA in small:\n\n- Plugins declare statically which services they provide\n- Plugins declare statically which services they require\n\nThe loader will make sure that a service consumer is always initialized after the service provider.\n\nExtension Points\n================\n\nPlugins can open themselves up to be extended by other plugins. To do this they have to declare the extension point in their `package.json`. Other plugins can hook into this extension point.\n\nServices vs. Extension Points\n=============================\n\nServices and extension points are based on the same implementation. Both provide an implementation for a certain functionality referenced by an ID and other plugins can reference them. The main difference is the way both are used in a system:\n\n<table>\n    <tr>\n        <th></th><th>Extension Point</th><th>Service</th>\n    </tr>\n    <tr>\n        <td>Purpose</td>\n        <td>Providing a way for other plugins to extend the plugin's functionality</td>\n        <td>Providing a global service, which is available to any other plugin in the system</td>\n    <tr>\n    </tr>\n        <td>Consumer</td>\n        <td>The plugin defining the extension point is usually the only consumer</td>\n        <td>A service has usually many consumers in the system</td>\n    <tr>\n    </tr>\n        <td>Implementation</td>\n        <td>Can have any number of implementations</td>\n        <td>Usually just one implementation. (the first is picked)</td>\n    </tr>\n</table>\n\n\nPlugin vs. Library\n==================\n\nLibrary = npm module (passive)\nPlugin = add functionality to the app (active).\n\nA plugin based application on disk\n==================================\n\nImagine we want to create a plugin based chat application. How would you create one and how would that look on disk?\n\n    /chat\n      /config\n        chat.js\n      /node_modules\n        /lego\n        /lego.log\n        /chat.main\n        /chat.channels\n      package.json\n      server.js\n      \nFirst we need to define which plugins and which libraries to use. We use npm to manage and install those dependencies. All dependencies must be delared in the top level package.json. The config directory contains run configurations. A run configuration is the set of plugins, which are used to compose the application. In a ddition the run configuration can contain configuration data for each plugin.\n\n\nRemote Plugins\n==============\n\n**these are just random ideas**\n\nWhat it each plugin could run in its own procees?\n\n- there should be a central repository of services\n- every call would be async\n- you cannot pass references (JSON only)\n- you can simulate references with stubs (same for callbacks)\n- we have to define interfaces\n\nWhat would we gain?\n\n- stability (exceptions only bring down the plugin)\n- security\n- scalability over multiple cores (potentially over multiple machines)\n- we enforce separation and loose coupling\n\nWhat would we lose?\n\n- passing refernces\n- simplicity\n\nHow would this work?\n\npluginContext.getService()\n  - will query the registry (runs out of process)\n  - the registry returns URI of the service (enough information to connect)\n  - the local plugin manager asks the remote plugin manger to create the service\n  - will return a stub object\n\n  - will handle communication with the plugin\n  - coordinated by the plugins manager\n\nEach process has a plugin manager\n\nOnly one Service Registry\n\n\n**Out of process of individual plugins**\n**Live Cycle managed by one single plugin manager**\n\nWe will run individual plugins out of process. We will not have multiple plugin manager. Everthing is managed centrally. Not everything can be run out of process.\n\n\n","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"},{"name":"sergi","email":"sergi.mansilla@gmail.com"},{"name":"zef","email":"zef@c9.io"},{"name":"cadorn","email":"christoph@christophdorn.com"}],"time":{"modified":"2012-06-24T02:52:12.926Z","created":"2012-02-29T09:14:07.336Z","0.0.1":"2012-02-29T09:14:08.706Z","0.0.3":"2012-05-16T18:24:35.317Z","0.1.1":"2012-06-20T18:20:08.516Z","0.1.2":"2012-06-22T05:56:55.140Z","0.1.3":"2012-06-23T20:14:32.513Z","0.1.4":"2012-06-24T02:52:12.926Z"},"author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"repository":{"type":"git","url":"git://github.com/c9/architect.git"},"_attachments":{"architect-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-abWMdS0XZcNIlBiw2/zi5A==","length":7339,"stub":true},"architect-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-FwGJVKZEOYqNFvjEpIEpOQ==","length":7249,"stub":true},"architect-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-lty4VwO+ewbIORvXRTzQQA==","length":7207,"stub":true},"architect-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-VGXYiIe2n5XyYl+KBfd2LA==","length":7353,"stub":true},"architect-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-XzoEzjbBtrQI4m8TFRWAQg==","length":36179,"stub":true},"architect-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PS6EdW40VGs6D9AYlNnWvw==","length":10240,"stub":true}}}},
{"id":"architect-agent","key":"architect-agent","value":{"rev":"13-3d80ef16b81b9404dced01ccf6584645"},"doc":{"_id":"architect-agent","_rev":"13-3d80ef16b81b9404dced01ccf6584645","name":"architect-agent","description":"This is the rpc agent for the architect plugin framework","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-agent","description":"This is the rpc agent for the architect plugin framework","version":"0.2.0","repository":{"type":"git","url":"git://github.com/c9/architect-agent.git"},"main":"architect-agent.js","engines":{"node":"~0.6.0"},"devDependencies":{"architect-socket-transport":"~0.2.0","architect-fake-transports":"~0.2.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-agent@0.2.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"819cb17bcea40c10175391ce634d65688a21dc6d","tarball":"http://registry.npmjs.org/architect-agent/-/architect-agent-0.2.0.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}],"directories":{}},"0.2.1":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-agent","description":"This is the rpc agent for the architect plugin framework","version":"0.2.1","repository":{"type":"git","url":"git://github.com/c9/architect-agent.git"},"main":"architect-agent.js","engines":{"node":"~0.6.0"},"devDependencies":{"architect-socket-transport":"~0.2.0","architect-fake-transports":"~0.2.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-agent@0.2.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"28c18a27412a2b7b7d1f0c914fabc86ee6d9df77","tarball":"http://registry.npmjs.org/architect-agent/-/architect-agent-0.2.1.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}]},"0.2.2":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-agent","description":"This is the rpc agent for the architect plugin framework","version":"0.2.2","repository":{"type":"git","url":"git://github.com/c9/architect-agent.git"},"main":"architect-agent.js","engines":{"node":"~0.6.0"},"devDependencies":{"architect-socket-transport":"~0.2.0","architect-fake-transports":"~0.2.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-agent@0.2.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1af5c799bbb532ee95c176593dca710e753b94c7","tarball":"http://registry.npmjs.org/architect-agent/-/architect-agent-0.2.2.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}]}},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"},{"name":"zef","email":"zef@c9.io"},{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"time":{"modified":"2012-05-16T16:28:33.841Z","created":"2012-03-27T19:16:40.961Z","0.2.0":"2012-03-27T19:16:42.502Z","0.2.1":"2012-04-20T20:05:22.861Z","0.2.2":"2012-04-24T22:21:01.198Z"},"author":{"name":"Tim Caswell","email":"tim@c9.io"},"repository":{"type":"git","url":"git://github.com/c9/architect-agent.git"},"_attachments":{"architect-agent-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-y8D12r4SbKw0mKogpoRkhg==","length":7163,"stub":true},"architect-agent-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SBmUkHeSSterbqipr4PSGA==","length":7154,"stub":true},"architect-agent-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KK2NyqX4+HgwmfZ78O+BUg==","length":7013,"stub":true}}}},
{"id":"architect-demo","key":"architect-demo","value":{"rev":"5-b52662f60b1df7d869b0bd7c0ee80e85"},"doc":{"_id":"architect-demo","_rev":"5-b52662f60b1df7d869b0bd7c0ee80e85","name":"architect-demo","description":"Demo application build with the architect plugin system","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"architect-demo","version":"0.0.1","description":"Demo application build with the architect plugin system","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@c9.io"}],"repository":{"type":"git","url":"git://github.com/c9/architect-demo.git"},"dependencies":{"architect-demo.connect":"0.0.x","architect-demo.hello":"0.0.x","architect-demo.log":"0.0.x","architect":"0.0.x"},"main":"server.js","engines":{"node":"0.6.x"},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"architect-demo@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9544f8810157003dcaf456a5708a5452c37a8ee0","tarball":"http://registry.npmjs.org/architect-demo/-/architect-demo-0.0.1.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]},"0.0.2":{"name":"architect-demo","version":"0.0.2","description":"Demo application build with the architect plugin system","author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"contributors":[{"name":"Fabian Jakobs","email":"fabian@c9.io"}],"repository":{"type":"git","url":"git://github.com/c9/architect-demo.git"},"dependencies":{"architect":"0.0.x"},"main":"server.js","engines":{"node":"0.6.x"},"scripts":{"preinstall":"make install","start":"node server.js"},"licenses":[{"type":"MIT","url":"http://github.com/c9/architect/raw/master/LICENSE"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"architect-demo@0.0.2","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"127300d6e11ca5ed0ffbdf4c92382d9bb2a31927","tarball":"http://registry.npmjs.org/architect-demo/-/architect-demo-0.0.2.tgz"},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]}},"readme":"Architect Demo\n==============\n\nthis is a demo application, which show how to build a plugin based web server using the architect framework.","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"time":{"modified":"2012-02-29T09:14:17.020Z","created":"2012-02-28T19:01:55.072Z","0.0.1":"2012-02-28T19:01:56.522Z","0.0.2":"2012-02-29T09:14:17.020Z"},"author":{"name":"ajax.org B.V.","email":"info@ajax.org"},"repository":{"type":"git","url":"git://github.com/c9/architect-demo.git"},"_attachments":{"architect-demo-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pmPC2tghNBpG/55iJTpuEg==","length":10240,"stub":true},"architect-demo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EUbXQm3O05E8aPgQhCfPuw==","length":10240,"stub":true}}}},
{"id":"architect-fake-transports","key":"architect-fake-transports","value":{"rev":"5-be9f3d821461ab67cadd4557bbf8343d"},"doc":{"_id":"architect-fake-transports","_rev":"5-be9f3d821461ab67cadd4557bbf8343d","name":"architect-fake-transports","description":"This is a fake transport useful for unit tests without real tcp.","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-fake-transports","description":"This is a fake transport useful for unit tests without real tcp.","version":"0.2.0","repository":{"type":"git","url":"git://github.com/c9/architect-fake-transport.git"},"main":"architect-fake-transports.js","engines":{"node":"~0.6.0"},"dependencies":{"msgpack-js":"~0.1.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-fake-transports@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0970bc4a3c9c57131d2b3272008caebf43be1c7a","tarball":"http://registry.npmjs.org/architect-fake-transports/-/architect-fake-transports-0.2.0.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}]}},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"},{"name":"zef","email":"zef@c9.io"},{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"time":{"modified":"2012-05-16T16:30:30.105Z","created":"2012-03-27T16:36:02.450Z","0.2.0":"2012-03-27T16:36:04.038Z"},"author":{"name":"Tim Caswell","email":"tim@c9.io"},"repository":{"type":"git","url":"git://github.com/c9/architect-fake-transport.git"},"_attachments":{"architect-fake-transports-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sYaFcE5+rTtHqBFSJQG8Kw==","length":807,"stub":true}}}},
{"id":"architect-socket-transport","key":"architect-socket-transport","value":{"rev":"23-697a53fdd76c7d80098e166d6e516007"},"doc":{"_id":"architect-socket-transport","_rev":"23-697a53fdd76c7d80098e166d6e516007","name":"architect-socket-transport","description":"This is a tcp + msgpack based transport for architect-agent","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-socket-transport","description":"This is a tcp + msgpack based transport for architect-agent","version":"0.2.0","repository":{"type":"git","url":"git://github.com/c9/architect-socket-transport.git"},"main":"socket-transport.js","engines":{"node":"~0.6.0"},"dependencies":{"msgpack-js":"~0.1.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-socket-transport@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"6c1a5e09ebab70c84dc7acececd4b607ec48f4ab","tarball":"http://registry.npmjs.org/architect-socket-transport/-/architect-socket-transport-0.2.0.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}],"directories":{}},"0.2.1":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-socket-transport","description":"This is a tcp + msgpack based transport for architect-agent","version":"0.2.1","repository":{"type":"git","url":"git://github.com/c9/architect-socket-transport.git"},"main":"socket-transport.js","engines":{"node":"~0.6.0"},"dependencies":{"msgpack-js":"~0.1.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-socket-transport@0.2.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"2be3b31f96f558bf3fa1c268a9ca6af8759b7159","tarball":"http://registry.npmjs.org/architect-socket-transport/-/architect-socket-transport-0.2.1.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}],"directories":{}},"0.2.2":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-socket-transport","description":"This is a tcp + msgpack based transport for architect-agent","version":"0.2.2","repository":{"type":"git","url":"git://github.com/c9/architect-socket-transport.git"},"main":"socket-transport.js","engines":{"node":"~0.6.0"},"dependencies":{"msgpack-js":"~0.1.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-socket-transport@0.2.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f8944fdd06c5daf89548c7a2affe51210ef55f73","tarball":"http://registry.npmjs.org/architect-socket-transport/-/architect-socket-transport-0.2.2.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"}],"directories":{}},"0.3.0":{"author":{"name":"Tim Caswell","email":"tim@c9.io"},"name":"architect-socket-transport","description":"This is a tcp + msgpack based transport for architect-agent","version":"0.3.0","repository":{"type":"git","url":"git://github.com/c9/architect-socket-transport.git"},"main":"socket-transport.js","engines":{"node":">=0.6.0"},"dependencies":{"msgpack-js":"~0.1.0"},"_npmUser":{"name":"creationix","email":"tim@creationix.com"},"_id":"architect-socket-transport@0.3.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2913cd3395f76fa4c5a339a5f2ea10d157502043","tarball":"http://registry.npmjs.org/architect-socket-transport/-/architect-socket-transport-0.3.0.tgz"},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"},{"name":"zef","email":"zef@c9.io"},{"name":"fjakobs","email":"fabian.jakobs@web.de"}]}},"readme":"","maintainers":[{"name":"creationix","email":"tim@creationix.com"},{"name":"zef","email":"zef@c9.io"},{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"time":{"modified":"2012-05-24T22:30:53.348Z","created":"2012-03-27T16:36:12.460Z","0.2.0":"2012-03-27T16:36:14.095Z","0.2.1":"2012-04-19T15:00:30.580Z","0.2.2":"2012-04-24T22:22:04.488Z","0.3.0":"2012-05-24T22:30:53.348Z"},"author":{"name":"Tim Caswell","email":"tim@c9.io"},"repository":{"type":"git","url":"git://github.com/c9/architect-socket-transport.git"},"_attachments":{"architect-socket-transport-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-cdwQycH/mJ1dmVnxoRmZ6Q==","length":1816,"stub":true},"architect-socket-transport-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+voyroDI4bz76lxQgVaBUg==","length":1570,"stub":true},"architect-socket-transport-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-iaBBiDNNfmwYYWwIn61duA==","length":1578,"stub":true},"architect-socket-transport-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HcjXdEdenmOo5viBChTqYQ==","length":1468,"stub":true}}}},
{"id":"archive","key":"archive","value":{"rev":"5-a5c0e92faa1f671e7979ade5af39d356"},"doc":{"_id":"archive","_rev":"5-a5c0e92faa1f671e7979ade5af39d356","name":"archive","description":"Node.js bindings to libarchive","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Karl Skomski","email":"karl@skomski.com"},"name":"archive","description":"Node.js bindings to libarchive","version":"0.0.1","homepage":"https://github.com/skomski/node-archive","repository":{"type":"git","url":"git://github.com/skomski/node-archive.git"},"main":"lib/archive.js","directories":{"lib":"."},"scripts":{"test":"node test/test-reader.js","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"rimraf":"~2.0.1"},"_npmUser":{"name":"skomski","email":"karl@skomski.com"},"_id":"archive@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2b411c8ca5a26a5cfc897b4fe3f4fd3a694d5c63","tarball":"http://registry.npmjs.org/archive/-/archive-0.0.1.tgz"},"readme":"","maintainers":[{"name":"skomski","email":"karl@skomski.com"}]},"0.0.2":{"author":{"name":"Karl Skomski","email":"karl@skomski.com"},"name":"archive","description":"Node.js bindings to libarchive","version":"0.0.2","homepage":"https://github.com/skomski/node-archive","repository":{"type":"git","url":"git://github.com/skomski/node-archive.git"},"main":"lib/archive.js","directories":{"lib":"."},"scripts":{"test":"node test/test-reader.js","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"rimraf":"~2.0.1"},"_npmUser":{"name":"skomski","email":"karl@skomski.com"},"_id":"archive@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"97cb2404f1743d147411fc78a4920a37178bcfdd","tarball":"http://registry.npmjs.org/archive/-/archive-0.0.2.tgz"},"readme":"","maintainers":[{"name":"skomski","email":"karl@skomski.com"}]}},"readme":"","maintainers":[{"name":"skomski","email":"karl@skomski.com"}],"time":{"modified":"2012-03-29T09:35:16.988Z","created":"2012-03-20T16:34:00.829Z","0.0.1":"2012-03-20T16:34:02.590Z","0.0.2":"2012-03-29T09:35:16.988Z"},"author":{"name":"Karl Skomski","email":"karl@skomski.com"},"repository":{"type":"git","url":"git://github.com/skomski/node-archive.git"},"_attachments":{"archive-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iLRngFQLtYX6rIr4SF0kug==","length":3552591,"stub":true},"archive-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DomEfn2HMfNGWxDDb7USPw==","length":3364409,"stub":true}}}},
{"id":"archivist","key":"archivist","value":{"rev":"17-ebedf09a94b03ee66d966c421c1cf854"},"doc":{"_id":"archivist","_rev":"17-ebedf09a94b03ee66d966c421c1cf854","name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","dist-tags":{"latest":"1.0.0"},"versions":{"0.5.0":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.0","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"bb127ddfed2ecfbafa5581550f0d2be9643578c4","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.0.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"0.5.1":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.1","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"b2d722cde97f0477deae77b4ad55360c5b2dfabb","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.1.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"0.5.2":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.2","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"00cad13f6a5cb4bdc4d2013895e6cb33fac28780","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.2.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"0.5.3":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.3","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"50b8bcb098614bc4d7939c7c463a7eb5e92fe24f","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.3.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"0.5.5":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.5","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*","mocha":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"2b815dec173287c0b2a041ce56b72398af4cf809","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.5.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"0.5.6":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.6","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*","mocha":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"b5a8f23a4e3ee4c7ccd6676676122f3a456b3287","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.6.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"0.5.7":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"0.5.7","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*"},"devDependencies":{"node-log":"*","should":"*","mocha":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@0.5.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"2f2bc33ed19fa2b9c7b7de11817b5dc938ba72eb","tarball":"http://registry.npmjs.org/archivist/-/archivist-0.5.7.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]},"1.0.0":{"name":"archivist","description":"prototype of the Archivist archetype for the Personify framework","version":"1.0.0","homepage":"http://github.com/leadVisionary/archivist","repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"main":"./archivist.js","dependencies":{"coffee-script":"*","emptyObject":"*"},"devDependencies":{"node-log":"*","should":"*","mocha":"*"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"},"_id":"archivist@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"a98a3a59c5825d405fe47a41ed5e7d042df0f089","tarball":"http://registry.npmjs.org/archivist/-/archivist-1.0.0.tgz"},"maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}]}},"readme":"<h1>On Archetypes</h1>\n<p>An initial prototype for the <strong>Archivist</strong> archetype of the <em>Personify</em> reference model. An archetype is a meta-level pattern encountered in many different applications. Archetypes provide general functionality usually required in various contexts.</p>\n\n<p>For example, applications often store data in databases. Traditionally, this meant Object-Relational Mapping (ORM). Such applications would often use an <a href=\"http://martinfowler.com/eaaCatalog/activeRecord.html\" target=\"_blank\">Active Record</a> (e.g. Ruby on Rails) or a <a href=\"http://martinfowler.com/eaaCatalog/dataMapper.html\" target=\"_blank\">Data Mapper</a> (e.g. Java Hibernate) to manage data persistence to long-term storage.</p> \n\n<p>Personify manifests this as the <strong>Archivist</strong> archetype.</p> \n<h1>Archivist</h1>\n<p>Like an archivist (a historian) in a castle, the <strong>Archivist</strong> archtype personifies the responsibility of storing information into long term storage.</p>\n\n<p>An <strong>Archivist</strong> are responsible for knowing</p> \n- where to store things (A StorageLocation)  \n- what to store (An Archive)\n- how to store it (An ArchivingStrategy)\n\n<p>An <strong>Archivist</strong> provides these basic services:</p>\n- Create(data) returns an Archive with an id that wraps the data\n- Read(id) returns the Archive with the specified id, or an empty Archive if none found\n- Update(id, newData) returns the updated Archive if newData validates. May throw a ValidationError if it does not\n- Delete(id) returns the removed Archive\n\n<h1>Specializations</h1>\n<p>A particular type of <strong>Archivist</strong>, for example a MongoDBArchivist, would extend the <strong>Archivist</strong> archetype through an application of the <a href=\"http://addyosmani.com/blog/decorator-pattern/\" target=\"_blank\">Decorator pattern</a> and explicitly devise its own StorageLocation, Archives, and ArchivingStrategies by extending the base interfaces and providing their own implemenations.</p>\n\n<h1>Source Layout and contents</h1>\n<p>The directory content of <strong>Archivist</strong> follows rzr style, adhering to the principles of <a href=\"http://domaindrivendesign.org/\" target=\"_blank\">Domain Driven Design</a> by defining a Bounded Context called domain/ by convention. The domain has separate modules, though it is a rzr guiding principle that blades (plugin components) be as minimalistic as possible. Hence, the <strong>Archivist</strong> has one module, archivist/.</p>\n\n<p>Each module has an Aggregate Root, conventionally named for the Module (in this case, Archivist.coffee). The Module contains the standard DDD components of Models and Services. Factories and Repositories are option, though the beta applications in <em>Personify</em> have delegated those responsiblities to other Agents (the <strong>Archivist</strong> is the Repository handler).  The Aggregate root exposes the agents the module provides for external interface. Modules in rzr style are Agents, though they may not always be very smart.</p>\n\n<h1>More on Agent Implementation</h1>\n<p>A dumb Agent may function much like an ideal <a href=\"http://java.sun.com/blueprints/patterns/FrontController.html\" target=\"_blank\">Front Controller</a> in a traditional Model-View-Controller application, forming an API for the services it provides and delegating requests appropriately.</p> \n\n<p>More intelligent agents may use reasoning engines to examine their current context, ensure the safety and validity of the information they have been provided, and align their actions with their models of the world, their beliefs, and their goals.</p>\n\n<p><em>Personify</em> Agents are entities with stated contracts, similar to <a href=\"http://c2.com/cgi/wiki?DesignByContract\" target=\"_blank\">Design By Contract</a>. These contracts are written in a <a href=\"http://c2.com/cgi/wiki?DomainSpecificLanguage\" target=\"_blank\">Domain Specific Language</a> for contract generation. These contracts outline their Beliefs, Capabilities, and Commitments. Beliefs expressed in the contracts become  manifested in the <a href=\"http://martinfowler.com/eaaCatalog/domainModel.html\" target=\"_blank\">Domain Model</a>, which is updated and used by the Agent's Brain to update according to change in context and carry out actions.</p> \n\n<h1>Archivist Intent</h1>\n<p>The <strong>Archivist</strong> archetype is intentionally naive. Domain specific agents should decorate it with context-specific intelligence.</p>\n\n<p>The <strong>Archivist</strong> archetype strives to be <a href=\"http://www.infoq.com/presentations/Simple-Made-Easy\" target=\"_blank\">Simple and Easy</a>, following Rich Hickey's definition. It provides simple CRUD to the external world.</p> \n\n<p><strong>Archivists</strong> really should not do more than this. Following the <a href=\"www.objectmentor.com/resources/articles/srp.pdf\" target=\"_blank\">Single Responsibility Principle</a>, they are intended to be specialized agents within an organization, requested by others to store data.</p>\n<p>If feature functionality beyond the simple use case \"Store Information X in Place Y by doing Z\" starts to creep into your implementation, YOAR DOING IT WRONG. Refactor that logic elsewhere.</p>","maintainers":[{"name":"swVisionary","email":"visionary.software.solutions@gmail.com"}],"time":{"modified":"2012-05-15T07:36:41.247Z","created":"2012-05-07T04:58:48.145Z","0.5.0":"2012-05-07T04:58:49.977Z","0.5.1":"2012-05-07T05:15:14.889Z","0.5.2":"2012-05-07T05:21:23.421Z","0.5.3":"2012-05-10T21:51:49.738Z","0.5.5":"2012-05-10T23:04:12.579Z","0.5.6":"2012-05-11T01:10:01.566Z","0.5.7":"2012-05-11T01:23:45.257Z","1.0.0":"2012-05-15T07:36:41.247Z"},"author":{"name":"Nicholas Vaidyanathan","email":"visionary.software.solutions@gmail.com","url":"http://www.visionarysoftwaresolutions.com/"},"repository":{"type":"git","url":"git://github.com/leadVisionary/archivist.git"},"_attachments":{"archivist-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-PPjvxZS9JzrHqPCPiT2L8w==","length":7822,"stub":true},"archivist-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-JUlInqfbcpiuZikNrENrNg==","length":6072,"stub":true},"archivist-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-u1SudARoIKpaqF7MlL5mLw==","length":6068,"stub":true},"archivist-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-liO5O7vfTHue4wNv9uAVWQ==","length":6079,"stub":true},"archivist-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-woB6sDzOaPZzgMSgBBloyg==","length":6055,"stub":true},"archivist-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-HYmz1XYgPafIrTwrOiXlnQ==","length":5619,"stub":true},"archivist-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-R0c02wIgchLjPt8LGSgKQQ==","length":5635,"stub":true},"archivist-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9xufG3+O15gXNFP/pO32vg==","length":5590,"stub":true}}}},
{"id":"archy","key":"archy","value":{"rev":"10-08aa2c1d4b7f45f6d89ec125e61ccc2d"},"doc":{"_id":"archy","_rev":"10-08aa2c1d4b7f45f6d89ec125e61ccc2d","name":"archy","description":"render nested hierarchies `npm ls` style with unicode pipes","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"name":"archy","version":"0.0.0","description":"render nested hierarchies `npm ls` style with unicode pipes","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"devDependencies":{"tap":"~0.2.3"},"scripts":{"test":"tap test"},"repository":{"type":"git","url":"git://github.com/substack/node-archy.git"},"keywords":["hierarchy","npm ls","unicode","pretty","print"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"archy@0.0.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fcc82f2916a8307969b368e8617646b41697c37b","tarball":"http://registry.npmjs.org/archy/-/archy-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.1":{"name":"archy","version":"0.0.1","description":"render nested hierarchies `npm ls` style with unicode pipes","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"devDependencies":{"tap":"~0.2.3"},"scripts":{"test":"tap test"},"repository":{"type":"git","url":"git://github.com/substack/node-archy.git"},"keywords":["hierarchy","npm ls","unicode","pretty","print"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"archy@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8c26dc5741db90792ccdbd34c57311cb3003ea1b","tarball":"http://registry.npmjs.org/archy/-/archy-0.0.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.2":{"name":"archy","version":"0.0.2","description":"render nested hierarchies `npm ls` style with unicode pipes","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"devDependencies":{"tap":"~0.2.3"},"scripts":{"test":"tap test"},"repository":{"type":"git","url":"git://github.com/substack/node-archy.git"},"keywords":["hierarchy","npm ls","unicode","pretty","print"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"archy@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"910f43bf66141fc335564597abc189df44b3d35e","tarball":"http://registry.npmjs.org/archy/-/archy-0.0.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"readme":null,"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-03-08T23:09:46.988Z","created":"2012-03-08T21:18:36.039Z","0.0.0":"2012-03-08T21:18:54.909Z","0.0.1":"2012-03-08T23:09:26.726Z","0.0.2":"2012-03-08T23:09:46.988Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-archy.git"},"_attachments":{"archy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-OCzMbNqji06trcwln68ZMQ==","length":2236,"stub":true},"archy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-DxXU6gDxL7OrVDBHYWRGeg==","length":2004,"stub":true},"archy-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Pz+h/M0wXLqziJkMDDI1JQ==","length":1502,"stub":true}}}},
{"id":"ardrone","key":"ardrone","value":{"rev":"8-540e95b796da734366a89bb06dc430c5"},"doc":{"_id":"ardrone","_rev":"8-540e95b796da734366a89bb06dc430c5","name":"ardrone","description":"Control your Parrot AR.Drone","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"ardrone","version":"0.1.0","description":"Control your Parrot AR.Drone","author":{"name":"Tim Baumann","email":"tim@timbaumann.info"},"homepage":"https://github.com/timjb/node-ardrone/","repository":{"type":"git","url":"https://github.com/timjb/node-ardrone.git"},"main":"./lib/ardrone","bin":{"ardrone-test":"./bin/test.js"},"scripts":{"preinstall":"node-waf configure build"},"_id":"ardrone@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"756398cbafda628543190d02ddc4af435751e18d","tarball":"http://registry.npmjs.org/ardrone/-/ardrone-0.1.0.tgz","bin":{"0.4-sunos-5.11":{"shasum":"515ea6f3669d8abef3bca495369dd2887eaf29e1","tarball":"http://registry.npmjs.org/ardrone/-/ardrone-0.1.0-0.4-sunos-5.11.tgz"}}}}},"maintainers":[{"name":"timjb","email":"tim@timbaumann.info"}],"time":{"modified":"2011-04-15T21:03:12.801Z","created":"2011-02-15T15:57:15.798Z","0.1.0":"2011-02-15T15:57:16.356Z"},"author":{"name":"Tim Baumann","email":"tim@timbaumann.info"},"repository":{"type":"git","url":"https://github.com/timjb/node-ardrone.git"},"_attachments":{"ardrone-0.1.0-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-I3NH7nz5C3UnN7iX8uD1/g==","length":36649,"stub":true},"ardrone-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wmm210B/fl4eaOhgWOPbNQ==","length":4981,"stub":true}}}},
{"id":"ardrone-web","key":"ardrone-web","value":{"rev":"3-8a53cc85a95be20cd44921347e82bbe4"},"doc":{"_id":"ardrone-web","_rev":"3-8a53cc85a95be20cd44921347e82bbe4","name":"ardrone-web","description":"A web interface to control your ARDrone","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"ardrone-web","version":"0.1.0","description":"A web interface to control your ARDrone","author":{"name":"Tim Baumann","email":"tim@timbaumann.info"},"homepage":"https://github.com/timjb/node-ardrone-web","repository":{"type":"git","url":"https://github.com/timjb/node-ardrone-web.git"},"dependencies":{"ardrone":">=0.1.0","socket.io":">=0.6.10","connect":">=0.5.10"},"scripts":{"start":"node server.js"},"bin":{"ardrone-web":"./server.js"},"_id":"ardrone-web@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ed672e02fff7dc7caf59a72a864fec1875f2c747","tarball":"http://registry.npmjs.org/ardrone-web/-/ardrone-web-0.1.0.tgz"}}},"maintainers":[{"name":"timjb","email":"tim@timbaumann.info"}],"time":{"modified":"2011-02-15T16:26:43.558Z","created":"2011-02-15T16:26:42.828Z","0.1.0":"2011-02-15T16:26:43.558Z"},"author":{"name":"Tim Baumann","email":"tim@timbaumann.info"},"repository":{"type":"git","url":"https://github.com/timjb/node-ardrone-web.git"},"_attachments":{"ardrone-web-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gRPKwNofh1KpkqHp4gNq+g==","length":24269,"stub":true}}}},
{"id":"arduino","key":"arduino","value":{"rev":"3-22f6359c47412d086d50dc7f1a994139"},"doc":{"_id":"arduino","_rev":"3-22f6359c47412d086d50dc7f1a994139","name":"arduino","description":"Control your Arduino with Node","dist-tags":{"latest":"0.2.3"},"versions":{"0.2.3":{"name":"arduino","version":"0.2.3","description":"Control your Arduino with Node","author":{"name":"Tobias Schneider","email":"schneider@uxebu.com"},"main":"./lib/arduino","contributors":[{"name":"Tobias Schneider","email":"schneider@uxebu.com"},{"name":"Chris Williams","email":"voodootikigod@gmail.com"}],"repository":{"type":"git","url":"git://github.com/voodootikigod/node-arduino.git"},"dependencies":{"serialport":">= 0.2.2"},"keywords":["arduino","serialport","robots"],"engines":{"node":">= 0.4.1 < 0.5.0"},"devDependencies":{},"_id":"arduino@0.2.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"4f7d7c7a22d411382c2ef1b45bb9ac838a114475","tarball":"http://registry.npmjs.org/arduino/-/arduino-0.2.3.tgz"},"scripts":{}}},"maintainers":[{"name":"voodootikigod","email":"chris@iterativedesigns.com"}],"time":{"modified":"2011-06-01T03:49:06.564Z","created":"2011-06-01T03:49:06.371Z","0.2.3":"2011-06-01T03:49:06.564Z"},"author":{"name":"Tobias Schneider","email":"schneider@uxebu.com"},"repository":{"type":"git","url":"git://github.com/voodootikigod/node-arduino.git"},"_attachments":{"arduino-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Bb0fItgYULZN3eomoyaoQw==","length":2161,"stub":true}}}},
{"id":"arduino-logger","key":"arduino-logger","value":{"rev":"3-ec7caeb441b304e747530a1ed37e97b8"},"doc":{"_id":"arduino-logger","_rev":"3-ec7caeb441b304e747530a1ed37e97b8","name":"arduino-logger","description":"A simple library to log the output from all arduino pins.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Raphie Palefsky-Smith","email":"me@raphieps.com","url":"raphieps.com"},"name":"arduino-logger","description":"A simple library to log the output from all arduino pins.","version":"0.0.0","repository":{"url":""},"dependencies":{"serialport":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"main":"arduino-logger","_npmUser":{"name":"Raphie","email":"me@raphieps.com"},"_id":"arduino-logger@0.0.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"05775e48ed581622d32d354ab16b65e75f38707d","tarball":"http://registry.npmjs.org/arduino-logger/-/arduino-logger-0.0.0.tgz"},"readme":"","maintainers":[{"name":"Raphie","email":"me@raphieps.com"}]}},"readme":"","maintainers":[{"name":"Raphie","email":"me@raphieps.com"}],"time":{"modified":"2012-05-29T18:49:22.746Z","created":"2012-05-29T18:49:21.461Z","0.0.0":"2012-05-29T18:49:22.746Z"},"author":{"name":"Raphie Palefsky-Smith","email":"me@raphieps.com","url":"raphieps.com"},"repository":{"url":""},"_attachments":{"arduino-logger-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZiIuat4dUvm1oUjfvnS6IA==","length":811,"stub":true}}}},
{"id":"ardus","key":"ardus","value":{"rev":"27-3097f8aa38f491e30ec302bf126bffca"},"doc":{"_id":"ardus","_rev":"27-3097f8aa38f491e30ec302bf126bffca","name":"ardus","description":"The mother of all profilers","dist-tags":{"latest":"0.6.0"},"versions":{"0.3.0":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.3.0","repository":{"type":"git","url":"git://github.com/bsgbryan/ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"65952f6bb73f4ffbc46598617714c4066a64b6fb","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.3.0.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.3.1":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.3.1","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.3.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f8ee6e187360fb1f6eeed037388c55d28c7c68d5","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.3.1.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.3.2":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.3.2","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"name":"https://github.com/bsgbryan/Ardus/issues"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.3.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e5113002bae6d691cc5c40265484cfa875d024f2","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.3.2.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.3.3":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.3.3","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.3.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"94a2c5f23a0c91fb2c0c8ab2646ae3eb9d493d2a","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.3.3.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.4.0":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.4.0","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.4.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"da30b9d8499ff76c40a274255507e14be5a043c3","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.4.0.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.0":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.0","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d8fc0304734f0d346c36301948dfff453f5a04c1","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.0.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.1":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.1","homepage":{"url":"https://github.com/bsgbryan/Ardus"},"repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4576f8be6fe2b766ac2c29f11d3334d9be2fb141","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.1.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.2":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.2","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"29dc16f7af53070f9b11c513ef36b163d05f8eed","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.2.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.3":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.3","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"45d46c5cfc021599fa60f35a724431283fd4510d","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.3.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.4":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.4","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"3af188c71a2bc775172210d11e76acdd65d1feb0","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.4.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.5":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.5","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"54bcbd9864672a753c5db5291d37291f5e162898","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.5.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.5.6":{"name":"ardus","description":"An easy to use collection of nice features (all related to profiling for now)","keywords":["decorator","utility","profiling"],"version":"0.5.6","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.5.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8be964ad6a67a008e088c454fa8500e6ede64822","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.5.6.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.6.0":{"name":"ardus","description":"The mother of all profilers","keywords":["decorator","utility","profiling"],"version":"0.6.0","homepage":"https://github.com/bsgbryan/Ardus","repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"main":"./lib/ardus","bugs":{"url":"https://github.com/bsgbryan/Ardus/issues"},"dependencies":{"microtime":"*","doctor":"*"},"devDependencies":{"tap":"*","underscore":"*"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"ardus@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"7cb39bacd853dfbfc5d3a3b624f1aa43ea883a1a","tarball":"http://registry.npmjs.org/ardus/-/ardus-0.6.0.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]}},"readme":"__Ardus is still under development, so be careful. There is at least one known issue that could bite you.__\n\n__You've been warned...__\n\n![pinch](https://github.com/jdeal/doctor/raw/master/README/pinch-points-warning-143.png)\n\n# Overview\n\nArdus is a module that provides easy access to helpful functionality. There are currently four types of functionality exposed by Ardus:\n\n* Collections - _Provide a consistent API to collections of useful objects_\n* Decorators - _Wrap functions and methods with valuable behavior_\n* Globals - _Provide a simple way to apply decorators to all compiled code_\n* Helpers - _functions that make life easier_\n\n## Collections\n\nThere are currently two types of collections:\n\n* Profiles - _All the data collected during a profiling run_\n* Hashes - _A key-value collection of hash values and their associated functions_\n\nThese collections are currently used only for profiling. They've been pulled out in case they can be used anywhere else.\n\n## Decorators\n\nThis is Ardus' meat & potatoes. Decorators are simply functions that wrap (or decorate) other functions.\n\nAn example of a decorator is:\n\n```javascript\nfunction decorate (fn) {\n  return function () {\n    console.log('Calling ' + fn.name);\n\n    fn.apply(this, arguments);\n\n    console.log(fn.name + ' completed');   \n  };\n}\n\nfunction foo() {\n  console.log(\"I'm running!\");\n}\n\nvar decorated = decorate(foo);\n\ndecorated();\n```\n\nExecuting the above code would produce:\n\n```\nCalling foo\nI'm running!\nfoo completed\n```\n\nThere are currently two decorators:\n\n* Profiler - _Records runtime execution information for decorated functions_\n* Require - _Wraps code loaded via node's `require` statement in a profiler decorator_\n\n## Globals\n\nGlobals simply apply a decorator (or multiple decorators) to all compiled code.\n\nArdus currently one global: the global profiler.\n\n### Core node code doesn't get wrapped via globals\n\nIt's important to note that core node code does not get decorated when using a global. This is because the core node code is compiled prior to the global's compilation, and therefore can't be decorated. To decorate core node code, please use the `require` decorator.\n\n## Helpers\n\nHelpers are basic utility functions. They exist solely to make life easier for you.\n\nThere are currently three helpers:\n\n* sha1 - _The hashing algorithm used by the Hashes collection_\n* summary - _A human readable version of the output from a run of the profiler decorator_\n* uuid - _A Universally Unique ID generator for functions_\n\n# Usage\n\nArdus has singular and pluralized methods for accessing all of the above-specified functionality.\n\nFor example, to get the profiler decorator:\n\n```javascript\nvar profile = require('ardus').decorator('profiler');\n```\n\n### Typing: less is more\n\nThere is a shortcut for accessing decorators:\n\n```javascript\nvar profile = require('ardus').profiler;\n```\n\n### Pluralized methods\n\nThe pluralized method works as follows:\n\n```javascript\nvar decorators = require('ardus').decorators('profiler', 'require');\n```\n\nThe above would return an object literal who's properties are the specified decorators:\n\n```javascript\ndecorators.profiler // The profiler decorator\ndecorators.require  // The require decorator\n```\n\n### A complete example\n\n```javascript\nvar ardus      = require('ardus'),\n    decorators = ardus.decorators('profiler', 'require'),\n    profiled   = decorators.profiler(function test () { console.log('This is a ' + this.name) }),\n    my         = decorators.require('path');\n\nvar thereYouAre = my.path.resolve('.');\n\nconsole.log('Where are you? ' + thereYouAre);\n\nprofiled();\n\n// We hook into the process exit event to make sure all callbacks have completed\nprocess.on('exit', function() {\n\tardus.helper('summary').generate();\n});\n```\n\n# Reporting issues\n\nI know you'll find issues, report them [here](https://github.com/bsgbryan/Ardus/issues). _KTHX_\n\n# Contributing\n\nIf there's anything you want to add/change, please feel free!\n\nSimply:\n\n* Fork Ardus\n* Create a topic local branch - git checkout -b topic_branch\n* Push to your local branch - git push origin topic_branch\n* Create a pull request: github.com/USERNAME/Ardus/pull/new/master\n* [Sing](http://g-ecx.images-amazon.com/images/G/01/dvd/lionsgate/barney/B_Sing_Dance_6_lg.jpg), [drink](http://blogs.bostonmagazine.com/chowder/files/2011/04/IMG_0174.jpg), and be happy\n\n# License\n\nArdus is Copyright © 2012 Bryan Maynard. It is free software, and may be redistributed under the terms specified in the [MIT LICENSE](https://github.com/bsgbryan/Ardus/raw/master/MIT LICENSE) file.","maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}],"time":{"modified":"2012-02-03T22:41:21.825Z","created":"2012-01-09T16:48:44.269Z","0.3.0":"2012-01-09T16:48:45.059Z","0.3.1":"2012-01-09T16:52:03.259Z","0.3.2":"2012-01-10T22:35:32.069Z","0.3.3":"2012-01-10T22:36:47.405Z","0.4.0":"2012-01-11T22:28:35.738Z","0.5.0":"2012-01-12T00:59:11.968Z","0.5.1":"2012-01-12T01:05:00.691Z","0.5.2":"2012-01-12T01:05:24.240Z","0.5.3":"2012-01-13T01:59:35.469Z","0.5.4":"2012-01-16T04:53:06.394Z","0.5.5":"2012-01-16T21:23:38.181Z","0.5.6":"2012-01-17T20:12:29.410Z","0.6.0":"2012-02-03T22:41:21.825Z"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"repository":{"type":"git","url":"git://github.com/bsgbryan/Ardus.git"},"_attachments":{"ardus-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-18469DuKLwnGm5yWVyTxfg==","length":15197,"stub":true},"ardus-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-cztlh1oJe4RtyQXgvx86UQ==","length":13526,"stub":true},"ardus-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-yGyLNjXyGxJTaL/KEIhJCw==","length":13237,"stub":true},"ardus-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-+6Kt87hG0WIEsh9x22WIaw==","length":13028,"stub":true},"ardus-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-0JAObrLOENGwa2Wndtnu3A==","length":20480,"stub":true},"ardus-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-kmK/9hEvs32nEUXFQIRKIg==","length":20480,"stub":true},"ardus-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-gQc35VXd6QBHaKMshVl7Ig==","length":20480,"stub":true},"ardus-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-D8h1aLylppWbm8677hLujw==","length":20480,"stub":true},"ardus-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-bftzaLN9PIxolHzpZKqMqA==","length":20480,"stub":true},"ardus-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-+7QY+mMqqQMfXVRWsM6XaQ==","length":20480,"stub":true},"ardus-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-//l73Nh2jCE8zH898FcDJQ==","length":20480,"stub":true},"ardus-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SCqtxRNf6KqbtgceyGWeJA==","length":20480,"stub":true},"ardus-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-s+d0PsHXmNC57IZEcehIFA==","length":20480,"stub":true}}}},
{"id":"arg","key":"arg","value":{"rev":"3-d23183ecf5b32c3ef7ef45747a35cb3c"},"doc":{"_id":"arg","_rev":"3-d23183ecf5b32c3ef7ef45747a35cb3c","name":"arg","description":"Simple arguments parser in 100 bytes","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"arg","main":"arg.js","description":"Simple arguments parser in 100 bytes","author":{"name":"Mikhail Davydov, http://bit.ly/JXLHCO"},"version":"0.0.1","keywords":["arg","args","arguments","arguments parser"],"engines":{"node":">=0.4.12"},"licenses":[{"type":"PUBLIC LICENSE","url":"http://bit.ly/JXKHyp"}],"repository":{"type":"git","url":"git://github.com/tnhu/arg.git"},"_npmUser":{"name":"tnhu","email":"tnhu@me.com"},"_id":"arg@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0601ff2031f8a76ae232a9337cdf761d1f1d5739","tarball":"http://registry.npmjs.org/arg/-/arg-0.0.1.tgz"},"readme":"","maintainers":[{"name":"tnhu","email":"tnhu@me.com"}]}},"readme":"","maintainers":[{"name":"tnhu","email":"tnhu@me.com"}],"time":{"modified":"2012-06-01T15:39:03.936Z","created":"2012-06-01T15:39:02.676Z","0.0.1":"2012-06-01T15:39:03.936Z"},"author":{"name":"Mikhail Davydov, http://bit.ly/JXLHCO"},"repository":{"type":"git","url":"git://github.com/tnhu/arg.git"},"_attachments":{"arg-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R9BlKe2/1+p7EcDKY3aZhg==","length":719,"stub":true}}}},
{"id":"argo","key":"argo","value":{"rev":"3-50c6b913c456ca6ddb3e540f25f27d01"},"doc":{"_id":"argo","_rev":"3-50c6b913c456ca6ddb3e540f25f27d01","name":"argo","description":"Render long JSON strings in readable formats","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"argo","version":"0.0.1","author":{"name":"John Manero","email":"john.manero@gmail.com"},"homepage":"https://github.com/jmanero/argo","description":"Render long JSON strings in readable formats","keywords":["JSON"],"bugs":{"url":"https://github.com/jmanero/argo/issues"},"repository":{"type":"git","url":"git://github.com/jmanero/argo.git"},"dependencies":{"colors":"*","express":"*","jade":"*"},"licenses":[{"type":"MIT","url":"http://github.com/jmanero/argo/blob/master/LICENSE"}],"engine":{"node":">=0.6.17"},"_npmUser":{"name":"jmanero","email":"john.manero@gmail.com"},"_id":"argo@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"17e5f4ff830dade626843b645d7d737da7615610","tarball":"http://registry.npmjs.org/argo/-/argo-0.0.1.tgz"},"maintainers":[{"name":"jmanero","email":"john.manero@gmail.com"}]}},"readme":"argo\n====\n\nA Node.js serverlet to display long JSON strings in a readable format. See http://en.wikipedia.org/wiki/Argonauts.","maintainers":[{"name":"jmanero","email":"john.manero@gmail.com"}],"time":{"modified":"2012-05-31T19:08:55.479Z","created":"2012-05-31T19:08:54.373Z","0.0.1":"2012-05-31T19:08:55.479Z"},"author":{"name":"John Manero","email":"john.manero@gmail.com"},"repository":{"type":"git","url":"git://github.com/jmanero/argo.git"},"_attachments":{"argo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Gpfwah/Yv7xE98el3bV1xQ==","length":76689,"stub":true}}}},
{"id":"argon","key":"argon","value":{"rev":"4-b71d1b92babb65d844b9bcdefc2372a1"},"doc":{"_id":"argon","_rev":"4-b71d1b92babb65d844b9bcdefc2372a1","name":"argon","description":"Function argument processing and validation","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"argon","description":"Function argument processing and validation","keywords":["validation"],"author":{"name":"Trevor Burnham"},"email":"trevorburnham@gmail.com","homepage":"http://github.com/TrevorBurnham/argon","repository":{"type":"git","url":"http://github.com/TrevorBurnham/argon.git"},"licenses":[{"type":"MIT"}],"version":"0.3.0","engines":{"node":">= 0.2.0"},"dependencies":{"err":">= 0.1.1","styout":">= 0.5.3","underscore":">= 1.1.3"},"directories":{"lib":"./lib"},"main":"./lib/argon","_id":"argon@0.3.0","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.2.5","dist":{"shasum":"ebeb7826ce6c363bf6c9a9d8a84ccd819c7a1922","tarball":"http://registry.npmjs.org/argon/-/argon-0.3.0.tgz"}}},"maintainers":[{"name":"TrevorBurnham","email":"trevorburnham@gmail.com"},{"name":"trevorburnham","email":"trevorburnham@gmail.com"}],"time":{"modified":"2012-03-09T16:20:00.048Z","created":"2011-01-06T04:13:43.702Z","0.3.0":"2011-01-06T04:13:44.606Z"},"author":{"name":"Trevor Burnham"},"repository":{"type":"git","url":"http://github.com/TrevorBurnham/argon.git"},"_attachments":{"argon-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1LuLyrB7OZc1mkzVC+4o/g==","length":5224,"stub":true}}}},
{"id":"argparse","key":"argparse","value":{"rev":"16-596e421ef56ad8da502679166eb53bbc"},"doc":{"_id":"argparse","_rev":"16-596e421ef56ad8da502679166eb53bbc","name":"argparse","description":"Very powerful CLI arguments parser. Native port of argparse - python's options parsing library","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"argparse","description":"Very powerful CLI arguments parser. Native port of argparse - python's options parsing library","version":"0.1.0","keywords":["cli","parser","argparse","option","args"],"homepage":"https://github.com/nodeca/argparse","author":{"name":"Eugene Shkuropat","email":"e.shkuropat@gmail.com"},"bugs":{"url":"https://github.com/nodeca/argparse/issues"},"license":{"type":"MIT","url":"https://github.com/nodeca/argparse/blob/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/nodeca/argparse.git"},"main":"./index.js","dependencies":{"underscore":"1.3.1","underscore.string":"2.1.1"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"vitaly","email":"vitaly@rcdesign.ru"},"_id":"argparse@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"141038690326bb1fe60c3aa2fd32e60252cdf3ea","tarball":"http://registry.npmjs.org/argparse/-/argparse-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}],"directories":{}},"0.1.1":{"name":"argparse","description":"Very powerful CLI arguments parser. Native port of argparse - python's options parsing library","version":"0.1.1","keywords":["cli","parser","argparse","option","args"],"homepage":"https://github.com/nodeca/argparse","author":{"name":"Eugene Shkuropat","email":"e.shkuropat@gmail.com"},"bugs":{"url":"https://github.com/nodeca/argparse/issues"},"license":{"type":"MIT","url":"https://github.com/nodeca/argparse/blob/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/nodeca/argparse.git"},"main":"./index.js","dependencies":{"underscore":"1.3.1","underscore.string":"2.1.1"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"vitaly","email":"vitaly@rcdesign.ru"},"_id":"argparse@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7898577c1e2a249f3e550cc48209acc1d939026e","tarball":"http://registry.npmjs.org/argparse/-/argparse-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}],"directories":{}},"0.1.2":{"name":"argparse","description":"Very powerful CLI arguments parser. Native port of argparse - python's options parsing library","version":"0.1.2","keywords":["cli","parser","argparse","option","args"],"homepage":"https://github.com/nodeca/argparse","author":{"name":"Eugene Shkuropat","email":"e.shkuropat@gmail.com"},"bugs":{"url":"https://github.com/nodeca/argparse/issues"},"license":{"type":"MIT","url":"https://github.com/nodeca/argparse/blob/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/nodeca/argparse.git"},"main":"./index.js","scripts":{"test":"make test"},"dependencies":{"underscore":"1.3.1","underscore.string":"2.1.1"},"devDependencies":{"mocha":"1.0.1"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"vitaly","email":"vitaly@rcdesign.ru"},"_id":"argparse@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"dab8a7925b091e24683e17f8bcf7d9a4bf00204a","tarball":"http://registry.npmjs.org/argparse/-/argparse-0.1.2.tgz"},"maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}],"directories":{}},"0.1.3":{"name":"argparse","description":"Very powerful CLI arguments parser. Native port of argparse - python's options parsing library","version":"0.1.3","keywords":["cli","parser","argparse","option","args"],"homepage":"https://github.com/nodeca/argparse","author":{"name":"Eugene Shkuropat","email":"e.shkuropat@gmail.com"},"bugs":{"url":"https://github.com/nodeca/argparse/issues"},"license":{"type":"MIT","url":"https://github.com/nodeca/argparse/blob/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/nodeca/argparse.git"},"main":"./index.js","scripts":{"test":"make test"},"dependencies":{"underscore":"~1.3.3","underscore.string":"~2.1.1"},"devDependencies":{"mocha":"~1.2.1"},"engines":{"node":">= 0.6.0"},"readme":"argparse\n========\n\n[![Build Status](https://secure.travis-ci.org/nodeca/argparse.png?branch=master)](http://travis-ci.org/nodeca/argparse)\n\nCLI arguments parser for node.js. Javascript port of python's\n[argparse](http://docs.python.org/dev/library/argparse.html) module\n(original version 3.2). That's a full port, except some very rare options,\nrecorded in issue tracker.\n\n**NB.** Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/).\n\n\nExample\n=======\n\ntest.js file:\n\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n  version: '0.0.1',\n  addHelp:true,\n  description: 'Argparse example'\n});\nparser.addArgument(\n  [ '-f', '--foo' ],\n  {\n    help: 'foo bar'\n  }\n);\nparser.addArgument(\n  [ '-b', '--bar' ],\n  {\n    help: 'bar foo'\n  }\n);\nvar args = parser.parseArgs();\nconsole.dir(args);\n```\n\nDisplay help:\n\n```\n$ ./test.js -h\nusage: example.js [-h] [-v] [-f FOO] [-b BAR]\n\nArgparse example\n\nOptional arguments:\n  -h, --help         Show this help message and exit.\n  -v, --version      Show program's version number and exit.\n  -f FOO, --foo FOO  foo bar\n  -b BAR, --bar BAR  bar foo\n```\n\nParse arguments:\n\n```\n$ ./test.js -f=3 --bar=4\n{ foo: '3', bar: '4' }\n```\n\nMore [examples](https://github.com/nodeca/argparse/tree/master/examples).\n\n\nArgumentParser objects\n======================\n\n```\nnew ArgumentParser({paramters hash});\n```\n\nCreates a new ArgumentParser object.\n\n**Supported params:**\n\n- ```description``` - Text to display before the argument help.\n- ```epilog``` - Text to display after the argument help.\n- ```addHelp``` - Add a -h/–help option to the parser. (default: True)\n- ```argumentDefault``` - Set the global default value for arguments. (default: None)\n- ```parents``` - A list of ArgumentParser objects whose arguments should also be included.\n- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘)\n- ```formatterClass``` - A class for customizing the help output.\n- ```prog``` - The name of the program (default: sys.argv[0])\n- ```usage``` - The string describing the program usage (default: generated)\n\n**Not supportied yet**\n\n- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read.\n- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals.\n\nDetails in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects)\n\n\naddArgument() method\n====================\n\n```\nArgumentParser.addArgument([names or flags], {options})\n```\n\nDefines how a single command-line argument should be parsed.\n\n- ```name or flags``` - Either a name or a list of option strings, e.g. foo or -f, --foo.\n\nOptions:\n\n- ```action``` - The basic type of action to be taken when this argument is encountered at the command line.\n- ```nargs```- The number of command-line arguments that should be consumed.\n- ```constant``` - A constant value required by some action and nargs selections.\n- ```defaultValue``` - The value produced if the argument is absent from the command line.\n- ```type``` - The type to which the command-line argument should be converted.\n- ```choices``` - A container of the allowable values for the argument.\n- ```required``` - Whether or not the command-line option may be omitted (optionals only).\n- ```help``` - A brief description of what the argument does.\n- ```metavar``` - A name for the argument in usage messages.\n- ```dest``` - The name of the attribute to be added to the object returned by parseArgs().\n\nDetails in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method)\n\n\nAction (some details)\n================\n\nArgumentParser objects associate command-line arguments with actions.\nThese actions can do just about anything with the command-line arguments associated\nwith them, though most actions simply add an attribute to the object returned by\nparseArgs(). The action keyword argument specifies how the command-line arguments\nshould be handled. The supported actions are:\n\n- ```store``` - Just stores the argument’s value. This is the default action.\n- ```storeConstant``` - Stores value, specified by the const keyword argument.\n  (Note that the const keyword argument defaults to the rather unhelpful None.)\n  The 'storeConstant' action is most commonly used with optional arguments, that\n  specify some sort of flag.\n- ```storeTrue``` and ```storeFalse``` - Stores values True and False\n  respectively. These are special cases of 'storeConstant'.\n- ```append``` - Stores a list, and appends each argument value to the list.\n  This is useful to allow an option to be specified multiple times.\n- ```appendConst``` - Stores a list, and appends value, specified by the\n  const keyword argument to the list. (Note, that the const keyword argument defaults\n  is None.) The 'appendConst' action is typically used when multiple arguments need\n  to store constants to the same list.\n- ```count``` - Counts the number of times a keyword argument occurs. For example,\n  used for increasing verbosity levels.\n- ```help``` - Prints a complete help message for all the options in the current\n  parser and then exits. By default a help action is automatically added to the parser.\n  See ArgumentParser for details of how the output is created.\n- ```version``` - Prints version information and exit. Expects a `version=`\n  keyword argument in the addArgument() call.\n\nDetails in [original action guide](http://docs.python.org/dev/library/argparse.html#action)\n\n\nSub-commands\n============\n\nArgumentParser.addSubparsers()\n\nMany programs split their functionality into a number of sub-commands, for\nexample, the svn program can invoke sub-commands like `svn checkout`, `svn update`,\nand `svn commit`. Splitting up functionality this way can be a particularly good\nidea when a program performs several different functions which require different\nkinds of command-line arguments. `ArgumentParser` supports creation of such\nsub-commands with `addSubparsers()` method. The `addSubparsers()` method is\nnormally called with no arguments and returns an special action object.\nThis object has a single method `addParser()`, which takes a command name and\nany `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object\nthat can be modified as usual.\n\nExample:\n\nsub_commands.js\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n  version: '0.0.1',\n  addHelp:true,\n  description: 'Argparse examples: sub-commands',\n});\n\nvar subparsers = parser.addSubparsers({\n  title:'subcommands',\n  dest:\"subcommand_name\"\n});\n\nvar bar = subparsers.addParser('c1', {addHelp:true});\nbar.addArgument(\n  [ '-f', '--foo' ],\n  {\n    action: 'store',\n    help: 'foo3 bar3'\n  }\n);\nvar bar = subparsers.addParser(\n  'c2',\n  {aliases:['co'], addHelp:true}\n);\nbar.addArgument(\n  [ '-b', '--bar' ],\n  {\n    action: 'store',\n    type: 'int',\n    help: 'foo3 bar3'\n  }\n);\n\nvar args = parser.parseArgs();\nconsole.dir(args);\n\n```\n\nDetails in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands)\n\n\nAuthor\n======\n\n[Eugene Shkuropat](https://github.com/shkuropat)\n\n\nLicense\n=======\n\nCopyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin).\nReleased under the MIT license. See\n[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details.\n\n\n","_id":"argparse@0.1.3","dist":{"shasum":"e1a6a760f372b4082080da00b3ed13b46d42badf","tarball":"http://registry.npmjs.org/argparse/-/argparse-0.1.3.tgz"},"maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}]},"0.1.4":{"name":"argparse","description":"Very powerful CLI arguments parser. Native port of argparse - python's options parsing library","version":"0.1.4","keywords":["cli","parser","argparse","option","args"],"homepage":"https://github.com/nodeca/argparse","author":{"name":"Eugene Shkuropat","email":"e.shkuropat@gmail.com"},"bugs":{"url":"https://github.com/nodeca/argparse/issues"},"license":{"type":"MIT","url":"https://github.com/nodeca/argparse/blob/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/nodeca/argparse.git"},"main":"./index.js","scripts":{"test":"make test"},"dependencies":{"underscore":"~1.3.3","underscore.string":"~2.1.1"},"devDependencies":{"mocha":"~1.2.1"},"engines":{"node":">= 0.6.0"},"readme":"argparse\n========\n\n[![Build Status](https://secure.travis-ci.org/nodeca/argparse.png?branch=master)](http://travis-ci.org/nodeca/argparse)\n\nCLI arguments parser for node.js. Javascript port of python's\n[argparse](http://docs.python.org/dev/library/argparse.html) module\n(original version 3.2). That's a full port, except some very rare options,\nrecorded in issue tracker.\n\n**NB.** Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/).\n\n\nExample\n=======\n\ntest.js file:\n\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n  version: '0.0.1',\n  addHelp:true,\n  description: 'Argparse example'\n});\nparser.addArgument(\n  [ '-f', '--foo' ],\n  {\n    help: 'foo bar'\n  }\n);\nparser.addArgument(\n  [ '-b', '--bar' ],\n  {\n    help: 'bar foo'\n  }\n);\nvar args = parser.parseArgs();\nconsole.dir(args);\n```\n\nDisplay help:\n\n```\n$ ./test.js -h\nusage: example.js [-h] [-v] [-f FOO] [-b BAR]\n\nArgparse example\n\nOptional arguments:\n  -h, --help         Show this help message and exit.\n  -v, --version      Show program's version number and exit.\n  -f FOO, --foo FOO  foo bar\n  -b BAR, --bar BAR  bar foo\n```\n\nParse arguments:\n\n```\n$ ./test.js -f=3 --bar=4\n{ foo: '3', bar: '4' }\n```\n\nMore [examples](https://github.com/nodeca/argparse/tree/master/examples).\n\n\nArgumentParser objects\n======================\n\n```\nnew ArgumentParser({paramters hash});\n```\n\nCreates a new ArgumentParser object.\n\n**Supported params:**\n\n- ```description``` - Text to display before the argument help.\n- ```epilog``` - Text to display after the argument help.\n- ```addHelp``` - Add a -h/–help option to the parser. (default: True)\n- ```argumentDefault``` - Set the global default value for arguments. (default: None)\n- ```parents``` - A list of ArgumentParser objects whose arguments should also be included.\n- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘)\n- ```formatterClass``` - A class for customizing the help output.\n- ```prog``` - The name of the program (default: sys.argv[0])\n- ```usage``` - The string describing the program usage (default: generated)\n\n**Not supportied yet**\n\n- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read.\n- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals.\n\nDetails in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects)\n\n\naddArgument() method\n====================\n\n```\nArgumentParser.addArgument([names or flags], {options})\n```\n\nDefines how a single command-line argument should be parsed.\n\n- ```name or flags``` - Either a name or a list of option strings, e.g. foo or -f, --foo.\n\nOptions:\n\n- ```action``` - The basic type of action to be taken when this argument is encountered at the command line.\n- ```nargs```- The number of command-line arguments that should be consumed.\n- ```constant``` - A constant value required by some action and nargs selections.\n- ```defaultValue``` - The value produced if the argument is absent from the command line.\n- ```type``` - The type to which the command-line argument should be converted.\n- ```choices``` - A container of the allowable values for the argument.\n- ```required``` - Whether or not the command-line option may be omitted (optionals only).\n- ```help``` - A brief description of what the argument does.\n- ```metavar``` - A name for the argument in usage messages.\n- ```dest``` - The name of the attribute to be added to the object returned by parseArgs().\n\nDetails in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method)\n\n\nAction (some details)\n================\n\nArgumentParser objects associate command-line arguments with actions.\nThese actions can do just about anything with the command-line arguments associated\nwith them, though most actions simply add an attribute to the object returned by\nparseArgs(). The action keyword argument specifies how the command-line arguments\nshould be handled. The supported actions are:\n\n- ```store``` - Just stores the argument’s value. This is the default action.\n- ```storeConstant``` - Stores value, specified by the const keyword argument.\n  (Note that the const keyword argument defaults to the rather unhelpful None.)\n  The 'storeConstant' action is most commonly used with optional arguments, that\n  specify some sort of flag.\n- ```storeTrue``` and ```storeFalse``` - Stores values True and False\n  respectively. These are special cases of 'storeConstant'.\n- ```append``` - Stores a list, and appends each argument value to the list.\n  This is useful to allow an option to be specified multiple times.\n- ```appendConst``` - Stores a list, and appends value, specified by the\n  const keyword argument to the list. (Note, that the const keyword argument defaults\n  is None.) The 'appendConst' action is typically used when multiple arguments need\n  to store constants to the same list.\n- ```count``` - Counts the number of times a keyword argument occurs. For example,\n  used for increasing verbosity levels.\n- ```help``` - Prints a complete help message for all the options in the current\n  parser and then exits. By default a help action is automatically added to the parser.\n  See ArgumentParser for details of how the output is created.\n- ```version``` - Prints version information and exit. Expects a `version=`\n  keyword argument in the addArgument() call.\n\nDetails in [original action guide](http://docs.python.org/dev/library/argparse.html#action)\n\n\nSub-commands\n============\n\nArgumentParser.addSubparsers()\n\nMany programs split their functionality into a number of sub-commands, for\nexample, the svn program can invoke sub-commands like `svn checkout`, `svn update`,\nand `svn commit`. Splitting up functionality this way can be a particularly good\nidea when a program performs several different functions which require different\nkinds of command-line arguments. `ArgumentParser` supports creation of such\nsub-commands with `addSubparsers()` method. The `addSubparsers()` method is\nnormally called with no arguments and returns an special action object.\nThis object has a single method `addParser()`, which takes a command name and\nany `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object\nthat can be modified as usual.\n\nExample:\n\nsub_commands.js\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n  version: '0.0.1',\n  addHelp:true,\n  description: 'Argparse examples: sub-commands',\n});\n\nvar subparsers = parser.addSubparsers({\n  title:'subcommands',\n  dest:\"subcommand_name\"\n});\n\nvar bar = subparsers.addParser('c1', {addHelp:true});\nbar.addArgument(\n  [ '-f', '--foo' ],\n  {\n    action: 'store',\n    help: 'foo3 bar3'\n  }\n);\nvar bar = subparsers.addParser(\n  'c2',\n  {aliases:['co'], addHelp:true}\n);\nbar.addArgument(\n  [ '-b', '--bar' ],\n  {\n    action: 'store',\n    type: 'int',\n    help: 'foo3 bar3'\n  }\n);\n\nvar args = parser.parseArgs();\nconsole.dir(args);\n\n```\n\nDetails in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands)\n\n\nAuthor\n======\n\n[Eugene Shkuropat](https://github.com/shkuropat)\n\n\nLicense\n=======\n\nCopyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin).\nReleased under the MIT license. See\n[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details.\n\n\n","_id":"argparse@0.1.4","dist":{"shasum":"72ca942eb911bf18a011144361f3607c71ab4cfe","tarball":"http://registry.npmjs.org/argparse/-/argparse-0.1.4.tgz"},"maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}]}},"readme":"argparse\n========\n\nCLI arguments parser for node.js. Javascript port of python's\n[argparse](http://docs.python.org/dev/library/argparse.html) module\n(original version 3.2). That's a full port, except some very rare options,\nrecorded in issue tracker.\n\n**NB.** Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/).\n\n\nExample\n=======\n\ntest.js file:\n\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n  version: '0.0.1',\n  addHelp:true,\n  description: 'Argparse example'\n});\nparser.addArgument(\n  [ '-f', '--foo' ],\n  {\n    help: 'foo bar'\n  }\n);\nparser.addArgument(\n  [ '-b', '--bar' ],\n  {\n    help: 'bar foo'\n  }\n);\nvar args = parser.parseArgs('-f 1 -b2'.split(' '));\nconsole.dir(args);\n```\n\nDisplay help:\n\n```\n$ ./test.js -h\nusage: example.js [-h] [-v] [-f FOO] [-b BAR]\n\nArgparse example\n\nOptional arguments:\n  -h, --help         Show this help message and exit.\n  -v, --version      Show program's version number and exit.\n  -f FOO, --foo FOO  foo bar\n  -b BAR, --bar BAR  bar foo\n```\n\nParse arguments:\n\n```\n$ ./test.js -f=3 --bar=4\n{ foo: '3', bar: '4' }\n```\n\nMore [examples](https://github.com/nodeca/argparse/tree/master/examples).\n\n\nArgumentParser objects\n======================\n\n```\nnew ArgumentParser({paramters hash});\n```\n\nCreates a new ArgumentParser object.\n\n**Supported params:**\n\n- ```description``` - Text to display before the argument help.\n- ```epilog``` - Text to display after the argument help.\n- ```addHelp``` - Add a -h/–help option to the parser. (default: True)\n- ```argumentDefault``` - Set the global default value for arguments. (default: None)\n- ```parents``` - A list of ArgumentParser objects whose arguments should also be included.\n- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘)\n- ```formatterClass``` - A class for customizing the help output.\n- ```prog``` - The name of the program (default: sys.argv[0])\n- ```usage``` - The string describing the program usage (default: generated)\n\n**Not supportied yet**\n\n- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read.\n- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals.\n\nDetails in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects)\n\n\naddArgument() method\n====================\n\n```\nArgumentParser.addArgument([names or flags], {options})\n```\n\nDefines how a single command-line argument should be parsed.\n\n- ```name or flags``` - Either a name or a list of option strings, e.g. foo or -f, --foo.\n\nOptions:\n\n- ```action``` - The basic type of action to be taken when this argument is encountered at the command line.\n- ```nargs```- The number of command-line arguments that should be consumed.\n- ```constant``` - A constant value required by some action and nargs selections.\n- ```defaultValue``` - The value produced if the argument is absent from the command line.\n- ```type``` - The type to which the command-line argument should be converted.\n- ```choices``` - A container of the allowable values for the argument.\n- ```required``` - Whether or not the command-line option may be omitted (optionals only).\n- ```help``` - A brief description of what the argument does.\n- ```metavar``` - A name for the argument in usage messages.\n- ```dest``` - The name of the attribute to be added to the object returned by parseArgs().\n\nDetails in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method)\n\n\nAction (some details)\n================\n\nArgumentParser objects associate command-line arguments with actions.\nThese actions can do just about anything with the command-line arguments associated\nwith them, though most actions simply add an attribute to the object returned by\nparseArgs(). The action keyword argument specifies how the command-line arguments\nshould be handled. The supported actions are:\n\n- ```store``` - Just stores the argument’s value. This is the default action.\n- ```storeConstant``` - Stores value, specified by the const keyword argument.\n  (Note that the const keyword argument defaults to the rather unhelpful None.)\n  The 'storeConstant' action is most commonly used with optional arguments, that\n  specify some sort of flag.\n- ```storeTrue``` and ```storeFalse``` - Stores values True and False\n  respectively. These are special cases of 'storeConstant'.\n- ```append``` - Stores a list, and appends each argument value to the list.\n  This is useful to allow an option to be specified multiple times.\n- ```appendConst``` - Stores a list, and appends value, specified by the\n  const keyword argument to the list. (Note, that the const keyword argument defaults\n  is None.) The 'appendConst' action is typically used when multiple arguments need\n  to store constants to the same list.\n- ```count``` - Counts the number of times a keyword argument occurs. For example,\n  used for increasing verbosity levels.\n- ```help``` - Prints a complete help message for all the options in the current\n  parser and then exits. By default a help action is automatically added to the parser.\n  See ArgumentParser for details of how the output is created.\n- ```version``` - Prints version information and exit. Expects a `version=`\n  keyword argument in the addArgument() call.\n\nDetails in [original action guide](http://docs.python.org/dev/library/argparse.html#action)\n\n\nSub-commands\n============\n\nArgumentParser.addSubparsers()\n\nMany programs split their functionality into a number of sub-commands, for\nexample, the svn program can invoke sub-commands like `svn checkout`, `svn update`,\nand `svn commit`. Splitting up functionality this way can be a particularly good\nidea when a program performs several different functions which require different\nkinds of command-line arguments. `ArgumentParser` supports creation of such\nsub-commands with `addSubparsers()` method. The `addSubparsers()` method is\nnormally called with no arguments and returns an special action object.\nThis object has a single method `addParser()`, which takes a command name and\nany `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object\nthat can be modified as usual.\n\nExample:\n\nsub_commands.js\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n  version: '0.0.1',\n  addHelp:true,\n  description: 'Argparse examples: sub-commands',\n});\n\nvar subparsers = parser.addSubparsers({\n  title:'subcommands',\n  dest:\"subcommand_name\"\n});\n\nvar bar = subparsers.addParser('c1', {addHelp:true});\nbar.addArgument(\n  [ '-f', '--foo' ],\n  {\n    action: 'store',\n    help: 'foo3 bar3'\n  }\n);\nvar bar = subparsers.addParser(\n  'c2',\n  {aliases:['co'], addHelp:true}\n);\nbar.addArgument(\n  [ '-b', '--bar' ],\n  {\n    action: 'store',\n    type: 'int',\n    help: 'foo3 bar3'\n  }\n);\n\n```\n\nDetails in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands)\n\n\nAuthor\n======\n\n[Eugene Shkuropat](https://github.com/shkuropat)\n\n\nLicense\n=======\n\nCopyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin).\nReleased under the MIT license. See\n[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details.\n\n\n","maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}],"time":{"modified":"2012-08-02T13:43:55.031Z","created":"2012-05-16T20:16:27.775Z","0.1.0":"2012-05-16T20:16:30.136Z","0.1.1":"2012-05-23T06:20:01.344Z","0.1.2":"2012-05-29T10:00:31.477Z","0.1.3":"2012-07-04T11:20:25.948Z","0.1.4":"2012-07-30T07:33:17.434Z"},"author":{"name":"Eugene Shkuropat","email":"e.shkuropat@gmail.com"},"repository":{"type":"git","url":"git://github.com/nodeca/argparse.git"},"users":{"fgribreau":true},"_attachments":{"argparse-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-YQ3inO+5bH5yPTFnR996DA==","length":30413,"stub":true},"argparse-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ON/Z5QrvRjbbj35N6hVB0Q==","length":30045,"stub":true},"argparse-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oLI4V9yXcaIaonjHKc3UaQ==","length":29860,"stub":true},"argparse-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OCJaTglbgVDY3eqivGD2FQ==","length":28892,"stub":true},"argparse-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2rnSy66jSv6Cb2tsVhSjOg==","length":28561,"stub":true}}}},
{"id":"argparser","key":"argparser","value":{"rev":"39-fb42176942dfb78b9c0c30ad4c315692"},"doc":{"_id":"argparser","_rev":"39-fb42176942dfb78b9c0c30ad4c315692","name":"argparser","description":"object to parse commandline-args and options.","dist-tags":{"latest":"0.2.1"},"versions":{"0.0.1":{"name":"argparser","version":"0.0.1","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_id":"argparser@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8f08d4acbfa433d204480364826c6d38d36083e2","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.1.tgz"}},"0.0.2":{"name":"argparser","version":"0.0.2","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_id":"argparser@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f0cd88b05615215ca0b4b5389feb7d8ff91bc090","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.2.tgz"}},"0.0.3":{"name":"argparser","version":"0.0.3","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_id":"argparser@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"313bc9678fcf7f7d5e991b015f5ace650b219530","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.3.tgz"}},"0.0.4":{"name":"argparser","version":"0.0.4","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_id":"argparser@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"df30aff596dac7721e4434c8c9457431e0707793","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.4.tgz"}},"0.0.5":{"name":"argparser","version":"0.0.5","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","dependencies":{},"devDependencies":{},"_id":"argparser@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"25dbf47a3bcab9eb12f3d0b6b5f1d08df3370c6e","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.5.tgz"},"scripts":{},"directories":{}},"0.0.6":{"name":"argparser","version":"0.0.6","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","dependencies":{},"devDependencies":{},"_id":"argparser@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f1487422cfc308eaf5d46d9c97d7288ae7a726da","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.6.tgz"},"scripts":{},"directories":{}},"0.0.7":{"name":"argparser","version":"0.0.7","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","dependencies":{},"devDependencies":{},"_id":"argparser@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"96cab2010052bcae70d82f44556c41860069709f","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.7.tgz"},"scripts":{},"directories":{}},"0.0.8":{"name":"argparser","version":"0.0.8","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","dependencies":{},"devDependencies":{},"_id":"argparser@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ded274b423f67463697a81a911f5ab015e36dba3","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.8.tgz"},"scripts":{},"directories":{}},"0.0.9":{"name":"argparser","version":"0.0.9","description":"object to parse commandline-args and options.","tags":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.0.9","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"5ea66c3d72cceed4c8fd241d7e4da4784d8496c5","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.0.9.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.1.0":{"name":"argparser","version":"0.1.0","description":"object to parse commandline-args and options.","keywords":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"2b8ca4517117a15d949b8fca7854e59a8f8510d1","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.1.0.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.1.1":{"name":"argparser","version":"0.1.1","description":"object to parse commandline-args and options.","keywords":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.1.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"d490bfae5293e4009a1be5f01a687de21df959ba","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.1.1.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.1.2":{"name":"argparser","version":"0.1.2","description":"object to parse commandline-args and options.","keywords":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.1.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"b8829b8538c396fa6d32edddc1fc5f505f4a388c","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.1.2.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.1.3":{"name":"argparser","version":"0.1.3","description":"object to parse commandline-args and options.","keywords":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.1.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"5e74d731b963b226ca59ede5cf047940475e5e70","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.1.3.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.2.0":{"name":"argparser","version":"0.2.0","description":"object to parse commandline-args and options.","keywords":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"15ce08772f4ccfa63080284894659352b0bd43a3","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.2.0.tgz"},"readme":"argparser\n==================\n[Node.js] Parses command line args and options.\n\n## Installation ##\n    git clone git://github.com/shinout/argparser.git\n\n    OR\n\n    npm install argparser\n\n## Usage ##\n\na command \n\n    node script.js -r --num 100 file1.txt 11\n\nin script.js\n\n    var ap = require('argparser')\n             .files(0)\n             .nums(1, \"num\")\n             .nonvals('r')\n             .parse();\n\n    var file = ap.arg(0) // \"file1.txt\"\n    var n    = ap.arg(1) // 11\n    var num  = ap.opt(\"num\") // 100\n    var r    = ap.opt(\"r\")   // true\n\n## API Documentation ##\n- ArgParser.create()\n- ap.vals()\n- ap.nonvals()\n- ap.files()\n- ap.dirs()\n- ap.nums()\n- ap.defaults()\n- ap.parse(arr)\n- ap.opt(op1, op2, ...)\n- ap.arg()\n- ap.stringify()\n- ap.invalids()\n- ap.emptyValue\n\n### ArgParser.create() ###\nCreates an instance of ArgParser.\n\n    var ap = ArgParser.create().parse();\n\nThis can be omitted using **shortcut methods**.\n\nReturns an instance of ArgParser.\n\n### ap.vals() ###\nAdds options with value.\n\na command \n\n    node script.js --seq ACTG -n 1\n\nin script.js\n\n    var ap = require('argparser')\n             .vals(\"n\", \"seq\")\n             .parse();\n\n    var n   = ap.opt(\"n\")   // \"1\"\n    var seq = ap.opt(\"seq\") // \"ACTG\"\n\n\"--\" is used for long option name (more than one characters).\n\n\"-\" is used for short option name (just one character).\n\n    node script.js --long long -s short\n\nReturns this.\n\n### ap.nonvals() ###\nAdds options without values.\n\na command \n\n    node script.js -t --no-save\n\nin script.js\n\n    var ap = require('argparser')\n             .nonvals(\"t\", \"no-save\")\n             .parse();\n\n    var t      = ap.opt(\"t\")       // true\n    var nosave = ap.opt(\"no-save\") // true\n\n\"--\" is used for long option name (more than one characters).\n\n\"-\" is used for short option name (just one character).\n\n    node script.js --long -s\n\nReturns this.\n\n### ap.files() ###\nSpecifies an argument or an option is a file.\n\nThese values are checked in **ap.parse()**.\n\nIf there is an invalid filename, an exception is thrown.\n\na command \n\n    node script.js --txt foo.txt bar.txt\n\nin script.js\n\n    var ap = require('argparser')\n             .files(\"txt\", 0)\n             .parse();\n\n    var txt    = ap.opt(\"txt\")  // \"foo.txt\"\n    var nosave = ap.arg(0)      // \"bar.txt\"\n\n\"0\" in the example means the first argument.\n\n\"1\" will be the second, and so on.\n\nWe don't need to call **ap.vals()** to the option name used in **ap.files()**.\n\nReturns this.\n\n\n### ap.dirs() ###\nSpecifies an argument or an option is a directory.\n\nThe same specs as **ap.files()**.\n\nReturns this.\n\n### ap.nums() ###\nSpecifies an argument or an option is a number.\n\nIf isNaN, an exception is thrown.\n\na command \n\n    node script.js -n 11 bar.txt 300\n\nin script.js\n\n    var ap = require('argparser')\n             .files(0)\n             .nums(\"n\", 1)\n             .parse();\n\n    var file   = ap.arg(0)   // \"bar.txt\"\n    var n      = ap.opt(\"n\") // 11 \n    console.log(typeof n) // \"number\"\n    var num    = ap.arg(1) // 300\n    console.log(typeof num) // \"number\"\n\nThe same specs as **ap.files()**.\n\nReturns this.\n\n\n### ap.defaults(obj, noSetNums) ###\nset default values to options with a value.\n\na command \n\n    node script.js\n\nin script.js\n\n    var ap = require('argparser')\n             .defaults({\n               n : 3,\n               file : \"file1.txt\"\n              })\n             .files(\"file\")\n             .parse();\n\n    var n = ap.opt(\"n\") // 3\n    var file = ap.opt(\"file\") // \"file1.txt\"\n\nIf **noSetNums** is true, **ap.nums()** is not called to options\nwhose default value is number.\nBy default, **ap.nums()** are called to these options automatically.\n\n\n### ap.parse(arr) ###\nParses arguments.\n\n**arr** is optional.\n\nIf **arr** is not set, parses **process.argv** (without process.argv[0] and process.argv[1]).\n\n    var ap = require('argparser').files(0, \"f\").parse([\"-f\", \"file1.txt\", \"file2.txt\"]);\n    var f  = ap.opt(\"f\"); // \"file1.txt\"\n    var f2 = ap.arg(0);   // \"file2.txt\"\n\n\n### ap.arg() ###\nGet arguments. \n\na command \n\n    node script.js arg1 arg2 --opt arg3 --valopt optval\n\nin script.js\n\n    var ap = require('argparser')\n             .vals(\"valopt\")\n             .nonvals(\"opt\")\n             .parse();\n\n    var a1 = ap.arg(0); // arg1\n    var a2 = ap.arg(1); // arg2\n    var a3 = ap.arg(2); // arg3\n    var a4 = ap.arg(3); // undefined\n\n\n### ap.opt(op1, op2, ...) ###\nGet options value.\n\na command \n\n    node script.js -o --valopt optval arg1 --aaa\n \nin script.js\n\n    var ap = require('argparser')\n             .vals(\"valopt\", \"v2\")\n             .nonvals(\"o\", \"opt\")\n             .parse();\n\nWhen registered vals options are passed, returns the value.\n\n    var o1 = ap.opt(\"valopt\"); // \"optval\"\n\nWhen registered nonvals options are passed, returns true.\n\n    var o2 = ap.opt(\"o\");      // true\n\n\nWhen registered options are not passed, returns **ap.emptyValue**.\n    \n    console.log(ap.emptyValue) // false\n    var o3 = ap.opt(\"opt\");    // false\n    var o4 = ap.opt(\"v2\");     // false\n\n**ap.emptyValue** is writable.\n\n\nIf multiple arguments are passed, the first matched value is returned.\n\n    var o3 = ap.opt(\"opt\", \"o\");    // true\n    var o4 = ap.opt(\"valopt\", \"v2); // \"optval\"\n\n\nWhen not a registered option is passed, it is parsed as an invalid nonval option.\n\n    var o5 = ap.opt(\"aaa\");    // true\n    var o6 = ap.invalids();    // [\"aaa\"]\n    var o7 = ap.opt(\"eee\");    // undefined\n\n\n### ap.emptyValue ###\nWhen a registered options is not set, this value is returned in **ap.opt()**.\n\n    ap.emptyValue = null\n\n\n### ap.invalids() ###\nGets a list of invalid options.\n\na command \n\n    node script.js -a --bcd\n\nin script.js\n\n    var ap = require('argparser').parse();\n    var list = ap.invalid();\n    console.log(list); // \"a\", \"bcd\"\n\n\n### ap.stringify() ###\nGets canonical format.\n\na command \n\n    node script.js -a 1 arg1 -t --invalid_opt --bcd file.txt arg2 arg3\n\nin script.js\n\n    var ap = require('argparser')\n             .vals(\"a\", \"bcd\")\n             .nonvals(\"t\")\n             .parse();\n    console.log(ap.stringify()); // -t -a 1 --bcd file.txt arg1 arg2 arg3\n\n**Note that invalid options are removed.**\n\n## shortcut methods ##\n\n- ArgParser.vals()\n- ArgParser.nonvals()\n- ArgParser.files()\n- ArgParser.dirs()\n- ArgParser.nums()\n- ArgParser.defaults()\n- ArgParser.parse()\n\n    ArgParser.vals(\"a\")\n\nis completely equivalent to\n\n    ArgParser.create().vals(\"a\")\n\n## licence ##\n(The MIT License)\n\nCopyright (c) 2011-2012 SHIN Suzuki <shinout310@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.2.1":{"name":"argparser","version":"0.2.1","description":"object to parse commandline-args and options.","keywords":["getopt","arguments","option","getopts","command"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"bugs":{"url":"https://github.com/shinout/argparser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/argparser/raw/master/LICENCE"}],"main":"./ArgParser.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"argparser@0.2.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"caa448afd3b847e4d79d83b82db44869cd1778e7","tarball":"http://registry.npmjs.org/argparser/-/argparser-0.2.1.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]}},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"time":{"modified":"2012-03-07T03:12:51.394Z","created":"2011-04-28T03:16:39.903Z","0.0.1":"2011-04-28T03:16:40.529Z","0.0.2":"2011-04-28T04:05:40.256Z","0.0.3":"2011-04-28T05:06:25.868Z","0.0.4":"2011-04-28T05:19:47.982Z","0.0.5":"2011-06-16T06:54:52.751Z","0.0.6":"2011-06-16T07:20:21.115Z","0.0.7":"2011-06-16T07:45:39.791Z","0.0.8":"2011-07-19T01:53:59.068Z","0.0.9":"2011-10-29T17:45:29.112Z","0.1.0":"2012-02-18T14:07:36.982Z","0.1.1":"2012-02-18T14:38:57.017Z","0.1.2":"2012-02-19T15:17:22.690Z","0.1.3":"2012-02-22T05:57:20.481Z","0.2.0":"2012-02-24T04:32:33.699Z","0.2.1":"2012-03-07T03:12:51.394Z"},"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/argparser.git"},"_attachments":{"argparser-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-xDAQfrRn76VpxLAPwEJjDw==","length":6580,"stub":true},"argparser-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-RayyeYVDKH9gMX9pmYJWDg==","length":6121,"stub":true},"argparser-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-S7Qy07gl0m/ZLgGYyRjXsg==","length":6907,"stub":true},"argparser-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-C1oD7dAlwen0xv4UHVJjWg==","length":6784,"stub":true},"argparser-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-7+GNqO7UhL3Rv2+2xhkTwQ==","length":6647,"stub":true},"argparser-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-YDUCddRGn6RZXLqAoWMxvw==","length":6516,"stub":true},"argparser-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-UYYTlm6BIg5ifmz8vNcpsg==","length":5500,"stub":true},"argparser-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-dkYgKdnpn20+xSFAnuLvIw==","length":5396,"stub":true},"argparser-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-AaHmcy7NdKBnsmJ1LjNpSg==","length":5197,"stub":true},"argparser-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-VWE0cMRmux48XKNgWu37Ow==","length":5101,"stub":true},"argparser-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Kl2ZL3Bvm4+sFYS4bhIJQA==","length":4803,"stub":true},"argparser-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-JdNv56+rylrBJHYsrypsJw==","length":4715,"stub":true},"argparser-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pEi+R/iLIFAQCtFevBLI3A==","length":4605,"stub":true},"argparser-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1TsQedrJThXBNOaLE9mz8A==","length":4559,"stub":true},"argparser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TQEMxZFMcZV2YZtdt44EFg==","length":4357,"stub":true}}}},
{"id":"args","key":"args","value":{"rev":"18-aa96d2a8455bba73c527b5bc98aa1333"},"doc":{"_id":"args","_rev":"18-aa96d2a8455bba73c527b5bc98aa1333","name":"args","description":"Command line arguments parser","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"args","version":"0.0.1","description":"Command line arguments parser","keywords":["args","cli","arguments","parser","toolset"],"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"preferGlobal":false,"private":false,"engines":{"node":"~0.6.0"},"repository":{"type":"git","url":"git://github.com/dimsmol/args.git"},"directories":{"lib":"./lib"},"main":"./lib/index","_npmUser":{"name":"dimsmol","email":"dimsmol@gmail.com"},"_id":"args@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"09b43521fb86e3b52f512c6315a75c4c619e3315","tarball":"http://registry.npmjs.org/args/-/args-0.0.1.tgz"},"maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}]},"0.0.2":{"name":"args","version":"0.0.2","description":"Command line arguments parser","keywords":["args","cli","arguments","parser","toolset"],"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"preferGlobal":false,"private":false,"dependencies":{"nerr":"~0.0.1"},"engines":{"node":"~0.8.0"},"repository":{"type":"git","url":"https://github.com/dimsmol/args"},"directories":{"lib":"./lib"},"main":"./lib/index","_id":"args@0.0.2","dist":{"shasum":"bbf9acaa665b1d923bb3eed42f49a7812ac817ac","tarball":"http://registry.npmjs.org/args/-/args-0.0.2.tgz"},"maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}]}},"readme":"## args\n\n`args` is command line arguments parser for node.js\n\nInstead of trying to deal with all your complex cases, `args` provides a toolset to help you with arguments parsing.\n\n## features\n\nSupported syntax for options: `--option=value`, `--option value`, `-abc`, `-abc value`\n\nFor boolean flags, `true` value can be omitted, i.g. `-f true` can be replaced with `-f` (and `--flag true` with `--flag` also).\n\n## option properties\n\n* `name`\n* `shortName`\n* `key`\n* `type`\n* `isList`\n* `enumItems`\n* `custom`\n\t* `check`\n\t* `parse`\n\t* `tryParse`\n\t* `get`\n* `help`\n\n## usage example\n\n```js\nvar args = require('args');\n\nvar options = args.Options.parse([\n\t{\n\t\tname: 'option',\n\t\tshortName: 'o',\n\t\ttype: 'int',\n\t\thelp: 'some option'\n\t}\n]);\n\noptions.getHelp();\n\nvar parser = new args.Parser('node app.js --option 11'.split(' '), 2);\nparser.parse(options);\nvar parsed = parser.prepareResult();\nconsole.log(parsed); // {option: 11}\n```\n","maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}],"time":{"modified":"2012-08-02T13:43:25.035Z","created":"2012-04-05T14:28:46.708Z","0.0.1":"2012-04-05T14:28:48.585Z","0.0.2":"2012-08-02T11:38:06.150Z"},"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"repository":{"type":"git","url":"https://github.com/dimsmol/args"},"users":{"fgribreau":true},"_attachments":{"args-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-vNRJSttoVbA/JPVCk0e/TQ==","length":4525,"stub":true},"args-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fIacZq///BgC9307Ui5hSw==","length":4564,"stub":true}}}},
{"id":"argsnip","key":"argsnip","value":{"rev":"5-0930a4eef6af7c3d6ca521b22928e471"},"doc":{"_id":"argsnip","_rev":"5-0930a4eef6af7c3d6ca521b22928e471","name":"argsnip","description":"Snips arguments off of callback functions.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Tom Frost","email":"tom@frosteddesign.com"},"name":"argsnip","description":"Snips arguments off of callback functions.","version":"0.1.0","homepage":"https://github.com/TomFrost/node-argsnip","repository":{"type":"git","url":"git://github.com/TomFrost/node-argsnip.git"},"main":"lib/argsnip.js","scripts":{"test":"mocha -R spec test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"mocha":">= 1.1.0","should":">= 0.6.3"},"_npmUser":{"name":"TomFrost","email":"tom@frosteddesign.com"},"_id":"argsnip@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"dbedb2bba7b19cc1a36d73b7223de354dbbad70b","tarball":"http://registry.npmjs.org/argsnip/-/argsnip-0.1.0.tgz"},"maintainers":[{"name":"TomFrost","email":"tom@frosteddesign.com"}]},"0.1.1":{"author":{"name":"Tom Frost","email":"tom@frosteddesign.com"},"name":"argsnip","description":"Snips arguments off of callback functions.","version":"0.1.1","homepage":"https://github.com/TomFrost/node-argsnip","repository":{"type":"git","url":"git://github.com/TomFrost/node-argsnip.git"},"main":"lib/argsnip.js","scripts":{"test":"mocha -R spec test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"mocha":">= 1.1.0","should":">= 0.6.3"},"_npmUser":{"name":"TomFrost","email":"tom@frosteddesign.com"},"_id":"argsnip@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b26b111ecd4cb02f97fea40bc5a25bfa8b7dc258","tarball":"http://registry.npmjs.org/argsnip/-/argsnip-0.1.1.tgz"},"maintainers":[{"name":"TomFrost","email":"tom@frosteddesign.com"}]}},"readme":"# ArgSnip\nSnips arguments off of callback functions, for simpler code and cleaner APIs.\n\n## Installation\nIn your project folder, type:\n\n\tnpm install argsnip\n\n## Usage\nWhenever you have code that looks like this, just to trim off unnecessary\narguments from your callback:\n\n\tdb.query(query, function(err, result, code, meta) {\n\t\tcallback(err, result);\n\t}\n\nJust snip the args!\n\n\tvar argSnip = require('argsnip');\n\tdb.query(query, argSnip(2, callback));\n\nBut what if you want just the 'err' and 'code' arguments?\n\n\tdb.query(query, argSnip([0, 2], callback));\n\nHow about the same two, in reverse order?\n\n\tdb.query(query, argSnip([2, 0], callback));\n\nWhat if we want all arguments except the first one?\n\n\tdb.query(query, argSnip(1, null, callback));\n\nWhat if we want to skip the first one, then take the next two arguments?\n\n\tdb.query(query, argSnip(1, 2, callback));\n\t// OR:\n\tdb.query(query, argSnip([1, 2], callback));\n\n## Details\nArgSnip will save you from using countless wrapper functions to sanitize your\ncallback arguments by letting you send just a slice or cheery-pick of the\noriginal arguments to the specified function.  Here's what it looks like:\n\n**attempt(_[start]_, args, callback)**\n\n- **start:** An optional index at which to start grabbing arguments.  If\nomitted, it's 0.\n\n- **args:** The number of arguments from the 'start' index that should be\nsent to the callback, OR an array specifying the index of each arguments to be\nsent to the callback, in the order they should be arranged in.  Null to take\nall arguments after the start index.\n\n- **callback:** The function to call with reduced arguments.\n\n## License\nAttempt is distributed under the MIT license.\n\n## Credits\nArgSnip was created by Tom Frost in 2012.\n","maintainers":[{"name":"TomFrost","email":"tom@frosteddesign.com"}],"time":{"modified":"2012-06-28T11:23:53.127Z","created":"2012-06-28T04:40:17.312Z","0.1.0":"2012-06-28T04:40:17.736Z","0.1.1":"2012-06-28T11:23:53.127Z"},"author":{"name":"Tom Frost","email":"tom@frosteddesign.com"},"repository":{"type":"git","url":"git://github.com/TomFrost/node-argsnip.git"},"_attachments":{"argsnip-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ensjkE/ssK/posA44WLOvA==","length":10240,"stub":true},"argsnip-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Of3M5rdLypCr9NbHKXVP5g==","length":10240,"stub":true}}}},
{"id":"argsparser","key":"argsparser","value":{"rev":"26-d31eca2f41546172763af629fc50631f"},"doc":{"_id":"argsparser","_rev":"26-d31eca2f41546172763af629fc50631f","name":"argsparser","description":"A tiny command line arguments parser","dist-tags":{"stable":"0.0.6","latest":"0.0.6"},"versions":{"0.0.3":{"name":"argsparser","description":"A tiny command line arguments parser","version":"0.0.3","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"http://github.com/kof/node-argsparser.git"},"keywords":["arguments","options","command line","parser"],"directories":{"lib":"./lib"},"main":"./lib/argsparser","engines":{"node":">= 0.2.0"},"scripts":{"install":"node ./test/test.js"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"argsparser@0.0.3","_engineSupported":true,"_npmVersion":"0.2.13-2","_nodeVersion":"v0.3.2","dist":{"shasum":"c6782e62e97ce60c6e5245c1115da6d732410539","tarball":"http://registry.npmjs.org/argsparser/-/argsparser-0.0.3.tgz"}},"0.0.4":{"name":"argsparser","description":"A tiny command line arguments parser","version":"0.0.4","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-argsparser.git"},"keywords":["arguments","options","command line","parser"],"directories":{"lib":"./lib"},"main":"./lib/argsparser.js","engines":{"node":">= 0.2.0"},"scripts":{"install":"node ./test/test.js"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"argsparser@0.0.4","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ad416bd94f18e661fc81d6e292c58e6235a75abe","tarball":"http://registry.npmjs.org/argsparser/-/argsparser-0.0.4.tgz","bin":{"0.4-sunos-5.11":{"shasum":"80a61bcb3ef9ff8c855055d23e37d5b3dc2429f0","tarball":"http://registry.npmjs.org/argsparser/-/argsparser-0.0.4-0.4-sunos-5.11.tgz"}}}},"0.0.5":{"name":"argsparser","description":"A tiny command line arguments parser","version":"0.0.5","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-argsparser.git"},"keywords":["arguments","options","command line","parser"],"engines":{"node":">= 0.2.0"},"scripts":{"test":"node ./test/test.js"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"argsparser@0.0.5","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d7773856c6faebe2efc138ba5f11580bc79aa8eb","tarball":"http://registry.npmjs.org/argsparser/-/argsparser-0.0.5.tgz"}},"0.0.6":{"name":"argsparser","description":"A tiny command line arguments parser","version":"0.0.6","author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-argsparser.git"},"keywords":["arguments","options","command line","parser"],"engines":{"node":">= 0.2.0"},"scripts":{"test":"node ./test/test.js"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmJsonOpts":{"file":"/Users/kof/.npm/argsparser/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"argsparser@0.0.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.5.0","_defaultsLoaded":true,"dist":{"shasum":"ff45eb5b92c004225cf146a51d339dccb265be63","tarball":"http://registry.npmjs.org/argsparser/-/argsparser-0.0.6.tgz"},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}]}},"maintainers":[{"name":"kof","email":"oleg008@gmail.com"}],"time":{"modified":"2011-09-07T18:35:00.241Z","created":"2010-12-30T11:45:04.615Z","0.0.3":"2010-12-30T11:45:05.073Z","0.0.4":"2011-03-09T14:18:12.400Z","0.0.5":"2011-04-15T21:35:37.977Z","0.0.6":"2011-06-15T12:25:00.402Z"},"author":{"name":"Oleg Slobodskoi","email":"oleg008@gmail.com"},"repository":{"type":"git","url":"git://github.com/kof/node-argsparser.git"},"_attachments":{"argsparser-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-SwWvTmXpSLEQlUg9cyKaZA==","length":1974,"stub":true},"argsparser-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-TrahJZqzYFonaCBRXF23Cg==","length":1931,"stub":true},"argsparser-0.0.4-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-I/4RfCqqnUtTjKhTWkPsag==","length":1980,"stub":true},"argsparser-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-Rnm3NpATd/KPP+B77O/HTw==","length":1956,"stub":true},"argsparser-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-95ErOtPgk3OejZVq8MTuBA==","length":2733,"stub":true}}}},
{"id":"argtest","key":"argtest","value":{"rev":"7-3e2fbcdad2e46f03d83ca622af6e6d83"},"doc":{"_id":"argtest","_rev":"7-3e2fbcdad2e46f03d83ca622af6e6d83","name":"argtest","description":"A tool for testing arguments for validity.","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"argtest","version":"1.0.0","description":"A tool for testing arguments for validity.","keywords":["test","arguments","assert","validate","verify"],"bugs":{"url":"https://github.com/clebert/argtest/issues"},"author":{"name":"Clemens Akens","url":"https://github.com/clebert"},"licenses":[{"type":"MIT","url":"https://github.com/clebert/argtest/blob/master/LICENSE"}],"repository":{"type":"git","url":"https://github.com/clebert/argtest.git"},"directories":{"lib":"./lib"},"devDependencies":{"mocha":"1.x"},"scripts":{"test":"make test"},"engines":{"node":"*"},"readme":"# argtest\n\nA tool for testing arguments for validity.\n\n## Installation\n\n    $ npm install argtest\n\n## Running Tests\n\nTo run the tests first invoke the following command within the repository:\n\n    $ npm install\n\nthen run the tests:\n\n    $ npm test\n\n## Usage\n\n**argtest.assert(value, [name])**\n\n    argtest.assert('abc', 'foo').is.numeric();\n        // throws -> TypeError: <foo> must be numeric\n\n    argtest.assert('123').isnt.numeric();\n        // throws -> TypeError: \"123\" must not be numeric\n\n    argtest.assert('123').is.numeric();\n        // returns -> '123'\n\n**argtest.verify(value)**\n\n    argtest.verify({}).has.ownProperty('test');\n        // returns -> false\n\n    argtest.verify({}).hasnt.ownProperty('test');\n        // returns -> true\n\n**argtest.validate(value, [name], callback)**\n\n    var validateIsInt = function (value) {\n        return argtest.validate(value, 'value', function () {\n            if (this.verify.is.ofType('number')) {\n                this.assert.is.finite();\n            } else if (this.verify.is.ofType('string')) {\n                this.value = parseFloat(this.assert.is.numeric());\n            } else {\n                this.assert.is.ofType('number|string');\n            }\n\n            this.assert.is.integer();\n            this.assert.is.positive();\n        });\n    };\n\n    validateIsInt(NaN);\n        // throws -> TypeError: <value> must be finite\n\n    validateIsInt('abc');\n        // throws -> TypeError: <value> must be numeric\n\n    validateIsInt();\n        // throws -> TypeError: <value> must be of type <number|string>\n\n    validateIsInt(1.1);\n        // throws -> TypeError: <value> must be an integer\n\n    validateIsInt('-1');\n        // throws -> TypeError: <value> must be positive\n\n    validateIsInt('1');\n        // returns -> 1\n\n**argtest.defineMethod(name, descriptor)**\n\n    argtest.defineMethod('falsy', { // returns -> true, if the method is undefined\n        stringify: function () {\n            return 'falsy';\n        },\n        test: function () {\n            return !this;\n        }\n    });\n\n    argtest.assert('', 'foo').isnt.falsy();\n        // throws -> TypeError: <foo> must not be falsy\n\n    argtest.assert('', 'foo').is.falsy();\n        // returns -> ''\n\n**argtest.stringify(value)**\n\n    argtest.stringify([]);\n        // returns -> '[object Array]'\n\n    argtest.stringify(true);\n        // returns -> 'true'\n\n    argtest.stringify(new Date());\n        // returns -> '[object Date]'\n\n    argtest.stringify(new Error());\n        // returns -> '[object Error]'\n\n    argtest.stringify(function () {});\n        // returns -> '[object Function]'\n\n    argtest.stringify(null);\n        // returns -> 'null'\n\n    argtest.stringify(-0);\n        // returns -> '-0'\n\n    argtest.stringify(Number.POSITIVE_INFINITY);\n        // returns -> 'Infinity'\n\n    argtest.stringify(Number.NEGATIVE_INFINITY);\n        // returns -> '-Infinity'\n\n    argtest.stringify(NaN);\n        // returns -> 'NaN'\n\n    argtest.stringify({});\n        // returns -> '[object Object]'\n\n    argtest.stringify(/test/gim);\n        // returns -> '/test/gim'\n\n    argtest.stringify('test');\n        // returns -> '\"test\"'\n\n    argtest.stringify(undefined);\n        // returns -> 'undefined'\n\n## Built-in Methods\n\n**#Array**\n\n    .empty()\n\n**#Number**\n\n    .finite()\n    .greaterThan(number)\n    .greaterThanOrEqualTo(number)\n    .integer()\n    .lessThan(number)\n    .lessThanOrEqualTo(number)\n    .negative()\n    .positive()\n\n**#Object**\n\n    .equalTo(value)\n    .identicalTo(value) // see http://wiki.ecmascript.org/doku.php?id=harmony:egal\n    .instanceOf(constructor, [name])\n    .ofType(names)\n    .ownProperty(name)\n    .property(name)\n    .strictEqualTo(value)\n\n**#String**\n\n    .blank()\n    .empty()\n    .like(regExp)\n    .numeric()\n\n## License\n\n(The MIT License)\n\nCopyright (C) 2012 Clemens Akens (github.com/clebert)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"argtest@1.0.0","dist":{"shasum":"bfb3da4aed86a5c41bf82942819ade647da87b5a","tarball":"http://registry.npmjs.org/argtest/-/argtest-1.0.0.tgz"},"maintainers":[{"name":"clebert","email":"clebert@me.com"}]},"1.0.1":{"name":"argtest","version":"1.0.1","description":"A tool for testing arguments for validity.","keywords":["test","arguments","assert","validate","verify"],"bugs":{"url":"https://github.com/clebert/argtest/issues"},"author":{"name":"Clemens Akens","url":"https://github.com/clebert"},"licenses":[{"type":"MIT","url":"https://github.com/clebert/argtest/blob/master/LICENSE"}],"repository":{"type":"git","url":"https://github.com/clebert/argtest.git"},"directories":{"lib":"./lib"},"devDependencies":{"mocha":"1.x"},"scripts":{"test":"make test"},"engines":{"node":"*"},"readme":"# argtest\n\nA tool for testing arguments for validity.\n\n## Installation\n\n    $ npm install argtest\n\n## Running Tests\n\nTo run the tests first invoke the following command within the repository:\n\n    $ npm install\n\nthen run the tests:\n\n    $ npm test\n\n## Usage\n\n**argtest.assert(value, [name])**\n\n    argtest.assert('abc', 'foo').is.numeric();\n        // throws TypeError: <foo> must be numeric\n\n    argtest.assert('123').isnt.numeric();\n        // throws TypeError: \"123\" must not be numeric\n\n    argtest.assert('123').is.numeric();\n        // returns '123'\n\n**argtest.verify(value)**\n\n    argtest.verify({}).has.ownProperty('test');\n        // returns false\n\n    argtest.verify({}).hasnt.ownProperty('test');\n        // returns true\n\n**argtest.validate(value, [name], callback)**\n\n    var validateIsInt = function (value) {\n        return argtest.validate(value, 'value', function () {\n            if (this.verify.is.ofType('number')) {\n                this.assert.is.finite();\n            } else if (this.verify.is.ofType('string')) {\n                this.value = parseFloat(this.assert.is.numeric());\n            } else {\n                this.assert.is.ofType('number|string');\n            }\n\n            this.assert.is.integer();\n            this.assert.is.positive();\n        });\n    };\n\n    validateIsInt(NaN);\n        // throws TypeError: <value> must be finite\n\n    validateIsInt('abc');\n        // throws TypeError: <value> must be numeric\n\n    validateIsInt();\n        // throws TypeError: <value> must be of type <number|string>\n\n    validateIsInt(1.1);\n        // throws TypeError: <value> must be an integer\n\n    validateIsInt('-1');\n        // throws TypeError: <value> must be positive\n\n    validateIsInt('1');\n        // returns 1\n\n**argtest.defineMethod(name, descriptor)**\n\n    argtest.defineMethod('falsy', {\n        stringify: function () {\n            return 'falsy';\n        },\n        test: function () {\n            return !this;\n        }\n    }); // returns true if the method name is not already in use, else false\n\n    argtest.assert('', 'foo').isnt.falsy();\n        // throws TypeError: <foo> must not be falsy\n\n    argtest.assert('', 'foo').is.falsy();\n        // returns ''\n\n**argtest.stringify(value)**\n\n    argtest.stringify([]);\n        // returns '[object Array]'\n\n    argtest.stringify(true);\n        // returns 'true'\n\n    argtest.stringify(new Date());\n        // returns '[object Date]'\n\n    argtest.stringify(new Error());\n        // returns '[object Error]'\n\n    argtest.stringify(function () {});\n        // returns '[object Function]'\n\n    argtest.stringify(null);\n        // returns 'null'\n\n    argtest.stringify(-0);\n        // returns '-0'\n\n    argtest.stringify(Number.POSITIVE_INFINITY);\n        // returns 'Infinity'\n\n    argtest.stringify(Number.NEGATIVE_INFINITY);\n        // returns '-Infinity'\n\n    argtest.stringify(NaN);\n        // returns 'NaN'\n\n    argtest.stringify({});\n        // returns '[object Object]'\n\n    argtest.stringify(/test/gim);\n        // returns '/test/gim'\n\n    argtest.stringify('test');\n        // returns '\"test\"'\n\n    argtest.stringify(undefined);\n        // returns 'undefined'\n\n## Built-in Methods\n\n**#Array**\n\n    .empty()\n\n**#Number**\n\n    .finite()\n    .greaterThan(number)\n    .greaterThanOrEqualTo(number)\n    .integer()\n    .lessThan(number)\n    .lessThanOrEqualTo(number)\n    .negative()\n    .positive()\n\n**#Object**\n\n    .equalTo(value)\n    .identicalTo(value) // see http://wiki.ecmascript.org/doku.php?id=harmony:egal\n    .instanceOf(constructor, [name])\n    .ofType(names)\n    .ownProperty(name)\n    .property(name)\n    .strictEqualTo(value)\n\n**#String**\n\n    .blank()\n    .empty()\n    .like(regExp)\n    .numeric()\n\n## License\n\n(The MIT License)\n\nCopyright (C) 2012 Clemens Akens (github.com/clebert)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"argtest@1.0.1","dist":{"shasum":"a4741dc7911e08996a325d5b9f68808eb9a394de","tarball":"http://registry.npmjs.org/argtest/-/argtest-1.0.1.tgz"},"maintainers":[{"name":"clebert","email":"clebert@me.com"}]},"1.0.2":{"name":"argtest","version":"1.0.2","description":"A tool for testing arguments for validity.","keywords":["test","arguments","assert","validate","verify"],"bugs":{"url":"https://github.com/clebert/argtest/issues"},"author":{"name":"Clemens Akens","url":"https://github.com/clebert"},"licenses":[{"type":"MIT","url":"https://github.com/clebert/argtest/blob/master/LICENSE"}],"repository":{"type":"git","url":"https://github.com/clebert/argtest.git"},"directories":{"lib":"./lib"},"devDependencies":{"mocha":"1.x"},"scripts":{"test":"make test"},"engines":{"node":">=0.4.x"},"readme":"# argtest\n\nA tool for testing arguments for validity.\n\n## Installation\n\n    $ npm install argtest\n\n## Running Tests\n\nTo run the tests first invoke the following command within the repository:\n\n    $ npm install\n\nthen run the tests:\n\n    $ npm test\n\n## Operators\n\n- is\n- isnt\n- has\n- hasnt\n\n## Built-in Methods\n\n###Array\n\n- empty()\n\n###Number\n\n- finite()\n- greaterThan(number)\n- greaterThanOrEqualTo(number)\n- integer()\n- lessThan(number)\n- lessThanOrEqualTo(number)\n- negative()\n- positive()\n\n###Object\n\n- equalTo(value)\n- [identicalTo(value)](http://wiki.ecmascript.org/doku.php?id=harmony:egal)\n- instanceOf(constructor, [name])\n- ofType(names)\n- ownProperty(name)\n- property(name)\n- strictEqualTo(value)\n\n###String\n\n- blank()\n- empty()\n- like(regExp)\n- numeric()\n\n## Usage\n\n###argtest.assert(value, [name])\n\n    argtest.assert('abc', 'foo').is.numeric();\n        // throws TypeError: <foo> must be numeric\n\n    argtest.assert('123').isnt.numeric();\n        // throws TypeError: \"123\" must not be numeric\n\n    argtest.assert('123').is.numeric();\n        // returns '123'\n\n###argtest.verify(value)\n\n    argtest.verify({}).has.ownProperty('test');\n        // returns false\n\n    argtest.verify({}).hasnt.ownProperty('test');\n        // returns true\n\n###argtest.validate(value, [name], callback)\n\n    var validateIsInt = function (value) {\n        return argtest.validate(value, 'value', function () {\n            if (this.verify.is.ofType('number')) {\n                this.assert.is.finite();\n            } else if (this.verify.is.ofType('string')) {\n                this.value = parseFloat(this.assert.is.numeric());\n            } else {\n                this.assert.is.ofType('number|string');\n            }\n\n            this.assert.is.integer();\n            this.assert.is.positive();\n        });\n    };\n\n    validateIsInt(NaN);\n        // throws TypeError: <value> must be finite\n\n    validateIsInt('abc');\n        // throws TypeError: <value> must be numeric\n\n    validateIsInt();\n        // throws TypeError: <value> must be of type <number|string>\n\n    validateIsInt(1.1);\n        // throws TypeError: <value> must be an integer\n\n    validateIsInt('-1');\n        // throws TypeError: <value> must be positive\n\n    validateIsInt('1');\n        // returns 1\n\n###argtest.defineMethod(name, descriptor)\n\n    argtest.defineMethod('falsy', {\n        stringify: function () {\n            return 'falsy';\n        },\n        test: function () {\n            return !this;\n        }\n    }); // returns true if the method name is not already in use, else false\n\n    argtest.assert('', 'foo').isnt.falsy();\n        // throws TypeError: <foo> must not be falsy\n\n    argtest.assert('', 'foo').is.falsy();\n        // returns ''\n\n###argtest.stringify(value)\n\n    argtest.stringify([]);\n        // returns '[object Array]'\n\n    argtest.stringify(true);\n        // returns 'true'\n\n    argtest.stringify(new Date());\n        // returns '[object Date]'\n\n    argtest.stringify(new Error());\n        // returns '[object Error]'\n\n    argtest.stringify(function () {});\n        // returns '[object Function]'\n\n    argtest.stringify(null);\n        // returns 'null'\n\n    argtest.stringify(-0);\n        // returns '-0'\n\n    argtest.stringify(Number.POSITIVE_INFINITY);\n        // returns 'Infinity'\n\n    argtest.stringify(Number.NEGATIVE_INFINITY);\n        // returns '-Infinity'\n\n    argtest.stringify(NaN);\n        // returns 'NaN'\n\n    argtest.stringify({});\n        // returns '[object Object]'\n\n    argtest.stringify(/test/gim);\n        // returns '/test/gim'\n\n    argtest.stringify('test');\n        // returns '\"test\"'\n\n    argtest.stringify(undefined);\n        // returns 'undefined'\n\n## License\n\n(The MIT License)\n\nCopyright (C) 2012 Clemens Akens (github.com/clebert)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"argtest@1.0.2","dist":{"shasum":"0fadf42b89012d31481170fad32e77921260144a","tarball":"http://registry.npmjs.org/argtest/-/argtest-1.0.2.tgz"},"maintainers":[{"name":"clebert","email":"clebert@me.com"}]}},"readme":"# argtest\n\nA tool for testing arguments for validity.\n\n## Installation\n\n    $ npm install argtest\n\n## Running Tests\n\nTo run the tests first invoke the following command within the repository:\n\n    $ npm install\n\nthen run the tests:\n\n    $ npm test\n\n## Usage\n\n**argtest.assert(value, [name])**\n\n    argtest.assert('abc', 'foo').is.numeric();\n        // throws -> TypeError: <foo> must be numeric\n\n    argtest.assert('123').isnt.numeric();\n        // throws -> TypeError: \"123\" must not be numeric\n\n    argtest.assert('123').is.numeric();\n        // returns -> '123'\n\n**argtest.verify(value)**\n\n    argtest.verify({}).has.ownProperty('test');\n        // returns -> false\n\n    argtest.verify({}).hasnt.ownProperty('test');\n        // returns -> true\n\n**argtest.validate(value, [name], callback)**\n\n    var validateIsInt = function (value) {\n        return argtest.validate(value, 'value', function () {\n            if (this.verify.is.ofType('number')) {\n                this.assert.is.finite();\n            } else if (this.verify.is.ofType('string')) {\n                this.value = parseFloat(this.assert.is.numeric());\n            } else {\n                this.assert.is.ofType('number|string');\n            }\n\n            this.assert.is.integer();\n            this.assert.is.positive();\n        });\n    };\n\n    validateIsInt(NaN);\n        // throws -> TypeError: <value> must be finite\n\n    validateIsInt('abc');\n        // throws -> TypeError: <value> must be numeric\n\n    validateIsInt();\n        // throws -> TypeError: <value> must be of type <number|string>\n\n    validateIsInt(1.1);\n        // throws -> TypeError: <value> must be an integer\n\n    validateIsInt('-1');\n        // throws -> TypeError: <value> must be positive\n\n    validateIsInt('1');\n        // returns -> 1\n\n**argtest.defineMethod(name, descriptor)**\n\n    argtest.defineMethod('falsy', { // returns -> true, if the method is undefined\n        stringify: function () {\n            return 'falsy';\n        },\n        test: function () {\n            return !this;\n        }\n    });\n\n    argtest.assert('', 'foo').isnt.falsy();\n        // throws -> TypeError: <foo> must not be falsy\n\n    argtest.assert('', 'foo').is.falsy();\n        // returns -> ''\n\n**argtest.stringify(value)**\n\n    argtest.stringify([]);\n        // returns -> '[object Array]'\n\n    argtest.stringify(true);\n        // returns -> 'true'\n\n    argtest.stringify(new Date());\n        // returns -> '[object Date]'\n\n    argtest.stringify(new Error());\n        // returns -> '[object Error]'\n\n    argtest.stringify(function () {});\n        // returns -> '[object Function]'\n\n    argtest.stringify(null);\n        // returns -> 'null'\n\n    argtest.stringify(-0);\n        // returns -> '-0'\n\n    argtest.stringify(Number.POSITIVE_INFINITY);\n        // returns -> 'Infinity'\n\n    argtest.stringify(Number.NEGATIVE_INFINITY);\n        // returns -> '-Infinity'\n\n    argtest.stringify(NaN);\n        // returns -> 'NaN'\n\n    argtest.stringify({});\n        // returns -> '[object Object]'\n\n    argtest.stringify(/test/gim);\n        // returns -> '/test/gim'\n\n    argtest.stringify('test');\n        // returns -> '\"test\"'\n\n    argtest.stringify(undefined);\n        // returns -> 'undefined'\n\n## Built-in Methods\n\n**#Array**\n\n    .empty()\n\n**#Number**\n\n    .finite()\n    .greaterThan(number)\n    .greaterThanOrEqualTo(number)\n    .integer()\n    .lessThan(number)\n    .lessThanOrEqualTo(number)\n    .negative()\n    .positive()\n\n**#Object**\n\n    .equalTo(value)\n    .identicalTo(value) // see http://wiki.ecmascript.org/doku.php?id=harmony:egal\n    .instanceOf(constructor, [name])\n    .ofType(names)\n    .ownProperty(name)\n    .property(name)\n    .strictEqualTo(value)\n\n**#String**\n\n    .blank()\n    .empty()\n    .like(regExp)\n    .numeric()\n\n## License\n\n(The MIT License)\n\nCopyright (C) 2012 Clemens Akens (github.com/clebert)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","maintainers":[{"name":"clebert","email":"clebert@me.com"}],"time":{"modified":"2012-08-07T23:48:38.446Z","created":"2012-08-05T19:30:09.756Z","1.0.0":"2012-08-05T19:30:11.406Z","1.0.1":"2012-08-05T23:56:37.731Z","1.0.2":"2012-08-07T23:48:38.446Z"},"author":{"name":"Clemens Akens","url":"https://github.com/clebert"},"repository":{"type":"git","url":"https://github.com/clebert/argtest.git"},"_attachments":{"argtest-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-rerQBQXGhk4yeRjDHHpSjA==","length":6572,"stub":true},"argtest-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TwEYD6pqXmxbhlBU7pDUVA==","length":6552,"stub":true},"argtest-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NJLKyKxFZzJuARQnbWa1JQ==","length":6549,"stub":true}}}},
{"id":"argtype","key":"argtype","value":{"rev":"10-96a7d23e571d56cf598472115bcac571"},"doc":{"_id":"argtype","_rev":"10-96a7d23e571d56cf598472115bcac571","name":"argtype","description":"JavaScript function arguments type checker","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"argtype","description":"JavaScript function arguments type checker","version":"0.2.0","homepage":"http://magnimedia.no/","author":{"name":"Tor Valamo","email":"tor.valamo@magimedia.no","url":"http://magnimedia.no/"},"repository":{"type":"git","url":"http://github.com/torvalamo/argtype.js.git"},"bugs":{"web":"http://github.com/torvalamo/argtype.js/issues"},"engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://github.com/torvalamo/argtype.js/blob/master/COPYING"}],"_id":"argtype@0.2.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/argtype/-/argtype-0.2.0.tgz"},"directories":{}}},"maintainers":[{"name":"torvalamo","email":"tor.valamo@gmail.com"}],"author":{"name":"Tor Valamo","email":"tor.valamo@magimedia.no","url":"http://magnimedia.no/"},"repository":{"type":"git","url":"http://github.com/torvalamo/argtype.js.git"},"time":{"modified":"2011-01-29T14:49:12.460Z","created":"2011-01-29T14:49:12.460Z","0.2.0":"2011-01-29T14:49:12.460Z"},"_attachments":{"argtype-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+xy/4F8GQEz5rEfakbi+xw==","length":4875,"stub":true}}}},
{"id":"argtypes","key":"argtypes","value":{"rev":"9-582c9217469ecea4b22641c71b9b236e"},"doc":{"_id":"argtypes","_rev":"9-582c9217469ecea4b22641c71b9b236e","name":"argtypes","description":"JavaScript function arguments type parser","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"argtypes","version":"0.0.1","author":{"name":"Mark Kahn","email":"cwolves@gmail.com"},"description":"JavaScript function arguments type parser","main":"index.js","keywords":["argument","arguments","parser","function"],"repository":{"type":"git","url":"git://github.com/cwolves/argtypes.git"},"_npmUser":{"name":"cwolves","email":"cwolves@gmail.com"},"_id":"argtypes@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"edb905a23acbf57ba7c1addafb2e2dc6d3ae2cd7","tarball":"http://registry.npmjs.org/argtypes/-/argtypes-0.0.1.tgz"},"maintainers":[{"name":"cwolves","email":"cwolves@gmail.com"}],"directories":{}},"0.1.0":{"name":"argtypes","version":"0.1.0","author":{"name":"Mark Kahn","email":"cwolves@gmail.com"},"description":"JavaScript function arguments type parser","main":"index.js","keywords":["argument","arguments","parser","function"],"repository":{"type":"git","url":"git://github.com/cwolves/argtypes.git"},"_npmUser":{"name":"cwolves","email":"cwolves@gmail.com"},"_id":"argtypes@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"e9b36476f1e54f696a77690aa8e1214d63313366","tarball":"http://registry.npmjs.org/argtypes/-/argtypes-0.1.0.tgz"},"maintainers":[{"name":"cwolves","email":"cwolves@gmail.com"}]}},"readme":"# ArgTypes\n\nFilters incoming arguments so that they match specified types and can be optional.\n\n### Examples\n\n```js\nvar fn = argtypes(\n\t'b', 'f',\n\tfunction( useThing, cb ){\n\t\n\t}\n);\n```\n\n```js\nvar fn = argtypes(\n\t[ '?b', true ], [ '?f', function(){} ], [ '?a', [ 1, 2, 3 ] ]\n  \t, function( aBool, fAn, aAry ){\n\n} )\n\nfn();                        // arguments = [ true,  function(){}, [   1,   2,   3 ] ]\nfn( false, ['a', 'b', 'c'] ) // arguments = [ false, function(){}, [ 'a', 'b', 'c' ] ]\n```\n\n### Usage\n - `?` -- value is optional\n\n Followed by:\n\n   - `.` -- Any value is allowed\n   - `a` -- Array\n   - `b` -- Boolean\n   - `f` -- Function\n   - `i` -- Integer\n   - `n` -- Numeric\n   - `s` -- String\n   - `o` -- Object ( `{}` )\n   - `C` -- Class instance.  Definition: `[ 'C', Foo ]` or `[ '?C', Foo, new Foo( 'a', 'b', 'c' ) ]`\n      If the default value is used in this case, a new object is created as: `new Foo( fooObj )` and it is up to the constructor to handle this case properly.","maintainers":[{"name":"cwolves","email":"cwolves@gmail.com"}],"time":{"modified":"2012-03-21T21:46:13.969Z","created":"2012-03-21T20:08:30.785Z","0.0.1":"2012-03-21T20:08:32.113Z","0.1.0":"2012-03-21T21:46:13.969Z"},"author":{"name":"Mark Kahn","email":"cwolves@gmail.com"},"repository":{"type":"git","url":"git://github.com/cwolves/argtypes.git"},"_attachments":{"argtypes-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-BVk6+yErqMaiq1uWDB60Qg==","length":10240,"stub":true},"argtypes-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dJqcydFC18DTAorck3W4Wg==","length":10240,"stub":true}}}},
{"id":"arguable","key":"arguable","value":{"rev":"13-ede494adf6a5e42d2cfafa983eb30f06"},"doc":{"_id":"arguable","_rev":"13-ede494adf6a5e42d2cfafa983eb30f06","name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.0":{"name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"version":"0.0.0","keywords":["command","option","parser","prompt","cli","stdin","args","arguments","console"],"licenses":[{"type":"MIT","url":"http://github.com/bigeasy/arguable/raw/master/LICENSE"}],"homepage":"http://bigeasy.github.com/arguable","repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"scripts":{"test":"build/test"},"devDependencies":{"proof":"0.0.10","uglify-js":">=0"},"dependencies":{},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"arguable@0.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"eb88a82c6f2909e286d4d0028f924da71c8f9f85","tarball":"http://registry.npmjs.org/arguable/-/arguable-0.0.0.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]},"0.0.1":{"name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"version":"0.0.1","keywords":["command","option","parser","prompt","cli","stdin","args","arguments","console"],"licenses":[{"type":"MIT","url":"http://github.com/bigeasy/arguable/raw/master/LICENSE"}],"homepage":"http://bigeasy.github.com/arguable","repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"scripts":{"test":"proof t/*/*.t"},"devDependencies":{"proof":"0.0.12"},"dependencies":{},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"arguable@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0c647bf8d54b015c10712dbf6d2392176fa5073a","tarball":"http://registry.npmjs.org/arguable/-/arguable-0.0.1.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]},"0.0.2":{"name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"version":"0.0.2","keywords":["command","option","parser","prompt","cli","stdin","args","arguments","console","glob"],"licenses":[{"type":"MIT","url":"http://github.com/bigeasy/arguable/raw/master/LICENSE"}],"homepage":"http://bigeasy.github.com/arguable","repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"scripts":{"test":"proof t/*/*.t"},"devDependencies":{"proof":"0.0.12"},"dependencies":{},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"arguable@0.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"65cb944cd2b1f84b170b03b55edb3622e9b36ca5","tarball":"http://registry.npmjs.org/arguable/-/arguable-0.0.2.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]},"0.0.3":{"name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"version":"0.0.3","keywords":["command","option","parser","prompt","cli","stdin","args","arguments","console","glob"],"licenses":[{"type":"MIT","url":"http://github.com/bigeasy/arguable/raw/master/LICENSE"}],"homepage":"http://bigeasy.github.com/arguable","repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"scripts":{"test":"proof t/*/*.t"},"devDependencies":{"proof":"0.0.12"},"dependencies":{},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"arguable@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"bc400202e536224dc56c5943c008eb96520a01b7","tarball":"http://registry.npmjs.org/arguable/-/arguable-0.0.3.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]},"0.0.4":{"name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"version":"0.0.4","keywords":["command","option","parser","prompt","cli","stdin","args","arguments","console","glob"],"licenses":[{"type":"MIT","url":"http://github.com/bigeasy/arguable/raw/master/LICENSE"}],"homepage":"http://bigeasy.github.com/arguable","repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"scripts":{"test":"proof t/*/*.t"},"devDependencies":{"proof":"0.0.12"},"dependencies":{},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"arguable@0.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d3141e2c86ac3eba366c202eb87d03ce4a9fd3cf","tarball":"http://registry.npmjs.org/arguable/-/arguable-0.0.4.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]},"0.0.5":{"name":"arguable","description":"UNIX style argument parsing that painlessly ports to Windows. An argument parser so well organized, you might think it's a framework.","author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"version":"0.0.5","keywords":["command","option","parser","prompt","cli","stdin","args","arguments","console","glob"],"licenses":[{"type":"MIT","url":"http://github.com/bigeasy/arguable/raw/master/LICENSE"}],"homepage":"http://bigeasy.github.com/arguable","repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"scripts":{"test":"proof t/*/*.t"},"devDependencies":{"proof":"0.0.12"},"dependencies":{},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"arguable@0.0.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e4ee751635e37a98070483f2dd6846e6cc9723c2","tarball":"http://registry.npmjs.org/arguable/-/arguable-0.0.5.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]}},"readme":"# Arguable\n\n**Arguable** is a command line parser that lends structure to your command line\nprograms. You can use Arguable as a simple command line parser, or you can use\nit to orgainze your program in a master program with any number of sub-commands\nin the style of `git`, `apt-get` or `yum`.\n\n\n**Arguable** starts with your usage message. It uses your usage message as the\ndeclaration of the options. In essence, **Arguable** compels you to write a man\npage in order to get your command line to parse.\n\n```javascript\n#!/usr/bin/node\n\n/*\n\n  usage: frobinate [options] [file...] [file]\n\n  options:\n\n  --help, -h                  display this message\n  --processes, -p   [count]   number of processes to run in parallel\n\n  description:\n\n  frobinate will reticuatle the splines in all of your happy doodle\n  files, optional in parallel. The `--processes` option is the number of\n  processes to run concurrently, defaulting to zero.\n\n*/\n\nvar options = require('arguable')(__filename);\n\nif (options.help.boolean) options.help.usage(0);\n\noptions.processes \n       .default(1)\n       .range(1, 16, \"incorrect number of processes\");\n\nrequire('../lib/frobinator').frobinate(options.processes.integer, options.$argv);\n```\n\n**Arguable** starts with a full help mesage, because **Arguable** believes\nthat a full help message is important for a command line program.\n\n**Arguable** is not fond of command line libraries that assemble a usage\nmessage from snippets. It would rather have the author spend time composing a\nnicely formatted usage message, with the ability to see the whole message,\nthen work from that message.\n\n**Arguable** provides some helper functions for dealing with Windows.\n**Arguable** will resolve UNIX file paths on Windows as if they were invoked\nin a UNIX shell. That is, it will treat `*/*.t` as a file glob. If no files\nare found, it will result in an error.\n\n```\nvar arguable = require('arguable')\n  , frobinator = require('frobinator')\n  ;\n\n// Convert a UNIX path to Windows, if we're on Windows.\narguable.resolve('t/test/example.t').forEach(function (path, files) {\n  if (!files.length) arguable.error('file not found: ' + path);\n  else frobinator(1, files);\n});\n\n// Convert a UNIX glob to a list of files Windows, if we're on Windows.\narguable.resolve('t/test/*.t').forEach(function (path, files) {\n  if (!files.length) arguable.error('file not found: ' + path);\n  else frobinator(1, files);\n});\n```\n\n**Arguable** allows you to specify multiple commands.\n\n```javascript\n/*\n\n  usage: frobinate run [options] [file...] [file]\n\n  options:\n\n  --help, -h                  display this message\n  --processes, -p   [count]   number of processes to run in parallel\n\n  description:\n\n  frobinate will reticuatle the splines in all of your happy doodle\n  files, optional in parallel. The `--processes` option is the number of\n  processes to run concurrently, defaulting to zero.\n\n  usage: frobinate compile [options] [file...] [file]\n\n  options:\n\n  --help, -h                  display this message\n  --strict, -s                strict interpretation of the ISO 33465\n                              Frobination Standard.\n  --prefix, -p                prefix for frobination identifiers\n\n  description:\n\n  `frobinate compile` will accelerate frobination by compling it to\n  intermediate output interpreted code (IOIC) then frobinating the hell\n  out it.\n\n*/\n\nvar options = require('arguable')(__filename)\n  , frobinator = require('../lib/frobinator')\n  ;\n\nswitch (options.$command) {\ncase 'compile':\n  if (options.help.boolean) options.$usage(0);\n\n  var ioic = frobinator.prepare(options.strict.boolean\n                              , option.prefix.string, options.$argv);\n\n  frobinator.frobinator(ioic);\n  break;\ncase 'run':\n  if (options.help.boolean) options.$usage(0);\n\n  options.processes \n         .default(1)\n         .range(1, 16, \"incorrect number of processes\");\n\n  frobinator.frobinate(options.processes.integer, options.$argv);\n  break;\ndefault:\n  options.$error('unknown command');\n}\n```\n","maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}],"time":{"modified":"2012-07-10T19:05:24.462Z","created":"2012-07-08T03:49:22.736Z","0.0.0":"2012-07-08T03:49:23.759Z","0.0.1":"2012-07-08T23:30:45.970Z","0.0.2":"2012-07-09T00:20:36.809Z","0.0.3":"2012-07-09T18:25:57.732Z","0.0.4":"2012-07-10T05:33:11.162Z","0.0.5":"2012-07-10T19:05:24.462Z"},"author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"repository":{"type":"git","url":"git://github.com/bigeasy/arguable.git"},"_attachments":{"arguable-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Gso9pucby4cipZWPzxifAA==","length":5885,"stub":true},"arguable-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-FG3Xsic2rGxxd0F5klniOw==","length":4849,"stub":true},"arguable-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-aLdZTf8MCSKZaS/NkbvjIA==","length":4600,"stub":true},"arguable-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-lQOTzuIwyjjyV6x0/P5gyg==","length":3303,"stub":true},"arguable-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MEF0DQL2eMTnmfMF3i0unQ==","length":3234,"stub":true},"arguable-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ycR3Y+3SoFHyRGJnQbljWg==","length":1986,"stub":true}}}},
{"id":"argue","key":"argue","value":{"rev":"3-ee389cb9581e20b52404be5f02839689"},"doc":{"_id":"argue","_rev":"3-ee389cb9581e20b52404be5f02839689","name":"argue","description":"Describes signature of arguments passed to a function.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"argue","description":"Describes signature of arguments passed to a function.","author":{"name":"Adam Blackburn","email":"adam@ifit.com"},"version":"0.0.1","main":"index.js","keywords":["function","signature","arguments","argue"],"repository":{"type":"git","url":"git://github.com/ifit/argue.git"},"homepage":"https://github.com/ifit/argue","_npmUser":{"name":"regality","email":"regality@gmail.com"},"_id":"argue@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"99d02d30428c8bdc7b625f93d61d35489be75d70","tarball":"http://registry.npmjs.org/argue/-/argue-0.0.1.tgz"},"maintainers":[{"name":"regality","email":"regality@gmail.com"}]}},"readme":"## Basic Usage\n\nArgue determines the argument signature received by a function.\n\n```javascript\n\nvar argue = require('argue');\n\nfunction foo() {\n  var sig = argue(arguments);\n  switch(sig) {\n    case 'sbnf':\n      // we got a string, boolean, number, and function\n      break;\n\n    case 'nnnn':\n      // we got four numbers\n      break;\n\n    case 'ord-':\n      // we got an object, regexp, date, and null\n      break;\n\n    default:\n      // you get the idea\n  }\n}\n\n```\n\nArgue returns the following characters for the following types:\n\n`Date`   : `'d'`\n\n`Array`  : `'a'`\n\n`RegExp` : `'r'`\n\n`Error`  : `'e'`\n\n`String` : `'s'`\n\n`Boolean`: `'b'`\n\n`Number` : `'n'`\n\n`Object` : `'o'`\n\n`Function`: `'f'`\n\n`null`   : `'-'`\n\n`undefined` : `'u'`\n\n","maintainers":[{"name":"regality","email":"regality@gmail.com"}],"time":{"modified":"2012-03-09T06:34:28.095Z","created":"2012-03-09T06:34:26.707Z","0.0.1":"2012-03-09T06:34:28.095Z"},"author":{"name":"Adam Blackburn","email":"adam@ifit.com"},"repository":{"type":"git","url":"git://github.com/ifit/argue.git"},"_attachments":{"argue-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YjN0m68MN8oAmISQoQa3WA==","length":2370,"stub":true}}}},
{"id":"arguee","key":"arguee","value":{"rev":"3-26e02850a250f15127fb39df7f04653b"},"doc":{"_id":"arguee","_rev":"3-26e02850a250f15127fb39df7f04653b","name":"arguee","description":"Arguee lets you check types and function arguments","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"arguee","version":"0.0.1","description":"Arguee lets you check types and function arguments","main":"arguee.js","directories":{"test":"test"},"scripts":{"test":"cd test; make"},"repository":{"type":"git","url":"git://github.com/Orion98MC/arguee.git"},"author":{"name":"Thierry Passeron"},"license":"MIT","readme":"# Description\n\nArguee lets you check types and function arguments\n\n## Usage\n\nCheck function arguments:\n\n```js\nvar conformed = require('arguee').conformed;\n\n/* \n  foo function\n  \n  Usage:\n    foo(name, callback) (1)\n    foo(name)           (2)\n    foo(name, number)   (3)\n*/\nfunction foo() {\n  if (conformed([String, Function], arguments)) {\n    /* 1 */\n  } else \n  if (conformed([String], arguments)) {\n    /* 2 */\n  } else \n  if (conformed([String, Number], arguments)) {\n    /* 3 */\n  } else {\n    /* sorry */\n  }\n}\n```\n\nYou may check any type (Array, Object, String, Number, Function, Custom objects etc...). \nExample:\n\n```js\nvar isa = require('arguee').isa;\n\nvar name;\nvar address;\n\n/* ... */\n\nif (isa(String, name)) { /* ... */ }\nif (isa(Array, address)) { /* ... */ }\n\n```\n\n## License terms\n\nCopyright (c), 2012 Thierry Passeron\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"arguee@0.0.1","dist":{"shasum":"d14a82a9ebabf6cf170bf58043255b4c29b5cd36","tarball":"http://registry.npmjs.org/arguee/-/arguee-0.0.1.tgz"},"maintainers":[{"name":"orion","email":"thierry.passeron@gmail.com"}]}},"readme":"# Description\n\nArguee lets you check types and function arguments\n\n## Usage\n\nCheck function arguments:\n\n```js\nvar conformed = require('arguee').conformed;\n\n/* \n  foo function\n  \n  Usage:\n    foo(name, callback) (1)\n    foo(name)           (2)\n    foo(name, number)   (3)\n*/\nfunction foo() {\n  if (conformed([String, Function], arguments)) {\n    /* 1 */\n  } else \n  if (conformed([String], arguments)) {\n    /* 2 */\n  } else \n  if (conformed([String, Number], arguments)) {\n    /* 3 */\n  } else {\n    /* sorry */\n  }\n}\n```\n\nYou may check any type (Array, Object, String, Number, Function, Custom objects etc...). \nExample:\n\n```js\nvar isa = require('arguee').isa;\n\nvar name;\nvar address;\n\n/* ... */\n\nif (isa(String, name)) { /* ... */ }\nif (isa(Array, address)) { /* ... */ }\n\n```\n\n## License terms\n\nCopyright (c), 2012 Thierry Passeron\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"orion","email":"thierry.passeron@gmail.com"}],"time":{"modified":"2012-08-07T15:32:05.868Z","created":"2012-08-07T15:32:03.963Z","0.0.1":"2012-08-07T15:32:05.868Z"},"author":{"name":"Thierry Passeron"},"repository":{"type":"git","url":"git://github.com/Orion98MC/arguee.git"},"_attachments":{"arguee-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qR1iqgKdYByF0a0LSyiPvw==","length":2502,"stub":true}}}},
{"id":"arguments","key":"arguments","value":{"rev":"7-767de2797f41702690bef5928ec7c6e9"},"doc":{"_id":"arguments","_rev":"7-767de2797f41702690bef5928ec7c6e9","name":"arguments","description":"Yet Another command-line parser for node.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"arguments","description":"Yet Another command-line parser for node.js","url":"http://github.com/fczuardi/node-arguments","keywords":["argv","getopt","command-line"],"author":{"name":"Fabricio C Zuardi"},"contributors":[{"name":"Vitor Calejuri","email":"ondeosfrangosnaotemvez@gmail.com"}],"version":"1.0.0","main":"./index","engines":{"node":">= 0.1.93"},"_id":"arguments@1.0.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/arguments/-/arguments-1.0.0.tgz"},"mtime":"2010-11-09T23:16:10Z","ctime":"2010-11-09T23:16:10Z"}},"maintainers":[{"name":"frangossauro","email":"ondeosfrangosnaotemvez@gmail.com"},{"name":"fczuardi","email":"fabricio@fabricio.org"}],"mtime":"2010-11-09T23:16:10Z","ctime":"2010-11-09T23:16:10Z","author":{"name":"Fabricio C Zuardi"},"_attachments":{"arguments-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QXI5gJq5T3m3jarygb4WEA==","length":2441,"stub":true}}}},
{"id":"argumentum","key":"argumentum","value":{"rev":"9-18fd7631c7518790348633c7074b64ae"},"doc":{"_id":"argumentum","_rev":"9-18fd7631c7518790348633c7074b64ae","name":"argumentum","description":"Option parser with generated usage and commands","dist-tags":{"latest":"0.6.0"},"versions":{"0.5.0":{"name":"argumentum","description":"Option parser with generated usage and commands","version":"0.5.0","author":{"name":"Paul Miller","email":"paulmillr@me.com"},"repository":{"type":"git","url":"git://github.com/paulmillr/argumentum.git"},"main":"./lib/argumentum","keywords":["arguments","option parser","command line","options","parser","nomnom"],"_npmUser":{"name":"paulmillr","email":"paulmillr@me.com"},"_id":"argumentum@0.5.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"bca71da9e86b9f3d9337383f1480376b9ad1746a","tarball":"http://registry.npmjs.org/argumentum/-/argumentum-0.5.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paulmillr@me.com"}]},"0.6.0":{"name":"argumentum","description":"Option parser with generated usage and commands","version":"0.6.0","author":{"name":"Paul Miller","url":"http://paulmillr.com"},"repository":{"type":"git","url":"git://github.com/paulmillr/argumentum.git"},"main":"./lib/argumentum","keywords":["arguments","option parser","command line","options","parser","nomnom"],"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"argumentum@0.6.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"be5f1a97737de79e9759029feeb12be27d963d50","tarball":"http://registry.npmjs.org/argumentum/-/argumentum-0.6.0.tgz"},"readme":"# Argumentum\nArgumentum is an option parser for node.\n\n## Example\nExample usage (in CoffeeScript):\n\n```coffeescript\nargumentum = require 'argumentum'\n\nconfig =\n  script: 'app'\n  commandRequired: yes\n  commands:\n    new:\n      help: 'Create new project'\n      options:\n        appPath:\n          position: 1\n          help: 'application path'\n          metavar: 'APP_PATH'\n          required: yes\n\n        buildPath:\n          abbr: 'o'\n          help: 'build path'\n          metavar: 'DIRECTORY'\n          full: 'output'\n\n      callback: (options) ->\n        'callback called'\n\n  options:\n    version:\n      abbr: 'v'\n      help: 'display app version'\n      flag: true\n      callback: ->\n        'version called'\n\nargumentum.load(config).parse()\n```\n\n## Documentation\n\n\n## License\nThis project is based on [nomnom](https://github.com/harthur/nomnom)\nby Heather Arthur.\n\n(The MIT License)\n\nCopyright (c) 2011 Paul Miller (paulmillr.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"paulmillr","email":"paulmillr@me.com"}]}},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-04-16T04:36:31.233Z","created":"2011-12-01T03:13:53.529Z","0.5.0":"2011-12-01T03:48:05.661Z","0.6.0":"2012-01-27T20:20:58.418Z"},"author":{"name":"Paul Miller","url":"http://paulmillr.com"},"repository":{"type":"git","url":"git://github.com/paulmillr/argumentum.git"},"_attachments":{"argumentum-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ONA+tUCIwgmET04S3YepbQ==","length":10809,"stub":true},"argumentum-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hDeRu9t2/O4MiLZRpxRPNg==","length":10447,"stub":true}}}},
{"id":"argus","key":"argus","value":{"rev":"5-3a2aaf7954e0d9f648a076357eb7a9c5"},"doc":{"_id":"argus","_rev":"5-3a2aaf7954e0d9f648a076357eb7a9c5","name":"argus","description":"Complex CLI argument parser","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"argus","description":"Complex CLI argument parser","version":"0.0.1","homepage":"http://github.com/wearefractal/argus","repository":{"type":"git","url":"git://github.com/wearefractal/argus.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./index.js","dependencies":{"coffee-script":"*","pegjs":"*"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"mocha --compilers coffee:coffee-script"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/argus/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"argus@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"990a2d27dd7027034a43bdf07e1d0d73e706a725","tarball":"http://registry.npmjs.org/argus/-/argus-0.0.1.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]},"0.0.2":{"name":"argus","description":"Complex CLI argument parser","version":"0.0.2","homepage":"http://github.com/wearefractal/argus","repository":{"type":"git","url":"git://github.com/wearefractal/argus.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./index.js","dependencies":{"coffee-script":"*","pegjs":"*"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"mocha --compilers coffee:coffee-script"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/argus/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"argus@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3e013fb1763cb1215ccb36f10f5136cff7ad2d17","tarball":"http://registry.npmjs.org/argus/-/argus-0.0.2.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]}},"readme":"![status](https://secure.travis-ci.org/wearefractal/argus.png?branch=master)\n\n## Information\n\n<table>\n<tr> \n<td>Package</td><td>argus</td>\n</tr>\n<tr>\n<td>Description</td>\n<td>Complex CLI argument parser</td>\n</tr>\n<tr>\n<td>Node Version</td>\n<td>>= 0.4</td>\n</tr>\n</table>\n\n## Details\n\nArgus allows you to pass an array of complex data to your application through a CLI. This can be an array of objects, strings, numbers, you name it. Anything that is a valid JSON array can be used. Ideally when you get this array of objects you would pass it into whatever function was being called.\n\n## Usage\n\n```coffee-script\nmycli dostuff[\"johnny boy\",true,-1]\n```\n\n## Quirks\n\nBash doesn't agree with a lot of characters so some escaping may be required. Still looking for a solution to this.\n\n## LICENSE\n\n(MIT License)\n\nCopyright (c) 2012 Fractal <contact@wearefractal.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"time":{"modified":"2012-06-20T02:29:48.979Z","created":"2012-06-11T16:11:31.650Z","0.0.1":"2012-06-11T16:11:33.114Z","0.0.2":"2012-06-20T02:29:48.979Z"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"repository":{"type":"git","url":"git://github.com/wearefractal/argus.git"},"_attachments":{"argus-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OQxNhpTAJ1n0r97ouyBUKA==","length":3755,"stub":true},"argus-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VLluDM9+McCrckugYZesjw==","length":3679,"stub":true}}}},
{"id":"argv","key":"argv","value":{"rev":"3-1baa78c8d4bb496a68f9bf1739c8ceb6"},"doc":{"_id":"argv","_rev":"3-1baa78c8d4bb496a68f9bf1739c8ceb6","name":"argv","description":"CLI Argument Parser","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"argv","description":"CLI Argument Parser","url":"http://codenothing.github.com/argv/","keywords":["cli","argv","options"],"author":{"name":"Corey Hart","email":"corey@codenothing.com"},"version":"0.0.1","main":"./index.js","engines":{"node":">=0.6.10"},"dependencies":{},"devDependencies":{"nlint":"0.0.1"},"_npmUser":{"name":"codenothing","email":"corey@codenothing.com"},"_id":"argv@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0983be279d7a97d9c1e825c953c893f0d105aa5e","tarball":"http://registry.npmjs.org/argv/-/argv-0.0.1.tgz"},"maintainers":[{"name":"codenothing","email":"corey@codenothing.com"}]}},"readme":"# argv\n\nargv is a nodejs module that does command line argument parsing.\n\n\n### Installation\n\n```bash\n$ npm install argv\n```\n\n\n### Usage\n\n```js\nvar argv = require( 'argv' );\nvar args = argv.option( options ).run();\n-> { targets: [], options: {} }\n```\n\n\n### Run\n\nRuns the argument parser on the global arguments. Custom arguments array can be used by passing into this method\n\n```js\n// Parses default arguments 'process.argv.slice( 2 )'\nargv.run();\n\n// Parses array instead\nargv.run([ '--option=123', '-o', '123' ]);\n```\n\n\n### Options\n\nargv is a strict argument parser, which means all options must be defined before parsing starts.\n\n```js\nargv.option({\n\tname: 'option',\n\tshort: 'o',\n\ttype: 'string',\n\tdescription: 'Defines an option for your script',\n\texample: \"'script --opiton=value' or 'script -o value'\"\n});\n```\n\n\n### Modules\n\nModules are nested commands for more complicated scripts. Each module has it's own set of options that\nhave to be defined independently of the root options.\n\n```js\nargv.mod({\n\tmod: 'module',\n\tdescription: 'Description of what the module is used for',\n\toptions: [ list of options ]\n});\n```\n\n\n### Types\n\nTypes convert option values to useful js objects. They are defined along with each option.\n\n* **string**: Ensure values are strings\n* **path**: Converts value into a fully resolved path.\n* **int**: Converts value into an integer\n* **float**: Converts value into a float number\n* **boolean**: Converts value into a boolean object. 'true' and '1' are converted to true, everything else is false.\n* **csv**: Converts value into an array by splitting on comma's.\n* **list**: Allows for option to be defined multiple times, and each value added to an array\n* **[list|csv],[type]**: Combo type that allows you to create a list or csv and convert each individual value into a type.\n\n```js\nargv.option([\n\t{\n\t\tname: 'option',\n\t\ttype: 'csv,int'\n\t},\n\t{\n\t\tname: 'path',\n\t\tshort: 'p',\n\t\ttype: 'list,path'\n\t}\n]);\n\n// csv and int combo\n$ script --option=123,456.001,789.01\n-> option: [ 123, 456, 789 ]\n\n// list and path combo\n$ script -p /path/to/file1 -p /path/to/file2\n-> option: [ '/path/to/file1', '/path/to/file2' ]\n```\n\nYou can also create your own custom type for special conversions.\n\n```js\nargv.type( 'squared', function( value ) {\n\tvalue = parseFloat( value );\n\treturn value * value;\n});\n\nargv.option({\n\tname: 'square',\n\tshort: 's',\n\ttype: 'squared'\n});\n\n$ script -s 2\n-> 4\n```\n\n\n### Version\n\nDefining the scripts version number will add the version option and print it out when asked.\n\n```js\nargv.version( 'v1.0' );\n\n$ script --version\nv1.0\n\n```\n\n\n### Info\n\nCustom information can be displayed at the top of the help printout using this method\n\n```js\nargv.info( 'Special script info' );\n\n$ script --help\n\nSpecial script info\n\n... Rest of Help Doc ...\n```\n\n\n### Clear\n\nIf you have competing scripts accessing the argv object, you can clear out any previous options that may have been set.\n\n```js\nargv.clear().option( [new options] );\n```\n\n\n### Help\n\nargv injects a default help option initially and on clears. The help() method triggers the help printout.\n\n```js\nargv.help();\n```\n","maintainers":[{"name":"codenothing","email":"corey@codenothing.com"}],"time":{"modified":"2012-07-08T22:32:13.731Z","created":"2012-07-08T22:32:12.305Z","0.0.1":"2012-07-08T22:32:13.731Z"},"author":{"name":"Corey Hart","email":"corey@codenothing.com"},"_attachments":{"argv-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7RLkHfu1/Ssh9AamiYvJTw==","length":5512,"stub":true}}}},
{"id":"argyle","key":"argyle","value":{"rev":"3-070bd57635a940f5fe1886e5c2cecaa1"},"doc":{"_id":"argyle","_rev":"3-070bd57635a940f5fe1886e5c2cecaa1","name":"argyle","description":"Basic SOCKS5 server libary","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Travis Collins","email":"travis@tec27.com","url":"http://tec27.com"},"name":"argyle","description":"Basic SOCKS5 server libary","version":"0.0.1","repository":{"type":"git","url":"git://github.com/tec27/node-argyle.git"},"keywords":["socks"],"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tec27","email":"travis@tec27.com"},"_id":"argyle@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4c91b33785320c2339bd80580f5739785a8be2c7","tarball":"http://registry.npmjs.org/argyle/-/argyle-0.0.1.tgz"},"maintainers":[{"name":"tec27","email":"travis@tec27.com"}]}},"readme":"#argyle\r\nA basic SOCKS5 server library written for node.js.\r\n\r\n##Features/Limitations\r\nargyle supports the most basic features of SOCKS and not a whole lot more, namely:\r\n\r\n- 'No authentication' auth mode *only*\r\n- CONNECT commmand *only*\r\n\r\nIn the future I may add support for more auth modes and commands, but currently this implementation works well for my main use case (sitting between a local browser and server).\r\n\r\n##Usage\r\n###Example: \"Normal\" proxy server\r\n```javascript\r\nvar argyle = require('argyle');\r\n\r\nvar server = argyle(8080, '127.0.0.1');\r\nserver.on('connected', function(req, dest) {\r\n\treq.pipe(dest);\r\n\tdest.pipe(req);\r\n});\r\n```\r\n\r\n###Example: Throttled proxy server using node-throttled-stream\r\n```javascript\r\nvar argyle = require('argyle'),\r\n\tthrottle = require('./throttled-stream'),\r\n\tkbpsUp = 32,\r\n\tkbpsDown = 128;\r\n\r\nvar server = argyle(8080, '127.0.0.1');\r\nserver.on('connected', function(req, dest) {\r\n\tvar tReq = throttle(req, kbpsUp * 1024),\r\n\t\ttDest = throttle(dest, kbpsDown * 1024);\r\n\t\r\n\tdest.once('error', function(err) { req.end(); })\r\n\t\t.on('close', function() { req.end(); });\r\n\t\r\n\ttReq.on('data', function(chunk) {\r\n\t\tdest.write(chunk);\r\n\t});\r\n\ttDest.on('data', function(chunk) {\r\n\t\treq.write(chunk);\r\n\t});\r\n});\r\n```\r\n\r\n##Methods\r\n###argyle([port = 8080], [host = 127.0.0.1], [debug = false])\r\nSets up a new SOCKS server on the specified port and host. If debug is specified, the server will output messages about the status of connections.\r\n\r\n##Events\r\n###'connected'\r\nA new client connected to the server and the socket to their requested destination is now open. Handlers for this event are passed a `request` socket, corresponding to the client that made the request from the server, and a `destination` socket, corresponding to the server that they requested to connect to.\r\n\r\n##Installation\r\nWith npm:\r\n\r\n```\r\nnpm install argyle\r\n```\r\n\r\n##License\r\nWTFPL\r\n","maintainers":[{"name":"tec27","email":"travis@tec27.com"}],"time":{"modified":"2012-06-18T02:31:15.137Z","created":"2012-06-18T02:31:14.002Z","0.0.1":"2012-06-18T02:31:15.137Z"},"author":{"name":"Travis Collins","email":"travis@tec27.com","url":"http://tec27.com"},"repository":{"type":"git","url":"git://github.com/tec27/node-argyle.git"},"_attachments":{"argyle-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-W1obsZJtkqq2x4C+ut4q0A==","length":3950,"stub":true}}}},
{"id":"aria","key":"aria","value":{"rev":"7-a6b988fb56dcab90a433169b77fa380f"},"doc":{"_id":"aria","_rev":"7-a6b988fb56dcab90a433169b77fa380f","name":"aria","description":"A client library for Aria API","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"aria","description":"A client library for Aria API","version":"0.1.0","author":{"name":"Brock Whitten","email":"brock@sintaxi.com"},"keywords":["aria","api","client","soap"],"main":"./aria.js","repository":{"type":"git","url":"git://github.com/sintaxi/node-aria.git"},"dependencies":{"xml2js-expat":"0.2.0","request":"2.1.1"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"https://raw.github.com/sintaxi/node-aria/master/README.md"}],"devDependencies":{},"_id":"aria@0.1.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f7c6d32f9f9d5fac1d4c891913d309cfe2c89acc","tarball":"http://registry.npmjs.org/aria/-/aria-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"sintaxi","email":"brock@sintaxi.com"}]},"0.2.0":{"name":"aria","description":"A client library for Aria API","version":"0.2.0","author":{"name":"Brock Whitten","email":"brock@sintaxi.com"},"keywords":["aria","api","client","soap"],"main":"./aria.js","repository":{"type":"git","url":"git://github.com/sintaxi/node-aria.git"},"dependencies":{"xml2js-expat":"0.2.0","request":"2.1.1"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"https://raw.github.com/sintaxi/node-aria/master/README.md"}],"devDependencies":{},"_id":"aria@0.2.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fbef29846d400c0629a9e3a29c313823d1ef5ed6","tarball":"http://registry.npmjs.org/aria/-/aria-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"sintaxi","email":"brock@sintaxi.com"}]},"0.2.1":{"name":"aria","description":"A client library for Aria API","version":"0.2.1","author":{"name":"Brock Whitten","email":"brock@sintaxi.com"},"keywords":["aria","api","client","soap"],"main":"./aria.js","repository":{"type":"git","url":"git://github.com/sintaxi/node-aria.git"},"dependencies":{"xml2js-expat":"0.2.0","request":"2.1.1"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"https://raw.github.com/sintaxi/node-aria/master/README.md"}],"devDependencies":{},"_id":"aria@0.2.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ea7a9346089882319551b9d36804e95e0ba81d1a","tarball":"http://registry.npmjs.org/aria/-/aria-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"sintaxi","email":"brock@sintaxi.com"}]}},"maintainers":[{"name":"sintaxi","email":"brock@sintaxi.com"}],"time":{"modified":"2011-10-12T22:43:19.448Z","created":"2011-10-11T22:16:14.169Z","0.1.0":"2011-10-11T22:16:14.634Z","0.2.0":"2011-10-12T10:41:02.739Z","0.2.1":"2011-10-12T22:43:19.448Z"},"author":{"name":"Brock Whitten","email":"brock@sintaxi.com"},"repository":{"type":"git","url":"git://github.com/sintaxi/node-aria.git"},"_attachments":{"aria-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vDpVUCSHMbpb53GHzsUJww==","length":2780,"stub":true},"aria-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8LHWXAoHE3VUV6LABRXBmg==","length":2779,"stub":true},"aria-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-izNtXoGoIe1sLyvDGxPKdA==","length":2776,"stub":true}}}},
{"id":"ariel","key":"ariel","value":{"rev":"13-1186bd062c7e046b07dd9935d10385fa"},"doc":{"_id":"ariel","_rev":"13-1186bd062c7e046b07dd9935d10385fa","name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","dist-tags":{"latest":"0.0.9"},"versions":{"0.0.4":{"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","version":"0.0.4","homepage":"https://github.com/matthiasg","repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"main":"./index.js","scripts":{"start":"node ./bin/ariel","test":"node node_modules/mocha/bin/mocha"},"bin":{"ariel":"./bin/ariel.js"},"engines":{"node":">= 0.6"},"dependencies":{"coffee-script":"1.2.x","optimist":"0.3.x","colors":"0.6.x","file":">= 0.2.x","mocha":">= 0.12.x","coveraje":"0.1.3","uglify-js":">= 1.2"},"devDependencies":{"should":">= 0.5.1","wrench":">= 1.3.6","runforcover":">= 0.0.1"},"optionalDependencies":{},"bundleDependencies":["coveraje"],"_npmUser":{"name":"matthiasg","email":"m.goetzke@curasystems.de"},"_id":"ariel@0.0.4","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"f0a42ce7d4c7f76a73cf53f9f1d048c0666c684f","tarball":"http://registry.npmjs.org/ariel/-/ariel-0.0.4.tgz"},"maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}]},"0.0.5":{"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","version":"0.0.5","homepage":"https://github.com/matthiasg/node-ariel","repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"main":"./index.js","scripts":{"start":"node ./bin/ariel","test":"node node_modules/mocha/bin/mocha"},"bin":{"ariel":"./bin/ariel.js"},"engines":{"node":">= 0.6"},"dependencies":{"coffee-script":"1.2.x","optimist":"0.3.x","colors":"0.6.x","file":">= 0.2.x","mocha":">= 0.12.x","coveraje":"0.1.3","uglify-js":">= 1.2"},"devDependencies":{"should":">= 0.5.1","wrench":">= 1.3.6","runforcover":">= 0.0.1"},"optionalDependencies":{},"bundleDependencies":["coveraje"],"_npmUser":{"name":"matthiasg","email":"m.goetzke@curasystems.de"},"_id":"ariel@0.0.5","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"66e5634907eeacc650f133a97c60e5b605f4cae5","tarball":"http://registry.npmjs.org/ariel/-/ariel-0.0.5.tgz"},"maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}]},"0.0.6":{"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","version":"0.0.6","homepage":"https://github.com/matthiasg/node-ariel","repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"main":"./index.js","scripts":{"start":"node ./bin/ariel","test":"node node_modules/mocha/bin/mocha"},"bin":{"ariel":"./bin/ariel.js"},"engines":{"node":">= 0.6"},"dependencies":{"coffee-script":"1.2.x","optimist":"0.3.x","colors":"0.6.x","file":">= 0.2.x","mocha":">= 1.x.x","coveraje":"0.1.3","uglify-js":">= 1.2"},"devDependencies":{"should":">= 0.5.1","wrench":">= 1.3.6","runforcover":">= 0.0.1"},"optionalDependencies":{},"bundleDependencies":["coveraje"],"_npmUser":{"name":"matthiasg","email":"m.goetzke@curasystems.de"},"_id":"ariel@0.0.6","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7e83864cabe2f2fec5240a6d73fc81093b79997c","tarball":"http://registry.npmjs.org/ariel/-/ariel-0.0.6.tgz"},"maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}]},"0.0.7":{"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","version":"0.0.7","homepage":"https://github.com/matthiasg/node-ariel","repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"main":"./index.js","scripts":{"start":"node ./bin/ariel","test":"node node_modules/mocha/bin/mocha"},"bin":{"ariel":"./bin/ariel.js"},"engines":{"node":">= 0.6"},"dependencies":{"coffee-script":"1.2.x","optimist":"0.3.x","colors":"0.6.x","file":">= 0.2.x","mocha":">= 1.x.x","coveraje":"0.2.3","uglify-js":">= 1.2"},"devDependencies":{"should":">= 0.5.1","wrench":">= 1.3.6","runforcover":">= 0.0.1"},"optionalDependencies":{},"bundleDependencies":["coveraje"],"_npmUser":{"name":"matthiasg","email":"m.goetzke@curasystems.de"},"_id":"ariel@0.0.7","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"832140ae8b003ae62a892f9453d227f1fc414acd","tarball":"http://registry.npmjs.org/ariel/-/ariel-0.0.7.tgz"},"maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}]},"0.0.8":{"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","version":"0.0.8","homepage":"https://github.com/matthiasg/node-ariel","repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"main":"./index.js","scripts":{"start":"node ./bin/ariel","test":"node node_modules/mocha/bin/mocha"},"bin":{"ariel":"./bin/ariel.js"},"engines":{"node":">= 0.6"},"dependencies":{"coffee-script":"1.2.x","optimist":"0.3.x","colors":"0.6.x","file":">= 0.2.x","mocha":">= 1.x.x","coveraje":"0.2.3","uglify-js":">= 1.2"},"devDependencies":{"should":">= 0.5.1","wrench":">= 1.3.6","runforcover":">= 0.0.1"},"optionalDependencies":{},"bundleDependencies":["coveraje"],"_npmUser":{"name":"matthiasg","email":"m.goetzke@curasystems.de"},"_id":"ariel@0.0.8","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0e4b192ef7d6c25c69db05724730a1e18c6e245d","tarball":"http://registry.npmjs.org/ariel/-/ariel-0.0.8.tgz"},"maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}]},"0.0.9":{"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"name":"ariel","description":"continuously test and cover files using mocha and coveraje. Note: ariel requires an index.js in root as entry point for now.","version":"0.0.9","homepage":"https://github.com/matthiasg/node-ariel","repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"main":"./index.js","scripts":{"start":"node ./bin/ariel","test":"node node_modules/mocha/bin/mocha"},"bin":{"ariel":"./bin/ariel.js"},"engines":{"node":">= 0.6"},"dependencies":{"coffee-script":"1.2.x","optimist":"0.3.x","colors":"0.6.x","file":">= 0.2.x","mocha":">= 1.x.x","coveraje":"0.2.3","uglify-js":">= 1.2"},"devDependencies":{"should":">= 0.5.1","wrench":">= 1.3.6","runforcover":">= 0.0.1"},"optionalDependencies":{},"bundleDependencies":["coveraje"],"_npmUser":{"name":"matthiasg","email":"m.goetzke@curasystems.de"},"_id":"ariel@0.0.9","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5eb3f4298ea6916eae32a004ceba0030198e7ed4","tarball":"http://registry.npmjs.org/ariel/-/ariel-0.0.9.tgz"},"maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}]}},"readme":"Ariel\r\n=====\r\nAs in 'The Tempest' [Ariel][w] is a the magicians eyes and ears, dutifully watching code and listening to coverage going up and down. \r\n\r\nGetting Started\r\n---------------\r\n\r\n    npm install ariel\r\n\r\ncreate a *mocha.opts* file in your local 'test' directory.\r\nShould look something like\r\n\r\n    --require should \r\n    --reporter tap\r\n    --ui bdd\r\n    --growl\r\n\r\nif you want to write and test coffee-script then do\r\n\r\n    npm install coffee-script \r\n\r\ncreate an index.js importing all relevant modules from your lib folder. These will be inspected for coverage.\r\nwrite your mocha tests in the 'test' directory. You can write them in coffee script or javascript. \r\n\r\nstart ariel from \"node_modules/.bin\"\r\n\r\nor if you have ./node_modules/.bin\" in your path then just type:\r\n\r\n\tariel\r\n\r\nRunning\r\n-------\r\n\r\nWhen ariel starts it compiles all coffee files into js files in order to allow\r\nfor coverage and easier debugging (line number matches and coffee compiler issues).\r\nThese automatically compiled files are deleted when ariel is exited (CTRL-C). It will recompile whenever a change is detected to a coffee file.\r\n\r\nWhenever a test is detected or a change to any source file is detected a re-run of all tests is initiated and coverage is recalculated.\r\n\r\nYou can look at coverage in the webbrowser. The url is written to the console. only files included from index.js in the root are covered, so make sure you\r\nrequire them from there.\r\n\r\nCommand Line Arguments\r\n----------------------\r\n--cc or --coverageConsole will output coverage to the console as a single metric instead of starting the server\r\n\r\n\r\nBased On\r\n--------\r\nThe awesome coveraje (had to bundle it though since i had to make a minor change which i will try to push into the original)\r\nmocha\r\noptimist\r\n...\r\n\r\n\r\n[w]: http://en.wikipedia.org/wiki/Ariel_(The_Tempest)\r\n\r\n[![Build Status](https://secure.travis-ci.org/matthiasg/node-ariel.png?branch=master)](http://travis-ci.org/matthiasg/node-ariel)\r\n\r\nOther tools that might come in handy\r\n====================================\r\n\r\n[Growl][g] ([Windows][gw]) with [Risor][gr] installed is very helpful. I like Risor because i find it more apparent and yet unobtrusive than getting a similiar bar from the top :). Dont forget to install [growlnotify][gn] on windows (i also put it into dev-tools though.)\r\n\r\n[g]: http://www.growl.info\r\n[gw]: http://www.growlforwindows.com\r\n[gr]: http://www.growlforwindows.com/gfw/displays/risor\r\n[gn]: http://www.growlforwindows.com/gfw/help/growlnotify.aspx\r\n\r\n\r\n","maintainers":[{"name":"matthiasg","email":"m.goetzke@curasystems.de"}],"time":{"modified":"2012-04-12T12:52:23.519Z","created":"2012-02-27T09:43:58.791Z","0.0.4":"2012-02-27T09:44:01.112Z","0.0.5":"2012-02-27T09:49:22.189Z","0.0.6":"2012-04-12T12:23:55.802Z","0.0.7":"2012-04-12T12:31:41.852Z","0.0.8":"2012-04-12T12:39:48.739Z","0.0.9":"2012-04-12T12:52:23.519Z"},"author":{"name":"Matthias Goetzke","email":"m.goetzke@curasystems.de","url":"https://twitter.com/mgoetzke"},"repository":{"type":"git","url":"git@github.com:matthiasg/node-ariel.git"},"_attachments":{"ariel-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Ub+Z7v3NwcVGazlJR3eorw==","length":1540023,"stub":true},"ariel-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-PMk36k4Vi20OCdaZNqa9Jw==","length":1539947,"stub":true},"ariel-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-C1niv7rjo0wgpoJBMxWvfg==","length":1539950,"stub":true},"ariel-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+/CeV7JPHxvM6q+b0cqOrA==","length":336087,"stub":true},"ariel-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kaEBYgIC+urpXfo+Y2qLeg==","length":39544,"stub":true},"ariel-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EHE7B7IFNjvcUDaDBwWRhg==","length":39542,"stub":true}}}},
{"id":"aries","key":"aries","value":{"rev":"3-74fde3a09ea8c724fb1b86fbac52889d"},"doc":{"_id":"aries","_rev":"3-74fde3a09ea8c724fb1b86fbac52889d","name":"aries","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"aries","author":{"name":"Eldar Djafarov","email":"djkojb@gmail.com"},"contributors":[{"name":"Eldar Djafarov","email":"djkojb@gmail.com"}],"version":"0.0.1","dependencies":{"log4js":"0.3.9","ClassLoader":"0.0.1","jsSourceCodeParser":"0.0.1","ejs":"0.4.3","connect":"1.7.1"},"scripts":{"start":"node ./main.js"},"bin":{"aries-start":"./main.js"},"main":"./main.js","config":{"port":"8080","host":"localhost"},"_npmJsonOpts":{"file":"/home/Dj/.npm/aries/0.0.1/package/package.json","wscript":false,"serverjs":false,"contributors":false},"_id":"aries@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"c5b3228afa4cd3a92258f5a804ebcc22f113c9fd","tarball":"http://registry.npmjs.org/aries/-/aries-0.0.1.tgz"},"maintainers":[{"name":"edjafarov","email":"djkojb@gmail.com"}]}},"maintainers":[{"name":"edjafarov","email":"djkojb@gmail.com"}],"time":{"modified":"2011-09-28T07:17:09.886Z","created":"2011-09-28T07:17:09.001Z","0.0.1":"2011-09-28T07:17:09.886Z"},"author":{"name":"Eldar Djafarov","email":"djkojb@gmail.com"},"_attachments":{"aries-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UTWcnNZnsJzWvpCGGfx/fA==","length":28812,"stub":true}}}},
{"id":"armory","key":"armory","value":{"rev":"49-67274245f29f2db00ad553872936f2ee"},"doc":{"_id":"armory","_rev":"49-67274245f29f2db00ad553872936f2ee","name":"armory","description":"A simple wrapper for the WoW Armory API.","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"armory","version":"0.1.0","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"devDependencies":{"nodeunit":">=0.5.1","jshint":">=0.2.0"},"engines":["node >= 0.4.0"],"_id":"armory@0.1.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a2a4677adc5fdfb22199b48b732eb75ad5634aea","tarball":"http://registry.npmjs.org/armory/-/armory-0.1.0.tgz"}},"0.1.1":{"name":"armory","version":"0.1.1","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"devDependencies":{"nodeunit":">=0.5.1","jshint":">=0.2.0"},"engines":["node >= 0.4.0"],"_id":"armory@0.1.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1e7444cfc036f2232cfd74ae659de727a21195e1","tarball":"http://registry.npmjs.org/armory/-/armory-0.1.1.tgz"}},"0.1.2":{"name":"armory","version":"0.1.2","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"engines":["node >= 0.4.0"],"devDependencies":{},"_id":"armory@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"3a7269a66bf4c27fe26fc6f3cdf5a1c6b2ee0e59","tarball":"http://registry.npmjs.org/armory/-/armory-0.1.2.tgz"},"scripts":{},"directories":{}},"0.1.3":{"name":"armory","version":"0.1.3","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"engines":["node >= 0.4.0"],"devDependencies":{},"_id":"armory@0.1.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"75067aa4361b267dafd1ff5dd66892dc63b97081","tarball":"http://registry.npmjs.org/armory/-/armory-0.1.3.tgz"},"scripts":{},"directories":{}},"0.2.0":{"name":"armory","version":"0.2.0","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"engines":["node >= 0.4.0"],"_npmJsonOpts":{"file":"/Users/christian/.npm/armory/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"armory@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"67b3eb67b15101844af6a76916fc24144613b866","tarball":"http://registry.npmjs.org/armory/-/armory-0.2.0.tgz"},"scripts":{},"directories":{}},"0.2.1":{"name":"armory","version":"0.2.1","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"engines":["node >= 0.4.0"],"_npmJsonOpts":{"file":"/Users/christian/.npm/armory/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"armory@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"96129293b1314d469938cbeb38848c5118fea3be","tarball":"http://registry.npmjs.org/armory/-/armory-0.2.1.tgz"},"scripts":{}},"0.3.0":{"name":"armory","version":"0.3.0","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"engines":["node >= 0.4.0"],"_npmJsonOpts":{"file":"/Users/xtian/.npm/armory/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"armory@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"008cbed38edc4c79fe72c51666faca9365715ebf","tarball":"http://registry.npmjs.org/armory/-/armory-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}]},"0.3.1":{"name":"armory","version":"0.3.1","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"./lib/armory","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":">=1.9.5"},"engines":["node >= 0.4.0"],"_npmJsonOpts":{"file":"/Users/xtian/.npm/armory/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"armory@0.3.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"b5a671b95733ae1385d61876dc1482eda1ce48e7","tarball":"http://registry.npmjs.org/armory/-/armory-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}]},"0.4.0":{"name":"armory","version":"0.4.0","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"bugs":{"url":"https://github.com/xtian/node-armory/issues"},"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"index.js","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":"~2"},"devDependencies":{"nodeunit":"~0.5.5"},"engines":["node >= 0.4.0"],"_npmUser":{"name":"xtian","email":"christian@cwesselhoeft.com"},"_id":"armory@0.4.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.5.11-pre","_defaultsLoaded":true,"dist":{"shasum":"02a95a1c5fc27e71e6cc6368e9d6ae17ce941de6","tarball":"http://registry.npmjs.org/armory/-/armory-0.4.0.tgz"},"maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}]},"0.4.1":{"name":"armory","version":"0.4.1","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"bugs":{"url":"https://github.com/xtian/node-armory/issues"},"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"index.js","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":"~2"},"devDependencies":{"nodeunit":"~0.5.5"},"engines":["node >= 0.4.0"],"_npmUser":{"name":"xtian","email":"christian@cwesselhoeft.com"},"_id":"armory@0.4.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6-pre","_defaultsLoaded":true,"dist":{"shasum":"315a82638cb433669aa327fce1ce53505a2021f5","tarball":"http://registry.npmjs.org/armory/-/armory-0.4.1.tgz"},"maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}]},"0.4.2":{"name":"armory","version":"0.4.2","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory"],"bugs":{"url":"https://github.com/xtian/node-armory/issues"},"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"index.js","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":"~2"},"devDependencies":{"nodeunit":"~0.6.4"},"engines":["node >= 0.4.0"],"_npmUser":{"name":"xtian","email":"christian@cwesselhoeft.com"},"_id":"armory@0.4.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.8-pre","_defaultsLoaded":true,"dist":{"shasum":"3bfb95e44a8f02f878f6d87f8c3694db6f5fd5d7","tarball":"http://registry.npmjs.org/armory/-/armory-0.4.2.tgz"},"readme":"# node-armory\n\nA simple [node.js](http://github.com/joyent/node) wrapper around Blizzard's [REST API for World of Warcraft](http://blizzard.github.com/api-wow-docs/).\n\n## Installation\n\n    npm install armory\n\n\n## Documentation\n\n\nAll options objects can have the following properties:\n\n* `names`|`ids`\n* `region` _(optional)_\n* `locale` _(optional)_\n* `lastModified` _(optional)_\n\nNote: `names` and `ids` are interchangeable, and `locale` and `lastModified` do not affect all API methods.\n\n***\n### auction(options, callback)\n### auction(realms, [region, locale,] callback)\nRetrieves an array of auction data URLs.\n\n### auctionData(options, callback)\n### auctionData(realms, [region, locale,] callback)\nRetrieves an object of data from the first auction data URL provided by the API.\n\n    armory.auctionData('Shadowmoon', function(err, res) {\n\n        var agiPots = res.alliance.auctions.filter(function(auction) {\n            return auction.item === 58145;\n        });\n    });\n\nThe first argument can be a string, an array, or an object.\n\n[Auction API Documentation](http://blizzard.github.com/api-wow-docs/#id3381986)\n\n\n***\n### arena(options, callback)\n### arena('Name\\_Size\\_Realm', [region, locale,] callback)\nRetrieves an object containing data about an arena team.\n\n    armory.arena('No Dairy_2v2_Shadowmoon', function(err, team) {\n\n        var ratio = team.gamesWon / team.gamesLost;\n    });\n\n`options` can be a string in the form `'Name_Size_Realm'` or an object with the following additional properties:\n\n* `size` _(optional)_\n* `realm` _(optional)_\n\nStrings in the form `'Name_Size_Realm'`, `'Name_Size'`, or `'Name_Realm'` can be used in the `names` property. Parameters specified in these strings will override those provided in the `options` object.\n\n[Arena Team API Documentation](http://blizzard.github.com/api-wow-docs/#id3382144)\n\n***\n### character(options, callback)\n### character('Name\\_Realm', [region, locale,] callback)\nRetrieves an object containing data about a character.\n### guild(options, callback)\n### guild('Name\\_Realm', [region, locale,] callback)\nRetrieves an object containing data about a guild.\n\n    armory.guild({\n        names: 'The Gentlemens Club',\n        fields: ['members'],\n        realm: 'Shadowmoon'\n\n    }, function(err, guild) {\n\n        var dwarves = guild.members.filter(function(member) {\n            return member.character.race === 3;\n\n        }).map(function(member) {\n            return member.character.name;\n        });\n\n        var hairColors = [];\n\n        armory.character({\n            names: dwarves,\n            fields: ['appearance'],\n            realm: 'Shadowmoon'\n\n        }, function(err, character) {\n            if (err) return;\n            hairColors.push(character.appearance.hairColor);\n        });\n    });\n\n`options` can be a string in the form `'Name_Realm'` or an object with the following additional properties:\n\n* `fields` _(optional)_: must be an array\n* `realm` _(optional)_\n\nStrings in the form `'Name_Realm'` can be used in the `names` property. Parameters specified in these strings will override those provided in the `options` object.\n\n[Character API Documentation](http://blizzard.github.com/api-wow-docs/#id3380312)\n\n[Guild API Documentation](http://blizzard.github.com/api-wow-docs/#id3381560)\n\n\n***\n### item(options, callback)\n### item(ids, [region, locale,] callback)\nRetrieves an object containing data about an item.\n### quest(options, callback)\n### quest(ids, [region, locale,] callback)\nRetrieves an object containing data about a quest.\n### recipe(options, callback)\n### recipe(ids, [region, locale,] callback)\nRetrieves an object containing data about a recipe.\n\n    var avgILvl = 0,\n        i = 0;\n\n    armory.item([28275, 27903, 28041], function(err, item) {\n        avgILvl += item.itemLevel;\n        i++;\n\n        if (i === 3) {\n            avgILvl /= 3;\n        }\n    });\n\nThe first argument can be a single item ID, an array of IDs, or an object.\n\n[Item API Documentation](http://blizzard.github.com/api-wow-docs/#id3382086)\n\n\n***\n### ladder(options, callback)\n### ladder(sizes, battlegroup, [region, locale,] callback)\nRetrieves an array of objects containing data about arena teams for the given ladder and battlegroup.\n\n    armory.ladder('2v2', 'Vindication', function(err, ladder) {\n\n        var factionCount = ladder.reduce(function(array, team) {\n            array[team.side === 'alliance' ? 0 : 1]++;\n            return array;\n        }, [0, 0])\n    });\n\nThe first argument can be a single ladder type, an array of ladder types, or an object with the following additional properties:\n\n* `battlegroup`\n\n\n***\n### realmStatus([realms, region, locale,] callback)\nRetrieves an array containing the status of one or more realms.\n\n    armory.realmStatus(function(err, realms) {\n\n        var queued = realms.filter(function(realm) {\n            return realm.queue;\n        });\n    });\n\nA realm name or array of realm names can be passed as the first argument. If no names are provided, the status of all realms will be returned.\n\n[Realm Status API Documentation](http://blizzard.github.com/api-wow-docs/#id3381933)\n\n\n***\n### battlegroups([region, locale,] callback)\nRetrieves a static array of all battlegroup names.\n### characterAchievements([region, locale,] callback)\nRetrieves a static array of all character achievements.\n### classes([region, locale,] callback)\nRetrieves a static array of data about character classes.\n### guildAchievements([region, locale,] callback)\nRetrieves a static array of all guild achievements.\n### perks([region, locale,] callback)\nRetrieves a static array of data about guild perks.\n### races([region, locale,] callback)\nRetrieves a static array of data about character races.\n### rewards([region, locale,] callback)\nRetrieves a static array of data about guild rewards.\n\n    armory.classes('es_MX', function(err, res) {\n        console.log('Yo puede jugar un ' + res[9].name);\n    });\n\n[Data API Documentation](http://blizzard.github.com/api-wow-docs/#id3382202)\n\n\n***\n### Properties\n#### defaultRegion\nThe region to use if none is specified. `'us'` by default.\n\n#### publicKey, privateKey\nKeys to use for generating an authorization header.\n\n[Authentication Documentation](http://blizzard.github.com/api-wow-docs/#id3379854)\n\n\n### Notes on usage:\n\n* If an error occurs (including API errors), it will be passed as an Error object to the first argument of the callback with its message in the `message` property. Otherwise, the API response will passed as the second argument.\n* Except for `realmStatus()`, all methods invoke the callback once for each resource requested.\n* `lastModified` must be a GMT Unix timestamp. If the requested resource has not been modified since the time of `lastModifed`, the callback will be invoked with both arguments empty.\n* [Locale documentation](http://blizzard.github.com/api-wow-docs/#id3379677).\n","maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}]},"0.5.0":{"name":"armory","version":"0.5.0","description":"A simple wrapper for the WoW Armory API.","keywords":["wow","warcraft","armory","api","blizzard"],"bugs":{"url":"https://github.com/xtian/node-armory/issues"},"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"main":"index.js","repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"dependencies":{"request":"~2"},"devDependencies":{"tap":"~0.2.0","jshint":"~0.5.0","wowhead":"~0.1.0"},"scripts":{"test":"make test"},"engines":["node >= 0.4.0"],"_npmUser":{"name":"xtian","email":"christian@cwesselhoeft.com"},"_id":"armory@0.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.14-pre","_defaultsLoaded":true,"dist":{"shasum":"51b0c6caa9969fbd4985a233586f9432681d94ab","tarball":"http://registry.npmjs.org/armory/-/armory-0.5.0.tgz"},"readme":"# node-armory\n\nA simple [node.js](http://github.com/joyent/node) wrapper around Blizzard's [REST API for World of Warcraft](http://blizzard.github.com/api-wow-docs/).\n\n## Installation\n\n    npm install armory\n    npm install wowhead  # optional\n\nIf the [wowhead](http://github.com/xtian/node-wowhead) module is installed, it will be used as a fallback [when item requests fail](http://us.battle.net/wow/en/forum/topic/3657606329).\n\n\n## Documentation\n\n\nExcept for the static APIs, all options objects can have the following properties:\n\n* `name`|`id`\n* `lastModified` _(optional)_\n* `locale` _(optional)_\n* `region`\n\nNote: `name` and `id` are interchangeable, and `locale` and `lastModified` do not affect all API methods.\n\n***\n### auction(options, callback)\nRetrieves an array of auction data URLs.\n\n### auctionData(options, callback)\nRetrieves an object of data from the first auction data URL provided by the API.\n\n    armory.auctionData({ name: 'Shadowmoon', region: 'us' }, function(err, res) {\n\n        var agiPots = res.alliance.auctions.filter(function(auction) {\n            return auction.item === 58145;\n        });\n    });\n\n[Auction API Documentation](http://blizzard.github.com/api-wow-docs/#id3381986)\n\n\n***\n### arena(options, callback)\nRetrieves an object containing data about an arena team.\n\n    armory.arena({\n        name: 'No Dairy',\n        size: '2v2',\n        realm: 'Shadowmoon',\n        region: 'us'\n\n    }, function(err, team) {\n        var ratio = team.gamesWon / team.gamesLost;\n    });\n\nAdditional options:\n\n* `realm`\n* `size`\n\n[Arena Team API Documentation](http://blizzard.github.com/api-wow-docs/#id3382144)\n\n***\n### character(options, callback)\nRetrieves an object containing data about a character.\n### guild(options, callback)\nRetrieves an object containing data about a guild.\n\n    var armory = require('armory').defaults({\n        realm: 'Shadowmoon',\n        region: 'us'\n    });\n\n    armory.guild({\n        name: 'The Gentlemens Club',\n        fields: ['members']\n\n    }, function(err, guild) {\n\n        var dwarvenHairColors = [];\n\n        guild.members.filter(function(member) {\n            return member.character.race === 3;\n\n        }).map(function(member) {\n            return member.character.name;\n\n        }).forEach(function(dwarf) {\n            armory.character({\n                name: dwarf,\n                fields: ['appearance']\n\n            }, function(err, character) {\n                hairColors.push(character.appearance.hairColor);\n            });\n        });\n    });\n\nAdditional options:\n\n* `fields` _(optional)_: must be an array\n* `realm`\n\n[Character API Documentation](http://blizzard.github.com/api-wow-docs/#id3380312)\n\n[Guild API Documentation](http://blizzard.github.com/api-wow-docs/#id3381560)\n\n\n***\n### defaults(options)\nReturns a new instance of the module where all options will default to the provided values. If the first argument of a method is a number or string, it will be used as the `name` option.\n\n    var armory = require('armory').defaults({\n        name: 'Dargonaut',\n        realm: 'Shadowmoon',\n        region: 'us'\n    });\n\n    armory.character(function(err, character) {\n        console.log(character.name);\n    });\n\n    armory.character('Dewbaca', function(err, character) {\n        console.log(character.name);\n    });\n\n    armory.character({\n        name: 'Talent',\n        realm: 'Lightbringer'\n\n    }, function(err, character) {\n        console.log(character.name);\n    });\n\n\n***\n### item(options, callback)\nRetrieves an object containing data about an item.\n### quest(options, callback)\nRetrieves an object containing data about a quest.\n### recipe(options, callback)\nRetrieves an object containing data about a recipe.\n\n    var armory = require('armory').defaults({ region: 'us' });\n\n    var avgILvl = 0,\n        i = 0;\n\n    [28275, 27903, 28041].forEach(function(id) {\n        armory.item(id, function(err, item) {\n            avgILvl += item.itemLevel;\n            i++;\n\n            if (i === 3) {\n                avgILvl /= 3;\n            }\n        });\n    });\n\nAdditional options:\n\n* `fallback`: Setting to `false` disables Wowhead fallback.\n\n[Item API Documentation](http://blizzard.github.com/api-wow-docs/#id3382086)\n\n\n***\n### ladder(options, callback)\nRetrieves an array of objects containing data about arena teams for the given ladder and battlegroup.\n\n    armory.ladder({\n        id: '2v2',\n        battlegroup: 'Vindication',\n        region: 'us'\n\n    }, function(err, ladder) {\n\n        var factionCount = ladder.reduce(function(array, team) {\n            array[team.side === 'alliance' ? 0 : 1]++;\n            return array;\n        }, [0, 0]);\n    });\n\nAdditional options:\n\n* `battlegroup`\n\n\n***\n### realmStatus(options, callback)\nRetrieves an array containing the status of one or more realms.\n\n    armory.realmStatus({ region: 'us' }, function(err, realms) {\n\n        var queued = realms.filter(function(realm) {\n            return realm.queue;\n        });\n    });\n\nA single realm name or an array of realm names can be passed. If no names are provided, the status of all realms will be returned.\n\n[Realm Status API Documentation](http://blizzard.github.com/api-wow-docs/#id3381933)\n\n\n***\n### battlegroups(options, callback)\nRetrieves a static array of all battlegroup names.\n### characterAchievements(options, callback)\nRetrieves a static array of all character achievements.\n### classes(options, callback)\nRetrieves a static array of data about character classes.\n### guildAchievements(options, callback)\nRetrieves a static array of all guild achievements.\n### perks(options, callback)\nRetrieves a static array of data about guild perks.\n### races(options, callback)\nRetrieves a static array of data about character races.\n### rewards(options, callback)\nRetrieves a static array of data about guild rewards.\n\n    armory.classes({ region: 'us', locale: 'es_MX' }, function(err, res) {\n        console.log('Yo puede jugar un ' + res[9].name);\n    });\n\n`id` and `name` are not used by these methods.\n\n[Data API Documentation](http://blizzard.github.com/api-wow-docs/#id3382202)\n\n\n***\n### Properties\n#### publicKey, privateKey\nKeys to use for generating an authorization header.\n\n[Authentication Documentation](http://blizzard.github.com/api-wow-docs/#id3379854)\n\n\n### Notes on usage:\n\n* If an error occurs (including API errors), it will be passed as an Error object to the first argument of the callback with its message in the `message` property. Otherwise, the API response will passed as the second argument.\n* `lastModified` must be a GMT Unix timestamp. If the requested resource has not been modified since the time of `lastModifed`, the callback will be invoked with both arguments empty.\n* [Locale documentation](http://blizzard.github.com/api-wow-docs/#id3379677).\n","maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}]}},"maintainers":[{"name":"xtian","email":"christian@cwesselhoeft.com"}],"time":{"modified":"2012-03-19T14:56:10.622Z","created":"2011-04-17T05:44:13.908Z","0.1.0":"2011-04-17T05:44:14.215Z","0.1.1":"2011-04-18T15:28:46.838Z","0.1.2":"2011-05-29T22:50:44.267Z","0.1.3":"2011-05-30T12:57:19.567Z","0.2.0":"2011-06-22T14:00:25.336Z","0.2.1":"2011-07-28T17:03:48.748Z","0.3.0":"2011-08-08T01:52:04.717Z","0.3.1":"2011-08-10T23:15:21.908Z","0.4.0":"2011-10-23T23:22:35.112Z","0.4.1":"2011-12-16T15:49:39.063Z","0.4.2":"2012-01-15T01:41:54.009Z","0.5.0":"2012-03-19T14:56:10.622Z"},"author":{"name":"Christian Wesselhoeft","email":"christian@cwesselhoeft.com"},"repository":{"type":"git","url":"git://github.com/xtian/node-armory.git"},"_attachments":{"armory-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-pUn5kbVxUiTbmfDHNBKbBg==","length":6860,"stub":true},"armory-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-EmKxZ5lLpogztqeWxvcyzg==","length":7889,"stub":true},"armory-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-7T4AbWQb+/No/MGe2uyGyQ==","length":10240,"stub":true},"armory-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-6PewrlnB5FiXMXU3IKTJKA==","length":10240,"stub":true},"armory-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-julcdy2UPTYnD0Nl9Cl/bg==","length":6994,"stub":true},"armory-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-9sTQPBaJSZHJZXjz0aWj2A==","length":6939,"stub":true},"armory-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-nwteMRRkNDXdbPEVsXG8lA==","length":5189,"stub":true},"armory-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-1M2NmcMguDypnEvnUS/f7A==","length":4939,"stub":true},"armory-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-SN2sblxOYBp8Y/zyVBs0Og==","length":2677,"stub":true},"armory-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-sb6ollQPC7bnq55jMHJ38A==","length":2724,"stub":true},"armory-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pSAVGjS8oTWSzFks3kFuPA==","length":2582,"stub":true},"armory-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gJ5B5FUXsDUuyQnseaNcCQ==","length":2455,"stub":true}}}},
{"id":"arnold","key":"arnold","value":{"rev":"3-4896fc8d02b8623f47a024f0dbfa44bf"},"doc":{"_id":"arnold","_rev":"3-4896fc8d02b8623f47a024f0dbfa44bf","name":"arnold","description":"Tiny JavaScript library for string manipulation.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"arnold","description":"Tiny JavaScript library for string manipulation.","version":"0.1.0","author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"devDependencies":{"nodeunit":"0.5.1"},"keywords":[],"repository":{"type":"git","url":"git://github.com/Baggz/Arnold.git"},"homepage":"https://github.com/Baggz/Arnold","engines":{"node":">= 0.3.0"},"bugs":{"url":"https://github.com/Baggz/Arnold/issues"},"licenses":[{"type":"MIT","url":"https://github.com/Baggz/Arnold/blob/master/README.md"}],"_npmJsonOpts":{"file":"/Users/frantisekhaba/.npm/arnold/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arnold@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e068e6ef0ae0dc9d19124318cfc8722cbfca7f77","tarball":"http://registry.npmjs.org/arnold/-/arnold-0.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"baggz","email":"hello@frantisekhaba.com"}],"time":{"modified":"2011-07-24T20:41:59.904Z","created":"2011-07-24T20:41:59.120Z","0.1.0":"2011-07-24T20:41:59.904Z"},"author":{"name":"František Hába","email":"hello@frantisekhaba.com"},"repository":{"type":"git","url":"git://github.com/Baggz/Arnold.git"},"_attachments":{"arnold-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-w057ms2c2YSRB92sKBVcLg==","length":6994,"stub":true}}}},
{"id":"arouter","key":"arouter","value":{"rev":"7-55cab1f7128df54f27be94039a8d8dc5"},"doc":{"_id":"arouter","_rev":"7-55cab1f7128df54f27be94039a8d8dc5","name":"arouter","description":"A very simple router","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Rafal Szymanski","email":"me@rafal.io","url":"http://rafal.io"},"name":"arouter","description":"A very simple router","version":"0.0.1","homepage":"http://github.com/radicality/arouter","repository":{"url":""},"keywords":["router"],"main":"./arouter.js","dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/rafal/.npm/arouter/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arouter@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"36492193f56b7ac5cb4cc4847f0bfc113b62733c","tarball":"http://registry.npmjs.org/arouter/-/arouter-0.0.1.tgz"},"scripts":{}},"0.0.11":{"author":{"name":"Rafal Szymanski","email":"me@rafal.io","url":"http://rafal.io"},"name":"arouter","description":"A very simple router","version":"0.0.11","homepage":"http://github.com/radicality/arouter","repository":{"url":"http://github.com/radicality/arouter"},"keywords":["router"],"main":"./arouter.js","dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/rafal/.npm/arouter/0.0.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arouter@0.0.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c6e2494f5800c8cbcad5e7eaae950472d83d5735","tarball":"http://registry.npmjs.org/arouter/-/arouter-0.0.11.tgz"},"scripts":{}},"0.0.2":{"author":"","name":"arouter","description":"A very simple router","version":"0.0.2","homepage":"http://github.com/radicality/arouter","repository":{"url":"http://github.com/radicality/arouter"},"keywords":["router"],"main":"./arouter.js","dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/rafal/.npm/arouter/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arouter@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"609f6f72291a7dbd6c1d3117592d7a490b88b746","tarball":"http://registry.npmjs.org/arouter/-/arouter-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"radicality","email":"me@rafal.io"}]}},"maintainers":[{"name":"radicality","email":"me@rafal.io"}],"time":{"modified":"2011-08-06T20:57:58.032Z","created":"2011-07-26T21:47:27.572Z","0.0.1":"2011-07-26T21:47:28.062Z","0.0.11":"2011-07-26T22:39:11.701Z","0.0.2":"2011-08-06T20:57:58.032Z"},"author":{"name":"Rafal Szymanski","email":"me@rafal.io","url":"http://rafal.io"},"repository":{"url":"http://github.com/radicality/arouter"},"_attachments":{"arouter-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+e9bEolDtlalJ+kEcq2opg==","length":1343,"stub":true},"arouter-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8zt1XX0j/vL1F3Oaym9FFg==","length":1142,"stub":true},"arouter-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-B+Dkn7gdJnwZtK+W9o+mCw==","length":711,"stub":true}}}},
{"id":"arp","key":"arp","value":{"rev":"3-d9202eeaef0247d42053684fcf0d71d5"},"doc":{"_id":"arp","_rev":"3-d9202eeaef0247d42053684fcf0d71d5","name":"arp","description":"Read the ARP table to find MAC addresses","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"arp","version":"0.0.1","description":"Read the ARP table to find MAC addresses","dependencies":{"nodeunit":">=0.5.2"},"directories":{"lib":"./lib"},"main":"./lib/arp","engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/teknopaul/arp.git"},"author":{"name":"teknopaul"},"_npmUser":{"name":"teknopaul","email":"teknopaul@gmail.com"},"_id":"arp@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.1-pre","_defaultsLoaded":true,"dist":{"shasum":"a6b0b1223503b47a2de356da895d9ddd722a958d","tarball":"http://registry.npmjs.org/arp/-/arp-0.0.1.tgz"},"maintainers":[{"name":"teknopaul","email":"teknopaul@gmail.com"}]}},"maintainers":[{"name":"teknopaul","email":"teknopaul@gmail.com"}],"time":{"modified":"2011-11-29T21:00:56.271Z","created":"2011-11-29T21:00:53.859Z","0.0.1":"2011-11-29T21:00:56.271Z"},"author":{"name":"teknopaul"},"repository":{"type":"git","url":"git://github.com/teknopaul/arp.git"},"_attachments":{"arp-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0JVxTLxiv6IS7wjhSJlAzQ==","length":1733,"stub":true}}}},
{"id":"array","key":"array","value":{"rev":"9-78c98310a4f8f5aaa698896f5df669e6"},"doc":{"_id":"array","_rev":"9-78c98310a4f8f5aaa698896f5df669e6","name":"array","description":"JavaScript array utilities library","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.0":{"author":{"name":"Enrico Marino","email":"enrico.marino@email.com"},"name":"array","description":"JavaScript array utilities library","version":"0.0.0","homepage":"https://github.com/onirame/array","repository":{"type":"git","url":"git://github.com/onirame/array.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"array@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"5e5f37d4e28eff84c9144f1440c0fa7ed97d4894","tarball":"http://registry.npmjs.org/array/-/array-0.0.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]},"0.1.0":{"author":{"name":"Enrico Marino","email":"enrico.marino@email.com"},"name":"array","description":"JavaScript array utilities library","version":"0.1.0","homepage":"https://github.com/onirame/array","repository":{"type":"git","url":"git://github.com/onirame/array.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"array@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"95e63d44c0c4d7e1b472a18039dc94a7215681c9","tarball":"http://registry.npmjs.org/array/-/array-0.1.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]},"0.2.0":{"author":{"name":"Enrico Marino","email":"enrico.marino@email.com"},"name":"array","description":"JavaScript array utilities library","version":"0.2.0","homepage":"https://github.com/onirame/array","repository":{"type":"git","url":"git://github.com/onirame/array.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"array@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"75668828a4236c77640ce1cb53bf467667a22081","tarball":"http://registry.npmjs.org/array/-/array-0.2.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]},"0.3.0":{"author":{"name":"Enrico Marino","email":"enrico.marino@email.com"},"name":"array","description":"JavaScript array utilities library","version":"0.3.0","homepage":"https://github.com/onirame/array","repository":{"type":"git","url":"git://github.com/onirame/array.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"array@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"b2e48ee7372a40c0b712c3fde99dd2fe9e43c0a4","tarball":"http://registry.npmjs.org/array/-/array-0.3.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]}},"readme":"# array\n\nJavaScript array utilities library\n\n## installation\n\n    $ npm install array\n\n## License\n\nMIT License\n\nCopyright (c) 2011 Enrico Marino &lt;enrico.marino@email.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}],"time":{"modified":"2011-12-10T17:19:01.174Z","created":"2011-12-10T14:12:48.951Z","0.0.0":"2011-12-10T14:12:51.327Z","0.1.0":"2011-12-10T16:12:42.959Z","0.2.0":"2011-12-10T16:53:35.210Z","0.3.0":"2011-12-10T17:19:01.174Z"},"author":{"name":"Enrico Marino","email":"enrico.marino@email.com"},"repository":{"type":"git","url":"git://github.com/onirame/array.git"},"_attachments":{"array-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hyLsTBoj9I7CjQGYCRbsMw==","length":10240,"stub":true},"array-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vYivdVDV3cGi+bOrDGkxZg==","length":10240,"stub":true},"array-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/37Aa+TwtwYrusG6gI3ESA==","length":10240,"stub":true},"array-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lEAlaPmRznMxCKsUukCC/w==","length":10240,"stub":true}}}},
{"id":"array-helper","key":"array-helper","value":{"rev":"3-d0bed542d9b047d32dc8a5597614b144"},"doc":{"_id":"array-helper","_rev":"3-d0bed542d9b047d32dc8a5597614b144","name":"array-helper","description":"Collection of array helper functions.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Scott Hillman"},"name":"array-helper","description":"Collection of array helper functions.","version":"0.0.1","repository":{"url":""},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"hillmanov","email":"hillmanov+npm@gmail.com"},"_id":"array-helper@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"3fcd83008d6a4f7f0da514c0c0b165fd942f7dc5","tarball":"http://registry.npmjs.org/array-helper/-/array-helper-0.0.1.tgz"},"readme":"","maintainers":[{"name":"hillmanov","email":"hillmanov+npm@gmail.com"}]}},"readme":"","maintainers":[{"name":"hillmanov","email":"hillmanov+npm@gmail.com"}],"time":{"modified":"2012-06-19T21:33:48.348Z","created":"2012-06-19T21:33:46.273Z","0.0.1":"2012-06-19T21:33:48.348Z"},"author":{"name":"Scott Hillman"},"repository":{"url":""},"_attachments":{"array-helper-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YbJtRLmFBmdDxhTowM/4UA==","length":255,"stub":true}}}},
{"id":"array-index","key":"array-index","value":{"rev":"3-a2ac87e142cf40b79e6352078c365eac"},"doc":{"_id":"array-index","_rev":"3-a2ac87e142cf40b79e6352078c365eac","name":"array-index","description":"Invoke getter/setter functions on array-like objects","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"array-index","description":"Invoke getter/setter functions on array-like objects","keywords":["index","array","getter","setter","proxy"],"version":"0.0.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/array-index.git"},"main":"./index.js","scripts":{"test":"node test"},"dependencies":{"debug":"*"},"engines":{"node":"*"},"_npmUser":{"name":"tootallnate","email":"nathan@tootallnate.net"},"_id":"array-index@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.7.10","_defaultsLoaded":true,"dist":{"shasum":"50fb00acc519286b828db7721aeb84b4c4513b84","tarball":"http://registry.npmjs.org/array-index/-/array-index-0.0.1.tgz"},"maintainers":[{"name":"tootallnate","email":"nathan@tootallnate.net"}]}},"readme":"array-index\n===========\n### Invoke getter/setter functions on array-like objects\n[![Build Status](https://secure.travis-ci.org/TooTallNate/array-index.png)](http://travis-ci.org/TooTallNate/array-index)\n\n\nThis little module provides an `ArrayIndex` constructor function that you can\ninherit from with your own objects. When a numbered property gets read, then the\n`__get__` function on the object will be invoked. When a numbered property gets\nset, then the `__set__` function on the object will be invoked.\n\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install array-index\n```\n\n\nExamples\n--------\n\n``` js\nvar ArrayIndex = require('array-index')\nvar inherits = require('util').inherits\n\nfunction MyArray (length) {\n  // be sure to call the ArrayIndex constructor in your own constructor\n  ArrayIndex.call(this, length)\n}\n\n// inherit from the ArrayIndex's prototype\ninherits(MyArray, ArrayIndex)\n\nMyArray.prototype.__get__ = function (index) {\n  return index * 2\n}\n\n\n// and now you can create some instances\nvar a = new MyArray(100)\na[0] // 0\na[1] // 2\na[2] // 4\na[3] // 6\n\na[0] = 1\n// Error: you must implement the __set__ function\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"tootallnate","email":"nathan@tootallnate.net"}],"time":{"modified":"2012-06-14T07:01:43.859Z","created":"2012-06-14T07:01:42.331Z","0.0.1":"2012-06-14T07:01:43.859Z"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/array-index.git"},"_attachments":{"array-index-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qhchsExoa67vu8pZCfPKAg==","length":2415,"stub":true}}}},
{"id":"array-promise","key":"array-promise","value":{"rev":"3-e2184561ee65de64c2dfeb57955c758f"},"doc":{"_id":"array-promise","_rev":"3-e2184561ee65de64c2dfeb57955c758f","name":"array-promise","description":"Act on asynchronously loaded arrays via forEach, map, etc without the usual, messy callback interface.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"array-promise","description":"Act on asynchronously loaded arrays via forEach, map, etc without the usual, messy callback interface.","version":"0.0.1","keywords":["node","promise","array"],"homepage":"https://github.com/bnoguchi/array-promise/","repository":"https://github.com/bnoguchi/array-promise.git","author":{"name":"Brian Noguchi","url":"https://github.com/bnoguchi/"},"main":"./index","directories":{"lib":""},"scripts":{"test":"make test"},"dependencies":{"expresso":">= 0.7.0"},"engines":{"node":">=0.2.5"},"licenses":["MIT"],"_id":"array-promise@0.0.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e826b6236d3251097af8cf88bb7f00e0dc50d8ac","tarball":"http://registry.npmjs.org/array-promise/-/array-promise-0.0.1.tgz"}}},"maintainers":[{"name":"bnoguchi","email":"brian.noguchi@gmail.com"}],"time":{"modified":"2011-01-28T22:40:22.086Z","created":"2011-01-28T22:40:21.607Z","0.0.1":"2011-01-28T22:40:22.086Z"},"author":{"name":"Brian Noguchi","url":"https://github.com/bnoguchi/"},"repository":"https://github.com/bnoguchi/array-promise.git","_attachments":{"array-promise-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cjfVq4hwvigdvhP+Hez1dg==","length":2492,"stub":true}}}},
{"id":"array-query","key":"array-query","value":{"rev":"3-9368ee2219ed499212cbb1874f0993aa"},"doc":{"_id":"array-query","_rev":"3-9368ee2219ed499212cbb1874f0993aa","name":"array-query","description":"Provides an interface to pull objects out of a JavaScript array with minimal code. Useful for Backbone collections and similar scenarios.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"array-query","description":"Provides an interface to pull objects out of a JavaScript array with minimal code. Useful for Backbone collections and similar scenarios.","author":{"name":"Jacob Wright","email":"jacwright@gmail.com"},"keywords":["array","database","query","select","where"],"version":"0.1.0","main":"lib/query","maintainers":[{"name":"jacwright","email":"jacwright@gmail.com"}],"contributors":[{"name":"Jacob Wright","email":"jacwright@gmail.com","url":"http://jacwright.com"}],"homepage":"https://github.com/jacwright/array-query","repository":{"type":"git","url":"git://github.com/jacwright/array-query.git"},"_npmUser":{"name":"jacwright","email":"jacwright@gmail.com"},"_id":"array-query@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"73a3397a2ca7e773d272a7f0d943f0354125246a","tarball":"http://registry.npmjs.org/array-query/-/array-query-0.1.0.tgz"}}},"readme":"query\n=====\n\nProvides an interface to pull objects out of a JavaScript array with minimal code. Useful for Backbone collections and similar scenarios. Can be used in the browser and on the server (node.js).\n\n## Why?\n\nThough you can do everything query provides you with the built-in Array methods (forEach, map, filter, etc), query can make it much more readable and concise.\n\n## Install\n\n```\nnpm install array-query\n```\n\nNow you can use it in your node.js project.\n\n```js\nvar query = require('array-query');\n\nvar firstJacob = query('name').startsWith('Jacob').on(users).pop();\n```\n\nOr just add the query.js file to your web page for use in your client-side JavaScript.\n\n## querying\n\nFinding objects in an array with query is easy. The API takes a property name first, then checks the value, then you can continue to add properties and checks until the `on` method is called with the array you are querying.\n\nIt is probably easier to see it in action. The following will return all users with the name Bob.\n\n```js\nvar allBobs = query('firstName').is('Bob').on(users);\n```\n\n### query Chaining\n\nWhen you call `query()` it creates a new query object which returns a reference to itself. In fact, most methods of the query object return a reference to itself enabling method chaining. For example, the following three queries are all the same.\n\n```js\nvar q1 = query(\"author\");\nq1.is(\"Terence Hanbury White\");\nq1.and(\"title\");\nq1.is(\"The Once and Future King\");\n\nvar q2 = query(\"author\").is(\"Terence Hanbury White\");\nq2.and(\"title\").is(\"The Once and Future King\");\n\nvar q3 = query(\"author\").is(\"Terence Hanbury White\").and(\"title\").is(\"The Once and Future King\");\n\nif (q1.toString() == q2.toString() == q3.toString()) alert(\"They're all the same!\");\n```\n\nMore examples:\n\n```js\nvar whiteBooks = query(\"author\").is(\"Terence Hanbury White\").on(books);\n\nvar theBooks = query(\"title\").startsWith(\"The\").on(books);\n\nvar bigBooks = query(\"pages\").gt(500).on(books);\n\nvar topTenBiggestBooks = query().sort(\"pages\").numeric().desc().limit(10).on(books);\n```\n\n### Select\n\nIf you'd rather start with the Array you may use the slightly different select().\n\n```js\nvar aBooks = select(books).where(\"title\").startsWith(\"A\").end();\n```\n\nThe two differences between `query` and `select` is that:\n\n  1. `query` ends with the array (e.g. `.on(books)`) and `select` starts with it (e.g. `select(books)`)\n  2. `select` needs to know when to be done chaining and to return the results, so it ends with `end()`\n\n## Basics\n\n### query\n\n`query` is the start of our query and may optionally take the first field we want to filter by. The `query` method does not need to take a field if you only want to sort or limit the objects.\n\n```js\nquery().sort(\"lastName\").limit(20).on(users);\n\nquery(\"age\").gt(20).on(users);\n```\n\nThe first query listed here shows using `query()` without a parameter. It sorts by lastName and limits the results to 20 objects. The second query gets all the objects where age is greater than 20. \n\n### and, or\n\nquery provides the ability to use `and()` and `or()` in putting together your query. These usually take a parameter, which can either be a field name or another query object. The field name is only the beginning of an expression and when used should be followed up with another method call such as `equals()`, `gt()`, etc.\n\n```js\nquery(\"username\").equals(\"test\").or(\"password\").equals(\"test\").on(users);\n```\n\nThis looks up all objects whose username or password is \"test\".\n\nQuery objects may be used inside the methods `and()` and `or()` to provide subqueries. This is like putting parenthesis around the expression.\n\n```js\nvar notMiddleAged = query(\"firstName\").equals(\"John\").and(query(\"age\").lt(20).or(\"age\").gt(60)));\n```\n\nThis query allows us to find all objects where the `firstName` is John and the age is either less than 20 or more than 60. We are unable to do this kind of sub-querying with the object-based API.\n\n## not\n\nThe `not()` method can be used in an expression to negate the results.\n\n```js\nquery(\"age\").not().gt(20).and(\"eyeColor\").not().equals(\"blue\").on(users);\n```\n\nThis query will get every object where age is not more than 20 and eye color is not blue.\n\n## Operations\n\n\n### is, equals\n\n`equals` is the most basic. The query should just be the value you want to match.\n\n```js\nquery(\"firstName\").is(\"John\").on(users);\n\nquery(\"lastName\").equals(\"Smith\").on(users);\n```\n\nThis will match all objects where property `firstName` equals \"John\". `is` and `equals` are synonymous.\n\n### within\n\n`within` tests whether the object's value is within a provided array of values.\n\n```js\nquery(\"firstName\").within([ \"John\", \"Jacob\", \"Jingle\", \"Heimer\" ]).on(users);\n```\n\nThis will match all objects whose firstName is \"John\", \"Jacob\", \"Jingle\", or \"Heimer\".\n\n### has\n\n`has` matches objects which have the provided value in an array.\n\n```js\ndb.add({ colors: [ \"red\", \"yellow\", \"blue\" ] });\n\nquery(\"colors\").has(\"red\").on(users);\n```\n\nThis will match the previously added object since it's colors array *has* the value \"red\". Note that if on the stored objects, colors is null or an empty array, it will not match since it doesn't have \"red\" in the colors array.\n\n### hasAll\n\n`hasAll` matches objects which have all the provided values in an array.\n\n```js\nquery(\"colors\").hasAll([\"red, \"blue\"]).on(users);\n```\n\nThis will match all objects which have both \"red\" and \"blue\" in their colors array.\n\n### startsWith\n\n`startsWith` matches the beginning of a value.\n\n```js\nquery(\"firstName\").startsWith(\"J\").on(users);\n```\n\nThis will match all objects whose `firstName` begins with \"J\".\n\n### endsWith\n\n`endsWith` matches the end of a value.\n\n```js\nquery(\"lastName\").endsWith(\"son\").on(users);\n```\n\nThis will match all objects whose `lastName` ends with \"son\".\n\n### gt\n\n`gt` matches objects whose value is greater than what's provided. Dates are supported.\n\n```js\nquery(\"age\").gt(20).on(users);\n```\n\nThis will match objects with `age` greater than 20;\n\n### gte\n\n`gte` matches objects whose value is greater than or equal to what's provided. Dates are supported.\n\n```js\nquery(\"age\").gte(20).on(users);\n```\n\nThis will match objects with `age` greater than or equal to 20;\n\n### lt\n\n`lt` matches objects whose value is less than what's provided. Dates are supported.\n\n```js\nquery(\"age\").lt(20).on(users);\n```\n\nThis will match objects with `age` less than 20;\n\n### lte\n\n`lte` matches objects whose value is less than or equal to what's provided. Dates are supported.\n\n```js\nquery(\"age\").lte(20).on(users);\n```\n\nThis will match objects with `age` less than or equal to 20;\n\n### regex\n\n`regex` matches objects whose values match the provided regular expression.\n\n```js\nquery(\"name\").regex(/[^\\w\\s]/).on(users);\n```\n\nThis will match objects that have a non word-or-space character in the `name` property.\n\n### same\n\n`same` matches objects where the value is the same when serialized into JSON. This allows arrays or objects to be matched without a reference to the original.\n\n```js\nusers.push({ name: { first: \"John\", last: \"Smith\" }, age: 30 });\n\nquery(\"name\").same({ first: \"John\", last: \"Smith\" }).on(users);\n```\n\nThis will match the added object since the `name` value is the same even if it isn't the exact instance in memory. Note that this uses the serialized JSON representation of both objects to compare. Dates should work with this method but hasn't been tested cross-browser.\n\n### type\n\n`type` matches objects where the object or property is of a given type. Valid types are a string of: object, array, number, boolean, null, undefined. Or an instance of a class (e.g. Date). If no property name is passed into the `query()`, `and()`, or `or()` methods then the type will match against the object itself rather than a property.\n\n```js\nquery(\"age\").type(\"number\").on(users);\n\nquery(\"published\").type(Date).on(users);\n\nquery(\"pet\").type(Dog).on(users);\n\nquery().type(User).or().type(Person).on(users); // matches if the object is and instance of User or Person (or a subclass thereof)\n```\n\nThe first call will match all objects with a number for the age. The second call will match all objects where published is an instance of Date. The third call will match all `User` and `Person` objects in the database.\n\n### filter\n\n`filter` allows a custom filter function to be run against the value of a property or the object as a whole. If the function returns true, the object is added to the query results.\n\n```js\nquery(\"firstName\").filter(function(name) {\n    return name.toLowerCase().charAt(0) === \"a\";\n}).on(users);\n\nquery().filter(function(obj) {\n    if (obj instanceof User) {\n        return obj.active;\n    } else if (obj instanceof Person) {\n        return obj.trustLevel === \"trusted\";\n    } else {\n        return false;\n    }\n}).on(users);\n```\n\nThe first query here uses a custom function to match against the value of the `firstName` property of every object. The second query uses a custom function to use custom logic to match against every object because no property name was passed into the `query()` function.\n\n### search\n\n`search` matches all objects with a full-text search on the given field.\n\n```js\nquery('bio').search(\"looking for all of these words\").on(users);\n```\n\nThis will match any objects which have the provided words in their `bio` field.\n\n### sort\n\nSorts the returned results by property. Additional sort methods may follow a sort to define it further: `asc()`, `desc()`, `regular()`, `numeric()`, `date()`, and `custom()`. The default sort uses `asc()` and `regular()`, so these don't need to be used explicitly. Custom allows sorting on a property or on the object as a whole.\n\n```js\nquery(\"active\").is(true).sort(\"lastName\").on(users);\n\nquery().sort(\"lastName\").desc().on(users);\n\nquery().sort(\"publishedDate\").date().desc().sort(\"title\").on(users);\n\nquery().sort(\"age\").custom(function(age1, age2) {\n    if (age1 < age2) return -1;\n    else if (age1 > age2) return 1;\n    else return 0;\n}).on(users);\n\nquery().sort().custom(function(obj1, obj2) {\n    return obj1.age - obj2.age;\n}).on(users);\n```\n\nThe first query sorts by `lastName` after selecting only active objects. The second query sorts all objects by `lastName` in descending or reverse order. The third query sorts by `publishDate` with most recent first, then by title for dates that are the same. The fourth query uses a custom sort on the age property. The last query uses a custom sort on the object as a whole.\n\n### limit\n\nLimit the results returned.\n\n```js\nquery().limit(10).on(users);\n```\n\nThis returns 10 objects from the top of the array.\n\n```js\nquery().sort('noisy').limit(10).on(users);\n```\n\nThis returns 10 noisiest users (whatever that might mean).\n\n### offset\n\nWorks with limit to select an offset which to start your limit at. This is used mostly for pagination.\n\n```js\nquery().limit(10).offset(100).on(users);\n```\n\nThis returns 10 objects starting at the 100th object.\n\n\n### Complex properties/fields\n\nQuery fields can be dot-delimited to match sub-properties. They may even use methods. Note that the query object does not check to ensure whether the property is null, so if it is on some objects but not others you'll want to check for that first.\n\n```js\nusers.push({ name: \"Bob\", colors: [ \"red\", \"yellow\", \"blue\" ] });\n\nquery(\"colors.length\").is(3).on(users);\nquery(\"colors.length\").gt(2).on(users);\nquery(\"colors.length\").lte(3).on(users);\n```\n\nThese will *all* match the added object because the length is equal to three, greater than two, and less than or equal to three.\n\n```js\nusers.push({ colors: [ \"red\", \"yellow\", \"blue\" ] });\nusers.push({ colors: null });\n\nquery(\"colors.length\").is(0).on(users); // will not match the newly added object because it is null\n\nquery(\"colors\").is(null).or(\"colors.length\").is(0).on(users); // this is how you should check\n```\n\nTo check for a name without respect to case you might do the following.\n\n```js\nquery('firstName.toLowerCase()').is('bob');\n\nquery().sort('lastName.toLowerCase()');\n```\n\nThe second query above will sort by last name irrespective of casing.\n\n## Backbone Support and Adding query to Backbone.Collections\n\nquery was built with Backbone in mind. Though you may use `query(\"get('firstName')\").is(\"John\")` to effectively work with\nBackbone models, query allows you to shorten that to just use `firstName` as in `query(\"firstName\").is(\"John\")`. You can\neven add methods like the previous section indicates like: `query(\"firstName.toLowerCase()\").is(\"john\")`.\n\nYou may find it useful to add query to the Collection interface so that it is avaiable with every collection.\n\n```js\nvar Backbone = require('backbone');\nvar query = require('array-query'); // these lines may be skipped when using in the browser\n\nBackbone.Collection.prototype.query = function(field) {\n    return query.select(@models).where(field);\n}\n\n// then when using it remember to use `end()` as this is the `select()` style API.\nvar activeUsers = userCollection.query('active').is(true).end();\n\n```\n\nOne addition which was added specifically for Backbone (though could be altered to work elsewhere if needed) was the `set()` method.\nUsing it you may set properties on all the matching objects.\n\n```js\nuserCollection.query('selected').is(true).set({ selected: false }).end();\n```\n\nThis will set all currently selected users to not selected. And because this is Backbone, any Views listening to the\n`change:selected` event can update accordingly.\n","maintainers":[{"name":"jacwright","email":"jacwright@gmail.com"}],"time":{"modified":"2012-01-28T18:59:27.567Z","created":"2012-01-28T18:59:26.477Z","0.1.0":"2012-01-28T18:59:27.567Z"},"author":{"name":"Jacob Wright","email":"jacwright@gmail.com"},"repository":{"type":"git","url":"git://github.com/jacwright/array-query.git"},"_attachments":{"array-query-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7rV8jAAMJzFOHWfVU9ilIQ==","length":11673,"stub":true}}}},
{"id":"array_surgeon","key":"array_surgeon","value":{"rev":"3-44ca0b00cf13bb42aa0bc776cbe18eaa"},"doc":{"_id":"array_surgeon","_rev":"3-44ca0b00cf13bb42aa0bc776cbe18eaa","name":"array_surgeon","description":"Find a sequence of values in an Array and replace/remove them.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"array_surgeon","version":"0.1.0","description":"Find a sequence of values in an Array and replace/remove them.","main":"lib/array_surgeon.js","scripts":{"test":"mocha --compilers coffee:coffee-script"},"dependencies":{"underscore":"*"},"repository":{"type":"git","url":"https://github.com/da99/array_surgeon"},"keywords":["array","surgeon"],"author":{"name":"da99"},"license":"BSD","readme":"\narray\\_surgeon\n=============\n\nFind a consecutive group of elements in an array and remove or replace them.\n\n\nUsage\n====\n\n    shell> npm install array_surgeon\n\n    surgeon = require 'array_surgeon'\n\n    hay = [ 1, 2, 3, 4 ]\n    \n    // You can use a regular array\n    surgeon.remove hay, [ 2, 3 ]\n    # ==> [ 1, 4 ]\n   \n    surgeon.replace hay, [ 2, 3 ], \"missing\"\n    # ==> [ 1, \"missing\", 4 ]\n\n\nYou can also use a function for comparision:\n\n    is_2 = (val) ->\n      val is 2\n      \n    is_3 = (val) ->\n      val is 3\n      \n    surgeon.remove hay, [ is_2, is_3 ]\n    # ==> [ 1,  4 ]\n   \n    surgeon.replace hay, [ is_2, is_3 ], \"missing\"\n    # ==> [ 1, \"missing\", 4 ]\n\n\n   \n","_id":"array_surgeon@0.1.0","dist":{"shasum":"a481c69ca49f72aaf7d1dc6fcdede2739f070778","tarball":"http://registry.npmjs.org/array_surgeon/-/array_surgeon-0.1.0.tgz"},"maintainers":[{"name":"da99","email":"spam@miniuni.com"}]}},"readme":"\narray\\_surgeon\n=============\n\nFind a consecutive group of elements in an array and remove or replace them.\n\n\nUsage\n====\n\n    shell> npm install array_surgeon\n\n    surgeon = require 'array_surgeon'\n\n    hay = [ 1, 2, 3, 4 ]\n    \n    // You can use a regular array\n    surgeon.remove hay, [ 2, 3 ]\n    # ==> [ 1, 4 ]\n   \n    surgeon.replace hay, [ 2, 3 ], \"missing\"\n    # ==> [ 1, \"missing\", 4 ]\n\n\nYou can also use a function for comparision:\n\n    is_2 = (val) ->\n      val is 2\n      \n    is_3 = (val) ->\n      val is 3\n      \n    surgeon.remove hay, [ is_2, is_3 ]\n    # ==> [ 1,  4 ]\n   \n    surgeon.replace hay, [ is_2, is_3 ], \"missing\"\n    # ==> [ 1, \"missing\", 4 ]\n\n\n   \n","maintainers":[{"name":"da99","email":"spam@miniuni.com"}],"time":{"modified":"2012-08-14T19:19:31.137Z","created":"2012-08-14T19:19:29.355Z","0.1.0":"2012-08-14T19:19:31.137Z"},"author":{"name":"da99"},"repository":{"type":"git","url":"https://github.com/da99/array_surgeon"},"_attachments":{"array_surgeon-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-71OissUDgGXFrqRDx1plqw==","length":2605,"stub":true}}}},
{"id":"arrayemitter","key":"arrayemitter","value":{"rev":"9-21b766958e8f55ab93421c42f15b3292"},"doc":{"_id":"arrayemitter","_rev":"9-21b766958e8f55ab93421c42f15b3292","name":"arrayemitter","description":"EventEmitter emittin array-iteration events.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"arrayemitter","version":"0.0.1","description":"EventEmitter emittin array-iteration events.","tags":["EventEmitter","array","object","iteration","event"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"https://github.com/shinout/ArrayEmitter.git"},"bugs":{"url":"https://github.com/shinout/ArrayEmitter/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayEmitter/raw/master/LICENCE"}],"main":"./ArrayEmitter","_id":"arrayemitter@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10-1","_nodeVersion":"v0.4.5","dist":{"shasum":"060ae7392a792b2213e14a82acfe1b507da5ba16","tarball":"http://registry.npmjs.org/arrayemitter/-/arrayemitter-0.0.1.tgz"},"directories":{}},"0.0.2":{"name":"arrayemitter","version":"0.0.2","description":"EventEmitter emittin array-iteration events.","tags":["EventEmitter","array","object","iteration","event"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayEmitter.git"},"bugs":{"url":"https://github.com/shinout/ArrayEmitter/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayEmitter/raw/master/LICENCE"}],"main":"./ArrayEmitter.js","_npmJsonOpts":{"file":"/home/shinout/.npm/arrayemitter/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"arrayemitter@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.3","_defaultsLoaded":true,"dist":{"shasum":"b76f0cc691913fc3d1205905d77ed002ddede14b","tarball":"http://registry.npmjs.org/arrayemitter/-/arrayemitter-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}}},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"time":{"modified":"2011-11-16T01:57:23.275Z","created":"2011-04-19T09:18:04.565Z","0.0.1":"2011-04-19T09:18:05.263Z","0.0.2":"2011-09-30T02:57:08.313Z","0.0.3":"2011-09-30T03:31:09.472Z"},"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayEmitter.git"},"_attachments":{"arrayemitter-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-i1RO93qgq/8btZbqPr2GoQ==","length":5166,"stub":true},"arrayemitter-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RjBEBSBtAt48Ibz0ikdirw==","length":4299,"stub":true}}}},
{"id":"arraystream","key":"arraystream","value":{"rev":"11-f010e975a165552bc946cc74b7a88563"},"doc":{"_id":"arraystream","_rev":"11-f010e975a165552bc946cc74b7a88563","name":"arraystream","description":"ReadableStream of arrays and hash variables.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"arraystream","version":"0.0.1","description":"ReadableStream of arrays and hash variables.","keywords":["ReadableStream","array","object","stream"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayStream.git"},"bugs":{"url":"https://github.com/shinout/ArrayStream/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayStream/raw/master/LICENCE"}],"main":"./ArrayStream.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"arraystream@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"06ab548c28e2120865cab2b02f2c3c4289a7e94b","tarball":"http://registry.npmjs.org/arraystream/-/arraystream-0.0.1.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.0.2":{"name":"arraystream","version":"0.0.2","description":"ReadableStream of arrays and hash variables.","keywords":["ReadableStream","array","object","stream"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayStream.git"},"bugs":{"url":"https://github.com/shinout/ArrayStream/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayStream/raw/master/LICENCE"}],"main":"./ArrayStream.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"arraystream@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"8ad497d28e59754b035a81cebbaafb36201c1502","tarball":"http://registry.npmjs.org/arraystream/-/arraystream-0.0.2.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.0.3":{"name":"arraystream","version":"0.0.3","description":"ReadableStream of arrays and hash variables.","keywords":["ReadableStream","array","object","stream"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayStream.git"},"bugs":{"url":"https://github.com/shinout/ArrayStream/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayStream/raw/master/LICENCE"}],"main":"./ArrayStream.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"arraystream@0.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"856b540425b59843865569878205caecbb67a74b","tarball":"http://registry.npmjs.org/arraystream/-/arraystream-0.0.3.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.0.4":{"name":"arraystream","version":"0.0.4","description":"ReadableStream of arrays and hash variables.","keywords":["ReadableStream","array","object","stream"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayStream.git"},"bugs":{"url":"https://github.com/shinout/ArrayStream/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayStream/raw/master/LICENCE"}],"main":"./ArrayStream.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"arraystream@0.0.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"281d4186861988c3e1be936df67b8843645a2634","tarball":"http://registry.npmjs.org/arraystream/-/arraystream-0.0.4.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.0.5":{"name":"arraystream","version":"0.0.5","description":"ReadableStream of arrays and hash variables.","keywords":["ReadableStream","array","object","stream"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayStream.git"},"bugs":{"url":"https://github.com/shinout/ArrayStream/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/ArrayStream/raw/master/LICENCE"}],"devDependencies":{"termcolor":">=v0.2.0"},"main":"./ArrayStream.js","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"arraystream@0.0.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"d28ae8ee65c866f2596700abf19d85a87ab2332b","tarball":"http://registry.npmjs.org/arraystream/-/arraystream-0.0.5.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]}},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"time":{"modified":"2012-03-07T02:35:05.180Z","created":"2011-11-16T01:51:14.628Z","0.0.1":"2011-11-16T01:51:17.579Z","0.0.2":"2011-11-18T11:32:14.365Z","0.0.3":"2011-11-21T06:44:02.147Z","0.0.4":"2012-03-07T02:23:06.926Z","0.0.5":"2012-03-07T02:35:05.180Z"},"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/ArrayStream.git"},"_attachments":{"arraystream-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-1HCSZjfRMe6CehYwHNvUYg==","length":13783,"stub":true},"arraystream-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YM+1XbYkA06lWAg45Etviw==","length":13951,"stub":true},"arraystream-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nGlSm2nvReoVjuq5bqfdsg==","length":16172,"stub":true},"arraystream-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MRUnU9HGec9Iv8vk/7AMbQ==","length":16073,"stub":true},"arraystream-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kTegVPaXUgRqqt/mpK7Mfw==","length":5163,"stub":true}}}},
{"id":"arrjs","key":"arrjs","value":{"rev":"3-d82e4187f18fac4ace1064e624996d4e"},"doc":{"_id":"arrjs","_rev":"3-d82e4187f18fac4ace1064e624996d4e","name":"arrjs","description":"HTTP and WebSocket application request routing","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"arrjs","description":"HTTP and WebSocket application request routing","version":"0.1.0","author":{"name":"Tomasz Janczuk","email":"tomasz@janczuk.org","url":"http://tomasz.janczuk.org"},"dependencies":{"http-proxy":"0.8.0","optimist":"0.3.1","mongodb":"0.9.8","socket.io":"0.8.7"},"devDependencies":{},"homepage":"http://github.com/tjanczuk/arrjs","bugs":{"url":"http://github.com/tjanczuk/arrjs/issues"},"keywords":["routing","http","application","web"],"repository":{"type":"git","url":"git://github.com/tjanczuk/arrjs.git"},"engines":{"node":">= 0.7.0-pre"},"_npmUser":{"name":"tjanczuk","email":"tomasz@janczuk.org"},"_id":"arrjs@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.2-pre","_defaultsLoaded":true,"dist":{"shasum":"761678d3702e724bee9596e075e90088598c9f9d","tarball":"http://registry.npmjs.org/arrjs/-/arrjs-0.1.0.tgz"},"maintainers":[{"name":"tjanczuk","email":"tomasz@janczuk.org"}]}},"readme":"#HTTP and WebSocket application routing\n===\n\nYou can expose several HTTP or WebSocket applications over a single TCP port using ARR.JS. This is useful for better \nutilization of servers, including shared hosting. \n\n- Host N applications on M servers, each application in K(N) instances, 1 <= K(N) <= M.\n- Routing based on the ```Host``` HTTP request header.\n- HTTP and HTTPS.\n- WebSockets and secure WebSockets.\n- SNI support for SSL.\n- Message-based process activation.\n- Process monitoring and crash recovery. \n- Host applications built with arbitrary technology with its own HTTP stack, including node.js.\n- Works on Windows, MacOS, and *nix. \n- Built with node.js, MongoDB, and nodejitsu HTTP proxy. \n\n## Prerequisities\n\n- Windows, MacOS, or *nix (tested on Windows 7 & 2008 Server, MacOS Lion, Ubuntu 11.10)\n- [node.js v0.7.0 or greater](http://nodejs.org/dist/). MacOS and *nix may use earlier versions.\n- [MongoDB](http://www.mongodb.org/downloads). The database is used to store application metadata and must be \naccessible from all backends. \n\n## Getting started\n\nInstructions below are for setting up a single machine deployment (e.g. development environment) on a MacOS. \nOther OSes are conceptually similar. \n\nStart unsecure MongoDB server on localhost:\n\n```\nmongod\n```\n\nImport application metadata for the three sample applications:\n\n```\nmongoimport -d arr -c apps src/apps.json\n```\n\nConfigure your HOSTS file (/etc/hosts on MacOS and *nix, %systemroot%\\system32\\drivers\\etc\\hosts on Windows) \nto resolve domain names used by the sample applications to localhost by adding the following lines:\n\n```\n127.0.0.1 app1.janczuk.org\n127.0.0.1 app1.tangyorange.com\n127.0.0.1 app2.janczuk.org\n127.0.0.1 app2.tangyorange.com\n127.0.0.1 ws1.janczuk.org\n127.0.0.1 ws1.tangyorange.com\n```\n\nStart the ARR.JS router to listen for unsecured traffic on port 80 and SSL traffic on port 443 \n(these ports cannot be used by other processes on the box):\n\n```\ncd src\nsudo node arr.js --mongo=mongodb://localhost/arr -p 80 -s 443\n```\n\nIssue a few requests to test the system:\n\n```\ncurl http://app1.tangyorange.com\ncurl https://app1.janczuk.org -k\ncurl http://app2.janczuk.org\ncurl https://app2.janczuk.org -k\n```\n\nIn your favorite modern browser navigate to ```http://ws1.janczuk.org```. You should see Dante's Divine Comedy \nstreamed down to the browser over a WebSocket connection, a stanza every 2 seconds. When connecting \nover ```https://ws1.janczuk.org``` you will first see a security warning because the certificate exposed by \nthe application is not trusted (it is self-signed). \n\n## Deployment on a server farm\n\n### Database\n\nThe MongoDB dabatase holds application metadata and must be accessible from all servers in the farm. \nYou can use your own instance or get started with a free instance\nprovided by [MongoHQ](https://mongohq.com/home). Bottom line is you need a \n[MongoDB connection URL](http://www.mongodb.org/display/DOCS/Connections) to provide to \nall instances of arr.js you will run on the backends.\n\nThe application metadata must be stored in a single MongoDB collection called ```apps```. Each document in this collection \nmust have the following structure:\n\n```\n{\n  process: {\n    executable: \"node\",                 // specify the executable name here, including path if needed\n    args: [                             // specify whatever command line arguments must be passed to the executable\n      \"apps/app1/server.js\"\n    ]\n  },\n  hosts: [\n    { \n      host: \"app1.janczuk.org\",\n      ssl: \"allowed\",                       // you must say \"allowed\", \"required\", or \"none\" (for unsecure access only)\n      cert: \"certs/app1-janczuk-cert.pem\",  // optional file with X.509 certificate associated with this host name\n      key: \"certs/app1-key.pem\"             // optional file with the private key for the X.509 certificate\n    },\n    // ... you can specify multiple host names that can be used to access this application\n  ],\n  instances: 2,                             // maximum number of instances of this application to create\n  machines: [                               // this is the array of machines the application is currently running on\n  ]                                         // and it must be set to empty initially; it is managed by arr.js\n}\n```\n\nFor an example of application metadata, check out [apps.json](https://github.com/tjanczuk/arrjs/blob/master/src/apps.json), \na file that can be imported into the MongoDB database using the \n[mongoimport](http://www.mongodb.org/display/DOCS/Import+Export+Tools#ImportExportTools-mongoimport) tool.\n\n### Backends\n\nEach server in the farm dedicated to running applications must be running an instance of arr.js. Typically each of \nthe instances of arr.js would be configured identically, which allows any run of the mill TCP level load balancer\nto be put in front of the server farm. Arr.js accepts the following parameters:\n\n```\nUsage: node ./arr.js\n\nOptions:\n  -m, --mongo    Mongo DB connecton string                      [default: \"mongodb://localhost/arr\"]\n  -r, --range    Managed TCP port range                         [default: \"8000-9000\"]\n  -p, --port     Unsecured listen port                          [default: 31415]\n  -s, --sslport  SSL listen port                                [default: 31416]\n  -c, --cert     Non-SNI (wildcard) server certificate for SSL  [default: \"certs/wildcard-janczuk-cert.pem\"]\n  -k, --key      Private key for SSL                            [default: \"certs/wildcard-janczuk-key.pem\"]\n```\n\nThe [MongoDB connection URL](http://www.mongodb.org/display/DOCS/Connections) (-m) must point to the central MongoDB \ndatabase with the ```apps``` collection that holds the application metadata. \n\nThe managed TCP port range (-r) indicates the range of TCP ports arr.js will use to assign a TCP port to a\nmanaged application when it is activated. The TCP port number assigned to an instance of an application is passed to the \napplication through\nthe process environment variable named ```PORT```. In case of node.js applications for example, this value is accessible \nvia the ```process.env.PORT``` property and can be used to set up an HTTP listener. \nSee [server.js](https://github.com/tjanczuk/arrjs/blob/master/src/apps/app1/server.js) for an example. \n\nThe unsecured (-p) and secured (-s) port number are the two TCP port numbers arr.js will listen on. Arr.js will \naccept HTTP and WS traffic on the unsecured port, and HTTPS and WSS traffic on the secured port. SSL security terminates \nat arr.js. Arr.js acts as an HTTP[S]/WS[S] reverse proxy, routing incoming requests to appropriate applications\nbased on the value of the Host HTTP request header. If necessary, an instance of an application is activated. \nCommunication between arr.js and an instance of an application is not secured with SSL\n(i.e. plaintext HTTP or WS is used), so the application code should always set up their listeners for HTTP and WS, \nregardless whether calls the client issues requests over SSL or not. Appropriate set of ```x-forwarded-*``` HTTP request\nheaders that arr.js adds to the routed requests allow applications to learn more about the original client connection. \n\nEach instance of arr.js is configured with an X.509 certificate (-c) and the associated private key (-k). This\ncertificate and private key are used to identify the server during the SSL handshake, unless application specific\nconfiguration specifies its own certificate and private key to be used  with \n[Server Name Identification (SNI)](http://en.wikipedia.org/wiki/Server_Name_Indication). Note that for SNI to take effect\nthe client must support it (which most modern browsers do). If you plan to support SSL for multiple applications with \ndifferent host names and use a single server side certificate to secure them, the domain suffix of the host name\nof these applications must be the same (e.g. foo.barbaz.com and baz.barbaz.com), and the arr.js certificate must be a \nwildcard certificate (e.g. CN=*.barbaz.com). \n\n### Network Load Balancer\n\nIn a typical deployment servers in a farm would run behind a TCP level load balancer. For the convenience of \ndevelopment, this project includes a very simple, TCP level software load balancer, \n[nlb.js](https://github.com/tjanczuk/arrjs/blob/master/src/nlb.js). \n\nConfiguration of nlb.js is stored in the adjacent ```nlb.json``` file with the following structure:\n\n```\n[\n  {                             // multiple \"routing rules\" are allowed; typically one for unsecure traffic and one for SSL\n\t\t\"port\": 80,                 // the input TCP port number the load balancer will listen on\n\t\t\"backends\": [               // array of arr.js backend endpoints to load balance incoming TCP connections to\n\t\t\t{\n\t\t\t\t\"host\": \"localhost\",    // destination host name\n\t\t\t\t\"port\": 31415           // destination port number (does not need to match the input port number)\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\t\"port\": 443,\n\t\t\"backends\": [\n\t\t\t{\n\t\t\t\t\"host\": \"localhost\",\n\t\t\t\t\"port\": 31416\n\t\t\t}\n\t\t]\n\t}\n]\n```\n\nThe nlb.js is stared as a simple node application:\n\n```\ncd src\nsudo node nlb.js\n```\n\nThe nlb.js will perform TCP level, round robin load balancing of incoming TCP connections across the specified backends. ","maintainers":[{"name":"tjanczuk","email":"tomasz@janczuk.org"}],"time":{"modified":"2012-02-07T18:22:30.790Z","created":"2012-02-07T18:22:29.120Z","0.1.0":"2012-02-07T18:22:30.790Z"},"author":{"name":"Tomasz Janczuk","email":"tomasz@janczuk.org","url":"http://tomasz.janczuk.org"},"repository":{"type":"git","url":"git://github.com/tjanczuk/arrjs.git"},"_attachments":{"arrjs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/ZfEij304wpMTFf3Xa70nw==","length":19754,"stub":true}}}},
{"id":"arrow","key":"arrow","value":{"rev":"11-117f5218196de3e0b5208ff58855768a"},"doc":{"_id":"arrow","_rev":"11-117f5218196de3e0b5208ff58855768a","name":"arrow","description":"Asynchronous HTTP framework for Node.js","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"arrow","version":"0.1.0","description":"Asynchronous HTTP framework for Node.js","dependencies":{"q":"0.8.2","mime":"1.2.5"},"_npmUser":{"name":"kixxauth","email":"kris@kixx.name"},"_id":"arrow@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2e868def9d81fadce8213266ed1c029ea07adee3","tarball":"http://registry.npmjs.org/arrow/-/arrow-0.1.0.tgz"},"readme":"","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}]},"0.1.1":{"name":"arrow","version":"0.1.1","description":"Asynchronous HTTP framework for Node.js","dependencies":{"q":"0.8.2","mime":"1.2.5"},"_npmUser":{"name":"kixxauth","email":"kris@kixx.name"},"_id":"arrow@0.1.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"fdc3f005b252949149671fe43e46f9aae6b8acba","tarball":"http://registry.npmjs.org/arrow/-/arrow-0.1.1.tgz"},"readme":"","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}]},"0.1.2":{"name":"arrow","version":"0.1.2","description":"Asynchronous HTTP framework for Node.js","dependencies":{"q":"0.8.2","mime":"1.2.5"},"_npmUser":{"name":"kixxauth","email":"kris@kixx.name"},"_id":"arrow@0.1.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a17795e4bc4c9505a15a58a90bc504bd4bfe849a","tarball":"http://registry.npmjs.org/arrow/-/arrow-0.1.2.tgz"},"readme":"","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}]},"0.2.1":{"name":"arrow","version":"0.2.1","description":"Asynchronous HTTP framework for Node.js","dependencies":{"q":"0.8.2","mime":"1.2.5"},"_npmUser":{"name":"kixxauth","email":"kris@kixx.name"},"_id":"arrow@0.2.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"14fb6b38aa0d60bb991a02b5de55d3c2d24b48ea","tarball":"http://registry.npmjs.org/arrow/-/arrow-0.2.1.tgz"},"readme":"","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}]},"0.2.2":{"name":"arrow","version":"0.2.2","description":"Asynchronous HTTP framework for Node.js","dependencies":{"q":"0.8.2","mime":"1.2.5"},"_npmUser":{"name":"kixxauth","email":"kris@kixx.name"},"_id":"arrow@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4f536e119a7e13f00509e0f6bbed07f9ad085f8e","tarball":"http://registry.npmjs.org/arrow/-/arrow-0.2.2.tgz"},"readme":"","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}]}},"readme":"","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}],"time":{"modified":"2012-05-09T18:52:11.608Z","created":"2012-04-17T08:08:20.338Z","0.1.0":"2012-04-17T08:08:20.977Z","0.1.1":"2012-05-03T18:24:59.294Z","0.1.2":"2012-05-04T11:31:52.683Z","0.2.1":"2012-05-05T14:46:24.585Z","0.2.2":"2012-05-09T18:52:11.608Z"},"_attachments":{"arrow-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-4kSC9R23WN4+yZ97FiXe6w==","length":4985,"stub":true},"arrow-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1pJUMQi7Uqx7qSeyZm5XUQ==","length":4976,"stub":true},"arrow-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tquti03obEyQdlsB989Udg==","length":5034,"stub":true},"arrow-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JR7orBJput3/pTpVoXwFSw==","length":5037,"stub":true},"arrow-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2/JKffBsqJe+yVerkNDPJA==","length":5020,"stub":true}}}},
{"id":"articlefinder","key":"articlefinder","value":{"rev":"5-c9b9474086a028b5e33ea86bedbe6987"},"doc":{"_id":"articlefinder","_rev":"5-c9b9474086a028b5e33ea86bedbe6987","name":"articlefinder","description":"A way to get the content of an article. Similar to readability.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"articlefinder","version":"0.0.1","description":"A way to get the content of an article. Similar to readability.","keywords":["article","readability","content scraper"],"maintainers":[{"name":"ifrins","email":"francesc.bgr+ifrins@gmail.com"}],"bugs":{"email":"francesc@lapomacatalana.com","url":"https://github.com/ifrins/articlefinder/issues"},"licenses":[{"type":"MIT","url":"https://github.com/ifrins/articlefinder/blob/master/LICENSE.txt"}],"dependencies":{"jsdom":"0.2.x"},"repositories":[{"type":"git","url":"http://github.com/ifrins/articlefinder.git"}],"engines":{"node":">=0.6.0"},"directories":{"lib":"./lib/articlefinder.js"},"main":"./lib/articlefinder.js","_npmUser":{"name":"ifrins","email":"francesc.bgr+ifrins@gmail.com"},"_id":"articlefinder@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b0279075e0260ada757ac69e604e6ab7953f3db7","tarball":"http://registry.npmjs.org/articlefinder/-/articlefinder-0.0.1.tgz"}},"0.0.2":{"name":"articlefinder","version":"0.0.2","description":"A way to get the content of an article. Similar to readability.","keywords":["article","readability","content scraper"],"author":{"name":"Francesc","email":"francesc@lapomacatalana.com"},"maintainers":[{"name":"ifrins","email":"francesc.bgr+ifrins@gmail.com"}],"bugs":{"email":"francesc@lapomacatalana.com","url":"https://github.com/ifrins/articlefinder/issues"},"licenses":[{"type":"MIT","url":"https://github.com/ifrins/articlefinder/blob/master/LICENSE.txt"}],"dependencies":{"jsdom":"0.2.x"},"repositories":[{"type":"git","url":"git://github.com/ifrins/articlefinder.git"}],"engines":{"node":">=0.6.0"},"directories":{"lib":"./lib/articlefinder.js"},"main":"./lib/articlefinder.js","_npmUser":{"name":"ifrins","email":"francesc.bgr+ifrins@gmail.com"},"_id":"articlefinder@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"fd718793e5a73f5060dde1890346946b9759183a","tarball":"http://registry.npmjs.org/articlefinder/-/articlefinder-0.0.2.tgz"}}},"readme":null,"maintainers":[{"name":"ifrins","email":"francesc.bgr+ifrins@gmail.com"}],"time":{"modified":"2012-02-19T13:59:40.471Z","created":"2012-02-19T13:57:09.343Z","0.0.1":"2012-02-19T13:57:11.280Z","0.0.2":"2012-02-19T13:59:40.471Z"},"author":{"name":"Francesc","email":"francesc@lapomacatalana.com"},"_attachments":{"articlefinder-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4NcQPJpIMl66gAlE3xLOBQ==","length":40960,"stub":true},"articlefinder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ihfEAhiQZJ5CeQToVQ26Mw==","length":40960,"stub":true}}}},
{"id":"artifi-glossy","key":"artifi-glossy","value":{"rev":"3-89a22b6313a584931c1d0382b5c6a50c"},"doc":{"_id":"artifi-glossy","_rev":"3-89a22b6313a584931c1d0382b5c6a50c","name":"artifi-glossy","description":"Syslog parser and producer. It is fork of https://github.com/squeeks/glossy - please check thatout","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.10":{"name":"artifi-glossy","description":"Syslog parser and producer. It is fork of https://github.com/squeeks/glossy - please check thatout","url":"http://github.com/squeeks/glossy","version":"0.0.10","main":"./index.js","author":{"name":"Artifi","email":"artifipl@gmail.com"},"maintainers":[{"name":"dreamlab","email":"janecki@gmail.com"}],"directories":{"lib":"./lib","test":"./test"},"repository":{"type":"git","url":"git://github.com/artifi/glossy.git"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/license/mit-license.php"}],"engines":{"node":">= 0.2.5"},"_npmUser":{"name":"dreamlab","email":"janecki@gmail.com"},"_id":"artifi-glossy@0.0.10","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c7ce49425b6a4f63e77f419c964417336066eb63","tarball":"http://registry.npmjs.org/artifi-glossy/-/artifi-glossy-0.0.10.tgz"}}},"readme":"glossy\n===========\n\nglossy aims to be a very generic yet powerful library for both producing\nand also parsing raw syslog messages. The library aims to be capable of\nadhearing to both RFC 3164 and RFC 5424 and by itself does no network\ninteractions, it's up to you to use this library as a syslog producer, a\nconsumer, relay or something else entirely. In addition, glossy has no\ndependencies and can be bootstrapped to operate in browser or other non-node.js\nenvironments.\n\n\nParsing\n-------\n\n    var syslogParser = require('glossy').Parse; // or wherever your glossy libs are\n    \n    parsedMessage = syslogParser.parse(message);\n\nparsedMessage will return an object containing as many parsed values as\npossible, as well as the original message. The date value will be a Date object.\nStructured data will return as an object. Alternatively, you can give it a\ncallback as your second argument:\n\n    syslogParser.parse(message, function(parsedMessage){\n        console.log(parsedMessage);\n    });\n\n\nProducing\n-------\nUnless you stipulate for BSD/RFC 3164 style messages, it will default to\ngenerating all messages as newer, RFC 5424 format. This might break consumers or\nrelays not expecting it.\n\n    var syslogProducer = require('glossy').Produce; // or wherever glossy lives\n    var glossy = new syslog.Producer({ type: 'BSD' });\n\n    var msg = glossy.produce({\n        facility: 'local4', // these can either be a valid integer, \n        severity: 'error',  // or a relevant string\n        host: 'localhost',\n        app_id: 'sudo',\n        pid: '123',\n        date: new Date(Date()),\n        message: 'Nice, Neat, New, Oh Wow'\n    });\n\nAgain, you can specify a callback for the second argument.\n\n    var msg = glossy.produce({\n        facility: 'ntp', \n        severity: 'info',\n        host: 'localhost',\n        date: new Date(Date()),\n        message: 'Lunch Time!'\n    }, function(syslogMsg){\n        console.log(syslogMsg);\n    });\n\nIn addition, you can also predefined most of the values when you create the\nobject, to save having to repeat yourself:\n\n    var glossy = new syslog.Producer({\n        type: 'BSD',\n        facility: 'ftp',\n        pid: 42,\n        host: '::1'        \n    });\n\nFor RFC5424 messages, you can also include structured data. Keys should comply\nwith the definition in [Section 7, RFC5424](http://tools.ietf.org/html/rfc5424#section-7) \nregarding names - keep them unique and your own custom keys should have at least\nan @ sign.\n\n    var msg = glossy.produce({\n        facility: 'local4', \n        severity: 'error',\n        host: 'localhost',\n        app_id: 'starman',\n        pid: '123',\n        date: new Date(Date()),\n        message: 'ACHTUNG!',\n        structuredData: {\n            'plack@host': {\n                status: 'broken',\n                hasTried: 'not really'\n            }\n        }\n    });\n\nFinally, we expose all the severities as functions themselves:\n\n    var infoMsg = glossy.info({\n           message: 'Info Message',\n    });\n\nFunction names facilitating this are named debug, info, notice, warn, crit,\nalert and emergency.\n\nParsing Example\n-------\nHandle incoming syslog messages coming in on UDP port 514:\n\n    var syslogParser = require('glossy').Parse; // or wherever your glossy libs are\n    var dgram  = require(\"dgram\");\n    var server = dgram.createSocket(\"udp4\");\n    \n    server.on(\"message\", function(rawMessage) {\n        syslogParser.parse(rawMessage.toString('utf8', 0), function(parsedMessage){\n            console.log(parsedMessage.host + ' - ' + parsedMessage.message);\n        });\n    });\n    \n    server.on(\"listening\", function() {\n        var address = server.address();\n        console.log(\"Server now listening at \" + \n            address.address + \":\" + address.port);\n    });\n    \n    server.bind(514); // Remember ports < 1024 need suid\n\n\nTODO\n-------\n* Better completion of test suite\n* Performance analysis and improvements where possible\n\nAuthor\n-------\nSqueeks - privacymyass@gmail.com\n\n\nLicense\n-------\nThis is free software licensed under the MIT License - see the LICENSE file that\nshould be included with this package.\n","maintainers":[{"name":"dreamlab","email":"janecki@gmail.com"}],"time":{"modified":"2012-01-05T12:43:36.357Z","created":"2012-01-05T12:43:34.126Z","0.0.10":"2012-01-05T12:43:36.357Z"},"author":{"name":"Artifi","email":"artifipl@gmail.com"},"repository":{"type":"git","url":"git://github.com/artifi/glossy.git"},"_attachments":{"artifi-glossy-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-I3phsxjCcZCbHoGP901HeQ==","length":12440,"stub":true}}}},
{"id":"artifice","key":"artifice","value":{"rev":"3-20199a2c3d994c9db838d0d09d1b3e97"},"doc":{"_id":"artifice","_rev":"3-20199a2c3d994c9db838d0d09d1b3e97","name":"artifice","description":"Entity System, functional-esque game framework","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"artifice","author":{"name":"Hugh FD Jackson","email":"@hughfdjackson"},"description":"Entity System, functional-esque game framework","version":"0.1.0","main":"artifice.js","keywords":["entity system","component","functional"],"license":"MIT","_npmUser":{"name":"hughfdjackson","email":"hughfdjackson@googlemail.com"},"_id":"artifice@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"14022a6bca08a6c2ef23a94284312015352d599c","tarball":"http://registry.npmjs.org/artifice/-/artifice-0.1.0.tgz"},"readme":"","maintainers":[{"name":"hughfdjackson","email":"hughfdjackson@googlemail.com"}]}},"readme":"","maintainers":[{"name":"hughfdjackson","email":"hughfdjackson@googlemail.com"}],"time":{"modified":"2012-07-14T22:48:18.599Z","created":"2012-07-14T22:48:17.155Z","0.1.0":"2012-07-14T22:48:18.599Z"},"author":{"name":"Hugh FD Jackson","email":"@hughfdjackson"},"_attachments":{"artifice-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rH2ZLzN15Pr23eF9pqMzRw==","length":2335,"stub":true}}}},
{"id":"asEvented","key":"asEvented","value":{"rev":"17-fbf4c6c406b1778f90c142985f0d897b"},"doc":{"_id":"asEvented","_rev":"17-fbf4c6c406b1778f90c142985f0d897b","name":"asEvented","description":"Micro event emitter which provides the observer pattern to JavaScript object.","dist-tags":{"latest":"0.3.3"},"versions":{"0.0.1":{"name":"asEvented","version":"0.0.1","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[],"dependencies":{},"engines":{"node":"0.4.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_id":"asEvented@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5ef849a907c1eebf9ca6166f127b46c9a5c123cc","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.0.1.tgz"},"scripts":{}},"0.1.0":{"name":"asEvented","version":"0.1.0","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"42e9467d40ed08d3e1b473e9dd84d6f5d287012a","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.1.0.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n \n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n   \n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel now has access to **trigger**, **bind** and **unbind** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]},"0.2.0":{"name":"asEvented","version":"0.2.0","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bc2839a48d1725051852215d7ad5862ec12f30a7","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.2.0.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n \n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n   \n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel now has access to **trigger**, **bind** and **unbind** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]},"0.2.1":{"name":"asEvented","version":"0.2.1","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"598b84842580a7f92d7d841ac370f3e5d22d3be8","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.2.1.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n \n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n   \n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel now has access to **trigger**, **bind** and **unbind** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]},"0.3.0":{"name":"asEvented","version":"0.3.0","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.3.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"cfdfc8530e08ac86e6656369cb726f36ff97c27a","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.3.0.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n \n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n\n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Contributors\n\n@mkuklis (Michal Kuklis)\n@rk (Robert K)\n@scarsick (Alexandre Potvin Latreille)\n@mpdaugherty (Mike)\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel now has access to **trigger**, **bind** and **unbind** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\nA single handler can be bound to multiple events by separating the events by spaces, though it will be ignorant of the triggering event:\n\n    model.bind('change:id change:pass', function() {\n      console.log('Event called.');\n    });\n\nAnd multiple events can be unbound in one call:\n\n    model.unbind('onload onready');\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]},"0.3.1":{"name":"asEvented","version":"0.3.1","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.3.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"e14ed13f23aa961335d21f0a239028f49257392f","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.3.1.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n\n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n\n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel now has access to **trigger**, **bind**, **one** and **unbind** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\nA single handler can be bound to multiple events by separating the events by spaces, though it will be ignorant of the triggering event:\n\n    model.bind('change:id change:pass', function() {\n      console.log('Event called.');\n    });\n\nAnd multiple events can be unbound in one call:\n\n    model.unbind('onload onready');\n\n\n##Contributors\n\n* @mkuklis (Michal Kuklis)\n* @rk (Robert K)\n* @scarsick (Alexandre Potvin Latreille)\n* @mpdaugherty (Mike)\n\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]},"0.3.2":{"name":"asEvented","version":"0.3.2","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.3.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"e0285194442625b320b190c8c9eef614a6277712","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.3.2.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n\n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n\n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel has now access to **trigger**, **bind**/**on**, **one** and **unbind**/**off** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\nA single handler can be bound to multiple events by separating the events by spaces, though it will be ignorant of the triggering event:\n\n    model.bind('change:id change:pass', function() {\n      console.log('Event called.');\n    });\n\nAnd multiple events can be unbound in one call:\n\n    model.unbind('onload onready');\n\n\n##Contributors\n\n* [@mkuklis](http://github.com/mkuklis)\n* [@rk](http://github.com/rk)\n* [@scarsick](http://github.com/scarsick)\n* [@mpdaugherty](http://github.com/mpdaugherty)\n* [@zspencer](http://github.com/zspencer)\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]},"0.3.3":{"name":"asEvented","version":"0.3.3","description":"Micro event emitter which provides the observer pattern to JavaScript object.","keywords":["evemts","emitter","bind","trigger","observer"],"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"contributors":[{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"}],"dependencies":{},"engines":{"node":"0.6.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"main":"asevented.js","_npmUser":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"_id":"asEvented@0.3.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"f9f6a22b5af3704939c361ea2bc3ab49a81403f8","tarball":"http://registry.npmjs.org/asEvented/-/asEvented-0.3.3.tgz"},"readme":"#asEvented\n * [github.com/mkuklis/asEvented](github.com/mkuklis/asEvented)\n\n## Description\n\nasEvented is a micro event emitter which provides the observer pattern to JavaScript object. \nIt works in the browser and server (node.js). The code follows a functional mixins pattern described by Angus Croll [a-fresh-look-at-javascript-mixins](http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins).\n\n\n## Usage\n\nIn browser include single JavaScript file:\n\n    <script src=\"asevented.js\"></script>\n\nOn server install asEvented via npm first:\n\n    npm install asEvented\n\nand then include it in your project with:\n\n    var asEvented = require('asEvented');\n\n\n##Example Usage\nDefine the constructor which will make use of asEvented:\n    \n    function Model() {\n      this.id = 0;\n    }\n\nAdd (mixin) asEvented functionality to Model with:\n   \n    asEvented.call(Model.prototype);\n\nmodel has now access to **trigger**, **bind**/**on**, **one** and **unbind**/**off** functions\n\nAdd some functions to Model:\n\n    Model.prototype.setId = function (id) {\n      this.id = id;\n      this.trigger('change:id', id); // Model has now access to trigger\n    }\n\nCreate a new object and bind to `change:id` event:\n\n    var model = new Model();\n    model.bind('change:id', function (id) {\n      console.log('id changed to: ' +  id);\n    });\n\nSet a few model ids in order to trigger `change:id` event:\n    \n    model.setId(1);\n    model.setId(2);\n    model.setId(3);\n\nA single handler can be bound to multiple events by separating the events by spaces, though it will be ignorant of the triggering event:\n\n    model.bind('change:id change:pass', function() {\n      console.log('Event called.');\n    });\n\nAnd multiple events can be unbound in one call:\n\n    model.unbind('onload onready');\n\n\n##Contributors\n\n* [@mkuklis](http://github.com/mkuklis)\n* [@rk](http://github.com/rk)\n* [@scarsick](http://github.com/scarsick)\n* [@mpdaugherty](http://github.com/mpdaugherty)\n* [@zspencer](http://github.com/zspencer)\n* [@travishorn](http://github.com/travishorn)\n\n##License:\n<pre>\n(The MIT License)\n\nCopyright (c) 2011 Michal Kuklis\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</pre>\n","maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]}},"maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}],"time":{"modified":"2012-07-06T23:58:32.770Z","created":"2011-06-09T03:03:42.354Z","0.0.1":"2011-06-09T03:03:42.727Z","0.1.0":"2012-01-27T04:41:10.530Z","0.2.0":"2012-03-13T02:12:21.477Z","0.2.1":"2012-03-15T15:43:50.470Z","0.3.0":"2012-03-20T01:08:02.442Z","0.3.1":"2012-03-25T15:39:03.488Z","0.3.2":"2012-06-23T22:45:18.417Z","0.3.3":"2012-07-06T23:58:32.770Z"},"author":{"name":"Michal Kuklis","email":"michal.kuklis@gmail.com"},"repository":{"type":"git","url":"git://github.com/mkuklis/asEvented.git"},"_attachments":{"asEvented-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-5xN74x+gYwpY0XGqTEcuGQ==","length":49346,"stub":true},"asEvented-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-w/cndWLJgpf9KEWQwRNq4w==","length":49291,"stub":true},"asEvented-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-MTsfuSYIr6NTXtAdY/u+CA==","length":49234,"stub":true},"asEvented-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-G/PaQnJ8RwEUv4GTmSsECw==","length":49147,"stub":true},"asEvented-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-alPoSma5qOUWZcMS+L1sig==","length":48440,"stub":true},"asEvented-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fD7c0HCwdoDsf92dqPkSqg==","length":48335,"stub":true},"asEvented-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BBqvDH9pBSM5m/sOZ4N7PQ==","length":48326,"stub":true},"asEvented-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qMjpCqcFed+WDe4KLl3Wdg==","length":47728,"stub":true}}}},
{"id":"asJam","key":"asJam","value":{"rev":"21-c207bb23b694e27e9439fea8f7ba35c8"},"doc":{"_id":"asJam","_rev":"21-c207bb23b694e27e9439fea8f7ba35c8","name":"asJam","description":"A jam of ActionScript","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.0","scripts":{"test":"make test"},"dependencies":{"optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"main":"index","engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"125c4cf9abc08da3595e5949073ab8a88633ca3d","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.0.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}],"directories":{}},"0.1.1":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.1","scripts":{"test":"make test"},"dependencies":{"optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"main":"index","engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"077b2426e7b407082404be2b21a2ed1006ac51e8","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.1.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}],"directories":{}},"0.1.2":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.2","scripts":{"test":"make test"},"dependencies":{"optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"main":"index","engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"5cde8afeb24c4ad83ba19e46ffef03ef276742e2","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.2.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}],"directories":{}},"3.2.0":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"3.2.0","main":"index","scripts":{"test":"make test"},"dependencies":{"optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@3.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"119fda7b1fc8f4060594c2dfb4256c8507d0c1f1","tarball":"http://registry.npmjs.org/asJam/-/asJam-3.2.0.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}],"directories":{}},"0.1.3":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.3","main":"lib/asJam","scripts":{"test":"make test"},"dependencies":{"optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"037779f765a8463a2ea2727683b1e8a48257d17a","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.3.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}]},"0.1.4":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.4","main":"lib/asJam","scripts":{"test":"make test"},"dependencies":{"unrequire":"0.3.7","optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"85c4f6d7762e7f6072900c126744b8d5cfcc0218","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.4.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}]},"0.1.5":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.5","main":"lib/asJam","scripts":{"test":"make test"},"dependencies":{"unrequire":"0.3.7","optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"3e2809d28a1feb5a3dd409fd4a73e754f6ec7a1e","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.5.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}]},"0.1.6":{"name":"asJam","description":"A jam of ActionScript","author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"version":"0.1.6","main":"lib/asJam","scripts":{"test":"make test"},"dependencies":{"unrequire":"0.3.7","optimist":"0.2.6"},"bin":{"asJam":"bin/asJam.js"},"engines":{"node":"0.4.x || 0.6.x"},"_npmUser":{"name":"strager","email":"strager.nds@gmail.com"},"_id":"asJam@0.1.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"16ac9da7a48166e5349eede85fae3bd228e8f088","tarball":"http://registry.npmjs.org/asJam/-/asJam-0.1.6.tgz"},"maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}]}},"readme":"# asJam, a jam of ActionScript\n\nasJam converts ActionScript 3 source code into [Spaceport][1]-compatible\nJavaScript source code.\n\nasJam is copyright (c) 2011-2012 spaceport.io, Inc.; see LICENSE for details.\n\n[1]: http://spaceport.io/\n\n## Setting up\n\nBinary dependencies:\n\n* Node.JS 0.4.x, 0.6.x\n\nTo install:\n\n    npm install\n\nTo test:\n\n    npm test\n    # or\n    make test\n\n## About\n\nThe converter does *not* completely convert source code.  Some manual work will\nbe required to complete a port of an ActionScript 3 game to Spaceport.  The\nconversion tool is designed to relieve developers of performing the many\nmundane tasks involved in porting a project to a different language, including:\n\n* Converting AS3 packages into [Spaceport modules][2].\n* Converting AS3 classes into [Spaceport classes][3].\n* Removing type annotations.\n* Inserting ``this.`` in front of member variable and property references.\n* Inserting ``sp.`` in front of Spaceport classes.\n\nAgain, **do not expect automatically-converted code to work** without\nmodification.  Developers *will* need to test, debug, and modify converted code\nmanually.\n\n[2]: http://docs.spaceport.io/3.2/en/tutorials/js/modules.html\n[3]: http://docs.spaceport.io/3.2/en/tutorials/js/class.html\n\n## Supported features\n\n* Classes\n\n  * Static properties and constants\n  * Static methods\n  * Member properties and constants  \n    Note: If you call `super` in a constructor explicitly, properties of\n    superclasses will not be assigned until `super` is called.\n\n  * Member functions\n     * Implicit `this.` (via a `self` alias)\n     * `super`\n\n  * Constructors\n     * `super`\n     * Implicit `super`\n\n  * Getter and setter functions\n     * `super`\n\n  * Dynamic classes\n  * Visibility (`private`, `protected`, `public`)\n  * Internal package classes\n\n* Functions\n\n  * Optional arguments\n  * Rest (`...rest`) arguments\n  * `arguments` array\n\n* Packages\n\n  * `import com.co`\n  * `import com.*`\n  * Implicit imports from same package and global package\n  * Importing a `flash` package\n  * Partial support for fully-qualified names\n\n* Binary operators\n\n  * `+`, `-`, `*`, `/`, `%`\n  * `=`, `+=`, `-=`, `*=`, `/=`, `%=`\n  * `<<`, `>>`, `>>>`, `&`, `|`, `^`\n  * `<<=`, `>>=`, `>>>=`, `&=`, `|=`, `^=`\n  * `==`, `!=`, `===`, `!==`\n  * `>`, `<`, `>=`, `<=`\n  * `&&`, `||`\n  * `&&=`, `||=`\n  * `in`, `instanceof`, `is`, `as`\n  * Array access\n  * Comma operator\n  * Dot access\n  * Type operator (`:`)\n\n* Unary operators\n\n  * `+`, `-`\n  * `++`, `--`\n  * `~`, `!`\n  * `new`, `delete`\n  * `typeof`, `void`\n\n* Ternary operators\n\n  * `?:`\n\n* Flow control\n\n  * `if`, `for`, `while`, `do-while`\n  * `for-in`, `for-each`\n  * `with`\n  * `try-catch-finally`\n  * `function`\n\n* Literals\n\n  * Number literals (`0.9992`, `1.42e20`, `NaN`, `Infinity`, `-Infinity`)\n  * String literals (`\"a\\nb\"`)\n  * Array literals (`[ a, b ]`)\n  * Object literals (`{ a: b }`)\n  * Boolean literals (`true`, `false`)\n  * RegExp literals (`/regexp/gi`)\n  * `null`\n\n* Global types\n\n  * `*` type\n  * `Number`, `String`, `Array`, `Object`, `Boolean`\n  * `Date`, `RegExp`\n\n* Other features\n\n  * `Vector.<>`\n  * Comments (`//` and `/* */`)\n  * `trace`\n  * Casting\n\n* Specific conversions\n\n  * Use of `flash.system.Security` is removed (with a warning).\n  * `com.adobe.serialization.JSON` and friends are replaced with classes\n    using the native JavaScript (and Flash 11+) `JSON` class.\n\n## Unsupported features\n\nUsing the following features may result in non-working code or may not allow a\nproject to be converted at all.  In other words, **the conversion may be\nunsuccessful**.\n\nThe following features **will cause a crash** and will *not* convert at all:\n\n* XML classes and syntax\n\n  * `::`, `{}`, `[]`, `+`, `+=`, `@`, `..`, `.`, `<>`\n\n* Proxy classes (`flash.utils.Proxy`)\n* Internal package classes\n* Package function exports\n* Static constructors\n\nThe following features **may produce improperly-functioning code** and will\nlikely require manual modifications:\n\n* Namespaces\n* `flash.utils.Dictionary`\n* Interfaces\n* `int`, `uint`; all numbers are treated as floating-point numbers except\n  upon declaration\n* `Class` class\n* Metadata tags (e.g. `[Embed]`)\n* `flash.utils`, unless otherwise specified\n* Naming conflicts requiring fully-qualified names\n","maintainers":[{"name":"strager","email":"strager.nds@gmail.com"}],"time":{"modified":"2012-04-17T17:21:52.727Z","created":"2012-02-21T17:24:58.851Z","0.1.0":"2012-02-21T17:25:00.793Z","0.1.1":"2012-02-21T17:28:43.257Z","0.1.2":"2012-02-21T19:22:12.834Z","3.2.0":"2012-03-02T02:16:17.583Z","0.1.3":"2012-03-15T17:27:07.247Z","0.1.4":"2012-04-03T21:41:11.601Z","0.1.5":"2012-04-05T18:47:30.116Z","0.1.6":"2012-04-17T17:21:52.727Z"},"author":{"name":"Matt Glazar","email":"matt.glazar@gmail.com"},"_attachments":{"asJam-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-lo4/ijN3gKX8PnXQ79cEMQ==","length":282547,"stub":true},"asJam-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Oj/IZ+44+Zexu05G7NKE3w==","length":280482,"stub":true},"asJam-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-6mr7lQ7QTXp/O2b8XINGsQ==","length":279378,"stub":true},"asJam-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-DRCAlQUnWnIbR/LQLGXf0w==","length":186391,"stub":true},"asJam-3.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ccsw2+ZCSBVngO3N/MhHHQ==","length":123440,"stub":true},"asJam-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-UzWzmz9mYI5vbgLOzZgEkw==","length":121835,"stub":true},"asJam-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8iM5Gw2H4gK+A7njGaCf7g==","length":121810,"stub":true},"asJam-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hxlaV0zwaB/9L4l0Htu4OA==","length":121812,"stub":true}}}},
{"id":"asana","key":"asana","value":{"rev":"3-51d2f4d88da6455f605a23f86d132ac1"},"doc":{"_id":"asana","_rev":"3-51d2f4d88da6455f605a23f86d132ac1","name":"asana","description":"Asana API bindings for node.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"asana","description":"Asana API bindings for node.","version":"0.0.1","homepage":"http://github.com/toots/node-asana","author":{"name":"Romain Beauxis"},"repository":{"type":"git","url":"git://github.com/toots/node-asana.git"},"bugs":{"email":"toots@rastageeks.org","url":"http://github.com/toots/node-asana/issues"},"main":"lib/node/asana.js","directories":{"lib":"./lib","test":"./test","src":"./src"},"engine":{"node":">= 0.4.7","npm":"1"},"licences":[{"type":"GPL3","url":"http://www.gnu.org/licenses/gpl-3.txt"}],"dependencies":{"backbone":"0.9.2","base64-js":"0.0.2","underscore":"1.3.3"},"devDependencies":{"browserify":"1.10.12","coffee-script":"1.3.1","minifyjs":"0.1.0"},"_npmUser":{"name":"toots","email":"toots@rastageeks.org"},"_id":"asana@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"14b9061932fcc92ccc05a743aa085ea0e4de69dd","tarball":"http://registry.npmjs.org/asana/-/asana-0.0.1.tgz"},"maintainers":[{"name":"toots","email":"toots@rastageeks.org"}]}},"readme":"Asana API for node\n==================\n\nThis module provide a wrapper to the [Asana API](http://developer.asana.com/documentation/) \nfor [nodeJS](http://nodejs.org/) applications.\n\nUltimately, a support in the browser, using [node-browserify](https://github.com/substack/node-browserify)\nis also planned.\n\nUsage\n=====\n\n```\nAsana = require \"asana\"\n\nasana = new Asana\n  key : \"deadbeef\"\n\nasana.user.fetch\n  success : -> ...\n  error   : -> ...\n\nusers = new asana.Users\nusers.fetch\n  error   : -> ...\n  success : -> \n    workspaces = new asana.Workspaces\n\n    workspaces.fetch\n      error    : -> ...\n      successs : ->\n        workspace = workspaces.first \n\n        task = new asana.Task\n          assignee  : users.find (user) ->\n            user.get(\"name\") == \"John Difool\"\n          followers : [user]\n          name      : \"Protect the Incal\"\n          workspace : workspace\n\n        task.save\n          error   : -> ...\n          success : -> ...\n```\n\nGet the facts!\n==============\n\n* Base reference: [Asana API](http://developer.asana.com/documentation/)\n* All asana items are [backbone](http://documentcloud.github.com/backbone/) models.\n  You can fetch and save them as is usually done with backbone models. However, asana\n  API does not allow to create or save some items.\n* All asana attributes are stored as model attributes. Creation arguments are those\n  documented in the Asana API.\n* It is possible to pass models or IDs as attributes values. \n* Items structure is:\n    * `asana = new Asana key : asanaKey`:\n        * `asana.user` : Current asana user\n        * `asana.Users` : Collection of all known users\n        * `asana.Stories` : Collection of all stories\n        * `asna.Workspace` : Basic model for asana workspaces\n        * `asana.Workspaces` : Collection of all asana workspaces\n        * `asana.Project` : Basic model for asana projects\n        * `asana.Projects` : Collection of all asana projects\n        * `asana.Task` : Base task model\n        * `asana.Tasks` : Collection of available tasks. \n        * `task = new asana.Task params`: \n            * `task.Story` : Basic model to create a new story attached to\n                            `task`\n            * `task.stories` : Collection of all stories attached to `task`\n            * `task.projects` : Collection of all projects to which `task` belongs\n\nYou can use your own copy of `Backbone` by passing it as an option\nwhen instanciating `asana`'s client:\n```\n  asana = new Asana\n    key      : \"deadbeef\"\n    Backbone : myBackbone\n```\n","maintainers":[{"name":"toots","email":"toots@rastageeks.org"}],"time":{"modified":"2012-05-25T23:33:24.125Z","created":"2012-05-25T23:33:23.213Z","0.0.1":"2012-05-25T23:33:24.125Z"},"author":{"name":"Romain Beauxis"},"repository":{"type":"git","url":"git://github.com/toots/node-asana.git"},"_attachments":{"asana-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-J57yB/LwQbK1sNQ9an3rBg==","length":102400,"stub":true}}}},
{"id":"asana-api","key":"asana-api","value":{"rev":"3-abc5d81a5bc93cd2522c761ae78af940"},"doc":{"_id":"asana-api","_rev":"3-abc5d81a5bc93cd2522c761ae78af940","name":"asana-api","description":"A nodejs client implementation for Asana API","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"asana-api","description":"A nodejs client implementation for Asana API","version":"0.1.0","author":{"name":"Charlie Robbins","email":"charlie.robbins@gmail.com"},"repository":{"type":"git","url":"git://github.com/indexzero/node-asana-api.git"},"keywords":["asana","api","project management"],"dependencies":{"errs":"0.2.x","request":"2.9.x","utile":"0.0.x"},"devDependencies":{"vows":"0.6.x"},"main":"./lib/asana-api","scripts":{"test":"vows test/*-test.js --spec"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"asana-api@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fa7396bf2afb712624db0e5396475f97bbedf172","tarball":"http://registry.npmjs.org/asana-api/-/asana-api-0.1.0.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]}},"readme":"# node-asana-api\n\nA node.js client implementation for Asana API.\n\n## Usage \n\n``` js\n  var asana = require('asana-api');\n  \n  var client = asana.createClient({\n    apiKey: 'your-secret-api-key'\n  });\n  \n  client.users.list(function (err, users) {\n    //\n    // List all users for this Asana account.\n    //\n    console.dir(users);\n  });\n```\n\n## API Coverage\n\n### Implemented\n\n``` scala\n  GET /users\n  GET /users/me\n  GET /users/:user-id\n  \n  GET /workspaces\n  GET /workspaces/:workspace-id/tasks\n  \n  GET /tasks\n  GET /tasks/:task-id\n\n  GET /projects\n  GET /projects/:project-id/tasks  \n```\n\n### Not Implemented\n\n``` scala\n  POST /tasks\n  PUT  /tasks/:task-id\n  GET  /tasks/:task-id/stories\n  POST /tasks/:task-id/stories\n  GET  /tasks/:task-id/projects\n  POST /tasks/:task-id/addProject\n  POST /tasks/:task-id/removeProject\n  \n  GET /projects/:project-id\n  PUT /projects/:project-id\n  \n  GET /stories/:story-id\n\n  PUT  /workspaces/:workspace-id\n  POST /workspaces/:workspace-id/tasks\n  GET  /workspaces/:workspace-id/projects\n  GET  /workspaces/:workspace-id/users\n```\n\n## Installation\n\n### Installing npm (node package manager)\n```\n  curl http://npmjs.org/install.sh | sh\n```\n\n### Installing node-asana-api\n```\n  [sudo] npm install asana-api\n```\n\n## Run Tests\n\n``` bash\n  $ npm test\n```\n\n#### Author: [Charlie Robbins][0]\n\n[0]: http://nodejitsu.com","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"time":{"modified":"2012-06-16T08:48:53.379Z","created":"2012-06-16T08:48:52.901Z","0.1.0":"2012-06-16T08:48:53.379Z"},"author":{"name":"Charlie Robbins","email":"charlie.robbins@gmail.com"},"repository":{"type":"git","url":"git://github.com/indexzero/node-asana-api.git"},"_attachments":{"asana-api-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wZXFbVyCubezk3DbSDsksg==","length":4281,"stub":true}}}},
{"id":"asciimo","key":"asciimo","value":{"rev":"12-50130f5ac2ef4d95df190be2c8ede893"},"doc":{"_id":"asciimo","_rev":"12-50130f5ac2ef4d95df190be2c8ede893","name":"asciimo","description":"create awesome ascii art with javascript! works in node.js or the browser.","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.4":{"name":"asciimo","description":"create awesome ascii art with javascript! works in node.js or the browser.","version":"0.2.4","repository":{"type":"git","url":"http://github.com/Marak/asciimo.git"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"contributors":[{"name":"Justin Lilly"}],"keywords":["ascii","text","art"],"dependencies":{"colors":">= 0.3.0"},"main":"lib/","engines":{"node":">= 0.1.98"},"_id":"asciimo@0.2.4","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/asciimo/-/asciimo-0.2.4.tgz"},"mtime":"2010-11-09T23:16:14Z","ctime":"2010-11-09T23:16:14Z"},"0.2.5":{"name":"asciimo","description":"create awesome ascii art with javascript! works in node.js or the browser.","version":"0.2.5","repository":{"type":"git","url":"http://github.com/Marak/asciimo.git"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"contributors":[{"name":"Justin Lilly"}],"keywords":["ascii","text","art"],"dependencies":{"colors":">= 0.3.0"},"main":"lib/asciimo","engines":{"node":">= 0.1.98"},"_id":"asciimo@0.2.5","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/asciimo/-/asciimo-0.2.5.tgz"},"mtime":"2010-11-09T23:16:18Z","ctime":"2010-11-09T23:16:18Z"},"0.3.0":{"name":"asciimo","description":"create awesome ascii art with javascript! works in node.js or the browser.","version":"0.3.0","repository":{"type":"git","url":"http://github.com/Marak/asciimo.git"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"contributors":[{"name":"Justin Lilly"}],"keywords":["ascii","text","art"],"dependencies":{"colors":">= 0.3.0"},"bin":{"asciimo":"./bin/asciimo"},"main":"lib/asciimo","engines":{"node":">= 0.1.98"},"_id":"asciimo@0.3.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/asciimo/-/asciimo-0.3.0.tgz"},"mtime":"2010-11-09T23:16:21Z","ctime":"2010-11-09T23:16:21Z"},"0.3.1":{"name":"asciimo","description":"create awesome ascii art with javascript! works in node.js or the browser.","version":"0.3.1","repository":{"type":"git","url":"http://github.com/Marak/asciimo.git"},"author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"contributors":[{"name":"Justin Lilly"}],"keywords":["ascii","text","art"],"dependencies":{"colors":">= 0.3.0"},"bin":{"asciimo":"./bin/asciimo"},"main":"lib/asciimo","engines":{"node":">= 0.1.98"},"_id":"asciimo@0.3.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/asciimo/-/asciimo-0.3.1.tgz"},"mtime":"2010-11-09T23:16:23Z","ctime":"2010-11-09T23:16:23Z"}},"maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"mtime":"2010-11-09T23:16:23Z","ctime":"2010-11-09T23:16:14Z","author":{"name":"Marak Squires","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"http://github.com/Marak/asciimo.git"},"_attachments":{"asciimo-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lhp41fW9u9Ekf2ziZLt6Vg==","length":2866108,"stub":true},"asciimo-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PAZU/vtI+8WaB/ebp+9Pgw==","length":2866101,"stub":true},"asciimo-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SecDmdc7ReDzq0JKWY5oLA==","length":2885239,"stub":true},"asciimo-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zXuxRa5VQhu/9OVcTmGEyg==","length":2885318,"stub":true}}}},
{"id":"asciiporn","key":"asciiporn","value":{"rev":"11-42abd326c05ecc0607db0f5ef3b7944a"},"doc":{"_id":"asciiporn","_rev":"11-42abd326c05ecc0607db0f5ef3b7944a","name":"asciiporn","description":"i love asciiporn!","dist-tags":{"latest":"2012.01.24T.69"},"versions":{"2012.01.25-a":{"author":{"name":"kai zhu","email":"kaizhu256@gmail.com"},"description":"i love asciiporn!","homepage":"https://bitbucket.org/kaizhu/node-asciiporn.git","name":"asciiporn","version":"2012.01.25-a","_id":"asciiporn@2012.01.25-a","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.12","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"40f6be1e0c04c2337133c768b2e5f3ece2162dc5","tarball":"http://registry.npmjs.org/asciiporn/-/asciiporn-2012.01.25-a.tgz"},"maintainers":[{"name":"kaizhu","email":"kaizhu256@gmail.com"}]},"2012.01.25-b":{"author":{"name":"kai zhu","email":"kaizhu256@gmail.com"},"description":"i love asciiporn!","files":["console.js","core/cext.js2","core/favicon.ico","core/source.js2","package.json"],"homepage":"https://bitbucket.org/kaizhu/node-asciiporn.git","name":"asciiporn","version":"2012.01.25-b","_id":"asciiporn@2012.01.25-b","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.12","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"92b9010cdad76764cde976cc47f468c3481bcb57","tarball":"http://registry.npmjs.org/asciiporn/-/asciiporn-2012.01.25-b.tgz"},"maintainers":[{"name":"kaizhu","email":"kaizhu256@gmail.com"}]},"2012.01.25-c":{"author":{"name":"kai zhu","email":"kaizhu256@gmail.com"},"description":"i love asciiporn!","files":["console.js","core/cext.js2","core/favicon.ico","core/jslint.js","core/mime.types","core/source.js2","package.json"],"homepage":"https://bitbucket.org/kaizhu/node-asciiporn.git","name":"asciiporn","version":"2012.01.25-c","_id":"asciiporn@2012.01.25-c","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.12","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"2c8811f8d1b2c4c32e821f2a0ecb0f3d189ca4e4","tarball":"http://registry.npmjs.org/asciiporn/-/asciiporn-2012.01.25-c.tgz"},"maintainers":[{"name":"kaizhu","email":"kaizhu256@gmail.com"}]},"2012.01.24T":{"author":{"name":"kai zhu","email":"kaizhu256@gmail.com"},"description":"i love asciiporn!","files":["console.js","core/cext.js2","core/favicon.ico","core/jslint.js","core/mime.types","core/source.js2","package.json"],"homepage":"https://bitbucket.org/kaizhu/node-asciiporn.git","name":"asciiporn","version":"2012.01.24T","_id":"asciiporn@2012.01.24T","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.12","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"067f933d6dc42fd55e173c197526359d74a6b0ab","tarball":"http://registry.npmjs.org/asciiporn/-/asciiporn-2012.01.24T.tgz"},"maintainers":[{"name":"kaizhu","email":"kaizhu256@gmail.com"}]},"2012.01.24T.69":{"author":{"name":"kai zhu","email":"kaizhu256@gmail.com"},"description":"i love asciiporn!","files":["console.js","core/cext.js2","core/favicon.ico","core/jslint.js","core/mime.types","core/source.js2","package.json"],"homepage":"https://bitbucket.org/kaizhu/node-asciiporn.git","name":"asciiporn","version":"2012.01.24T.69","_id":"asciiporn@2012.01.24T.69","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.12","directories":{},"_defaultsLoaded":true,"dist":{"shasum":"95adfed54da54c4e20fc436620148b0c096f19e8","tarball":"http://registry.npmjs.org/asciiporn/-/asciiporn-2012.01.24T.69.tgz"},"maintainers":[{"name":"kaizhu","email":"kaizhu256@gmail.com"}]}},"maintainers":[{"name":"kaizhu","email":"kaizhu256@gmail.com"}],"time":{"modified":"2012-01-24T18:41:59.389Z","created":"2012-01-24T18:20:31.715Z","2012.01.25-a":"2012-01-24T18:20:32.605Z","2012.01.25-b":"2012-01-24T18:24:42.604Z","2012.01.25-c":"2012-01-24T18:27:47.538Z","2012.01.24T":"2012-01-24T18:41:40.602Z","2012.01.24T.69":"2012-01-24T18:41:59.389Z"},"author":{"name":"kai zhu","email":"kaizhu256@gmail.com"},"_attachments":{"asciiporn-2012.01.24T.69.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-sKx11Hbvz+Qd6U7xBH2qjw==","length":74649,"stub":true},"asciiporn-2012.01.24T.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-O5bNloUfmWMGFr9rSpahaw==","length":74644,"stub":true},"asciiporn-2012.01.25-c.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nb0fdM1w6km2EfT5FODw1A==","length":74607,"stub":true},"asciiporn-2012.01.25-b.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lomq+t0PI41hBFlSzv9mjQ==","length":17555,"stub":true},"asciiporn-2012.01.25-a.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UJGpyTPQLWWMnNpLyXsi/g==","length":397304,"stub":true}}}},
{"id":"asereje","key":"asereje","value":{"rev":"21-1b61d68e9d1848ca812a84c16a51492d"},"doc":{"_id":"asereje","_rev":"21-1b61d68e9d1848ca812a84c16a51492d","name":"asereje","description":"Asereje is a library that builds your assets on demand","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.1","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"ugilify-js":"1.0.6","funk":"1.0.1","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"33f37d0c984cfbdef75e689d22e1238187bcbb59","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.2":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.2","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.0.1","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"72b5802ef3651151f76e808949e5ce4e825dff74","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.3":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.3","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.0.1","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"b376bd513a31e1a92bd516a1ceaa3d84b2674522","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.4":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.4","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.0.1","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"6b93a92af5dee6d79028e57de7ab57132c6b711b","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.5":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.5","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.5.0","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"ab22cfd22b134ce553ddc468150fd96d483c031d","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.6":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.6","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.5.0","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"fc1eb8023343c797b4a49ebce0c7b112ada90d5d","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.7":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.7","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.5.0","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"81ee937bdddf93b1362c33e67e4c892ba487d411","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.7.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.8":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.8","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.5.0","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmJsonOpts":{"file":"/Users/masylum/.npm/asereje/0.0.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asereje@0.0.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.25","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"fa56a0ab333dc5e436220d363896a4683c3a9fdf","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.8.tgz"},"scripts":{},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"_npmUser":{"name":"masylum","email":"masylum@gmail.com"}},"0.0.9":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.0.9","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.5.0","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"asereje@0.0.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2330c62260f1b546a1b41b7734c1c580d63b94c9","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.0.9.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]},"0.1.0":{"name":"asereje","description":"Asereje is a library that builds your assets on demand","version":"0.1.0","author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"keywords":["build","assets","css","javascript"],"main":"./index","dependencies":{"uglify-js":"1.0.6","funk":"1.5.0","sqwish":"0.2.0","underscore":"1.1.6"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"masylum","email":"masylum@gmail.com"},"_id":"asereje@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"56e60fd59c42698a03cd20b076b27b5f3d45cee5","tarball":"http://registry.npmjs.org/asereje/-/asereje-0.1.0.tgz"},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}]}},"maintainers":[{"name":"masylum","email":"masylum@gmail.com"}],"time":{"modified":"2011-12-08T17:18:04.191Z","created":"2011-08-14T11:12:23.740Z","0.0.1":"2011-12-08T12:27:48.642Z","0.0.2":"2011-12-08T12:27:48.642Z","0.0.3":"2011-12-08T12:27:48.642Z","0.0.4":"2011-12-08T12:27:48.642Z","0.0.5":"2011-12-08T12:27:48.642Z","0.0.6":"2011-12-08T12:27:48.642Z","0.0.7":"2011-12-08T12:27:48.642Z","0.0.8":"2011-12-08T12:27:48.642Z","0.0.9":"2011-12-08T12:27:48.642Z","0.1.0":"2011-12-08T17:18:04.191Z"},"author":{"name":"Pau Ramon","email":"masylum@gmail.com"},"repository":{"type":"git","url":"git://github.com/masylum/asereje.git"},"_attachments":{"asereje-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-ie4Gh4/pwIP5/rbXuAZxmQ==","length":3277,"stub":true},"asereje-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-NS+wPdbn1usPg/a1+NyOOw==","length":3260,"stub":true},"asereje-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-1vTIah63jCYJV4U284WTPw==","length":3264,"stub":true},"asereje-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-V7Cjp4yOM/mUDlnpXINfvA==","length":3290,"stub":true},"asereje-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-9zttm1HP4i8OW4d6D60vBA==","length":2569,"stub":true},"asereje-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Q81DxOHdyvihTgspFjzEBA==","length":2567,"stub":true},"asereje-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RJWCwo28S8Yf8b2XizVEgQ==","length":2567,"stub":true},"asereje-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-CKY+/EffgU6ykLuxfzr5og==","length":2571,"stub":true},"asereje-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-aqFfPohPdtNnPV3hHEcNkA==","length":2572,"stub":true},"asereje-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9BpnXaqIQxFEJ/9x3+I10w==","length":2577,"stub":true}}}},
{"id":"ash","key":"ash","value":{"rev":"6-3697a3aee708bece8a08c7e0d1010476"},"doc":{"_id":"ash","_rev":"6-3697a3aee708bece8a08c7e0d1010476","name":"ash","description":"A framework for the bohemian web developer","dist-tags":{"latest":"0.0.1rc"},"versions":{"0.0.1rc":{"name":"ash","description":"A framework for the bohemian web developer","version":"0.0.1rc","author":{"name":"Ric Allinson","email":"ric@allinson.me"},"contributors":[],"dependencies":{"connect":">= 0.2.3","step":">= 0.0.3"},"keywords":["framework","web"],"main":"./lib/ash/index","directories":{"lib":"./lib/ash"},"engines":{"node":">= 0.1.98"},"_id":"ash@0.0.1rc","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/ash/-/ash-0.0.1rc.tgz"},"mtime":"2010-11-09T23:16:23Z","ctime":"2010-11-09T23:16:23Z"}},"maintainers":[{"name":"capecodehq","email":"ric@allinson.com"}],"mtime":"2010-11-09T23:16:23Z","ctime":"2010-11-09T23:16:23Z","author":{"name":"Ric Allinson","email":"ric@allinson.me"},"_attachments":{"ash-0.0.1rc.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sdJAxydntSQhHMZwWs1C/w==","length":32498,"stub":true}}}},
{"id":"asifier","key":"asifier","value":{"rev":"3-cf9513c1d0ba0cf712e86e7b7b0db3ef"},"doc":{"_id":"asifier","_rev":"3-cf9513c1d0ba0cf712e86e7b7b0db3ef","name":"asifier","description":"A tool for inspecting where ASI occurs.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Jussi Kalliokoski","email":"jussi.kalliokoski@gmail.com","url":"http://avd.io"},"name":"asifier","description":"A tool for inspecting where ASI occurs.","version":"0.1.0","homepage":"https://github.com/jussi-kalliokoski/asifier","repository":{"url":"git://github.com/jussi-kalliokoski/asifier.git"},"main":"./lib/index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"asify":"bin/asify"},"_npmUser":{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"},"_id":"asifier@0.1.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a3dc1e1ed91f9911e4a9530bc4f6b083dcc1da44","tarball":"http://registry.npmjs.org/asifier/-/asifier-0.1.0.tgz"},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]}},"readme":"# asifier\n\nAfter all this debate about ASI being hard to learn for language newcomers, I was wondering if code editors could be equipped with a plugin that would show where ASI would insert semicolons. This could also be helpful to people not wanting to use semicolons, as the semicolons would be visible, but you didn't have to type them (it's hard, I know). So, asifier is a small node module based on [narcissus](https://github.com/mozilla/narcissus) with a CLI tool to detect where ASI would insert the semicolons. This could later be used by code editors to implement the feature I described earlier.\n\nYes, the name is a pun, it's silly that the \"discussion\" about semicolons got that heated up, so let's just suck our pacifiers and keep doing awesome stuff.\n\n## Usage\n\nFirst, you need to install it:\n\n```\nsudo npm install asifier -g\n```\n\nThen you can use it from the command line:\n\n```\nasify myjsfile.js\n```\n\nThis will return a JSON array of the line numbers where semicolons would be automatically inserted.\n\nYou can use the ```--insert``` flag to see what the file would look like after ASI.\n\n## License and Disclaimer\n\nThe original parts of the project are licensed under MIT license. For the licensing of narcissus, see the LICENSE document in the ./lib/narcs/ directory.\n\nAnd please, don't use it for trolling people's projects with automatic pull requests. A good idea is to use it on a permissive license open source library to adjust it to your project's style automatically after updates to the original project.\n","maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}],"time":{"modified":"2012-05-06T10:30:13.876Z","created":"2012-05-06T10:30:11.856Z","0.1.0":"2012-05-06T10:30:13.876Z"},"author":{"name":"Jussi Kalliokoski","email":"jussi.kalliokoski@gmail.com","url":"http://avd.io"},"repository":{"url":"git://github.com/jussi-kalliokoski/asifier.git"},"_attachments":{"asifier-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RtLYkMGknfri16kzlim8wA==","length":52090,"stub":true}}}},
{"id":"asis","key":"asis","value":{"rev":"5-beb83358a1cb0242e519b9ad8e22c31c"},"doc":{"_id":"asis","_rev":"5-beb83358a1cb0242e519b9ad8e22c31c","name":"asis","description":"A Simple Image Server","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Yuri A. Parsons","email":"yuri@ninjakitty.net","url":"ninjakitty.net"},"name":"asis","description":"A Simple Image Server","version":"0.0.1","homepage":"https://github.com/ninjakttty/asis","repository":{"type":"git","url":"git://github.com/ninjakttty/asis.git"},"bin":{"asis":"./bin/asis.js"},"dependencies":{"express":"2.5.8","jade":">= 0.0.1","walk":"~2.1.1","underscore":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"ninjakttty","email":"yuri@ninjakitty.net"},"_id":"asis@0.0.1","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"be593c0dffcca5c35bccee9a828bd4321900b8c6","tarball":"http://registry.npmjs.org/asis/-/asis-0.0.1.tgz"},"maintainers":[{"name":"ninjakttty","email":"yuri@ninjakitty.net"}]},"0.0.2":{"author":{"name":"Yuri A. Parsons","email":"yuri@ninjakitty.net","url":"ninjakitty.net"},"name":"asis","description":"A Simple Image Server","version":"0.0.2","homepage":"https://github.com/ninjakttty/asis","repository":{"type":"git","url":"git://github.com/ninjakttty/asis.git"},"bin":{"asis":"./bin/asis.js"},"dependencies":{"express":"2.5.8","jade":">= 0.0.1","walk":"~2.1.1","underscore":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"ninjakttty","email":"yuri@ninjakitty.net"},"_id":"asis@0.0.2","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"638839febb5025eb7bd0a2f8683ca4f54c0a0da3","tarball":"http://registry.npmjs.org/asis/-/asis-0.0.2.tgz"},"maintainers":[{"name":"ninjakttty","email":"yuri@ninjakitty.net"}]}},"readme":"# Asis Image Server.\n\nA simple image server and asset server. \n\n\n## Installing\n\n\n1. [Install Node.js](http://nodejs.org/)\n\n\n1. Install Asis\n\n\t\tnpm -g install asis\n\n\n## Using\n\nTo serve images simply type\n``` \nasis ~/image_folder\n```\nor type \n\n``` \nasis \n```\nto serve up the current directory\n\n## Todo\n\n- Better image scaling\n- Image thumbnails\n- Different Assets (swf)\n- User set configuration\n- Better directory navigation\n- Live updating of files\n- Fix UI\n- User defined themes\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2012 [Yuri A. Parsons](http://ninjakitty.net)","maintainers":[{"name":"ninjakttty","email":"yuri@ninjakitty.net"}],"time":{"modified":"2012-06-06T19:01:17.150Z","created":"2012-06-05T18:27:26.700Z","0.0.1":"2012-06-05T18:27:28.080Z","0.0.2":"2012-06-06T19:01:17.150Z"},"author":{"name":"Yuri A. Parsons","email":"yuri@ninjakitty.net","url":"ninjakitty.net"},"repository":{"type":"git","url":"git://github.com/ninjakttty/asis.git"},"_attachments":{"asis-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ARRwPOSAaAlMspe5j/CyYA==","length":406851,"stub":true},"asis-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hzENScU8hnZXKCo8S6jPSA==","length":406354,"stub":true}}}},
{"id":"ask","key":"ask","value":{"rev":"5-e04ee6a55365f0fc056d9398da711853"},"doc":{"_id":"ask","_rev":"5-e04ee6a55365f0fc056d9398da711853","name":"ask","description":"ask user prompt for nodejs","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"ask","description":"ask user prompt for cake","keywords":["javascript","prompt","cake","coffeescript"],"author":{"name":"Tom Wilson"},"version":"0.0.1","licenses":[{"type":"MIT","url":"http://github.com/twilson63/ask/raw/master/LICENSE"}],"engines":{"node":">=0.2.5"},"directories":{"lib":"./lib"},"main":"./lib/ask","homepage":"http://github.com/twilson63/ask/raw/master/readme.md","repository":{"type":"git","url":"git://github.com/twilson63/ask.git"},"dependencies":{},"devDependencies":{},"_id":"ask@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"36524635d4ae573ba9d12cfe1f193010e7e1d2aa","tarball":"http://registry.npmjs.org/ask/-/ask-0.0.1.tgz"},"scripts":{}},"0.1.0":{"name":"ask","description":"ask user prompt for nodejs","keywords":["javascript","prompt","cake","coffeescript"],"author":{"name":"Tom Wilson"},"version":"0.1.0","licenses":[{"type":"MIT","url":"http://github.com/twilson63/ask/raw/master/LICENSE"}],"engines":{"node":"~0.6.x"},"directories":{"lib":"./lib"},"main":"./lib/ask","homepage":"http://github.com/twilson63/ask/raw/master/readme.md","repository":{"type":"git","url":"git://github.com/twilson63/ask.git"},"_npmUser":{"name":"twilson63","email":"tom@jackhq.com"},"_id":"ask@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cffe19d78ba8616f5b437ddaf7fb522d11e0c486","tarball":"http://registry.npmjs.org/ask/-/ask-0.1.0.tgz"},"maintainers":[{"name":"twilson63","email":"tom@jackhq.com"}]}},"maintainers":[{"name":"twilson63","email":"tom@jackhq.com"}],"time":{"modified":"2011-12-15T07:20:32.489Z","created":"2011-05-14T21:34:31.330Z","0.0.1":"2011-05-14T21:34:31.781Z","0.1.0":"2011-12-15T07:20:32.489Z"},"author":{"name":"Tom Wilson"},"repository":{"type":"git","url":"git://github.com/twilson63/ask.git"},"_attachments":{"ask-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-F8Qp6Z3G+f+irtjo4df4qg==","length":2334,"stub":true},"ask-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IqfRwk8DH6mnayzSDUCs3Q==","length":1771,"stub":true}}}},
{"id":"aska","key":"aska","value":{"rev":"3-386c70885d054baa1caeec496997789e"},"doc":{"_id":"aska","_rev":"3-386c70885d054baa1caeec496997789e","name":"aska","description":"ask cmd line","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"aska","version":"0.0.1","author":{"name":"iskedk"},"description":"ask cmd line","homepage":"http://nodejs.dk/aska","engines":["node >= 0.6.6"],"main":"index","dependencies":{},"devDependencies":{},"_npmUser":{"name":"iskedk","email":"iskedk@bloggen.dk"},"_id":"aska@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b2720b4b6e8c14bb4201a421e8b622217453f25a","tarball":"http://registry.npmjs.org/aska/-/aska-0.0.1.tgz"},"readme":"","maintainers":[{"name":"iskedk","email":"iskedk@bloggen.dk"}]}},"readme":"","maintainers":[{"name":"iskedk","email":"iskedk@bloggen.dk"}],"time":{"modified":"2012-04-24T09:38:22.563Z","created":"2012-04-24T09:38:19.165Z","0.0.1":"2012-04-24T09:38:22.563Z"},"author":{"name":"iskedk"},"_attachments":{"aska-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-whf1uTxHUCnSLC9rJ5LWrQ==","length":1273,"stub":true}}}},
{"id":"asn1","key":"asn1","value":{"rev":"25-ee91add64b6e1c526118759942db7cdb"},"doc":{"_id":"asn1","_rev":"25-ee91add64b6e1c526118759942db7cdb","name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","dist-tags":{"latest":"0.1.11"},"versions":{"0.1.0":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.0","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8618214ff5c0180807a885d9c1f3b67dc73e058f","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.0.tgz"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.1":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.1","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a63c6cc21cafa12ac05f5c3f61e6084566292aa2","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.1.tgz"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.2":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.2","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.2","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"ac835e89fed60d2909179f192295f36162e8c00a","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.2.tgz"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.3":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.3","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.3","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"4bc56225d38f434d832582980bfc7f5e50bbb1c4","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.3.tgz"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.4":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.4","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.4","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f1ea11165f132785bc040f8d4ed8333a84bddb14","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.4.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}],"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"}},"0.1.5":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.5","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.5","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.3","_defaultsLoaded":true,"dist":{"shasum":"eb22776346f5b7583c227a2f74bb984133c83260","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.5.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}],"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"}},"0.1.6":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.6","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.6/package/package.json","serverjs":false,"contributors":false,"wscript":false},"_id":"asn1@0.1.6","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"39f634ff13d942d9d922939a2742909233b84c78","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.6.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}],"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"}},"0.1.7":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.7","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmJsonOpts":{"file":"/Users/mark/.npm/asn1/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asn1@0.1.7","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"68f70219ea9f57f035bc40507bfb30d14f0f2f62","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.7.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}],"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"}},"0.1.8":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.8","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"_id":"asn1@0.1.8","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9b0012d5469d70cb5516c84d4c5b772c1f1521de","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.8.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.9":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.9","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"~0.0.5"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"_id":"asn1@0.1.9","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d90236dce043ffa224b28f1aad4b6dfc78783a9c","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.9.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.10":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.10","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"0.1.2"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"_id":"asn1@0.1.10","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"27488f32749567e1e117a9764c70c76b053312e5","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.10.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]},"0.1.11":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"contributors":[{"name":"David Gwynne","email":"loki@animata.net"},{"name":"Yunong Xiao","email":"yunong@joyent.com"}],"name":"asn1","description":"Contains parsers and serializers for ASN.1 (currently BER only)","version":"0.1.11","repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"main":"lib/index.js","engines":{"node":">=0.4.9"},"dependencies":{},"devDependencies":{"tap":"0.1.4"},"scripts":{"pretest":"which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi","test":"./node_modules/.bin/tap ./tst"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"_id":"asn1@0.1.11","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"559be18376d08a4ec4dbe80877d27818639b2df7","tarball":"http://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"},"readme":"node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.\nCurrently BER encoding is supported; at some point I'll likely have to do DER.\n\n## Usage\n\nMostly, if you're *actually* needing to read and write ASN.1, you probably don't\nneed this readme to explain what and why.  If you have no idea what ASN.1 is,\nsee this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nThe source is pretty much self-explanatory, and has read/write methods for the\ncommon types out there.\n\n### Decoding\n\nThe following reads an ASN.1 sequence with a boolean.\n\n    var Ber = require('asn1').Ber;\n\n    var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));\n\n    reader.readSequence();\n    console.log('Sequence len: ' + reader.length);\n    if (reader.peek() === Ber.Boolean)\n      console.log(reader.readBoolean());\n\n### Encoding\n\nThe following generates the same payload as above.\n\n    var Ber = require('asn1').Ber;\n\n    var writer = new Ber.Writer();\n\n    writer.startSequence();\n    writer.writeBoolean(true);\n    writer.endSequence();\n\n    console.log(writer.buffer);\n\n## Installation\n\n    npm install asn1\n\n## License\n\nMIT.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-asn1/issues>.\n","maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]}},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}],"time":{"modified":"2012-01-06T17:02:19.759Z","created":"2011-07-19T19:07:06.870Z","0.1.0":"2011-12-08T16:49:17.462Z","0.1.1":"2011-12-08T16:49:17.462Z","0.1.2":"2011-12-08T16:49:17.462Z","0.1.3":"2011-12-08T16:49:17.462Z","0.1.4":"2011-12-08T16:49:17.462Z","0.1.5":"2011-12-08T16:49:17.462Z","0.1.6":"2011-12-08T16:49:17.462Z","0.1.7":"2011-12-08T16:49:17.462Z","0.1.8":"2011-11-07T22:10:26.013Z","0.1.9":"2011-11-11T19:18:29.635Z","0.1.10":"2011-12-08T16:49:17.462Z","0.1.11":"2012-01-06T17:02:19.759Z"},"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"repository":{"type":"git","url":"git://github.com/mcavage/node-asn1.git"},"_attachments":{"asn1-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-o00YhTWnAuHG4Nn3aNbVQg==","length":7855,"stub":true},"asn1-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-tbteZVLLZJfMzqWJH9ETCw==","length":10240,"stub":true},"asn1-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-RKYddFSKiQ3T9T2EOAFESQ==","length":10240,"stub":true},"asn1-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-XmsCgJL30aYE7w5o+jovBw==","length":10240,"stub":true},"asn1-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-rZEaYnuk7eZYiqC0iLiGdw==","length":7256,"stub":true},"asn1-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-xby7Z+iX56tYu6pssUS9uw==","length":6822,"stub":true},"asn1-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vd+ALIg074chdj/Q3oEEZQ==","length":6808,"stub":true},"asn1-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-aRxRtzOrh8I3umlyUSMDfg==","length":6800,"stub":true},"asn1-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-3qV7gqRqEJ5k7sr7s6QvnA==","length":6796,"stub":true},"asn1-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kbaQAJ1J3AiUke56AkHHrg==","length":6538,"stub":true},"asn1-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-17IrDGd10o9duhIPmlu6vQ==","length":6516,"stub":true},"asn1-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+MRXRkRz1PUg4cldEhAS7Q==","length":6513,"stub":true}}}},
{"id":"aspect","key":"aspect","value":{"rev":"3-c62cbd6ac35373faaa16166f028bc695"},"doc":{"_id":"aspect","_rev":"3-c62cbd6ac35373faaa16166f028bc695","name":"aspect","description":"dojo aspect function","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"aspect","version":"0.0.1","description":"dojo aspect function","engines":{"node":">= 0.5.0"},"author":{"name":"Christoph Hagenbrock","email":"christoph.hagenbrock@comvel.de"},"repository":{"type":"git","url":""},"main":"./index.js","keywords":["dojo","aspect","aop"],"dependencies":{},"_npmUser":{"name":"agebrock","email":"christoph.hagenbrock@googlemail.com"},"_id":"aspect@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4b99b7765e17c05fcda97a3a246198c3e9b665ed","tarball":"http://registry.npmjs.org/aspect/-/aspect-0.0.1.tgz"},"readme":"","maintainers":[{"name":"agebrock","email":"christoph.hagenbrock@googlemail.com"}]}},"readme":"","maintainers":[{"name":"agebrock","email":"christoph.hagenbrock@googlemail.com"}],"time":{"modified":"2012-05-15T22:41:11.178Z","created":"2012-05-15T22:41:08.796Z","0.0.1":"2012-05-15T22:41:11.178Z"},"author":{"name":"Christoph Hagenbrock","email":"christoph.hagenbrock@comvel.de"},"repository":{"type":"git","url":""},"_attachments":{"aspect-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9uBZVjl23nvqDfYfZE2d/Q==","length":2384,"stub":true}}}},
{"id":"aspectos","key":"aspectos","value":{"rev":"3-817abe2dd8e1edf97b62e7fa27b55d84"},"doc":{"_id":"aspectos","_rev":"3-817abe2dd8e1edf97b62e7fa27b55d84","name":"aspectos","description":"Small and simple AOP library","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"aspectos","description":"Small and simple AOP library","version":"1.0.1","keywords":["aspectos","aop","aspect","ender"],"homepage":"http://github.com/lawrencec/aspectos","authors":["Lawrence Carvalho"],"repository":{"type":"git","url":"git://github.com/lawrencec/aspectos.git"},"dependencies":{},"main":"src/aspectos.js","ender":"noop","_npmUser":{"name":"lawrencec","email":"lawrence@nodetraveller.com"},"_id":"aspectos@1.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"4a8638ac1daf938ebbf035ad8a3005c164f194d2","tarball":"http://registry.npmjs.org/aspectos/-/aspectos-1.0.1.tgz"},"maintainers":[{"name":"lawrencec","email":"lawrence@nodetraveller.com"}]}},"readme":"# Aspectos [![Build Status](https://secure.travis-ci.org/lawrencec/aspectos.png)](http://travis-ci.org/lawrencec/aspectos)\n\n\nA simple library to provide basic AOP (Aspect Oriented Programming) functionality to your scripts.\n\n## Cloning\n\nThe Jasmine testing framework is used for the tests and is added as a submodule.\n\nYou can either clone this repo with the submodules in one command like so:\n\n    git clone REPO_URL --recursive\n\nor separately\n\n    git clone REPO_URL\n    <cd clonedrepo>\n    git submodule update --init --recursive\n\n## Usage\n\nAspectos provides three methods to provide the basic aspects to your objects:\n <code>before()</code>, <code>after()</code>, <code>around()</code>. These allow\n you to run other function before, after or around any method respectively.\n\n\n### before\n\n\n    var testObject = {\n        write: function() {\n            testValue += ' 2';\n        }\n    };\n    testObject.write = aspectos.before(testObject, 'write', function() {\n        testValue += '1';\n    });\n    testObject.write();\n    // should write out '1 2'\n\n## after\n\n    var testObject = {\n        write: function() {\n            testValue += '1';\n        }\n    };\n    testObject.write = aspectos.after(testObject, 'write', function() {\n        testValue += ' 2';\n    });\n    testObject.write();\n    // should write out '1 2'\n\n## around\n    var testObject = {\n        write: function() {\n            testValue += ' ';\n        }\n    };\n    testObject.write = aspectos.around(\n        testObject,\n        'write',\n        [\n            function() {\n                testValue += '1';\n            },\n            function() {\n                testValue += '2';\n            }\n        ]\n    );\n    testObject.write();\n    //should write '1 2'\n\n## Tests\n\nSee the index.html file in the tests directory","maintainers":[{"name":"lawrencec","email":"lawrence@nodetraveller.com"}],"time":{"modified":"2012-08-12T18:09:03.084Z","created":"2012-08-12T18:09:01.501Z","1.0.1":"2012-08-12T18:09:03.084Z"},"repository":{"type":"git","url":"git://github.com/lawrencec/aspectos.git"},"_attachments":{"aspectos-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ceEf7F5A0MuEOo/pil1x6g==","length":296960,"stub":true}}}},
{"id":"aspsms","key":"aspsms","value":{"rev":"9-7b82d722bdac29a4da8c88b642ad64f2"},"doc":{"_id":"aspsms","_rev":"9-7b82d722bdac29a4da8c88b642ad64f2","name":"aspsms","description":"Send SMS text messages through aspsms.com","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"aspsms","description":"Send SMS text messages through aspsms.com","version":"0.1.0","homepage":"http://maxkueng.com/node-aspsms","repository":{"type":"git","url":"git://github.com/maxkueng/node-aspsms.git"},"author":{"name":"Max Kueng","email":"me@maxkueng.com","url":"http://maxkueng.com/"},"directories":{"lib":"./lib"},"dependencies":{"request":">=1.9.0"},"main":"./lib/aspsms","_id":"aspsms@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","dist":{"shasum":"29aa46e68a468cefcb9844b2d08441133b31cc81","tarball":"http://registry.npmjs.org/aspsms/-/aspsms-0.1.0.tgz"}},"0.1.1":{"name":"aspsms","description":"Send SMS text messages through aspsms.com","keywords":["sms","text message","short message service","aspsms"],"version":"0.1.1","homepage":"http://maxkueng.com/node-aspsms","repository":{"type":"git","url":"git://github.com/maxkueng/node-aspsms.git"},"author":{"name":"Max Kueng","email":"me@maxkueng.com","url":"http://maxkueng.com/"},"directories":{"lib":"./lib"},"dependencies":{"request":">=1.9.0"},"main":"./lib/aspsms","licenses":[{"type":"MIT","url":"https://github.com/maxkueng/node-aspsms/raw/master/LICENSE"}],"_id":"aspsms@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","dist":{"shasum":"034090f410a5b3b308a8a02f1b667644b7a34b8b","tarball":"http://registry.npmjs.org/aspsms/-/aspsms-0.1.1.tgz"}}},"maintainers":[{"name":"maxkueng","email":"me@maxkueng.com"}],"time":{"modified":"2011-05-01T16:30:01.526Z","created":"2011-05-01T14:43:27.655Z","0.1.0":"2011-05-01T14:43:28.187Z","0.1.1":"2011-05-01T14:45:36.525Z"},"author":{"name":"Max Kueng","email":"me@maxkueng.com","url":"http://maxkueng.com/"},"repository":{"type":"git","url":"git://github.com/maxkueng/node-aspsms.git"},"_attachments":{"aspsms-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-H64yeC1JETx9LZg/N3dwiA==","length":2646,"stub":true},"aspsms-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZhhZWolmPW07LgigA4kTLw==","length":2562,"stub":true}}}},
{"id":"assembly","key":"assembly","value":{"rev":"54-765e3aa59043c60590eed08786d1c1d5"},"doc":{"_id":"assembly","_rev":"54-765e3aa59043c60590eed08786d1c1d5","name":"assembly","description":"build tool to assemble client side javascript projects","dist-tags":{"latest":"0.3.1"},"versions":{"0.0.1":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.0.1","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"flatiron":"0.1.x","broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x"},"devDependencies":{"mocha":"0.12.x","should":"0.5.x","request":"2.9.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"bbd2326cf45b906c0a7d309c1894bb2921ffd706","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.0.1.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.1.0":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.1.0","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"0.0.x","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x"},"devDependencies":{"mocha":"0.13.x","should":"0.5.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"63d3f53ebb8cd3bc2d32c9ffdf37f9027d99a618","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.1.0.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.0":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.0","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"0.0.x","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.5.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8ef1baefcf8e1a27d05a4d8f0e55cca1d5c3c1dd","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.0.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.1":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.1","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"0.0.x","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.5.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"3608acbf434cb355774b061bff06cf1ed98265e5","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.1.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.2":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.2","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"0.1.x","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"22f5e08be70d44d9b528770b970b94fedb57d236","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.2.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.5":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.5","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"0.1.x","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"dbf29ffdbfa6e1796a59329063a94e7b8c1e8725","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.5.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.6":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.6","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1b89a3cab340ed228e8d047ef5523f6ca3951b05","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.6.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.7":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.7","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6ca9a90ad08b32b46923b7a39c8055b47d6a7bf3","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.7.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.8":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.8","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c0f2b930a14ae275ade64502580c8bcdfd984254","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.8.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.9":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.9","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0d93ad0b0cbe49bce822426d0b43596b91bad035","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.9.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.10":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.10","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"78002eae62492c0363c0c9af6decee9c42f87eea","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.10.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.11":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.11","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b6eb2c1a89bcf58b0b3884e7ed38d44f021dbbb1","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.11.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.12":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.12","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","deputy":"0.0.x","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"56a4ec27333d5db4772953072c0fbbd4f725774c","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.12.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.13":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.13","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","findit":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.13","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"02415bfd295ace551d31322d6c8b1e84e8c36451","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.13.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.14":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.14","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.14","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1b2d9abe8ae5ffe09656dcb4950fffe3a3ce8578","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.14.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.15":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.15","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.15","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"dc25f0d95fdc0b55d6a8c4c88ec31ba471e2fd07","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.15.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.16":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.16","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.16","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cdfc831702b8ca22d87be47083f23eecd2e3b003","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.16.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.17":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.17","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","less":"1.2.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.17","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e3545c439111e417da2b56f6e48bee4b38b249aa","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.17.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.18":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.18","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.18","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4f103f3cbbb203cf3f6b1eacf037b8531296839d","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.18.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.19":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.19","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.19","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0b979a9f1c4e04ae405ad4855452d7cde953536a","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.19.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.20":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.20","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.20","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"10d0a3e2ce88d62a74ec3d90c6982c3ebd982c87","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.20.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"directories":{}},"0.2.21":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.21","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.21","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"bd7e7290d8902564901f86f059be7158d6841f0e","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.21.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}]},"0.2.22":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.2.22","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","templates","handlebars","middleware","flatiron","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.0.10","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.1.x","uglify-js":"1.2.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"0.14.x","should":"0.6.x","coffee-script":"1.2.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.2.22","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4ccf539538431d6ca7539baece71e39254649c3a","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.2.22.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}]},"0.3.0":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.3.0","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","backbone","templates","handlebars","middleware","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.1.x","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.2.x","uglify-js":"1.3.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"1.3.x","should":"0.6.x","coffee-script":"1.3.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test","start":"node examples/server.js"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3c56c1c129c41344ee442e25b2cbed5b71dc01a9","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.3.0.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}]},"0.3.1":{"name":"assembly","description":"build tool to assemble client side javascript projects","version":"0.3.1","author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"keywords":["client","backbone","templates","handlebars","middleware","web"],"dependencies":{"broadway":"0.1.x","less":"1.3.x","mime":"1.2.x","utile":"0.1.x","watch":"0.5.x","pkginfo":"0.2.x","read-dir-files":"0.1.x","detective":"~0.1.0","resolve":"0.2.x","uglify-js":"1.3.x","traverse":"0.6.x","optimist":"0.3.x"},"devDependencies":{"mocha":"1.3.x","should":"0.6.x","coffee-script":"1.3.x","handlebars":"1.0.x","underscore":"1.3.x","express":"2.5.x"},"bin":{"assembly":"./bin/assembly"},"scripts":{"test":"make test","start":"node examples/server.js"},"engines":{"node":">= 0.6.0"},"main":"./lib/assembly","_npmUser":{"name":"fitz","email":"ryan@codebrewstudios.com"},"_id":"assembly@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"57950e2a37b75615a96da474d41770824389ff7d","tarball":"http://registry.npmjs.org/assembly/-/assembly-0.3.1.tgz"},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}]}},"readme":"","maintainers":[{"name":"fitz","email":"ryan@codebrewstudios.com"}],"time":{"modified":"2012-07-14T18:12:22.498Z","created":"2012-02-23T21:37:06.363Z","0.0.1":"2012-02-23T21:37:06.928Z","0.1.0":"2012-03-01T16:13:27.937Z","0.2.0":"2012-03-02T21:15:29.637Z","0.2.1":"2012-03-05T22:24:36.851Z","0.2.2":"2012-03-06T02:30:08.184Z","0.2.5":"2012-03-06T22:46:49.784Z","0.2.6":"2012-03-07T18:02:01.228Z","0.2.7":"2012-03-08T21:39:00.593Z","0.2.8":"2012-03-08T22:20:09.002Z","0.2.9":"2012-03-09T18:05:51.180Z","0.2.10":"2012-03-09T22:05:13.381Z","0.2.11":"2012-03-09T22:47:00.694Z","0.2.12":"2012-03-09T22:58:38.109Z","0.2.13":"2012-03-10T07:26:28.679Z","0.2.14":"2012-03-10T21:31:24.876Z","0.2.15":"2012-03-10T21:45:21.562Z","0.2.16":"2012-03-12T02:13:10.151Z","0.2.17":"2012-03-12T03:49:37.343Z","0.2.18":"2012-03-13T03:38:08.991Z","0.2.19":"2012-03-18T08:20:41.639Z","0.2.20":"2012-03-18T21:51:05.363Z","0.2.21":"2012-04-26T19:47:10.908Z","0.2.22":"2012-04-26T20:10:35.335Z","0.3.0":"2012-07-14T13:28:27.822Z","0.3.1":"2012-07-14T18:12:22.498Z"},"author":{"name":"Ryan Fitzgerald","email":"ryan@codebrewstudios.com"},"repository":{"type":"git","url":"git://github.com/Wantworthy/assembly.git"},"_attachments":{"assembly-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-G0heRIkAb9j1IrsnZKTVOA==","length":555674,"stub":true},"assembly-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-dI2ycJtX5VkDxtItbrhXUg==","length":530231,"stub":true},"assembly-0.2.22.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-E4+SjF9Sh5YxkxD3WiONJQ==","length":530981,"stub":true},"assembly-0.2.21.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-HEgw3Zr5R9CoiCUpb/BLOg==","length":530960,"stub":true},"assembly-0.2.20.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-PbNLoEwl//VJcZOWN3Pt8w==","length":530177,"stub":true},"assembly-0.2.19.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-FLQzL4b4pe/BI20/TLIZsQ==","length":529823,"stub":true},"assembly-0.2.18.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-mEF1culqr7ssxfcitYtfzA==","length":529709,"stub":true},"assembly-0.2.17.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-O8cboQbH91+lcUwCqfBUTw==","length":529705,"stub":true},"assembly-0.2.16.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-TBeSdBeker+5L1hWRwDuVA==","length":529695,"stub":true},"assembly-0.2.15.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-8FOI7YhZKmYng54r6h5ZDQ==","length":529675,"stub":true},"assembly-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-asYQbqJO8UCMgHp0mSxqzg==","length":529658,"stub":true},"assembly-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-HglZKVHiLfDfePzmjPIh2w==","length":529671,"stub":true},"assembly-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-6hdtg2Crp0mH2oKY8cvoXA==","length":529469,"stub":true},"assembly-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-JBaB1ZIqYLuMzkmxmEmyXw==","length":529458,"stub":true},"assembly-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-RXdXlWVsC6o4NDrY2v+hgA==","length":529454,"stub":true},"assembly-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-v+aTa9F5LWiZS2s/Wulf7Q==","length":529391,"stub":true},"assembly-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-QA7N0oKwosFg4naP+ja4XQ==","length":529245,"stub":true},"assembly-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-A+flfyu64gRsVeELJlgxQA==","length":529207,"stub":true},"assembly-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-2ENfrIYnLfXQczEZnMeqsg==","length":528235,"stub":true},"assembly-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vIhCcjgFC+DMflVR4bOI7Q==","length":528135,"stub":true},"assembly-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-oaZwyG8BXIYrqBxVW08mCw==","length":527775,"stub":true},"assembly-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-iqQSMClDIzGR0gAqANgpng==","length":370450,"stub":true},"assembly-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ILPzNBp6+peBE2iHt4w0Lg==","length":213906,"stub":true},"assembly-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mzGeeqZpxZJrtkiUezA4NA==","length":191147,"stub":true},"assembly-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-P9vJ+Z/6xvZLYHABd/kLEw==","length":3883,"stub":true}}}},
{"id":"assert","key":"assert","value":{"rev":"4-0c37e1fbc48e8f1ae2fefcaffd2c9fa9"},"doc":{"_id":"assert","_rev":"4-0c37e1fbc48e8f1ae2fefcaffd2c9fa9","name":"assert","description":"Node.JS assert module","dist-tags":{"latest":"0.4.9"},"versions":{"0.4.9":{"author":{"name":"narwhal.js","url":"http://narwhaljs.org"},"name":"assert","description":"Node.JS assert module","keywords":["ender","assert"],"version":"0.4.9","homepage":"http://nodejs.org/docs/v0.4.9/api/assert.html","repository":{"type":"git","url":"git://github.com/coolaj86/nodejs-libs-4-browser.git"},"main":"./assert.js","directories":{"lib":"."},"engines":{"node":">= 0.2.0","ender":">= 0.5.0"},"dependencies":{"util":">= 0.4.9"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/coolaj86/.npm/assert/0.4.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assert@0.4.9","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"45faff1a58f718508118873dead940c8b51db939","tarball":"http://registry.npmjs.org/assert/-/assert-0.4.9.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2012-08-05T00:05:30.260Z","created":"2011-06-30T00:30:08.354Z","0.4.9":"2011-06-30T00:30:08.699Z"},"author":{"name":"narwhal.js","url":"http://narwhaljs.org"},"repository":{"type":"git","url":"git://github.com/coolaj86/nodejs-libs-4-browser.git"},"users":{"pid":true},"_attachments":{"assert-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ff1JQRtzRtm2J6PfaBZnAA==","length":3806,"stub":true}}}},
{"id":"assert-called","key":"assert-called","value":{"rev":"3-c8a57830067c1c3ef3757d2860a6e0e2"},"doc":{"_id":"assert-called","_rev":"3-c8a57830067c1c3ef3757d2860a6e0e2","name":"assert-called","description":"Assert that your callback got called","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"assert-called","version":"0.0.1","author":{"name":"Maciej Małecki","email":"me@mmalecki.com"},"description":"Assert that your callback got called","main":"./lib/assert-called","scripts":{"test":"node test/assert-called-test.js"},"readme":"# assert-called [![Build Status](https://secure.travis-ci.org/mmalecki/assert-called.png)](http://travis-ci.org/mmalecki/assert-called)\nAssert that your callback got called.\n\n## Installation\n\n    npm install assert-called\n\n## Usage\n```js\nvar cb = require('assert-called');\n\nfunction notCalling(cb) {\n}\n\nfunction notCalled() {\n}\n\nprocess.nextTick(cb(function () {\n  console.log('called');\n}));\n\nnotCalling(cb(notCalled));\n```\n\nWill output:\n\n```\ncalled\n\n/Users/maciej/dev/js/assert-called/lib/assert-called.js:20\n    throw new assert.AssertionError({\n          ^\nAssertionError: 1 callback not called:\n  notCalled\n```\n\n## How it works\n`assert-called` attaches a `process.on('exit')` listener to make sure that\nall registered callbacks are eventually called.\n","_id":"assert-called@0.0.1","dist":{"shasum":"5b082ea98c7ea130d93577aacb745d11244ef8e8","tarball":"http://registry.npmjs.org/assert-called/-/assert-called-0.0.1.tgz"},"maintainers":[{"name":"mmalecki","email":"me@mmalecki.com"}]}},"readme":"# assert-called [![Build Status](https://secure.travis-ci.org/mmalecki/assert-called.png)](http://travis-ci.org/mmalecki/assert-called)\nAssert that your callback got called.\n\n## Installation\n\n    npm install assert-called\n\n## Usage\n```js\nvar cb = require('assert-called');\n\nfunction notCalling(cb) {\n}\n\nfunction notCalled() {\n}\n\nprocess.nextTick(cb(function () {\n  console.log('called');\n}));\n\nnotCalling(cb(notCalled));\n```\n\nWill output:\n\n```\ncalled\n\n/Users/maciej/dev/js/assert-called/lib/assert-called.js:20\n    throw new assert.AssertionError({\n          ^\nAssertionError: 1 callback not called:\n  notCalled\n```\n\n## How it works\n`assert-called` attaches a `process.on('exit')` listener to make sure that\nall registered callbacks are eventually called.\n","maintainers":[{"name":"mmalecki","email":"me@mmalecki.com"}],"time":{"modified":"2012-07-08T19:19:18.843Z","created":"2012-07-08T19:19:16.981Z","0.0.1":"2012-07-08T19:19:18.843Z"},"author":{"name":"Maciej Małecki","email":"me@mmalecki.com"},"_attachments":{"assert-called-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i+WvknR3iG6HLEJt74BuPA==","length":1820,"stub":true}}}},
{"id":"assert-plus","key":"assert-plus","value":{"rev":"3-a66feb6c097434521dcb904ab31fc2cd"},"doc":{"_id":"assert-plus","_rev":"3-a66feb6c097434521dcb904ab31fc2cd","name":"assert-plus","description":"Extra assertions on top of node's assert module","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"name":"assert-plus","description":"Extra assertions on top of node's assert module","version":"0.1.0","main":"./assert.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.6"},"_npmUser":{"name":"mcavage","email":"mcavage@gmail.com"},"_id":"assert-plus@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"386c2c8452ebdfcf8f1f722fdea548c7bf874f9c","tarball":"http://registry.npmjs.org/assert-plus/-/assert-plus-0.1.0.tgz"},"maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}]}},"readme":"# node-assert-extra\n\nThis library is a super small wrapper over node's assert module that has two\nthings: (1) the ability to disable assertions with the environment variable\nNODE_NDEBUG, and (2) some API wrappers for argument testing.  Like\n`assert.string(myArg, 'myArg')`.  As a simple example, most of my code looks\nlike this:\n\n    var assert = require('assert-plus');\n\n    function fooAccount(options, callback) {\n\t    assert.object(options, 'options');\n\t\tassert.number(options.id, 'options.id);\n\t\tassert.bool(options.isManager, 'options.isManager');\n\t\tassert.string(options.name, 'options.name');\n\t\tassert.arrayOfString(options.email, 'options.email');\n\t\tassert.func(callback, 'callback');\n\n        // Do stuff\n\t\tcallback(null, {});\n    }\n\n# API\n\nAll methods that *aren't* part of node's core assert API are simply assumed to\ntake an argument, and then a string 'name' that's not a message; `AssertionError`\nwill be thrown if the assertion fails with a message like:\n\n    AssertionError: foo (string) is required\n\tat test (/home/mark/work/foo/foo.js:3:9)\n\tat Object.<anonymous> (/home/mark/work/foo/foo.js:15:1)\n\tat Module._compile (module.js:446:26)\n\tat Object..js (module.js:464:10)\n\tat Module.load (module.js:353:31)\n\tat Function._load (module.js:311:12)\n\tat Array.0 (module.js:484:10)\n\tat EventEmitter._tickCallback (node.js:190:38)\n\nfrom:\n\n    function test(foo) {\n\t    assert.string(foo, 'foo');\n    }\n\nThere you go.  You can check that arrays are of a homogenous type with `Arrayof$Type`:\n\n    function test(foo) {\n\t    assert.arrayOfString(foo, 'foo');\n    }\n\nYou can assert IFF an argument is not `undefined` (i.e., an optional arg):\n\n    assert.optionalString(foo, 'foo');\n\nLastly, you can opt-out of assertion checking altogether by setting the\nenvironment variable `NODE_NDEBUG=1`.  This is pseudo-useful if you have\nlots of assertions, and don't want to pay `typeof ()` taxes to v8 in\nproduction.\n\nThe complete list of APIs is:\n\n* assert.bool\n* assert.buffer\n* assert.func\n* assert.number\n* assert.object\n* assert.string\n* assert.arrayOfBool\n* assert.arrayOfFunc\n* assert.arrayOfNumber\n* assert.arrayOfObject\n* assert.arrayOfString\n* assert.optionalBool\n* assert.optionalBuffer\n* assert.optionalFunc\n* assert.optionalNumber\n* assert.optionalObject\n* assert.optionalString\n* assert.optionalArrayOfBool\n* assert.optionalArrayOfFunc\n* assert.optionalArrayOfNumber\n* assert.optionalArrayOfObject\n* assert.optionalArrayOfString\n* assert.AssertionError\n* assert.fail\n* assert.ok\n* assert.equal\n* assert.notEqual\n* assert.deepEqual\n* assert.notDeepEqual\n* assert.strictEqual\n* assert.notStrictEqual\n* assert.throws\n* assert.doesNotThrow\n* assert.ifError\n\n# Installation\n\n    npm install assert-plus\n\n## License\n\nThe MIT License (MIT)\nCopyright (c) 2012 Mark Cavage\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-assert-plus/issues>.\n","maintainers":[{"name":"mcavage","email":"mcavage@gmail.com"}],"time":{"modified":"2012-06-23T23:15:10.890Z","created":"2012-06-23T23:15:09.466Z","0.1.0":"2012-06-23T23:15:10.890Z"},"author":{"name":"Mark Cavage","email":"mcavage@gmail.com"},"_attachments":{"assert-plus-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BeTMO+TNfbqj8cQS/4O+Ug==","length":3011,"stub":true}}}},
{"id":"assert-responselike","key":"assert-responselike","value":{"rev":"4-00f4564a0ae369bf134a59e181e38394"},"doc":{"_id":"assert-responselike","_rev":"4-00f4564a0ae369bf134a59e181e38394","name":"assert-responselike","description":"An ultra simple all-test-framework friendly utility, meant to be used with the test framework of your choice, decorates the built-in assert object with a new method responseLike(res,exp,msg)","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"author":{"name":"Osher E","email":"osher.filter@gmail.com"},"name":"assert-responselike","description":"An ultra simple all-test-framework friendly utility, meant to be used with the test framework of your choice, decorates the built-in assert object with a new method responseLike(res,exp,msg)","version":"0.2.0","repository":{"type":"git","url":"git://github.com/osher/assert-responseLike.git"},"main":"index.js","scripts":{"test":"node node_modules/vows/bin/vows"},"engines":{"node":"~0.6.9"},"dependencies":{},"devDependencies":{"vows":"~0.6.3"},"optionalDependencies":{},"_npmUser":{"name":"osher","email":"osher.filter@gmail.com"},"_id":"assert-responselike@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"14897decf58ef2fa0b188e6d25b50ea57b9024ad","tarball":"http://registry.npmjs.org/assert-responselike/-/assert-responselike-0.2.0.tgz"},"maintainers":[{"name":"osher","email":"osher.filter@gmail.com"}]}},"readme":"\r\nOverview\r\n=========\r\n\r\nThis is an ultra simple all-test-framework friendly utility, meant to be used \r\nwith the test framework of your choice, decorates the built-in assert object \r\nwith a new method responseLike(res,exp,msg)\r\n\r\n\r\n * * *\r\n\r\nUsage\r\n======\r\n\r\nusage : \r\n\r\n```\r\n    var assert = require(\"assert\");\r\n      , request = require('your favorite http request lib')\r\n      , test  = require('your favorite test function of your favorite framework')\r\n      ;\r\n     \r\n    require(\"assert-responselike\"); \r\n\r\n    test( \"foo\", function() {\r\n      request(url, function(response){\r\n          assert.responseLike( response\r\n           , { status : 200 //throws 'Invalid response code - expected ... got ...'\r\n             , statusCode : 200 //same like status, for the explicitness lovers..\r\n             , headers :                      \r\n               { \"Content-Type\" : \"text/plain\" //throws 'response-header - expected ... got ...' \r\n               }\r\n             , body : \"run vows for full spec\" //throws 'Invalid response body - expected ... got ...'\r\n             }\r\n          );\r\n      });\r\n    });\r\n```\r\n\r\nInstallation\r\n============\r\n\r\n*using NPM*\r\n\r\n`npm install assert-responselike`\r\n\r\nesample of output:\r\n\r\n```\r\nD:\\work\\mymodule>npm install assert-responselike\r\nnpm http GET https://registry.npmjs.org/assert-responselike\r\nnpm http 304 https://registry.npmjs.org/assert-responselike\r\nassert-responselike@0.2.0 ./node_modules/assert-responselike\r\n```\r\n\r\n*Do it yourself*\r\n\r\ndownload the [zip](https://github.com/osher/assert-responseLike/zipball/master) from github, \r\nand extract it to your ./node_modules/ directory.\r\n\r\n*example of structure*\r\nEither way - \r\nexpect the following:\r\n\r\n```\r\n└───node_modules\r\n    └───assert-responselike\r\n        │   .npmignore\r\n        │   index.js\r\n        │   package.json\r\n        │   README.md\r\n        │\r\n        └───test\r\n                assert-response-test.js\r\n```\r\n\r\n\r\nTesting\r\n============\r\nafter extracting first you have to :\r\n\r\n`npm install`\r\n\r\nesample of output:\r\n\r\n```\r\nD:\\work\\assert-responseLike>npm install\r\nnpm http GET https://registry.npmjs.org/vows\r\nnpm http 304 https://registry.npmjs.org/vows\r\nnpm http GET https://registry.npmjs.org/eyes\r\nnpm http 304 https://registry.npmjs.org/eyes\r\nnpm WARN eyes@0.1.7 dependencies field should be hash of <name>:<version-range> pairs\r\nvows@0.6.3 ./node_modules/vows\r\n└── eyes@0.1.7\r\n```\r\n\r\nand then `vows --spec`\r\n* if you're a windows user - you'll want to add to your PATH variable '.\\node_modules\\.bin'\r\n* alternatively - just run `node ./node_modules/vows/bin/vows --spec`\r\n\r\n\r\nSpecifications\r\n===============\r\n\r\n```\r\n  ? assert response\r\n\r\n  API\r\n    √ assert should be decorated with the method:\r\n\r\n        assert.responseLike ( oActualResponse, oExpectedDescr, sCustomMessage )\r\n\r\n  check status code with attribute 'status'\r\n    √ providing correct numner should work\r\n    √ providing wrong number should throw\r\n\r\n  check status code with attribute 'statusCode'\r\n    √ providing correct number should work\r\n    √ providing wrong number should throw\r\n\r\n  check response headers\r\n    √ providing existing headers should work - case insensitive\r\n    √ providing wrong headers throw on the first mismatch\r\n    √ providing missing headers throw on the first misfound\r\n\r\n  check response body\r\n    √ regexp body descriptor that matches should not throw\r\n    √ regexp body descriptor that does not match should throw\r\n    √ when descriptor is not a RegExp, and body is object - deep equal match should not throw\r\n    √ when descriptor is not a RegExp, and body is object - deep equal difference should throw\r\n\r\n  check response headers - provide expected content\r\n    √ equal string - should pass\r\n    √ different string - should throw\r\n    √ matching regexp - should pass\r\n    √ non-matching regexp - should throw\r\n\r\n  thrown errors - when providing a message\r\n    √ should trail status-code error messages\r\n    √ should trail response-header error messages\r\n    √ should trail response-body error messages\r\n\r\n  thrown errors - a status-code check error message\r\n    √ should start with 'Invalid response status code'\r\n    √ should contain the expected response code\r\n    √ should contain the actual response code\r\n\r\n  thrown errors - a missing response-header check error message\r\n    √ should start with 'response header'\r\n    √ should contain the expected response header name\r\n    √ should contain the expected response header value\r\n    √ should contain the actual response value\r\n\r\n  thrown errors - a mismatching response-header check error message\r\n    √ should start with 'response header'\r\n    √ should contain the expected response header name\r\n    √ should contain the expected response header value\r\n    √ should contain the actual response value\r\n\r\n√ OK » 30 honored (0.183s)\r\n\r\n```\r\n\r\nMisc\r\n=====\r\nIt's not the most genious utility or anything, it is meant to be my first git hub project.\r\nI use it to test responses of web-requests to web projects, with [vows](http://vowsjs.org/).\r\n\r\nThe basis of the implementation is taken from from expresso, that did not work well for me\r\non windows, and the implementation there is coupled with the request firing itself - and I \r\ndid not like that.\r\n  so now I can use the same assert description language with any test-framework i like, and \r\n  use whatever request tools I want.\r\n\r\n\r\nLisence\r\n=======\r\n\r\nI don't know what i need to do to make it officual under whatever lisence is up there...\r\nI took from 'the community' so I give back.\r\nTake it, as is, I give no warantee. \r\nDo with it whatever you want on your own responsibility.\r\n","maintainers":[{"name":"osher","email":"osher.filter@gmail.com"}],"time":{"modified":"2012-08-02T13:44:09.656Z","created":"2012-07-27T09:26:04.455Z","0.2.0":"2012-07-27T09:26:07.154Z"},"author":{"name":"Osher E","email":"osher.filter@gmail.com"},"repository":{"type":"git","url":"git://github.com/osher/assert-responseLike.git"},"users":{"fgribreau":true},"_attachments":{"assert-responselike-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8BOmFL1uJtAQeuPYAEAU3g==","length":4513,"stub":true}}}},
{"id":"assertions","key":"assertions","value":{"rev":"33-f4caa2bdb3fc06f571001c9a4fc879f3"},"doc":{"_id":"assertions","_rev":"33-f4caa2bdb3fc06f571001c9a4fc879f3","name":"assertions","description":"loads of useful assert functions in one package","dist-tags":{"latest":"2.3.0"},"versions":{"0.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"0.0.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_id":"assertions@0.0.0","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"78abaaa88ea5972ee65cf5431e83b5299cabfdf8","tarball":"http://registry.npmjs.org/assertions/-/assertions-0.0.0.tgz"}},"1.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"1.0.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/dominic/.npm/assertions/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assertions@1.0.0","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"eb71892ba314e41c64e8011ead17d0de7442cef7","tarball":"http://registry.npmjs.org/assertions/-/assertions-1.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.1.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"1.1.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/dominic/.npm/assertions/1.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assertions@1.1.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"343110d9b820c033be9dd9b2b68e8c8c856da645","tarball":"http://registry.npmjs.org/assertions/-/assertions-1.1.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.2.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"1.2.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/dominic/.npm/assertions/1.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assertions@1.2.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d7c32d6b0169717bd79692f3a785564fc8538f3d","tarball":"http://registry.npmjs.org/assertions/-/assertions-1.2.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.0.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/dominic/.npm/assertions/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assertions@2.0.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"4ac7e85a89cf96121bfaf7fd71c4b307e2ff3754","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.3.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"1.3.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/dominic/.npm/assertions/1.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assertions@1.3.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"4cbcb45e1f0bf478636b0d49a62d7c2db5f6474b","tarball":"http://registry.npmjs.org/assertions/-/assertions-1.3.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.3.1":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"1.3.1","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/dominic/.npm/assertions/1.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assertions@1.3.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.9","_defaultsLoaded":true,"dist":{"shasum":"33115ef3198f697232a87a159d22a3f11e6edfe8","tarball":"http://registry.npmjs.org/assertions/-/assertions-1.3.1.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.1.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.1.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.1.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e434dd60dd6fb46a140a81876951740b67558827","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.1.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.1.1":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.1.1","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.1.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"848ff23d872e800b947313b5f6f4130bf6845318","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.1.1.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.1.2":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.1.2","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.1.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"dab7ceb3b441274f65b0ed9ce6dc3103a31241b1","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.1.2.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.2.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.2.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.2.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e926089a8e25e0dee393df200529cbf415f996ca","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.2.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.2.1":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.2.1","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5","render":"0.1"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.2.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fecfdad950300b2e7b0c09a0c1813e9361e9e758","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.2.1.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.2.2":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.2.2","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5","render":"0.1","traverser":"1"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.2.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"eb88c42ff44aa377f4958b15ce8470f0db911bef","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.2.2.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.2.3":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.2.3","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5","render":"0.1","traverser":"1"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f02ccb042fa7191f46c17119aa4e9d3a77d739f6","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.2.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.2.4":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.2.4","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5","render":"0.1","traverser":"1"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"83349a56774d7246e4fbb6d5e2ff0f52ad791f3f","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.2.4.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"2.3.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"name":"assertions","description":"loads of useful assert functions in one package","version":"2.3.0","homepage":"https://github.com/dominictarr/assertions","repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"main":"./assert.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{"fomatto":"0.5","render":"0.1","traverser":"1"},"bundleDependencies":["fomatto"],"devDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"assertions@2.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"1c91bd261d15c9bb4bab237138866a7596d5ee28","tarball":"http://registry.npmjs.org/assertions/-/assertions-2.3.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-05-17T14:34:00.535Z","created":"2011-06-01T23:08:39.624Z","0.0.0":"2011-06-01T23:08:40.277Z","1.0.0":"2011-08-05T12:54:58.002Z","1.1.0":"2011-09-08T10:20:31.710Z","1.2.0":"2011-09-08T12:19:35.626Z","2.0.0":"2011-10-15T09:23:27.957Z","1.3.0":"2011-10-15T09:47:08.000Z","1.3.1":"2011-10-15T13:04:17.486Z","2.1.0":"2011-10-29T01:17:58.955Z","2.1.1":"2011-11-01T05:20:38.233Z","2.1.2":"2011-11-06T12:13:56.115Z","2.2.0":"2011-11-06T12:51:40.212Z","2.2.1":"2011-11-12T04:01:09.875Z","2.2.2":"2011-11-12T04:25:16.038Z","2.2.3":"2012-03-25T21:41:20.004Z","2.2.4":"2012-05-04T05:30:28.096Z","2.3.0":"2012-05-17T14:34:00.535Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"repository":{"type":"git","url":"git://github.com/dominictarr/assertions.git"},"_attachments":{"assertions-2.3.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-LwWzNguxRoiubcquULYlqQ==","length":32142,"stub":true},"assertions-2.2.4.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-WnZ58vMqrSQxxVvT26zrRA==","length":33458,"stub":true},"assertions-2.2.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-1itk05wCETxSW5Mhq1Xhkw==","length":33631,"stub":true},"assertions-2.2.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-OORHp70NGZQtnkP4gbUA4A==","length":32860,"stub":true},"assertions-2.2.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-FsD4nEjP57m5Wn97mY2qMw==","length":32855,"stub":true},"assertions-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-l+ZvL7blXIHLvMQADd6oDw==","length":32844,"stub":true},"assertions-2.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-j4KRFiKzqApLofLDS2EKgQ==","length":32769,"stub":true},"assertions-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-a1ZnRLxD/4bYMfE2HxFtpw==","length":32393,"stub":true},"assertions-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-g21atXEEV60/6dWKY8zDyg==","length":32492,"stub":true},"assertions-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-cQ9PmMpV2hJXJeWwPbOotg==","length":4271,"stub":true},"assertions-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-O1559txO14KdwIjSPKtESA==","length":4289,"stub":true},"assertions-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-sFDZSclr8A2YyDXIpUiqDw==","length":9972,"stub":true},"assertions-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-wzt3Jd5vkAR+tCXtZdl35A==","length":3987,"stub":true},"assertions-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/gYC/ySDG7Ow6bKW3u1QmA==","length":3901,"stub":true},"assertions-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9x+4gGvpPsGx5ALNDy0w8Q==","length":3784,"stub":true},"assertions-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6JsQFuzppz+8Bbj0uzOaUA==","length":3526,"stub":true}}}},
{"id":"asserts","key":"asserts","value":{"rev":"11-03745f2568fc441e705d987f0d5072f4"},"doc":{"_id":"asserts","_rev":"11-03745f2568fc441e705d987f0d5072f4","name":"asserts","description":"Test grouping and formatting to make working with vanilla node assert marginally easier","dist-tags":{"latest":"0.4.2"},"versions":{"0.3.0":{"name":"asserts","description":"Test grouping and formatting to make working with vanilla node assert marginally easier","version":"0.3.0","license":"MIT","repository":{"type":"git","url":"git://github.com/stephenhandley/asserts.git"},"main":"index.js","keywords":["test","assert"],"directories":{"lib":"."},"bugs":{"url":"http://github.com/stephenhandley/asserts/issues"},"engines":{"node":">=0.4.0"},"author":{"name":"Stephen Handley","email":"stephen.handley@gmail.com","url":"http://person.sh"},"_npmUser":{"name":"stephenhandley","email":"stephen.handley@gmail.com"},"_id":"asserts@0.3.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"9bc812be1cf465b8c9ffc9daebdc7f0bdd5ed3ab","tarball":"http://registry.npmjs.org/asserts/-/asserts-0.3.0.tgz"},"maintainers":[{"name":"stephenhandley","email":"stephen.handley@gmail.com"}]},"0.3.1":{"name":"asserts","description":"Test grouping and formatting to make working with vanilla node assert marginally easier","version":"0.3.1","license":"MIT","repository":{"type":"git","url":"git://github.com/stephenhandley/asserts.git"},"main":"index.js","keywords":["test","assert"],"directories":{"lib":".","examples":"examples"},"bugs":{"url":"http://github.com/stephenhandley/asserts/issues"},"engines":{"node":">=0.4.0"},"author":{"name":"Stephen Handley","email":"stephen.handley@gmail.com","url":"http://person.sh"},"_npmUser":{"name":"stephenhandley","email":"stephen.handley@gmail.com"},"_id":"asserts@0.3.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"fb32a4ed064da174918d2af9f7a3c41f53ddb5ed","tarball":"http://registry.npmjs.org/asserts/-/asserts-0.3.1.tgz"},"maintainers":[{"name":"stephenhandley","email":"stephen.handley@gmail.com"}]},"0.4.0":{"name":"asserts","description":"Test grouping and formatting to make working with vanilla node assert marginally easier","version":"0.4.0","license":"MIT","repository":{"type":"git","url":"git://github.com/stephenhandley/asserts.git"},"main":"index.js","keywords":["test","assert"],"directories":{"lib":".","examples":"examples"},"bugs":{"url":"http://github.com/stephenhandley/asserts/issues"},"engines":{"node":">=0.4.0"},"author":{"name":"Stephen Handley","email":"stephen.handley@gmail.com","url":"http://person.sh"},"_npmUser":{"name":"stephenhandley","email":"stephen.handley@gmail.com"},"_id":"asserts@0.4.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"836c219ccf386ee0e5c16c027c17282cb372a652","tarball":"http://registry.npmjs.org/asserts/-/asserts-0.4.0.tgz"},"maintainers":[{"name":"stephenhandley","email":"stephen.handley@gmail.com"}]},"0.4.1":{"name":"asserts","description":"Test grouping and formatting to make working with vanilla node assert marginally easier","version":"0.4.1","license":"MIT","repository":{"type":"git","url":"git://github.com/stephenhandley/asserts.git"},"main":"index.js","keywords":["test","assert"],"directories":{"lib":".","examples":"examples"},"bugs":{"url":"http://github.com/stephenhandley/asserts/issues"},"engines":{"node":">=0.4.0"},"author":{"name":"Stephen Handley","email":"stephen.handley@gmail.com","url":"http://person.sh"},"_npmUser":{"name":"stephenhandley","email":"stephen.handley@gmail.com"},"_id":"asserts@0.4.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e9a77511072803337a13e6e5ae13d6a04caee4ff","tarball":"http://registry.npmjs.org/asserts/-/asserts-0.4.1.tgz"},"maintainers":[{"name":"stephenhandley","email":"stephen.handley@gmail.com"}]},"0.4.2":{"name":"asserts","description":"Test grouping and formatting to make working with vanilla node assert marginally easier","version":"0.4.2","license":"MIT","repository":{"type":"git","url":"git://github.com/stephenhandley/asserts.git"},"main":"index.js","keywords":["test","assert"],"directories":{"lib":".","examples":"examples"},"bugs":{"url":"http://github.com/stephenhandley/asserts/issues"},"engines":{"node":">=0.4.0"},"author":{"name":"Stephen Handley","email":"stephen.handley@gmail.com","url":"http://person.sh"},"_npmUser":{"name":"stephenhandley","email":"stephen.handley@gmail.com"},"_id":"asserts@0.4.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a1712b6ff34e5ad164d83f49eed0f04d82b7776b","tarball":"http://registry.npmjs.org/asserts/-/asserts-0.4.2.tgz"},"maintainers":[{"name":"stephenhandley","email":"stephen.handley@gmail.com"}]}},"readme":"# Description\n\nTest grouping and formatting to make working with vanilla node assert marginally easier\n\n# Latest Version\n\n0.3.0\n\n# Installation\n```\nnpm install asserts\n```\n\nor in package.json\n\n```json\n{\n  ...\n  \"dependencies\": {\n    \"asserts\": \"~0.3.0\"\n  }\n}\n```\n\n# Usage\n[examples/happy.js](https://github.com/stephenhandley/asserts/blob/master/examples/happy.js) looks like this: \n\n```js\nvar assert = require('assert');\nvar asserts = require('asserts');\n\nasserts({\n  \"foo\": function() {\n    assert.equal(\"something\", \"something\", \"optional message\");\n    assert.equal(2, 2);\n  },\n  \"barf\" : {\n    \"ing\": function () {\n      assert.equal(1, 1, \"okay\");\n    },\n    \"ed\": function() {\n      assert.equal(2, 2, \"yep\");\n    }\n  }\n});\n```\nand when run looks like this:\n\n```sh\n\n$ node happy.js\n\n:) foo\n\n:) barf\n    ing\n    ed\n\n```\n\n[examples/sad.js](https://github.com/stephenhandley/asserts/blob/master/examples/sad.js) looks like this: \n\n```js\nvar assert = require('assert');\nvar asserts = require('asserts');\n\nasserts({\n  \"foo\": function() {\n    assert.equal(\"something\", \"something\", \"optional message\");\n    assert.equal(2, 2);\n  },\n  \"barf\" : {\n    \"ing\": function () {\n      assert.equal(1, 1, \"okay\");\n    },\n    \"ed\": function() {\n      assert.equal(2, 3, \"yep\");\n    },\n    \"o\": {\n      \"rama\": function() {\n        assert.equal(2, 10, \"MATH\");\n      },\n      \"hnooooo\": function() {\n        assert.equal(1, 1);\n      }\n    }\n  },\n  \"meh\": function() {\n    assert.equal(1, 2, \"oh nooooo\");\n  }\n});\n```\n\nand when run looks like this:\n\n```sh\n$ node sad.js \n\n:) foo\n\n:( barf\n    ing\n    ed\n     yep: Expected 3 but got 2\n    o\n     rama\n      MATH: Expected 10 but got 2\n     hnooooo\n\n:( meh\n    oh nooooo: Expected 2 but got 1\n    \n```\n\nbut with green for :) and red for :( that aren't showing up here but do in the console (i, yam lazy) ","maintainers":[{"name":"stephenhandley","email":"stephen.handley@gmail.com"}],"time":{"modified":"2012-06-05T21:52:01.895Z","created":"2012-05-06T23:50:32.780Z","0.3.0":"2012-05-06T23:50:34.138Z","0.3.1":"2012-05-07T01:55:16.893Z","0.4.0":"2012-05-07T02:37:57.509Z","0.4.1":"2012-05-07T03:38:36.676Z","0.4.2":"2012-06-05T21:52:01.895Z"},"author":{"name":"Stephen Handley","email":"stephen.handley@gmail.com","url":"http://person.sh"},"repository":{"type":"git","url":"git://github.com/stephenhandley/asserts.git"},"_attachments":{"asserts-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-1nZq34wAS66S3noh7C+3cQ==","length":2754,"stub":true},"asserts-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NCi+TKN3LdfBQS7eArZdsQ==","length":2681,"stub":true},"asserts-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-L/p4xMH8NwjGSe+ELFFCTw==","length":2528,"stub":true},"asserts-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nN/AYTZb0kUEYrj+2i0GFQ==","length":2397,"stub":true},"asserts-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dnjtRfjIYbQJkYLktlsCyQ==","length":2363,"stub":true}}}},
{"id":"assertvanish","key":"assertvanish","value":{"rev":"13-3b0b555ff77c1bfc2fe2642d50879648"},"doc":{"_id":"assertvanish","_rev":"13-3b0b555ff77c1bfc2fe2642d50879648","name":"assertvanish","description":"assert that an object will vanish","dist-tags":{"latest":"0.0.3-1"},"versions":{"0.0.1-1":{"name":"assertvanish","version":"0.0.1-1","description":"assert that an object will vanish","keywords":["assert","debug","vanish"],"homepage":"http://github.com/thejh/node-assertvanish","author":{"name":"Jann Horn"},"main":"index.js","repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"dependencies":{"overload":"*"},"files":["package.json","index.js"],"_id":"assertvanish@0.0.1-1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"a88329c4d8cc24b8f8ae8140bd4e2389cb668135","tarball":"http://registry.npmjs.org/assertvanish/-/assertvanish-0.0.1-1.tgz"},"scripts":{}},"0.0.1-2":{"name":"assertvanish","version":"0.0.1-2","description":"assert that an object will vanish","keywords":["assert","debug","vanish"],"homepage":"http://github.com/thejh/node-assertvanish","author":{"name":"Jann Horn"},"main":"index.js","repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"dependencies":{"overload":"*"},"files":["package.json","index.js"],"_id":"assertvanish@0.0.1-2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"3442c431f42d30ae5a1db4976e2205e6d09552cc","tarball":"http://registry.npmjs.org/assertvanish/-/assertvanish-0.0.1-2.tgz"},"scripts":{}},"0.0.1-3":{"name":"assertvanish","version":"0.0.1-3","description":"assert that an object will vanish","keywords":["assert","debug","vanish"],"homepage":"http://github.com/thejh/node-assertvanish","author":{"name":"Jann Horn"},"main":"index.js","repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"dependencies":{"overload":"*"},"files":["package.json","index.js"],"_id":"assertvanish@0.0.1-3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"bf9eff51a82763fc99bb41834f016e9a4be4f4d1","tarball":"http://registry.npmjs.org/assertvanish/-/assertvanish-0.0.1-3.tgz"},"scripts":{}},"0.0.2-1":{"name":"assertvanish","version":"0.0.2-1","description":"assert that an object will vanish","keywords":["assert","debug","vanish"],"homepage":"http://github.com/thejh/node-assertvanish","author":{"name":"Jann Horn"},"main":"index.js","repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"dependencies":{"overload":"*"},"files":["package.json","index.js"],"_id":"assertvanish@0.0.2-1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"c35af0d08243f6a8e437347b6630d25a6e2636a3","tarball":"http://registry.npmjs.org/assertvanish/-/assertvanish-0.0.2-1.tgz"},"scripts":{}},"0.0.2-2":{"name":"assertvanish","version":"0.0.2-2","description":"assert that an object will vanish","keywords":["assert","debug","vanish"],"homepage":"http://github.com/thejh/node-assertvanish","author":{"name":"Jann Horn"},"main":"index.js","repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"dependencies":{"overload":"*"},"_id":"assertvanish@0.0.2-2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"37fd9b54ab7e439a42e174c20d89875f3c8168cb","tarball":"http://registry.npmjs.org/assertvanish/-/assertvanish-0.0.2-2.tgz"},"scripts":{}},"0.0.3-1":{"name":"assertvanish","version":"0.0.3-1","description":"assert that an object will vanish","keywords":["assert","debug","vanish"],"homepage":"http://github.com/thejh/node-assertvanish","author":{"name":"Jann Horn"},"main":"index.js","repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"dependencies":{"overload":"*"},"_id":"assertvanish@0.0.3-1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"84ded7d929fa3282c28902f31987312e36a2bceb","tarball":"http://registry.npmjs.org/assertvanish/-/assertvanish-0.0.3-1.tgz"},"scripts":{}}},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"time":{"modified":"2011-07-22T18:21:00.511Z","created":"2011-06-19T16:06:47.550Z","0.0.1-1":"2011-06-19T16:06:48.233Z","0.0.1-2":"2011-06-19T16:15:27.664Z","0.0.1-3":"2011-06-19T16:39:17.394Z","0.0.2-1":"2011-07-22T12:28:12.302Z","0.0.2-2":"2011-07-22T12:29:40.490Z","0.0.3-1":"2011-07-22T18:21:00.511Z"},"author":{"name":"Jann Horn"},"repository":{"type":"git","url":"git://github.com/thejh/node-assertvanish.git"},"_attachments":{"assertvanish-0.0.3-1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-yctd5rxg+2GULn11AW6saA==","length":124333,"stub":true},"assertvanish-0.0.2-2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-X/5Rh37n3PQDIvArXvKayQ==","length":813551,"stub":true},"assertvanish-0.0.2-1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qAJLQVv203UCHXUn4h+M/Q==","length":812938,"stub":true},"assertvanish-0.0.1-3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kEjRN2oOYimiFz4DKWghUQ==","length":3682,"stub":true},"assertvanish-0.0.1-2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cgz1cWora4Q17QAhrky0tg==","length":3366,"stub":true},"assertvanish-0.0.1-1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TPY7uU27yhgnp2YOsziY8g==","length":2339,"stub":true}}}},
{"id":"asset","key":"asset","value":{"rev":"40-0ec1c4ea659fb74930da39c62aac4144"},"doc":{"_id":"asset","_rev":"40-0ec1c4ea659fb74930da39c62aac4144","name":"asset","description":"Asset manager","dist-tags":{"latest":"0.4.11"},"versions":{"0.0.1":{"name":"asset","version":"0.0.1","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.0.1","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.4","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2211cc04a1f36ae0dec6dbdf165c00b0224f9c3e","tarball":"http://registry.npmjs.org/asset/-/asset-0.0.1.tgz"}},"0.0.2":{"name":"asset","version":"0.0.2","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.0.2","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.4","directories":{"bin":"./bin","lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8b53292e3740e90dfea83f6a848f221319c97133","tarball":"http://registry.npmjs.org/asset/-/asset-0.0.2.tgz"}},"0.1.0":{"name":"asset","version":"0.1.0","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.1.0","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.4","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"05d533baebe118f4751d24c350458241100ec9cb","tarball":"http://registry.npmjs.org/asset/-/asset-0.1.0.tgz"}},"0.2.0":{"name":"asset","version":"0.2.0","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.2.0","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.5","directories":{"bin":"./bin","lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1a5886990ada0ce476443ea0f5c3c696e145b862","tarball":"http://registry.npmjs.org/asset/-/asset-0.2.0.tgz"}},"0.3.0":{"name":"asset","version":"0.3.0","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.3.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9d4b765eb605ebcf6806a40f696686c532f0cbcf","tarball":"http://registry.npmjs.org/asset/-/asset-0.3.0.tgz"}},"0.3.1":{"name":"asset","version":"0.3.1","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.3.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"bin":"./bin","lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"30a481070bf62c3697a5fb2230ef8d4bfe2a5af2","tarball":"http://registry.npmjs.org/asset/-/asset-0.3.1.tgz"}},"0.3.2":{"name":"asset","version":"0.3.2","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_id":"asset@0.3.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6","directories":{"bin":"./bin","lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f4fada08554b6aea092ecf25a243f628f19fbd97","tarball":"http://registry.npmjs.org/asset/-/asset-0.3.2.tgz"}},"0.4.0":{"name":"asset","version":"0.4.0","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"asset@0.4.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"6fe2295689ed2c6028b98bc96df470f2583a9dfc","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.0.tgz"},"scripts":{}},"0.4.1":{"name":"asset","version":"0.4.1","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"asset@0.4.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"83a97987744cc4802f9fa5bd2042d6960ee432f2","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.1.tgz"},"scripts":{}},"0.4.2":{"name":"asset","version":"0.4.2","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"867b8451de6070d972f8990901b974a43131bf1e","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.2.tgz"},"scripts":{}},"0.4.3":{"name":"asset","version":"0.4.3","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a83a959fba740d4dae8977a9bda8db7f0c8747a1","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.3.tgz"},"scripts":{}},"0.4.4":{"name":"asset","version":"0.4.4","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"cb2275d941aca79af15b95f76651939c1168c647","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.4.tgz"},"scripts":{}},"0.4.5":{"name":"asset","version":"0.4.5","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c3e989d4b8d221e487cdd5d2b6cde81405bae8bd","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.5.tgz"},"scripts":{}},"0.4.6":{"name":"asset","version":"0.4.6","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8643aed184c76927695f03d2fef11e1cc009e73c","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.6.tgz"},"scripts":{},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.4.7":{"name":"asset","version":"0.4.7","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c8d10ace9ef576e18f9da6c514688ddf26d97acc","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.7.tgz"},"scripts":{},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.4.8":{"name":"asset","version":"0.4.8","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5","mkdirp":"0.0.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/tj/.npm/asset/0.4.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asset@0.4.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9bffa7254a5665f1e2ee8a442adc8fe9d02c0f29","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.8.tgz"},"scripts":{},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.4.9":{"name":"asset","version":"0.4.9","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5","mkdirp":"0.0.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"asset@0.4.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3967f22d3e20f752b11d0af689147f664eeb72fe","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.9.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.4.10":{"name":"asset","version":"0.4.10","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5","mkdirp":"0.0.5"},"bin":{"asset":"./bin/asset"},"main":"index","engines":{"node":"0.4.x"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"asset@0.4.10","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7d76c5dd5bb8d0c8bfaad5547f40cf477eb9b0ae","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.10.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.4.11":{"name":"asset","version":"0.4.11","description":"Asset manager","keywords":["assets","javascript","css","package manager"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"request":"1.9.5","mkdirp":"0.3.x"},"bin":{"asset":"./bin/asset"},"main":"index","_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"asset@0.4.11","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"027ad86d9ee56feabd37f361b697c3f7adb7e5c3","tarball":"http://registry.npmjs.org/asset/-/asset-0.4.11.tgz"},"readme":"\n# Asset\n\n  Asset manager for lazy people (think homebrew for assets).\n\n## Installation\n\n    $ npm install -g asset\n\n## Usage\n\n     Usage: asset [command] [options]\n\n     Commands:\n\n       install <name ...>   installs the given asset <name ...>\n       search  [query]      search available assets with optional [query]\n       info  <name ...>     display verbose information for the given asset <name ...>\n       none                 install dependencies from ./assets.json\n\n     Options:\n\n       -c, --compress    compress assets\n       -o, --out <dir>   output directory defaulting to ./public\n       -V, --version     output program version\n       -h, --help        display help information\n\n\n\n## Examples\n\n### Installing Several Assets\n\n By default asset installs to `./public`.\n\n      $ asset raphael jquery\n\n       install : raphael@1.4.7\n       install : jquery@1.5.2\n      download : jquery@1.5.2\n      complete : jquery@1.5.2 public/jquery.js\n      download : raphael@1.4.7\n      complete : raphael@1.4.7 public/raphael.js\n\n Asset names accept an optional version and modifiers, taking the form:\n \n    <name> ['@' version] [':' 'compress']\n\n To install all assets (that support compression) as compressed, we can use\n the `--compress` flag:\n \n      $ asset jquery raphael --compress\n\n  However this can be done at the asset-level as well using the `:compress` modifier:\n  \n      $ asset jquery@1.4.3:compress raphael\n\n            install : jquery@1.4.3\n            install : raphael@1.4.7\n           download : jquery@1.4.3\n           complete : jquery@1.4.3 public/jquery.min.js\n           download : raphael@1.4.7\n           complete : raphael@1.4.7 public/raphael.js\n\n### Install Destination\n\n  Tweak the output directory with `-o, --out <dir>`.\n\n      $ asset raphael g.raphael g.pie -o public/javascripts\n\n       install : raphael@1.4.7\n       install : g.raphael@0.4.1\n       install : g.pie@0.4.1\n      download : raphael@1.4.7\n      complete : raphael@1.4.7 public/javascripts/raphael.js\n      download : g.raphael@0.4.1\n      complete : g.raphael@0.4.1 public/javascripts/g.raphael.js\n      download : g.pie@0.4.1\n      complete : g.pie@0.4.1 public/javascripts/g.pie.js\n\n  Alternatively passing a directory name containing \"/\" will work as well, since `asset` knows this is not an asset, and becomes equivalent to `--out <dir>`:\n    \n       $ asset raphael jquery public/javascripts\n\n### Dependency Resolution\n\n  Asset currently supports extremely basic dependency mapping, for example below is the output of installing `g.pie`, which depends on `g.raphael`, which in turn depends on `raphael` itself.\n\n    $ asset g.pie\n\n          install : g.pie@0.4.1\n       dependency : g.raphael@0.4.1\n          install : g.raphael@0.4.1\n       dependency : raphael@1.4.7\n          install : raphael@1.4.7\n         download : raphael@1.4.7\n         complete : raphael@1.4.7 public/raphael.js\n         download : g.raphael@0.4.1\n         complete : g.raphael@0.4.1 public/g.raphael.js\n         download : g.pie@0.4.1\n         complete : g.pie@0.4.1 public/g.pie.js\n\n### Asset Information\n\n  Inspect verbose asset information:\n\n    $ asset info jquery g.raphael\n\n             name : jquery\n      description : jquery core framework\n              url : http://code.jquery.com/jquery-{version}.min.js\n          version : 1.5.2\n         filename : jquery.js\n\n             name : g.raphael\n      description : charting for raphael\n              url : https://github.com/DmitryBaranovskiy/g.raphael/raw/v{version}/g.raphael-min.js\n          version : 0.4.1\n         filename : g.raphael.js\n     dependencies : raphael\n\n\n### Installation Destination\n\n  To install a specific version, we can use the `@` character:\n  \n      $ asset jquery@1.5.0\n\n### Search Repository\n\n We can search the repository with an optional query, listing\n available assets and their default versions:\n \n     $ asset raphael\n\n      install : raphael@1.4.7\n     download : raphael@1.4.7\n     complete : raphael@1.4.7 public/raphael.js\n\n### assets.json\n\n By adding `./assets.json` you can store application dependencies, and install them quickly and easily with a single command `asset`. For example this file may contain one or more deps:\n \n     {\n         \"g.raphael\": \"0.4.1\"\n       , \"jquery\": \"1.5.2\"\n       , \"modernizr\": \"1.7\"\n     }\n \n\n Installed with the command:\n \n     $ asset\n     \n        install : g.raphael@0.4.1\n     dependency : raphael@1.4.7\n        install : raphael@1.4.7\n        install : jquery@1.5.2\n        install : modernizr@1.7\n       download : jquery@1.5.2\n       complete : jquery@1.5.2 public/jquery.js\n       download : raphael@1.4.7\n       complete : raphael@1.4.7 public/raphael.js\n       download : g.raphael@0.4.1\n       complete : g.raphael@0.4.1 public/g.raphael.js\n       download : modernizr@1.7\n       complete : modernizr@1.7 public/modernizr.js\n\n### Configuration\n\n By default options must be passed via the CLI, however `asset` will also check the `./.asset` and `~/.asset` JSON configuration files, so for example a project may set `{ \"out\": \"public/javascripts\" }` if we are mainly working with javascript, however the CLI options will always take precedence.\n\n### The Repository\n\n By default the repo bundled with `asset` is used, however the `~/.assets` configuration file is checked first. Perhaps down the road if/when asset becomes more flexible a repo will be hosted, for now simply fork the project edit `./assets.json`, and send a pull request.\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-05T21:39:53.316Z","created":"2011-04-04T02:46:39.925Z","0.0.1":"2011-04-04T02:46:40.562Z","0.0.2":"2011-04-04T23:22:05.541Z","0.1.0":"2011-04-05T11:48:33.076Z","0.2.0":"2011-04-10T01:56:05.159Z","0.3.0":"2011-04-15T00:15:48.311Z","0.3.1":"2011-04-21T01:28:14.406Z","0.3.2":"2011-04-27T15:28:07.835Z","0.4.0":"2011-05-31T01:06:15.987Z","0.4.1":"2011-06-04T18:22:16.800Z","0.4.2":"2011-07-03T03:52:37.689Z","0.4.3":"2011-07-08T23:12:16.672Z","0.4.4":"2011-07-15T15:13:00.136Z","0.4.5":"2011-07-21T01:05:56.619Z","0.4.6":"2011-08-10T00:12:34.015Z","0.4.7":"2011-08-20T20:06:21.327Z","0.4.8":"2011-09-13T10:06:01.283Z","0.4.9":"2011-11-16T17:06:16.103Z","0.4.10":"2011-12-10T18:18:54.748Z","0.4.11":"2012-06-13T19:28:15.437Z"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"users":{"sjonnet19":true},"_attachments":{"asset-0.4.11.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-15LYORLjO3cGLJHcMglNLA==","length":9349,"stub":true},"asset-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-k1WctgXFnyJUmzHId2M2cw==","length":983040,"stub":true},"asset-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-z9yHChuTxbBXkRwUy60Wdg==","length":983040,"stub":true},"asset-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Rq0Dw1mJ6A7JlXvtHT9MHw==","length":981220,"stub":true},"asset-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-moUB9WfWJlo55hOb1z+imQ==","length":882320,"stub":true},"asset-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-mC5SnKE9+TUXA/bcxnXnLw==","length":864020,"stub":true},"asset-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-FyAQ6mq+o2tphR0oe/Wsrg==","length":857194,"stub":true},"asset-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-2KkOKfg4miHX2Qv+uDKb9A==","length":857205,"stub":true},"asset-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-OqD6jYfhVSOjhuXQq7yzAQ==","length":857245,"stub":true},"asset-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-w18bX9emM0DWh6Z2G1d3Pg==","length":857164,"stub":true},"asset-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-6FN30xDm/0uLfHrujfLG7g==","length":8640,"stub":true},"asset-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-MPXpKAgvbTIulin21kE+0Q==","length":8603,"stub":true},"asset-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-KJWu45M9qLq9GEt6JtsFNQ==","length":573854,"stub":true},"asset-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3CTtSED/n72jKyIjN3limQ==","length":573558,"stub":true},"asset-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-I9Etiri2YVml2iN3HkkLWw==","length":560202,"stub":true},"asset-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-UnFEphFZNOpqZLZA/o8VJw==","length":532202,"stub":true},"asset-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RwcCN3TuNKa4GeoNMFrlVg==","length":82842,"stub":true},"asset-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dziiacJw5R6MU88p6Rua1A==","length":175919,"stub":true},"asset-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-puR7Ubf30WuooFKqiwv77w==","length":175663,"stub":true}}}},
{"id":"asset-bundler","key":"asset-bundler","value":{"rev":"9-9cab7797ff804d692ea1cce30495427d"},"doc":{"_id":"asset-bundler","_rev":"9-9cab7797ff804d692ea1cce30495427d","name":"asset-bundler","description":"pack and create asset bundles for your static js and css files","dist-tags":{"latest":"0.6.5"},"versions":{"0.6.2":{"author":{"name":"Sergio Kuba","email":"sk@skdev.me","url":"skdev.me"},"name":"asset-bundler","description":"pack and create asset bundles for your static js and css files","version":"0.6.2","homepage":"https://github.com/sergiok/assets-bundler","repository":{"type":"git","url":"git://github.com/sergiok/assets-bundler.git"},"keywords":["build","assets","css","javascript","minify","builder","compress","package"],"main":"./index.js","dependencies":{"js-yaml":">= 0.3.7"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.4"},"license":"MIT","_npmUser":{"name":"sergiokuba","email":"sk@skdev.me"},"_id":"asset-bundler@0.6.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"bf06e034e29cfe657b542938180ef71444dd527e","tarball":"http://registry.npmjs.org/asset-bundler/-/asset-bundler-0.6.2.tgz"},"maintainers":[{"name":"sergiokuba","email":"sk@skdev.me"}]},"0.6.3":{"author":{"name":"Sergio Kuba","email":"sk@skdev.me","url":"skdev.me"},"name":"asset-bundler","description":"pack and create asset bundles for your static js and css files","version":"0.6.3","homepage":"https://github.com/sergiok/asset-bundler","repository":{"type":"git","url":"git://github.com/sergiok/asset-bundler.git"},"keywords":["build","assets","css","javascript","minify","builder","compress","package"],"main":"./index.js","dependencies":{"js-yaml":">= 0.3.7"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.4"},"license":"MIT","_npmUser":{"name":"sergiokuba","email":"sk@skdev.me"},"_id":"asset-bundler@0.6.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"075eab34f5cec64be1bce3bf9287402a2242d2ba","tarball":"http://registry.npmjs.org/asset-bundler/-/asset-bundler-0.6.3.tgz"},"maintainers":[{"name":"sergiokuba","email":"sk@skdev.me"}]},"0.6.4":{"author":{"name":"Sergio Kuba","email":"sk@skdev.me","url":"skdev.me"},"name":"asset-bundler","description":"pack and create asset bundles for your static js and css files","version":"0.6.4","homepage":"https://github.com/sergiok/asset-bundler","repository":{"type":"git","url":"git://github.com/sergiok/asset-bundler.git"},"keywords":["build","assets","css","javascript","minify","builder","compress","package"],"main":"./index.js","dependencies":{"js-yaml":">= 0.3.7"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.4"},"license":"MIT","readme":"# asset-builder\n  pack and create asset bundles for your static js and css files\n\n## Quick Start\n  Install the module\n  \n    $ npm install asset-bundle\n    \n  you can specify the assets config in a assets.yml file. Take a look at the example app for a sample file.\n  If you are not comfortable with YAML, you can pass a JSON object to the configure method\n\n## \tDocumentation\nPlease check the [wiki](https://github.com/sergiok/asset-bundler/wiki), I will be updating it with more information soon.\n\n## TODO\n  * Finish the wiki\n  * Documentation\n  * more examples\n  * see TODO file\n\n## Author\n  Sergio Kuba <sk@skdev.me>\n\n## License\n  MIT","_id":"asset-bundler@0.6.4","dist":{"shasum":"4e3541a43776926644a55d24a47bc23610491ea6","tarball":"http://registry.npmjs.org/asset-bundler/-/asset-bundler-0.6.4.tgz"},"maintainers":[{"name":"sergiokuba","email":"sk@skdev.me"}]},"0.6.5":{"author":{"name":"Sergio Kuba","email":"sk@skdev.me","url":"skdev.me"},"name":"asset-bundler","description":"pack and create asset bundles for your static js and css files","version":"0.6.5","homepage":"https://github.com/sergiok/asset-bundler","repository":{"type":"git","url":"git://github.com/sergiok/asset-bundler.git"},"keywords":["build","assets","css","javascript","minify","builder","compress","package"],"main":"./index.js","dependencies":{"js-yaml":">= 0.3.7"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">= 0.4"},"license":"MIT","readme":"# asset-builder\n  pack and create asset bundles for your static js and css files\n\n## Quick Start\n  Install the module\n  \n    $ npm install asset-bundle\n    \n  you can specify the assets config in a assets.yml file. Take a look at the example app for a sample file.\n  If you are not comfortable with YAML, you can pass a JSON object to the configure method\n\n## \tDocumentation\nPlease check the [wiki](https://github.com/sergiok/asset-bundler/wiki), I will be updating it with more information soon.\n\n## TODO\n  * Finish the wiki\n  * Documentation\n  * more examples\n  * see TODO file\n\n## Author\n  Sergio Kuba <sk@skdev.me>\n\n## License\n  MIT","_id":"asset-bundler@0.6.5","dist":{"shasum":"8c29129dc1c51729d3c4097228cd4cf3f0093a2d","tarball":"http://registry.npmjs.org/asset-bundler/-/asset-bundler-0.6.5.tgz"},"maintainers":[{"name":"sergiokuba","email":"sk@skdev.me"}]}},"readme":"assets-bundler\n==============\n\npack and create assets bundles for your static js and css files","maintainers":[{"name":"sergiokuba","email":"sk@skdev.me"}],"time":{"modified":"2012-07-13T03:14:48.667Z","created":"2012-06-12T21:24:09.255Z","0.6.2":"2012-06-12T21:24:11.473Z","0.6.3":"2012-06-12T22:38:18.304Z","0.6.4":"2012-06-27T05:58:32.815Z","0.6.5":"2012-07-13T03:14:48.667Z"},"author":{"name":"Sergio Kuba","email":"sk@skdev.me","url":"skdev.me"},"repository":{"type":"git","url":"git://github.com/sergiok/asset-bundler.git"},"_attachments":{"asset-bundler-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-h4Zif/sT70S3JEUjggsx3Q==","length":850991,"stub":true},"asset-bundler-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8mB3BKBtKkaKTyL4TfO0lQ==","length":850434,"stub":true},"asset-bundler-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-fwcDKEFI/YONHZF3ISltSw==","length":852054,"stub":true},"asset-bundler-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-X9fN2O3s86EtT1wWu8/OMA==","length":851887,"stub":true}}}},
{"id":"asset-manager","key":"asset-manager","value":{"rev":"51-74917baadb2e99c38b4c5966c573af90"},"doc":{"_id":"asset-manager","_rev":"51-74917baadb2e99c38b4c5966c573af90","name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","dist-tags":{"latest":"0.2.10"},"versions":{"0.1.0":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.1.0","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":">= 0.1.12","connect-assets":"https://github.com/lynns/connect-assets/tarball/master","coffee-script":">=1.1.3","glob":"3.0.1"},"main":"lib/asset-manager.js","engines":{"node":"= 0.4.7"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e1106ed4b695da0aa5b83a79125b3c791ffcf53f","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.1.0.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}],"directories":{}},"0.1.1":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.1.1","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":">= 0.1.12","connect-assets":"https://github.com/lynns/connect-assets/tarball/master","coffee-script":">=1.1.3","glob":">=3.0.1","rimraf":">=1.0.9"},"devDependencies":{"vows":"0.6.0"},"main":"lib/asset-manager.js","engines":{"node":">= 0.4.7"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.1.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e68a5f7411587e47e6c933f43583ac6209361a00","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.1.1.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}],"directories":{}},"0.1.2":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.1.2","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":">= 0.1.12","connect-assets":"https://github.com/lynns/connect-assets/tarball/master","coffee-script":">=1.1.3","glob":">=3.0.1","rimraf":">=1.0.9"},"devDependencies":{"vows":"0.6.0"},"main":"lib/asset-manager.js","engines":{"node":">= 0.4.7"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0cce0494648943f6097680f1fb46903092481b70","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.1.2.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}],"directories":{}},"0.2.0":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.0","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":">= 0.1.12","glob":"3.0.1","rimraf":">=1.0.9","uglify-js":"1.2.x"},"devDependencies":{"buster":"0.4.5"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4dd5a6604f5785703b2253cc962294124a1d0363","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.0.tgz"},"readme":"","maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}],"directories":{}},"0.2.1":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.1","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":">= 0.1.12","glob":"3.0.1","rimraf":">=1.0.9","uglify-js":"1.2.x"},"devDependencies":{"buster":"0.4.5"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4256b30255a3b9bb7fd743e1ef0e8c71dfd5cc7b","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.1.tgz"},"readme":"","maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}],"directories":{}},"0.2.2":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.2","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":">= 0.1.12","glob":"3.0.1","rimraf":">=1.0.9","uglify-js":"1.2.x"},"devDependencies":{"buster":"0.4.5"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"3dc478cd015879057d196dec1b5abcd7d54e8905","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.2.tgz"},"readme":"","maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.3":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.3","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"99ab2a0d7f880b5a2b7fe0488311b7d10aec675f","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.3.tgz"},"readme":"","maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.4":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.4","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"1d6d1ab81c654c544f95c847feb688ffe91d4070","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.4.tgz"},"readme":"","maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.5":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.5","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"_npmUser":{"name":"lynns","email":"stephen.g.lynn@gmail.com"},"_id":"asset-manager@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"cda83c0535af8afafc9f0f8bd65e936c624ee941","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.5.tgz"},"readme":"","maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.7":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.7","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x","exists-patch":"0.0.0"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"readme":"","_id":"asset-manager@0.2.7","dist":{"shasum":"0795a69922104c7cf801c1a8fbc1696d460df12f","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.7.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.8":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.8","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x","exists-patch":"0.0.0"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"readme":"","_id":"asset-manager@0.2.8","dist":{"shasum":"bebb9708f6bda57e6964ea2316a4c19764cc502c","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.8.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.9":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.9","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x","exists-patch":"0.0.0"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"readme":"","_id":"asset-manager@0.2.9","dist":{"shasum":"c344e3e84fea1ed4e8950cd365f6e2fdb44a0623","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.9.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]},"0.2.10":{"name":"asset-manager","description":"Asset manager built on top of connect-asset for managing multiple asset folders.","version":"0.2.10","author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"dependencies":{"async":"0.1.x","glob":"3.0.1","rimraf":"1.x","uglify-js":"1.2.x","exists-patch":"0.0.0"},"devDependencies":{"buster":"0.6.x"},"main":"lib/asset-manager.js","engines":{"node":">= 0.6.3"},"contributors":[{"name":"Tim Shadel","email":"tim.shadel@familysearch.org"},{"name":"Stephen Lynn","email":"s.lynn@familysearch.org"}],"readme":"","_id":"asset-manager@0.2.10","dist":{"shasum":"1cb207704a0541b9b9d3f4b69328addbdc8fed7f","tarball":"http://registry.npmjs.org/asset-manager/-/asset-manager-0.2.10.tgz"},"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}]}},"readme":null,"maintainers":[{"name":"lynns","email":"stephen.g.lynn@gmail.com"}],"time":{"modified":"2012-08-09T20:29:57.100Z","created":"2012-01-21T05:31:36.726Z","0.1.0":"2012-01-21T05:31:37.702Z","0.1.1":"2012-01-25T17:57:40.875Z","0.1.2":"2012-01-30T16:18:59.208Z","0.2.0":"2012-03-08T21:43:54.845Z","0.2.1":"2012-03-26T17:57:37.017Z","0.2.2":"2012-03-26T18:02:40.833Z","0.2.3":"2012-06-28T19:32:32.549Z","0.2.4":"2012-06-28T20:56:23.615Z","0.2.5":"2012-07-02T12:16:55.891Z","0.2.7":"2012-08-02T22:58:53.944Z","0.2.8":"2012-08-03T19:34:22.235Z","0.2.9":"2012-08-06T17:58:46.060Z","0.2.10":"2012-08-09T20:29:57.100Z"},"author":{"name":"FamilySearch Web Developers"},"repository":{"type":"git","url":"git://github.com/fs-webdev/asset-manager.git"},"_attachments":{"asset-manager-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-2l+WR5MBrt7lyw/o/H5O0A==","length":14088,"stub":true},"asset-manager-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-Z+FRUDqKbGzHMnTmXsEp4A==","length":14010,"stub":true},"asset-manager-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-kGCrYhCbuMfpQxHTRLewYA==","length":13680,"stub":true},"asset-manager-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-jaOfeCZNpslqQueVw7HvdQ==","length":13448,"stub":true},"asset-manager-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-SV6O7BqjW38nZga+Y0VVSw==","length":13335,"stub":true},"asset-manager-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-SaCPKmno3J9+nWmqGf7How==","length":13161,"stub":true},"asset-manager-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-nj09kE7wOVLs/PSLIErvmw==","length":13117,"stub":true},"asset-manager-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-2YW021azKL7wCRXo4xyR6w==","length":13686,"stub":true},"asset-manager-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-ozc/U4S9HTWJST6hvdwhnw==","length":13715,"stub":true},"asset-manager-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-RpLgQzTKocLCKdCyj1DDkQ==","length":13095,"stub":true},"asset-manager-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-KZ/wMGHBrqA2lOBPqtmM5Q==","length":10240,"stub":true},"asset-manager-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-hdXX69bxhQjXUG5GyPDgqg==","length":10240,"stub":true},"asset-manager-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yC53Pwag4KEpX3fojS2zPA==","length":10240,"stub":true}}}},
{"id":"asset-rack","key":"asset-rack","value":{"rev":"18-60a1061a269b00b2dd05a8162cb8a8b4"},"doc":{"_id":"asset-rack","_rev":"18-60a1061a269b00b2dd05a8162cb8a8b4","name":"asset-rack","description":"Asset management framework for nodejs","dist-tags":{"latest":"1.1.4"},"versions":{"1.0.1":{"name":"asset-rack","version":"1.0.1","description":"Asset managemnt framework for nodejs","author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack.git"},"dependencies":{"coffee-script":"1.3.1","browserify":"1.13.5","uglify-js":"1.3.0","async":"0.1.22","knox":"0.0.9","less":"1.3.0","mime":"1.2.6"},"main":"switch.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"brad@techpines.com","email":"brad@techpines.com"},"_id":"asset-rack@1.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b4d7722fed41af356b8565b7406630310aa868ac","tarball":"http://registry.npmjs.org/asset-rack/-/asset-rack-1.0.1.tgz"},"maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}],"directories":{}},"1.1.0":{"name":"asset-rack","version":"1.1.0","description":"Asset management framework for nodejs","author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack.git"},"dependencies":{"coffee-script":"1.3.1","browserify":"1.13.5","uglify-js":"1.3.0","async":"0.1.22","knox":"0.0.9","less":"1.3.0","mime":"1.2.6"},"main":"switch.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"brad@techpines.com","email":"brad@techpines.com"},"_id":"asset-rack@1.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"15ebeae22d57b60082fafbc8952aa27dcdfc5cdc","tarball":"http://registry.npmjs.org/asset-rack/-/asset-rack-1.1.0.tgz"},"maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}]},"1.1.1":{"name":"asset-rack","version":"1.1.1","description":"Asset management framework for nodejs","author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack.git"},"dependencies":{"coffee-script":"1.3.1","browserify":"1.13.5","uglify-js":"1.3.0","async":"0.1.22","knox":"0.0.9","less":"1.3.0","mime":"1.2.6"},"main":"switch.js","engines":{"node":">= 0.5.0"},"_npmUser":{"name":"brad@techpines.com","email":"brad@techpines.com"},"_id":"asset-rack@1.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4a3836abeeeace1e16379ca9f0474f791c216c92","tarball":"http://registry.npmjs.org/asset-rack/-/asset-rack-1.1.1.tgz"},"maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}]},"1.1.2":{"name":"asset-rack","version":"1.1.2","description":"Asset management framework for nodejs","author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack"},"dependencies":{"coffee-script":"1.3.1","browserify":"1.13.5","uglify-js":"1.3.0","async":"0.1.22","knox":"0.0.9","less":"1.3.0","mime":"1.2.6"},"main":"switch.js","engines":{"node":">= 0.5.0"},"readme":"\n![asset-rack!](http://www.techpines.com/static/logo/asset-rack.png)\n\nA node-style asset management framework. Designed for Single Page Apps.\n\nInspired by Trevor Burnham's [connect-assets](https://github.com/TrevorBurnham/connect-assets), and the Rails [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)\n\n* __Orignal Author__: Brad Carleton\n* __Company__: Tech Pines\n* __Blog Intro__: [Introducing AssetRack](http://www.techpines.com/blog/asset-rack-dynamic-asset-management-nodejs)\n\n## Features\n\n1. Dynamic asset creation for js, css, html templates.\n2. Support for js/coffescript, browserify (node-style requires).\n3. Support for less.\n4. Support for jade templates.\n4. Multi-process, multi-server out of the box.  Share nothing.\n5. Filenames hashed for \"forever\" HTML caching and easy CDN updates.\n6. No need to ever compile static files to disk, all-in memory.\n7. Ability to push compiled files to Amazon S3 for use with Cloudfront.\n8. Can be plugged into express as connect middleware.\n9. Easily extensible.\n\n## Install\n\n```bash\nnpm install asset-rack\n```\n\n## Concepts\n\nThere are two very simple conepts to understand with asset-rack.\n\n### Asset\nAn asset after it is `complete`, consists of three very important things.\n* `url`: A human readable url.\n* `contents`: Contents for the asset, like the actual javascript or image or whatever.\n* `md5`: An md5 hash of the contents\n\nThese three pieces are absolutely critical.  The md5 hash is *super* important! This allows us to append our human readable url with the md5 hash for versioning which allows basically every static asset to be cached forever by proxies, browsers, cdn's.  This makes everything fast, fast, fast.\n\n### AssetRack\nAn asset rack is a collection of assets.  But it allows us to do things with assets that we always want to do very easily.  Like serve them from a memory cache using express and connect middleware, or push all individual assets to an Amazon S3 bucket, or write them to disk or whatever other group action we might want to perform on our assets.\n\n## Tutorial\nHere is a simple walk throught that demonstrates some of the\nmajor features of asset rack.\n\n### Create your Assets\nFirst create your assets.  Here we are creating our stylesheets, \njavascript code, and javascript templates from less, coffeescript and jade.\n```javascript\nvar rack = require('asset-rack');\n\nvar assets = new rack.AssetRack([\n    new rack.LessAsset({\n        url: '/style.css',\n        filename: __dirname + '/path/to/file.less'\n    }),\n    new rack.BrowserifyAsset({\n        url: '/app.js',\n        filename: __dirname + '/path/to/app.coffee'\n    }),\n    new rack.JadeAsset({\n        url: '/templates.js',\n        dirname: __dirname + '/templates'\n    })\n]);\n\nassets.on('complete', function() {\n    console.log('hey all my assets were created!');\n});\n```\n\n### Hook into Express\nOnce your assets have been created you can hook them \ninto express with ease.\n```javascript\nassets.on('complete', function() {\n    var app = express.createServer();\n    app.configure(function() {\n        app.use(assets);  // that's all you need to do\n    });\n    app.listen(8000);\n});\n```\n\nAll of those assets are now stored in an in-memroy cache, so it is super fast.\n\n### Markup Functions\n\nIn your jade templates you can include the tags by referencing their url.  For your convenience the assets object will be added to response locals, so that you can do the following in say a jade template:\n\n```\n!= assets.tag('/style.css')\n!= assets.tag('/app.js')\n!= assets.tag('/templates.js')\n```\nWhich results in the following html:\n\n```html\n<link href=\"/style-{md5-sum}.css\" rel=\"stylesheet\"></link>\n<script src=\"/templates-{md5-sum}.js\"></script>\n<script src=\"/app-{md5-sum}.js\"></script>\n```\n\nVery cool, and this will work for multi-process and multi-server.\n\nNotice the md5 sum that is now on the url.  This means you can HTML cache it forever.  Which is exactly what we do if you have the hash option set.  Also, updating your CDN is now a breeze.\n\n### Push Compiled Assets to S3\nNow that all your assets are done and hooked into express you can just\nserve them from your app, but we can do better!  Let's push them to Amazon\nAWS so they can be served by S3 or Cloudfront.\n\n\n```javascript\nassets.on('complete', function() {\n    assets.pushS3({\n        key: '<your aws key>',\n        secret: '<your aws secret>',\n        bucket: '<your aws bucket>'\n    });\n    assets.on('s3-upload-complete', function() {\n        console.log('our assets are now on amazon s3!');\n    });\n});\n```\n\n# API Reference\n\n## AssetRack\n\nThis is your initial collection of assets.\n\n```javascript\nvar assets = new AssetRack([\n    new rack.LessAsset({\n        url: '/style.css',\n        filename: __dirname + '/path/to/file.less'\n    }),\n    new rack.BrowserifyAsset({\n        url: '/app.js',\n        filename: __dirname + '/path/to/app.coffee'\n    }),\n    new rack.JadeAsset({\n        url: '/templates.js',\n        dirname: __dirname + '/templates'\n    })\n]);\n```\n\nTo use with express:\n\n```javascript\napp.use(assets);\n```\n\n### Methods\n* `tag(url)`: Given a url, returns the tag that should be used in HTML.\n* `pushS3({key:key, secret:secret, bucket:bucket})`: Pushes all asset contents to their respective \nurls in an Amazon S3 bucket.\n\n### Events\n\n* `complete`: Emitted after all assets have been created.\n* `s3-upload-complete`: Emitted after assets have been loaded to s3.\n* `error`: Emitted for any errors.\n\n## BrowserifyAsset (js/coffeescript)\n\nBrowserify is an awesome node project that converts node-style requires\nto requirejs for the frontend.  For more details, check it out,\n[here](https://github.com/substack/node-browserify).\n\n```javascript\nnew BrowserifyAsset({\n    url: '/app.js',\n    filename: __dirname + '/client/app.js',\n    compress: true\n});\n```\n\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `filename`: A filename or list of filenames to be executed by the browser.\n* `require`: A filename or list of filenames to require, should not be necessary\nas the `filename` argument should pull in any requires you need.\n* `compress` (defaults to false): whether to run the javascript through a minifier.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n## JadeAsset\nThis is an awesome asset.  Ever wanted the simplicity of jade templates\non the browser with lightning fast performance.  Here you go.\n\n```javascript\nnew JadeAsset({\n    url: '/templates.js',\n    dirname: __dirname + '/templates'\n});\n```\n\nSo if your template directory looked like this:\n\n```\nindex.jade\ncontact.jade\nuser/\n    profile.jade\n    info.jade\n```\n\nThen in the browser, you would first need to include the [jade runtime](https://github.com/visionmedia/jade/blob/master/runtime.js) script:\n\n```\nscript(src=\"/static/js/jade-runtime.js\", type=\"text/javascript\")\n```\n\nthen you could reference your templates like so:\n\n```javascript\n$('body').append(Templates['index']());\n$('body').append(Templates['user/profile']({username: 'brad', status: 'fun'}));\n$('body').append(Templates['user/info']());\n```\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `dirname`: Directory where template files are located, will grab them recursively.\n* `separator` (defaults to '/'): The character that separates directories, i like to change it to an underscore, `_`.  So that you get more javascript friendly template names like `Templates.user_profile` or `Templates.friends_interests_list`.\n* `compress` (defaults to false): Whether to minify the javascript or not.\n* `clientVariable` (defaults to 'Templates'): Client side template\nvariable.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n## LessAsset\n\nThe less asset basically compiles up and serves your less files as css.  You\ncan read more about less [here](https://github.com/cloudhead/less.js).\n\n```javascript\nnew LessAsset({\n    url: '/style.css',\n    filename: __dirname + '/style/app.less'\n});\n```\n\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n* `filename`: Filename of the less file you want to serve.\n* `compress` (defaults to false): Whether to minify the css.\n* `paths`: List of paths to search for `@import` directives.\n\n\n# License\n\n©2012 Brad Carleton, Tech Pines and available under the [MIT license](http://www.opensource.org/licenses/mit-license.php):\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"asset-rack@1.1.2","dist":{"shasum":"3c35fe891db297cb30102d61695302d94c7767b4","tarball":"http://registry.npmjs.org/asset-rack/-/asset-rack-1.1.2.tgz"},"maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}]},"1.1.3":{"name":"asset-rack","version":"1.1.3","description":"Asset management framework for nodejs","author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack"},"dependencies":{"coffee-script":"1.3.1","browserify":"1.13.5","uglify-js":"1.3.0","async":"0.1.22","knox":"0.0.9","less":"1.3.0","jade":"0.27.0","mime":"1.2.6"},"main":"switch.js","engines":{"node":">= 0.5.0"},"readme":"\n![asset-rack!](http://www.techpines.com/static/logo/asset-rack.png)\n\nA node-style asset management framework. Designed for Single Page Apps.\n\nInspired by Trevor Burnham's [connect-assets](https://github.com/TrevorBurnham/connect-assets), and the Rails [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)\n\n* __Orignal Author__: Brad Carleton\n* __Company__: Tech Pines\n* __Blog Intro__: [Introducing AssetRack](http://www.techpines.com/blog/asset-rack-dynamic-asset-management-nodejs)\n\n## Features\n\n1. Dynamic asset creation for js, css, html templates.\n2. Support for js/coffescript, browserify (node-style requires).\n3. Support for less.\n4. Support for jade templates.\n4. Multi-process, multi-server out of the box.  Share nothing.\n5. Filenames hashed for \"forever\" HTML caching and easy CDN updates.\n6. No need to ever compile static files to disk, all-in memory.\n7. Ability to push compiled files to Amazon S3 for use with Cloudfront.\n8. Can be plugged into express as connect middleware.\n9. Easily extensible.\n\n## Install\n\n```bash\nnpm install asset-rack\n```\n\n## Concepts\n\nThere are two very simple conepts to understand with asset-rack.\n\n### Asset\nAn asset after it is `complete`, consists of three very important things.\n* `url`: A human readable url.\n* `contents`: Contents for the asset, like the actual javascript or image or whatever.\n* `md5`: An md5 hash of the contents\n\nThese three pieces are absolutely critical.  The md5 hash is *super* important! This allows us to append our human readable url with the md5 hash for versioning which allows basically every static asset to be cached forever by proxies, browsers, cdn's.  This makes everything fast, fast, fast.\n\n### AssetRack\nAn asset rack is a collection of assets.  But it allows us to do things with assets that we always want to do very easily.  Like serve them from a memory cache using express and connect middleware, or push all individual assets to an Amazon S3 bucket, or write them to disk or whatever other group action we might want to perform on our assets.\n\n## Tutorial\nHere is a simple walk throught that demonstrates some of the\nmajor features of asset rack.\n\n### Create your Assets\nFirst create your assets.  Here we are creating our stylesheets, \njavascript code, and javascript templates from less, coffeescript and jade.\n```javascript\nvar rack = require('asset-rack');\n\nvar assets = new rack.AssetRack([\n    new rack.LessAsset({\n        url: '/style.css',\n        filename: __dirname + '/path/to/file.less'\n    }),\n    new rack.BrowserifyAsset({\n        url: '/app.js',\n        filename: __dirname + '/path/to/app.coffee'\n    }),\n    new rack.JadeAsset({\n        url: '/templates.js',\n        dirname: __dirname + '/templates'\n    })\n]);\n\nassets.on('complete', function() {\n    console.log('hey all my assets were created!');\n});\n```\n\n### Hook into Express\nOnce your assets have been created you can hook them \ninto express with ease.\n```javascript\nassets.on('complete', function() {\n    var app = express.createServer();\n    app.configure(function() {\n        app.use(assets);  // that's all you need to do\n    });\n    app.listen(8000);\n});\n```\n\nAll of those assets are now stored in an in-memroy cache, so it is super fast.\n\n### Markup Functions\n\nIn your jade templates you can include the tags by referencing their url.  For your convenience the assets object will be added to response locals, so that you can do the following in say a jade template:\n\n```\n!= assets.tag('/style.css')\n!= assets.tag('/app.js')\n!= assets.tag('/templates.js')\n```\nWhich results in the following html:\n\n```html\n<link href=\"/style-{md5-sum}.css\" rel=\"stylesheet\"></link>\n<script src=\"/templates-{md5-sum}.js\"></script>\n<script src=\"/app-{md5-sum}.js\"></script>\n```\n\nVery cool, and this will work for multi-process and multi-server.\n\nNotice the md5 sum that is now on the url.  This means you can HTML cache it forever.  Which is exactly what we do if you have the hash option set.  Also, updating your CDN is now a breeze.\n\n### Push Compiled Assets to S3\nNow that all your assets are done and hooked into express you can just\nserve them from your app, but we can do better!  Let's push them to Amazon\nAWS so they can be served by S3 or Cloudfront.\n\n\n```javascript\nassets.on('complete', function() {\n    assets.pushS3({\n        key: '<your aws key>',\n        secret: '<your aws secret>',\n        bucket: '<your aws bucket>'\n    });\n    assets.on('s3-upload-complete', function() {\n        console.log('our assets are now on amazon s3!');\n    });\n});\n```\n\n# API Reference\n\n## AssetRack\n\nThis is your initial collection of assets.\n\n```javascript\nvar assets = new AssetRack([\n    new rack.LessAsset({\n        url: '/style.css',\n        filename: __dirname + '/path/to/file.less'\n    }),\n    new rack.BrowserifyAsset({\n        url: '/app.js',\n        filename: __dirname + '/path/to/app.coffee'\n    }),\n    new rack.JadeAsset({\n        url: '/templates.js',\n        dirname: __dirname + '/templates'\n    })\n]);\n```\n\nTo use with express:\n\n```javascript\napp.use(assets);\n```\n\n### Methods\n* `tag(url)`: Given a url, returns the tag that should be used in HTML.\n* `pushS3({key:key, secret:secret, bucket:bucket})`: Pushes all asset contents to their respective \nurls in an Amazon S3 bucket.\n\n### Events\n\n* `complete`: Emitted after all assets have been created.\n* `s3-upload-complete`: Emitted after assets have been loaded to s3.\n* `error`: Emitted for any errors.\n\n## BrowserifyAsset (js/coffeescript)\n\nBrowserify is an awesome node project that converts node-style requires\nto requirejs for the frontend.  For more details, check it out,\n[here](https://github.com/substack/node-browserify).\n\n```javascript\nnew BrowserifyAsset({\n    url: '/app.js',\n    filename: __dirname + '/client/app.js',\n    compress: true\n});\n```\n\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `filename`: A filename or list of filenames to be executed by the browser.\n* `require`: A filename or list of filenames to require, should not be necessary\nas the `filename` argument should pull in any requires you need.\n* `compress` (defaults to false): whether to run the javascript through a minifier.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n## JadeAsset\nThis is an awesome asset.  Ever wanted the simplicity of jade templates\non the browser with lightning fast performance.  Here you go.\n\n```javascript\nnew JadeAsset({\n    url: '/templates.js',\n    dirname: __dirname + '/templates'\n});\n```\n\nSo if your template directory looked like this:\n\n```\nindex.jade\ncontact.jade\nuser/\n    profile.jade\n    info.jade\n```\n\nThen in the browser, you would first need to include the [jade runtime](https://github.com/visionmedia/jade/blob/master/runtime.js) script:\n\n```\nscript(src=\"/static/js/jade-runtime.js\", type=\"text/javascript\")\n```\n\nthen you could reference your templates like so:\n\n```javascript\n$('body').append(Templates['index']());\n$('body').append(Templates['user/profile']({username: 'brad', status: 'fun'}));\n$('body').append(Templates['user/info']());\n```\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `dirname`: Directory where template files are located, will grab them recursively.\n* `separator` (defaults to '/'): The character that separates directories, i like to change it to an underscore, `_`.  So that you get more javascript friendly template names like `Templates.user_profile` or `Templates.friends_interests_list`.\n* `compress` (defaults to false): Whether to minify the javascript or not.\n* `clientVariable` (defaults to 'Templates'): Client side template\nvariable.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n## LessAsset\n\nThe less asset basically compiles up and serves your less files as css.  You\ncan read more about less [here](https://github.com/cloudhead/less.js).\n\n```javascript\nnew LessAsset({\n    url: '/style.css',\n    filename: __dirname + '/style/app.less'\n});\n```\n\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n* `filename`: Filename of the less file you want to serve.\n* `compress` (defaults to false): Whether to minify the css.\n* `paths`: List of paths to search for `@import` directives.\n\n\n# License\n\n©2012 Brad Carleton, Tech Pines and available under the [MIT license](http://www.opensource.org/licenses/mit-license.php):\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"asset-rack@1.1.3","dist":{"shasum":"60df976fa917b85cbdc2e9678b65f270844c7279","tarball":"http://registry.npmjs.org/asset-rack/-/asset-rack-1.1.3.tgz"},"maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}]},"1.1.4":{"name":"asset-rack","version":"1.1.4","description":"Asset management framework for nodejs","author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack"},"dependencies":{"coffee-script":"1.3.1","browserify":"1.13.5","uglify-js":"1.3.0","async":"0.1.22","knox":"0.0.9","less":"1.3.0","jade":"0.27.0","mime":"1.2.6"},"main":"switch.js","engines":{"node":">= 0.5.0"},"readme":"\n![asset-rack!](http://www.techpines.com/static/logo/asset-rack.png)\n\nA node-style asset management framework. Designed for Single Page Apps.\n\nInspired by Trevor Burnham's [connect-assets](https://github.com/TrevorBurnham/connect-assets), and the Rails [Asset Pipeline](http://guides.rubyonrails.org/asset_pipeline.html)\n\n* __Orignal Author__: Brad Carleton\n* __Company__: Tech Pines\n* __Blog Intro__: [Introducing AssetRack](http://www.techpines.com/blog/asset-rack-dynamic-asset-management-nodejs)\n\n## Features\n\n1. Dynamic asset creation for js, css, html templates.\n2. Support for js/coffescript, browserify (node-style requires).\n3. Support for less.\n4. Support for jade templates.\n4. Multi-process, multi-server out of the box.  Share nothing.\n5. Filenames hashed for \"forever\" HTML caching and easy CDN updates.\n6. No need to ever compile static files to disk, all-in memory.\n7. Ability to push compiled files to Amazon S3 for use with Cloudfront.\n8. Can be plugged into express as connect middleware.\n9. Easily extensible.\n\n## Install\n\n```bash\nnpm install asset-rack\n```\n\n## Concepts\n\nThere are two very simple conepts to understand with asset-rack.\n\n### Asset\nAn asset after it is `complete`, consists of three very important things.\n* `url`: A human readable url.\n* `contents`: Contents for the asset, like the actual javascript or image or whatever.\n* `md5`: An md5 hash of the contents\n\nThese three pieces are absolutely critical.  The md5 hash is *super* important! This allows us to append our human readable url with the md5 hash for versioning which allows basically every static asset to be cached forever by proxies, browsers, cdn's.  This makes everything fast, fast, fast.\n\n### AssetRack\nAn asset rack is a collection of assets.  But it allows us to do things with assets that we always want to do very easily.  Like serve them from a memory cache using express and connect middleware, or push all individual assets to an Amazon S3 bucket, or write them to disk or whatever other group action we might want to perform on our assets.\n\n## Tutorial\nHere is a simple walk throught that demonstrates some of the\nmajor features of asset rack.\n\n### Create your Assets\nFirst create your assets.  Here we are creating our stylesheets, \njavascript code, and javascript templates from less, coffeescript and jade.\n```javascript\nvar rack = require('asset-rack');\n\nvar assets = new rack.AssetRack([\n    new rack.LessAsset({\n        url: '/style.css',\n        filename: __dirname + '/path/to/file.less'\n    }),\n    new rack.BrowserifyAsset({\n        url: '/app.js',\n        filename: __dirname + '/path/to/app.coffee'\n    }),\n    new rack.JadeAsset({\n        url: '/templates.js',\n        dirname: __dirname + '/templates'\n    })\n]);\n\nassets.on('complete', function() {\n    console.log('hey all my assets were created!');\n});\n```\n\n### Hook into Express\nOnce your assets have been created you can hook them \ninto express with ease.\n```javascript\nassets.on('complete', function() {\n    var app = express.createServer();\n    app.configure(function() {\n        app.use(assets);  // that's all you need to do\n    });\n    app.listen(8000);\n});\n```\n\nAll of those assets are now stored in an in-memroy cache, so it is super fast.\n\n### Markup Functions\n\nIn your jade templates you can include the tags by referencing their url.  For your convenience the assets object will be added to response locals, so that you can do the following in say a jade template:\n\n```\n!= assets.tag('/style.css')\n!= assets.tag('/app.js')\n!= assets.tag('/templates.js')\n```\nWhich results in the following html:\n\n```html\n<link href=\"/style-{md5-sum}.css\" rel=\"stylesheet\"></link>\n<script src=\"/templates-{md5-sum}.js\"></script>\n<script src=\"/app-{md5-sum}.js\"></script>\n```\n\nVery cool, and this will work for multi-process and multi-server.\n\nNotice the md5 sum that is now on the url.  This means you can HTML cache it forever.  Which is exactly what we do if you have the hash option set.  Also, updating your CDN is now a breeze.\n\n### Push Compiled Assets to S3\nNow that all your assets are done and hooked into express you can just\nserve them from your app, but we can do better!  Let's push them to Amazon\nAWS so they can be served by S3 or Cloudfront.\n\n\n```javascript\nassets.on('complete', function() {\n    assets.pushS3({\n        key: '<your aws key>',\n        secret: '<your aws secret>',\n        bucket: '<your aws bucket>'\n    });\n    assets.on('s3-upload-complete', function() {\n        console.log('our assets are now on amazon s3!');\n    });\n});\n```\n\n# API Reference\n\n## AssetRack\n\nThis is your initial collection of assets.\n\n```javascript\nvar assets = new AssetRack([\n    new rack.LessAsset({\n        url: '/style.css',\n        filename: __dirname + '/path/to/file.less'\n    }),\n    new rack.BrowserifyAsset({\n        url: '/app.js',\n        filename: __dirname + '/path/to/app.coffee'\n    }),\n    new rack.JadeAsset({\n        url: '/templates.js',\n        dirname: __dirname + '/templates'\n    })\n]);\n```\n\nTo use with express:\n\n```javascript\napp.use(assets);\n```\n\n### Methods\n* `tag(url)`: Given a url, returns the tag that should be used in HTML.\n* `pushS3({key:key, secret:secret, bucket:bucket})`: Pushes all asset contents to their respective \nurls in an Amazon S3 bucket.\n\n### Events\n\n* `complete`: Emitted after all assets have been created.\n* `s3-upload-complete`: Emitted after assets have been loaded to s3.\n* `error`: Emitted for any errors.\n\n## BrowserifyAsset (js/coffeescript)\n\nBrowserify is an awesome node project that converts node-style requires\nto requirejs for the frontend.  For more details, check it out,\n[here](https://github.com/substack/node-browserify).\n\n```javascript\nnew BrowserifyAsset({\n    url: '/app.js',\n    filename: __dirname + '/client/app.js',\n    compress: true\n});\n```\n\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `filename`: A filename or list of filenames to be executed by the browser.\n* `require`: A filename or list of filenames to require, should not be necessary\nas the `filename` argument should pull in any requires you need.\n* `compress` (defaults to false): whether to run the javascript through a minifier.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n## JadeAsset\nThis is an awesome asset.  Ever wanted the simplicity of jade templates\non the browser with lightning fast performance.  Here you go.\n\n```javascript\nnew JadeAsset({\n    url: '/templates.js',\n    dirname: __dirname + '/templates'\n});\n```\n\nSo if your template directory looked like this:\n\n```\nindex.jade\ncontact.jade\nuser/\n    profile.jade\n    info.jade\n```\n\nThen in the browser, you would first need to include the [jade runtime](https://github.com/visionmedia/jade/blob/master/runtime.js) script:\n\n```\nscript(src=\"/static/js/jade-runtime.js\", type=\"text/javascript\")\n```\n\nthen you could reference your templates like so:\n\n```javascript\n$('body').append(Templates['index']());\n$('body').append(Templates['user/profile']({username: 'brad', status: 'fun'}));\n$('body').append(Templates['user/info']());\n```\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `dirname`: Directory where template files are located, will grab them recursively.\n* `separator` (defaults to '/'): The character that separates directories, i like to change it to an underscore, `_`.  So that you get more javascript friendly template names like `Templates.user_profile` or `Templates.friends_interests_list`.\n* `compress` (defaults to false): Whether to minify the javascript or not.\n* `clientVariable` (defaults to 'Templates'): Client side template\nvariable.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n## LessAsset\n\nThe less asset basically compiles up and serves your less files as css.  You\ncan read more about less [here](https://github.com/cloudhead/less.js).\n\n```javascript\nnew LessAsset({\n    url: '/style.css',\n    filename: __dirname + '/style/app.less'\n});\n```\n\n### Options\n\n* `url`: The url that should retrieve this resource.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n* `filename`: Filename of the less file you want to serve.\n* `compress` (defaults to false): Whether to minify the css.\n* `paths`: List of paths to search for `@import` directives.\n\n\n# License\n\n©2012 Brad Carleton, Tech Pines and available under the [MIT license](http://www.opensource.org/licenses/mit-license.php):\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"asset-rack@1.1.4","dist":{"shasum":"27cebd510c73f6424f994d9403fd89d07dff526c","tarball":"http://registry.npmjs.org/asset-rack/-/asset-rack-1.1.4.tgz"},"maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}]}},"readme":"\n![asset-rack!](http://www.techpines.com/static/logo/asset-rack.png)\n\nThe best asset management framework for node. (period)\n\n## Features\n\n1. Dynamic asset creation for js, css, html templates, images, fonts.\n2. Support for js/coffescript, browserify (node-style requires).\n3. Support for less.\n4. Support for jade templates.\n4. Multi-process, multi-server out of the box.  Share nothing.\n5. Filenames hashed for \"forever\" HTML caching and easy CDN updates.\n6. No need to ever compile static files to disk, all-in memory.\n7. Ability to push compiled files to Amazon S3 for use with Cloudfront.\n8. Can be plugged into express as connect middleware.\n9. Easily extensible.\n\n## Install\n\n```bash\nnpm install asset-rack\n```\n\n# Tutorial\nHere is a simple walk throught that demonstrates some of the\nmajor features of asset rack.\n\n## Create your Assets\nFirst create your assets.  Here we are creating our stylesheets, \njavascript code, and javascript templates from less, coffeescript and jade.\n```coffeescript\nrack = require('asset-rack')\n\nassets = new rack.AssetPackage\n    assets: [\n        new rack.LessAsset\n            url: '/style.css'\n            filename: \"#{__dirname}/path/to/file.less\"\n    ,\n        new rack.BrowserifyAsset\n            url: '/app.js'\n            filename: \"#{__dirname}/path/to/app.coffee\"\n    ,\n        new rack.JadeAsset\n            url: '/templates.js'\n            dirname: \"#{__dirname}/templates\"\n    ]\n\nassets.on 'complete', ->\n    console.log 'hey all my assets were created!'\n```\n\n## Hook into Express\nOnce your assets have been created you can hook them \ninto express with ease.\n```coffeescript\nassets.on 'complete', ->\n    app = express.createServer()\n    app.configure ->\n        app.use assets.middlware()\n```\n\n## Markup Functions\n\nIn your jade templates you can include the tags by referencing their url.\n\n```\n!= assets.tag('/style.css')\n!= assets.tag('/app.js')\n!= assets.tag('/templates.js')\n```\nWhich results in the following html:\n\n```html\n<link href=\"/style-{md5-sum}.css\" rel=\"stylesheet\"></link>\n<script src=\"/templates-{md5-sum}.js\"></script>\n<script src=\"/app-{md5-sum}.js\"></script>\n```\n\nNotice the md5 sum that is now on the url.  This means you can HTML cache it forever.  Which is exactly what we do if you have the hash option set.  Also, updating your CDN is a breeze.\n\n## Push Compiled Assets to S3\nNow that all your assets are done and hooked into express you can just\nserve them from your app, but we can do better!  Let's push them to Amazon\nAWS so they can be served by S3 or Cloudfront.\n\n```coffeescript\nassets.on 'complete', ->\n    assets.pushS3\n        key: '<your aws key>'\n        secret: '<your aws secret>'\n        bucket: '<your aws bucket>'\n    assets.on 's3-upload-complete', ->\n        console.log 'our static files are on amazon s3'\n```\n\nEasy.\n\n## Write a JSON config file.\n\n```coffeescript\nfs.writeFileSync '/asset/config.json', JSON.parse(assets.config)\n```\n\n## Upload the Config for Express\n\n```coffescript\napp = express.createServer()\napp.configure ->\n    assetConfig = require('/asset/config.json')\n    assets = new ac.AssetPackage\n        config: require('/asset/config.json')\n        hostname: 'static.cloudfront.net' # Or whatever you CDN host might be.\n```\n\n## New HTML Output\n\n```html\n<link href=\"//static.cloudfront.net/style-{md5-sum}\" rel=\"stylesheet\"></link>\n<script src=\"//static.cloudfront.net/templates-{md5-sum}\"></script>\n<script src=\"//static.cloudfront.net/app-{md5-sum}.js\"></script>\n```     \n\n\n## API Reference\n\n### AssetPackage\n\nThis is the main asset class.\n\n#### Options\n\nEither a list of assets or a config object is required.\n\n* `assets`: An array of assets to use.\n* `config`: Use a config file that tells the server where the assets are\nrather then compile the assets.\n* `hostname` (optional): The hostname for your asset urls.\n\n#### Methods\n* `create`: Asynchronously creates all the packages assets.\n* `middelware`: Returns connect middleware for the assets package.\n* `tag(url)`: Given a url, returns the tag that should be used in HTML.\n* `pushS3`: Pushes all asset contents to their respective \nurls in an Amazon S3 bucket.\n\n#### Events\n\n* `complete`: Emitted by `create` after all assets have been created.\n* `s3-upload-complete`: Emitted after assets have been loaded to s3.\n* `error`: Emitted for any errors.\n\n### BrowserifyAsset\n\nBrowserify is an awesome node project that converts node-style requires\nto requirejs for the frontend.  For more details, check it out,\n[here](https://github.com/substack/node-browserify).\n\n```coffeescript\nnew BrowserifyAsset\n    url: '/app.js'\n    filename: \"#{__dirname}/client/app.js\"\n    compress: true\n```\n\n#### Options\n\n* `url`: The url that should retrieve this resource.\n* `filename`: A filename or list of filenames to be executed by the browser.\n* `require`: A filename or list of filenames to require, should not be necessary\nas the `filename` argument should pull in any requires you need.\n* `compress` (defaults to false): whether to run the javascript through a minifier.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n### JadeAsset\nThis is an awesome asset.  Ever wanted the simplicity of jade templates\non the browser with lightning fast performance.  Here you go.\n\n```coffeescript\nnew JadeAsset\n    url: '/templates.js'\n    dirname: \"#{__dirname}/templates\"\n```\n\nSo if your template directory looked like this:\n\n```\nindex.jade\ncontact.jade\nuser/\n    profile.jade\n    info.jade\n```\n\nThen in the browser, you would first need to include the [jade runtime](https://github.com/visionmedia/jade/blob/master/runtime.js) script\nthen you could reference your templates like so:\n\n```coffeescript\n$('body').append Templates.index() \n$('body').append Templates.contact()\n$('body').append Templates['user/profile'](username: 'brad', status: 'fun')\n$('body').append Templates['user/info'](\n```\n\nYou can also change the directory `seperator` option for better template names:\n\n```coffeescript\n$('body').append Templates.user_profile(username: 'brad', status: 'fun')\n$('body').append Templates.user_info()\n```\n\n#### Options\n\n* `url`: The url that should retrieve this resource.\n* `dirname`: Directory where template files are located, will grab them recursively.\n* `separator` (defaults to '/'): I like to change it like the example above.\n* `compress` (defaults to false): Whether to minify the javascript or not.\n* `clientVariable` (defaults to 'Templates'): Client side template\nvariable.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n\n\n\n### LessAsset\n\nThe less asset basically compiles up and serves your less files as css.  You\ncan read more about less [here](https://github.com/cloudhead/less.js).\n\n```coffeescript\nlessAsset = new ac.LessAsset\n    url: '/style.css'\n    filename: \"#{__dirname}/style/app.less\"\n```\n\n#### Options\n\n* `url`: The url that should retrieve this resource.\n* `hash` (defaults to true): Set to false if you don't want the md5 sum added to your urls.\n* `filename`: Filename of the less file you want to serve.\n* `compress` (defaults to false): Whether to minify the css.\n* `paths`: List of paths to search for `@import` directives.\n\n\n## License\n\n©2012 Brad Carleton, Tech Pines and available under the [MIT license](http://www.opensource.org/licenses/mit-license.php):\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"brad@techpines.com","email":"brad@techpines.com"}],"time":{"modified":"2012-08-08T14:09:38.374Z","created":"2012-07-11T19:14:01.075Z","1.0.1":"2012-07-11T19:14:01.926Z","1.1.0":"2012-07-12T17:55:36.188Z","1.1.1":"2012-07-15T15:48:24.460Z","1.1.2":"2012-07-28T17:59:15.290Z","1.1.3":"2012-07-30T19:04:48.828Z","1.1.4":"2012-08-08T14:09:38.374Z"},"author":{"name":"Brad Carleton","email":"brad@techpines.com"},"repository":{"type":"git","url":"git://github.com/techpines/asset-rack"},"users":{"fgribreau":true},"_attachments":{"asset-rack-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-Emw7xZz5e8UZw1Rz5gFBJQ==","length":7200,"stub":true},"asset-rack-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-xUKQiPHNqGx2FN+KqhxlOQ==","length":7203,"stub":true},"asset-rack-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IALU7vKDD3L3qrs93rZXrw==","length":7207,"stub":true},"asset-rack-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-D/BIFu13CujFmKdOdUypDQ==","length":7161,"stub":true},"asset-rack-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-dBOkOR3xu/tdkafkSIfAuw==","length":7139,"stub":true},"asset-rack-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rLsrNgkV9vKO6iajlzhrcA==","length":6668,"stub":true}}}},
{"id":"asset-smasher","key":"asset-smasher","value":{"rev":"11-c08f9d8ae8dab6c502b2578ab444b59d"},"doc":{"_id":"asset-smasher","_rev":"11-c08f9d8ae8dab6c502b2578ab444b59d","name":"asset-smasher","description":"Asset pre-processor, merger, and compressor.","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"asset-smasher","description":"Asset pre-processor, merger, and compressor.","version":"0.1.0","author":{"name":"Jim Riecken","email":"jriecken@gmail.com"},"keywords":["asset","compress","merge","preprocess"],"license":{"type":"MIT","url":"http://github.com/jriecken/asset-smasher/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/jriecken/asset-smasher.git"},"bugs":{"url":"http://github.com/jriecken/asset-smasher/issues"},"main":"./lib/asset-smasher.js","bin":{"asset-smasher":"./bin/asset-smasher"},"dependencies":{"async":"0.1.18","commander":"0.6.0","glob":"3.1.9","mkdirp":"0.3.2","minimatch":"0.2.4","uglify-js":"1.3.0","underscore":"1.3.3"},"optionalDependencies":{},"devDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"jriecken","email":"jriecken@gmail.com"},"_id":"asset-smasher@0.1.0","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"99e5e220e8c48bc01ed2e669d4b24cf3ad0df6d2","tarball":"http://registry.npmjs.org/asset-smasher/-/asset-smasher-0.1.0.tgz"},"maintainers":[{"name":"jriecken","email":"jriecken@gmail.com"}]},"0.1.1":{"name":"asset-smasher","description":"Asset pre-processor, merger, and compressor.","version":"0.1.1","author":{"name":"Jim Riecken","email":"jriecken@gmail.com"},"keywords":["asset","compress","merge","preprocess"],"license":{"type":"MIT","url":"http://github.com/jriecken/asset-smasher/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/jriecken/asset-smasher.git"},"bugs":{"url":"http://github.com/jriecken/asset-smasher/issues"},"main":"./lib/asset-smasher.js","bin":{"asset-smasher":"./bin/asset-smasher"},"dependencies":{"async":"0.1.18","commander":"0.6.0","glob":"3.1.9","mkdirp":"0.3.2","minimatch":"0.2.4","uglify-js":"1.3.0","underscore":"1.3.3"},"optionalDependencies":{},"devDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"jriecken","email":"jriecken@gmail.com"},"_id":"asset-smasher@0.1.1","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"a3fa8e2f54ef4c581f1c717d55a4f1c26cb8e9ee","tarball":"http://registry.npmjs.org/asset-smasher/-/asset-smasher-0.1.1.tgz"},"maintainers":[{"name":"jriecken","email":"jriecken@gmail.com"}]},"0.1.2":{"name":"asset-smasher","description":"Asset pre-processor, merger, and compressor.","version":"0.1.2","author":{"name":"Jim Riecken","email":"jriecken@gmail.com"},"keywords":["asset","compress","merge","preprocess"],"license":{"type":"MIT","url":"http://github.com/jriecken/asset-smasher/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/jriecken/asset-smasher.git"},"bugs":{"url":"http://github.com/jriecken/asset-smasher/issues"},"main":"./lib/asset-smasher.js","bin":{"asset-smasher":"./bin/asset-smasher"},"dependencies":{"async":"0.1.22","commander":"0.6.1","glob":"3.1.10","mkdirp":"0.3.3","minimatch":"0.2.5","uglify-js":"1.3.2","underscore":"1.3.3"},"optionalDependencies":{},"devDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"jriecken","email":"jriecken@gmail.com"},"_id":"asset-smasher@0.1.2","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"46805a147633524fb0249595f22f96268bd8fb92","tarball":"http://registry.npmjs.org/asset-smasher/-/asset-smasher-0.1.2.tgz"},"maintainers":[{"name":"jriecken","email":"jriecken@gmail.com"}]},"0.1.3":{"name":"asset-smasher","description":"Asset pre-processor, merger, and compressor.","version":"0.1.3","author":{"name":"Jim Riecken","email":"jriecken@gmail.com"},"keywords":["asset","compress","merge","preprocess"],"license":{"type":"MIT","url":"http://github.com/jriecken/asset-smasher/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/jriecken/asset-smasher.git"},"bugs":{"url":"http://github.com/jriecken/asset-smasher/issues"},"main":"./lib/asset-smasher.js","bin":{"asset-smasher":"./bin/asset-smasher"},"dependencies":{"async":"0.1.22","commander":"0.6.1","glob":"3.1.10","mkdirp":"0.3.3","minimatch":"0.2.5","uglify-js":"1.3.2","underscore":"1.3.3"},"optionalDependencies":{},"devDependencies":{},"engines":{"node":">= 0.6.0"},"readme":"# Asset Smasher\n\nAsset pre-processor, merger, and compressor for Node.js\n\n- [Structuring Your Assets](#structure-assets)\n    - [Manifest Files](#manifest-files)\n- [Using via Command Line](#command-line)\n    - [Helpers](#cli-helpers)\n    - [Plugins](#cli-plugins)\n- [Using via Express Middleware](#express-middleware)\n- [Using via Programmatic Interface](#programmatic-interface)\n- [Transformer Notes](#transformer-notes)\n    - [LESS](#tn-less)\n    - [ejs](#tn-ejs)\n    - [dust and Handlebars](#tn-dust-hbs)\n\n## Overview\n\nAsset Smasher is a command-line tool, express middleware, and programmatic interface for:\n\n- Pre-processing and transforming files down to plain JavaScript and CSS.\n    - `.coffee` - Compile CoffeeScript into JavaScript\n    - `.ejs` - Run a file through EJS (e.g. to populate configuration parameters into a JavaScript file)\n    - `.less` - Compile Less into CSS\n    - `.hbs` - Precompile Handlebars templates into JavaScript files that register them with `Handlebars.templates`.\n    - `.dust` - Precompile Dust templates into JavaScript files that register them for use with `dust.render`.\n    - Processors can be chained together.  E.g `test.js.hbs.ejs` (run Handlebars template through EJS, then compile it)\n    - Additional processors can be plugged in.\n- Merging files together using Manifest files (`.mf`) with dependency management directives similar to Sprockets.\n    - `require` - Require a single file\n    - `require_dir` - Require all the files in a specific directory\n    - `require_tree` - Require all the files in a specific directory (and subdirectories)\n- Compressing, gzipping, and generating hashed file names.\n    - Compress JavaScript files with `uglify-js`\n    - Compress LESS during LESS preprocessing\n    - Generate Gzipped versions of files\n    - Include a MD5 hash of the file's contents in the file name. `myAsset.js` -> `myAsset-c89cba7b7df028e65cb01d86f4d27077.js`\n        - `asset_path` helper that can be used to reference the hashed name.\n\nIt's released under the [MIT](http://en.wikipedia.org/wiki/MIT_License) license.\n\n## <a name=\"structure-assets\"></a> Structuring Your Assets\n\nAsset Smasher has the concept of \"asset paths\".  These are locations in which your asset files will be located, and from which any relative asset paths will be rooted to.\n\nThe simplest structure has one asset path.\n\nE.g.\n\n    Asset Paths\n    -----------\n     - app\n\n    File Structure\n    --------------\n    app/\n      js/\n      css/\n      images/\n\nA more complicated structure might be\n\n    Asset Paths\n    -----------\n     - app\n     - lib\n     - vendor\n\n    File Structure\n    --------------\n    app/\n      js/\n      css/\n      images/\n    lib/\n      js/\n      css/\n      images/\n    vendor/\n      js/\n      css/\n      images/\n\nBoth of these examples will result in a compiled structure of\n\n    js/\n    css/\n    images/\n\n### <a name=\"manifest-files\"></a> Manifest Files\n\nManifest (`.mf`) files are used to merge many assets into a single resulting file. The file should be named with the resulting file type before the `.mf` extension (e.g. `manifest.css.mf` or `manifest.js.mf`. *Manifest files can `require` other manifest files*\n\nA simple manifest file might look like\n\n    # A comment here\n    require \"./one.js\"\n    require_dir \"./subdir1\"\n    #\n    # Another comment\n    require_tree \"./subdir2\"\n\n**Directives:**\n\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" width=\"100%\">\n <thead>\n  <tr><th width=\"15%\">Directive</th><th width=\"85%\">Description</th></tr>\n </thead>\n <tbody>\n  <tr>\n    <td><code>require \"[path]\"</code></td>\n    <td>\n      <strong>Include a single file</strong>\n      <ul>\n       <li>\n         If the path starts with <code>\"/\"</code>, <code>\"../\"</code>, or <code>\"./\"</code>, process and include the specified file.  The file <em>must</em> be\n         inside one of the configured asset paths.\n       </li>\n       <li>\n         If the path does not start with <code>\"/\"</code>, <code>\"../\"</code>, or <code>\"./\"</code>, the file will be searched for in all of the configured\n         asset paths.  E.g. if there are asset paths <code>one</code> and <code>two</code> defined, <code>require \"js/test.js\"</code>\n         will look for <code>one/js/test.js</code> and then <code>two/js/test.js</code> stopping when it finds a matching file.\n       </li>\n       <li>\n         The filename part of the path does not have to include the whole extension.  E.g <code>require \"test\"</code>\n         finds the first file that matches the name in the asset paths (for example <code>test.js.ejs</code>)\n       </li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td><code>require_dir \"[path]\"</code></td>\n    <td>\n      <strong>Include all the files in a directory</strong>\n      <ul>\n       <li>\n         The path must be absolute, or relative to the current directory.  E.g. you can do <code>require_dir \"../some/other/dir\"</code>\n         but not <code>require_dir \"somedir\"</code>\n       </li>\n       <li>\n         If using absolute paths, or <code>\"..\"</code> in your paths, the resulting directory needs to be inside one of the configured asset paths.\n       </li>\n       <li>\n         Make sure the directory only contains assets of the type you want.  E.g. for <code>myManifest.js.mf</code>, the dir required had better\n         only contain javascript files, or else bad things will happen.\n       </li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td><code>require_tree \"[path]\"</code></td>\n    <td>\n      <strong>Include the files in a directory recursively</strong>\n      <ul>\n        <li>The rules for <code>require_tree</code> are the same as the rules for <code>require_dir</code></li>\n      </ul>\n    </td>\n  </tr>\n </tbody>\n</table>\n\n## <a name=\"command-line\"></a> Using via Command-Line\n\nUse `npm install -g asset-smasher` to install the `asset-smasher` command-line tool globally.\n\n      asset-smasher --help\n\n        Usage: asset-smasher [options] <output dir>\n\n        Options:\n\n          -h, --help               output usage information\n          -V, --version            output the version number\n          --compress               compress/minify the generated files\n          --hash                   generate versions of the files with md5 hashes in the name\n          --gzip                   generate gzipped versions of the compiled files\n          --hashVersion <version>  invalidate all assets without changing file contents [1.0]\n          --only <pattern,...>     only process the files matching these glob patterns (relative to any of the paths) [**/*]\n          --paths <path,...>       list of paths to look for assets [.]\n          --prefix <prefix>        prefix to append to logical paths when constructing urls. use if output dir is not served from the root of your web app []\n          --helpers <js_file>      a .js module of helper functions require()s to expose to transforms []\n          --plugins <js_file>      a .js plugin module []\n\n        If --only is not specified, *all* files in the --paths will be processed.\n\n        Examples:\n\n          Compile all assets in the current directory to /home/me/compiledAssets\n\n            $ asset-smasher /home/me/compiledAssets\n\n          Something similar to what the Rails asset pipeline does by default\n\n            $ asset-smasher --compress --hash --gzip --prefix=/assets \\\n                --paths=./js,./css,./images \\\n                --only **/*.{jpg,gif,png},application.js.mf,application.css.mf ./public/assets\n\n          Compile assets, providing some custom helpers to the transformation\n\n            $ asset-smasher --helpers helpers.js output\n\n### <a name=\"cli-helpers\"></a> Helpers\n\nThere is a built-in `asset_path` helper that can be used to get the \"real\" (i.e. with hashed file name) path of an asset.  E.g. `asset_path('css/myFile.css')` might return `'/assets/css/myFile-c89cba7b7df028e65cb01d86f4d27077.css`.\n\nSome transformers (e.g. the `.ejs` one) take in a set of local variables that they can use during transformation. You can pass in the path to a JavaScript module whose exports will be included in this set of variables.\n\nYou can use this, for example, to set configuration parameters in your JS files:\n\n**helper.js**\n\n    exports.serviceUrl = 'http://my.service/';\n\n**config.js.ejs**\n\n    //...\n    var serviceUrl = '<%= serviceUrl %>';\n    var cssLocation = '<%= asset_path('css/myFile.css') %>';\n    //...\n\n**Execution**\n\n    $ asset-smasher --helpers helper.js --only config.js.ejs,css/myFile.css .\n    $ cat config.js\n    var serviceUrl = 'http://my.service/';\n    var cssLocation = '/assets/css/myFile-c89cba7b7df028e65cb01d86f4d27077.css';\n\n\n### <a name=\"cli-plugins\"></a> Plugins\n\nIf there's a type of file you want to pre-process that is not natively supported by Asset Smasher, you can add it using a plugin file.\n\n*TODO: How to add additional transformers via a plugin file.*\n\n## <a name=\"express-middleware\"></a> Using via Express Middleware\n\nAsset smasher exposes an `express` middleware that can:\n\n- Serve your assets un-merged/mangled in development mode.\n- Serve precompiled assets (with hashed file names) in production mode.\n\nThe middleware takes in the same arguments as the `Smasher` constructor, with a few extras:\n\n- `serve` - boolean whether the middleware should serve the asset files.  Usualy set this to `true` in development, `false` in production\n- `assetMapLocation` - path to the `map.json` generated by the command-line `asset-smasher` util.  This allows the helper methods to determine what the hashed file names were\n\nThe middleware exposes two helpers to your views:\n\n- `js_asset(logicalPath)` - Render a `<script>` tag for the specified JS asset. When `serve` is true, this will \"explode\" manifests and write out a separate `<script>` for each required file.  This makes debugging much easier.\n- `css_asset(logicalPath)` - Render a `<link>` tag for the specified CSS asset.  Same thing happens when `serve` is true.\n\n### Example\n\n    var assetSmasher = require('asset-smasher');\n\n**Middleware config (Dev)**\n\n    app.use(assetSmasher.middleware({\n      serve: true,\n      paths: [path.join(__dirname, 'assetDir1'), path.join(__dirname, 'assetDir2')],\n      prefix: '/assets',\n      outputTo: path.join(__dirname, 'tmp')\n    }));\n\n**Middleware config (Prod)**\n\n    app.use(assetSmasher.middleware({\n      serve: false,\n      prefix: '/assets',\n      assetMapLocation: path.join(__dirname, 'public/assets/map.json')\n    }));\n\n**View (ejs here, but could be others)**\n\n    <!DOCTYPE html>\n    <html>\n    <head>\n      <title>Test</title>\n      <%- css_asset('application.css') %>\n      <%- js_asset('application.js') %>\n    </head>\n    <body>\n      This is a test\n    </body>\n    </html>\n\n## <a name=\"programmatic-interface\"></a> Using via Programmatic Interface\n\nYou can invoke Asset Smasher programmatically by `require`ing it.  You can also plug in additional transformers this way.\n\nThe `Smasher` object has the following methods:\n\n - `compileAssets(cb)` - Find and compile all the assets.\n - `compileSingleAsset(assetFilePath, cb)` - Compile a single asset (assetFilePath is the actual path to the file, not a logical path)\n - `findAssets(cb)` - Find, but don't compile the assets.  Good for determining dependency graph without compiling.\n - `getAssetByLogicalPath(logicalPath)` - Get information about an asset by its logical path.  Only call this after finding/compiling assets.\n - `getHashedFileMapping()` - When `hash` is true, this returns a mapping of logical path to \"hashed\" logical path.  This object is what the command-line tool outputs to `map.json`. Only call this after finding/compiling assets.\n - `getRequiredLogicalPathsFor(asset)` - Get the logical paths of the assets that should be merged into the specified asset (populated for `.mf` files). Only call this after finding/compiling assets.\n - `getProcessingOrderLogicalPaths()` - Get a list of the order in which assets should be processed in order to satisfy all dependencies. Only call this after finding/compiling assets.\n - `reset()` - Reset the asset metadata.\n\nThe `Asset` object returned by `getAssetByLogicalPath` has the following properties (and one method):\n\n - `logicalPath` - The logical path\n - `hashedPath` - If `hash` is true, the hashed filename path, otherwise the same as `logicalPath`\n - `assetFilePath` - The full path to the actual source asset\n - `compiled` - Whether the asset has been compiled\n - `compiledAssetFilePath` - The full path to the compiled asset file\n - `reset()` - Set the asset back to its before-compile state (clear out contents, set name back to pre-transform name)\n\n**Example**\n\n    var assetSmasher = require('asset-smasher');\n    var Smasher = assetSmasher.Smasher;\n\n    // Plug in a custom transformer\n    assetSmasher.transforms['MyAwesomeFormat'] = require('myAwesomeFormatTransformer');\n\n    var sm = new Smasher({\n      paths:['/path/one', '/path/two'],\n      only:['**/*.{jpg,gif,png}', 'application.js.mf', 'application.css.mf'],\n      prefix:'/assets',\n      compress:true,\n      hash:true,\n      hashVersion:'1.0',\n      gzip:true,\n      outputTo:__dirname + '/public/assets',\n      helpers:{\n       my: 'helper',\n       another: 'helper'\n      }\n    });\n    sm.compileAssets(function(err) {\n      if(err) {\n        console.log('An error occurred', err);\n      } else {\n        console.log('Compilation done!');\n      }\n    });\n\n## <a name=\"transformer-notes\"></a> Transformer Notes\n\n### <a name=\"tn-less\"></a> LESS\n\n- When the `compress` option is true, the compression is done directly via the `less` compiler\n- Any `@include` paths are *relative to the path that the file is in*.\n- Any `@include`d files will *not* be processed individually by Asset Smasher (i.e. you can't `@include` a LESS file that is preprocessed by ejs)\n\n### <a name=\"tn-ejs\"></a> ejs\n\n- Any registered helpers will be exposed as global variables to the `ejs` transform.\n- The built-in `asset_paths` helper can be used here.\n\n### <a name=\"tn-dust-hbs\"></a> dust and Handlebars\n\n- The name of the template will be the template's \"logical path\" (minus the asset path it is in), minus the `.js.dust` or `.js.hbs` file extension.\n    - E.g. `/my/templates/test.js.dust`'s template name will be `test` (assuming `/my/templates` is the asset path)\n","_id":"asset-smasher@0.1.3","dist":{"shasum":"89d44abe8b05f5c7a4b56cd170915ad82185f697","tarball":"http://registry.npmjs.org/asset-smasher/-/asset-smasher-0.1.3.tgz"},"maintainers":[{"name":"jriecken","email":"jriecken@gmail.com"}]},"0.1.4":{"name":"asset-smasher","description":"Asset pre-processor, merger, and compressor.","version":"0.1.4","author":{"name":"Jim Riecken","email":"jriecken@gmail.com"},"keywords":["asset","compress","merge","preprocess"],"license":{"type":"MIT","url":"http://github.com/jriecken/asset-smasher/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/jriecken/asset-smasher.git"},"bugs":{"url":"http://github.com/jriecken/asset-smasher/issues"},"main":"./lib/asset-smasher.js","bin":{"asset-smasher":"./bin/asset-smasher"},"dependencies":{"async":"0.1.22","commander":"0.6.1","glob":"3.1.10","mkdirp":"0.3.3","minimatch":"0.2.5","uglify-js":"1.3.2","underscore":"1.3.3"},"optionalDependencies":{},"devDependencies":{},"engines":{"node":">= 0.6.0"},"readme":"# Asset Smasher\n\nAsset pre-processor, merger, and compressor for Node.js\n\n- [Structuring Your Assets](#structure-assets)\n    - [Manifest Files](#manifest-files)\n- [Using via Command Line](#command-line)\n    - [Helpers](#cli-helpers)\n    - [Plugins](#cli-plugins)\n- [Using via Express Middleware](#express-middleware)\n- [Using via Programmatic Interface](#programmatic-interface)\n- [Transformer Notes](#transformer-notes)\n    - [LESS](#tn-less)\n    - [ejs](#tn-ejs)\n    - [dust and Handlebars](#tn-dust-hbs)\n\n## Overview\n\nAsset Smasher is a command-line tool, express middleware, and programmatic interface for:\n\n- Pre-processing and transforming files down to plain JavaScript and CSS.\n    - `.coffee` - Compile CoffeeScript into JavaScript\n    - `.ejs` - Run a file through EJS (e.g. to populate configuration parameters into a JavaScript file)\n    - `.less` - Compile Less into CSS\n    - `.hbs` - Precompile Handlebars templates into JavaScript files that register them with `Handlebars.templates`.\n    - `.dust` - Precompile Dust templates into JavaScript files that register them for use with `dust.render`.\n    - Processors can be chained together.  E.g `test.js.hbs.ejs` (run Handlebars template through EJS, then compile it)\n    - Additional processors can be plugged in.\n- Merging files together using Manifest files (`.mf`) with dependency management directives similar to Sprockets.\n    - `require` - Require a single file\n    - `require_dir` - Require all the files in a specific directory\n    - `require_tree` - Require all the files in a specific directory (and subdirectories)\n- Compressing, gzipping, and generating hashed file names.\n    - Compress JavaScript files with `uglify-js`\n    - Compress LESS during LESS preprocessing\n    - Generate Gzipped versions of files\n    - Include a MD5 hash of the file's contents in the file name. `myAsset.js` -> `myAsset-c89cba7b7df028e65cb01d86f4d27077.js`\n        - `asset_path` helper that can be used to reference the hashed name.\n\nIt's released under the [MIT](http://en.wikipedia.org/wiki/MIT_License) license.\n\n## <a name=\"structure-assets\"></a> Structuring Your Assets\n\nAsset Smasher has the concept of \"asset paths\".  These are locations in which your asset files will be located, and from which any relative asset paths will be rooted to.\n\nThe simplest structure has one asset path.\n\nE.g.\n\n    Asset Paths\n    -----------\n     - app\n\n    File Structure\n    --------------\n    app/\n      js/\n      css/\n      images/\n\nA more complicated structure might be\n\n    Asset Paths\n    -----------\n     - app\n     - lib\n     - vendor\n\n    File Structure\n    --------------\n    app/\n      js/\n      css/\n      images/\n    lib/\n      js/\n      css/\n      images/\n    vendor/\n      js/\n      css/\n      images/\n\nBoth of these examples will result in a compiled structure of\n\n    js/\n    css/\n    images/\n\n### <a name=\"manifest-files\"></a> Manifest Files\n\nManifest (`.mf`) files are used to merge many assets into a single resulting file. The file should be named with the resulting file type before the `.mf` extension (e.g. `manifest.css.mf` or `manifest.js.mf`. *Manifest files can `require` other manifest files*\n\nA simple manifest file might look like\n\n    # A comment here\n    require \"./one.js\"\n    require_dir \"./subdir1\"\n    #\n    # Another comment\n    require_tree \"./subdir2\"\n\n**Directives:**\n\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" width=\"100%\">\n <thead>\n  <tr><th width=\"15%\">Directive</th><th width=\"85%\">Description</th></tr>\n </thead>\n <tbody>\n  <tr>\n    <td><code>require \"[path]\"</code></td>\n    <td>\n      <strong>Include a single file</strong>\n      <ul>\n       <li>\n         If the path starts with <code>\"/\"</code>, <code>\"../\"</code>, or <code>\"./\"</code>, process and include the specified file.  The file <em>must</em> be\n         inside one of the configured asset paths.\n       </li>\n       <li>\n         If the path does not start with <code>\"/\"</code>, <code>\"../\"</code>, or <code>\"./\"</code>, the file will be searched for in all of the configured\n         asset paths.  E.g. if there are asset paths <code>one</code> and <code>two</code> defined, <code>require \"js/test.js\"</code>\n         will look for <code>one/js/test.js</code> and then <code>two/js/test.js</code> stopping when it finds a matching file.\n       </li>\n       <li>\n         The filename part of the path does not have to include the whole extension.  E.g <code>require \"test\"</code>\n         finds the first file that matches the name in the asset paths (for example <code>test.js.ejs</code>)\n       </li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td><code>require_dir \"[path]\"</code></td>\n    <td>\n      <strong>Include all the files in a directory</strong>\n      <ul>\n       <li>\n         The path must be absolute, or relative to the current directory.  E.g. you can do <code>require_dir \"../some/other/dir\"</code>\n         but not <code>require_dir \"somedir\"</code>\n       </li>\n       <li>\n         If using absolute paths, or <code>\"..\"</code> in your paths, the resulting directory needs to be inside one of the configured asset paths.\n       </li>\n       <li>\n         Make sure the directory only contains assets of the type you want.  E.g. for <code>myManifest.js.mf</code>, the dir required had better\n         only contain javascript files, or else bad things will happen.\n       </li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td><code>require_tree \"[path]\"</code></td>\n    <td>\n      <strong>Include the files in a directory recursively</strong>\n      <ul>\n        <li>The rules for <code>require_tree</code> are the same as the rules for <code>require_dir</code></li>\n      </ul>\n    </td>\n  </tr>\n </tbody>\n</table>\n\n## <a name=\"command-line\"></a> Using via Command-Line\n\nUse `npm install -g asset-smasher` to install the `asset-smasher` command-line tool globally.\n\n      asset-smasher --help\n\n        Usage: asset-smasher [options] <output dir>\n\n        Options:\n\n          -h, --help               output usage information\n          -V, --version            output the version number\n          --compress               compress/minify the generated files\n          --hash                   generate versions of the files with md5 hashes in the name\n          --gzip                   generate gzipped versions of the compiled files\n          --hashVersion <version>  invalidate all assets without changing file contents [1.0]\n          --only <pattern,...>     only process the files matching these glob patterns (relative to any of the paths) [**/*]\n          --paths <path,...>       list of paths to look for assets [.]\n          --prefix <prefix>        prefix to append to logical paths when constructing urls. use if output dir is not served from the root of your web app []\n          --helpers <js_file>      a .js module of helper functions require()s to expose to transforms []\n          --plugins <js_file>      a .js plugin module []\n\n        If --only is not specified, *all* files in the --paths will be processed.\n\n        Examples:\n\n          Compile all assets in the current directory to /home/me/compiledAssets\n\n            $ asset-smasher /home/me/compiledAssets\n\n          Something similar to what the Rails asset pipeline does by default\n\n            $ asset-smasher --compress --hash --gzip --prefix=/assets \\\n                --paths=./js,./css,./images \\\n                --only **/*.{jpg,gif,png},application.js.mf,application.css.mf ./public/assets\n\n          Compile assets, providing some custom helpers to the transformation\n\n            $ asset-smasher --helpers helpers.js output\n\n### <a name=\"cli-helpers\"></a> Helpers\n\nThere is a built-in `asset_path` helper that can be used to get the \"real\" (i.e. with hashed file name) path of an asset.  E.g. `asset_path('css/myFile.css')` might return `'/assets/css/myFile-c89cba7b7df028e65cb01d86f4d27077.css`.\n\nSome transformers (e.g. the `.ejs` one) take in a set of local variables that they can use during transformation. You can pass in the path to a JavaScript module whose exports will be included in this set of variables.\n\nYou can use this, for example, to set configuration parameters in your JS files:\n\n**helper.js**\n\n    exports.serviceUrl = 'http://my.service/';\n\n**config.js.ejs**\n\n    //...\n    var serviceUrl = '<%= serviceUrl %>';\n    var cssLocation = '<%= asset_path('css/myFile.css') %>';\n    //...\n\n**Execution**\n\n    $ asset-smasher --helpers helper.js --only config.js.ejs,css/myFile.css .\n    $ cat config.js\n    var serviceUrl = 'http://my.service/';\n    var cssLocation = '/assets/css/myFile-c89cba7b7df028e65cb01d86f4d27077.css';\n\n\n### <a name=\"cli-plugins\"></a> Plugins\n\nIf there's a type of file you want to pre-process that is not natively supported by Asset Smasher, you can add it using a plugin file.\n\n*TODO: How to add additional transformers via a plugin file.*\n\n## <a name=\"express-middleware\"></a> Using via Express Middleware\n\nAsset smasher exposes an `express` middleware that can:\n\n- Serve your assets un-merged/mangled in development mode.\n- Serve precompiled assets (with hashed file names) in production mode.\n\nThe middleware takes in the same arguments as the `Smasher` constructor, with a few extras:\n\n- `serve` - boolean whether the middleware should serve the asset files.  Usualy set this to `true` in development, `false` in production\n- `assetMapLocation` - path to the `map.json` generated by the command-line `asset-smasher` util.  This allows the helper methods to determine what the hashed file names were\n\nThe middleware exposes two helpers to your views:\n\n- `js_asset(logicalPath)` - Render a `<script>` tag for the specified JS asset. When `serve` is true, this will \"explode\" manifests and write out a separate `<script>` for each required file.  This makes debugging much easier.\n- `css_asset(logicalPath)` - Render a `<link>` tag for the specified CSS asset.  Same thing happens when `serve` is true as with `js_asset`.\n- `raw_asset(logicalPath)` - Return the path to the asset.\n\n### Example\n\n    var assetSmasher = require('asset-smasher');\n\n**Middleware config (Dev)**\n\n    app.use(assetSmasher.middleware({\n      serve: true,\n      paths: [path.join(__dirname, 'assetDir1'), path.join(__dirname, 'assetDir2')],\n      prefix: '/assets',\n      outputTo: path.join(__dirname, 'tmp')\n    }));\n\n**Middleware config (Prod)**\n\n    app.use(assetSmasher.middleware({\n      serve: false,\n      prefix: '/assets',\n      assetMapLocation: path.join(__dirname, 'public/assets/map.json')\n    }));\n\n**View (ejs here, but could be others)**\n\n    <!DOCTYPE html>\n    <html>\n    <head>\n      <title>Test</title>\n      <%- css_asset('application.css') %>\n      <%- js_asset('application.js') %>\n    </head>\n    <body>\n      This is a test\n    </body>\n    </html>\n\n## <a name=\"programmatic-interface\"></a> Using via Programmatic Interface\n\nYou can invoke Asset Smasher programmatically by `require`ing it.  You can also plug in additional transformers this way.\n\nThe `Smasher` object has the following methods:\n\n - `compileAssets(cb)` - Find and compile all the assets.\n - `compileSingleAsset(assetFilePath, cb)` - Compile a single asset (assetFilePath is the actual path to the file, not a logical path)\n - `findAssets(cb)` - Find, but don't compile the assets.  Good for determining dependency graph without compiling.\n - `getAssetByLogicalPath(logicalPath)` - Get information about an asset by its logical path.  Only call this after finding/compiling assets.\n - `getHashedFileMapping()` - When `hash` is true, this returns a mapping of logical path to \"hashed\" logical path.  This object is what the command-line tool outputs to `map.json`. Only call this after finding/compiling assets.\n - `getRequiredLogicalPathsFor(asset)` - Get the logical paths of the assets that should be merged into the specified asset (populated for `.mf` files). Only call this after finding/compiling assets.\n - `getProcessingOrderLogicalPaths()` - Get a list of the order in which assets should be processed in order to satisfy all dependencies. Only call this after finding/compiling assets.\n - `reset()` - Reset the asset metadata.\n\nThe `Asset` object returned by `getAssetByLogicalPath` has the following properties (and one method):\n\n - `logicalPath` - The logical path\n - `hashedPath` - If `hash` is true, the hashed filename path, otherwise the same as `logicalPath`\n - `assetFilePath` - The full path to the actual source asset\n - `compiled` - Whether the asset has been compiled\n - `compiledAssetFilePath` - The full path to the compiled asset file\n - `reset()` - Set the asset back to its before-compile state (clear out contents, set name back to pre-transform name)\n\n**Example**\n\n    var assetSmasher = require('asset-smasher');\n    var Smasher = assetSmasher.Smasher;\n\n    // Plug in a custom transformer\n    assetSmasher.transforms['MyAwesomeFormat'] = require('myAwesomeFormatTransformer');\n\n    var sm = new Smasher({\n      paths:['/path/one', '/path/two'],\n      only:['**/*.{jpg,gif,png}', 'application.js.mf', 'application.css.mf'],\n      prefix:'/assets',\n      compress:true,\n      hash:true,\n      hashVersion:'1.0',\n      gzip:true,\n      outputTo:__dirname + '/public/assets',\n      helpers:{\n       my: 'helper',\n       another: 'helper'\n      }\n    });\n    sm.compileAssets(function(err) {\n      if(err) {\n        console.log('An error occurred', err);\n      } else {\n        console.log('Compilation done!');\n      }\n    });\n\n## <a name=\"transformer-notes\"></a> Transformer Notes\n\n### <a name=\"tn-less\"></a> LESS\n\n- When the `compress` option is true, the compression is done directly via the `less` compiler\n- Any `@include` paths are *relative to the path that the file is in*.\n- Any `@include`d files will *not* be processed individually by Asset Smasher (i.e. you can't `@include` a LESS file that is preprocessed by ejs)\n\n### <a name=\"tn-ejs\"></a> ejs\n\n- Any registered helpers will be exposed as global variables to the `ejs` transform.\n- The built-in `asset_paths` helper can be used here.\n\n### <a name=\"tn-dust-hbs\"></a> dust and Handlebars\n\n- The name of the template will be the template's \"logical path\" (minus the asset path it is in), minus the `.js.dust` or `.js.hbs` file extension.\n    - E.g. `/my/templates/test.js.dust`'s template name will be `test` (assuming `/my/templates` is the asset path)\n","_id":"asset-smasher@0.1.4","dist":{"shasum":"c1d0364be7d903ff0e5d614fe2896ca24f7c00bb","tarball":"http://registry.npmjs.org/asset-smasher/-/asset-smasher-0.1.4.tgz"},"maintainers":[{"name":"jriecken","email":"jriecken@gmail.com"}]}},"readme":"# Asset Smasher\n\nAsset pre-processor, merger, and compressor for Node.js\n\n- [Structuring Your Assets](#structure-assets)\n    - [Manifest Files](#manifest-files)\n- [Using via Command Line](#command-line)\n    - [Helpers](#cli-helpers)\n    - [Plugins](#cli-plugins)\n- [Using via Express Middleware](#express-middleware)\n- [Using via Programmatic Interface](#programmatic-interface)\n- [Transformer Notes](#transformer-notes)\n    - [LESS](#tn-less)\n    - [ejs](#tn-ejs)\n    - [dust and Handlebars](#tn-dust-hbs)\n\n## Overview\n\nAsset Smasher is a command-line tool, express middleware, and programmatic interface for:\n\n- Pre-processing and transforming files down to plain JavaScript and CSS.\n    - `.coffee` - Compile CoffeeScript into JavaScript\n    - `.ejs` - Run a file through EJS (e.g. to populate configuration parameters into a JavaScript file)\n    - `.less` - Compile Less into CSS\n    - `.hbs` - Precompile Handlebars templates into JavaScript files that register them with `Handlebars.templates`.\n    - `.dust` - Precompile Dust templates into JavaScript files that register them for use with `dust.render`.\n    - Processors can be chained together.  E.g `test.js.hbs.ejs` (run Handlebars template through EJS, then compile it)\n    - Additional processors can be plugged in.\n- Merging files together using Manifest files (`.mf`) with dependency management directives similar to Sprockets.\n    - `require` - Require a single file\n    - `require_dir` - Require all the files in a specific directory\n    - `require_tree` - Require all the files in a specific directory (and subdirectories)\n- Compressing, gzipping, and generating hashed file names.\n    - Compress JavaScript files with `uglify-js`\n    - Compress LESS during LESS preprocessing\n    - Generate Gzipped versions of files\n    - Include a MD5 hash of the file's contents in the file name. `myAsset.js` -> `myAsset-c89cba7b7df028e65cb01d86f4d27077.js`\n        - `asset_path` helper that can be used to reference the hashed name.\n\nIt's released under the [MIT](http://en.wikipedia.org/wiki/MIT_License) license.\n\n## <a name=\"structure-assets\"></a> Structuring Your Assets\n\nAsset Smasher has the concept of \"asset paths\".  These are locations in which your asset files will be located, and from which any relative asset paths will be rooted to.\n\nThe simplest structure has one asset path.\n\nE.g.\n\n    Asset Paths\n    -----------\n     - app\n\n    File Structure\n    --------------\n    app/\n      js/\n      css/\n      images/\n\nA more complicated structure might be\n\n    Asset Paths\n    -----------\n     - app\n     - lib\n     - vendor\n\n    File Structure\n    --------------\n    app/\n      js/\n      css/\n      images/\n    lib/\n      js/\n      css/\n      images/\n    vendor/\n      js/\n      css/\n      images/\n\nBoth of these examples will result in a compiled structure of\n\n    js/\n    css/\n    images/\n\n### <a name=\"manifest-files\"></a> Manifest Files\n\nManifest (`.mf`) files are used to merge many assets into a single resulting file. The file should be named with the resulting file type before the `.mf` extension (e.g. `manifest.css.mf` or `manifest.js.mf`. *Manifest files can `require` other manifest files*\n\nA simple manifest file might look like\n\n    # A comment here\n    require \"./one.js\"\n    require_dir \"./subdir1\"\n    #\n    # Another comment\n    require_tree \"./subdir2\"\n\n**Directives:**\n\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" width=\"100%\">\n <thead>\n  <tr><th width=\"15%\">Directive</th><th width=\"85%\">Description</th></tr>\n </thead>\n <tbody>\n  <tr>\n    <td><code>require \"[path]\"</code></td>\n    <td>\n      <strong>Include a single file</strong>\n      <ul>\n       <li>\n         If the path starts with <code>\"/\"</code>, <code>\"../\"</code>, or <code>\"./\"</code>, process and include the specified file.  The file <em>must</em> be\n         inside one of the configured asset paths.\n       </li>\n       <li>\n         If the path does not start with <code>\"/\"</code>, <code>\"../\"</code>, or <code>\"./\"</code>, the file will be searched for in all of the configured\n         asset paths.  E.g. if there are asset paths <code>one</code> and <code>two</code> defined, <code>require \"js/test.js\"</code>\n         will look for <code>one/js/test.js</code> and then <code>two/js/test.js</code> stopping when it finds a matching file.\n       </li>\n       <li>\n         The filename part of the path does not have to include the whole extension.  E.g <code>require \"test\"</code>\n         finds the first file that matches the name in the asset paths (for example <code>test.js.ejs</code>)\n       </li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td><code>require_dir \"[path]\"</code></td>\n    <td>\n      <strong>Include all the files in a directory</strong>\n      <ul>\n       <li>\n         The path must be absolute, or relative to the current directory.  E.g. you can do <code>require_dir \"../some/other/dir\"</code>\n         but not <code>require_dir \"somedir\"</code>\n       </li>\n       <li>\n         If using absolute paths, or <code>\"..\"</code> in your paths, the resulting directory needs to be inside one of the configured asset paths.\n       </li>\n       <li>\n         Make sure the directory only contains assets of the type you want.  E.g. for <code>myManifest.js.mf</code>, the dir required had better\n         only contain javascript files, or else bad things will happen.\n       </li>\n      </ul>\n    </td>\n  </tr>\n  <tr>\n    <td><code>require_tree \"[path]\"</code></td>\n    <td>\n      <strong>Include the files in a directory recursively</strong>\n      <ul>\n        <li>The rules for <code>require_tree</code> are the same as the rules for <code>require_dir</code></li>\n      </ul>\n    </td>\n  </tr>\n </tbody>\n</table>\n\n## <a name=\"command-line\"></a> Using via Command-Line\n\nUse `npm install -g asset-smasher` to install the `asset-smasher` command-line tool globally.\n\n      asset-smasher --help\n\n        Usage: asset-smasher [options] <output dir>\n\n        Options:\n\n          -h, --help               output usage information\n          -V, --version            output the version number\n          --compress               compress/minify the generated files\n          --hash                   generate versions of the files with md5 hashes in the name\n          --gzip                   generate gzipped versions of the compiled files\n          --hashVersion <version>  invalidate all assets without changing file contents [1.0]\n          --only <pattern,...>     only process the files matching these glob patterns (relative to any of the paths) [**/*]\n          --paths <path,...>       list of paths to look for assets [.]\n          --prefix <prefix>        prefix to append to logical paths when constructing urls. use if output dir is not served from the root of your web app []\n          --helpers <js_file>      a .js module of helper functions require()s to expose to transforms []\n          --plugins <js_file>      a .js plugin module []\n\n        If --only is not specified, *all* files in the --paths will be processed.\n\n        Examples:\n\n          Compile all assets in the current directory to /home/me/compiledAssets\n\n            $ asset-smasher /home/me/compiledAssets\n\n          Something similar to what the Rails asset pipeline does by default\n\n            $ asset-smasher --compress --hash --gzip --prefix=/assets \\\n                --paths=./js,./css,./images \\\n                --only **/*.{jpg,gif,png},application.js.mf,application.css.mf ./public/assets\n\n          Compile assets, providing some custom helpers to the transformation\n\n            $ asset-smasher --helpers helpers.js output\n\n### <a name=\"cli-helpers\"></a> Helpers\n\nThere is a built-in `asset_path` helper that can be used to get the \"real\" (i.e. with hashed file name) path of an asset.  E.g. `asset_path('css/myFile.css')` might return `'/assets/css/myFile-c89cba7b7df028e65cb01d86f4d27077.css`.\n\nSome transformers (e.g. the `.ejs` one) take in a set of local variables that they can use during transformation. You can pass in the path to a JavaScript module whose exports will be included in this set of variables.\n\nYou can use this, for example, to set configuration parameters in your JS files:\n\n**helper.js**\n\n    exports.serviceUrl = 'http://my.service/';\n\n**config.js.ejs**\n\n    //...\n    var serviceUrl = '<%= serviceUrl %>';\n    var cssLocation = '<%= asset_path('css/myFile.css') %>';\n    //...\n\n**Execution**\n\n    $ asset-smasher --helpers helper.js --only config.js.ejs,css/myFile.css .\n    $ cat config.js\n    var serviceUrl = 'http://my.service/';\n    var cssLocation = '/assets/css/myFile-c89cba7b7df028e65cb01d86f4d27077.css';\n\n\n### <a name=\"cli-plugins\"></a> Plugins\n\nIf there's a type of file you want to pre-process that is not natively supported by Asset Smasher, you can add it using a plugin file.\n\n*TODO: How to add additional transformers via a plugin file.*\n\n## <a name=\"express-middleware\"></a> Using via Express Middleware\n\nAsset smasher exposes an `express` middleware that can:\n\n- Serve your assets un-merged/mangled in development mode.\n- Serve precompiled assets (with hashed file names) in production mode.\n\nThe middleware takes in the same arguments as the `Smasher` constructor, with a few extras:\n\n- `serve` - boolean whether the middleware should serve the asset files.  Usualy set this to `true` in development, `false` in production\n- `assetMapLocation` - path to the `map.json` generated by the command-line `asset-smasher` util.  This allows the helper methods to determine what the hashed file names were\n\nThe middleware exposes two helpers to your views:\n\n- `js_asset(logicalPath)` - Render a `<script>` tag for the specified JS asset. When `serve` is true, this will \"explode\" manifests and write out a separate `<script>` for each required file.  This makes debugging much easier.\n- `css_asset(logicalPath)` - Render a `<link>` tag for the specified CSS asset.  Same thing happens when `serve` is true.\n\n### Example\n\n    var assetSmasher = require('asset-smasher');\n\n**Middleware config (Dev)**\n\n    app.use(assetSmasher.middleware({\n      serve: true,\n      paths: [path.join(__dirname, 'assetDir1'), path.join(__dirname, 'assetDir2')],\n      prefix: '/assets',\n      outputTo: path.join(__dirname, 'tmp')\n    }));\n\n**Middleware config (Prod)**\n\n    app.use(assetSmasher.middleware({\n      serve: false,\n      prefix: '/assets',\n      assetMapLocation: path.join(__dirname, 'public/assets/map.json')\n    }));\n\n**View (ejs here, but could be others)**\n\n    <!DOCTYPE html>\n    <html>\n    <head>\n      <title>Test</title>\n      <%- css_asset('application.css') %>\n      <%- js_asset('application.js') %>\n    </head>\n    <body>\n      This is a test\n    </body>\n    </html>\n\n## <a name=\"programmatic-interface\"></a> Using via Programmatic Interface\n\nYou can invoke Asset Smasher programmatically by `require`ing it.  You can also plug in additional transformers this way.\n\nThe `Smasher` object has the following methods:\n\n - `compileAssets(cb)` - Find and compile all the assets.\n - `compileSingleAsset(assetFilePath, cb)` - Compile a single asset (assetFilePath is the actual path to the file, not a logical path)\n - `findAssets(cb)` - Find, but don't compile the assets.  Good for determining dependency graph without compiling.\n - `getAssetByLogicalPath(logicalPath)` - Get information about an asset by its logical path.  Only call this after finding/compiling assets.\n - `getHashedFileMapping()` - When `hash` is true, this returns a mapping of logical path to \"hashed\" logical path.  This object is what the command-line tool outputs to `map.json`. Only call this after finding/compiling assets.\n - `getRequiredLogicalPathsFor(asset)` - Get the logical paths of the assets that should be merged into the specified asset (populated for `.mf` files). Only call this after finding/compiling assets.\n - `getProcessingOrderLogicalPaths()` - Get a list of the order in which assets should be processed in order to satisfy all dependencies. Only call this after finding/compiling assets.\n\nThe `Asset` object returned by `getAssetByLogicalPath` has the following properties:\n - `logicalPath` - The logical path\n - `hashedPath` - If `hash` is true, the hashed filename path, otherwise the same as `logicalPath`\n - `assetFilePath` - The full path to the actual source asset\n - `compiled` - Whether the asset has been compiled\n - `compiledAssetFilePath` - The full path to the compiled asset file\n\n**Example**\n\n    var assetSmasher = require('asset-smasher');\n    var Smasher = assetSmasher.Smasher;\n\n    // Plug in a custom transformer\n    assetSmasher.transforms['MyAwesomeFormat'] = require('myAwesomeFormatTransformer');\n\n    var sm = new Smasher({\n      paths:['/path/one', '/path/two'],\n      only:['**/*.{jpg,gif,png}', 'application.js.mf', 'application.css.mf'],\n      prefix:'/assets',\n      compress:true,\n      hash:true,\n      hashVersion:'1.0',\n      gzip:true,\n      outputTo:__dirname + '/public/assets',\n      helpers:{\n       my: 'helper',\n       another: 'helper'\n      }\n    });\n    sm.compileAssets(function(err) {\n      if(err) {\n        console.log('An error occurred', err);\n      } else {\n        console.log('Compilation done!');\n      }\n    });\n\n## <a name=\"transformer-notes\"></a> Transformer Notes\n\n### <a name=\"tn-less\"></a> LESS\n\n- When the `compress` option is true, the compression is done directly via the `less` compiler\n- Any `@include` paths are *relative to the path that the file is in*.\n- Any `@include`d files will *not* be processed individually by Asset Smasher (i.e. you can't `@include` a LESS file that is preprocessed by ejs)\n\n### <a name=\"tn-ejs\"></a> ejs\n\n- Any registered helpers will be exposed as global variables to the `ejs` transform.\n- The built-in `asset_paths` helper can be used here.\n\n### <a name=\"tn-dust-hbs\"></a> dust and Handlebars\n\n- The name of the template will be the template's \"logical path\" (minus the asset path it is in), minus the `.js.dust` or `.js.hbs` file extension.\n    - E.g. `/my/templates/test.js.dust`'s template name will be `test` (assuming `/my/templates` is the asset path)\n","maintainers":[{"name":"jriecken","email":"jriecken@gmail.com"}],"time":{"modified":"2012-07-05T20:18:19.904Z","created":"2012-06-11T22:49:29.267Z","0.1.0":"2012-06-11T22:49:31.423Z","0.1.1":"2012-06-12T21:17:18.023Z","0.1.2":"2012-06-27T18:45:07.706Z","0.1.3":"2012-06-28T15:15:24.432Z","0.1.4":"2012-07-05T20:18:19.904Z"},"author":{"name":"Jim Riecken","email":"jriecken@gmail.com"},"repository":{"type":"git","url":"git://github.com/jriecken/asset-smasher.git"},"_attachments":{"asset-smasher-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-wjJOOJyy+xsrzszHaXLrrw==","length":18202,"stub":true},"asset-smasher-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/b2PHdIEPL9V9TqxpcSsfg==","length":17999,"stub":true},"asset-smasher-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RoK2CY1ua955xHIFbUTsEw==","length":17896,"stub":true},"asset-smasher-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mQuzT/yy3Myv4wyeUlOIqw==","length":17820,"stub":true},"asset-smasher-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jZEDaJopg3/VFQQgq0umcQ==","length":17431,"stub":true}}}},
{"id":"asset-tag-helper","key":"asset-tag-helper","value":{"rev":"13-e7f024bc76b3c4a01a85a61b5036aae8"},"doc":{"_id":"asset-tag-helper","_rev":"13-e7f024bc76b3c4a01a85a61b5036aae8","name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","keywords":["rails","asset-tag-helper"],"homepage":"https://github.com/huetsch/asset-tag-helper","dependencies":{"cream":">= 0.0.9","tag-helper":">= 0.0.11"},"main":"./asset_tag_helper.js","version":"0.0.1","author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"license":"MIT","_npmUser":{"name":"markhuetsch","email":"markhuetsch@gmail.com"},"_id":"asset-tag-helper@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"cef3d69618099034a4ed87292c6860eb0e94ef2a","tarball":"http://registry.npmjs.org/asset-tag-helper/-/asset-tag-helper-0.0.1.tgz"},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}]},"0.0.2":{"name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","keywords":["rails","asset-tag-helper"],"homepage":"https://github.com/huetsch/asset-tag-helper","dependencies":{"cream":">= 0.0.9","tag-helper":">= 0.0.11"},"main":"./asset_tag_helper.js","version":"0.0.2","author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"license":"MIT","_npmUser":{"name":"markhuetsch","email":"markhuetsch@gmail.com"},"_id":"asset-tag-helper@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c7f057668afd805517578c59ee5046fce3bb9efd","tarball":"http://registry.npmjs.org/asset-tag-helper/-/asset-tag-helper-0.0.2.tgz"},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}]},"0.0.3":{"name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","keywords":["rails","asset-tag-helper"],"homepage":"https://github.com/huetsch/asset-tag-helper","dependencies":{"cream":">= 0.0.9","tag-helper":">= 0.0.11"},"main":"./asset_tag_helper.js","version":"0.0.3","author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"license":"MIT","_npmUser":{"name":"markhuetsch","email":"markhuetsch@gmail.com"},"_id":"asset-tag-helper@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ddb6c1bb858573c3cb3cc91f37fc582a93d62643","tarball":"http://registry.npmjs.org/asset-tag-helper/-/asset-tag-helper-0.0.3.tgz"},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}]},"0.0.4":{"name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","keywords":["rails","asset-tag-helper"],"homepage":"https://github.com/huetsch/asset-tag-helper","dependencies":{"cream":">= 0.0.9","tag-helper":">= 0.0.11"},"main":"./asset_tag_helper.js","version":"0.0.4","author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"license":"MIT","_npmUser":{"name":"markhuetsch","email":"markhuetsch@gmail.com"},"_id":"asset-tag-helper@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5384097dfba5f49706ea19791e3d1001fe20c190","tarball":"http://registry.npmjs.org/asset-tag-helper/-/asset-tag-helper-0.0.4.tgz"},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}]},"0.0.5":{"name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","keywords":["rails","asset-tag-helper"],"homepage":"https://github.com/huetsch/asset-tag-helper","dependencies":{"cream":">= 0.0.10","tag-helper":">= 0.0.11"},"main":"./asset_tag_helper.js","version":"0.0.5","author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"license":"MIT","_npmUser":{"name":"markhuetsch","email":"markhuetsch@gmail.com"},"_id":"asset-tag-helper@0.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fffe0bde8a94db80f02063d723ff46ef82fc6149","tarball":"http://registry.npmjs.org/asset-tag-helper/-/asset-tag-helper-0.0.5.tgz"},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}]},"0.0.6":{"name":"asset-tag-helper","description":"Rails' AssetTagHelper ported to Javascript","keywords":["rails","asset-tag-helper"],"homepage":"https://github.com/huetsch/asset-tag-helper","dependencies":{"cream":">= 0.0.11","tag-helper":">= 0.0.11"},"main":"./asset_tag_helper.js","version":"0.0.6","author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"license":"MIT","_npmUser":{"name":"markhuetsch","email":"markhuetsch@gmail.com"},"_id":"asset-tag-helper@0.0.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c7389198593965131c16f8fcf9c09931fdbca3af","tarball":"http://registry.npmjs.org/asset-tag-helper/-/asset-tag-helper-0.0.6.tgz"},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}]}},"readme":"","maintainers":[{"name":"markhuetsch","email":"markhuetsch@gmail.com"}],"time":{"modified":"2012-04-03T12:45:18.359Z","created":"2012-04-03T11:01:49.816Z","0.0.1":"2012-04-03T11:01:54.888Z","0.0.2":"2012-04-03T12:16:00.620Z","0.0.3":"2012-04-03T12:22:41.329Z","0.0.4":"2012-04-03T12:25:03.640Z","0.0.5":"2012-04-03T12:33:45.015Z","0.0.6":"2012-04-03T12:45:18.359Z"},"author":{"name":"Mark Huetsch","email":"markhuetsch@gmail.com"},"_attachments":{"asset-tag-helper-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+x+hCvvqFGjuly7X+S6VAQ==","length":2393,"stub":true},"asset-tag-helper-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-e1mzxlnjzbeRzFQXEoe0ng==","length":2353,"stub":true},"asset-tag-helper-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ATcZI8aZExuLnt1NIkZ1OA==","length":2351,"stub":true},"asset-tag-helper-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Nj4UNsBCd2jHSmPhj1ztTA==","length":2344,"stub":true},"asset-tag-helper-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-T3mOl6ITUf+Q8pzO/1bNlQ==","length":2339,"stub":true},"asset-tag-helper-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DXjGfv/h8rsrUxFjiyRCqQ==","length":1736,"stub":true}}}},
{"id":"asset_builder","key":"asset_builder","value":{"rev":"10-ce276a912823b1c824f0fdacc50ab2b9"},"doc":{"_id":"asset_builder","_rev":"10-ce276a912823b1c824f0fdacc50ab2b9","name":"asset_builder","description":"build, concatenate, and compress assets","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"asset_builder","version":"0.2.0","author":{"name":"Andrew Grieser","email":"agrieser@gmail.com"},"description":"build, concatenate, and compress assets","main":"./asset_builder.js","repository":{"type":"git","url":"git://github.com/agrieser/asset_builder.git"},"dependencies":{"async_collection_runner":"git://github.com/agrieser/async_collection_runner.git","fs_utils":"git://github.com/agrieser/fs_utils.git","underscore":"1.3.0","less":"1.2.0","handlebars":"1.0.4beta","uglify-js":"1.2.5","vows":"0.6.1"},"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"agrieser","email":"agrieser@gmail.com"},"_id":"asset_builder@0.2.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"063a1b5ffc76bbe123cf5e598c7f6912cd70c7a4","tarball":"http://registry.npmjs.org/asset_builder/-/asset_builder-0.2.0.tgz"},"maintainers":[{"name":"agrieser","email":"agrieser@gmail.com"}]},"0.2.1":{"name":"asset_builder","version":"0.2.1","author":{"name":"Andrew Grieser","email":"agrieser@gmail.com"},"description":"build, concatenate, and compress assets","main":"./asset_builder.js","repository":{"type":"git","url":"git://github.com/agrieser/asset_builder.git"},"dependencies":{"async_collection_runner":"git://github.com/agrieser/async_collection_runner.git","fs_utils":"git://github.com/agrieser/fs_utils.git","underscore":"1.3.3","less":"1.3.0","handlebars":"1.0.5beta","uglify-js":"1.2.5","vows":"0.6.1"},"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"agrieser","email":"agrieser@gmail.com"},"_id":"asset_builder@0.2.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4a7699bb336ab5db9a6a6fbfafcbe34adc1eeae1","tarball":"http://registry.npmjs.org/asset_builder/-/asset_builder-0.2.1.tgz"},"maintainers":[{"name":"agrieser","email":"agrieser@gmail.com"}]},"0.2.2":{"name":"asset_builder","version":"0.2.2","author":{"name":"Andrew Grieser","email":"agrieser@gmail.com"},"description":"build, concatenate, and compress assets","main":"./asset_builder.js","repository":{"type":"git","url":"git://github.com/agrieser/asset_builder.git"},"dependencies":{"async_runner":"git://github.com/agrieser/async_runner.git","fs_utils":"git://github.com/agrieser/fs_utils.git","underscore":"1.3.3","less":"1.3.0","handlebars":"1.0.5beta","uglify-js":"1.2.5","vows":"0.6.1"},"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"agrieser","email":"agrieser@gmail.com"},"_id":"asset_builder@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"dc6821abf4ee038eb25f6bc341dc9829be62ed44","tarball":"http://registry.npmjs.org/asset_builder/-/asset_builder-0.2.2.tgz"},"maintainers":[{"name":"agrieser","email":"agrieser@gmail.com"}]},"0.3.0":{"name":"asset_builder","version":"0.3.0","author":{"name":"Andrew Grieser","email":"agrieser@gmail.com"},"description":"build, concatenate, and compress assets","main":"./asset_builder.js","repository":{"type":"git","url":"https://github.com/agrieser/asset_builder.git"},"dependencies":{"async_runner":"git://github.com/agrieser/async_runner.git","fs_utils":"git://github.com/agrieser/fs_utils.git","underscore":"1.3.3","less":"1.3.0","handlebars":"1.0.5beta","uglify-js":"1.2.5","vows":"0.6.1"},"license":"MIT","engine":{"node":">=0.8"},"readme":"Asset Builder\n=============\nSimple middleware for compiling, concatenating, minifying, and caching assets with [Express](https://github.com/visionmedia/express/).\n\n* Supports javascript, css, less, and handlebar templates.\n* Extensible architecture allows support for anything that can be compiled to javascript or css.\n* Compiles on demand, with no need to precompile before deploying.\n* Caches like a boss.\n\n\nInstallation\n------------\n\n    npm install asset_builder\n\nor add it ot your _package.json_ file:\n\n    {\n      \"dependencies\": {\n        \"asset_builder\":           \"0.2\"\n      },\n    }\n\n\nLets Get To It\n--------------\nBasic example:\n\n_app.js_\n\n    var express   = require(\"express\");\n    assetbuilder = require(\"asset_builder\");\n\n    var app = express.createServer();\n    app.use(assetbuilder.middleware);\n    app.use(express.static(path.join(__dirname, \"public\")));\n    app.listen(8000);\n\n\n_app/assets/application.js.json_\n\n    {\n      \"files\": [\n        \"javascripts/lib/boot.js\",\n        \"javascripts/lib\",\n        \"javascripts/\"\n      ]\n    }\n\nLink to assets in the view using the provided `stylesheetUrl` and `javascriptUrl` helpers, and it will concatenate (in order):\n\n* The file _app/assets/javascripts/lib/boot.js_\n* All javascript files under _app/assets/javascripts/lib/_ (except the previously included boot.js)\n* All javascript files under _app/assets/javascripts/_ (except any files already included)\n\nServe stylesheets too (css or less):\n\n_app/assets/application.css.json_\n\n    {\n      \"files\": [\n        \"stylesheets/normalize.css\",\n        \"stylesheets/base.less\",\n        \"stylesheets/\"\n      ]\n    }\n\n\nBreaking It Down\n----------------\n### Registering The Middleware\n\n    var express   = require(\"express\");\n    assetbuilder = require(\"asset_builder\");\n\n    var app = express.createServer();\n    app.use(assetbuilder.middleware);\n\n### Configuring The Middleware\nConfiguration is only necessary to override the default settings.\nBelow is an example showing the default settings:\n\n    assetbuilder.configure({\n      src_root: path.join(\"app\", \"assets\"),\n      dst_root: path.join(\"public\", \"assets\"),\n      base_url: \"/assets\",\n      env: \"production\"\n    });\n\n### Registering View Helpers\nView helpers can be registered with express with the following call:\n\n    assetbuilder.registerViewHelpers(app);\n\nThe views now have access to two url helpers: `stylesheetUrl` and `javscriptUrl`\nAn example layout.jade file looks like this:\n\n    !!! 5\n    html\n      head\n        link(rel=\"stylesheet\", type=\"text/css\", href=stylesheetUrl)\n        script(type=\"text/javascript\", src=javascriptUrl)\n\n### Serving Assets\nIn order to serve javascript and css assets, static file middleware needs to be registered _after_ the asset builder.\n\n    app.use(assetbuilder.middleware);\n    app.use(express.static(path.join(__dirname, \"public\")));\n\n### Specify Asset Content\nAsset Builder looks for a json file describing the content of the asset to be built.\nBy default, it looks for _app/assets/application.js.json_ and _app/assets/application.css.json_\n\nExample: _application.js.json_\n\n    {\n      \"files\": [\n        \"javascripts/lib/boot.js\",\n        \"javascripts/lib\",\n        \"javascripts/\"\n      ]\n    }\n\nPaths are relative to the json file.\nIE: The above looks for _app/assets/javascripts/lib/boot.js_\n\n### Putting It All Together\nHere is an example of a typical express middleware stack:\n\n    var express      = require(\"express\");\n    var assetbuilder = require(\"asset_builder\");\n    var router       = require(\"./app/router\");\n\n    var app = express.createServer();\n    app.configure(function() {\n      this.use(express.errorHandler({\n        showStack: true,\n        dumpExceptions: true\n      }));\n      this.use(assetbuilder.middleware);\n      this.use(express.static(path.join(__dirname, \"public\")));\n      this.use(express.bodyParser());\n      this.use(express.methodOverride());\n      this.use(express.cookieParser());\n      this.use(express.session({ secret: \"keyboard cat\" }));\n      this.use(express.router(router));\n      this.set(\"views\", path.join(__dirname, \"app\", \"views\"));\n      this.set(\"view engine\", \"jade\");\n      this.set(\"view options\", {layout: false });\n    });\n\n    assetbuilder.registerViewHelpers(server);\n    assetbuilder.configure({\n      src_root: path.join(__dirname, \"app\", \"assets\"),\n      dst_root: path.join(__dirname, \"public\", \"assets\"),\n      base_url: \"/assets\",\n      env: \"production\"\n    });\n\n    server.listen(8000);\n\n\nOptions\n-------\nDon't like the default paths, or url's?\nNo problem.\n\nThe options shown below are the defaults:\n\n    var assetbuilder = require(\"asset_builder\");\n    assetbuilder.configure({\n      src_root: path.join(__dirname, \"app\", \"assets\"),\n      dst_root: path.join(__dirname, \"public\", \"assets\"),\n      base_url: \"/assets\",\n      env: \"development\"\n    });\n\n### src\\_root\nThis is the directory where Asset Builder will look for _application.js.json_ and _application.css.json_.\nFilenames within the json manifest files are resolved relative to this root.\n\n### dst\\_root\nThis is the directory where Asset Builder will write the generated asset files (_application.js_ and _application.css_).\nNote that the static file server must be able to serve files from this directory.\n\n### base\\_url\nThis is the leading portion of the url that will be used by both Asset Builder and the static file server.\nEx: `/assets/application.js`\n\nNote that this setting is tied to the `dst_root` setting.\nFiles written to `dst_root` need to be served by the static file server with a request to `base_url`.\n\n### env\nThe environment Asset Builder is running in.\n\nDefaults to \"development\", which performs no caching.\nWhen set to \"production\", caching is enabled.\n\n\nManifest Files\n--------------\nThe asset manifest is a json file named either _application.js.json_ or _application.css.json_.\nBy default, they are located in the _app/assets_ directory, see the options section to change their location.\nThe manifest files contain an array of filenames and directory names that will be used to build the asset.\n\nFiles are included in the order they are specified in the manifest.\nDirectories will recursively include all matching files (_js_ or _hbs_ for javascripts, _css_ or _less_ for stylesheets)\n\nNo file will be included twice, even if it matches multiple file or directory listings.\n\nIf certain files need to be included before others, specify those files first, ex:\n\n    {\n      \"files\": [\n        \"javascripts/lib/boot.js\",\n        \"javascripts/lib\",\n        \"javascripts/\"\n      ]\n    }\n\n\nPreprocessors\n-------------\nAsset Builder can only serve two types of assets: javascript and css.\nHowever, Asset Builder uses preprocessors to convert an input file into one of these types.\n\nTwo preprocessors are included (handlebars and less), and custom preprocessors can be registered dynamically.\n\n### Handlebars\n[Handlebar](http://handlebarsjs.com/) templates will be precompiled by Asset Builder if their path is included in the javascript manifest, and they have a `.hbs` file extension.\n\nPrecompiled templates will be available (in the browser) in a global hash called Handlebars.templates, with the filename as the key.\n\nFor example, a template named _foo.hbs_, would be stored at `Handlebars.templates.foo`\n\nExample template:\n\n    <h1>{{title}}</h1>\n\nFor details, see the [handlebars website](http://handlebarsjs.com/)\n\n### Less\n[Less](http://lesscss.org/) stylesheets will be compiled into css by Asset builder if their path is included in the stylesheet manifest, and they have a `.less` file extension.\n\n### Custom Preprocessors\nCustom preprocessors can be registered dynamically using the `registerPreprocessor` function.\n\nAn example of a javascript preprocessor that append a comment onto each file with the `.foo` extension:\n\n    var myPreprocessor = {\n      ext: \"foo\",\n      preprocessor: function(data, filepath, hollaback) {\n        var error = null;\n        var content = data + \"// Comment!\";\n        hollaback(error, content);\n      }\n    };\n    assetbuilder.registerPreprocessor(myPreprocessor);\n\nSee the wiki for more complicated examples, including Ember support.\n\n\nCaching, Cache-Busting, and Links\n---------------------------------\nThere are two kinds of caching performed:\n\n* Server side asset caching\n* Client side asset caching\n\n### Server Side Caching\nAssets that are built can be cached.\n\n* In development mode, assets are built on each request.\n* In production mode, assets are built on the first request, and served from cache for all subsequent requests.\n\n### Client Side Caching\nWhen an asset request is processed, response headers are set to maximize the chance of client caching.\n\nEach browser uses a set of heuristics to determine if files should be downloaded, or served from cache.\nAsset builder follows [Google's optimize caching](http://code.google.com/speed/page-speed/docs/caching.html) recommendations to maximize the chance of client caching.\n\nThere are three possible client actions:\n\n1. Makes a normal GET request and downloads the asset.\n1. Makes an `If-Modified-Since` request, and either downloads the asset or uses the cached version depending on response.\n1. Makes no requests at all, and uses the cached copy of the asset.\n\nClearly, option 3 is most desirable.\nIn order to maximize the chances of full caching, Asset Builder sets the following headers:\n\n* Sets the `Expires` header to be one year from now\n* Sets the `Last-Modified` header to be one month ago\n* Sets the `Cache-Control` header to `public` to enable caching of assets served over ssl\n\nExample asset response: (Made on January 22, 2012)\n\n    HTTP/1.1 200 OK\n    X-Powered-By: Express\n    Expires: Mon, 21 Jan 2013 14:50:31 GMT\n    Cache-Control: public\n    Last-Modified: Fri, 23 Dec 2011 04:50:31 GMT\n    Date: Sun, 22 Jan 2012 14:50:31 GMT\n    ETag: \"286234-1327243831000\"\n    Content-Type: application/javascript\n    Accept-Ranges: bytes\n    Content-Length: 286234\n    Connection: keep-alive\n\n\n### Cache Busting\nYou might be wondering: If the client unconditionally caches the file, how do I prevent stale assets from being used on the client?\n\nAsset Builder's link helpers generate unique links for the assets.\nFor example: `assets/application_b1010839e0914dc8cbbfd8d4aecf9a161db917be81a4f7c3317f141dcae700fe.js`\n\nWhen the file name of the asset changes, the client sees it as a new file and will no longer use any previously cached versions.\n\nIn development mode, the links generated by the link helpers are unique on each request.\n\nIn production mode, the links generated by the link helpers include a SHA256 hash of the asset, so they will only change when the asset changes.\n\n\nGzipping\n--------\nAn additional step to maximize performance is to compress (gzip) the contents of the assets.\n\nThis can be enabled several ways:\n\n* Use the [gzippo](https://github.com/tomgallacher/gzippo) npm package\n* [Configure Nginx](http://wiki.nginx.org/HttpGzipModule) to gzip requests matching asset url's\n\nSee the Options section on `base_url` and `dst_root` to serve assets separately from other static files.\n\n\nDevelopment vs Production\n-------------------------\n### Development Mode\nIn development mode, assets are generated for each request.\nAdditionally, the link helpers generate unique links for each request.\n\n### Production Mode\nIn production mode, assets are only built once, and served from cache thereafter.\nThe link helpers generate links based on the SHA256 hash of the asset content, so the links will only change when the content of the assets change.\n\n\nLicense\n-------\nMIT, see the LICENSE file.\n","_id":"asset_builder@0.3.0","dist":{"shasum":"018a47943c5a0e8b9eebc04f5c63b247c91cb2e6","tarball":"http://registry.npmjs.org/asset_builder/-/asset_builder-0.3.0.tgz"},"maintainers":[{"name":"agrieser","email":"agrieser@gmail.com"}]}},"readme":"Asset Builder\n=============\nSimple middleware for compiling, concatenating, minifying, and caching assets with [Express](https://github.com/visionmedia/express/).\n\n* Supports javascript, css, less, and handlebar templates.\n* Extensible architecture allows support for anything that can be compiled to javascript or css.\n* Compiles on demand, with no need to precompile before deploying.\n* Caches like a boss.\n\n\nLets Get To It\n--------------\nAdd it to your _package.json_ file:\n\n    {\n      \"name\": \"myproject\",\n      \"dependencies\": {\n        \"asset_builder\":           \"git://github.com/agrieser/asset_builder.git\",\n        \"express\":                 \"*\"\n      },\n    }\n\nBasic example:\n\n_app.js_\n\n    var express   = require(\"express\");\n    assetbuilder = require(\"asset_builder\");\n\n    var app = express.createServer();\n    app.use(assetbuilder.middleware);\n    app.use(express.static(path.join(__dirname, \"public\")));\n    app.listen(8000);\n\n\n_app/assets/application.js.json_\n\n    {\n      \"files\": [\n        \"javascripts/lib/boot.js\",\n        \"javascripts/lib\",\n        \"javascripts/\"\n      ]\n    }\n\nLink to assets in the view using the provided `stylesheetUrl` and `javascriptUrl` helpers, and it will concatenate (in order):\n\n* The file _app/assets/javascripts/lib/boot.js_\n* All javascript files under _app/assets/javascripts/lib/_ (except the previously included boot.js)\n* All javascript files under _app/assets/javascripts/_ (except any files already included)\n\nServe stylesheets too (css or less):\n\n_app/assets/application.css.json_\n\n    {\n      \"files\": [\n        \"stylesheets/normalize.css\",\n        \"stylesheets/base.less\",\n        \"stylesheets/\"\n      ]\n    }\n\n\nBreaking It Down\n----------------\n### Registering The Middleware\n\n    var express   = require(\"express\");\n    assetbuilder = require(\"asset_builder\");\n\n    var app = express.createServer();\n    app.use(assetbuilder.middleware);\n\n### Configuring The Middleware\nConfiguration is only necessary to override the default settings.\nBelow is an example showing the default settings:\n\n    assetbuilder.configure({\n      src_root: path.join(\"app\", \"assets\"),\n      dst_root: path.join(\"public\", \"assets\"),\n      base_url: \"/assets\",\n      env: \"production\"\n    });\n\n### Registering View Helpers\nView helpers can be registered with express with the following call:\n\n    assetbuilder.registerViewHelpers(app);\n\nThe views now have access to two url helpers: `stylesheetUrl` and `javscriptUrl`\nAn example layout.jade file looks like this:\n\n    !!! 5\n    html\n      head\n        link(rel=\"stylesheet\", type=\"text/css\", href=stylesheetUrl)\n        script(type=\"text/javascript\", src=javascriptUrl)\n\n### Serving Assets\nIn order to serve javascript and css assets, static file middleware needs to be registered _after_ the asset builder.\n\n    app.use(assetbuilder.middleware);\n    app.use(express.static(path.join(__dirname, \"public\")));\n\n### Specify Asset Content\nAsset Builder looks for a json file describing the content of the asset to be built.\nBy default, it looks for _app/assets/application.js.json_ and _app/assets/application.css.json_\n\nExample: _application.js.json_\n\n    {\n      \"files\": [\n        \"javascripts/lib/boot.js\",\n        \"javascripts/lib\",\n        \"javascripts/\"\n      ]\n    }\n\nPaths are relative to the json file.\nIE: The above looks for _app/assets/javascripts/lib/boot.js_\n\n### Putting It All Together\nHere is an example of a typical express middleware stack:\n\n    var express      = require(\"express\");\n    var assetbuilder = require(\"asset_builder\");\n    var router       = require(\"./app/router\");\n\n    var app = express.createServer();\n    app.configure(function() {\n      this.use(express.errorHandler({\n        showStack: true,\n        dumpExceptions: true\n      }));\n      this.use(assetbuilder.middleware);\n      this.use(express.static(path.join(__dirname, \"public\")));\n      this.use(express.bodyParser());\n      this.use(express.methodOverride());\n      this.use(express.cookieParser());\n      this.use(express.session({ secret: \"keyboard cat\" }));\n      this.use(express.router(router));\n      this.set(\"views\", path.join(__dirname, \"app\", \"views\"));\n      this.set(\"view engine\", \"jade\");\n      this.set(\"view options\", {layout: false });\n    });\n\n    assetbuilder.registerViewHelpers(server);\n    assetbuilder.configure({\n      src_root: path.join(__dirname, \"app\", \"assets\"),\n      dst_root: path.join(__dirname, \"public\", \"assets\"),\n      base_url: \"/assets\",\n      env: \"production\"\n    });\n\n    server.listen(8000);\n\n\nOptions\n-------\nDon't like the default paths, or url's?\nNo problem.\n\nThe options shown below are the defaults:\n\n    var assetbuilder = require(\"asset_builder\");\n    assetbuilder.configure({\n      src_root: path.join(__dirname, \"app\", \"assets\"),\n      dst_root: path.join(__dirname, \"public\", \"assets\"),\n      base_url: \"/assets\",\n      env: \"development\"\n    });\n\n### src\\_root\nThis is the directory where Asset Builder will look for _application.js.json_ and _application.css.json_.\nFilenames within the json manifest files are resolved relative to this root.\n\n### dst\\_root\nThis is the directory where Asset Builder will write the generated asset files (_application.js_ and _application.css_).\nNote that the static file server must be able to serve files from this directory.\n\n### base\\_url\nThis is the leading portion of the url that will be used by both Asset Builder and the static file server.\nEx: `/assets/application.js`\n\nNote that this setting is tied to the `dst_root` setting.\nFiles written to `dst_root` need to be served by the static file server with a request to `base_url`.\n\n### env\nThe environment Asset Builder is running in.\n\nDefaults to \"development\", which performs no caching.\nWhen set to \"production\", caching is enabled.\n\n\nManifest Files\n--------------\nThe asset manifest is a json file named either _application.js.json_ or _application.css.json_.\nBy default, they are located in the _app/assets_ directory, see the options section to change their location.\nThe manifest files contain an array of filenames and directory names that will be used to build the asset.\n\nFiles are included in the order they are specified in the manifest.\nDirectories will recursively include all matching files (_js_ or _hbs_ for javascripts, _css_ or _less_ for stylesheets)\n\nNo file will be included twice, even if it matches multiple file or directory listings.\n\nIf certain files need to be included before others, specify those files first, ex:\n\n    {\n      \"files\": [\n        \"javascripts/lib/boot.js\",\n        \"javascripts/lib\",\n        \"javascripts/\"\n      ]\n    }\n\n\nPreprocessors\n-------------\nAsset Builder can only serve two types of assets: javascript and css.\nHowever, Asset Builder uses preprocessors to convert an input file into one of these types.\n\nTwo preprocessors are included (handlebars and less), and custom preprocessors can be registered dynamically.\n\n### Handlebars\n[Handlebar](http://handlebarsjs.com/) templates will be precompiled by Asset Builder if their path is included in the javascript manifest, and they have a `.hbs` file extension.\n\nPrecompiled templates will be available (in the browser) in a global hash called Handlebars.templates, with the filename as the key.\n\nFor example, a template named _foo.hbs_, would be stored at `Handlebars.templates.foo`\n\nExample template:\n\n    <h1>{{title}}</h1>\n\nFor details, see the [handlebars website](http://handlebarsjs.com/)\n\n### Less\n[Less](http://lesscss.org/) stylesheets will be compiled into css by Asset builder if their path is included in the stylesheet manifest, and they have a `.less` file extension.\n\n### Custom Preprocessors\nCustom preprocessors can be registered dynamically using the `registerPreprocessor` function.\n\nAn example of a javascript preprocessor that append a comment onto each file with the `.foo` extension:\n\n    var myPreprocessor = {\n      ext: \"foo\",\n      preprocessor: function(data, filepath, hollaback) {\n        var error = null;\n        var content = data + \"// Comment!\";\n        hollaback(error, content);\n      }\n    };\n    assetbuilder.registerPreprocessor(myPreprocessor);\n\nSee the wiki for more complicated examples, including Ember support.\n\n\nCaching, Cache-Busting, and Links\n---------------------------------\nThere are two kinds of caching performed:\n\n* Server side asset caching\n* Client side asset caching\n\n### Server Side Caching\nAssets that are built can be cached.\n\n* In development mode, assets are built on each request.\n* In production mode, assets are built on the first request, and served from cache for all subsequent requests.\n\n### Client Side Caching\nWhen an asset request is processed, response headers are set to maximize the chance of client caching.\n\nEach browser uses a set of heuristics to determine if files should be downloaded, or served from cache.\nAsset builder follows [Google's optimize caching](http://code.google.com/speed/page-speed/docs/caching.html) recommendations to maximize the chance of client caching.\n\nThere are three possible client actions:\n\n1. Makes a normal GET request and downloads the asset.\n1. Makes an `If-Modified-Since` request, and either downloads the asset or uses the cached version depending on response.\n1. Makes no requests at all, and uses the cached copy of the asset.\n\nClearly, option 3 is most desirable.\nIn order to maximize the chances of full caching, Asset Builder sets the following headers:\n\n* Sets the `Expires` header to be one year from now\n* Sets the `Last-Modified` header to be one month ago\n* Sets the `Cache-Control` header to `public` to enable caching of assets served over ssl\n\nExample asset response: (Made on January 22, 2012)\n\n    HTTP/1.1 200 OK\n    X-Powered-By: Express\n    Expires: Mon, 21 Jan 2013 14:50:31 GMT\n    Cache-Control: public\n    Last-Modified: Fri, 23 Dec 2011 04:50:31 GMT\n    Date: Sun, 22 Jan 2012 14:50:31 GMT\n    ETag: \"286234-1327243831000\"\n    Content-Type: application/javascript\n    Accept-Ranges: bytes\n    Content-Length: 286234\n    Connection: keep-alive\n\n\n### Cache Busting\nYou might be wondering: If the client unconditionally caches the file, how do I prevent stale assets from being used on the client?\n\nAsset Builder's link helpers generate unique links for the assets.\nFor example: `assets/application_b1010839e0914dc8cbbfd8d4aecf9a161db917be81a4f7c3317f141dcae700fe.js`\n\nWhen the file name of the asset changes, the client sees it as a new file and will no longer use any previously cached versions.\n\nIn development mode, the links generated by the link helpers are unique on each request.\n\nIn production mode, the links generated by the link helpers include a SHA256 hash of the asset, so they will only change when the asset changes.\n\n\nGzipping\n--------\nAn additional step to maximize performance is to compress (gzip) the contents of the assets.\n\nThis can be enabled several ways:\n\n* Use the [gzippo](https://github.com/tomgallacher/gzippo) npm package\n* [Configure Nginx](http://wiki.nginx.org/HttpGzipModule) to gzip requests matching asset url's\n\nSee the Options section on `base_url` and `dst_root` to serve assets separately from other static files.\n\n\nDevelopment vs Production\n-------------------------\n### Development Mode\nIn development mode, assets are generated for each request.\nAdditionally, the link helpers generate unique links for each request.\n\n### Production Mode\nIn production mode, assets are only built once, and served from cache thereafter.\nThe link helpers generate links based on the SHA256 hash of the asset content, so the links will only change when the content of the assets change.\n\n\nLicense\n-------\nMIT, see the LICENSE file.\n","maintainers":[{"name":"agrieser","email":"agrieser@gmail.com"}],"time":{"modified":"2012-08-02T13:44:32.804Z","created":"2012-04-01T20:08:14.575Z","0.2.0":"2012-04-01T20:08:15.469Z","0.2.1":"2012-05-01T00:29:26.361Z","0.2.2":"2012-05-16T00:57:02.270Z","0.3.0":"2012-07-24T13:54:10.230Z"},"author":{"name":"Andrew Grieser","email":"agrieser@gmail.com"},"repository":{"type":"git","url":"https://github.com/agrieser/asset_builder.git"},"users":{"fgribreau":true},"_attachments":{"asset_builder-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-V3eI2my1WdZYrvbVABU7aA==","length":9813,"stub":true},"asset_builder-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-drNo705CL3kaUDDpVHjeXQ==","length":9781,"stub":true},"asset_builder-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9FHXwA5bLzXxV/ZI4pdoPQ==","length":9908,"stub":true},"asset_builder-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-74Cp6AMoIU2eD+3Js5digg==","length":10432,"stub":true}}}},
{"id":"assetgraph","key":"assetgraph","value":{"rev":"293-98a4d44d2689042cebcff57c5fa2dd73"},"doc":{"_id":"assetgraph","_rev":"293-98a4d44d2689042cebcff57c5fa2dd73","name":"assetgraph","dist-tags":{"latest":"0.4.42"},"versions":{"0.0.2":{"name":"assetgraph","version":"0.0.2","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=0.0.1","jsdom":">=0.2.0","underscore":">=1.1.3","step":">=0.0.3","optimist":">=0.1.8","cssmin":">=0.2.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN"},"_id":"assetgraph@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"09fdf36082f48f95254524ee3399c5df3f822ce8","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.2.tgz"}},"0.0.3":{"name":"assetgraph","version":"0.0.3","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=0.0.1","jsdom":">=0.2.0","underscore":">=1.1.3","step":">=0.0.3","optimist":">=0.1.8","cssmin":">=0.2.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN"},"_id":"assetgraph@0.0.3","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.6-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d5b4f44e02d50bea495eef62c76f9aed2b623d02","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.3.tgz"}},"0.0.4":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.4","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=0.0.1","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":">=0.1.8","cssmin":">=0.2.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib","bin":"./bin"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN"},"_id":"assetgraph@0.0.4","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.6-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fc99c7269a976952134a8e9cdc32d9dd8a9960d8","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.4.tgz"}},"0.0.5":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.5","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":">=0.1.8","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"1be57ca29bb07037d8230f48d179e7996c50731c","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.5.tgz"},"scripts":{}},"0.0.6":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.6","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"6e01ee7e0d851fa1ed44dee4562e1330e3d9c9b6","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.6.tgz"},"scripts":{}},"0.0.7":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.7","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"38d4cf9cfd83eb7938a70e90891a69b06a9748c1","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.7.tgz"},"scripts":{}},"0.0.8":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.8","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.2.6"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"ed50b6e4bf2863a4ff6e0ce3af9f2b21eabfd0d2","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.8.tgz"},"scripts":{}},"0.0.9":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.9","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.9","_engineSupported":false,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"6e204ef130f85107a226718a9364bb8b5caa5e18","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.9.tgz"},"scripts":{}},"0.0.10":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.10","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.10","_engineSupported":true,"_npmVersion":"1.0.7","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"339c755158a9684eb4ab68e542d70073229b930f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.10.tgz"},"scripts":{}},"0.0.11":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.11","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":">=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":">=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":">=0.3.0","request":">=1.2.0","glob":">=2.0.5","canvas":">=0.4.3","graphviz":">=0.0.3","bufferjs":">=0.2.1","iconv":">=1.0.0","seq":">=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.11","_engineSupported":true,"_npmVersion":"1.0.7","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"7e2b12e35c4b1eb4fffb6b0be1e936b5345e7be9","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.11.tgz"},"scripts":{}},"0.0.12":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.12","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.6","canvas":"=0.5.4","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":"=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18N":"./bin/refreshI18N"},"_id":"assetgraph@0.0.12","_engineSupported":true,"_npmVersion":"1.0.7","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"2adc16e6f573a509b0c52666e4b50448f8e62272","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.12.tgz"},"scripts":{}},"0.0.13":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.13","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.6","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":"=0.2.1","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_id":"assetgraph@0.0.13","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"2f0ffeaac1da54f4c2fceafa901d8d617d15c874","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.13.tgz"},"scripts":{}},"0.0.14":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.14","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_id":"assetgraph@0.0.14","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"6678388b0c0dc5b7750b7a7ba63f1c1de556df1c","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.14.tgz"},"scripts":{}},"0.0.15":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.15","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_id":"assetgraph@0.0.15","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"3138ddb767b7659835754cf385f77bb12dc397de","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.15.tgz"},"scripts":{}},"0.0.16":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.16","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","vows":">=0.5.6"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.0.16/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.0.16","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"9f83781df1de48140688b2906d4eedffbbf66b61","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.16.tgz"},"scripts":{}},"0.0.17":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.17","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","vows":">=0.5.6"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.0.17/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.0.17","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"e2d98f1214d950712f933c56d73f88336e940176","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.17.tgz"},"scripts":{}},"0.0.18":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.18","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","vows":">=0.5.6"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.0.18/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.0.18","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"c361c060ecc7bb6c27f7b82269b9ed76616cac55","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.18.tgz"},"scripts":{}},"0.0.19":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.0.19","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","canvas":"=0.6.0","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","vows":">=0.5.6"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.0.19/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.0.19","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"4dab179144dca578fdf3cf26c2e0279923348cc6","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.0.19.tgz"},"scripts":{}},"0.1.0":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.1.0","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.1.0","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"bcfdcac7c1217fd3287cb15b3550e07c4f7d27fe","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.1.1","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.1.1","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"5c8777b7b4116e98c8e2dd410d9b48cab00e95ca","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.1.2","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.1.2","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"79acf2df039bee77f540cb2c14971288a3226e31","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.1.3","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.1.3","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"b775a4c08920a431ce167864a7a069afe545b911","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.1.4","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.1.4","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"999674b42f8ff07fb1a429a3a4efb56ccf2e74e2","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.1.4.tgz"},"scripts":{}},"0.1.5":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.1.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"=1.9.5","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.1.5","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"0871b851c1dfb7ae330bf16a06e8008c472a827b","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.1.5.tgz"},"scripts":{}},"0.2.0":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"08009d94d13f876a656e0eb5a55dcd343350092d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.1","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"d7f8d4d709aef9b752f5ef1806c47e6e8edb280d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.1.tgz"},"scripts":{}},"0.2.2":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.2","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"456ee6440ba0cb511047fe3858b5ecd16e61bfed","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.2.tgz"},"scripts":{}},"0.2.3":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.3","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"355b1d322479ba09c2cf3b0f5e7c17070540110f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.3.tgz"},"scripts":{}},"0.2.4":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.4","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"3ad8e5249a3f5836e7da26858161d46cbbcf116c","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.4.tgz"},"scripts":{}},"0.2.5":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.5","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"11ee3b222cd2fae383cd127f51d6f11c7793625d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.5.tgz"},"scripts":{}},"0.2.6":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.6","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"80c1fa2e0613a037c409cab8e8b96a110b853235","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.6.tgz"}},"0.2.7":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.7","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"37e3a6379277a983a549bc63f9580a48fb1e730a","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.7.tgz"}},"0.2.8":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.8","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"716f2f37cad80fbac3f436327a3dd21dcb7b49a9","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.8.tgz"}},"0.2.9":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","cssom":">=0.2.0","jsdom":"~0.2.2"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.9","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"d26993bb9335fb139e45d13443fc7fa2cd509502","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.9.tgz"},"scripts":{}},"0.2.10":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.2.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.2.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.2.10","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"a1492765d7d05e98309ee089114b6780e158c517","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.2.10.tgz"}},"0.3.0":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.2","closure-compiler":"=0.1.0","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"8e2bd27f4173776ba979b08f47cb32e5298272b9","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.0.tgz"},"scripts":{}},"0.3.1":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"4b97ce40d10315698a1821ab09574aa87d5131c2","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.1.tgz"},"scripts":{}},"0.3.2":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.2","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"97f8065658e188afd9d19e164c2bb015a5bbb761","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.2.tgz"},"scripts":{}},"0.3.3":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publicationConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.3","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"779ccd84323f5624b6d88dee0eaf56b068677265","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.3.tgz"}},"0.3.4":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.4","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.4","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"ad6c51b0c5609c8a1cb45fbee04ea68bff4614b8","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.4.tgz"},"scripts":{}},"0.3.5":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.5","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"479f9cd600777aa2da2465f96ab76f346e168adb","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.5.tgz"}},"0.3.6":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.6","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"59f69aeb4b606979e781e9a0d99a85f7c88401ed","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.6.tgz"}},"0.3.7":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"=2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.7","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"bbae5339e36cf0f1308676274c7c493c43898563","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.7.tgz"},"scripts":{}},"0.3.8":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"~2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.8","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"012e566bd5eb2442211f893dcb0782ecc4ffe798","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.8.tgz"},"scripts":{}},"0.3.9":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"~2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.9","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"bec814513342b756ded94b8ee3967db21b0e4e1c","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.9.tgz"}},"0.3.10":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"~2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.10","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"4c44f73cadb67ba707522026ee3198445046c0d1","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.10.tgz"},"scripts":{}},"0.3.11":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.11","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"=1.0.1","yui-compressor":"=0.1.3","closure-compiler":"=0.1.1","underscore":">=1.1.3","optimist":"=0.1.9","cssmin":"=0.3.0","request":"~2.0.2","glob":"~2.0.7","graphviz":"=0.0.3","bufferjs":"=1.0.1","iconv":"=1.1.0","seq":">=0.3.0 <0.4","temp":"=0.2.0","coffee-script":"=1.1.1","htmlparser":">=1.7.0","jsdom":"=0.2.5","cssom-papandreou":"=0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.11","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"bf197191383d23ab36c0d9a338ae4e93247c4407","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.11.tgz"},"scripts":{}},"0.3.12":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.12","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"= 1.1.0","yui-compressor":"= 0.1.3","closure-compiler":"= 0.1.1","underscore":"= 1.2.0","optimist":"= 0.2.6","cssmin":"= 0.3.0","request":"= 2.1.1","glob":"= 2.0.9","graphviz":"= 0.0.3","bufferjs":"= 1.0.2","iconv":"= 1.1.2","seq":"= 0.3.5","temp":"= 0.2.0","coffee-script":"= 1.1.2","jsdom":"= 0.2.5","cssom-papandreou":"= 0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.12/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.12","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"5679851c8f41e3ab4cfbb8cdaa6669412caf5ad4","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.12.tgz"}},"0.3.13":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.13","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"= 1.1.0","yui-compressor":"= 0.1.3","closure-compiler":"= 0.1.1","underscore":"= 1.2.0","optimist":"= 0.2.6","cssmin":"= 0.3.0","request":"= 2.1.1","glob":"= 2.0.9","graphviz":"= 0.0.3","bufferjs":"= 1.0.2","iconv":"= 1.1.2","seq":"= 0.3.5","temp":"= 0.2.0","coffee-script":"= 1.1.2","jsdom":"= 0.2.7","cssom-papandreou":"= 0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph/0.3.13/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph@0.3.13","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"1e57007a03fb82fb8c12daa9e5f06e548b93186b","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.13.tgz"}},"0.3.14":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.14","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"= 1.1.0","yui-compressor":"= 0.1.3","closure-compiler":"= 0.1.1","underscore":"= 1.2.0","optimist":"= 0.2.6","cssmin":"= 0.3.0","request":"= 2.1.1","glob":"= 2.0.9","graphviz":"= 0.0.3","bufferjs":"= 1.0.2","iconv":"= 1.1.2","seq":"= 0.3.5","temp":"= 0.2.0","coffee-script":"= 1.1.2","jsdom":"= 0.2.9","cssom-papandreou":"= 0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.14","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"b19486a992f91e1775cf3e2ece3be5b93dfd9f10","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.14.tgz"}},"0.3.15":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.15","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"uglify-js":"= 1.1.0","yui-compressor":"= 0.1.3","closure-compiler":"= 0.1.1","underscore":"= 1.2.0","optimist":"= 0.2.6","cssmin":"= 0.3.0","request":"= 2.1.1","glob":"= 2.0.9","graphviz":"= 0.0.3","bufferjs":"= 1.0.2","iconv":"= 1.1.2","seq":"= 0.3.5","temp":"= 0.2.0","coffee-script":"= 1.1.2","jsdom":"= 0.2.9","cssom-papandreou":"= 0.2.0-patch1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.15","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"38c64453fb0599606e75b2e7753d308e069aee8d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.15.tgz"}},"0.3.16":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.16","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.0-patch1","glob":"= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.9","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.1.1","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.16","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"bf47f1bfd9623b00ff9bd24213646a25de6b5652","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.16.tgz"}},"0.3.17":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.17","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.0-patch1","glob":"= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.9","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.1.1","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.17","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"3dfa836e8d748f8ea5654d116e3fdd0df48e2ac7","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.17.tgz"}},"0.3.18":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.18","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.0-patch1","glob":"= 2.1.0","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.9","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.1.1","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.18","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"cbbe08190b738ad1ac6a2ab49174c9c36883b8c7","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.18.tgz"}},"0.3.19":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.19","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.19","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"9ab87a245c8245f2bc16f93aab3dad922e0d011e","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.19.tgz"}},"0.3.21":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.21","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.21","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"675b3002c39703be56df0e7d4370def8ebb5e5e5","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.21.tgz"}},"0.3.22":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.22","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.22","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"44b79c28835f73062b1b02cec57f74d268d634d4","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.22.tgz"}},"0.3.23":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.23","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.23","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"54262ab211328f560082c40e3b6ec08f86b8b00b","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.23.tgz"}},"0.3.24":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.24","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.24","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"d410aed9bb0682a60d5378cac7064ae512b53fa4","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.24.tgz"}},"0.3.25":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.25","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.25","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"7978f8cadfa2d638a58bd2ad4412e98998d51b5f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.25.tgz"}},"0.3.26":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.26","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.26","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"688b329a8541041e0d7b7dc4c9716faf7ec0493e","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.26.tgz"}},"0.3.27":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.27","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.1-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.27","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"c2ac1b4e2c601818339720c2236e36ed0f42a636","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.27.tgz"}},"0.3.28":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.28","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","temp":"= 0.2.0","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.28","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"64c408cc314c350d33476b47226508cb78554b49","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.28.tgz"}},"0.3.29":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.29","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","closure-compiler":"= 0.1.1","coffee-script":"= 1.1.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","graphviz":"= 0.0.3","iconv":"= 1.1.2","jsdom":"= 0.2.10","less":"= 1.1.5","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","stylus":"= 0.19.3","uglify-js":"= 1.1.1","underscore":"= 1.2.0","yui-compressor":"= 0.1.3"},"devDependencies":{"vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.29","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"f0bad6c6fd3f893b1fe306b1be6ea580b752f064","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.29.tgz"}},"0.3.30":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.30","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.30","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"242057bb759e38cfdb35a42b1bcd07888d7a573b","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.30.tgz"}},"0.3.31":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.31","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.31","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"b427b49cd5322b56cd2bc2aca4e5e2a27d5583e6","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.31.tgz"}},"0.3.32":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.32","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.32","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"34d8ada0d5858a8fae9da2f0bda425b2f061a80d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.32.tgz"}},"0.3.33":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.33","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.33","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"ca52ffee41618493390b20ecb1127103a441a580","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.33.tgz"}},"0.3.34":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.34","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.34","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"12c7847842a13a27d480e204fd4595df3dfac7e1","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.34.tgz"}},"0.3.36":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.36","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.36","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"67355a50669aaa6606d0996826a562d194ad4fb0","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.36.tgz"}},"0.3.37":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.37","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.37","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"23dfdf9c76cdc0259885fc8fd321672eea40a693","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.37.tgz"}},"0.3.38":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.38","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.38","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"68d6ee266cb40f5331bf80cdae54c6829df76e29","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.38.tgz"}},"0.3.39":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.39","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.39","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"306c19b162d346e8127381202c53a26576748c35","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.39.tgz"}},"0.3.40":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.40","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.40","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"283d83908d35a2f6330ead961c863b4bde1e7829","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.40.tgz"}},"0.3.41":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.41","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.41","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"03498f17bcfdd372f1f69a49d96de20c6e9023b0","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.41.tgz"}},"0.3.42":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.42","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch2","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.42","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"ad62d337aee1b0b8924b75b00942ee5dd831658d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.42.tgz"}},"0.3.43":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.43","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":">= 2.0.9 < 3.0.0","jsdom":"= 0.2.10","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.43","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"a72659c7a902bed51139f1999e19119ef6db2d12","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.43.tgz"}},"0.3.44":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.44","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom":"= 0.2.10","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.44","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"875d1aec53824e2c24c08bf979c5b3aba25cafa6","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.44.tgz"}},"0.4.0":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom":"= 0.2.10","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"222bdb544489fbf28db7d2048c234bd35f6bf805","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.0.tgz"}},"0.4.1":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom":"= 0.2.10","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"3a3a59a2d41e12b58e514fe5bccd76c543f59ce0","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.1.tgz"}},"0.4.2":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom":"= 0.2.10","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"b13b990030041f0bd128cd93d81968e680c417b9","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.2.tgz"}},"0.4.3":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom":"= 0.2.13","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"531f42f3d810fdd7863e13a34f87cc6626262505","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.3.tgz"}},"0.4.4":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom":"= 0.2.13","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"d3d3aef2bff4a5e6f320cbc26e636dc15172684f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.4.tgz"}},"0.4.5":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom-papandreou":"= 0.2.13-patch1","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"79bbcb010710cb2e6b3143ffb72c0faa37434828","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.5.tgz"}},"0.4.6":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.1","cssom-papandreou":"= 0.2.3-patch1","glob":"3.1.2","jsdom-papandreou":"= 0.2.13-patch1","optimist":"= 0.3.1","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.2.5","underscore":"= 1.3.1"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.5","less":"= 1.2.1","iconv":"= 1.1.3","stylus":"= 0.23.0","yui-compressor":"= 0.1.3","vows":"= 0.6.1"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"ec35c1d7019d44a3caccb88f86559320fa8e64f1","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.6.tgz"}},"0.4.7":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.0.2","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.2","jsdom-papandreou":"=0.2.13-patch1","optimist":"=0.3.1","request":"=2.2.5","seq":"=0.3.5","uglify-js":"=1.2.5","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"a80b66440190ca5c323cf2fb0ac786b12ad9411d","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.7.tgz"},"readme":""},"0.4.8":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.0.2","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.2","jsdom-papandreou":"=0.2.13-patch1","optimist":"=0.3.1","request":"=2.2.5","seq":"=0.3.5","uglify-js":"=1.2.5","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"9bda03576e40bb29e222ba9e2b77513f2d20748f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.8.tgz"},"readme":""},"0.4.9":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.0.2","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.2","jsdom-papandreou":"=0.2.13-patch1","optimist":"=0.3.1","request":"=2.2.5","seq":"=0.3.5","uglify-js":"=1.2.5","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"b850babe3bc20756a978595f16a5cac0435dccd9","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.9.tgz"},"readme":""},"0.4.10":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.0.2","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.2","jsdom-papandreou":"=0.2.13-patch2","optimist":"=0.3.1","request":"=2.2.5","seq":"=0.3.5","uglify-js":"=1.2.5","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"5f418dc8c6e033d4278139f93d9aa97f0f72623a","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.10.tgz"},"readme":""},"0.4.11":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.11","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.0.2","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.2","jsdom-papandreou":"=0.2.13-patch2","optimist":"=0.3.1","request":"=2.2.5","seq":"=0.3.5","uglify-js":"=1.2.5","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"e83d6cb1d5a619c3d9ad9d1fbcaab627a907f286","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.11.tgz"},"readme":""},"0.4.12":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.12","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.13-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"64ef664eb49d96c4b189ec2396c61bbd158eed54","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.12.tgz"},"readme":""},"0.4.13":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.13","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.13-patch3","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.13","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"1f49df2feae0759e7fbf9d45c09e1a951327f517","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.13.tgz"},"readme":""},"0.4.14":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.14","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.13-patch3","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.14","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"6230802d7fe7a57b0837ba6ab8d3c9afc3d5f842","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.14.tgz"},"readme":""},"0.4.15":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.15","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch1","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.15","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"1c5964706b86890ea954334e1c9efb23b0155067","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.15.tgz"},"readme":""},"0.4.16":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.16","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch1","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.16","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"3390dc63d47f1565f05c1e91cbc7e6a0777dd2cb","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.16.tgz"},"readme":""},"0.4.17":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.17","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch1","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.17","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a3462679ed29c9bbfbf7c4ab14e271403d53e273","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.17.tgz"},"readme":""},"0.4.18":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.18","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch1","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.18","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"151b192bab4d9a5c4b27be57d481a6d5794b13ec","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.18.tgz"},"readme":""},"0.4.19":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.19","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch1","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","graphviz":"=0.0.5","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.19","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"4269f92ee9d98d6226092aad01c4f323e6ff8ed1","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.19.tgz"},"readme":""},"0.4.20":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.20","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch1","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.20","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"3428755334e6a61a02725fcf867a293f2a34377c","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.20.tgz"},"readme":""},"0.4.21":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.21","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.21","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9abc733a046e42d92e04b03415a30031af650df4","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.21.tgz"},"readme":""},"0.4.22":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.22","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.22","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4e86018cc4d10957cb2331150f5b7fc1670f480e","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.22.tgz"},"readme":""},"0.4.23":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.23","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.23","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2ffa5c470654cf33c38a7d3d70b95cac1c5fc91c","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.23.tgz"},"readme":""},"0.4.24":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.24","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.24","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d993846bb9248b25e8095a611ef12a61e84499b3","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.24.tgz"},"readme":""},"0.4.25":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.25","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.25","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"c386fedcc111361ccb1140be413f73553775adc3","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.25.tgz"},"readme":""},"0.3.35":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.3.35","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"= 1.0.2","cssmin":"= 0.3.0","cssom-papandreou":"= 0.2.2-patch1","glob":">= 2.0.9","jsdom":"= 0.2.10","optimist":"= 0.2.6","request":"= 2.2.5","seq":"= 0.3.5","uglify-js":"= 1.1.1","underscore":"= 1.2.0"},"devDependencies":{"closure-compiler":"= 0.1.1","coffee-script":"= 1.2.0","graphviz":"= 0.0.3","less":"= 1.1.5","iconv":"= 1.1.3","stylus":"= 0.22.2","yui-compressor":"= 0.1.3","vows":">= 0.6.0"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.3.35","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"21fc72916ce394122f8b0245e6efa9b0e3efd55f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.3.35.tgz"},"readme":""},"0.4.26":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.26","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.26","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"6f773b0750169b6ea62a2ec0fcdd68365d570d4b","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.26.tgz"},"readme":""},"0.4.27":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.27","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.27","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"649ba19823ac3565dcb4a0d445fba2cec8f7bebc","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.27.tgz"},"readme":""},"0.4.28":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.28","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.28","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"0a6cc2b8ccd85dbe89082582d31c982ec668cb50","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.28.tgz"},"readme":""},"0.4.29":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.29","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.29","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"a382e589e17173ecbf2be4d0a3249f07d4a73e86","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.29.tgz"},"readme":""},"0.4.30":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.30","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.30","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"0d7970f6fb4f077d9d0345fa5e9cb4894fca1a91","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.30.tgz"},"readme":""},"0.4.31":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.31","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.31","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"82d2ac242955d19e6591fb322926bc750304169b","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.31.tgz"},"readme":""},"0.4.32":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.32","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.32","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"aa2ece75e49f1547c4a57e21b8fdfcd17f2e9b65","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.32.tgz"},"readme":""},"0.4.33":{"name":"assetgraph","description":"AssetGraph ==========","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.33","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.33","dist":{"shasum":"65997ec6f0805931e2b804f942989169412a6eb9","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.33.tgz"}},"0.4.34":{"name":"assetgraph","description":"AssetGraph ==========","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.34","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.34","dist":{"shasum":"d466089f343b9ac8df04e4bf2018a121320d7465","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.34.tgz"}},"0.4.35":{"name":"assetgraph","description":"AssetGraph ==========","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.35","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.35","dist":{"shasum":"ec2c0515955322d46b290d268105b62560ab26e2","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.35.tgz"}},"0.4.36":{"name":"assetgraph","description":"AssetGraph ==========","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.36","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.36","dist":{"shasum":"3530e3fe8b6bc4f7869f85689be57909c4ae850f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.36.tgz"}},"0.4.37":{"name":"assetgraph","description":"AssetGraph ==========","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.37","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.37","dist":{"shasum":"a1a4e3c9031f382ce793c273d08c0ed1e4a279c0","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.37.tgz"}},"0.4.38":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.38","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.38","dist":{"shasum":"7cb7a3ad3d968ba8eda5fff6dd965f6e37e6ceaf","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.38.tgz"}},"0.4.39":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.39","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"readme":"","_id":"assetgraph@0.4.39","dist":{"shasum":"708c33d4cdf197d8d94ecabb679a84891a416961","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.39.tgz"}},"0.4.40":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.40","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglifyast":"=0.0.1","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.40","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"7c5d493af36f5d2e7baa16209576c94115c684f3","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.40.tgz"},"readme":""},"0.4.41":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.41","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglifyast":"=0.0.1","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.41","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7fd038bb70e1e12f9a1194ad319cf3dc6ff75387","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.41.tgz"},"readme":""},"0.4.42":{"name":"assetgraph","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"version":"0.4.42","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"bufferjs":"=1.1.0","cssmin":"=0.3.1","cssom-papandreou":"=0.2.3-patch2","glob":"=3.1.9","jsdom-papandreou":"=0.2.14-patch2","optimist":"=0.3.1","request":"=2.9.153","seq":"=0.3.5","uglifyast":"=0.0.1","uglify-js":"=1.2.6","underscore":"=1.3.1"},"devDependencies":{"closure-compiler":"=0.1.1","coffee-script":"=1.2.0","less":"=1.2.1","iconv":"=1.1.3","stylus":"=0.23.0","yui-compressor":"=0.1.3","vows":"=0.6.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"main":"lib/index.js","scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph@0.4.42","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"3767983faa970822de35d9c15564edca59487b4f","tarball":"http://registry.npmjs.org/assetgraph/-/assetgraph-0.4.42.tgz"},"readme":""}},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2012-08-07T14:28:21.043Z","created":"2011-04-12T09:10:04.582Z","0.0.2":"2011-04-12T09:10:04.903Z","0.0.3":"2011-04-12T23:55:28.505Z","0.0.4":"2011-04-20T08:43:31.340Z","0.0.5":"2011-05-07T12:39:47.610Z","0.0.6":"2011-05-19T13:53:49.035Z","0.0.7":"2011-05-23T08:22:01.828Z","0.0.8":"2011-05-23T11:39:22.752Z","0.0.9":"2011-05-27T10:15:52.873Z","0.0.10":"2011-06-03T14:46:45.370Z","0.0.11":"2011-06-03T16:08:04.085Z","0.0.12":"2011-06-06T08:22:25.550Z","0.0.13":"2011-06-08T12:30:22.647Z","0.0.14":"2011-06-15T23:35:14.818Z","0.0.15":"2011-06-19T13:41:00.910Z","0.0.16":"2011-06-20T12:47:39.279Z","0.0.17":"2011-06-20T13:28:17.161Z","0.0.18":"2011-06-20T13:38:43.572Z","0.0.19":"2011-06-20T15:38:48.752Z","0.1.0":"2011-06-23T09:21:38.165Z","0.1.1":"2011-06-23T10:20:48.672Z","0.1.2":"2011-06-23T11:18:02.940Z","0.1.3":"2011-06-30T08:05:19.052Z","0.1.4":"2011-07-11T11:26:38.881Z","0.1.5":"2011-08-11T15:44:57.118Z","0.2.0":"2011-08-14T22:51:57.675Z","0.2.1":"2011-08-15T15:28:46.679Z","0.2.2":"2011-08-16T09:55:54.282Z","0.2.3":"2011-08-16T10:39:50.334Z","0.2.4":"2011-08-16T16:34:34.392Z","0.2.5":"2011-08-21T13:17:43.976Z","0.2.6":"2011-08-25T11:42:59.132Z","0.2.7":"2011-08-25T14:42:11.772Z","0.2.8":"2011-08-25T15:45:12.482Z","0.2.9":"2011-08-25T20:57:43.305Z","0.2.10":"2011-09-02T14:56:36.206Z","0.3.0":"2011-09-13T23:06:06.045Z","0.3.1":"2011-09-19T20:11:18.851Z","0.3.2":"2011-09-21T23:45:10.642Z","0.3.3":"2011-09-22T12:51:47.751Z","0.3.4":"2011-09-23T21:56:45.032Z","0.3.5":"2011-09-26T08:06:30.190Z","0.3.6":"2011-09-26T09:37:01.557Z","0.3.7":"2011-09-27T23:23:32.069Z","0.3.8":"2011-10-01T15:17:22.653Z","0.3.9":"2011-10-04T12:55:06.217Z","0.3.10":"2011-10-06T18:29:34.983Z","0.3.11":"2011-10-06T20:19:38.462Z","0.3.12":"2011-10-10T11:03:27.040Z","0.3.13":"2011-10-14T13:11:03.273Z","0.3.14":"2011-10-31T09:08:43.495Z","0.3.15":"2011-11-09T16:21:48.789Z","0.3.16":"2011-11-14T20:02:23.984Z","0.3.17":"2011-11-14T21:59:40.658Z","0.3.18":"2011-11-19T21:09:43.659Z","0.3.19":"2011-11-28T22:53:28.909Z","0.3.21":"2011-11-29T08:25:11.026Z","0.3.22":"2011-11-30T13:46:25.871Z","0.3.23":"2011-11-30T15:59:05.855Z","0.3.24":"2011-12-05T13:08:53.182Z","0.3.25":"2011-12-28T13:46:50.672Z","0.3.26":"2012-01-02T16:38:34.086Z","0.3.27":"2012-01-02T17:05:33.233Z","0.3.28":"2012-01-07T11:04:54.221Z","0.3.29":"2012-01-09T13:00:15.925Z","0.3.30":"2012-01-09T20:25:52.599Z","0.3.31":"2012-01-11T16:14:52.375Z","0.3.32":"2012-01-15T11:55:37.675Z","0.3.33":"2012-01-16T00:14:17.796Z","0.3.34":"2012-01-16T12:22:50.417Z","0.3.35":"2012-05-24T22:05:56.743Z","0.3.36":"2012-01-16T22:46:06.839Z","0.3.37":"2012-01-19T09:09:44.846Z","0.3.38":"2012-01-30T15:45:58.485Z","0.3.39":"2012-01-31T09:36:00.587Z","0.3.40":"2012-02-09T17:52:41.261Z","0.3.41":"2012-02-10T16:16:19.835Z","0.3.42":"2012-02-11T09:37:55.943Z","0.3.43":"2012-02-21T14:37:08.775Z","0.3.44":"2012-02-26T17:20:24.220Z","0.4.0":"2012-02-26T17:28:52.011Z","0.4.1":"2012-02-26T23:10:27.959Z","0.4.2":"2012-02-27T13:40:08.631Z","0.4.3":"2012-03-02T17:28:06.087Z","0.4.4":"2012-03-04T16:45:45.063Z","0.4.5":"2012-03-06T20:40:49.660Z","0.4.6":"2012-03-21T23:58:30.646Z","0.4.7":"2012-03-29T20:33:46.798Z","0.4.8":"2012-03-31T16:32:17.221Z","0.4.9":"2012-03-31T17:14:36.619Z","0.4.10":"2012-04-01T20:48:12.102Z","0.4.11":"2012-04-02T09:03:52.547Z","0.4.12":"2012-04-02T10:43:08.017Z","0.4.13":"2012-04-03T13:26:05.068Z","0.4.14":"2012-04-12T12:39:01.211Z","0.4.15":"2012-04-14T21:32:21.989Z","0.4.16":"2012-04-15T20:06:48.059Z","0.4.17":"2012-04-19T08:15:36.446Z","0.4.18":"2012-05-01T21:00:25.617Z","0.4.19":"2012-05-01T21:08:59.586Z","0.4.20":"2012-05-13T20:59:28.121Z","0.4.21":"2012-05-14T12:04:20.693Z","0.4.22":"2012-05-18T15:12:01.912Z","0.4.23":"2012-05-21T08:17:27.271Z","0.4.24":"2012-05-22T13:47:46.794Z","0.4.25":"2012-05-22T14:13:00.387Z","0.4.26":"2012-05-25T14:00:27.207Z","0.4.27":"2012-06-12T21:22:27.165Z","0.4.28":"2012-06-13T06:22:26.395Z","0.4.29":"2012-06-14T18:36:19.969Z","0.4.30":"2012-06-16T16:07:58.692Z","0.4.31":"2012-06-18T23:01:52.344Z","0.4.32":"2012-06-18T23:30:13.366Z","0.4.33":"2012-06-22T14:54:02.722Z","0.4.34":"2012-06-25T15:35:13.196Z","0.4.35":"2012-06-26T09:43:59.084Z","0.4.36":"2012-06-29T16:07:06.882Z","0.4.37":"2012-07-05T07:40:57.419Z","0.4.38":"2012-07-05T14:54:23.476Z","0.4.39":"2012-07-17T07:27:55.779Z","0.4.40":"2012-07-24T21:03:41.781Z","0.4.41":"2012-07-27T12:22:33.024Z","0.4.42":"2012-08-07T14:28:21.043Z"},"description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph.git"},"users":{"fgribreau":true},"_attachments":{"assetgraph-0.4.42.tgz":{"content_type":"application/octet-stream","revpos":293,"digest":"md5-jnJvLDFNMVfECDLIGsLFCQ==","length":80714,"stub":true},"assetgraph-0.4.41.tgz":{"content_type":"application/octet-stream","revpos":290,"digest":"md5-XUk9/w4JfGYrHad5O6RBRg==","length":80547,"stub":true},"assetgraph-0.4.40.tgz":{"content_type":"application/octet-stream","revpos":288,"digest":"md5-3lk7WV2Vwt9ZOdOQPy/DCw==","length":79919,"stub":true},"assetgraph-0.4.39.tgz":{"content_type":"application/octet-stream","revpos":286,"digest":"md5-S6mszYsHat94Ia1M2dxtLw==","length":80963,"stub":true},"assetgraph-0.4.38.tgz":{"content_type":"application/octet-stream","revpos":284,"digest":"md5-2G1plWMMGsGJmfHNuXFzCQ==","length":80995,"stub":true},"assetgraph-0.4.37.tgz":{"content_type":"application/octet-stream","revpos":282,"digest":"md5-f9fLZX4j1yjFdX71srSXtA==","length":80898,"stub":true},"assetgraph-0.4.36.tgz":{"content_type":"application/octet-stream","revpos":280,"digest":"md5-zqSJiL6jICaZDkA2dAxYxg==","length":80892,"stub":true},"assetgraph-0.4.35.tgz":{"content_type":"application/octet-stream","revpos":278,"digest":"md5-q2S6urB9+FBCFLFXZDE/6g==","length":80918,"stub":true},"assetgraph-0.4.34.tgz":{"content_type":"application/octet-stream","revpos":276,"digest":"md5-J1lDDuiAtJ/ejMjAVxF6tg==","length":80923,"stub":true},"assetgraph-0.4.33.tgz":{"content_type":"application/octet-stream","revpos":274,"digest":"md5-afZbHvlto+9jsbfJIE3ftA==","length":80937,"stub":true},"assetgraph-0.4.32.tgz":{"content_type":"application/octet-stream","revpos":272,"digest":"md5-kmRy1HkNuEoAH10BXHsznA==","length":79055,"stub":true},"assetgraph-0.4.31.tgz":{"content_type":"application/octet-stream","revpos":270,"digest":"md5-UbSrx5OaBc6XWQ7N8NRDyw==","length":79145,"stub":true},"assetgraph-0.4.30.tgz":{"content_type":"application/octet-stream","revpos":268,"digest":"md5-7g73FvpPHIOfNs9410Mrkw==","length":79148,"stub":true},"assetgraph-0.4.29.tgz":{"content_type":"application/octet-stream","revpos":266,"digest":"md5-S/jWItZxVtfvVIUWrxailw==","length":78803,"stub":true},"assetgraph-0.4.28.tgz":{"content_type":"application/octet-stream","revpos":264,"digest":"md5-jlyyyOvJITmAT4TPsBB9GQ==","length":78803,"stub":true},"assetgraph-0.4.27.tgz":{"content_type":"application/octet-stream","revpos":262,"digest":"md5-eLY0Io9SMqJ9wNYujWEnhA==","length":78787,"stub":true},"assetgraph-0.4.26.tgz":{"content_type":"application/octet-stream","revpos":260,"digest":"md5-C5YgcE0RNLSmQChTmj1XUg==","length":78742,"stub":true},"assetgraph-0.3.35.tgz":{"content_type":"application/octet-stream","revpos":256,"digest":"md5-5pv3xBspSDfRCY+l+fmVqQ==","length":70123,"stub":true},"assetgraph-0.4.25.tgz":{"content_type":"application/octet-stream","revpos":250,"digest":"md5-uf5DPGeJkr8hK1nnEqheIg==","length":78666,"stub":true},"assetgraph-0.4.24.tgz":{"content_type":"application/octet-stream","revpos":248,"digest":"md5-cYECnJphUk0FEoh+6y4fkA==","length":78657,"stub":true},"assetgraph-0.4.23.tgz":{"content_type":"application/octet-stream","revpos":246,"digest":"md5-Ydq9P/LU2xwxx7Atb5RM3A==","length":78641,"stub":true},"assetgraph-0.4.22.tgz":{"content_type":"application/octet-stream","revpos":244,"digest":"md5-5swNm4MTtSO2onZtDatEdw==","length":78625,"stub":true},"assetgraph-0.4.21.tgz":{"content_type":"application/octet-stream","revpos":242,"digest":"md5-4FiKZpIsnbNbx46wDfyUKg==","length":78549,"stub":true},"assetgraph-0.4.20.tgz":{"content_type":"application/octet-stream","revpos":240,"digest":"md5-5giWs+8QR7CumRAsi7P4Lg==","length":78273,"stub":true},"assetgraph-0.4.19.tgz":{"content_type":"application/octet-stream","revpos":238,"digest":"md5-K2wuDaDXuAOWOSBOXPZ5tg==","length":77763,"stub":true},"assetgraph-0.4.18.tgz":{"content_type":"application/octet-stream","revpos":236,"digest":"md5-8JilV3km9IEobXJFXJnLbQ==","length":77747,"stub":true},"assetgraph-0.4.17.tgz":{"content_type":"application/octet-stream","revpos":234,"digest":"md5-JLKvWHvAcydDGw+3ZZ/s0Q==","length":77673,"stub":true},"assetgraph-0.4.16.tgz":{"content_type":"application/octet-stream","revpos":232,"digest":"md5-zF33KhtXhTPoeIo/1JpYAA==","length":77097,"stub":true},"assetgraph-0.4.15.tgz":{"content_type":"application/octet-stream","revpos":230,"digest":"md5-H792Nq/eCluO2CK3pwLKAA==","length":77069,"stub":true},"assetgraph-0.4.14.tgz":{"content_type":"application/octet-stream","revpos":228,"digest":"md5-56l4aPLrXhaU+QDjvD1P2Q==","length":76681,"stub":true},"assetgraph-0.4.13.tgz":{"content_type":"application/octet-stream","revpos":226,"digest":"md5-spR/0u/VQGNi4/2wTVKNrQ==","length":76629,"stub":true},"assetgraph-0.4.12.tgz":{"content_type":"application/octet-stream","revpos":224,"digest":"md5-26x7MmbkiR7tOcoo6gcuIw==","length":76622,"stub":true},"assetgraph-0.4.11.tgz":{"content_type":"application/octet-stream","revpos":222,"digest":"md5-3SEe00g49usFrpULyg3aiQ==","length":76616,"stub":true},"assetgraph-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":220,"digest":"md5-h2eWA65pVPr/BCphbXIS2w==","length":77488,"stub":true},"assetgraph-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":218,"digest":"md5-aAJuhz5pGBlMZecXKtz+QQ==","length":77481,"stub":true},"assetgraph-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":216,"digest":"md5-KAACdQibRpS/b+Yy+M/ESw==","length":77311,"stub":true},"assetgraph-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":214,"digest":"md5-Zq6MLY9JV8wU/cDZrbix4A==","length":77141,"stub":true},"assetgraph-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":212,"digest":"md5-eTuitBcApZCZTp1vgCEngQ==","length":75926,"stub":true},"assetgraph-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":210,"digest":"md5-TzqucVJNAgzOxYRGSvtpAw==","length":75837,"stub":true},"assetgraph-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":208,"digest":"md5-d7rDLfC8Glhdgmdd4A5ZWQ==","length":75848,"stub":true},"assetgraph-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":206,"digest":"md5-e3Q9Hvt59OYeXMGt/xOlNQ==","length":74665,"stub":true},"assetgraph-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":204,"digest":"md5-J97aFfIkT8/mwV1GDh+KXQ==","length":74542,"stub":true},"assetgraph-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":202,"digest":"md5-uS6lEuqw2aHrTbJgzylnRQ==","length":74896,"stub":true},"assetgraph-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":192,"digest":"md5-PvwISFhZ9MlMVecuQEVS+Q==","length":74787,"stub":true},"assetgraph-0.3.44.tgz":{"content_type":"application/octet-stream","revpos":190,"digest":"md5-bVfPTe7R/XbQytwvUna6PA==","length":74817,"stub":true},"assetgraph-0.3.43.tgz":{"content_type":"application/octet-stream","revpos":188,"digest":"md5-kfAg2JRDMWu1SsVtO6b/QA==","length":74468,"stub":true},"assetgraph-0.3.42.tgz":{"content_type":"application/octet-stream","revpos":186,"digest":"md5-tX0c4EesgREMXmiPZZMk9g==","length":74096,"stub":true},"assetgraph-0.3.41.tgz":{"content_type":"application/octet-stream","revpos":184,"digest":"md5-tjhub3JiCLyjWUbApFf7Hg==","length":73740,"stub":true},"assetgraph-0.3.40.tgz":{"content_type":"application/octet-stream","revpos":182,"digest":"md5-O7UizT7TEXQjiscGZs6Sog==","length":73409,"stub":true},"assetgraph-0.3.39.tgz":{"content_type":"application/octet-stream","revpos":176,"digest":"md5-MSPUW2+E3OVpP27ZEeba2Q==","length":71163,"stub":true},"assetgraph-0.3.38.tgz":{"content_type":"application/octet-stream","revpos":174,"digest":"md5-c7Z4pXExaznPQ1TCwUonaA==","length":71039,"stub":true},"assetgraph-0.3.37.tgz":{"content_type":"application/octet-stream","revpos":172,"digest":"md5-TQXLc4V7GzP5XrkLVoCEwQ==","length":69306,"stub":true},"assetgraph-0.3.36.tgz":{"content_type":"application/octet-stream","revpos":170,"digest":"md5-ozaG/JeGkjrSE6qnhiGirQ==","length":69552,"stub":true},"assetgraph-0.3.34.tgz":{"content_type":"application/octet-stream","revpos":166,"digest":"md5-XWCfYyk6vhycC5mYCkYMNg==","length":69029,"stub":true},"assetgraph-0.3.33.tgz":{"content_type":"application/octet-stream","revpos":164,"digest":"md5-SzBjGbgI/ogVU1GbHpo/eA==","length":69326,"stub":true},"assetgraph-0.3.32.tgz":{"content_type":"application/octet-stream","revpos":162,"digest":"md5-MGv9HU8Q35mq1vpPl2eZZQ==","length":69051,"stub":true},"assetgraph-0.3.31.tgz":{"content_type":"application/octet-stream","revpos":160,"digest":"md5-62JnLOWfdrjf85u0LV8PPg==","length":68780,"stub":true},"assetgraph-0.3.30.tgz":{"content_type":"application/octet-stream","revpos":158,"digest":"md5-l9tl+iil2qJ+DZ8OwYkX8A==","length":68938,"stub":true},"assetgraph-0.3.29.tgz":{"content_type":"application/octet-stream","revpos":136,"digest":"md5-3k1wg314C1qigZ0Vcr5fmg==","length":208855,"stub":true},"assetgraph-0.3.28.tgz":{"content_type":"application/octet-stream","revpos":134,"digest":"md5-362d/lxc7nm4xpiuyYKpUw==","length":208816,"stub":true},"assetgraph-0.3.27.tgz":{"content_type":"application/octet-stream","revpos":132,"digest":"md5-lOmesfNd8WPM9iwryiWArQ==","length":208671,"stub":true},"assetgraph-0.3.26.tgz":{"content_type":"application/octet-stream","revpos":130,"digest":"md5-+yvPo3QcTp27goQ+4zsVSQ==","length":208713,"stub":true},"assetgraph-0.3.25.tgz":{"content_type":"application/octet-stream","revpos":128,"digest":"md5-Mbe9P0fxDOSFvy0EDYy6dg==","length":208596,"stub":true},"assetgraph-0.3.24.tgz":{"content_type":"application/octet-stream","revpos":126,"digest":"md5-J7hz2yFbrXWe4ghK2BPO5A==","length":208679,"stub":true},"assetgraph-0.3.23.tgz":{"content_type":"application/octet-stream","revpos":124,"digest":"md5-to9edkLkkb55Ojjw51CKbA==","length":208687,"stub":true},"assetgraph-0.3.22.tgz":{"content_type":"application/octet-stream","revpos":122,"digest":"md5-JFMYl1FtywRXF7RB67Pb7g==","length":208554,"stub":true},"assetgraph-0.3.21.tgz":{"content_type":"application/octet-stream","revpos":120,"digest":"md5-tMiAddF5nRVS87M82TdECw==","length":207664,"stub":true},"assetgraph-0.3.19.tgz":{"content_type":"application/octet-stream","revpos":118,"digest":"md5-mpbOt8tmREcymxh7K5ROpg==","length":207264,"stub":true},"assetgraph-0.3.18.tgz":{"content_type":"application/octet-stream","revpos":116,"digest":"md5-JEXjGoiTg+YXzYWTnQ1JMg==","length":196995,"stub":true},"assetgraph-0.3.17.tgz":{"content_type":"application/octet-stream","revpos":114,"digest":"md5-fVvHOppMXWwdNudDvU81lQ==","length":195306,"stub":true},"assetgraph-0.3.16.tgz":{"content_type":"application/octet-stream","revpos":112,"digest":"md5-OlMerRkGvgp1nR3mIMz4+A==","length":195133,"stub":true},"assetgraph-0.3.15.tgz":{"content_type":"application/octet-stream","revpos":110,"digest":"md5-KwnZJO1gw4zmfwfUvZ9doA==","length":210762,"stub":true},"assetgraph-0.3.14.tgz":{"content_type":"application/octet-stream","revpos":108,"digest":"md5-iqQJavbHQhfuTpjqkc3Fmw==","length":210796,"stub":true},"assetgraph-0.3.13.tgz":{"content_type":"application/octet-stream","revpos":106,"digest":"md5-pmWEzPCBtCKOpVN3EyXfSA==","length":210768,"stub":true},"assetgraph-0.3.12.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-xUMdxa8XETpc4pzrF+WTiw==","length":210042,"stub":true},"assetgraph-0.3.11.tgz":{"content_type":"application/octet-stream","revpos":98,"digest":"md5-tOCBDBHRFqO/kXxkfVfWTg==","length":209770,"stub":true},"assetgraph-0.3.10.tgz":{"content_type":"application/octet-stream","revpos":96,"digest":"md5-33+xZPjo6MM93quM/15W3A==","length":209753,"stub":true},"assetgraph-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":94,"digest":"md5-5cH0zcQ84VnTBidpGsOGdg==","length":209265,"stub":true},"assetgraph-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":92,"digest":"md5-oc7r2SEs9Zd8ajMlPc3Sqw==","length":199627,"stub":true},"assetgraph-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":90,"digest":"md5-3i1N7w2ZnI5oT1q5iWUMbg==","length":196692,"stub":true},"assetgraph-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":88,"digest":"md5-kB0e4Xah+vJnpaiAW8VXpg==","length":202798,"stub":true},"assetgraph-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-1sNtcvkz0Gjpjfqbxe8fqw==","length":202776,"stub":true},"assetgraph-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":84,"digest":"md5-SBDcH8EPus49rVgzfanEqg==","length":193727,"stub":true},"assetgraph-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-wRxfTNcAgEmws7e8k4qyIA==","length":225911,"stub":true},"assetgraph-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":80,"digest":"md5-ukqoiRjJCa3FhdTSwXWLZw==","length":218390,"stub":true},"assetgraph-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":78,"digest":"md5-9VQjyPXppGs51PZBOnONjg==","length":216241,"stub":true},"assetgraph-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-RNeJdN0sWHMb1yuHCORfNg==","length":213610,"stub":true},"assetgraph-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-MZPYAeYLihgejLH7+pv7Gw==","length":176602,"stub":true},"assetgraph-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":72,"digest":"md5-ZLk8wurG4ySepTg2glvyiQ==","length":121867,"stub":true},"assetgraph-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-PvXCCEW8c9OJaQRHQYiM3Q==","length":129575,"stub":true},"assetgraph-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":68,"digest":"md5-Yeje2MT+LSFRTtH30E3XQw==","length":129550,"stub":true},"assetgraph-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-IeDVyTXSQE27r778ejCw/g==","length":129555,"stub":true},"assetgraph-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-9RQ+X1rGoQhQ5woAphNtww==","length":135598,"stub":true},"assetgraph-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-ZU8k+LmrQd+ha7dUyhF4vQ==","length":119776,"stub":true},"assetgraph-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-Ysi9gFMdOlwIfMLKFfjwUA==","length":119014,"stub":true},"assetgraph-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-qEBZvzvz4huWn661QL+QEQ==","length":118324,"stub":true},"assetgraph-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-evf8uQLUrUFbqoh0igei9g==","length":118574,"stub":true},"assetgraph-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-S0eneXAwnb/8hIk04iIMdw==","length":110218,"stub":true},"assetgraph-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-XYokaz1vVz5xQ0PV1vltlg==","length":798121,"stub":true},"assetgraph-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-uXaNPzSzz08T9CHdXsRpZw==","length":795127,"stub":true},"assetgraph-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-Z+kOEvTFHUdeGzWEt2/OQg==","length":794585,"stub":true},"assetgraph-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-ikNHCabxAkg3Vc03/uzVOw==","length":793331,"stub":true},"assetgraph-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-Kq67bfGXDlh1j5BsFF3VqA==","length":798439,"stub":true},"assetgraph-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ob9GJY9vR3IX1YUn1f5a0g==","length":798698,"stub":true},"assetgraph-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-itwc9jhXldZ+4cMkYinvEA==","length":1471374,"stub":true},"assetgraph-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-ORW2doqK1rr+UV+bpn4R2w==","length":1471178,"stub":true},"assetgraph-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-EfPbrzgv5umAawexVZt51g==","length":1471264,"stub":true},"assetgraph-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-FEIJ47BZvlUFHZgvsfEq7Q==","length":813442,"stub":true},"assetgraph-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-1USTJTjsnBF2tAtg6X98og==","length":1127542,"stub":true},"assetgraph-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-st629kPhAepox1hlXq8Ylg==","length":1126102,"stub":true},"assetgraph-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-jJH0PTiNRpFgjAq4QPSyRg==","length":124730,"stub":true},"assetgraph-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-OqIAYo9Gu4rNFjM+4iCeeg==","length":124560,"stub":true},"assetgraph-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-/rCJJzqktQxRZ+AGGSWf5w==","length":124505,"stub":true},"assetgraph-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-u21u3KwGLV+U2VGs2PzzLg==","length":124532,"stub":true},"assetgraph-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-i8GQhxtd+EPtkDmTS9nhwQ==","length":117214,"stub":true},"assetgraph-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-DCnZQjqjtwoO1fg4/D1pLA==","length":116997,"stub":true},"assetgraph-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-0304DrvCAA7JgUI3/aZsqw==","length":116872,"stub":true},"assetgraph-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jefLG5GM6I+Wl3iSf+rncg==","length":115828,"stub":true},"assetgraph-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-4b8/Ftu1U5+GvrYfPKTueQ==","length":116501,"stub":true},"assetgraph-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-CsEsjdo84l8yjwtPvSyqkA==","length":114074,"stub":true},"assetgraph-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ru4ZoUIxlm3EEu3JRdHbNA==","length":114727,"stub":true},"assetgraph-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-B56npXTmT+xRi7bMJtYinw==","length":113731,"stub":true}}}},
{"id":"assetgraph-builder","key":"assetgraph-builder","value":{"rev":"334-8d000a96f8f25df083cdef477b9ed4a7"},"doc":{"_id":"assetgraph-builder","_rev":"334-8d000a96f8f25df083cdef477b9ed4a7","name":"assetgraph-builder","description":"Build system for web sites and applications","dist-tags":{"latest":"0.3.59"},"versions":{"0.0.1":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.1","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":">= 0.1.0","assetgraph-sprite":">= 0.0.2","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.1","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"c4ad76cf8d4f16fe27052e6120effa3a8d840a89","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.1.tgz"},"scripts":{}},"0.0.2":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.2","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":">= 0.1.0","assetgraph-sprite":">= 0.0.3","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.2","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"a17da74036754ed47a6be9de0c287f4dd369c26a","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.2.tgz"},"scripts":{}},"0.0.3":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.3","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":">= 0.1.2","assetgraph-sprite":">= 0.0.3","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.3","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"53006b2c73707694757847dd98a3af8bf960eebb","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.3.tgz"},"scripts":{}},"0.0.4":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.4","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":">= 0.1.2","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.4","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"854badffbeec842b980a83b4dd058af857847209","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.4.tgz"},"scripts":{}},"0.0.5":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.5","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":">= 0.1.2","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.5","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"1fb7199cfab0393d2cf5d552a11327d24f70ded5","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.5.tgz"},"scripts":{}},"0.0.6":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.6","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":"~ 0.1.3","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.6","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"e3837fe49323cc97e51987e2eb89a74bc11e168a","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.6.tgz"},"scripts":{}},"0.0.7":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.7","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":"~ 0.1.4","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.7","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"2d4cdddeab70c29ec44ee8a091f32985b14403bd","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.7.tgz"},"scripts":{}},"0.0.8":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.8","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"assetgraph":"~ 0.1.4","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","jsdom":"=0.2.0","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"bin":{"buildDevelopment":"./bin/buildDevelopment","buildProduction":"./bin/buildProduction","flattenOneInclude":"./bin/flattenOneInclude","prepareForCDN":"./bin/prepareForCDN","refreshI18n":"./bin/refreshI18n"},"_id":"assetgraph-builder@0.0.8","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"78baace385d1fda94a34ec929e26a3b0365114d2","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.8.tgz"},"scripts":{}},"0.0.9":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"~ 0.1.4","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.9","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"04d4eadd30f9bb1f8caa8c8ac28645c5eaba437c","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.9.tgz"},"scripts":{}},"0.0.10":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"~ 0.1.4","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.10","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","makeBabelJob":"bin/makeBabelJob","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"af063a83ee12195e806708fe3b6b82fd74610fd6","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.10.tgz"},"scripts":{}},"0.0.11":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.0.11","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.1.5","assetgraph-sprite":">= 0.0.4","uglify-js":"=1.0.1","underscore":">=1.1.3","optimist":"=0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.0.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.0.11","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"28cf15e6fd27fecdab75b21b77854c1e0ab39af8","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.0.11.tgz"},"scripts":{}},"0.1.0":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.0","assetgraph-sprite":"= 0.1.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"ff73b8bb94ce612bdf7b47f382023c3870f9b19f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.1","assetgraph-sprite":"= 0.1.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.1","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"bb37301e4939de023109dfc1c4ae44aa9af91c24","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.2","assetgraph-sprite":"= 0.1.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.2","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","applyBabelJob":"bin/applyBabelJob","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"77c2da8963f455804cdb6e7b32e0c408c5769081","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.3","assetgraph-sprite":"= 0.1.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.3","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","applyBabelJob":"bin/applyBabelJob","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"9662b47e8d33ff3d2f0558d705967ddbce2decd1","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.4","assetgraph-sprite":"= 0.1.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.4","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","applyBabelJob":"bin/applyBabelJob","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"ecc16ef560092d007a5e7540aa33fb493c861f08","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.4.tgz"},"scripts":{}},"0.1.5":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.5","assetgraph-sprite":"= 0.1.1","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.5","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"958a1a9378bf152aec3b9aea88db0b4c7e4dabac","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.5.tgz"},"scripts":{}},"0.1.6":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.6","assetgraph-sprite":"= 0.1.1","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.6","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"edd068701d11af8d1ad6d850aa2723f61192c416","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.6.tgz"}},"0.1.7":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.7","assetgraph-sprite":"= 0.1.1","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.7","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","applyBabelJob":"bin/applyBabelJob","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"5fb1e44313f3098c6cc3cd8e88f75bc0e797da75","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.7.tgz"}},"0.1.8":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.8","assetgraph-sprite":"= 0.1.1","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.8","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"69f6614d7ee874dd9aa1c2a7ab98da0288e79b11","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.8.tgz"}},"0.1.9":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.9","assetgraph-sprite":"= 0.1.1","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.9","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"a8159c9b5db56d4cad174836b9251fafb8e5682c","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.9.tgz"},"scripts":{}},"0.2.0":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.0","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"f45c9d84bc031cf3627bb340ab34abf1ca8870c7","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.1","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"611222cc37cd1616146fe9f943e89c6a31f5b95f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.1.tgz"},"scripts":{}},"0.1.10":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.1.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.2.9","assetgraph-sprite":"= 0.1.1","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.1.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.1.10","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"c220ab177cd65181b66e1bfebb51b70c629dc533","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.1.10.tgz"}},"0.2.2":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.2","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.2","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"7b48c150438599775679d4ce812289e365fa2224","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.2.tgz"},"scripts":{}},"0.2.3":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.3","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.3","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"d48185c116ba836c82aacb0fd7461b9d9e391936","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.3.tgz"}},"0.2.4":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.4","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.4","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"44b5b993d3ee8473a85f8780cba655299c60f6cd","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.4.tgz"},"scripts":{}},"0.2.5":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.5","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.5","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"07fe08f12c2170cadd8d0ea04ef7c93c0202f29b","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.5.tgz"}},"0.2.6":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.6","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.6","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"prepareForCDN":"bin/prepareForCDN","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"b0a47585720c9c3affe678f8c37baa4ef37af029","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.6.tgz"}},"0.2.7":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.7","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.7","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"ab38b217b98ff288f287a990894d6c2058567076","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.7.tgz"},"scripts":{}},"0.2.8":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.8","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.8","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"4cc7ec9096cfa8bd25860f697919d61f7bece536","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.8.tgz"},"scripts":{}},"0.2.9":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.8","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.9","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"fbb4ed0e58fb0b94b5dca8a9d6af32ea07431e2d","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.9.tgz"},"scripts":{}},"0.2.10":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.8","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.10","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"4d390a593a1ad11ee61eee37035ab520280b5240","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.10.tgz"},"scripts":{}},"0.2.11":{"name":"assetgraph-builder","description":"Build system for web apps and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.11","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.8","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.11","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","prepareForCDN":"bin/prepareForCDN","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"9cd695c55524ee8c6119fd1107396cbab2e32a8e","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.11.tgz"},"scripts":{}},"0.2.12":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.12","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.9","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.12/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.12","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"bff94adb92662aac9d886bf95a6ffd5277c5d45f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.12.tgz"}},"0.2.13":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.13","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.10","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.13/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.13","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"af869504c4471f1e419fb4a077cf01c7467b6784","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.13.tgz"},"scripts":{}},"0.2.14":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.14","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.11","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.14/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.14","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"08fe5a066da584a74a9bbb0dda1a98f1a68b0f36","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.14.tgz"},"scripts":{}},"0.2.15":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.15","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.11","assetgraph-sprite":"= 0.2.0","uglify-js":"~ 1.0.1","underscore":"~ 1.1.3","optimist":"= 0.1.9","seq":">=0.3.0 <0.4","memoizer":"=0.0.1","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.15/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.15","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"27d89055512317e34862f22685d324b114460bc1","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.15.tgz"},"scripts":{}},"0.2.16":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.16","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.12","assetgraph-sprite":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.16/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.16","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"flattenOneInclude":"bin/flattenOneInclude","buildProduction":"bin/buildProduction","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"1640d16d9e9e0da3cd168a680455ba2009c0bba2","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.16.tgz"}},"0.2.17":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.17","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.12","assetgraph-sprite":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.17/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.17","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","applyBabelJob":"bin/applyBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"04d0e3887413dab0b9857a72226bb703216e0a81","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.17.tgz"}},"0.2.18":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.18","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"assetgraph":"= 0.3.13","assetgraph-sprite":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-builder/0.2.18/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-builder@0.2.18","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"flattenOneInclude":"bin/flattenOneInclude","buildProduction":"bin/buildProduction","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"c421199685acd5afb0f6314c1bd3524e3d1ee427","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.18.tgz"}},"0.2.19":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.19","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.13","assetgraph-sprite":"= 0.2.1","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.19","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"0a96af282c016e0b9c94a2c7646821cc68f83394","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.19.tgz"}},"0.2.20":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.20","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.13","assetgraph-sprite":"= 0.2.1","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.20","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"64b566259ae8f67ae37b320bee48a382854844e9","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.20.tgz"}},"0.2.21":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.21","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.14","assetgraph-sprite":"= 0.2.1","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.21","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"cf69699696984c5d4e36e65d4acee4905fe3c6d4","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.21.tgz"}},"0.2.22":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.22","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.15","assetgraph-sprite":"= 0.2.2","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.22","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"fb062021d2a373ef2c6b515867deec1b238def60","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.22.tgz"}},"0.2.23":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.23","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.15","assetgraph-sprite":"= 0.2.2","uglify-js":"= 1.1.0","underscore":"= 1.2.0","optimist":"= 0.2.6","seq":"= 0.3.5","memoizer":"= 0.0.4","temp":"= 0.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.23","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"6e60b25fdd5c80dfed141d2eb80c1e40b4248fba","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.23.tgz"}},"0.2.24":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.24","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.16","assetgraph-sprite":"= 0.2.2","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.24","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"651461c058cedea601a134acb38067eb5db48c1e","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.24.tgz"}},"0.2.25":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.25","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.17","assetgraph-sprite":"= 0.2.2","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.25","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"fa8e11a59ced60528c02d9e28c8999031f648673","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.25.tgz"}},"0.2.26":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.26","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.17","assetgraph-sprite":"= 0.2.2","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.26","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"77a3768e49d0634ef10279fbaed70c5c12ad90bc","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.26.tgz"}},"0.2.27":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.27","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.18","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.27","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"a86f20be41637bb407e035af4de8479f12e474cc","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.27.tgz"}},"0.2.28":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.28","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.19","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.28","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"6bd51afaf2bcd653d61bee08ed4ddcfea5fdc8c0","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.28.tgz"}},"0.2.29":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.29","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.21","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.29","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"20573e5c6d6c9297173c61d7a0169a89dd8f96ee","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.29.tgz"}},"0.2.30":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.30","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.22","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.30","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"8b7da145f85788ac22b972ec2ac8003ebc970c5f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.30.tgz"}},"0.2.31":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.31","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.22","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.31","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"fd7dd84e0dfaaedbf4a670f8127dcec40232ef54","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.31.tgz"}},"0.2.32":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.32","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.23","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.32","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"a927aa5e0f3a3af60ed4904c0cba337450abc601","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.32.tgz"}},"0.2.33":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.33","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.24","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.33","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"95bcda63b3f43d1ca6b49bdb7b3c4b9881b736b2","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.33.tgz"}},"0.2.34":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.34","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.24","assetgraph-sprite":"= 0.2.3","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.34","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"218a93837a460bfbf5a63f8f8975ff719edc3ca2","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.34.tgz"}},"0.2.35":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.35","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.24","assetgraph-sprite":"= 0.2.4","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.35","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"e0278a2ba5ca001e011210ddc0e13a39b5f014f8","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.35.tgz"}},"0.2.36":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.36","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.25","assetgraph-sprite":"= 0.2.4","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.36","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"23e3265f113560905902af370bb894fb756c8493","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.36.tgz"}},"0.2.37-pre":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.37-pre","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.25","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.37-pre","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"3f6c7cb98a673a1568a3d4a5cc2f9bdd537ffe34","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.37-pre.tgz"}},"0.2.37":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.37","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.25","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.37","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"ccc1354462def38be1647440b0958818e0164e47","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.37.tgz"}},"0.2.38":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.38","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.26","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.38","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"f084c5a495f4a6db345162a47f946c45af033365","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.38.tgz"}},"0.2.39":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.39","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.27","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.39","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"81a6bb58a2ce7a859e9f4eb59e6d445363877793","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.39.tgz"}},"0.2.40":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.40","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.27","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.40","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"flattenOneInclude":"bin/flattenOneInclude","buildProduction":"bin/buildProduction","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"9073f2488c4b7554c7e18c85fd1a305bcdff1574","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.40.tgz"}},"0.2.41":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.41","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.27","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.41","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"a77c0ad5246563945175d2aea3adf502b867ca77","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.41.tgz"}},"0.2.42":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.42","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.27","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.42","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"91be3f21243a37eda7f32b89ff7e363aef47b481","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.42.tgz"}},"0.2.43":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.43","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.29","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.43","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"96ebe53017b09ab1fa55bedb4d1ee443ad537d22","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.43.tgz"}},"0.2.45":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.45","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.31","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.45","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"c9149bfaa6600bff201b1f9f2432bd2db9c5bb5f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.45.tgz"}},"0.2.44":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.44","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.30","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.44","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","applyBabelJob":"bin/applyBabelJob","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"c6bf2188c1f5b9f5d1bfcb5643db87d07587c2ca","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.44.tgz"}},"0.2.46":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.46","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.31","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.46","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"3c1b79b5e75d4ed4f8bc775514971bfd5185d7fe","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.46.tgz"}},"0.2.47":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.47","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.32","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.47","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"74254e077c27fc77561a2e40398083c8cef5fd60","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.47.tgz"}},"0.2.48":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.48","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.33","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.48","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"8a48675c6936dea206c290312afd1be076a5d315","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.48.tgz"}},"0.2.49":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.49","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.34","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.49","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","applyBabelJob":"bin/applyBabelJob","flattenOneInclude":"bin/flattenOneInclude","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"3997cd1ac21ef628a2776d82e7ce83316740e552","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.49.tgz"}},"0.2.50":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.50","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.35","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.50","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"5386aa174a50440a79b6b167f26a763cdeed1b79","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.50.tgz"}},"0.2.51":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.51","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.35","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.51","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"7a5d65ff767f04e277526b93ddad4c4b948b5dfa","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.51.tgz"}},"0.2.52":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.52","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.35","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.52","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"76bab6b765c7437b0bfd315bb4edb87a7aaa06f8","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.52.tgz"}},"0.2.53":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.53","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.37","assetgraph-sprite":"= 0.2.5","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.1.0","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.53","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"fca2e327f3606fe0f474b7dae0e54dd7dd39fb0b","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.53.tgz"}},"0.2.54":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.54","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.38","assetgraph-sprite":"= 0.2.6","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.54","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"ddbabeed09ca0045a347bb2d0e922d037ea32446","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.54.tgz"}},"0.2.55":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.55","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.39","assetgraph-sprite":"= 0.2.6","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.55","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"a41917528a0a1dadfe05904d1d8335ed1d34fba4","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.55.tgz"}},"0.2.56":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.56","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.40","assetgraph-sprite":"= 0.2.6","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.56","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"4908a3f7d447914e6f0763f022700adb15b53df5","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.56.tgz"}},"0.2.57":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.57","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.41","assetgraph-sprite":"= 0.2.6","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.57","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"3ef20710c75f8d1e196224cecb593be258278808","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.57.tgz"}},"0.2.58":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.58","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.42","assetgraph-sprite":"= 0.2.7","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.58","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"9be4289842b99dfd0b803879a1358376eda450e7","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.58.tgz"}},"0.2.59":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.59","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.42","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","less":"= 1.2.1","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.59","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"eaa8e93f3d004b18bf5f8a88f89fb02f4602159f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.59.tgz"}},"0.2.60":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.60","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.43","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","less":"= 1.2.1","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.60","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"359e48111344456ac5f9326075c03eadd0ef4114","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.60.tgz"}},"0.2.61":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.2.61","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.3.44","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","less":"= 1.2.1","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.2.61","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"6b2092cf4ee966cd86613d91cd0786c4d2475d22","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.2.61.tgz"}},"0.3.0":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.0","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","less":"= 1.2.1","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"c5b63d01e5cf9c4227d410a1dce60699a7b703d1","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.0.tgz"}},"0.3.1":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.1","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","less":"= 1.2.1","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"f5ff2cd59cbac29303f416d75df4c60b6e2acf56","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.1.tgz"}},"0.3.2":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.1","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"c7e8bea7cffc6c97f8d762aa6e9d60935c4afaf8","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.2.tgz"}},"0.3.3":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.2","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"9f6e5ca5781eaddbcfe9208c1494159b5f8baf4e","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.3.tgz"}},"0.3.4":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.3","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","makeBabelJob":"bin/makeBabelJob"},"dist":{"shasum":"64d5c5afd6469254d20d1a0bfd271a49d3aba230","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.4.tgz"}},"0.3.5":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.5","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"a1abf9352b2787596ae6f9fc64f4a3e433bb099b","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.5.tgz"}},"0.3.6":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"= 0.4.6","assetgraph-sprite":"= 0.2.8","bufferjs":"= 1.0.2","memoizer":"= 0.0.4","optimist":"= 0.2.6","seq":"= 0.3.5","temp":"= 0.2.0","uglify-js":"= 1.2.5","underscore":"= 1.2.0"},"devDependencies":{"vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"3da01469cc522653ca560705bcd5b3e66662b286","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.6.tgz"}},"0.3.7":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.7","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.2.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"e92d7bfea172708a230a38b1ef8bc93417691cb8","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.7.tgz"},"readme":""},"0.3.8":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.8","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.2.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"aa1f5b5807615744daf4ea6d62a08f1d15507e3b","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.8.tgz"},"readme":""},"0.3.9":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.9","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.2.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"273935062f2a08397070acd00bf8999cab6e86e4","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.9.tgz"},"readme":""},"0.3.10":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.10","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.2.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"5993013ab14f5c52ea3c7cde4e1525357e377f88","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.10.tgz"},"readme":""},"0.3.11":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.11","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.11","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.2.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"cb3201639a2dbc6b565d7cc46128e3ae03264c76","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.11.tgz"},"readme":""},"0.3.12":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.12","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.12","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"9f6104074e82904cc0cce16f7f2249690ac40d73","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.12.tgz"},"readme":""},"0.3.13":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.13","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.12","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.13","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"b8062bd75b0181157623c56935c647381cb62679","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.13.tgz"},"readme":""},"0.3.14":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.14","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.13","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.14","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"ef88b114d5ef33aebae1854b93c71fc234ea883a","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.14.tgz"},"readme":""},"0.3.15":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.15","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.13","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.15","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"4d42fe379bedc340c1c984edf8977af08f00c10d","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.15.tgz"},"readme":""},"0.3.16":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.16","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.13","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.16","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"56c090c0c33b7a422484955d4eb3e8d6d696ecaf","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.16.tgz"},"readme":""},"0.3.17":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.17","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.13","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.17","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"c7fdf19ab852cb9029518ed0d9d7b9a76b339455","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.17.tgz"},"readme":""},"0.3.18":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.18","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.13","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.18","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"04f70d3829d72d2b2bc81b0dfb121a5d548775e4","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.18.tgz"},"readme":""},"0.3.19":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.19","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.14","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.19","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"6651766ca498e1b6902b4b2c968bf6c32d9384e5","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.19.tgz"},"readme":""},"0.3.20":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.20","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.14","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.20","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"b6060fef520f8a8befaaafb254ee0939d8ace0b5","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.20.tgz"},"readme":""},"0.3.21":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.21","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.14","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.21","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"19447d78b999e5d3067b6411a691042441b6fa2a","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.21.tgz"},"readme":""},"0.3.22":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.22","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.15","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.22","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"3a54a3963c597f5fa254dc68e44968cec9fa9190","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.22.tgz"},"readme":""},"0.3.23":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.23","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.16","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.23","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"b1640350b23491a82eb1b173cb351a52d6fcfb72","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.23.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run::\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.24":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.24","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.17","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.24","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"bf6f39cbb53c9bfc54c518266e01ed8564137435","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.24.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run::\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.25":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.25","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.19","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.25","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"a53bf4241d071f2fa049aef44db1419329c5704f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.25.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.26":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.26","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.20","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.26","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"dca0f6c2f53d47b7bb0d29a1e828e420371c6a6a","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.26.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.27":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.27","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.21","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.27","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"97b82babba9bd23217cdae5aa0ea33744053ece7","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.27.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.28":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.28","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.22","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.28","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"52ae07651ed99bf903ec3b7a9fe50040dffa58d0","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.28.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.29":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.29","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.23","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.29","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"4174cd51b68837d8c551eab87e1fd1a7383d2861","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.29.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.31":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.31","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.24","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.31","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"61a25acbda2491b5995f001fa6578204b489032f","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.31.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.32":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.32","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.25","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.32","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"602f8e65ccef954fca3d5477c4b3a48300227020","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.32.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.33":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.33","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.26","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.33","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"a8ceaa4ca767fbee165baa1be78211633441e030","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.33.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.34":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.34","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.26","assetgraph-sprite":"=0.2.8","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.34","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"6b293374e44b8f1387f7ffa985c5e303e87df86b","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.34.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.35":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.35","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.26","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.9"},"optionalDependencies":{"assetgraph-sprite":"=0.2.9"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.35","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"65491f911ffd9bc32eafdd1db86dfec43f253ec1","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.35.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though)\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder's supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.36":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.36","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.27","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.10"},"optionalDependencies":{"assetgraph-sprite":"=0.2.10"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.36","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"f451f2a23bfe4d4d99317ccd8c7e68c2375f562d","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.36.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.37":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.37","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.28","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.10"},"optionalDependencies":{"assetgraph-sprite":"=0.2.10"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.37","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"3ec6c7ee48d211adbbfeeece8b0c37d3185701a7","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.37.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for IE via a conditional comment.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames all static to a 10-char MD5 prefix + the original extension\n   so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with a\n`.i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.38":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.38","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.29","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.10"},"optionalDependencies":{"assetgraph-sprite":"=0.2.10"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.38","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"69e31a463935d2bed573f1295e8e44da92da72ba","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.38.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.39":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.39","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.29","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.10"},"optionalDependencies":{"assetgraph-sprite":"=0.2.10"},"devDependencies":{"vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.39","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"18351a35be944d482eb140800a1ecc66674679ad","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.39.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.40":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.40","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.30","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.10"},"optionalDependencies":{"assetgraph-sprite":"=0.2.10"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.40","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"e502de3caa2537d709742e5a544df43ac52cb887","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.40.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.41":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.41","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.31","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.41","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"6204ed26fbbedc607de3278f2c48de802ddb7578","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.41.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.42":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.42","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.32","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.42","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","optimisePngs":"bin/optimisePngs","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"1485133cb210249ffd37a6c02a16234c8ecd73ff","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.42.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.43":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.43","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.32","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.43","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimisePngs":"bin/optimisePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"54b0df11cb57cd61617a4b35372fecda02687d10","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.43.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root /path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.44":{"name":"assetgraph-builder","description":"AssetGraph-builder ==================","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.44","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.33","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimisePngs":"bin/optimisePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.44","dist":{"shasum":"704067da6379d7767b4d667659cd54f2f723d116","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.44.tgz"}},"0.3.45":{"name":"assetgraph-builder","description":"AssetGraph-builder ==================","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.45","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.34","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimisePngs":"bin/optimisePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.45","dist":{"shasum":"287310b731f27b9465b8dacdbb5c7df9fa8672df","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.45.tgz"}},"0.3.46":{"name":"assetgraph-builder","description":"AssetGraph-builder ==================","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.46","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.35","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimisePngs":"bin/optimisePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.46","dist":{"shasum":"fbc44b60e65c200d36c6d789aa2b5a90599f7758","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.46.tgz"}},"0.3.47":{"name":"assetgraph-builder","description":"AssetGraph-builder ==================","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.47","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.36","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.47","dist":{"shasum":"453f3b0865119f2c5540043491e24c3343dbfea8","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.47.tgz"}},"0.3.48":{"name":"assetgraph-builder","description":"AssetGraph-builder ==================","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.48","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.37","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.48","dist":{"shasum":"4c26dd7fade163772f9afe5d1c5daab2ff983b58","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.48.tgz"}},"0.3.49":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.49","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.38","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.49","dist":{"shasum":"6d759e497a84a94db6c3f949fbb6695533181200","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.49.tgz"}},"0.3.50":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.50","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.39","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"bin":{"applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","buildProduction":"bin/buildProduction","findUnusedSelectors":"bin/findUnusedSelectors","flattenOneInclude":"bin/flattenOneInclude","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n","_id":"assetgraph-builder@0.3.50","dist":{"shasum":"a9812af3aecb1bf393f67bd8097d6352efe3bf65","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.50.tgz"}},"0.3.51":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.51","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.40","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.51","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"makeBabelJob":"bin/makeBabelJob","buildProduction":"bin/buildProduction","buildDevelopment":"bin/buildDevelopment","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n","flattenOneInclude":"bin/flattenOneInclude","findUnusedSelectors":"bin/findUnusedSelectors","applyBabelJob":"bin/applyBabelJob"},"dist":{"shasum":"5e44aa3580cc005dd0ceee00be5b25181a5452aa","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.51.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.52":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.52","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.41","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.52","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"d70a5ee663aaf81c330abad2d72532328d367c18","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.52.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.53":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.53","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.53","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"b8f71ae8f67fae5f4a80f195c55a8fe6aae7d45b","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.53.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.54":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.54","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.54","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"963cbba765598f31c8e58aa6184c1f8f40a18b95","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.54.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.55":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.55","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.55","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","optimizePngs":"bin/optimizePngs","makeBabelJob":"bin/makeBabelJob","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"07688e471aac216ea59650c337941b94ee734e24","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.55.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.56":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.56","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.56","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"5f78883b159dfc30587073771d5106ff9250eaae","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.56.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.57":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.57","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.1"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.57","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"d8572df6e35958062a95223a8b06fad9abcda973","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.57.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.58":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.58","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.2"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.2"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.58","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"ca2dc8892ae7589df1992aec077a808bb8545f63","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.58.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"},"0.3.59":{"name":"assetgraph-builder","description":"Build system for web sites and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"version":"0.3.59","keywords":["assetgraph","web","build","build system","single page","web application","static html","cache manifest","appcache","spriting","html","css","javascript","jsdom","localization","internationalization","i18n","l10n"],"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"assetgraph":"=0.4.42","bufferjs":"=1.0.2","memoizer":"=0.0.4","optimist":"=0.2.6","passerror":"=0.0.1","seq":"=0.3.5","temp":"=0.4.0","uglifyast":"=0.0.1","uglify-js":"=1.2.5","underscore":"=1.2.0","assetgraph-sprite":"=0.2.11","histogram":"=0.1.2"},"optionalDependencies":{"assetgraph-sprite":"=0.2.11","histogram":"=0.1.2"},"devDependencies":{"vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"scripts":{"prepublish":"npm install && vows"},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-builder@0.3.59","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"findUnusedSelectors":"bin/findUnusedSelectors","buildProduction":"bin/buildProduction","flattenOneInclude":"bin/flattenOneInclude","applyBabelJob":"bin/applyBabelJob","buildDevelopment":"bin/buildDevelopment","makeBabelJob":"bin/makeBabelJob","optimizePngs":"bin/optimizePngs","refreshI18n":"bin/refreshI18n"},"dist":{"shasum":"b70a59db4487e218df3ec6bb06946d94d1180aeb","tarball":"http://registry.npmjs.org/assetgraph-builder/-/assetgraph-builder-0.3.59.tgz"},"readme":"AssetGraph-builder\n==================\n\nAssetGraph-based build system (mostly) for single-page web\napplications.\n\n * Requires no build manifest. All information about your project is\n   gathered from the HTML/CSS/JavaScript itself. Just tell it where to\n   find your HTML file(s), and it will find the referenced JavaScript,\n   CSS, etc.\n * Reads your web application from one directory, manipulates and\n   optimizes it, then writes the resulting build to a separate\n   directory with everything included.\n * Supports a multitude of asset/relation types, even shortcut icons,\n   `AlphaImageLoader` images, conditional comments, fonts linked via\n   `@font-face { src: url(...) }`, .htc files linked via CSS\n   `behavior` properties.\n * Bundles JavaScript and CSS.\n * Removes duplicate images, JavaScript, Css, etc.\n * Minifies/packs JavaScript, CSS, and HTML (uses <a\n   href=\"https://github.com/mishoo/UglifyJS\">UglifyJS</a> and <a\n   href=\"https://github.com/jbleuzen/node-cssmin\">cssmin</a>, and <a\n   href=\"https://github.com/tmpvar/jsdom\">jsdom</a>).\n * Supports require.js `define` and `require` statements, rolls up the\n   dependency graph like <a\n   href=\"http://requirejs.org/docs/optimization.html\">the require.js\n   optimizer</a> does (still missing some features though). Understands\n   the require.js config options `baseUrl` and `paths`.\n * Sprites background images (see <a\n   href=\"https://github.com/One-com/assetgraph-sprite\">assetgraph-sprite</a>).\n * Inlines CSS `background-image`s less than 8192 bytes and provides an\n   alternative stylesheet for older IE versions via conditional comments.\n * Adds a cache manifest to each HTML page if `--manifest` is\n   specified.\n * Compiles <a href=\"http://lesscss.org/\">less</a> to CSS and strips\n   out the in-browser less compiler.\n * Renames JavaScript, CSS, images etc. to a 10-char MD5 prefix + the\n   original extension so they can be served with a far-future expiry time.\n * Supports a special syntax for getting the url of static assets from\n   JavaScript code (`one.getStaticUrl`). These are also modelled as\n   relations so the target files will be included in the build and thus\n   renamed so they can be served with a far-future expiry time.\n * Helps getting your static assets on a CDN by rewriting the\n   references to them (controlled by the `--cdnroot` and\n   `--cdnoutroot` switches).\n * Supports internationalization of HTML, JavaScript, and Knockout.js\n   templates (support for more template formats will be added on demand).\n * Very customizable, the entire build script is only around 100 lines\n   of code due to the reliance on high level <a\n   href=\"https://github.com/One-com/assetgraph\">AssetGraph</a>\n   transforms.\n\n\nInstallation\n------------\n\nMake sure you have node.js and <a href=\"http://npmjs.org/\">npm</a> installed,\nthen run:\n\n    $ npm install -g assetgraph-builder\n\nNow you'll have the `buildProduction` script in your PATH.\n\n\nExample usage\n-------------\n\nBuild a single page application:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html\n\nThis will load path/to/dev/index.html, follow all local relations to\nJavaScript, CSS, etc., perform the above mentioned optimizations, then\noutput the result to the directory `path/to/production`.\n\nCreate a CDN-enabled build:\n\n    buildProduction --outroot path/to/production --root path/to/dev path/to/dev/index.html \\\n                    --cdnroot http://xxxxxx.cloudfront.net/static/cdn \\\n                    --cdnoutroot path/to/production/static/cdn\n\nThis will produce a build that assumes that the contents of `path/to/production/static/cdn`\nare available at `http://xxxxxx.cloudfront.net/static/cdn`. We recommend putting the entire\ncontents of `path/to/production` online and pointing your CloudFront (or other CDN provider)\ndistribution at the root of your origin server. As long as you serve `/static` and everything\nbelow it with a far-future expires, you won't need to touch your CDN config or manually\nupload anything to your CDN provider.\n\nInternationalization\n--------------------\n\nAssetGraph-builder supports internationalization of strings in your\nHTML and JavaScript code via a custom syntax. The approach is to do as\nmuch as possible at \"compile time\". For each language you want to\nsupport, `buildProduction` outputs a separate html file,\neg. `index.en_US.html`, `index.da.html`, and so on. If you're using\nthe `one.tr`/`one.trPattern` syntax for getting language-specific\nstrings within JavaScript, `buildProduction` will also output multiple\nversions of your JavaScript, one per language, and it will be wired up\nso that eg. `index.da.html` will refer to the Danish JavaScript file.\n\nThe i18n feature is optional. Enable it by specifying the `--locale`\nswitch with a comma-separated list of locale ids to compile, for\nexample `--locale en_US,da,fr,de`.\n\nThe translations themselves reside in separate JSON files with an\n`i18n` extension. Example syntax (`foo.i18n`):\n\n    {\n        \"myKeyName\": {\n            \"en\": \"The value in English\",\n            \"da\": \"Værdien på dansk\"\n        },\n        \"myOtherKeyName\": {\n            \"en\": \"The other value in English\",\n            \"da\": \"Den anden værdi på dansk\"\n        },\n        \"advancedKeyWithPlaceholders\": {\n            \"en\": \"Showing {0}-{1} of {2} records\",\n            \"da\": \"Der er {2} i alt, viser fra nr. {0} til nr. {1}\"\n        }\n    }\n\n### JavaScript i18n syntax ###\n\nIn JavaScript code you can use the `one.tr` function for getting a\nlocale string and `one.trPattern` for getting a function that accepts\nthe placeholder values and returns a locale string.\n\nFor these functions to work in development, you currently have to use\n`buildDevelopment` tool (still to be documented) to inject some\nbootstrapper code that implements them. The bootstrapper will be\nremoved by `buildProduction`.\n\nThe second argument for `one.tr` and `one.trPattern` is optional. It\nwill be used as the default value if the key isn't found in an .i18n\nfile. This is very useful when you haven't yet translated your\nproject. That way you don't need to create the .i18n files before you\nactually have something to put in them.\n\nJavaScript example:\n\n    one.include('foo.i18n');\n\n    // This alerts \"The value in English\" or \"Værdien på dansk\" depending on which build you're running:\n    alert(one.tr('myKeyName', 'the default value'));\n\n    // This alerts \"Showing 1-50 of 100 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    var foo = 1, bar = 50;\n    alert(one.trPattern('advancedKeyWithPlaceholders', 'the default value')(foo, bar, 100));\n\n    var myRenderer = one.trPattern('advancedKeyWithPlaceholders', 'the default value');\n    // This also alerts \"Showing 1-2 of 3 records\" or \"Der er 100 i alt, viser fra nr. 1 til nr. 50\":\n    alert(myRenderer(1, 50, 100));\n\nIn production this compiles into (English version):\n\n    alert('The value in English');\n    var foo = 1, bar = 50;\n    alert('Showing ' + foo + '-' + bar + ' of 100 records');\n\n    var myRenderer = function (a0, a1, a2) {return 'Showing ' + a0 + '-' + a1 + ' of ' + a2 + ' records'};\n    alert(myRenderer(1, 50, 100));\n\nAnd the Danish version:\n\n    alert('Værdien på dansk');\n    var foo = 1, bar = 50;\n    alert('Der er 100 i alt, viser fra nr. ' + foo + ' til nr. ' + bar);\n\n    var myRenderer = function (a0, a1, a2) {return 'Der er ' + a3 + ' i alt, viser nr. ' + a0 + ' til nr. ' + a1;};\n    alert(myRenderer(1, 50, 100));\n\n\n### HTML i18n syntax ###\n\nSimple example:\n\n    <p><span data-i18n=\"myKeyName\">The default text</span></p>\n\nSpan tags that only have a `data-i18n` attribute are removed, so the above compiles to:\n\n    <p>The value in English</p>\n\nIf you put the `data-i18n` attribute on a different tag (eg. `<div>`\nor `<h2>`) or use a span with additional attributes, the tag itself\nwill be preserved, and only the `data-i18n` attribute will be removed:\n\n     <span class=\"foo\" data-i18n=\"myKeyName\">The default text</span>\n\nWhich compiles into:\n\n     <span class=\"foo\">The value in English</span>\n\nNon-text node elements inside the default text are interpreted as placeholders numbered from left to right:\n\n     <span data-18n=\"advancedKeyWithPlaceholders\">Showing <span>1</span> to <span>50</span> of <span>100</span></span>\n\nIn the Danish version the above compiles to:\n\n     Der er <span>100</span> i alt, viser nr. <span>1</span> til nr. <span>50</span>.\n\nFor HTML attributes there's a more elaborate, Knockout.js-ish syntax for the `data-i18n` attribute:\n\n    <div title=\"The default value\" data-i18n=\"text: 'myKeyName', attr: {title: 'myOtherKeyName'}\">The default value</span>\n\nWhich compiles to this in English:\n\n    <div title=\"The other value in English\">The value in English</span>\n\nLicense\n-------\n\nAssetGraph-builder is licensed under a standard 3-clause BSD license\n-- see the `LICENSE`-file for details.\n"}},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2012-08-15T09:47:55.408Z","created":"2011-06-23T10:24:23.522Z","0.0.1":"2011-06-23T10:24:24.115Z","0.0.2":"2011-06-23T11:09:28.840Z","0.0.3":"2011-06-23T11:19:25.238Z","0.0.4":"2011-06-24T10:24:09.133Z","0.0.5":"2011-06-29T11:48:32.753Z","0.0.6":"2011-06-30T08:06:52.391Z","0.0.7":"2011-07-11T11:28:00.535Z","0.0.8":"2011-07-11T14:35:48.796Z","0.0.9":"2011-08-02T15:43:25.711Z","0.0.10":"2011-08-03T08:54:28.744Z","0.0.11":"2011-08-11T15:47:48.679Z","0.1.0":"2011-08-14T22:59:26.616Z","0.1.1":"2011-08-15T15:30:28.757Z","0.1.2":"2011-08-16T09:58:44.511Z","0.1.3":"2011-08-16T10:41:05.869Z","0.1.4":"2011-08-16T16:35:45.864Z","0.1.5":"2011-08-21T13:21:18.332Z","0.1.6":"2011-08-25T11:44:28.681Z","0.1.7":"2011-08-25T14:43:51.918Z","0.1.8":"2011-08-25T15:46:14.682Z","0.1.9":"2011-08-25T20:58:37.925Z","0.2.0":"2011-09-13T23:09:52.158Z","0.2.1":"2011-09-19T20:13:07.126Z","0.1.10":"2011-09-21T14:26:13.438Z","0.2.2":"2011-09-21T23:46:26.315Z","0.2.3":"2011-09-22T12:52:59.559Z","0.2.4":"2011-09-23T21:57:56.273Z","0.2.5":"2011-09-26T08:07:55.864Z","0.2.6":"2011-09-26T09:38:23.733Z","0.2.7":"2011-09-27T23:25:01.552Z","0.2.8":"2011-10-01T15:19:10.040Z","0.2.9":"2011-10-01T16:59:13.550Z","0.2.10":"2011-10-01T17:05:44.954Z","0.2.11":"2011-10-02T09:34:29.843Z","0.2.12":"2011-10-04T12:56:39.983Z","0.2.13":"2011-10-06T18:31:17.133Z","0.2.14":"2011-10-06T20:21:03.577Z","0.2.15":"2011-10-06T20:58:27.023Z","0.2.16":"2011-10-10T11:05:16.959Z","0.2.17":"2011-10-11T16:40:03.890Z","0.2.18":"2011-10-14T13:13:38.681Z","0.2.19":"2011-10-15T21:04:09.807Z","0.2.20":"2011-10-27T14:40:18.873Z","0.2.21":"2011-10-31T09:11:08.315Z","0.2.22":"2011-11-09T16:23:36.772Z","0.2.23":"2011-11-10T12:13:15.816Z","0.2.24":"2011-11-14T20:03:46.204Z","0.2.25":"2011-11-14T22:01:11.881Z","0.2.26":"2011-11-17T10:49:13.316Z","0.2.27":"2011-11-19T21:39:21.598Z","0.2.28":"2011-11-28T22:54:30.009Z","0.2.29":"2011-11-29T08:28:01.846Z","0.2.30":"2011-11-30T13:48:22.301Z","0.2.31":"2011-11-30T16:01:11.006Z","0.2.32":"2011-12-01T12:26:28.313Z","0.2.33":"2011-12-05T13:10:10.264Z","0.2.34":"2011-12-15T10:57:50.964Z","0.2.35":"2011-12-19T12:29:51.692Z","0.2.36":"2011-12-28T13:50:14.216Z","0.2.37-pre":"2012-01-02T10:44:57.527Z","0.2.37":"2012-01-02T10:46:09.459Z","0.2.38":"2012-01-02T16:41:23.283Z","0.2.39":"2012-01-02T17:06:47.891Z","0.2.40":"2012-01-04T09:47:36.107Z","0.2.41":"2012-01-04T10:30:25.520Z","0.2.42":"2012-01-04T17:33:40.121Z","0.2.43":"2012-01-09T13:09:26.778Z","0.2.44":"2012-01-11T16:23:46.567Z","0.2.45":"2012-01-11T16:21:47.799Z","0.2.46":"2012-01-11T21:32:43.963Z","0.2.47":"2012-01-15T12:01:25.355Z","0.2.48":"2012-01-16T00:15:09.147Z","0.2.49":"2012-01-16T12:24:36.469Z","0.2.50":"2012-01-16T12:46:15.346Z","0.2.51":"2012-01-16T13:02:55.906Z","0.2.52":"2012-01-16T22:47:37.332Z","0.2.53":"2012-01-19T09:24:06.429Z","0.2.54":"2012-01-31T09:06:30.488Z","0.2.55":"2012-01-31T09:37:03.464Z","0.2.56":"2012-02-09T17:46:39.460Z","0.2.57":"2012-02-10T16:18:10.169Z","0.2.58":"2012-02-11T09:39:13.769Z","0.2.59":"2012-02-21T18:25:51.722Z","0.2.60":"2012-02-21T18:33:29.066Z","0.2.61":"2012-02-26T17:26:21.429Z","0.3.0":"2012-02-26T17:32:03.520Z","0.3.1":"2012-02-26T23:01:41.586Z","0.3.2":"2012-02-27T13:28:43.328Z","0.3.3":"2012-02-27T14:59:37.360Z","0.3.4":"2012-03-02T17:29:59.487Z","0.3.5":"2012-03-06T20:43:08.249Z","0.3.6":"2012-03-22T09:38:22.136Z","0.3.7":"2012-03-29T20:35:47.736Z","0.3.8":"2012-03-31T16:33:31.188Z","0.3.9":"2012-03-31T17:15:39.469Z","0.3.10":"2012-04-01T20:49:53.217Z","0.3.11":"2012-04-02T09:08:19.173Z","0.3.12":"2012-04-02T10:45:15.171Z","0.3.13":"2012-04-02T15:42:35.968Z","0.3.14":"2012-04-03T13:27:12.755Z","0.3.15":"2012-04-09T20:46:41.814Z","0.3.16":"2012-04-09T20:47:12.603Z","0.3.17":"2012-04-09T22:02:35.592Z","0.3.18":"2012-04-09T23:44:19.872Z","0.3.19":"2012-04-12T12:40:13.525Z","0.3.20":"2012-04-12T23:17:39.035Z","0.3.21":"2012-04-13T20:13:37.687Z","0.3.22":"2012-04-14T21:33:18.797Z","0.3.23":"2012-04-15T20:07:54.451Z","0.3.24":"2012-04-19T08:16:42.502Z","0.3.25":"2012-05-01T21:09:58.082Z","0.3.26":"2012-05-13T21:00:12.527Z","0.3.27":"2012-05-14T12:09:00.215Z","0.3.28":"2012-05-18T15:12:44.759Z","0.3.29":"2012-05-21T08:40:17.210Z","0.3.31":"2012-05-22T13:48:37.879Z","0.3.32":"2012-05-22T14:13:43.894Z","0.3.33":"2012-05-22T14:31:21.483Z","0.3.34":"2012-05-22T16:12:45.073Z","0.3.35":"2012-05-24T22:01:58.645Z","0.3.36":"2012-06-12T21:28:12.041Z","0.3.37":"2012-06-13T06:23:24.841Z","0.3.38":"2012-06-14T18:37:29.992Z","0.3.39":"2012-06-15T13:34:32.505Z","0.3.40":"2012-06-16T16:09:59.598Z","0.3.41":"2012-06-18T23:05:57.111Z","0.3.42":"2012-06-18T23:30:50.508Z","0.3.43":"2012-06-20T12:01:34.189Z","0.3.44":"2012-06-22T14:56:11.060Z","0.3.45":"2012-06-25T15:40:34.108Z","0.3.46":"2012-06-26T09:45:42.071Z","0.3.47":"2012-06-29T16:19:23.478Z","0.3.48":"2012-07-05T07:42:26.159Z","0.3.49":"2012-07-05T14:55:59.011Z","0.3.50":"2012-07-17T07:31:08.136Z","0.3.51":"2012-07-24T21:05:18.124Z","0.3.52":"2012-07-27T12:27:09.266Z","0.3.53":"2012-08-07T14:30:40.708Z","0.3.54":"2012-08-08T11:50:11.168Z","0.3.55":"2012-08-08T15:47:31.303Z","0.3.56":"2012-08-08T15:56:03.853Z","0.3.57":"2012-08-10T12:52:06.767Z","0.3.58":"2012-08-13T07:26:03.086Z","0.3.59":"2012-08-15T09:47:55.408Z"},"repository":{"type":"git","url":"git://github.com/One-com/assetgraph-builder.git"},"users":{"fgribreau":true},"_attachments":{"assetgraph-builder-0.3.59.tgz":{"content_type":"application/octet-stream","revpos":334,"digest":"md5-GcuAymiAiOnXzTcL2Ybwvg==","length":66783,"stub":true},"assetgraph-builder-0.3.58.tgz":{"content_type":"application/octet-stream","revpos":332,"digest":"md5-YOBd8PXNo937wf7wLURrsQ==","length":66780,"stub":true},"assetgraph-builder-0.3.57.tgz":{"content_type":"application/octet-stream","revpos":330,"digest":"md5-G5bhMloAHu/D/MXLQIM48Q==","length":66782,"stub":true},"assetgraph-builder-0.3.56.tgz":{"content_type":"application/octet-stream","revpos":328,"digest":"md5-LwMforehcGyQcPAoth1TrQ==","length":66784,"stub":true},"assetgraph-builder-0.3.55.tgz":{"content_type":"application/octet-stream","revpos":326,"digest":"md5-hkHDQlVAt3FLVEDoAdnAcw==","length":66782,"stub":true},"assetgraph-builder-0.3.54.tgz":{"content_type":"application/octet-stream","revpos":324,"digest":"md5-Mks4oaSD7rUQpb3H146VWw==","length":66771,"stub":true},"assetgraph-builder-0.3.53.tgz":{"content_type":"application/octet-stream","revpos":322,"digest":"md5-opNZrBAyY9heR8EsSYs/WQ==","length":66416,"stub":true},"assetgraph-builder-0.3.52.tgz":{"content_type":"application/octet-stream","revpos":319,"digest":"md5-qODty1WeO7Q/4RITalE3vg==","length":66415,"stub":true},"assetgraph-builder-0.3.51.tgz":{"content_type":"application/octet-stream","revpos":317,"digest":"md5-eZDJmCgoy+/1C3Ckxnf9kg==","length":66023,"stub":true},"assetgraph-builder-0.3.50.tgz":{"content_type":"application/octet-stream","revpos":315,"digest":"md5-AyYWeBmlT8E87ArsBeHNYA==","length":66210,"stub":true},"assetgraph-builder-0.3.49.tgz":{"content_type":"application/octet-stream","revpos":313,"digest":"md5-qLcAqpWem0zXtqxeIazEww==","length":66138,"stub":true},"assetgraph-builder-0.3.48.tgz":{"content_type":"application/octet-stream","revpos":311,"digest":"md5-SVAZjtvYkHZ+tn2Wc9p3cw==","length":66134,"stub":true},"assetgraph-builder-0.3.47.tgz":{"content_type":"application/octet-stream","revpos":309,"digest":"md5-1maYhDPctlULxligm/3LkQ==","length":65894,"stub":true},"assetgraph-builder-0.3.46.tgz":{"content_type":"application/octet-stream","revpos":307,"digest":"md5-U9b9WhRFeUAwHCVbzFqoiA==","length":64987,"stub":true},"assetgraph-builder-0.3.45.tgz":{"content_type":"application/octet-stream","revpos":305,"digest":"md5-7ULOvCY9wZDV0cK6I1+2/g==","length":64996,"stub":true},"assetgraph-builder-0.3.44.tgz":{"content_type":"application/octet-stream","revpos":303,"digest":"md5-qmQFX+mGp2A1PBOu/rx16A==","length":64978,"stub":true},"assetgraph-builder-0.3.43.tgz":{"content_type":"application/octet-stream","revpos":297,"digest":"md5-ntOKaaNs9wADxpeGDyRWsQ==","length":64729,"stub":true},"assetgraph-builder-0.3.42.tgz":{"content_type":"application/octet-stream","revpos":295,"digest":"md5-VSccaTocA8C6SnC0TivlaQ==","length":64285,"stub":true},"assetgraph-builder-0.3.41.tgz":{"content_type":"application/octet-stream","revpos":293,"digest":"md5-N8whMbSd7Pmxo7wGRy7fXw==","length":64265,"stub":true},"assetgraph-builder-0.3.40.tgz":{"content_type":"application/octet-stream","revpos":291,"digest":"md5-JihvPUUYYCISC9op873OyQ==","length":64263,"stub":true},"assetgraph-builder-0.3.39.tgz":{"content_type":"application/octet-stream","revpos":289,"digest":"md5-VH5v2OVGJxJSKUlndVNNHQ==","length":64122,"stub":true},"assetgraph-builder-0.3.38.tgz":{"content_type":"application/octet-stream","revpos":287,"digest":"md5-zZUFcJCihJu+jxFdOcHUYA==","length":63542,"stub":true},"assetgraph-builder-0.3.37.tgz":{"content_type":"application/octet-stream","revpos":285,"digest":"md5-EiD0sC/U4sKMJxY0OZZ40w==","length":63510,"stub":true},"assetgraph-builder-0.3.36.tgz":{"content_type":"application/octet-stream","revpos":283,"digest":"md5-lVlGpQPC7OxxZO7qcbYBWQ==","length":63502,"stub":true},"assetgraph-builder-0.3.35.tgz":{"content_type":"application/octet-stream","revpos":277,"digest":"md5-/Y49Wkt+Nik4l0D32d8EQA==","length":63295,"stub":true},"assetgraph-builder-0.3.34.tgz":{"content_type":"application/octet-stream","revpos":271,"digest":"md5-SO33jS4ZAczUCRoz/qBNBA==","length":63731,"stub":true},"assetgraph-builder-0.3.33.tgz":{"content_type":"application/octet-stream","revpos":269,"digest":"md5-fJO/TtBI/qrhAFgI88B28g==","length":63755,"stub":true},"assetgraph-builder-0.3.32.tgz":{"content_type":"application/octet-stream","revpos":267,"digest":"md5-OPop2dKT7WWMLFbuskZPvQ==","length":63762,"stub":true},"assetgraph-builder-0.3.31.tgz":{"content_type":"application/octet-stream","revpos":265,"digest":"md5-IoziAZjJ68KFtsQtPJoPxQ==","length":63763,"stub":true},"assetgraph-builder-0.3.29.tgz":{"content_type":"application/octet-stream","revpos":263,"digest":"md5-Wdq2RAEOJIy2vljtH/DY7Q==","length":63756,"stub":true},"assetgraph-builder-0.3.28.tgz":{"content_type":"application/octet-stream","revpos":261,"digest":"md5-1ZpsuSKwBxLrXdb6ksuRnQ==","length":63260,"stub":true},"assetgraph-builder-0.3.27.tgz":{"content_type":"application/octet-stream","revpos":259,"digest":"md5-xK1/6zWPn88+XotAQzLtWQ==","length":63099,"stub":true},"assetgraph-builder-0.3.26.tgz":{"content_type":"application/octet-stream","revpos":257,"digest":"md5-GEsBKXCmFUZhEg4RPXz37Q==","length":62700,"stub":true},"assetgraph-builder-0.3.25.tgz":{"content_type":"application/octet-stream","revpos":255,"digest":"md5-2WfM0/RHL4ZvotzJFsf/tw==","length":62697,"stub":true},"assetgraph-builder-0.3.24.tgz":{"content_type":"application/octet-stream","revpos":253,"digest":"md5-6hUJhSAUL9AYdpQTLeiDIA==","length":47462,"stub":true},"assetgraph-builder-0.3.23.tgz":{"content_type":"application/octet-stream","revpos":251,"digest":"md5-14UapAaSee0Z5ore6acuvg==","length":47043,"stub":true},"assetgraph-builder-0.3.22.tgz":{"content_type":"application/octet-stream","revpos":249,"digest":"md5-lt1wLIQ/TGJ9/+h4UFoZzQ==","length":44931,"stub":true},"assetgraph-builder-0.3.21.tgz":{"content_type":"application/octet-stream","revpos":247,"digest":"md5-lag2jgW/Gf6y95N9sklCpw==","length":44896,"stub":true},"assetgraph-builder-0.3.20.tgz":{"content_type":"application/octet-stream","revpos":245,"digest":"md5-Ab5EkR7f2Agcp8H05bd2ew==","length":44913,"stub":true},"assetgraph-builder-0.3.19.tgz":{"content_type":"application/octet-stream","revpos":243,"digest":"md5-CxM0zRj/Z/Cc+5faoZIQeg==","length":44594,"stub":true},"assetgraph-builder-0.3.18.tgz":{"content_type":"application/octet-stream","revpos":241,"digest":"md5-QjqwhMYamEYmat3PcW8Phg==","length":44391,"stub":true},"assetgraph-builder-0.3.17.tgz":{"content_type":"application/octet-stream","revpos":239,"digest":"md5-fkWgO8sCG/PWm5nbenoDWg==","length":44313,"stub":true},"assetgraph-builder-0.3.16.tgz":{"content_type":"application/octet-stream","revpos":237,"digest":"md5-YsVjBxen0hcv0RURj3jAaw==","length":44128,"stub":true},"assetgraph-builder-0.3.15.tgz":{"content_type":"application/octet-stream","revpos":235,"digest":"md5-JM2EYbru6Tm863xcgqm2CQ==","length":43994,"stub":true},"assetgraph-builder-0.3.14.tgz":{"content_type":"application/octet-stream","revpos":229,"digest":"md5-+Hhod7Nv0XnUbUyEl11nKw==","length":41851,"stub":true},"assetgraph-builder-0.3.13.tgz":{"content_type":"application/octet-stream","revpos":227,"digest":"md5-mVqVSTMDtbXRF5ubOi9FHA==","length":41845,"stub":true},"assetgraph-builder-0.3.12.tgz":{"content_type":"application/octet-stream","revpos":225,"digest":"md5-WpRO/yJJgVTtVH+lCUSPvA==","length":41745,"stub":true},"assetgraph-builder-0.3.11.tgz":{"content_type":"application/octet-stream","revpos":223,"digest":"md5-+Qvocw0ROEi3N+BATi7pIw==","length":41750,"stub":true},"assetgraph-builder-0.3.10.tgz":{"content_type":"application/octet-stream","revpos":221,"digest":"md5-zIqdUwLWMi15CxIe3+Ef3A==","length":42811,"stub":true},"assetgraph-builder-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":219,"digest":"md5-BXyKxBGvaPmMHf8sdziC3Q==","length":42807,"stub":true},"assetgraph-builder-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":217,"digest":"md5-qBWVyZVMSW7rk9Gp12hTSQ==","length":42765,"stub":true},"assetgraph-builder-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":215,"digest":"md5-gb7CfTJgwF3Kpp6ohW4juA==","length":42763,"stub":true},"assetgraph-builder-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":213,"digest":"md5-UYh1AGu5gB7wnMRd8no1SQ==","length":41103,"stub":true},"assetgraph-builder-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":207,"digest":"md5-nPcTjwaBkiCjFbvifdwfHg==","length":41062,"stub":true},"assetgraph-builder-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":205,"digest":"md5-a3agsOgENnyMv2BC3jCjCA==","length":41258,"stub":true},"assetgraph-builder-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":203,"digest":"md5-IAbGuhZbKtLE9wVqRKawdg==","length":41260,"stub":true},"assetgraph-builder-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":201,"digest":"md5-CNFC285bnCOwzH4fcSrZyQ==","length":41270,"stub":true},"assetgraph-builder-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":199,"digest":"md5-upGsBbYczvK08a+TioixuQ==","length":41078,"stub":true},"assetgraph-builder-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":197,"digest":"md5-yR32AZ+azhhaJ2SuSgoIqg==","length":41077,"stub":true},"assetgraph-builder-0.2.61.tgz":{"content_type":"application/octet-stream","revpos":195,"digest":"md5-MoL9gL5j4cmk6C+xYmjH2Q==","length":40982,"stub":true},"assetgraph-builder-0.2.60.tgz":{"content_type":"application/octet-stream","revpos":193,"digest":"md5-NJdtivDnpCVBb2nmxegofA==","length":40980,"stub":true},"assetgraph-builder-0.2.59.tgz":{"content_type":"application/octet-stream","revpos":191,"digest":"md5-7fbKjU5sfolynJsQ4JXOYw==","length":40986,"stub":true},"assetgraph-builder-0.2.58.tgz":{"content_type":"application/octet-stream","revpos":181,"digest":"md5-oAYo9wuHAQ/cX9H/DInd1g==","length":40977,"stub":true},"assetgraph-builder-0.2.57.tgz":{"content_type":"application/octet-stream","revpos":179,"digest":"md5-OaO/I9vZ3+4eFcl1g/12Qw==","length":41121,"stub":true},"assetgraph-builder-0.2.56.tgz":{"content_type":"application/octet-stream","revpos":177,"digest":"md5-D2DTiJcnkrny0FIVj8bJ+g==","length":41072,"stub":true},"assetgraph-builder-0.2.55.tgz":{"content_type":"application/octet-stream","revpos":175,"digest":"md5-Gc+bYjxJY9rL8xxIWQUQ/g==","length":41029,"stub":true},"assetgraph-builder-0.2.54.tgz":{"content_type":"application/octet-stream","revpos":173,"digest":"md5-vquq1nPC/Tz0YpMueOIMCg==","length":40883,"stub":true},"assetgraph-builder-0.2.53.tgz":{"content_type":"application/octet-stream","revpos":167,"digest":"md5-RU1yJ5AlD+6s8smF0cWNfA==","length":40861,"stub":true},"assetgraph-builder-0.2.52.tgz":{"content_type":"application/octet-stream","revpos":165,"digest":"md5-bp+ncDiEycriL/mrfLZMrw==","length":40785,"stub":true},"assetgraph-builder-0.2.51.tgz":{"content_type":"application/octet-stream","revpos":163,"digest":"md5-t4onXiW0EimvqAB8obOTVA==","length":40813,"stub":true},"assetgraph-builder-0.2.50.tgz":{"content_type":"application/octet-stream","revpos":161,"digest":"md5-raxQ5F4xDlojC94jW7R9JQ==","length":40788,"stub":true},"assetgraph-builder-0.2.49.tgz":{"content_type":"application/octet-stream","revpos":159,"digest":"md5-0Pg5sfyIaIF8xJ2p6Gf2Tw==","length":40804,"stub":true},"assetgraph-builder-0.2.48.tgz":{"content_type":"application/octet-stream","revpos":157,"digest":"md5-3UZeomiIrNbm97AadIcQjg==","length":40625,"stub":true},"assetgraph-builder-0.2.47.tgz":{"content_type":"application/octet-stream","revpos":155,"digest":"md5-NVQWXOoXYR64sVCoZml1vA==","length":40632,"stub":true},"assetgraph-builder-0.2.46.tgz":{"content_type":"application/octet-stream","revpos":153,"digest":"md5-qgsBbY8uzSE2g5ZNeRNnCA==","length":40654,"stub":true},"assetgraph-builder-0.2.44.tgz":{"content_type":"application/octet-stream","revpos":151,"digest":"md5-pr5Dm2oCvhENI5sVdEnhWA==","length":40633,"stub":true},"assetgraph-builder-0.2.45.tgz":{"content_type":"application/octet-stream","revpos":147,"digest":"md5-DqYqGnDKt+O2rhRzOsNUtg==","length":40783,"stub":true},"assetgraph-builder-0.2.43.tgz":{"content_type":"application/octet-stream","revpos":143,"digest":"md5-OeWo4xHMb5nYjgunV7rZcg==","length":40827,"stub":true},"assetgraph-builder-0.2.42.tgz":{"content_type":"application/octet-stream","revpos":141,"digest":"md5-Uh2/jmI43L2hJdUKYP4Cfw==","length":40774,"stub":true},"assetgraph-builder-0.2.41.tgz":{"content_type":"application/octet-stream","revpos":139,"digest":"md5-aCOhEeuUdizItl1Y0CD+dA==","length":40523,"stub":true},"assetgraph-builder-0.2.40.tgz":{"content_type":"application/octet-stream","revpos":137,"digest":"md5-VAGZDxEAv08Lgn8hyXxqeA==","length":40328,"stub":true},"assetgraph-builder-0.2.39.tgz":{"content_type":"application/octet-stream","revpos":135,"digest":"md5-1VCbK3d6PC5TYAnNzxp3rg==","length":40140,"stub":true},"assetgraph-builder-0.2.38.tgz":{"content_type":"application/octet-stream","revpos":133,"digest":"md5-pg/wtmwoS9HvFxoHo7ZjOQ==","length":40177,"stub":true},"assetgraph-builder-0.2.37.tgz":{"content_type":"application/octet-stream","revpos":131,"digest":"md5-Tz5Pgywslg78TBKZkSvqsg==","length":40323,"stub":true},"assetgraph-builder-0.2.37-pre.tgz":{"content_type":"application/octet-stream","revpos":129,"digest":"md5-rxqePZi9+2y6ogZ61jiusg==","length":40061,"stub":true},"assetgraph-builder-0.2.36.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-kbPZKkfR7aTPOmvBP8Q3ng==","length":42100,"stub":true},"assetgraph-builder-0.2.35.tgz":{"content_type":"application/octet-stream","revpos":125,"digest":"md5-uhLvmjAmGNfNygz6QGOJ5A==","length":41547,"stub":true},"assetgraph-builder-0.2.34.tgz":{"content_type":"application/octet-stream","revpos":123,"digest":"md5-yBOfWfCfer1BSEQQY0OH9A==","length":41508,"stub":true},"assetgraph-builder-0.2.33.tgz":{"content_type":"application/octet-stream","revpos":121,"digest":"md5-kH6PSAmIBGMxf2AG/SEopw==","length":41667,"stub":true},"assetgraph-builder-0.2.32.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-bQFhRLySV13saD8xDwH1WA==","length":42117,"stub":true},"assetgraph-builder-0.2.31.tgz":{"content_type":"application/octet-stream","revpos":117,"digest":"md5-2z9kqTkPrlXT+YDVfDjrCQ==","length":41623,"stub":true},"assetgraph-builder-0.2.30.tgz":{"content_type":"application/octet-stream","revpos":115,"digest":"md5-nlWd/5wE+fzncCA10GzLTA==","length":41513,"stub":true},"assetgraph-builder-0.2.29.tgz":{"content_type":"application/octet-stream","revpos":113,"digest":"md5-ezRviE5shbe+0Oumi9V8zw==","length":41365,"stub":true},"assetgraph-builder-0.2.28.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-z7Yc8iXcrMR/jV9JTQrPIA==","length":41362,"stub":true},"assetgraph-builder-0.2.27.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-fhobXzExjEiBr9C64CPGgQ==","length":41364,"stub":true},"assetgraph-builder-0.2.26.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-Kbx8ke0n1epN91K+iB+yqQ==","length":41585,"stub":true},"assetgraph-builder-0.2.25.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-C4TxumPYQJXEjA9VXfdHEg==","length":41205,"stub":true},"assetgraph-builder-0.2.24.tgz":{"content_type":"application/octet-stream","revpos":103,"digest":"md5-j+fL2VYCK2psXsu+ADO1lw==","length":41205,"stub":true},"assetgraph-builder-0.2.23.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-mcUPMiO3++AaSsZh7mwzjw==","length":23652,"stub":true},"assetgraph-builder-0.2.22.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-NDfWr34fVq3qr6H6+VlKMg==","length":22113,"stub":true},"assetgraph-builder-0.2.21.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-HTtaU7TaySvNRLAeEMqGXQ==","length":22141,"stub":true},"assetgraph-builder-0.2.20.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-ikIfzMUOat0RuWZ2oA/RQg==","length":21975,"stub":true},"assetgraph-builder-0.2.19.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-TIKYva7VLlHjtQhzjf9kJw==","length":21579,"stub":true},"assetgraph-builder-0.2.18.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-KBzM+ALa+S2rMYKy0YN+oA==","length":21710,"stub":true},"assetgraph-builder-0.2.17.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-WN1tBkA4WsMDWt6yasnZRw==","length":21631,"stub":true},"assetgraph-builder-0.2.16.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-7JKf5Li6EogS8tEYFUKCrA==","length":281397,"stub":true},"assetgraph-builder-0.2.15.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-yh36YGbAdRX+PiiSfkY7Bw==","length":21158,"stub":true},"assetgraph-builder-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-H8L8VTOFLr27xnQUFrGYcQ==","length":21165,"stub":true},"assetgraph-builder-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-NbxhBt1TUWQU6cUJDAIUrQ==","length":20991,"stub":true},"assetgraph-builder-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-ys8Mw/JopGU/EaKmXMuYOA==","length":18837,"stub":true},"assetgraph-builder-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-+1yB7b4FhGs3esakjTgFYQ==","length":18847,"stub":true},"assetgraph-builder-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-uxq1rCn7m5isrLR6aEViuw==","length":18805,"stub":true},"assetgraph-builder-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-0XNoGVat1lLZZp9onT5dKQ==","length":18803,"stub":true},"assetgraph-builder-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-QSP4tXLB+mIIZy25aZQZ2w==","length":18811,"stub":true},"assetgraph-builder-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-OrRg9KhF5LNgvP9exZzFcQ==","length":18809,"stub":true},"assetgraph-builder-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-y3dB3Z1w+C+dVnLMllKTHw==","length":18851,"stub":true},"assetgraph-builder-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-D41vkFscblUrfof/3xuzrw==","length":18650,"stub":true},"assetgraph-builder-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-+t05dgsS8hPodWAiLjIc8g==","length":18544,"stub":true},"assetgraph-builder-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-S23M/MWIVuGIffeA5lIXUg==","length":18623,"stub":true},"assetgraph-builder-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-OFq1q3YLcPfojL9go/Mk/w==","length":18546,"stub":true},"assetgraph-builder-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-namRaJtXZhKTkaVLsTredg==","length":18537,"stub":true},"assetgraph-builder-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-mC9OcZa7BdbgSqavJwLmEQ==","length":18317,"stub":true},"assetgraph-builder-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-V4qUqRIlPIw13LyRY92ISQ==","length":18291,"stub":true},"assetgraph-builder-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-CnG0k1rFavdOQ5DVjIDlow==","length":18428,"stub":true},"assetgraph-builder-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-JsqXeCJ+FLWu079pbsxjJQ==","length":18480,"stub":true},"assetgraph-builder-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-UAsVxT7tKC9K9MiPsz/ZIw==","length":18451,"stub":true},"assetgraph-builder-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-KngwvtgEBBs/oMBl6weCMQ==","length":18439,"stub":true},"assetgraph-builder-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ZfKMgv01t+DT79DkcuSF0Q==","length":18395,"stub":true},"assetgraph-builder-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ggd/KkhaD0+wh2tJqoOQgA==","length":18421,"stub":true},"assetgraph-builder-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-UNTWig7L3P02JvR8/d2i4g==","length":18413,"stub":true},"assetgraph-builder-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-JA/70SOYYI8I588i1/DlOg==","length":18336,"stub":true},"assetgraph-builder-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-VCtUG2EtCV53hLuHSEX2FA==","length":18411,"stub":true},"assetgraph-builder-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-fqulgrkuHoPyrMhZeIqaOA==","length":18385,"stub":true},"assetgraph-builder-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1n51bGAn3VYhav3RVswyeQ==","length":19791,"stub":true},"assetgraph-builder-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-JlhVzvqOFaK1TFXadbg3iw==","length":19778,"stub":true},"assetgraph-builder-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-vP28PSCaaMWw22375R+0Zw==","length":19810,"stub":true},"assetgraph-builder-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-30EnYljY47Q33YP0K4fUGg==","length":17842,"stub":true},"assetgraph-builder-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-s4c/nDzIUzazrmr5J5nxSg==","length":17826,"stub":true},"assetgraph-builder-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-XFI8KbUDpBzC7qS/jKPjjw==","length":17787,"stub":true},"assetgraph-builder-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-VNIKduAdBeD3+rzkhS8Wmw==","length":17794,"stub":true},"assetgraph-builder-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-GAP5f/c+Wpsjidu7dnbYxw==","length":17756,"stub":true},"assetgraph-builder-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Oo1+DBxwcyj4YsNhu1+8yA==","length":17746,"stub":true},"assetgraph-builder-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+1CWoRmLE+4ygyJuva+8Ng==","length":17749,"stub":true},"assetgraph-builder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HViLiBPb1RDRSBO1pedGfg==","length":17745,"stub":true}}}},
{"id":"assetgraph-middleware","key":"assetgraph-middleware","value":{"rev":"3-aa699f0894bc8c8c89eef88b4a170704"},"doc":{"_id":"assetgraph-middleware","_rev":"3-aa699f0894bc8c8c89eef88b4a170704","name":"assetgraph-middleware","description":"Express middleware for optimizing and manipulating HTML pages and their related assets while serving them","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Andreas Lind Petersen","email":"andreas@one.com"},"description":"Express middleware for optimizing and manipulating HTML pages and their related assets while serving them","keywords":["assetgraph","express","middleware","asset","optimization","bundling","web","build"],"name":"assetgraph-middleware","version":"0.0.1","engines":{"node":">= 0.4.8"},"dependencies":{"assetgraph":"= 0.4.5","bufferjs":"= 1.0.2","express-hijackresponse":"= 0.0.3","underscore":"= 1.2.4"},"devDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-middleware@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"f9aff92c5e78d7a28d9be3d6154996d770ec601b","tarball":"http://registry.npmjs.org/assetgraph-middleware/-/assetgraph-middleware-0.0.1.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]}},"readme":"assetgraph-middleware\n=====================\n\nMiddleware that allows you to use AssetGraph to manipulate HTML pages\nand their related assets while they are being served.\n\n\nInstallation\n------------\n\nMake sure you have node.js and npm installed, then run:\n\n    npm install assetgraph-middleware\n\n\nExample\n-------\n\nAn Express-based static file server that bundles JavaScript and CSS,\ninlines JavaScript, and assigns md5-derived urls to CSS, shortcut\nicons and background images:\n\n    var express = require('express'),\n        root = '/path/to/static/files';\n\n    express.createServer()\n        .use(express.logger())\n        .use(require('assetgraph-middleware')({\n            root: root,\n            transform: function (assetGraph, cb) {\n                assetGraph\n                    .populate({\n                        followRelations: {\n                            type: ['HtmlStyle', 'HtmlScript', 'CssImage', 'HtmlShortcutIcon'],\n                            to: {\n                                url: /^file:/\n                            }\n                        }\n                    })\n                    .bundleRelations({type: ['HtmlStyle', 'HtmlScript']})\n                    .inlineRelations({type: 'HtmlScript'})\n                    .prettyPrintAssets({type: ['Html', 'JavaScript', 'Css']})\n                    .moveAssetsInOrder({type: assetGraph.constructor.query.not('Html')}, function (asset) {\n                        return '/static/' + asset.md5Hex + asset.extension;\n                    })\n                    .run(cb);\n            }\n        }))\n        .use(express['static'](root))\n        .use(express.errorHandler())\n        .listen(3000);\n\n\nLicense\n-------\n\n3-clause BSD license -- see the `LICENSE` file for details.\n","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2012-03-08T00:15:21.297Z","created":"2012-03-08T00:15:19.754Z","0.0.1":"2012-03-08T00:15:21.297Z"},"author":{"name":"Andreas Lind Petersen","email":"andreas@one.com"},"_attachments":{"assetgraph-middleware-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EUESBHmD/Ntml/dNAIa0rg==","length":2837977,"stub":true}}}},
{"id":"assetgraph-sprite","key":"assetgraph-sprite","value":{"rev":"41-c54a11fe92c318749ac026e1ec6f9bcd"},"doc":{"_id":"assetgraph-sprite","_rev":"41-c54a11fe92c318749ac026e1ec6f9bcd","name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","dist-tags":{"latest":"0.2.11"},"versions":{"0.0.1":{"name":"assetgraph-sprite","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.0.1","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"underscore":">=1.1.3","canvas":"=0.6.0","seq":">=0.3.0 <0.4"},"devDependencies":{"assetgraph":">= 0.1.0","vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.0.1","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"17684bde68025db274bfc85e395fa59cb21968c9","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.0.1.tgz"},"scripts":{}},"0.0.3":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.0.3","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"underscore":">=1.1.3","bufferjs":"=1.0.1","canvas":"=0.6.0","seq":">=0.3.0 <0.4"},"devDependencies":{"assetgraph":">= 0.1.0","vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.0.3","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"cd527a293a73c63a3dacf9148e759a57930ccdfa","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.0.3.tgz"},"scripts":{}},"0.0.2":{"name":"assetgraph-sprite","description":"Optimization framework for web pages and applications","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.0.2","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"underscore":">=1.1.3","bufferjs":"=1.0.1","canvas":"=0.6.0","seq":">=0.3.0 <0.4"},"devDependencies":{"assetgraph":">= 0.1.0","vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.0.2","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"e27e8d2aa26b66e818d5e4adcfa19fe09321669f","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.0.2.tgz"},"scripts":{}},"0.0.4":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.0.4","maintainers":[{"name":"Andreas Lind Petersen","email":"andreas@one.com"}],"dependencies":{"underscore":">=1.1.3","bufferjs":"=1.0.1","canvas":"=0.6.0","seq":">=0.3.0 <0.4"},"devDependencies":{"assetgraph":">= 0.1.2","vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.0.4","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"780ec1c72b94c4dd4bf667271e5ec3999eeb4d32","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.0.4.tgz"},"scripts":{}},"0.1.0":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.1.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"dependencies":{"underscore":">= 1.1.3","bufferjs":"= 1.0.1","canvas":"~ 0.7.0","seq":">= 0.3.0 < 0.4"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"26eac860456406aab22970a1c766dbd53640d6c5","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.1.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":">= 1.1.3","bufferjs":"= 1.0.1","canvas":"~ 0.7.0","seq":">= 0.3.0 < 0.4"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.1.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"d3e0d0b1161670b568ed9d78d61358fef45a6af7","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.1.1.tgz"},"scripts":{}},"0.2.0":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.0","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publicationConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":">= 1.1.3","bufferjs":"= 1.0.1","canvas":"~ 0.7.0","seq":">= 0.3.0 < 0.4"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/andreas/.npm/assetgraph-sprite/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assetgraph-sprite@0.2.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"f2af23b67ed2a0b35c0ba0ec2ce7d2a683265f51","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.1","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.0","bufferjs":"= 1.0.2","canvas":"= 0.7.3","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.1","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12-pre","_defaultsLoaded":true,"dist":{"shasum":"3569250603d1fba0f627a2ec2df656a49ef68509","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.1.tgz"}},"0.2.2":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.2","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.0","bufferjs":"= 1.0.2","canvas":"= 0.7.3","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"0fe144918c006043ab3cb31f0c9b86674db4ddb8","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.2.tgz"}},"0.2.3":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.3","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.2","bufferjs":"= 1.0.2","canvas":"= 0.8.1","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.3","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"57878ff485169d5f0ff668da121b7a5a2c6729d2","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.3.tgz"}},"0.2.4":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.4","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.2","bufferjs":"= 1.0.2","canvas":"= 0.8.1","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"b88177aad1f5b28aad0fb30a0524805a118c886d","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.4.tgz"}},"0.2.5":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.5","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.2","bufferjs":"= 1.0.2","canvas":"= 0.8.1","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"~ 0.2.0","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"829f006d0159385c44995ef43f6ac96e7c4440fc","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.5.tgz"}},"0.2.6":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.6","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.2","bufferjs":"= 1.0.2","canvas":"= 0.10.0","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"latest","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"scripts":{"prepublish":"npm install && vows"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"0d8ee39ecee054cff0989824647e0b21967987fa","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.6.tgz"}},"0.2.7":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.7","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.2","bufferjs":"= 1.0.2","canvas":"= 0.10.0","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"latest","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"scripts":{"prepublish":"npm install && vows"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"d73fa1728ebd24201789dd783ff48e2b819ba2bc","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.7.tgz"}},"0.2.8":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.8","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"= 1.2.2","bufferjs":"= 1.0.2","canvas":"= 0.10.0","seq":"= 0.3.5"},"devDependencies":{"assetgraph":"latest","vows":">= 0.5.6"},"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"scripts":{"prepublish":"npm install && vows"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"4cfa70fc3756f9f62719f8bc845a5d5172e88394","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.8.tgz"}},"0.2.9":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.9","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"=1.2.2","bufferjs":"=1.0.2","seq":"=0.3.5","canvas":"=0.10.0"},"optionalDependencies":{"canvas":"=0.10.0"},"devDependencies":{"assetgraph":"latest","vows":">=0.5.6"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"scripts":{"prepublish":"npm install && vows"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.9","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"0b930a47c8db60ddb9a8d636f43934d0c804f80d","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.9.tgz"},"readme":""},"0.2.10":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.10","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"=1.2.2","bufferjs":"=1.0.2","seq":"=0.3.5","canvas":"=0.10.0"},"optionalDependencies":{"canvas":"=0.10.0"},"devDependencies":{"assetgraph":"latest","vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"scripts":{"prepublish":"npm install && vows"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.10","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"68db3f967043f0e30c4eefa510ab13dc0d7e8b85","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.10.tgz"},"readme":""},"0.2.11":{"name":"assetgraph-sprite","description":"AssetGraph plugin for creating sprites from background images","repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"version":"0.2.11","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"publishConfig":{"registry":"http://registry.npmjs.org/"},"dependencies":{"underscore":"=1.2.2","bufferjs":"=1.0.2","seq":"=0.3.5","canvas":"=0.10.0"},"optionalDependencies":{"canvas":"=0.10.0"},"devDependencies":{"assetgraph":"latest","vows":">=0.6.2"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib"},"scripts":{"prepublish":"npm install && vows"},"main":"lib/index.js","_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"assetgraph-sprite@0.2.11","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"12b674f54d14459cdefcbbc5d815108259a07976","tarball":"http://registry.npmjs.org/assetgraph-sprite/-/assetgraph-sprite-0.2.11.tgz"},"readme":""}},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2012-06-18T23:04:34.421Z","created":"2011-06-23T09:38:01.585Z","0.0.1":"2011-06-23T09:38:02.155Z","0.0.3":"2011-06-23T10:56:57.676Z","0.0.2":"2011-06-23T10:57:43.261Z","0.0.4":"2011-06-24T10:22:13.719Z","0.1.0":"2011-08-14T22:56:05.770Z","0.1.1":"2011-08-21T13:19:18.088Z","0.2.0":"2011-09-13T23:07:54.554Z","0.2.1":"2011-10-15T21:02:15.776Z","0.2.2":"2011-11-09T16:20:56.277Z","0.2.3":"2011-11-19T21:08:44.386Z","0.2.4":"2011-12-19T12:27:59.674Z","0.2.5":"2012-01-02T10:42:02.272Z","0.2.6":"2012-01-20T23:28:44.092Z","0.2.7":"2012-02-11T09:03:09.266Z","0.2.8":"2012-02-11T12:37:56.146Z","0.2.9":"2012-05-24T21:51:44.678Z","0.2.10":"2012-06-12T06:02:15.827Z","0.2.11":"2012-06-18T23:04:34.421Z"},"repository":{"type":"git","url":"git://github.com/One-com/assetgraph-sprite.git"},"_attachments":{"assetgraph-sprite-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-2Lnh9Ag7Ubf8x/x1hAsN3g==","length":10337,"stub":true},"assetgraph-sprite-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-r6l5gRndNWJlA550Ffz+qw==","length":10331,"stub":true},"assetgraph-sprite-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-VUY02KVRJUDkWcCCH7WyjA==","length":10103,"stub":true},"assetgraph-sprite-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-bVHnd/T22dfoD3lZdEvnmg==","length":9836,"stub":true},"assetgraph-sprite-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-ut9dyIEGPKymJT3b4J3v9Q==","length":9623,"stub":true},"assetgraph-sprite-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-lC6JHNKfLhl1fg2u7qzVew==","length":9584,"stub":true},"assetgraph-sprite-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-s+JtGiSBx7rVSp9LkPBuWQ==","length":9246,"stub":true},"assetgraph-sprite-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-yjkjN5BVI54fnI/8Q5gZyA==","length":9248,"stub":true},"assetgraph-sprite-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-bJJF8v11fmLFDUhdfAzLhQ==","length":9199,"stub":true},"assetgraph-sprite-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-0vFf7rIxjpBY1b21cPJ4vg==","length":9217,"stub":true},"assetgraph-sprite-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-leY4LSSw/Oim7QkdUlOw7Q==","length":9200,"stub":true},"assetgraph-sprite-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-sYFrhE0fUPtLfppRWWH33A==","length":9206,"stub":true},"assetgraph-sprite-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ClZgG7DnprKgz8YkJYIiow==","length":9152,"stub":true},"assetgraph-sprite-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-gDgrW0xrWhqc+KRY75sgEA==","length":7281,"stub":true},"assetgraph-sprite-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ych34jJAzlZq0V51XHUEOg==","length":7641,"stub":true},"assetgraph-sprite-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6DcUpNgNoVlfGzkiPX/Oew==","length":7648,"stub":true},"assetgraph-sprite-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IiN7LlGGiGcgxxPW0mSHTg==","length":7638,"stub":true},"assetgraph-sprite-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PMz/GORhXJ6VVpNhBcFUTg==","length":7298,"stub":true}}}},
{"id":"assets","key":"assets","value":{"rev":"3-7729f764637f6a167a4b9da5e9c42844"},"doc":{"_id":"assets","_rev":"3-7729f764637f6a167a4b9da5e9c42844","name":"assets","description":"Asset API for Node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"assets","version":"0.0.1","description":"Asset API for Node.js","homepage":"http://github.com/viatropos/assets.js","main":"lib/assets.js","keywords":["framework","node"],"bugs":{"url":"https://github.com/viatropos/assets.js/issues"},"repository":{"type":"git","url":"git://github.com/viatropos/assets.js.git"},"engines":{"node":">= 0.4.0"},"dependencies":{},"_npmUser":{"name":"viatropos","email":"lancejpollard@gmail.com"},"_id":"assets@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3c6baeb38fbc669d776f77c0b2022a0146a07701","tarball":"http://registry.npmjs.org/assets/-/assets-0.0.1.tgz"},"maintainers":[{"name":"viatropos","email":"lancejpollard@gmail.com"}]}},"maintainers":[{"name":"viatropos","email":"lancejpollard@gmail.com"}],"time":{"modified":"2011-11-08T19:38:17.919Z","created":"2011-11-08T19:38:16.939Z","0.0.1":"2011-11-08T19:38:17.919Z"},"repository":{"type":"git","url":"git://github.com/viatropos/assets.js.git"},"_attachments":{"assets-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6/41mkqcg1r7Fk1WGJjQZw==","length":10240,"stub":true}}}},
{"id":"assets-expander","key":"assets-expander","value":{"rev":"23-ab0392082ec2825b621f96c1184f7566"},"doc":{"_id":"assets-expander","_rev":"23-ab0392082ec2825b621f96c1184f7566","name":"assets-expander","description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.1.0","main":"index.js","dependencies":{"rightjs":"2.2.x"},"_id":"assets-expander@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"00eddc95ab6d7938ac39dac56a1a87eec89ff25c","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.1.0.tgz"}},"0.1.1":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.1.1","main":"index.js","dependencies":{"rightjs":"2.2.x"},"_id":"assets-expander@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3783712ed99a160b831d15c45872df6dc6e74a1f","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.1.1.tgz"}},"0.1.2":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.1.2","main":"index.js","dependencies":{"rightjs":"2.2.x"},"_id":"assets-expander@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"22b018d41a98287d57c16c46caf159c89f2cfbe7","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.1.2.tgz"}},"0.2.0":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.2.0","main":"index.js","dependencies":{"rightjs":"2.2.x"},"_id":"assets-expander@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.5","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b8f6e3d06b3abfe7a43ca5abe104d7a313b7fb85","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.2.0.tgz"}},"0.2.1":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.2.1","main":"index.js","dependencies":{"rightjs":"2.2.x"},"_id":"assets-expander@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.5","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bb0e4f7c840c2da1e8cdb624a4d95945b1a7b914","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.2.1.tgz"}},"0.2.2":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.2.2","main":"index.js","dependencies":{"rightjs":"2.2.x"},"devDependencies":{"vows":"*"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-expander@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7aa7db478f8b9b59c1571a2c7edec0eeac25b2cc","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.2.2.tgz"},"readme":"## What is assets-expander? ##\n\nassets-expander is a node.js library for expanding list(s) of files defined in YAML file into a flat list(s) of files.\n\n## Usage ##\n\n### How to install assets-expander? ###\n\n    npm install assets-expander\n\n### How to user assets-expander? ###\n\n    var AssetsExpander = require('assets-expander');\n    var expander = new AssetsExpander('assets.yml', { root: 'path/to/public/dir' });\n    expander.processGroup('stylesheets', 'public') // gets a flat list of assets in public group\n    \n### How to define assets.yml file? ###\n\nIt depends what files you want to have in *public* group, but in general the file should look something like this.\n\n    stylesheets:\n      public:\n        - 'reset,shared,base,home'\n        \nThen if you have the following directory structure:\n\n    stylesheets\n      - reset.css\n      - shared.css\n      - base.css\n      - home.css\n      \nexecuting the code above will get you a list of full paths to these 4 files:\n\n    ['.../stylesheets/reset.css', '.../stylesheets/shared.css', '.../stylesheets/base.css', '.../stylesheets/home.css']\n    \n## License ##\n\nAssets-expander is released under the MIT license.","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.2.3":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.2.3","main":"index.js","dependencies":{"rightjs":"2.2.x"},"devDependencies":{"vows":"*"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-expander@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6d7613d39d869c95387cbe255ac0d76772951f5c","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.2.3.tgz"},"readme":"## What is assets-expander? ##\n\nassets-expander is a node.js library for expanding list(s) of files defined in YAML file into a flat list(s) of files.\n\n## Usage ##\n\n### How to install assets-expander? ###\n\n    npm install assets-expander\n\n### How to user assets-expander? ###\n\n    var AssetsExpander = require('assets-expander');\n    var expander = new AssetsExpander('assets.yml', { root: 'path/to/public/dir' });\n    expander.processGroup('stylesheets', 'public') // gets a flat list of assets in public group\n    \n### How to define assets.yml file? ###\n\nIt depends what files you want to have in *public* group, but in general the file should look something like this.\n\n    stylesheets:\n      public:\n        - 'reset,shared,base,home'\n        \nThen if you have the following directory structure:\n\n    stylesheets\n      - reset.css\n      - shared.css\n      - base.css\n      - home.css\n      \nexecuting the code above will get you a list of full paths to these 4 files:\n\n    ['.../stylesheets/reset.css', '.../stylesheets/shared.css', '.../stylesheets/base.css', '.../stylesheets/home.css']\n    \n## License ##\n\nAssets-expander is released under the MIT license.","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.3.0":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-expander.git"},"version":"0.3.0","main":"index.js","devDependencies":{"vows":"*"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-expander@0.3.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a08fd910ada52ef447b9427fa7df6f346e0e4cee","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.3.0.tgz"},"readme":"## What is assets-expander? ##\n\nassets-expander is a node.js library for expanding list(s) of files defined in YAML file into a flat list(s) of files.\n\n## Usage ##\n\n### How to install assets-expander? ###\n\n    npm install assets-expander\n\n### How to user assets-expander? ###\n\n    var AssetsExpander = require('assets-expander');\n    var expander = new AssetsExpander('assets.yml', { root: 'path/to/public/dir' });\n    expander.processGroup('stylesheets', 'public') // gets a flat list of assets in public group\n    \n### How to define assets.yml file? ###\n\nIt depends what files you want to have in *public* group, but in general the file should look something like this.\n\n    stylesheets:\n      public:\n        - 'reset,shared,base,home'\n        \nThen if you have the following directory structure:\n\n    stylesheets\n      - reset.css\n      - shared.css\n      - base.css\n      - home.css\n      \nexecuting the code above will get you a list of full paths to these 4 files:\n\n    ['.../stylesheets/reset.css', '.../stylesheets/shared.css', '.../stylesheets/base.css', '.../stylesheets/home.css']\n    \n## License ##\n\nAssets-expander is released under the MIT license.","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.3.1":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-expander.git"},"version":"0.3.1","main":"index.js","devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"readme":"## What is assets-expander? ##\n\nassets-expander is a node.js library for expanding list(s) of files defined in YAML file into a flat list(s) of files.\n\n## Usage ##\n\n### How to install assets-expander? ###\n\n    npm install assets-expander\n\n### How to user assets-expander? ###\n\n    var AssetsExpander = require('assets-expander');\n    var expander = new AssetsExpander('assets.yml', { root: 'path/to/public/dir' });\n    expander.processGroup('stylesheets', 'public') // gets a flat list of assets in public group\n    \n### How to define assets.yml file? ###\n\nIt depends what files you want to have in *public* group, but in general the file should look something like this.\n\n    stylesheets:\n      public:\n        - 'reset,shared,base,home'\n        \nThen if you have the following directory structure:\n\n    stylesheets\n      - reset.css\n      - shared.css\n      - base.css\n      - home.css\n      \nexecuting the code above will get you a list of full paths to these 4 files:\n\n    ['.../stylesheets/reset.css', '.../stylesheets/shared.css', '.../stylesheets/base.css', '.../stylesheets/home.css']\n    \n## License ##\n\nAssets-expander is released under the MIT license.","_id":"assets-expander@0.3.1","dist":{"shasum":"ab4f3a70969927289cc07871a3e89ce09ee2e7ae","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.3.1.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.4.0":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-expander.git"},"version":"0.4.0","main":"index.js","devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"readme":"## What is assets-expander? ##\n\nassets-expander is a node.js library for expanding list(s) of files defined in YAML file into a flat list(s) of files.\n\n## Usage ##\n\n### How to install assets-expander? ###\n\n    npm install assets-expander\n\n### How to user assets-expander? ###\n\n    var AssetsExpander = require('assets-expander');\n    var expander = new AssetsExpander('assets.yml', { root: 'path/to/public/dir' });\n    expander.processGroup('stylesheets', 'public') // gets a flat list of assets in public group\n    \n### How to define assets.yml file? ###\n\nIt depends what files you want to have in *public* group, but in general the file should look something like this.\n\n    stylesheets:\n      public:\n        - 'reset,shared,base,home'\n        \nThen if you have the following directory structure:\n\n    stylesheets\n      - reset.css\n      - shared.css\n      - base.css\n      - home.css\n      \nexecuting the code above will get you a list of full paths to these 4 files:\n\n    ['.../stylesheets/reset.css', '.../stylesheets/shared.css', '.../stylesheets/base.css', '.../stylesheets/home.css']\n    \n## License ##\n\nAssets-expander is released under the MIT license.","_id":"assets-expander@0.4.0","dist":{"shasum":"d788bd4eddc0896f1574aa72569dca13ac54be6c","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.4.0.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.4.1":{"name":"assets-expander","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"A well-tested Assets expander - specify assets graph in YAML file and easily expand them into a linear list","keywords":["css","javascript","assets","yaml"],"homepage":"http://github.com/GoalSmashers/assets-expander","repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-expander.git"},"version":"0.4.1","main":"index.js","devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"readme":"## What is assets-expander? ##\n\nassets-expander is a node.js library for expanding list(s) of files defined in YAML file into a flat list(s) of files.\n\n## Usage ##\n\n### How to install assets-expander? ###\n\n    npm install assets-expander\n\n### How to user assets-expander? ###\n\n    var AssetsExpander = require('assets-expander');\n    var expander = new AssetsExpander('assets.yml', { root: 'path/to/public/dir' });\n    expander.processGroup('stylesheets', 'public') // gets a flat list of assets in public group\n    \n### How to define assets.yml file? ###\n\nIt depends what files you want to have in *public* group, but in general the file should look something like this.\n\n    stylesheets:\n      public:\n        - 'reset,shared,base,home'\n        \nThen if you have the following directory structure:\n\n    stylesheets\n      - reset.css\n      - shared.css\n      - base.css\n      - home.css\n      \nexecuting the code above will get you a list of full paths to these 4 files:\n\n    ['.../stylesheets/reset.css', '.../stylesheets/shared.css', '.../stylesheets/base.css', '.../stylesheets/home.css']\n    \n## License ##\n\nAssets-expander is released under the MIT license.","_id":"assets-expander@0.4.1","dist":{"shasum":"26523039b5f63e856a2e0a2325dac3aa9fbd0588","tarball":"http://registry.npmjs.org/assets-expander/-/assets-expander-0.4.1.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]}},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}],"time":{"modified":"2012-08-07T18:51:25.241Z","created":"2011-03-27T00:00:02.399Z","0.1.0":"2011-03-27T00:00:03.290Z","0.1.1":"2011-04-03T17:54:23.371Z","0.1.2":"2011-04-05T21:23:29.163Z","0.2.0":"2011-04-07T15:15:56.429Z","0.2.1":"2011-04-15T20:34:59.591Z","0.2.2":"2012-06-17T17:14:02.488Z","0.2.3":"2012-06-17T17:27:21.218Z","0.3.0":"2012-07-09T18:56:42.756Z","0.3.1":"2012-08-02T21:29:00.957Z","0.4.0":"2012-08-06T09:14:54.720Z","0.4.1":"2012-08-07T18:51:25.241Z"},"author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-expander.git"},"_attachments":{"assets-expander-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-iJjEp9eNSFj1DG+gf2dO6w==","length":7841,"stub":true},"assets-expander-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-buEumOw1jOOtcGw2MvFvPg==","length":7776,"stub":true},"assets-expander-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-a01ir3lxM+OKiu4gxANLuA==","length":7562,"stub":true},"assets-expander-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-VuS1WEehKFABW0t82et/og==","length":7619,"stub":true},"assets-expander-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-WORc0xVRQ91dZTceflaZSA==","length":7411,"stub":true},"assets-expander-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IHOTflMRY3g4JmUQuvGROA==","length":7291,"stub":true},"assets-expander-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-PmDuCv6xOCgQXz32E8n5cg==","length":6749,"stub":true},"assets-expander-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-MqNhPB8385yU8mn2ayziOA==","length":6685,"stub":true},"assets-expander-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-afAT/nH5X9tLFQnCrXkLNw==","length":6384,"stub":true},"assets-expander-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qrzJPXl0W3gWkeiL857cVQ==","length":6175,"stub":true},"assets-expander-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gddgi36yCe0JXtK8RYyDKQ==","length":5907,"stub":true}}}},
{"id":"assets-include","key":"assets-include","value":{"rev":"21-7f4a96b34877591c054af0d98dbc49aa"},"doc":{"_id":"assets-include","_rev":"21-7f4a96b34877591c054af0d98dbc49aa","name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","dist-tags":{"latest":"0.6.2"},"versions":{"0.1.0":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.1.0","repository":{"url":""},"engines":{"node":"~0.6"},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.2.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"optionalDependencies":{},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-include@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f3ccd82b61b05cffe10ea17fd53ec9dd58a3af0d","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.1.0.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.1.1":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.1.1","repository":{"url":""},"engines":{"node":"~0.6"},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.2.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"optionalDependencies":{},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-include@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8197767523dedf4725398fe5dfe076ae19273d42","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.1.1.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.2.0":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.2.0","repository":{"url":""},"engines":{"node":"~0.6"},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.2.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"optionalDependencies":{},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-include@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6b528832ca1f7af6279ec815a17ed7d3a17e30b5","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.2.0.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.2.1":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.2.1","repository":{"url":""},"engines":{"node":"~0.6"},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.2.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"optionalDependencies":{},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-include@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4ec4a284c634c70310a91bc2f05fbc1d709264ce","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.2.1.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.3.0":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.3.0","repository":{"url":""},"engines":{"node":"~0.6"},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.2.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"optionalDependencies":{},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-include@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"80c730341846a81edd9d7968dc57ef8b466bb228","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.3.0.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.3.1":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.3.1","repository":{"url":""},"engines":{"node":"~0.6"},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.2.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"optionalDependencies":{},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-include@0.3.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5ab9141a5e74a1784971aec54e156ae420406d2e","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.3.1.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.5.0":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.5.0","repository":{"url":""},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.4.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"_id":"assets-include@0.5.0","dist":{"shasum":"3e8d9dde7ff0962c08ecd2c409660c63eddb0cf9","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.5.0.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.6.0":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.6.0","repository":{"url":""},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.4.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"_id":"assets-include@0.6.0","dist":{"shasum":"6a381c290d3b4bddf690b3caff29e61f2b26a333","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.6.0.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.6.1":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.6.1","repository":{"url":""},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.4.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"_id":"assets-include@0.6.1","dist":{"shasum":"3e8049923f4b043a40056c8848fa6e932f2a07bc","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.6.1.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.6.2":{"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"name":"assets-include","description":"Include assets into your views with ease (assets-packager compatible).","version":"0.6.2","repository":{"url":""},"bin":{"assetsinc":"./bin/assetsinc"},"dependencies":{"assets-expander":"0.4.x","optimist":"0.3.x"},"devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"_id":"assets-include@0.6.2","dist":{"shasum":"863577a1a625a0ce333c91ba05307ae4b92cd043","tarball":"http://registry.npmjs.org/assets-include/-/assets-include-0.6.2.tgz"},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]}},"readme":"","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}],"time":{"modified":"2012-08-15T10:46:22.774Z","created":"2012-06-18T11:59:42.819Z","0.1.0":"2012-06-18T11:59:44.871Z","0.1.1":"2012-06-19T10:10:55.038Z","0.2.0":"2012-06-19T12:11:28.453Z","0.2.1":"2012-06-19T19:41:13.973Z","0.3.0":"2012-07-03T21:13:18.312Z","0.3.1":"2012-07-03T23:37:40.441Z","0.5.0":"2012-08-07T21:03:07.948Z","0.6.0":"2012-08-09T13:00:31.784Z","0.6.1":"2012-08-09T14:23:52.215Z","0.6.2":"2012-08-15T10:46:22.774Z"},"author":{"name":"GoalSmashers.com","email":"jakub@goalsmashers.com"},"repository":{"url":""},"_attachments":{"assets-include-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-557NH46nhVPziLmqlFfcRg==","length":6290,"stub":true},"assets-include-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-NngZ3eqxiMXZkkKUavjOyg==","length":6149,"stub":true},"assets-include-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-y5rigS8/q5owQBdKVmEBwQ==","length":6102,"stub":true},"assets-include-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-KvBp3TrnlixLXsWg+y3TTw==","length":5493,"stub":true},"assets-include-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-39u/nrYMeR9HKQKOnx0BSQ==","length":5442,"stub":true},"assets-include-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-QgtRNErctpHfKiQhOjqOkg==","length":5269,"stub":true},"assets-include-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qlR11MWZUONApKqBiEF0xA==","length":4802,"stub":true},"assets-include-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-o2Mn/a3bMLzMSaIhnv6aUA==","length":4755,"stub":true},"assets-include-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+CUoDeLnuyDHZboMHmH6Nw==","length":4353,"stub":true},"assets-include-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-x0RsXBgm+iNTOto1+UZDIA==","length":4139,"stub":true}}}},
{"id":"assets-packager","key":"assets-packager","value":{"rev":"25-0c419272a95a037b3cd56da21dbeb2fe"},"doc":{"_id":"assets-packager","_rev":"25-0c419272a95a037b3cd56da21dbeb2fe","name":"assets-packager","description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.1.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_id":"assets-packager@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"51f3113fcf4e192488ec4f9ed8627659b4dacedd","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.1.0.tgz"}},"0.1.1":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.1.1","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_id":"assets-packager@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3c692fd8031072a0d9f6dddb6e0381a3c91fd768","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.1.1.tgz"}},"0.2.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.2.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_id":"assets-packager@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1347282caaf101564f106a377f529716fea1f111","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.2.0.tgz"}},"0.3.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.3.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_id":"assets-packager@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6a8f68648965aa24e248b4305dd4497c0b69b51e","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.3.0.tgz"}},"0.3.1":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.3.1","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_npmJsonOpts":{"file":"/Users/jakub/.npm/assets-packager/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assets-packager@0.3.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"8a19186f0c2068cc132f502944d79c36b60283c9","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.3.1.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.3.2":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.3.2","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_npmJsonOpts":{"file":"/Users/jakub/.npm/assets-packager/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"assets-packager@0.3.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"08f88c63d7c863b5f8195e444b6e821392d64f68","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.3.2.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.4.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.4.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-packager@0.4.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"51bcdf6ca1c233a398f8763b8183694788bdd843","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.4.0.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.4.1":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.4.1","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-packager@0.4.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"356af8089c39723cc221bd6c95ee23b5c2c495a4","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.4.1.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.4.2":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.4.2","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.1.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.2.x","enhance-css":"0.2.x","assets-expander":"0.2.x"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-packager@0.4.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"64420c5a42ca2bff5537cedb3458e126d3734142","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.4.2.tgz"},"readme":"## What is assets-packager? ##\n\nAssets-packager is a node.js-based tool for compiling, minifying, and packaging CSS and JavaScript assets into production-ready packages.\n\nCSS bundles are created from assets which are\n\n* compiled from [LESS](https://github.com/cloudhead/less.js) templates (optional)\n* minified using [clean-css](https://github.com/GoalSmashers/clean-css)\n* bundled\n* preprocessed via [enhance-css](https://github.com/GoalSmashers/enhance-css) (inline images, asset hosts, etc)\n* packaged (and optionally precompressed)\n\nAnd JavaScripts ones are\n\n* bundled\n* minified using the wonderful [UglifyJS](https://github.com/mishoo/UglifyJS)\n* packaged (and optionally precompressed)\n\n## Usage ##\n\n### How to install assets-packager? ###\n\n    npm install assets-packager\n\n### Tl;dr. Give me a quick demo! ###\n\nOK. Clone this repo.\n\n    git clone git@github.com:GoalSmashers/assets-packager.git\n\nThen open examples directory and run:\n\n    assetspkg -c assets.yml -g\n\nNow check _examples/public/javascripts/bundled_ and _examples/public/stylesheets/bundled_ for bundled code.\nThat's it!\n\n### Is it fast? ###\n\nYou should have just witnessed it by yourself. :-)\n\nWe use it on our production servers at [GoalSmashers.com](http://goalsmashers.com) and it builds 20 CSS and 15 JavaScript bundles from hundreds of assets in around 15 seconds.\n\nSo yes, it is fast!\n\n### How to use assets-packager in my application? ###\n\nFirst of all it assumes you have Rails-like directory structure for your assets, e.g:\n\n- public\n    - javascripts\n        - _some javascripts_\n    - stylesheets\n        - _some stylesheets_\n\nThen it also needs a configuration file (here we name it assets.yml) with a definition of JS/CSS bundles, e.g:\n\n    # stylesheets\n    stylesheets:\n      application: 'reset,grid,base,application'\n    # javascripts\n    javascripts:\n      application:\n        - 'vendor/jquery'\n        - 'application,helpers'\n\nWe recommend placing it somewhere else than in your _public_ folder (could be _config_ in case of Rails).\n\nNow you can bundle all these packages with a single command:\n\n    assetspkg -c assets.yml\n\nAll the packages go into _public/javascripts/bundled_ and _public/stylesheets/bundled_.\nYou'll probably want to put that command somewhere into your build/deploy script.\n\n### How to configure it? ###\n\n    assetspkg -h\n\nOptions include:\n\n* -g - create gzipped bundles (useful if your server supports serving precompressed files, like [nginx](http://wiki.nginx.org/NginxHttpGzipStaticModule))\n* -n - create alternate stylesheets bundles without inlined images (Explorer 6/7, I'm looking at you!)\n* -a - use asset hosts for image URLs, e.g _-a [assets0,assets1].yourdomain.com_\n* -o - narrow the set of bundles being build, e.g. _-o application.js_, _-o *.css_, or _-o public.css,application.css_\n* --nm - do not minify JS, only combine (use the `beautify` option of UglifyJS)\n* -i - when using --nm, specify the indentation level in spaces\n\n### The feature I want is not there! ###\n\nOpen an issue. Or better: fork the project, add the feature (don't forget about tests!) and send a pull request.\n\n### How to test assets-packager? ###\n\nFirst, install dependencies\n\n    npm install\n    npm install -g less@latest\n\nThen, run the specs\n\n    make test\n    \n## Contributors ##\n\n* Jean-Denis Vauguet (@chikamichi) - --nominifyjs and --indent options allow for combination-only processing.\n\n## License ##\n\nAssets-packager is released under the MIT license.\n","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.5.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"git://github.com/GoalSmashers/assets-packager.git"},"version":"0.5.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.3.x","seq":"0.2.x","gzip":"0.1.x","uglify-js":"1.x","clean-css":"0.4.x","enhance-css":"0.3.x","assets-expander":"0.2.x"},"_npmUser":{"name":"goalsmashers","email":"jakub@goalsmashers.com"},"_id":"assets-packager@0.5.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"1da17007f15142045de2bdabc3854d96c556f097","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.5.0.tgz"},"readme":"## What is assets-packager? ##\n\nAssets-packager is a node.js-based tool for compiling, minifying, and packaging CSS and JavaScript assets into production-ready packages.\n\nCSS bundles are created from assets which are\n\n* compiled from [LESS](https://github.com/cloudhead/less.js) templates (optional)\n* minified using [clean-css](https://github.com/GoalSmashers/clean-css)\n* bundled\n* preprocessed via [enhance-css](https://github.com/GoalSmashers/enhance-css) (inline images, asset hosts, etc)\n* packaged (and optionally precompressed)\n\nAnd JavaScripts ones are\n\n* bundled\n* minified using the wonderful [UglifyJS](https://github.com/mishoo/UglifyJS)\n* packaged (and optionally precompressed)\n\n## Usage ##\n\n### How to install assets-packager? ###\n\n    npm install -g assets-packager\n\n### Tl;dr. Give me a quick demo! ###\n\nOK. Clone this repo.\n\n    git clone git@github.com:GoalSmashers/assets-packager.git\n\nThen open examples directory and run:\n\n    assetspkg -c assets.yml -g\n\nNow check _examples/public/javascripts/bundled_ and _examples/public/stylesheets/bundled_ for bundled code.\nThat's it!\n\n### Is it fast? ###\n\nYou should have just witnessed it by yourself. :-)\n\nWe use it on our production servers at [GoalSmashers.com](http://goalsmashers.com) and it builds 20 CSS and 15 JavaScript bundles from hundreds of assets in around 15 seconds.\n\nSo yes, it is fast!\n\n### How to use assets-packager in my application? ###\n\nFirst of all it assumes you have Rails-like directory structure for your assets, e.g:\n\n- public\n    - javascripts\n        - _some javascripts_\n    - stylesheets\n        - _some stylesheets_\n\nThen it also needs a configuration file (here we name it assets.yml) with a definition of JS/CSS bundles, e.g:\n\n    # stylesheets\n    stylesheets:\n      application: 'reset,grid,base,application'\n    # javascripts\n    javascripts:\n      application:\n        - 'vendor/jquery'\n        - 'application,helpers'\n\nWe recommend placing it somewhere else than in your _public_ folder (could be _config_ in case of Rails).\n\nNow you can bundle all these packages with a single command:\n\n    assetspkg -c assets.yml\n\nAll the packages go into _public/javascripts/bundled_ and _public/stylesheets/bundled_.\nYou'll probably want to put that command somewhere into your build/deploy script.\n\n### How to configure it? ###\n\n    assetspkg -h\n\nOptions include:\n\n* -g - create gzipped bundles (useful if your server supports serving precompressed files, like [nginx](http://wiki.nginx.org/NginxHttpGzipStaticModule))\n* -n - create alternate stylesheets bundles without inlined images (Explorer 6/7, I'm looking at you!)\n* -a - use asset hosts for image URLs, e.g _-a [assets0,assets1].yourdomain.com_\n* -o - narrow the set of bundles being build, e.g. _-o application.js_, _-o *.css_, or _-o public.css,application.css_\n* --nm - do not minify JS, only combine (use the `beautify` option of UglifyJS)\n* -i - when using --nm, specify the indentation level in spaces\n\n### The feature I want is not there! ###\n\nOpen an issue. Or better: fork the project, add the feature (don't forget about tests!) and send a pull request.\n\n### How to test assets-packager? ###\n\nFirst, install dependencies\n\n    npm install\n    npm install -g less@latest\n\nThen, run the specs\n\n    make test\n    \n## Contributors ##\n\n* Jean-Denis Vauguet (@chikamichi) - --nominifyjs and --indent options allow for combination-only processing.\n\n## License ##\n\nAssets-packager is released under the MIT license.\n","maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.6.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-packager.git"},"version":"0.6.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.3.x","seq":"0.3.x","uglify-js":"1.2.x","less":"1.x","clean-css":"0.5.x","enhance-css":"0.4.x","assets-expander":"0.3.x"},"devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"readme":"## What is assets-packager? ##\n\nAssets-packager is a node.js-based tool for compiling, minifying, and packaging CSS and JavaScript assets into production-ready packages.\n\nCSS bundles are created from assets which are\n\n* compiled from [LESS](https://github.com/cloudhead/less.js) templates (optional)\n* minified using [clean-css](https://github.com/GoalSmashers/clean-css)\n* bundled\n* preprocessed via [enhance-css](https://github.com/GoalSmashers/enhance-css) (inline images, asset hosts, etc)\n* packaged (and optionally precompressed)\n\nAnd JavaScripts ones are\n\n* bundled\n* minified using the wonderful [UglifyJS](https://github.com/mishoo/UglifyJS)\n* packaged (and optionally precompressed)\n\n## Usage ##\n\n### How to install assets-packager? ###\n\n    npm install -g assets-packager\n\n### Tl;dr. Give me a quick demo! ###\n\nOK. Clone this repo.\n\n    git clone git@github.com:GoalSmashers/assets-packager.git\n\nThen open examples directory and run:\n\n    assetspkg -c assets.yml -g\n\nNow check _examples/public/javascripts/bundled_ and _examples/public/stylesheets/bundled_ for bundled code.\nThat's it!\n\n### Is it fast? ###\n\nYou should have just witnessed it by yourself. :-)\n\nWe use it on our production servers at [GoalSmashers.com](http://goalsmashers.com) and it builds 20 CSS and 15 JavaScript bundles from hundreds of assets in around 15 seconds.\n\nSo yes, it is fast!\n\n### How to use assets-packager in my application? ###\n\nFirst of all it assumes you have Rails-like directory structure for your assets, e.g:\n\n- public\n    - javascripts\n        - _some javascripts_\n    - stylesheets\n        - _some stylesheets_\n\nThen it also needs a configuration file (here we name it assets.yml) with a definition of JS/CSS bundles, e.g:\n\n    # stylesheets\n    stylesheets:\n      application: 'reset,grid,base,application'\n    # javascripts\n    javascripts:\n      application:\n        - 'vendor/jquery'\n        - 'application,helpers'\n\nWe recommend placing it somewhere else than in your _public_ folder (could be _config_ in case of Rails).\n\nNow you can bundle all these packages with a single command:\n\n    assetspkg -c assets.yml\n\nAll the packages go into _public/javascripts/bundled_ and _public/stylesheets/bundled_.\nYou'll probably want to put that command somewhere into your build/deploy script.\n\n### How to configure it? ###\n\n    assetspkg -h\n\nOptions include:\n\n* -g - create gzipped bundles (useful if your server supports serving precompressed files, like [nginx](http://wiki.nginx.org/NginxHttpGzipStaticModule))\n* -n - create alternate stylesheets bundles without inlined images (Explorer 6/7, I'm looking at you!)\n* -a - use asset hosts for image URLs, e.g _-a [assets0,assets1].yourdomain.com_\n* -o - narrow the set of bundles being build, e.g. _-o application.js_, _-o *.css_, or _-o public.css,application.css_\n* --nm - do not minify JS, only combine (use the `beautify` option of UglifyJS)\n* -i - when using --nm, specify the indentation level in spaces\n\n### The feature I want is not there! ###\n\nOpen an issue. Or better: fork the project, add the feature (don't forget about tests!) and send a pull request.\n\n### How to test assets-packager? ###\n\nFirst, install dependencies\n\n    npm install\n    npm install -g less@latest\n\nThen, run the specs\n\n    make test\n    \n## Contributors ##\n\n* Jean-Denis Vauguet (@chikamichi) - --nominifyjs and --indent options allow for combination-only processing.\n\n## License ##\n\nAssets-packager is released under the MIT license.\n","_id":"assets-packager@0.6.0","dist":{"shasum":"a08da1d7db89e54cf790d71d7ddc58aeaa657713","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.6.0.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]},"0.7.0":{"name":"assets-packager","author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"description":"Very fast assets packager - combines power of seq, uglify-js, gzip, assets-expander, clean-css and couple other tools to build assets insanely fast","keywords":["assets","packager","css","javascript","less","minifier"],"homepage":"http://github.com/GoalSmashers/assets-packager","repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-packager.git"},"version":"0.7.0","main":"index.js","bin":{"assetspkg":"./bin/assetspkg"},"dependencies":{"optimist":"0.3.x","seq":"0.3.x","uglify-js":"1.2.x","less":"1.x","clean-css":"0.6.x","enhance-css":"0.5.x","assets-expander":"0.4.x"},"devDependencies":{"vows":"*"},"engines":{"node":">=0.6.0"},"readme":"## What is assets-packager? ##\n\nAssets-packager is a node.js-based tool for compiling, minifying, and packaging CSS and JavaScript assets into production-ready packages.\n\nCSS bundles are created from assets which are\n\n* compiled from [LESS](https://github.com/cloudhead/less.js) templates (optional)\n* minified using [clean-css](https://github.com/GoalSmashers/clean-css)\n* bundled\n* preprocessed via [enhance-css](https://github.com/GoalSmashers/enhance-css) (inline images, asset hosts, etc)\n* packaged (and optionally precompressed)\n\nAnd JavaScripts ones are\n\n* bundled\n* minified using the wonderful [UglifyJS](https://github.com/mishoo/UglifyJS)\n* packaged (and optionally precompressed)\n\n## Usage ##\n\n### What are the requirements? ###\n\n    node 0.6.0+ on *nix (fully tested on OS X 10.6+ and CentOS)\n    node 0.8.0+ on Windows\n\n### How to install assets-packager? ###\n\n    npm install -g assets-packager\n\n### Tl;dr. Give me a quick demo! ###\n\nOK. Here are commands to run\n\n    git clone git@github.com:GoalSmashers/assets-packager.git\n    cd assets-packager/examples\n    assetspkg -c assets.yml -g\n\nNow check _examples/public/javascripts/bundled_ and _examples/public/stylesheets/bundled_ for bundled code.\nThat's it!\n\n### Is it fast? ###\n\nYou should have just witnessed it by yourself. :-)\n\nWe use it on our production servers at [GoalSmashers.com](http://goalsmashers.com) and it builds 20 CSS and 15 JavaScript bundles from hundreds of assets in around 15 seconds.\n\nSo yes, it is fast!\n\n### How to use assets-packager in my application? ###\n\nFirst of all it assumes you have Rails-like directory structure for your assets, e.g:\n\n- public\n    - javascripts\n        - _some javascripts_\n    - stylesheets\n        - _some stylesheets_\n\nThen it also needs a configuration file (here we name it assets.yml) with a definition of JS/CSS bundles, e.g:\n\n    # stylesheets\n    stylesheets:\n      application: 'reset,grid,base,application'\n    # javascripts\n    javascripts:\n      application:\n        - 'vendor/jquery'\n        - 'application,helpers'\n\nWe recommend placing it somewhere else than in your _public_ folder (could be _config_ in case of Rails).\n\nNow you can bundle all these packages with a single command:\n\n    assetspkg -c assets.yml\n\nAll the packages go into _public/javascripts/bundled_ and _public/stylesheets/bundled_.\nYou'll probably want to put that command somewhere into your build/deploy script.\n\n### How to configure it? ###\n\n    assetspkg -h\n\nOptions include:\n\n* -c - path to file with bundles definition (defaults to ./config/assets.yml)\n* -r - root directory with assets directories (defaults to ./public)\n* -g - create gzipped bundles (useful if your server supports serving precompressed files, like [nginx](http://wiki.nginx.org/NginxHttpGzipStaticModule))\n* --nm - do not minify JS, only combine (use the `beautify` option of UglifyJS)\n* -i - when using --nm, specify the indentation level in spaces\n* -n - create alternate stylesheets bundles without inlined images (Explorer 6/7, I'm looking at you!)\n* -a - use asset hosts for image URLs, e.g _-a [assets0,assets1].yourdomain.com_\n* -b - add MD5 hash to bundled file names (aka hard cache boosters)\n* -o - narrow the set of bundles being build, e.g. _-o application.js_, _-o *.css_, or _-o public.css,application.css_\n\n### The feature I want is not there! ###\n\nOpen an issue. Or better: fork the project, add the feature (don't forget about tests!) and send a pull request.\n\n### How to test assets-packager? ###\n\nFirst, install dependencies\n\n    npm i\n\nThen, run the specs (on *nix):\n\n    make test\n\nor on Windows:\n\n    .\\test.bat\n\n## Contributors ##\n\n* Jean-Denis Vauguet (@chikamichi) - --nominifyjs and --indent options allow for combination-only processing.\n\n## License ##\n\nAssets-packager is released under the MIT license.\n","_id":"assets-packager@0.7.0","dist":{"shasum":"77b9da9d7dd4022ebe5383bdedf4f0929beeb694","tarball":"http://registry.npmjs.org/assets-packager/-/assets-packager-0.7.0.tgz"},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}]}},"maintainers":[{"name":"goalsmashers","email":"jakub@goalsmashers.com"}],"time":{"modified":"2012-08-07T19:13:13.523Z","created":"2011-04-15T14:47:12.104Z","0.1.0":"2011-04-15T14:47:12.569Z","0.1.1":"2011-04-15T19:53:36.469Z","0.2.0":"2011-04-17T13:44:56.553Z","0.3.0":"2011-04-17T21:05:42.082Z","0.3.1":"2011-09-11T20:34:06.406Z","0.3.2":"2011-09-12T11:55:41.681Z","0.4.0":"2011-11-21T21:11:31.108Z","0.4.1":"2011-12-21T10:18:38.519Z","0.4.2":"2012-06-04T09:50:49.610Z","0.5.0":"2012-07-03T19:53:48.664Z","0.6.0":"2012-08-03T10:12:57.942Z","0.7.0":"2012-08-07T19:13:13.523Z"},"author":{"name":"Jakub Pawlowicz","email":"jakub@goalsmashers.com","url":"http://twitter.com/GoalSmashers"},"repository":{"type":"git","url":"http://github.com/GoalSmashers/assets-packager.git"},"_attachments":{"assets-packager-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-52WYfJ514/Adl1OD0o9Ypg==","length":12482,"stub":true},"assets-packager-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-T6P9y1CGbpkvsTQMcMt/wg==","length":10685,"stub":true},"assets-packager-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-XyiqtvlHbyAw7LP6LQBovA==","length":10204,"stub":true},"assets-packager-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-LEyvWigI5cgs3xKWQoza9Q==","length":9198,"stub":true},"assets-packager-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-xYkR62Vsyr+3uHW071GAmg==","length":10240,"stub":true},"assets-packager-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-fDN0JVEgeOMQidQ3aEKm3A==","length":10240,"stub":true},"assets-packager-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-fk2E3Jw7Orz3kIzJO2TXzg==","length":6014,"stub":true},"assets-packager-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0dzLDXfdgwdiYPxhIO5Cpw==","length":5634,"stub":true},"assets-packager-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VY0ykYQpmBUXy6yt/4BT2A==","length":6059,"stub":true},"assets-packager-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pnqB6pDWAhuHdZq53Ttrmg==","length":5011,"stub":true},"assets-packager-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wp5KexcPIxvxDbnF3H2Wxw==","length":2542,"stub":true},"assets-packager-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-425/STY7GGdn5yJ6Oe/qZg==","length":2418,"stub":true}}}},
{"id":"assets.js","key":"assets.js","value":{"rev":"3-7f1cac874cf50edefb71364f2bda3c8d"},"doc":{"_id":"assets.js","_rev":"3-7f1cac874cf50edefb71364f2bda3c8d","name":"assets.js","description":"Asset API for Node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"assets.js","version":"0.0.1","description":"Asset API for Node.js","homepage":"http://github.com/viatropos/assets.js","main":"lib/assets.js","keywords":["framework","node"],"bugs":{"url":"https://github.com/viatropos/assets.js/issues"},"repository":{"type":"git","url":"git://github.com/viatropos/assets.js.git"},"engines":{"node":">= 0.4.0"},"dependencies":{},"_npmUser":{"name":"viatropos","email":"lancejpollard@gmail.com"},"_id":"assets.js@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"bc900ee6b59c49a3a4ffe09022fc91f9bc9cb3e1","tarball":"http://registry.npmjs.org/assets.js/-/assets.js-0.0.1.tgz"},"maintainers":[{"name":"viatropos","email":"lancejpollard@gmail.com"}]}},"maintainers":[{"name":"viatropos","email":"lancejpollard@gmail.com"}],"time":{"modified":"2011-11-08T19:43:46.336Z","created":"2011-11-08T19:43:45.779Z","0.0.1":"2011-11-08T19:43:46.336Z"},"repository":{"type":"git","url":"git://github.com/viatropos/assets.js.git"},"_attachments":{"assets.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hjzn4KPYZrdnJtG0ZGaDTg==","length":10240,"stub":true}}}},
{"id":"assoc","key":"assoc","value":{"rev":"9-07098388f501da16bf6afe6c9babefd5"},"doc":{"_id":"assoc","_rev":"9-07098388f501da16bf6afe6c9babefd5","name":"assoc","description":"Associative arrays for JavaScript.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"assoc","description":"Associate arrays for JavaScript.","version":"0.0.1","author":{"name":"Josep M. Bach","email":"josep.m.bach@gmail.com"},"keywords":["associative","arrays"],"main":"./index","devDependencies":{"testosterone":">= 1.1.0"},"repository":{"type":"git","url":"git://github.com/txus/assoc.js.git"},"engines":{"node":">= 0.2.0"},"_id":"assoc@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c0b4f99c0b740b8d99c8794f051285f506b6f80f","tarball":"http://registry.npmjs.org/assoc/-/assoc-0.0.1.tgz"}},"0.0.2":{"name":"assoc","description":"Associative arrays for JavaScript.","version":"0.0.2","author":{"name":"Josep M. Bach","email":"josep.m.bach@gmail.com"},"keywords":["associative","arrays"],"main":"./index","devDependencies":{"testosterone":">= 1.1.0"},"repository":{"type":"git","url":"git://github.com/txus/assoc.js.git"},"engines":{"node":">= 0.2.0"},"_id":"assoc@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1ca6e9907e4111611d78ab74835564e776f23fb0","tarball":"http://registry.npmjs.org/assoc/-/assoc-0.0.2.tgz"}}},"maintainers":[{"name":"txus","email":"josep.m.bach@gmail.com"}],"time":{"modified":"2011-04-12T12:30:42.170Z","created":"2011-04-12T12:25:03.671Z","0.0.1":"2011-04-12T12:25:04.273Z","0.0.2":"2011-04-12T12:29:43.187Z"},"author":{"name":"Josep M. Bach","email":"josep.m.bach@gmail.com"},"repository":{"type":"git","url":"git://github.com/txus/assoc.js.git"},"_attachments":{"assoc-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Xq574S4xSFwCO+NWeOW/9w==","length":2905,"stub":true},"assoc-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YZLKx6CIoDX4p+QprhEByQ==","length":2905,"stub":true}}}},
{"id":"ast-inlining","key":"ast-inlining","value":{"rev":"5-02e7e2c3a06ed81ddc61980f778ac413"},"doc":{"_id":"ast-inlining","_rev":"5-02e7e2c3a06ed81ddc61980f778ac413","name":"ast-inlining","description":"Nodejs language detection library using n-gram","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"ast-inlining","description":"Nodejs language detection library using n-gram","keywords":["ast","inlining","inline expansion"],"version":"1.0.0","homepage":"https://github.com/FGRibreau/node-ast-inlining/","author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"main":"index","repository":{"type":"git","url":"git://github.com/FGRibreau/node-ast-inlining.git"},"licenses":[{"type":"BSD","url":"https://github.com/FGRibreau/node-ast-inlining/blob/master/LICENSE"}],"dependencies":{"uglify-js":">= 1.0.2"},"devDependencies":{"jslitmus":">= 0.1.0","nodeunit":">= 0.5.1"},"engines":{"node":">= 0.4.8"},"_id":"ast-inlining@1.0.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.11","dist":{"shasum":"18e61d7078faceefdb8c87a9f27eea4b9a26a6bc","tarball":"http://registry.npmjs.org/ast-inlining/-/ast-inlining-1.0.0.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]},"1.0.1":{"name":"ast-inlining","description":"Nodejs language detection library using n-gram","keywords":["ast","inlining","inline expansion"],"version":"1.0.1","homepage":"https://github.com/FGRibreau/node-ast-inlining/","author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"main":"index","repository":{"type":"git","url":"git://github.com/FGRibreau/node-ast-inlining.git"},"licenses":[{"type":"BSD","url":"https://github.com/FGRibreau/node-ast-inlining/blob/master/LICENSE"}],"dependencies":{"uglify-js":">= 1.0.2"},"devDependencies":{"jslitmus":">= 0.1.0","nodeunit":">= 0.5.1"},"engines":{"node":">= 0.4.8"},"_id":"ast-inlining@1.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.11","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a6c364ea85bef1e4f2a39049eecbc7ca421e0fc5","tarball":"http://registry.npmjs.org/ast-inlining/-/ast-inlining-1.0.1.tgz"},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}]}},"maintainers":[{"name":"fgribreau","email":"npm@fgribreau.com"}],"time":{"modified":"2011-09-03T21:15:59.372Z","created":"2011-09-03T21:14:03.293Z","1.0.0":"2011-09-03T21:14:04.585Z","1.0.1":"2011-09-03T21:15:59.372Z"},"author":{"name":"Francois-Guillaume Ribreau","email":"npm@fgribreau.com","url":"http://fgribreau.com"},"repository":{"type":"git","url":"git://github.com/FGRibreau/node-ast-inlining.git"},"_attachments":{"ast-inlining-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-COpRMGy8m8IY8tV+Jz608A==","length":8123,"stub":true},"ast-inlining-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5W9ywkUZUT7+T15rTxGJWA==","length":8124,"stub":true}}}},
{"id":"ast-transformer","key":"ast-transformer","value":{"rev":"5-b4020bb763b8839afa8d3ac0d54a6f26"},"doc":{"_id":"ast-transformer","_rev":"5-b4020bb763b8839afa8d3ac0d54a6f26","name":"ast-transformer","description":"An UglifyJS AST transformer","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"ast-transformer","description":"An UglifyJS AST transformer","repository":{"type":"git","url":"git://github.com/dresende/node-ast-transformer.git"},"version":"0.0.1","homepage":"http://github.com/dresende/node-ast-transformer","dependencies":{"uglify-js":"1.x.x"},"keywords":["AST","uglifyjs"],"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"engines":{"node":"0.4.x"},"directories":{"lib":"./lib","example":"./examples"},"main":"./lib/ast-transformer","_id":"ast-transformer@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.11","dist":{"shasum":"493e3e360e731e9b784aa60e1bd2b8b1e8737f50","tarball":"http://registry.npmjs.org/ast-transformer/-/ast-transformer-0.0.1.tgz"},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}]},"0.0.2":{"name":"ast-transformer","description":"An UglifyJS AST transformer","repository":{"type":"git","url":"git://github.com/dresende/node-ast-transformer.git"},"version":"0.0.2","homepage":"http://github.com/dresende/node-ast-transformer","dependencies":{"uglify-js":"1.x.x"},"keywords":["AST","uglifyjs"],"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"engines":{"node":"0.4.x"},"directories":{"lib":"./lib","example":"./examples"},"main":"./lib/ast-transformer","_id":"ast-transformer@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.11","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9cb72adfe926923be07f28996d7b7da4f3de3cf2","tarball":"http://registry.npmjs.org/ast-transformer/-/ast-transformer-0.0.2.tgz"},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}]}},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}],"time":{"modified":"2011-08-30T13:23:40.235Z","created":"2011-08-25T17:40:43.447Z","0.0.1":"2011-08-25T17:40:43.745Z","0.0.2":"2011-08-30T13:23:40.235Z"},"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"repository":{"type":"git","url":"git://github.com/dresende/node-ast-transformer.git"},"_attachments":{"ast-transformer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eUc+nNCEkjN7kdjXFaAXaA==","length":2791,"stub":true},"ast-transformer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fU7MSLXfaIru0/MEqIFBZA==","length":2595,"stub":true}}}},
{"id":"astar","key":"astar","value":{"rev":"3-3df8c56c64c3863ef0650c0c74e2801b"},"doc":{"_id":"astar","_rev":"3-3df8c56c64c3863ef0650c0c74e2801b","name":"astar","description":"A*Star pathfinding for NodeJS game servers.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"astar","version":"0.0.1","description":"A*Star pathfinding for NodeJS game servers.","keywords":["astar","game","games","html5","graph","movement","multiplayer"],"author":{"name":"Brad Dickason","email":"dickason@gmail.com"},"repository":{"type":"git","url":"git://github.com/bdickason/javascript-astar.git"},"devDependencies":{"coffee-script":">=1.1.1","jasmine-node":">=1.0.6"},"main":"index","engines":{"node":">= 0.4.0"},"dependencies":{},"_id":"astar@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a84defab486d1f57f57afb08b46162b339f044fa","tarball":"http://registry.npmjs.org/astar/-/astar-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"bdickason","email":"dickason@gmail.com"}]}},"maintainers":[{"name":"bdickason","email":"dickason@gmail.com"}],"time":{"modified":"2011-08-21T03:46:22.172Z","created":"2011-08-21T03:46:22.006Z","0.0.1":"2011-08-21T03:46:22.172Z"},"author":{"name":"Brad Dickason","email":"dickason@gmail.com"},"repository":{"type":"git","url":"git://github.com/bdickason/javascript-astar.git"},"_attachments":{"astar-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JbTz+oAPZJ5q6NXPZ2nq7Q==","length":7345,"stub":true}}}},
{"id":"aster","key":"aster","value":{"rev":"51-3fc321bdac065eb65c502b591c50f5b2"},"doc":{"_id":"aster","_rev":"51-3fc321bdac065eb65c502b591c50f5b2","name":"aster","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"aster","descriptions":"Simplified AST traversing.","version":"0.0.2","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"repository":{"type":"git","url":"http://github.com/spiceapps/aster.git"},"main":"./lib/aster","dependencies":{"uglify-js":"*"},"_id":"aster@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/aster/-/aster-0.0.2.tgz"},"directories":{}},"0.0.1":{"name":"aster","descriptions":"Simplified AST traversing.","version":"0.0.1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"repository":{"type":"git","url":"http://github.com/spiceapps/aster.git"},"main":"./lib/index","dependencies":{"uglify-js":"*"},"_id":"aster@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/aster/-/aster-0.0.1.tgz"},"directories":{}},"0.0.3":{"name":"aster","descriptions":"Simplified AST traversing.","version":"0.0.3","author":{"name":"Craig Condon","email":"craig@crcn.com"},"repository":{"type":"git","url":"git://github.com/crcn/aster.git"},"main":"./lib/index.js","dependencies":{"uglify-js":"*"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"aster@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3de0e08a4eb77ebf5d094fc707280fb483e401e7","tarball":"http://registry.npmjs.org/aster/-/aster-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-17T20:53:54.428Z","created":"2011-07-20T01:00:29.244Z","0.0.2":"2011-07-20T01:00:29.464Z","0.0.1":"2011-07-20T06:59:33.860Z","0.0.3":"2012-02-17T20:53:54.428Z"},"author":{"name":"Craig Condon","email":"craig@crcn.com"},"repository":{"type":"git","url":"git://github.com/crcn/aster.git"},"_attachments":{"aster-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-Lxqg6RS5ZDuy1icxG0XAzQ==","length":10240,"stub":true},"aster-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0yqDjVaVXwnagcitG8oevQ==","length":4873,"stub":true},"aster-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aK/TPT0iqagttkRifsh5Ew==","length":4872,"stub":true}}}},
{"id":"asterisk-ami","key":"asterisk-ami","value":{"rev":"15-cdd9b18e501e02d66777ac09048d5d22"},"doc":{"_id":"asterisk-ami","_rev":"15-cdd9b18e501e02d66777ac09048d5d22","name":"asterisk-ami","description":"An asterisk ami connector","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.1","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"make test"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3","urun":"0.0.4"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"asterisk-ami@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b92133560783642b22682f316b7ef4121e7f504e","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.1.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.2":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.2","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"make test"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3","urun":"0.0.4"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"asterisk-ami@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"988cfd7d9e2339f850ea4c6eaaa4494fe85384c2","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.2.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.3":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.3","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"node test/unit/test-AsteriskAmi.js"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"asterisk-ami@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"77d912ba6f9e9fbace01697b918cbc8b9e51b706","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.3.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.5":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.5","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"node test/unit/test-AsteriskAmi.js"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"asterisk-ami@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"36e9591befe5420455b7a7186c04dba01b028932","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.5.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.6":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.6","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"node test/unit/test-AsteriskAmi.js"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"asterisk-ami@0.0.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d5d902d55a5ff823ebb8e53b8fd9756829389b2c","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.6.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.7":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.7","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"node test/unit/test-AsteriskAmi.js"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmUser":{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"},"_id":"asterisk-ami@0.0.7","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8af71818caae2b0cdc80e73821fd1c8dfe16323d","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.7.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]},"0.0.8":{"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"name":"asterisk-ami","description":"An asterisk ami connector","version":"0.0.8","repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"main":"./index","scripts":{"test":"node test/unit/test-AsteriskAmi.js"},"engine":{"node":"*"},"dependencies":{},"devDependencies":{"utest":"0.0.3"},"keywords":["asterisk","ami","voip"],"engines":{"node":"*"},"_npmJsonOpts":{"file":"/Users/danjenkins/.npm/asterisk-ami/0.0.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asterisk-ami@0.0.8","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"026335f36154e20eeee883dae890dcc99f9ce82d","tarball":"http://registry.npmjs.org/asterisk-ami/-/asterisk-ami-0.0.8.tgz"},"maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}]}},"readme":"# asterisk-ami\n\nAn extremely lightweight Asterisk AMI connector\n\n## Install\n\n```\nnpm install asterisk-ami\n```\n\n## Usage\n\n```js\nvar AsteriskAmi = require('./lib/AsteriskAmi');\nvar ami = new AsteriskAmi( { host: 'hostname', username: 'username', password: 'secret' } );\n\nami.on('ami_data', function(data){\n\tconsole.log('AMI DATA', data);\n\t//decide between Events and non events here and what to do with them, maybe run an event emitter for the ones you care about\n});\n\nami.connect(function(){\n\tami.send({action: 'Ping'});//run a callback event when we have connected to the socket\n});//connect creates a socket connection and sends the login action\n\nami.send({action: 'Ping'});\n```\n\n## Configuration options\n\nAsteriskAmi has preset/configurable options, you can set these via an object passed in to AsteriskAmi\n\n* **port**: Port number for Asterisk AMI, default `5038`\n* **host**: Host of Asterisk, default `localhost`\n* **username**: Username of Asterisk AMI user, default: `username`\n* **password**: Password of Asterisk AMI user, default: `password`\n\n## NPM Maintainers\n\nThe npm module for this library is maintained by:\n\n* [Dan Jenkins](http://github.com/danjenkins)\n\n## License\n\nasterisk-ami is licensed under the MIT license.\n","maintainers":[{"name":"danjenkins","email":"dan.jenkins@holidayextras.com"}],"time":{"modified":"2012-03-30T10:43:27.945Z","created":"2012-01-11T21:40:08.906Z","0.0.1":"2012-01-11T21:40:10.570Z","0.0.2":"2012-01-11T21:55:45.543Z","0.0.3":"2012-01-13T15:54:19.835Z","0.0.5":"2012-02-22T21:28:50.787Z","0.0.6":"2012-02-27T10:28:51.671Z","0.0.7":"2012-03-21T11:53:58.263Z","0.0.8":"2012-03-30T10:43:27.945Z"},"author":{"name":"Dan Jenkins","email":"dan.jenkins@holidayextras.com","url":"http://www.holidayextras.co.uk/"},"repository":{"type":"git","url":"git://github.com/holidayextras/node-asterisk-ami.git"},"_attachments":{"asterisk-ami-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-1lmjh27f7kxM2C5HoybWWA==","length":3937,"stub":true},"asterisk-ami-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-F45QrY2tktNAzK0hLdlHRQ==","length":4009,"stub":true},"asterisk-ami-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9q6FaIBZrqHQ3VDak615Ew==","length":3948,"stub":true},"asterisk-ami-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-je0nnWX516dASYLsxGjLuA==","length":3327,"stub":true},"asterisk-ami-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-T8MTdIgUclU+eY/jbRHlww==","length":3109,"stub":true},"asterisk-ami-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ejRDUyo7RP2xLCCW/z8r6w==","length":2952,"stub":true},"asterisk-ami-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1oA738mvOKbecmKv9MDVzg==","length":2949,"stub":true}}}},
{"id":"asterisk-manager","key":"asterisk-manager","value":{"rev":"3-7fbf4294dafee04cc17cca4692c09c33"},"doc":{"_id":"asterisk-manager","_rev":"3-7fbf4294dafee04cc17cca4692c09c33","name":"asterisk-manager","description":"A node.js module for interacting with the Asterisk Manager API.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"asterisk-manager","author":{"name":"Philipp Dunkel","email":"philipp.dunkel@gmail.com"},"version":"0.0.2","description":"A node.js module for interacting with the Asterisk Manager API.","keywords":["asterisk","voip"],"main":"asterisk.js","repositories":[{"type":"git","url":"https://github.com/phidelta/NodeJS-AsteriskManager.git"}],"engine":["node"],"dependencies":{},"devDependencies":{},"_id":"asterisk-manager@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0","_defaultsLoaded":true,"dist":{"shasum":"68b567550b30d0cc8ffe6f35b3eb74df85e0f474","tarball":"http://registry.npmjs.org/asterisk-manager/-/asterisk-manager-0.0.2.tgz"},"scripts":{}}},"maintainers":[{"name":"phidelta","email":"phidelta@phideltacity.net"}],"time":{"modified":"2011-07-10T09:07:09.050Z","created":"2011-07-10T09:07:08.394Z","0.0.2":"2011-07-10T09:07:09.050Z"},"author":{"name":"Philipp Dunkel","email":"philipp.dunkel@gmail.com"},"_attachments":{"asterisk-manager-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bjThYkEXcYNRzzS8T5YSqA==","length":4349,"stub":true}}}},
{"id":"asteriskparser","key":"asteriskparser","value":{"rev":"3-7cbd3f237faf09bf07f4e099b479eafd"},"doc":{"_id":"asteriskparser","_rev":"3-7cbd3f237faf09bf07f4e099b479eafd","name":"asteriskparser","description":"asterisk .conf files parser","dist-tags":{"latest":"0.9.0"},"versions":{"0.9.0":{"name":"asteriskparser","version":"0.9.0","description":"asterisk .conf files parser","author":{"name":"Fernando Alvarez-Uria","email":"fauria@gmail.com"},"main":"./lib/node-asteriskparser","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/fauria/node-asteriskparser.git"},"_npmUser":{"name":"fauria","email":"fauria@gmail.com"},"_id":"asteriskparser@0.9.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"47d6081efef76763faa658e31700233f87f899f9","tarball":"http://registry.npmjs.org/asteriskparser/-/asteriskparser-0.9.0.tgz"},"maintainers":[{"name":"fauria","email":"fauria@gmail.com"}]}},"readme":"# Asterisk .conf parser\n\nSimple Asterisk .conf files parser for NodeJS\n\nTo parse a .conf file async:\n<pre>\nvar iniparser = require('iniparser');\niniparser.parse('./config.ini', function(err,data){\n\tvar version = data.version;\n});\n</pre>\n\nTo parse a .ini file sync:\n<pre>\nvar iniparser = require('iniparser');\nvar config = iniparser.parseSync('./config.ini');\n</pre>\n\nTo parse a string in .ini format:\n<pre>\nvar iniparser = require('iniparser');\nvar config = iniparser.parseString('foo=bar');\n</pre>\n## Installation\nnpm:\n\n`npm install iniparser`\n## License\n\n(The MIT License)\n\nCopyright (c) 2009-2010 Jordy van Gelder &lt;jordyvangelder@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"fauria","email":"fauria@gmail.com"}],"time":{"modified":"2012-06-06T14:23:37.574Z","created":"2012-06-06T14:23:35.233Z","0.9.0":"2012-06-06T14:23:37.574Z"},"author":{"name":"Fernando Alvarez-Uria","email":"fauria@gmail.com"},"repository":{"type":"git","url":"git://github.com/fauria/node-asteriskparser.git"},"_attachments":{"asteriskparser-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KQ43C6pygpeJey3gHCyKmQ==","length":2473,"stub":true}}}},
{"id":"astjourney","key":"astjourney","value":{"rev":"24-e768c04d187b967aa8576ee59d042f2b"},"doc":{"_id":"astjourney","_rev":"24-e768c04d187b967aa8576ee59d042f2b","name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","dist-tags":{"latest":"0.2.7"},"versions":{"0.1.0":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.1.0","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"585cd9280e268b89e062aedea35fe33a77793dfe","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.1.0.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.0","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"78b0987df6cbf2d50b2f9983d05f852f72f37d03","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.0.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"directories":{}},"0.2.1":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.1","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"209ef7ab375a52c5eba6cb002a4d7daeec832d5d","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.1.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"directories":{}},"0.2.2":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.2","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"8e32f40cb01e166827f69ec0a144532920b7a15d","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.2.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"directories":{}},"0.2.3":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.3","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"5e1d0a98f7767c70df1110eb61cdd05d5d3193ea","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.3.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]},"0.2.4":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.4","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"38a3f17729b481650f9e05d4ebff9613433c606e","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.4.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]},"0.2.5":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.5","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"12ee2528b49f8f259b9fc26cb371e28aad66f705","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.5.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]},"0.2.6":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.6","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"596efe35c3a585b76ae386f5820256e62f3474dd","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.6.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]},"0.2.7":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"astjourney","description":"It's a long journey, but on your way, you'll meet all the JS AST nodes.","version":"0.2.7","homepage":"https://github.com/thejh/node-journey","repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"dependencies":{"uglify-js":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"astjourney@0.2.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.7-pre","_defaultsLoaded":true,"dist":{"shasum":"968c2188b5732b38be94b234859ee627ad93b3e7","tarball":"http://registry.npmjs.org/astjourney/-/astjourney-0.2.7.tgz"},"readme":"","maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]}},"readme":null,"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"time":{"modified":"2012-02-15T17:38:52.696Z","created":"2011-11-20T16:01:18.806Z","0.1.0":"2011-11-20T16:01:20.989Z","0.2.0":"2011-12-14T17:03:41.300Z","0.2.1":"2011-12-14T17:21:52.773Z","0.2.2":"2011-12-14T17:37:17.474Z","0.2.3":"2011-12-14T21:16:37.330Z","0.2.4":"2011-12-15T16:49:19.765Z","0.2.5":"2011-12-15T16:55:23.332Z","0.2.6":"2011-12-15T17:22:05.098Z","0.2.7":"2012-01-15T01:34:42.391Z"},"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"repository":{"type":"git","url":"git://github.com/thejh/node-journey.git"},"users":{"arcanis":true},"_attachments":{"astjourney-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-hYdzo+P8Aw2eFMATB2LJTw==","length":14227,"stub":true},"astjourney-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-4rgbcDAqv/oDW2dhE36WyQ==","length":11828,"stub":true},"astjourney-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-fx5/VY7bsAEm8I9DIeSGMw==","length":11757,"stub":true},"astjourney-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-t3jqmxDX6oEnHYUhBzKBNQ==","length":11733,"stub":true},"astjourney-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-MvGecYPM8aVn+5Ezrc9nIw==","length":11751,"stub":true},"astjourney-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-kHjO9AiD/rjHgEqjHcegcg==","length":9474,"stub":true},"astjourney-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QCK7AIndUbUtIE/5kUtJRw==","length":9283,"stub":true},"astjourney-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-PPJQkKraxKBttW2Ke6EcYw==","length":8951,"stub":true},"astjourney-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-19+wESHyzp/xf3OWurx9lw==","length":2114,"stub":true}}}},
{"id":"astream","key":"astream","value":{"rev":"35-ae32db0fe34454c7898306221b7e48a4"},"doc":{"_id":"astream","_rev":"35-ae32db0fe34454c7898306221b7e48a4","name":"astream","description":"Format various object types to activity stream objects","dist-tags":{"latest":"0.2.2"},"versions":{"0.0.1":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.0.1","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2916af95e98a2de491b5071a5ab4677e495c6bba","tarball":"http://registry.npmjs.org/astream/-/astream-0.0.1.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.0.2","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"fe04cfadab41ff6cf8155d9150a923bab05ae197","tarball":"http://registry.npmjs.org/astream/-/astream-0.0.2.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.0.3","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e1c0af5a24c2279b216cac85782ae52d06cedaa5","tarball":"http://registry.npmjs.org/astream/-/astream-0.0.3.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.0.4","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"036d479bf204c0ceff9c6947ae29ed29381f28a5","tarball":"http://registry.npmjs.org/astream/-/astream-0.0.4.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.1.0","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"cdc517214964efe600329589171696c8e4e92381","tarball":"http://registry.npmjs.org/astream/-/astream-0.1.0.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.1.1","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a288cac8b70fc37d0fb1be7782139b30386b5484","tarball":"http://registry.npmjs.org/astream/-/astream-0.1.1.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.1.2","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"efdebe04564be0ad1d04e261e3026bf2e0250cb4","tarball":"http://registry.npmjs.org/astream/-/astream-0.1.2.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.1.4":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.1.4","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9fec9a2aba6a58fc3abce1a396799e94f5863d60","tarball":"http://registry.npmjs.org/astream/-/astream-0.1.4.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.1.6":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.1.6","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.1.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8c14020ad82f16b4a87d45d95f95b8597531497e","tarball":"http://registry.npmjs.org/astream/-/astream-0.1.6.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.1.8":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.1.8","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.1.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c13fbf2a3e44f22a7bd67bf2bb3d4736b94f10a2","tarball":"http://registry.npmjs.org/astream/-/astream-0.1.8.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]},"0.2.2":{"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"name":"astream","description":"Format various object types to activity stream objects","version":"0.2.2","repository":{"url":""},"engines":{"node":"~0.6.6"},"dependencies":{"underscore":"*","coffee-script":"*"},"devDependencies":{},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"astream@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e1eb754b7fa89d26728fe945d24d32aea6480746","tarball":"http://registry.npmjs.org/astream/-/astream-0.2.2.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]}},"readme":"## AStreams\n\nThis module point to match specification http://activitystrea.ms/specs/json/1.0/\n\n## Activity sample\n\n      \"published\": \"2011-02-10T15:04:55Z\",\n      \"actor\": {\n        \"url\": \"http://example.org/martin\",\n        \"objectType\" : \"person\",\n        \"id\": \"tag:example.org,2011:martin\",\n        \"image\": {\n          \"url\": \"http://example.org/martin/image\",\n          \"width\": 250,\n          \"height\": 250\n        },\n        \"displayName\": \"Martin Smith\"\n      },\n      \"verb\": \"post\",\n      \"object\" : {\n        \"url\": \"http://example.org/blog/2011/02/entry\",\n        \"id\": \"tag:example.org,2011:abc123/xyz\"\n      },\n      \"target\" : {\n        \"url\": \"http://example.org/blog/\",\n        \"objectType\": \"blog\",\n        \"id\": \"tag:example.org,2011:abc123\",\n        \"displayName\": \"Martin's Blog\"\n      }\n\n\n## List of verbs (from spec)\n\n  accept \tIndicates that that the actor has accepted the object. For instance, a person accepting an award, or accepting an assignment.\n  access \tIndicates that the actor has gained access to the object.\n  acknowledge \tIndicates that the actor has acknowledged the object. This effectively signals that the actor is aware of the objects existence.\n  add \tIndicates that the actor has added the object to the target. For instance, adding a photo to an album.\n  agree \tIndicates that the actor agrees with the object.\n  append \tIndicates that the actor has appended the object to the target. For instance, a person appending a new record to a database.\n  approve \tIndicates that the actor has approved the object. For instance, a manager might approve a travel request.\n  archive \tIndicates that the actor has archived the object.\n  assign \tIndicates that the actor has assigned the object to the target.\n  at \tIndicates that the actor is currently located at the object. For instance, a person being at a specific physical location.\n  attach \tIndicates that the actor has attached the object to the target. For instance, a person attaching a file to a wiki page or an email.\n  attend \tIndicates that the actor has attended the object. For instance, a person attending a meeting.\n  author \tIndicates that the actor has authored the object. Note that this is a more specific form of the verb \"create\".\n  authorize \tIndicates that the actor has authorized the object. If a target is specified, it means that the authorization is specifically in regards to the target. For instance, a service can authorize a person to access a given application; in which case the actor is the service, the object is the person, and the target is the application. In contrast, a person can authorize a request; in which case the actor is the person and the object is the request and there might be no explicit target.\n  borrow \tIndicates that the actor has borrowed the object. If a target is specified, it identifies the entity from which the object was borrowed. For instance, if a person borrows a book from a library, the person is the actor, the book is the object and the library is the target.\n  build \tIndicates that the actor has built the object. For example, if a person builds a model or compiles code.\n  cancel \tIndicates that the actor has canceled the object. For instance, canceling a calendar event.\n  close \tIndicates that the actor has closed the object.\n  complete \tIndicates that the actor has completed the object.\n  confirm \tIndicates that the actor has confirmed or agrees with the object. For instance, a software developer might confirm an issue reported against a product.\n  consume \tIndicates that the actor has consumed the object. The specific meaning is dependent largely on the object's type. For instance, an actor may \"consume\" an audio object, indicating that the actor has listened to it; or an actor may \"consume\" a book, indicating that the book has been read. As such, the \"consume\" verb is a more generic form of other more specific verbs such as \"read\" and \"play\".\n  checkin \tIndicates that the actor has checked-in to the object. For instance, a person checking-in to a Place.\n  close \tIndicates that the actor has closed the object. For instance, the object could represent a ticket being tracked in an issue management system.\n  create \tIndicates that the actor has created the object.\n  delete \tIndicates that the actor has deleted the object. This implies, but does not require, the permanent destruction of the object.\n  deliver \tIndicates that the actor has delivered the object. For example, delivering a package.\n  deny \tIndicates that the actor has denied the object. For example, a manager may deny a travel request.\n  disagree \tIndicates that the actor disagrees with the object.\n  dislike \tIndicates that the actor dislikes the object. Note that the \"dislike\" verb is distinct from the \"unlike\" verb which connotates that the object had been previously \"liked\".\n  experience \tIndicates that the actor has experienced the object in some manner. Note that, depending on the specific object types used for both the actor and object, the meaning of this verb can overlap that of the \"consume\" and \"play\" verbs. For instance, a person might \"experience\" a movie; or \"play\" the movie; or \"consume\" the movie. The \"experience\" verb SHOULD be considered a more generic form of other more specific verbs as \"consume\", \"play\", \"watch\", \"listen\", and \"read\"\n  favorite \tIndicates that the actor marked the object as an item of special interest.\n  find \tIndicates that the actor has found the object. If a target is specified, it SHOULD indicate where the object was found.\n  follow \tIndicates that the actor began following the activity of the object. In most cases, the object will be a Person, but it can potentially be of any type that can sensibly generate activity. Processors MAY ignore (silently drop) successive identical \"follow\" activities.\n  give \tIndicates that the actor is giving an object to the target. Examples include one person giving a badge object to another person. The object identifies the object being given. The target identifies the receiver.\n  host \tIndicates that the actor is hosting the object. As in hosting an event, or hosting a service.\n  ignore \tIndicates that the actor has ignored the object. For instance, this verb may be used when an actor has ignored a friend request, in which case the object may be the request-friend activity.\n  insert \tIndicates that the actor has inserted the object into the target.\n  install \tIndicates that the actor has installed the object, as in installing an application.\n  interact \tIndicates that the actor has interacted with the object. For instance, when one person interacts with another.\n  invite \tIndicates that the actor has invited the object, typically a person object, to join or participate in the object described by the target. The target could, for instance, be an event, group or a service.\n  join \tIndicates that the actor has become a member of the object. This specification only defines the meaning of this verb when its object is a group, though implementors SHOULD be prepared to handle other Object types as meaning MAY be provided by extension specifications. Processors MAY ignore (silently drop) successive identical \"join\" activities.\n  leave \tIndicates that the actor has left the object. For instance, a Person leaving a Group or checking-out of a Place.\n  like \tIndicates that the actor marked the object as an item of special interest. The \"like\" verb is considered to be an alias of \"favorite\". The two verb are semantically identical.\n  listen \tIndicates that the actor has listened to the object. This is typically only applicable for objects representing audio content, such as music, and audio-book, or a radio broadcast. The \"listen\" verb is a more specific form of the \"consume\", \"experience\" and \"play\" verbs.\n  lose \tIndicates that the actor has lost the object. For instance, if a person loses a game.\n  make-friend \tIndicates the creation of a friendship that is reciprocated by the object. Since this verb implies an activity on the part of its object, processors MUST NOT accept activities with this verb unless they are able to verify through some external means that there is in fact a reciprocated connection. For example, a processor may have received a guarantee from a particular publisher that the publisher will only use this Verb in cases where a reciprocal relationship exists.\n  open \tIndicates that the actor has opened the object. For instance, the object could represent a ticket being tracked in an issue management system.\n  play \tIndicates that the actor spent some time enjoying the object. For example, if the object is a video this indicates that the subject watched all or part of the video. The \"play\" verb is a more specific form of the \"consume\" verb.\n  present \tIndicates that the actor has presented the object. For instance, when a person gives a presentation at a conference.\n  purchase \tIndicates that the actor has purchased the object. If a target is specified, in indicates the entity from which the object was purchased.\n  qualify \tIndicates that the actor has qualified for the object. If a target is specified, it indicates the context within which the qualification applies.\n  read \tIndicates that the actor read the object. This is typically only applicable for objects representing printed or written content, such as a book, a message or a comment. The \"read\" verb is a more specific form of the \"consume\", \"experience\" and \"play\" verbs.\n  receive \tIndicates that the actor is receiving an object. Examples include a person receiving a badge object. The object identifies the object being received.\n  reject \tIndicates that the actor has rejected the object.\n  remove \tIndicates that the actor has removed the object from the target.\n  remove-friend \tIndicates that the actor has removed the object from the collection of friends.\n  replace \tIndicates that the actor has replaced the target with the object.\n  request \tIndicates that the actor has requested the object. If a target is specified, it indicates the entity from which the object is being requested.\n  request-friend \tIndicates the creation of a friendship that has not yet been reciprocated by the object.\n  resolve \tIndicates that the actor has resolved the object. For instance, the object could represent a ticket being tracked in an issue management system.\n  return \tIndicates that the actor has returned the object. If a target is specified, it indicates the entity to which the object was returned.\n  retract \tIndicates that the actor has retracted the object. For instance, if an actor wishes to retract a previously published activity, the object would be the previously published activity that is being retracted.\n  rsvp-maybe \tThe \"possible RSVP\" verb indicates that the actor has made a possible RSVP for the object. This specification only defines the meaning of this verb when its object is an event (see Section 4.11), though implementors SHOULD be prepared to handle other object types as meaning MAY be provided by extension specifications. The use of this verb is only appropriate when the RSVP was created by an explicit action by the actor. It is not appropriate to use this verb when a user has been added as an attendee by an event organiser or administrator.\n  rsvp-no \tThe \"negative RSVP\" verb indicates that the actor has made a negative RSVP for the object. This specification only defines the meaning of this verb when its object is an event (see Section 4.11), though implementors SHOULD be prepared to handle other object types as meaning MAY be provided by extension specifications. The use of this verb is only appropriate when the RSVP was created by an explicit action by the actor. It is not appropriate to use this verb when a user has been added as an attendee by an event organiser or administrator.\n  rsvp-yes \tThe \"positive RSVP\" verb indicates that the actor has made a positive RSVP for an object. This specification only defines the meaning of this verb when its object is an event (see Section 4.11), though implementors SHOULD be prepared to handle other object types as meaning MAY be provided by extension specifications. The use of this verb is only appropriate when the RSVP was created by an explicit action by the actor. It is not appropriate to use this verb when a user has been added as an attendee by an event organiser or administrator.\n  satisfy \tIndicates that the actor has satisfied the object. If a target is specified, it indicate the context within which the object was satisfied. For instance, if a person satisfies the requirements for a particular challenge, the person is the actor; the requirement is the object; and the challenge is the target.\n  save \tIndicates that the actor has called out the object as being of interest primarily to him- or herself. Though this action MAY be shared publicly, the implication is that the object has been saved primarily for the actor's own benefit rather than to show it to others as would be indicated by the \"share\" verb.\n  schedule \tIndicates that the actor has scheduled the object. For instance, scheduling a meeting.\n  search \tIndicates that the actor is or has searched for the object. If a target is specified, it indicates the context within which the search is or has been conducted.\n  sell \tIndicates that the actor has sold the object. If a target is specified, it indicates the entity to which the object was sold.\n  send \tIndicates that the actor has sent the object. If a target is specified, it indicates the entity to which the object was sent.\n  share \tIndicates that the actor has called out the object to readers. In most cases, the actor did not create the object being shared, but is instead drawing attention to it.\n  sponsor \tIndicates that the actor has sponsored the object. If a target is specified, it indicates the context within which the sponsorship is offered. For instance, a company can sponsor an event; or an individual can sponsor a project; etc.\n  start \tIndicates that the actor has started the object. For instance, when a person starts a project.\n  stop-following \tIndicates that the actor has stopped following the object.\n  submit \tIndicates that the actor has submitted the object. If a target is specified, it indicates the entity to which the object was submitted.\n  tag \tIndicates that the actor has associated the object with the target. For example, if the actor specifies that a particular user appears in a photo. the object is the user and the target is the photo.\n  terminate \tIndicates that the actor has terminated the object.\n  tie \tIndicates that the actor has neither won or lost the object. This verb is generally only applicable when the object represents some form of competition, such as a game.\n  unfavorite \tIndicates that the actor has removed the object from the collection of favorited items.\n  unlike \tIndicates that the actor has removed the object from the collection of liked items.\n  unsatisfy \tIndicates that the actor has not satisfied the object. If a target is specified, it indicates the context within which the object was not satisfied. For instance, if a person fails to satisfy the requirements of some particular challenge, the person is the actor; the requirement is the object and the challenge is the target.\n  unsave \tIndicates that the actor has removed the object from the collection of saved items.\n  unshare \tIndicates that the actor is no longer sharing the object. If a target is specified, it indicates the entity with whom the object is no longer being shared.\n  update \tThe \"update\" verb indicates that the actor has modified the object. Implementors SHOULD use verbs such as post where the actor is adding new items to a collection or similar. Update is reserved for modifications to existing objects or data such as changing a user's profile information.\n  use \tIndicates that the actor has used the object in some manner.\n  watch \tIndicates that the actor has watched the object. This verb is typically applicable only when the object represents dynamic, visible content such as a movie, a television show or a public performance. This verb is a more specific form of the verbs \"experience\", \"play\" and \"consume\".\n  won \tIndicates that the actor has won the object. This verb is typically applicable only when the object represents some form of competition, such as a game.\n\n## Descr\n\n  Each acctivity object extended by fields: \n     private:     - boolean\n     month_year:  - month and year MM.YYYY\n     ownerId:     - ???\n     object.cvs   - git or other repo clone uri\n     source       - object source, like tweet.github, or others\n     stat.following\n     stat.followers\n     stat.url\n\n## Person fields\n\n\"actor\": {\n      \"url\": \"http://example.org/martin\",\n      \"objectType\" : \"person\",\n      \"id\": \"tag:example.org,2011:martin\",\n      \"image\": {\n        \"url\": \"http://example.org/martin/image\",\n        \"width\": 250,\n        \"height\": 250\n      },\n      \"displayName\": \"Martin Smith\"\n\n\n\t\"avatar\" : \n\t\"url\" : \"https://api.github.com/users/indutny\",\n\t\"name\" : \"Fedor Indutny\",\n\t\"screen_name\" : \"indutny\",\n\t\"uid\" : \"github/238531\", ???\n\t\"following\" : 15,\n\t\"followers\" : 257,\n\t\"location\" : \"Russia\"\n\n\n\n## Licence\n\n   (The MIT License)\n\nCopyright (c) 2012 Temnov Kirill <allselead@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"time":{"modified":"2012-06-06T08:36:09.894Z","created":"2012-05-10T23:29:17.163Z","0.0.1":"2012-05-10T23:29:19.286Z","0.0.2":"2012-05-11T20:58:16.054Z","0.0.3":"2012-05-12T14:24:51.351Z","0.0.4":"2012-05-14T04:46:28.036Z","0.1.0":"2012-05-23T09:02:34.295Z","0.1.1":"2012-05-23T09:23:46.492Z","0.1.2":"2012-05-24T09:37:38.112Z","0.1.4":"2012-06-03T17:05:45.639Z","0.1.6":"2012-06-04T04:52:28.280Z","0.1.8":"2012-06-05T12:07:57.170Z","0.2.2":"2012-06-06T08:36:09.894Z"},"author":{"name":"Kirill Temnov @selead","url":"https://github.com/selead"},"repository":{"url":""},"_attachments":{"astream-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Rh+c2JAfnhxKq8ArQiSAfw==","length":10240,"stub":true},"astream-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-JOcrlAxl3yqjb0Fwve097g==","length":10240,"stub":true},"astream-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-1XyifnvGOvK+OsV7w/ZJ7g==","length":10240,"stub":true},"astream-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-aefI7uMJtZDeE/LM3AmfmQ==","length":10240,"stub":true},"astream-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-X/FBbjFLre94wZfIEP3kpw==","length":10240,"stub":true},"astream-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-FMIswuPXxZEUfjebS6z8rA==","length":10240,"stub":true},"astream-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-OiRYTk8x4CGKX+kihqcp9w==","length":10240,"stub":true},"astream-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-WdpmwvDBnn5xdvWgGJcpYA==","length":10240,"stub":true},"astream-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WU9yMJ5E0NWEAa+Tl+tKtg==","length":10240,"stub":true},"astream-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7MtAvTnNmTl4JMAyUliuBw==","length":10240,"stub":true},"astream-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2gUGbjhXbhb0P0DHnIPY2A==","length":10240,"stub":true}}}},
{"id":"astrolin","key":"astrolin","value":{"rev":"9-ef8b485c99bde5a811d06e455278dc90"},"doc":{"_id":"astrolin","_rev":"9-ef8b485c99bde5a811d06e455278dc90","name":"astrolin","description":"astro-let's do open links / source","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"astrolin","description":"astrolet's open astrology projects linking","keywords":["astrology","aslrolet","opensource"],"version":"0.0.1","homepage":"http://astrolin.com","repository":{"type":"git","url":"git://github.com/astrolet/astrolin.git"},"bugs":{"email":"support@astrolet.net","url":"https://github.com/astrolet/astrolin/issues"},"author":{"name":"Orlin M Bozhinov","email":"orlin@astrolet.net","url":"http://soundsapiens.com"},"contributors":[],"directories":{"web":"./web"},"main":"server","dependencies":{"coffee-script":"*","express":"~2.2.2","jade":"~0.10.4","massagist":"*"},"devDependencies":{"node-dev":"*","node-inspector":"*","async":"*","vows":"*"},"scripts":{"test":"cake -s test","start":"node server.js"},"os":["aix","freebsd","linux","macos","solaris"],"engines":{"node":"0.4"},"licenses":[{"type":"Unlicense","url":"http://unlicense.org/"}],"_id":"astrolin@0.0.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"f9324acf2ad924c723f516d7a471c28dfc4ee2dc","tarball":"http://registry.npmjs.org/astrolin/-/astrolin-0.0.1.tgz"}},"0.0.1-0":{"name":"astrolin","description":"astro-let's do open links","keywords":["astrology","aslrolet","opensource","resource"],"version":"0.0.1-0","homepage":"http://astrolin.com","repository":{"type":"git","url":"git://github.com/astrolet/astrolin.git"},"bugs":{"email":"support@astrolet.net","url":"https://github.com/astrolet/astrolin/issues"},"author":{"name":"Orlin M Bozhinov","email":"orlin@astrolet.net","url":"http://soundsapiens.com"},"contributors":[],"directories":{"web":"./web"},"main":"server","dependencies":{"coffee-script":"*","express":"~2.2.2","jade":"~0.10.4","massagist":"*"},"devDependencies":{"node-dev":"*","node-inspector":"*","async":"*","vows":"*","api-easy":"*"},"scripts":{"test":"cake -s test","start":"node server.js"},"os":["aix","freebsd","linux","macos","solaris"],"engines":{"node":"0.4"},"licenses":[{"type":"Unlicense","url":"http://unlicense.org/"}],"_npmUser":{"name":"orlin","email":"om@soundsapiens.com"},"_id":"astrolin@0.0.1-0","optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"08dc23382833fc9f73e3b0dce80ecafcb21fcc35","tarball":"http://registry.npmjs.org/astrolin/-/astrolin-0.0.1-0.tgz"},"readme":"# astrolin -- astro-let's do open links\n\n\n## DESCRIPTION\n\n    grow astrology like the woods\n    grow stronger with each tree\n\n\n## WEBSITE\n\n    node server.js\n\nServed as [astrolin.com/](http://www.astrolin.com).\nAlso, [a wiki](https://github.com/astrolet/astrolin/wiki) for all.\n\n## INSTALL\n\nWith the [npm](http://npmjs.org) prerequisite, do `npm install astrolin`.\n\n\n## LICENSE\n\nThis is free and unencumbered public domain software. For more information,\nsee <http://unlicense.org/> or the accompanying [UNLICENSE](http://astrolet.github.com/astrolin/UNLICENSE.html) file.\n\n\n## NAVIGATE\n\nHome(7)\n","maintainers":[{"name":"orlin","email":"om@soundsapiens.com"}]},"0.0.1-1":{"name":"astrolin","description":"astro-let's do open links / source","keywords":["astrology","aslrolet","opensource","resource"],"version":"0.0.1-1","homepage":"http://astrolin.com","repository":{"type":"git","url":"git://github.com/astrolet/astrolin.git"},"bugs":{"email":"support@astrolet.net","url":"https://www.pivotaltracker.com/projects/265847"},"author":{"name":"Orlin M Bozhinov","email":"orlin@astrolet.net","url":"http://soundsapiens.com"},"contributors":[],"directories":{"web":"./web"},"main":"server","dependencies":{"coffee-script":"*","underscore":"*","express":"*","jade":"*"},"devDependencies":{"node-dev":"*","node-inspector":"*","async":"*","vows":"*","api-easy":"*"},"scripts":{"test":"cake test","start":"node server.js"},"os":["aix","freebsd","linux","macos","solaris"],"engines":{"node":"0.6.x","npm":"1.1.x"},"licenses":[{"type":"Unlicense","url":"http://unlicense.org/"}],"_npmUser":{"name":"orlin","email":"om@soundsapiens.com"},"_id":"astrolin@0.0.1-1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"2f86d49e78bee8c5bc0e6e5f5adc79e887144b92","tarball":"http://registry.npmjs.org/astrolin/-/astrolin-0.0.1-1.tgz"},"readme":"# [![Build Status](https://secure.travis-ci.org/astrolet/astrolin.png)](http://travis-ci.org/astrolet/astrolin)\n# astrolin -- astro-let's do open links / source\n\n\n## SYNOPSIS\n\n    grow astrology like the woods\n    grow stronger with each tree\n\n\n## WEBSITE\n\n    node server.js\n\nServed as [astrolin.com/](http://www.astrolin.com).\nAlso, [a wiki](https://github.com/astrolet/astrolin/wiki) for all.\n\n## INSTALL\n\nWith the [npm](http://npmjs.org) prerequisite, do `npm install astrolin`.\n\n\n## LICENSE\n\nThis is free and unencumbered public domain software. For more information,\nsee <http://unlicense.org/> or the accompanying [UNLICENSE](http://astrolet.github.com/astrolin/UNLICENSE.html) file.\n\n\n## NAVIGATE\n\nHome(7)\n","maintainers":[{"name":"orlin","email":"om@soundsapiens.com"}]},"0.0.2":{"name":"astrolin","description":"astro-let's do open links / source","keywords":["astrology","aslrolet","opensource","resource"],"version":"0.0.2","homepage":"http://astrolin.com","repository":{"type":"git","url":"git://github.com/astrolet/astrolin.git"},"bugs":{"email":"support@astrolet.net","url":"https://www.pivotaltracker.com/projects/265847"},"author":{"name":"Orlin M Bozhinov","email":"orlin@astrolet.net","url":"http://soundsapiens.com"},"contributors":[],"directories":{"web":"./web"},"main":"server","dependencies":{"coffee-script":"*","underscore":"*","ecstatic":"*","express":"*","jade":"*"},"devDependencies":{"node-dev":"*","node-inspector":"*","async":"*","vows":"*","api-easy":"*","police":"*"},"scripts":{"test":"cake test","start":"node server.js"},"os":["aix","freebsd","linux","macos","solaris"],"engines":{"node":"0.8.x","npm":"1.1.x"},"licenses":[{"type":"Unlicense","url":"http://unlicense.org/"}],"_npmUser":{"name":"orlin","email":"om@soundsapiens.com"},"_id":"astrolin@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"860fd848dfdb819a589168b2a0ad611541814aae","tarball":"http://registry.npmjs.org/astrolin/-/astrolin-0.0.2.tgz"},"readme":"# [![Build Status](https://secure.travis-ci.org/astrolet/astrolin.png)](http://travis-ci.org/astrolet/astrolin)\n# astrolin -- astro-let's do open links / source\n\n\n## WHAT\n\n    grow astrology like the woods\n    grow stronger with each tree\n\n\n## SITE\n\n    node server.js\n\nServed as [astrolin.com/](http://www.astrolin.com).\nAlso, [a wiki](https://github.com/astrolet/astrolin/wiki) for all.\n\n\n## SETUP\n\nWith the [npm](http://npmjs.org) prerequisite, do `npm install astrolin`.\n\n\n## LAW\n\nThis is free and unencumbered public domain software. For more information,\nsee <http://unlicense.org/> or the accompanying [UNLICENSE](http://astrolet.github.com/astrolin/UNLICENSE.html) file.\n\n\n## HOME\n\nBase(7)\n","maintainers":[{"name":"orlin","email":"om@soundsapiens.com"}]}},"maintainers":[{"name":"orlin","email":"om@soundsapiens.com"}],"time":{"modified":"2012-07-10T14:31:19.831Z","created":"2011-05-10T16:36:37.483Z","0.0.1":"2011-05-10T16:36:38.635Z","0.0.1-0":"2012-04-21T16:55:48.443Z","0.0.1-1":"2012-04-22T16:32:16.494Z","0.0.2":"2012-07-10T14:31:19.831Z"},"author":{"name":"Orlin M Bozhinov","email":"orlin@astrolet.net","url":"http://soundsapiens.com"},"repository":{"type":"git","url":"git://github.com/astrolet/astrolin.git"},"_attachments":{"astrolin-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SBQCS+b9jU7Ls07qstXw9A==","length":111870,"stub":true},"astrolin-0.0.1-1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1pnZVo0rgQ3+bZyMgmv0iw==","length":10412,"stub":true},"astrolin-0.0.1-0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vb3dWc06LpZ0Tnt7Jse0AA==","length":9854,"stub":true},"astrolin-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oGJbGb+X+PXtPRSNcFPZ0w==","length":8475,"stub":true}}}},
{"id":"asyn","key":"asyn","value":{"rev":"3-51996b0197c21e85858559045c1481b7"},"doc":{"_id":"asyn","_rev":"3-51996b0197c21e85858559045c1481b7","name":"asyn","description":"Asynchronous for normal people","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"asyn","description":"Asynchronous for normal people","homepage":"https://github.com/limeblack/asyn","keywords":["util","asynchronous","server","client"],"contributors":[],"dependencies":{},"repository":{"type":"git","url":"git://github.com/limeblack/asyn.git"},"main":"asyn.js","version":"0.0.1","_npmJsonOpts":{"file":"/home/austin/.npm/asyn/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asyn@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"7919d385bafb5dd86639067932a1e63085c86492","tarball":"http://registry.npmjs.org/asyn/-/asyn-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"limeblack","email":"limeblack7@gmail.com"}]}},"maintainers":[{"name":"limeblack","email":"limeblack7@gmail.com"}],"time":{"modified":"2011-09-22T01:51:37.752Z","created":"2011-09-22T01:51:37.450Z","0.0.1":"2011-09-22T01:51:37.752Z"},"repository":{"type":"git","url":"git://github.com/limeblack/asyn.git"},"_attachments":{"asyn-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JceEl+sumHTMZNU7IZYgMw==","length":2356,"stub":true}}}},
{"id":"async","key":"async","value":{"rev":"76-61b41523497d80518aa4aed9bafd4c96"},"doc":{"_id":"async","_rev":"76-61b41523497d80518aa4aed9bafd4c96","name":"async","description":"Higher-order functions and common patterns for asynchronous code","dist-tags":{"latest":"0.1.22"},"versions":{"0.1.0":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.0","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.0.tgz"}},"0.1.1":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.1","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.1.tgz"}},"0.1.2":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.2","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.2.tgz"}},"0.1.3":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.3","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.3.tgz"}},"0.1.4":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.4","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.4.tgz"}},"0.1.5":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.5","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.5.tgz"}},"0.1.6":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.6","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async/-/async-0.1.6.tgz"}},"0.1.7":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.7","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.7","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.4-1","_nodeVersion":"v0.2.5","dist":{"tarball":"http://registry.npmjs.org/async/-/async-0.1.7.tgz"}},"0.1.8":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.8","repository":{"type":"git","url":"http://github.com/caolan/async.git"},"bugs":{"web":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_id":"async@0.1.8","engines":{"node":"*"},"_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/async/-/async-0.1.8.tgz"}},"0.1.9":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.9","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"async@0.1.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc7","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"f984d0739b5382c949cc3bea702d21d0dbd52040","tarball":"http://registry.npmjs.org/async/-/async-0.1.9.tgz"}},"0.1.10":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.10","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/caolan/.npm/async/0.1.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async@0.1.10","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"12b32bf098fa7fc51ae3ac51441b8ba15f437cf1","tarball":"http://registry.npmjs.org/async/-/async-0.1.10.tgz"},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.11":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.11","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/caolan/.npm/async/0.1.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async@0.1.11","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a397a69c6febae232d20a76a5b10d8742e2b8215","tarball":"http://registry.npmjs.org/async/-/async-0.1.11.tgz"},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.12":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.12","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/caolan/.npm/async/0.1.12/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async@0.1.12","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ab36be6611dc63d91657128e1d65102b959d4afe","tarball":"http://registry.npmjs.org/async/-/async-0.1.12.tgz"},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.13":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.13","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.13","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"f1e53ad69dab282d8e75cbec5e2c5524b6195eab","tarball":"http://registry.npmjs.org/async/-/async-0.1.13.tgz"},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.14":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.14","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.14","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"0fcfaf089229fc657798203d1a4544102f7d26dc","tarball":"http://registry.npmjs.org/async/-/async-0.1.14.tgz"},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.15":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.15","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.15","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"2180eaca2cf2a6ca5280d41c0585bec9b3e49bd3","tarball":"http://registry.npmjs.org/async/-/async-0.1.15.tgz"},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.16":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.16","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.16","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b3a61fdc1a9193d4f64755c7600126e254223186","tarball":"http://registry.npmjs.org/async/-/async-0.1.16.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // in this case, the results array will equal ['two','one']\n        // because the functions were run in parallel and the second\n        // function had a shorter timeout before calling the callback.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.17":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.17","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"dependencies":{"uglify-js":"1.2.x"},"devDependencies":{"nodeunit":">0.0.0","nodelint":">0.0.0"},"scripts":{"preinstall":"make clean","install":"make build","test":"make test"},"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.17","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"03524a379e974dc9ee5c811c6ee3815d7bc54f6e","tarball":"http://registry.npmjs.org/async/-/async-0.1.17.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // in this case, the results array will equal ['two','one']\n        // because the functions were run in parallel and the second\n        // function had a shorter timeout before calling the callback.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.18":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.18","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"devDependencies":{"nodeunit":">0.0.0","uglify-js":"1.2.x","nodelint":">0.0.0"},"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.18","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c59c923920b76d5bf23248c04433920c4d45086a","tarball":"http://registry.npmjs.org/async/-/async-0.1.18.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // in this case, the results array will equal ['two','one']\n        // because the functions were run in parallel and the second\n        // function had a shorter timeout before calling the callback.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.19":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.19","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"devDependencies":{"nodeunit":">0.0.0","uglify-js":"1.2.x","nodelint":">0.0.0"},"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.19","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"4fd6125a70f841fb10b14aeec6e23cf1479c71a7","tarball":"http://registry.npmjs.org/async/-/async-0.1.19.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // the results array will equal ['one','two'] even though\n        // the second function had a shorter timeout.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.20":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.20","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"devDependencies":{"nodeunit":">0.0.0","uglify-js":"1.2.x","nodelint":">0.0.0"},"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.20","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ba0e47b08ae972e04b5215de28539b313482ede5","tarball":"http://registry.npmjs.org/async/-/async-0.1.20.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // the results array will equal ['one','two'] even though\n        // the second function had a shorter timeout.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.21":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.21","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"devDependencies":{"nodeunit":">0.0.0","uglify-js":"1.2.x","nodelint":">0.0.0"},"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.21","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b5b12e985f09ab72c202fa00f623cd9d997e9464","tarball":"http://registry.npmjs.org/async/-/async-0.1.21.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // the results array will equal ['one','two'] even though\n        // the second function had a shorter timeout.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]},"0.1.22":{"name":"async","description":"Higher-order functions and common patterns for asynchronous code","main":"./index","author":{"name":"Caolan McMahon"},"version":"0.1.22","repository":{"type":"git","url":"git://github.com/caolan/async.git"},"bugs":{"url":"http://github.com/caolan/async/issues"},"licenses":[{"type":"MIT","url":"http://github.com/caolan/async/raw/master/LICENSE"}],"devDependencies":{"nodeunit":">0.0.0","uglify-js":"1.2.x","nodelint":">0.0.0"},"_npmUser":{"name":"caolan","email":"caolan@caolanmcmahon.com"},"_id":"async@0.1.22","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061","tarball":"http://registry.npmjs.org/async/-/async-0.1.22.tgz"},"readme":"# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n    async.parallel([\n        function(){ ... },\n        function(){ ... }\n    ], callback);\n\n    async.series([\n        function(){ ... },\n        function(){ ... }\n    ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n    <script type=\"text/javascript\" src=\"async.js\"></script>\n    <script type=\"text/javascript\">\n\n        async.map(data, asyncProcess, function(err, results){\n            alert(results);\n        });\n\n    </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // assuming openFiles is an array of file names and saveFile is a function\n    // to save the modified contents of that file:\n\n    async.forEach(openFiles, saveFile, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n    // Assume documents is an array of JSON objects and requestApi is a\n    // function that interacts with a rate-limited REST api.\n\n    async.forEachLimit(documents, 20, requestApi, function(err){\n        // if any of the saves produced an error, err would equal that error\n    });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n    async.map(['file1','file2','file3'], fs.stat, function(err, results){\n        // results is now an array of stats for each file\n    });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n    async.filter(['file1','file2','file3'], path.exists, function(results){\n        // results now equals an array of the existing files\n    });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback which accepts an optional error as its first argument, and the state\n  of the reduction as the second. If an error is passed to the callback, the\n  reduction is stopped and the main callback is immediately called with the\n  error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n    async.reduce([1,2,3], 0, function(memo, item, callback){\n        // pointless async:\n        process.nextTick(function(){\n            callback(null, memo + item)\n        });\n    }, function(err, result){\n        // result is now equal to the last value of memo, which is 6\n    });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n    async.detect(['file1','file2','file3'], path.exists, function(result){\n        // result now equals the first file in the list that exists\n    });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n    async.sortBy(['file1','file2','file3'], function(file, callback){\n        fs.stat(file, function(err, stats){\n            callback(err, stats.mtime);\n        });\n    }, function(err, results){\n        // results is now the original array of files sorted by\n        // modified date\n    });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n    async.some(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then at least one of the files exists\n    });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n    async.every(['file1','file2','file3'], path.exists, function(result){\n        // if result is true then every file exists\n    });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback which must be called once it has completed\n  with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n    async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n        // files is now a list of filenames that exist in the 3 directories\n    });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.series([\n        function(callback){\n            // do some stuff ...\n            callback(null, 'one');\n        },\n        function(callback){\n            // do some more stuff ...\n            callback(null, 'two');\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // results is now equal to ['one', 'two']\n    });\n\n\n    // an example using an object instead of an array\n    async.series({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equal to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n  callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets an array of all the arguments passed to\n  the callbacks used in the array.\n\n__Example__\n\n    async.parallel([\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'one');\n            }, 200);\n        },\n        function(callback){\n            setTimeout(function(){\n                callback(null, 'two');\n            }, 100);\n        },\n    ],\n    // optional callback\n    function(err, results){\n        // the results array will equal ['one','two'] even though\n        // the second function had a shorter timeout.\n    });\n\n\n    // an example using an object instead of an array\n    async.parallel({\n        one: function(callback){\n            setTimeout(function(){\n                callback(null, 1);\n            }, 200);\n        },\n        two: function(callback){\n            setTimeout(function(){\n                callback(null, 2);\n            }, 100);\n        },\n    },\n    function(err, results) {\n        // results is now equals to: {one: 1, two: 2}\n    });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback which must be called once it has completed with an optional\n  error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n    var count = 0;\n\n    async.whilst(\n        function () { return count < 5; },\n        function (callback) {\n            count++;\n            setTimeout(callback, 1000);\n        },\n        function (err) {\n            // 5 seconds have passed\n        }\n    );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n    async.waterfall([\n        function(callback){\n            callback(null, 'one', 'two');\n        },\n        function(arg1, arg2, callback){\n            callback(null, 'three');\n        },\n        function(arg1, callback){\n            // arg1 now equals 'three'\n            callback(null, 'done');\n        }\n    ], function (err, result) {\n       // result now equals 'done'    \n    });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n    // create a queue object with concurrency 2\n\n    var q = async.queue(function (task, callback) {\n        console.log('hello ' + task.name);\n        callback();\n    }, 2);\n\n\n    // assign a callback\n    q.drain = function() {\n        console.log('all items have been processed');\n    }\n\n    // add some items to the queue\n\n    q.push({name: 'foo'}, function (err) {\n        console.log('finished processing foo');\n    });\n    q.push({name: 'bar'}, function (err) {\n        console.log('finished processing bar');\n    });\n\n    // add some items to the queue (batch-wise)\n\n    q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n        console.log('finished processing bar');\n    });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The\n  syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. If all tasks complete\n  successfully, it will receive an object containing their results.\n\n__Example__\n\n    async.auto({\n        get_data: function(callback){\n            // async code to get some data\n        },\n        make_folder: function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        },\n        write_file: ['get_data', 'make_folder', function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            callback(null, filename);\n        }],\n        email_link: ['write_file', function(callback, results){\n            // once the file is written let's email a link to it...\n            // results.write_file contains the filename returned by write_file.\n        }]\n    });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n    async.parallel([\n        function(callback){\n            // async code to get some data\n        },\n        function(callback){\n            // async code to create a directory to store a file in\n            // this is run at the same time as getting the data\n        }\n    ],\n    function(results){\n        async.series([\n            function(callback){\n                // once there is some data and the directory exists,\n                // write the data to a file in the directory\n            },\n            email_link: function(callback){\n                // once the file is written let's email a link to it...\n            }\n        ]);\n    });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n  must call on completion.\n\n__Example__\n\n    var iterator = async.iterator([\n        function(){ sys.p('one'); },\n        function(){ sys.p('two'); },\n        function(){ sys.p('three'); }\n    ]);\n\n    node> var iterator2 = iterator();\n    'one'\n    node> var iterator3 = iterator2();\n    'two'\n    node> iterator3();\n    'three'\n    node> var nextfn = iterator2.next();\n    node> nextfn();\n    'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n    // using apply\n\n    async.parallel([\n        async.apply(fs.writeFile, 'testfile1', 'test1'),\n        async.apply(fs.writeFile, 'testfile2', 'test2'),\n    ]);\n\n\n    // the same process without using apply\n\n    async.parallel([\n        function(callback){\n            fs.writeFile('testfile1', 'test1', callback);\n        },\n        function(callback){\n            fs.writeFile('testfile2', 'test2', callback);\n        },\n    ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n    node> var fn = async.apply(sys.puts, 'one');\n    node> fn('two', 'three');\n    one\n    two\n    three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n    var call_order = [];\n    async.nextTick(function(){\n        call_order.push('two');\n        // call_order now equals ['one','two]\n    });\n    call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n    var slow_fn = function (name, callback) {\n        // do something\n        callback(null, result);\n    };\n    var fn = async.memoize(slow_fn);\n\n    // fn can now be used as if it were slow_fn\n    fn('some name', function () {\n        // callback\n    });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, 'hello ' + name);\n        }, 1000);\n    };\n\n    node> async.log(hello, 'world');\n    'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n    var hello = function(name, callback){\n        setTimeout(function(){\n            callback(null, {hello: name});\n        }, 1000);\n    };\n\n    node> async.dir(hello, 'world');\n    {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n","maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}]}},"maintainers":[{"name":"caolan","email":"caolan@caolanmcmahon.com"}],"author":{"name":"Caolan McMahon"},"repository":{"type":"git","url":"git://github.com/caolan/async.git"},"time":{"modified":"2012-08-12T14:41:59.797Z","created":"2010-12-19T16:41:51.765Z","0.1.0":"2010-12-19T16:41:51.765Z","0.1.1":"2010-12-19T16:41:51.765Z","0.1.2":"2010-12-19T16:41:51.765Z","0.1.3":"2010-12-19T16:41:51.765Z","0.1.4":"2010-12-19T16:41:51.765Z","0.1.5":"2010-12-19T16:41:51.765Z","0.1.6":"2010-12-19T16:41:51.765Z","0.1.7":"2010-12-19T16:41:51.765Z","0.1.8":"2011-01-18T09:56:53.975Z","0.1.9":"2011-04-27T20:48:08.634Z","0.1.10":"2011-09-19T04:40:01.573Z","0.1.11":"2011-10-14T17:07:28.752Z","0.1.12":"2011-10-14T17:19:19.452Z","0.1.13":"2011-10-29T22:33:52.448Z","0.1.14":"2011-10-29T22:40:14.486Z","0.1.15":"2011-11-01T23:05:01.415Z","0.1.16":"2012-02-13T04:56:23.926Z","0.1.17":"2012-02-27T02:40:58.997Z","0.1.18":"2012-02-27T16:51:02.109Z","0.1.19":"2012-05-24T06:51:06.109Z","0.1.20":"2012-05-24T06:53:39.997Z","0.1.21":"2012-05-24T07:16:16.753Z","0.1.22":"2012-05-30T18:26:44.821Z"},"users":{"thejh":true,"avianflu":true,"dylang":true,"ragingwind":true,"vesln":true,"mvolkmann":true,"mikl":true,"linus":true,"pvorb":true,"dodo":true,"danielr":true,"suor":true,"dolphin278":true,"kurijov":true,"langpavel":true,"alexindigo":true,"fgribreau":true,"hughsk":true,"pid":true,"tylerstalder":true,"gillesruppert":true,"coiscir":true,"xenomuta":true},"_attachments":{"async-0.1.22.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-UYn+YkilENYAwl59S0ndug==","length":12287,"stub":true},"async-0.1.21.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-hPj2YLPrRxvtMFfu1A4XEQ==","length":12272,"stub":true},"async-0.1.20.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-nBMBMPbpsBH/tnGNoWnYxg==","length":12271,"stub":true},"async-0.1.19.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-4FhJibs6EoVO2CBDEszh+w==","length":12264,"stub":true},"async-0.1.18.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-Mt4RCj7NOEhiDPSiDg23YQ==","length":12345,"stub":true},"async-0.1.17.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-79u/cIUzY9a5dF/Lwsck6A==","length":12384,"stub":true},"async-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-pO4f2I69qPh6wu4hGjMxfg==","length":35644,"stub":true},"async-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-Atr/W7n0UOh5+RqKU0VlQg==","length":34094,"stub":true},"async-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-2WVCL3PnmSO6bNRDdC9u3Q==","length":34078,"stub":true},"async-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-xyghMsqDFUGI1jRmc6F6rg==","length":33832,"stub":true},"async-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-GOrD2qVy8pWoZfiIMfyhLQ==","length":33675,"stub":true},"async-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-QJlPJ5pcm9/SCBZUiw+c1A==","length":33445,"stub":true},"async-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-2TZsiUtghx4nxX0HVPKErA==","length":33249,"stub":true},"async-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-XINvkUsFTytaRZWsc800eQ==","length":35983,"stub":true},"async-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-BMw5kSyF7XCrknCT8nC6Iw==","length":46539,"stub":true},"async-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-v/KudM2BXYr/2LnMFGjvdg==","length":45682,"stub":true},"async-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-rg5DkoOmbp+l0EOcQ7zG6w==","length":13278,"stub":true},"async-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-R+NReTU58hIlcC8y27oRUg==","length":66250,"stub":true},"async-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-eDV0ckTGBuqyJWyLyu1PCw==","length":74427,"stub":true},"async-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fBfkYG1teDJCOZWoF5sXhQ==","length":84940,"stub":true},"async-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nOi4m1d8fg6fzSX2GMHn0w==","length":13161,"stub":true},"async-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pfy4Iza+EmmTwfNOFL6Spg==","length":9932,"stub":true},"async-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lmnjX62K+KSfzpHrAYvxdQ==","length":9510,"stub":true}}}},
{"id":"async-array","key":"async-array","value":{"rev":"18-142f432a4d4b053f650ad8b7d0a15271"},"doc":{"_id":"async-array","_rev":"18-142f432a4d4b053f650ad8b7d0a15271","name":"async-array","description":"A sane control flow library","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.0","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_id":"async-array@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d7502c9362ecdffdaf2e73445e7ec50a4af502db","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.1","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_id":"async-array@0.1.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"59c8dac0a0f9af6ecd82894e9b7954d2d5adff32","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.2","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_id":"async-array@0.1.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"455715100c51fdd9db919bbce25d84825969b364","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.3","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_id":"async-array@0.1.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"042195c85e4e00f7766b34910e3ecfa89ca39726","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.4","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_npmJsonOpts":{"file":"/home/tim/.npm/async-array/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-array@0.1.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0540b20a703bbc0d5cc5e568a7cec452c05ab57c","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.4.tgz"},"scripts":{}},"0.1.5":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.5","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_npmJsonOpts":{"file":"/home/tim/.npm/async-array/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-array@0.1.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"609edc7fe697994fd100fd6b911110e32f37f339","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.5.tgz"},"scripts":{}},"0.1.6":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.6","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_npmJsonOpts":{"file":"/home/tim/.npm/async-array/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-array@0.1.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"d223c24f4e9bd90aaf671fb15cb36726e036903b","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.6.tgz"},"scripts":{}},"0.1.7":{"name":"async-array","description":"A sane control flow library","keywords":["control","flow","async","array"],"version":"0.1.7","author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"main":"./","_npmJsonOpts":{"file":"/home/tim/.npm/async-array/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-array@0.1.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"9e7540969d1e0b6e16be48bc8eb68f64c4d2a624","tarball":"http://registry.npmjs.org/async-array/-/async-array-0.1.7.tgz"},"scripts":{},"maintainers":[{"name":"Tim-Smart","email":"tim@fostle.com"}]}},"maintainers":[{"name":"Tim-Smart","email":"tim@fostle.com"}],"time":{"modified":"2012-01-13T23:07:01.238Z","created":"2011-06-28T12:04:53.605Z","0.1.0":"2011-06-28T12:04:55.142Z","0.1.1":"2011-06-28T12:10:21.253Z","0.1.2":"2011-06-28T12:49:38.410Z","0.1.3":"2011-06-28T23:28:36.722Z","0.1.4":"2011-06-30T13:42:01.731Z","0.1.5":"2011-07-01T07:09:06.949Z","0.1.6":"2011-07-01T07:13:09.041Z","0.1.7":"2011-09-15T03:22:32.906Z"},"author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/Tim-Smart/async-array.git"},"users":{"guybrush":true},"_attachments":{"async-array-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-AF7PcodPAsrtnGUizdk/Kg==","length":3503,"stub":true},"async-array-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ATuua+T1B+FdqvyUE4+Jtw==","length":3475,"stub":true},"async-array-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vIEpTlZF1iGoQsDoNsm+oQ==","length":3479,"stub":true},"async-array-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-FoJtOBOeeAhnZ1XirYdufw==","length":3438,"stub":true},"async-array-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-spRBUza5kbWOwHqYgvCLPw==","length":3375,"stub":true},"async-array-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-CSPut+aVXr0ixBb9drSEyQ==","length":3259,"stub":true},"async-array-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-olf+LeLkHOzcwFDsgAuIgw==","length":3245,"stub":true},"async-array-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-n77FGpvblx8gJCVCo29ayg==","length":3294,"stub":true}}}},
{"id":"async-cache","key":"async-cache","value":{"rev":"5-edf1956bb53172b7757eee08ee8cf54e"},"doc":{"_id":"async-cache","_rev":"5-edf1956bb53172b7757eee08ee8cf54e","name":"async-cache","description":"Cache your async lookups and don't fetch the same thing more than necessary.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"async-cache","version":"0.0.1","description":"Cache your async lookups and don't fetch the same thing more than necessary.","main":"ac.js","directories":{"test":"test"},"dependencies":{"lru-cache":"~2.0.0"},"devDependencies":{"tap":"~0.3.0"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/isaacs/async-cache"},"keywords":["async","cache","lru"],"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"BSD","readme":"# async-cache\n\nCache your async lookups and don't fetch the same thing more than\nnecessary.\n\n## Example\n\nLet's say you have to look up stat info from paths.  But you are ok\nwith only looking up the stat info once every 10 minutes (since it\ndoesn't change that often), and you want to limit your cache size to\n1000 objects, and never have two stat calls for the same file\nhappening at the same time (since that's silly and unnecessary).\n\nYou can do this:\n\n```javascript\nvar stats = new AsyncCache({\n  // options passed directly to the internal lru cache\n  max: 1000,\n  maxAge: 1000 * 60 * 10,\n  // method to load a thing if it's not in the cache.\n  // key must be unique in the context of this cache.\n  load: function (key, cb) {\n    // the key can be something like the path, or fd+path, or whatever.\n    // something that will be unique.\n    // this method will only be called if it's not already in cache, and will\n    // cache the result in the lru.\n    getTheStatFromTheKey(key, cb)\n  }\n})\n\n// then later..\nstats.get(fd + ':' + path, function (er, stat) {\n  // maybe loaded from cache, maybe just fetched\n})\n```\n\nExcept for the `load` method, all the options are passed unmolested to\nthe internal [lru-cache](http://npm.im/lru-cache).\n\n### Differences from [lru-cache](http://npm.im/lru-cache)\n\nSince values are fetched asynchronously, the `get` method takes a\ncallback, rather than returning the value synchronously.\n\nWhile there is a `set(k,v)` method to manually seed the cache,\ntypically you'll just call `get` and let the load function fetch the\nkey for you.\n\nKeys must uniquely identify a single object, and must contain all the\ninformation required to fetch an object, and must be strings.\n\n## Methods\n\n* `get(key, cb)` If the key is in the cache, then calls `cb(null,\n  cached)` on nextTick.  Otherwise, calls the `load` function that was\n  supplied in the options object.  If it doesn't return an error, then\n  cache the result.  Multiple `get` calls with the same key will only\n  ever have a single `load` call at the same time.\n\n* `set(key, val)` Seed the cache.  This doesn't have to be done, but\n  can be convenient if you know that something will be fetched soon.\n\n* `reset()` Drop all the items in the cache.\n","_id":"async-cache@0.0.1","dist":{"shasum":"995ed75b1146626125a3dd1efb486690ee61f6fe","tarball":"http://isaacs.iriscouch.com/registry/_design/app/_rewrite/async-cache/-/async-cache-0.0.1.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}]},"0.0.2":{"name":"async-cache","version":"0.0.2","description":"Cache your async lookups and don't fetch the same thing more than necessary.","main":"ac.js","directories":{"test":"test"},"dependencies":{"lru-cache":"~2.0.0"},"devDependencies":{"tap":"~0.3.0"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/isaacs/async-cache"},"keywords":["async","cache","lru"],"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"license":"BSD","readme":"# async-cache\n\nCache your async lookups and don't fetch the same thing more than\nnecessary.\n\n## Example\n\nLet's say you have to look up stat info from paths.  But you are ok\nwith only looking up the stat info once every 10 minutes (since it\ndoesn't change that often), and you want to limit your cache size to\n1000 objects, and never have two stat calls for the same file\nhappening at the same time (since that's silly and unnecessary).\n\nYou can do this:\n\n```javascript\nvar stats = new AsyncCache({\n  // options passed directly to the internal lru cache\n  max: 1000,\n  maxAge: 1000 * 60 * 10,\n  // method to load a thing if it's not in the cache.\n  // key must be unique in the context of this cache.\n  load: function (key, cb) {\n    // the key can be something like the path, or fd+path, or whatever.\n    // something that will be unique.\n    // this method will only be called if it's not already in cache, and will\n    // cache the result in the lru.\n    getTheStatFromTheKey(key, cb)\n  }\n})\n\n// then later..\nstats.get(fd + ':' + path, function (er, stat) {\n  // maybe loaded from cache, maybe just fetched\n})\n```\n\nExcept for the `load` method, all the options are passed unmolested to\nthe internal [lru-cache](http://npm.im/lru-cache).\n\n### Differences from [lru-cache](http://npm.im/lru-cache)\n\nSince values are fetched asynchronously, the `get` method takes a\ncallback, rather than returning the value synchronously.\n\nWhile there is a `set(k,v)` method to manually seed the cache,\ntypically you'll just call `get` and let the load function fetch the\nkey for you.\n\nKeys must uniquely identify a single object, and must contain all the\ninformation required to fetch an object, and must be strings.\n\n## Methods\n\n* `get(key, cb)` If the key is in the cache, then calls `cb(null,\n  cached)` on nextTick.  Otherwise, calls the `load` function that was\n  supplied in the options object.  If it doesn't return an error, then\n  cache the result.  Multiple `get` calls with the same key will only\n  ever have a single `load` call at the same time.\n\n* `set(key, val)` Seed the cache.  This doesn't have to be done, but\n  can be convenient if you know that something will be fetched soon.\n\n* `reset()` Drop all the items in the cache.\n","_id":"async-cache@0.0.2","dist":{"shasum":"26d1566be36116e4605ed99aa926860515a0e9b8","tarball":"http://isaacs.iriscouch.com/registry/_design/app/_rewrite/async-cache/-/async-cache-0.0.2.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}]}},"readme":"# async-cache\n\nCache your async lookups and don't fetch the same thing more than\nnecessary.\n\n## Example\n\nLet's say you have to look up stat info from paths.  But you are ok\nwith only looking up the stat info once every 10 minutes (since it\ndoesn't change that often), and you want to limit your cache size to\n1000 objects, and never have two stat calls for the same file\nhappening at the same time (since that's silly and unnecessary).\n\nYou can do this:\n\n```javascript\nvar stats = new AsyncCache({\n  // options passed directly to the internal lru cache\n  max: 1000,\n  maxAge: 1000 * 60 * 10,\n  // method to load a thing if it's not in the cache.\n  // key must be unique in the context of this cache.\n  load: function (key, cb) {\n    // the key can be something like the path, or fd+path, or whatever.\n    // something that will be unique.\n    // this method will only be called if it's not already in cache, and will\n    // cache the result in the lru.\n    getTheStatFromTheKey(key, cb)\n  }\n})\n\n// then later..\nstats.get(fd + ':' + path, function (er, stat) {\n  // maybe loaded from cache, maybe just fetched\n})\n```\n\nExcept for the `load` method, all the options are passed unmolested to\nthe internal [lru-cache](http://npm.im/lru-cache).\n\n### Differences from [lru-cache](http://npm.im/lru-cache)\n\nSince values are fetched asynchronously, the `get` method takes a\ncallback, rather than returning the value synchronously.\n\nWhile there is a `set(k,v)` method to manually seed the cache,\ntypically you'll just call `get` and let the load function fetch the\nkey for you.\n\nKeys must uniquely identify a single object, and must contain all the\ninformation required to fetch an object, and must be strings.\n\n## Methods\n\n* `get(key, cb)` If the key is in the cache, then calls `cb(null,\n  cached)` on nextTick.  Otherwise, calls the `load` function that was\n  supplied in the options object.  If it doesn't return an error, then\n  cache the result.  Multiple `get` calls with the same key will only\n  ever have a single `load` call at the same time.\n\n* `set(key, val)` Seed the cache.  This doesn't have to be done, but\n  can be convenient if you know that something will be fetched soon.\n\n* `reset()` Drop all the items in the cache.\n","maintainers":[{"name":"isaacs","email":"i@izs.me"}],"time":{"modified":"2012-08-10T18:47:17.875Z","created":"2012-08-10T15:57:32.613Z","0.0.1":"2012-08-10T15:57:34.170Z","0.0.2":"2012-08-10T18:47:17.875Z"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"repository":{"type":"git","url":"git://github.com/isaacs/async-cache"},"_attachments":{"async-cache-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-04d9PSy2GfiZzeb9DgJC7g==","length":2342,"stub":true},"async-cache-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DDEoa58btVGc8K6ONMNGpg==","length":2323,"stub":true}}}},
{"id":"async-chain","key":"async-chain","value":{"rev":"9-10ec3e50b01567390d55973494e36d43"},"doc":{"_id":"async-chain","_rev":"9-10ec3e50b01567390d55973494e36d43","name":"async-chain","description":"","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.0":{"name":"async-chain","version":"0.0.0","description":"","homepage":"http://github.com/dominictarr/async-chain","repository":{"type":"git","url":"git://github.com/dominictarr/async-chain.git"},"main":"async-chain","dependencies":{},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"_npmJsonOpts":{"file":"/home/dominic/.npm/async-chain/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-chain@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f04e2da9c60b71eeb1520264d043dbab3b3f2f09","tarball":"http://registry.npmjs.org/async-chain/-/async-chain-0.0.0.tgz"},"scripts":{}},"0.0.1":{"name":"async-chain","version":"0.0.1","description":"","homepage":"http://github.com/dominictarr/async-chain","repository":{"type":"git","url":"git://github.com/dominictarr/async-chain.git"},"main":"async-chain","dependencies":{"d-utils":"0.0.x"},"devDependencies":{"it-is":"0.0.2-2"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"_npmJsonOpts":{"file":"/home/dominic/.npm/async-chain/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-chain@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"993f31e46ca3bc804f1e7f2e55310528fec9b4b7","tarball":"http://registry.npmjs.org/async-chain/-/async-chain-0.0.1.tgz"},"scripts":{}},"0.1.0":{"name":"async-chain","version":"0.1.0","description":"","homepage":"http://github.com/dominictarr/async-chain","repository":{"type":"git","url":"git://github.com/dominictarr/async-chain.git"},"main":"async-chain","dependencies":{"d-utils":"0.0.x"},"devDependencies":{"it-is":"0.0.2-2"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"_npmJsonOpts":{"file":"/home/dominic/.npm/async-chain/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-chain@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"c74a25fb30461feada615ccaffff8f5fc21eb6fd","tarball":"http://registry.npmjs.org/async-chain/-/async-chain-0.1.0.tgz"},"scripts":{}},"0.3.0":{"name":"async-chain","version":"0.3.0","description":"","homepage":"http://github.com/dominictarr/async-chain","repository":{"type":"git","url":"git://github.com/dominictarr/async-chain.git"},"main":"async-chain","dependencies":{"d-utils":"0.0.x"},"devDependencies":{"it-is":"0.0.2-2"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"_npmJsonOpts":{"file":"/home/dominic/.npm/async-chain/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-chain@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"46814fea855e85f512e4eb610d055d2b22367447","tarball":"http://registry.npmjs.org/async-chain/-/async-chain-0.3.0.tgz"},"scripts":{}}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2011-06-30T08:25:27.536Z","created":"2011-06-25T01:41:30.957Z","0.0.0":"2011-06-25T01:41:31.599Z","0.0.1":"2011-06-25T02:03:48.271Z","0.1.0":"2011-06-25T02:44:13.173Z","0.3.0":"2011-06-30T08:25:27.536Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"repository":{"type":"git","url":"git://github.com/dominictarr/async-chain.git"},"_attachments":{"async-chain-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-2lw7TPLTCZzU1jD8D5hiNw==","length":2290,"stub":true},"async-chain-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kFYzuE6OF8RiBmi2rV7kfg==","length":2151,"stub":true},"async-chain-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MYbEztVLzWs/IO4T+/aWfQ==","length":2032,"stub":true},"async-chain-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-u0Eu0DzD829n+Z51g8Knxw==","length":1892,"stub":true}}}},
{"id":"async-ejs","key":"async-ejs","value":{"rev":"19-6f0e6e0eeb3cdb4c816ea427d8288d7d"},"doc":{"_id":"async-ejs","_rev":"19-6f0e6e0eeb3cdb4c816ea427d8288d7d","name":"async-ejs","description":"ejs with the ability to add asynchronous functions","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"async-ejs","version":"0.1.0","description":"ejs with the ability to add asynchronous functions","author":"","dependencies":{"common":">=0.1.0","ejs":">=0.1.0"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/ian/.npm/async-ejs/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-ejs@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"cf16662f63d43f3292c53c491669e38688d4204c","tarball":"http://registry.npmjs.org/async-ejs/-/async-ejs-0.1.0.tgz"},"scripts":{},"directories":{}},"0.1.1":{"name":"async-ejs","version":"0.1.1","description":"ejs with the ability to add asynchronous functions","author":"","dependencies":{"common":">=0.1.0","ejs":">=0.1.0"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/ian/.npm/async-ejs/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-ejs@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"16217e6e660ca7d9ca674ee780b661865857bdc3","tarball":"http://registry.npmjs.org/async-ejs/-/async-ejs-0.1.1.tgz"},"scripts":{},"directories":{}},"0.1.2":{"name":"async-ejs","version":"0.1.2","description":"ejs with the ability to add asynchronous functions","author":"","dependencies":{"common":">=0.1.0","ejs":">=0.1.0"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/ian/.npm/async-ejs/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-ejs@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"254d564dec5368bba2d1edde6747bc4dc67e7829","tarball":"http://registry.npmjs.org/async-ejs/-/async-ejs-0.1.2.tgz"},"scripts":{},"directories":{}},"0.1.3":{"name":"async-ejs","version":"0.1.3","description":"ejs with the ability to add asynchronous functions","author":"","dependencies":{"common":">=0.1.0","ejs":">=0.1.0"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/ian/.npm/async-ejs/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-ejs@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a73c27cbdc23beecba533fc1b8f9009a8314836f","tarball":"http://registry.npmjs.org/async-ejs/-/async-ejs-0.1.3.tgz"},"scripts":{},"directories":{}},"0.1.5":{"name":"async-ejs","version":"0.1.5","description":"ejs with the ability to add asynchronous functions","author":"","dependencies":{"common":">=0.1.0","ejs":">=0.1.0"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/ian/.npm/async-ejs/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-ejs@0.1.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ec18b5c7b3b6ecede0c063708e61de6bb2d04cde","tarball":"http://registry.npmjs.org/async-ejs/-/async-ejs-0.1.5.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}],"directories":{}},"0.1.6":{"name":"async-ejs","version":"0.1.6","description":"ejs with the ability to add asynchronous functions","author":"","dependencies":{"common":">=0.1.0","ejs":">=0.1.0"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/ian/.npm/async-ejs/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-ejs@0.1.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a949ac183ad416c6fd4b71cb5ec1e93c331a60c6","tarball":"http://registry.npmjs.org/async-ejs/-/async-ejs-0.1.6.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}],"directories":{}}},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"},{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"time":{"modified":"2011-08-31T16:13:22.021Z","created":"2011-07-19T21:54:51.653Z","0.1.0":"2011-07-19T21:54:58.009Z","0.1.1":"2011-07-19T22:01:50.872Z","0.1.2":"2011-07-19T22:07:31.479Z","0.1.3":"2011-07-20T15:11:21.833Z","0.1.5":"2011-08-01T14:41:45.217Z","0.1.6":"2011-08-01T14:46:05.480Z","0.1.7":"2011-08-11T09:40:07.259Z"},"_attachments":{"async-ejs-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/yVBBkSjdzf4HMrmJAC7pA==","length":1478,"stub":true},"async-ejs-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-N0a37VreC1LBLh06mGMSiQ==","length":1535,"stub":true},"async-ejs-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NWBvnqPZ9hiOYIWRe801Cg==","length":1678,"stub":true},"async-ejs-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PT1f5Ood4RV/XK1GBAzPPA==","length":1149,"stub":true},"async-ejs-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TvUvDnTchfnSarIK76cKJw==","length":1149,"stub":true},"async-ejs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mMiRLonsByMv9+Q3nBF1ZQ==","length":1104,"stub":true}}}},
{"id":"async-eval","key":"async-eval","value":{"rev":"11-8aa76c55a486a7702eae09b1ef64de31"},"doc":{"_id":"async-eval","_rev":"11-8aa76c55a486a7702eae09b1ef64de31","name":"async-eval","description":"Execute arbitrary JS with callbacks","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"author":{"name":"Dallon Feldner"},"name":"async-eval","description":"Execute arbitrary JS with callbacks","version":"0.1.0","repository":{"type":"git","url":"git://github.com/dallonf/async-eval.git"},"main":"index.js","engines":{"node":">= 0.7.0"},"dependencies":{"underscore":">= 1.3.0"},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"homepage":"https://github.com/dallonf/async-eval","scripts":{"test":"mocha"},"_npmUser":{"name":"dallonf","email":"dallonfdev@gmail.com"},"_id":"async-eval@0.1.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.7","_defaultsLoaded":true,"dist":{"shasum":"61d334547b4a44d434e7123b74f1f44c0b4bbbd7","tarball":"http://registry.npmjs.org/async-eval/-/async-eval-0.1.0.tgz"},"maintainers":[{"name":"dallonf","email":"dallonfdev@gmail.com"}]},"0.1.1":{"author":{"name":"Dallon Feldner"},"name":"async-eval","description":"Execute arbitrary JS with callbacks","version":"0.1.1","repository":{"type":"git","url":"git://github.com/dallonf/async-eval.git"},"main":"index.js","engines":{"node":">= 0.7.0"},"dependencies":{"underscore":">= 1.3.0"},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"homepage":"https://github.com/dallonf/async-eval","scripts":{"test":"mocha"},"_npmUser":{"name":"dallonf","email":"dallonfdev@gmail.com"},"_id":"async-eval@0.1.1","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.7.7","_defaultsLoaded":true,"dist":{"shasum":"a6669ce165a7bd065d2bc571af9a6d174be43000","tarball":"http://registry.npmjs.org/async-eval/-/async-eval-0.1.1.tgz"},"maintainers":[{"name":"dallonf","email":"dallonfdev@gmail.com"}]},"0.1.2":{"author":{"name":"Dallon Feldner"},"name":"async-eval","description":"Execute arbitrary JS with callbacks","version":"0.1.2","repository":{"type":"git","url":"git://github.com/dallonf/async-eval.git"},"main":"index.js","engines":{"node":">= 0.6.0"},"dependencies":{"underscore":">= 1.3.0"},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"homepage":"https://github.com/dallonf/async-eval","scripts":{"test":"mocha"},"_npmUser":{"name":"dallonf","email":"dallonfdev@gmail.com"},"_id":"async-eval@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"43238acd6ad2163f1f7786feb50823decf758ddb","tarball":"http://registry.npmjs.org/async-eval/-/async-eval-0.1.2.tgz"},"maintainers":[{"name":"dallonf","email":"dallonfdev@gmail.com"}]},"0.1.3":{"author":{"name":"Dallon Feldner"},"name":"async-eval","description":"Execute arbitrary JS with callbacks","version":"0.1.3","repository":{"type":"git","url":"git://github.com/dallonf/async-eval.git"},"main":"index.js","engines":{"node":">= 0.6.0"},"dependencies":{"underscore":">= 1.3.0"},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"homepage":"https://github.com/dallonf/async-eval","scripts":{"test":"mocha"},"readme":"# async-eval\r\n\r\nExecute arbitrary JS with callbacks in node.js\r\n\r\nNote: This library actually uses `vm.runInNewContext()` instead of `eval()` for a bit more added security, though it doesn't fork a process, so it's best used with trusted code.\r\n\r\n## Installation\r\n\r\n    npm install async-eval\r\n    npm test\r\n\r\nor\r\n\r\n    git clone https://github.com/dallonf/async-eval\r\n    npm install\r\n    npm test \r\n\r\n## Example usage\r\n\r\n    var asyncEval = require('async-eval');\r\n\r\n    var someObject = {x: 5, y: 10};\r\n\r\n    function waitOneSecond(callback) {\r\n      setTimeout(callback, 1000);\r\n    }\r\n\r\n    var options = {\r\n      this: someObject,\r\n      asyncFunctions: {\r\n        waitOneSecond: waitOneSecond\r\n      }\r\n    }\r\n\r\n    asyncEval('waitOneSecond(function() { this.x += 2; });', options, function() {\r\n      console.log(someObject.x); // 7\r\n    });\r\n\r\n## Usage\r\n\r\n    asyncEval(code, [options], [callback])\r\n\r\nasyncEval() will interpret and execute `code` and run `callback` when the code and every asynchronous function it calls has finished running.\r\n\r\n## Options\r\n\r\n**this**\r\n\r\n*Default: {}*\r\n\r\nSets the object that will be used as `this` in the executed code and any nested callbacks.\r\n\r\n**context**\r\n\r\n*Default: {}*\r\n\r\nSets the global context in the executed code. Put any synchronous DSL functions and global variables here.\r\n\r\n**asyncFunctions**\r\n\r\n*Default: {}*\r\n\r\nRegisters asynchronous functions into the `context`. Asynchronous functions must be listed in the `asyncFunctions` property so that asyncEval can count pending callbacks.\r\n\r\nThe functions registered in `asyncFunctions` must take a callback as the last argument.\r\n\r\n These functions can be namespaced with objects, for example:\r\n\r\n    asyncFunctions: {\r\n      users: {\r\n        get: function(callback) { /* ... */ },\r\n        create: function(user, callback) { /* ... */ },\r\n      },\r\n      posts: {\r\n        get: function(callback) { /* ... */ },\r\n        create: function(post, callback) { /* ... */ },\r\n      }\r\n    }\r\n","_id":"async-eval@0.1.3","dist":{"shasum":"2be9bae74dcb49503771def0a3cce858e95fd174","tarball":"http://registry.npmjs.org/async-eval/-/async-eval-0.1.3.tgz"},"maintainers":[{"name":"dallonf","email":"dallonfdev@gmail.com"}]},"0.1.4":{"author":{"name":"Dallon Feldner"},"name":"async-eval","description":"Execute arbitrary JS with callbacks","version":"0.1.4","repository":{"type":"git","url":"git://github.com/dallonf/async-eval.git"},"main":"index.js","engines":{"node":">= 0.6.0"},"dependencies":{"underscore":">= 1.3.0"},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"homepage":"https://github.com/dallonf/async-eval","scripts":{"test":"mocha"},"readme":"# async-eval\r\n\r\nExecute arbitrary JS with callbacks in node.js\r\n\r\nNote: This library actually uses `vm.runInNewContext()` instead of `eval()` for a bit more added security, though it doesn't fork a process, so it's best used with trusted code.\r\n\r\n## Installation\r\n\r\n    npm install async-eval\r\n    npm test\r\n\r\nor\r\n\r\n    git clone https://github.com/dallonf/async-eval\r\n    npm install\r\n    npm test \r\n\r\n## Example usage\r\n\r\n    var asyncEval = require('async-eval');\r\n\r\n    var someObject = {x: 5, y: 10};\r\n\r\n    function waitOneSecond(callback) {\r\n      setTimeout(callback, 1000);\r\n    }\r\n\r\n    var options = {\r\n      this: someObject,\r\n      asyncFunctions: {\r\n        waitOneSecond: waitOneSecond\r\n      }\r\n    }\r\n\r\n    asyncEval('waitOneSecond(function() { this.x += 2; });', options, function() {\r\n      console.log(someObject.x); // 7\r\n    });\r\n\r\n## Usage\r\n\r\n    asyncEval(code, [options], [callback])\r\n\r\nasyncEval() will interpret and execute `code` and run `callback` when the code and every asynchronous function it calls has finished running.\r\n\r\n## Options\r\n\r\n**this**\r\n\r\n*Default: {}*\r\n\r\nSets the object that will be used as `this` in the executed code and any nested callbacks.\r\n\r\n**context**\r\n\r\n*Default: {}*\r\n\r\nSets the global context in the executed code. Put any synchronous DSL functions and global variables here.\r\n\r\n**asyncFunctions**\r\n\r\n*Default: {}*\r\n\r\nRegisters asynchronous functions into the `context`. Asynchronous functions must be listed in the `asyncFunctions` property so that asyncEval can count pending callbacks.\r\n\r\nThe functions registered in `asyncFunctions` must take a callback as the last argument.\r\n\r\n These functions can be namespaced with objects, for example:\r\n\r\n    asyncFunctions: {\r\n      users: {\r\n        get: function(callback) { /* ... */ },\r\n        create: function(user, callback) { /* ... */ },\r\n      },\r\n      posts: {\r\n        get: function(callback) { /* ... */ },\r\n        create: function(post, callback) { /* ... */ },\r\n      }\r\n    }\r\n","_id":"async-eval@0.1.4","dist":{"shasum":"ab13877b252184a9670db91d4083ec6e171e91cc","tarball":"http://registry.npmjs.org/async-eval/-/async-eval-0.1.4.tgz"},"maintainers":[{"name":"dallonf","email":"dallonfdev@gmail.com"}]}},"readme":"# async-eval\r\n\r\nExecute arbitrary JS with callbacks in node.js\r\n\r\nNote: This library actually uses `vm.runInNewContext()` instead of `eval()` for a bit more added security, though it doesn't fork a process, so it's best used with trusted code.\r\n\r\n## Installation\r\n\r\n    npm install async-eval\r\n    npm test\r\n\r\nor\r\n\r\n    git clone https://github.com/dallonf/async-eval\r\n    npm install\r\n    npm test \r\n\r\n## Example usage\r\n\r\n    var asyncEval = require('async-eval');\r\n\r\n    var someObject = {x: 5, y: 10};\r\n\r\n    function waitOneSecond(callback) {\r\n      setTimeout(callback, 1000);\r\n    }\r\n\r\n    var options = {\r\n      this: someObject,\r\n      asyncFunctions: {\r\n        waitOneSecond: waitOneSecond\r\n      }\r\n    }\r\n\r\n    asyncEval('waitOneSecond(function() { this.x += 2; });', options, function() {\r\n      console.log(someObject.x); // 7\r\n    });\r\n\r\n## Usage\r\n\r\n    asyncEval(code, [options], [callback])\r\n\r\nasyncEval() will interpret and execute `code` and run `callback` when the code and every asynchronous function it calls has finished running.\r\n\r\n## Options\r\n\r\n**this**\r\n\r\n*Default: {}*\r\n\r\nSets the object that will be used as `this` in the executed code and any nested callbacks.\r\n\r\n**context**\r\n\r\n*Default: {}*\r\n\r\nSets the global context in the executed code. Put any synchronous DSL functions and global variables here.\r\n\r\n**asyncFunctions**\r\n\r\n*Default: {}*\r\n\r\nRegisters asynchronous functions into the `context`. Asynchronous functions must be listed in the `asyncFunctions` property so that asyncEval can count pending callbacks.\r\n\r\nThe functions registered in `asyncFunctions` must take a callback as the last argument.\r\n\r\n These functions can be namespaced with objects, for example:\r\n\r\n    asyncFunctions: {\r\n      users: {\r\n        get: function(callback) { /* ... */ },\r\n        create: function(user, callback) { /* ... */ },\r\n      },\r\n      posts: {\r\n        get: function(callback) { /* ... */ },\r\n        create: function(post, callback) { /* ... */ },\r\n      }\r\n    }\r\n","maintainers":[{"name":"dallonf","email":"dallonfdev@gmail.com"}],"time":{"modified":"2012-07-11T16:16:48.416Z","created":"2012-05-25T17:26:55.584Z","0.1.0":"2012-05-25T17:26:57.587Z","0.1.1":"2012-05-25T19:41:58.577Z","0.1.2":"2012-06-12T20:05:34.743Z","0.1.3":"2012-07-11T16:03:00.298Z","0.1.4":"2012-07-11T16:16:48.416Z"},"author":{"name":"Dallon Feldner"},"repository":{"type":"git","url":"git://github.com/dallonf/async-eval.git"},"_attachments":{"async-eval-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-3a/UK1/DlB5Q+IyJlBDu0g==","length":2883,"stub":true},"async-eval-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/Nh+w154YwsdBWRQy60r5A==","length":2860,"stub":true},"async-eval-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AxsfBMxTehN7Vw8NN+1X1g==","length":2699,"stub":true},"async-eval-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VgZyPiK1T9hPWKOzkHf7ow==","length":2697,"stub":true},"async-eval-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tDC3xfYtXzbHzyfaSCJSog==","length":2816,"stub":true}}}},
{"id":"async-events","key":"async-events","value":{"rev":"7-93e9a4c4afc936621589f6c7d9be8064"},"doc":{"_id":"async-events","_rev":"7-93e9a4c4afc936621589f6c7d9be8064","name":"async-events","description":"An asynchronous Node.js event emitter implementation.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"async-events","description":"An asynchronous Node.js event emitter implementation.","version":"0.1.1","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"main":"./lib/async-events.js","engines":{"node":"0.6.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"async-events@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"aefebba6c34026ea40937b8e72fd5e66b78be8ee","tarball":"http://registry.npmjs.org/async-events/-/async-events-0.1.1.tgz"},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]},"0.1.2":{"name":"async-events","description":"An asynchronous Node.js event emitter implementation.","version":"0.1.2","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"main":"./lib/async-events.js","engines":{"node":">=0.4.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"async-events@0.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"ae8baa4b9ef2d5129afe342c7c25481b78e3f0e6","tarball":"http://registry.npmjs.org/async-events/-/async-events-0.1.2.tgz"},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]},"0.2.0":{"name":"async-events","description":"An asynchronous Node.js event emitter implementation.","version":"0.2.0","author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"main":"./lib/async-events.js","engines":{"node":"0.6.x"},"_npmUser":{"name":"tristanls","email":"tristan.slominski@gmail.com"},"_id":"async-events@0.2.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3e00c51b35c44fbe9d2a749a72231b8b00e54ac9","tarball":"http://registry.npmjs.org/async-events/-/async-events-0.2.0.tgz"},"readme":"# AsyncEventEmitter\n\nAsyncEventEmitter is an asynchronous implementation of EventEmitter found in Node.js\n\n## API\n\n#### emitter.addListener( event, listener )\n#### emitter.on( event, listener )\n\nAdds a listener to the end of the listeners array for the specified event.\n\n#### emitter.emit( event, args... )\n\nInvoke each of the listeners that may be listening for the specified event in order but on `process.nextTick()`.\n\n#### emitter.removeListener( event, listener )\n\nRemove a listener from the listener array for the specified event. \n\n#### emitter.removeAllListeners( event )\n\nRemoves all listeners for an event. If an event is not specified, removes *ALL* listeners\n\n## Licence\n\n(The MIT License)\n\nCopyright (c) 2011-2012 Tristan Slominski <tristan.slominski@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}]}},"maintainers":[{"name":"tristanls","email":"tristan.slominski@gmail.com"}],"time":{"modified":"2012-01-06T20:27:16.800Z","created":"2011-12-18T00:18:14.588Z","0.1.1":"2011-12-18T00:18:15.504Z","0.1.2":"2011-12-18T01:00:24.335Z","0.2.0":"2012-01-06T20:27:16.800Z"},"author":{"name":"Tristan Slominski","email":"tristan.slominski@gmail.com"},"_attachments":{"async-events-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kpLshwjL/421lTedUrRsWg==","length":4001,"stub":true},"async-events-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Hb/d1e/4fvvx4OL/3JXYCQ==","length":10240,"stub":true},"async-events-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YtIYaxPzSZssvozaiLcWvA==","length":10240,"stub":true}}}},
{"id":"async-foreach","key":"async-foreach","value":{"rev":"3-7ee0be5ff5dfe7a6bac90ee3070d74a3"},"doc":{"_id":"async-foreach","_rev":"3-7ee0be5ff5dfe7a6bac90ee3070d74a3","name":"async-foreach","description":"An optionally-asynchronous forEach with an interesting interface.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.2":{"author":{"name":"\"Cowboy\" Ben Alman","url":"http://benalman.com/"},"name":"async-foreach","description":"An optionally-asynchronous forEach with an interesting interface.","version":"0.1.2","homepage":"http://github.com/cowboy/javascript-sync-async-foreach","bugs":{"name":"https://github.com/cowboy/javascript-sync-async-foreach/issues"},"repository":{"type":"git","url":"git://github.com/cowboy/javascript-sync-async-foreach.git"},"main":"lib/foreach","engines":{"node":"~0.6.6"},"keywords":["array","loop","sync","async","foreach"],"dependencies":{},"devDependencies":{},"_npmUser":{"name":"cowboy","email":"cowboy@rj3.net"},"_id":"async-foreach@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c622ef609fca9af9be1a6f9e7fdc57be32be8035","tarball":"http://registry.npmjs.org/async-foreach/-/async-foreach-0.1.2.tgz"},"maintainers":[{"name":"cowboy","email":"cowboy@rj3.net"}]}},"readme":"# JavaScript Sync/Async forEach\n\nAn optionally-asynchronous forEach with an interesting interface.\n\n## Getting Started\n\nThis code should work just fine in Node.js:\n\nFirst, install the module with: `npm install async-foreach`\n\n```javascript\nvar forEach = require('async-foreach').forEach;\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n});\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// each c 2 [\"a\", \"b\", \"c\"]\n```\n\nOr in the browser:\n\n```html\n<script src=\"dist/ba-foreach.min.js\"></script>\n<script>\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n});\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// each c 2 [\"a\", \"b\", \"c\"]\n</script>\n```\n\nIn the browser, you can attach the forEach method to any object.\n\n```html\n<script>\nthis.exports = Bocoup.utils;\n</script>\n<script src=\"dist/ba-foreach.min.js\"></script>\n<script>\nBocoup.utils.forEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n});\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// each c 2 [\"a\", \"b\", \"c\"]\n</script>\n```\n\n## The General Idea (Why I thought this was worth sharing)\n\nThe idea is to allow the callback to decide _at runtime_ whether the loop will be synchronous or asynchronous. By using `this` in a creative way (in situations where that value isn't already spoken for), an entire control API can be offered without over-complicating function signatures.\n\n```javascript\nforEach(arr, function(item, index) {\n  // Synchronous.\n});\n\nforEach(arr, function(item, index) {\n  // Only when `this.async` is called does iteration becomes asynchronous. The\n  // loop won't be continued until the `done` function is executed.\n  var done = this.async();\n  // Continue in one second.\n  setTimeout(done, 1000);\n});\n\nforEach(arr, function(item, index) {\n  // Break out of synchronous iteration early by returning false.\n  return index !== 1;\n});\n\nforEach(arr, function(item, index) {\n  // Break out of asynchronous iteration early...\n  var done = this.async();\n  // ...by passing false to the done function.\n  setTimeout(function() {\n    done(index !== 1);\n  });\n});\n```\n\n## Examples\nSee the unit tests for more examples.\n\n```javascript\n// Generic \"done\" callback.\nfunction allDone(notAborted, arr) {\n  console.log(\"done\", notAborted, arr);\n}\n\n// Synchronous.\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n}, allDone);\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// each c 2 [\"a\", \"b\", \"c\"]\n// done true [\"a\", \"b\", \"c\"]\n\n// Synchronous with early abort.\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n  if (item === \"b\") { return false; }\n}, allDone);\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// done false [\"a\", \"b\", \"c\"]\n\n// Asynchronous.\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n  var done = this.async();\n  setTimeout(function() {\n    done();\n  }, 500);\n}, allDone);\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// each c 2 [\"a\", \"b\", \"c\"]\n// done true [\"a\", \"b\", \"c\"]\n\n// Asynchronous with early abort.\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n  var done = this.async();\n  setTimeout(function() {\n    done(item !== \"b\");\n  }, 500);\n}, allDone);\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// done false [\"a\", \"b\", \"c\"]\n\n// Not actually asynchronous.\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n  var done = this.async()\n  done();\n}, allDone);\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// each c 2 [\"a\", \"b\", \"c\"]\n// done true [\"a\", \"b\", \"c\"]\n\n// Not actually asynchronous with early abort.\nforEach([\"a\", \"b\", \"c\"], function(item, index, arr) {\n  console.log(\"each\", item, index, arr);\n  var done = this.async();\n  done(item !== \"b\");\n}, allDone);\n// logs:\n// each a 0 [\"a\", \"b\", \"c\"]\n// each b 1 [\"a\", \"b\", \"c\"]\n// done false [\"a\", \"b\", \"c\"]\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt](https://github.com/cowboy/grunt).\n\n_Also, please don't edit files in the \"dist\" subdirectory as they are generated via grunt. You'll find source code in the \"lib\" subdirectory!_\n\n## Release History\n\n11/11/2011\nv0.1.0\nInitial Release.\n\n11/11/2011\nv0.1.1\nRefactored code to be much simpler. Yay for unit tests!\n\n11/17/2011\nv0.1.2\nAdding sparse array support.\nInvalid length properties are now sanitized.\nThis closes issue #1 (like a boss).\n\n## License\nCopyright (c) 2012 \"Cowboy\" Ben Alman  \nLicensed under the MIT license.  \n<http://benalman.com/about/license/>\n","maintainers":[{"name":"cowboy","email":"cowboy@rj3.net"}],"time":{"modified":"2012-01-11T02:54:51.611Z","created":"2012-01-11T02:54:50.734Z","0.1.2":"2012-01-11T02:54:51.611Z"},"author":{"name":"\"Cowboy\" Ben Alman","url":"http://benalman.com/"},"repository":{"type":"git","url":"git://github.com/cowboy/javascript-sync-async-foreach.git"},"_attachments":{"async-foreach-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fY07fXuyBhcysQmaVeIFjQ==","length":10240,"stub":true}}}},
{"id":"async-forms","key":"async-forms","value":{"rev":"3-0cb55d81f709b5e2e14f785d4609bfda"},"doc":{"_id":"async-forms","_rev":"3-0cb55d81f709b5e2e14f785d4609bfda","name":"async-forms","description":"Provides a interface for quickly making and validating forms in node.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"async-forms","description":"Provides a interface for quickly making and validating forms in node.","version":"0.0.1","authors":["Perrin Westrich <crypticswarm@gmail.com>"],"repository":{"type":"git","url":""},"main":"./forms.js","dependencies":{"step":""},"_npmUser":{"name":"crypticswarm","email":"crypticswarm@gmail.com"},"_id":"async-forms@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2723ffe29a0aa5dbe794a2a5c588b28f23bb0fb4","tarball":"http://registry.npmjs.org/async-forms/-/async-forms-0.0.1.tgz"},"maintainers":[{"name":"crypticswarm","email":"crypticswarm@gmail.com"}]}},"readme":"Async Form Validation\n---------------------\n\nAllows you to write forms validation.\n","maintainers":[{"name":"crypticswarm","email":"crypticswarm@gmail.com"}],"time":{"modified":"2012-02-11T19:24:15.454Z","created":"2012-02-11T19:24:14.432Z","0.0.1":"2012-02-11T19:24:15.454Z"},"repository":{"type":"git","url":""},"_attachments":{"async-forms-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DWe3Rzbh23nS6+pC2XuDuA==","length":5888,"stub":true}}}},
{"id":"async-fs","key":"async-fs","value":{"rev":"10-8dead1b0aaf18d219c3cc2fa752f46b6"},"doc":{"_id":"async-fs","_rev":"10-8dead1b0aaf18d219c3cc2fa752f46b6","name":"async-fs","description":"Asynchronous file system utility library for nodeJS","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"async-fs","description":"Asynchronous file system utility library for nodeJS","version":"0.0.1","homepage":"http://wavo.me","repository":{"type":"git","url":"git://github.com/glesperance/async-fs.git"},"author":{"name":"Gabriel Lesperance","email":"gabriel@wavo.me","url":"glesperance.com / wavo.me"},"main":"async_fs.js","engines":{"node":">=0.4.10"},"dependencies":{"async":">= 0.1.9"},"_npmJsonOpts":{"file":"/Users/glesperance/.npm/async-fs/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-fs@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3c4d0c78d29730eaff1ad1aaf75fa8400abafc57","tarball":"http://registry.npmjs.org/async-fs/-/async-fs-0.0.1.tgz"},"maintainers":[{"name":"glesperance","email":"gabriel@wavo.me"}]},"0.0.2":{"name":"async-fs","description":"Asynchronous file system utility library for nodeJS","version":"0.0.2","homepage":"http://wavo.me","repository":{"type":"git","url":"git://github.com/glesperance/async-fs.git"},"author":{"name":"Gabriel Lesperance","email":"gabriel@wavo.me","url":"glesperance.com / wavo.me"},"main":"async_fs.js","engines":{"node":">=0.4.10"},"dependencies":{"async":">= 0.1.9"},"_npmJsonOpts":{"file":"/Users/glesperance/.npm/async-fs/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"async-fs@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a0f620be9299b8138dbd0020904dfd5d782aa3d6","tarball":"http://registry.npmjs.org/async-fs/-/async-fs-0.0.2.tgz"},"maintainers":[{"name":"glesperance","email":"gabriel@wavo.me"}]},"0.0.3":{"name":"async-fs","description":"Asynchronous file system utility library for nodeJS","version":"0.0.3","homepage":"http://wavo.me","repository":{"type":"git","url":"git://github.com/glesperance/async-fs.git"},"author":{"name":"Gabriel Lesperance","email":"gabriel@wavo.me","url":"glesperance.com / wavo.me"},"main":"async_fs.js","engines":{"node":">=0.4.10"},"dependencies":{"async":">= 0.1.9"},"_npmUser":{"name":"glesperance","email":"gabriel@wavo.me"},"_id":"async-fs@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"98aa44f908286a181b2e00ad950bbb97bdd423e4","tarball":"http://registry.npmjs.org/async-fs/-/async-fs-0.0.3.tgz"},"readme":"","maintainers":[{"name":"glesperance","email":"gabriel@wavo.me"}]},"0.0.4":{"name":"async-fs","description":"Asynchronous file system utility library for nodeJS","version":"0.0.4","homepage":"http://wavo.me","repository":{"type":"git","url":"git://github.com/glesperance/async-fs.git"},"author":{"name":"Gabriel Lesperance","email":"gabriel@wavo.me","url":"glesperance.com / wavo.me"},"main":"async_fs.js","engines":{"node":">=0.4.10"},"dependencies":{"async":">= 0.1.9"},"_id":"async-fs@0.0.4","dist":{"shasum":"3314780fe6b7088ff15b2cfb16aeb16fd6b728aa","tarball":"http://registry.npmjs.org/async-fs/-/async-fs-0.0.4.tgz"},"readme":"","maintainers":[{"name":"glesperance","email":"gabriel@wavo.me"}]}},"maintainers":[{"name":"glesperance","email":"gabriel@wavo.me"}],"time":{"modified":"2012-08-02T13:44:14.688Z","created":"2011-09-12T18:30:18.176Z","0.0.1":"2011-09-12T18:30:18.745Z","0.0.2":"2011-09-26T16:36:15.552Z","0.0.3":"2012-04-02T20:40:49.114Z","0.0.4":"2012-07-26T16:34:50.138Z"},"author":{"name":"Gabriel Lesperance","email":"gabriel@wavo.me","url":"glesperance.com / wavo.me"},"repository":{"type":"git","url":"git://github.com/glesperance/async-fs.git"},"users":{"fgribreau":true},"_attachments":{"async-fs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-h4Zdg5vOl/jEIt7/bGtSUg==","length":4632,"stub":true},"async-fs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fsYKob+M4XKlldlooEFu1g==","length":4663,"stub":true},"async-fs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-L4zsLxCe64JC7gDUpr0LSA==","length":4753,"stub":true},"async-fs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WcntoOCNhT5cFHsmHfgN9A==","length":4754,"stub":true}}}},
{"id":"async-functions","key":"async-functions","value":{"rev":"5-46bdd2cc434c8484b41df41766b14f5e"},"doc":{"_id":"async-functions","_rev":"5-46bdd2cc434c8484b41df41766b14f5e","name":"async-functions","description":"A simple, clean way of calling functions asynchronously","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"James Brumond","email":"james@jbrumond.me","url":"http://jbrumond.me"},"name":"async-functions","description":"A simple, clean way of calling functions asynchronously","version":"0.0.1","repository":{"type":"git","url":"git://github.com/kbjr/node-async-functions.git"},"main":"lib/index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"k","email":"kbjr14@gmail.com"},"_id":"async-functions@0.0.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f6987d7966d503c3762ea4d1f531c65aa247cc62","tarball":"http://registry.npmjs.org/async-functions/-/async-functions-0.0.1.tgz"},"readme":"","maintainers":[{"name":"k","email":"kbjr14@gmail.com"}]},"0.0.2":{"author":{"name":"James Brumond","email":"james@jbrumond.me","url":"http://jbrumond.me"},"name":"async-functions","description":"A simple, clean way of calling functions asynchronously","version":"0.0.2","repository":{"type":"git","url":"git://github.com/UmbraEngineering/node-async-functions.git"},"main":"lib/index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"k","email":"kbjr14@gmail.com"},"_id":"async-functions@0.0.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8bfa6bf7e38baa1bf17c845828b45e2a2716b00d","tarball":"http://registry.npmjs.org/async-functions/-/async-functions-0.0.2.tgz"},"readme":"","maintainers":[{"name":"k","email":"kbjr14@gmail.com"}]}},"readme":"","maintainers":[{"name":"k","email":"kbjr14@gmail.com"}],"time":{"modified":"2012-06-27T04:09:54.094Z","created":"2012-06-18T02:13:55.355Z","0.0.1":"2012-06-18T02:13:57.701Z","0.0.2":"2012-06-27T04:09:54.094Z"},"author":{"name":"James Brumond","email":"james@jbrumond.me","url":"http://jbrumond.me"},"repository":{"type":"git","url":"git://github.com/UmbraEngineering/node-async-functions.git"},"_attachments":{"async-functions-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MsKON8FP+4LK9KV05FXunA==","length":824,"stub":true},"async-functions-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-50YrUlnXwum5+BA4XMZbDQ==","length":772,"stub":true}}}},
{"id":"async-it","key":"async-it","value":{"rev":"9-b88f205502cf5cf2b791e75fa30a173b"},"doc":{"_id":"async-it","_rev":"9-b88f205502cf5cf2b791e75fa30a173b","name":"async-it","description":"Generic asynchronous iterators for node.js.","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"async-it","description":"Generic asynchronous iterators for node.js.","main":"index","version":"0.1.0","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"http://github.com/tobie/async-it.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-it/raw/master/LICENSE"}],"_id":"async-it@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/async-it/-/async-it@0.1.0.tgz"}},"0.2.0":{"name":"async-it","description":"Generic asynchronous iterators for node.js.","main":"index.js","version":"0.2.0","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"git://github.com/tobie/async-it.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-it/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"async-it@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"031e667ab7053927c926912df26d90729367cd2e","tarball":"http://registry.npmjs.org/async-it/-/async-it-0.2.0.tgz"},"scripts":{}},"0.3.0":{"name":"async-it","description":"Generic asynchronous iterators for node.js.","main":"index.js","version":"0.3.0","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"git://github.com/tobie/async-it.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-it/raw/master/LICENSE"}],"_id":"async-it@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ba0402bad74b7a2fdc7aaed3b47c209e512b6e34","tarball":"http://registry.npmjs.org/async-it/-/async-it-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"tobie","email":"tobie.langel@gmail.com"}]},"0.3.1":{"name":"async-it","description":"Generic asynchronous iterators for node.js.","main":"index.js","version":"0.3.1","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"git://github.com/tobie/async-it.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-it/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_id":"async-it@0.3.1","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.5.8-pre","_defaultsLoaded":true,"dist":{"shasum":"c1ca5bb8cffcfd2927a5eb02821eb04ed071cf65","tarball":"http://registry.npmjs.org/async-it/-/async-it-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"tobie","email":"tobie.langel@gmail.com"}]}},"maintainers":[{"name":"tobie","email":"tobie.langel@gmail.com"}],"author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"git://github.com/tobie/async-it.git"},"time":{"modified":"2011-10-09T12:07:40.842Z","created":"2011-05-31T09:09:07.558Z","0.1.0":"2011-05-31T09:09:07.558Z","0.2.0":"2011-05-31T09:09:07.558Z","0.3.0":"2011-08-07T08:27:32.892Z","0.3.1":"2011-10-09T12:07:40.842Z"},"_attachments":{"async-it-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-DM38VIqH04yOZ1N+b8Ux0w==","length":3508,"stub":true},"async-it-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Q1ym9DCJ+SjzQMeqz8E1WQ==","length":3454,"stub":true},"async-it-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-P/bVTyYRg6OSos04ED/OaQ==","length":3474,"stub":true},"async-it@0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RrWsOPhusI3NPxX3u6gDPg==","length":3319,"stub":true}}}},
{"id":"async-json","key":"async-json","value":{"rev":"5-589d5b6665d00c5bffb99bb142cac5d0"},"doc":{"_id":"async-json","_rev":"5-589d5b6665d00c5bffb99bb142cac5d0","name":"async-json","description":"An asynchronous version of JSON.stringify","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"async-json","version":"0.0.1","description":"An asynchronous version of JSON.stringify","keywords":["json","stringify","async"],"repository":{"type":"git","url":"git://github.com/ckknight/async-json.git"},"author":{"name":"Cameron Kenneth Knight","email":"ckknight@gmail.com","url":"http://ckknight.com"},"dependencies":{},"main":"index","_id":"async-json@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a63a8a8981c65b62f74763526ade5266849d6db9","tarball":"http://registry.npmjs.org/async-json/-/async-json-0.0.1.tgz"}},"0.0.2":{"name":"async-json","version":"0.0.2","description":"An asynchronous version of JSON.stringify","keywords":["json","stringify","async"],"repository":{"type":"git","url":"git://github.com/ckknight/async-json.git"},"author":{"name":"Cameron Kenneth Knight","email":"ckknight@gmail.com","url":"http://ckknight.com"},"dependencies":{},"main":"index","_id":"async-json@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"aa7127db039e8e43dac72bd1fbb67ba33f568270","tarball":"http://registry.npmjs.org/async-json/-/async-json-0.0.2.tgz"}}},"maintainers":[{"name":"ckknight","email":"ckknight@gmail.com"}],"time":{"modified":"2011-04-16T20:09:07.076Z","created":"2011-04-16T05:05:01.271Z","0.0.1":"2011-04-16T05:05:01.493Z","0.0.2":"2011-04-16T20:09:07.076Z"},"author":{"name":"Cameron Kenneth Knight","email":"ckknight@gmail.com","url":"http://ckknight.com"},"repository":{"type":"git","url":"git://github.com/ckknight/async-json.git"},"_attachments":{"async-json-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/4BDaDvVPDPhwO1zRFGBKw==","length":28648,"stub":true},"async-json-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zIWeM8s+Ke1dh9/2/zdhbg==","length":28553,"stub":true}}}},
{"id":"async-memoize","key":"async-memoize","value":{"rev":"7-9ebc8de282b8a4f3bc61481ff100db2f"},"doc":{"_id":"async-memoize","_rev":"7-9ebc8de282b8a4f3bc61481ff100db2f","name":"async-memoize","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"async-memoize","version":"0.0.1","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Christian Tellnes","email":"christian@tellnes.no","url":"http://christian.tellnes.com/"},"license":"MIT","_id":"async-memoize@0.0.1","dist":{"shasum":"0550c8f77bdbe089e4552ae3f278b53ea4a9656d","tarball":"http://registry.npmjs.org/async-memoize/-/async-memoize-0.0.1.tgz"},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.0":{"name":"async-memoize","version":"0.1.0","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Christian Tellnes","email":"christian@tellnes.no","url":"http://christian.tellnes.com/"},"license":"MIT","_id":"async-memoize@0.1.0","dist":{"shasum":"6aff4a8e69c46d735090125b2633c603a444f3c2","tarball":"http://registry.npmjs.org/async-memoize/-/async-memoize-0.1.0.tgz"},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.1":{"name":"async-memoize","version":"0.1.1","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Christian Tellnes","email":"christian@tellnes.no","url":"http://christian.tellnes.com/"},"license":"MIT","_id":"async-memoize@0.1.1","dist":{"shasum":"3bfe44a60a651699e7d10e890a29468d4e41929c","tarball":"http://registry.npmjs.org/async-memoize/-/async-memoize-0.1.1.tgz"},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]}},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}],"time":{"modified":"2012-08-04T01:01:08.139Z","created":"2012-08-04T00:46:51.210Z","0.0.1":"2012-08-04T00:46:52.679Z","0.1.0":"2012-08-04T00:59:07.052Z","0.1.1":"2012-08-04T01:01:08.139Z"},"author":{"name":"Christian Tellnes","email":"christian@tellnes.no","url":"http://christian.tellnes.com/"},"_attachments":{"async-memoize-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-KKl/5i4Cstn/YfBIi3tz4Q==","length":876,"stub":true},"async-memoize-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NsjxvsFLCJdYefmd0Wjt0A==","length":875,"stub":true},"async-memoize-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+0DqD0KjA2c4GCFE4lSsyg==","length":918,"stub":true}}}},
{"id":"async-memoizer","key":"async-memoizer","value":{"rev":"9-01d56f4dff95e61a39dab5ebee49d5dc"},"doc":{"_id":"async-memoizer","_rev":"9-01d56f4dff95e61a39dab5ebee49d5dc","name":"async-memoizer","description":"A memoizer for asynchronous methods obeying node.js conventions (last argument is always a callback).","dist-tags":{"latest":"0.4.0"},"versions":{"0.2.0":{"name":"async-memoizer","description":"A memoizer for asynchronous methods obeying node.js conventions (last argument is always a callback).","main":"index","version":"0.2.0","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"http://github.com/tobie/async-memoizer.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-memoizer/raw/master/LICENSE"}],"_id":"async-memoizer@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/async-memoizer/-/async-memoizer@0.2.0.tgz"}},"0.3.0":{"name":"async-memoizer","description":"A memoizer for asynchronous methods obeying node.js conventions (last argument is always a callback).","main":"index","version":"0.3.0","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"http://github.com/tobie/async-memoizer.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-memoizer/raw/master/LICENSE"}],"_id":"async-memoizer@0.3.0","engines":{"node":"*"},"_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/async-memoizer/-/async-memoizer@0.3.0.tgz"}},"0.3.1":{"name":"async-memoizer","description":"A memoizer for asynchronous methods obeying node.js conventions (last argument is always a callback).","main":"index","version":"0.3.1","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"http://github.com/tobie/async-memoizer.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-memoizer/raw/master/LICENSE"}],"_id":"async-memoizer@0.3.1","engines":{"node":"*"},"_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/async-memoizer/-/async-memoizer@0.3.1.tgz"}},"0.4.0":{"name":"async-memoizer","description":"A memoizer for asynchronous methods obeying node.js conventions (last argument is always a callback).","main":"index","version":"0.4.0","author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"http://github.com/tobie/async-memoizer.git"},"licenses":[{"type":"MIT","url":"http://github.com/tobie/async-memoizer/raw/master/LICENSE"}],"_id":"async-memoizer@0.4.0","engines":{"node":"*"},"_nodeSupported":true,"dist":{"tarball":"http://registry.npmjs.org/async-memoizer/-/async-memoizer@0.4.0.tgz"}}},"maintainers":[{"name":"tobie","email":"tobie.langel@gmail.com"}],"author":{"name":"Tobie Langel","email":"tobie.langel@gmail.com","url":"http://tobielangel.com"},"repository":{"type":"git","url":"http://github.com/tobie/async-memoizer.git"},"_attachments":{"async-memoizer@0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-8XSq/zQ/oHuNYj02rL1jig==","length":2502,"stub":true},"async-memoizer@0.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AfmlUSpNMMxEft1gvTOO8Q==","length":2424,"stub":true},"async-memoizer@0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-clGcEozh0BCLc+6jmh0Hgw==","length":2416,"stub":true},"async-memoizer@0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-MGWJ7CioA/D25ie4Q3ObsA==","length":2074,"stub":true}}}},
{"id":"async-mini","key":"async-mini","value":{"rev":"5-fe0515852b2b9c0191d9a02b32eaee70"},"doc":{"_id":"async-mini","_rev":"5-fe0515852b2b9c0191d9a02b32eaee70","name":"async-mini","description":"Common patterns for asynchronous code, minimalistic version","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Juraj Vitko","url":"ypocat.com"},"name":"async-mini","description":"Common patterns for asynchronous code, minimalistic version","keywords":["asynchronous","control","flow"],"version":"0.1.0","homepage":"http://github.com/ypocat/async-mini","repository":{"type":"git","url":"git://github.com/ypocat/async-mini.git"},"main":"./lib/async-mini.js","directories":{"lib":"./lib"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ypocat","email":"juraj.vitko@gmail.com"},"_id":"async-mini@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ffd68a7c4e7a513216e98dfd611c4474901f828a","tarball":"http://registry.npmjs.org/async-mini/-/async-mini-0.1.0.tgz"},"maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}]},"0.1.1":{"author":{"name":"Juraj Vitko","url":"ypocat.com"},"name":"async-mini","description":"Common patterns for asynchronous code, minimalistic version","keywords":["asynchronous","control","flow"],"version":"0.1.1","homepage":"http://github.com/ypocat/async-mini","repository":{"type":"git","url":"git://github.com/ypocat/async-mini.git"},"main":"./lib/async-mini.js","directories":{"lib":"./lib"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{},"licenses":[{"type":"MIT","url":"https://raw.github.com/ypocat/async-mini/master/LICENSE"}],"_npmUser":{"name":"ypocat","email":"juraj.vitko@gmail.com"},"_id":"async-mini@0.1.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"a3c48a0789afcea1b064c7f313c74135a0ec8fa4","tarball":"http://registry.npmjs.org/async-mini/-/async-mini-0.1.1.tgz"},"maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}]}},"readme":"# Common patterns for asynchronous code, minimalistic version (async-mini)\n\nIf you only need `async.series()` and `async.parallel()` in the most simplest, stable and predictable form, then this module is for you.\n\n## Usage\n\n\tnpm install async-mini\n\n```js\nvar async = require('async-mini');\n\nvar funcs = [\n\tfunction(cb) {\n\t\tcb(null, 'done 1');\n\t},\n\tfunction(cb) {\n\t\tcb(null, 'done 2');\n\t}\n];\n\nvar funcs2 = {\n\tone: function(cb) {\n\t\tcb(null, 'done 1');\n\t},\n\ttwo: function(cb) {\n\t\tcb(null, 'done 2');\n\t}\n};\n\nvar cb = function(err, res) {\n\tconsole.log(arguments);\n};\n\nasync.series(funcs, cb);\n\nasync.parallel(funcs, cb);\n\nasync.parallel(funcs2, cb);\n```\n\nThe above code will print:\n\n\t{ '0': null, '1': [ 'done 1', 'done 2' ] }\n\t{ '0': null, '1': { '0': 'done 1', '1': 'done 2' } }\n\t{ '0': null, '1': { one: 'done 1', two: 'done 2' } }\n\nOf course, the above two `.parallel()` calls should themselves be inside a `.series()` call, but this is omitted for brevity of the exmaple.","maintainers":[{"name":"ypocat","email":"juraj.vitko@gmail.com"}],"time":{"modified":"2012-02-06T01:24:08.294Z","created":"2011-12-18T22:52:03.301Z","0.1.0":"2011-12-18T22:52:05.616Z","0.1.1":"2012-02-06T01:24:08.294Z"},"author":{"name":"Juraj Vitko","url":"ypocat.com"},"repository":{"type":"git","url":"git://github.com/ypocat/async-mini.git"},"_attachments":{"async-mini-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XscbsEqzWfN1aFmsY4Ia9g==","length":10240,"stub":true},"async-mini-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GgvUWxLCPLNCPP2wnbxgSQ==","length":10240,"stub":true}}}},
{"id":"async-queue","key":"async-queue","value":{"rev":"3-8ac48ac702399e8a90c6a9169d23bcb7"},"doc":{"_id":"async-queue","_rev":"3-8ac48ac702399e8a90c6a9169d23bcb7","name":"async-queue","description":"simple FIFO queue to execute async functions linear.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"async-queue","description":"simple FIFO queue to execute async functions linear.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/martinj/node-async-queue.git"},"homepage":"https://github.com/martinj/node-async-queue","licenses":[{"type":"MIT","url":"https://github.com/martinj/node-async-queue/raw/master/LICENSE"}],"keywords":["queue","async","flow"],"author":{"name":"Martin Jonsson","email":"martin.jonsson@gmail.com"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{"mocha":"1.0.x","should":"*"},"main":"./async-queue","scripts":{"test":"node_modules/.bin/mocha test/*.test.js"},"_npmUser":{"name":"martinj","email":"martin.jonsson@gmail.com"},"_id":"async-queue@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.14","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e7e1f67ac66d3f6c7b8758b85f2cb0baa65b6af4","tarball":"http://registry.npmjs.org/async-queue/-/async-queue-0.1.0.tgz"},"maintainers":[{"name":"martinj","email":"martin.jonsson@gmail.com"}]}},"readme":"# AsyncQueue\n\n[![Build Status](https://secure.travis-ci.org/martinj/node-async-queue.png)](http://travis-ci.org/martinj/node-async-queue)\n\n## Installation\n\t\n\tnpm install async-queue\n\t\n## Example\n\n\tvar AsyncQueue = require('async-queue');\n\n\tnew AsyncQueue(function (err, job) {\n\t\tif (err) job.fail(err);\n\t\tsetTimeout(function () {\n\t\t\tconsole.log('First job executed')\n\t\t\tjob.success();\n\t\t}, 500);\n\t}, function (err, job) {\n\t\tconsole.log('Second job executed');\n\t\tjob.success();\n\t}).run();\n\nOutput\n\n\tFirst job executed\n\tSecond job executed\n\n## Run Tests\n\n\tnpm install\n\tnpm test","maintainers":[{"name":"martinj","email":"martin.jonsson@gmail.com"}],"time":{"modified":"2012-04-19T09:55:07.203Z","created":"2012-04-19T09:55:05.586Z","0.1.0":"2012-04-19T09:55:07.203Z"},"author":{"name":"Martin Jonsson","email":"martin.jonsson@gmail.com"},"repository":{"type":"git","url":"git://github.com/martinj/node-async-queue.git"},"_attachments":{"async-queue-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HZAJAGNgPXcmzEVBXxdlJQ==","length":2581,"stub":true}}}},
{"id":"async-stacktrace","key":"async-stacktrace","value":{"rev":"9-a5af8a0846a9ce7dddbcb4096a9503cb"},"doc":{"_id":"async-stacktrace","_rev":"9-a5af8a0846a9ce7dddbcb4096a9503cb","name":"async-stacktrace","description":"Improves node.js stacktraces and makes it easier to handle errors","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"async-stacktrace","description":"Improves node.js stacktraces and makes it easier to handle errors","homepage":"https://github.com/Pita/node-async-stacktrace","author":{"name":"Peter 'Pita' Martischka","email":"petermartischka@googlemail.com"},"main":"./ERR","version":"0.0.1","_npmUser":{"name":"pita","email":"petermartischka@googlemail.com"},"_id":"async-stacktrace@0.0.1","devDependencies":{"vows":"0.6.0"},"dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dd0a05b137bb6f293774b3fa8ce1676410f1c00d","tarball":"http://registry.npmjs.org/async-stacktrace/-/async-stacktrace-0.0.1.tgz"},"maintainers":[{"name":"pita","email":"petermartischka@googlemail.com"}],"directories":{}},"0.0.2":{"name":"async-stacktrace","description":"Improves node.js stacktraces and makes it easier to handle errors","homepage":"https://github.com/Pita/async-stacktrace","author":{"name":"Peter 'Pita' Martischka","email":"petermartischka@googlemail.com"},"main":"./ERR","version":"0.0.2","_npmUser":{"name":"pita","email":"petermartischka@googlemail.com"},"_id":"async-stacktrace@0.0.2","devDependencies":{"vows":"0.6.0"},"dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"26963202f28f9b73f0d20443809d23d4052512ff","tarball":"http://registry.npmjs.org/async-stacktrace/-/async-stacktrace-0.0.2.tgz"},"maintainers":[{"name":"pita","email":"petermartischka@googlemail.com"}]}},"readme":"## Why classic stacktraces are not very helpful when dealing with async functions\n\nLook at this example. `one` calls `two`, `two` calls `three`, and `three` calls `four`. All functions call the given callback asynchronous. `four` calls the callback with an error. `three` and `two` passes the error to their callback function and stop executing with `return`. `one` finally throws it \n\n```js\nfunction one()\n{\n   two(function(err){\n     if(err){\n       throw err;\n     }  \n   \n     console.log(\"two finished\");\n   });\n}\n\nfunction two(callback)\n{\n  setTimeout(function () { \n    three(function(err)\n    {\n      if(err) {\n        callback(err);\n        return;\n      }   \n      \n      console.log(\"three finished\");\n      callback();\n    });\n  }, 0);\n}\n\nfunction three(callback)\n{\n  setTimeout(function () { \n    four(function(err)\n    {\n      if(err) {\n        callback(err);\n        return;\n      } \n      \n      console.log(\"four finished\");\n      callback();\n    });\n  }, 0);\n}\n\nfunction four(callback)\n{\n  setTimeout(function(){\n    callback(new Error());\n  }, 0);\n}\n\none();\n```\n\n### When you execute it, you will get this:\n\n```\n$ node example_without.js \n\n/home/pita/Code/async-stacktrace/example_without.js:5\n       throw err;\n       ^\nError\n    at Timer.callback (/home/pita/Code/async-stacktrace/example_without.js:47:14)\n```\n\n### The problems here are:\n\n* You can see that the error happend in `four`, but you can't see from where `four` was called. The context gets lost\n* You write the same 4 lines over and over again, just to handle errors\n\n## The solution\n\n### Lets replace this code in `two` and `three` \n\n```js\nif(err) {\n  callback(err);\n  return;\n}\n```\n\n### with\n\n```js\nif(ERR(err, callback)) return;\n```\n\n### and replace this code in `one`\n\n```js\nif(err){\n  throw err;\n}  \n```\n\n### with\n\n```js\nERR(err);\n```\n\n### This is how it looks like now: \n\n```js\nrequire(\"./ERR\");\n\nfunction one()\n{\n   two(function(err){\n     ERR(err);\n   \n     console.log(\"two finished\");\n   });\n}\n\nfunction two(callback)\n{\n  setTimeout(function () { \n    three(function(err)\n    {\n      if(ERR(err, callback)) return;\n      \n      console.log(\"three finished\");\n      callback();\n    });\n  }, 0);\n}\n\nfunction three(callback)\n{\n  setTimeout(function () { \n    four(function(err)\n    {\n      if(ERR(err, callback)) return;\n      \n      console.log(\"four finished\");\n      callback();\n    });\n  }, 0);\n}\n\nfunction four(callback)\n{\n  setTimeout(function(){\n    callback(new Error());\n  }, 0);\n}\n\none();\n```\n\n### When you execute it, you will get this:\n\n```\n$ node example.js \n\n/home/pita/Code/async-stacktrace/ERR.js:57\n      throw err;\n      ^\nAsync Stacktrace:\n    at /home/pita/Code/async-stacktrace/example.js:6:6\n    at /home/pita/Code/async-stacktrace/example.js:17:10\n    at /home/pita/Code/async-stacktrace/example.js:30:10\n\nError\n    at Timer.callback (/home/pita/Code/async-stacktrace/example.js:41:14)\n```\n\n### What is new?\n\nThe \"Async Stacktrace\" shows you where this error was caught and passed to the next callback. This allows you to see from where `four` was called. You also have less code to write\n\n## npm\n```\nnpm install async-stacktrace\n```\n\n## Usage\n\nThe `ERR` function is set global. All you have to add to your code is\n\n```js\nrequire(\"./ERR\");\n```\n\nThe parameters of `ERR()` are: \n\n1. `err` The error object (can be a string that describes the error too)\n2. `callback` (optional) If the callback is set and an error is passed, it will call the callback with the modified stacktrace. Else it will throw the error\n\nThe return value is true if there is an error. Else its false\n","maintainers":[{"name":"pita","email":"petermartischka@googlemail.com"}],"time":{"modified":"2011-12-04T13:56:43.066Z","created":"2011-12-04T12:54:44.887Z","0.0.1":"2011-12-04T12:54:47.014Z","0.0.2":"2011-12-04T13:56:43.066Z"},"author":{"name":"Peter 'Pita' Martischka","email":"petermartischka@googlemail.com"},"_attachments":{"async-stacktrace-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-r9Fvze00QmPWF/M23csXAQ==","length":2877,"stub":true},"async-stacktrace-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wfn/i6JoU5+XzO5bG8b+cQ==","length":2816,"stub":true}}}},
{"id":"async-unit","key":"async-unit","value":{"rev":"3-baf954ddcb12d21254fd1dfd8f3f1ce5"},"doc":{"_id":"async-unit","_rev":"3-baf954ddcb12d21254fd1dfd8f3f1ce5","name":"async-unit","description":"A minimal asynchronous test framework for Node.JS / Ender","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info/"},"name":"async-unit","description":"A minimal asynchronous test framework for Node.JS / Ender","version":"1.0.0","repository":{"type":"git","url":"git://github.com/coolaj86/async-unit.git"},"main":"lib/index","scripts":{"test":"served 3430"},"engines":{"node":"~0.4.8"},"browserDependencies":{"events.node":"*"},"devDependencies":{},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"async-unit@1.0.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d58bffba7ac7034902d0576134e6baffe1a1390b","tarball":"http://registry.npmjs.org/async-unit/-/async-unit-1.0.0.tgz"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-11-09T21:55:34.734Z","created":"2011-11-09T21:55:34.161Z","1.0.0":"2011-11-09T21:55:34.734Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info/"},"repository":{"type":"git","url":"git://github.com/coolaj86/async-unit.git"},"_attachments":{"async-unit-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8V9n9OQENUI5NcwKQSw1AQ==","length":10240,"stub":true}}}},
{"id":"async-util","key":"async-util","value":{"rev":"9-415c9dee78e3cb7e1524179d7c8b44f3"},"doc":{"_id":"async-util","_rev":"9-415c9dee78e3cb7e1524179d7c8b44f3","name":"async-util","description":"JavaScript async utilities library","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"async-util","version":"0.0.1","description":"JavaScript async utilities library","keywords":["async"],"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"dependencies":{},"devDependencies":{},"main":"./index.js","engines":{"node":"*"},"homepage":"https://github.com/onirame/async-util","repository":{"type":"git","url":"git://github.com/onirame/async-util.git"},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"async-util@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d0b9c484ee4cebf0dd35f8c1e83a4d4df9ecf58d","tarball":"http://registry.npmjs.org/async-util/-/async-util-0.0.1.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]},"0.0.5":{"name":"async-util","version":"0.0.5","description":"JavaScript async utilities library","keywords":["async"],"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"dependencies":{},"devDependencies":{},"main":"./index.js","engines":{"node":"*"},"homepage":"https://github.com/onirame/async-util","repository":{"type":"git","url":"git://github.com/onirame/async-util.git"},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"async-util@0.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"dc7e2be722a1a2fd6d2a996a1f317d112a4791f7","tarball":"http://registry.npmjs.org/async-util/-/async-util-0.0.5.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]},"0.1.0":{"name":"async-util","version":"0.1.0","description":"JavaScript async utilities library","keywords":["async"],"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"dependencies":{},"devDependencies":{},"main":"./index.js","engines":{"node":"*"},"homepage":"https://github.com/onirame/async-util","repository":{"type":"git","url":"git://github.com/onirame/async-util.git"},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"async-util@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"cdd5870a666c3b9999a26cc8af5f03f9aee9f162","tarball":"http://registry.npmjs.org/async-util/-/async-util-0.1.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]},"0.2.0":{"name":"async-util","version":"0.2.0","description":"JavaScript async utilities library","keywords":["async"],"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"dependencies":{},"devDependencies":{},"main":"./index.js","engines":{"node":"*"},"homepage":"https://github.com/onirame/async-util","repository":{"type":"git","url":"git://github.com/onirame/async-util.git"},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"async-util@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c03f07a216cb58617cffb7ab52dccde9a739f5fb","tarball":"http://registry.npmjs.org/async-util/-/async-util-0.2.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]}},"readme":"\n# async-util\n\nJavaScript async utilities library\n\n## API\n\n  - parallel_each (array, iterator, callback)\n  - series_each (array, iterator, callback)\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Enrico Marino &lt;enrico.marino@email.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}],"time":{"modified":"2011-12-27T11:17:08.314Z","created":"2011-12-06T18:36:31.870Z","0.0.1":"2011-12-06T18:36:33.733Z","0.0.5":"2011-12-06T20:44:53.840Z","0.1.0":"2011-12-06T23:54:44.806Z","0.2.0":"2011-12-27T11:17:08.314Z"},"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"repository":{"type":"git","url":"git://github.com/onirame/async-util.git"},"_attachments":{"async-util-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-EhrxzZgwH5MgV2iNqsjsoQ==","length":10240,"stub":true},"async-util-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-n1L6rMNTui9sITAdAKo2YQ==","length":10240,"stub":true},"async-util-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DCaM8hDMs4/jKT42pCDF/g==","length":10240,"stub":true},"async-util-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1zp4OfioapHlqMyyDX3IXw==","length":10240,"stub":true}}}},
{"id":"async.coffee","key":"async.coffee","value":{"rev":"3-50e53713b4bdc288074afdaa8ecc5fcd"},"doc":{"_id":"async.coffee","_rev":"3-50e53713b4bdc288074afdaa8ecc5fcd","name":"async.coffee","description":"Coffee DSL for Async","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"async.coffee","description":"Coffee DSL for Async","version":"0.0.1","url":"https://github.com/Radagaisus/Async.Coffee","author":{"name":"Almog Melamed"},"main":"./index","devDependencies":{"jasmine-node":"latest"},"dependencies":{"async":"0.1.18"},"bugs":{"url":"http://github.com/Radagaisus/Async.Coffee/issues"},"licenses":[{"type":"MIT","url":"http://github.com/Radagaisus/Async.Coffee/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/Radagaisus/Async.Coffee.git"},"keywords":["async","coffee script","coffee"],"engines":{"node":"node >= 0.6.0"},"scripts":{"test":"jasmine-node test/async.spec.coffee --verbose --color --forceexit --coffee"},"_npmUser":{"name":"radagaisus","email":"radagaisus@gmail.com"},"_id":"async.coffee@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"193f592d911568e6cabe79ad08e67c15c7ec6034","tarball":"http://registry.npmjs.org/async.coffee/-/async.coffee-0.0.1.tgz"},"maintainers":[{"name":"radagaisus","email":"radagaisus@gmail.com"}]}},"readme":"# Async.coffee\n\nA CoffeeScript DSL for [Async](https://github.com/caolan/async).\n\n`npm install async.coffee`\n\n## In Action\n```coffee\nasync.parallel ->\n\t@fn one: ->\n\t\tsetTimeout =>\n\t\t\t\t@callback null, 1\n\t\t\t, 500\n\n\t@fn two: ->\n\t\tsetTimeout =>\n\t\t\t\t@callback null, 2\n\t\t\t, 200\n\n\t@callback ->\n\t\texpect(@results.one).toBe 1\n\t\texpect(@results.two).toBe 2\n\t\texpect(@err).toBeUndefined()\n```\n\n## Concepts\n\n* async functions have `@callback` in their context, also aliased as `@cb` and `@c`. They also receive it as their first argument.\n\n* The **`@callback`** function receives the results as `@results`, also aliased to `@res` and `@response` and the error as `@err`, `@e` or `@error`. It also receives them as arguments: `(err, res) ->`.\n\n## Supported Functions\n\n- Parallel\n- Map\n\n### Parallel\n\n* `@fn` - receives an object of named functions.\n* `@callback` - _(optional)_ the callback function.\n\n```coffee\nasync.parallel ->\n\t@fn one: ->\n\t\tsetTimeout =>\n\t\t\t\t@callback null, 1\n\t\t\t, 500\n\n\t@fn two: ->\n\t\tsetTimeout =>\n\t\t\t\t@callback null, 2\n\t\t\t, 200\n\n\t@callback ->\n\t\texpect(@results.one).toBe 1\n\t\texpect(@results.two).toBe 2\n\t\texpect(@err).toBeUndefined()\n```\n\n### Map (array, function)\n\n* `@iter` - receives an object of named functions.\n* `@callback` - _(optional)_ the callback function.\n\n```coffee\nasync.map [1..100], ->\n\t@iter ->\n\t\tsetTimeout =>\n\t\t\t\t@callback null, @item*2\n\t\t\t, 100\n\t@callback ->\n\t\tfor i in [0...100]\n\t\t\texpect(@results[i]).toBe((i+1)*2)\n\t\texpect(@err).toBeUndefined()\n\t\tdone()\n```","maintainers":[{"name":"radagaisus","email":"radagaisus@gmail.com"}],"time":{"modified":"2012-06-27T18:41:38.399Z","created":"2012-06-27T18:41:15.049Z","0.0.1":"2012-06-27T18:41:38.399Z"},"author":{"name":"Almog Melamed"},"repository":{"type":"git","url":"git://github.com/Radagaisus/Async.Coffee.git"},"_attachments":{"async.coffee-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R2+vKl2p9tfgEVmGt3gzNA==","length":3714,"stub":true}}}},
{"id":"asyncBuilder","key":"asyncBuilder","value":{"rev":"110-04276d5abb3070ead49ed5de13d13ccb"},"doc":{"_id":"asyncBuilder","_rev":"110-04276d5abb3070ead49ed5de13d13ccb","name":"asyncBuilder","description":"handle async dependency loading","dist-tags":{"latest":"0.2.19"},"versions":{"0.1.0":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.0","homepage":"https://github.com/azulus/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/azulus/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"38533944edf024f7a0aa10b07df03481dd2e3fc5","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.0.tgz"},"readme":"","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.1":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.1","homepage":"https://github.com/azulus/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/azulus/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"177a52d5a51534ca3759a5743ae1987f32867b5d","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.1.tgz"},"readme":"","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.2":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.2","homepage":"https://github.com/azulus/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/azulus/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"905c1dde5209083c82ae1d8da52d4725f41af696","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.2.tgz"},"readme":"","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.3":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.3","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"bbda0f0ccd89ddca5554056db9d8f6210c488008","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.3.tgz"},"readme":"","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.4":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.4","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5921f9d3520e746e7e7df1684d7607a6e610365f","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.4.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.5":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.5","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"231a77970a1cf62a892b5f1f67e1522ae489d1a0","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.5.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.6":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.6","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5f4960da2633c3cc5e68423b7e7397e076688773","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.6.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.7":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.7","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"54f89be6ddd542f78f25edf60fd38b34b81865ed","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.7.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.8":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.8","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.8","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6a4db4158c2c0e20337b65981cb195f14e6460de","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.8.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.9":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.9","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.9","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9d7f3e402a95277aaa1c45e2ad43251216095339","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.9.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.10":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.10","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.10","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6308f2da4edcce32a48385bbea24d3a17ba716c7","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.10.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.11":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.11","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.11","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3ef1a42f13c1c281d37752b44b7b45dd3eb93add","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.11.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.12":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.12","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.12","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5f8badcbd2a6ec6c1cf992ebb878a34eab7964d6","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.12.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.13":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.13","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.13","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"87152f828dc6fbfc5e302da35c0977d2ed44f7e0","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.13.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.14":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.14","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.14","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b4f58f87c413c6f5f84335ef9844b0fe7619cdfa","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.14.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.15":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.15","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.15","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"25169dd4252994ab9642279fbe7d65b8db757c30","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.15.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.16":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.16","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.16","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1dbc4f881485a84c52b73c6e58463e7474272d62","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.16.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.18":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.18","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.18","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"998bc365781a761735298d7c7998f12a03eff1b7","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.18.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.19":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.19","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.19","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8b988751daf183c69edfc721b63b4e3a0e988003","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.19.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.20":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.20","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.1.20","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"54259ec59177d1457def6b5b065cd5e97630c218","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.20.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.21":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.21","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.21","dist":{"shasum":"a4299a0831b4c8f364b44e9aeb0fc78f8730b876","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.21.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.22":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.22","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.22","dist":{"shasum":"b60ae4f135f807f3efdcb7fe81cf28260339d978","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.22.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.23":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.23","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.23","dist":{"shasum":"9843d7162e590d32ac2df227d0ad179b358c4438","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.23.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.24":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.24","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.24","dist":{"shasum":"a93a14513a6d1a376a8096acfd223b6b4ef9775f","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.24.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.25":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.25","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.25","dist":{"shasum":"2506e9275f21875de3888d1e6e03c827878c977b","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.25.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.26":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.26","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.26","dist":{"shasum":"9fcae5e8f48c8cbf6157e48d59206fc612fb69ab","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.26.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.1.27":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.1.27","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.1.27","dist":{"shasum":"1f93477a5b92083a6fb3372d4b32a6f405a54da8","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.1.27.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.0":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.0","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./lib/asyncBuilder2.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.0","dist":{"shasum":"46382df8827ae95cd751aef30e3f2b36c9b425ee","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.0.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.1":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.1","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"./lib/asyncBuilder2.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.1","dist":{"shasum":"1492d64f526cf2e07d6f683feb3eabbace6ba8ab","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.1.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.2":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.2","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.2","dist":{"shasum":"3413752d9a377edf35095fea1b43d34c6dcfcd5f","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.2.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.3":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.3","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.3","dist":{"shasum":"3894af8d8d0698ab41fb490b8d6b68a4c9877e1a","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.3.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.4":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.4","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.4","dist":{"shasum":"dfe1d59d9e08989ff23791e485384b48144b0bcf","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.4.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.5":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.5","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.5","dist":{"shasum":"10de045a940e1ec6f1c919e060e4b56d47ac4b4b","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.5.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.6":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.6","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.6","dist":{"shasum":"4bcce5979eee118aba2d143b78f3a0e185bc7728","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.6.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.7":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.7","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.7","dist":{"shasum":"e9ede3083550127843642637319d3632827ed1c3","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.7.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.8":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.8","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.8","dist":{"shasum":"94271d3cb938f3c61dead70da8fa3ff0bdb216bb","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.8.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.9":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.9","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.9","dist":{"shasum":"afb865f53b3a6343b0679d59bca51451d8f142ee","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.9.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.10":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.10","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.10","dist":{"shasum":"3b801400a73bb733f7ad8185539272be6a8f6c5e","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.10.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.11":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.11","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.11","dist":{"shasum":"975c100889cebcc15921115492349460f940c148","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.11.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.12":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.12","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib2/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.12","dist":{"shasum":"77525b65f5930c3a3d31f1ff4ee7e8250e8ccdbd","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.12.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.13":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.13","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.13","dist":{"shasum":"ac6b5a2572d631b2fc6808f5552527651ae494b3","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.13.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.14":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.14","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.14","dist":{"shasum":"136e5aaf01543f7744c0693be86faa9c23afc24e","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.14.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.15":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.15","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.15","dist":{"shasum":"8d89d3117ddef5b57786dc11b54dc8fc098f0fd6","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.15.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"directories":{}},"0.2.16":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.16","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib/asyncBuilder.js","repository":{"type":"git","url":"git://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","q":"0.8.5"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"asyncBuilder@0.2.16","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2a909f81b0658b5a11395556f625060586b3c0b9","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.16.tgz"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"azulus","email":"npm@azulus.com"}]},"0.2.18":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.18","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","kew":"0.0.2"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.18","dist":{"shasum":"5a3cc6a8d7c28af408e40b60ad6c63a509f49d24","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.18.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}]},"0.2.19":{"name":"asyncBuilder","description":"handle async dependency loading","version":"0.2.19","homepage":"https://github.com/Obvious/asyncBuilder","authors":["Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"contributors":[],"keywords":["asyncBuilder"],"main":"lib/asyncBuilder.js","repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"dependencies":{"microtime":"0.3.1","kew":"0.0.3"},"readme":"asyncBuilder: to build objects… asynchronously\n==================================\n\nDealing with nested asynchronous javascript is little fun and is virtually impossible to optimize by hand with any reasonably complicated block of code. Nested sets of functions will run at the speed of their slowest calls combined, regardless of what the actual dependency tree may look like. This little tool is built to help optimize these paths and to give some insight into what's going on.\n\nSetting up and using a builder involves the following 3 steps:\n\nCreate a BuilderFactory\n-------\n\nA `BuilderFactory` is used to create a map of functions that produce output and receive a given set of inputs. The `add` function may be called to add handlers to the BuilderFactory with a name, function, and list of inputs into the function (from other handlers' output or data passed into `build()` of the `BuilderInstance`).\n\n```javascript\nvar builderFactory = new require(\"asyncBuilder\").BuilderFactory\n\nbuilderFactory\n  .add(\"firstName\", getFirstName, [\"user\"])\n  .add(\"lastName\", getLastName, [\"user\"])\n  .add(\"fullName\", getFullName, [\"firstName\", \"lastName\"])\n\nfunction getFirstName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.firstName)\n}\n\nfunction getLastName(user, next) {\n  if (!user) return next(new Error(\"User does not exist\"))\n  next(null, user.lastName)\n}\n\nfunction getFullName(firstName, lastName, next) {\n  next(null, firstName + ' ' + lastName)\n}\n```\n\nAs a note: any errors passed into the first parameter of `next` for a given handler will end the execution of the current `build()` call (with the exception of any calls in progress which will silently be ignored) and will bubble up to the callback specified to the `build` step.\n\nYou may also provide the name of one handler as the function for another if you wish to provide another accessor:\n\n```javascript\nbuilderFactory\n  .add(\"shortName\", \"firstName\")\n```\n\n`BuilderFactory` instances may be cloned as a method of extending them without overriding (or adding to) the handlers on the original factory:\n\n```javascript\nvar newBuilderFactory = builderFactory\n  .clone()\n  .add(\"fullName\", getAbbreviatedName, [\"firstName\", \"lastName\"])\n  .add(\"shortName\", \"lastName\")\n```\n\nCreate a `BuilderInstance`\n-------\n\nThe `BuilderFactory` can create `BuilderInstance` objects via the `newBuilder` method. Each `BuilderInstance` will have a code path optimized for it's specific set of required output fields. Only the code needed to fulfill a given instance's outputs will ever be ran by a given `BuilderInstance`.\n\n```javascript\nvar myBuilder = builderFactory.newBuilder([\"fullName\", \"shortName\"])\n```\n\nBuild your object\n-------\n\nYour `BuilderInstance` can now be used to asynchronously generate output via the `build` method.\n\n```javascript\nmyBuilder.build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nIf you have a need to further inspect what's happening with the asyncBuilder, a utility method `trace()` has been exposed on the `BuilderInstance` and will show timing information and execution steps for a given `build()` call:\n\n```javascript\nmyBuilder\n  .trace()\n  .build({user: {firstName: \"Jeremy\", lastName: \"Stanley\"}}, function (err, data) {\n  //data.fullName and data.shortName should both be present\n})\n```\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/asyncBuilder/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Jeremy Stanley](https://github.com/azulus)\nsupported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0.\nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncBuilder@0.2.19","dist":{"shasum":"182981cac442ae5af4e958cfddb73ffdf6d58f2f","tarball":"http://registry.npmjs.org/asyncBuilder/-/asyncBuilder-0.2.19.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}]}},"readme":"","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"time":{"modified":"2012-08-14T18:55:56.467Z","created":"2012-03-29T23:00:41.020Z","0.1.0":"2012-03-29T23:00:42.249Z","0.1.1":"2012-03-30T20:03:19.622Z","0.1.2":"2012-03-30T21:49:52.446Z","0.1.3":"2012-04-03T06:51:52.621Z","0.1.4":"2012-04-08T06:26:16.102Z","0.1.5":"2012-04-08T19:05:13.721Z","0.1.6":"2012-04-08T19:08:29.190Z","0.1.7":"2012-04-08T19:12:11.226Z","0.1.8":"2012-04-08T19:16:52.114Z","0.1.9":"2012-04-08T23:52:20.973Z","0.1.10":"2012-04-09T21:44:11.629Z","0.1.11":"2012-05-01T01:59:30.182Z","0.1.12":"2012-05-09T16:47:43.929Z","0.1.13":"2012-05-20T01:03:37.457Z","0.1.14":"2012-05-24T21:56:49.146Z","0.1.15":"2012-06-19T18:54:15.021Z","0.1.16":"2012-06-29T16:54:42.543Z","0.1.18":"2012-07-02T21:31:35.289Z","0.1.19":"2012-07-02T21:59:18.530Z","0.1.20":"2012-07-03T00:14:54.046Z","0.1.21":"2012-07-09T23:53:33.501Z","0.1.22":"2012-07-11T18:05:19.732Z","0.1.23":"2012-07-11T21:55:23.021Z","0.1.24":"2012-07-11T22:05:56.240Z","0.1.25":"2012-07-12T19:59:22.352Z","0.1.26":"2012-07-13T01:53:21.637Z","0.1.27":"2012-07-13T02:01:08.164Z","0.2.0":"2012-07-16T02:48:31.445Z","0.2.1":"2012-07-16T16:22:33.280Z","0.2.2":"2012-07-16T16:25:17.002Z","0.2.3":"2012-07-16T16:31:21.369Z","0.2.4":"2012-07-16T16:53:00.826Z","0.2.5":"2012-07-16T23:12:59.730Z","0.2.6":"2012-07-16T23:47:46.230Z","0.2.7":"2012-07-17T17:46:20.699Z","0.2.8":"2012-07-17T23:39:37.042Z","0.2.9":"2012-07-18T01:42:52.866Z","0.2.10":"2012-07-18T01:57:37.149Z","0.2.11":"2012-07-23T22:32:53.553Z","0.2.12":"2012-07-24T18:47:15.628Z","0.2.13":"2012-07-24T21:58:42.225Z","0.2.14":"2012-07-29T03:15:14.480Z","0.2.15":"2012-07-29T03:23:27.871Z","0.2.16":"2012-08-10T21:01:24.456Z","0.2.18":"2012-08-14T17:14:45.151Z","0.2.19":"2012-08-14T18:55:56.467Z"},"repository":{"type":"git","url":"https://github.com/Obvious/asyncBuilder.git"},"users":{"fgribreau":true},"_attachments":{"asyncBuilder-0.2.19.tgz":{"content_type":"application/octet-stream","revpos":110,"digest":"md5-SYEZly26uuS2CHeTe0OLDQ==","length":12853,"stub":true},"asyncBuilder-0.2.18.tgz":{"content_type":"application/octet-stream","revpos":108,"digest":"md5-Gi1iMd5Sdg33MqDkGRaRCg==","length":12853,"stub":true},"asyncBuilder-0.2.16.tgz":{"content_type":"application/octet-stream","revpos":106,"digest":"md5-o6YBTfcbU+fkWEhk2rV4Cg==","length":12851,"stub":true},"asyncBuilder-0.2.15.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-Twy3dkMLy5wHCkIZMJFiLQ==","length":12442,"stub":true},"asyncBuilder-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-vgIUgSCKALWglRbldI83lQ==","length":12449,"stub":true},"asyncBuilder-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-LdpxNJtw9iZflfHT24KrPA==","length":12004,"stub":true},"asyncBuilder-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-MtC9HLOYYY94IMIBc5vTIQ==","length":16394,"stub":true},"asyncBuilder-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-YtRgl/J3MAGfT6nTtTm7JA==","length":16204,"stub":true},"asyncBuilder-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-3O3ZF4Mgr86aaKZ3w+LLEw==","length":16211,"stub":true},"asyncBuilder-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-kVD3S3DYp+i9U9wdNx2O6A==","length":16175,"stub":true},"asyncBuilder-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-NPPIJIWVkuj5xTHwYm9T/A==","length":16037,"stub":true},"asyncBuilder-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-bmDi2RniFr3ZH8YHK6/zFQ==","length":16038,"stub":true},"asyncBuilder-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-gxle5KdxTwdcYyJrHhpv8A==","length":16011,"stub":true},"asyncBuilder-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-IPfvl5857JY2ZH4w05BStg==","length":16016,"stub":true},"asyncBuilder-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-BoJgAi/4hhtd5kDrNPposQ==","length":15988,"stub":true},"asyncBuilder-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-gLYaGJJF+XVO0JkXB2anXA==","length":15983,"stub":true},"asyncBuilder-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-JbotNn6Bl6nPyKU6w6HbTQ==","length":15924,"stub":true},"asyncBuilder-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-KhIzVgJ15CKLOa9IhOLKhg==","length":15920,"stub":true},"asyncBuilder-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-WTyzrxLCfFk2O/QufxhM0w==","length":15653,"stub":true},"asyncBuilder-0.1.27.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-fcG2tj2i2nY+a4bhiEkmvw==","length":12616,"stub":true},"asyncBuilder-0.1.26.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-nLiup39RvBgK3NX+6WI3QQ==","length":12591,"stub":true},"asyncBuilder-0.1.25.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-/jUu9ktU/wMIj2qrDQ9OWA==","length":12229,"stub":true},"asyncBuilder-0.1.24.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-ELwSlBwmniupvPvPHuP3/A==","length":12224,"stub":true},"asyncBuilder-0.1.23.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-yFCNJi0D4phscYLCyHwR/w==","length":12210,"stub":true},"asyncBuilder-0.1.22.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-Yg2npo89aAp1jPoiePigNg==","length":11966,"stub":true},"asyncBuilder-0.1.21.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-MOzSe1eWISHe3jsFn2dB2A==","length":11945,"stub":true},"asyncBuilder-0.1.20.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-x2hIj0aIV3FF+8Yg3T0/qw==","length":11303,"stub":true},"asyncBuilder-0.1.19.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-fgCWdBPyjxr8RTehNabg0A==","length":11215,"stub":true},"asyncBuilder-0.1.18.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-CN8v1TTe5CQyqjKoJg8lfg==","length":11199,"stub":true},"asyncBuilder-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-Qvz8M3bPLEHrq8/EzhFMxQ==","length":10963,"stub":true},"asyncBuilder-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-unOOsGuFGv85zpCA4zfEtw==","length":8823,"stub":true},"asyncBuilder-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-9xhnN2+t/RGeqawU2Ow8lQ==","length":8802,"stub":true},"asyncBuilder-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-7GUIUYe4EUm2PkOsGUPmmA==","length":8648,"stub":true},"asyncBuilder-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-Q0XHsbJiiX5of0+NU2kcRw==","length":8503,"stub":true},"asyncBuilder-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-hS+KXUb+S1BU8sQGMlFPRQ==","length":8217,"stub":true},"asyncBuilder-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-FSsTLDpb6Zt18RuJx3FGow==","length":8146,"stub":true},"asyncBuilder-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-PzrGqt/ejDXTO2Nt+QRo6A==","length":8148,"stub":true},"asyncBuilder-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-jD4aYELy6IiJhuNwGnsDig==","length":8130,"stub":true},"asyncBuilder-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-sfYJLRpiT65M5FQFtwv6oQ==","length":8108,"stub":true},"asyncBuilder-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-mI835pd0Vh7kYzM59j9mpQ==","length":8110,"stub":true},"asyncBuilder-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3nHlCHfqoZnfopkhbTpFWw==","length":8102,"stub":true},"asyncBuilder-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-1lTn9thKvSEZCb7RPoLlSA==","length":8066,"stub":true},"asyncBuilder-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pv1+kemWiTKxidGf5ctOFg==","length":2857,"stub":true},"asyncBuilder-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-lVJDeTBWseAaxuyLZzPq+A==","length":1973,"stub":true},"asyncBuilder-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wEIQT3AE8syPYKL3Qfh+qA==","length":1976,"stub":true},"asyncBuilder-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+p2mLLNEamG4nPWbqzg0bg==","length":1967,"stub":true}}}},
{"id":"asyncEJS","key":"asyncEJS","value":{"rev":"3-28b1c94255381f23a4d4f52366255937"},"doc":{"_id":"asyncEJS","_rev":"3-28b1c94255381f23a4d4f52366255937","name":"asyncEJS","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"asyncEJS","version":"0.3.0","directories":{"lib":"./lib","examples":"./examples","test":"./test"},"main":"./lib/asyncEJS","dependencies":{},"devDependencies":{},"_id":"asyncEJS@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"dfeaeebcb701bc67c3f3e487ba6232b4f880d677","tarball":"http://registry.npmjs.org/asyncEJS/-/asyncEJS-0.3.0.tgz"},"scripts":{}}},"maintainers":[{"name":"sasadjolic","email":"sasa.djolic@gmail.com"}],"time":{"modified":"2011-06-15T02:36:38.817Z","created":"2011-06-15T02:36:38.273Z","0.3.0":"2011-06-15T02:36:38.817Z"},"_attachments":{"asyncEJS-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-frOdVUg+6WdBL64fMR01sQ==","length":5642,"stub":true}}}},
{"id":"asyncStorage","key":"asyncStorage","value":{"rev":"3-2dd1bace74f5c14769a0ac261e67dd95"},"doc":{"_id":"asyncStorage","_rev":"3-2dd1bace74f5c14769a0ac261e67dd95","name":"asyncStorage","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"asyncStorage","version":"0.1.0","main":"./build/asyncStorage.js","_npmUser":{"name":"WebReflection","email":"andrea.giammarchi@gmail.com"},"_id":"asyncStorage@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"c217ae8d276824134a747c0cbc441ac901717120","tarball":"http://registry.npmjs.org/asyncStorage/-/asyncStorage-0.1.0.tgz"},"maintainers":[{"name":"WebReflection","email":"andrea.giammarchi@gmail.com"}]}},"readme":"asyncStorage :: a developer friendly Asynchronous Storage\n=========================================================\nlet's face reality, the status of storages in the Web is a mess.\nlocalStorage is a synchronous API not suitable at all to store data.\nWebSQL has been abandoned, still the only option, as non experimental, in Safari, Chrome, and Opera.\nFirefox is trying to support IndexedDB which right now is the most messed up API ever: loads of inconsistencies across platforms, included different versions of Firefox itself.\nInternet Explorer 10, the one not even out yet, has insignificant market sharing 'till now.\nMy proposal to bring WebSQL back through Firefox extension has been banned, after approval, due potential securities issues ... so, what the hell we have to do in order to use a proper storage that is not ultra-complicated to understand, learn, and use?\n\nThe Problem with the WebStorage API\n-----------------------------------\n**localStorage** and **sessionStorage** have been around for quite a while and many developers are using these for any sort of task, including any sort of data stored in these synchronous storage without considering that:\n\n  * **your data is not safe**, the first script that will easily perform a `localStorage.clear()` in the page your script is, your whole logic will magically fuck up without any notification (also because the event \"storage\" is completely randomly implemented)\n  * **synchronous means blocking**, but we all agree that synchronous logic is easier to implement and maintain, right? ... well, unless you are not storing a few bytes once a while, you are making the browser potentially stuck ... just stop it, if you find this solution convenient\n  * **your data is limited**, from 2mb up to 5mb but most important, the WebStorage API does not provide any way to know how much data is still available\n  * **you are doing it wrong** ... and please don't judge me for this sentence, the problem is that 99% of online tutorials on `localStorage` are using direct property access, completely obtrusive for any sort of shimmable solution **you** would like to implement, plus 99% of the time these tutorials are not using a `try{}catch(e){}` statement around every single `localStorage.setItem(key, value)` call, which means your business logic is already broken\n\nA Solution Based On WebStorage API\n----------------------------------\nWhat if you have nothing new to learn, using exactly the same API the WebStorage offer, except how to handle callbacks?\nThis is what is this project about, a basically identical API borrowed directly from the Web Storage one, with a couple of extra arguments per each *asynchronous* method such *callback* and *errorback*, where both are even optional.\n\nThe Concept\n-----------\nFirst of all, the main purpose of this project is to use any asynchronous possibility available in the browser through a **key/value pairs** based interface where **both keys and values should be strings**.\nIt is not the purpose of this script to provide any *JSON* shim in your code, but of course as you have probably used *JSON* already to store data in a generic storage, you can do the same with this implementation, remembering to `JSON.stringify(yourDataObject)` before you store it.\nBack to the asynchronous concept, Where there is no possibility, the `localStorage` or even `document.cookie` is used as fallback so that even IE6 should work \"_without problems_\", whenever you decided to harakiri supporting latter browser.\nThe very first option, if available, is the **WebSQL** storage, the best thing ever destroyed by *W3C*, the most cross platform, for both Desktop and Mobile, storage possibility.\n**IndexedDB** would be the other option where WebSQL is not available. This order might change in the future preferring IndexedDB as first option.\nAll others will fallback into *localStorage* or *document.cookie* and I am not discarding at all the possibility to use a *SharedObject* from the Flash Player world ... but, you know, I have abandoned Flash Player about 6 years ago and if I can make it without it, now that would be cool!\nWhat else? Oh well, it's easy!\n\nSo you made the localStorage asynchronous? Tell me how easier it is ...\n-----------------------------------------------------------------------\n\n    asyncStorage.create(\"myDBName\", function (db, numberOfEntries) {\n        // database created, time to rock'n'roll!\n        var callback = function (value, key) {\n            if (value === \"true\") {\n                // do amazing stuff for the very first time\n            }\n            // do whatever you want to\n        };\n        // check how many values you have stored so far\n        if (numberOfEntries === 0) {\n            // add some default entry\n            db.setItem(\"neverLoaded\", \"true\", callback);\n        } else {\n            db.setItem(\"neverLoaded\", \"false\", callback);\n        }\n    });\n\nAbove is just an example of _easiness_ provided by this asynchronousStorage but here few main pros:\n\n  * **unobtrusive**, you chose your own database name as you would do for any of your _libraries or namespaces_ . This simply means something like `localStorage.clear()`, performed by another library, will not erase your whole data. `db.clear()` aim is to clean only data **you** stored and nobody else.\n  * **asynchronous**, since almost every method is made with async in mind. The only two things that are not asynchronous are `db.length` and, since length is synchronous, `db.key(index)` to retrieve the `key` associated to that index.\n  * **nothing new to learn** which is the most annoying part of all these _not fully defined yet_ options we have today in the Web scenario\n\nAsynchronousStorage API\n-----------------------\n  * `create(name, callback)` creates a new database with specific name in order to, somehow, simulate namespaces in the storage itself. `callback(db, numberOfEntries)` will be fired once the database has been created.\n  * `create(name, callback, errorback)` does the same, except you might want to handle potential errors during database creation (user denied, not enough space, etc).\n  * `create(name, callback, errorback, size)` does the same, except you might want to specify in advance the size of the database. This overload works as expected with WebSQL only.\n  * `db.setItem(key, value[, callback[, errorback]])` set an item in the storage and calls `callback(value, key, db)` once the operation is completed. The `errorback` is called if something went wrong during this operation.\n  * `db.getItem(key[, callback[, errorback]])` retrieves a value from the storage, `callback(value, key, db)` is called once the operation is completed where the `value` is exactly `null` wherever `key` was not set before\n  * `db.removeItem(key[, callback[, errorback]])` remove an item from the storage, calls `callback(key, db)` once succeeded\n  * `db.clear([callback[, errorback]])` remove all keys associated to your **database name**, the one used to create the storage at the very beginning. `callback(db, numberOfEntries)` will be triggered once the operation has been completed, same signature of the storage creation for functions reusability.\n  * `db.key(index)` returns **synchronously** the associated key for that index. This is necessary to make easier for developers loops over all keys as they do already with the localStorage, i.e.\n\n        function isItLastOne() {\n            if (!--i) {\n                doAgainAllStuff();\n            }\n        }\n        for (var i = 0; i < db.length; i++) {\n            db.removeItem(db.key(i), isItLastOne);\n        }\n\n  * `db.length` returns the length of all stored keys **in your database name**\n  * `db.name` returns the name you chose for this storage instance\n  * `db.type` returns the type of the database you are using such _WebSQL_, _IndexedDB_ (not yet), _localStorage_, and _cookie_\n\nAnd this is pretty much it ... wanna test? [this page should be green](http://www.3site.eu/db/test/ \"test\")\n\nTODOs\n-----\n  * improve tests to test errorbacks too\n  * optionally, consider a fifth fallback through Flash Player shared object (*meh...!*)","maintainers":[{"name":"WebReflection","email":"andrea.giammarchi@gmail.com"}],"time":{"modified":"2012-06-08T14:15:54.989Z","created":"2012-06-08T14:15:51.905Z","0.1.0":"2012-06-08T14:15:54.989Z"},"_attachments":{"asyncStorage-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hVdokWDhZsyjDdKuQK23HQ==","length":831115,"stub":true}}}},
{"id":"async_testing","key":"async_testing","value":{"rev":"14-0275d8b608d8644dfe8d68a81fa07e98"},"doc":{"_id":"async_testing","_rev":"14-0275d8b608d8644dfe8d68a81fa07e98","name":"async_testing","description":"A simple Node testing library.","dist-tags":{"latest":"0.3.2"},"versions":{"0.2.0":{"name":"async_testing","description":"A simple Node testing library.","version":"0.2.0","author":{"name":"Benjamin Thomas"},"main":"./index","directories":{"lib":"./lib"},"bin":{"node-async-test":"./bin/node-async-test.js"},"repository":{"type":"git","url":"http://github.com/bentomas/node-async-testing.git"},"bugs":{"web":"http://github.com/bentomas/node-async-testing/issues"},"licenses":[{"type":"MIT","url":"http://github.com/bentomas/node-async-testing/blob/master/LICENSE"}],"_id":"async_testing@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async_testing/-/async_testing-0.2.0.tgz"},"mtime":"2010-11-09T23:16:27Z","ctime":"2010-11-09T23:16:27Z"},"0.2.1":{"name":"async_testing","description":"A simple Node testing library.","version":"0.2.1","author":{"name":"Benjamin Thomas"},"main":"./index","directories":{"lib":"./lib"},"bin":{"node-async-test":"./bin/node-async-test.js"},"repository":{"type":"git","url":"http://github.com/bentomas/node-async-testing.git"},"bugs":{"web":"http://github.com/bentomas/node-async-testing/issues"},"licenses":[{"type":"MIT","url":"http://github.com/bentomas/node-async-testing/blob/master/LICENSE"}],"_id":"async_testing@0.2.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async_testing/-/async_testing-0.2.1.tgz"},"mtime":"2010-11-09T23:16:27Z","ctime":"2010-11-09T23:16:27Z"},"0.3.0":{"name":"async_testing","description":"A simple Node testing library.","version":"0.3.0","author":{"name":"Benjamin Thomas"},"main":"./index","directories":{"lib":"./lib"},"bin":{"node-async-test":"./bin/node-async-test.js"},"repository":{"type":"git","url":"http://github.com/bentomas/node-async-testing.git"},"bugs":{"web":"http://github.com/bentomas/node-async-testing/issues"},"licenses":[{"type":"MIT","url":"http://github.com/bentomas/node-async-testing/blob/master/LICENSE"}],"dependencies":{"socket.io":"0.5.3","webworker":"0.8.2"},"_id":"async_testing@0.3.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async_testing/-/async_testing-0.3.0.tgz"},"mtime":"2010-11-09T23:16:27Z","ctime":"2010-11-09T23:16:27Z"},"0.3.1":{"name":"async_testing","description":"A simple Node testing library.","version":"0.3.1","author":{"name":"Benjamin Thomas"},"main":"./index","directories":{"lib":"./lib"},"bin":{"node-async-test":"./bin/node-async-test.js"},"repository":{"type":"git","url":"http://github.com/bentomas/node-async-testing.git"},"bugs":{"web":"http://github.com/bentomas/node-async-testing/issues"},"licenses":[{"type":"MIT","url":"http://github.com/bentomas/node-async-testing/blob/master/LICENSE"}],"dependencies":{"socket.io":"0.5.3","webworker":"0.8.2"},"_id":"async_testing@0.3.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async_testing/-/async_testing-0.3.1.tgz"},"mtime":"2010-11-09T23:16:28Z","ctime":"2010-11-09T23:16:28Z"},"0.3.2":{"name":"async_testing","description":"A simple Node testing library.","version":"0.3.2","author":{"name":"Benjamin Thomas"},"main":"./index","directories":{"lib":"./lib"},"bin":{"node-async-test":"./bin/node-async-test.js"},"repository":{"type":"git","url":"http://github.com/bentomas/node-async-testing.git"},"bugs":{"web":"http://github.com/bentomas/node-async-testing/issues"},"licenses":[{"type":"MIT","url":"http://github.com/bentomas/node-async-testing/blob/master/LICENSE"}],"dependencies":{},"_id":"async_testing@0.3.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/async_testing/-/async_testing-0.3.2.tgz"},"mtime":"2010-11-09T23:16:29Z","ctime":"2010-11-09T23:16:29Z"}},"maintainers":[{"name":"bentomas","email":"benjamin@benjaminthomas.org"}],"mtime":"2010-11-09T23:16:29Z","ctime":"2010-11-09T23:16:27Z","author":{"name":"Benjamin Thomas"},"repository":{"type":"git","url":"http://github.com/bentomas/node-async-testing.git"},"_attachments":{"async_testing-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-lVFowsnH4PXu40tEgjVOZg==","length":670061,"stub":true},"async_testing-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-PWgbB2abxeWBl6EelUKFMA==","length":217655,"stub":true},"async_testing-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-wV1TxGSR704jDUPXlE1Vtg==","length":221622,"stub":true},"async_testing-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8137d3NTgfp814pdnbdvHA==","length":17808,"stub":true},"async_testing-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GAm6hhDDzCnRx0oP0xAZZA==","length":23389,"stub":true}}}},
{"id":"asyncarray","key":"asyncarray","value":{"rev":"3-77c1ea3286c6891ada802c0efe561c61"},"doc":{"_id":"asyncarray","_rev":"3-77c1ea3286c6891ada802c0efe561c61","name":"asyncarray","description":"A control-flow library that mimics the semantics of JS arrays, with extras","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"asyncarray","version":"0.0.0","description":"A control-flow library that mimics the semantics of JS arrays, with extras","main":"index.js","repository":{"type":"git","url":"https://github.com/fb55/asyncarray"},"keywords":["array","controllflow","async"],"author":{"name":"Felix Boehm","email":"me@feedic.com"},"_id":"asyncarray@0.0.0","dist":{"shasum":"937c41e22a2775f590a9d097c8634ef71374ad43","tarball":"http://registry.npmjs.org/asyncarray/-/asyncarray-0.0.0.tgz"},"maintainers":[{"name":"feedic","email":"me@feedic.com"}]}},"readme":"#AsyncArray\n\nA control-flow library that mimics the semantics of JS arrays, plus adds a chainable API and some extra methods.\n\n##Install\n\n    npm install asyncarray\n\n##API\n\n###Require\n\n```js\nvar AsyncArray = require(\"asyncarray\");\n```\n\n###Constructor\n\n```js\nnew AsyncArray(…elems);\n```\n\n###Methods\n\n* `forEach(<func(elem, index)>)`: Calls `func` with every element of the array. Returns `this`.\n* `map(<func(elem, index, <cb(err, data)>)>)`: Calls `func` with every element of the array and uses data passed to the callback for all following methods.\n* `filter(<func>)`\n* `some(<func test>, <func cb>)`\n* `every(<func test>, <func cb>)`\n* `pluck(field)`\n* `order()`\n* `flatten()`\n* `flattenDeep()`\n* `toArray(<cb>)`\n\n___//TODO add descriptions___","maintainers":[{"name":"feedic","email":"me@feedic.com"}],"time":{"modified":"2012-06-28T14:58:24.737Z","created":"2012-06-28T14:58:20.465Z","0.0.0":"2012-06-28T14:58:24.737Z"},"author":{"name":"Felix Boehm","email":"me@feedic.com"},"repository":{"type":"git","url":"https://github.com/fb55/asyncarray"},"_attachments":{"asyncarray-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-So1Mucue611WwFkk00XwPA==","length":1984,"stub":true}}}},
{"id":"asyncblock","key":"asyncblock","value":{"rev":"148-ae09835e883ec087d4678d7b2064cb3e"},"doc":{"_id":"asyncblock","_rev":"148-ae09835e883ec087d4678d7b2064cb3e","name":"asyncblock","description":"A simple and powerful abstraction of node-fibers","dist-tags":{"latest":"2.1.3"},"versions":{"0.0.3":{"name":"asyncblock","version":"0.0.3","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"greenlight","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"98d434f0f6e8dcf7e2ed1d6a4557a62734ffd713","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.0.3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.0.4":{"name":"asyncblock","version":"0.0.4","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"greenlight","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"7c89a25a7a18b42f6573d6ed1ee3117f4f1e5cc7","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.0.4.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.0.5":{"name":"asyncblock","version":"0.0.5","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"greenlight","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"12223b89bca0fe67bb4ca25973a4006b30f008ae","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.0.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.0.6":{"name":"asyncblock","version":"0.0.6","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"greenlight","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"607f87c6b90cc2aae7668a46878653770ef9183f","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.0.6.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.0.7":{"name":"asyncblock","version":"0.0.7","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"greenlight","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"07a2564f14ab5f9dfd4866e575cf13875332b893","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.0.7.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.4.0":{"name":"asyncblock","version":"0.4.0","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"greenlight","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.4.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"43cae60f2e17fa2af0c7f4924b5b737d3dcca228","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.4.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.5.0":{"name":"asyncblock","version":"0.5.0","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.5.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"68cb7c19bd840814ac87b71e71b882f95f9159eb","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.5.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.5.1":{"name":"asyncblock","version":"0.5.1","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.5.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c18116778b8f10c8a106b7da5ffe0b14b5705395","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.5.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.5.2":{"name":"asyncblock","version":"0.5.2","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.5.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ec6389fc8215b008c25be32081c3b0132fce5c90","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.5.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.6.0":{"name":"asyncblock","version":"0.6.0","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f0db3bd94ff1d54479924eccef4b6306981bca5d","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.6.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.6.1":{"name":"asyncblock","version":"0.6.1","description":"A fork of greenlight with parallel execution support","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"e5c5076c85165561a9c995f54305d3ed7d0b25ff","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.6.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.7.0":{"name":"asyncblock","version":"0.7.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.7.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"f621cbe16349c3bfc4438110e3565900769ba7fd","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.7.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.7.1":{"name":"asyncblock","version":"0.7.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.7.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c94a8d7f3f86bd72256df5ad99835450b103870c","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.7.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.7.5":{"name":"asyncblock","version":"0.7.5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.7.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"56eb7019510a14b3dd1cecd55dda49e024c5a67d","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.7.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.8.0":{"name":"asyncblock","version":"0.8.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.8.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4b41b6bbd41d827af58f494a7108b3ce6d37ec0e","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.8.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.9.0":{"name":"asyncblock","version":"0.9.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.9.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"429d2cc744954734227d979cc59192b1c0e08b42","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.9.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.9.1":{"name":"asyncblock","version":"0.9.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.9.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f8447d86918555117c45cdbf332164be55d35607","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.9.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.9.2":{"name":"asyncblock","version":"0.9.2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.9.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7563d43b4d32aebcfd0bdd423023b58c5cde84a9","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.9.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"0.9.3":{"name":"asyncblock","version":"0.9.3","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@0.9.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ded2d9db5462c2f77867d7c863b1966ed8dbcedf","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-0.9.3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"1.0.0":{"name":"asyncblock","version":"1.0.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"935d822472b036ff4c66711199b10e2d789868fc","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.0.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"1.1.0":{"name":"asyncblock","version":"1.1.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"428593ceb14d410ae0ff69e3ecaec87fae1cd922","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.1.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"1.2.0":{"name":"asyncblock","version":"1.2.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"26efdcd00ba90958ce4085a3edc00d67dfd9508f","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.2.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"1.2.1":{"name":"asyncblock","version":"1.2.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"cda0d30107886d808e4d9979a7811bbdc88bd95c","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.2.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"directories":{}},"1.2.2":{"name":"asyncblock","version":"1.2.2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.x"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2cc19c685d69339479086bf57ef4c5330f638983","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.2.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.2.3":{"name":"asyncblock","version":"1.2.3","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"795b8997a0f5c499f3f1894649d7adbb0159999f","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.2.3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.3.0":{"name":"asyncblock","version":"1.3.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"38d1d1c2f4b8afb4bd8a3cc7987f8c941ce66573","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.3.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.3.1":{"name":"asyncblock","version":"1.3.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1d29384f1d6c83f230de7ef9ba11cd0feb187cc9","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.3.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.4.0":{"name":"asyncblock","version":"1.4.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e6728047df2b2a30726f244f21a82a5120b26c44","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.4.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.4.5":{"name":"asyncblock","version":"1.4.5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.4.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f2bd38d67f5300d43e0b4ec7c9379ddbf88ed600","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.4.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.5.0":{"name":"asyncblock","version":"1.5.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"11546ea6259c7c1096b1d469f3d665c50ec9cd61","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.5.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.5.5":{"name":"asyncblock","version":"1.5.5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.5.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0615d5463e01c359cfae143736c3028ac088f4ab","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.5.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.5.6":{"name":"asyncblock","version":"1.5.6","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.5.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6f2cf87432205eb1813db43971557975b628e54a","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.5.6.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.6.0":{"name":"asyncblock","version":"1.6.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b0d3cc0aad5dbb8c478b1a18513f013a86d81ba9","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.6.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.6.1":{"name":"asyncblock","version":"1.6.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"38f572c8584a50eecbe1ad3d6db33b52d9c9085c","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.6.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.6.2":{"name":"asyncblock","version":"1.6.2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.6.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2233e3b75de330df1fc341688b1781dd614a4c76","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.6.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.6.5":{"name":"asyncblock","version":"1.6.5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.6.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1e9de96e3fe10dee540264efd8a3f480030aff11","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.6.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.6.6":{"name":"asyncblock","version":"1.6.6","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.6.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c3479988869de9a140835459d670ba5cb79447ee","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.6.6.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.7.0":{"name":"asyncblock","version":"1.7.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.7.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"fb6674f1c13923f6f2ee1aa34911a0e472efe534","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.7.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.8.0":{"name":"asyncblock","version":"1.8.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.8.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2a7a8d3b14bab2dbd4771ce016d859c78d06ca4f","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.8.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.0":{"name":"asyncblock","version":"1.9.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"838edf752ab7633776c2552cb5f16e05a5cad683","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.1":{"name":"asyncblock","version":"1.9.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bf79eaccb45b09c1355a5c85b3dff20902c9d0fb","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.2":{"name":"asyncblock","version":"1.9.2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d78a9efe925aeeebfc12ccb6d01d8f85d24f9d2b","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.3":{"name":"asyncblock","version":"1.9.3","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js":"1.2.5","traverse":"0.5.2"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"6f5d1f29e581b0ea3620ed3129072cff3ae7c8da","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.4":{"name":"asyncblock","version":"1.9.4","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/multiline","traverse":"0.5.2"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"629836da01507f0150444e0c29e5ac4bd57b21ab","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.4.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.5":{"name":"asyncblock","version":"1.9.5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/multiline","traverse":"0.5.2"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.5","bundleDependencies":["uglify-js_scriby"],"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"8bd252f68eccb2e44b93883254b5ea7d39c0ecad","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.6":{"name":"asyncblock","version":"1.9.6","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/multiline"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.6","bundleDependencies":["uglify-js_scriby"],"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"1ed564379d63af5e01a43d8b9d6fa1f68e6f9e78","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.6.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7":{"name":"asyncblock","version":"1.9.7","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4e78eedd3db06603c952c6582342a09a3e359cb9","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-1":{"name":"asyncblock","version":"1.9.7-1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-2"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"95cb2397aeedc6fec973ebce46dcc9377e0aa379","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-2":{"name":"asyncblock","version":"1.9.7-2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-2"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"cb99df3a305ba182bdba88788a87d20abb917250","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-3":{"name":"asyncblock","version":"1.9.7-3","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-3"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"c32207c473e27415dfe71249fb62a887efc29ce8","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-4":{"name":"asyncblock","version":"1.9.7-4","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.5.2-3"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"5405f3bb2f0fdf2be1c782df726d2f79257336c8","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-4.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-5":{"name":"asyncblock","version":"1.9.7-5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.5.2-3"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"fc3b4160c729016b1bbf0f4920a6b8e3095d097a","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-6":{"name":"asyncblock","version":"1.9.7-6","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.5.2-4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"e602e364a8b207191cce2110dd663181a59b4c1d","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-6.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-7":{"name":"asyncblock","version":"1.9.7-7","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-4"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"096dd3492d3dcc6e4c3440c48b63fbb2473a58c8","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-7.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-8":{"name":"asyncblock","version":"1.9.7-8","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-5"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-8","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"e1f51edc8bf969546cf1b69006a43f560aeeefdd","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-8.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.7-9":{"name":"asyncblock","version":"1.9.7-9","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-5"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.7-9","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"95e2fa12c003880afec66bc1456aec3b827fa429","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.7-9.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"1.9.8":{"name":"asyncblock","version":"1.9.8","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-5"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@1.9.8","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"502b1d3396b804013f5895de2a42e40e8569cfbd","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-1.9.8.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.0":{"name":"asyncblock","version":"2.0.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-5"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"1b15d6e463311a22b07694780ec6c7ea27d80a32","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.1":{"name":"asyncblock","version":"2.0.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-5"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8810f68d19e794d37b929ef8c2ed3c483800f3a1","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.2":{"name":"asyncblock","version":"2.0.2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-5"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"89a107efbdadd114444c0a57e69d0df85fa3b01e","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.3":{"name":"asyncblock","version":"2.0.3","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"9a3796df771156ce6cbfec9ebe18517ed24b5f4b","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.4":{"name":"asyncblock","version":"2.0.4","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4649dd231d5c63f6d746a7f3c3ec4a80c187bb38","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.4.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.5":{"name":"asyncblock","version":"2.0.5","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"acb9e61ac908cac3354efccc6a253aa643ee3964","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.5.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.6":{"name":"asyncblock","version":"2.0.6","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.4","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"68191fdb05ce32d2890907bae7c8bcdda1f93006","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.6.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.7":{"name":"asyncblock","version":"2.0.7","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.5","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"d2a53d746f166ede9a3ef55d96f1e25861b8e5e6","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.7.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.8":{"name":"asyncblock","version":"2.0.8","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.7","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.8","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"555bce48ae26a7a97a4cef1f5574e2ecf5543f1a","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.8.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.0.9":{"name":"asyncblock","version":"2.0.9","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.7","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.0.9","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8ada11d86576feec02372d4d0b7af819d45f5e65","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.0.9.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.1.0":{"name":"asyncblock","version":"2.1.0","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.8","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"40314013ec1e17cc1f958d1e6cf97a3d215b5051","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.1.0.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.1.1":{"name":"asyncblock","version":"2.1.1","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.8","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"c39816f8f29a5a96251539e2cd2c2f632302d503","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.1.1.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.1.2":{"name":"asyncblock","version":"2.1.2","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.8","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7e4cfbfda3fb6a930c1a887d9b16135f532043b9","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.1.2.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]},"2.1.3":{"name":"asyncblock","version":"2.1.3","description":"A simple and powerful abstraction of node-fibers","keywords":["fiber","fibers","coroutine","stop","go","green","red"],"homepage":"https://github.com/scriby/asyncblock","author":{"name":"Chris Scribner"},"main":"asyncblock","repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"dependencies":{"fibers":"0.6.8","uglify-js_scriby":"https://github.com/scriby/UglifyJS/tarball/1.2.5-6"},"devDependencies":{"vows":"0.6.0","jshint":"0.5.9"},"_npmUser":{"name":"scriby","email":"scriby@gmail.com"},"_id":"asyncblock@2.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2587755b7409c2f5cb3a57be156f883fe2a6d090","tarball":"http://registry.npmjs.org/asyncblock/-/asyncblock-2.1.3.tgz"},"maintainers":[{"name":"scriby","email":"scriby@gmail.com"}]}},"readme":"```\n                                        ______  ______              ______  \n______ ______________  _________ __________  /_ ___  /______ __________  /__\n_  __ `/__  ___/__  / / /__  __ \\_  ___/__  __ \\__  / _  __ \\_  ___/__  //_/\n/ /_/ / _(__  ) _  /_/ / _  / / // /__  _  /_/ /_  /  / /_/ // /__  _  ,<   \n\\__,_/  /____/  _\\__, /  /_/ /_/ \\___/  /_.___/ /_/   \\____/ \\___/  /_/|_|  \n                /____/                                                      \n\n```\n\n\n==================================================================\n\nA fork of [node-green-light](https://github.com/axkibe/node-green-light) with parallel execution support.\n\nA sample program in pure node, using the async library, and using asyncblock + fibers.\n\n### Pure node\n\n```javascript\n\nfunction example(callback){\n    var finishedCount = 0;\n    var fileContents = [];\n\n    var continuation = function(){\n        if(finishedCount < 2){\n            return;\n        }\n\n        fs.writeFile('path3', fileContents[0], function(err) {\n            if(err) {\n                throw new Error(err);\n            }\n\n            fs.readFile('path3', 'utf8', function(err, data){ \n                console.log(data);\n                console.log('all done');\n            });\n        });\n    };\n\n    fs.readFile('path1', 'utf8', function(err, data) {\n        if(err) {\n            throw new Error(err);\n        }\n\n        fnishedCount++;\n        fileContents[0] = data;\n\n        continuation();\n    });\n\n    fs.readFile('path2', 'utf8', function(err, data) {\n        if(err) {\n            throw new Error(err);\n        }\n\n        fnishedCount++;\n        fileContents[1] = data;\n\n        continuation();\n    });\n}\n```\n\n### Using async\n\n```javascript\n\nvar async = require('async');\n\nvar fileContents = [];\n\nasync.series([\n    function(callback){\n        async.parallel([\n            function(callback) {\n                fs.readFile('path1', 'utf8', callback);\n            },\n\n            function(callback) {\n                fs.readFile('path2', 'utf8', callback);\n            }\n        ],\n            function(err, results){\n                fileContents = results;                                    \n                callback(err);\n            }\n        );\n    },\n\n    function(callback) {\n        fs.writeFile('path3', fileContents[0], callback);\n    },\n\n    function(callback) {\n        fs.readFile('path3', 'utf8', function(err, data){\n            console.log(data);\n            callback(err);\n        });\n    }\n],\n    function(err) {\n        if(err) {\n            throw new Error(err);\n        }\n        \n        console.log('all done');\n    }\n);\n```\n\n### Using asyncblock + fibers\n\n```javascript\n\nvar asyncblock = require('asyncblock');\n\nasyncblock(function(flow){\n    fs.readFile('path1', 'utf8', flow.add('first'));\n    fs.readFile('path2', 'utf8', flow.add('second'));\n\n    var fileContents = flow.wait();\n    \n    fs.writeFile('path3', fileContents.first, flow.add());\n    flow.wait();\n\n    fs.readFile('path3', 'utf8', flow.add());\n    var data = flow.wait();\n\n    console.log(data);\n    console.log('all done');\n});\n```\n\n## Notes\n\n### flow.add and flow.wait\n\nPass the result of flow.add() as a callback to asynchronous functions. Each usage of flow.add() will run in parallel.\nCall flow.wait() when you want execution to pause until all the asynchronous functions are done.\n\nYou may pass a key to flow.add, which will be used when getting the result from flow.wait. For example, calling\nflow.add('key1') and flow.add('key2') would produce a result { key1: value1, key2: value2 }. It is not necessary to\npass a key to flow.add if you do not need to get the result.\n\nIf there is only one call to flow.add and no key is passed, the result will be returned as is without the object wrapper.\n\nIf any of the asynchronous callbacks pass an error as the first argument, it will be thrown as an exception by asyncblock.\nYou only receive from the 2nd arg on from the flow.wait call. If more than one parameter was passed to the callback,\nit will be returned as an array.","maintainers":[{"name":"scriby","email":"scriby@gmail.com"}],"time":{"modified":"2012-08-02T13:44:02.824Z","created":"2011-12-05T14:52:26.899Z","0.0.3":"2011-12-05T14:52:27.458Z","0.0.4":"2011-12-07T20:08:33.313Z","0.0.5":"2011-12-08T23:09:20.325Z","0.0.6":"2011-12-09T14:11:23.424Z","0.0.7":"2011-12-09T17:00:01.011Z","0.4.0":"2011-12-14T16:19:36.794Z","0.5.0":"2011-12-19T16:49:20.430Z","0.5.1":"2011-12-19T17:03:07.546Z","0.5.2":"2011-12-20T00:28:46.133Z","0.6.0":"2011-12-20T17:46:33.174Z","0.6.1":"2011-12-22T03:09:16.765Z","0.7.0":"2011-12-23T18:05:13.327Z","0.7.1":"2011-12-24T02:46:07.134Z","0.7.5":"2011-12-24T15:42:45.259Z","0.8.0":"2011-12-26T17:52:04.867Z","0.9.0":"2011-12-26T19:47:05.176Z","0.9.1":"2011-12-26T20:13:41.238Z","0.9.2":"2011-12-26T20:30:09.740Z","0.9.3":"2011-12-27T22:11:34.048Z","1.0.0":"2012-01-01T01:33:50.791Z","1.1.0":"2012-01-01T21:43:39.976Z","1.2.0":"2012-01-02T18:07:20.710Z","1.2.2":"2012-01-04T18:50:44.476Z","1.2.1":"2012-01-03T14:56:41.979Z","1.2.3":"2012-01-05T14:54:03.136Z","1.3.0":"2012-01-06T18:57:35.472Z","1.3.1":"2012-01-07T01:02:04.561Z","1.4.0":"2012-01-08T03:46:40.139Z","1.4.5":"2012-01-08T23:44:57.751Z","1.5.0":"2012-01-10T02:02:19.115Z","1.5.5":"2012-01-11T01:21:56.634Z","1.5.6":"2012-01-11T02:39:55.791Z","1.6.0":"2012-01-11T03:21:56.174Z","1.6.1":"2012-01-11T17:21:53.287Z","1.6.2":"2012-01-11T20:52:22.952Z","1.6.5":"2012-01-12T01:30:16.556Z","1.6.6":"2012-01-12T15:03:39.875Z","1.7.0":"2012-01-14T20:35:08.426Z","1.8.0":"2012-01-15T04:13:53.108Z","1.9.0":"2012-01-19T04:45:35.352Z","1.9.1":"2012-02-01T23:13:01.048Z","1.9.2":"2012-02-01T23:48:20.179Z","1.9.3":"2012-02-06T17:41:18.107Z","1.9.4":"2012-02-07T05:03:57.856Z","1.9.5":"2012-02-08T03:49:19.190Z","1.9.6":"2012-02-08T16:27:07.348Z","1.9.7":"2012-02-09T23:38:57.062Z","1.9.7-1":"2012-02-09T23:49:24.656Z","1.9.7-2":"2012-02-09T23:52:45.190Z","1.9.7-3":"2012-02-10T04:11:55.907Z","1.9.7-4":"2012-02-10T04:19:01.414Z","1.9.7-5":"2012-02-10T05:00:36.526Z","1.9.7-6":"2012-02-10T22:54:27.046Z","1.9.7-7":"2012-02-10T22:58:40.039Z","1.9.7-8":"2012-02-12T03:27:50.726Z","1.9.7-9":"2012-02-13T03:00:23.556Z","1.9.8":"2012-02-13T03:12:51.909Z","2.0.0":"2012-02-14T04:20:43.341Z","2.0.1":"2012-02-16T14:55:01.490Z","2.0.2":"2012-02-26T21:48:41.897Z","2.0.3":"2012-02-27T23:04:03.814Z","2.0.4":"2012-03-04T18:39:45.937Z","2.0.5":"2012-03-05T01:26:35.854Z","2.0.6":"2012-03-14T03:10:58.592Z","2.0.7":"2012-03-20T03:00:34.695Z","2.0.8":"2012-05-10T01:07:09.766Z","2.0.9":"2012-05-13T02:06:25.934Z","2.1.0":"2012-07-09T17:40:48.037Z","2.1.1":"2012-07-28T20:06:20.519Z","2.1.2":"2012-07-28T20:34:58.737Z","2.1.3":"2012-07-28T20:55:48.971Z"},"author":{"name":"Chris Scribner"},"repository":{"type":"git","url":"git://github.com/scriby/asyncblock.git"},"users":{"fgribreau":true},"_attachments":{"asyncblock-2.1.3.tgz":{"content_type":"application/octet-stream","revpos":147,"digest":"md5-2MTmoyJw4SIafceOTWsLtQ==","length":163322,"stub":true},"asyncblock-2.1.2.tgz":{"content_type":"application/octet-stream","revpos":145,"digest":"md5-644xxEZaRWqNtnPqAWkqFw==","length":163182,"stub":true},"asyncblock-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":143,"digest":"md5-klc3B8e52IPitqOQA6S2cA==","length":163133,"stub":true},"asyncblock-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":141,"digest":"md5-nX2qVFmNEDbShJSNXSPEFA==","length":360204,"stub":true},"asyncblock-2.0.9.tgz":{"content_type":"application/octet-stream","revpos":139,"digest":"md5-M6BmTLmJrJjWWn2iLXYT+w==","length":162985,"stub":true},"asyncblock-2.0.8.tgz":{"content_type":"application/octet-stream","revpos":137,"digest":"md5-5/n67F+pi+NhkOAeHkt6Qg==","length":2721326,"stub":true},"asyncblock-2.0.7.tgz":{"content_type":"application/octet-stream","revpos":135,"digest":"md5-zFYo3tay3fm+67zq0VSASA==","length":2720823,"stub":true},"asyncblock-2.0.6.tgz":{"content_type":"application/octet-stream","revpos":133,"digest":"md5-Hj4PatyhcnLPZaHYMgtgCw==","length":2721007,"stub":true},"asyncblock-2.0.5.tgz":{"content_type":"application/octet-stream","revpos":131,"digest":"md5-DS+obTNceVNEaPzi54Cj9A==","length":2719993,"stub":true},"asyncblock-2.0.4.tgz":{"content_type":"application/octet-stream","revpos":129,"digest":"md5-DfuS+sEPLFx5r5H6pcTWPQ==","length":502266,"stub":true},"asyncblock-2.0.3.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-FxwvAtEKNzL3pYeQy7uHtw==","length":504645,"stub":true},"asyncblock-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":125,"digest":"md5-t6N+S1UR0BsDWuH2mDmgJQ==","length":501932,"stub":true},"asyncblock-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":123,"digest":"md5-ExtkyVzu/4letAzP9i1/Fw==","length":357392,"stub":true},"asyncblock-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":121,"digest":"md5-9CGly9ytjUP7ZfKQG4IcuQ==","length":103164,"stub":true},"asyncblock-1.9.8.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-Rj0y5i4QnUhOgXFktH+ZLQ==","length":103937,"stub":true},"asyncblock-1.9.7-9.tgz":{"content_type":"application/octet-stream","revpos":117,"digest":"md5-BnBUtw4ruB18v9VoIK8a1g==","length":102090,"stub":true},"asyncblock-1.9.7-8.tgz":{"content_type":"application/octet-stream","revpos":115,"digest":"md5-ItiXOxTw4o+unnnWyJAuSw==","length":313565,"stub":true},"asyncblock-1.9.7-7.tgz":{"content_type":"application/octet-stream","revpos":113,"digest":"md5-qCXQBlT5oiN05Pd+346bHg==","length":43278,"stub":true},"asyncblock-1.9.7-6.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-auYbnwK4VSeG53hzvl2+CQ==","length":43275,"stub":true},"asyncblock-1.9.7-5.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-M6tfecL7Tj9ju9Maltv0VQ==","length":42314,"stub":true},"asyncblock-1.9.7-4.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-rRoqUPjFNp6JCJfCY8X08g==","length":41758,"stub":true},"asyncblock-1.9.7-3.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-Ld8A0Zo2dvVCBUHbqoyXqA==","length":42929,"stub":true},"asyncblock-1.9.7-2.tgz":{"content_type":"application/octet-stream","revpos":103,"digest":"md5-9FRd1IFvd62/+yJ/MN+bjg==","length":41098,"stub":true},"asyncblock-1.9.7-1.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-+/EC45DgY8D7ego+Zpb5JA==","length":41096,"stub":true},"asyncblock-1.9.7.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-GWxzZW1eTbmcjTczIaf1wQ==","length":41229,"stub":true},"asyncblock-1.9.6.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-+jUUVake1A7y68RKA6s4Yw==","length":420957,"stub":true},"asyncblock-1.9.5.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-UFJDJbB/4grAl7NNuN/pWw==","length":2781109,"stub":true},"asyncblock-1.9.4.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-BbNL5iOHzjgYz/omZBTKog==","length":117304,"stub":true},"asyncblock-1.9.3.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-qo/puC5Ddx7IpATQ8+YgXw==","length":46979,"stub":true},"asyncblock-1.9.2.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-6Kj6/4sNs/h7sen/s6xBJQ==","length":42834,"stub":true},"asyncblock-1.9.1.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-T2zGzYSYpTGF3yPC1OhlXg==","length":42716,"stub":true},"asyncblock-1.9.0.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-XycqgO+tVER5o/cFXYZnHg==","length":112833,"stub":true},"asyncblock-1.8.0.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-RvmtzzL7okuurqIfh/sevA==","length":110396,"stub":true},"asyncblock-1.7.0.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-VNjQeiaH147v0v4pP2OI+g==","length":109395,"stub":true},"asyncblock-1.6.6.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-6E2j43GebE6EdeFofpIq1w==","length":36065,"stub":true},"asyncblock-1.6.5.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-QhoTX9+7MU5lfKR2nPQvgw==","length":108276,"stub":true},"asyncblock-1.6.2.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-yulRutxYWkV63OXswTz2Xw==","length":35149,"stub":true},"asyncblock-1.6.1.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-Bi0UrdkfwW/TDdMWvbacgQ==","length":36584,"stub":true},"asyncblock-1.6.0.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-hi9ntZlqFwpYHqFusognEg==","length":77542,"stub":true},"asyncblock-1.5.6.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-9bCOpJJltvi/uk0ayb5VMQ==","length":77187,"stub":true},"asyncblock-1.5.5.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-dID1ekJNnU6o3dE+4MFPww==","length":75010,"stub":true},"asyncblock-1.5.0.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-sMbeGWGjmWAfz5CJ0NgOEQ==","length":70999,"stub":true},"asyncblock-1.4.5.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-CQPkb1jqyVN+jMriTA35Rw==","length":70572,"stub":true},"asyncblock-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-k+oajrtXOtCxo7PWVgh9Ww==","length":69218,"stub":true},"asyncblock-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-g90HUH8mt1nDoSdgpXryFw==","length":26450,"stub":true},"asyncblock-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-kZPVSmwB74LkuRCELBt1Bw==","length":26071,"stub":true},"asyncblock-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-408Y5+L60wDhCg2la8rB6A==","length":25713,"stub":true},"asyncblock-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-D8brMygo6KK02GVjHIsCIw==","length":25585,"stub":true},"asyncblock-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-mwCctbug6QZMOM8A4gqFyQ==","length":25924,"stub":true},"asyncblock-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-9USKAwu1HSaMwfCjnDiK/w==","length":67485,"stub":true},"asyncblock-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-NN6v9uuV9hb+lyXQzZ5/cw==","length":65830,"stub":true},"asyncblock-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-4jHZ9uMGGI89dI1CAAx1xg==","length":65721,"stub":true},"asyncblock-0.9.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-2E9tbLyPylo3FvXeP3eH1w==","length":22231,"stub":true},"asyncblock-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-t90psp3fkjB/Y7Dw/w0+GQ==","length":64522,"stub":true},"asyncblock-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-rs0/bf9rBsT2AHEuPyd81Q==","length":64147,"stub":true},"asyncblock-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-U2Z5AhKVW57H8EGv6ufRsQ==","length":63341,"stub":true},"asyncblock-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-q015NAv4L89PQtQ36iKtGw==","length":61537,"stub":true},"asyncblock-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-KWcZIWBg50CBAi1vs1Ogzg==","length":59919,"stub":true},"asyncblock-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-IWNUchfnmfON5sKQ1WjhnQ==","length":56884,"stub":true},"asyncblock-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-ggjdXLQcdwC18MyfEAy5mw==","length":14303,"stub":true},"asyncblock-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-ncS7+8TotADerIjuVBA5Uw==","length":8615,"stub":true},"asyncblock-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-uS5FRpzMGktCAdOnTtnXBg==","length":14057,"stub":true},"asyncblock-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-0O7H3Y3EX04kg38YFKiPcA==","length":11132,"stub":true},"asyncblock-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-GU6COAcr06oH3oznmoMFcg==","length":10426,"stub":true},"asyncblock-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-9oMEpm+HCQnNjUo81B4dMw==","length":10363,"stub":true},"asyncblock-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-11Xu3xXnXP9uggHiyhyMtg==","length":9869,"stub":true},"asyncblock-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ewdlMrGOhEoZLbpzwcvIbQ==","length":8991,"stub":true},"asyncblock-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RAlFgdlTpTrTczoze+Es2Q==","length":8258,"stub":true},"asyncblock-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-V/N/JqzlBq7n1jNIxiWDKg==","length":7655,"stub":true},"asyncblock-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NQlzB4dkEoIbXU8D8qTHww==","length":7180,"stub":true},"asyncblock-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HFBJwKSvm7sg7MNgqI90Yw==","length":6937,"stub":true}}}},
{"id":"asyncevents","key":"asyncevents","value":{"rev":"3-de104847994365dcab5042db2b46fb84"},"doc":{"_id":"asyncevents","_rev":"3-de104847994365dcab5042db2b46fb84","name":"asyncevents","description":"Extension to EventEmitter to facilitate asynchronous firing of events, and asynchronous handling of those events.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"asyncevents","version":"0.1.0","description":"Extension to EventEmitter to facilitate asynchronous firing of events, and asynchronous handling of those events.","keywords":"async,events,eventemitter,async events","author":{"name":"Sam Day","email":"sam.c.day@gmail.com"},"main":"./index","engines":{"node":">= 0.2.0"},"dependencies":{"vows":">= 0.5.6"},"repository":{"type":"git","url":"https://github.com/samcday/asyncevents.git"},"_id":"asyncevents@0.1.0","_engineSupported":true,"_npmVersion":"0.2.14-5","_nodeVersion":"v0.3.6","directories":{"lib":"./lib"},"modules":{"asyncevents.js":"lib/asyncevents.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"00a2b5e0beb0ae48149c921ba3254f75bbc58efa","tarball":"http://registry.npmjs.org/asyncevents/-/asyncevents-0.1.0.tgz"}}},"maintainers":[{"name":"samcday","email":"sam.c.day@gmail.com"}],"time":{"modified":"2011-02-07T04:39:08.804Z","created":"2011-02-07T04:39:07.962Z","0.1.0":"2011-02-07T04:39:08.804Z"},"author":{"name":"Sam Day","email":"sam.c.day@gmail.com"},"repository":{"type":"git","url":"https://github.com/samcday/asyncevents.git"},"_attachments":{"asyncevents-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yoVtxl8u9IVDm5yUPr8CGA==","length":4277,"stub":true}}}},
{"id":"asyncify","key":"asyncify","value":{"rev":"3-3f6deb82ee1c6cb25e83a48fe6379b75"},"doc":{"_id":"asyncify","_rev":"3-3f6deb82ee1c6cb25e83a48fe6379b75","name":"asyncify","description":"The asyncify deferred module of FuturesJS (Ender.JS and Node.JS)","dist-tags":{"latest":"2.1.1"},"versions":{"2.1.1":{"name":"asyncify","version":"2.1.1","description":"The asyncify deferred module of FuturesJS (Ender.JS and Node.JS)","homepage":"https://github.com/coolaj86/futures","keywords":["flow-control","async","asynchronous","asyncify","util","browser"],"repository":{"type":"git","url":"git://github.com/coolaj86/futures.git"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"main":"asyncify.js","directories":{"lib":"."},"dependencies":{"future":"*"},"engines":{"node":"*","ender":">= 0.5.0"},"_npmJsonOpts":{"file":"/Users/coolaj86/.npm/asyncify/2.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asyncify@2.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"37ca5875abfc0388a154e0995cb06160ff55be88","tarball":"http://registry.npmjs.org/asyncify/-/asyncify-2.1.1.tgz"},"scripts":{}}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2011-07-13T20:17:17.218Z","created":"2011-07-13T20:17:16.849Z","2.1.1":"2011-07-13T20:17:17.218Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/futures.git"},"_attachments":{"asyncify-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tEJgYLOnR1IrNMwsjsWDgA==","length":782,"stub":true}}}},
{"id":"asyncjs","key":"asyncjs","value":{"rev":"35-ae1c058c28a6383f1019c6fc386f8650"},"doc":{"_id":"asyncjs","_rev":"35-ae1c058c28a6383f1019c6fc386f8650","name":"asyncjs","dist-tags":{"latest":"0.0.9"},"versions":{"0.0.1":{"name":"asyncjs","version":"0.0.1","homepage":"http://github.com/fjakobs/async.js.git","engines":{"node":">= 0.1.102"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"main":"lib/async","repository":{"type":"git","url":"http://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"asyncjs@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.1.tgz"},"directories":{}},"0.0.2":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.2","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.2.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"directories":{"lib":"lib/async"},"repository":{"type":"git","url":"http://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"asyncjs@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.2.6","dist":{"shasum":"4fd072a42f658d080adac7706dced1f362610de7","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.2.tgz"}},"0.0.4":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.4","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.2.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"directories":{"lib":"lib/async"},"repository":{"type":"git","url":"http://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"asyncjs@0.0.4","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.4.1","dist":{"shasum":"55b1f66c239a9700c661c3eeaa0b9a9704d1603f","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.4.tgz"}},"0.0.5":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.5","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.4.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"main":"index","repository":{"type":"git","url":"http://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_id":"asyncjs@0.0.5","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.4.1","dist":{"shasum":"cfb12d44833b35999ccc9d3a85c15b9c278ce674","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.5.tgz"}},"0.0.6":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.6","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.4.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"main":"index","repository":{"type":"git","url":"git://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"asyncjs@0.0.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"318463b63ed8a1695d1342b1d733e6a3502dc455","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.6.tgz"},"readme":"async.js\n========\n\n**A clean, composable way to manipulate sequences of values with asynchronous functions\n**\n\nDealing with control flow in heavily asynchronous code can be a big challange. Without any helper functions the code can easily degenerate into a christmas tree shape because of the callback of a callback of a callback syndrome.\n\n    asncFunction1(function(err, result) {\n        asncFunction2(function(err, result) {\n            asncFunction3(function(err, result) {\n                asncFunction4(function(err, result) {\n                    asncFunction5(function(err, result) {\n                        // do something useful\n                    })\n                })\n            })\n        })\n    })\n    \nWith async.js this can be written as\n\n    async.list([\n        asncFunction1,\n        asncFunction2,\n        asncFunction3,\n        asncFunction4,\n        asncFunction5,\n    ]).call().end(function(err, result) {\n        // do something useful\n    });\n    \nIt gets even worse if an asynchronous function has to be applied to a sequence of values. There is a nice example of this in the  howtonode.org article [Control Flow in Node Part III](http://howtonode.org/control-flow-part-iii):\n\n    // Here is the async version without helpers\n    function loaddir(path, callback) {\n      fs.readdir(path, function (err, filenames) {\n        if (err) { callback(err); return; }\n        var realfiles = [];\n        var count = filenames.length;\n        filenames.forEach(function (filename) {\n          fs.stat(filename, function (err, stat) {\n            if (err) { callback(err); return; }\n            if (stat.isFile()) {\n              realfiles.push(filename);\n            }\n            count--;\n            if (count === 0) {\n              var results = [];\n              realfiles.forEach(function (filename) {\n                fs.readFile(filename, function (err, data) {\n                  if (err) { callback(err); return; }\n                  results.push(data);\n                  if (results.length === realfiles.length) {\n                    callback(null, results);\n                  };\n                });\n              });\n            }\n          });\n        });\n      });\n    }\n    \nThis code reads the contents of a directory, filters out all directory and returns the contens of all files as an array. Without any helpers the whole control flow management totally obscures the intent of the code. With async.js it is possible to move the control flow aspects of the code out of the function and rewrite it like this:\n\n    function loaddir(path, callback) {\n        async.readdir(\".\")\n            .stat()\n            .filter(function(file) {\n                return file.stat.isFile()\n            })\n            .readFile(\"utf8\")\n            .filter(function(file) {\n                return file.data\n            })\n            .toString(callback)\n    }\n    \n\nFeatures\n========\n\nCore\n----\n\nJavaScript Array like abstraction, which supports almost all JavaScript array functions with asynchronous versions of\n\n- filter\n- map\n- reduce\n- forEach\n- some\n- every\n\nAll functions are chainable.\n\nnode.js file system plugin\n--------------------------\n\nMost of the functions from the `fs` module in node.js are exposed as chainable filters.\n\n- `stat` (lstat, fstat)\n- `unlink`\n- `mkdir`/`rmdir`\n- `realpath`\n- `open`/`close`\n- `exists` (from `path.exists`)\n- `chmod`\n- `readFile`/`writeFile`\n\nConstructors\n\n- `files`: convert a list of files into a file sequence\n- `readdir`: create a file sequence from the files in a directory\n- `walkfiles`: recursive file walker\n- `glob`: Unix style file matching. Creates a file sequence of all matching files.\n\nUtility functions to work with the file system\n\n- `abspath`: convert a relative to an absolute path\n- `copyfile`: copy a single file\n- `copytree`: copy whole diroctory tree\n- `rmtree`: remove whole direcory tree (like `rm -rf`)\n\nUtils plugin\n------------\n\nGeneric filters:\n\n- `delay`: wait a given time before returning the next value\n- `timeout`: If the source doesn't respond in a given time an error is returned.\n- `inspect`: print the source value as JSON\n- `print`: print the source value as string\n\nHow does it work?\n=================\n\n## Constructors\n\nConstructors are the sources of async streams. They return an `async.Generator` instance which generates a sequence of values.\n\n## Filters\n\nFilters work on the sequence generated by a source generator. They can remove, add and modify values in the sequence. Filters return themselves generator instances.\n\n## Drivers\n\nDriver methods drive the actual execution of the iteration. The hole system is based on the principle of pulling the values from the end. Until any of the drivers is called no value will be generated.\n\n\nTODO\n====\n\n- Add documentation about the fs plugin\n- Add documentation about the unit testing framework\n- improve test coverage of the core functionality\n- create browser version\n\nContinuous Integration status\n-----------------------------\n\nThis project is tested with [Travis CI](http://travis-ci.org)\n[![Build Status](https://secure.travis-ci.org/fjakobs/async.js.png)](http://travis-ci.org/fjakobs/async.js)\n\nCore API\n========\n\n## Constructors\n\n### async.range([start=0], [stop], [step=1], [construct=async.Generator])\n\nCreates a generator generating an arithmetic progression of integers.\n`range(i, j)` returns [i, i+1, i+2, ..., j-1] and `start` defaults to 0.\nWhen step is given, it specifies the increment (or decrement). If `stop` is not given an infinite number of values if generated. This generates all positive odd numbers:\n\n    async.range(1, null, 2)\n\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n### async.list(arr, [construct=async.Generator])\n\nCreates a generator, which returns the elements of the given array. This generates e.g. the values `1`, `2` and `3`:\n\n    async.list([1, 2, 3])\n\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n## async.Generator(source)\n\nGenerators are implementing the 'Iterator' design pattern in an asynchronous way. It has a `next(callback)` method, which passes on each call the next generated value to the given callback. Generators can be chained and all construcors and filters return new `Generator` instances.\n\nThe `source` is either another `async.Generator` or a generator function. All filters in the generator operate on the values generated by the source.\n\n    var i=0;\n    var gen = new async.Generator(function(callback) {\n        if (i>4)\n            callback(async.STOP)\n        else\n            callback(null, i++) // no error\n    })\n    \n`gen` in this example generates the sequence [0, 1, 2, 3, 4]. The first argument of the callback can be used to indicate an error the the end of the iteration, whicle the second argument is the generated value.\n\n### Constant: async.STOP\n\nSpecial error value, which indicates the end of the iteration.\n\n### Method: next(callback)\n\nCalls the callback with the next generated value:\n\n    gen.next(function(err, value) {\n        //\n    })\n    \nThe generated value is passed in the `value` argument. If an error occured while computing the value the `err` argument is set. In this case value the meaning of value is undefined. `async.STOP` can be passed as special error value to indicate the end of the iteration.\n\nUsually this method is only needed to write custom filters.\n\n### Filter: map(mapper)\n\nApplies the `mapper` function to all values of the generator's source and generates the result of the mapping.\n\n    async.range(0, 3)\n        .map(function(item, next) {\n            next(null, item + 1)\n        })\n    \nThis will add one to each incoming item and thus generate the sequence [1, 2, 3].\n\nThe mapper can also be synchronous and simply return the result. In this case the mapper must not have the `next` argument.\n\n\n### Filter: filter(filter)\n\nCalls filter for each of the generator's source values. If the `filter` returns `false` for a passed value, the value is dropped from the sequence, otherwise the value is forwarded.\n\n    async.list([1, 2, 3, 4])\n        .filter(function(item, next) {\n            next(null, item % 2 == 0)\n        })\n        \nThis will filter out all odd values and generate the sequence [2, 4].\n\n\n### Filter: slice(begin, end)\n\nCounts the generator's source values starting with 0 and skips all values with an index smaller then `begin`. If the index is >= `end` the sequence is stopped.\n\n    async.range(0)\n        .slice(1, 4)\n        \nThe `async.range` call generates an infinite sequence of all integers and the `slice` call transforms this into the sequence [1, 2, 3] by dropping the first value and stopping the sequence after the 4th value.\n\n### Filter: reduce(reduce, [initialValue])\n\nSum up the number from 1 to 5:\n\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue) {        \n            return previousValue + currentValue;\n        })\n        \nSum up the number from 1 to 5 but with a first 'initialValue' of 10:\n\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue, index, next) {\n            next(null, previousValue + currentValue);\n        }, 10)\n\n\n### Filter: forEach(fn)\n\nAlias for `each`.\n\n### Filter: each(fn)\n\nCalls `fn` for each of the source generator's values. The returned generator passes on the source values.\n\n    async.range(1, 10)\n        .each(function(item, next) {\n            console.log(item);\n        })\n        \nPrints the numbers from 1 to 9. Otherwise the source sequence is not changed.\n\n### Filter: some(condition)\n\nCheck if any of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates an even number:\n\n    async.list([1, 8, 3, 5])\n        .some(function odd(item) {\n            return item % 2 == 0\n        })\n\nThis generates [true].\n\n### Filter: every(condition)\n\nCheck if all of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates only even numbers:\n\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n\nThis returns [false]\n\n### Filter: call([context])\n\nCalls each of source values in sequence, which have to be functions. The functions can either be synchronous and return a value of be asynchronous and call the passed callback on completion. The generated sequence are the function's return values. The optional `context` argument defines the `this` context of the called functions.\n\n    async.list([\n        function sync() {\n            return \"juhu\"\n        },    \n        function async(next) {\n            next(null, \"kinners\")\n        }\n    ]).call()\n    \nThis calls the two functions in sequence and generates the sequence [\"juhu\", \"kinners\"].\n\n### Filter: concat(...)\n\nConcatenates a variable number of generators with this generator. \n\n    async.range(1, 4)\n        .concat(async.range(10, 13))\n        \nThis returns a generator, which generates the values of the first `range` followed by the values of the second `range`: [1, 2, 3, 10, 11, 12]\n\n\n### Filter: zip(...)\n\nReturns a generator, which generates on each `next()` an arroy of the next values of this generator and each of the passed arguments. The length of the generated sequence is truncated to the lenght of the shortest input sequence. This function expects a variable list of generators as arguments.\n\n    async.range(1, 4)\n        .zip(async.range(10, 14))\n        \nThis will generate [[1, 10], [2, 11], [3, 13]]\n\n### Filter: sort([compare])\n\nPerforms an Array.prototype.sort on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values. Generates the read values in sorted order.\n\n    async.list([4, 2, 3, 9])\n        .sort()\n\nThis generates the sequence [2, 3, 4, 9]\n\n### Filter: join([separator])\n\nPerforms an Array.prototype.join on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values.\n\n    async.list([1, 4, 5])\n        .join(\" - \")\n\nThis will generate [\"1 - 4 - 5\"]\n\n### Filter: reverse()\n\nReverses the elements generated by the generator's source. Since this requires reading all source elements, the source must not generate an infinite number of values.\n\nasync.list([1, 4, 5])\n    .revers()\n\nThis will generate [5, 4, 1]\n\n\n### Driver: end([callback])\n\nPerform the iteration until the generator's source either returns `async.STOP` or indicates an error. The value of the last generated value is passed to the callback.\n\n\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n        .end(function(err, allEven) {\n            console.log(\"All values are even: \" + allEven)\n        }) \n\nThis will print the last generated value (the result of `very`) on the console.\n\n### Driver: toArray([breakOnError=true], callback)\n\nPerform the iteration until the generator's source either returns `async.STOP`. If `breakOnError` is true the iteration is stopped on the first error. Otherwise the iteration continues and all errors are collected in an error array. An array of all generated values is passed to the callback.\n\n    async.list([1, 8, 3, 5])\n        .map(function odd(item, next) {\n            next(err, item * 10)\n        })\n        .toArray(function(err, values) {\n            console.log(values)\n        }) \n\nThe last callback will be called with arr set to [10, 80, 30, 50].\n","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]},"0.0.7":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.7","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.4.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"main":"index","repository":{"type":"git","url":"git://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"asyncjs@0.0.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2bc3517bc84ef7ba6d363ca9bdd91c7280c2c284","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.7.tgz"},"readme":"async.js\n========\n\n**A clean, composable way to manipulate sequences of values with asynchronous functions\n**\n\nDealing with control flow in heavily asynchronous code can be a big challange. Without any helper functions the code can easily degenerate into a christmas tree shape because of the callback of a callback of a callback syndrome.\n\n    asncFunction1(function(err, result) {\n        asncFunction2(function(err, result) {\n            asncFunction3(function(err, result) {\n                asncFunction4(function(err, result) {\n                    asncFunction5(function(err, result) {\n                        // do something useful\n                    })\n                })\n            })\n        })\n    })\n    \nWith async.js this can be written as\n\n    async.list([\n        asncFunction1,\n        asncFunction2,\n        asncFunction3,\n        asncFunction4,\n        asncFunction5,\n    ]).call().end(function(err, result) {\n        // do something useful\n    });\n    \nIt gets even worse if an asynchronous function has to be applied to a sequence of values. There is a nice example of this in the  howtonode.org article [Control Flow in Node Part III](http://howtonode.org/control-flow-part-iii):\n\n    // Here is the async version without helpers\n    function loaddir(path, callback) {\n      fs.readdir(path, function (err, filenames) {\n        if (err) { callback(err); return; }\n        var realfiles = [];\n        var count = filenames.length;\n        filenames.forEach(function (filename) {\n          fs.stat(filename, function (err, stat) {\n            if (err) { callback(err); return; }\n            if (stat.isFile()) {\n              realfiles.push(filename);\n            }\n            count--;\n            if (count === 0) {\n              var results = [];\n              realfiles.forEach(function (filename) {\n                fs.readFile(filename, function (err, data) {\n                  if (err) { callback(err); return; }\n                  results.push(data);\n                  if (results.length === realfiles.length) {\n                    callback(null, results);\n                  };\n                });\n              });\n            }\n          });\n        });\n      });\n    }\n    \nThis code reads the contents of a directory, filters out all directory and returns the contens of all files as an array. Without any helpers the whole control flow management totally obscures the intent of the code. With async.js it is possible to move the control flow aspects of the code out of the function and rewrite it like this:\n\n    function loaddir(path, callback) {\n        async.readdir(\".\")\n            .stat()\n            .filter(function(file) {\n                return file.stat.isFile()\n            })\n            .readFile(\"utf8\")\n            .filter(function(file) {\n                return file.data\n            })\n            .toString(callback)\n    }\n    \n\nFeatures\n========\n\nCore\n----\n\nJavaScript Array like abstraction, which supports almost all JavaScript array functions with asynchronous versions of\n\n- filter\n- map\n- reduce\n- forEach\n- some\n- every\n\nAll functions are chainable.\n\nnode.js file system plugin\n--------------------------\n\nMost of the functions from the `fs` module in node.js are exposed as chainable filters.\n\n- `stat` (lstat, fstat)\n- `unlink`\n- `mkdir`/`rmdir`\n- `realpath`\n- `open`/`close`\n- `exists` (from `path.exists`)\n- `chmod`\n- `readFile`/`writeFile`\n\nConstructors\n\n- `files`: convert a list of files into a file sequence\n- `readdir`: create a file sequence from the files in a directory\n- `walkfiles`: recursive file walker\n- `glob`: Unix style file matching. Creates a file sequence of all matching files.\n\nUtility functions to work with the file system\n\n- `abspath`: convert a relative to an absolute path\n- `copyfile`: copy a single file\n- `copytree`: copy whole diroctory tree\n- `rmtree`: remove whole direcory tree (like `rm -rf`)\n\nUtils plugin\n------------\n\nGeneric filters:\n\n- `delay`: wait a given time before returning the next value\n- `timeout`: If the source doesn't respond in a given time an error is returned.\n- `inspect`: print the source value as JSON\n- `print`: print the source value as string\n\nHow does it work?\n=================\n\n## Constructors\n\nConstructors are the sources of async streams. They return an `async.Generator` instance which generates a sequence of values.\n\n## Filters\n\nFilters work on the sequence generated by a source generator. They can remove, add and modify values in the sequence. Filters return themselves generator instances.\n\n## Drivers\n\nDriver methods drive the actual execution of the iteration. The hole system is based on the principle of pulling the values from the end. Until any of the drivers is called no value will be generated.\n\n\nTODO\n====\n\n- Add documentation about the fs plugin\n- Add documentation about the unit testing framework\n- improve test coverage of the core functionality\n- create browser version\n\nContinuous Integration status\n-----------------------------\n\nThis project is tested with [Travis CI](http://travis-ci.org)\n[![Build Status](https://secure.travis-ci.org/fjakobs/async.js.png)](http://travis-ci.org/fjakobs/async.js)\n\nCore API\n========\n\n## Constructors\n\n### async.range([start=0], [stop], [step=1], [construct=async.Generator])\n\nCreates a generator generating an arithmetic progression of integers.\n`range(i, j)` returns [i, i+1, i+2, ..., j-1] and `start` defaults to 0.\nWhen step is given, it specifies the increment (or decrement). If `stop` is not given an infinite number of values if generated. This generates all positive odd numbers:\n\n    async.range(1, null, 2)\n\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n### async.list(arr, [construct=async.Generator])\n\nCreates a generator, which returns the elements of the given array. This generates e.g. the values `1`, `2` and `3`:\n\n    async.list([1, 2, 3])\n\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n## async.Generator(source)\n\nGenerators are implementing the 'Iterator' design pattern in an asynchronous way. It has a `next(callback)` method, which passes on each call the next generated value to the given callback. Generators can be chained and all construcors and filters return new `Generator` instances.\n\nThe `source` is either another `async.Generator` or a generator function. All filters in the generator operate on the values generated by the source.\n\n    var i=0;\n    var gen = new async.Generator(function(callback) {\n        if (i>4)\n            callback(async.STOP)\n        else\n            callback(null, i++) // no error\n    })\n    \n`gen` in this example generates the sequence [0, 1, 2, 3, 4]. The first argument of the callback can be used to indicate an error the the end of the iteration, whicle the second argument is the generated value.\n\n### Constant: async.STOP\n\nSpecial error value, which indicates the end of the iteration.\n\n### Method: next(callback)\n\nCalls the callback with the next generated value:\n\n    gen.next(function(err, value) {\n        //\n    })\n    \nThe generated value is passed in the `value` argument. If an error occured while computing the value the `err` argument is set. In this case value the meaning of value is undefined. `async.STOP` can be passed as special error value to indicate the end of the iteration.\n\nUsually this method is only needed to write custom filters.\n\n### Filter: map(mapper)\n\nApplies the `mapper` function to all values of the generator's source and generates the result of the mapping.\n\n    async.range(0, 3)\n        .map(function(item, next) {\n            next(null, item + 1)\n        })\n    \nThis will add one to each incoming item and thus generate the sequence [1, 2, 3].\n\nThe mapper can also be synchronous and simply return the result. In this case the mapper must not have the `next` argument.\n\n\n### Filter: filter(filter)\n\nCalls filter for each of the generator's source values. If the `filter` returns `false` for a passed value, the value is dropped from the sequence, otherwise the value is forwarded.\n\n    async.list([1, 2, 3, 4])\n        .filter(function(item, next) {\n            next(null, item % 2 == 0)\n        })\n        \nThis will filter out all odd values and generate the sequence [2, 4].\n\n\n### Filter: slice(begin, end)\n\nCounts the generator's source values starting with 0 and skips all values with an index smaller then `begin`. If the index is >= `end` the sequence is stopped.\n\n    async.range(0)\n        .slice(1, 4)\n        \nThe `async.range` call generates an infinite sequence of all integers and the `slice` call transforms this into the sequence [1, 2, 3] by dropping the first value and stopping the sequence after the 4th value.\n\n### Filter: reduce(reduce, [initialValue])\n\nSum up the number from 1 to 5:\n\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue) {        \n            return previousValue + currentValue;\n        })\n        \nSum up the number from 1 to 5 but with a first 'initialValue' of 10:\n\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue, index, next) {\n            next(null, previousValue + currentValue);\n        }, 10)\n\n\n### Filter: forEach(fn)\n\nAlias for `each`.\n\n### Filter: each(fn)\n\nCalls `fn` for each of the source generator's values. The returned generator passes on the source values.\n\n    async.range(1, 10)\n        .each(function(item, next) {\n            console.log(item);\n        })\n        \nPrints the numbers from 1 to 9. Otherwise the source sequence is not changed.\n\n### Filter: some(condition)\n\nCheck if any of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates an even number:\n\n    async.list([1, 8, 3, 5])\n        .some(function odd(item) {\n            return item % 2 == 0\n        })\n\nThis generates [true].\n\n### Filter: every(condition)\n\nCheck if all of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates only even numbers:\n\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n\nThis returns [false]\n\n### Filter: call([context])\n\nCalls each of source values in sequence, which have to be functions. The functions can either be synchronous and return a value of be asynchronous and call the passed callback on completion. The generated sequence are the function's return values. The optional `context` argument defines the `this` context of the called functions.\n\n    async.list([\n        function sync() {\n            return \"juhu\"\n        },    \n        function async(next) {\n            next(null, \"kinners\")\n        }\n    ]).call()\n    \nThis calls the two functions in sequence and generates the sequence [\"juhu\", \"kinners\"].\n\n### Filter: concat(...)\n\nConcatenates a variable number of generators with this generator. \n\n    async.range(1, 4)\n        .concat(async.range(10, 13))\n        \nThis returns a generator, which generates the values of the first `range` followed by the values of the second `range`: [1, 2, 3, 10, 11, 12]\n\n\n### Filter: zip(...)\n\nReturns a generator, which generates on each `next()` an arroy of the next values of this generator and each of the passed arguments. The length of the generated sequence is truncated to the lenght of the shortest input sequence. This function expects a variable list of generators as arguments.\n\n    async.range(1, 4)\n        .zip(async.range(10, 14))\n        \nThis will generate [[1, 10], [2, 11], [3, 13]]\n\n### Filter: sort([compare])\n\nPerforms an Array.prototype.sort on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values. Generates the read values in sorted order.\n\n    async.list([4, 2, 3, 9])\n        .sort()\n\nThis generates the sequence [2, 3, 4, 9]\n\n### Filter: join([separator])\n\nPerforms an Array.prototype.join on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values.\n\n    async.list([1, 4, 5])\n        .join(\" - \")\n\nThis will generate [\"1 - 4 - 5\"]\n\n### Filter: reverse()\n\nReverses the elements generated by the generator's source. Since this requires reading all source elements, the source must not generate an infinite number of values.\n\nasync.list([1, 4, 5])\n    .revers()\n\nThis will generate [5, 4, 1]\n\n\n### Driver: end([callback])\n\nPerform the iteration until the generator's source either returns `async.STOP` or indicates an error. The value of the last generated value is passed to the callback.\n\n\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n        .end(function(err, allEven) {\n            console.log(\"All values are even: \" + allEven)\n        }) \n\nThis will print the last generated value (the result of `very`) on the console.\n\n### Driver: toArray([breakOnError=true], callback)\n\nPerform the iteration until the generator's source either returns `async.STOP`. If `breakOnError` is true the iteration is stopped on the first error. Otherwise the iteration continues and all errors are collected in an error array. An array of all generated values is passed to the callback.\n\n    async.list([1, 8, 3, 5])\n        .map(function odd(item, next) {\n            next(err, item * 10)\n        })\n        .toArray(function(err, values) {\n            console.log(values)\n        }) \n\nThe last callback will be called with arr set to [10, 80, 30, 50].\n","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]},"0.0.8":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.8","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.4.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"main":"index","repository":{"type":"git","url":"git://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"asyncjs@0.0.8","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"b639d2aa3521c81831dc8ddc67967186c3b3bb43","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.8.tgz"},"readme":"async.js\n========\n\n**A clean, composable way to manipulate sequences of values with asynchronous functions\n**\n\nDealing with control flow in heavily asynchronous code can be a big challange. Without any helper functions the code can easily degenerate into a christmas tree shape because of the callback of a callback of a callback syndrome.\n\n```js\n    asncFunction1(function(err, result) {\n        asncFunction2(function(err, result) {\n            asncFunction3(function(err, result) {\n                asncFunction4(function(err, result) {\n                    asncFunction5(function(err, result) {\n                        // do something useful\n                    })\n                })\n            })\n        })\n    })\n```    \n\nWith async.js this can be written as\n```js\n    async.list([\n        asncFunction1,\n        asncFunction2,\n        asncFunction3,\n        asncFunction4,\n        asncFunction5,\n    ]).call().end(function(err, result) {\n        // do something useful\n    });\n```\nIt gets even worse if an asynchronous function has to be applied to a sequence of values. There is a nice example of this in the  howtonode.org article [Control Flow in Node Part III](http://howtonode.org/control-flow-part-iii):\n```js\n    // Here is the async version without helpers\n    function loaddir(path, callback) {\n      fs.readdir(path, function (err, filenames) {\n        if (err) { callback(err); return; }\n        var realfiles = [];\n        var count = filenames.length;\n        filenames.forEach(function (filename) {\n          fs.stat(filename, function (err, stat) {\n            if (err) { callback(err); return; }\n            if (stat.isFile()) {\n              realfiles.push(filename);\n            }\n            count--;\n            if (count === 0) {\n              var results = [];\n              realfiles.forEach(function (filename) {\n                fs.readFile(filename, function (err, data) {\n                  if (err) { callback(err); return; }\n                  results.push(data);\n                  if (results.length === realfiles.length) {\n                    callback(null, results);\n                  };\n                });\n              });\n            }\n          });\n        });\n      });\n    }\n```    \nThis code reads the contents of a directory, filters out all directory and returns the contens of all files as an array. Without any helpers the whole control flow management totally obscures the intent of the code. With async.js it is possible to move the control flow aspects of the code out of the function and rewrite it like this:\n```js\n    function loaddir(path, callback) {\n        async.readdir(\".\")\n            .stat()\n            .filter(function(file) {\n                return file.stat.isFile()\n            })\n            .readFile(\"utf8\")\n            .filter(function(file) {\n                return file.data\n            })\n            .toString(callback)\n    }\n```    \n\nFeatures\n========\n\nCore\n----\n\nJavaScript Array like abstraction, which supports almost all JavaScript array functions with asynchronous versions of\n\n- filter\n- map\n- reduce\n- forEach\n- some\n- every\n\nAll functions are chainable.\n\nnode.js file system plugin\n--------------------------\n\nMost of the functions from the `fs` module in node.js are exposed as chainable filters.\n\n- `stat` (lstat, fstat)\n- `unlink`\n- `mkdir`/`rmdir`\n- `realpath`\n- `open`/`close`\n- `exists` (from `path.exists`)\n- `chmod`\n- `readFile`/`writeFile`\n\nConstructors\n\n- `files`: convert a list of files into a file sequence\n- `readdir`: create a file sequence from the files in a directory\n- `walkfiles`: recursive file walker\n- `glob`: Unix style file matching. Creates a file sequence of all matching files.\n\nUtility functions to work with the file system\n\n- `abspath`: convert a relative to an absolute path\n- `copyfile`: copy a single file\n- `copytree`: copy whole diroctory tree\n- `rmtree`: remove whole direcory tree (like `rm -rf`)\n\nUtils plugin\n------------\n\nGeneric filters:\n\n- `delay`: wait a given time before returning the next value\n- `timeout`: If the source doesn't respond in a given time an error is returned.\n- `inspect`: print the source value as JSON\n- `print`: print the source value as string\n\nHow does it work?\n=================\n\n## Constructors\n\nConstructors are the sources of async streams. They return an `async.Generator` instance which generates a sequence of values.\n\n## Filters\n\nFilters work on the sequence generated by a source generator. They can remove, add and modify values in the sequence. Filters return themselves generator instances.\n\n## Drivers\n\nDriver methods drive the actual execution of the iteration. The hole system is based on the principle of pulling the values from the end. Until any of the drivers is called no value will be generated.\n\n\nTODO\n====\n\n- Add documentation about the fs plugin\n- Add documentation about the unit testing framework\n- improve test coverage of the core functionality\n- create browser version\n\nContinuous Integration status\n-----------------------------\n\nThis project is tested with [Travis CI](http://travis-ci.org)\n[![Build Status](https://secure.travis-ci.org/fjakobs/async.js.png)](http://travis-ci.org/fjakobs/async.js)\n\nCore API\n========\n\n## Constructors\n\n### async.range([start=0], [stop], [step=1], [construct=async.Generator])\n\nCreates a generator generating an arithmetic progression of integers.\n`range(i, j)` returns [i, i+1, i+2, ..., j-1] and `start` defaults to 0.\nWhen step is given, it specifies the increment (or decrement). If `stop` is not given an infinite number of values if generated. This generates all positive odd numbers:\n```js\n    async.range(1, null, 2)\n```\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n### async.list(arr, [construct=async.Generator])\n\nCreates a generator, which returns the elements of the given array. This generates e.g. the values `1`, `2` and `3`:\n```js\n    async.list([1, 2, 3])\n```\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n## async.Generator(source)\n\nGenerators are implementing the 'Iterator' design pattern in an asynchronous way. It has a `next(callback)` method, which passes on each call the next generated value to the given callback. Generators can be chained and all construcors and filters return new `Generator` instances.\n\nThe `source` is either another `async.Generator` or a generator function. All filters in the generator operate on the values generated by the source.\n```js\n    var i=0;\n    var gen = new async.Generator(function(callback) {\n        if (i>4)\n            callback(async.STOP)\n        else\n            callback(null, i++) // no error\n    })\n```    \n`gen` in this example generates the sequence [0, 1, 2, 3, 4]. The first argument of the callback can be used to indicate an error the the end of the iteration, whicle the second argument is the generated value.\n\n### Constant: async.STOP\n\nSpecial error value, which indicates the end of the iteration.\n\n### Method: next(callback)\n\nCalls the callback with the next generated value:\n```js\n    gen.next(function(err, value) {\n        //\n    })\n```    \nThe generated value is passed in the `value` argument. If an error occured while computing the value the `err` argument is set. In this case value the meaning of value is undefined. `async.STOP` can be passed as special error value to indicate the end of the iteration.\n\nUsually this method is only needed to write custom filters.\n\n### Filter: map(mapper)\n\nApplies the `mapper` function to all values of the generator's source and generates the result of the mapping.\n```js\n    async.range(0, 3)\n        .map(function(item, next) {\n            next(null, item + 1)\n        })\n```    \nThis will add one to each incoming item and thus generate the sequence [1, 2, 3].\n\nThe mapper can also be synchronous and simply return the result. In this case the mapper must not have the `next` argument.\n\n\n### Filter: filter(filter)\n\nCalls filter for each of the generator's source values. If the `filter` returns `false` for a passed value, the value is dropped from the sequence, otherwise the value is forwarded.\n```js\n    async.list([1, 2, 3, 4])\n        .filter(function(item, next) {\n            next(null, item % 2 == 0)\n        })\n```        \nThis will filter out all odd values and generate the sequence [2, 4].\n\n\n### Filter: slice(begin, end)\n\nCounts the generator's source values starting with 0 and skips all values with an index smaller then `begin`. If the index is >= `end` the sequence is stopped.\n```js\n    async.range(0)\n        .slice(1, 4)\n```        \nThe `async.range` call generates an infinite sequence of all integers and the `slice` call transforms this into the sequence [1, 2, 3] by dropping the first value and stopping the sequence after the 4th value.\n\n### Filter: reduce(reduce, [initialValue])\n\nSum up the number from 1 to 5:\n```js\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue) {        \n            return previousValue + currentValue;\n        })\n```        \nSum up the number from 1 to 5 but with a first 'initialValue' of 10:\n```js\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue, index, next) {\n            next(null, previousValue + currentValue);\n        }, 10)\n```\n\n### Filter: forEach(fn)\n\nAlias for `each`.\n\n### Filter: each(fn)\n\nCalls `fn` for each of the source generator's values. The returned generator passes on the source values.\n```js\n    async.range(1, 10)\n        .each(function(item, next) {\n            console.log(item);\n        })\n```        \nPrints the numbers from 1 to 9. Otherwise the source sequence is not changed.\n\n### Filter: some(condition)\n\nCheck if any of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates an even number:\n```js\n    async.list([1, 8, 3, 5])\n        .some(function odd(item) {\n            return item % 2 == 0\n        })\n```\nThis generates [true].\n\n### Filter: every(condition)\n\nCheck if all of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates only even numbers:\n```js\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n```\nThis returns [false]\n\n### Filter: call([context])\n\nCalls each of source values in sequence, which have to be functions. The functions can either be synchronous and return a value of be asynchronous and call the passed callback on completion. The generated sequence are the function's return values. The optional `context` argument defines the `this` context of the called functions.\n```js\n    async.list([\n        function sync() {\n            return \"juhu\"\n        },    \n        function async(next) {\n            next(null, \"kinners\")\n        }\n    ]).call()\n```    \nThis calls the two functions in sequence and generates the sequence [\"juhu\", \"kinners\"].\n\n### Filter: concat(...)\n\nConcatenates a variable number of generators with this generator. \n```js\n    async.range(1, 4)\n        .concat(async.range(10, 13))\n```        \nThis returns a generator, which generates the values of the first `range` followed by the values of the second `range`: [1, 2, 3, 10, 11, 12]\n\n\n### Filter: zip(...)\n\nReturns a generator, which generates on each `next()` an arroy of the next values of this generator and each of the passed arguments. The length of the generated sequence is truncated to the lenght of the shortest input sequence. This function expects a variable list of generators as arguments.\n```js\n    async.range(1, 4)\n        .zip(async.range(10, 14))\n```        \nThis will generate [[1, 10], [2, 11], [3, 13]]\n\n### Filter: sort([compare])\n\nPerforms an Array.prototype.sort on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values. Generates the read values in sorted order.\n```js\n    async.list([4, 2, 3, 9])\n        .sort()\n```\nThis generates the sequence [2, 3, 4, 9]\n\n### Filter: join([separator])\n\nPerforms an Array.prototype.join on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values.\n```js\n    async.list([1, 4, 5])\n        .join(\" - \")\n```\nThis will generate [\"1 - 4 - 5\"]\n\n### Filter: reverse()\n\nReverses the elements generated by the generator's source. Since this requires reading all source elements, the source must not generate an infinite number of values.\n```js\nasync.list([1, 4, 5])\n    .revers()\n```\nThis will generate [5, 4, 1]\n\n\n### Driver: end([callback])\n\nPerform the iteration until the generator's source either returns `async.STOP` or indicates an error. The value of the last generated value is passed to the callback.\n\n```js\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n        .end(function(err, allEven) {\n            console.log(\"All values are even: \" + allEven)\n        }) \n```\nThis will print the last generated value (the result of `very`) on the console.\n\n### Driver: toArray([breakOnError=true], callback)\n\nPerform the iteration until the generator's source either returns `async.STOP`. If `breakOnError` is true the iteration is stopped on the first error. Otherwise the iteration continues and all errors are collected in an error array. An array of all generated values is passed to the callback.\n```js\n    async.list([1, 8, 3, 5])\n        .map(function odd(item, next) {\n            next(err, item * 10)\n        })\n        .toArray(function(err, values) {\n            console.log(values)\n        }) \n```\nThe last callback will be called with arr set to [10, 80, 30, 50].\n","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]},"0.0.9":{"name":"asyncjs","description":"async.js it for the node fs module, what jQuery is for the DOM","version":"0.0.9","homepage":"http://github.com/fjakobs/async.js","engines":{"node":">= 0.4.0"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"scripts":{"test":"node test/all.js"},"main":"index","repository":{"type":"git","url":"git://github.com/fjakobs/async.js.git"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"asyncjs@0.0.9","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"6c25c81fa83fbee9674248f508456b43fc14e65c","tarball":"http://registry.npmjs.org/asyncjs/-/asyncjs-0.0.9.tgz"},"readme":"async.js\n========\n\n**A clean, composable way to manipulate sequences of values with asynchronous functions\n**\n\nDealing with control flow in heavily asynchronous code can be a big challange. Without any helper functions the code can easily degenerate into a christmas tree shape because of the callback of a callback of a callback syndrome.\n\n```js\n    asncFunction1(function(err, result) {\n        asncFunction2(function(err, result) {\n            asncFunction3(function(err, result) {\n                asncFunction4(function(err, result) {\n                    asncFunction5(function(err, result) {\n                        // do something useful\n                    })\n                })\n            })\n        })\n    })\n```    \n\nWith async.js this can be written as\n```js\n    async.list([\n        asncFunction1,\n        asncFunction2,\n        asncFunction3,\n        asncFunction4,\n        asncFunction5,\n    ]).call().end(function(err, result) {\n        // do something useful\n    });\n```\nIt gets even worse if an asynchronous function has to be applied to a sequence of values. There is a nice example of this in the  howtonode.org article [Control Flow in Node Part III](http://howtonode.org/control-flow-part-iii):\n```js\n    // Here is the async version without helpers\n    function loaddir(path, callback) {\n      fs.readdir(path, function (err, filenames) {\n        if (err) { callback(err); return; }\n        var realfiles = [];\n        var count = filenames.length;\n        filenames.forEach(function (filename) {\n          fs.stat(filename, function (err, stat) {\n            if (err) { callback(err); return; }\n            if (stat.isFile()) {\n              realfiles.push(filename);\n            }\n            count--;\n            if (count === 0) {\n              var results = [];\n              realfiles.forEach(function (filename) {\n                fs.readFile(filename, function (err, data) {\n                  if (err) { callback(err); return; }\n                  results.push(data);\n                  if (results.length === realfiles.length) {\n                    callback(null, results);\n                  };\n                });\n              });\n            }\n          });\n        });\n      });\n    }\n```    \nThis code reads the contents of a directory, filters out all directory and returns the contens of all files as an array. Without any helpers the whole control flow management totally obscures the intent of the code. With async.js it is possible to move the control flow aspects of the code out of the function and rewrite it like this:\n```js\n    function loaddir(path, callback) {\n        async.readdir(\".\")\n            .stat()\n            .filter(function(file) {\n                return file.stat.isFile()\n            })\n            .readFile(\"utf8\")\n            .filter(function(file) {\n                return file.data\n            })\n            .toString(callback)\n    }\n```    \n\nFeatures\n========\n\nCore\n----\n\nJavaScript Array like abstraction, which supports almost all JavaScript array functions with asynchronous versions of\n\n- filter\n- map\n- reduce\n- forEach\n- some\n- every\n\nAll functions are chainable.\n\nnode.js file system plugin\n--------------------------\n\nMost of the functions from the `fs` module in node.js are exposed as chainable filters.\n\n- `stat` (lstat, fstat)\n- `unlink`\n- `mkdir`/`rmdir`\n- `realpath`\n- `open`/`close`\n- `exists` (from `path.exists`)\n- `chmod`\n- `readFile`/`writeFile`\n\nConstructors\n\n- `files`: convert a list of files into a file sequence\n- `readdir`: create a file sequence from the files in a directory\n- `walkfiles`: recursive file walker\n- `glob`: Unix style file matching. Creates a file sequence of all matching files.\n\nUtility functions to work with the file system\n\n- `abspath`: convert a relative to an absolute path\n- `copyfile`: copy a single file\n- `copytree`: copy whole diroctory tree\n- `rmtree`: remove whole direcory tree (like `rm -rf`)\n\nUtils plugin\n------------\n\nGeneric filters:\n\n- `delay`: wait a given time before returning the next value\n- `timeout`: If the source doesn't respond in a given time an error is returned.\n- `inspect`: print the source value as JSON\n- `print`: print the source value as string\n\nHow does it work?\n=================\n\n## Constructors\n\nConstructors are the sources of async streams. They return an `async.Generator` instance which generates a sequence of values.\n\n## Filters\n\nFilters work on the sequence generated by a source generator. They can remove, add and modify values in the sequence. Filters return themselves generator instances.\n\n## Drivers\n\nDriver methods drive the actual execution of the iteration. The hole system is based on the principle of pulling the values from the end. Until any of the drivers is called no value will be generated.\n\n\nTODO\n====\n\n- Add documentation about the fs plugin\n- Add documentation about the unit testing framework\n- improve test coverage of the core functionality\n- create browser version\n\nContinuous Integration status\n-----------------------------\n\nThis project is tested with [Travis CI](http://travis-ci.org)\n[![Build Status](https://secure.travis-ci.org/fjakobs/async.js.png)](http://travis-ci.org/fjakobs/async.js)\n\nCore API\n========\n\n## Constructors\n\n### async.range([start=0], [stop], [step=1], [construct=async.Generator])\n\nCreates a generator generating an arithmetic progression of integers.\n`range(i, j)` returns [i, i+1, i+2, ..., j-1] and `start` defaults to 0.\nWhen step is given, it specifies the increment (or decrement). If `stop` is not given an infinite number of values if generated. This generates all positive odd numbers:\n```js\n    async.range(1, null, 2)\n```\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n### async.list(arr, [construct=async.Generator])\n\nCreates a generator, which returns the elements of the given array. This generates e.g. the values `1`, `2` and `3`:\n```js\n    async.list([1, 2, 3])\n```\nThe optional `construct` argument must be a sub class of `async.Generator` and can be used to tell the function to return instances of the class.\n\n\n## async.Generator(source)\n\nGenerators are implementing the 'Iterator' design pattern in an asynchronous way. It has a `next(callback)` method, which passes on each call the next generated value to the given callback. Generators can be chained and all construcors and filters return new `Generator` instances.\n\nThe `source` is either another `async.Generator` or a generator function. All filters in the generator operate on the values generated by the source.\n```js\n    var i=0;\n    var gen = new async.Generator(function(callback) {\n        if (i>4)\n            callback(async.STOP)\n        else\n            callback(null, i++) // no error\n    })\n```    \n`gen` in this example generates the sequence [0, 1, 2, 3, 4]. The first argument of the callback can be used to indicate an error the the end of the iteration, whicle the second argument is the generated value.\n\n### Constant: async.STOP\n\nSpecial error value, which indicates the end of the iteration.\n\n### Method: next(callback)\n\nCalls the callback with the next generated value:\n```js\n    gen.next(function(err, value) {\n        //\n    })\n```    \nThe generated value is passed in the `value` argument. If an error occured while computing the value the `err` argument is set. In this case value the meaning of value is undefined. `async.STOP` can be passed as special error value to indicate the end of the iteration.\n\nUsually this method is only needed to write custom filters.\n\n### Filter: map(mapper)\n\nApplies the `mapper` function to all values of the generator's source and generates the result of the mapping.\n```js\n    async.range(0, 3)\n        .map(function(item, next) {\n            next(null, item + 1)\n        })\n```    \nThis will add one to each incoming item and thus generate the sequence [1, 2, 3].\n\nThe mapper can also be synchronous and simply return the result. In this case the mapper must not have the `next` argument.\n\n\n### Filter: filter(filter)\n\nCalls filter for each of the generator's source values. If the `filter` returns `false` for a passed value, the value is dropped from the sequence, otherwise the value is forwarded.\n```js\n    async.list([1, 2, 3, 4])\n        .filter(function(item, next) {\n            next(null, item % 2 == 0)\n        })\n```        \nThis will filter out all odd values and generate the sequence [2, 4].\n\n\n### Filter: slice(begin, end)\n\nCounts the generator's source values starting with 0 and skips all values with an index smaller then `begin`. If the index is >= `end` the sequence is stopped.\n```js\n    async.range(0)\n        .slice(1, 4)\n```        \nThe `async.range` call generates an infinite sequence of all integers and the `slice` call transforms this into the sequence [1, 2, 3] by dropping the first value and stopping the sequence after the 4th value.\n\n### Filter: reduce(reduce, [initialValue])\n\nSum up the number from 1 to 5:\n```js\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue) {        \n            return previousValue + currentValue;\n        })\n```        \nSum up the number from 1 to 5 but with a first 'initialValue' of 10:\n```js\n    async.range(1, 5)\n        .reduce(function(previousValue, currentValue, index, next) {\n            next(null, previousValue + currentValue);\n        }, 10)\n```\n\n### Filter: forEach(fn)\n\nAlias for `each`.\n\n### Filter: each(fn)\n\nCalls `fn` for each of the source generator's values. The returned generator passes on the source values.\n```js\n    async.range(1, 10)\n        .each(function(item, next) {\n            console.log(item);\n        })\n```        \nPrints the numbers from 1 to 9. Otherwise the source sequence is not changed.\n\n### Filter: some(condition)\n\nCheck if any of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates an even number:\n```js\n    async.list([1, 8, 3, 5])\n        .some(function odd(item) {\n            return item % 2 == 0\n        })\n```\nThis generates [true].\n\n### Filter: every(condition)\n\nCheck if all of the values in the source sequence match the condition (i.e. the `condition` callback returns true). The returned generator generates a one elmement sequence, which contains the boolean value of the result.\n\nCheck if the source generates only even numbers:\n```js\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n```\nThis returns [false]\n\n### Filter: call([context])\n\nCalls each of source values in sequence, which have to be functions. The functions can either be synchronous and return a value of be asynchronous and call the passed callback on completion. The generated sequence are the function's return values. The optional `context` argument defines the `this` context of the called functions.\n```js\n    async.list([\n        function sync() {\n            return \"juhu\"\n        },    \n        function async(next) {\n            next(null, \"kinners\")\n        }\n    ]).call()\n```    \nThis calls the two functions in sequence and generates the sequence [\"juhu\", \"kinners\"].\n\n### Filter: concat(...)\n\nConcatenates a variable number of generators with this generator. \n```js\n    async.range(1, 4)\n        .concat(async.range(10, 13))\n```        \nThis returns a generator, which generates the values of the first `range` followed by the values of the second `range`: [1, 2, 3, 10, 11, 12]\n\n\n### Filter: zip(...)\n\nReturns a generator, which generates on each `next()` an arroy of the next values of this generator and each of the passed arguments. The length of the generated sequence is truncated to the lenght of the shortest input sequence. This function expects a variable list of generators as arguments.\n```js\n    async.range(1, 4)\n        .zip(async.range(10, 14))\n```        \nThis will generate [[1, 10], [2, 11], [3, 13]]\n\n### Filter: sort([compare])\n\nPerforms an Array.prototype.sort on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values. Generates the read values in sorted order.\n```js\n    async.list([4, 2, 3, 9])\n        .sort()\n```\nThis generates the sequence [2, 3, 4, 9]\n\n### Filter: join([separator])\n\nPerforms an Array.prototype.join on the source values and returns a generator, which generates the result as one element sequence. Since this requires reading all source elements, the source must not generate an infinite number of values.\n```js\n    async.list([1, 4, 5])\n        .join(\" - \")\n```\nThis will generate [\"1 - 4 - 5\"]\n\n### Filter: reverse()\n\nReverses the elements generated by the generator's source. Since this requires reading all source elements, the source must not generate an infinite number of values.\n```js\nasync.list([1, 4, 5])\n    .revers()\n```\nThis will generate [5, 4, 1]\n\n\n### Driver: end([callback])\n\nPerform the iteration until the generator's source either returns `async.STOP` or indicates an error. The value of the last generated value is passed to the callback.\n\n```js\n    async.list([1, 8, 3, 5])\n        .every(function odd(item) {\n            return item % 2 == 0\n        })\n        .end(function(err, allEven) {\n            console.log(\"All values are even: \" + allEven)\n        }) \n```\nThis will print the last generated value (the result of `very`) on the console.\n\n### Driver: toArray([breakOnError=true], callback)\n\nPerform the iteration until the generator's source either returns `async.STOP`. If `breakOnError` is true the iteration is stopped on the first error. Otherwise the iteration continues and all errors are collected in an error array. An array of all generated values is passed to the callback.\n```js\n    async.list([1, 8, 3, 5])\n        .map(function odd(item, next) {\n            next(err, item * 10)\n        })\n        .toArray(function(err, values) {\n            console.log(values)\n        }) \n```\nThe last callback will be called with arr set to [10, 80, 30, 50].\n","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]}},"maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"repository":{"type":"git","url":"git://github.com/fjakobs/async.js.git"},"description":"async.js it for the node fs module, what jQuery is for the DOM","time":{"modified":"2012-06-11T23:10:07.531Z","created":"2011-01-22T15:16:21.700Z","0.0.1":"2011-01-22T15:16:21.700Z","0.0.2":"2011-01-22T15:16:25.358Z","0.0.4":"2011-04-04T16:08:30.993Z","0.0.5":"2011-04-14T12:12:16.676Z","0.0.6":"2012-03-07T10:12:16.074Z","0.0.7":"2012-04-16T14:05:36.565Z","0.0.8":"2012-06-11T17:39:00.677Z","0.0.9":"2012-06-11T23:10:07.531Z"},"_attachments":{"asyncjs-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-mp+9H6r3FuyqR1EoXG9YIQ==","length":18471,"stub":true},"asyncjs-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-r0BSfsAE3RkEFIJH8ymXXQ==","length":17681,"stub":true},"asyncjs-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-cEtwFMvU7Zu1XTq0tWFkhQ==","length":16591,"stub":true},"asyncjs-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-V7dHYmb51V49jV4Mt92mAQ==","length":16577,"stub":true},"asyncjs-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-GFYJW5Ype9FMsG0QejVNpA==","length":18018,"stub":true},"asyncjs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-+9Ue5+a5A4Zcz3FHUMYCTg==","length":17795,"stub":true},"asyncjs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-eCeHEo0RpTzl99QQmRC4ng==","length":18152,"stub":true},"asyncjs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rY5UF0o/7Wje8wIdi0mwNQ==","length":18199,"stub":true}}}},
{"id":"asynclib","key":"asynclib","value":{"rev":"5-c534c327aa0428fe160ca177997b9fc7"},"doc":{"_id":"asynclib","_rev":"5-c534c327aa0428fe160ca177997b9fc7","name":"asynclib","description":"NodeJS asynchronous lib","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"asynclib","version":"1.0.0","description":"NodeJS asynchronous lib","main":"lib.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://github.com/medns/AsyncLib.git"},"keywords":["nodejs","async","lib"],"author":{"name":"medns"},"license":"BSD","readme":"","_id":"asynclib@1.0.0","dist":{"shasum":"ad8268a9448e26855d2658a77910c8383cacae8b","tarball":"http://registry.npmjs.org/asynclib/-/asynclib-1.0.0.tgz"},"maintainers":[{"name":"medns","email":"medns@126.com"}]},"1.0.1":{"name":"asynclib","version":"1.0.1","description":"NodeJS asynchronous lib","main":"lib.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://github.com/medns/AsyncLib.git"},"keywords":["nodejs","async","lib"],"author":{"name":"medns"},"license":"BSD","readme":"AsyncLib\r\n========\r\n\r\nAsyncLib is a asynchronous lib in NodeJS or ES5-based browser","_id":"asynclib@1.0.1","dist":{"shasum":"c788133a3bd8afb264e97d78fef0f65523937ccf","tarball":"http://registry.npmjs.org/asynclib/-/asynclib-1.0.1.tgz"},"maintainers":[{"name":"medns","email":"medns@126.com"}]}},"readme":"","maintainers":[{"name":"medns","email":"medns@126.com"}],"time":{"modified":"2012-08-14T06:37:42.524Z","created":"2012-08-14T03:24:27.845Z","1.0.0":"2012-08-14T03:24:29.767Z","1.0.1":"2012-08-14T06:37:42.524Z"},"author":{"name":"medns"},"repository":{"type":"git","url":"https://github.com/medns/AsyncLib.git"},"_attachments":{"asynclib-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-c+1tNQ938glaXl3bF7i45A==","length":1181,"stub":true},"asynclib-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0mMcDhdbFTn6WNzHpaJhCA==","length":1124,"stub":true}}}},
{"id":"asynclist","key":"asynclist","value":{"rev":"7-d5dedde3c8defdb04e5ec61c07e7319d"},"doc":{"_id":"asynclist","_rev":"7-d5dedde3c8defdb04e5ec61c07e7319d","name":"asynclist","description":"Async Tasks runner based eventproxy","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Will Wen Gunn","email":"willwengunn@gmail.com","url":"www.iwillwen.com"},"name":"asynclist","description":"Async Tasks runner based eventproxy","version":"0.0.1","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.0"},"dependencies":{"eventproxy":"latest"},"devDependencies":{},"_npmUser":{"name":"iwillwen","email":"willwengunn@gmail.com"},"_id":"asynclist@0.0.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.3","_defaultsLoaded":true,"dist":{"shasum":"030dcbd6f229b1a764131dc97b6bdee563c87829","tarball":"http://registry.npmjs.org/asynclist/-/asynclist-0.0.1.tgz"},"maintainers":[{"name":"iwillwen","email":"willwengunn@gmail.com"}]},"0.0.2":{"author":{"name":"Will Wen Gunn","email":"willwengunn@gmail.com","url":"www.iwillwen.com"},"name":"asynclist","description":"Async Tasks runner based eventproxy","version":"0.0.2","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.0"},"dependencies":{"eventproxy":"latest"},"devDependencies":{},"_npmUser":{"name":"iwillwen","email":"willwengunn@gmail.com"},"_id":"asynclist@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"22ff27f2f505a0596d44b26080045b91f49361dd","tarball":"http://registry.npmjs.org/asynclist/-/asynclist-0.0.2.tgz"},"readme":"","maintainers":[{"name":"iwillwen","email":"willwengunn@gmail.com"}]},"0.0.3":{"author":{"name":"Will Wen Gunn","email":"willwengunn@gmail.com","url":"www.iwillwen.com"},"name":"asynclist","description":"Async Tasks runner based eventproxy","version":"0.0.3","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.0"},"dependencies":{"eventproxy":"latest"},"devDependencies":{},"_npmUser":{"name":"iwillwen","email":"willwengunn@gmail.com"},"_id":"asynclist@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"81ea6353c80ea2270ce660f6279368848f99f695","tarball":"http://registry.npmjs.org/asynclist/-/asynclist-0.0.3.tgz"},"readme":"","maintainers":[{"name":"iwillwen","email":"willwengunn@gmail.com"}]}},"maintainers":[{"name":"iwillwen","email":"willwengunn@gmail.com"}],"time":{"modified":"2012-01-19T06:56:33.662Z","created":"2011-12-25T06:16:12.652Z","0.0.1":"2011-12-25T06:16:13.198Z","0.0.2":"2012-01-19T06:28:36.766Z","0.0.3":"2012-01-19T06:56:33.662Z"},"author":{"name":"Will Wen Gunn","email":"willwengunn@gmail.com","url":"www.iwillwen.com"},"repository":{"url":""},"_attachments":{"asynclist-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vuslNWPhLDkqeUTG3BeJ2g==","length":777,"stub":true},"asynclist-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-tqAiXrEng1nHi+lbc5DoGQ==","length":657,"stub":true},"asynclist-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JFJ9506WTDnCbmHcemMmfw==","length":669,"stub":true}}}},
{"id":"asyncly","key":"asyncly","value":{"rev":"3-a0f0856d9bdbb76a18a2649c26117895"},"doc":{"_id":"asyncly","_rev":"3-a0f0856d9bdbb76a18a2649c26117895","name":"asyncly","description":"n/a","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"asyncly","description":"n/a","version":"0.0.1","author":{"name":"hij1nx","email":"hij1nx@me.com"},"contributors":[{"name":"Paolo Fragomeni","email":"hij1nx@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/asyncly/workflow.git"},"main":"./lib/workflow","engines":{"node":">= 0.4.0"},"scripts":{"test":"nodeunit test/*-test.js"},"_npmUser":{"name":"hij1nx","email":"hij1nx@me.com"},"_id":"asyncly@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.2","_defaultsLoaded":true,"dist":{"shasum":"3b7dbf2d8fbcf8aa2c2913b11e17118beb715f1b","tarball":"http://registry.npmjs.org/asyncly/-/asyncly-0.0.1.tgz"},"maintainers":[{"name":"hij1nx","email":"hij1nx@me.com"}]}},"maintainers":[{"name":"hij1nx","email":"hij1nx@me.com"}],"time":{"modified":"2011-11-26T01:48:44.153Z","created":"2011-11-26T01:48:43.830Z","0.0.1":"2011-11-26T01:48:44.153Z"},"author":{"name":"hij1nx","email":"hij1nx@me.com"},"repository":{"type":"git","url":"git://github.com/asyncly/workflow.git"},"_attachments":{"asyncly-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3NhtayxVEYMMolFE/EAVHg==","length":10240,"stub":true}}}},
{"id":"asyncready.js","key":"asyncready.js","value":{"rev":"13-cf24a7d5008266f6f62f7bacc2b96ccb"},"doc":{"_id":"asyncready.js","_rev":"13-cf24a7d5008266f6f62f7bacc2b96ccb","name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","dist-tags":{"latest":"0.7.0"},"versions":{"0.6.0":{"name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","version":"0.6.0","homepage":"https://github.com/thanpolas/ready.js","author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"bugs":{"url":"https://github.com/thanpolas/ready.js/issues"},"licenses":[{"type":"APACHE2","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"lib/ready.js","engines":{"node":"~0.6.19"},"scripts":{"test":"grunt test"},"dependencies":{"qunit2node":"~0.3.1"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["async","flow","control"],"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 815bytes (gzip) ready.js is a powerfull tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control on the execution flow of your application.\n\nready.js runs both on the browser and node.js\n\n## Getting Started\n\n### Browser version\n[Get the latest browser version (0.6.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js\n\n`npm install ready.js`\n\n[Check out the source](https://github.com/thanpolas/ready.js/blob/master/lib/ready.js).\n\nOr clone the repo with `git clone https://github.com/thanpolas/ready.js.git`.\n\n## Documentation\n_(Coming soon)_\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncready.js@0.6.0","dist":{"shasum":"da5bbf6c8e4db74624598b29fcadae07d1122c5c","tarball":"http://registry.npmjs.org/asyncready.js/-/asyncready.js-0.6.0.tgz"},"maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}]},"0.6.1":{"name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","version":"0.6.1","homepage":"https://github.com/thanpolas/ready.js","author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"bugs":{"url":"https://github.com/thanpolas/ready.js/issues"},"licenses":[{"type":"APACHE2","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"lib/ready.node.js","engines":{"node":"~0.6.19"},"scripts":{"test":"grunt test"},"dependencies":{"qunit2node":"~0.3.1"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["async","flow","control"],"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 815bytes (gzip) ready.js is a powerfull tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control on the execution flow of your application.\n\nready.js runs both on the browser and node.js\n\n## Getting Started\n\n### Browser version\n\n[Get the latest browser version (0.6.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js\n\n`npm install asyncready.js` (ready.js was taken).\n\n[Check out the source](https://github.com/thanpolas/ready.js/blob/master/lib/ready.js).\n\n## Documentation\n\nYou can find ready.js in the\n\n\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncready.js@0.6.1","dist":{"shasum":"2ab85e6f017593ba30f49f639ef319db956d4fe2","tarball":"http://registry.npmjs.org/asyncready.js/-/asyncready.js-0.6.1.tgz"},"maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}]},"0.6.2":{"name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","version":"0.6.2","homepage":"https://github.com/thanpolas/ready.js","author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"bugs":{"url":"https://github.com/thanpolas/ready.js/issues"},"licenses":[{"type":"APACHE2","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"dist/ready.node.js","engines":{"node":"~0.6.19"},"scripts":{"test":"grunt test"},"dependencies":{"qunit2node":"~0.3.1"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["async","flow","control"],"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 815bytes (gzip) ready.js is a powerfull tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control on the execution flow of your application.\n\nready.js runs both on the browser and node.js\n\n## Getting Started\n\n### Browser version\n\n[Get the latest browser version (0.6.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js\n\n`npm install asyncready.js` (ready.js was taken).\n\n[Check out the source](https://github.com/thanpolas/ready.js/blob/master/lib/ready.js).\n\n## Documentation\n\nYou can find ready.js in the\n\n\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncready.js@0.6.2","dist":{"shasum":"ebb096b4ea6fbf58c5de94cb7e1d65eb3fcf03d2","tarball":"http://registry.npmjs.org/asyncready.js/-/asyncready.js-0.6.2.tgz"},"maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}]},"0.6.3":{"name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","version":"0.6.3","homepage":"https://github.com/thanpolas/ready.js","author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"bugs":{"url":"https://github.com/thanpolas/ready.js/issues"},"licenses":[{"type":"APACHE2","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"dist/ready.node.js","engines":{"node":"~0.6.19"},"scripts":{"test":"grunt test"},"dependencies":{"qunit2node":"~0.3.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["async","flow","control"],"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 866bytes (gzip) ready.js is a powerfull and tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control on the execution flow of your application.\n\nready.js runs both on the browser and node.js\n\n## Getting Started\n\n### Browser version\n\n[Get the latest browser version (0.6.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js\n\n`npm install asyncready.js` (ready.js was taken).\n\n```javascript\n\nvar ss = { ready: require('asyncready.js') };\n\n// lib loaded in the ss.ready namespace, we are ready to go\n```\n\n[Check out the source](https://github.com/thanpolas/ready.js/blob/master/lib/ready.js) and the same source [adapted to run on node.js](https://github.com/thanpolas/ready.js/blob/master/dist/ready.node.js).\n\n\n## The Story\n\nready.js has **watches** which have **checks**. All *Checks* have to be *checked* in order to complete a *watch*. We can attach listeners on the completion of a single *check* or the completion of the *ready watch*, when all *cheks* are done.\n\nAssume we have 4 asynchronous operations that need to run, and we want to execute xyz methods when all 4 complete.\n\nWe will create a *ready watch*, let's name it `jobDone`.\n\n```javascript\nvar r = ss.ready('jobDone');\n```\n\nAs per our scenario, we want to watch the execution of 4 async operations. Say they are 2 db writes, 1 db read and 1 file operation. We'll have to create 4 *checks*.\n\n```javascript\n// our ready watch was stored in var r\nr.addCheck('db_write_one');\n\n// we can get the same ready watch every time we call ss.ready('jobDone')\nss.ready('jobDone')\n    .addCheck('db_write_two'); // ... and chain our method calls\n\n// addCheck methods can be chained\nr.addCheck('db_read_one')\n    .addCheck('file_op_one');\n```\n\nSo, at this point we have created our *ready watch* ('jobDone') and added 4 *checks* ('db_write_one', 'db_write_two', 'db_read_one' and 'file_op_one'). Let's add some listeners on the *watch* that will trigger when everything has finished.\n\n```javascript\n// As per our scenario we want to execute xyz methods when\n// our ready watch finishes. So, xyz, are actually x(), y()\n// and z() which are in our context:\nvar r = ss.ready('jobDone');\nr.addListener(x);\n// addListener methods cannot be chained as they return a string\n// we'll talk later about that... However we can chain this way to\n// avoid a variable declaration:\nss.ready('jobDone').addListener(y);\nss.ready('jobDone').addListener(z);\n```\n\nAwesome, we now have a *ready watch* with *checks* and listeners attached. Now, somewhere deep in our code, we do the async operations. When they are finished we want to inform our *ready watch* about it so it can check if everything is finished and trigger our listeners. Here is how we do it:\n\n```javascript\n// let's check db write one first...\nclient.set('one', 'this is db write one', function(err, reply){\n    /* Your stuff here */\n\n    // declare db write one check is finished\n    ss.ready('jobDone').check('db_write_one');\n});\n\n/* In the meantime... */\n\n// A cool feature with checks is that every added check on our\n// ready watch creates a method with the name we used.\n// So for cases where we don't care about the callback's parameters we can\n// inline the check call like this:\nclient.set('two', 'this is db write two', ss.ready('jobDone').db_write_two);\n\n/* Let's finish this up now... */\n\n// two remaining checks todo, remember to call the checks in any outcome\n// of your async operations, success or failure!\nclient.get('this_key_doesnt_exist', function(err, reply){\n    /* handle your error but ALWAYS check your watch! */\n    ss.ready('jobDone').check('db_read_on');\n});\n\n// the file read...\nfs.read(fd, buffer, offset, length, position, function(err, bytesRead, buffer){\n    /* do your magic */\n    ss.ready('jobDone').check('file_op_one');\n});\n```\n\nAnd that was it. Once all 4 *checks* are done the *ready watch* will execute all attached listeners. ready.js is pretty flexible, you can add listeners at any point in the lifespan of the *watch* and they will either queue up if the *watch* is not finished or synchronously execute if the *watch* is finished. You can also add listeners on single *checks*. Read bellow for the full API documentation.\n\n\n## Documentation\n\nIn the browser, you can find ready.js in the `ss.ready` namespace, or as mentioned above, if you run on node.js do a `require('asyncready.js');` to get the library.\n\n### ss.ready(name | function, opt_forceInit | opt_delay)\n\n`ss.ready` creates a new *ready* instance or returns an existing one if previously initialized.\n\nIf the first parameter is a *function* then `ss.ready` poses as [`.addListener`](#addlistenerfn-opt_delay) and attaches to the **'main'** watch. The *main watch* is hardcoded into the library and uses the name `main`.\n\nYou can access the default *'main'* watch with `ss.ready('main')` or plainly `ss.ready()`\n\nThe `opt_forceInit` option is a boolean which if set to true, will force re-initialization of the *watch*. A nice example of how to use it can be found in [Example 3](#example-3-ready-watch-inside-a-repeative-callback).\n\n### .addCheck(checkId)\n\n`.addCheck(checkId)` adds a *check* to the *ready watch*. Make sure `checkId` is a string or has a `.toString()` method.\n\nEach *check* that is added, has to be *checked* (aka finished) with the [`.check(checkId)`](#checkcheckid) call.\n\n`addCheck` returns the self instance so you can chain it.\n\nEvery *check* you add creates a new method in the instance using the `checkId` parameter as name. This new method is the same as calling `.check(checkId)`. See the example...\n\n```javascript\nvar r = ss.ready('authDone');\nr.addCheck('facebookDone');\n\nr.addCheck('twitterDone')\n    // let's try chaining...\n    .addCheck('localDone');\n\n/* Do you stuff, add listeners, etc */\n\n// facebook finished\nr.check('facebookDone');\n\n// twitter finished, use the newly created method to declare it's done\nr.twitterDone();\n// do the same with local auth\nr.localDone();\n\n```\n\n### .check(checkId)\n\n`.check(checkId)` declares that a *check* has finished.\n\n`check` returns the self instance so you can chain it.\n\n`check` can trigger execution of listeners if it's the last one of the *checks* to finish or if we have attached a [checkListener](#addchecklistenercheckid-fn-opt_delay) for this check.\n\n### .addListener(fn, opt_delay)\n\nAdds a listener for the completion of the current *ready watch*. `fn` has to be a function and `opt_delay` is an optional number which indicates delay of execution in miliseconds.\n\n`addListener` returns a unique identifier (string) that we can use to [remove the listener](#removelisteneruid-removechecklisteneruid).\n\n#### Why have a delay?\nOne of the common uses for ready.js is to watch when your application has initialized and is ready. So imagine you have a page load and you have to watch for multiple events... The DOM Ready event, when [server data loaded](https://github.com/thanpolas/server2js), when auth operations finished etc etc.\n\nWhen everything is done you want to do a series of operations like lazy load more libraries or whatnot. This is where *delay* comes into play and gives you the power to control execution flow.\n\n```javascript\nvar r = ss.ready('appReady');\nr.addCheck('DOM');\nr.addCheck('auth');\nr.addCheck('serverDataObjects');\n\n/* ... */\n\n// When our app is ready execute allDone to cleanup and update UI\nss.ready('appReady').addListener(allDone);\n\n/* ... */\n\n// lazy load widgets when our app is ready\nvar r = ss.ready('appReady');\n\n// lazy load twitter widget 300ms after app is ready\nr.addListener(lazyLoadTwitter, 300);\n\n// lazy load calendar widget 2seconds after app is ready\nr.addListener(lazyLoadCalendar, 2000);\n```\n\n### .addCheckListener(checkId, fn, opt_delay)\n\nAdds a listener for the completion of the specified *check*.\n\n`addCheckListener` behaves like [`addListener`](#addlistenerfn-opt_delay), returns a unique string identifier which can be used to [remove the check listener](#removelisteneruid-removechecklisteneruid)\n\n### .removeListener(uid), .removeCheckListener(uid)\n\nRemoves a listener from the *ready watch* or the specific *check*.\n\n`removeListener` and `removeCheckListener` return the current instance, so they are chainable.\n\n```javascript\n// create and construct our ready watch\nvar r = ss.ready('loadComplete')\n    .addCheck('googleLoaded')\n    .addCheck('twitterLoaded')\n    .addCheck('facebookLoaded');\n\n// add a ready listener and a check listener\nvar readyUid = r.addListener(onLoadComplete);\nvar checkUid = r.addCheckListener('twitterLoaded', onTwitterLoad);\n\n/* ... */\n\n// we want to remove the two listeners we added as they no longer are needed\nvar r = ss.ready('loadComplete');\n// remove the main watch listener\nr.removeListener(readyUid)\n    // and remove the check listener\n    .removeCheckListener(checkUid);\n```\n\n### .isDone(), .isCheckDone(checkId)\n\n`isDone` returns `boolean` if the *ready watch* has finished.\n\n`isCheckDone` returns `boolean` if the specified *check* has finished.\n\n\n### .dispose()\n\nWill dispose all references to *checks*, *listeners*, everything, from the current instance.\n\n### STATIC: ss.ready.reset()\n\n**Hard core delete action!**\n\nWill run `.dispose()` on all existing instances and remove any references to the instances.\n\n\n## Examples\n\n### Example 1: Our web application initializes...\n```javascript\n\nfunction appReady() {\n    /* do stuff */\n}\n\n// we'll use the main event to attach the appReady callback\nss.ready(appReady);\n\n// lazy load a few libs when app is ready\nss.ready(lazyLoadTwitter, 300);\nss.ready(lazyLoadCalWidget, 500);\n\n// now add the checks that we want to watch\nvar r = ss.ready(); // ready with no params, returns the default 'main' watch\n\nr.addCheck('DOM')\n    .addCheck('facebookAuth')\n    .addCheck('uiReady');\n\n// attach to document ready event using jQuery and inline execute DOM check\n$(document).ready(ss.ready().DOM);\n\n/* ... */\n\n// Listen for Facebook initial login status\nFB.getLoginStatus(function(response){\n    /* do your stuff */\n\n    // Check facebook watch\n    ss.ready().facebookAuth();\n});\n\n/* ... */\n\n// when our UI is ready and responsive trigger the ui check\nss.ready().check('uiReady');\n\n/* ... */\n\n```\n\n### Example 2: Listeners can be added after watch has finished\n```javascript\nvar r = ss.ready('allDone');\nr.addCheck('doneOne');\nr.addCheck('doneTwo');\n\n/* ... */\n\nr.check('doneOne');\nr.check('doneTwo');\n\n/* ... */\n\nr.addListener(function(){\n    /* will execute synchronously as the ready watch has finished */\n});\n```\n\n### Example 3: Ready watch inside a repeative callback\n```javascript\n\n// listen for click on User Search\n$('#button-search-users').on('click', function(e){\n\n    /* ... cook criteria, etc ... */\n\n    // disable our button\n    $(this).attr('disabled', 'disabled');\n\n    loadUsers(criteria, usersLoaded);\n});\n\n/**\n * When users finish loading and UI is populated\n * call this function\n * @return {void}\n */\nfunction usersLoadFinished() {\n    $('#button-search-users').removeAttr('disabled');\n}\n\n/**\n * Callback function for 'loadUsers' function\n *\n * @param  {Array.<Object>} allUsers An array containing user data objects\n * @return {void}\n */\nfunction usersLoaded(allUsers) {\n    // prepare our ready watch, force init as this is a repeative\n    // call and we don't want to load previous state\n    var r = ss.ready('usersLoaded', true);\n\n    // add checks for all our operations\n    r.addCheck('allParsed')\n    r.addCheck('uiReady');\n\n    // when all done execute usersLoadFinished\n    r.addListener(usersLoadFinished);\n\n    // go through all users\n    var user, userBlock;\n    for (var i = 0, l = allUsers.length ; i < l ; i++) {\n        // get the single user data object\n        user = allUsers[i];\n        // get the user markup block, it's an awesome class\n        userBlock = new UserBlock(user);\n\n        // userBlock needs to load the user's image\n        // and appear with a small animation fx on the DOM\n        // dynamically create ready checks for these events\n        r.addCheck('user-image-loaded' + user.id);\n        r.addCheck('user-animation-finished' + user.id);\n\n        // now attach the the userBlock's exposed events\n        userBlock.listen('imageLoad', r['user-image-loaded' + user.id]);\n        userBlock.listen('fxFinished', r['user-animation-finished' + user.id]);\n\n        // remember, checks are also assigned as methods on our ready instance.\n        //\n        // Our unique to this user, checkId ('user-image-loaded' + user.id) let's suppose\n        // it evaluates to 'user-image-loaded-444'. So this string literal has also been\n        // assigned as a method to the ready instance 'r'.\n        //\n        // This means we can access it at r['user-image-loaded-444'] and execute\n        // it using r['user-image-loaded-444']();\n\n        // append our userBlock to the DOM\n        $('#users-search-list').append(userBlock.render());\n    }\n\n    // loop finished\n    r.check('allParsed');\n\n    // now show the complete list with an animation fx and we are done\n    $('#users-search-list').fadeIn('slow', r.uiReady);\n}\n\n\n\n```\n\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncready.js@0.6.3","dist":{"shasum":"689b1130b96bd113fe0301519f494f36aa03d585","tarball":"http://registry.npmjs.org/asyncready.js/-/asyncready.js-0.6.3.tgz"},"maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}]},"0.6.4":{"name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","version":"0.6.4","homepage":"https://github.com/thanpolas/ready.js","author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"bugs":{"url":"https://github.com/thanpolas/ready.js/issues"},"licenses":[{"type":"APACHE2","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"dist/ready.node.js","engines":{"node":"~0.6.19"},"scripts":{"test":"grunt test"},"dependencies":{"qunit2node":"~0.3.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["async","flow","control"],"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 825 bytes (gzip) ready.js is a powerful and tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control of your application's execution flow.\n\nready.js runs both on the browser and node.js\n\n## Getting Started\n\n### Browser version\n\n[Get the latest browser version (0.6.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js\n\n`npm install asyncready.js` (ready.js was taken).\n\n```javascript\n\nvar ready = require('asyncready.js');\n\n// lib loaded in the ss.ready namespace, we are ready to go\n```\n\n[Check out the source](https://github.com/thanpolas/ready.js/blob/master/lib/ready.js) and the same source [adapted to run on node.js](https://github.com/thanpolas/ready.js/blob/master/dist/ready.node.js).\n\n\n## The Story\n\nready.js has **watches** which have **checks**. All *Checks* have to be *checked* in order to complete a *watch*. We can attach listeners on the completion of a single *check* or the completion of the *ready watch*, when all *cheks* are done.\n\nAssume we have 4 asynchronous operations that need to run, and we want to execute xyz methods when all 4 complete.\n\nWe will create a *ready watch*, let's name it `jobDone`.\n\n```javascript\nvar r = ss.ready('jobDone');\n```\n\nAs per our scenario, we want to watch the execution of 4 async operations. Say they are 2 db writes, 1 db read and 1 file operation. We'll have to create 4 *checks*.\n\n```javascript\n// our ready watch was stored in var r\nr.addCheck('db_write_one');\n\n// we can get the same ready watch every time we call ss.ready('jobDone')\nss.ready('jobDone')\n    .addCheck('db_write_two'); // ... and chain our method calls\n\n// addCheck methods can be chained\nr.addCheck('db_read_one')\n    .addCheck('file_op_one');\n```\n\nSo, at this point we have created our *ready watch* ('jobDone') and added 4 *checks* ('db_write_one', 'db_write_two', 'db_read_one' and 'file_op_one'). Let's add some listeners on the *watch* that will trigger when everything has finished.\n\n```javascript\n// As per our scenario we want to execute xyz methods when\n// our ready watch finishes. So, xyz, are actually x(), y()\n// and z() which are in our context:\nvar r = ss.ready('jobDone');\nr.addListener(x);\n// addListener methods cannot be chained as they return a string\n// we'll talk later about that... However we can chain this way to\n// avoid a variable declaration:\nss.ready('jobDone').addListener(y);\nss.ready('jobDone').addListener(z);\n```\n\nAwesome, we now have a *ready watch* with *checks* and listeners attached. Now, somewhere deep in our code, we do the async operations. When they are finished we want to inform our *ready watch* about it so it can check if everything is finished and trigger our listeners. Here is how we do it:\n\n```javascript\n// let's check db write one first...\nclient.set('one', 'this is db write one', function(err, reply){\n    /* Your stuff here */\n\n    // declare db write one check is finished\n    ss.ready('jobDone').check('db_write_one');\n});\n\n/* In the meantime... */\n\n// A cool feature with checks is that every added check on our\n// ready watch creates a method with the name we used.\n// So for cases where we don't care about the callback's parameters we can\n// inline the check call like this:\nclient.set('two', 'this is db write two', ss.ready('jobDone').db_write_two);\n\n/* Let's finish this up now... */\n\n// two remaining checks todo, remember to call the checks in any outcome\n// of your async operations, success or failure!\nclient.get('this_key_doesnt_exist', function(err, reply){\n    /* handle your error but ALWAYS check your watch! */\n    ss.ready('jobDone').check('db_read_on');\n});\n\n// the file read...\nfs.read(fd, buffer, offset, length, position, function(err, bytesRead, buffer){\n    /* do your magic */\n    ss.ready('jobDone').check('file_op_one');\n});\n```\n\nAnd that was it. Once all 4 *checks* are done the *ready watch* will execute all attached listeners. ready.js is pretty flexible, you can add listeners at any point in the lifespan of the *watch* and they will either queue up if the *watch* is not finished or synchronously execute if the *watch* is finished. You can also add listeners on single *checks*. Read bellow for the full API documentation.\n\n\n## Documentation\n\nIn the browser, you can find ready.js in the `ss.ready` namespace, or as mentioned above, if you run on node.js do a `require('asyncready.js');` to get the library.\n\n### ss.ready(name | function, opt_forceInit)\n\n`ss.ready` creates a new *ready* instance or returns an existing one if previously initialized.\n\nIf the first parameter is a *function* then `ss.ready` poses as [`.addListener`](#addlistenerfn) and attaches to the **'main'** watch. The *main watch* is hardcoded into the library and uses the name `main`.\n\nYou can access the default *'main'* watch with `ss.ready('main')` or plainly `ss.ready()`\n\nThe `opt_forceInit` option is a boolean which if set to true, will force re-initialization of the *watch*. A nice example of how to use it can be found in [Example 3](#example-3-ready-watch-inside-a-repeative-callback).\n\n### .addCheck(checkId)\n\n`.addCheck(checkId)` adds a *check* to the *ready watch*. Make sure `checkId` is a string or has a `.toString()` method.\n\nEach *check* that is added, has to be *checked* (aka finished) with the [`.check(checkId)`](#checkcheckid) call.\n\n`addCheck` returns the self instance so you can chain it.\n\nEvery *check* you add creates a new method in the instance using the `checkId` parameter as name. This new method is the same as calling `.check(checkId)`. See the example...\n\n```javascript\nvar r = ss.ready('authDone');\nr.addCheck('facebookDone');\n\nr.addCheck('twitterDone')\n    // let's try chaining...\n    .addCheck('localDone');\n\n/* Do you stuff, add listeners, etc */\n\n// facebook finished\nr.check('facebookDone');\n\n// twitter finished, use the newly created method to declare it's done\nr.twitterDone();\n// do the same with local auth\nr.localDone();\n\n```\n\n### .check(checkId)\n\n`.check(checkId)` declares that a *check* has finished.\n\n`check` returns the self instance so you can chain it.\n\n`check` can trigger execution of listeners if it's the last one of the *checks* to finish or if we have attached a [checkListener](#addchecklistenercheckid-fn) for this check.\n\n### .addListener(fn)\n\nAdds a listener for the completion of the current *ready watch*. `fn` has to be a function.\n\n`addListener` returns a unique identifier (string) that we can use to [remove the listener](#removelisteneruid-removechecklisteneruid).\n\n```javascript\nvar r = ss.ready('appReady');\nr.addCheck('DOM');\nr.addCheck('auth');\nr.addCheck('serverDataObjects');\n\n/* ... */\n\n// When our app is ready execute allDone to cleanup and update UI\nss.ready('appReady').addListener(allDone);\n\n/* ... */\n\n// load widgets when our app is ready\nvar r = ss.ready('appReady');\n\n// load twitter widget after app is ready\nr.addListener(lazyLoadTwitter);\n\n// load calendar widget after app is ready\nr.addListener(lazyLoadCalendar);\n```\n\n### .addCheckListener(checkId, fn)\n\nAdds a listener for the completion of the specified *check*.\n\n`addCheckListener` behaves like [`addListener`](#addlistenerfn), returns a unique string identifier which can be used to [remove the check listener](#removelisteneruid-removechecklisteneruid)\n\n### .removeListener(uid), .removeCheckListener(uid)\n\nRemoves a listener from the *ready watch* or the specific *check*.\n\n`removeListener` and `removeCheckListener` return the current instance, so they are chainable.\n\n```javascript\n// create and construct our ready watch\nvar r = ss.ready('loadComplete')\n    .addCheck('googleLoaded')\n    .addCheck('twitterLoaded')\n    .addCheck('facebookLoaded');\n\n// add a ready listener and a check listener\nvar readyUid = r.addListener(onLoadComplete);\nvar checkUid = r.addCheckListener('twitterLoaded', onTwitterLoad);\n\n/* ... */\n\n// we want to remove the two listeners we added as they no longer are needed\nvar r = ss.ready('loadComplete');\n// remove the main watch listener\nr.removeListener(readyUid)\n    // and remove the check listener\n    .removeCheckListener(checkUid);\n```\n\n### .isDone(), .isCheckDone(checkId)\n\n`isDone` returns `boolean` if the *ready watch* has finished.\n\n`isCheckDone` returns `boolean` if the specified *check* has finished.\n\n\n### .dispose()\n\nWill dispose all references to *checks*, *listeners*, everything, from the current instance.\n\n### STATIC: ss.ready.reset()\n\n**Hard core delete action!**\n\nWill run `.dispose()` on all existing instances and remove any references to the instances.\n\n\n## Examples\n\n### Example 1: Our web application initializes...\n```javascript\n\nfunction appReady() {\n    /* do stuff */\n}\n\n// we'll use the main event to attach the appReady callback\nss.ready(appReady);\n\n// load a few libs when app is ready\nss.ready(lazyLoadTwitter);\nss.ready(lazyLoadCalWidget);\n\n// now add the checks that we want to watch\nvar r = ss.ready(); // ready with no params, returns the default 'main' watch\n\nr.addCheck('DOM')\n    .addCheck('facebookAuth')\n    .addCheck('uiReady');\n\n// attach to document ready event using jQuery and inline execute DOM check\n$(document).ready(ss.ready().DOM);\n\n/* ... */\n\n// Listen for Facebook initial login status\nFB.getLoginStatus(function(response){\n    /* do your stuff */\n\n    // Check facebook watch\n    ss.ready().facebookAuth();\n});\n\n/* ... */\n\n// when our UI is ready and responsive trigger the ui check\nss.ready().check('uiReady');\n\n/* ... */\n\n```\n\n### Example 2: Listeners can be added after watch has finished\n```javascript\nvar r = ss.ready('allDone');\nr.addCheck('doneOne');\nr.addCheck('doneTwo');\n\n/* ... */\n\nr.check('doneOne');\nr.check('doneTwo');\n\n/* ... */\n\nr.addListener(function(){\n    /* will execute synchronously as the ready watch has finished */\n});\n```\n\n### Example 3: Ready watch inside a repeative callback\n```javascript\n\n// listen for click on User Search\n$('#button-search-users').on('click', function(e){\n\n    /* ... cook criteria, etc ... */\n\n    // disable our button\n    $(this).attr('disabled', 'disabled');\n\n    loadUsers(criteria, usersLoaded);\n});\n\n/**\n * When users finish loading and UI is populated\n * call this function\n * @return {void}\n */\nfunction usersLoadFinished() {\n    $('#button-search-users').removeAttr('disabled');\n}\n\n/**\n * Callback function for 'loadUsers' function\n *\n * @param  {Array.<Object>} allUsers An array containing user data objects\n * @return {void}\n */\nfunction usersLoaded(allUsers) {\n    // prepare our ready watch, force init as this is a repeative\n    // call and we don't want to load previous state\n    var r = ss.ready('usersLoaded', true);\n\n    // add checks for all our operations\n    r.addCheck('allParsed')\n    r.addCheck('uiReady');\n\n    // when all done execute usersLoadFinished\n    r.addListener(usersLoadFinished);\n\n    // go through all users\n    var user, userBlock;\n    for (var i = 0, l = allUsers.length ; i < l ; i++) {\n        // get the single user data object\n        user = allUsers[i];\n        // get the user markup block, it's an awesome class\n        userBlock = new UserBlock(user);\n\n        // userBlock needs to load the user's image\n        // and appear with a small animation fx on the DOM\n        // dynamically create ready checks for these events\n        r.addCheck('user-image-loaded' + user.id);\n        r.addCheck('user-animation-finished' + user.id);\n\n        // now attach the the userBlock's exposed events\n        userBlock.listen('imageLoad', r['user-image-loaded' + user.id]);\n        userBlock.listen('fxFinished', r['user-animation-finished' + user.id]);\n\n        // remember, checks are also assigned as methods on our ready instance.\n        //\n        // Our unique to this user, checkId ('user-image-loaded' + user.id) let's suppose\n        // it evaluates to 'user-image-loaded-444'. So this string literal has also been\n        // assigned as a method to the ready instance 'r'.\n        //\n        // This means we can access it at r['user-image-loaded-444'] and execute\n        // it using r['user-image-loaded-444']();\n\n        // append our userBlock to the DOM\n        $('#users-search-list').append(userBlock.render());\n    }\n\n    // loop finished\n    r.check('allParsed');\n\n    // now show the complete list with an animation fx and we are done\n    $('#users-search-list').fadeIn('slow', r.uiReady);\n}\n\n```\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncready.js@0.6.4","dist":{"shasum":"16b60a29365b2f97a53e344a72044c0c10d92883","tarball":"http://registry.npmjs.org/asyncready.js/-/asyncready.js-0.6.4.tgz"},"maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}]},"0.7.0":{"name":"asyncready.js","description":"Watches over multiple async operations and triggers listeners when all or some are complete","version":"0.7.0","homepage":"https://github.com/thanpolas/ready.js","author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"bugs":{"url":"https://github.com/thanpolas/ready.js/issues"},"licenses":[{"type":"APACHE2","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"dist/ready.node.js","engines":{"node":"~0.6.19"},"scripts":{"test":"grunt test"},"dependencies":{"qunit2node":"~0.3.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["async","flow","control"],"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 854 bytes (gzip) ready.js is a powerful and tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control of your application's execution flow.\n\nRun ready.js on the **browser** or **node.js**!\n\n## Contents\n\n* [Getting Started](#getting-started)\n* [The Concept](#the-concept)\n* [Documentation](#documentation)\n* [Examples](#examples)\n* [License - Apache2](#license)\n\n## Getting Started\n\n### Browser version\n\n[Get the latest browser version (0.7.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js version\n\n`npm install asyncready.js` (*ready.js was taken*).\n\n```javascript\n\nvar ready = require('asyncready.js');\n\n```\n\n## The Concept\n\n* Each ready.js instance is a **ready watch**. Each *watch* can have one or multiple **checks**.\n* All *Checks* have to finish in order to complete a *watch*.\n* Listeners can be attached  on the completion of a single *check* or the completion of the whole *ready watch*.\n\nAssume we have 4 asynchronous operations that need to run, and we want to execute x(), y() and z() functions when all 4 are complete.\n\nFirst, we'll create a *ready watch*, let's name it `jobDone`.\n\n```javascript\nvar r = ss.ready('jobDone');\n```\n\nThe async operations are 2 db writes, 1 db read and 1 file operation. We'll have to create 4 *checks*.\n\n```javascript\n// our ready watch was stored in var r\nr.addCheck('db_write_one');\n\n// we can get the same ready watch every time we call ss.ready('jobDone')\nss.ready('jobDone')\n    .addCheck('db_write_two') // ... and chain our method calls\n    .addCheck('db_read_one')\n    .addCheck('file_op_one');\n```\n\nSo, at this point we have created the *ready watch* ('**jobDone**') and added 4 *checks* ('**db_write_one**', '**db_write_two**', '**db_read_one**' and '**file_op_one**').\n\nLet's add some listeners on the *watch*.\n\n```javascript\n// As per our scenario we want to execute x, y and z functions:\nvar r = ss.ready('jobDone');\nr.addListener(x)\n    .addListener(y) // chain chain chain\n    .addListener(z);\n```\n\nAwesome, we now have a *ready watch* with *checks* and listeners attached. Now, somewhere deep in our code, we do the async operations. When they are finished we want to inform our *ready watch* about it, so it knows when everything is finished and trigger the listeners.\n\n```javascript\n// let's check db write one first...\nclient.set('one', 'this is db write one', function(err, reply){\n    /* Your stuff here */\n\n    // declare db write one check is finished\n    ss.ready('jobDone').check('db_write_one', 'we can pass', 'any number', 'of arguments');\n});\n\n/* In the meantime... */\n\n// A cool feature with checks is that every added check on our\n// ready watch creates a method with the name we used.\n// So for cases where we don't want to create an anon func\n// we can inline the check call like this:\nclient.set('two', 'this is db write two', ss.ready('jobDone').db_write_two);\n\n/* Let's finish this up now... */\n\n// two remaining checks todo, remember to call the checks in any outcome\n// of your async operations, success or failure!\nclient.get('this_key_doesnt_exist', function(err, reply){\n    /* handle your error but ALWAYS check your watch! */\n    ss.ready('jobDone').check('db_read_on', false);\n    // we passed a false argument so we can inform our\n    // listeners of the false state\n});\n\n// the file read operation...\nfs.read(fd, buffer, offset, length, position, function(err, bytesRead, buffer){\n    /* do your magic */\n    ss.ready('jobDone').check('file_op_one');\n});\n```\n\nAnd that was it. Once all 4 *checks* are done, the *ready watch* will execute all attached listeners.\n\nready.js is pretty flexible, you can add listeners at any point in the lifespan of the *watch* and they will either queue up if the *watch* is not finished or if it's finished, synchronously execute.\n\n## Documentation\n\nIn the browser, you can find ready.js in the `ss.ready` namespace, or if you run on node.js do a `require('asyncready.js');`.\n\n### Documentation Contents\n\n* [ss.ready(name | function, opt_forceInit)](#ssreadyname--function-opt_forceinit) : Get a new or existing ready instance.\n* [.addCheck(checkId)](#addcheckcheckid) : Add a check to the *ready watch*.\n* [.check(checkId, var_args)](#checkcheckid-var_args) : Mark a *check* as done.\n* [.addListener(fn, opt_selfObj)](#addlistenerfn-opt_selfobj) : Add a listener the *ready watch* completion.\n* [.addCheckListener(checkId, fn, opt_selfObj)](#addchecklistenercheckid-fn-opt_selfobj) : Add a listener on the completion of a specific *check*.\n* [.getArgs(checkId)](#getargscheckid) : Get arguments passed to a *check*.\n* [.isDone(), .isCheckDone(checkId)](#isdone-ischeckdonecheckid) : Query if a *ready watch* or a specific *check* have finished.\n* [.dispose()](#dispose) : Dispose all references of the ready instance.\n* [STATIC: ss.ready.reset()](#static-ssreadyreset) : Hard core delete action!\n\n### ss.ready(name | function, opt_forceInit)\n\n**Returns**: Ready Instance\n\n`ss.ready` creates a new *ready* instance or returns an existing one if it was previously initialized.\n\nThe `opt_forceInit` option is a boolean which if set to true, will force re-initialization of the *watch*. A nice example of how to use it can be found in [Example 3](#example-3-ready-watch-inside-a-repeative-callback).\n\nIf the first parameter is a *function* then `ss.ready` poses as [`.addListener`](#addlistenerfn-opt_selfobj) and attaches to the **'main'** watch. The *main watch* is hardcoded into the library and uses the name `main`.\n\nYou can access the default *'main'* watch with `ss.ready('main')` or plainly `ss.ready()`\n\n### .addCheck(checkId)\n\n**Returns**: Ready Instance\n\n`.addCheck(checkId)` adds a *check* to the *ready watch*. Make sure `checkId` is a string or has a `.toString()` method.\n\nEach *check* that is added, has to be *checked* (aka finished) with the [`.check(checkId)`](#checkcheckid-var_args) call.\n\n`addCheck` returns the self instance so you can chain it.\n\nEvery *check* you add creates a new method in the instance using the `checkId` parameter as name. This new method is the same as calling `.check(checkId)`. See the example...\n\n```javascript\nvar r = ss.ready('authDone');\nr.addCheck('facebookDone');\n\nr.addCheck('twitterDone')\n    // let's try chaining...\n    .addCheck('localDone');\n\n/* Do your stuff, add listeners, etc */\n\n// facebook finished\nr.check('facebookDone');\n\n// twitter finished, use the newly created\n// method to declare it's done\nr.twitterDone();\n// do the same with local auth\nr.localDone();\n\n```\n\n### .check(checkId, var_args)\n\n**Returns**: Ready Instance\n\n`.check(checkId)` declares that a *check* has finished.\n\n`check` returns the self instance so you can chain it.\n\n`check` can trigger execution of listeners if it's the last one of the *checks* to finish or if we have attached a [checkListener](#addchecklistenercheckid-fn-opt_selfobj) for this check.\n\nYou can pass any number or parameters and they can be accessed via the [getArgs](#getargscheckid) method.\n\n### .addListener(fn, opt_selfObj)\n\n**Returns**: Ready Instance\n\nAdds a listener for the completion of the current *ready watch*. `fn` has to be a function.\n\n`addListener` returns the self instance so you can chain it.\n\nOptionally you can set an object to apply on the executed listener.\n\nEach listener that is executed gets passed the Ready Instance as a parameter. The Ready Instance is particularly usefull to query ([getArgs](#getargscheckid)) for the parameters that were passed on each check that was executed.\n\n```javascript\nvar r = ss.ready('appReady');\nr.addCheck('DOM');\nr.addCheck('auth');\nr.addCheck('serverDataObjects');\n\n// When our app is ready execute allDone to cleanup and update UI\nss.ready('appReady').addListener(allDone)\n// load widgets when our app is ready\n    .addListener(loadTwitter);\n    // load calendar widget after app is ready\n    .addListener(loadCalendar);\n\n```\n\n### .addCheckListener(checkId, fn, opt_selfObj)\n\n**Returns**: Ready Instance\n\nAdds a listener for the completion of the specified *check*.\n\n`addCheckListener` returns the self instance so you can chain it.\n\nOptionally you can set an object to apply on the executed listener.\n\nEach Check listener that is executed has aguments as they were passed to the [check](#checkcheckid-var_args) call.\n\n```javascript\nvar r = ss.ready('go ready go');\n// add a check\nr.addCheck('theCheck');\n\n// add a check listener\nss.ready('go ready go').addCheckListener(allDone)\n\n// gotta love func expressions\nfunction allDone(status, message) {\n    status === true; // true\n    message === 'foo'; // true too\n}\n\n/* ... */\n\n// check the check\nss.ready('go ready go').theCheck(true, 'foo');\n```\n\n### .getArgs(checkId)\n\n**Returns**: Array\n\nReturns an array of arguments passed to a [check](#checkcheckid-var_args) identified by *checkId*.\n\n```javascript\nvar r = ss.ready('appReady');\nr.addCheck('DOM');\nr.addCheck('auth');\n\n// declare our listener function\n// 'ready' is the instance of the ready watch\nvar onAppReady = function(ready) {\n\n    // get auth resolution\n    var authArgs = ready.getArgs('auth');\n\n    authArgs[0] === true; // true\n    authArgs[1] === {nick: 'foo'}; // also true (if only we could deep compare)\n};\n\nss.ready('appReady').addListener(onAppReady);\n\n/* ... */\n// listen for DOM ready event\nvar r = ss.ready('appReady');\njQuery.ready(r.DOM);\n\n// our auth resolution function...\nfunction userResolution(var_args) {\n    // stuff\n    // more stuff\n\n    // oh we have an authed user, run check and\n    // declare it\n    ss.ready('appReady').check('auth', true, {nick: 'foo'});\n}\n\n```\n\n### .isDone(), .isCheckDone(checkId)\n\n`isDone` returns `boolean` if the *ready watch* has finished.\n\n`isCheckDone` returns `boolean` if the specified *check* has finished.\n\n\n### .dispose()\n\nWill dispose all references to *checks*, *listeners*, everything, from the current instance.\n\n### STATIC: ss.ready.reset()\n\n**Hard core delete action!**\n\nWill run `.dispose()` on all existing instances and remove any references to the instances.\n\n\n## Examples\n\n### Example 1: Our web application initializes...\n```javascript\n\nfunction appReady(ready) {\n    /* do stuff */\n\n    // check if facebook authed us\n    if (ready.getArgs('facebookAuth')[0]) {\n        // we are authed from FB\n    }\n}\n\n// we'll use the main event to attach the appReady callback\nss.ready(appReady);\n\n// load a few libs when app is ready\nss.ready(loadTwitter);\nss.ready(loadCalWidget);\n\n// now add the checks that we want to watch\nvar r = ss.ready(); // ready with no params, returns the default 'main' watch\n\nr.addCheck('DOM')\n    .addCheck('facebookAuth')\n    .addCheck('uiReady');\n\n// attach to document ready event using jQuery and inline execute DOM check\n$(document).ready(ss.ready().DOM);\n\n/* ... */\n\n// Listen for Facebook initial login status\nFB.getLoginStatus(function(response){\n    // check if we are authed with FB\n    var isAuthed = 'connected' == response['status'];\n    /* do your stuff */\n\n    // Check facebook watch\n    ss.ready().facebookAuth(isAuthed);\n});\n\n/* ... */\n\n// when our UI is ready and responsive trigger the ui check\nss.ready().check('uiReady');\n\n/* ... */\n\n```\n\n### Example 2: Listeners can be added after watch has finished\n```javascript\nvar r = ss.ready('allDone');\nr.addCheck('doneOne');\nr.addCheck('doneTwo');\n\n/* ... */\n\nr.check('doneOne');\nr.check('doneTwo');\n\n/* ... */\n\nr.addListener(function(ready){\n    /* will execute synchronously as the ready watch has finished */\n});\n```\n\n### Example 3: Ready watch inside a repeative callback\n```javascript\n\n/**\n * A callback method for an ajax call to our\n * server that has loaded a set of users.\n *\n * We have to render them and emit an event when\n * all ui / ux is done\n *\n * @param {Array.<Object>} allUsers an array with user objects\n * @return {void}\n */\nusers.prototype.renderUsers = function(allUsers) {\n    // prepare our ready watch, force init as this is a repeative\n    // call and we don't want to load previous state\n    var r = ss.ready('usersRendered', true);\n\n    // add checks for our two main operations\n    r.addCheck('allParsed')\n    r.addCheck('uiReady');\n\n    // when all done execute _usersRenderFinished and apply\n    // our current scope\n    r.addListener(this._usersRenderFinished, this);\n\n    // go through all users\n    var user, userBlock;\n    for (var i = 0, l = allUsers.length ; i < l ; i++) {\n        // get the single user data object\n        user = allUsers[i];\n        // get the user markup block, from our awesome \"class\"\n        userBlock = new UserBlock(user);\n\n        // userBlock needs to load the user's image\n        // and appear with a small animation fx on the DOM\n        // dynamically create ready checks for these events\n        r.addCheck('user-image-loaded' + user.id);\n        r.addCheck('user-animation-finished' + user.id);\n\n        // now attach the the userBlock's exposed events\n        userBlock.listen('imageLoad', r['user-image-loaded' + user.id]);\n        userBlock.listen('fxFinished', r['user-animation-finished' + user.id]);\n\n        // remember, checks are also assigned as methods on our ready instance.\n        //\n        // Our unique to this user, checkId ('user-image-loaded' + user.id) let's suppose\n        // it evaluates to 'user-image-loaded-444'. So this string literal has also been\n        // assigned as a method to the ready instance 'r'.\n        //\n        // This means we can access it at r['user-image-loaded-444'] and execute\n        // it using r['user-image-loaded-444']();\n\n        // append our userBlock to the DOM\n        $('#users-search-list').append(userBlock.render());\n    }\n\n    // loop finished, check 'allParased' and pass the user array\n    r.check('allParsed', allUsers);\n}\n\n/**\n * When our UI has finished rendering and UX is done\n * call this function\n * @param {ss.ready} ready The ready instance\n * @return {void}\n */\nusers.prototype._usersRenderFinished = function(ready) {\n    // re-enable our search button\n    $('#button-search-users').removeAttr('disabled');\n\n    // get the users array\n    var args = ready.getArgs('allParsed');\n    var allUsers = args[0];\n\n    // now emmit an event that we are done\n    ourEventEngine.trigger('users.searchRenderDone', allUsers);\n};\n\n```\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","_id":"asyncready.js@0.7.0","dist":{"shasum":"8fccdf29adda66f26ca38577b4a32833ec1752aa","tarball":"http://registry.npmjs.org/asyncready.js/-/asyncready.js-0.7.0.tgz"},"maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}]}},"readme":"# ready.js\n\nWatches over multiple async operations and triggers listeners when all or some are complete.\n\nAt only 815bytes (gzip) ready.js is a powerfull tiny library that alllows you to manage and monitor multiple asynchronous operations, giving you total control on the execution flow of your application.\n\nready.js runs both on the browser and node.js\n\n## Getting Started\n\n### Browser version\n[Get the latest browser version (0.6.0)](https://github.com/thanpolas/ready.js/raw/master/dist/ready.min.js).\n\n### node.js\n\n`npm install ready.js`\n\n[Check out the source](https://github.com/thanpolas/ready.js/blob/master/lib/ready.js).\n\nOr clone the repo with `git clone https://github.com/thanpolas/ready.js.git`.\n\n## Documentation\n_(Coming soon)_\n\n## License\nCopyright (c) 2012 Thanasis Polychronakis\nLicensed under the [APACHE2 license](http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"thanpolas","email":"thanpolas@gmail.com"}],"time":{"modified":"2012-07-10T19:44:28.878Z","created":"2012-07-08T11:10:00.226Z","0.6.0":"2012-07-08T11:10:03.540Z","0.6.1":"2012-07-08T11:14:38.676Z","0.6.2":"2012-07-08T11:18:51.076Z","0.6.3":"2012-07-08T16:34:24.745Z","0.6.4":"2012-07-08T17:26:13.500Z","0.7.0":"2012-07-10T19:44:28.878Z"},"author":{"name":"Thanasis Polychronakis","email":"thanpolas@gmail.com","url":"http://twitter.com/thanpolas"},"repository":{"type":"git","url":"git://github.com/thanpolas/ready.js.git"},"_attachments":{"asyncready.js-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-NM7LZm7K6QbJTXKUbSJGig==","length":16791,"stub":true},"asyncready.js-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZV4xNYryfmCsFkMzjGU+vA==","length":15533,"stub":true},"asyncready.js-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-W/ASRSSlfGz79sAJC4hXAA==","length":16061,"stub":true},"asyncready.js-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tbv7PMyi53XFWg8z6anhZQ==","length":11708,"stub":true},"asyncready.js-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-R/+ICoA31cDhA3mc+yyNWA==","length":11705,"stub":true},"asyncready.js-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tawht2ILnWyZVALRv+zJlA==","length":11713,"stub":true}}}},
{"id":"asynct","key":"asynct","value":{"rev":"9-6b1b828e5af8c602891aba07b5f3f28c"},"doc":{"_id":"asynct","_rev":"9-6b1b828e5af8c602891aba07b5f3f28c","name":"asynct","description":"simple asyncronous test runner","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"asynct","version":"1.0.0","description":"simple asyncronous test runner","homepage":"http://github.com/dominictarr/asynct","repository":{"type":"git","url":"git://github.com/dominictarr/asynct.git"},"dependencies":{"ctrlflow":">=0.0.3","test-cmd":"1"},"main":"./asynct.js","author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"bin":{"asynct":"./cmd.js"},"_npmJsonOpts":{"file":"/home/dominic/.npm/asynct/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asynct@1.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"faf86aff081d4fbbb0dae3bbcd9e10351f7341a4","tarball":"http://registry.npmjs.org/asynct/-/asynct-1.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.0.1":{"name":"asynct","version":"1.0.1","description":"simple asyncronous test runner","homepage":"http://github.com/dominictarr/asynct","repository":{"type":"git","url":"git://github.com/dominictarr/asynct.git"},"dependencies":{"ctrlflow":"0.0.3","test-cmd":"1"},"main":"./asynct.js","author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"bin":{"asynct":"./cmd.js"},"_npmJsonOpts":{"file":"/home/dominic/.npm/asynct/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"asynct@1.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5c782e3768495653b1134dd2d9ab115c2c44a5ad","tarball":"http://registry.npmjs.org/asynct/-/asynct-1.0.1.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.0.2":{"name":"asynct","version":"1.0.2","description":"simple asyncronous test runner","homepage":"http://github.com/dominictarr/asynct","repository":{"type":"git","url":"git://github.com/dominictarr/asynct.git"},"dependencies":{"ctrlflow":"0.0.3","test-cmd":"1"},"main":"./asynct.js","author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"bin":{"asynct":"./cmd.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"asynct@1.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"63c4eee7388eef2954676030ad729e5e3ed04969","tarball":"http://registry.npmjs.org/asynct/-/asynct-1.0.2.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"1.1.0":{"name":"asynct","version":"1.1.0","description":"simple asyncronous test runner","homepage":"http://github.com/dominictarr/asynct","repository":{"type":"git","url":"git://github.com/dominictarr/asynct.git"},"dependencies":{"ctrlflow":"0.0.3","test-cmd":"1"},"main":"./asynct.js","author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"scripts":{"test":"meta-test test/*.js"},"bin":{"asynct":"./cmd.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"asynct@1.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"3bb2c507d3a13f2000ba05869a1a740c21880913","tarball":"http://registry.npmjs.org/asynct/-/asynct-1.1.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-05-07T12:07:31.583Z","created":"2011-08-10T23:09:21.077Z","1.0.0":"2011-08-10T23:09:24.718Z","1.0.1":"2011-09-08T00:58:41.172Z","1.0.2":"2011-11-05T04:02:06.728Z","1.1.0":"2012-05-07T12:07:31.583Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://bit.ly/dominictarr"},"repository":{"type":"git","url":"git://github.com/dominictarr/asynct.git"},"_attachments":{"asynct-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fsFEmPbzr+fB7rq/KvOesw==","length":2671,"stub":true},"asynct-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-GmIvqdLyB+Cpshuwtu7EBw==","length":2702,"stub":true},"asynct-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pbXLUnGcfmqOggSYGLJ5Sw==","length":1966,"stub":true},"asynct-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PE98l+Yo95MdNhZSX9drPQ==","length":1969,"stub":true}}}},
{"id":"asyncxml","key":"asyncxml","value":{"rev":"73-0c22b87a2ef83e1e8752be7b81911282"},"doc":{"_id":"asyncxml","_rev":"73-0c22b87a2ef83e1e8752be7b81911282","name":"asyncxml","description":"async xml builder and generator","dist-tags":{"latest":"0.4.7"},"versions":{"0.0.0":{"name":"asyncxml","description":"async xml builder and generator","version":"0.0.0","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":"0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.0.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b5337fc8a5b389d5f5739560d34e97dd341d6866","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.0.0.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.1.0":{"name":"asyncxml","description":"async xml builder and generator","version":"0.1.0","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":"0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.1.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1e8f8b179adaf3178ecbd98473dec347521a9f37","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.1.0.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.1.1":{"name":"asyncxml","description":"async xml builder and generator","version":"0.1.1","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":"0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.1.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cc2bf50f2774a70647d28a1a21f7321ac98f181f","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.1.1.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.1.2":{"name":"asyncxml","description":"async xml builder and generator","version":"0.1.2","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":"0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.1.2","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fb53b4324f58f563b6b92b578953c8962988dee9","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.1.2.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.1.3":{"name":"asyncxml","description":"async xml builder and generator","version":"0.1.3","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":"0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.1.3","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"005c26fbad23eb079f55693773fc2e7653f5fb8d","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.1.3.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.1.4":{"name":"asyncxml","description":"async xml builder and generator","version":"0.1.4","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.1.4","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"df01dba899a52fd9fdd07038e2261118579a53d0","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.1.4.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.1.5":{"name":"asyncxml","description":"async xml builder and generator","version":"0.1.5","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"browserify":"1.6.1","scopify":">= 0.1.0","uglify-js":">= 1.0.7","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.1.5","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d9e5369e57fd127ca81e9d8674193a7683c74039","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.1.5.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.2.0":{"name":"asyncxml","description":"async xml builder and generator","version":"0.2.0","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c2a05b3db07c0af235079db3a1a6b80b7a7ffdda","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.2.0.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.2.1":{"name":"asyncxml","description":"async xml builder and generator","version":"0.2.1","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.2.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"766364ad1f43cd99b8af93dbf8faad0ee302896f","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.2.1.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.2.2":{"name":"asyncxml","description":"async xml builder and generator","version":"0.2.2","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.2.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5368f06b16a08215b15d430a04a00676b1edb3d8","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.2.2.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.2.3":{"name":"asyncxml","description":"async xml builder and generator","version":"0.2.3","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","nodeunit":">= 0.5.4"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.2.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e494f988852500f0147a72f1f2dfdd1ca19205bd","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.2.3.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.3.0":{"name":"asyncxml","description":"async xml builder and generator","version":"0.3.0","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.0","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.3.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"10fce514f3a7602d8041bfa71dec4715c7e39c25","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.3.0.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.3.1":{"name":"asyncxml","description":"async xml builder and generator","version":"0.3.1","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.0","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.3.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a95dcd3e5b307efc0e361ad7688037e5e82ca5b4","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.3.1.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.3.2":{"name":"asyncxml","description":"async xml builder and generator","version":"0.3.2","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.3.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e5a177c6540dd3d2bddc49453e081ce11c2fb162","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.3.2.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.0":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.0","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"cf917bb798b28afee899a44e6e75ddc3c7cfd94c","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.0.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.1":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.1","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"87373d8ee4619d0ad5d173f9f295f4ff0d218b87","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.1.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.2":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.2","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"03ea78ab89480db82dd6367ef82eeb2ac77aefe2","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.2.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.3":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.3","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"0a7a079cf858960442efc6e7a2d4aa4d29c3f10d","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.3.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.4":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.4","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"c2f16fe8f5fd3d0daff5219d919371b663efa82e","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.4.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.5":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.5","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4768cbf9c667df65278d028e3638b7a56679d20e","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.5.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.6":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.6","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6452c2e3669e4d9332f15f285f665107fb25a464","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.6.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.write(data)\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(xml)\n```\nSame as `Tag::write`.\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function() { … })\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\njust add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.4.7":{"name":"asyncxml","description":"async xml builder and generator","version":"0.4.7","homepage":"https://github.com/dodo/node-asyncxml","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"main":"asyncxml.js","engines":{"node":">= 0.4.x"},"keywords":["async","xml","generation","stream","browser"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"devDependencies":{"coffee-script":">= 1.1.2","muffin":">= 0.2.6","browserify":"1.6.1","scopify":">= 0.1.0","dt-stream":">= 0.1.1","nodeunit":">= 0.7.4"},"licenses":[{"type":"MIT","url":"http://github.com/dodo/node-asyncxml/raw/master/LICENSE"}],"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"asyncxml@0.4.7","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"cfd34150f64d656a06dd49f2672a4588d949be64","tarball":"http://registry.npmjs.org/asyncxml/-/asyncxml-0.4.7.tgz"},"readme":"\n# [async XML Generator](https://github.com/dodo/node-asyncxml)\n\n> performance? foock it! i'm faster than that.\n\nasync xml builder and generator\n\nnukular engine of [Δt](http://dodo.github.com/node-dynamictemplate/)\n\nRuns on server and browser side (same code).\n\n## install\n\n    npm install asyncxml\n\n## usage\n\n```javascript\nasyncxml = require('asyncxml')\nxml = new asyncxml.Builder({pretty:true})\nxml.on('data', function (chunk) {\n    console.log(chunk);\n})\n// build some xml\nxml.tag(\"xml\", {version:\"1.0\"})\n        .tag(\"list\")\n            .tag(\"entry\", function () {\n                this.attr('id', 1)\n            }).up()\n            .tag(\"entry\", {id:2}, \"foo\").up()\n        .up()\n    .up()\n.end()\n```\n\n```coffeescript\n# this would result in the same xml\nxml.tag \"xml\", version:\"1.0\", ->\n    @$tag \"list\", ->\n        @$tag \"entry\", ->\n            @attr('id', 1)\n        @$tag \"entry\", id:2, \"foo\"\n    @up().end()\n```\n\n```xml\n<!-- stdout -->\n<xml version=\"1.0\">\n  <list>\n    <entry id=1/>\n    <entry id=2>\n    foo\n    </entry>\n  </list>\n</xml>\n\n```\n\n## api\n\n### Builder([opts])\n\n```javascript\nxml = new asyncxml.Builder({pretty:true})\n```\n * `opts.pretty` switch to toggle pretty printing of the xml output\n * `opts.level` start indention level of xml (starting with `-1`) when pretty is on\n\nUse this to build and grow a XML forest.\n\nThe Builder provides a single environment for many tags and an API for Adapters to interact with the tag events.\n\n#### xml.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::tag`.\n\n\n#### xml.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"xml\", {version:\"1.0\"}, function() { … })\n```\nSame as `Tag::$tag`.\n\n\n#### xml.show()\n\n```javascript\nxml.show()\n```\nSame as `Tag::show`.\n\n\n#### xml.hide()\n\n```javascript\nxml.hide()\n```\nSame as `Tag::hide`.\n\n\n#### xml.remove([opts])\n\n```javascript\nxml.remove({soft:true})\n```\nSame as `Tag::remove`.\n\n\n#### xml.ready(callback)\n\n```javascript\nxml.ready(function () {\n  console.log(\"builder is done.\")\n})\n```\nInstead of `Tag::ready` it waits for the `end` event,\n\n\n#### xml.end()\n\n```javascript\nxml.end()\n```\nSame as `Tag::end` but without a `close` event.\n\n\n#### xml.register(type, checkfn)\n\n```javascript\nxml.register('new', function (parent, tag, next) {\n    // this gets called _before_ every new tag gets announced ('new' and 'add' event)\n    next(tag) // call next with the new tag to approve that the new tag can be announced\n})\nxml.register('end', function (tag, next) {\n    // this gets called _before_ every gets closed\n    next(tag) // call next with the closing tag to approve that the tag can be closed\n})\n```\nThis is a plugin API method.\n\nThere are only 2 types: `[\"new\", \"end\"]`.\n\nThe `checkfn` function of type `new` must get 3 parameters: `(parent, tag, next)`.\n\nThe `checkfn` function of type `end` must get 2 parameters: `(tag, next)`.\n\nThe [Δt Compiler](http://dodo.github.com/node-dt-compiler/) uses this API to create new tags before others.\n\n\n#### xml.approve(type, parent, tag, callback)\n\nThis is an internal API method to invoke a `checkfn` list registered with `Builder::register` by plugins.\n\n\n#### xml.query(type, tag, key)\n\n```javascript\ntag.text()\ntag.attr('id')\ntag.add(adapter_specific_object)\n```\nThis is a adapter API method.\n\nEvery time a text, an attribute or a tag is requested the tag will ask the builder for the values. A adapter has now the opportunity to override the `query` method of the builder instance to provide a specialised query method.\n\nThe [jQuery Adapter](https://github.com/dodo/node-dt-jquery) for example uses it to provide the values right out of the DOM (eg for type text it returns the value of [jQuery.text](http://api.jquery.com/text/)).\n\n\n---\n\n### Tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag = new asyncxml.Tag(\"xml\", {version:\"1.0\"}, function() { … }, opts)\n```\n * `name` the [nodeName](https://developer.mozilla.org/en/DOM:element.nodeName)\n * `attrs` an object that contains all tag attributes\n * `children` a function representing the children scope of the tag (see `Tag::children` for more)\n * `opts` some internal options\n\nNormally you don't need to instantiate this, because you should use `Tag::tag` and `Builder::tag` instead.\n\n\n#### tag.tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.tag(\"name\", {attrs:null}, function () { … })\n// these work as well:\ntag.tag(\"name\", {attrs:null}, \"content\")\ntag.tag(\"name\", function () {…})\ntag.tag(\"name\", \"content\")\n```\nSame api as `Tag`.\n__info__ tag is not closed.\n\nEmits a `new` and `add` Event.\n\n\n#### tag.$tag(name, [attrs, [children, [opts]]])\n\n```javascript\ntag.$tag(\"sync\", function() { … })\n```\nSame api as `Tag`, with one difference: `tag.end()` is called right after the children scope (even when no children scope is applied).\n\nEmits a `new`, `add` and `end` Event (end is emitted after the children scope).\n\n\n#### tag.toString()\n\n```javascript\ntag.$tag(\"tag\", \"content\").toString()\n(new a.Tag(\"tag\", \"content\")).tag(\"troll\").up().end().toString()\n// both => '<tag>content</tag>'\n```\nThis returns the String representation of the tag when its closed.\n\nIt only contains text content, no children tags, because tags are garbage collected when their not in use anymore.\n\n\n#### tag.children(childrenscope)\n\n```javascript\ntag.children(function () {\n    this.attr({id:2})\n    this.$tag(\"quote\", \"trololo\") // same as this.$tag(\"quote\").children(\"trololo\")\n})\ntag.children(\"content\") // same as tag.text(\"content\")\n```\nThis applies a children scope on a tag.\n\nThe tag instance directly accessible via `this`.\n\nThe children parameter of `Tag::tag` is passed to this method.\n\nEmits whatever event is emitted inside the children scope (of course).\n\n\n#### tag.up([opts])\n\n```javascript\ntag.up()\ntag.up({end:false}) // don't close tag\n```\nUseful for chaining, because it returns the parent tag.\n\nIt closes the tag by default unless `opts.end` is set to false.\n\nCan emit an `end` Event.\n\n\n#### tag.add(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.add(other)\n```\nAppend a new Tag.\n\nAdapter specific objects can be passed too.\n\nFor example if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) you can pass a jQuery Object as parameter.\n\nEmits an `add` Event.\n\n\n#### tag.replace(newtag)\n\n```javascript\nother = new asyncxml.Tag(\"other\")\ntag.replace(other)\n```\nReplace a tag with another one.\n\n__todo__ merge tag instances on data model level\n\nEmits a `replace` Event.\n\n\n#### tag.remove()\n\n```javascript\ntag.remove()\n```\nRemove a tag immediately.\nThe tag gets automatically closed.\n\nEmits a `remove` Event.\n\n\n#### tag.attr([key, [value]])\n\n```javascript\ntag.attr() // results in an js object containing all tag attributes\ntag.attr(\"id\") // results in the value of attribute \"id\"\ntag.attr(\"id\", 3) // set attribute \"id\" to 3 and returns the tag instance for chaining\ntag.attr({id:4}) // set many attributes at once\n```\nSet or Get tag attributes.\n\nWhen using an adapter getting an attribute results in a value provided by the adapter.\n\nWhen getting a value the results can be interpreted as follow:\n\n* `undefined` the tag doesn't have this attribute\n* `null` the attributes doesn't have a value\n* everything else is a the value of the attribute\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting value is the return value of [jQuery.attr](http://api.jquery.com/attr/).\n\nEmits an `attr` Event.\n\n\n#### tag.text([content, [opts]])\n\n```javascript\ntag.text() // get text of a tag\ntag.text(\"content\") // set text\n```\nSet or Get tag text content.\n\nOptions:\n* `escape`\n* `append`\n\nEmits a `text` and `data` Event.\n\nWhen using an adapter getting text results in the content provided by the adapter.\n\ne.g. if you use the [jQuery Adapter](https://github.com/dodo/node-dt-jquery) the resulting text is the return value of [jQuery.text](http://api.jquery.com/text/).\n\n\n#### tag.raw(html, [opts])\n\n```javascript\ntag.raw(\"<div>notfunny</div>\")\n```\nInsert raw html content into a tag.\n\n\nEmits a `raw` and `data` Event.\n\n\n#### tag.write(data, [opts])\n\n```javascript\nfs = require('fs')\nfs.createReadStream(filename).pipe(tag)\n```\nWrite tag data.\n\nUseful to pipe file content into a tag (as text).\n(dunno what happens if you pipe binary through)\n\nOptions:\n* `escape`\n\nEmits a `data` Event.\n\n\n#### tag.hide()\n\n```javascript\ntag.hide()\n```\nHide a tag.\n\nWhen a tag is hidden, `data` events are omitted.\n\nEmits a `hide` Event.\n\n\n#### tag.show()\n\n```javascript\ntag.show()\n```\nShow a tag.\n\nReverses the effect from `Tag::hide`.\n\nEmits a `show` Event.\n\n\n#### tag.end()\n\n```javascript\ntag.end()\n```\nCloses a tag.\n\nThe `end` event will only appear when all children tags are closed.\n\nThe `close` event gets triggered when the closing part of the tag (`</tag>`) gets emitted.\n\nEmits an `end` and a `close` Event.\n\n---\n\n## events\n\nSome events have special behavior when it comes to where they can be received.\n\nMost events travel up the XML tree, some can be only received on their parents.\n\n### global\n\n```javascript\n['add', 'attr', 'text', 'raw', 'data', 'show', 'hide', 'remove', 'replace', 'close']\n````\nThese events can be received from every single tag.\n\nWhen you listen on a *specific tag* you get these events from the tag you are listening on and from all the children tags (recursive).\n\nWhen you listen on a *builder instance* you get all events from all tags.\n\n### local\n\n```javascript\n['new', 'end']\n```\nThese events can be received from every single tag.\n\nWhen you listen for `new` on a *specific tag* you get 'new' events from only the tag you are listening on and from all its direct children (only 1 level deep).\n\nWhen you listen for `new` on a *builder instance* you get 'new' events for all the tags that are created direclty on the builder.\n\nWhen you listen for `end` on a *specific tag* you get the 'end' event only from the tag you are listening on.\n\nWhen you listen for `end` on a *builder instance* you get the 'end' event when the last tag is closed.\n\n\n## partials\n\nIt's recursive! just add a builder instance to a tag:\n```javascript\nxml = new Builder\nsub = new Builder\nroot = xml.tag('root').add(sub).end()\n```\n\n\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-asyncxml.png)](http://travis-ci.org/dodo/node-asyncxml)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]}},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"time":{"modified":"2012-07-20T09:16:29.382Z","created":"2011-10-22T03:44:13.983Z","0.0.0":"2011-10-22T03:44:15.527Z","0.1.0":"2011-10-22T11:44:06.276Z","0.1.1":"2011-11-05T04:57:08.024Z","0.1.2":"2011-11-13T21:29:28.662Z","0.1.3":"2011-11-16T16:56:49.245Z","0.1.4":"2011-11-29T14:10:03.788Z","0.1.5":"2011-11-30T16:37:19.475Z","0.2.0":"2012-01-06T11:12:55.111Z","0.2.1":"2012-01-12T22:00:38.437Z","0.2.2":"2012-01-13T23:30:45.411Z","0.2.3":"2012-01-14T16:24:41.451Z","0.3.0":"2012-03-16T02:44:00.389Z","0.3.1":"2012-03-16T17:17:15.310Z","0.3.2":"2012-03-18T15:49:47.593Z","0.4.0":"2012-04-20T02:28:06.417Z","0.4.1":"2012-04-26T18:03:01.967Z","0.4.2":"2012-04-29T03:41:09.161Z","0.4.3":"2012-05-22T05:50:01.585Z","0.4.4":"2012-06-07T11:04:24.157Z","0.4.5":"2012-06-07T18:18:55.230Z","0.4.6":"2012-06-07T20:37:23.533Z","0.4.7":"2012-07-20T09:16:29.382Z"},"author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-asyncxml.git"},"_attachments":{"asyncxml-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-2l5oBeG8MwebDNNS5WVCIg==","length":22219,"stub":true},"asyncxml-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-6xUP2SdH7dtbT8aolq+XCQ==","length":19953,"stub":true},"asyncxml-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-lSu8AIfKFis9gTrTcwBb+g==","length":17080,"stub":true},"asyncxml-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-sE9GX5iW1xdieI0bcZBzFg==","length":17367,"stub":true},"asyncxml-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-1b1qButsG6bOrJNg2nrN0Q==","length":20132,"stub":true},"asyncxml-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-km5dCUsefdMTCT+jzOL5YA==","length":20070,"stub":true},"asyncxml-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-Rd0/vGcIdUTz03M9GKHxDA==","length":19924,"stub":true},"asyncxml-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-ejTPz5TXg41FuRCvAuZ6jQ==","length":17134,"stub":true},"asyncxml-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-Wf+AggZ5/+tIh7Jc36IDEA==","length":19702,"stub":true},"asyncxml-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-KPwAgOD4asByWz1Obp/kUw==","length":16492,"stub":true},"asyncxml-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-JQt2jL3rHGN/pXU5d/hZlQ==","length":19135,"stub":true},"asyncxml-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-sUYqFyihjVjI2TdbcGrhpA==","length":12949,"stub":true},"asyncxml-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-GL1wchevFWFDaMvceC+H2g==","length":12771,"stub":true},"asyncxml-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-Nk3Y+Os7JogTrFGTr1+EWQ==","length":12520,"stub":true},"asyncxml-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-vU+SgzYK2u7RlOulR3I8Dw==","length":12597,"stub":true},"asyncxml-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-1Yo2jG+AVF3eVEUNgHzBPA==","length":5954,"stub":true},"asyncxml-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-gG0WMYZfKVHtPEvCmCLukg==","length":5584,"stub":true},"asyncxml-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-oFLclsRLqbqFnbWFH1UQvg==","length":5523,"stub":true},"asyncxml-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-/WkZEUuTjFkrwD+it/W4/w==","length":4926,"stub":true},"asyncxml-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-CvGkHBLhlrijZmFSXp0gzQ==","length":4826,"stub":true},"asyncxml-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-agNx7mL3a3o2VlYymdAp5w==","length":5013,"stub":true},"asyncxml-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ajlweCQjaEX3wThArY/eJg==","length":4644,"stub":true}}}},
{"id":"asyngleton","key":"asyngleton","value":{"rev":"15-bae0f3ff05eccf9ab0bc1a5e27d6a155"},"doc":{"_id":"asyngleton","_rev":"15-bae0f3ff05eccf9ab0bc1a5e27d6a155","name":"asyngleton","description":"asynchronously generate singletons","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Craig Condon"},"name":"asyngleton","description":"asynchronously generate singletons","version":"0.0.0","repository":{"type":"git","url":"git://github.com/crcn/asyngleton.js.git"},"main":"./lib/index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"asyngleton@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7c359da182d4e9b27957b815d7df46a37127a362","tarball":"http://registry.npmjs.org/asyngleton/-/asyngleton-0.0.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.1":{"author":{"name":"Craig Condon"},"name":"asyngleton","description":"asynchronously generate singletons","version":"0.0.1","repository":{"type":"git","url":"git://github.com/crcn/asyngleton.js.git"},"main":"./lib/index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"asyngleton@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ac40beebd77742cfa1d2030116762da20b31295a","tarball":"http://registry.npmjs.org/asyngleton/-/asyngleton-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Craig Condon"},"name":"asyngleton","description":"asynchronously generate singletons","version":"0.0.2","repository":{"type":"git","url":"git://github.com/crcn/asyngleton.js.git"},"main":"./lib/index.js","dependencies":{},"devDependencies":{"structr":"*"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"asyngleton@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e4dc9119428c2a1aab15c89f9f36e27b3a2a11a7","tarball":"http://registry.npmjs.org/asyngleton/-/asyngleton-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"### Example\n\n```javascript\n\nvar asyngleton = require('../'),\nfs = require('fs');\n\n//called ONCE\nvar readDir = asyngleton(function(callback) {\n\tfs.readdir(__dirname, callback);\n})\n\n//initializes the singleton method above\nreadDir(function(err, files) {\n\t//do stuff\n})\n\n//called after there's a result\nreadDir(function(err, files) {\n\t//do stuff\n});\n\n```","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-05-29T03:53:07.030Z","created":"2012-04-26T21:43:02.840Z","0.0.0":"2012-04-26T21:43:03.724Z","0.0.1":"2012-04-26T23:49:22.010Z","0.0.2":"2012-05-29T03:53:07.030Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/asyngleton.js.git"},"_attachments":{"asyngleton-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-j110pSvMwL7wG7bj/TDv0Q==","length":10240,"stub":true},"asyngleton-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DtmW8RpNiIX/qCWHAzCaig==","length":10240,"stub":true},"asyngleton-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CqIDbtRzTrgy0LAxA71/Lg==","length":10240,"stub":true}}}},
{"id":"at-exit","key":"at-exit","value":{"rev":"3-b1860953be6705f7677c7cfcfa39daa1"},"doc":{"_id":"at-exit","_rev":"3-b1860953be6705f7677c7cfcfa39daa1","name":"at-exit","description":"like ruby #at_exit","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"rosylilly","email":"rosylilly@aduca.org","url":"http://rosylilly.github.com"},"name":"at-exit","description":"like ruby #at_exit","version":"0.0.1","homepage":"http://github.com/rosylilly/at_exit","repository":{"type":"git","url":"git://github.com/rosylilly/at_exit.git"},"main":"./index.js","engines":{"node":"*"},"dependencies":{},"_npmUser":{"name":"rosylilly","email":"rosylilly@aduca.org"},"_id":"at-exit@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"109d6b647e8623a63dd2c2cca2b003b0d39c0451","tarball":"http://registry.npmjs.org/at-exit/-/at-exit-0.0.1.tgz"},"maintainers":[{"name":"rosylilly","email":"rosylilly@aduca.org"}]}},"readme":null,"maintainers":[{"name":"rosylilly","email":"rosylilly@aduca.org"}],"time":{"modified":"2011-12-24T06:17:23.069Z","created":"2011-12-24T06:17:18.640Z","0.0.1":"2011-12-24T06:17:23.069Z"},"author":{"name":"rosylilly","email":"rosylilly@aduca.org","url":"http://rosylilly.github.com"},"repository":{"type":"git","url":"git://github.com/rosylilly/at_exit.git"},"_attachments":{"at-exit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-p/27r9ZCEHrbfbCNVuAroQ==","length":10240,"stub":true}}}},
{"id":"at-import","key":"at-import","value":{"rev":"7-c8c56337e164eeff0a9b3947304ef33d"},"doc":{"_id":"at-import","_rev":"7-c8c56337e164eeff0a9b3947304ef33d","name":"at-import","description":"A node.js module that combines JavaScript files through the use of an @import directive","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.2":{"name":"at-import","description":"A node.js module that combines JavaScript files through the use of an @import directive","author":{"name":"Michael Diolosa","email":"michael.diolosa@gmail.com","url":"http://twitter.com/mbrio"},"version":"1.0.2","main":"./at-import.js","repository":{"type":"git","url":"git@github.com:mbrio/at-import.git"},"_npmUser":{"name":"mbrio","email":"michael.diolosa@gmail.com"},"_id":"at-import@1.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"a24ea9f44044d377656a602031a24d5106e7caa8","tarball":"http://registry.npmjs.org/at-import/-/at-import-1.0.2.tgz"},"maintainers":[{"name":"mbrio","email":"michael.diolosa@gmail.com"}]},"1.0.4":{"name":"at-import","description":"A node.js module that combines JavaScript files through the use of an @import directive","author":{"name":"Michael Diolosa","email":"michael.diolosa@gmail.com","url":"http://twitter.com/mbrio"},"version":"1.0.4","main":"./at-import.js","repository":{"type":"git","url":"git@github.com:mbrio/at-import.git"},"dependencies":{"lazy":"1.0.7"},"_npmUser":{"name":"mbrio","email":"michael.diolosa@gmail.com"},"_id":"at-import@1.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"484d6d167f93383e07ff5f4a62c7b28058734904","tarball":"http://registry.npmjs.org/at-import/-/at-import-1.0.4.tgz"},"maintainers":[{"name":"mbrio","email":"michael.diolosa@gmail.com"}]},"1.0.5":{"name":"at-import","description":"A node.js module that combines JavaScript files through the use of an @import directive","author":{"name":"Michael Diolosa","email":"michael.diolosa@gmail.com","url":"http://twitter.com/mbrio"},"version":"1.0.5","main":"./at-import.js","repository":{"type":"git","url":"git@github.com:mbrio/at-import.git"},"dependencies":{"lazy":"1.0.7"},"_npmUser":{"name":"mbrio","email":"michael.diolosa@gmail.com"},"_id":"at-import@1.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"c4a171872514701ba26dcbb6b2168f455e022d6b","tarball":"http://registry.npmjs.org/at-import/-/at-import-1.0.5.tgz"},"maintainers":[{"name":"mbrio","email":"michael.diolosa@gmail.com"}]}},"readme":"@import.js\n===\nA node.js module that combines JavaScript files through the use of an @import\ndirective.\n\nRequirements\n---\n* [Node](http://nodejs.org/)\n\nIntroduction\n---\n@import.js is used to automate the concatenation of JavaScript files through\nthe use of a custom import directive comment. Only two types of paths are able\nto be passed to the import directive, a path to a directory or a path to a\nfile; it does not support wildcards and will only recognize files that end in\nthe `.js` extension. Directories will be searched recursively unless the\nshallow_import directive is used.\n\n@import.js will not import a file more than once. If an imported file\nreferences another file that has already been imported @import.js will ignore\nit.\n\nThe file names MUST be encased in double quotes (\"), single quotes (') will\nnot be recognized.\n\nYou may pass multiple files to a single directive, all files must be encased\nin double quotes and separated by commas.\n\nYou may use either single-line (//) or multi-line (/**/) comments.\n\nThe file referenced by the @import.js directive will be placed at the tab\nposition of the first character of the comment.\n\nDirective Examples:\n---\nGiven the following directory structure:\n\n    * main.js\n    * lib/\n        * attributes.js\n        * backbone/\n            * backbone.js\n        * jQuery.js\n    * views/    \n        * shared/\n            * _login.js\n        * view1.js\n        \n    \nThe following will import the files in this order:\n  main.js\n\n    // @import(\"main.js\")\n    \nThe following will import the files in this order:\n  lib/attributes.js, lib/backbone/backbone.js, lib/jQuery.js\n\n    /* @import(\"lib\") */\n    \nThe following will import the files in this order:\n  lib/jQuery.js, lib/attributes.js, lib/backbone/backbone.js\n  \n    // @import(\"lib/jQuery.js\", \"lib\")\n    \nThe following will import the files in this order:\n  views/view1.js\n\n    // @shallow_import(\"views\")\n\n\nLibrary Usage\n---\n    var atImport = require('at-import');\n    \n    atImport({\n      input: 'main.js',\n      output: 'script.js',\n      replacements = {\n        '@@VERSION@@': '1.0.0'\n      }\n    });\n\nArguments\n---\n    * `options`\n        * `input` = The input JavaScript file\n        * `output` = The output JavaScript file\n        * `replacements` = An object containing a map of text replacements\n    * `callback`\n    \nDemo\n---\nThe application within /demo contains a small display of how you could use\n@import.js to combine JS files.\n\n    cd demo\n    node build.js\n\nLicense\n---\nCopyright (c) 2011 Michael Diolosa, [@mbrio](http://twitter.com/mbrio)\n\nThe @import.js library is licensed under the MIT license. For\nmore information see the\n[Wiki](https://github.com/mbrio/at-import/wiki/License).","maintainers":[{"name":"mbrio","email":"michael.diolosa@gmail.com"}],"time":{"modified":"2012-03-28T13:56:08.260Z","created":"2011-12-16T04:09:01.946Z","1.0.2":"2011-12-16T04:09:02.395Z","1.0.4":"2011-12-18T21:48:33.998Z","1.0.5":"2012-03-28T13:56:08.260Z"},"author":{"name":"Michael Diolosa","email":"michael.diolosa@gmail.com","url":"http://twitter.com/mbrio"},"repository":{"type":"git","url":"git@github.com:mbrio/at-import.git"},"_attachments":{"at-import-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-z5h6RISBoW2vg56UUstmBA==","length":4814,"stub":true},"at-import-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rJdVErK0u/Mdo/jPF5tmsQ==","length":4733,"stub":true},"at-import-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0DfTB4odlHkVMOveWjUELA==","length":3882,"stub":true}}}},
{"id":"at_scheduler","key":"at_scheduler","value":{"rev":"3-5587061c90218d2e99b6e22d5b488b0b"},"doc":{"_id":"at_scheduler","_rev":"3-5587061c90218d2e99b6e22d5b488b0b","name":"at_scheduler","description":"AT event scheduler for your node","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"at_scheduler","description":"AT event scheduler for your node","version":"0.1.0","author":{"name":"Enrico Rubboli","url":"http://github.com/dn2k"},"bugs":{"url":"http://github.com/dn2k/node-scheduler/issues"},"repository":{"type":"git","url":"git://github.com/dn2k/node-scheduler.git"},"engine":["node >=0.1.90"],"main":"lib/scheduler","scripts":{"test":"nodeunit tests/*"},"dependencies":{"nodeunit":"=0.5.1"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"},{"type":"GPL","url":"http://www.gnu.org/copyleft/gpl.html"}],"contributors":[],"devDependencies":{},"_id":"at_scheduler@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"996ab70876fd25bfc0e6cb3935bb971c3103c857","tarball":"http://registry.npmjs.org/at_scheduler/-/at_scheduler-0.1.0.tgz"}}},"maintainers":[{"name":"erubboli","email":"rubboli@gmail.com"}],"time":{"modified":"2011-06-21T12:38:10.220Z","created":"2011-06-21T12:38:09.320Z","0.1.0":"2011-06-21T12:38:10.220Z"},"author":{"name":"Enrico Rubboli","url":"http://github.com/dn2k"},"repository":{"type":"git","url":"git://github.com/dn2k/node-scheduler.git"},"_attachments":{"at_scheduler-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6mYyEuBZ/s9ajGiMnMnRog==","length":1545,"stub":true}}}},
{"id":"atbar","key":"atbar","value":{"rev":"19-e9e906d4874afd4d8bf2d8349ed46dff"},"doc":{"_id":"atbar","_rev":"19-e9e906d4874afd4d8bf2d8349ed46dff","name":"atbar","description":"Async callback manager for javascript in nodejs and browser","dist-tags":{"latest":"0.4.2"},"versions":{"0.2.0":{"name":"atbar","version":"0.2.0","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspect":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3df1335cf9f67d8740667f1173b40822a4080359","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"atbar","version":"0.2.1","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"09cbcb7bce6dfa4a947863d7143bd15e988dd472","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.2.1.tgz"},"scripts":{}},"0.2.2":{"name":"atbar","version":"0.2.2","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"144387cb9fbb487740ecc28407452fc7c196bb95","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.2.2.tgz"},"scripts":{}},"0.2.3":{"name":"atbar","version":"0.2.3","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"d2585546d15aa01cd62db3b5bb838598f06ef98e","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.2.3.tgz"},"scripts":{}},"0.2.4":{"name":"atbar","version":"0.2.4","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"daae59ab5307ce8110f7d52336bef52592a34720","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.2.4.tgz"},"scripts":{}},"0.2.5":{"name":"atbar","version":"0.2.5","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"2d5a0ca973e4cbfc26863166db1a9b4acefba529","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.2.5.tgz"},"scripts":{}},"0.4.0":{"name":"atbar","version":"0.4.0","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"32b122f10f6d492f189ad289b5cd7b8624869d80","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.4.0.tgz"},"scripts":{}},"0.4.1":{"name":"atbar","version":"0.4.1","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"06f5d43b188ac29c0da6e13153953376c0152b93","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.4.1.tgz"},"scripts":{}},"0.4.2":{"name":"atbar","version":"0.4.2","main":"./atbar","description":"Async callback manager for javascript in nodejs and browser","keywords":["aync","callbacks","nodejs","browser","coffeescript"],"homepage":"https://github.com/mark-hahn/atbar","repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"dependencies":{"underscore":">=1.0.0","underscore.string":">=1.0.0","underscore.inspector":">=0.1.0"},"devDependencies":{},"_id":"atbar@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"18b83af405fff775986b4cb95b7691806e198138","tarball":"http://registry.npmjs.org/atbar/-/atbar-0.4.2.tgz"},"scripts":{}}},"maintainers":[{"name":"mark-hahn","email":"mark@hahnca.com"}],"time":{"modified":"2011-06-11T21:10:53.982Z","created":"2011-06-01T17:11:41.929Z","0.2.0":"2011-06-01T17:11:42.430Z","0.2.1":"2011-06-01T17:21:41.496Z","0.2.2":"2011-06-01T17:28:19.505Z","0.2.3":"2011-06-01T17:30:51.357Z","0.2.4":"2011-06-01T17:35:01.787Z","0.2.5":"2011-06-01T18:02:57.003Z","0.4.0":"2011-06-04T02:02:58.287Z","0.4.1":"2011-06-09T07:24:49.371Z","0.4.2":"2011-06-11T21:10:53.982Z"},"repository":{"type":"git","url":"git@github.com:mark-hahn/atbar.git"},"_attachments":{"atbar-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-UYr+Jym9vk4LMUw3uOKyYQ==","length":14243,"stub":true},"atbar-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-LkojUHL8Baplxd946UebIg==","length":13719,"stub":true},"atbar-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-34vmLr7A+pxZqb+rdOObSA==","length":13265,"stub":true},"atbar-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-mrBtNiC8jBmQZ5NTIqpQlw==","length":11548,"stub":true},"atbar-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6UaXBygA2/cNzU7nZWOINQ==","length":11750,"stub":true},"atbar-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-XUCg6URAqY6cIknwl4imeQ==","length":11737,"stub":true},"atbar-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ogrC9NsMRBuSifB9DYTOZw==","length":11734,"stub":true},"atbar-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Wv9+fDaaUDV7FeprZIb24A==","length":11731,"stub":true},"atbar-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OYYXF97IFxJdTCJUH9HWyg==","length":11737,"stub":true}}}},
{"id":"atlas","key":"atlas","value":{"rev":"5-9781df761a796eb6ee1558911534230b"},"doc":{"_id":"atlas","_rev":"5-9781df761a796eb6ee1558911534230b","name":"atlas","description":"Atlas sits on top of Backbone.js, adding features and enhancing the API","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"atlas","description":"Atlas sits on top of Backbone.js, adding features and enhancing the API","tags":["backbone.js","backbone","hack"],"version":"0.0.1","homepage":"https://github.com/dandean/atlas","repository":{"url":"git://github.com/dandean/atlas.git"},"main":"atlas","_npmUser":{"name":"dandean","email":"me@dandean.com"},"_id":"atlas@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2d80368c857317ea580fe5c82ff43251922a690c","tarball":"http://registry.npmjs.org/atlas/-/atlas-0.0.1.tgz"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]},"0.1.0":{"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"name":"atlas","description":"Atlas sits on top of Backbone.js, adding features and enhancing the API","tags":["backbone.js","backbone","hack"],"version":"0.1.0","homepage":"https://github.com/dandean/atlas","repository":{"url":"git://github.com/dandean/atlas.git"},"main":"atlas","_npmUser":{"name":"dandean","email":"me@dandean.com"},"_id":"atlas@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"751b38bb0f4377edf1da1b47527375948db16eda","tarball":"http://registry.npmjs.org/atlas/-/atlas-0.1.0.tgz"},"maintainers":[{"name":"dandean","email":"me@dandean.com"}]}},"readme":"Atlas (for Backbone.js)\n=======================\n\nAtlas sits on top of Backbone.js, adding features and making it nicer to use.\n\nES5 getters/setters\n-------------------\n\nAtlas adds ES5 getters and setters to `Backbone.Model` for every default attribute. \n\n```js\nvar User = Backbone.Model.extend({\n  defaults: {\n    username: undefined,\n    email: undefined\n  }\n});\n      \nvar user = new User();\n      \n// Backbone's API:\nuser.set({ 'username':'dandean' });\n      \n// Backbone with Atlas:\nuser.username = 'dandean';\n```\n\n\nNavigation Events\n-----------------\n\nAtlas triggers events before and after calls to `Backbone.history.navigate(...)`. These events can do awesome things like notify your views that they should go ahead and remove themselves from the DOM.\n\nEvents: \"willNavigate\", \"didNavigate\".\n\n```js\nvar router = Backbone.Router.extend({\n  routes: {\n    '' : 'index',\n    'library': 'library',\n    'library/work': 'work',\n  },\n        \n  ...\n\n  library: function() {\n    var collectionsView = new App.Views.Library.Collections();\n    $('body').append(collectionsView.el);\n    \n    var worksView = new App.Views.Library.Works();\n    $('body').append(worksView.el);\n\n    var navigateHandler = function(from, to) {\n      if (from === 'library') {\n        Backbone.history.unbind('willNavigate', navigateHandler);\n        collectionsView.remove();\n        worksView.remove();\n      }\n    };\n    \n    Backbone.history.bind(\"willNavigate\", navigateHandler);\n  },\n        \n  ...\n        \n});\n```\n\n\nExperimental!\n-------------\n\nAtlas is still experimental, and the fact that it monkey-patches Backbone is a bit iffy... but it's awesome so you should totally use it.\n\n\nWhat's with the cheesy name, Atlas?\n-----------------------------------\n\nThe topmost vertibra in a backbone is named \"atlas\"... now you know.\n\n\nLicences\n--------\n\n**MIT!**\n","maintainers":[{"name":"dandean","email":"me@dandean.com"}],"time":{"modified":"2012-01-05T07:35:48.361Z","created":"2012-01-04T07:44:27.456Z","0.0.1":"2012-01-04T07:44:28.620Z","0.1.0":"2012-01-05T07:35:48.361Z"},"author":{"name":"Dan Dean","email":"@dandean","url":"http://dandean.com"},"repository":{"url":"git://github.com/dandean/atlas.git"},"_attachments":{"atlas-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-x1+hBxwZW0xAAwbwTeBtOQ==","length":10240,"stub":true},"atlas-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dHMcHHhMskvMK6oRKYbLzw==","length":10240,"stub":true}}}},
{"id":"atob","key":"atob","value":{"rev":"5-c9701ee514f1d46660c2c86ec8cb3e7f"},"doc":{"_id":"atob","_rev":"5-c9701ee514f1d46660c2c86ec8cb3e7f","name":"atob","description":"atob for Node.JS and Linux / Mac / Windows CLI (it's a one-liner)","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"atob","homepage":"https://github.com/coolaj86/node-browser-compat","description":"atob for Node.JS (it's a one-liner)","repository":{"type":"git","url":"git://github.com/coolaj86/node-browser-compat.git"},"keywords":["atob","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"engines":{"node":">= 0.4.0"},"dependencies":{},"main":"index","version":"1.0.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/atob/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"atob@1.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"aaa94b1a9106418a166cd58c39aecfc75b580952","tarball":"http://registry.npmjs.org/atob/-/atob-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"1.0.1":{"name":"atob","homepage":"https://github.com/coolaj86/node-browser-compat","description":"atob for Node.JS and Linux / Mac / Windows CLI (it's a one-liner)","repository":{"type":"git","url":"git://github.com/coolaj86/node-browser-compat.git"},"keywords":["atob","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"engines":{"node":">= 0.4.0"},"main":"index","bin":{"atob":"bin/atob.js"},"version":"1.0.1","_id":"atob@1.0.1","dist":{"shasum":"5121c7b88cd316c2f099499ea11bc39884bb41cc","tarball":"http://registry.npmjs.org/atob/-/atob-1.0.1.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2012-06-26T19:25:39.287Z","created":"2011-09-09T20:54:16.654Z","1.0.0":"2011-09-09T20:54:17.047Z","1.0.1":"2012-06-26T19:25:39.287Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/node-browser-compat.git"},"_attachments":{"atob-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TnvptbCSe72vU6LzQfZtYg==","length":811,"stub":true},"atob-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5E5ZNQRPvEQRuXZrszHbvg==","length":686,"stub":true}}}},
{"id":"atok","key":"atok","value":{"rev":"62-c80fef9fb6950f394802f5b7c8cc4942"},"doc":{"_id":"atok","_rev":"62-c80fef9fb6950f394802f5b7c8cc4942","name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./index","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"65448fdf2a8e0285678845d07d0bc75cac8152a8","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.2","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"71c01f1d7158fd3789212cffd5f24514e1c2585d","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.2.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.3","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f6e4bdab3d2a500fe8be6dd55c9ea7a5b99317fa","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.3.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.4":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.4","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f638dc4e0a3619a6c14b5ae618547f5e12e6aa69","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.4.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.5":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.5","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6386c1c61e5de5a68cbd9ce714f72ec802f7dd76","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.5.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.6":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.6","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"69088d27d1782bc6988fa082aa499b551ef64818","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.6.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.7":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.7","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5efeb06a94ee1b7ebfb8a8595445e4ed1493d454","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.7.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.8":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.8","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4c450145af285a98696790504fad6a7b1ce28bbd","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.8.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.9":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.9","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2e823a639bc850f7c1d4f2ff010755615976535b","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.9.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.10":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.10","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"bc606f239852bbbfaed26088b5ef5b090e4b68de","tarball":"http://registry.npmjs.org/atok/-/atok-0.1.10.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.0","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4c7f24dafa6403fb7d0c6c959bfeb312e3c095af","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.0.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"43a4a5863ecd7159503cbade34faeedb8be205a3","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.2":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.2","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"19dad972f943fbd34caa1b09fe044705d9e9b40f","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.2.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.3":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.3","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.5"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"14bfcc5cd9153315eaf42c431add82c41e671433","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.3.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.4":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.4","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.5"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ba9adad17f52f06a7d7fa0dba7f3960e100660ec","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.4.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.5":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.5","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"df5cad358c7b84661d46a00276573ffd2692d176","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.5.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.6":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.6","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e68eaf2df047d6101bf6c0f5875858809266baa4","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.6.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.7":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.7","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":"0.0.7","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n    // End of the buffer reached\n    // This is usually only needed when implementing synchronous parsers\n    .addRule(0, 'end')\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        case 'end':\n            console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n            console.log('results:', stack[0])\n            stack = []\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\n\n// Send some data to be parsed!\ntok.write('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\n[Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.2.7","dist":{"shasum":"0d4c34b0a76431ea165d78426b56e0475badd14a","tarball":"http://registry.npmjs.org/atok/-/atok-0.2.7.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]},"0.3.0":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.3.0","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\nThis is a work in progress as Buffer data is still converted into String before being processed. Removing this drawback is planned for the next version (0.4.0).\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an ordered combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, an event is emitted (the event name has to be supplied when defining the rule).\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n    // End of the buffer reached\n    // This is usually only needed when implementing synchronous parsers\n    .addRule(0, 'end')\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        case 'end':\n            console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n            console.log('results:', stack[0])\n            stack = []\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\n\n// Send some data to be parsed!\ntok.write('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.3.0","dist":{"shasum":"a6dc4cf46627b6e4ac816b1ba32efeb4ef7217dd","tarball":"http://registry.npmjs.org/atok/-/atok-0.3.0.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]},"0.3.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.3.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\nThis is a work in progress as Buffer data is still converted into String before being processed. Removing this drawback is planned for the next version (0.4.0).\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an ordered combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, an event is emitted (the event name has to be supplied when defining the rule).\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.3.1","dist":{"shasum":"812164af84df1ff53f8acdbcd1ae4a75d7b0f9be","tarball":"http://registry.npmjs.org/atok/-/atok-0.3.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]}},"readme":"# ATOK - async tokenizer\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*. As of the first release, it does not support Buffer instances (yet!) but it is planned to be the next major feature.\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('..')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n    // End of the buffer reached\n    // This is usually only needed when implementing synchronous parsers\n    .addRule(0, 'end')\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        case 'end':\n            console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n            console.log('results:', stack[0])\n            stack = []\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\n\n// Send some data to be parsed!\ntok.write('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/). Documentation generated by [ndoc](https://github.com/nodeca/ndoc).\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n## Performance\n\nAtok performance was tested by writing a JSON parser and comparing its results to the excellent Douglas Crockford's [](). It currently scores slower on data sets containing small items, but much faster on large ones.\n\nThe JSON parser based on atok will be published soon as well as the benchmarks for it.\n\nThere are plans to increase performance, as listed in the [TODO](https://github.com/pierrec/node-atok/tree/master/TODO.md) document.\n\n## License\n\n[Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"time":{"modified":"2012-08-02T13:44:17.030Z","created":"2012-01-30T21:02:49.332Z","0.1.1":"2012-01-30T21:02:53.206Z","0.1.2":"2012-02-03T17:26:43.872Z","0.1.3":"2012-02-05T18:04:43.999Z","0.1.4":"2012-02-06T18:35:43.985Z","0.1.5":"2012-02-09T13:03:03.513Z","0.1.6":"2012-02-09T15:33:17.384Z","0.1.7":"2012-02-12T14:47:29.308Z","0.1.8":"2012-02-12T21:51:11.556Z","0.1.9":"2012-02-20T22:05:27.745Z","0.1.10":"2012-02-23T21:06:21.970Z","0.2.0":"2012-02-24T17:16:23.156Z","0.2.1":"2012-02-26T16:32:16.630Z","0.2.2":"2012-02-29T14:49:07.834Z","0.2.3":"2012-03-16T16:14:40.912Z","0.2.4":"2012-04-20T13:10:34.366Z","0.2.5":"2012-05-14T13:13:50.799Z","0.2.6":"2012-05-31T10:25:17.706Z","0.2.7":"2012-06-25T19:13:15.778Z","0.3.0":"2012-07-10T08:36:49.877Z","0.3.1":"2012-07-26T12:22:35.916Z"},"author":{"name":"Pierre Curto"},"repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"users":{"fgribreau":true},"_attachments":{"atok-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-cu+D/+IxNmcs/MkRA0HkoQ==","length":82237,"stub":true},"atok-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-mcTl5EkK053ZiI2IUI6Urg==","length":82348,"stub":true},"atok-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-5XkWgbhWUC7bVaUCkDn0Pg==","length":73189,"stub":true},"atok-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-9fw/514ZgdWFq1gwkcSwCA==","length":73265,"stub":true},"atok-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-RCkzVIemWjPW0B/w/FdpOw==","length":71916,"stub":true},"atok-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-JiePaA15eSarNdMqSCxZdw==","length":96877,"stub":true},"atok-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-548AvUeCMw1gu3VxhWCAKQ==","length":97050,"stub":true},"atok-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-rVWcUqlQvoSpuz0NnfyDaw==","length":95418,"stub":true},"atok-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-m76YPg8g4Uiwc4EsWQeZIw==","length":94800,"stub":true},"atok-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-z016qFkryDA6z/dLnd/9Ng==","length":94899,"stub":true},"atok-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Z/ZVIeS5kTxTa1rxtB5QUg==","length":94574,"stub":true},"atok-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ZLS6UGMnO0s/urvp7EPr0w==","length":93254,"stub":true},"atok-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-g4u5RnvFjGMNgS2RHPWGvw==","length":92071,"stub":true},"atok-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-eY2KoWIsb2dYG3mYOqrFjw==","length":91835,"stub":true},"atok-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-vNNvONucV2s4JJAnaaUlpw==","length":90940,"stub":true},"atok-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-M1R2u5IJCT4r7UgVuy29aQ==","length":90832,"stub":true},"atok-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-3hYERLJn93xViPZmcnQc/w==","length":89746,"stub":true},"atok-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-SE6CkwcNXGXKTAsxepqEwA==","length":90124,"stub":true},"atok-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KIBt35YvUQVszmE9wd25QQ==","length":90034,"stub":true},"atok-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9J5/tBZOV8r67GxHznqKNw==","length":180942,"stub":true}}}},
{"id":"atok-parser","key":"atok-parser","value":{"rev":"45-fd0f2ad8f5ed5112e6834bd170dc8cca"},"doc":{"_id":"atok-parser","_rev":"45-fd0f2ad8f5ed5112e6834bd170dc8cca","name":"atok-parser","description":"Parser generator based on the atok tokenizer","dist-tags":{"latest":"0.3.2"},"versions":{"0.0.1":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.0.1","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":">= 0.1.4"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2726717b026380701b8a64259f8367327b12c060","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.0.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.0.2","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":">= 0.1.5"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1f62f9d768590457eafd79257a5effc147621e07","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.0.2.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.0.3","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":">= 0.1.8"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"929c3864994f0c5df692ef0a23b849236abe7958","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.0.3.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.0.4","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":">= 0.1.8"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"939e8ace340a6994051b70dd654f01728c6c2b4b","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.0.4.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.0.5":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.0.5","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":">= 0.1.8"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9498834e4c7deb57ef05abeb17385550f55899be","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.0.5.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.1.0","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":">= 0.2.1","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a0e269ec23790101499378dcb41e39efc3eec436","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.1.0.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.1.1","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","require-like":">= 0.1.1","atok":"0.2.2","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"091072c5fc25d5743d26485991e538b10494d495","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.1.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.1.2","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"0.2.3","ev":">= 0.0.3","eval":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"d9dea427167869aac8563a991c638a9ed723cbaf","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.1.2.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.1.3","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"0.2.3","ev":">= 0.0.3","eval":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"79bff4be4054cb8a22371d8b32e8326a393ee635","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.1.3.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.2.0","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"0.2.6","ev":">= 0.0.3","eval":">= 0.0.1","debug":"latest"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.8","debug":">= 0.5"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok-parser@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e2f00c34326475f2ceb021ee0d53caff41287aa4","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.2.0.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.1":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.2.1","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"0.2.7","ev":"0.0.7","eval":">= 0.0.1","debug":"latest","fnutils":"latest"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.8","debug":">= 0.5"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# Parser builder\n\n## Synopsis\n\nWriting parsers is quite a common but sometimes lengthy task. To ease this process atok-parser leverages the [atok](https://github.com/pierrec/node-atok) tokenizer and performs the basic steps to set up a streaming parser, such as:\n\n* Automatically instantiate a tokenizer with provided options\n* Provide a mechanism to locate an error in the input data\n\t* `track([Boolean])`: keep track of the line and column positions to be used when building errors. Note that when set, tracking incurs a performance penalty.\n* Proxy basic [node.js](http://nodejs.org) streaming methods: `write()`, `end()`, `pause()` and `resume()`\n* Proxy basic [node.js](http://nodejs.org) streaming events (note that [data] and [end] are __not__ automatically proxied) and some of atok\n\t* [drain]\n\t* [debug]\n* Provide preset variables within the parser constructor\n\t* atok (atok tokenizer instance)\n\t* self (this)\n* Provide helpers that simplify parsing rules (see below for description)\n\t* `whitespace()`\n\t* `number()`\n\t* `float()`\n\t* `word()`\n\t* `string()`\n\t* `utf8()`\n\t* `chunk()`\n\t* `stringList()`\n\t* `match()`\n\t* `noop()`\n\t* `wait()`\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok-parser\n\n\n## Usage\n\n``` javascript\nvar atokParser = require('atok-parser')\n// myParser.js contains the rules and other relevant code\nvar Parser = atokParser.createParserFromFile('./myParser', 'options')\n\n// Add the #parse() method to the Parser\nParser.prototype.parse = function (data) {\n\tvar res\n\n\tthis.sync = true\n\tthis.write(data)\n\tres = this.current\n\n\tthis.current = null\n\tthis.sync = false\n\n\treturn res\n}\n\n// Instantiate a parser\nvar p = new Parser({ option: false })\n\t.on('error', console.error)\n\t.on('data', console.log)\n\np.parse('some data')\n```\n\n\n## Methods\n\n* `createParserFromFile(file[, parserOptions, parserEvents, atokOptions])`: return a parser class (Function) based on the input file.\n\t* __file__ (_String_): file to read the parser from(.js extension is optional)\n\t* __parserOptions__ (_String_): list of the parser named events with their arguments count\n\t* __parserEvents__ (_Object_): events emitted by the parser with\n\t* __atokOptions__ (_Object_): tokenizer options\n\nThe following variables are made available to the parser javascript code:\n\t* `atok (_Object_)`: atok tokenizer instanciated with provided options. Also set as this.atok *DO NOT DELETE*\n\t* `self (_Object_)`: reference to _this_\n Predefined methods:\n\t* `write()`\n\t* `end()`\n\t* `pause()`\n\t* `resume()`\n\t* `track()`\n Events automatically forwarded from tokenizer to parser:\n\t* `drain`\n\t* `debug`\n\n* `createParser(data[, parserOptions, parserEvents, atokOptions])`: same as `createParserFromFile()` but with supplied content instead of a file name\n\t* __data__ (_String_ | _Array_ | _Function_): the content to be used, can also be an array of strings or a function. If a function, its parameters are used as parser options unless parserOptions is set\n\n\n## Helpers\n\nHelpers are a set of standard Atok rules organized to match a specific type of data. If the data is encountered, the handler is fired with the results. The behaviour of a single helper is the same as a single Atok rule:\n\n* go to the next rule if no match\n* go back to the first rule of the rule set upon match, unless `continue(jump)` was applied to the helper\n* next rule set can be set using `next(ruleSetId)`\n* rules can be jumped around by using `continue(jump)`. Note that each helper has its own size (given by the helper name + '_length') that must be used to ensure proper jumping.\n\n``` javascript\nvar atokParser = require('atok-parser')\n\n// Parse a whitespace separated list of floats\nvar data = [\n\t'atok.float()'\n,\t'atok.continue( -(atok.float_length + atok.whitespace_length) )'\n,\t'atok.whitespace()'\n]\n\nvar Parser = atokParser.createParser(data)\n```\n\nArguments are not required. If no handler is specified, the [data] will be emitted with the corresponding data.\n\n* `whitespace(handler)`: process spaces, tabs, line breaks. Ignored by default, unless a handler is specified\n\t* `handler(whitespace)`\n* `number(handler)`: process positive integers. \n\t* `handler(num)`\n* `float(handler)`: process float numbers.\n\t* `handler(floatNumber)`\n* `word(handler)`: process a word containing letters, digits and underscore. \n\t* `handler(word)`\n* `string(start, end, handler)`: process a delimited string.\n\t* _start_ (_String_): starting pattern\n\t* _end_ (_String_): ending pattern\n\t* `handler(string)`\n* `utf8(start, end, handler)`: process a delimited string containing UTF-8 encoded characters\n\t* _start_ (_String_): starting pattern\n\t* _end_ (_String_): ending pattern\n\t* `handler(UTF-8String)`\n* `chunk(charSet, handler)`: \n\t* _charSet_ (_Object_): object defining the charsets to be used as matching characters e.g. { start: 'aA', end 'zZ' } matches all letters\n\t* `handler(chunk)`\n* `stringList(start, end, separator, handler)`: process a delimited list of strings\n\t* _start_ (_String_): starting pattern\n\t* _end_ (_String_): ending pattern\n\t* _separator_ (_String_): separator character\n\t* `handler(listOfStrings)`\n* `match(start, end, stringQuotes[], handler)`: find a matching pattern (e.g. bracket matching), skipping string content if required\n\t* _start_ (_String_): starting pattern to look for\n\t* _end_ (_String_): ending pattern to look for\n\t* _stringQuotes_ (_Array_): array of string delimiters (default=['\"', \"'\"]). Use an empty array to disable string content processing\n\t* `handler(token)`\n* `noop()`: passthrough - does not do anything except applying given properties (useful to branch rules without having to use `atok#saveRuleSet()` and `atok#loadRuleSet()`)\n* `wait(atokPattern[...atokPattern])`: wait for the given pattern. Nothing happens until data is received that triggers the pattern. Must be preceded by `continue()` to properly work. Typical usage is when expecting a string the starting quote is received but not the end... so wait until then and resume the rules workflow.\n\n\n## Examples\n\nComing soon.","_id":"atok-parser@0.2.1","dist":{"shasum":"d799cd1c6350aecdecb3702975366bdfd6658831","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.2.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.3.0":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.3.0","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"*","ev":">= 0.0.3","eval":">= 0.0.1","debug":"latest","fnutils":"latest"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.8","debug":">= 0.5"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# Parser builder\n\n## Synopsis\n\nWriting parsers is quite a common but sometimes lengthy task. To ease this process atok-parser leverages the [atok](https://github.com/pierrec/node-atok) tokenizer and performs the basic steps to set up a streaming parser, such as:\n\n* Automatically instantiate a tokenizer with provided options\n* Provide a mechanism to locate an error in the input data\n\t* `track([Boolean])`: keep track of the line and column positions to be used when building errors. Note that when set, tracking incurs a performance penalty.\n* Proxy basic [node.js](http://nodejs.org) streaming methods: `write()`, `end()`, `pause()` and `resume()`\n* Proxy basic [node.js](http://nodejs.org) streaming events (note that [data] and [end] are __not__ automatically proxied) and some of atok\n\t* [drain]\n\t* [debug]\n* Provide preset variables within the parser constructor\n\t* atok (atok tokenizer instance)\n\t* self (this)\n* Provide helpers that simplify parsing rules (see below for description)\n\t* `whitespace()`\n\t* `number()`\n\t* `float()`\n\t* `word()`\n\t* `string()`\n\t* `utf8()`\n\t* `chunk()`\n\t* `stringList()`\n\t* `match()`\n\t* `noop()`\n\t* `wait()`\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok-parser\n\n\n## Usage\n\nA silly example to illustrate the various pre defined variables and parser definition.\n\n``` javascript\nfunction myParser (options) {\n\tfunction handler (num) {\n\t\t// The options are set from the myParser function parameters\n\t\t// self is already set to the Parser instance\n\t\tif ( options.check && !isFinite(num) )\n\t\t\treturn self.emit('error', new Error('Invalid float: ' + num))\n\n\t\tself.emit('data', num)\n\t}\n\t// the float() and whitespace() helpers are provided by atok-parser\n\tatok.float(handler)\n\tatok.whitespace()\n}\n\nvar Parser = require('..').createParser(myParser)\n\n// Add the #parse() method to the Parser\nParser.prototype.parse = function (data) {\n\tvar res\n\n\t// One (silly) way to make parse() look synchronous...\n\tthis.once('data', function (data) {\n\t\tres = data\n\t})\n\tthis.write(data)\n\n\t// ...write() is synchronous\n\treturn res\n}\n\n// Instantiate a parser\nvar p = new Parser({ check: true })\n\n// Parse a valid float\nvar validfloat = p.parse('123.456 ')\nconsole.log('parsed data is of type', typeof validfloat, 'value', validfloat)\n\n// The following data will produce an invalid float and an error\np.on('error', console.error)\nvar invalidfloat = p.parse('123.456e1234 ')\n```\n\n\n## Methods\n\n* `createParserFromFile(file[, parserOptions, parserEvents, atokOptions])`: return a parser class (Function) based on the input file.\n\t* __file__ (_String_): file to read the parser from(.js extension is optional)\n\t* __parserOptions__ (_String_): list of the parser named events with their arguments count\n\t* __parserEvents__ (_Object_): events emitted by the parser with\n\t* __atokOptions__ (_Object_): tokenizer options\n\nThe following variables are made available to the parser javascript code:\n\t* `atok (_Object_)`: atok tokenizer instanciated with provided options. Also set as this.atok *DO NOT DELETE*\n\t* `self (_Object_)`: reference to _this_\n Predefined methods:\n\t* `write(data)`\n\t* `end([data])`\n\t* `pause()`\n\t* `resume()`\n\t* `debug([logger (_Function_)])`\n\t* `track(flag (_Boolean_))`\n Events automatically forwarded from tokenizer to parser:\n\t* `drain`\n\t* `debug`\n\n* `createParser(data[, parserOptions, parserEvents, atokOptions])`: same as `createParserFromFile()` but with supplied content instead of a file name\n\t* __data__ (_String_ | _Array_ | _Function_): the content to be used, can also be an array of strings or a function. If a function, its parameters are used as parser options unless parserOptions is set\n\n\n## Helpers\n\nHelpers are a set of standard Atok rules organized to match a specific type of data. If the data is encountered, the handler is fired with the results. If not, the rule is ignored. The behaviour of a single helper is the same as a single Atok rule:\n\n* go to the next rule if no match, unless `continue(jump, jumpOnFail)` was applied to the helper\n* go back to the first rule of the rule set upon match, unless `continue(jump)` was applied to the helper\n* next rule set can be set using `next(ruleSetId)`\n* rules can be jumped around by using `continue(jump, jumpOnFail)`. A helper has exactly the size of a single rule, which greatly helps defining complex rules.\n\n``` javascript\n// Parse a whitespace separated list of floats\nvar myParser = [\n\t'atok.float(function (n) { self.emit(\"data\", n) })'\n,\t'atok.continue(-1, -2)'\n,\t'atok.whitespace()'\n]\n\nvar Parser = require('atok-parser').createParser(myParser)\nvar p = new Parser\n\np.on('data', function (num) {\n\tconsole.log(typeof num, num)\n})\np.end('0.133  0.255')\n```\n\nArguments are not required. If no handler is specified, the [data] event will be emitted with the corresponding data.\n\n* `whitespace(handler)`: ignore consecutive spaces, tabs, line breaks.\n\t* `handler(whitespace)`\n* `number(handler)`: process positive integers\n\t* `handler(num)`\n* `float(handler)`: process float numbers. NB. the result can be an invalid float (NaN or Infinity).\n\t* `handler(floatNumber)`\n* `word(handler)`: process a word containing letters, digits and underscores\n\t* `handler(word)`\n* `string([start, end, esc,] handler)`: process a delimited string. If end is not supplied, it is set to start.\n\t* _start_ (_String_): starting pattern (default=\")\n\t* _end_ (_String_): ending pattern (default=\")\n\t* _esc_ (_String_): escape character (default=\\)\n\t* `handler(string)`\n* `utf8([start, end,] handler)`: process a delimited string containing UTF-8 encoded characters. If end is not supplied, it is set to start.\n\t* _start_ (_String_): starting pattern (default=\")\n\t* _end_ (_String_): ending pattern (default=\")\n\t* `handler(UTF-8String)`\n* `chunk(charSet, handler)`: \n\t* _charSet_ (_Object_): object defining the charsets to be used as matching characters e.g. { start: 'aA', end 'zZ' } matches all letters\n\t* `handler(chunk)`\n* `stringList([start, end, separator,] handler)`: process a delimited list of strings\n\t* _start_ (_String_): starting pattern (default=()\n\t* _end_ (_String_): ending pattern (default=))\n\t* _separator_ (_String_): separator character (default=,)\n\t* `handler(listOfStrings)`\n* `match(start, end, stringQuotes, handler)`: find a matching pattern (e.g. bracket matching), skipping string content if required\n\t* _start_ (_String_): starting pattern to look for\n\t* _end_ (_String_): ending pattern to look for\n\t* _stringQuotes_ (_Array_): array of string delimiters (default=['\"', \"'\"]). Use an empty array to disable string content processing\n\t* `handler(token)`\n* `noop()`: passthrough - does not do anything except applying given properties (useful to branch rules without having to use `atok#saveRuleSet()` and `atok#loadRuleSet()`)\n* `wait(atokPattern[...atokPattern], handler)`: wait for the given pattern. Nothing happens until data is received that triggers the pattern. Must be preceded by `continue()` to properly work. Typical usage is when expecting a string the starting quote is received but not the end... so wait until then and resume the rules workflow.\n* `nvp([nameCharSet, separator, endPattern] handler)`: parse a named value pair (default nameCharSet={ start: 'aA0_', end: 'zZ9_' }, separator==, endPattern={ firstOf: ' \\t\\n\\r' }). Disable endPattern by setting it to '' or [].\n\t* `handler(name, value)`\n\n\n## Examples\n\nA set of examples are located under the examples/ directory.","_id":"atok-parser@0.3.0","dist":{"shasum":"1b44d3bdfceb9654854f09d809193d8de1f89d47","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.3.0.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.3.1":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.3.1","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"*","ev":">= 0.0.3","eval":">= 0.0.1","debug":"latest","fnutils":"latest"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.8","debug":">= 0.5"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# Parser builder\n\n## Synopsis\n\nWriting parsers is quite a common but sometimes lengthy task. To ease this process atok-parser leverages the [atok](https://github.com/pierrec/node-atok) tokenizer and performs the basic steps to set up a streaming parser, such as:\n\n* Automatically instantiate a tokenizer with provided options\n* Provide a mechanism to locate an error in the input data\n\t* `track([Boolean])`: keep track of the line and column positions to be used when building errors. Note that when set, tracking incurs a performance penalty.\n* Proxy basic [node.js](http://nodejs.org) streaming methods: `write()`, `end()`, `pause()` and `resume()`\n* Proxy basic [node.js](http://nodejs.org) streaming events (note that [data] and [end] are __not__ automatically proxied) and some of atok\n\t* [drain]\n\t* [debug]\n* Provide preset variables within the parser constructor\n\t* atok (atok tokenizer instance)\n\t* self (this)\n* Provide helpers that simplify parsing rules (see below for description)\n\t* `whitespace()`\n\t* `number()`\n\t* `float()`\n\t* `word()`\n\t* `string()`\n\t* `utf8()`\n\t* `chunk()`\n\t* `stringList()`\n\t* `match()`\n\t* `noop()`\n\t* `wait()`\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok-parser\n\n\n## Usage\n\nA silly example to illustrate the various pre defined variables and parser definition.\n\n``` javascript\nfunction myParser (options) {\n\tfunction handler (num) {\n\t\t// The options are set from the myParser function parameters\n\t\t// self is already set to the Parser instance\n\t\tif ( options.check && !isFinite(num) )\n\t\t\treturn self.emit('error', new Error('Invalid float: ' + num))\n\n\t\tself.emit('data', num)\n\t}\n\t// the float() and whitespace() helpers are provided by atok-parser\n\tatok.float(handler)\n\tatok.whitespace()\n}\n\nvar Parser = require('..').createParser(myParser)\n\n// Add the #parse() method to the Parser\nParser.prototype.parse = function (data) {\n\tvar res\n\n\t// One (silly) way to make parse() look synchronous...\n\tthis.once('data', function (data) {\n\t\tres = data\n\t})\n\tthis.write(data)\n\n\t// ...write() is synchronous\n\treturn res\n}\n\n// Instantiate a parser\nvar p = new Parser({ check: true })\n\n// Parse a valid float\nvar validfloat = p.parse('123.456 ')\nconsole.log('parsed data is of type', typeof validfloat, 'value', validfloat)\n\n// The following data will produce an invalid float and an error\np.on('error', console.error)\nvar invalidfloat = p.parse('123.456e1234 ')\n```\n\n\n## Methods\n\n* `createParserFromFile(file[, parserOptions, parserEvents, atokOptions])`: return a parser class (Function) based on the input file.\n\t* __file__ (_String_): file to read the parser from(.js extension is optional)\n\t* __parserOptions__ (_String_): list of the parser named events with their arguments count\n\t* __parserEvents__ (_Object_): events emitted by the parser with\n\t* __atokOptions__ (_Object_): tokenizer options\n\nThe following variables are made available to the parser javascript code:\n\t* `atok (_Object_)`: atok tokenizer instanciated with provided options. Also set as this.atok *DO NOT DELETE*\n\t* `self (_Object_)`: reference to _this_\n Predefined methods:\n\t* `write(data)`\n\t* `end([data])`\n\t* `pause()`\n\t* `resume()`\n\t* `debug([logger (_Function_)])`\n\t* `track(flag (_Boolean_))`\n Events automatically forwarded from tokenizer to parser:\n\t* `drain`\n\t* `debug`\n\n* `createParser(data[, parserOptions, parserEvents, atokOptions])`: same as `createParserFromFile()` but with supplied content instead of a file name\n\t* __data__ (_String_ | _Array_ | _Function_): the content to be used, can also be an array of strings or a function. If a function, its parameters are used as parser options unless parserOptions is set\n\n\n## Helpers\n\nHelpers are a set of standard Atok rules organized to match a specific type of data. If the data is encountered, the handler is fired with the results. If not, the rule is ignored. The behaviour of a single helper is the same as a single Atok rule:\n\n* go to the next rule if no match, unless `continue(jump, jumpOnFail)` was applied to the helper\n* go back to the first rule of the rule set upon match, unless `continue(jump)` was applied to the helper\n* next rule set can be set using `next(ruleSetId)`\n* rules can be jumped around by using `continue(jump, jumpOnFail)`. A helper has exactly the size of a single rule, which greatly helps defining complex rules.\n\n``` javascript\n// Parse a whitespace separated list of floats\nvar myParser = [\n\t'atok.float(function (n) { self.emit(\"data\", n) })'\n,\t'atok.continue(-1, -2)'\n,\t'atok.whitespace()'\n]\n\nvar Parser = require('atok-parser').createParser(myParser)\nvar p = new Parser\n\np.on('data', function (num) {\n\tconsole.log(typeof num, num)\n})\np.end('0.133  0.255')\n```\n\nArguments are not required. If no handler is specified, the [data] event will be emitted with the corresponding data.\n\n* `whitespace(handler)`: ignore consecutive spaces, tabs, line breaks.\n\t* `handler(whitespace)`\n* `number(handler)`: process positive integers\n\t* `handler(num)`\n* `float(handler)`: process float numbers. NB. the result can be an invalid float (NaN or Infinity).\n\t* `handler(floatNumber)`\n* `word(handler)`: process a word containing letters, digits and underscores\n\t* `handler(word)`\n* `string([start, end, esc,] handler)`: process a delimited string. If end is not supplied, it is set to start.\n\t* _start_ (_String_): starting pattern (default=\")\n\t* _end_ (_String_): ending pattern (default=\")\n\t* _esc_ (_String_): escape character (default=\\)\n\t* `handler(string)`\n* `utf8([start, end,] handler)`: process a delimited string containing UTF-8 encoded characters. If end is not supplied, it is set to start.\n\t* _start_ (_String_): starting pattern (default=\")\n\t* _end_ (_String_): ending pattern (default=\")\n\t* `handler(UTF-8String)`\n* `chunk(charSet, handler)`: \n\t* _charSet_ (_Object_): object defining the charsets to be used as matching characters e.g. { start: 'aA', end 'zZ' } matches all letters\n\t* `handler(chunk)`\n* `stringList([start, end, separator,] handler)`: process a delimited list of strings\n\t* _start_ (_String_): starting pattern (default=()\n\t* _end_ (_String_): ending pattern (default=))\n\t* _separator_ (_String_): separator character (default=,)\n\t* `handler(listOfStrings)`\n* `match(start, end, stringQuotes, handler)`: find a matching pattern (e.g. bracket matching), skipping string content if required\n\t* _start_ (_String_): starting pattern to look for\n\t* _end_ (_String_): ending pattern to look for\n\t* _stringQuotes_ (_Array_): array of string delimiters (default=['\"', \"'\"]). Use an empty array to disable string content processing\n\t* `handler(token)`\n* `noop()`: passthrough - does not do anything except applying given properties (useful to branch rules without having to use `atok#saveRuleSet()` and `atok#loadRuleSet()`)\n* `wait(atokPattern[...atokPattern], handler)`: wait for the given pattern. Nothing happens until data is received that triggers the pattern. Must be preceded by `continue()` to properly work. Typical usage is when expecting a string the starting quote is received but not the end... so wait until then and resume the rules workflow.\n* `nvp([nameCharSet, separator, endPattern] handler)`: parse a named value pair (default nameCharSet={ start: 'aA0_', end: 'zZ9_' }, separator==, endPattern={ firstOf: ' \\t\\n\\r' }). Disable endPattern by setting it to '' or [].\n\t* `handler(name, value)`\n\n\n## Examples\n\nA set of examples are located under the examples/ directory.","_id":"atok-parser@0.3.1","dist":{"shasum":"9ea15c2bdae6dac1603b6fb01faef7244724f30c","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.3.1.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.3.2":{"author":{"name":"Pierre Curto"},"name":"atok-parser","description":"Parser generator based on the atok tokenizer","keywords":["parser","async","stream","atok"],"version":"0.3.2","homepage":"http://github.com/pierrec/node-atok-parser","repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"main":"./lib/parser.js","bugs":{"url":"http://github.com/pierrec/node-atok-parser/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok-parser/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","atok":"*","ev":">= 0.0.3","eval":">= 0.0.1","debug":"latest","fnutils":"latest"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.8","debug":">= 0.5"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# Parser builder\n\n## Synopsis\n\nWriting parsers is quite a common but sometimes lengthy task. To ease this process atok-parser leverages the [atok](https://github.com/pierrec/node-atok) tokenizer and performs the basic steps to set up a streaming parser, such as:\n\n* Automatically instantiate a tokenizer with provided options\n* Provide a mechanism to locate an error in the input data\n\t* `track([Boolean])`: keep track of the line and column positions to be used when building errors. Note that when set, tracking incurs a performance penalty.\n* Proxy basic [node.js](http://nodejs.org) streaming methods: `write()`, `end()`, `pause()` and `resume()`\n* Proxy basic [node.js](http://nodejs.org) streaming events (note that [data] and [end] are __not__ automatically proxied) and some of atok\n\t* [drain]\n\t* [debug]\n* Provide preset variables within the parser constructor\n\t* atok (atok tokenizer instance)\n\t* self (this)\n* Provide helpers that simplify parsing rules (see below for description)\n\t* `whitespace()`\n\t* `number()`\n\t* `float()`\n\t* `word()`\n\t* `string()`\n\t* `utf8()`\n\t* `chunk()`\n\t* `stringList()`\n\t* `match()`\n\t* `noop()`\n\t* `wait()`\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok-parser\n\n\n## Usage\n\nA silly example to illustrate the various pre defined variables and parser definition.\n\n``` javascript\nfunction myParser (options) {\n\tfunction handler (num) {\n\t\t// The options are set from the myParser function parameters\n\t\t// self is already set to the Parser instance\n\t\tif ( options.check && !isFinite(num) )\n\t\t\treturn self.emit('error', new Error('Invalid float: ' + num))\n\n\t\tself.emit('data', num)\n\t}\n\t// the float() and whitespace() helpers are provided by atok-parser\n\tatok.float(handler)\n\tatok.whitespace()\n}\n\nvar Parser = require('..').createParser(myParser)\n\n// Add the #parse() method to the Parser\nParser.prototype.parse = function (data) {\n\tvar res\n\n\t// One (silly) way to make parse() look synchronous...\n\tthis.once('data', function (data) {\n\t\tres = data\n\t})\n\tthis.write(data)\n\n\t// ...write() is synchronous\n\treturn res\n}\n\n// Instantiate a parser\nvar p = new Parser({ check: true })\n\n// Parse a valid float\nvar validfloat = p.parse('123.456 ')\nconsole.log('parsed data is of type', typeof validfloat, 'value', validfloat)\n\n// The following data will produce an invalid float and an error\np.on('error', console.error)\nvar invalidfloat = p.parse('123.456e1234 ')\n```\n\n\n## Methods\n\n* `createParserFromFile(file[, parserOptions, parserEvents, atokOptions])`: return a parser class (Function) based on the input file.\n\t* __file__ (_String_): file to read the parser from(.js extension is optional)\n\t* __parserOptions__ (_String_): list of the parser named events with their arguments count\n\t* __parserEvents__ (_Object_): events emitted by the parser with\n\t* __atokOptions__ (_Object_): tokenizer options\n\nThe following variables are made available to the parser javascript code:\n\t* `atok (_Object_)`: atok tokenizer instanciated with provided options. Also set as this.atok *DO NOT DELETE*\n\t* `self (_Object_)`: reference to _this_\n Predefined methods:\n\t* `write(data)`\n\t* `end([data])`\n\t* `pause()`\n\t* `resume()`\n\t* `debug([logger (_Function_)])`\n\t* `track(flag (_Boolean_))`\n Events automatically forwarded from tokenizer to parser:\n\t* `drain`\n\t* `debug`\n\n* `createParser(data[, parserOptions, parserEvents, atokOptions])`: same as `createParserFromFile()` but with supplied content instead of a file name\n\t* __data__ (_String_ | _Array_ | _Function_): the content to be used, can also be an array of strings or a function. If a function, its parameters are used as parser options unless parserOptions is set\n\n\n## Helpers\n\nHelpers are a set of standard Atok rules organized to match a specific type of data. If the data is encountered, the handler is fired with the results. If not, the rule is ignored. The behaviour of a single helper is the same as a single Atok rule:\n\n* go to the next rule if no match, unless `continue(jump, jumpOnFail)` was applied to the helper\n* go back to the first rule of the rule set upon match, unless `continue(jump)` was applied to the helper\n* next rule set can be set using `next(ruleSetId)`\n* rules can be jumped around by using `continue(jump, jumpOnFail)`. A helper has exactly the size of a single rule, which greatly helps defining complex rules.\n\n``` javascript\n// Parse a whitespace separated list of floats\nvar myParser = [\n\t'atok.float(function (n) { self.emit(\"data\", n) })'\n,\t'atok.continue(-1, -2)'\n,\t'atok.whitespace()'\n]\n\nvar Parser = require('atok-parser').createParser(myParser)\nvar p = new Parser\n\np.on('data', function (num) {\n\tconsole.log(typeof num, num)\n})\np.end('0.133  0.255')\n```\n\nArguments are not required. If no handler is specified, the [data] event will be emitted with the corresponding data.\n\n* `whitespace(handler)`: ignore consecutive spaces, tabs, line breaks.\n\t* `handler(whitespace)`\n* `number(handler)`: process positive integers\n\t* `handler(num)`\n* `float(handler)`: process float numbers. NB. the result can be an invalid float (NaN or Infinity).\n\t* `handler(floatNumber)`\n* `word(handler)`: process a word containing letters, digits and underscores\n\t* `handler(word)`\n* `string([start, end, esc,] handler)`: process a delimited string. If end is not supplied, it is set to start.\n\t* _start_ (_String_): starting pattern (default=\")\n\t* _end_ (_String_): ending pattern (default=\")\n\t* _esc_ (_String_): escape character (default=\\)\n\t* `handler(string)`\n* `utf8([start, end,] handler)`: process a delimited string containing UTF-8 encoded characters. If end is not supplied, it is set to start.\n\t* _start_ (_String_): starting pattern (default=\")\n\t* _end_ (_String_): ending pattern (default=\")\n\t* `handler(UTF-8String)`\n* `chunk(charSet, handler)`: \n\t* _charSet_ (_Object_): object defining the charsets to be used as matching characters e.g. { start: 'aA', end 'zZ' } matches all letters\n\t* `handler(chunk)`\n* `stringList([start, end, separator,] handler)`: process a delimited list of strings\n\t* _start_ (_String_): starting pattern (default=()\n\t* _end_ (_String_): ending pattern (default=))\n\t* _separator_ (_String_): separator character (default=,)\n\t* `handler(listOfStrings)`\n* `match(start, end, stringQuotes, handler)`: find a matching pattern (e.g. bracket matching), skipping string content if required\n\t* _start_ (_String_): starting pattern to look for\n\t* _end_ (_String_): ending pattern to look for\n\t* _stringQuotes_ (_Array_): array of string delimiters (default=['\"', \"'\"]). Use an empty array to disable string content processing\n\t* `handler(token)`\n* `noop()`: passthrough - does not do anything except applying given properties (useful to branch rules without having to use `atok#saveRuleSet()` and `atok#loadRuleSet()`)\n* `wait(atokPattern[...atokPattern], handler)`: wait for the given pattern. Nothing happens until data is received that triggers the pattern. Must be preceded by `continue()` to properly work. Typical usage is when expecting a string the starting quote is received but not the end... so wait until then and resume the rules workflow.\n* `nvp([nameCharSet, separator, endPattern] handler)`: parse a named value pair (default nameCharSet={ start: 'aA0_', end: 'zZ9_' }, separator==, endPattern={ firstOf: ' \\t\\n\\r' }). Disable endPattern by setting it to '' or [].\n\t* `handler(name, value)`\n\n\n## Examples\n\nA set of examples are located under the examples/ directory.","_id":"atok-parser@0.3.2","dist":{"shasum":"184935b84a1669d5a62d6b074bfe226f6d56276e","tarball":"http://registry.npmjs.org/atok-parser/-/atok-parser-0.3.2.tgz"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]}},"readme":"# TODO\n\n## Examples\n\t* Parsers\n\t\t* JSON\n\t\t* XML\n\t\t* Markdown\n\t\t* CSS","maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"time":{"modified":"2012-07-17T15:43:47.425Z","created":"2012-02-06T19:05:58.402Z","0.0.1":"2012-02-06T19:06:00.238Z","0.0.2":"2012-02-09T15:09:16.262Z","0.0.3":"2012-02-16T13:47:02.109Z","0.0.4":"2012-02-19T16:43:27.230Z","0.0.5":"2012-02-23T21:09:08.057Z","0.1.0":"2012-02-26T16:56:52.519Z","0.1.1":"2012-02-29T17:18:29.214Z","0.1.2":"2012-03-16T16:17:22.422Z","0.1.3":"2012-03-22T17:08:48.440Z","0.2.0":"2012-05-31T10:28:13.334Z","0.2.1":"2012-06-25T19:19:31.009Z","0.3.0":"2012-07-10T12:41:46.715Z","0.3.1":"2012-07-16T13:15:44.864Z","0.3.2":"2012-07-17T15:43:47.425Z"},"author":{"name":"Pierre Curto"},"repository":{"type":"git","url":"git://github.com/pierrec/node-atok-parser.git"},"_attachments":{"atok-parser-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-MbteP/zw9kSu2oGcLhHL4g==","length":44411,"stub":true},"atok-parser-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-WB3b2UVWxgcHTK6XBJe/fg==","length":44338,"stub":true},"atok-parser-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-l7IrjwyxnqXDUPUAP5Mp1A==","length":44300,"stub":true},"atok-parser-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-zRsSmQNwqZKqzc4fTpW7HQ==","length":27658,"stub":true},"atok-parser-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-x5/RZwKogFAFUCF4VIy4Uw==","length":27643,"stub":true},"atok-parser-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-k7h0vrRyk/5WfLqDdlGU7A==","length":17419,"stub":true},"atok-parser-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-62FnZTNDlh5miawJQqQGng==","length":17174,"stub":true},"atok-parser-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-XxgMTOmhU6Chb1t5eJPcBw==","length":16870,"stub":true},"atok-parser-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-2WsPJZGBnVPOSotouS3kvA==","length":12978,"stub":true},"atok-parser-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-vAQ/Hxg7CkLSUD8xnQ1yNA==","length":17124,"stub":true},"atok-parser-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-5WkdpNg12JsxgEcu2wDp0g==","length":16793,"stub":true},"atok-parser-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WpDAVzKX7aS5zUDQBmmXug==","length":15489,"stub":true},"atok-parser-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-g+eW9erfv1yzHFTDAWHzrQ==","length":6936,"stub":true},"atok-parser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hbVp2W3OaedIKSQyUJRivw==","length":6245,"stub":true}}}},
{"id":"atom","key":"atom","value":{"rev":"14-e850c10fac950cedebd18b3fcfc6951a"},"doc":{"_id":"atom","_rev":"14-e850c10fac950cedebd18b3fcfc6951a","name":"atom","description":"A collection of decoupled components for rapid web development","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.0","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":">= 2.5.1","connect-redis":">= 1.2.0","request":">= 2.2.9","formidable":">= 1.0.8","nodemailer":">= 0.2.3"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"0fe0b4bad8225e048830348dfa60c46e68447ee9","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.0.tgz"},"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.1":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.1","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":">= 2.5.1","connect-redis":">= 1.2.0","request":">= 2.2.9","formidable":">= 1.0.8","nodemailer":">= 0.2.3"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"71c264383031894b23a469c9e400040751f8fab0","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.1.tgz"},"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.2":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.2","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":">= 2.5.1","request":">= 2.2.9","formidable":">= 1.0.8","nodemailer":">= 0.2.3","socket.io":">= 0.8.7","redis":">= 0.7.1"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"be6cf4d5dfea277562044f3b5b0e4a90cddf4010","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.2.tgz"},"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.3":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.3","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":">= 2.5.1","request":">= 2.2.9","formidable":">= 1.0.8","nodemailer":">= 0.2.3","socket.io":">= 0.8.7","redis":">= 0.7.1","connect-redis":">= 1.2.0"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"604bbdce4128f8f7e46385aff57c7a861acd6c4e","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.3.tgz"},"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.4":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.4","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":">= 2.5.1","request":">= 2.2.9","formidable":">= 1.0.8","nodemailer":">= 0.2.3","socket.io":">= 0.8.7","redis":">= 0.7.1","connect-redis":">= 1.2.0"},"devDependencies":{"mocha":"*","yaml":"*"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"0ef95a2ad3f06cf3a1db29268298c2c7a5001e13","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.4.tgz"},"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.5":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.5","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":">= 2.5.1","request":">= 2.2.9","formidable":">= 1.0.8","nodemailer":">= 0.2.3","socket.io":">= 0.8.7","redis":">= 0.7.1","connect-redis":">= 1.2.0"},"devDependencies":{"mocha":"*","yaml":">= 0.2.3"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"401f420056d25f61c9aacaf469c2fe001c4c7212","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.5.tgz"},"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.6":{"name":"atom","description":"A collection of decoupled components for rapid web development","version":"0.1.6","homepage":"http://github.com/chriso/atom","keywords":["web","framework","components"],"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"bugs":{"email":"cohara87@gmail.com","url":"http://github.com/chriso/atom/issues"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"engines":{"node":">=0.4.0"},"dependencies":{"express":"git+http://github.com/visionmedia/express.git","request":">= 2.2.9","nodemailer":">= 0.2.3","socket.io":">= 0.8.7","redis":">= 0.7.1","connect-redis":">= 1.2.0","hogan.js":"*"},"devDependencies":{"mocha":"*","yaml":">= 0.2.3"},"licenses":[{"type":"MIT","url":"http://github.com/chriso/atom/raw/master/LICENSE"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"atom@0.1.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"157c1be0cece16d7b17812de6de5bea918df252b","tarball":"http://registry.npmjs.org/atom/-/atom-0.1.6.tgz"},"readme":"","maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]}},"readme":null,"maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}],"time":{"modified":"2011-12-23T04:40:09.237Z","created":"2011-12-04T05:28:41.226Z","0.1.0":"2011-12-04T05:28:46.031Z","0.1.1":"2011-12-04T06:18:13.370Z","0.1.2":"2011-12-04T09:50:36.945Z","0.1.3":"2011-12-04T10:14:34.313Z","0.1.4":"2011-12-05T11:09:41.920Z","0.1.5":"2011-12-06T11:47:01.454Z","0.1.6":"2011-12-23T04:40:09.237Z"},"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"repository":{"type":"git","url":"git://github.com/chriso/atom.git"},"_attachments":{"atom-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-JO+W1wgcZek1mUObnl68mg==","length":12513,"stub":true},"atom-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-OI7KH8dh+v6P5paDGKybPQ==","length":20480,"stub":true},"atom-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-8QGtL2+570CJTflg7RLpKg==","length":20480,"stub":true},"atom-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oogCMwG94Malda0UsRLBww==","length":20480,"stub":true},"atom-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8/SaDck9sW0LGKEHBgviMQ==","length":10240,"stub":true},"atom-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9ZxY/4B3bA7KYqYNJJKzkQ==","length":10240,"stub":true}}}},
{"id":"atom-writer","key":"atom-writer","value":{"rev":"6-61fd986195b7b3039d08bd1edb628fee"},"doc":{"_id":"atom-writer","_rev":"6-61fd986195b7b3039d08bd1edb628fee","name":"atom-writer","description":"To generate ATOM feeds quickly","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"atom-writer","version":"1.0.0","author":{"name":"Nicolas Thouvenin","email":"nthouvenin@gmail.com"},"contributors":[],"description":"To generate ATOM feeds quickly","tags":["xml","atom","feed","generator"],"homepage":"http://github.com/lindory-project/node-atom-writer","scripts":{"test":"nodeunit test/"},"main":"./index.js","repository":{"type":"git","url":"git://github.com/lindory-project/node-atom-writer.git"},"dependencies":{"xml-writer":">=1.2.0"},"devDependencies":{"nodeunit":">=0.7.3"},"license":"MIT","engines":{"node":">=0.6.0"},"_npmUser":{"name":"touv","email":"nthouvenin@gmail.com"},"_id":"atom-writer@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.7.8","_defaultsLoaded":true,"dist":{"shasum":"27ee95613516b3dbb41328337142d8bd0d2972a7","tarball":"http://registry.npmjs.org/atom-writer/-/atom-writer-1.0.0.tgz"},"maintainers":[{"name":"touv","email":"nthouvenin@gmail.com"}]},"1.0.1":{"name":"atom-writer","version":"1.0.1","author":{"name":"Nicolas Thouvenin","email":"nthouvenin@gmail.com"},"contributors":[],"description":"To generate ATOM feeds quickly","tags":["xml","atom","feed","generator"],"homepage":"http://github.com/lindory-project/node-atom-writer","scripts":{"test":"nodeunit test/"},"main":"./index.js","repository":{"type":"git","url":"https://github.com/lindory-project/node-atom-writer.git"},"dependencies":{"xml-writer":">=1.2.0"},"devDependencies":{"nodeunit":">=0.7.3"},"license":"MIT","engines":{"node":">=0.6.0"},"readme":"# ATOMWriter for NodeJS\n\n\nATOMWriter is small class, that provides methods to generate an [ATOM feed](http://www.atomenabled.org/).\nXML is still valid by using [XMLWriter](https://github.com/lindory-project/node-xml-writer)\n\n\n## Contributors\n\n  * [Nicolas Thouvenin](https://github.com/touv) \n\n# Installation\n\nWith [npm](http://npmjs.org) do:\n\n    $ npm install atom-writer\n\n\n# Examples\n\n## Basic\n```javascript\n\nvar XMLWriter = require('xml-writer')\nvar ATOMWriter = require('atom-writer')\n\nxw = new XMLWriter(true)\naw = new ATOMWriter(xw)\n\naw\n  .startFeed('urn:xxx:yyy')\n  .writeStartIndex(1)\n  .writeItemsPerPage(10)\n  .writeTotalResults(100)\n  .writeTitle('Index of /')\n  .writeLink('http://exemple.com/feed.xml', 'application/atom+xml', 'self')\n\naw\n  .startEntry('urn:xxx:yyy-1')\n  .writeTitle('Data 1')\n  .writeLink('/1.xml', 'text/xml')\n  .writeLink('/1.txt', 'text/plain')\n  .writeContent('Un', 'text', 'fr')\n  .writeAuthor('Tata Toto', 'toto@exemple.com')\n  .writeCategory('term', 'http://exemple.com#scheme')\n  .endEntry()\n\naw\n  .startEntry('urn:xxx-yyy-2')\n  .writeTitle('Data 2')\n  .writeLink('2.txt', 'text/plain')\n  .writeContent('deux', 'text', 'fr')\n  .writeAuthorRAW('titi.toto@exemple.com')\n  .endEntry()\n\naw\n  .endFeed()\n\nconsole.log(xw.toString())\n\n```\nOutput:\n\n```xml\n<feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:opensearch=\"http://a9.com/-/spec/opensearch/1.1/\">\n  <id>urn:xxx:yyy</id>\n  <updated>2012-07-02T15:22:40Z</updated>\n  <opensearch:startIndex>1</opensearch:startIndex>\n  <opensearch:itemsPerPage>10</opensearch:itemsPerPage>\n  <opensearch:totalResults>100</opensearch:totalResults>\n  <title type=\"text\">Index of /</title>\n  <link type=\"application/atom+xml\" href=\"http://exemple.com/feed.xml\" rel=\"self\"/>\n  <entry>\n    <id>urn:xxx:yyy-1</id>\n    <updated>2012-07-02T15:22:40Z</updated>\n    <published>2012-07-02T15:22:40Z</published>\n    <title type=\"text\">Data 1</title>\n    <link type=\"text/xml\" href=\"/1.xml\"/>\n    <link type=\"text/plain\" href=\"/1.txt\"/>\n    <content type=\"text\" xml:lang=\"fr\">Un</content>\n    <author>\n      <name>Tata Toto</name>\n      <email>toto@exemple.com</email>\n    </author>\n    <category term=\"term\" scheme=\"http://exemple.com#scheme\"/>\n  </entry>\n  <entry>\n    <id>urn:xxx-yyy-2</id>\n    <updated>2012-07-02T15:22:40Z</updated>\n    <published>2012-07-02T15:22:40Z</published>\n    <title type=\"text\">Data 2</title>\n    <link type=\"text/plain\" href=\"2.txt\"/>\n    <content type=\"text\" xml:lang=\"fr\">deux</content>\n    <author>\n      <name>titi.toto</name>\n      <email>titi.toto@exemple.com</email>\n    </author>\n  </entry>\n</feed>\n```\n\t\n# API Documentation\n\n### construct (XMLWriter o)\n### flush()\n### startFeed(String id, Date updated = null, Date created = null) \n### writeTitle(String value, String type = 'text', String lang = null)\n### writeLink(String value, String type = 'text/html', String rel = null)\n### writeAuthor(String name, String email = null, String uri = null)\n### writeAuthorRAW(String value)\n### writeContributor(String name, String email = null, String uri = null)\n### writeCategory(String term, String scheme = null, String label = null)\n### startEntry(String id, Date updated = null, Date created = null)\n### writeContent(String value, String type = null, String lang = null)\n### endEntry()\n### endFeed()\n### writeSearch(String url)\n### writeTotalResults(String value)\n### writeStartIndex(String value)\n### writeItemsPerPage(String value)\n### writeQuery(String searchTerms, Number startPage = 1, String role = 'request')\n### writeGenerator(String value, String version = null, String uri = null)\n\n\n# Also\n\n* http://dojotoolkit.org/reference-guide/1.7/dojox/atom/io/model.html\n* https://github.com/wezm/node-genx\n\n# License\n\n[MIT/X11](./LICENSE)\n","_id":"atom-writer@1.0.1","dist":{"shasum":"9ef3321d802f27ef2e0b61d610fa881055c1c8e3","tarball":"http://registry.npmjs.org/atom-writer/-/atom-writer-1.0.1.tgz"},"maintainers":[{"name":"touv","email":"nthouvenin@gmail.com"}]}},"readme":"# ATOMWriter for NodeJS\n\n\nATOMWriter is small class, that provides methods to generate an [ATOM feed](http://www.atomenabled.org/).\nXML is still valid by using [XMLWriter](https://github.com/lindory-project/node-xml-writer)\n\n\n## Contributors\n\n  * [Nicolas Thouvenin](https://github.com/touv) \n\n# Installation\n\nWith [npm](http://npmjs.org) do:\n\n    $ npm install atom-writer\n\n\n# Examples\n\n## Basic\n```javascript\n\nvar XMLWriter = require('xml-writer')\nvar ATOMWriter = require('atom-writer')\n\nxw = new XMLWriter(true)\naw = new ATOMWriter(xw)\n\naw\n  .startFeed('urn:xxx:yyy')\n  .writeStartIndex(1)\n  .writeItemsPerPage(10)\n  .writeTotalResults(100)\n  .writeTitle('Index of /')\n  .writeLink('http://exemple.com/feed.xml', 'application/atom+xml', 'self')\n\naw\n  .startEntry('urn:xxx:yyy-1')\n  .writeTitle('Data 1')\n  .writeLink('/1.xml', 'text/xml')\n  .writeLink('/1.txt', 'text/plain')\n  .writeContent('Un', 'text', 'fr')\n  .writeAuthor('Tata Toto', 'toto@exemple.com')\n  .writeCategory('term', 'http://exemple.com#scheme')\n  .endEntry()\n\naw\n  .startEntry('urn:xxx-yyy-2')\n  .writeTitle('Data 2')\n  .writeLink('2.txt', 'text/plain')\n  .writeContent('deux', 'text', 'fr')\n  .writeAuthorRAW('titi.toto@exemple.com')\n  .endEntry()\n\naw\n  .endFeed()\n\nconsole.log(xw.toString())\n\n```\nOutput:\n\n```xml\n<feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:opensearch=\"http://a9.com/-/spec/opensearch/1.1/\">\n  <id>urn:xxx:yyy</id>\n  <updated>2012-07-02T15:22:40Z</updated>\n  <opensearch:startIndex>1</opensearch:startIndex>\n  <opensearch:itemsPerPage>10</opensearch:itemsPerPage>\n  <opensearch:totalResults>100</opensearch:totalResults>\n  <title type=\"text\">Index of /</title>\n  <link type=\"application/atom+xml\" href=\"http://exemple.com/feed.xml\" rel=\"self\"/>\n  <entry>\n    <id>urn:xxx:yyy-1</id>\n    <updated>2012-07-02T15:22:40Z</updated>\n    <published>2012-07-02T15:22:40Z</published>\n    <title type=\"text\">Data 1</title>\n    <link type=\"text/xml\" href=\"/1.xml\"/>\n    <link type=\"text/plain\" href=\"/1.txt\"/>\n    <content type=\"text\" xml:lang=\"fr\">Un</content>\n    <author>\n      <name>Tata Toto</name>\n      <email>toto@exemple.com</email>\n    </author>\n    <category term=\"term\" scheme=\"http://exemple.com#scheme\"/>\n  </entry>\n  <entry>\n    <id>urn:xxx-yyy-2</id>\n    <updated>2012-07-02T15:22:40Z</updated>\n    <published>2012-07-02T15:22:40Z</published>\n    <title type=\"text\">Data 2</title>\n    <link type=\"text/plain\" href=\"2.txt\"/>\n    <content type=\"text\" xml:lang=\"fr\">deux</content>\n    <author>\n      <name>titi.toto</name>\n      <email>titi.toto@exemple.com</email>\n    </author>\n  </entry>\n</feed>\n```\n\t\n# API Documentation\n\n### construct (XMLWriter o)\n### flush()\n### startFeed(String id, Date updated = null, Date created = null) \n### writeTitle(String value, String type = 'text', String lang = null)\n### writeLink(String value, String type = 'text/html', String rel = null)\n### writeAuthor(String name, String email = null, String uri = null)\n### writeAuthorRAW(String value)\n### writeContributor(String name, String email = null, String uri = null)\n### writeCategory(String term, String scheme = null, String label = null)\n### startEntry(String id, Date updated = null, Date created = null)\n### writeContent(String value, String type = null, String lang = null)\n### endEntry()\n### endFeed()\n### writeSearch(String url)\n### writeTotalResults(String value)\n### writeStartIndex(String value)\n### writeItemsPerPage(String value)\n### writeQuery(String searchTerms, Number startPage = 1, String role = 'request')\n### writeGenerator(String value, String version = null, String uri = null)\n\n\n# Also\n\n* http://dojotoolkit.org/reference-guide/1.7/dojox/atom/io/model.html\n* https://github.com/wezm/node-genx\n\n# License\n\n[MIT/X11](./LICENSE)\n","maintainers":[{"name":"touv","email":"nthouvenin@gmail.com"}],"time":{"modified":"2012-08-02T13:44:17.399Z","created":"2012-07-02T15:41:28.405Z","1.0.0":"2012-07-02T15:41:28.928Z","1.0.1":"2012-07-26T10:13:40.753Z"},"author":{"name":"Nicolas Thouvenin","email":"nthouvenin@gmail.com"},"repository":{"type":"git","url":"https://github.com/lindory-project/node-atom-writer.git"},"users":{"fgribreau":true},"_attachments":{"atom-writer-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4SSTdAhgBHKyjINTW/RjDQ==","length":4100,"stub":true},"atom-writer-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gh1S6Z0W7R6MEysOPIKyqQ==","length":4092,"stub":true}}}},
{"id":"atomic","key":"atomic","value":{"rev":"7-d49f0938edbdb85a13f6966a38ae3784"},"doc":{"_id":"atomic","_rev":"7-d49f0938edbdb85a13f6966a38ae3784","name":"atomic","description":"Atomic operations","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"atomic","description":"Atomic operations","version":"0.0.1","homepage":"https://github.com/stagas/atomic","author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com/"},"repository":{"type":"git","url":"git://github.com/stagas/atomic.git"},"main":"./index.js","devDependencies":{"tap":"=0.0.x"},"scripts":{"test":"tap test"},"engines":{"node":">=0.4.12"},"_id":"atomic@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.12","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e46f99fbd874fdb2b51ae8c0676f21c6cc5ab92f","tarball":"http://registry.npmjs.org/atomic/-/atomic-0.0.1.tgz"},"maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}]},"0.0.2":{"name":"atomic","description":"Atomic operations","version":"0.0.2","homepage":"https://github.com/stagas/atomic","author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com/"},"repository":{"type":"git","url":"git://github.com/stagas/atomic.git"},"main":"./index.js","devDependencies":{"tap":"=0.0.x"},"scripts":{"test":"tap test"},"engines":{"node":">=0.4.12"},"_id":"atomic@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.12","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b181626b351e36509a20c5f0caef7bf760ebfde0","tarball":"http://registry.npmjs.org/atomic/-/atomic-0.0.2.tgz"},"maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}]}},"maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}],"time":{"modified":"2011-10-11T05:47:42.119Z","created":"2011-10-10T16:37:27.811Z","0.0.1":"2011-10-10T16:37:28.663Z","0.0.2":"2011-10-11T05:44:27.108Z"},"author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com/"},"repository":{"type":"git","url":"git://github.com/stagas/atomic.git"},"_attachments":{"atomic-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fpQW/2fV6jz8DsjShYAvsg==","length":2869,"stub":true}}}},
{"id":"atomize","key":"atomize","value":{"rev":"3-feaf751273c305e702d0cdea2fdd5126"},"doc":{"_id":"atomize","_rev":"3-feaf751273c305e702d0cdea2fdd5126","name":"atomize","description":"create atom feeds in js","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"atomize","description":"create atom feeds in js","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de/"},"tags":["atom","feed","xml"],"version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-atomize.git"},"bugs":{"url":"https://github.com/pvorb/node-atomize/issues"},"main":"./atomize.js","engines":{"node":">=0.6.0"},"dependencies":{},"devDependencies":{},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"atomize@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d41bd190c23229276aee7282b19af95898d947f2","tarball":"http://registry.npmjs.org/atomize/-/atomize-0.0.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-04-17T22:54:31.120Z","created":"2012-04-17T22:54:27.741Z","0.0.0":"2012-04-17T22:54:31.120Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de/"},"repository":{"type":"git","url":"git://github.com/pvorb/node-atomize.git"},"_attachments":{"atomize-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nK83cg5dpjIoiUCDfhY8hg==","length":1185,"stub":true}}}},
{"id":"atomize-client","key":"atomize-client","value":{"rev":"53-1c15c5466961ae44405f8e04c1207ad2"},"doc":{"_id":"atomize-client","_rev":"53-1c15c5466961ae44405f8e04c1207ad2","name":"atomize-client","description":"Client library for AtomizeJS: JavaScript DSTM","dist-tags":{"latest":"0.4.16"},"versions":{"0.0.1":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.1","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","description":"Client library for atomize: JavaScript DSTM","dependencies":{"cereal":"*","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"ddc199c70632a7d354cf83eb50aaf27ff2f17ab5","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.1.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.2":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.2","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":"*","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"7e564bc22599467722d066abc440dbc027a5f14e","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.2.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.3":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.3","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d0dcdb67d225b589a304ad70e4f65eadc3dc82c4","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.3.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.4":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.4","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c5152e8134a57c43daa593a66efaf937bde80060","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.4.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.5":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.5","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d8bc326b959fb1a4ebbdf28e303a65652cddbde0","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.5.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.6":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.6","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"58eecd75f65c9701c04baad603c5c8d9ac86ab6e","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.6.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.7":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.7","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ab0c876f3cf222b5b16b32c9312b95ef57d92e99","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.7.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.8":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.8","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d71b82980c7734202ed9ddfc636f030d80671741","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.8.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.9":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.9","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"33ebe9b8bff188d6c023be5873d6c98b7535012c","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.9.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.10":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.10","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"37eab491ad7973211cfed9f151998dc48f56d324","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.10.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.11":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.11","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d5f14e9b78a1e627a1078a0dffddc487d7d1eb26","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.11.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.12":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.12","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.12","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"84bb67519fe4cd5a874f5ff0e00ece533b74eaf4","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.12.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.13":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.13","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d969bf503c8949d7be93763056fd691a00d256f5","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.13.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.14":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.14","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.14","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"90ee2e86b21a90430a9ba549fdf99f98bfd3140b","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.14.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.15":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.15","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.15","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"98fdbecd6127d2bbb621a2ec6fa428b8f521b06f","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.15.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.16":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.16","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.16","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e2117b704266417d5b65778a0346c68584f033f9","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.16.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.17":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.17","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.17","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"d6b1ca52681f8f3c61cfb07c9ae05233d9ee5dd5","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.17.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.18":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.0.18","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.0.18","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b1d011730d9ef59499656e123a4bc5a2aeca5508","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.0.18.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.9":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.9","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.9","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8f4d9508e3b832dce01fe5d0870101bafa34ea8d","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.9.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.10":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.10","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.10","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ed92bd4885979a11c795551359ad834217299053","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.10.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.11":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.11","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.11","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c4786c40b240b786577fc3abe845a814d41c9d3e","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.11.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.12":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.12","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.12","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"dd5788ac7bbc5972a9fa534ab3abcebdf529da56","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.12.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.13":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.13","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.13","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"512fee29ee73cab518c9615ba1778d1808598d97","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.13.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.14":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.14","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.2.0","sockjs":">=0.1.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.14","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"1ac69c83801b7aedebdeadab554eda23e38e6c6c","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.14.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.15":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.15","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.2.0","sockjs":">=0.3.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.15","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"675b36831d8f29094e7296dc3bc2a89ddcb81a9d","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.15.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.16":{"name":"atomize-client","author":{"name":"Matthew Sackman"},"version":"0.4.16","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"main":"index","bin":{"atomize-translate":"./lib/transform.js"},"description":"Client library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.2.0","sockjs":">=0.3.0"},"devDependencies":{"nodeunit":"*"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-client@0.4.16","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"13b586846987d330e5a484fae7d9938297b6da13","tarball":"http://registry.npmjs.org/atomize-client/-/atomize-client-0.4.16.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]}},"readme":"# Atomize-client\n\nThis is the client library for the Atomize DSTM JavaScript project.\n\nThis library can be used either client-side or in NodeJS. It is\nrequired when running Atomize-node.\n\nWhen running in Node, an `npm install atomize-client` will work. When\nrunning client side, you'll need to `<script>`-include both\n[`cereal.js`](https://github.com/atomizejs/cereal/blob/master/lib/cereal.js)\nand\n[`atomize.js`](https://github.com/atomizejs/atomize-client/blob/master/lib/atomize.js).\n\nPlease see the main [AtomizeJS site](http://atomizejs.github.com/).","maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"time":{"modified":"2012-06-18T17:39:24.401Z","created":"2011-12-01T12:16:12.198Z","0.0.1":"2011-12-01T12:16:12.962Z","0.0.2":"2011-12-01T13:14:41.643Z","0.0.3":"2011-12-08T14:41:58.325Z","0.0.4":"2012-02-16T17:56:44.801Z","0.0.5":"2012-02-17T16:27:29.102Z","0.0.6":"2012-02-27T16:09:49.683Z","0.0.7":"2012-03-01T16:16:08.241Z","0.0.8":"2012-03-02T17:49:42.095Z","0.0.9":"2012-03-08T15:59:51.706Z","0.0.10":"2012-03-15T16:56:08.546Z","0.0.11":"2012-03-20T16:11:22.360Z","0.0.12":"2012-03-27T22:02:02.682Z","0.0.13":"2012-04-13T14:59:27.286Z","0.0.14":"2012-05-16T14:38:03.457Z","0.0.15":"2012-05-16T16:49:08.871Z","0.0.16":"2012-05-31T14:51:02.508Z","0.0.17":"2012-06-05T17:09:54.899Z","0.0.18":"2012-06-06T15:11:34.443Z","0.4.9":"2012-06-06T16:20:11.260Z","0.4.10":"2012-06-08T16:41:30.137Z","0.4.11":"2012-06-12T13:28:25.535Z","0.4.12":"2012-06-13T15:36:19.404Z","0.4.13":"2012-06-14T00:12:44.160Z","0.4.14":"2012-06-14T13:31:16.390Z","0.4.15":"2012-06-15T15:08:43.251Z","0.4.16":"2012-06-18T17:39:24.401Z"},"author":{"name":"Matthew Sackman"},"repository":{"type":"git","url":"git://github.com/atomizejs/atomize-client.git"},"_attachments":{"atomize-client-0.4.16.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-pCdEJHkyESAKEN3M7bDt8Q==","length":138723,"stub":true},"atomize-client-0.4.15.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-2Lr/E6olHrqUHq/Up7TW0w==","length":138764,"stub":true},"atomize-client-0.4.14.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-Ja6cxDlVi6G8xWHdWQrz6Q==","length":138803,"stub":true},"atomize-client-0.4.13.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-F0HL4mEdD3TgwogKDH3h+A==","length":140123,"stub":true},"atomize-client-0.4.12.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-UsRkSJjPuJBy/ldUuvDWuw==","length":139149,"stub":true},"atomize-client-0.4.11.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-/S8YjKV1ABeerEgfdgoUHg==","length":138821,"stub":true},"atomize-client-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-Xtdak/lPsd/7eFi8hrrVGQ==","length":138406,"stub":true},"atomize-client-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-r2MwUU/X5hLIZrDj4yuAqA==","length":138403,"stub":true},"atomize-client-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-UwDlK7xptz9VqSQUg/zWQQ==","length":138076,"stub":true},"atomize-client-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-sGQUtYf42YbGSjR7EZmGBg==","length":137489,"stub":true},"atomize-client-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-7cE+YNWkzWzWUB6fggdM2w==","length":137528,"stub":true},"atomize-client-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-C7uk8RF4K7z1E6viA9jRgA==","length":137361,"stub":true},"atomize-client-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-5jyWTPHC8ymSft1EYLQxYA==","length":137200,"stub":true},"atomize-client-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-rINq2xAHAHblkYS4bn9ocw==","length":138997,"stub":true},"atomize-client-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-VGFk4kviO3bPOcMlQc1UZA==","length":138720,"stub":true},"atomize-client-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-e3UvjIsiPgU/7caAL17sdg==","length":138670,"stub":true},"atomize-client-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-NICECXM6vIs1NUIkJWc05A==","length":138608,"stub":true},"atomize-client-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-1jzH2yBqJH4ywuFQVVYYTQ==","length":138503,"stub":true},"atomize-client-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-stlhWVLlk19U2X54B2H6sQ==","length":138512,"stub":true},"atomize-client-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-IkQtHO/JwzD5M6V0cNJKYQ==","length":138364,"stub":true},"atomize-client-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-BDV3rLzrBb4c4/qeAJz4tQ==","length":137641,"stub":true},"atomize-client-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-fto6z4/UBwGvFtREhZs2vg==","length":137128,"stub":true},"atomize-client-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-HOstVVmQGppGrMDtGdow3w==","length":137025,"stub":true},"atomize-client-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-IuRoTxmWUiRywo8JrqJE3w==","length":9334,"stub":true},"atomize-client-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-L3ll0v0z6BPoFj0VoywhMQ==","length":9239,"stub":true},"atomize-client-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-reA9SxqGSZ+lps/R8VirqQ==","length":9237,"stub":true}}}},
{"id":"atomize-server","key":"atomize-server","value":{"rev":"41-1665e980e46504b5056101ccc77f2270"},"doc":{"_id":"atomize-server","_rev":"41-1665e980e46504b5056101ccc77f2270","name":"atomize-server","description":"Node server library for AtomizeJS: JavaScript DSTM","dist-tags":{"latest":"0.4.14"},"versions":{"0.0.1":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.1","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":"*","atomize-client":">=0.0.1","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c1e3dcf24c4d091b5664fc6c8ab382dd57b60b6e","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.1.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.2":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.2","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":"*","atomize-client":">=0.0.1","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"47ef325e9e7483e00a37cbfa773046287156d32b","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.2.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.3":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.3","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":"*","atomize-client":">=0.0.4","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0d544c95603e5b31eeeb0177a3c2ff25a2caeaaf","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.3.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.4":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.4","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.7","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"84a4914a7f2872d1aa117a8b8e375a6050ad3142","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.4.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.5":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.5","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.7","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e3f54a838dc314d6dbb035554c6f6c87ea30d8c4","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.5.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.6":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.6","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.7","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"7aba74272918d491303e17340259888ef2ead09b","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.6.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.7":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.7","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.10","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8369e20b3066e7326a7b75a5684fa4452e582749","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.7.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.8":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.8","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.10","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"5162c81939ba6c75276c2c122106ddc75f208a44","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.8.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"directories":{}},"0.0.9":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.9","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.12","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c5960b41bd2fc7cf5dc0b701584aae4738e98419","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.9.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.0.10":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.0.10","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.0.7","atomize-client":">=0.0.13","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.0.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d6c5162c10c71890237eb3290fed3e039de5ed55","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.0.10.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.9":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.4.9","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","atomize-client":">=0.4.9","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.4.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"81e598c770174aac7d37b92bd36c9e5d2cdd9ba2","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.4.9.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.10":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.4.10","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","atomize-client":">=0.4.9","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.4.10","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d4b3fbecb4b1daf564308c6ca3f2804b327ed5f8","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.4.10.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.11":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.4.11","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","atomize-client":">=0.4.9","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.4.11","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"57c3fc6b0edf2e76210240174d311864a0a51df4","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.4.11.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.12":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.4.12","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.1.0","atomize-client":">=0.4.12","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.4.12","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6378f68aeb973460d1c7fc4a80846fa6e35dc948","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.4.12.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.13":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.4.13","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.2.0","atomize-client":">=0.4.14","sockjs":">=0.1.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.4.13","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"83665a1f8fc58a70866d1f058fec6b8be6e6b207","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.4.13.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]},"0.4.14":{"name":"atomize-server","author":{"name":"Matthew Sackman"},"version":"0.4.14","repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"main":"index","description":"Node server library for AtomizeJS: JavaScript DSTM","dependencies":{"cereal":">=0.2.0","atomize-client":">=0.4.15","sockjs":">=0.3.0"},"homepage":"http://atomizejs.github.com/","keywords":["software transactional memory","stm","distribution","synchronisation","synchronization","rpc","remote procedure call"],"_npmUser":{"name":"msackman","email":"matthew@rabbitmq.com"},"_id":"atomize-server@0.4.14","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"830ff546e3362fe4c8f1a8750a375a99b8dd4af7","tarball":"http://registry.npmjs.org/atomize-server/-/atomize-server-0.4.14.tgz"},"maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}]}},"readme":"# Atomize-server-node\n\nThis is the NodeJS server library for the Atomize DSTM JavaScript\nproject.\n\n`npm install atomize-server` will install this package.\n\nPlease see the main [AtomizeJS site](http://atomizejs.github.com/) for\nfurther details.","maintainers":[{"name":"msackman","email":"matthew@rabbitmq.com"}],"time":{"modified":"2012-06-15T15:08:58.545Z","created":"2011-12-01T13:07:27.818Z","0.0.1":"2011-12-01T13:07:28.596Z","0.0.2":"2011-12-07T21:51:44.861Z","0.0.3":"2012-02-16T17:56:32.891Z","0.0.4":"2012-03-01T16:16:16.417Z","0.0.5":"2012-03-01T18:19:44.626Z","0.0.6":"2012-03-08T15:59:42.061Z","0.0.7":"2012-03-15T16:56:20.913Z","0.0.8":"2012-03-20T16:11:14.250Z","0.0.9":"2012-03-27T22:06:33.012Z","0.0.10":"2012-04-13T14:59:33.606Z","0.4.9":"2012-06-06T16:20:42.213Z","0.4.10":"2012-06-08T16:34:09.067Z","0.4.11":"2012-06-08T16:41:44.488Z","0.4.12":"2012-06-13T15:36:37.072Z","0.4.13":"2012-06-14T13:33:11.342Z","0.4.14":"2012-06-15T15:08:58.545Z"},"author":{"name":"Matthew Sackman"},"repository":{"type":"git","url":"git://github.com/atomizejs/atomize-server-node.git"},"_attachments":{"atomize-server-0.4.14.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-nuDqnTu/Js6jwfhEwYhC+A==","length":7393,"stub":true},"atomize-server-0.4.13.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-5CZP5QXGH51OKwEp/P7e7g==","length":7348,"stub":true},"atomize-server-0.4.12.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-k4CWJLvA3xTUNOR53UiKvQ==","length":7442,"stub":true},"atomize-server-0.4.11.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-u7r8pGeBTF1KVgU9DZ2T0A==","length":7412,"stub":true},"atomize-server-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-RmJ4eFYAiwU3GT7MFMJRrA==","length":7410,"stub":true},"atomize-server-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-Sgr1qTi6dzg5FqCdTjxi/A==","length":7381,"stub":true},"atomize-server-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-wzC36IAwYWt7K8iqljjYtA==","length":7438,"stub":true},"atomize-server-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-zfnTIDnlFhtHQ5Kph+b1LA==","length":7103,"stub":true},"atomize-server-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-IQdtrsKl8uzxsZX8+1Uv3w==","length":6979,"stub":true},"atomize-server-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-LLOfYu/viPjggGMEw7ghcQ==","length":5671,"stub":true},"atomize-server-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-rCTfe2hiJ+ftiesUzCv37A==","length":4648,"stub":true},"atomize-server-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-3MYDi3F4F+PnaLvT+SFJKQ==","length":4438,"stub":true},"atomize-server-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-XRB/5ahhVOMkZDvy/72hgQ==","length":4380,"stub":true},"atomize-server-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gbT1CQFRg/JOTfiR6WOEdQ==","length":4033,"stub":true},"atomize-server-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AoBE3LFyaVu7cVQAvBkZzg==","length":3783,"stub":true},"atomize-server-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xYZnMynjuMyYsvd8bCDZEQ==","length":3981,"stub":true}}}},
{"id":"atpl","key":"atpl","value":{"rev":"3-9aec8996f1b9e44169697a2b45f1a54d"},"doc":{"_id":"atpl","_rev":"3-9aec8996f1b9e44169697a2b45f1a54d","name":"atpl","description":"A simple template engine based on twig and django.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"atpl","description":"A simple template engine based on twig and django.","version":"0.1.0","author":{"name":"Carlos Ballesteros","email":"cballesterosvelasco@gmail.com","url":"http://cballesterosvelasco.es/"},"contributors":[],"dependencies":{},"devDependencies":{},"homepage":"https://github.com/soywiz/atpl.js","keywords":["template","engine"],"repository":{"type":"git","url":"git://github.com/soywiz/atpl.js.git"},"main":"lib/atpl.js","engines":{"node":"*"},"_npmUser":{"name":"soywiz","email":"soywiz@gmail.com"},"_id":"atpl@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ef38d6bb961a435364254adbd96f4a12f2db941b","tarball":"http://registry.npmjs.org/atpl/-/atpl-0.1.0.tgz"},"readme":"","maintainers":[{"name":"soywiz","email":"soywiz@gmail.com"}]}},"readme":"","maintainers":[{"name":"soywiz","email":"soywiz@gmail.com"}],"time":{"modified":"2012-01-14T16:28:05.179Z","created":"2012-01-14T16:27:58.317Z","0.1.0":"2012-01-14T16:28:05.179Z"},"author":{"name":"Carlos Ballesteros","email":"cballesterosvelasco@gmail.com","url":"http://cballesterosvelasco.es/"},"repository":{"type":"git","url":"git://github.com/soywiz/atpl.js.git"},"_attachments":{"atpl-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3Cdhe2KSzBesb24sOjwF/Q==","length":9331,"stub":true}}}},
{"id":"att","key":"att","value":{"rev":"7-21dac10b6f14f25755a1bd7f9846a88f"},"doc":{"_id":"att","_rev":"7-21dac10b6f14f25755a1bd7f9846a88f","name":"att","description":"an Auto Task Tool for Web Developers","dist-tags":{"latest":"3.0.0beta2"},"versions":{"3.0.0beta":{"name":"att","version":"3.0.0beta","description":"an Auto Task Tool for Web Developers","keywords":["att","web build","minify","web performance"],"bin":{"att":"./bin/att"},"main":"att.js","engines":{"node":">=0.6.3"},"author":{"name":"colorhook","email":"colorhook@gmail.com"},"maintainers":[{"name":"colorhook","email":"colorhook@gmail.com"}],"bugs":{"email":"colorhook@gmail.com","url":"http://github.com/colorhook/att/issues"},"dependencies":{"node-jsxml":"~0.2.0","node-properties-parser":"~0.0.2","node-fs":"~0.1.3","wrench":"~1.3.8","minimatch":"~0.2","glob":"~3.1.9","optimist":"~0.3.4","commander":"~0.6.0","uglify-js":"~1.2.6","clean-css":"~0.3.2","less":"~1.3.0","html-minifier":"~0.4.5","node-smushit":"~0.1.0","mailer":"~0.6.7","ftp":"~0.1.2","jshint":"~0.7.1","csslint":"~0.9.8","qr":"~0.1.4"},"homepage":"https://github.com/colorhook/att","repository":{"type":"git","url":"git://github.com/colorhook/att.git"},"licenses":[{"type":"MIT","url":"http://github.com/colorhook/att/blob/master/LICENSE"}],"_npmUser":{"name":"colorhook","email":"colorhook@gmail.com"},"_id":"att@3.0.0beta","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"0f2b424adf5a7b6af6f8c2cc886acae556c75ce1","tarball":"http://registry.npmjs.org/att/-/att-3.0.0beta.tgz"}},"3.0.0beta1":{"name":"att","version":"3.0.0beta1","description":"an Auto Task Tool for Web Developers","keywords":["att","web build","minify","web performance"],"bin":{"att":"./bin/att"},"main":"att.js","engines":{"node":">=0.6.3"},"author":{"name":"colorhook","email":"colorhook@gmail.com"},"maintainers":[{"name":"colorhook","email":"colorhook@gmail.com"}],"bugs":{"email":"colorhook@gmail.com","url":"http://github.com/colorhook/att/issues"},"dependencies":{"node-jsxml":"~0.2.0","node-properties-parser":"~0.0.2","node-fs":"~0.1.3","wrench":"~1.3.8","minimatch":"~0.2","glob":"~3.1.9","optimist":"~0.3.4","commander":"~0.6.0","uglify-js":"~1.2.6","clean-css":"~0.3.2","less":"~1.3.0","html-minifier":"~0.4.5","node-smushit":"~0.1.0","mailer":"~0.6.7","ftp":"~0.1.2","jshint":"~0.7.1","csslint":"~0.9.8"},"homepage":"https://github.com/colorhook/att","repository":{"type":"git","url":"git://github.com/colorhook/att.git"},"licenses":[{"type":"MIT","url":"http://github.com/colorhook/att/blob/master/LICENSE"}],"_npmUser":{"name":"colorhook","email":"colorhook@gmail.com"},"_id":"att@3.0.0beta1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"b1bf426638b7fc2a39a49875c42ccbcce4e14f35","tarball":"http://registry.npmjs.org/att/-/att-3.0.0beta1.tgz"}},"3.0.0beta2":{"name":"att","version":"3.0.0beta2","description":"an Auto Task Tool for Web Developers","keywords":["att","web build","minify","web performance"],"bin":{"att":"./bin/att"},"main":"att.js","engines":{"node":">=0.6.3"},"author":{"name":"colorhook","email":"colorhook@gmail.com"},"maintainers":[{"name":"colorhook","email":"colorhook@gmail.com"}],"bugs":{"email":"colorhook@gmail.com","url":"http://github.com/colorhook/att/issues"},"dependencies":{"node-jsxml":"~0.2.0","node-properties-parser":"~0.0.2","node-fs":"~0.1.3","wrench":"~1.3.8","minimatch":"~0.2","glob":"~3.1.9","optimist":"~0.3.4","commander":"~0.6.0","uglify-js":"~1.2.6","clean-css":"~0.3.2","less":"~1.3.0","html-minifier":"~0.4.5","node-smushit":"~0.1.0","mailer":"~0.6.7","ftp":"~0.1.2","jshint":"~0.7.1","csslint":"~0.9.8"},"homepage":"https://github.com/colorhook/att","repository":{"type":"git","url":"git://github.com/colorhook/att.git"},"licenses":[{"type":"MIT","url":"http://github.com/colorhook/att/blob/master/LICENSE"}],"_npmUser":{"name":"colorhook","email":"colorhook@gmail.com"},"_id":"att@3.0.0beta2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"511c27c336c576b69eacab34a1d8cf0a3a8a4c78","tarball":"http://registry.npmjs.org/att/-/att-3.0.0beta2.tgz"}}},"readme":"# ATT - Auto Task Tool\r\nATT is a terminal tool for front-end developers to make web project deployment easier and faster.\r\n\r\n## Install\r\n\r\n...prepare publish to npm\r\n\r\n## Usage\r\n```shell\r\natt <plugin> <...args>\r\n```\r\n\r\n* `att jshint */**/*.js` 检查所有js文件\r\n* `att minify index.html`  压缩html\r\n* `att minify icon.png`  压缩png\r\n* `att minify app.js`  压缩js\r\n* `att minify style.css`  压缩css\r\n* `att smushit icon.png` 压缩图片并替换原有图片\r\n* `att datauri style.css`  对css中的图片进行datauri编码\r\n* `att cdn app.js` 上传文件到CDN\r\n* `att build task` 根据XML文件build一个工程\r\n\r\n## Plugins\r\n\r\n#### att jshint\r\n> 检查JavaScript语法\r\n\r\n```shell\r\natt jshint */**/*.js\r\n```\r\n\r\n#### att csslint\r\n> 检查CSS语法\r\n\r\n```shell\r\natt csshint */**/*.css\r\n```\r\n\r\n#### att minify\r\n> 压缩HTML, CSS, JavaScript和图片\r\n压缩后的文件会存在于att的临时目录下，不会覆盖当前的文件。\r\n\r\n```shell\r\natt minify */**/*.*\r\n```\r\n\r\n#### att datauri\r\n> 对CSS文件中的图片进行Base64编码\r\n和`att minify`一样，图片经过Base64后的CSS文件会存在于att的临时目录下，不会覆盖当前的文件。\r\n\r\n```shell\r\natt datauri */**/*.css\r\n```\r\n\r\n#### att tmp\r\n>查看，清除att临时目录\r\n\r\n+ 查看临时目录\r\n\r\n```shell\r\natt tmp\r\n```\r\n+ 清空临时目录\r\n\r\n```shell\r\natt tmp clear\r\n```\r\n\r\n\r\n#### att cdn\r\n> 传输本地文件到CDN服务器上，这个命令可以将本机js, css, image等资源文件上传都CDN上。\r\n- 首先，使用CDN上传功能需要在CDN服务器上部署一个HTTP service, 通过一个API接口来让att控制台和CDN服务器进行文件传输。\r\n- 其次，在att的配置文件att.json中需要配置当前的工作目录，该目录一般为某个版本库的根路径，可以配置多个工作目录。\r\n\r\n>上传的过程中，会对js，css和image进行压缩。如果js，css文件中的注释有定义版本号，它默认会在文件后面加上版本号。\r\n例如一个名为`test.js`文件中顶部注释如下所示，那么上传后的文件名会变成`test-2-3-6.js`\r\n\r\n```javascript\r\n/*!\r\n * @version 2-3-6\r\n * @author ...\r\n * @description ...\r\n */\r\n```\r\n\r\n+ 上传到测试CDN\r\n\r\n```shell\r\natt cdn /product/project/*/**/*.js\r\n```\r\n\r\n+ 上传到测试CDN的同时上传到线上CDN\r\n\r\n```shell\r\natt cdn /product/project/*/**/*.js -p\r\n```\r\n\r\n#### att build\r\n> 根据XML配置文件来build工程，在XML配置文件中，可以通过标签来表示一系列的动作，包括创建、删除，移动文件和文件夹，修改文件和文件夹名称，\r\n合并文件，对CSS进行DataURI，压缩图片, HTML, CSS和JavaScript，合并成zip包，甚至上传到FTP和发邮件。\r\n\r\n+ 先定义一个att.xml配置文件\r\n\r\n```xml\r\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<project name=\"att-project\" description=\"att-project-description\" default=\"build\" basedir=\".\">\r\n\r\n\t<property name=\"src\" value=\"src\"/>\r\n\t<property name=\"build\" value=\"build\"/>\r\n\r\n\t<target name=\"echo\">\r\n\t\t<echo>hello, att</echo>\r\n\t</target>\r\n\r\n\t<target name=\"clear\">\r\n\t\t<delete target=\"/your/file/or/dir/need/to/delete\"/>\r\n\t</target>\r\n\t\r\n\t<target name=\"create\">\r\n\t    <mkdir target=\"${build}\"/>\r\n\t    <touch target=\"${build}/README\"/>\r\n\t</target>\r\n\r\n\t<target name=\"minify\">\r\n\t\t<concat to=\"${build}/combo.js\" split=\"\\r\\n\">\r\n\t\t\t<fileset>\r\n\t\t\t\t<include file=\"${src}/lib/mvc.js\"/>\r\n\t\t\t\t<include file=\"${src}/js/model.js\"/>\r\n\t\t\t\t<include file=\"${src}/js/view.js\"/>\r\n\t\t\t\t<include file=\"${src}/js/controller.js\"/>\r\n\t\t\t\t<include file=\"${src}/js/app.js\"/>\r\n\t\t\t</fileset>\r\n\t\t</concat>\r\n\t\t<minify from=\"${src}/style.css\" to=\"${build}/style.css\"/>\r\n\t\t<minify from=\"${build}/combo.js\" to=\"${build}/combo-min.js\"/>\r\n\t</target>\r\n\r\n\t<target name=\"ftp\">\r\n\t\t<input name=\"ftp.password\" label=\"ftp password:\"/>\r\n\t\t<ftp host=\"your-ftp-host\" username=\"root\" password=\"${ftp.password}\" port=\"21\" \r\n\t\t\tremotedir=\"/att\">\r\n\t\t\t<upload>\r\n\t\t\t\t<fileset>\r\n\t\t\t\t\t<include file=\"${build}/combo-min.js\"/>\r\n\t\t\t\t</fileset>\r\n\t\t\t</upload>\r\n\t\t</ftp>\r\n\t</target>\r\n\r\n\t<target name=\"notify\">\r\n\t\t<input name=\"mail.password\" label=\"mail password:\" type=\"password\"/>\r\n\t\t<mail host=\"smtp.gmail.com\" ssl=\"true\" port=\"465\" authentication=\"login\"\r\n\t\t\tfrom=\"colorhook@gmail.com\" to=\"colorhook@gmail.com\"\r\n\t\t\tusername=\"colorhook@gmail.com\" password=\"${mail.password}\"  subject=\"att notification\">\r\n\t\t<![CDATA[\r\n\t\tThis is an email sent by att.\r\n\t\t]]>\r\n\t\t</mail>\r\n\t</target>\r\n\r\n\t<target name=\"build\" depends=\"echo,clear,create,minify,ftp,notify\">\r\n\t</target>\r\n</project>\r\n```\r\n\r\n+ Run the command in terminal.\r\n\r\n```shell\r\natt build\r\n```\r\n\r\n+ Run the special task\r\n\r\n```shell\r\natt build -t taskname\r\n```\r\n+ Run the special task by special config file\r\n\r\n```shell\r\natt build -t taskname -f your-custom-config-file-name\r\n```\r\n> 如果要在`att.xml`中使用`zip`命令，需要操作系统的PATH路径下有zip命令，如果没有安装过zip包，可以从[这里](http://stahlworks.com/dev/index.php?tool=zipunzip)下载。\r\n\r\n\r\n#### att html2pdf\r\n> 将HTML页面转化成PDF，需要先安装`wkhtmltopdf`库，并把可执行文件加入到PATH路径下。\r\n\r\n```shell\r\natt html2pdf */**/*.html\r\n```\r\n\r\n## Licence\r\n\r\nATT is free to use under MIT license. \r\n\r\n## Bugs & Feedback\r\n\r\nPlease feel free to [report bugs](http://github.com/colorhook/att/issues) or [feature requests](http://github.com/colorhook/att/pulls).\r\nYou can send me private message on `github`, or send me an email to: [colorhook@gmail.com]","maintainers":[{"name":"colorhook","email":"colorhook@gmail.com"}],"time":{"modified":"2012-06-21T07:28:00.438Z","created":"2012-06-21T06:51:26.031Z","3.0.0beta":"2012-06-21T06:51:31.634Z","3.0.0beta1":"2012-06-21T07:02:50.891Z","3.0.0beta2":"2012-06-21T07:28:00.438Z"},"author":{"name":"colorhook","email":"colorhook@gmail.com"},"repository":{"type":"git","url":"git://github.com/colorhook/att.git"},"_attachments":{"att-3.0.0beta2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0baVUH2txyBVy1Bm50W+NQ==","length":25049,"stub":true},"att-3.0.0beta1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-aY4iuRAjANamJ36dTYxnvA==","length":25053,"stub":true},"att-3.0.0beta.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-91iYZwEBdYDxHjXZEBpBZQ==","length":25066,"stub":true}}}},
{"id":"attache.js","key":"attache.js","value":{"rev":"3-080c6e3d73da3a7e909f12281d51f429"},"doc":{"_id":"attache.js","_rev":"3-080c6e3d73da3a7e909f12281d51f429","name":"attache.js","description":"AOP implementation in JavaScript","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"author":{"name":"Marcin Olichwirowicz","email":"olichwirowicz@gmail.com"},"name":"attache.js","description":"AOP implementation in JavaScript","version":"0.0.2","repository":{"type":"git","url":"git@github.com:rodzyn/attache.js.git"},"main":"attache.js","scripts":{"test":"bash tests/run.sh"},"engines":{"node":"~0.6.2"},"dependencies":{},"devDependencies":{"asserts":">= 0.4.9"},"_npmUser":{"name":"rodzyn","email":"olichwirowicz@gmail.com"},"_id":"attache.js@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a7c5c332f786560c859be7294c8b6f0cc9f22d03","tarball":"http://registry.npmjs.org/attache.js/-/attache.js-0.0.2.tgz"},"maintainers":[{"name":"rodzyn","email":"olichwirowicz@gmail.com"}]}},"readme":"Attache.js\n==========\n### Javascript implementation of Aspect Oriented Programming paradigm, enclosed in Node.js module\n\n#### How to use:\n\n\tvar attache = require('attache.js');\n\n\tattache.after(some_object, \"some_object_function\", function() {\n\t\t// Code which will be executed _after_ some.object.some_function() call\t\n\t});\n\n\tattache.once_after(some_object, \"some_object_function\", function() {\n\t\t// Code which will be executed _only once_ after some.object.some_function() call\t\n\t});\n\n\t// Removing aspect function\n\t// Note: basically, we need to have stored aspect function in the value to pass it properly to remove function\n\tattache.remove_after(some_object, some_object_function, aspect_function);\n\n\tattache.before(some_object, \"some_object_function\", function() {\n\t\t// Code which will be executed _before_ some.object.some_function() call\t\n\t});\n\n\tattache.once_before(some_object, \"some_object_function\", function() {\n\t\t// Code which will be executed _only once_ before some.object.some_function() call\t\n\t});\n\n\t// Removing aspect function\n\t// Note: basically, we need to have stored aspect function in the value to pass it properly to remove function\n\tattache.remove_before(some_object, \"some_object_function\", aspect_function);\n\n\n### Example:\n\tattache = require('attache.js');\n\t\n\tvar obj = {\n\t  test: function(x) { return x; }\n\t};\n\t\n\tvar fake = function() {\n\t  var fake_val = 100;\n\t  attache.before(obj, \"test\", function() {\n\t  \tconsole.log(fake_val);\n\t\tconsole.log(arguments);    \n\t  });\n\t}\n\t\n\tfake();\n\tconsole.log(obj.test(2, 3, 4));\n\n##### Output:\n\n\t100\n\t{ '0': 2, '1': 3, '2': 4 }\n\t2","maintainers":[{"name":"rodzyn","email":"olichwirowicz@gmail.com"}],"time":{"modified":"2011-12-05T22:50:17.417Z","created":"2011-12-05T22:50:15.595Z","0.0.2":"2011-12-05T22:50:17.417Z"},"author":{"name":"Marcin Olichwirowicz","email":"olichwirowicz@gmail.com"},"repository":{"type":"git","url":"git@github.com:rodzyn/attache.js.git"},"_attachments":{"attache.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wfazW0spoMAMLSInh4RhjA==","length":10240,"stub":true}}}},
{"id":"attachmate","key":"attachmate","value":{"rev":"29-c995a8a9ec87524b1975b186579cdf1c"},"doc":{"_id":"attachmate","_rev":"29-c995a8a9ec87524b1975b186579cdf1c","name":"attachmate","description":"CouchDB Attachment Helpers (part of the Steelmesh stack)","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"attachmate","description":"CouchDB Attachment Helpers (part of the Steelmesh stack)","tags":["couchdb"],"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"version":"0.1.0","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"inherits":">= 1.0.0","request":"2.2.x","fstream":">= 0.1.3","mime":">= 1.0.0","debug":"*"},"devDependencies":{"vows":"0.5.x"},"repository":{"type":"git","url":"git://github.com/steelmesh/attachmate.git"},"bugs":{"url":"http://github.com/steelmesh/attachmate/issues"},"contributors":[],"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"attachmate@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"314ef7a1883d46cd2a7c3353b0804b034f8e66f1","tarball":"http://registry.npmjs.org/attachmate/-/attachmate-0.1.0.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.1":{"name":"attachmate","description":"CouchDB Attachment Helpers (part of the Steelmesh stack)","tags":["couchdb"],"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"version":"0.1.1","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"inherits":">= 1.0.0","request":"2.2.x","fstream":">= 0.1.3","mime":">= 1.0.0","debug":"*"},"devDependencies":{"vows":"0.5.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/attachmate.git"},"bugs":{"url":"http://github.com/DamonOehlman/attachmate/issues"},"contributors":[],"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"attachmate@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6a7e03de5e65457f9b8e54bfb48621735959cd33","tarball":"http://registry.npmjs.org/attachmate/-/attachmate-0.1.1.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.1.2":{"name":"attachmate","description":"CouchDB Attachment Helpers (part of the Steelmesh stack)","tags":["couchdb"],"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"version":"0.1.2","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"inherits":">= 1.0.0","request":"2.9.x","fstream":"0.1.x","mime":"1.2.x","debug":"*"},"devDependencies":{},"repository":{"type":"git","url":"git://github.com/DamonOehlman/attachmate.git"},"bugs":{"url":"http://github.com/DamonOehlman/attachmate/issues"},"contributors":[],"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"attachmate@0.1.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e039938e3654b20f2009254a5fe2248bc7cae7f9","tarball":"http://registry.npmjs.org/attachmate/-/attachmate-0.1.2.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.1.3":{"name":"attachmate","description":"CouchDB Attachment Helpers (part of the Steelmesh stack)","tags":["couchdb"],"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"version":"0.1.3","engines":{"node":">= 0.4.x < 0.9.0"},"dependencies":{"inherits":">= 1.0.0","request":"2.9.x","fstream":"0.1.x","mime":"1.2.x","debug":"*"},"devDependencies":{},"repository":{"type":"git","url":"git://github.com/DamonOehlman/attachmate.git"},"bugs":{"url":"http://github.com/DamonOehlman/attachmate/issues"},"contributors":[],"readme":"# attachmate - Streamable CouchDB attachments :)\n\nAn experiment in using @isaacs useful [fstream](https://github.com/isaacs/fstream) project to stream files in and out of [CouchDB](http://couchdb.apache.org/) as attachments to documents.\n\n## Downloading From Couch to FileSystem\n\n### Example: Download Attachments to the Filesystem\n\n```js\nvar attachmate = require('attachmate'),\n    fstream = require('fstream'),\n    path = require(\"path\"),\n    \n    r = new attachmate.Reader({ path: 'http://localhost:5984/testdb/doc_with_attachments' }),\n    w = fstream.Writer({ path: path.resolve(__dirname, 'output'), type: 'Directory'});\n    \n// pipe the attachments to the directory\nr.pipe(w);\n```\n\n### Example: Download Attachments (using download helper)\n\n```js\nvar attachmate = require('attachmate'),\n    path = require('path');\n    \nattachmate.download(\n    'http://localhost:5984/testdb/doc_with_attachments', \n    path.resolve(__dirname, 'output'), \n    function(err) {\n        console.log('done, error = ', err);\n    }\n);\n```\n\n## Uploading from Filesystem to Couch\n\n### Options\n\nThe fstream classes take a set of options at initialization.  In keeping with the fstream standard, we use the `path` option to denote the target document.  The following additional options are also supported:\n\n- `preserveExisting` - whether or not existing attachments on the document should be preserved. (default = true)\n\n- `includeHidden` - whether or not hidden files should be included when uploading attachments to couch. (default = false)\n\n### Example: Upload Attachments to the Filesystem\n\n```js\nvar attachmate = require('attachment'),\n    fstream = require('fstream'),\n    path = require(\"path\"),\n    \n    r = fstream.Reader({ path: 'input', type: 'Directory' }),\n    w = new attachmate.Writer({ path: 'http://localhost:5984/testdb/test' });\n    \n// upload the contents of the input directory as attachments\nr.pipe(w);\n```\n\n### Example: Upload Attachments (using upload helper)\n\n```js\nvar attachmate = require('attachmate'),\n    path = require('path');\n    \nattachmate.upload(\n    'http://localhost:5984/testdb/test', \n    path.resolve(__dirname, 'input'), \n    function(err) {\n        console.log('done, error = ', err);\n    }\n);\n```\n","_id":"attachmate@0.1.3","dist":{"shasum":"a37dccde87729a6df6b666017fee5e9b16185be3","tarball":"http://registry.npmjs.org/attachmate/-/attachmate-0.1.3.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]}},"readme":"# attachmate - Streamable CouchDB attachments :)\n\nWell, that's the idea anyway, and well it's working with reading attachments :)\n\n```js\nvar attachmate = require('attachmate'),\n    fstream = require('fstream'),\n    path = require(\"path\"),\n    \n    r = new attachmate.Reader({ path: 'http://localhost:5984/testdb/doc_with_attachments' }),\n    w = fstream.Writer({ path: path.resolve(__dirname, 'output'), type: 'Directory'});\n    \n// pipe the attachments to the directory\nr.pipe(w);\n```","maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"time":{"modified":"2012-06-27T07:01:23.574Z","created":"2011-11-30T07:11:33.398Z","0.0.1":"2011-11-30T07:11:37.499Z","0.0.2":"2011-12-02T01:47:58.674Z","0.0.3":"2011-12-02T04:51:53.495Z","0.0.4":"2011-12-02T05:22:21.154Z","0.0.5":"2011-12-02T09:19:17.694Z","0.1.0":"2011-12-19T11:59:21.384Z","0.1.1":"2011-12-30T02:40:34.151Z","0.1.2":"2012-03-02T06:08:22.816Z","0.1.3":"2012-06-27T07:01:23.574Z"},"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/attachmate.git"},"_attachments":{"attachmate-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-hGGtNXjCwgp/MEqVjwRFzQ==","length":183121,"stub":true},"attachmate-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-26+ME5EM+MOhB9ihdunEnw==","length":183668,"stub":true},"attachmate-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-brMe+6cY3Bvwjm2iSFe8MA==","length":183043,"stub":true},"attachmate-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-dr+D2CYbVe4vpMOgPjxElA==","length":183037,"stub":true}}}},
{"id":"attachmentsaver","key":"attachmentsaver","value":{"rev":"5-97f368333fbb44a2c66e1a26bebeb538"},"doc":{"_id":"attachmentsaver","_rev":"5-97f368333fbb44a2c66e1a26bebeb538","name":"attachmentsaver","description":"Receives local email saving pdf attachments to Desktop. by Harald Rudell","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"attachmentsaver","description":"Receives local email saving pdf attachments to Desktop. by Harald Rudell","version":"0.0.2","contributors":[{"name":"Harald Rudell","email":"harald@allgoodapps.com","url":"http://blog.haraldrudell.com"}],"repository":{"type":"git","url":"git://github.com/haraldrudell/attachmentsaver.git"},"dependencies":{"simplesmtp":"","mailparser":""},"main":"./app.js","_npmUser":{"name":"haraldrudell","email":"harald@therudells.com"},"_id":"attachmentsaver@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f307372b308325f0fd233fdb8cece5ddf4cb5aca","tarball":"http://registry.npmjs.org/attachmentsaver/-/attachmentsaver-0.0.2.tgz"},"readme":"","maintainers":[{"name":"haraldrudell","email":"harald@therudells.com"}]},"0.0.3":{"name":"attachmentsaver","description":"Receives local email saving pdf attachments to Desktop. by Harald Rudell","author":{"name":"Harald Rudell","email":"harald@allgoodapps.com"},"version":"0.0.3","contributors":[{"name":"Harald Rudell","email":"harald@allgoodapps.com","url":"http://blog.haraldrudell.com"}],"repository":{"type":"git","url":"git://github.com/haraldrudell/attachmentsaver.git"},"dependencies":{"simplesmtp":"","mailparser":""},"main":"./app.js","_npmUser":{"name":"haraldrudell","email":"harald@therudells.com"},"_id":"attachmentsaver@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"05f2e3b525def7eb4bd0924e04e8ccc65b6a8c39","tarball":"http://registry.npmjs.org/attachmentsaver/-/attachmentsaver-0.0.3.tgz"},"readme":"","maintainers":[{"name":"haraldrudell","email":"harald@therudells.com"}]}},"readme":"","maintainers":[{"name":"haraldrudell","email":"harald@therudells.com"}],"time":{"modified":"2012-04-24T03:02:04.057Z","created":"2012-04-18T04:39:18.160Z","0.0.2":"2012-04-18T04:39:20.151Z","0.0.3":"2012-04-24T03:02:04.057Z"},"repository":{"type":"git","url":"git://github.com/haraldrudell/attachmentsaver.git"},"author":{"name":"Harald Rudell","email":"harald@allgoodapps.com"},"_attachments":{"attachmentsaver-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-y/fnLVvCE/fH4blBOi2sew==","length":234452,"stub":true},"attachmentsaver-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ywe+Np+OOGcwz4zIKT7h2g==","length":2476,"stub":true}}}},
{"id":"attempt","key":"attempt","value":{"rev":"5-584f3fd40b76e293dca5ed9748123d10"},"doc":{"_id":"attempt","_rev":"5-584f3fd40b76e293dca5ed9748123d10","name":"attempt","description":"Automatically retry functions that fail, in crazily customizable ways.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"author":{"name":"Tom Frost","email":"tom@frosteddesign.com"},"name":"attempt","description":"Automatically retry functions that fail, in crazily customizable ways.","version":"0.1.0","homepage":"https://github.com/TomFrost/node-attempt","repository":{"type":"git","url":"git://github.com/TomFrost/node-attempt.git"},"main":"lib/attempt.js","scripts":{"test":"mocha -s 150 test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"mocha":">= 1.1.0","should":">= 0.6.3"},"_npmUser":{"name":"TomFrost","email":"tom@frosteddesign.com"},"_id":"attempt@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"878d25e14f6080b537aecd30f91a008fcaff78e4","tarball":"http://registry.npmjs.org/attempt/-/attempt-0.1.0.tgz"},"maintainers":[{"name":"TomFrost","email":"tom@frosteddesign.com"}]},"0.2.0":{"author":{"name":"Tom Frost","email":"tom@frosteddesign.com"},"name":"attempt","description":"Automatically retry functions that fail, in crazily customizable ways.","version":"0.2.0","homepage":"https://github.com/TomFrost/node-attempt","repository":{"type":"git","url":"git://github.com/TomFrost/node-attempt.git"},"main":"lib/attempt.js","scripts":{"test":"./node_modules/mocha/bin/mocha -R spec -s 150 test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"mocha":">= 1.1.0","should":">= 0.6.3"},"_npmUser":{"name":"TomFrost","email":"tom@frosteddesign.com"},"_id":"attempt@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"eb3747ac6925d029568bf1e6eaffd005041758a9","tarball":"http://registry.npmjs.org/attempt/-/attempt-0.2.0.tgz"},"maintainers":[{"name":"TomFrost","email":"tom@frosteddesign.com"}]}},"readme":"# Attempt\nRetries functions that throw or call back with an error, in crazily\ncustomizable ways.\n\n## Installation\nIn your project folder, type:\n\n\tnpm install attempt\n\n## Usage\nWhenever you have code that looks like this:\n\n\tfunction flakyApiCall(function(err, result) {\n\t    if (err)\n\t        console.err('Flaky API died AGAIN!');\n\t    else\n\t        doSomething(result);\n\t});\n\nJust drop that code in an attempt!\n\n\tvar attempt = require('attempt');\n\tattempt(function() {\n\t\tflakyApiCall(this);\n\t},\n\tfunction(err, result) {\n        if (err)\n            console.err('Flaky API failed 5 times.');\n        else\n            doSomething(result);\n    });\n\n## Details\nAttempt will re-run your attempted function if it throws an error or if it\ncalls back with a non-empty first argument (following the first-arg-is-an-error\nstandard Node.js convention).  The function call looks like this:\n\n**attempt(tryFunc, _[options]_, _[callback]_)**\n\ntryFunc is called with one argument: attempts.  It is the number of times the\ntryFunc has been run before.\n\n\tattempt(function(attempts) {\n\t\tif (attempts)\n\t\t\tconsole.log('This is retry #' + attempts);\n\t\telse\n\t\t\tconsole.log('This is the first attempt!');\n\t});\n\n### Options\nThe following options are set per request:\n\n#### retries\n*Default: 5.* The number of times to retry the tryFunc before\ngiving up and sending the error to the callback.\n\n\tattempt(function() {\n\t\tflakyApiCall(this);\n\t}, { retries: 15 }, function(err, result) {\n\t\tif (err)\n\t\t\tconsole.err('Failed 16 times.');\n\t\telse\n\t\t\tdoSomething(result);\n\t});\n\n#### interval\n*Default: 0.* The number of milliseconds to wait between attempts.\n\n\tattempt(function() {\n        flakyApiCall(this);\n    }, { interval: 5000 }, function(err, result) {\n        if (err)\n            console.err('5 retries * 5 seconds = 25 seconds of failure.');\n        else\n            doSomething(result);\n    });\n\n#### factor\n*Default: 1.* The factor by which the interval should be multiplied per\nattempt.  If set to 2 with an interval of 5, the first retry will execute after\n5 seconds, the second after 10, the third after 20, and so on.\n\nThis allows an exponential retry scheme.  For a smaller gap between retries,\nfloats like 1.2 can be used to grow the interval at a slower rate.\n\n#### onError\n*Default: null.* Function to call when the tryFunc fails with an\nerror.  The first argument is the error.\n\n\tattempt(function() { flakyApiCall(this); },\n\t\t{ onError: function(err) { console.err(err); } },\n\t\tfunction(err, result) { /* ... */ });\n\nThe second argument, if it exists, is a callback function that will need to be\ncalled in order for the next attempt to continue.  This is useful if you have\nto do something asynchronous to fix the error.\n\n\tattempt(function() { flakyApiCall(this); },\n\t\t{ onError: function(err, done) {\n\t\t\tlog.write(err, done);\n\t\t} },\n\t\tfunction(err, result) { /* ... */ });\n\nBy default, calling done() will ignore the retry interval.  If you still want\nit to be observed, call *done(true)*.\n\n#### attempts\n*Default: 0.* The number of attempts to fake Attempt into believing were\nalready completed.  This is mostly used by Attempt internally, but can be\nuseful for hacking interval times.\n\n## License\nAttempt is distributed under the MIT license.\n\n## Credits\nAttempt was created by Tom Frost in 2012.  Because webservice APIs be flaky,\nman.\n","maintainers":[{"name":"TomFrost","email":"tom@frosteddesign.com"}],"time":{"modified":"2012-07-08T03:07:40.022Z","created":"2012-06-11T12:46:22.821Z","0.1.0":"2012-06-11T12:46:23.036Z","0.2.0":"2012-07-08T03:07:40.022Z"},"author":{"name":"Tom Frost","email":"tom@frosteddesign.com"},"repository":{"type":"git","url":"git://github.com/TomFrost/node-attempt.git"},"_attachments":{"attempt-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cNq84wM/nhJtimAUf8VEoA==","length":10240,"stub":true},"attempt-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ArYEkODUOXzJ4z5rBOeFpg==","length":4514,"stub":true}}}},
{"id":"au","key":"au","value":{"rev":"4-a448820f8990541a337dcfa60ccbc0c8"},"doc":{"_id":"au","_rev":"4-a448820f8990541a337dcfa60ccbc0c8","name":"au","description":"ActiveUser command-line tool.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"au","version":"0.0.1","homepage":"http://activeuser.com","description":"ActiveUser command-line tool.","main":"lib/","bin":{"au":"./bin/au"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"https://github.com/activeuser/au"},"keywords":["activeuser","chrome","extensions"],"licenses":[{"type":"MIT","url":"https://raw.github.com/activeuser/au/master/LICENSE"}],"dependencies":{"commander":"~1.0.0","wrench":"~1.3.9","mote":"~0.2.0"},"devDependencies":{"coffee-script":"~1.3.3","brief":"~0.4.0","mocha":"~1.3.0"},"readme":"au\n==\n\nActiveUser command-line tool","_id":"au@0.0.1","dist":{"shasum":"20826acea679014ce2ab4ae348d0d0215e7b027f","tarball":"http://registry.npmjs.org/au/-/au-0.0.1.tgz"},"maintainers":[{"name":"activeuser","email":"zk@demandmagic.com"}]}},"readme":"au\n==\n\nActiveUser command-line tool","maintainers":[{"name":"activeuser","email":"zk@demandmagic.com"}],"time":{"modified":"2012-08-02T13:44:19.431Z","created":"2012-07-25T23:53:23.056Z","0.0.1":"2012-07-25T23:53:24.433Z"},"repository":{"type":"git","url":"https://github.com/activeuser/au"},"users":{"fgribreau":true},"_attachments":{"au-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/f+mGZemHmz6nM+eVaabDg==","length":46074,"stub":true}}}},
{"id":"audiolib","key":"audiolib","value":{"rev":"60-a7fccc78ab8f454155fe9bbb47b35b22"},"doc":{"_id":"audiolib","_rev":"60-a7fccc78ab8f454155fe9bbb47b35b22","name":"audiolib","description":"audiolib.js is a powerful audio tools library for javascript.","dist-tags":{"latest":"0.6.4"},"versions":{"0.3.0":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.3.0","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"main":"./lib/audiolib","dependencies":{},"devDependencies":{},"_id":"audiolib@0.3.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"017a928ff3c1a7f470e8134ca9ef906e3b885201","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.3.0.tgz"},"scripts":{}},"0.4.0":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.4.0","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"main":"./lib/audiolib","dependencies":{},"devDependencies":{},"_id":"audiolib@0.4.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"7970367d23277d2f6bdda8fa82483fc96050ffcc","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.4.0.tgz"},"scripts":{}},"0.4.1":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.4.1","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"main":"./lib/audiolib","dependencies":{},"devDependencies":{},"_id":"audiolib@0.4.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a5402b8fec06845c4d3e3ea8b9cd3698dc980a59","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.4.1.tgz"},"scripts":{}},"0.5.0":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.5.0","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"main":"./lib/audiolib","dependencies":{},"devDependencies":{},"_id":"audiolib@0.5.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"65c6ee55b1946c8b5b4c6f90294161eaeaab7607","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.5.0.tgz"},"scripts":{},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]},"0.5.1":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.5.1","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"main":"./lib/audiolib","dependencies":{},"devDependencies":{},"_id":"audiolib@0.5.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"22bf4f231958b668e2dfb39108f8026335c40fc4","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.5.1.tgz"},"scripts":{},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]},"0.6.0":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.6.0","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"make lib/audiolib.js"},"main":"./lib/audiolib","_npmUser":{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"},"_id":"audiolib@0.6.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"0a0f4a2ac547804b0b960287fcb4cb3a60b750fa","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.6.0.tgz"},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]},"0.6.1":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.6.1","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"make lib/audiolib.js"},"main":"./lib/audiolib","_npmUser":{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"},"_id":"audiolib@0.6.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"fdb2a60ca78ced0ceb7cbd74bd71f1b482a4ec6a","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.6.1.tgz"},"readme":"# audiolib.js\n## Overview\n\naudiolib.js is a powerful toolkit for audio written in JS.\n\nIt ships with most of the common tools such as:\n\n* Reverbs\n* Comb/IIR/Biquad/All-Pass/Low-Pass/Band-Pass/High-Pass filters\n* Delays\n* Oscillators\n* FFT and other analyzing tools\n* Step sequencers\n* Envelope controls\n* Noise generators\n* Samplers\n\nIn addition, it hosts these tools in a comprehensive framework, that makes it simple to write a single effect and provides the higher level abstraction on top of that, making the whole system comfortable for both users and plugin authors.\n\nAs for the higher level abstraction, audiolib.js features a sophisticated automation API, alongside with pre-processing hooks, sample level access and buffer level management.\n\naudiolib.js is bundled with some tools to make an audio developer's life in a browser much easier, such as sink.js for a consistent API between the experimental browser audio APIs. To complement that, audiolib.js also bundles pcmdata.js that is a WAV encoder/decoder, so that you can turn the recordings you make using Sink.js into WAV files that the user can save. Other tools include the AudioWorker API that allows you to create web workers from strings or functions, bundling audiolib.js and its plugins, all ready to use from the worker.\n\n\n## How to get it\n\naudiolib.js is available both in browser and CLI environments.\n\nTo install via npm:\n\n```\n$ npm install audiolib\n```\n\nFor browser environments, download the latest version [here](https://github.com/jussi-kalliokoski/audiolib.js/downloads), or get the [source code](https://github.com/jussi-kalliokoski/audiolib.js) from GitHub and build it yourself. Don't worry, instructions are included.\n\n## Documentation\n\nDocumentation is available at http://docs.audiolibjs.org/ . Tutorials can be found in the [wiki](https://github.com/jussi-kalliokoski/audiolib.js/wiki)\n\n## Demos\n\n(if you have your own, please fork & add | msg me)\n\n* [JSMad](http://jsmad.org/)\n* [Orbisyn](http://niiden.com/orbisyn/)\n* [jams.no.de](http://jams.no.de)\n* [ofmlabs codecs](http://codecs.ofmlabs.org/)\n\n## Libraries bundled with audiolib.js\n\n* [sink.js](https://github.com/jussi-kalliokoski/sink.js), for output and buffer handling.\n* [PCMData.js](https://github.com/jussi-kalliokoski/pcmdata.js), for WAV codecs.\n* [binary.js](https://github.com/jussi-kalliokoski/binary.js), for PCMData.js and general binary data processing.\n* [fft.js](https://github.com/jussi-kalliokoski/fft.js), for super fast FT.\n\n## Related libraries\n\n* [XAudioJS](https://github.com/grantgalitz/XAudioJS) is an alternative audio sink with built-in resampling and a Flash fallback. More developer-controlled output environment, that might be more sane for example games.\n* [dynamicaudio.js](http://github.com/bfirsh/dynamicaudio.js) is a Flash fallback for Mozilla Audio Data API.\n* [Audiolet](https://github.com/oampo/Audiolet) is a graph-based audio routing framework with a lot of nice stuff.\n* [DSP.js](https://github.com/corbanbrook/dsp.js) is an extensive DSP toolkit originally designed for the Mozilla Audio Data API.\n\n## Plugins\n\nSpecifications for plugin developers can be found in https://github.com/jussi-kalliokoski/audiolib.js/tree/master/specs\n\n## Credits \n\nThis project is maintained by [Jussi Kalliokoski](https://github.com/jussi-kalliokoski), with significant contributions from [David Govea](https://github.com/davidgovea). The project is funded by the awesome [ofmlabs](http://ofmlabs.org) !\n\n## License\n\nLicensed under MIT license.\n\n## Example usage\n\n```javascript\n/* Create an output. */\n\nvar dev = audioLib.Sink(function(sampleBuffer){\n\t// Fill the buffer here.\n}, channelCount, preBufferSize, sampleRate);\n\n/*\n Note that all the arguments are optional,\n so if you want to create a write-only\n device, you can leave the arguments blank.\n Also, it is highly discouraged to set any\n of the arguments if you aren't sure that you\n need them. Use null if you need to skip\n arguments.\n*/\n\n/* Writing buffers: */\ndev.writeBuffer(buffer);\n\n/*\n You can also attach multiple listeners\n to the same Sink instance.\n*/\ndev.on('audioprocess', function(...){});\n\n\n/* Effects */\n\nvar del = audioLib.Delay(sampleRate, delay, feedback);\n\nvar flt = audioLib.IIRFilter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.LP12Filter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.Reverb(sampleRate, channelCount, wet, dry, roomSize, damping);\n\nvar dist = audioLib.BiquadFilter(sampleRate, b0, b1, b2, a1, a2);\n\n/* to feed a new input sample */\neffect.pushSample(sample);\n/* to get the output */\nsample = effect.getMix();\n\n/* Synthesis */\n\nvar osc = audioLib.Oscillator(sampleRate, frequency);\n\n/* to generate a new sample */\nosc.generate();\n/* to get the output */\nosc.getMix();\n\n/* Sampler */\n\nvar sampler = audioLib.Sampler(sampleRate, sampleBuffer, defaultPitch);\n\n/* Envelopes */\n\nvar adsr = audioLib.ADSREnvelope(sampleRate, attack, decay, sustain, release);\n\n/* to trigger the gate */\nadsr.triggerGate(isOpen);\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nadsr.generate();\n/* Get the value */\nadsr.value; // 0.0 - 1.0, unless you put something more as sustain\n\nvar stepSeq = new audioLib.StepSequencer(sampleRate, stepLength, stepArray, attack);\n\n/* To start the sequence over */\nstepSeq.triggerGate();\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nstepSeq.generate();\n/* Get the value */\nstepSeq.value; // 0.0 - 1.0\n\n/* Recording */\n\nvar rec = dev.record();\n\n/* To stop */\nrec.stop();\n// To export wav\nvar audioElement = new Audio(\n\t'data:audio/wav;base64,' +\n\tbtoa( rec.toWav() ) // presuming btoa is supported\n);\n\n/* Resampling buffers */\naudioLib.Sampler.resample(buffer, fromSampleRate,\n\tfromFrequency, toSampleRate, toFrequency);\n\n/*\n If you are used to buffer based approach (for example DSP.js)\n and don't need to do any raw manipulation, all the effects\n can be used as buffer based too.\n*/\n\nvar bufFx = audioLib.Delay/* or any effect */.createBufferBased(\n\tchannelCount, /* the parameters needed by the specific effect */);\n\nbufFx.append(buffer);\n\n```\n\n### Audio Workers\n\nYou can also use audiolib.js inside Audio Workers (Firefox 6.0+ only), but this is a whole another story. There are many approaches to that, you can include audiolib.js via an external javascript worker file, but audiolib.js offers an alternative approach to this: inline workers. Inline audio workers include the source code already downloaded, and thus creates a new worker that already contains audiolib.js. Inline Audio Workers also allow you to inject code into workers. Here is some code to get started, also see tests/audioworker.html.\n\n```javascript\n\nvar worker = audioLib.AudioWorker(function(){\n\tdevice = audioLib.Sink(function(buffer, channelCount){\n\t\t/* Do some audio processing, like you weren't in a worker. */\n\t});\n}, true /* enables injections */);\n\n/* Injection */\n\nworker.inject(function(){\n\t/* Execute some code inside the worker. */\n});\n\n/* Close the worker */\n\nworker.terminate();\n\n```\n\nIt's important to remember that even though that code looks like it's running in the same environment as the code it's written in, it's actually not and runs in the context of the worker, meaning you can't cross-reference variables. Also, the injections are sandboxed, so if you need to create a global variable, drop var.\n","maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]},"0.6.2":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.6.2","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"grunt --config Gruntfile.js"},"main":"./lib/audiolib","_npmUser":{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"},"_id":"audiolib@0.6.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e3041483e2092e98ec734b00cd74dde9af9d3e3b","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.6.2.tgz"},"readme":"# audiolib.js\n## Overview\n\naudiolib.js is a powerful toolkit for audio written in JS.\n\nIt ships with most of the common tools such as:\n\n* Reverbs\n* Comb/IIR/Biquad/All-Pass/Low-Pass/Band-Pass/High-Pass filters\n* Delays\n* Oscillators\n* FFT and other analyzing tools\n* Step sequencers\n* Envelope controls\n* Noise generators\n* Samplers\n\nIn addition, it hosts these tools in a comprehensive framework, that makes it simple to write a single effect and provides the higher level abstraction on top of that, making the whole system comfortable for both users and plugin authors.\n\nAs for the higher level abstraction, audiolib.js features a sophisticated automation API, alongside with pre-processing hooks, sample level access and buffer level management.\n\naudiolib.js is bundled with some tools to make an audio developer's life in a browser much easier, such as sink.js for a consistent API between the experimental browser audio APIs. To complement that, audiolib.js also bundles pcmdata.js that is a WAV encoder/decoder, so that you can turn the recordings you make using Sink.js into WAV files that the user can save. Other tools include the AudioWorker API that allows you to create web workers from strings or functions, bundling audiolib.js and its plugins, all ready to use from the worker.\n\n\n## How to get it\n\naudiolib.js is available both in browser and CLI environments.\n\n### Node\n\nTo install via npm:\n\n```\n$ npm install audiolib\n```\n\nPlease note that you'll need [grunt](http://gruntjs.com/) for this to work.\n\n### Browser\n\nFor browser environments, download the latest version [here](https://github.com/jussi-kalliokoski/audiolib.js/downloads), or get the [source code](https://github.com/jussi-kalliokoski/audiolib.js) from GitHub and build it yourself. Don't worry, instructions are included.\n\n## Documentation\n\nDocumentation is available at http://docs.audiolibjs.org/ . Tutorials can be found in the [wiki](https://github.com/jussi-kalliokoski/audiolib.js/wiki)\n\n## Demos\n\n(if you have your own, please fork & add | msg me)\n\n* [JSMad](http://jsmad.org/)\n* [Orbisyn](http://niiden.com/orbisyn/)\n* [jams.no.de](http://jams.no.de)\n* [ofmlabs codecs](http://codecs.ofmlabs.org/)\n\n## Libraries bundled with audiolib.js\n\n* [sink.js](https://github.com/jussi-kalliokoski/sink.js), for output and buffer handling.\n* [PCMData.js](https://github.com/jussi-kalliokoski/pcmdata.js), for WAV codecs. (project deprecated and adopted)\n* [binary.js](https://github.com/jussi-kalliokoski/binary.js), for PCMData.js and general binary data processing. (project deprecated and adopted)\n* [fft.js](https://github.com/jussi-kalliokoski/fft.js), for super fast FT. (project deprecated and adopted)\n\n## Related libraries\n\n* [XAudioJS](https://github.com/grantgalitz/XAudioJS) is an alternative audio sink with built-in resampling and a Flash fallback. More developer-controlled output environment, that might be more sane for example games.\n* [dynamicaudio.js](http://github.com/bfirsh/dynamicaudio.js) is a Flash fallback for Mozilla Audio Data API.\n* [Audiolet](https://github.com/oampo/Audiolet) is a graph-based audio routing framework with a lot of nice stuff.\n* [DSP.js](https://github.com/corbanbrook/dsp.js) is an extensive DSP toolkit originally designed for the Mozilla Audio Data API.\n\n## Plugins\n\nSpecifications for plugin developers can be found in https://github.com/jussi-kalliokoski/audiolib.js/tree/master/specs\n\n## Credits \n\nThis project is maintained by [Jussi Kalliokoski](https://github.com/jussi-kalliokoski), with significant contributions from [David Govea](https://github.com/davidgovea). The project is funded by the awesome [ofmlabs](http://ofmlabs.org) !\n\n## License\n\nLicensed under MIT license.\n\n## Example usage\n\n```javascript\n/* Create an output. */\n\nvar dev = audioLib.Sink(function(sampleBuffer){\n\t// Fill the buffer here.\n}, channelCount, preBufferSize, sampleRate);\n\n/*\n Note that all the arguments are optional,\n so if you want to create a write-only\n device, you can leave the arguments blank.\n Also, it is highly discouraged to set any\n of the arguments if you aren't sure that you\n need them. Use null if you need to skip\n arguments.\n*/\n\n/* Writing buffers: */\ndev.writeBuffer(buffer);\n\n/*\n You can also attach multiple listeners\n to the same Sink instance.\n*/\ndev.on('audioprocess', function(...){});\n\n\n/* Effects */\n\nvar del = audioLib.Delay(sampleRate, delay, feedback);\n\nvar flt = audioLib.IIRFilter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.LP12Filter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.Reverb(sampleRate, channelCount, wet, dry, roomSize, damping);\n\nvar dist = audioLib.BiquadFilter(sampleRate, b0, b1, b2, a1, a2);\n\n/* to feed a new input sample */\neffect.pushSample(sample);\n/* to get the output */\nsample = effect.getMix();\n\n/* Synthesis */\n\nvar osc = audioLib.Oscillator(sampleRate, frequency);\n\n/* to generate a new sample */\nosc.generate();\n/* to get the output */\nosc.getMix();\n\n/* Sampler */\n\nvar sampler = audioLib.Sampler(sampleRate, sampleBuffer, defaultPitch);\n\n/* Envelopes */\n\nvar adsr = audioLib.ADSREnvelope(sampleRate, attack, decay, sustain, release);\n\n/* to trigger the gate */\nadsr.triggerGate(isOpen);\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nadsr.generate();\n/* Get the value */\nadsr.value; // 0.0 - 1.0, unless you put something more as sustain\n\nvar stepSeq = new audioLib.StepSequencer(sampleRate, stepLength, stepArray, attack);\n\n/* To start the sequence over */\nstepSeq.triggerGate();\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nstepSeq.generate();\n/* Get the value */\nstepSeq.value; // 0.0 - 1.0\n\n/* Recording */\n\nvar rec = dev.record();\n\n/* To stop */\nrec.stop();\n// To export wav\nvar audioElement = new Audio(\n\t'data:audio/wav;base64,' +\n\tbtoa( rec.toWav() ) // presuming btoa is supported\n);\n\n/* Resampling buffers */\naudioLib.Sampler.resample(buffer, fromSampleRate,\n\tfromFrequency, toSampleRate, toFrequency);\n\n/*\n If you are used to buffer based approach (for example DSP.js)\n and don't need to do any raw manipulation, all the effects\n can be used as buffer based too.\n*/\n\nvar bufFx = audioLib.Delay/* or any effect */.createBufferBased(\n\tchannelCount, /* the parameters needed by the specific effect */);\n\nbufFx.append(buffer);\n\n```\n\n### Audio Workers\n\nYou can also use audiolib.js inside Audio Workers (Firefox 6.0+ only), but this is a whole another story. There are many approaches to that, you can include audiolib.js via an external javascript worker file, but audiolib.js offers an alternative approach to this: inline workers. Inline audio workers include the source code already downloaded, and thus creates a new worker that already contains audiolib.js. Inline Audio Workers also allow you to inject code into workers. Here is some code to get started, also see tests/audioworker.html.\n\n```javascript\n\nvar worker = audioLib.AudioWorker(function(){\n\tdevice = audioLib.Sink(function(buffer, channelCount){\n\t\t/* Do some audio processing, like you weren't in a worker. */\n\t});\n}, true /* enables injections */);\n\n/* Injection */\n\nworker.inject(function(){\n\t/* Execute some code inside the worker. */\n});\n\n/* Close the worker */\n\nworker.terminate();\n\n```\n\nIt's important to remember that even though that code looks like it's running in the same environment as the code it's written in, it's actually not and runs in the context of the worker, meaning you can't cross-reference variables. Also, the injections are sandboxed, so if you need to create a global variable, drop var.\n","maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]},"0.6.3":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.6.3","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"grunt --config Gruntfile.js concat:main"},"main":"./lib/audiolib","_npmUser":{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"},"_id":"audiolib@0.6.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a490ed5aeb519a2b9c5a2f8f5ce4cecb28b0bd7e","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.6.3.tgz"},"readme":"# audiolib.js\n## Overview\n\naudiolib.js is a powerful toolkit for audio written in JS.\n\nIt ships with most of the common tools such as:\n\n* Reverbs\n* Comb/IIR/Biquad/All-Pass/Low-Pass/Band-Pass/High-Pass filters\n* Delays\n* Oscillators\n* FFT and other analyzing tools\n* Step sequencers\n* Envelope controls\n* Noise generators\n* Samplers\n\nIn addition, it hosts these tools in a comprehensive framework, that makes it simple to write a single effect and provides the higher level abstraction on top of that, making the whole system comfortable for both users and plugin authors.\n\nAs for the higher level abstraction, audiolib.js features a sophisticated automation API, alongside with pre-processing hooks, sample level access and buffer level management.\n\naudiolib.js is bundled with some tools to make an audio developer's life in a browser much easier, such as sink.js for a consistent API between the experimental browser audio APIs. To complement that, audiolib.js also bundles pcmdata.js that is a WAV encoder/decoder, so that you can turn the recordings you make using Sink.js into WAV files that the user can save. Other tools include the AudioWorker API that allows you to create web workers from strings or functions, bundling audiolib.js and its plugins, all ready to use from the worker.\n\n\n## How to get it\n\naudiolib.js is available both in browser and CLI environments.\n\n### Node\n\nTo install via npm:\n\n```\n$ npm install audiolib\n```\n\nPlease note that you'll need [grunt](http://gruntjs.com/) for this to work.\n\n### Browser\n\nFor browser environments, download the latest version [here](https://github.com/jussi-kalliokoski/audiolib.js/downloads), or get the [source code](https://github.com/jussi-kalliokoski/audiolib.js) from GitHub and build it yourself. Don't worry, instructions are included.\n\n## Documentation\n\nDocumentation is available at http://docs.audiolibjs.org/ . Tutorials can be found in the [wiki](https://github.com/jussi-kalliokoski/audiolib.js/wiki)\n\n## Demos\n\n(if you have your own, please fork & add | msg me)\n\n* [JSMad](http://jsmad.org/)\n* [Orbisyn](http://niiden.com/orbisyn/)\n* [jams.no.de](http://jams.no.de)\n* [ofmlabs codecs](http://codecs.ofmlabs.org/)\n\n## Libraries bundled with audiolib.js\n\n* [sink.js](https://github.com/jussi-kalliokoski/sink.js), for output and buffer handling.\n* [PCMData.js](https://github.com/jussi-kalliokoski/pcmdata.js), for WAV codecs. (project deprecated and adopted)\n* [binary.js](https://github.com/jussi-kalliokoski/binary.js), for PCMData.js and general binary data processing. (project deprecated and adopted)\n* [fft.js](https://github.com/jussi-kalliokoski/fft.js), for super fast FT. (project deprecated and adopted)\n\n## Related libraries\n\n* [XAudioJS](https://github.com/grantgalitz/XAudioJS) is an alternative audio sink with built-in resampling and a Flash fallback. More developer-controlled output environment, that might be more sane for example games.\n* [dynamicaudio.js](http://github.com/bfirsh/dynamicaudio.js) is a Flash fallback for Mozilla Audio Data API.\n* [Audiolet](https://github.com/oampo/Audiolet) is a graph-based audio routing framework with a lot of nice stuff.\n* [DSP.js](https://github.com/corbanbrook/dsp.js) is an extensive DSP toolkit originally designed for the Mozilla Audio Data API.\n\n## Plugins\n\nSpecifications for plugin developers can be found in https://github.com/jussi-kalliokoski/audiolib.js/tree/master/specs\n\n## Credits \n\nThis project is maintained by [Jussi Kalliokoski](https://github.com/jussi-kalliokoski), with significant contributions from [David Govea](https://github.com/davidgovea). The project is funded by the awesome [ofmlabs](http://ofmlabs.org) !\n\n## License\n\nLicensed under MIT license.\n\n## Example usage\n\n```javascript\n/* Create an output. */\n\nvar dev = audioLib.Sink(function(sampleBuffer){\n\t// Fill the buffer here.\n}, channelCount, preBufferSize, sampleRate);\n\n/*\n Note that all the arguments are optional,\n so if you want to create a write-only\n device, you can leave the arguments blank.\n Also, it is highly discouraged to set any\n of the arguments if you aren't sure that you\n need them. Use null if you need to skip\n arguments.\n*/\n\n/* Writing buffers: */\ndev.writeBuffer(buffer);\n\n/*\n You can also attach multiple listeners\n to the same Sink instance.\n*/\ndev.on('audioprocess', function(...){});\n\n\n/* Effects */\n\nvar del = audioLib.Delay(sampleRate, delay, feedback);\n\nvar flt = audioLib.IIRFilter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.LP12Filter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.Reverb(sampleRate, channelCount, wet, dry, roomSize, damping);\n\nvar dist = audioLib.BiquadFilter(sampleRate, b0, b1, b2, a1, a2);\n\n/* to feed a new input sample */\neffect.pushSample(sample);\n/* to get the output */\nsample = effect.getMix();\n\n/* Synthesis */\n\nvar osc = audioLib.Oscillator(sampleRate, frequency);\n\n/* to generate a new sample */\nosc.generate();\n/* to get the output */\nosc.getMix();\n\n/* Sampler */\n\nvar sampler = audioLib.Sampler(sampleRate, sampleBuffer, defaultPitch);\n\n/* Envelopes */\n\nvar adsr = audioLib.ADSREnvelope(sampleRate, attack, decay, sustain, release);\n\n/* to trigger the gate */\nadsr.triggerGate(isOpen);\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nadsr.generate();\n/* Get the value */\nadsr.value; // 0.0 - 1.0, unless you put something more as sustain\n\nvar stepSeq = new audioLib.StepSequencer(sampleRate, stepLength, stepArray, attack);\n\n/* To start the sequence over */\nstepSeq.triggerGate();\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nstepSeq.generate();\n/* Get the value */\nstepSeq.value; // 0.0 - 1.0\n\n/* Recording */\n\nvar rec = dev.record();\n\n/* To stop */\nrec.stop();\n// To export wav\nvar audioElement = new Audio(\n\t'data:audio/wav;base64,' +\n\tbtoa( rec.toWav() ) // presuming btoa is supported\n);\n\n/* Resampling buffers */\naudioLib.Sampler.resample(buffer, fromSampleRate,\n\tfromFrequency, toSampleRate, toFrequency);\n\n/*\n If you are used to buffer based approach (for example DSP.js)\n and don't need to do any raw manipulation, all the effects\n can be used as buffer based too.\n*/\n\nvar bufFx = audioLib.Delay/* or any effect */.createBufferBased(\n\tchannelCount, /* the parameters needed by the specific effect */);\n\nbufFx.append(buffer);\n\n```\n\n### Audio Workers\n\nYou can also use audiolib.js inside Audio Workers (Firefox 6.0+ only), but this is a whole another story. There are many approaches to that, you can include audiolib.js via an external javascript worker file, but audiolib.js offers an alternative approach to this: inline workers. Inline audio workers include the source code already downloaded, and thus creates a new worker that already contains audiolib.js. Inline Audio Workers also allow you to inject code into workers. Here is some code to get started, also see tests/audioworker.html.\n\n```javascript\n\nvar worker = audioLib.AudioWorker(function(){\n\tdevice = audioLib.Sink(function(buffer, channelCount){\n\t\t/* Do some audio processing, like you weren't in a worker. */\n\t});\n}, true /* enables injections */);\n\n/* Injection */\n\nworker.inject(function(){\n\t/* Execute some code inside the worker. */\n});\n\n/* Close the worker */\n\nworker.terminate();\n\n```\n\nIt's important to remember that even though that code looks like it's running in the same environment as the code it's written in, it's actually not and runs in the context of the worker, meaning you can't cross-reference variables. Also, the injections are sandboxed, so if you need to create a global variable, drop var.\n","maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]},"0.6.4":{"name":"audiolib","author":{"name":"Jussi Kalliokoski"},"version":"0.6.4","description":"audiolib.js is a powerful audio tools library for javascript.","repository":{"type":"git","url":"http://github.com/jussi-kalliokoski/audiolib.js.git"},"engines":{"node":">=0.2.0-0"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/jussi-kalliokoski/audiolib.js/issues"},"directories":{"lib":"./lib"},"scripts":{"preinstall":"grunt --config Gruntfile.js concat:main"},"main":"./lib/audiolib","readme":"# audiolib.js\n## Overview\n\naudiolib.js is a powerful toolkit for audio written in JS.\n\nIt ships with most of the common tools such as:\n\n* Reverbs\n* Comb/IIR/Biquad/All-Pass/Low-Pass/Band-Pass/High-Pass filters\n* Delays\n* Oscillators\n* FFT and other analyzing tools\n* Step sequencers\n* Envelope controls\n* Noise generators\n* Samplers\n\nIn addition, it hosts these tools in a comprehensive framework, that makes it simple to write a single effect and provides the higher level abstraction on top of that, making the whole system comfortable for both users and plugin authors.\n\nAs for the higher level abstraction, audiolib.js features a sophisticated automation API, alongside with pre-processing hooks, sample level access and buffer level management.\n\naudiolib.js is bundled with some tools to make an audio developer's life in a browser much easier, such as sink.js for a consistent API between the experimental browser audio APIs. To complement that, audiolib.js also bundles pcmdata.js that is a WAV encoder/decoder, so that you can turn the recordings you make using Sink.js into WAV files that the user can save. Other tools include the AudioWorker API that allows you to create web workers from strings or functions, bundling audiolib.js and its plugins, all ready to use from the worker.\n\n\n## How to get it\n\naudiolib.js is available both in browser and CLI environments.\n\n### Node\n\nTo install via npm:\n\n```\n$ npm install audiolib\n```\n\nPlease note that you'll need [grunt](http://gruntjs.com/) for this to work.\n\n### Browser\n\nFor browser environments, download the latest version [here](https://github.com/jussi-kalliokoski/audiolib.js/downloads), or get the [source code](https://github.com/jussi-kalliokoski/audiolib.js) from GitHub and build it yourself. Don't worry, instructions are included.\n\n## Documentation\n\nDocumentation is available at http://docs.audiolibjs.org/ . Tutorials can be found in the [wiki](https://github.com/jussi-kalliokoski/audiolib.js/wiki)\n\n## Demos\n\n(if you have your own, please fork & add | msg me)\n\n* [JSMad](http://jsmad.org/)\n* [Orbisyn](http://niiden.com/orbisyn/)\n* [jams.no.de](http://jams.no.de)\n* [ofmlabs codecs](http://codecs.ofmlabs.org/)\n\n## Libraries bundled with audiolib.js\n\n* [sink.js](https://github.com/jussi-kalliokoski/sink.js), for output and buffer handling.\n* [PCMData.js](https://github.com/jussi-kalliokoski/pcmdata.js), for WAV codecs. (project deprecated and adopted)\n* [binary.js](https://github.com/jussi-kalliokoski/binary.js), for PCMData.js and general binary data processing. (project deprecated and adopted)\n* [fft.js](https://github.com/jussi-kalliokoski/fft.js), for super fast FT. (project deprecated and adopted)\n\n## Related libraries\n\n* [XAudioJS](https://github.com/grantgalitz/XAudioJS) is an alternative audio sink with built-in resampling and a Flash fallback. More developer-controlled output environment, that might be more sane for example games.\n* [dynamicaudio.js](http://github.com/bfirsh/dynamicaudio.js) is a Flash fallback for Mozilla Audio Data API.\n* [Audiolet](https://github.com/oampo/Audiolet) is a graph-based audio routing framework with a lot of nice stuff.\n* [DSP.js](https://github.com/corbanbrook/dsp.js) is an extensive DSP toolkit originally designed for the Mozilla Audio Data API.\n\n## Plugins\n\nSpecifications for plugin developers can be found in https://github.com/jussi-kalliokoski/audiolib.js/tree/master/specs\n\n## Credits \n\nThis project is maintained by [Jussi Kalliokoski](https://github.com/jussi-kalliokoski), with significant contributions from [David Govea](https://github.com/davidgovea). The project is funded by the awesome [ofmlabs](http://ofmlabs.org) !\n\n## License\n\nLicensed under MIT license.\n\n## Example usage\n\n```javascript\n/* Create an output. */\n\nvar dev = audioLib.Sink(function(sampleBuffer){\n\t// Fill the buffer here.\n}, channelCount, preBufferSize, sampleRate);\n\n/*\n Note that all the arguments are optional,\n so if you want to create a write-only\n device, you can leave the arguments blank.\n Also, it is highly discouraged to set any\n of the arguments if you aren't sure that you\n need them. Use null if you need to skip\n arguments.\n*/\n\n/* Writing buffers: */\ndev.writeBuffer(buffer);\n\n/*\n You can also attach multiple listeners\n to the same Sink instance.\n*/\ndev.on('audioprocess', function(...){});\n\n\n/* Effects */\n\nvar del = audioLib.Delay(sampleRate, delay, feedback);\n\nvar flt = audioLib.IIRFilter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.LP12Filter(sampleRate, cutoffFreq, resonance);\n\nvar flt = audioLib.Reverb(sampleRate, channelCount, wet, dry, roomSize, damping);\n\nvar dist = audioLib.BiquadFilter(sampleRate, b0, b1, b2, a1, a2);\n\n/* to feed a new input sample */\neffect.pushSample(sample);\n/* to get the output */\nsample = effect.getMix();\n\n/* Synthesis */\n\nvar osc = audioLib.Oscillator(sampleRate, frequency);\n\n/* to generate a new sample */\nosc.generate();\n/* to get the output */\nosc.getMix();\n\n/* Sampler */\n\nvar sampler = audioLib.Sampler(sampleRate, sampleBuffer, defaultPitch);\n\n/* Envelopes */\n\nvar adsr = audioLib.ADSREnvelope(sampleRate, attack, decay, sustain, release);\n\n/* to trigger the gate */\nadsr.triggerGate(isOpen);\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nadsr.generate();\n/* Get the value */\nadsr.value; // 0.0 - 1.0, unless you put something more as sustain\n\nvar stepSeq = new audioLib.StepSequencer(sampleRate, stepLength, stepArray, attack);\n\n/* To start the sequence over */\nstepSeq.triggerGate();\n/* to update the value ** Do this on every sample fetch for this to work properly. */\nstepSeq.generate();\n/* Get the value */\nstepSeq.value; // 0.0 - 1.0\n\n/* Recording */\n\nvar rec = dev.record();\n\n/* To stop */\nrec.stop();\n// To export wav\nvar audioElement = new Audio(\n\t'data:audio/wav;base64,' +\n\tbtoa( rec.toWav() ) // presuming btoa is supported\n);\n\n/* Resampling buffers */\naudioLib.Sampler.resample(buffer, fromSampleRate,\n\tfromFrequency, toSampleRate, toFrequency);\n\n/*\n If you are used to buffer based approach (for example DSP.js)\n and don't need to do any raw manipulation, all the effects\n can be used as buffer based too.\n*/\n\nvar bufFx = audioLib.Delay/* or any effect */.createBufferBased(\n\tchannelCount, /* the parameters needed by the specific effect */);\n\nbufFx.append(buffer);\n\n```\n\n### Audio Workers\n\nYou can also use audiolib.js inside Audio Workers (Firefox 6.0+ only), but this is a whole another story. There are many approaches to that, you can include audiolib.js via an external javascript worker file, but audiolib.js offers an alternative approach to this: inline workers. Inline audio workers include the source code already downloaded, and thus creates a new worker that already contains audiolib.js. Inline Audio Workers also allow you to inject code into workers. Here is some code to get started, also see tests/audioworker.html.\n\n```javascript\n\nvar worker = audioLib.AudioWorker(function(){\n\tdevice = audioLib.Sink(function(buffer, channelCount){\n\t\t/* Do some audio processing, like you weren't in a worker. */\n\t});\n}, true /* enables injections */);\n\n/* Injection */\n\nworker.inject(function(){\n\t/* Execute some code inside the worker. */\n});\n\n/* Close the worker */\n\nworker.terminate();\n\n```\n\nIt's important to remember that even though that code looks like it's running in the same environment as the code it's written in, it's actually not and runs in the context of the worker, meaning you can't cross-reference variables. Also, the injections are sandboxed, so if you need to create a global variable, drop var.\n","_id":"audiolib@0.6.4","dist":{"shasum":"08e225d4f1d6a4e892e09539db3f289366a37922","tarball":"http://registry.npmjs.org/audiolib/-/audiolib-0.6.4.tgz"},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]}},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}],"time":{"modified":"2012-07-03T14:12:35.205Z","created":"2011-05-17T19:23:05.773Z","0.3.0":"2011-05-17T19:23:06.527Z","0.4.0":"2011-05-23T10:56:15.575Z","0.4.1":"2011-05-23T11:53:15.290Z","0.5.0":"2011-09-08T17:52:13.691Z","0.5.1":"2011-10-21T12:51:26.638Z","0.6.0":"2011-12-20T18:00:01.341Z","0.6.1":"2012-02-26T17:14:40.303Z","0.6.2":"2012-04-25T11:30:26.035Z","0.6.3":"2012-05-07T11:49:12.915Z","0.6.4":"2012-07-03T14:12:35.205Z"},"author":{"name":"Jussi Kalliokoski"},"repository":{"type":"git","url":"http://github.com/jussi-kalliokoski/audiolib.js.git"},"_attachments":{"audiolib-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-mTEuIcw9VszuQC0NFvbgKA==","length":1206360,"stub":true},"audiolib-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-CBJAiBX8l/47THRzA1bILw==","length":1202871,"stub":true},"audiolib-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-0dH4BPVPQT6MIXLOkUK/kg==","length":1200197,"stub":true},"audiolib-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-9LlwfMwEL9Vhs5tMgZvojQ==","length":1318482,"stub":true},"audiolib-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-SdUyryT21CHYnU0ngMFPow==","length":1301424,"stub":true},"audiolib-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Wk2Mg7XOKm373IEtSSAW2A==","length":1324617,"stub":true},"audiolib-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-xricm65eS9H6y8JjZ6iJoQ==","length":1315434,"stub":true},"audiolib-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-a2OL2LZqsJE1D3KBPKyGhQ==","length":23858,"stub":true},"audiolib-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-uOIItEGNrM0bkQQS17JqdQ==","length":23360,"stub":true},"audiolib-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-r7SgApZj4mhyJShjO+xQpw==","length":21696,"stub":true}}}},
{"id":"audionode","key":"audionode","value":{"rev":"3-e441e4c3f78b6fd5d6bde6470f310a30"},"doc":{"_id":"audionode","_rev":"3-e441e4c3f78b6fd5d6bde6470f310a30","name":"audionode","description":"Mix and distribute audio in node :)","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"audionode","description":"Mix and distribute audio in node :)","version":"0.1.0","homepage":"https://github.com/thejh/audionode","repository":{"type":"git","url":"git://github.com/thejh/audionode.git"},"main":"server.js","engines":{"node":"~0.6.4"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"audionode@0.1.0","scripts":{"start":"node server.js"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"2532554e55003d71b93ea9e4278492134a71beea","tarball":"http://registry.npmjs.org/audionode/-/audionode-0.1.0.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]}},"readme":"This is a 8-bit mono WAV audio streaming server. Supports multiple rooms. Starting the deamon:\n\n    > ./server.js\n\nCreating a room (the room will vanish and all clients will disconnect when you disconnect):\n\n    > (echo 'provide <roomname>'; arecord) | nc <server> 1289\n\nListening to a room:\n\n    > nc <server> 1289 | aplay\n    listen <roomname>\n\nImportant: Room names can't contain spaces!\n\nTo reduce audio lag with aplay and arecord, call them with `-B 1`.\n","maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"time":{"modified":"2011-12-12T20:28:31.333Z","created":"2011-12-12T20:28:29.470Z","0.1.0":"2011-12-12T20:28:31.333Z"},"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"repository":{"type":"git","url":"git://github.com/thejh/audionode.git"},"_attachments":{"audionode-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-A4OHmVgbTEgMQmxzSoWoxA==","length":156113,"stub":true}}}},
{"id":"audiosprite","key":"audiosprite","value":{"rev":"5-02fb99af568d93e2c99af723312fffa1"},"doc":{"_id":"audiosprite","_rev":"5-02fb99af568d93e2c99af723312fffa1","name":"audiosprite","description":"Concat small audio files into single file and export in many formats.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"audiosprite","description":"Concat small audio files into single file and export in many formats.","keywords":["audio","audio-sprite","jukebox","ffmpeg"],"author":{"name":"Tõnis Tiigi","email":"tonistiigi@gmail.com"},"version":"0.0.2","licenses":[{"type":"MIT","url":"https://github.com/github.com/tonistiigi/audiosprite/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/tonistiigi/audiosprite.git"},"main":"./lib/index.js","bin":{"audiosprite":"./lib/audiosprite.js"},"dependencies":{"optimist":"~0.3.1","winston":"~0.5.11","underscore":"~1.3.3","async":"~0.1.18"},"devDependencies":{"coffee-script":">=1.3.1"},"engines":{"node":"~0.6"},"optionalDependencies":{},"_npmUser":{"name":"tonistiigi","email":"tonistiigi@gmail.com"},"_id":"audiosprite@0.0.2","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"1abd92ce9b7fdaf02ce9f9c761f58d84e903b06e","tarball":"http://registry.npmjs.org/audiosprite/-/audiosprite-0.0.2.tgz"},"maintainers":[{"name":"tonistiigi","email":"tonistiigi@gmail.com"}]},"0.0.3":{"name":"audiosprite","description":"Concat small audio files into single file and export in many formats.","keywords":["audio","audio-sprite","jukebox","ffmpeg"],"author":{"name":"Tõnis Tiigi","email":"tonistiigi@gmail.com"},"version":"0.0.3","licenses":[{"type":"MIT","url":"https://github.com/github.com/tonistiigi/audiosprite/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/tonistiigi/audiosprite.git"},"main":"./lib/index.js","bin":{"audiosprite":"./lib/audiosprite.js"},"dependencies":{"optimist":"~0.3.1","winston":"~0.5.11","underscore":"~1.3.3","async":"~0.1.18"},"devDependencies":{"coffee-script":">=1.3.1"},"engines":{"node":">=0.6"},"optionalDependencies":{},"_npmUser":{"name":"tonistiigi","email":"tonistiigi@gmail.com"},"_id":"audiosprite@0.0.3","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"488e270031b52d03ceecfad224b5ca1777adf5b4","tarball":"http://registry.npmjs.org/audiosprite/-/audiosprite-0.0.3.tgz"},"maintainers":[{"name":"tonistiigi","email":"tonistiigi@gmail.com"}]}},"readme":"### What?\n\nThis is a `ffmpeg` wrapper that will take in **multiple audio files** and combine them **into a single file**. Silent gaps will be put between the parts so that every new part starts from full second and there is at least 1 second pause between every part. The final file will be exported in `mp3`, `ogg`, `ac3`, `m4a` and `caf`(IMA-ADPCM) to support as many devices as possible. This tool will also generate a `JSON` file that is compatible with [zynga/jukebox](https://github.com/zynga/jukebox) framework.\n\n### Why?\n\niOS, Windows Phone and some Android phones have very limited HTML5 audio support. They only support playing single file at a time and loading in new files requires user interaction and has a big latency. To overcome this there is a technique to combine all audio into single file and only play/loop certain parts of that file. [zynga/jukebox](https://github.com/zynga/jukebox) is a audio framework that uses this technique.  [digitalfruit/limejs](https://github.com/digitalfruit/limejs) is a HTML5 game framework that includes Jukebox and lets you add audio to your games using audio sprites.\n\n###Installation\n\n```\nnpm install -g audiosprite\n```\n\n###Usage\n\n```\n> audiosprite --help\ninfo: Usage: audiosprite [options] file1.mp3 file2.mp3 *.wav\ninfo: Options:\n  --output, -o    Name for the output file.                             [default: \"output\"]\n  --log, -l       Log level (debug, info, notice, warning, error).      [default: \"info\"]\n  --autoplay, -a  Autoplay sprite name                                  [default: null]\n  --silence, -s   Add special \"silence\" track with specified duration.  [default: 0]\n  --help, -h      Show this help message.\n\n\n> audiosprite --autoplay bg_loop --output mygameaudio bg_loop.wav *.mp3 \ninfo: File added OK file=bg_loop.wav\ninfo: 1.25s silence gap added OK\ninfo: File added OK file=click.mp3\ninfo: 1.70s silence gap added OK\ninfo: Exported caf OK file=mygameaudio.caf\ninfo: Exported ac3 OK file=mygameaudio.ac3\ninfo: Exported mp3 OK file=mygameaudio.mp3\ninfo: Exported m4a OK file=mygameaudio.m4a\ninfo: Exported ogg OK file=mygameaudio.ogg\ninfo: Exported json OK file=mygameaudio.json\ninfo: All done\n\n\n> cat mygameaudio.json\n{\n  \"resources\": [\n    \"mygameaudio.caf\",\n    \"mygameaudio.ac3\",\n    \"mygameaudio.mp3\",\n    \"mygameaudio.m4a\",\n    \"mygameaudio.ogg\"\n  ],\n  \"spritemap\": {\n    \"bg_loop\": {\n      \"start\": 0,\n      \"end\": 3.75,\n      \"loop\": true\n    },\n    \"click\": {\n      \"start\": 5,\n      \"end\": 5.3,\n      \"loop\": false\n    }\n  },\n  \"autoplay\": \"bg_loop\"\n}\n```\n\n####Setting autoplay track\n\nYou can use `--autoplay` option to set a track that will start playing automatically. This track is then marked as autoplay and looping in the JSON. This syntax is Jukebox framework specific.\n\n####Custom silent track\n\nOn some cases starting and pausing a file has bigger latency than just setting playhead position. You may get better results if your file is always playing. `--silence <duration>` option will generate extra track named *silence* that you can play instead of pausing the file.\n\n####Usage with [zynga/jukebox](https://github.com/zynga/jukebox) framework.\n\nGenerated JSON file can be passed straight into `jukebox.Player` constructor. Check out Jukebox documentation/demos for more info.\n\n```javascript\nvar settings = {/* JSON generated by audiosprite*/};\n...\n// This part needs to be in user event callback.\nvar myPlayer = new jukebox.Player(settings);\n...\nmyPlayer.play('click');\n```\n\n####Usage with [digitalfruit/limejs](https://github.com/digitalfruit/limejs) framework.\n\nFirst generate LimeJS asset from the JSON file that you can require inside your code.\n\n```\n> bin/lime.py gensoy path/to/mygameaudio.json\n```\n\nThen use `AudioMap` class to play the file.\n\n```javascript\ngoog.require('lime.audio.AudioMap');\ngoog.require('lime.ASSETS.mygameaudio.json');\n\nvar audio = new lime.audio.AudioMap(lime.ASSETS.mygameaudio.json);\n...\naudio.play('click');\n```\n\n","maintainers":[{"name":"tonistiigi","email":"tonistiigi@gmail.com"}],"time":{"modified":"2012-07-11T10:17:47.213Z","created":"2012-04-19T15:23:18.726Z","0.0.2":"2012-04-19T15:23:20.474Z","0.0.3":"2012-07-11T10:17:47.213Z"},"author":{"name":"Tõnis Tiigi","email":"tonistiigi@gmail.com"},"repository":{"type":"git","url":"git://github.com/tonistiigi/audiosprite.git"},"_attachments":{"audiosprite-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7GNdrZooOLGhJf0JitYoZQ==","length":6616,"stub":true},"audiosprite-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DK8jgTNuygwG3OJpTWi2EQ==","length":6716,"stub":true}}}},
{"id":"audit","key":"audit","value":{"rev":"12-efdab0b1f26fcbd76cd4fe0db323ea5c"},"doc":{"_id":"audit","_rev":"12-efdab0b1f26fcbd76cd4fe0db323ea5c","name":"audit","description":"Generate performance statistics for async or sync functions","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"audit","version":"0.0.1","description":"Generate performance statistics for async or sync functions","keywords":["bench","audit","performance"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Audit.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"main":"lib/audit.js","engines":{"node":">= 0.5.0"},"readme":"","_id":"audit@0.0.1","dist":{"shasum":"d1c192dd0adeb8faa52991a25a21a9be60d130e2","tarball":"http://registry.npmjs.org/audit/-/audit-0.0.1.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.0.2":{"name":"audit","version":"0.0.2","description":"Generate performance statistics for async or sync functions","keywords":["bench","audit","performance"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Audit.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"dependencies":{"vows":"0.6.3","should":"1.0.0"},"main":"lib/audit.js","scripts":"make test","engines":{"node":">= 0.5.0"},"readme":"\n# Audit\n\n`npm install audit`\n\n`npm test audit`\n\nAudit is a benchmarking tool for asynchronous or synchronous functions. It generates the following statistics:\n\n* elapsed time\n* iterations\n* operations per second\n* mean\n* median\n* mode\n* max\n* min\n\n\n## Basic usage\n\n```js\nvar audit = require('audit')({\n    iterations:100\n})\n\naudit.on('complete', function(stats) {\n    console.log(stats)\n})\n\naudit.on('auditing', function(name) {\n    console.log('Auditing', name, '...')\n})\n\naudit.on('auditcomplete', function(stats) {\n    console.log('Completed', stats.name)\n})\n\naudit.async(function(next) {\n    return next()\n})\n\naudit.sync(function() {\n    return 1\n})\n\naudit.run()\n```\n\n## Stats\n\nThe stats object contains the following properties:\n\n* `name`\n* `elapsed`\n* `iterations`\n* `opsPerSecond`\n* `mode`\n* `median`\n* `mean`\n* `max`\n* `min`\n\nSample output:\n\n```\nBenching musicmetadata...\nmusicmetadata 23.12673450508788\nBenching child-ffmpeg...\nchild-ffmpeg 7.58150113722517\n{\n    \"musicmetadata\": {\n        \"name\": \"musicmetadata\",\n        \"elapsed\": \"4324ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 23.12673450508788,\n        \"mode\": [ \"19ms\", \"1occ\" ],\n        \"median\": \"45ms\",\n        \"mean\": \"43.676767676767675ms\",\n        \"max\": [ \"61ms\", \"7ind\" ],\n        \"min\": [ \"19ms\", \"0ind\" ]\n},\n    \"child-ffmpeg\": {\n        \"name\": \"child-ffmpeg\",\n        \"elapsed\": \"13190ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 7.58150113722517,\n        \"mode\": [ \"128ms\", \"1occ\" ],\n        \"median\": \"131ms\",\n        \"mean\": \"133.23232323232324ms\",\n        \"max\": [ \"221ms\", \"0ind\" ],\n        \"min\": [ \"128ms\", \"19ind\" ]\n    }\n}\n\n```\n\n## Options\n\nPass options to the audit constructor function in an object. Options and their default values follow.\n\n* `iterations` **Number** *1000*\n\nNumber of times to execute the provided functions\n\n* `pause` **Number** *100*\n\nNumber of milliseconds to pause between audits.\n","_id":"audit@0.0.2","dist":{"shasum":"31dc6b91878caccb22d11ad78d7e6d02a4b757d9","tarball":"http://registry.npmjs.org/audit/-/audit-0.0.2.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.0.3":{"name":"audit","version":"0.0.3","description":"Generate performance statistics for async or sync functions","keywords":["bench","audit","performance"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Audit.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"dependencies":{"vows":"0.6.3","should":"1.0.0"},"main":"lib/audit.js","scripts":"make test","engines":{"node":">= 0.5.0"},"readme":"\n# Audit\n\n`npm install audit`\n\n`npm test audit`\n\nAudit is a benchmarking tool for asynchronous or synchronous functions. It generates the following statistics:\n\n* elapsed time\n* iterations\n* operations per second\n* mean\n* median\n* mode\n* max\n* min\n\n\n## Basic usage\n\n```js\nvar audit = require('audit')({\n    iterations:100\n})\n\naudit.on('complete', function(stats) {\n    console.log(stats)\n})\n\naudit.on('auditing', function(name) {\n    console.log('Auditing', name, '...')\n})\n\naudit.on('auditcomplete', function(stats) {\n    console.log('Completed', stats.name)\n})\n\naudit.async(function(next) {\n    return next()\n})\n\naudit.sync(function() {\n    return 1\n})\n\naudit.run()\n```\n\n## Stats\n\nThe stats object contains the following properties:\n\n* `name`\n* `elapsed`\n* `iterations`\n* `opsPerSecond`\n* `mode`\n* `median`\n* `mean`\n* `max`\n* `min`\n\nSample output:\n\n```\nBenching musicmetadata...\nmusicmetadata 23.12673450508788\nBenching child-ffmpeg...\nchild-ffmpeg 7.58150113722517\n{\n    \"musicmetadata\": {\n        \"name\": \"musicmetadata\",\n        \"elapsed\": \"4324ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 23.12673450508788,\n        \"mode\": [ \"19ms\", \"1occ\" ],\n        \"median\": \"45ms\",\n        \"mean\": \"43.676767676767675ms\",\n        \"max\": [ \"61ms\", \"7ind\" ],\n        \"min\": [ \"19ms\", \"0ind\" ]\n},\n    \"child-ffmpeg\": {\n        \"name\": \"child-ffmpeg\",\n        \"elapsed\": \"13190ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 7.58150113722517,\n        \"mode\": [ \"128ms\", \"1occ\" ],\n        \"median\": \"131ms\",\n        \"mean\": \"133.23232323232324ms\",\n        \"max\": [ \"221ms\", \"0ind\" ],\n        \"min\": [ \"128ms\", \"19ind\" ]\n    }\n}\n\n```\n\n## Options\n\nPass options to the audit constructor function in an object. Options and their default values follow.\n\n* `iterations` **Number** *1000*\n\nNumber of times to execute the provided functions\n\n* `pause` **Number** *100*\n\nNumber of milliseconds to pause between audits.\n","_id":"audit@0.0.3","dist":{"shasum":"e8252ebc93f2660f41628ea22ca7970bef8c2335","tarball":"http://registry.npmjs.org/audit/-/audit-0.0.3.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.0.4":{"name":"audit","version":"0.0.4","description":"Generate performance statistics for async or sync functions","keywords":["bench","audit","performance"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Audit.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"dependencies":{"vows":"0.6.3","should":"1.0.0"},"main":"lib/audit.js","scripts":{"test":"make test"},"engines":{"node":">= 0.5.0"},"readme":"\n# Audit\n\n`npm install audit`\n\n`npm test audit`\n\nAudit is a benchmarking tool for asynchronous or synchronous functions. It generates the following statistics:\n\n* elapsed time\n* iterations\n* operations per second\n* mean\n* median\n* mode\n* max\n* min\n\n\n## Basic usage\n\n```js\nvar audit = require('audit')({\n    iterations:100\n})\n\naudit.on('complete', function(stats) {\n    console.log(stats)\n})\n\naudit.on('auditing', function(name) {\n    console.log('Auditing', name, '...')\n})\n\naudit.on('auditcomplete', function(stats) {\n    console.log('Completed', stats.name)\n})\n\naudit.async(function(next) {\n    return next()\n})\n\naudit.sync(function() {\n    return 1\n})\n\naudit.run()\n```\n\n## Stats\n\nThe stats object contains the following properties:\n\n* `name`\n* `elapsed`\n* `iterations`\n* `opsPerSecond`\n* `mode`\n* `median`\n* `mean`\n* `max`\n* `min`\n\nSample output:\n\n```\nBenching musicmetadata...\nmusicmetadata 23.12673450508788\nBenching child-ffmpeg...\nchild-ffmpeg 7.58150113722517\n{\n    \"musicmetadata\": {\n        \"name\": \"musicmetadata\",\n        \"elapsed\": \"4324ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 23.12673450508788,\n        \"mode\": [ \"19ms\", \"1occ\" ],\n        \"median\": \"45ms\",\n        \"mean\": \"43.676767676767675ms\",\n        \"max\": [ \"61ms\", \"7ind\" ],\n        \"min\": [ \"19ms\", \"0ind\" ]\n},\n    \"child-ffmpeg\": {\n        \"name\": \"child-ffmpeg\",\n        \"elapsed\": \"13190ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 7.58150113722517,\n        \"mode\": [ \"128ms\", \"1occ\" ],\n        \"median\": \"131ms\",\n        \"mean\": \"133.23232323232324ms\",\n        \"max\": [ \"221ms\", \"0ind\" ],\n        \"min\": [ \"128ms\", \"19ind\" ]\n    }\n}\n\n```\n\n## Options\n\nPass options to the audit constructor function in an object. Options and their default values follow.\n\n* `iterations` **Number** *1000*\n\nNumber of times to execute the provided functions\n\n* `pause` **Number** *100*\n\nNumber of milliseconds to pause between audits.\n","_id":"audit@0.0.4","dist":{"shasum":"eb777068c9eaee39b4e7e9036496d0f9160e92a9","tarball":"http://registry.npmjs.org/audit/-/audit-0.0.4.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]},"0.0.6":{"name":"audit","version":"0.0.6","description":"Generate performance statistics for async or sync functions","keywords":["bench","audit","performance"],"repository":{"type":"git","url":"git://github.com/Weltschmerz/Audit.git"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"devDependencies":{"vows":"0.6.3","should":"1.0.0"},"main":"lib/audit.js","scripts":{"test":"make test"},"engines":{"node":">= 0.5.0"},"readme":"\n# Audit\n\n`npm install audit`\n\nAudit is a benchmarking tool for asynchronous or synchronous functions. It generates the following statistics:\n\n* elapsed time\n* iterations\n* operations per second\n* mean\n* median\n* mode\n* max\n* min\n\n\n## Basic usage\n\n```js\nvar Audit = require('audit')\nvar audit = new Audit({\n    iterations:100\n})\n\naudit.on('complete', function(stats) {\n    console.log(stats)\n})\n\naudit.on('auditing', function(name) {\n    console.log('Auditing', name, '...')\n})\n\naudit.on('auditcomplete', function(stats) {\n    console.log('Completed', stats.name)\n})\n\naudit.async(function(next) {\n    return next()\n})\n\naudit.sync(function() {\n    return 1\n})\n\naudit.run()\n```\n\n## Chaining\n\n```js\nvar Audit = require('audit')\nvar audit = new Audit()\n\naudit.on('complete', console.log)\n\naudit\n.async('mytestname', function(next) {\n    return next()\n})\n.async('mytestname2', function(next) {\n    return next()\n})\n.async('mytestname3', function(next) {\n    return next()\n})\n.run()\n\n```\n\n## Stats\n\nThe stats object contains the following properties:\n\n* `name`\n* `elapsed`\n* `iterations`\n* `opsPerSecond`\n* `mode`\n* `median`\n* `mean`\n* `max`\n* `min`\n\nSample output:\n\n```\nBenching musicmetadata...\nmusicmetadata 23.12673450508788\nBenching child-ffmpeg...\nchild-ffmpeg 7.58150113722517\n{\n    \"musicmetadata\": {\n        \"name\": \"musicmetadata\",\n        \"elapsed\": \"4324ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 23.12673450508788,\n        \"mode\": [ \"19ms\", \"1occ\" ],\n        \"median\": \"45ms\",\n        \"mean\": \"43.676767676767675ms\",\n        \"max\": [ \"61ms\", \"7ind\" ],\n        \"min\": [ \"19ms\", \"0ind\" ]\n},\n    \"child-ffmpeg\": {\n        \"name\": \"child-ffmpeg\",\n        \"elapsed\": \"13190ms\",\n        \"iterations\": 100,\n        \"opsPerSecond\": 7.58150113722517,\n        \"mode\": [ \"128ms\", \"1occ\" ],\n        \"median\": \"131ms\",\n        \"mean\": \"133.23232323232324ms\",\n        \"max\": [ \"221ms\", \"0ind\" ],\n        \"min\": [ \"128ms\", \"19ind\" ]\n    }\n}\n\n```\n\n## Options\n\nPass options to the audit constructor function in an object. Options and their default values follow.\n\n* `iterations` **Number** *1000*\n\nNumber of times to execute the provided functions\n\n* `pause` **Number** *100*\n\nNumber of milliseconds to pause between audits.\n","_id":"audit@0.0.6","dist":{"shasum":"fef17dd84af1dcd2a5633fd46d3b1adcb084bf3b","tarball":"http://registry.npmjs.org/audit/-/audit-0.0.6.tgz"},"maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}]}},"readme":"","maintainers":[{"name":"Weltschmerz","email":"chlavois@gmail.com"}],"time":{"modified":"2012-08-02T13:44:36.811Z","created":"2012-07-19T00:29:14.198Z","0.0.1":"2012-07-19T00:29:14.493Z","0.0.2":"2012-07-21T19:50:25.699Z","0.0.3":"2012-07-21T19:54:50.648Z","0.0.4":"2012-07-21T19:56:50.640Z","0.0.6":"2012-07-23T18:56:21.840Z"},"author":{"name":"Weltschmerz","email":"chlavois@gmail.com"},"repository":{"type":"git","url":"git://github.com/Weltschmerz/Audit.git"},"users":{"fgribreau":true},"_attachments":{"audit-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-mJGlpL1cb/nkTie7iThYtQ==","length":4185,"stub":true},"audit-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Cyen7USp8dJaIvqrOUz/Qw==","length":4146,"stub":true},"audit-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vYxe1GsO/o5hJA4t2kHeFA==","length":4143,"stub":true},"audit-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-laXPMdo/0+b3/ifeoc+2uQ==","length":4145,"stub":true},"audit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mKiZsPKCETIuYoHD1sLQ3A==","length":1424,"stub":true}}}},
{"id":"audit_couchdb","key":"audit_couchdb","value":{"rev":"42-6085cb18ef283f88bf2a9cc0569f1e18"},"doc":{"_id":"audit_couchdb","_rev":"42-6085cb18ef283f88bf2a9cc0569f1e18","name":"audit_couchdb","description":"Detect security issues in an Apache CouchDB server","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"audit_couchdb","version":"0.1.0","author":{"name":"Jason Smith","email":"jhs@couchone.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb"},"engines":["node"],"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_id":"audit_couchdb@0.1.0","_engineSupported":true,"_npmVersion":"0.2.13-3","_nodeVersion":"v0.2.4","dist":{"shasum":"c69cf2140d8f2362dbf6d7c77a76ef636c8e4ea8","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"audit_couchdb","version":"0.1.1","author":{"name":"Jason Smith","email":"jhs@couchone.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb"},"engines":["node"],"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_id":"audit_couchdb@0.1.1","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.2.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4cfba5d8f17e3877f241029f02ea022201d57988","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.1.tgz"}},"0.1.3":{"name":"audit_couchdb","version":"0.1.3","author":{"name":"Jason Smith","email":"jhs@couchone.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb"},"engines":["node"],"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_id":"audit_couchdb@0.1.3","_engineSupported":true,"_npmVersion":"0.2.13-3","_nodeVersion":"v0.2.4","dist":{"shasum":"59550d9299922f9c6a0adc975ccded8390980243","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.3.tgz"},"directories":{}},"0.1.4":{"name":"audit_couchdb","version":"0.1.4","author":{"name":"Jason Smith","email":"jhs@couchone.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":">=0.1.6","probe_couchdb":">=0.1.0"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"devDependencies":{},"_id":"audit_couchdb@0.1.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"f17350a7c26d81956a848ecd781bf65ee3297bea","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.4.tgz"},"scripts":{},"directories":{}},"0.1.5":{"name":"audit_couchdb","version":"0.1.5","author":{"name":"Jason Smith","email":"jhs@couchone.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":">=0.1.6","probe_couchdb":">=0.1.2"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"devDependencies":{},"_id":"audit_couchdb@0.1.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"8bb5a653f21d1813e32e94efc092c9b31ecf3d05","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.5.tgz"},"scripts":{},"directories":{}},"0.1.6":{"name":"audit_couchdb","version":"0.1.6","author":{"name":"Jason Smith","email":"jhs@couchone.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":">=0.1.6","probe_couchdb":">=0.1.3"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"devDependencies":{},"_id":"audit_couchdb@0.1.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"45ce01568614c561cddaf8e90bbf4d70db0ea387","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.6.tgz"},"scripts":{},"maintainers":[{"name":"jhs","email":"jhs@couchone.com"}],"directories":{}},"0.1.7":{"name":"audit_couchdb","version":"0.1.7","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Detect security issues in an Apache CouchDB server","homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":"0.2.6","defaultable":"0.5.0","probe_couchdb":"0.2.1"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"audit_couchdb@0.1.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b608ce3467c843fe4812f35dd1504f0de2b48bd6","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.1.7.tgz"},"maintainers":[{"name":"jhs","email":"jhs@couchone.com"}]},"0.2.0":{"name":"audit_couchdb","version":"0.2.0","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Detect security issues in an Apache CouchDB server","tags":["automation","couchdb","security","audit"],"homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":"0.2.6","defaultable":"0.5.0","probe_couchdb":"0.3.1"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"audit_couchdb@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"49aa1b3620f135c9630227326f84efa4aaed03fa","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.2.0.tgz"},"maintainers":[{"name":"jhs","email":"jhs@couchone.com"}]},"0.3.0":{"name":"audit_couchdb","version":"0.3.0","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Detect security issues in an Apache CouchDB server","tags":["automation","couchdb","security","audit"],"homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":"0.2.6","defaultable":"0.5.0","probe_couchdb":"0.7.0"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"audit_couchdb@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"cc60d9ba794dafb46991d7f6f176c26efb53c9f7","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.3.0.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"},{"name":"jhs","email":"jhs@couchone.com"}]},"0.3.1":{"name":"audit_couchdb","version":"0.3.1","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Detect security issues in an Apache CouchDB server","tags":["automation","couchdb","security","audit"],"homepage":"http://github.com/jhs/audit_couchdb","repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"engines":["node"],"dependencies":{"optimist":"0.2.6","defaultable":"0.5.0","probe_couchdb":"0.7.1"},"main":"audit_couchdb","bin":{"audit_couchdb":"./cli.js"},"_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"audit_couchdb@0.3.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e13f76102c220be1fa4268fce93a544d7efeb912","tarball":"http://registry.npmjs.org/audit_couchdb/-/audit_couchdb-0.3.1.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"},{"name":"jhs","email":"jhs@couchone.com"}]}},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"},{"name":"jhs","email":"jhs@couchone.com"}],"time":{"modified":"2011-11-06T01:55:33.695Z","created":"2011-02-21T08:46:44.224Z","0.1.0":"2011-02-21T08:46:45.161Z","0.1.1":"2011-02-21T10:18:25.645Z","0.1.3":"2011-02-21T20:49:43.135Z","0.1.5":"2011-05-07T01:28:56.260Z","0.1.4":"2011-05-08T17:33:27.393Z","0.1.6":"2011-08-16T00:28:12.446Z","0.1.7":"2011-10-11T22:26:36.337Z","0.2.0":"2011-10-23T12:39:22.182Z","0.3.0":"2011-11-05T13:31:33.756Z","0.3.1":"2011-11-06T01:55:33.695Z"},"author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"repository":{"type":"git","url":"git://github.com/jhs/audit_couchdb.git"},"_attachments":{"audit_couchdb-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-2PM3y67y62GNIvsc+4OmXg==","length":20480,"stub":true},"audit_couchdb-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-9AK8outSX1QuPwmKp7Bnig==","length":10252,"stub":true},"audit_couchdb-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-+/MzVuh8RnM0PQ6C0THj9A==","length":10243,"stub":true},"audit_couchdb-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-hZGlhBzPPELJuLLIFiJqSQ==","length":10240,"stub":true},"audit_couchdb-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-ApG9IjNuceBuHbgZ5eVTtQ==","length":5251,"stub":true},"audit_couchdb-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-pvOolpb/6/dnuIKGTJI21A==","length":5240,"stub":true},"audit_couchdb-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-2BwasaglDTzdkQdm84SE5g==","length":5240,"stub":true},"audit_couchdb-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-3mx7NygqA7oLJ7FBwi8L4A==","length":7887,"stub":true},"audit_couchdb-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lfPraHycigTSLTUTuvL98w==","length":5223,"stub":true},"audit_couchdb-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/MB0wn3LG5Dxm8uZZke0Rw==","length":3632,"stub":true}}}},
{"id":"auditor","key":"auditor","value":{"rev":"11-c4df509d40650c015943dd90315a12c0"},"doc":{"_id":"auditor","_rev":"11-c4df509d40650c015943dd90315a12c0","name":"auditor","description":"","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"auditor","keywords":["auditor","validator"],"description":"","homepage":"http://github.com/mah0x211/node-auditor","version":"0.1.0","licenses":[{"type":"MIT"}],"main":"./lib/auditor","directories":{"lib":"./lib"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"http://github.com/mah0x211/node-auditor.git"},"bugs":{"url":"http://github.com/mah0x211/node-auditor/issues"},"_id":"auditor@0.1.0","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"adebfcc0ded82871007749f68a662be6cd8d70e1","tarball":"http://registry.npmjs.org/auditor/-/auditor-0.1.0.tgz"}},"0.1.1":{"name":"auditor","keywords":["auditor","validator"],"description":"","homepage":"http://github.com/mah0x211/node-auditor","version":"0.1.1","licenses":[{"type":"MIT"}],"main":"./lib/auditor","directories":{"lib":"./lib"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"git://github.com/mah0x211/node-auditor.git"},"bugs":{"url":"http://github.com/mah0x211/node-auditor/issues"},"dependencies":{},"devDependencies":{},"_id":"auditor@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"f691e3a279cb0e03531b240ebd6ae344b9066836","tarball":"http://registry.npmjs.org/auditor/-/auditor-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"auditor","keywords":["auditor","validator"],"description":"","homepage":"http://github.com/mah0x211/node-auditor","version":"0.1.2","licenses":[{"type":"MIT"}],"main":"./lib/auditor","directories":{"lib":"./lib"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"git://github.com/mah0x211/node-auditor.git"},"bugs":{"url":"http://github.com/mah0x211/node-auditor/issues"},"dependencies":{},"devDependencies":{},"_id":"auditor@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c913ce7e6dc5309caaefb9315358f88955e3566a","tarball":"http://registry.npmjs.org/auditor/-/auditor-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"auditor","keywords":["auditor","validator"],"description":"","homepage":"http://github.com/mah0x211/node-auditor","version":"0.1.3","licenses":[{"type":"MIT"}],"main":"./lib/auditor","directories":{"lib":"./lib"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"git://github.com/mah0x211/node-auditor.git"},"bugs":{"url":"http://github.com/mah0x211/node-auditor/issues"},"dependencies":{},"devDependencies":{},"_id":"auditor@0.1.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"39c86449122201ed946ca715fafa15b2a6d309df","tarball":"http://registry.npmjs.org/auditor/-/auditor-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"auditor","keywords":["auditor","validator"],"description":"","homepage":"http://github.com/mah0x211/node-auditor","version":"0.1.4","licenses":[{"type":"MIT"}],"main":"./lib/auditor","directories":{"lib":"./lib"},"engines":{"node":">= 0.3.7"},"maintainers":[{"name":"Masatoshi Teruya","email":"mah0x211@gmail","url":"http://kontext.jp/"}],"repository":{"type":"git","url":"git://github.com/mah0x211/node-auditor.git"},"bugs":{"url":"http://github.com/mah0x211/node-auditor/issues"},"dependencies":{},"devDependencies":{},"_id":"auditor@0.1.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c1f63d7b8f4830b29c1cc52467c677c9eba3310a","tarball":"http://registry.npmjs.org/auditor/-/auditor-0.1.4.tgz"},"scripts":{}}},"maintainers":[{"name":"mah0x211","email":"mah0x211@gmail.com"}],"time":{"modified":"2011-07-14T11:31:22.898Z","created":"2011-05-09T16:16:54.386Z","0.1.0":"2011-05-09T16:16:55.112Z","0.1.1":"2011-05-23T13:59:32.054Z","0.1.2":"2011-05-23T14:17:01.515Z","0.1.3":"2011-05-26T08:27:52.788Z","0.1.4":"2011-07-14T11:31:22.898Z"},"repository":{"type":"git","url":"git://github.com/mah0x211/node-auditor.git"},"_attachments":{"auditor-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hacaJKCtxJVVHmlotwo96Q==","length":4647,"stub":true},"auditor-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-z7LV/g8CGf5HPfhGinDYTQ==","length":4560,"stub":true},"auditor-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-rxIuIKCy049dFDLibEN0Og==","length":4548,"stub":true},"auditor-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1MyRjY4gmjSFqZIl0TfgEA==","length":7390,"stub":true},"auditor-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gSAY7a//9fMJjYFpqyJQ2g==","length":4727,"stub":true}}}},
{"id":"aug","key":"aug","value":{"rev":"11-12ac56eb16b6e9b4342b3ae8fc488d0b"},"doc":{"_id":"aug","_rev":"11-12ac56eb16b6e9b4342b3ae8fc488d0b","name":"aug","description":"a library to augment objects and prototypes","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"aug","description":"a library to augment objects and prototypes","version":"0.0.1","homepage":"https://github.com/jgallen23/aug","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"git://github.com/jgallen23/aug.git"},"dependencies":{},"devDependencies":{"nodeunit":"*"},"main":"./dist/aug.js","keywords":["ender","extend","objects","prototype"],"_npmUser":{"name":"jga","email":"me@jga.me"},"_id":"aug@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fb9a545ca74c2a0f6329ccd61e11e1223fdf6227","tarball":"http://registry.npmjs.org/aug/-/aug-0.0.1.tgz"},"maintainers":[{"name":"jga","email":"me@jga.me"}]},"0.0.2":{"name":"aug","description":"a library to augment objects and prototypes","version":"0.0.2","homepage":"https://github.com/jgallen23/aug","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"git://github.com/jgallen23/aug.git"},"dependencies":{},"devDependencies":{"nodeunit":"*"},"main":"./dist/aug.js","keywords":["ender","extend","objects","prototype"],"_npmUser":{"name":"jga","email":"me@jga.me"},"_id":"aug@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ccff68e1427e73beb52153f5e3d17e669129d89a","tarball":"http://registry.npmjs.org/aug/-/aug-0.0.2.tgz"},"maintainers":[{"name":"jga","email":"me@jga.me"}]},"0.0.3":{"name":"aug","description":"a library to augment objects and prototypes","version":"0.0.3","homepage":"https://github.com/jgallen23/aug","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"git://github.com/jgallen23/aug.git"},"dependencies":{},"devDependencies":{"chai":"*","markx":"*","mocha":"*","smoosh":"*"},"main":"./lib/aug.js","keywords":["ender","extend","objects","prototype"],"_npmUser":{"name":"jga","email":"me@jga.me"},"_id":"aug@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e62ea653efbc7fe23752a00ae6e5b7c3a64afb20","tarball":"http://registry.npmjs.org/aug/-/aug-0.0.3.tgz"},"readme":"# aug.js\nAug.js is simple augment/extend library.  If you've used jQuery's $.extend, then you will be familiar with it.\n\n## Installation\n\ndownload [aug.js](https://github.com/jgallen23/aug/raw/master/dist/aug.js) from dist directory. \n\nor if you are using node\n\n\tnpm install aug\n\n## Usage\n\n\t//Great for overriding defaults\n\tvar a = { a: 1 };\n\tvar b = { a: 2, b: 3 };\n\taug(a, b); //a = { a: 2, b: 3};\n\n\t//Combining two objects\n\tvar a = { a: 1 };\n\tvar b = { b: 3 };\n\tvar c = aug({}, a, b); \n\t//c = { a: 1, b: 3};\n\n\t//Extending a function\n\tvar f = function() {};\n\taug(f, {\n\t\tprop: 42\n\t});\n\t//f.prop == 42\n\n\t//Extending a prototype\n\tvar Class1 = function() { };\n\tClass1.prototype.test = function() {\n\t\treturn 0;\n\t};\n\n\taug(Class1.prototype, {\n\t\ttest2: function() {\n\t\t\treturn 5;\n\t\t}\n\t});\n\tvar c = new Class();\n\tc.test(); //returns 0;\n\tc.test2(); //returns 5\n\n\n","maintainers":[{"name":"jga","email":"me@jga.me"}]},"0.0.4":{"name":"aug","description":"a library to augment objects and prototypes","version":"0.0.4","homepage":"https://github.com/jgallen23/aug","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"git://github.com/jgallen23/aug.git"},"dependencies":{},"devDependencies":{"chai":"*","markx":"*","mocha":"*","smoosh":"*"},"main":"./lib/aug.js","keywords":["ender","extend","objects","prototype"],"_npmUser":{"name":"jga","email":"me@jga.me"},"_id":"aug@0.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f1d6601076ef8693a47615b1677699077e271751","tarball":"http://registry.npmjs.org/aug/-/aug-0.0.4.tgz"},"readme":"# aug.js\nAug.js is simple augment/extend library.  If you've used jQuery's $.extend, then you will be familiar with it.\n\n## Installation\n\ndownload [aug.js](https://github.com/jgallen23/aug/raw/master/dist/aug.js) from dist directory. \n\nor if you are using node\n\n\tnpm install aug\n\n## Usage\n\n\t//Great for overriding defaults\n\tvar a = { a: 1 };\n\tvar b = { a: 2, b: 3 };\n\taug(a, b); //a = { a: 2, b: 3};\n\n\t//Combining two objects\n\tvar a = { a: 1 };\n\tvar b = { b: 3 };\n\tvar c = aug({}, a, b); \n\t//c = { a: 1, b: 3};\n\n\t//Extending a function\n\tvar f = function() {};\n\taug(f, {\n\t\tprop: 42\n\t});\n\t//f.prop == 42\n\n\t//Extending a prototype\n\tvar Class1 = function() { };\n\tClass1.prototype.test = function() {\n\t\treturn 0;\n\t};\n\n\taug(Class1.prototype, {\n\t\ttest2: function() {\n\t\t\treturn 5;\n\t\t}\n\t});\n\tvar c = new Class();\n\tc.test(); //returns 0;\n\tc.test2(); //returns 5\n\n\n","maintainers":[{"name":"jga","email":"me@jga.me"}]},"0.0.5":{"name":"aug","description":"a library to augment objects and prototypes","version":"0.0.5","homepage":"https://github.com/jgallen23/aug","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"git://github.com/jgallen23/aug.git"},"dependencies":{},"devDependencies":{"chai":"*","markx":"*","mocha":"*","smoosh":"*"},"main":"./lib/aug.js","keywords":["ender","extend","objects","prototype"],"_npmUser":{"name":"jga","email":"me@jga.me"},"_id":"aug@0.0.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2ef93aa1b64830c7b9b6f008bbe3e97b11ca62d5","tarball":"http://registry.npmjs.org/aug/-/aug-0.0.5.tgz"},"readme":"# aug.js\nAug.js is simple augment/extend library.  If you've used jQuery's $.extend, then you will be familiar with it.\n\n## Installation\n\ndownload [aug.js](https://github.com/jgallen23/aug/raw/master/dist/aug.js) from dist directory. \n\nor if you are using node\n\n\tnpm install aug\n\n## Usage\n\n\t//Great for overriding defaults\n\tvar a = { a: 1 };\n\tvar b = { a: 2, b: 3 };\n\taug(a, b); //a = { a: 2, b: 3};\n\n\t//Combining two objects\n\tvar a = { a: 1 };\n\tvar b = { b: 3 };\n\tvar c = aug({}, a, b); \n\t//c = { a: 1, b: 3};\n\n\t//Extending a function\n\tvar f = function() {};\n\taug(f, {\n\t\tprop: 42\n\t});\n\t//f.prop == 42\n\n\t//Extending a prototype\n\tvar Class1 = function() { };\n\tClass1.prototype.test = function() {\n\t\treturn 0;\n\t};\n\n\taug(Class1.prototype, {\n\t\ttest2: function() {\n\t\t\treturn 5;\n\t\t}\n\t});\n\tvar c = new Class();\n\tc.test(); //returns 0;\n\tc.test2(); //returns 5\n\n\n","maintainers":[{"name":"jga","email":"me@jga.me"}]}},"maintainers":[{"name":"jga","email":"me@jga.me"}],"time":{"modified":"2012-03-22T22:23:30.314Z","created":"2011-10-25T21:41:22.669Z","0.0.1":"2011-10-25T21:41:23.949Z","0.0.2":"2011-11-11T23:56:31.687Z","0.0.3":"2012-03-05T00:08:23.274Z","0.0.4":"2012-03-12T04:37:57.164Z","0.0.5":"2012-03-22T22:23:30.314Z"},"author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"git://github.com/jgallen23/aug.git"},"_attachments":{"aug-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-BlT20JymdhYlhcaEDbY+BA==","length":3245,"stub":true},"aug-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-mW+NcQTapst2UTw7YvPXTA==","length":3150,"stub":true},"aug-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-hkgAdfMIQ6k5PIE3bFGZrQ==","length":2638,"stub":true},"aug-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7gELCy9gb7VlNkYABdHs5w==","length":18336,"stub":true},"aug-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RWXLTdDN/iuk12TEInOcyw==","length":17817,"stub":true}}}},
{"id":"aur","key":"aur","value":{"rev":"10-757a074b6231cf16bc0c76520c7ba786"},"doc":{"_id":"aur","_rev":"10-757a074b6231cf16bc0c76520c7ba786","name":"aur","description":"Archlinux AUR cli","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"author":{"name":"Filirom1","email":"filirom1@gmail.com"},"name":"aur","description":"Archlinux AUR cli","version":"0.0.1","homepage":"https://github.com/Filirom1/nodejs-aur","repository":{"type":"git","url":"git@github.com:Filirom1/nodejs-aur.git"},"licenses":{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},"main":"lib/aur.coffee","bin":{"aur-info":"bin/aur-info","aur-publish":"bin/aur-publish"},"preferGlobal":true,"engines":{"node":"~0.6.0"},"dependencies":{"request":"2.1.x","form-data":"https://github.com/Filirom1/node-form-data/tarball/master","coffee-script":"1.1.x","underscore":"1.2.x","optimist":"0.2.x","cheerio":"0.2.x"},"devDependencies":{"vows":"0.5.x","express":"2.5.x","connect-form":"0.2.x"},"_npmUser":{"name":"filirom1","email":"filirom1@gmail.com"},"_id":"aur@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"b1ab1cc4a6d8b270cc0628b5530451045945a079","tarball":"http://registry.npmjs.org/aur/-/aur-0.0.1.tgz"},"maintainers":[{"name":"filirom1","email":"filirom1@gmail.com"}]},"0.1.0":{"author":{"name":"Filirom1","email":"filirom1@gmail.com"},"name":"aur","description":"Archlinux AUR cli","version":"0.1.0","homepage":"https://github.com/Filirom1/nodejs-aur","repository":{"type":"git","url":"git@github.com:Filirom1/nodejs-aur.git"},"licenses":{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},"main":"lib/aur.coffee","bin":{"aur-info":"bin/aur-info","aur-publish":"bin/aur-publish"},"preferGlobal":true,"engines":{"node":"~0.6.0"},"dependencies":{"request":"2.2.x","form-data":"https://github.com/Filirom1/node-form-data/tarball/master","coffee-script":"1.1.x","underscore":"1.2.x","optimist":"0.2.x","cheerio":"0.2.x"},"devDependencies":{"vows":"0.6.x","express":"2.5.x","connect-form":"0.2.x"},"scripts":{"test":"vows test/* --spec"},"_npmUser":{"name":"filirom1","email":"filirom1@gmail.com"},"_id":"aur@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"18f01cac6e2524765c8527af6943f5f991d7bdc0","tarball":"http://registry.npmjs.org/aur/-/aur-0.1.0.tgz"},"maintainers":[{"name":"filirom1","email":"filirom1@gmail.com"}]},"0.1.1":{"author":{"name":"Filirom1","email":"filirom1@gmail.com"},"name":"aur","description":"Archlinux AUR cli","version":"0.1.1","homepage":"https://github.com/Filirom1/nodejs-aur","repository":{"type":"git","url":"git@github.com:Filirom1/nodejs-aur.git"},"licenses":{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},"main":"lib/aur.coffee","bin":{"aur-info":"bin/aur-info","aur-publish":"bin/aur-publish"},"preferGlobal":true,"engines":{"node":"~0.6.0"},"dependencies":{"request":"2.2.x","form-data":"https://github.com/Filirom1/node-form-data/tarball/master","coffee-script":"1.1.x","underscore":"1.2.x","optimist":"0.2.x","cheerio":"0.2.x"},"devDependencies":{"vows":"0.6.x","express":"2.5.x","connect-form":"0.2.x"},"scripts":{"test":"vows test/* --spec"},"_npmUser":{"name":"filirom1","email":"filirom1@gmail.com"},"_id":"aur@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"81c19b1ef2dc67eb7226255f08b53f80f3500dfc","tarball":"http://registry.npmjs.org/aur/-/aur-0.1.1.tgz"},"maintainers":[{"name":"filirom1","email":"filirom1@gmail.com"}]},"0.1.2":{"author":{"name":"Filirom1","email":"filirom1@gmail.com"},"name":"aur","description":"Archlinux AUR cli","version":"0.1.2","homepage":"https://github.com/Filirom1/nodejs-aur","repository":{"type":"git","url":"git@github.com:Filirom1/nodejs-aur.git"},"licenses":{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},"main":"lib/aur.coffee","bin":{"aur-info":"bin/aur-info","aur-publish":"bin/aur-publish"},"preferGlobal":true,"engines":{"node":"~0.8.0"},"dependencies":{"form-data":"https://github.com/Filirom1/node-form-data/tarball/master","request":"~2.9.202","coffee-script":"~1.3.3","underscore":"~1.3.3","optimist":"~0.3.4","cheerio":"~0.8.3"},"devDependencies":{"vows":"0.6.x","express":"2.5.x"},"scripts":{"test":"./node_modules/.bin/vows test/* --spec"},"readme":"ArchLinux AUR helper\n====================\n\nA CLI to call ArchLinux AUR services.\n\n### AUR info\n\nUsage: ./bin/aur-info packageName\n\nOptions:\n\n  -s, --selector  [default: \"\"]\n\nExemple:\n\n    $ ./bin/aur-info nodejs-npm\n    { Maintainer: 'neokuno',\n      ID: '43626',\n      Name: 'nodejs-npm',\n      Version: '1.0.104-1',\n      CategoryID: '3',\n      Description: 'a package manager for node',\n      URL: 'http://npmjs.org/',\n      License: 'MIT',\n      NumVotes: '151',\n      OutOfDate: '0',\n      FirstSubmitted: '1289874396',\n      LastModified: '1320540926',\n      URLPath: '/packages/no/nodejs-npm/nodejs-npm.tar.gz' }\n\n\nYou can also use selectors in your query:\n\n    ./bin/aur-info nodejs-npm --selector Version\n    1.0.104-1\n\n\n### AUR publish\n\nUsage: node ./bin/aur-publish\n\nOptions:\n\n  -f, --file      [required]\n\n  -c, --category  [required]  [default: \"system\"]\n\n  -u, --user      [default: \"\"]\n\n  -p, --password  [default: \"\"]\n\n\nExemple:\n\n./bin/aur-publish -f nodejs-express-2.5.0-1.src.tar.gz -c devel -u USERNALE -p PASSWORD\n\nValid categories are :\n\n * daemons\n * devel\n * editors\n * emulators\n * games\n * gnome\n * i18n\n * kde\n * lib\n * modules\n * multimedia\n * network\n * office\n * science\n * system\n * x11\n * xfce\n * kernels\n","_id":"aur@0.1.2","dist":{"shasum":"7bbe7ce1c7be3ef86e88869833466541d2901b05","tarball":"http://registry.npmjs.org/aur/-/aur-0.1.2.tgz"},"maintainers":[{"name":"filirom1","email":"filirom1@gmail.com"}]}},"readme":"ArchLinux AUR helper\n====================\n\nA CLI to call ArchLinux AUR services.\n\n### AUR info\n\nUsage: ./bin/aur-info packageName\n\nOptions:\n\n  -s, --selector  [default: \"\"]\n\nExemple:\n\n    $ ./bin/aur-info nodejs-npm\n    { Maintainer: 'neokuno',\n      ID: '43626',\n      Name: 'nodejs-npm',\n      Version: '1.0.104-1',\n      CategoryID: '3',\n      Description: 'a package manager for node',\n      URL: 'http://npmjs.org/',\n      License: 'MIT',\n      NumVotes: '151',\n      OutOfDate: '0',\n      FirstSubmitted: '1289874396',\n      LastModified: '1320540926',\n      URLPath: '/packages/no/nodejs-npm/nodejs-npm.tar.gz' }\n\n\nYou can also use selectors in your query:\n\n    ./bin/aur-info nodejs-npm --selector Version\n    1.0.104-1\n\n\n### AUR publish\n\nUsage: node ./bin/aur-publish\n\nOptions:\n\n  -f, --file      [required]\n\n  -c, --category  [required]  [default: \"system\"]\n\n  -u, --user      [default: \"\"]\n\n  -p, --password  [default: \"\"]\n\n\nExemple:\n\n./bin/aur-publish -f nodejs-express-2.5.0-1.src.tar.gz -c devel -u USERNALE -p PASSWORD\n\nValid categories are :\n\n * daemons\n * devel\n * editors\n * emulators\n * games\n * gnome\n * i18n\n * kde\n * lib\n * modules\n * multimedia\n * network\n * office\n * science\n * system\n * x11\n * xfce\n * kernels\n","maintainers":[{"name":"filirom1","email":"filirom1@gmail.com"}],"time":{"modified":"2012-08-02T13:43:27.728Z","created":"2011-11-10T07:24:30.655Z","0.0.1":"2011-11-10T07:24:32.666Z","0.1.0":"2011-11-26T08:47:12.651Z","0.1.1":"2011-11-26T09:41:58.813Z","0.1.2":"2012-08-02T07:16:10.863Z"},"author":{"name":"Filirom1","email":"filirom1@gmail.com"},"repository":{"type":"git","url":"git@github.com:Filirom1/nodejs-aur.git"},"users":{"fgribreau":true},"_attachments":{"aur-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VH/lbkB3O3ONs+g7LyBqrw==","length":3858,"stub":true},"aur-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6po+Vi7faoSeOM4JwT+WFA==","length":9052,"stub":true},"aur-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3LJ8cVn4FW1Oc9SUdiJ2bw==","length":3881,"stub":true},"aur-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WNkxpi6kFLKAxzPoHa7mPA==","length":89765,"stub":true}}}},
{"id":"aurora","key":"aurora","value":{"rev":"3-326a4c0804da06ae2b8becbc50579132"},"doc":{"_id":"aurora","_rev":"3-326a4c0804da06ae2b8becbc50579132","name":"aurora","description":"Streamline & Traceur compiler for node.js","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.1":{"name":"aurora","description":"Streamline & Traceur compiler for node.js","version":"0.2.1","homepage":"http://aikar.co/aurora","repository":{"type":"git","url":"git@github.com:aikar/aurora"},"author":{"name":"Aikar","email":"aikar@aikar.co"},"main":"lib/aurora.js","bugs":{"email":"aikar@aikar.co","url":"https://github.com/aikar/aurora/issues"},"bin":{"aurora":"./bin/aurora"},"bundledDependencies":["traceur","streamline",".binx"],"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/home/aikar/.npm/aurora/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aurora@0.2.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8008a0c390aad6e97208f2b305e077bc3681d593","tarball":"http://registry.npmjs.org/aurora/-/aurora-0.2.1.tgz"},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}]}},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}],"time":{"modified":"2011-10-06T14:52:44.270Z","created":"2011-10-06T14:52:43.558Z","0.2.1":"2011-10-06T14:52:44.270Z"},"author":{"name":"Aikar","email":"aikar@aikar.co"},"repository":{"type":"git","url":"git@github.com:aikar/aurora"},"_attachments":{"aurora-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-epvXoLPrpLdKJLyhNqar2g==","length":421264,"stub":true}}}},
{"id":"auth-server","key":"auth-server","value":{"rev":"7-af7703e4ccd8c7e52c90670308764e1c"},"doc":{"_id":"auth-server","_rev":"7-af7703e4ccd8c7e52c90670308764e1c","name":"auth-server","description":"OAuth Server for v2.31 of spec","dist-tags":{"latest":"2.0.31"},"versions":{"2.0.26":{"author":{"name":"Wyatt Preul","email":"wpreul@gmail.com","url":"http://kittenbubbles.com"},"name":"auth-server","description":"OAuth Server for v2.26 of spec","keywords":["oauth","auth server"],"version":"2.0.26","homepage":"https://github.com/wpreul/oauth","repository":{"type":"git","url":"git://github.com/wpreul/oauth.git"},"bugs":{"url":"https://github.com/wpreul/oauth/issues"},"main":"app.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"directories":{"authServer":"./authServer"},"licenses":[{"type":"MIT +no-false-attribs","url":"https://github.com/wpreul/OAuth/blob/master/LICENCE"}],"_npmUser":{"name":"wyatt","email":"wpreul@gmail.com"},"_id":"auth-server@2.0.26","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e5d2e7022286ede6d756b29ac8ecf014a1208d22","tarball":"http://registry.npmjs.org/auth-server/-/auth-server-2.0.26.tgz"},"maintainers":[{"name":"wyatt","email":"wpreul@gmail.com"}]},"2.0.29":{"author":{"name":"Wyatt Preul","email":"wpreul@gmail.com","url":"http://kittenbubbles.com"},"name":"auth-server","description":"OAuth Server for v2.29 of spec","keywords":["oauth","auth server"],"version":"2.0.29","homepage":"https://github.com/wpreul/oauth","repository":{"type":"git","url":"git://github.com/wpreul/oauth.git"},"bugs":{"url":"https://github.com/wpreul/oauth/issues"},"main":"./authServer/","dependencies":{},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"directories":{"authServer":"./authServer"},"licenses":[{"type":"MIT +no-false-attribs","url":"https://github.com/wpreul/OAuth/blob/master/LICENCE"}],"_npmUser":{"name":"wyatt","email":"wpreul@gmail.com"},"_id":"auth-server@2.0.29","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4cf2eb31789c3cea58ad79617f642fb6aacecc7b","tarball":"http://registry.npmjs.org/auth-server/-/auth-server-2.0.29.tgz"},"maintainers":[{"name":"wyatt","email":"wpreul@gmail.com"}]},"2.0.31":{"author":{"name":"Wyatt Preul","email":"wpreul@gmail.com","url":"http://kittenbubbles.com"},"name":"auth-server","description":"OAuth Server for v2.31 of spec","keywords":["oauth","auth server"],"version":"2.0.31","homepage":"https://github.com/wpreul/oauth","repository":{"type":"git","url":"git://github.com/wpreul/oauth.git"},"bugs":{"url":"https://github.com/wpreul/oauth/issues"},"main":"./authServer/","dependencies":{},"devDependencies":{"chai":"*","mocha":"*"},"optionalDependencies":{},"engines":{"node":"*"},"directories":{"authServer":"./authServer"},"licenses":[{"type":"MIT +no-false-attribs","url":"https://github.com/wpreul/OAuth/blob/master/LICENCE"}],"_npmUser":{"name":"wyatt","email":"wpreul@gmail.com"},"_id":"auth-server@2.0.31","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"1a069b468e74790950bcdf61ccd7889b01957a32","tarball":"http://registry.npmjs.org/auth-server/-/auth-server-2.0.31.tgz"},"maintainers":[{"name":"wyatt","email":"wpreul@gmail.com"}]}},"readme":"# OAuth for Node\n=====\n\n## Description\n\nThis is a server implementation for the [v2-26 OAuth](http://tools.ietf.org/html/draft-ietf-oauth-v2-26) specification.  There is an example implementation in the examples folder for the server.  Eventually, I will add a client implementation for the latest specification, which is why it is simply named OAuth at this point. The four main grant types are all supported.  This means that you can allow implicit, client_credentials, authorization_code, and password grants.  It is up to you to implement the authorization page for a user.  This is generally found at /oauth/authorize.  It is also up to you to implement a service for storing client details and access tokens.  The OAuth provider assumes nothing about your server and therefore has no hard dependencies on anything outside of node.  That being said, there is the expectation that the query and body object you pass to OAuth is an object and not in its original string state.  You can achieve this easily by using the connect query middleware, as the example application shows.\n\n## Expectations\n\nYou will need to construct the OAuth object by passing in the following parameters.\n\n1. An object passed in as the tokenService parameter that has a function named generateToken.  generateToken should return a unique string, which will be used for the access and refresh tokens.\n\n2. An object passed in as the clientService parameter that has a function named getById.  getById will be passed an ID and will be expected to pass a client object to the callback function.\n\n3. A client object should have the following:\n  * id \n  * secret\n  * grantTypes (array of allowed grant types for this client, you must pass implicit if you want to allow this type)\n  * isValidRedirectUri (function that takes as a parameter a redirectUri)\n    Because a client can have multiple valid redirect Uri's I have decided to put the responsibility of checking the uri on the client itself.  One reason for this is that it will allow desktop clients to return true if they want.\n\n4. An object passed in as the membershipService parameter that has a function named areUserCredentialsValid.  This function should pass a boolean to the callback function to indicate if the passed in userId and password are valid.  This object is required if you want to allow the password grant type, otherwise you can pass null.  You will probably want to perform additional checks here to make sure the user is not locked out or banned.  Another suggestion is to log failed login attempts and lockout users after a set number of failed attempts to mitigate brute force attacks.\n\n5. An object passed in the authorizationService parameter with the following functions:\n  * saveAuthorizationCode(code, callback)\n  * saveAccessToken(token, callback)\n  * getAuthorizationCode(codeId, callback)\n\n An authorization code object should have these properties at a minimum:\n   * code\n   * expiresDate\n \n A token object will have these properties when passed to the save function:\n   * accessToken\n   * refreshToken\n   * expiresIn (seconds when the access token expires)\n\n## Example\n\nPlease refer to the examples folder for a demonstration of using the server.  The example uses connect, but the AuthServer doesn't actually have a dependency on anything outside of what ships with node.","maintainers":[{"name":"wyatt","email":"wpreul@gmail.com"}],"time":{"modified":"2012-08-07T02:01:57.586Z","created":"2012-07-16T05:58:35.168Z","2.0.26":"2012-07-16T05:58:36.250Z","2.0.29":"2012-07-19T04:32:31.969Z","2.0.31":"2012-08-07T02:01:57.586Z"},"author":{"name":"Wyatt Preul","email":"wpreul@gmail.com","url":"http://kittenbubbles.com"},"repository":{"type":"git","url":"git://github.com/wpreul/oauth.git"},"_attachments":{"auth-server-2.0.31.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-W8fmv1DzsqWWP6WM9R0qFg==","length":9634,"stub":true},"auth-server-2.0.29.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iK4afxhCnZpmT4h4k+XDgg==","length":8022,"stub":true},"auth-server-2.0.26.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-D85hU9fXJ2TqNCHDPec9Aw==","length":6994,"stub":true}}}},
{"id":"auth.rbs","key":"auth.rbs","value":{"rev":"9-16c94dbef98aa1032dea48bc6a61b5db"},"doc":{"_id":"auth.rbs","_rev":"9-16c94dbef98aa1032dea48bc6a61b5db","name":"auth.rbs","description":"Simple local authentication scheme with remember me functionality.","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"auth.rbs","version":"0.1.0","author":{"name":"Zee","email":"zee@randombitstudio.com","url":"https://randombitstudio.com"},"description":"Simple local authentication scheme with remember me functionality.","main":"main.js","repository":{"type":"git","url":"https://randombitstudio@bitbucket.org/randombitstudio/auth.rbs.git"},"keywords":["authentication","cookies","simple"],"dependencies":{"bcrypt":">=0.5.x"},"license":"BSD","engine":{"node":">-0.6"},"_npmUser":{"name":"rbs","email":"zee@randombitstudio.com"},"_id":"auth.rbs@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4b739f904e54605ff3fa4252164c4d399f11eda9","tarball":"http://registry.npmjs.org/auth.rbs/-/auth.rbs-0.1.0.tgz"},"maintainers":[{"name":"rbs","email":"zee@randombitstudio.com"}]},"0.2.0":{"name":"auth.rbs","version":"0.2.0","author":{"name":"Zee","email":"zee@randombitstudio.com","url":"https://randombitstudio.com"},"description":"Simple local authentication scheme with remember me functionality.","main":"main.js","repository":{"type":"git","url":"https://randombitstudio@bitbucket.org/randombitstudio/auth.rbs.git"},"keywords":["authentication","cookies","simple"],"dependencies":{"bcrypt":">=0.5.x"},"license":"BSD","engine":{"node":">-0.6"},"_npmUser":{"name":"rbs","email":"zee@randombitstudio.com"},"_id":"auth.rbs@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c9b044c5be623df5f39e7aaea11be0bf46a3f496","tarball":"http://registry.npmjs.org/auth.rbs/-/auth.rbs-0.2.0.tgz"},"maintainers":[{"name":"rbs","email":"zee@randombitstudio.com"}]},"0.3.0":{"name":"auth.rbs","version":"0.3.0","author":{"name":"Zee","email":"zee@randombitstudio.com","url":"https://randombitstudio.com"},"description":"Simple local authentication scheme with remember me functionality.","main":"main.js","repository":{"type":"git","url":"https://randombitstudio@bitbucket.org/randombitstudio/auth.rbs.git"},"keywords":["authentication","cookies","simple"],"dependencies":{"bcrypt":">=0.5.x","express":">=2.5.x"},"license":"BSD","engine":{"node":">=0.6.x"},"_npmUser":{"name":"rbs","email":"zee@randombitstudio.com"},"_id":"auth.rbs@0.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"746bb93d88c142c6541b6f1da08d71d8cf02ad19","tarball":"http://registry.npmjs.org/auth.rbs/-/auth.rbs-0.3.0.tgz"},"maintainers":[{"name":"rbs","email":"zee@randombitstudio.com"}]},"0.3.2":{"name":"auth.rbs","version":"0.3.2","author":{"name":"Zee","email":"zee@randombitstudio.com","url":"https://randombitstudio.com"},"description":"Simple local authentication scheme with remember me functionality.","main":"main.js","repository":{"type":"git","url":"https://randombitstudio@bitbucket.org/randombitstudio/auth.rbs.git"},"keywords":["authentication","cookies","simple"],"dependencies":{"bcrypt":">=0.5.x","express":">=2.5.x"},"license":"BSD","engine":{"node":">=0.6.x"},"_npmUser":{"name":"rbs","email":"zee@randombitstudio.com"},"_id":"auth.rbs@0.3.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ff98e7bdf312fc4cb5b2cf18cb486ab0158e6d13","tarball":"http://registry.npmjs.org/auth.rbs/-/auth.rbs-0.3.2.tgz"},"maintainers":[{"name":"rbs","email":"zee@randombitstudio.com"}]}},"readme":"#Auth.rbs\n\nAuth.rbs is a simple user authentication & session scheme with remember me functionality.\n\n\n\n##Installation\n\n        $ npm install auth.rbs \n\nTo run the example:\n\n       $ cd ./example\n       $ npm install  // install dependencies\n       $ node app.js  // runs @ port 3333\n\n##Implementation\n* Default Mongoose user model (password, username, email).\n* Default Mongoose cookie model (user id, session series(sha256), session key(Blowfish 12 passes)) \n\n##Dependencies\n* Mongoose >2.4.x (default models)\n* express.js >2.5.x\n* bcrypt >0.6.x\n\n##Authors\n\n* Zee ([Random Bit Studio](http://randombitstudio.com))\n\n","maintainers":[{"name":"rbs","email":"zee@randombitstudio.com"}],"time":{"modified":"2012-02-29T14:30:22.860Z","created":"2012-01-25T17:19:09.353Z","0.1.0":"2012-01-25T17:19:10.641Z","0.2.0":"2012-02-13T16:49:29.128Z","0.3.0":"2012-02-29T14:20:25.559Z","0.3.2":"2012-02-29T14:30:22.860Z"},"author":{"name":"Zee","email":"zee@randombitstudio.com","url":"https://randombitstudio.com"},"repository":{"type":"git","url":"https://randombitstudio@bitbucket.org/randombitstudio/auth.rbs.git"},"_attachments":{"auth.rbs-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-+Hh7hTUjH/onalo97XNYWA==","length":5865,"stub":true},"auth.rbs-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/b3aqLaLYPYnQMeP/Mg/YQ==","length":5859,"stub":true},"auth.rbs-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SiDoqDg9J7tIN8a95Tf9mA==","length":5837,"stub":true},"auth.rbs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bxoxlJv2X8R/61mVMRN9LA==","length":4341,"stub":true}}}},
{"id":"authen","key":"authen","value":{"rev":"3-09e5bef75635c38ee8483fc7c04a2761"},"doc":{"_id":"authen","_rev":"3-09e5bef75635c38ee8483fc7c04a2761","name":"authen","description":"Authentication tools - signing, tokens, password hashes","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"authen","version":"0.0.1","description":"Authentication tools - signing, tokens, password hashes","keywords":["authentification","sign","token","password hash","urlsafe base64"],"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"preferGlobal":false,"private":false,"dependencies":{"async":"~0.1.17","cookie":"~0.0.4","ncbt":"~0.0.1","ops":"~0.0.1"},"engines":{"node":"~0.8.0"},"repository":{"type":"git","url":"https://github.com/dimsmol/authen"},"directories":{"lib":"./lib"},"main":"./lib/index","readme":"# authen\n\nSolves following problems:\n\n* Passwords hashing for storing them on server-side and validation against the hashes\n* Signing data (any buffer) with secret\n* Creation of auth tokens, validating them, carrying renewal, expiration and revocation\n\nAdditional tools:\n\n* Constant time equals for timing attacks prevention (tools/crypto)\n* Url-safe base64 encoder/decoder (tools/url_safe_base64)\n\n## Pwd\n\nPassword hashing tool.\n\n* hash(pwd, cb)\n* verify(pwd, hash, cb)\n\n## Signer\n\nData signer producing \"tokens\" containing:\n\n* data itself (url-safe base64 encoded)\n* name of algorythm used for signing\n* key used to choose secret for singing\n\nAll the parts are separated by ':', token itself is pretty much url safe.\n\n* new Signer(options), where options are:\n\t* secrets - list of secrets available for signing and unsigning\n\t* currentKey - key to choose secret for signing (alphanumeric chars, underscores and '-' are allowed)\n\t\t* key to choose secret for unsigning is a part of token\n\n* sign(buffer) -> token\n* unsign(token) -> buffer\n\n## Tokener\n\nTokener is designed to be protocol-independent, but has number of utility methods that can be helpful if you're using http and are willing to send and recieve your tokens using cookies and http headers.\n\n* new Tokener(signer, opt_options, opt_identityEqualsFunc, opt_getLastRevocationTimeFunc)\n\t* signer is a Signer or Signer-like object\n\t* options are complex enough, some aspects are described below, see sources for full reference and defaults\n\t* identityEqualsFunc(identityA, identityB) can be used for identities that are coplex structures instead of simple types such as integer or string ids. If not set, '===' operator will be used to check equality.\n\t* getLastRevocationTimeFunc(token) is required (and highly recommended) to use ability to revoke previously issued tokens. Must return point in time when revocation was performed last time for identity represented by the token or null if no revocations were performed. If not set, no revocation checks will be performed.\n\n* login(identity) -> tokenResult - creates token for given identity and returns information about it along with itself\n\t* tokenResult is `{ identity: loggedInIdentity, token: token, issued: issuedDate, maxAge: maxAgeInSeconds }`\n\t* login() expects you are managing token (storing, deleting on logout) yourself\n\t* token then must be provided within options.headers.name request header for every request\n* loginWithCookies(res, identity, isSessionLifetime) -> tokenResult - the same as login(), but tokenResult will not contain token itself, instead it will be placed to cookies. isSessionLifetime when true indicates that cookies must have browser's session lifetime\n\t* by default pair of cookies is issued and it's expected that you copy value of one of them named options.cookies.nameLimited to options.headers.name request header for every request\n\t\t* this is needed for CSRF protection, see below for details and other options available\n* logoutWithCookies(res) - removes cookies set by loginWithCookies()\n\t* you don't need to call it if you used login() instead of loginWithCookies()\n* auth(token, opt_additionalToken, opt_expectedIdentity, opt_noCookiesMode) -> tokenData - checks auth token and provides it's data if it is valid one and renewal info if needed, null returned if token is not valid by any reason. auth() can also return `{ unexpectedIdentity: true }` if got unexpected identity (see below).\n\t* additionalToken can be used to provide additional token if there is a chance that 'token' is lmited one (related to CSRF protection, see below)\n\t* expectedIdentity can be used to get sure token describes identity we expect (see \"Unexpected identity protection\" below)\n\t* noCookesMode, when true, indicates that we have no access to cookies or don't want to use them. This will omit renewal generation for cookie-tokens, because we will unable to use such a renewal. This argument is useful only if you're using cookie-stored tokens in general, but sometimes are unable or not willing to set cookies for renewal.\n\t* tokenData is `{ auth: { identity: identity, ..other token data.. }, renewal: renewalData }`\n\t* auth() checks:\n\t\t* token is properly signed according to signer\n\t\t* token is not expired accoring to options.timeout\n\t\t* if token is limited:\n\t\t\t* additionalToken is provided and it is correct\n\t\t\t* additionalToken matches token\n\t\t* token is not revoked\n\t\t\t* token is not issued as a renewal too close to last revocation (see \"Token revocation\" below)\n\t\t* identity matches expectedIdentity (if provided)\n\t* if renewal is needed, auth() also provides renewal data\n* applyRenewal(res, renewal) - applies renewal data provided by previously called auth()\n* getAuthData(req) -> authData - harvests auth data from http headers and cookies\n\t* authData are `{ token: token, additionalToken: optionalAdditionalToken, expectedIdentity: optionalExpectedIdentity }`\n\t\t* expected identity assumed to be JSON-encoded when placed to http header, will be skipped if cannot be parsed\n\n### identity\n\nIdentity is used to identificate authentication target - user, service or whatever entity participating in authentication process. Usually it is just a user id, represented by integer or string value. But it is allowed to be any JSON-encodable structure.\n\nOf course, to check complex identities equality we need something more sophisticated than basic equality operator provided by JS. For that purpose identityEqualsFunc(identityA, identityB) is used.\n\n### Unexpected identity protection\n\nIf auth token is stored in cookies or other storage shared between browser tabs, user can login on one tab as user A and then relogin on other tab as user B. First tab will then use new tokens (because it gets them from storage shared between tabs).\n\nBut application instance running on first tab doesn't know (unless some kind of inter-tab notification is involved) that user is changed. So it will continue to show data rendered for user A, but all subsequent requests will be performed as if they done by user B (with user B token).\n\nSuch a mix can be highly undesirable. To avoid this situation, application can tell what user is expected to be represented by token sending to server. You can set options.headers.nameExpected http header on client side to JSON-serialized identity, then use this value on server - extract it with getAuthData() and provide as an argument to auth(). auth() then will check that identity represented by token matches expected one. If not, you can respond some error to client, to notify it that there possibly was a relogin it missed.\n\n### Built-in CSRF protection\n\nIf client provides authentication cookie, it doesn't make us sure that request is intentionally performed by the entity owning such a cookie. That's because browser sends cookies along with request to domain cookies are belong to, no matter what code or page did the request.\n\nSo, to prove that request is performed by the code that itself has access to authentication cookies, the code should copy some token from cookies to request header. You could use authetication token itself for such a purpose - copy auth token from cookie to header to ensure server you have access to it. But if you use http-only cookie for auth token, then you cannot do it from JS.\n\nBy default Tokener sets two auth cookies. One is for regular http-only auth token and second one is \"limited\" and not-http-only (so, it's available to JS). Tokener expects limited cookie to be copied to request header. If header contains limited cookie, Tokener will also check first, http-only cookie and ensure that limited token matches regular one, then authentication will be succesful.\n\nAltrenatives available:\n\n* If you're using your own CSRF protection mechanism, just set options.cookies.useLimited to false. Then Tokener will look at cookies even if no auth token (limited or not) is provided within headers.\n* If by any reason you want your auth cookie to be non-http-only, then along with setting set options.cookies.useLimited to false, set options.cookies.forceNonHttp to true. Then tokener will set main auth cookie without http-only flag and you can copy it to header without the need of second limited cookie.\n* If you don't want server to rely on cookies at all, prefer use login() method instead of loginWithCookies(), store auth token where you want and provide it within every request header.\n\n### Token expiration\n\nToken treated as expired if more than options.timeout amount of time passed since it was issued.\n\n### Token renewal\n\nIf auth() got valid token and more than options.renewal.interval amount of time passed since it was issued, then it returns renewal data for such a token. Renewal data then can be applied using applyRenewal().\n\nRenewed token will mimic all properties of original one, including whether it is cookie token or not and if it is cookie token, should it have browser session lifetime or not. The only difference is that unlike renewed tokens, tokens obtained by providing password are marked as \"strong\" and are tolerant to revocation trust delay described below.\n\n### Token revocation\n\ngetLastRevocationTimeFunc(token) must return last revocation time. All tokens issued before that time will be treated as invalid (revoked), as well as tokens that were renewed (see renewal) within options.postRevocationTrustDelay interval after that time.\n\nRevocation trust delay is needed to disallow keeping compromised token alive by continuous renewal. Renewals close to revocation moment will be discarded to insure we're using only renewed tokens obtained after all servers informed about revocation.\n","_id":"authen@0.0.1","dist":{"shasum":"4efc034d0c1452f66a233ec6ecd7012f896485fb","tarball":"http://registry.npmjs.org/authen/-/authen-0.0.1.tgz"},"maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}]}},"readme":"# authen\n\nSolves following problems:\n\n* Passwords hashing for storing them on server-side and validation against the hashes\n* Signing data (any buffer) with secret\n* Creation of auth tokens, validating them, carrying renewal, expiration and revocation\n\nAdditional tools:\n\n* Constant time equals for timing attacks prevention (tools/crypto)\n* Url-safe base64 encoder/decoder (tools/url_safe_base64)\n\n## Pwd\n\nPassword hashing tool.\n\n* hash(pwd, cb)\n* verify(pwd, hash, cb)\n\n## Signer\n\nData signer producing \"tokens\" containing:\n\n* data itself (url-safe base64 encoded)\n* name of algorythm used for signing\n* key used to choose secret for singing\n\nAll the parts are separated by ':', token itself is pretty much url safe.\n\n* new Signer(options), where options are:\n\t* secrets - list of secrets available for signing and unsigning\n\t* currentKey - key to choose secret for signing (alphanumeric chars, underscores and '-' are allowed)\n\t\t* key to choose secret for unsigning is a part of token\n\n* sign(buffer) -> token\n* unsign(token) -> buffer\n\n## Tokener\n\nTokener is designed to be protocol-independent, but has number of utility methods that can be helpful if you're using http and are willing to send and recieve your tokens using cookies and http headers.\n\n* new Tokener(signer, opt_options, opt_identityEqualsFunc, opt_getLastRevocationTimeFunc)\n\t* signer is a Signer or Signer-like object\n\t* options are complex enough, some aspects are described below, see sources for full reference and defaults\n\t* identityEqualsFunc(identityA, identityB) can be used for identities that are coplex structures instead of simple types such as integer or string ids. If not set, '===' operator will be used to check equality.\n\t* getLastRevocationTimeFunc(token) is required (and highly recommended) to use ability to revoke previously issued tokens. Must return point in time when revocation was performed last time for identity represented by the token or null if no revocations were performed. If not set, no revocation checks will be performed.\n\n* login(identity) -> tokenResult - creates token for given identity and returns information about it along with itself\n\t* tokenResult is `{ identity: loggedInIdentity, token: token, issued: issuedDate, maxAge: maxAgeInSeconds }`\n\t* login() expects you are managing token (storing, deleting on logout) yourself\n\t* token then must be provided within options.headers.name request header for every request\n* loginWithCookies(res, identity, isSessionLifetime) -> tokenResult - the same as login(), but tokenResult will not contain token itself, instead it will be placed to cookies. isSessionLifetime when true indicates that cookies must have browser's session lifetime\n\t* by default pair of cookies is issued and it's expected that you copy value of one of them named options.cookies.nameLimited to options.headers.name request header for every request\n\t\t* this is needed for CSRF protection, see below for details and other options available\n* logoutWithCookies(res) - removes cookies set by loginWithCookies()\n\t* you don't need to call it if you used login() instead of loginWithCookies()\n* auth(token, opt_additionalToken, opt_expectedIdentity, opt_noCookiesMode) -> tokenData - checks auth token and provides it's data if it is valid one and renewal info if needed, null returned if token is not valid by any reason. auth() can also return `{ unexpectedIdentity: true }` if got unexpected identity (see below).\n\t* additionalToken can be used to provide additional token if there is a chance that 'token' is lmited one (related to CSRF protection, see below)\n\t* expectedIdentity can be used to get sure token describes identity we expect (see \"Unexpected identity protection\" below)\n\t* noCookesMode, when true, indicates that we have no access to cookies or don't want to use them. This will omit renewal generation for cookie-tokens, because we will unable to use such a renewal. This argument is useful only if you're using cookie-stored tokens in general, but sometimes are unable or not willing to set cookies for renewal.\n\t* tokenData is `{ auth: { identity: identity, ..other token data.. }, renewal: renewalData }`\n\t* auth() checks:\n\t\t* token is properly signed according to signer\n\t\t* token is not expired accoring to options.timeout\n\t\t* if token is limited:\n\t\t\t* additionalToken is provided and it is correct\n\t\t\t* additionalToken matches token\n\t\t* token is not revoked\n\t\t\t* token is not issued as a renewal too close to last revocation (see \"Token revocation\" below)\n\t\t* identity matches expectedIdentity (if provided)\n\t* if renewal is needed, auth() also provides renewal data\n* applyRenewal(res, renewal) - applies renewal data provided by previously called auth()\n* getAuthData(req) -> authData - harvests auth data from http headers and cookies\n\t* authData are `{ token: token, additionalToken: optionalAdditionalToken, expectedIdentity: optionalExpectedIdentity }`\n\t\t* expected identity assumed to be JSON-encoded when placed to http header, will be skipped if cannot be parsed\n\n### identity\n\nIdentity is used to identificate authentication target - user, service or whatever entity participating in authentication process. Usually it is just a user id, represented by integer or string value. But it is allowed to be any JSON-encodable structure.\n\nOf course, to check complex identities equality we need something more sophisticated than basic equality operator provided by JS. For that purpose identityEqualsFunc(identityA, identityB) is used.\n\n### Unexpected identity protection\n\nIf auth token is stored in cookies or other storage shared between browser tabs, user can login on one tab as user A and then relogin on other tab as user B. First tab will then use new tokens (because it gets them from storage shared between tabs).\n\nBut application instance running on first tab doesn't know (unless some kind of inter-tab notification is involved) that user is changed. So it will continue to show data rendered for user A, but all subsequent requests will be performed as if they done by user B (with user B token).\n\nSuch a mix can be highly undesirable. To avoid this situation, application can tell what user is expected to be represented by token sending to server. You can set options.headers.nameExpected http header on client side to JSON-serialized identity, then use this value on server - extract it with getAuthData() and provide as an argument to auth(). auth() then will check that identity represented by token matches expected one. If not, you can respond some error to client, to notify it that there possibly was a relogin it missed.\n\n### Built-in CSRF protection\n\nIf client provides authentication cookie, it doesn't make us sure that request is intentionally performed by the entity owning such a cookie. That's because browser sends cookies along with request to domain cookies are belong to, no matter what code or page did the request.\n\nSo, to prove that request is performed by the code that itself has access to authentication cookies, the code should copy some token from cookies to request header. You could use authetication token itself for such a purpose - copy auth token from cookie to header to ensure server you have access to it. But if you use http-only cookie for auth token, then you cannot do it from JS.\n\nBy default Tokener sets two auth cookies. One is for regular http-only auth token and second one is \"limited\" and not-http-only (so, it's available to JS). Tokener expects limited cookie to be copied to request header. If header contains limited cookie, Tokener will also check first, http-only cookie and ensure that limited token matches regular one, then authentication will be succesful.\n\nAltrenatives available:\n\n* If you're using your own CSRF protection mechanism, just set options.cookies.useLimited to false. Then Tokener will look at cookies even if no auth token (limited or not) is provided within headers.\n* If by any reason you want your auth cookie to be non-http-only, then along with setting set options.cookies.useLimited to false, set options.cookies.forceNonHttp to true. Then tokener will set main auth cookie without http-only flag and you can copy it to header without the need of second limited cookie.\n* If you don't want server to rely on cookies at all, prefer use login() method instead of loginWithCookies(), store auth token where you want and provide it within every request header.\n\n### Token expiration\n\nToken treated as expired if more than options.timeout amount of time passed since it was issued.\n\n### Token renewal\n\nIf auth() got valid token and more than options.renewal.interval amount of time passed since it was issued, then it returns renewal data for such a token. Renewal data then can be applied using applyRenewal().\n\nRenewed token will mimic all properties of original one, including whether it is cookie token or not and if it is cookie token, should it have browser session lifetime or not. The only difference is that unlike renewed tokens, tokens obtained by providing password are marked as \"strong\" and are tolerant to revocation trust delay described below.\n\n### Token revocation\n\ngetLastRevocationTimeFunc(token) must return last revocation time. All tokens issued before that time will be treated as invalid (revoked), as well as tokens that were renewed (see renewal) within options.postRevocationTrustDelay interval after that time.\n\nRevocation trust delay is needed to disallow keeping compromised token alive by continuous renewal. Renewals close to revocation moment will be discarded to insure we're using only renewed tokens obtained after all servers informed about revocation.\n","maintainers":[{"name":"dimsmol","email":"dimsmol@gmail.com"}],"time":{"modified":"2012-08-14T11:50:44.445Z","created":"2012-08-14T11:50:42.141Z","0.0.1":"2012-08-14T11:50:44.445Z"},"author":{"name":"Dmitry Smolin","email":"dimsmol@gmail.com"},"repository":{"type":"git","url":"https://github.com/dimsmol/authen"},"_attachments":{"authen-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iSooGOJaoILzdzCmdSl18A==","length":8032,"stub":true}}}},
{"id":"authenticate-pam","key":"authenticate-pam","value":{"rev":"3-564dfc0ebe25f3b0998fc48b33d3069d"},"doc":{"_id":"authenticate-pam","_rev":"3-564dfc0ebe25f3b0998fc48b33d3069d","name":"authenticate-pam","description":"Asynchronous PAM authentication for NodeJS 0.8.0 and later (using libuv and gyp)","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"authenticate-pam","version":"0.1.0","scripts":{"preinstall":"node-gyp configure && node-gyp build","preuninstall":"rm -rf build/*"},"main":"build/Release/authenticate_pam.node","description":"Asynchronous PAM authentication for NodeJS 0.8.0 and later (using libuv and gyp)","homepage":"https://github.com/RushPL/node-authenticate-pam","author":{"name":"Damian Kaczmarek","email":"rush@rushbase.net","url":"www.rushbase.net"},"repository":{"type":"git","url":"git://github.com/RushPL/node-authenticate-pam.git"},"_npmUser":{"name":"RushPL","email":"rush@rushbase.net"},"_id":"authenticate-pam@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"98f57169028b9ab57338de70f06aa68876581cc3","tarball":"http://registry.npmjs.org/authenticate-pam/-/authenticate-pam-0.1.0.tgz"},"maintainers":[{"name":"RushPL","email":"rush@rushbase.net"}]}},"readme":"node-authenticate\n=================\n\nAsynchronous PAM authentication for NodeJS 0.8.0 and later (using libuv and gyp)\nYou will most likely need to run it as root in most common environments!\n\nIt tries to superseed the previous and outdated node-pam extension with the following improvements:\n* Allows to provide own service name, for example common-auth or any custom service name defined in `/etc/pam.d`\n* Allows to provide PAM_RHOST via 'remoteHost' option. It is used to provide remote network authentication that will skip any local only authentication methods like for example fingerprint reading.\n* Already mentioned utilization of libuv and node-gyp\n* Proper type checking in C++ code, it throws exception if bad types are given\n* In case of error it passes the error string containing both pam function and `pam_strerror()` results\n\nExample\n=========\n\nSimple usage\n------------\nDefault service_name for `pam_start(2)` is 'login'.\n\n    var pam = require('authenticate-pam');\n    pam.authenticate('myusername', 'mysecretpassword', function(err) {\n        if(err) {\n          console.log(err);\n        }\n        else {\n          console.log(\"Authenticated!\");\n        }\n      });\n\nUsage with options:\n-------------------\nProper apps should provide their own service name. Sample services are located in `/etc/pam.d`.\nAs an example lookup a service name file for `sshd`.\nTo do proper network authentication you should also provide `remoteHost` key to the options argument. It will be passed to pam as `PAM_RHOST` (`pam_set_item(2)`)\n\n    var pam = require('authenticate-pam');\n    pam.authenticate('rush', 'mysecretpassword', function(err) {\n        if(err) {\n          console.log(err);\n        }\n        else {\n          console.log(\"Authenticated!\");\n        }\n    }, {serviceName: 'myapp', remoteHost: 'localhost'});\n    \nInstall\n-------------------\n`npm install authenticate-pam`","maintainers":[{"name":"RushPL","email":"rush@rushbase.net"}],"time":{"modified":"2012-07-02T13:17:12.389Z","created":"2012-07-02T13:17:10.347Z","0.1.0":"2012-07-02T13:17:12.389Z"},"author":{"name":"Damian Kaczmarek","email":"rush@rushbase.net","url":"www.rushbase.net"},"repository":{"type":"git","url":"git://github.com/RushPL/node-authenticate-pam.git"},"_attachments":{"authenticate-pam-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ifiqic5oMEznKq8lGKIr/A==","length":3593,"stub":true}}}},
{"id":"autheremin","key":"autheremin","value":{"rev":"7-2dc53f373550a2b420a1aa26d0512277"},"doc":{"_id":"autheremin","_rev":"7-2dc53f373550a2b420a1aa26d0512277","name":"autheremin","description":"Authing against a DB","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"autheremin","version":"0.0.1","description":"Authing against a DB","homepage":"https://github.com/hackmastera/autheremin.git","engines":{"node":"0.8.2","npm":"1.1.1"},"repository":{"type":"git","url":"git://github.com/hackmastera/autheremin.git"},"scripts":{"test":"find test/test-*.js | xargs -n 1 -t node"},"dependencies":{"bcrypt":"0.7.0"},"_npmUser":{"name":"gsf","email":"g@grrawr.com"},"_id":"autheremin@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"c9ac58d33df420a9b63b85dbb6ba34347b8e3d3d","tarball":"http://registry.npmjs.org/autheremin/-/autheremin-0.0.1.tgz"},"maintainers":[{"name":"gsf","email":"g@grrawr.com"}]},"0.0.2":{"name":"autheremin","version":"0.0.2","description":"Authing against a DB","homepage":"https://github.com/hackmastera/autheremin.git","repository":{"type":"git","url":"git://github.com/hackmastera/autheremin.git"},"scripts":{"test":"find test/test-*.js | xargs -n 1 -t node"},"dependencies":{"bcrypt":"0.7.0"},"_npmUser":{"name":"gsf","email":"g@grrawr.com"},"_id":"autheremin@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"6db0ff4b319ab52943019655050df0074d0d1167","tarball":"http://registry.npmjs.org/autheremin/-/autheremin-0.0.2.tgz"},"maintainers":[{"name":"gsf","email":"g@grrawr.com"}]},"0.0.3":{"name":"autheremin","version":"0.0.3","description":"Authing against a DB","homepage":"https://github.com/hackmastera/autheremin.git","main":"./autheremin","repository":{"type":"git","url":"git://github.com/hackmastera/autheremin.git"},"scripts":{"test":"find test/test-*.js | xargs -n 1 -t node"},"dependencies":{"bcrypt":"0.7.0"},"_npmUser":{"name":"gsf","email":"g@grrawr.com"},"_id":"autheremin@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"728cd50c9bb894493813ac3cc1c732214d35a418","tarball":"http://registry.npmjs.org/autheremin/-/autheremin-0.0.3.tgz"},"maintainers":[{"name":"gsf","email":"g@grrawr.com"}]}},"readme":"autheremin\n==========\n\nSets up user authentication in a database in a pretty safe way. Now with bcrypt!\n\nUsage\n-----\nI'm thinking usage along these lines:\n\n```javascript\n// db must provide get, set, and del methods\nvar db = require('./db')\nvar autheremin = require('autheremin')(db)\n\nvar username = 'antigone'\nvar password = '7xqJ3b8n'\n\nautheremin.create(username, password, function(err) {\n  if (err) throw err\n  // username/password combination was created successfully\n})\n\nautheremin.verify(username, password, function(err) {\n  if (err) throw err\n  // username/password combination was verified against the database\n})\n\nautheremin.delete(username, function(err) {\n  if(err) throw err\n  // record with that username deleted from the database\n})\n```\n","maintainers":[{"name":"gsf","email":"g@grrawr.com"}],"time":{"modified":"2012-07-20T00:32:29.826Z","created":"2012-07-19T23:58:18.204Z","0.0.1":"2012-07-19T23:58:19.595Z","0.0.2":"2012-07-20T00:08:07.337Z","0.0.3":"2012-07-20T00:32:29.826Z"},"repository":{"type":"git","url":"git://github.com/hackmastera/autheremin.git"},"_attachments":{"autheremin-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vR2K9eA94ca0r2K6GAyFGA==","length":1345,"stub":true},"autheremin-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-tuXm+Z0jt6fhP5j65LgGDA==","length":1279,"stub":true},"autheremin-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kipkVo9ioIv0yf8nS0Qk1g==","length":1296,"stub":true}}}},
{"id":"authhmac","key":"authhmac","value":{"rev":"5-9f3cfe4c38b8646c1e0c6e1794df96b3"},"doc":{"_id":"authhmac","_rev":"5-9f3cfe4c38b8646c1e0c6e1794df96b3","name":"authhmac","description":"HMAC signature for NodeJS HTTP requests","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"authhmac","version":"0.0.1","tags":["http","hmac","authentication"],"description":"HMAC signature for NodeJS HTTP requests","author":{"name":"Federico Feroldi","email":"fferoldi@gild.com"},"engine":"node >= 0.4.1","main":"./auth_hmac","repository":{"type":"git","url":"git://github.com/cloudify/node-authhmac.git"},"bugs":{"url":"https://github.com/cloudify/node-authhmac/issues"},"devDependencies":{"vows":"0.5.x","coffee-script":">= 1.1.2"},"_npmJsonOpts":{"file":"/Users/federico/.npm/authhmac/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"authhmac@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d3424e9180f33f8d1e2a161b580fac8974c9b8c9","tarball":"http://registry.npmjs.org/authhmac/-/authhmac-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"cloudify","email":"federico@cloudify.me"}]},"0.0.2":{"name":"authhmac","version":"0.0.2","tags":["http","hmac","authentication"],"description":"HMAC signature for NodeJS HTTP requests","author":{"name":"Federico Feroldi","email":"fferoldi@gild.com"},"engine":"node >= 0.4.1","main":"./auth_hmac","repository":{"type":"git","url":"git://github.com/cloudify/node-authhmac.git"},"bugs":{"url":"https://github.com/cloudify/node-authhmac/issues"},"devDependencies":{"vows":"0.5.x","coffee-script":">= 1.1.2"},"_npmJsonOpts":{"file":"/Users/federico/.npm/authhmac/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"authhmac@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4f0e051dd3e142a7912efdc8d204969fe768f050","tarball":"http://registry.npmjs.org/authhmac/-/authhmac-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"cloudify","email":"federico@cloudify.me"}]}},"maintainers":[{"name":"cloudify","email":"federico@cloudify.me"}],"time":{"modified":"2012-01-18T19:41:55.598Z","created":"2011-10-18T16:16:55.571Z","0.0.1":"2011-10-18T16:17:03.564Z","0.0.2":"2012-01-18T19:41:55.598Z"},"author":{"name":"Federico Feroldi","email":"fferoldi@gild.com"},"repository":{"type":"git","url":"git://github.com/cloudify/node-authhmac.git"},"_attachments":{"authhmac-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-c5uHQe3lMsvr3cvZfHIAwQ==","length":2908,"stub":true},"authhmac-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QNEGYQ+vmWNwdD6xnG2btg==","length":2878,"stub":true}}}},
{"id":"authkit","key":"authkit","value":{"rev":"3-480565205cba3d1eee080999c6c3ee3a"},"doc":{"_id":"authkit","_rev":"3-480565205cba3d1eee080999c6c3ee3a","name":"authkit","description":"A small brunch of code that help developer to manage access control","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"authkit","version":"0.1.0","description":"A small brunch of code that help developer to manage access control","main":"AuthKit.js","directories":{"doc":"docs"},"repository":{"type":"git","url":"https://github.com/bu/AuthKit.git"},"keywords":["api"],"author":{"name":"Buwei Chiu"},"license":"MIT","readme":"# AuthKit\n\nA small bundle of tools that help developer to build authentication and authorization.\n\n-------\n\nThis package split in serveral domain, usage are below:\n\n## Server\n\nThe function under this domain are specified binding to **Express (>=3.0.0rc1)**.\n\n### Access Related\n\n#### allowAllAjaxOrigin\n\nAllow all request from xHR, avoid of limit of Access-Control-Allow-Origin\n\n\t// to use this feature, just put this line to app.js before ** app.use(app.router); **\n\t\n\tapp.use(AuthKit.server.allowAllAjaxOrigin);\n\n### Method Not Found Message\n\n#### apiNotFoundError && pageNotFoundError\n\nThese method will return not found page or message to client.\n\n\t// to use this feature, just put this line to app.js after ** app.use(app.router); **\n\t\n\tapp.use(AuthKit.server.apiNotFoundError);\n\tapp.use(AuthKit.server.pageNotFoundError);\n\t\n","_id":"authkit@0.1.0","dist":{"shasum":"9e764571fd89c784816447947cc352e3a38cb3e1","tarball":"http://registry.npmjs.org/authkit/-/authkit-0.1.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]}},"readme":"# AuthKit\n\nA small bundle of tools that help developer to build authentication and authorization.\n\n-------\n\nThis package split in serveral domain, usage are below:\n\n## Server\n\nThe function under this domain are specified binding to **Express (>=3.0.0rc1)**.\n\n### Access Related\n\n#### allowAllAjaxOrigin\n\nAllow all request from xHR, avoid of limit of Access-Control-Allow-Origin\n\n\t// to use this feature, just put this line to app.js before ** app.use(app.router); **\n\t\n\tapp.use(AuthKit.server.allowAllAjaxOrigin);\n\n### Method Not Found Message\n\n#### apiNotFoundError && pageNotFoundError\n\nThese method will return not found page or message to client.\n\n\t// to use this feature, just put this line to app.js after ** app.use(app.router); **\n\t\n\tapp.use(AuthKit.server.apiNotFoundError);\n\tapp.use(AuthKit.server.pageNotFoundError);\n\t\n","maintainers":[{"name":"bu","email":"bu@hax4.in"}],"time":{"modified":"2012-08-03T04:59:47.469Z","created":"2012-08-03T04:59:44.077Z","0.1.0":"2012-08-03T04:59:47.469Z"},"author":{"name":"Buwei Chiu"},"repository":{"type":"git","url":"https://github.com/bu/AuthKit.git"},"_attachments":{"authkit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rqiXiIvz9Y4tAqXDWWYzrQ==","length":2213,"stub":true}}}},
{"id":"authnet_cim","key":"authnet_cim","value":{"rev":"7-f02bbd206ac2b8c05255bcd8171ac1eb"},"doc":{"_id":"authnet_cim","_rev":"7-f02bbd206ac2b8c05255bcd8171ac1eb","name":"authnet_cim","description":"Authorize.net CIM Interface. Not yet production ready.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"authnet_cim","description":"Authorize.net CIM Interface. Not yet production ready.","version":"0.1.0","author":{"name":"Jesse Pate","email":"jesse@stateoftomorrow.tv"},"keywords":["gateway","authorize.net","cim","payment","credit card"],"dependencies":{"xml2js":"0.1.6"},"directories":{"lib":"./lib"},"main":"./index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"repository":{"type":"git","url":"git://github.com/jessedpate/authnet_cim.git"},"devDependencies":{},"_id":"authnet_cim@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e513b5e5780ed10e9f42ccd44c34fd4118b6464f","tarball":"http://registry.npmjs.org/authnet_cim/-/authnet_cim-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"authnet_cim","description":"Authorize.net CIM Interface. Not yet production ready.","version":"0.1.1","author":{"name":"Jesse Pate","email":"jesse@stateoftomorrow.tv"},"keywords":["gateway","authorize.net","cim","payment","credit card"],"dependencies":{"xml2js":"0.1.6"},"directories":{"lib":"./lib"},"main":"./index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"repository":{"type":"git","url":"git://github.com/jessedpate/authnet_cim.git"},"devDependencies":{},"_id":"authnet_cim@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"dd2ae3332a56dcfcda0d372f977cfbb407ae34c2","tarball":"http://registry.npmjs.org/authnet_cim/-/authnet_cim-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"authnet_cim","description":"Authorize.net CIM Interface. Not yet production ready.","version":"0.1.2","author":{"name":"Jesse Pate","email":"jesse@stateoftomorrow.tv"},"keywords":["gateway","authorize.net","cim","payment","credit card"],"dependencies":{"xml2js":"0.1.6"},"directories":{"lib":"./lib"},"main":"./index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"repository":{"type":"git","url":"git://github.com/jessedpate/authnet_cim.git"},"devDependencies":{},"_id":"authnet_cim@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d32dff60c1eaab044743b90a852345f1b90f968b","tarball":"http://registry.npmjs.org/authnet_cim/-/authnet_cim-0.1.2.tgz"},"scripts":{}}},"maintainers":[{"name":"jessedpate","email":"jesse@stateoftomorrow.tv"}],"time":{"modified":"2011-06-14T04:48:38.572Z","created":"2011-05-20T18:40:57.544Z","0.1.0":"2011-05-20T18:40:58.389Z","0.1.1":"2011-06-07T04:26:07.438Z","0.1.2":"2011-06-14T04:48:38.572Z"},"author":{"name":"Jesse Pate","email":"jesse@stateoftomorrow.tv"},"repository":{"type":"git","url":"git://github.com/jessedpate/authnet_cim.git"},"_attachments":{"authnet_cim-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fsPtMmNdh08NHLdNQOqtOg==","length":4964,"stub":true},"authnet_cim-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6XDRX7EYE4GgkEtr7a3Gpw==","length":4958,"stub":true},"authnet_cim-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pZP7bN/TRdCKuKvLmyLghA==","length":4796,"stub":true}}}},
{"id":"authom","key":"authom","value":{"rev":"16-fba94ce1d1fd4851bfc167ad6a310043"},"doc":{"_id":"authom","_rev":"16-fba94ce1d1fd4851bfc167ad6a310043","name":"authom","description":"A dependency-free multi-service authentication tool for node.js","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.6":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free mutli-service authentication tool for node.js","version":"0.1.6","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.1.6","_engineSupported":false,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"3a29ab99bd2947beff2900a2288438832e1ffe4a","tarball":"http://registry.npmjs.org/authom/-/authom-0.1.6.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.2.0":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free mutli-service authentication tool for node.js","version":"0.2.0","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.2.0","_engineSupported":false,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"9e4b7fa5a827273ccc9a281506c0d2a6e37f2afb","tarball":"http://registry.npmjs.org/authom/-/authom-0.2.0.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.2.1":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free multi-service authentication tool for node.js","version":"0.2.1","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":">=0.4.12"},"dependencies":{},"devDependencies":{},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.2.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"9ed94593f1f19bf2c1650682f98f5c7e7df87773","tarball":"http://registry.npmjs.org/authom/-/authom-0.2.1.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.2.2":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free multi-service authentication tool for node.js","version":"0.2.2","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":">=0.4.12"},"dependencies":{},"devDependencies":{"express":"~2.5.4"},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"5f46e3ffb081a93a7f668bdd8d412b590ab21437","tarball":"http://registry.npmjs.org/authom/-/authom-0.2.2.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.3.0":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free multi-service authentication tool for node.js","version":"0.3.0","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":">=0.4.12"},"dependencies":{},"devDependencies":{"express":"~2.5.4"},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d5e71167a6524689e1317aa081f84f35d25f403b","tarball":"http://registry.npmjs.org/authom/-/authom-0.3.0.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.3.1":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free multi-service authentication tool for node.js","version":"0.3.1","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":">=0.4.12"},"dependencies":{"oauth":">=0.9.6"},"devDependencies":{"express":"~2.5.4"},"optionalDependencies":{"oauth":">=0.9.6"},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.3.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f915db961d146f70ffc769d8be0716574512be99","tarball":"http://registry.npmjs.org/authom/-/authom-0.3.1.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.4.0":{"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"name":"authom","description":"A dependency-free multi-service authentication tool for node.js","version":"0.4.0","keywords":["auth","authorization","oauth","http"],"homepage":"https://github.com/jed/authom","contributors":[{"name":"Mark Lussier","email":"mlussier@gmail.com","url":"https://github.com/intabulas"}],"main":"./lib/authom","repository":{"type":"git","url":"git://github.com/jed/authom.git"},"engines":{"node":">=0.6.15"},"devDependencies":{"express":"~2.5.4"},"optionalDependencies":{"oauth":">=0.9.6"},"scripts":{"start":"sudo node ./example/server.js"},"_npmUser":{"name":"jed","email":"tr@nslator.jp"},"_id":"authom@0.4.0","dependencies":{"oauth":">=0.9.6"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5fb00c37a345291b6b28ee80221dfde4a915aba9","tarball":"http://registry.npmjs.org/authom/-/authom-0.4.0.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]}},"readme":"authom\n=======\n\nauthom is an authentication library for node.js. It unifies authentication APIs for multiple services into a single EventEmitter.\n\nauthom was designed to solve one problem and solve it well. It has an intuitive node.js-like API, no external dependencies, and doesn't force any particular persistence, session, or middleware approaches on you.\n\nExample\n-------\n\n```javascript\n// Like socket.io, authom will intercept requests\n// for you to help keep your routes clean.\n\nvar server = require(\"http\").createServer()\n  , authom = require(\"authom\")\n\nserver.on(\"request\", function() {\n  // your usual server logic\n})\n\n// create servers for the services you'll be using\nauthom.createServer({ /* facebook credentials */ })\nauthom.createServer({ /* github credentials */ })\nauthom.createServer({ /* google credentials */ })\nauthom.createServer({ /* foursquare credentials */ })\n// ... et cetera\n\nauthom.on(\"auth\", function(req, res, data) {\n  // called when a user is authenticated on any service\n})\n\nauthom.on(\"error\", function(req, res, data) {\n  // called when an error occurs during authentication\n})\n\nauthom.listen(server)\nserver.listen(8000)\n```\n\nSupported services\n------------------\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/37signals.ico\" style=\"vertical-align:middle\"> 37signals (by [nodebiscut](https://github.com/nodebiscut))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/facebook.ico\" style=\"vertical-align:middle\"> Facebook (by [jed](https://github.com/jed))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/foursquare.ico\" style=\"vertical-align:middle\"> Foursquare (by [nodebiscut](https://github.com/nodebiscut))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/github.ico\" style=\"vertical-align:middle\"> Github (by [jed](https://github.com/jed))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/google.ico\" style=\"vertical-align:middle\"> Google (by [jed](https://github.com/jed))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/gowalla.ico\" style=\"vertical-align:middle\"> Gowalla (by [jed](https://github.com/jed))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/instagram.ico\" style=\"vertical-align:middle\"> Instagram (by [jed](https://github.com/jed))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/soundcloud.ico\" style=\"vertical-align:middle\"> SoundCloud (by [jed](https://github.com/jed))\n\n<img src=\"https://github.com/jed/authom/raw/master/lib/assets/windowslive.ico\" style=\"vertical-align:middle\"> Windows Live (by [jed](https://github.com/jed))\n\nInstallation and Setup\n----------------------\n\nTo install, enter:\n\n    $ npm install authom\n\nTo see the demo, enter:\n\n    $ npm start authom\n\nAnd then head to http://authom.jedschmidt.com (which resolves to your local machine at `127.0.0.1`). `sudo` is needed to bind to port 80, as many providers do not allow callback URLs with a port or `localhost` as the host.\n\nFAQ\n---\n\n### How can I add my own service?\n\nSee **Extending authom** below.\n\n### Why not just use [everyauth](https://github.com/bnoguchi/everyauth)/[passport](https://github.com/jaredhanson/passport)? How is authom different?\n\nauthom aims to solve a smaller problem, more agnostically. It trades convenience for simplicity and flexibility. Here are some key differences:\n\n- authom was built for node, while everyauth was built for Express and Connect. everyauth aims for a much more ambitious integration, but at the expense of locking you into a particular stack. authom takes a more UNIX approach; since it doesn't handle logins, persistence, sessions, or anything past authentication, it is more of a tool and less of a framework.\n\n- authom uses native node.js conventions such as EventEmitters and objects, while everyauth uses promises and a chaining config API. This is of course subjective, but the authom API aims to be closer to the APIs of node.js itself.\n\n- authom works with node.js v0.6. (this was not true of everyauth at the time this library was written)\n\nAPI\n---\n\n### authom.createServer(options, [function(req, res){}])\n\nCreates an EventEmitter for the given authentication service. The service is specified by the `service` key of the `options` object, with all other keys differing based on the service. For example, `github` would be called like this:\n\n```javascript\nvar github = authom.createServer({\n  service: \"github\",\n  id: \"7e38d12b740a339b2d31\",\n  secret: \"116e41bd4cd160b7fae2fe8cc79c136a884928c3\",\n  scope: [\"gist\"]\n})\n```\n\nAn optional `name` member can also be passed to override that used for authom path matching. So if you had two Github apps, you could set them as `name: github1` and `name: github2`, so that they could be accessed as `/auth/github1` and `/auth/github2`.\n\nYou can listen for `auth` and `error` events by:\n\n- listening to a specific service for service-specific events, or\n- listening to `authom` for all service events\n\nFor example, use this to listen for events from Github, based on the code above:\n\n```javascript\ngithub.on(\"auth\", function(req, res, gitHubSpecificData){})\ngithub.on(\"error\", function(req, res, gitHubSpecificData){})\n```\n\nOr, use this to listen to events from all provders, since authom already listens and namespaces them for you:\n\n```javascript\nauthom.on(\"auth\", function(req, res, data){})\nauthom.on(\"error\", function(req, res, data){})\n```\n\n### authom.on(\"auth\", function(req, res, data){})\n\nListens for successful authentications across all services. The listener is called with the original request/response objects as well as a service-specific user object, allowing you to provide your own session scheme. The name of the service is given in the `service` key so that you can branch your own code:\n\n```javascript\nauthom.on(\"auth\", function(req, res, data) {\n  switch(data.service) {\n    case \"github\": ...\n    case \"google\": ...\n    .\n    .\n    .\n  }\n})\n```\n\n### authom.on(\"error\", function(req, res, data){})\n\nListens for failed authentications across all services. Like the `auth` event, the listener is called with the original request/response objects as well as an error object, allowing you to provide your own session scheme.\n\n### authom.listen(server)\n\nListens to an existing HTTP(S) server for `request` events. Like socket.io's `.listen` method, authom will intercept any request whose path starts with `/auth`.\n\n### authom.listener\n\nA standard node.js listener. This can be used for more control over the path at which authom is used. For example, the following two are equivalent:\n\n```javascript\n// socket.io-style\nvar server = require(\"http\").createServer()\n  , authom = require(\"authom\")\n\nserver.on(\"request\", function() {\n  /* your usual server logic */\n})\n\nauthom.listen(server)\nserver.listen(8000)\n```\n\n```javascript\n// route-style\nvar server = require(\"http\").createServer()\n  , authom = require(\"authom\")\n\nserver.on(\"request\", function(req, res) {\n  if (req.url.slice(5) == \"/auth\") authom.listener(req, res)\n\n  else {\n\t/* your usual server logic */\n  }\n})\n\nserver.listen(8000)\n```\n\n### authom.route\n\nA regular expression that is run on the pathname of every request. authom will only run if this expression is matched. By default, it is `/^\\/auth\\/([^\\/]+)\\/?$/`.\n\nProviders\n---------\n\n### Github ([create an app](https://github.com/account/applications/new))\n\nOptions:\n\n- `service`: \"github\"\n- `id`: the application's `Client ID`\n- `secret`: the application's `Secret`\n- `scope` (optional): the scopes requested by your application, as explained [here](http://developer.github.com/v3/oauth/#scopes).\n\nExample:\n\n```javascript\nvar github = authom.createServer({\n  service: \"github\",\n  id: \"7e38d12b740a339b2d31\",\n  secret: \"116e41bd4cd160b7fae2fe8cc79c136a884928c3\",\n  scope: [\"gist\"]\n})\n```\n\nMake sure that the callback URL used by your application has the same hostname and port as that specified for your application. If they are different, you will get `redirect_uri_mismatch` errors.\n\n### Google ([create an app](https://code.google.com/apis/console/))\n\nOptions:\n\n- `service`: \"google\"\n- `id`: the application's `Client ID`\n- `secret`: the application's `Client secret`\n- `scope` (optional): the scopes requested by your application\n\nExample:\n\n```javascript\nvar google = authom.createServer({\n  service: \"google\",\n  id: \"515913292583.apps.googleusercontent.com\",\n  secret: \"UAjUGd_MD9Bkho-kazmJ5Icm\",\n  scope: \"\"\n})\n```\n\nMake sure that the callback URL used by your application is identical to that specified for your application. With the default settings, you'll need a redirect URI of `http://<your-host>/auth/google`.\n\n### Facebook ([create an app](https://developers.facebook.com/apps))\n\nOptions:\n\n- `service`: \"facebook\"\n- `id`: the application's `App ID`\n- `secret`: the application's `App secret`\n- `scope` (optional): the scopes requested by your application\n\nExample:\n\n```javascript\nvar facebook = authom.createServer({\n  service: \"facebook\",\n  id: \"256546891060909\",\n  secret: \"e002572fb07423fa66fc38c25c9f49ad\",\n  scope: []\n})\n```\n\n### Foursquare ([create an app](https://foursquare.com/oauth/))\n\nOptions:\n\n- `service`: \"foursquare\"\n- `id`: the application's `CLIENT ID`\n- `secret`: the application's `CLIENT SECRET`\n\nExample:\n\n```javascript\nvar foursquare = authom.createServer({\n  service: \"foursquare\",\n  id: \"0DPGLE430Y2LFUCOSFXB0ACG3GGD5DNHH5335FLT4US1QDAZ\",\n  secret: \"WLNCAVFHCMQGVYOZTNOLPXW0XL2KN0DRD1APOA45SRGEZSGK\"\n})\n```\n\n### Instagram ([create an app](http://instagram.com/developer/client/register/))\n\nOptions:\n\n- `service`: \"instagram\"\n- `id`: the application's `CLIENT ID`\n- `secret`: the application's `CLIENT SECRET`\n- `scope` (optional): the scopes requested by your application\n\nExample:\n\n```javascript\nvar instagram = authom.createServer({\n  service: \"instagram\",\n  id: \"e55497d0ebc24289aba4e715f1ab7d2a\",\n  secret: \"a0e7064bfda64e57a46dcdba48378776\"\n})\n```\n### Gowalla ([create an app](http://gowalla.com/api/keys))\n\nOptions:\n\n- `service`: \"gowalla\"\n- `id`: the application's `API key`\n- `secret`: the application's `Secret key`\n\nExample:\n\n```javascript\nvar gowalla = authom.createServer({\n  service: \"gowalla\",\n  id: \"b8514b75c2674916b77c9a913783b9c2\",\n  secret: \"34f713fdd6b4488982328487f443bd6d\"\n})\n```\n\n### 37signals ([create an app](https://integrate.37signals.com/apps/))\n\nOptions:\n\n- `service`: \"37signals\"\n- `id`: the application's `Client ID`\n- `secret`: the application's `Client secret`\n\nExample:\n\n```javascript\nvar signals = authom.createServer({\n  service: \"37signals\",\n  id: \"c2098292571a03070eb12746353997fb8d6f0e00\",\n  secret: \"4cb7f46fa83f73ec99d37162b946522b9e7a4d5a\"\n})\n```\n\n### Soundcloud ([create an app](http://soundcloud.com/you/apps/new))\n\nOptions:\n\n- `service`: \"soundcloud\"\n- `id`: the application's `Client ID`\n- `secret`: the application's `Client Secret`\n\nExample:\n\n```javascript\nvar soundcloud = authom.createServer({\n  service: \"soundcloud\",\n  id: \"9e5e7b0a891b4a2b13aeae9e5b0c89bb\",\n  secret: \"2f4df63c8ff10f466685c305e87eba6f\"\n})\n```\n\n### Windows Live ([create an app](https://manage.dev.live.com/Applications/Index))\n\nOptions:\n\n- `service`: \"windowslive\"\n- `id`: the application's `Client ID`\n- `secret`: the application's `Client secret`\n- `scope`: the scope requested.\n\nExample:\n\n```javascript\nvar windowslive = authom.createServer({\n  service: \"windowslive\",\n  id: \"000000004C06BA3A\",\n  secret: \"2RsIhweMq6PxR8jc5CjTVoCqTvKZmctY\",\n  scope: \"wl.basic\"\n})\n```\n\nExtending authom\n-----------------\n\nTo add an authentication service provider, add a javascript file for the service at the path `/lib/services/<service-name>.js`. This file should `module.exports` a constructor that returns an EventEmitter that listens for `request` events, and emits `auth` and `error` events to itself.\n\n```javascript\nvar EventEmitter = require(\"events\").EventEmitter\n\nmodule.exports = function(options) {\n  var server = new EventEmitter\n\n  server.on(\"request\", function(req, res) {\n    // respond to the request, redirecting the user as needed\n\n    if (successful) {\n      // pass an object containing the service's user data\n      server.emit(\"auth\", req, res, obj)\n    }\n\n    else {\n      // pass an object containing an error message\n      server.emit(\"error\", req, res, obj)\n    }\n  })\n\n  return server\n}\n```\n\nTo make sure that your code can recieve subsequent HTTP(S) calls from the service, use the inbound `req.url` as the callback URL, using the querystring to disambiguate different stages of the authentication process. See `/lib/services/github.js` for an example implementation.\n\nOnce you're done, and have written tests, make sure you open a pull request so that the rest of us can benefit!\n\nLicense\n-------\n\nCopyright (c) 2011 Jed Schmidt, http://jed.is/\n \nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n \nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n \nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"jed","email":"tr@nslator.jp"}],"time":{"modified":"2012-08-10T05:04:42.135Z","created":"2011-11-17T06:58:51.526Z","0.1.6":"2011-11-17T06:58:56.374Z","0.2.0":"2011-11-17T06:59:43.978Z","0.2.1":"2011-11-19T02:15:37.756Z","0.2.2":"2012-01-15T07:24:41.331Z","0.3.0":"2012-01-16T10:20:28.624Z","0.3.1":"2012-03-20T05:22:31.982Z","0.4.0":"2012-04-26T07:59:02.373Z"},"author":{"name":"Jed Schmidt","email":"tr@nslator.jp","url":"http://jed.is"},"repository":{"type":"git","url":"git://github.com/jed/authom.git"},"users":{"stereosteve":true},"_attachments":{"authom-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-IpbMJL7+3EN55xIzk9hjDA==","length":17857,"stub":true},"authom-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-G7vxodV8NYqCox+n7R9K5g==","length":18602,"stub":true},"authom-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KR245Vj7VOdlK0NTVs1lRg==","length":17232,"stub":true},"authom-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Udo9MkiR43YSyzHX2J+IPA==","length":17004,"stub":true},"authom-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-z9QxOyZj06tmmRkRFRKxtg==","length":20480,"stub":true},"authom-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mhFYg1hMdkJTbxvPdkkMBQ==","length":20480,"stub":true},"authom-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qm4ToWwjVKXY1qA8yY/IeA==","length":20480,"stub":true}}}},
{"id":"authorization-server-client","key":"authorization-server-client","value":{"rev":"5-848ad1ce43c397c985149e96a392b8c0"},"doc":{"_id":"authorization-server-client","_rev":"5-848ad1ce43c397c985149e96a392b8c0","name":"authorization-server-client","description":"Client to access an authorization server for oauth2 token validation in a distributed environment.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Martin Wawrusch","email":"martin@wawrusch.com","url":"http://martinatsunset.com"},"name":"authorization-server-client","description":"Client to access an authorization server for oauth2 token validation in a distributed environment.","version":"0.0.1","main":"lib/index.js","repository":{"type":"git","url":"git://github.com/scottyapp/authorization-server-client.git"},"bin":{},"directories":{"lib":"./lib","test":"./test"},"keywords":["oauth2","distributed","security","client"],"scripts":{"watch":"coffee -c -w  -o lib src","test":"NODE_ENV=test node_modules/.bin/mocha --timeout 10000 -R spec test/*.coffee"},"engines":{"node":">=0.6.0"},"dependencies":{"request":"2.9.x","underscore":"1.3.x","pkginfo":"0.2.x"},"devDependencies":{"async":"0.1.x","should":"0.6.x","coffee-script":"1.2.x","mocha":"0.14.x","nock":"0.10.x"},"bugs":{"url":"http://github.com/scottyapp/authorization-server-client/issues"},"licenses":[{"type":"MIT","url":"http://github.com/scottyapp/authorization-server-client/raw/master/LICENSE"}],"_npmUser":{"name":"mwawrusch","email":"martin@wawrusch.com"},"_id":"authorization-server-client@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.8","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"34c03a831bd90a7b1ba040323b1bd2f1eb773ffd","tarball":"http://registry.npmjs.org/authorization-server-client/-/authorization-server-client-0.0.1.tgz"},"maintainers":[{"name":"mwawrusch","email":"martin@wawrusch.com"}]},"0.0.3":{"author":{"name":"Martin Wawrusch","email":"martin@wawrusch.com","url":"http://martinatsunset.com"},"name":"authorization-server-client","description":"Client to access an authorization server for oauth2 token validation in a distributed environment.","version":"0.0.3","main":"lib/index.js","repository":{"type":"git","url":"git://github.com/scottyapp/authorization-server-client.git"},"bin":{},"directories":{"lib":"./lib","test":"./test"},"keywords":["oauth2","distributed","security","client"],"scripts":{"watch":"coffee -c -w  -o lib src","test":"NODE_ENV=test node_modules/.bin/mocha --timeout 10000 -R spec test/*.coffee"},"engines":{"node":">=0.6.0"},"dependencies":{"request":"2.9.x","underscore":"1.3.x","pkginfo":"0.2.x"},"devDependencies":{"async":"0.1.x","should":"0.6.x","coffee-script":"1.2.x","mocha":"0.14.x","nock":"0.10.x"},"bugs":{"url":"http://github.com/scottyapp/authorization-server-client/issues"},"licenses":[{"type":"MIT","url":"http://github.com/scottyapp/authorization-server-client/raw/master/LICENSE"}],"_npmUser":{"name":"mwawrusch","email":"martin@wawrusch.com"},"_id":"authorization-server-client@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9a8454266c521a313649384678b5d2faef775ea3","tarball":"http://registry.npmjs.org/authorization-server-client/-/authorization-server-client-0.0.3.tgz"},"maintainers":[{"name":"mwawrusch","email":"martin@wawrusch.com"}]}},"readme":"## About authorization-server-client\n\nClient to access an authorization server for oauth2 token validation in a distributed environment.\n\nIn an oauth2 scenario it is quite likely that your authorization server is not the same as your\nresource server. In this case the resource server needs to be able to validate tokens against the\nauthorization server. There are several ways to do this. One is to use public/private key encrypted long token that contain all the relevant information as part of the token. This requires\nsharing keys between authorization server and resource server. While fast this suffers 2 drawbacks: Long tokens and the necessity to work with very short lived tokens.\n\nAnother approach is to have the resource server contact the authorization server and ask the \nauthorization server to validate a token. This is the path taken by this module, which implements the client side. An authorization server needs to implement an endpoint (for example /v1/token-infos/:token) that returns either a 404 (there is no valid token info for the token) or a 200 with the following format:\n\n\tactor:\n\t\tactorId (string uniquely identifying the actor)\n\t\t... additional actor information, optional\n\tscopes: [\"scope1\",...] (An array of scopes)\n\texpiresIn: 1234  (number of seconds this token is still valid)\n\n## NOTE\n\nCaching is not yet enabled.\n\n## Install\n\nnpm install authorization-server-client\n\n\n\n## Usage (Coffeescript)\n  \n\tauthorizationServerClient = require 'authorization-server-client'\n\tclient = authorizationServerClient.client \"https://yourauthorizationserver.com/v1/token-infos\",\n\t\t\t\t\t\tmaxTokenCache: 60 * 10 # Number of seconds a token is kept in a local cache. Keep this rather short.\n\t\t\n\t\t\n\tclient.validate tokenToValidate, (err,result) =>\n\t\t# err is set if something happened that was unexpected, including an unreachable client. \n\t\t# It is probably a good idea to return a 502 (bad gateway) if an err is present\n\t\t# If err is not set, then result contains the following:\n\t\t# isValid: true/false\n\t\t# if it is valid in addition \n\t\t# actor: \n\t\t#   actorId\n\t\t#   ...\n\t\t# expiresIn: 13324\n\t\t# scopes: []\n\n## Advertising :)\n\nCheck out \n\n* http://scottyapp.com\n\nFollow us on Twitter at \n\n* @getscottyapp\n* @martin_sunset\n\nand like us on Facebook please. Every mention is welcome and we follow back.\n\n\n## Release Notes\n\n\n### 0.0.1\n\n* First version\n\n## Internal Stuff\n\n* npm run-script watch\n\n## Publish new version\n\n* Change version in package.json\n* git tag -a v0.0.1 -m 'version 0.0.1'\n* git push --tags\n* npm publish\n\n## Contributing to authorization-server-client\n \n* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet\n* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it\n* Fork the project\n* Start a feature/bugfix branch\n* Commit and push until you are happy with your contribution\n* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.\n* Please try not to mess with the package.json, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.\n\n## Copyright\n\nCopyright (c) 2012 ScottyApp, Inc. See LICENSE for\nfurther details.\n\n\n","maintainers":[{"name":"mwawrusch","email":"martin@wawrusch.com"}],"time":{"modified":"2012-04-30T13:06:08.272Z","created":"2012-03-16T07:36:59.418Z","0.0.1":"2012-03-16T07:37:01.607Z","0.0.3":"2012-04-30T13:06:08.271Z"},"author":{"name":"Martin Wawrusch","email":"martin@wawrusch.com","url":"http://martinatsunset.com"},"repository":{"type":"git","url":"git://github.com/scottyapp/authorization-server-client.git"},"_attachments":{"authorization-server-client-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6HLcUr7TfXn2vcuet2fBig==","length":5744,"stub":true},"authorization-server-client-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TZn2UYNnuNtXB2ZCHmhlQg==","length":5889,"stub":true}}}},
{"id":"authors","key":"authors","value":{"rev":"9-94946ed7811e258f2c37504a7755aff6"},"doc":{"_id":"authors","_rev":"9-94946ed7811e258f2c37504a7755aff6","name":"authors","description":"print a markdown list of authors/contributors to your git repo, including github usernames","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"name":"authors","version":"0.0.0","description":"print a markdown list of authors/contributors to your git repo, including github usernames","main":"authors.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["github","git","authors","username","markdown","contributors","project"],"author":{"name":"David Trejo"},"license":"MIT","dependencies":{"github":"~0.1.3","request":"~2.9.203","ms":"~0.1.0","underscore":"~1.3.3","async":"~0.1.22"},"preferGlobal":true,"bin":{"authors":"./cli.js"},"_id":"authors@0.0.0","dist":{"shasum":"73319ae4ac8fe95b7d6a5c2968840128c5ae0da9","tarball":"http://registry.npmjs.org/authors/-/authors-0.0.0.tgz"},"readme":"","maintainers":[{"name":"dtrejo","email":"david.daniel.trejo@gmail.com"}],"directories":{}},"0.0.1":{"name":"authors","version":"0.0.1","description":"print a markdown list of authors/contributors to your git repo, including github usernames","main":"authors.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["github","git","authors","username","markdown","contributors","project"],"author":{"name":"David Trejo"},"license":"MIT","dependencies":{"github":"~0.1.3","request":"~2.9.203","ms":"~0.1.0","underscore":"~1.3.3","async":"~0.1.22"},"preferGlobal":true,"bin":{"authors":"./cli.js"},"devDependencies":{},"repository":{"type":"git","url":"git://github.com/DTrejo/node-authors.git"},"_id":"authors@0.0.1","dist":{"shasum":"a738c3ad87a3cb41768fd2760302bab785fa429e","tarball":"http://registry.npmjs.org/authors/-/authors-0.0.1.tgz"},"readme":"# authors\n\n## install\n    npm -g install authors\n\nPrints a markdown list of authors/contributors to your git repo, including\ngithub usernames. Uses node.js!\n\n## generate authors list\n```sh\n$ cd my-git-repo\n$ authors\nFetching 38 logins from github based on email/name...\n......................................\n## Contributors\nOrdered by date of first contribution.\n[Auto-generated](http://github.com/dtrejo/authors) on Sat Jul 07 2012 16:34:50 GMT-0700 (PDT).\n\n- [Matt Ranney aka `mranney`](https://github.com/mranney)\n- [Tim-Smart aka `tim-smart`](https://github.com/tim-smart)\n- [Tj Holowaychuk aka `visionmedia`](https://github.com/visionmedia)\n[...]\n```\n\n## Contributors\nOrdered by date of first contribution.\n[Auto-generated](http://github.com/dtrejo/node-authors) on Sat Jul 07 2012 16:54:45 GMT-0700 (PDT).\n\n- [David Trejo aka `DTrejo`](https://github.com/DTrejo)\n","maintainers":[{"name":"dtrejo","email":"david.daniel.trejo@gmail.com"}]}},"readme":"","maintainers":[{"name":"dtrejo","email":"david.daniel.trejo@gmail.com"}],"time":{"modified":"2012-07-08T00:01:24.334Z","created":"2012-07-07T23:42:54.487Z","0.0.0":"2012-07-07T23:42:56.149Z","0.0.1":"2012-07-08T00:01:24.334Z"},"author":{"name":"David Trejo"},"repository":{"type":"git","url":"git://github.com/DTrejo/node-authors.git"},"_attachments":{"authors-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lu0sk2/4wZKdafOOEOpFoQ==","length":2153,"stub":true},"authors-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Cn9v2DAA0rO3+OgnwM6HzQ==","length":1837,"stub":true}}}},
{"id":"authpack","key":"authpack","value":{"rev":"3-5b151d20074f8304efe00edfac6ac13e"},"doc":{"_id":"authpack","_rev":"3-5b151d20074f8304efe00edfac6ac13e","name":"authpack","description":"Package of distributed client and server OAuth2 API's","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"authpack","description":"Package of distributed client and server OAuth2 API's","version":"0.0.1","author":{"name":"Tolsma Telematica Consultancy","email":"code@tolsma.net"},"maintainers":[{"name":"stolsma","email":"npm@tolsma.net"}],"contributors":[{"name":"Sander Tolsma","email":"code@tolsma.net"}],"repository":{"type":"git","url":"git://github.com/stolsma/authpack.git"},"keywords":["distributed","oauth2","service","authorization","authentication","OpenID Connect"],"dependencies":{"qs":"0.3.2","request":"2.2.x >=2.2.9","serializer":">=0.0.2"},"devDependencies":{"director":"1.0.x >=1.0.6","union":"0.1.x >=0.1.4","vows":"0.5.x >=0.5.10"},"main":"./lib/authpack","bin":{},"scripts":{"test":"vows test/**/*-test.js --isolate --spec"},"engines":{"node":"0.4.x || 0.5.x || 0.6.x"},"_npmUser":{"name":"stolsma","email":"npm@tolsma.net"},"_id":"authpack@0.0.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"30b5b6a2966aead38da0f22e6614f5efca9dcfbe","tarball":"http://registry.npmjs.org/authpack/-/authpack-0.0.1.tgz"}}},"maintainers":[{"name":"stolsma","email":"npm@tolsma.net"}],"time":{"modified":"2011-12-10T08:07:30.090Z","created":"2011-12-10T08:07:28.421Z","0.0.1":"2011-12-10T08:07:30.090Z"},"author":{"name":"Tolsma Telematica Consultancy","email":"code@tolsma.net"},"repository":{"type":"git","url":"git://github.com/stolsma/authpack.git"},"_attachments":{"authpack-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KwPq2ffCPdL/gLZlAUJ3PA==","length":13910,"stub":true}}}},
{"id":"auto-grunt","key":"auto-grunt","value":{"rev":"3-170b1d69ff7e08d9383dba91d757ac48"},"doc":{"_id":"auto-grunt","_rev":"3-170b1d69ff7e08d9383dba91d757ac48","name":"auto-grunt","description":"A task-based command line build tool for JavaScript projects.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"auto-grunt","description":"A task-based command line build tool for JavaScript projects.","version":"0.0.1","author":{"name":"\"Cowboy\" Ben Alman","url":"http://benalman.com/"},"homepage":"http://github.com/cowboy/grunt","repository":{"type":"git","url":"git://github.com/cowboy/grunt.git"},"bugs":{"url":"http://github.com/cowboy/grunt/issues"},"licenses":[{"type":"MIT","url":"http://github.com/cowboy/grunt/blob/master/LICENSE-MIT"}],"main":"lib/grunt","bin":{"grunt":"bin/auto-grunt"},"scripts":{"test":"grunt test"},"engines":{"node":">= 0.6.0"},"preferGlobal":true,"keywords":["async","cli","minify","uglify","build","underscore","unit","test","qunit","nodeunit","server","init","scaffold","make","jake","tool"],"dependencies":{"cssom":"~0.2.5","async":"~0.1.18","colors":"~0.6.0","connect":"~2.3.4","dateformat":"1.0.2-1.2.3","iconv-lite":"~0.2.3","glob-whatev":"~0.1.4","hooker":"~0.2.3","jshint":"~0.5.9","nodeunit":"~0.6.4","nopt":"~1.0.10","prompt":"~0.1.12","clean-css":"~0.4.1","semver":"~1.0.13","uglify-js":"~1.0.7","underscore":"~1.2.4","underscore.string":"~2.1.1","temporary":"~0.0.4","gzip-js":"~0.3.1"},"devDependencies":{},"readme":"# grunt\nGrunt is a task-based command line build tool for JavaScript projects.\n\n_Grunt is currently in beta. While I'm already using it on multiple projects, it might have a minor issue or two. And things might change before its final release, based on your feedback. Please try it out in a project, and [make suggestions][issues] or [report bugs][issues]!_\n\n## Getting started <a name=\"getting-started\" href=\"#getting-started\" title=\"Link to this section\">⚑</a>\nBe sure to read the [getting started guide](/cowboy/grunt/blob/master/docs/getting_started.md), which is a complete guide to configuring grunt for your project. In addition, check out the [example gruntfiles](/cowboy/grunt/blob/master/docs/example_gruntfiles.md) which highlight a number of fairly common configurations.\n\n## Built-in tasks <a name=\"built-in-tasks\" href=\"#built-in-tasks\" title=\"Link to this section\">⚑</a>\nAs of now, grunt has the following predefined tasks that you can use in your project:\n\n* [concat](/cowboy/grunt/blob/master/docs/task_concat.md) - Concatenate files.\n* [init](/cowboy/grunt/blob/master/docs/task_init.md) - Generate project scaffolding from a predefined template.\n* [lint](/cowboy/grunt/blob/master/docs/task_lint.md) - Validate files with [JSHint][jshint].\n* [min](/cowboy/grunt/blob/master/docs/task_min.md) - Minify files with [UglifyJS][uglify].\n* [qunit](/cowboy/grunt/blob/master/docs/task_qunit.md) - Run [QUnit][qunit] unit tests in a headless [PhantomJS][phantom] instance.\n* [server](/cowboy/grunt/blob/master/docs/task_server.md) - Start a static web server.\n* test - Run unit tests with [nodeunit][nodeunit].\n* watch - Run predefined tasks whenever watched files change.\n\n_(More documentation forthcoming)_\n\n## Custom tasks <a name=\"custom-tasks\" href=\"#custom-tasks\" title=\"Link to this section\">⚑</a>\nIn addition to the built-in tasks, you can create your own tasks. Don't like a built-in task's default behavior? Override it. Check out the [grunt API documentation](/cowboy/grunt/blob/master/docs/api.md) and the [built-in tasks source](/cowboy/grunt/blob/master/tasks) for everything you need to know about creating custom tasks.\n\n## Documentation <a name=\"documentation\" href=\"#documentation\" title=\"Link to this section\">⚑</a>\nTake a look at the [documentation table of contents][docs] for all the things.\n\n## Why does grunt exist? <a name=\"why-does-grunt-exist\" href=\"#why-does-grunt-exist\" title=\"Link to this section\">⚑</a>\nDoing all this stuff manually is a total pain, and building all this stuff into a gigantic Makefile / Jakefile / Cakefile / Rakefile / ?akefile that's maintained across all my projects was also becoming a total pain. Since I always found myself performing the same tasks over and over again, for every project, it made sense to build a task-based build tool.\n\nBeing primarily a JavaScript developer, I decided to use [Node.js][node] and [npm][npm] because the dependencies I most care about ([JSHint][jshint] and [UglifyJS][uglify]) were already npm modules. That being said, while Node.js was designed to support highly-concurrent asynchronous-IO-driven web servers, it was clearly NOT designed to make command-line build tools. But none of that matters, because grunt works. Just install it and see.\n\n## Installing grunt <a name=\"installing-grunt\" href=\"#installing-grunt\" title=\"Link to this section\">⚑</a>\n\nGrunt is available as an [npm][npm] module. If you install grunt globally via `npm install -g grunt`, it will be available for use in all of your projects. Once grunt has been installed, you can type `grunt --help` at the command line for more information. And if you want to see grunt \"grunt\" itself, cd into grunt's directory and type `grunt`\n\n_Note: in Windows, you may need to run grunt as `grunt.cmd`. See the [FAQ](/cowboy/grunt/blob/master/docs/faq.md) for more Windows-specific information._\n\nFor projects already using grunt, you're done. Otherwise, if you're adding grunt to an existing project or starting from scratch, check out the [getting started guide](/cowboy/grunt/blob/master/docs/getting_started.md), which is a complete guide to configuring grunt for your project.\n\n## Release History <a name=\"release-history\" href=\"#release-history\" title=\"Link to this section\">⚑</a>\n_(Until v1.0.0, this will only be updated when major or breaking changes are made)_\n\n* 2012/06/25 - v0.3.10 - Updating a few dependencies to work with node 0.8.x (0.6.x should still work).\n* 2012/04/18 - v0.3.9 - The min task (via the uglify helper) now appends a semicolon to the end of the generated source.\n* 2012/04/06 - v0.3.8 - Init template tweaks. Anchor links added to docs, along with grunt-internal docs task to generate them. The watch task now supports multiple targets with separate wildcards and tasks. Locally-installed grunt will override global grunt even when run from global \"grunt\" script.\n* 2012/04/01 - v0.3.7 - Tweaked the behavior of the init template `exports.warnOn` property and added more init template documentation. Fixed duplicate PhantomJS debug output in qunit task. Added useful nodeunit and qunit comments into init template generated test .js files.\n* 2012/03/28 - v0.3.6 - Fixed a `--help` screen issue, a few grunt plugin related issues, and attempted to improve the overall grunt plugin docs and API.\n* 2012/03/27 - v0.3.5 - Fixed a handful of weird Windows issues. Changed default m/d/yyyy dates to yyyy-mm-dd ISO 8601. Fixed some init task bugs, docs errata, and added a lot more content to the init task docs.\n* 2012/03/26 - v0.3.3 - Added a \"gruntfile\" init template. Create a basic gruntfile in seconds with `grunt init:gruntfile`. A few other minor fixes.\n* 2012/03/25 - v0.3.2 - Init tasks can now specify a file matching wildcard for the initial \"files exist\" warning. The jQuery init template now has jQuery 1.7.2. Fixed a bug in the `task.expand*` methods.\n* 2012/03/25 - v0.3.1 - Added a few methods. Substantially reworked the init task and templates.\n* 2012/03/23 - v0.3.0 - Too many changes to list. But in brief: completely reorganized the API, removed all globals, added docs and examples for nearly everything, built a preliminary plugin system (that still needs to be tested). PLEASE RTFM OK? THX U.\n* 2012/02/03 - v0.2.14 - Added a server task (which starts a static webserver for your tasks). The qunit task now uses PhantomJS instead of Zombie.js (4768 of 4971 jQuery unit test pass, neat), and supports both file wildcards as well as http:// or https:// urls. (static webserver, anyone?). Grunt should no longer \"hang\" when done.\n* 2012/01/29 - v0.2.5 - Added a \"qunit\" task as well as an init \"jquery\" template (as of now, there are also \"node\" and \"commonjs\" init templates).\n* 2012/01/22 - v0.2.1 - Removed handlebars, templates are universally handled by underscore now. Changed init task template tags from <% %> to {% %}. Banners beginning with /*! will no longer be stripped.\n* 2012/01/22 - v0.2.0 - Added \"init\" task with a sample template, reworked a lot of code. Hopefully it's backwards-compatible.\n* 2012/01/11 - v0.1.0 - Initial release.\n\n## License <a name=\"license\" href=\"#license\" title=\"Link to this section\">⚑</a>\nCopyright (c) 2012 \"Cowboy\" Ben Alman  \nLicensed under the MIT license.  \n<http://benalman.com/about/license/>\n\n\n[docs]: /cowboy/grunt/blob/master/docs/toc.md\n[docs-init]: /cowboy/grunt/blob/master/docs/task_init.md\n[issues]: /cowboy/grunt/issues\n\n[node]: http://nodejs.org/\n[npm]: http://npmjs.org/\n[jshint]: http://www.jshint.com/\n[uglify]: https://github.com/mishoo/UglifyJS/\n[nodeunit]: https://github.com/caolan/nodeunit\n[qunit]: http://docs.jquery.com/QUnit\n[phantom]: http://www.phantomjs.org/\n","_id":"auto-grunt@0.0.1","dist":{"shasum":"d03c41980c5eb713e4edeea153d7deb8729e0b06","tarball":"http://registry.npmjs.org/auto-grunt/-/auto-grunt-0.0.1.tgz"},"_from":"grunt","maintainers":[{"name":"mozhuoying","email":"love149692@163.com"}]}},"readme":"# grunt\nGrunt is a task-based command line build tool for JavaScript projects.\n\n_Grunt is currently in beta. While I'm already using it on multiple projects, it might have a minor issue or two. And things might change before its final release, based on your feedback. Please try it out in a project, and [make suggestions][issues] or [report bugs][issues]!_\n\n## Getting started <a name=\"getting-started\" href=\"#getting-started\" title=\"Link to this section\">⚑</a>\nBe sure to read the [getting started guide](/cowboy/grunt/blob/master/docs/getting_started.md), which is a complete guide to configuring grunt for your project. In addition, check out the [example gruntfiles](/cowboy/grunt/blob/master/docs/example_gruntfiles.md) which highlight a number of fairly common configurations.\n\n## Built-in tasks <a name=\"built-in-tasks\" href=\"#built-in-tasks\" title=\"Link to this section\">⚑</a>\nAs of now, grunt has the following predefined tasks that you can use in your project:\n\n* [concat](/cowboy/grunt/blob/master/docs/task_concat.md) - Concatenate files.\n* [init](/cowboy/grunt/blob/master/docs/task_init.md) - Generate project scaffolding from a predefined template.\n* [lint](/cowboy/grunt/blob/master/docs/task_lint.md) - Validate files with [JSHint][jshint].\n* [min](/cowboy/grunt/blob/master/docs/task_min.md) - Minify files with [UglifyJS][uglify].\n* [qunit](/cowboy/grunt/blob/master/docs/task_qunit.md) - Run [QUnit][qunit] unit tests in a headless [PhantomJS][phantom] instance.\n* [server](/cowboy/grunt/blob/master/docs/task_server.md) - Start a static web server.\n* test - Run unit tests with [nodeunit][nodeunit].\n* watch - Run predefined tasks whenever watched files change.\n\n_(More documentation forthcoming)_\n\n## Custom tasks <a name=\"custom-tasks\" href=\"#custom-tasks\" title=\"Link to this section\">⚑</a>\nIn addition to the built-in tasks, you can create your own tasks. Don't like a built-in task's default behavior? Override it. Check out the [grunt API documentation](/cowboy/grunt/blob/master/docs/api.md) and the [built-in tasks source](/cowboy/grunt/blob/master/tasks) for everything you need to know about creating custom tasks.\n\n## Documentation <a name=\"documentation\" href=\"#documentation\" title=\"Link to this section\">⚑</a>\nTake a look at the [documentation table of contents][docs] for all the things.\n\n## Why does grunt exist? <a name=\"why-does-grunt-exist\" href=\"#why-does-grunt-exist\" title=\"Link to this section\">⚑</a>\nDoing all this stuff manually is a total pain, and building all this stuff into a gigantic Makefile / Jakefile / Cakefile / Rakefile / ?akefile that's maintained across all my projects was also becoming a total pain. Since I always found myself performing the same tasks over and over again, for every project, it made sense to build a task-based build tool.\n\nBeing primarily a JavaScript developer, I decided to use [Node.js][node] and [npm][npm] because the dependencies I most care about ([JSHint][jshint] and [UglifyJS][uglify]) were already npm modules. That being said, while Node.js was designed to support highly-concurrent asynchronous-IO-driven web servers, it was clearly NOT designed to make command-line build tools. But none of that matters, because grunt works. Just install it and see.\n\n## Installing grunt <a name=\"installing-grunt\" href=\"#installing-grunt\" title=\"Link to this section\">⚑</a>\n\nGrunt is available as an [npm][npm] module. If you install grunt globally via `npm install -g grunt`, it will be available for use in all of your projects. Once grunt has been installed, you can type `grunt --help` at the command line for more information. And if you want to see grunt \"grunt\" itself, cd into grunt's directory and type `grunt`\n\n_Note: in Windows, you may need to run grunt as `grunt.cmd`. See the [FAQ](/cowboy/grunt/blob/master/docs/faq.md) for more Windows-specific information._\n\nFor projects already using grunt, you're done. Otherwise, if you're adding grunt to an existing project or starting from scratch, check out the [getting started guide](/cowboy/grunt/blob/master/docs/getting_started.md), which is a complete guide to configuring grunt for your project.\n\n## Release History <a name=\"release-history\" href=\"#release-history\" title=\"Link to this section\">⚑</a>\n_(Until v1.0.0, this will only be updated when major or breaking changes are made)_\n\n* 2012/06/25 - v0.3.10 - Updating a few dependencies to work with node 0.8.x (0.6.x should still work).\n* 2012/04/18 - v0.3.9 - The min task (via the uglify helper) now appends a semicolon to the end of the generated source.\n* 2012/04/06 - v0.3.8 - Init template tweaks. Anchor links added to docs, along with grunt-internal docs task to generate them. The watch task now supports multiple targets with separate wildcards and tasks. Locally-installed grunt will override global grunt even when run from global \"grunt\" script.\n* 2012/04/01 - v0.3.7 - Tweaked the behavior of the init template `exports.warnOn` property and added more init template documentation. Fixed duplicate PhantomJS debug output in qunit task. Added useful nodeunit and qunit comments into init template generated test .js files.\n* 2012/03/28 - v0.3.6 - Fixed a `--help` screen issue, a few grunt plugin related issues, and attempted to improve the overall grunt plugin docs and API.\n* 2012/03/27 - v0.3.5 - Fixed a handful of weird Windows issues. Changed default m/d/yyyy dates to yyyy-mm-dd ISO 8601. Fixed some init task bugs, docs errata, and added a lot more content to the init task docs.\n* 2012/03/26 - v0.3.3 - Added a \"gruntfile\" init template. Create a basic gruntfile in seconds with `grunt init:gruntfile`. A few other minor fixes.\n* 2012/03/25 - v0.3.2 - Init tasks can now specify a file matching wildcard for the initial \"files exist\" warning. The jQuery init template now has jQuery 1.7.2. Fixed a bug in the `task.expand*` methods.\n* 2012/03/25 - v0.3.1 - Added a few methods. Substantially reworked the init task and templates.\n* 2012/03/23 - v0.3.0 - Too many changes to list. But in brief: completely reorganized the API, removed all globals, added docs and examples for nearly everything, built a preliminary plugin system (that still needs to be tested). PLEASE RTFM OK? THX U.\n* 2012/02/03 - v0.2.14 - Added a server task (which starts a static webserver for your tasks). The qunit task now uses PhantomJS instead of Zombie.js (4768 of 4971 jQuery unit test pass, neat), and supports both file wildcards as well as http:// or https:// urls. (static webserver, anyone?). Grunt should no longer \"hang\" when done.\n* 2012/01/29 - v0.2.5 - Added a \"qunit\" task as well as an init \"jquery\" template (as of now, there are also \"node\" and \"commonjs\" init templates).\n* 2012/01/22 - v0.2.1 - Removed handlebars, templates are universally handled by underscore now. Changed init task template tags from <% %> to {% %}. Banners beginning with /*! will no longer be stripped.\n* 2012/01/22 - v0.2.0 - Added \"init\" task with a sample template, reworked a lot of code. Hopefully it's backwards-compatible.\n* 2012/01/11 - v0.1.0 - Initial release.\n\n## License <a name=\"license\" href=\"#license\" title=\"Link to this section\">⚑</a>\nCopyright (c) 2012 \"Cowboy\" Ben Alman  \nLicensed under the MIT license.  \n<http://benalman.com/about/license/>\n\n\n[docs]: /cowboy/grunt/blob/master/docs/toc.md\n[docs-init]: /cowboy/grunt/blob/master/docs/task_init.md\n[issues]: /cowboy/grunt/issues\n\n[node]: http://nodejs.org/\n[npm]: http://npmjs.org/\n[jshint]: http://www.jshint.com/\n[uglify]: https://github.com/mishoo/UglifyJS/\n[nodeunit]: https://github.com/caolan/nodeunit\n[qunit]: http://docs.jquery.com/QUnit\n[phantom]: http://www.phantomjs.org/\n","maintainers":[{"name":"mozhuoying","email":"love149692@163.com"}],"time":{"modified":"2012-08-15T05:30:17.465Z","created":"2012-08-15T05:30:08.913Z","0.0.1":"2012-08-15T05:30:17.465Z"},"author":{"name":"\"Cowboy\" Ben Alman","url":"http://benalman.com/"},"repository":{"type":"git","url":"git://github.com/cowboy/grunt.git"},"_attachments":{"auto-grunt-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bnUMo9mm5w29f6xvzxLD9A==","length":215750,"stub":true}}}},
{"id":"auto-qunit","key":"auto-qunit","value":{"rev":"37-5f3e57af3dc613a60b9bcf44c68b377b"},"doc":{"_id":"auto-qunit","_rev":"37-5f3e57af3dc613a60b9bcf44c68b377b","name":"auto-qunit","description":"Automatically run QUnit tests in browser under NodeJS control","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"auto-qunit","version":"0.1.0","author":{"name":"Jacek Pospychala","email":"jacek.pospychala@gmail.com"},"description":"Automatically run QUnit tests in browser under NodeJS control","bin":{"http-server":"./bin/http-server"},"main":"./autoqunit.js","repository":{"type":"git","url":"git@github.com:jpospychala/node-auto-qunit.git"},"keywords":["qunit","browser","test","auto"],"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"jacek.p","email":"jacek.pospychala@gmail.com"},"_id":"auto-qunit@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"7dfba91b006c78c31acbc1d3d08cd832f0ea7da3","tarball":"http://registry.npmjs.org/auto-qunit/-/auto-qunit-0.1.0.tgz"},"readme":"","maintainers":[{"name":"jacek.p","email":"jacek.pospychala@gmail.com"}],"directories":{}},"0.1.1":{"name":"auto-qunit","version":"0.1.1","author":{"name":"Jacek Pospychala","email":"jacek.pospychala@gmail.com"},"description":"Automatically run QUnit tests in browser under NodeJS control","main":"./autoqunit.js","repository":{"type":"git","url":"git@github.com:jpospychala/node-auto-qunit.git"},"keywords":["qunit","browser","test","auto"],"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"jacek.p","email":"jacek.pospychala@gmail.com"},"_id":"auto-qunit@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"8a39b18030bdc099293a76552c46a6b788a3acb5","tarball":"http://registry.npmjs.org/auto-qunit/-/auto-qunit-0.1.1.tgz"},"readme":"","maintainers":[{"name":"jacek.p","email":"jacek.pospychala@gmail.com"}]}},"readme":"","maintainers":[{"name":"jacek.p","email":"jacek.pospychala@gmail.com"}],"time":{"modified":"2012-03-09T22:42:29.615Z","created":"2012-03-09T09:34:11.016Z","0.1.0":"2012-03-09T09:34:12.797Z","0.1.1":"2012-03-09T22:42:29.615Z","0.1.2":"2012-03-09T22:03:32.995Z"},"author":{"name":"Jacek Pospychala","email":"jacek.pospychala@gmail.com"},"repository":{"type":"git","url":"git@github.com:jpospychala/node-auto-qunit.git"},"_attachments":{"auto-qunit-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-yWYOs5T90tSaAyW1wx75iw==","length":2809,"stub":true},"auto-qunit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ivlSDYBcrbyzflxhT6aW5A==","length":5044,"stub":true}}}},
{"id":"auto-reload-brunch","key":"auto-reload-brunch","value":{"rev":"9-5ea97a7e21320988f1c65384aedadf8d"},"doc":{"_id":"auto-reload-brunch","_rev":"9-5ea97a7e21320988f1c65384aedadf8d","name":"auto-reload-brunch","description":"Adds automatic browser reloading support to brunch.","dist-tags":{"latest":"1.3.2"},"versions":{"1.2.0":{"name":"auto-reload-brunch","version":"1.2.0","description":"Adds automatic browser reloading support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/auto-reload-brunch","repository":{"type":"git","url":"git@github.com:brunch/auto-reload-brunch.git"},"main":"./lib/index","scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.2.0","ws":"0.4.14"},"devDependencies":{"mocha":"0.12.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"auto-reload-brunch@1.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9edc9c1b8b95bc07c753177572362f6c8e570bce","tarball":"http://registry.npmjs.org/auto-reload-brunch/-/auto-reload-brunch-1.2.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.0":{"name":"auto-reload-brunch","version":"1.3.0","description":"Adds automatic browser reloading support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/auto-reload-brunch","repository":{"type":"git","url":"git@github.com:brunch/auto-reload-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","ws":"0.4.14"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## auto-reload-brunch\nAdds automatic browser reloading support to\n[brunch](http://brunch.io).\n\nThe plugin uses WebSocket technology to pass `compile` events to browser.\n\n## Usage\nAdd `\"auto-reload-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"auto-reload-brunch\": \"git+ssh://git@github.com:brunch/auto-reload-brunch.git\"`.\n\nBecause auto reload is often used only for html / style development\n(because for scripts it would most of the time be quite annoying),\nby default plugin is disabled. You can enable it by adding a simple script\nto your page.\n\n\n\t<script>\n  \t\twindow.brunch = window.brunch || {};\n  \t\twindow.brunch['auto-reload'] = {enabled: true};\n\t</script>\n\n**Note:** this snippet must be added **before** the other scripts on the page.","_id":"auto-reload-brunch@1.3.0","dist":{"shasum":"a1947de4976f11c37cb61044d260aa71210d701b","tarball":"http://registry.npmjs.org/auto-reload-brunch/-/auto-reload-brunch-1.3.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.1":{"name":"auto-reload-brunch","version":"1.3.1","description":"Adds automatic browser reloading support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/auto-reload-brunch","repository":{"type":"git","url":"git@github.com:brunch/auto-reload-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","ws":"0.4.14"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## auto-reload-brunch\nAdds automatic browser reloading support to\n[brunch](http://brunch.io).\n\nThe plugin uses WebSocket technology to pass `compile` events to browser.\n\n## Usage\nAdd `\"auto-reload-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"auto-reload-brunch\": \"git+ssh://git@github.com:brunch/auto-reload-brunch.git\"`.\n\nBecause auto reload is often used only for html / style development\n(because for scripts it would most of the time be quite annoying),\nby default plugin is disabled. You can enable it by adding a simple script\nto your page.\n\n\n\t<script>\n  \t\twindow.brunch = window.brunch || {};\n  \t\twindow.brunch['auto-reload'] = {enabled: true};\n\t</script>\n\n**Note:** this snippet must be added **before** the other scripts on the page.","_id":"auto-reload-brunch@1.3.1","dist":{"shasum":"d2158a1fd07ef7ab4e0f2e40c13e6ca25249e003","tarball":"http://registry.npmjs.org/auto-reload-brunch/-/auto-reload-brunch-1.3.1.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"1.3.2":{"name":"auto-reload-brunch","version":"1.3.2","description":"Adds automatic browser reloading support to brunch.","author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"homepage":"https://github.com/brunch/auto-reload-brunch","repository":{"type":"git","url":"git@github.com:brunch/auto-reload-brunch.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.3","ws":"0.4.20"},"devDependencies":{"mocha":"1.2.2","chai":"1.1.0"},"readme":"## auto-reload-brunch\nAdds automatic browser reloading support to\n[brunch](http://brunch.io).\n\nThe plugin uses WebSocket technology to pass `compile` events to browser.\n\n## Usage\nAdd `\"auto-reload-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"auto-reload-brunch\": \"git+ssh://git@github.com:brunch/auto-reload-brunch.git\"`.\n\nBecause auto reload is often used only for html / style development\n(because for scripts it would most of the time be quite annoying),\nby default plugin is disabled. You can enable it by adding a simple script\nto your page **before the other scripts on the page**.\n\n    <script>\n      window.brunch = window.brunch || {};\n      window.brunch['auto-reload'] = {enabled: true};\n    </script>\n","_id":"auto-reload-brunch@1.3.2","dist":{"shasum":"dae7e87104cbd253b10f94896967377d9aedf2af","tarball":"http://registry.npmjs.org/auto-reload-brunch/-/auto-reload-brunch-1.3.2.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]}},"readme":"## auto-reload-brunch\nAdds automatic browser reloading support to\n[brunch](http://brunch.io).\n\nThe plugin uses WebSocket technology to pass `compile` events to browser.\n\n## Usage\nAdd `\"auto-reload-brunch\": \"x.y.z\"` to `package.json` of your brunch app.\n\nPick a plugin version that corresponds to your minor (y) brunch version.\n\nIf you want to use git version of plugin, add\n`\"auto-reload-brunch\": \"git+ssh://git@github.com:brunch/auto-reload-brunch.git\"`.\n\nBecause auto reload is often used only for html / style development\n(because for scripts it would most of the time be quite annoying),\nby default plugin is disabled. You can enable it by adding a simple script\nto your page.\n\n```\n<script>\n  window.brunch = window.brunch || {};\n  window.brunch['auto-reload'] = {enabled: true};\n</script>\n```\n","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-07-15T17:02:40.441Z","created":"2012-05-18T19:11:59.837Z","1.2.0":"2012-05-18T19:12:01.684Z","1.3.0":"2012-07-07T02:05:12.673Z","1.3.1":"2012-07-07T02:17:46.966Z","1.3.2":"2012-07-15T17:02:40.441Z"},"author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"repository":{"type":"git","url":"git@github.com:brunch/auto-reload-brunch.git"},"_attachments":{"auto-reload-brunch-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-krdq2+4/LNh+SD5bR2Mpzg==","length":3095,"stub":true},"auto-reload-brunch-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sW4/OeYGJI6Mdmr9Ia3/7g==","length":3096,"stub":true},"auto-reload-brunch-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HuuAc3GwZ/P5RH6JzR/q5w==","length":3032,"stub":true},"auto-reload-brunch-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SIiyTDxeEM4Q5U88Z9bgrg==","length":2084,"stub":true}}}},
{"id":"auto-share","key":"auto-share","value":{"rev":"15-d3b07e9db25d8836c145bb38a7e3bfe8"},"doc":{"_id":"auto-share","_rev":"15-d3b07e9db25d8836c145bb38a7e3bfe8","name":"auto-share","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"auto-share","version":"0.0.1","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"fcc7570881ccb2a5744e5d59da410087606fc585","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.1.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]},"0.0.2":{"name":"auto-share","version":"0.0.2","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c5386ffc1e846ef6d9bcf3569d04adf3dbd30c1e","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.2.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]},"0.0.3":{"name":"auto-share","version":"0.0.3","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"89d8bdcbe6ba0874d1edc17e9c438f2ba1f7caab","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.3.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]},"0.0.4":{"name":"auto-share","version":"0.0.4","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a6fcc17507da24a96feddde5ea4e7f7134562352","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.4.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]},"0.0.5":{"name":"auto-share","version":"0.0.5","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"46480e5043fc8418ccdd99cd501692c9b29e1419","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.5.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]},"0.0.6":{"name":"auto-share","version":"0.0.6","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b9bcf507a61ee990ba1fd3dde639a997e8a03e92","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.6.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]},"0.0.7":{"name":"auto-share","version":"0.0.7","dependencies":{"express":"*","socket.io":"*","mongoose":"*","xmlrpc":"*"},"main":"index","_npmUser":{"name":"Tim","email":"price.timmy@gmail.com"},"_id":"auto-share@0.0.7","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"75110ec946c69ac505e5de73d1b5ba3856c9e4ba","tarball":"http://registry.npmjs.org/auto-share/-/auto-share-0.0.7.tgz"},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}]}},"readme":"","maintainers":[{"name":"Tim","email":"price.timmy@gmail.com"}],"time":{"modified":"2012-04-14T07:28:47.400Z","created":"2012-04-14T06:44:48.910Z","0.0.1":"2012-04-14T06:44:50.253Z","0.0.2":"2012-04-14T06:49:20.625Z","0.0.3":"2012-04-14T07:12:25.987Z","0.0.4":"2012-04-14T07:14:29.267Z","0.0.5":"2012-04-14T07:19:23.824Z","0.0.6":"2012-04-14T07:24:33.963Z","0.0.7":"2012-04-14T07:28:47.400Z"},"_attachments":{"auto-share-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-03bgRQJniSH+b6lNLMT/+g==","length":98172,"stub":true},"auto-share-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Dz0Mlygr0h9Eo2G+h1keGg==","length":98165,"stub":true},"auto-share-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-j6scx93XzaVN+2zVr4B4Cg==","length":98164,"stub":true},"auto-share-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-iY0qqMKhuIVisHRurwVKjQ==","length":98152,"stub":true},"auto-share-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qHFS+cURAY8jJ3THL3vZyQ==","length":98140,"stub":true},"auto-share-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3V9SfZeAFObNZBtf4qT/3A==","length":98132,"stub":true},"auto-share-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OpjmvlKhJZGaiPNW3aRoGQ==","length":98147,"stub":true}}}},
{"id":"auto_npm","key":"auto_npm","value":{"rev":"12-460017e0f91fec62a3aaf35688e435af"},"doc":{"_id":"auto_npm","_rev":"12-460017e0f91fec62a3aaf35688e435af","name":"auto_npm","description":"Automatically updated NPM packages when you submit a commit that updates the version number in `package.json`","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"auto_npm","description":"Automatically updated NPM packages when you submit a commit that updates the version number in `package.json`","keywords":["git","commit","auto","update","version","control"],"version":"0.0.2","author":{"name":"Larz Conwell","email":"larzconwell@gmail.com"},"bin":{"auto_npm":"./bin/auto_npm.js"},"main":"./lib/auto_npm.js","repository":{"type":"git","url":"git://github.com/larzconwell/auto-npm.git"},"preferGlobal":true,"engines":{"node":"*"},"_npmUser":{"name":"larzconwell","email":"larzconwell@gmail.com"},"_id":"auto_npm@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8985099659abdc77acb51bf14f781d6ab14165a4","tarball":"http://registry.npmjs.org/auto_npm/-/auto_npm-0.0.2.tgz"},"maintainers":[{"name":"larzconwell","email":"larzconwell@gmail.com"}]},"0.0.3":{"name":"auto_npm","description":"Automatically updated NPM packages when you submit a commit that updates the version number in `package.json`","keywords":["git","commit","auto","update","version","control"],"version":"0.0.3","author":{"name":"Larz Conwell","email":"larzconwell@gmail.com"},"bin":{"auto_npm":"./bin/auto_npm.js"},"main":"./lib/auto_npm.js","repository":{"type":"git","url":"git://github.com/larzconwell/auto-npm.git"},"preferGlobal":true,"engines":{"node":"*"},"_npmUser":{"name":"larzconwell","email":"larzconwell@gmail.com"},"_id":"auto_npm@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b7ecc153e71017fc41fca03a3ab7cbd3d2247caf","tarball":"http://registry.npmjs.org/auto_npm/-/auto_npm-0.0.3.tgz"},"maintainers":[{"name":"larzconwell","email":"larzconwell@gmail.com"}]},"0.0.4":{"name":"auto_npm","description":"Automatically updated NPM packages when you submit a commit that updates the version number in `package.json`","keywords":["git","commit","auto","update","version","control"],"version":"0.0.4","author":{"name":"Larz Conwell","email":"larzconwell@gmail.com"},"bin":{"auto_npm":"./bin/auto_npm.js"},"main":"./lib/auto_npm.js","repository":{"type":"git","url":"git://github.com/larzconwell/auto-npm.git"},"preferGlobal":true,"engines":{"node":"*"},"_npmUser":{"name":"larzconwell","email":"larzconwell@gmail.com"},"_id":"auto_npm@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d427278322dd757ee6d64f32826df103053c2636","tarball":"http://registry.npmjs.org/auto_npm/-/auto_npm-0.0.4.tgz"},"maintainers":[{"name":"larzconwell","email":"larzconwell@gmail.com"}]},"0.0.5":{"name":"auto_npm","description":"Automatically updated NPM packages when you submit a commit that updates the version number in `package.json`","keywords":["git","commit","auto","update","version","control"],"version":"0.0.5","author":{"name":"Larz Conwell","email":"larzconwell@gmail.com"},"bin":{"auto_npm":"./bin/auto_npm.js"},"main":"./lib/auto_npm.js","repository":{"type":"git","url":"git://github.com/larzconwell/auto-npm.git"},"preferGlobal":true,"engines":{"node":"*"},"_npmUser":{"name":"larzconwell","email":"larzconwell@gmail.com"},"_id":"auto_npm@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e78a36e7c288deaf15ea812aafc49fe08b9c71e0","tarball":"http://registry.npmjs.org/auto_npm/-/auto_npm-0.0.5.tgz"},"maintainers":[{"name":"larzconwell","email":"larzconwell@gmail.com"}]},"0.0.6":{"name":"auto_npm","description":"Automatically updated NPM packages when you submit a commit that updates the version number in `package.json`","keywords":["git","commit","auto","update","version","control"],"version":"0.0.6","author":{"name":"Larz Conwell","email":"larzconwell@gmail.com"},"bin":{"auto_npm":"./bin/auto_npm.js"},"main":"./lib/auto_npm.js","repository":{"type":"git","url":"git://github.com/larzconwell/auto_npm.git"},"preferGlobal":true,"engines":{"node":"*"},"readme":"Auto NPM\r\n--------\r\n\r\nAutomatically update a NPM package when you make a commit that changes the version number in `package.json`\r\n\r\n####Arguments\r\n- `--enable` or `-e` Enable Auto NPM in a git repo\r\n- `--disable` or `-d` Disable Auto NPM in a git repo\r\n- `--force` or `-f` Force Auto NPM to rewrite any exists Git hooks that we need\r\n- `--update` or `-u` Updated the NPM package for the current repo\r\n- `--help` or `-h` Display the help dialog\r\n\r\n\r\n_Note_: There hasn't been much success using `git commit -a`, but `git commit -m` works fine.\r\n","_id":"auto_npm@0.0.6","dist":{"shasum":"2c93b4996432a6c7ee7eb0ad97e55593b8a39671","tarball":"http://registry.npmjs.org/auto_npm/-/auto_npm-0.0.6.tgz"},"maintainers":[{"name":"larzconwell","email":"larzconwell@gmail.com"}]}},"readme":"Auto NPM\n--------\n\nAutomatically update a NPM package when you make a commit that changes the version number in `package.json`\n\n####Arguments\n- `--enable` or `-e` Enable Auto NPM in a git repo\n- `--disable` or `-d` Disable Auto NPM in a git repo\n- `--force` or `-f` Force Auto NPM to rewrite any exists Git hooks that we need\n- `--update` or `-u` Updated the NPM package for the current repo\n- `--help` or `-h` Display the help dialog\n","maintainers":[{"name":"larzconwell","email":"larzconwell@gmail.com"}],"time":{"modified":"2012-08-02T13:44:13.964Z","created":"2012-06-27T01:10:48.204Z","0.0.2":"2012-06-27T01:10:49.941Z","0.0.3":"2012-06-27T01:20:32.476Z","0.0.4":"2012-06-27T01:26:29.758Z","0.0.5":"2012-06-27T20:34:53.767Z","0.0.6":"2012-07-26T18:52:37.989Z"},"author":{"name":"Larz Conwell","email":"larzconwell@gmail.com"},"repository":{"type":"git","url":"git://github.com/larzconwell/auto_npm.git"},"users":{"fgribreau":true},"_attachments":{"auto_npm-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-267C1BRomYTg1qR93snqAw==","length":3484,"stub":true},"auto_npm-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TK8dJyvXdMVBBGy74RmykQ==","length":3539,"stub":true},"auto_npm-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6042DG3sN2HoLW7XOs2GwQ==","length":3333,"stub":true},"auto_npm-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vN6vYwXkphvVYaLqjRwJyA==","length":3346,"stub":true},"auto_npm-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5suuC7okhdlX0EQb6VYYrQ==","length":3311,"stub":true}}}},
{"id":"autocast","key":"autocast","value":{"rev":"8-a1345d9c5ce51623cc50cf6044146286"},"doc":{"_id":"autocast","_rev":"8-a1345d9c5ce51623cc50cf6044146286","name":"autocast","description":"Easily and automatically cast common datatypes in JavaScript","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"name":"autocast","description":"Easily and automatically cast common datatypes in JavaScript","version":"0.0.0","repository":{"type":"git","url":"git://github.com/bahamas10/node-autocast.git"},"scripts":{"test":"node tests/test.js"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"autocast\n========\n\nEasily and automatically cast common datatypes in JavaScript\n\nInstall\n------\n\nInstall locally to use as a madule\n\n    npm install autocast\n\nUsage\n-----\n\n``` js\nvar autocast = require('autocast');\n```\n\nExample\n-------\n\n``` js\nvar autocast = require('autocast'),\n    x;\n\nx = autocast('5')\n// x => 5\nx = autocast('5.8')\n// x => 5.8\nx = autocast('5.8.8')\n// x => '5.8.8'\nx = autocast('null')\n// x => null\nx = autocast('true')\n// x => true\nx = autocast('false')\n// x => false\nx = autocast('normal string')\n// x => 'normal string'\n```\n\nTests\n-----\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"autocast@0.0.0","dist":{"shasum":"511daf37c7e8fba621099b531d704fa9459c939e","tarball":"http://registry.npmjs.org/autocast/-/autocast-0.0.0.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]},"0.0.1":{"author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"name":"autocast","description":"Easily and automatically cast common datatypes in JavaScript","version":"0.0.1","repository":{"type":"git","url":"git://github.com/bahamas10/node-autocast.git"},"scripts":{"test":"node tests/test.js"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"keywords":["auto","cast","typecast","convert"],"readme":"autocast\n========\n\nEasily and automatically cast common datatypes in JavaScript\n\nInstall\n------\n\nInstall locally to use as a module\n\n    npm install autocast\n\nUsage\n-----\n\n``` js\nvar autocast = require('autocast');\n```\n\nExample\n-------\n\n``` js\nvar autocast = require('autocast'),\n    x;\n\nx = autocast('5')\n// x => 5\nx = autocast('5.8')\n// x => 5.8\nx = autocast('5.8.8')\n// x => '5.8.8'\nx = autocast('null')\n// x => null\nx = autocast('true')\n// x => true\nx = autocast('false')\n// x => false\nx = autocast('normal string')\n// x => 'normal string'\n```\n\nTests\n-----\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"autocast@0.0.1","dist":{"shasum":"436625cac3fe90d6c74863a530224ce2e8a22e82","tarball":"http://registry.npmjs.org/autocast/-/autocast-0.0.1.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]},"0.0.2":{"name":"autocast","description":"Easily and automatically cast common datatypes in JavaScript","version":"0.0.2","author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"contributors":[{"name":"Kit Cambridge","email":"kitcambridge@me.com"}],"repository":{"type":"git","url":"git://github.com/bahamas10/node-autocast.git"},"scripts":{"test":"node tests/test.js"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"keywords":["auto","cast","typecast","convert"],"readme":"autocast\n========\n\nEasily and automatically cast common datatypes in JavaScript\n\nInstall\n------\n\nInstall locally to use as a module\n\n    npm install autocast\n\nUsage\n-----\n\n``` js\nvar autocast = require('autocast');\n```\n\nExample\n-------\n\n``` js\nvar autocast = require('autocast'),\n    x;\n\nx = autocast('5')\n// x => 5\nx = autocast('5.8')\n// x => 5.8\nx = autocast('5.8.8')\n// x => '5.8.8'\nx = autocast('null')\n// x => null\nx = autocast('true')\n// x => true\nx = autocast('false')\n// x => false\nx = autocast('normal string')\n// x => 'normal string'\n```\n\nTests\n-----\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","_id":"autocast@0.0.2","dist":{"shasum":"d8f0b7b866c017463ef0fb7413e23740d5c65620","tarball":"http://registry.npmjs.org/autocast/-/autocast-0.0.2.tgz"},"maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}]}},"readme":"autocast\n========\n\nEasily and automatically cast common datatypes in JavaScript\n\nInstall\n------\n\nInstall locally to use as a madule\n\n    npm install autocast\n\nUsage\n-----\n\n``` js\nvar autocast = require('autocast');\n```\n\nExample\n-------\n\n``` js\nvar autocast = require('autocast'),\n    x;\n\nx = autocast('5')\n// x => 5\nx = autocast('5.8')\n// x => 5.8\nx = autocast('5.8.8')\n// x => '5.8.8'\nx = autocast('null')\n// x => null\nx = autocast('true')\n// x => true\nx = autocast('false')\n// x => false\nx = autocast('normal string')\n// x => 'normal string'\n```\n\nTests\n-----\n\n    npm test\n\nLicense\n-------\n\nMIT Licensed\n","maintainers":[{"name":"bahamas10","email":"dave@daveeddy.com"}],"time":{"modified":"2012-08-02T13:43:47.399Z","created":"2012-06-22T23:54:55.295Z","0.0.0":"2012-06-22T23:54:56.728Z","0.0.1":"2012-07-07T06:15:09.935Z","0.0.2":"2012-07-31T04:28:50.230Z"},"author":{"name":"Dave Eddy","email":"dave@daveeddy.com","url":"http://www.daveeddy.com"},"repository":{"type":"git","url":"git://github.com/bahamas10/node-autocast.git"},"users":{"fgribreau":true},"_attachments":{"autocast-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-5eotsF6EhlRDne0F2Q5shg==","length":1214,"stub":true},"autocast-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-YKam65ja1Bf2CbIwigRj/Q==","length":1173,"stub":true},"autocast-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4MD1kuQaodhWGlxhJO5wXw==","length":1135,"stub":true}}}},
{"id":"autocomplete","key":"autocomplete","value":{"rev":"3-f2773bca040d5abcd0536dbebe5847bf"},"doc":{"_id":"autocomplete","_rev":"3-f2773bca040d5abcd0536dbebe5847bf","name":"autocomplete","description":"An in-memory autocomplete package based on the trie data structure","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"autocomplete","description":"An in-memory autocomplete package based on the trie data structure","keywords":["autocomplete","trie","search"],"version":"0.0.1","homepage":"http://www.github.com/marccampbell/node-autocomplete","repository":{"type":"git","url":"git://github.com/marccampbell/node-autocomplete.git"},"author":{"name":"Marc Campbell","email":"marc.e.campbell@gmail.com","url":"http://twitter.com/mccode"},"main":"index","dependencies":{},"devDependencies":{"should":"0.2.x"},"engines":{"node":"*"},"_npmJsonOpts":{"file":"/Users/marc/.npm/autocomplete/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autocomplete@0.0.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"a2974c97aeb211b05cce655b0e910b3b32546c16","tarball":"http://registry.npmjs.org/autocomplete/-/autocomplete-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"marccampbell","email":"marc.e.campbell@gmail.com"}]}},"maintainers":[{"name":"marccampbell","email":"marc.e.campbell@gmail.com"}],"time":{"modified":"2011-08-16T22:06:10.732Z","created":"2011-08-16T22:06:09.850Z","0.0.1":"2011-08-16T22:06:10.732Z"},"author":{"name":"Marc Campbell","email":"marc.e.campbell@gmail.com","url":"http://twitter.com/mccode"},"repository":{"type":"git","url":"git://github.com/marccampbell/node-autocomplete.git"},"_attachments":{"autocomplete-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eRYJU8ZGXd0tQ5wcEXS0Pw==","length":966142,"stub":true}}}},
{"id":"autodafe","key":"autodafe","value":{"rev":"17-a80f60657a5a1fdd6e7a17232b0f110b"},"doc":{"_id":"autodafe","_rev":"17-a80f60657a5a1fdd6e7a17232b0f110b","name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support, logging, routing, user roles etc","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support and a lot of tasty buns","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.0.1","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","repository":{"type":"git","url":"git://github.com/jifeon/node.autodafe.js.git"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","vows":">=0.5.8","emailjs":">=0.1.8","mysql-libmysqlclient":">=1.2.3","dust":""},"engines":{"node":">=0.3.0"},"_id":"autodafe@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b11293c389889e8048db0e9ae1931100863cb4f9","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.0.1.tgz"}},"0.0.2":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support and a lot of tasty buns","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.0.2","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","repository":{"type":"git","url":"git://github.com/jifeon/node.autodafe.js.git"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","vows":">=0.5.8","emailjs":">=0.1.8","mysql-libmysqlclient":">=1.2.3","dust":">=0.3.0"},"engines":{"node":">=0.3.0"},"_id":"autodafe@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"571ea6ea314143b5ff0c2761d3fc9340c22fd641","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.0.2.tgz"}},"0.0.3":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support and a lot of tasty buns","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.0.3","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","repository":{"type":"git","url":"git://github.com/jifeon/node.autodafe.js.git"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","vows":">=0.5.8","emailjs":">=0.1.8","mysql-libmysqlclient":">=1.2.3","dust":">=0.3.0"},"engines":{"node":">=0.3.0"},"_id":"autodafe@0.0.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b8a0ddecb3a4a5cb71dd0acdae4a4af7633a3607","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.0.3.tgz"}},"0.2.0":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support, logging, routing, user roles etc","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.2.0","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","repository":{"type":"git","url":"git://github.com/jifeon/autodafe.git"},"dependencies":{"socket.io":">=0.5.2","socket.io-client":">=0.7.2","node-proxy":">=0.4.0","colors":">=0.3.0","vows":">=0.5.8","emailjs":">=0.1.8","mysql":">=0.9.0","dust.js":">=0.1.0","formidable":">=1.0.2","http-auth":">=1.0.4"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"jifeon","email":"balakirev.andrey@gmail.com"},"_id":"autodafe@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d9def8b85a84627f62c3fd2a46aaf50bd217561d","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.2.0.tgz"},"maintainers":[{"name":"jifeon","email":"balakirev.andrey@gmail.com"}]},"0.2.1":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support, logging, routing, user roles etc","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.2.1","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","bugs":{"email":"jifeon@gmail.com","url":"http://treeit.ru:3000/projects/autodafe/issues"},"repository":{"type":"git","url":"git://github.com/jifeon/autodafe.git"},"directories":{"lib":"./framework","example":"./demos"},"scripts":{"test":"./tests/run_tests"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","emailjs":">=0.1.8","mysql":">=0.9.0","dust.js":">=0.1.0","formidable":">=1.0.2","http-auth":">=1.0.4"},"devDependencies":{"vows":">=0.5.8","socket.io-client":">=0.7.2"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"jifeon","email":"balakirev.andrey@gmail.com"},"_id":"autodafe@0.2.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"95b57d0df4f388599cd5169f6c0c1e20bbd290a8","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.2.1.tgz"},"maintainers":[{"name":"jifeon","email":"balakirev.andrey@gmail.com"}]},"0.2.2":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support, logging, routing, user roles etc","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.2.2","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","bugs":{"email":"jifeon@gmail.com","url":"http://treeit.ru:3000/projects/autodafe/issues"},"repository":{"type":"git","url":"git://github.com/jifeon/autodafe.git"},"directories":{"lib":"./framework","example":"./demos"},"scripts":{"test":"./tests/run_tests"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","emailjs":">=0.1.8","mysql":">=0.9.0","dust.js":">=0.1.0","formidable":">=1.0.2","http-auth":">=1.0.4"},"devDependencies":{"vows":">=0.5.8","socket.io-client":">=0.7.2"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"jifeon","email":"balakirev.andrey@gmail.com"},"_id":"autodafe@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b4a068420c2b4845d92309b4f299ee0b2ba37729","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.2.2.tgz"},"maintainers":[{"name":"jifeon","email":"balakirev.andrey@gmail.com"}]},"0.2.3":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support, logging, routing, user roles etc","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.2.3","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","bugs":{"email":"jifeon@gmail.com","url":"http://treeit.ru:3000/projects/autodafe/issues"},"repository":{"type":"git","url":"git://github.com/jifeon/autodafe.git"},"directories":{"lib":"./framework","example":"./demos"},"scripts":{"test":"./tests/run_tests"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","emailjs":">=0.1.8","mysql":">=0.9.0","dust.js":">=0.1.0","formidable":">=1.0.2","http-auth":">=1.1.9"},"devDependencies":{"vows":">=0.5.8"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"jifeon","email":"balakirev.andrey@gmail.com"},"_id":"autodafe@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"6e5836eccd14e0814c3d6983034b08e15957d612","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.2.3.tgz"},"readme":"\n","maintainers":[{"name":"jifeon","email":"balakirev.andrey@gmail.com"}]},"0.3.0":{"name":"autodafe","description":"mvc framework for node with mysql orm, web sockets support, logging, routing, user roles etc","keywords":["mvc","framework","mysql","orm","websockets"],"version":"0.3.0","author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"contributors":[{"name":"Vladimir Balakirev","email":"bvlvl2003@rambler.ru"}],"main":"./framework/autodafe","bugs":{"email":"jifeon@gmail.com","url":"http://treeit.ru:3000/projects/autodafe/issues"},"repository":{"type":"git","url":"git://github.com/jifeon/autodafe.git"},"directories":{"lib":"./framework","example":"./demos"},"scripts":{"test":"./tests/run_tests"},"dependencies":{"socket.io":">=0.5.2","node-proxy":">=0.4.0","colors":">=0.3.0","emailjs":">=0.1.8","mysql":">=0.9.0","dust.js":">=0.1.0","formidable":">=1.0.2","http-auth":">=1.1.9"},"devDependencies":{"vows":">=0.5.8"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"jifeon","email":"balakirev.andrey@gmail.com"},"_id":"autodafe@0.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"b72b3f2e9837ea1d5ebf0b80a88a117adb0bae88","tarball":"http://registry.npmjs.org/autodafe/-/autodafe-0.3.0.tgz"},"readme":"\n","maintainers":[{"name":"jifeon","email":"balakirev.andrey@gmail.com"}]}},"maintainers":[{"name":"jifeon","email":"balakirev.andrey@gmail.com"}],"time":{"modified":"2012-05-03T18:29:25.109Z","created":"2011-06-07T23:02:47.370Z","0.0.1":"2011-06-07T23:02:48.062Z","0.0.2":"2011-06-07T23:03:26.225Z","0.0.3":"2011-06-07T23:09:15.101Z","0.2.0":"2011-12-22T02:27:43.776Z","0.2.1":"2012-01-05T02:26:17.638Z","0.2.2":"2012-03-01T10:42:45.817Z","0.2.3":"2012-04-20T16:47:23.403Z","0.3.0":"2012-05-03T18:29:25.109Z"},"author":{"name":"Andrey Balakirev","email":"balakirev.andrey@gmail.com"},"repository":{"type":"git","url":"git://github.com/jifeon/autodafe.git"},"_attachments":{"autodafe-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-48uPakiLAkuNTZgXUoZ4Dg==","length":141903,"stub":true},"autodafe-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-mIFvViV5CgSDTHSnTPGimg==","length":146138,"stub":true},"autodafe-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-SVZ2iNcaDXj1Wfkue/YnBw==","length":161489,"stub":true},"autodafe-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hGI4coeGNpNH+UKnA1uIIw==","length":149041,"stub":true},"autodafe-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-AYLRA/Kf7bg+VTH/bBkTLg==","length":124577,"stub":true},"autodafe-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AKe+h6uGp/WE9pWixD5ZHw==","length":64472,"stub":true},"autodafe-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4MEAF0ZSoXq/IJnqPl4OTA==","length":66593,"stub":true},"autodafe-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7jrtjilwEWmKvdTzD2dNvw==","length":66581,"stub":true}}}},
{"id":"autolint","key":"autolint","value":{"rev":"23-115037b0055f010fe667aaac4f77c740"},"doc":{"_id":"autolint","_rev":"23-115037b0055f010fe667aaac4f77c740","name":"autolint","description":"Autolint watches your files for jslint-errors.","dist-tags":{"latest":"1.0.4"},"versions":{"0.1.0":{"name":"autolint","version":"0.1.0","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"./run_tests"},"engines":{"node":"~v0.4.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"*","growl":"*","underscore":"*","buster-promise":"*"},"devDependencies":{"buster":"*"},"keywords":["JavaScript","lint","jslint","jshint"],"_npmJsonOpts":{"file":"/Users/fimasvee/.npm/autolint/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autolint@0.1.0","_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"11bc4a894884da8e6b1a38a48888b437904c2456","tarball":"http://registry.npmjs.org/autolint/-/autolint-0.1.0.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.1.1":{"name":"autolint","version":"0.1.1","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"./run_tests"},"engines":{"node":"~0.4"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~2.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.2"},"keywords":["JavaScript","lint","jslint","jshint"],"_npmJsonOpts":{"file":"/Users/fimasvee/.npm/autolint/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autolint@0.1.1","_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"82b12654a55ab768a58fe0546b6d16d123de50f2","tarball":"http://registry.npmjs.org/autolint/-/autolint-0.1.1.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.1.2":{"name":"autolint","version":"0.1.2","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"./run_tests"},"engines":{"node":"~0.4"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~2.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.2"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_id":"autolint@0.1.2","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"c012d3e41b46514060109d24eada0a49ca445177","tarball":"http://registry.npmjs.org/autolint/-/autolint-0.1.2.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.1.3":{"name":"autolint","version":"0.1.3","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"./run_tests"},"engines":{"node":"~0.4"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~2.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/fimasvee/.npm/autolint/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autolint@0.1.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"bf7ff10820903a9648e42ae3e603bdcb3c44a96d","tarball":"http://registry.npmjs.org/autolint/-/autolint-0.1.3.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.1.4":{"name":"autolint","version":"0.1.4","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"./run_tests"},"engines":{"node":"~0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~2.1","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"116acdc8cb6af405d8c9560db891252287d79112","tarball":"http://registry.npmjs.org/autolint/-/autolint-0.1.4.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.1.5":{"name":"autolint","version":"0.1.5","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"./run_tests"},"engines":{"node":"~0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~2.1","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@0.1.5","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c6e8c927e7dc02c22ec6debebdb68678018d16f9","tarball":"http://registry.npmjs.org/autolint/-/autolint-0.1.5.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"1.0.0":{"name":"autolint","version":"1.0.0","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"buster test"},"engines":{"node":"~0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~3.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@1.0.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8debd1c442473506620b605da14ba8e50c701916","tarball":"http://registry.npmjs.org/autolint/-/autolint-1.0.0.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"1.0.1":{"name":"autolint","version":"1.0.1","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"buster test"},"engines":{"node":"~0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~3.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@1.0.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"41299b82e6d1324020bec7dbc088ca09d6b244f4","tarball":"http://registry.npmjs.org/autolint/-/autolint-1.0.1.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"1.0.2":{"name":"autolint","version":"1.0.2","main":"./bin/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"buster test"},"engines":{"node":"~0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~3.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@1.0.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"7db59104f80aa6e47afd2cbed4177b6fd4cfa80d","tarball":"http://registry.npmjs.org/autolint/-/autolint-1.0.2.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"1.0.3":{"name":"autolint","version":"1.0.3","main":"./lib/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"buster test"},"engines":{"node":"~0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~3.0","growl":"~1.1","underscore":"~1.1","buster-promise":"~0.3"},"devDependencies":{"buster":"~0.3"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@1.0.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cda13e93cc3b225b2820af53fede3f83febdd445","tarball":"http://registry.npmjs.org/autolint/-/autolint-1.0.3.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"1.0.4":{"name":"autolint","version":"1.0.4","main":"./lib/autolint","description":"Autolint watches your files for jslint-errors.","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"homepage":"https://github.com/magnars/autolint","scripts":{"test":"buster test"},"engines":{"node":">=0.6"},"bin":{"autolint":"./bin/autolint"},"dependencies":{"glob":"~3.0","growl":"~1.1","underscore":"~1.1","when":"https://github.com/cujojs/when/tarball/1.0.2","fs-watch-tree":"~0.2"},"keywords":["JavaScript","lint","jslint","jshint"],"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/magnars/autolint/blob/master/LICENSE"}],"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"autolint@1.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a6c1371df1be8a975e2befae6c1ebf6795358aa9","tarball":"http://registry.npmjs.org/autolint/-/autolint-1.0.4.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]}},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}],"time":{"modified":"2012-06-18T11:52:32.412Z","created":"2011-08-15T16:32:22.808Z","0.1.0":"2011-08-15T16:32:24.095Z","0.1.1":"2011-08-15T16:52:03.339Z","0.1.2":"2011-08-15T17:52:28.138Z","0.1.3":"2011-10-19T16:59:24.330Z","0.1.4":"2011-11-28T20:26:37.449Z","0.1.5":"2011-12-05T23:25:23.515Z","1.0.0":"2012-02-11T22:24:26.097Z","1.0.1":"2012-02-12T17:35:29.820Z","1.0.2":"2012-02-12T17:49:21.915Z","1.0.3":"2012-02-12T22:34:41.263Z","1.0.4":"2012-06-18T11:52:32.412Z"},"author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/autolint.git"},"_attachments":{"autolint-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-YWIGy/Gfguzp1uTUDbrODA==","length":106312,"stub":true},"autolint-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-o/lFfi3B+Fov22wQPFzZuA==","length":103588,"stub":true},"autolint-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-zDckn3rMpaDk8dXCAC30LA==","length":103496,"stub":true},"autolint-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-DB0aBAeawwksULjADEWY9g==","length":103441,"stub":true},"autolint-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-HtSd1ISvbsPfF4v8DOYjvg==","length":103299,"stub":true},"autolint-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-WpzjVT8FpUhjlNyodbsdDw==","length":98766,"stub":true},"autolint-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-LWv3XJU27/GD8HQobYbQ1A==","length":99437,"stub":true},"autolint-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6pFG4EdcpX7ek9tMFb7j+w==","length":97649,"stub":true},"autolint-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6xdh3tuar3eJPEfuANF0Yw==","length":95764,"stub":true},"autolint-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cgMu4xzx9qabcS8sUAAOpg==","length":96234,"stub":true},"autolint-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0CquBhMIUzRwc0ZtYd1ceg==","length":96183,"stub":true}}}},
{"id":"autoload","key":"autoload","value":{"rev":"5-9247704d9a992a175e3ae49f4af757d0"},"doc":{"_id":"autoload","_rev":"5-9247704d9a992a175e3ae49f4af757d0","name":"autoload","description":"Autoloading symbols via source code grokking","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"autoload","version":"0.1.0","description":"Autoloading symbols via source code grokking","keywords":["autoload","require"],"homepage":"https://github.com/laverdet/node-autoload","author":{"name":"Marcel Laverdet","email":"marcel@laverdet.com","url":"https://github.com/laverdet/"},"main":"autoload","repository":{"type":"git","url":"git://github.com/laverdet/node-autoload.git"},"_id":"autoload@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1e402e46c143714e17e5d3ac1b1b600cfb0f0670","tarball":"http://registry.npmjs.org/autoload/-/autoload-0.1.0.tgz"}},"0.1.1":{"name":"autoload","version":"0.1.1","description":"Autoloading symbols via source code grokking","keywords":["autoload","require"],"homepage":"https://github.com/laverdet/node-autoload","author":{"name":"Marcel Laverdet","email":"marcel@laverdet.com","url":"https://github.com/laverdet/"},"main":"autoload","repository":{"type":"git","url":"git://github.com/laverdet/node-autoload.git"},"_id":"autoload@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"15f1d76ffc85cc79a8393b9096567598c340654b","tarball":"http://registry.npmjs.org/autoload/-/autoload-0.1.1.tgz"}}},"maintainers":[{"name":"laverdet","email":"marcel.npm@laverdet.com"}],"time":{"modified":"2011-03-20T05:52:44.217Z","created":"2011-03-10T17:05:06.780Z","0.1.0":"2011-03-10T17:05:07.481Z","0.1.1":"2011-03-20T05:52:44.217Z"},"author":{"name":"Marcel Laverdet","email":"marcel@laverdet.com","url":"https://github.com/laverdet/"},"repository":{"type":"git","url":"git://github.com/laverdet/node-autoload.git"},"_attachments":{"autoload-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sJN9MTvvvIvNH6IyWRFbBQ==","length":4027,"stub":true},"autoload-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1yJMHeTs20qatlIkA3KUQQ==","length":3203,"stub":true}}}},
{"id":"autoloader","key":"autoloader","value":{"rev":"11-293c20c34d0c81fac5c06b699576b1fe"},"doc":{"_id":"autoloader","_rev":"11-293c20c34d0c81fac5c06b699576b1fe","name":"autoloader","description":"Autoloads JS Files (designed for Joose)","dist-tags":{"latest":"1.1.0"},"versions":{"0.0.1":{"author":{"name":"Aikar","email":"aikar@aikar.co","url":"http://aikar.co"},"name":"autoloader","description":"Autoloads JS Classes with Traceur","version":"0.0.1","homepage":"http://aikar.co","main":"autoloader.js","engines":{"node":">=0.4"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/aikar/.npm/autoloader/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autoloader@0.0.1","_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"614ad610df87133de5c1b67933835a759242499a","tarball":"http://registry.npmjs.org/autoloader/-/autoloader-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}]},"1.0.0":{"author":{"name":"Aikar","email":"aikar@aikar.co","url":"http://aikar.co"},"name":"autoloader","description":"Autoloads JS Classes with Traceur","version":"1.0.0","homepage":"http://aikar.co","main":"autoloader.js","engines":{"node":">=0.4"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/aikar/.npm/autoloader/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autoloader@1.0.0","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"08041ad7136aadbf2549e241c26a7b22069bda71","tarball":"http://registry.npmjs.org/autoloader/-/autoloader-1.0.0.tgz"},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}]},"1.0.1":{"author":{"name":"Aikar","email":"aikar@aikar.co","url":"http://aikar.co"},"name":"autoloader","description":"Autoloads JS Files (designed for Joose)","version":"1.0.1","homepage":"http://aikar.co","main":"autoloader.js","engines":{"node":">=0.4"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/aikar/.npm/autoloader/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autoloader@1.0.1","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fb8c0c9d05c4f94c3c97f4f1bfcd30b9431f9a6d","tarball":"http://registry.npmjs.org/autoloader/-/autoloader-1.0.1.tgz"},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}]},"1.0.2":{"author":{"name":"Aikar","email":"aikar@aikar.co","url":"http://aikar.co"},"name":"autoloader","description":"Autoloads JS Files (designed for Joose)","version":"1.0.2","homepage":"http://aikar.co","main":"autoloader.js","engines":{"node":">=0.4"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/aikar/.npm/autoloader/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autoloader@1.0.2","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4dd901e3376cb5219775797906c16e943d7b0713","tarball":"http://registry.npmjs.org/autoloader/-/autoloader-1.0.2.tgz"},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}]},"1.1.0":{"author":{"name":"Aikar","email":"aikar@aikar.co","url":"http://aikar.co"},"name":"autoloader","description":"Autoloads JS Files (designed for Joose)","version":"1.1.0","homepage":"http://aikar.co","main":"autoloader.js","engines":{"node":">=0.4"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/aikar/.npm/autoloader/1.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autoloader@1.1.0","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"40aa52a0b9cf3ef2f7b2ad5981b16cd74a8dbbc9","tarball":"http://registry.npmjs.org/autoloader/-/autoloader-1.1.0.tgz"},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}]}},"maintainers":[{"name":"aikar","email":"aikar@aikar.co"}],"time":{"modified":"2011-09-23T01:30:29.893Z","created":"2011-09-18T04:58:55.047Z","0.0.1":"2011-09-18T04:58:55.273Z","1.0.0":"2011-09-21T04:08:28.271Z","1.0.1":"2011-09-21T04:27:19.028Z","1.0.2":"2011-09-22T03:27:01.126Z","1.1.0":"2011-09-23T01:30:29.893Z"},"author":{"name":"Aikar","email":"aikar@aikar.co","url":"http://aikar.co"},"_attachments":{"autoloader-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-UInIKE1Ejh9AyGazjbTkUw==","length":3231,"stub":true},"autoloader-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zdVx1SrxJC8MBzoRusqMKQ==","length":2126,"stub":true},"autoloader-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0A9TS5vcyBqOUSy8EOTtPg==","length":2102,"stub":true},"autoloader-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9PvFie9b+QWiTjH1mThNCw==","length":2113,"stub":true},"autoloader-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VkMoccBBAhM1XZtnEyZEUw==","length":1760,"stub":true}}}},
{"id":"automarked","key":"automarked","value":{"rev":"3-66a2cc4420b3d2c8c5f4eef425adf6a2"},"doc":{"_id":"automarked","_rev":"3-66a2cc4420b3d2c8c5f4eef425adf6a2","name":"automarked","description":"Use marked and heighlight to build the html file from markdown file and auto rebuild it when file changed","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"automarked","version":"0.1.0","description":"Use marked and heighlight to build the html file from markdown file and auto rebuild it when file changed","author":{"name":"qiming zhao"},"repository":{"type":"git","url":"git://github.com/chemzqm/automarked.git"},"engines":{"node":">=0.6.0"},"dependencies":{"heightlight":">=0.2.2","marked":">=0.2.5"},"bugs":{"url":"http://github.com/chemzqm/automarked/issues"},"bin":{"automarked":"./bin/automarked"},"_npmUser":{"name":"chemzqm","email":"chemzqm@gmail.com"},"_id":"automarked@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"fad3a7ff5e2cc911c3e7794553bc78c860d2b9f9","tarball":"http://registry.npmjs.org/automarked/-/automarked-0.1.0.tgz"},"maintainers":[{"name":"chemzqm","email":"chemzqm@gmail.com"}]}},"readme":"automarked\n==========\n\nBuild the markdown file to html file using GFW and highlight  it by using highlight, also can do auto rebuild by watching.\n\n#Usage\n\n    $automarked README.md\n","maintainers":[{"name":"chemzqm","email":"chemzqm@gmail.com"}],"time":{"modified":"2012-05-24T11:25:16.482Z","created":"2012-05-24T11:25:06.978Z","0.1.0":"2012-05-24T11:25:16.482Z"},"author":{"name":"qiming zhao"},"repository":{"type":"git","url":"git://github.com/chemzqm/automarked.git"},"_attachments":{"automarked-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-91dZfoKYhCzNiLT+lrg6Cg==","length":1520,"stub":true}}}},
{"id":"automata","key":"automata","value":{"rev":"20-8da9f4ce26087fe695cbc4e0f8ed5515"},"doc":{"_id":"automata","_rev":"20-8da9f4ce26087fe695cbc4e0f8ed5515","name":"automata","description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.0":{"name":"automata","version":"1.0.0","main":"automata.js","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"14a3633021ec775984f9419d2f7d2a2857dc9eab","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.0.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}],"directories":{}},"1.0.1":{"name":"automata","version":"1.0.1","main":"automata","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.1","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e63e2cef36d078e42841690ec5a674d8950557c6","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.1.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}]},"1.0.2":{"name":"automata","version":"1.0.2","main":"automata","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.2","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"010480e40c3ee9a048dd425078b312fa1c02a830","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.2.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}]},"1.0.3":{"name":"automata","version":"1.0.3","main":"automata","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.3","contributors":[{"name":"Ibon Tolosana. [http://labs.hyperandroid.com/ - hyperandroid@gmail.com - @hyperandroid]"}],"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"852230855bd87fc9d13c0b022b7e5fb1b67510be","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.3.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}]},"1.0.4":{"name":"automata","version":"1.0.4","main":"automata","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.4","contributors":[{"name":"Ibon Tolosana. [http://labs.hyperandroid.com/ - hyperandroid@gmail.com - @hyperandroid]"}],"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"853e6cf45eee66b9da067628493ac956aa8ecd80","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.4.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}]},"1.0.5":{"name":"automata","version":"1.0.5","main":"automata","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.5","contributors":[{"name":"Ibon Tolosana. [http://labs.hyperandroid.com/ - hyperandroid@gmail.com - @hyperandroid]"}],"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c132e6c7ce36223927384aba9f3deb7c3fd68578","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.5.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}]},"1.0.6":{"name":"automata","version":"1.0.6","main":"automata","keywords":["FSM","state machine","automata"],"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"description":"Automata is a Finite State Machine automata framework featuring: a JSON based automata creation, timed transitions, sub-states, guards, FSM registry, etc.","repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"homepage":"http://github.com/hyperandroid/automata","_npmUser":{"name":"hyperandroid","email":"hyperandroid@gmail.com"},"_id":"automata@1.0.6","contributors":[{"name":"Ibon Tolosana. [http://labs.hyperandroid.com/ - hyperandroid@gmail.com - @hyperandroid]"}],"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4c9ea19a61dc6581be7fd7678931c7d156998b34","tarball":"http://registry.npmjs.org/automata/-/automata-1.0.6.tgz"},"maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}]}},"readme":"#Automata - A finite state machine framework.\n\n##Description\n\nAutomata is a formal finite state machine (FSM) framework.\nIts aims at offering a totally decoupled management of logic and data storage.\nIt features all the needed elements to have a modern and flexible\nfinite state machine framework like\n\n* FSM registry\n* Timed transitions\n* Auto transition\n* Sub states\n* Guards\n* FSM Session\n*\n\n##How to\n\nAutomata is valid to be used directly as a node js module. Exposes an object with two functions:\n\n```javascript\nmodule.exports= {\n registerFSM\n createSession\n}\n```\n\nFirst of all, one or more FSM must be registered in the system. A minimal state machine could be:\n\n```javascript\nfsmContext.registerFSM( {\n\n    // FSM registry name\n    name    : \"Test\",\n    logic   : constructor_func,\n\n    // States\n    state  : [\n        {\n            name    : \"1\",\n            initial : true,\n        },\n        {\n            name    : \"2\",\n        },\n        {\n            name    : \"3\"\n        }\n    ],\n\n    // transitions\n    transition : [\n        {\n            event       : \"12\",\n            from        : \"1\",\n            to          : \"2\"\n        },\n        {\n            event       : \"23\",\n            from        : \"2\",\n            to          : \"3\"\n        }\n    ]\n} );\n```\n\nTo start using this machine, a FSM session must created out of a registered FSM. For example:\n\n```javascript\nvar session= fsmContext.createSession(\"Test\");\n```\n\nTo send notification events to a session object, call either:\n\n```javascript\n\n// asynchronous call ( setTimeout with 0 )\nsession.dispatch( { msgId: \"12\" } );\n\n// synchronous call\nsession.processMessage( {msgId: \"12\"} );\n```\n\nThese methods accept as a valid message any object which contains a field called **msgId**. To trigger a transition,\n any message object's msgId value must be the value defined in the **event** attribute present in the transition\n FSM definition block.\n\n##Logic object\n\nThe FSM logic and state is ketp apart on a custom object the developer supplies to the FSM via the **logic** value.\nThis must be a constructor function and will create a new object per session.\nMethods on this object can be automatically invoked by the framework by assigning them to the activity hook values\navailable on State and Transition objects.\nThe hooks points can be either an string, identifying a function in the logic object, or a callback function of the form:\n\n```javascript\nfunction( state, transition, session, msg );\n```\n\nIn either case, the calling **this** scope will be the logic object itself.\n\n##Activy hooks\n\nAutomata offers many activy hooks on its activity. The following hooks are available:\n\nState:\n\n  * **onEnter**. Code fired on state enter.\n  * **onExit**. Code fired on state exit.\n\n\nTransition:\n\n  * **onTransition**. Code fired when the transition fires.\n  * **onPreGuard**. Code fired on transition fire but previously to onTransition. It can veto transition fire.\n  * **onPostGuard**. Code fired after onTransition execution. Could veto transition fire by issuing an auto-transition.\n\nThose hooks are defined in the **FSM JSON** definition as in the example:\n\nFor example:\n\n```javascript\n/**\n * Define a logic constructor function.\n */\nfunction constructor_func() {\n\n    this.count= 0;\n\n    this.B_onEnter= function() {\n        console.log(\"Enter state B\");\n        this.count++;\n    };\n\n    this.A_onExit= function() {\n        console.log(\"Exit state A\");\n    };\n\n    this.TR_AB= function() {\n        console.log(\"Transition fire code\");\n    }\n\n    return this;\n}\n\n/**\n * Define a FSM\n */\n fsmContext.registerFSM( {\n\n     // FSM registry name\n     name    : \"Test\",\n     logic   : constructor_func,\n\n     // States\n     state  : [\n         {\n             name    : \"A\",\n             initial : true,\n             onExit  : \"A_onExit\"\n         },\n         {\n             name    : \"B\",\n             onEnter : \"B_onEnter\"\n         },\n         {\n            name    : \"C\"\n         }\n     ],\n\n     transition : [\n         {\n             event       : \"AB\",\n             from        : \"A\",\n             to          : \"B\",\n             onTransition: \"TR_AB\",\n         },\n         {\n             event       : \"BC\",\n             from        : \"B\",\n             to          : \"C\"\n         }\n     ]\n } );\n\n var session= fsmContext.createSession(\"Test\");\n session.dispatch( { msgId: \"AB\" } );\n // this will print:\n //  Exit state A\n //  Transition fire code\n //  Enter state B\n```\n\n##Guards\n\nGuard prevent a transition from being fired. In Automata there're two available guard points out of the box.\nOne on preTransitionFire and the otheron postTransitionFire.\nThe difference is straight:\n\n * The **pre-transition guard**, if fired, aborts the transition firing procedure as if it had never ocurred.\n   That means, that neither the onExit function, nor a sefl transition event will be fired by the engine.\n   A good usage of this situation is for counting states. For example, in a multiplayer game where 3 players\n   must be present to start the game, an transition from state WaitPlayers to StartGame will be defined.\n   The pre-transition guard will allow to set a count up, so that whenever a new player enters the game, the\n   count increments, and will fail until the desired amount is reached. This procedure won't affect the state\n   machine, nor its observers.\n * The **post-transition guard**, if fired, maked the transition behave as a self-transition trigger, and the following\n   action sequence will be fired: Exit_State_A, Transition Fire, Enter_State_A.\n\n The way to instrument the engine that a guard veto has been launched, will be by throwing an exception from the\n pre/post-transition functions. Those functions are optional, and must be set in the \"transition\" block of the\n FSM definition as follows:\n\n```javascript\n fsmContext.registerFSM( {\n   ...,\n\n   transition : [\n        {\n            event        : \"AB\",\n            from         : \"A\",\n            to           : \"B\",\n            onTransition : \"TR_AB\",\n            onPreGuard   : \"pre_guard_function\",\n            onPostGuard  : \"post_guard_function\",\n        },\n        ...\n    ],\n\n    ...\n }\n```\n\n##Timed transitions\n\nAutomata offers out of the box timed transitions by defining an **onTimer** block in a state definition. For example:\n\n```javascript\n fsmContext.registerFSM( {\n\n    ...,\n\n    state  : [\n         {\n             name    : \"1\",\n             initial : true,\n             onTimer : {\n                 timeout : 2000,\n                 event   : \"12\"\n             },\n        }\n    ],\n\n    ...\n\n } );\n ```\n\nThis instruments the engine that after 2 seconds of entering this state, a transition by a transition with an\nevent id like \"12\" will be sent to the FSM session. The timer is handled automatically, and set/canceled on state\nenter/exit respectively.\n\n##SubStates\n\nAutomata allows to nest as much as needed substates. In fact, by defining a single FSM, the engine stacks two levels,\none for the FSM, and the other, initially for the FSM's initial state. To define different levels, you must\nregister more than one FSM in the registry, and then reference one of them as a substate in the \"state\" section:\n\n```javascript\n fsmContext.registerFSM( {\n    ...\n    state  : [\n        {\n            name    : \"a\",\n            initial : true,\n            onEnter : \"enter_a\",\n            onExit  : \"exit_a\"\n        },\n        {\n            subState: \"STest\"\n        },\n\n        ...\n\n    ],\n\n    ...\n } );\n```\n\nThen, the transition section will identify this FSM as a substate by its name, STest. A \"subState\" can't have a\n regular name, nor onEnter/onExit functions.\n\n The stacking of different subStates is done transparently, and they are handled by the \"session\" object. For each\n stacked level, a FSM.Context object is created. A context object is just a holder for the current state for each nesting level.\n\n##Transition from Substates\n\nThe way in which Automata manages state changes is made hierarchycally. That means, the engine will try to find a\nsuitable transition for a given incoming message regardless of its nesting level.\nSo for any given FSM stacktrace, the engine will traverse upwards trying to find a suitable state to fire a\ntransition for the dispatched event.\n\n(Warning, offending ascii art. States between parenthesis, transitions between square brackets.)\n<pre>\n(ROOT)\n  |\n  |\n  v\n(S1) --[T_S1_S2]--> (SUB_STATE) --[T_SS_S3]--> (S3)\n                         |\n                         +---> (SS1) --[TSS1_SS2]--> (SS2)\n</pre>\n\n\nFor example, given the previous example,\n\n```javascript\nsession.dispatch( {msgId : \"T_S1_S2\" } );\n```\n\nmeans the session is on state SS1, and the stackTrace will be the following:\n\nROOT, SUB_STATE, SS1\n\nBy calling\n```javascript\nsession.dispatch( {msgId : \"T_SS_S3\" } );\n```\n\non the session at state SS1, SS1 will be removed from the stack, and the session will transize to S3 state.\nAdditionally, this session will be finished since S3 is a final State (this nesting level will be removed from the stack too), and ROOT is also a final state, causing the session to be emptied.\n\n\n##FSM listeners\n\nAny FSM session activity can be monitored by adding a listener.\nFor example:\n\n```javascript\nsession.addListener( {\n    contextCreated      : function( obj ) {\n        console.log(\"SessionListener contextCreated\");\n    },\n    contextDestroyed    : function( obj ) {\n        console.log(\"SessionListener contextDestroyed\");\n    },\n    finalStateReached   : function( obj ) {\n        console.log(\"SessionListener finalStateReached\");\n    },\n    stateChanged        : function( obj ) {\n        console.log(\"SessionListener stateChanged\");\n    },\n    customEvent         : function( obj ) {\n        console.log(\"SessionListener customEvent\");\n    }\n} );\n```\n\nThe obj parameter for each listener object function contains the following parameters:\n\n* **contextCreated**:     function( session, context )\n* **contextDestroyed**:   function( session, context )\n* **finalStateReached**:  function( session )\n* **stateChanged**:       function( session, context, newState, message )\n* **customEvent**:        function( session, message )\n\nIn all cases:\n\n* **session**:    is the FSM created session.\n* **context**:    is an internal FSM object. A context is just a holder for the current state for each subState the system enters.\n* **newState**:   a FSM state object.\n* **message**:    a message object. The only constraint for these message objects is they must have a \"msgId\" field.\n\n##Custom events\n\nThe preferred way for sending custom events will by calling:\n```javascript\nsession.fireCustomEvent( a_json_object );\n```\n\nand have a listener/observer object attached to the sending FSM session.\nThis method will be notified on the method\n\n```javascript\ncustomEvent         : function( { session: session, customEvent: a_json_object } ) {\n```\n\n\n","maintainers":[{"name":"hyperandroid","email":"hyperandroid@gmail.com"}],"time":{"modified":"2012-05-15T23:19:11.801Z","created":"2012-04-06T17:01:27.585Z","1.0.0":"2012-04-06T17:02:36.615Z","1.0.1":"2012-04-06T18:08:39.503Z","1.0.2":"2012-04-07T13:06:47.508Z","1.0.3":"2012-04-07T14:21:22.192Z","1.0.4":"2012-04-15T09:08:28.110Z","1.0.5":"2012-05-07T16:56:46.847Z","1.0.6":"2012-05-15T23:19:11.801Z"},"author":{"name":"hyperandroid","email":"hyperandroid@gmail.com","url":"http://labs.hyperandroid.com"},"repository":{"type":"git","url":"git://github.com/hyperandroid/Automata.git"},"_attachments":{"automata-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-YpB//M9LgvsMu+kFZJhlYQ==","length":20013,"stub":true},"automata-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-jRx86HBhY1VMWSmUtWvgMg==","length":19749,"stub":true},"automata-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-PeHYCNJNSyfKiuZ5Kl9V4w==","length":19072,"stub":true},"automata-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-+Xm0Xl1I2TIIlIcBMsg3gg==","length":19133,"stub":true},"automata-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-C7vY0L23luhtw/ndYe0Log==","length":19445,"stub":true},"automata-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-Hraodkh4dhzhZuKoiWGrvw==","length":13914,"stub":true},"automata-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wQFSvuCbirJAn7k2nQq5Cg==","length":12923,"stub":true}}}},
{"id":"automatta","key":"automatta","value":{"rev":"3-729889d5679bacd61dc8761c8ec2f642"},"doc":{"_id":"automatta","_rev":"3-729889d5679bacd61dc8761c8ec2f642","name":"automatta","description":"A powerful and lightweight library to create, execute and monitor automata in NodeJS and Javascript.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"automatta","description":"A powerful and lightweight library to create, execute and monitor automata in NodeJS and Javascript.","url":"frankcortes.github.com/Automatta","keywords":["automatta","automata","robot","monitor","flux","execution"],"author":{"name":"FranciscoCort�s","email":"franklyn.bdn@gmail.com"},"main":"./lib/automatta/automatta","directories":{"tests":"./tests"},"version":"0.0.1","engines":{"node":">=0.2.4"},"_npmUser":{"name":"frankcortes","email":"frank.bdn@gmail.com"},"_id":"automatta@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f142efa94e52093a4657392f14a4059d82d6a258","tarball":"http://registry.npmjs.org/automatta/-/automatta-0.0.1.tgz"},"maintainers":[{"name":"frankcortes","email":"frank.bdn@gmail.com"}]}},"readme":"\r\n# Automatta\r\n\r\n  A powerful and lightweight library to create, execute and monitor automata in NodeJS and Javascript.\r\n\r\n\r\n\r\n## License \r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2009-2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"frankcortes","email":"frank.bdn@gmail.com"}],"time":{"modified":"2012-01-29T10:51:30.241Z","created":"2012-01-29T10:51:27.654Z","0.0.1":"2012-01-29T10:51:30.241Z"},"author":{"name":"FranciscoCort�s","email":"franklyn.bdn@gmail.com"},"_attachments":{"automatta-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-60ThJ9i4sUAIEFdsxrqI6Q==","length":2087,"stub":true}}}},
{"id":"auton","key":"auton","value":{"rev":"39-1ec0eee131ff089ccaf42075438dd109"},"doc":{"_id":"auton","_rev":"39-1ec0eee131ff089ccaf42075438dd109","name":"auton","description":"Extensible resource compiler/minifier/compressor tool","dist-tags":{"latest":"0.1.11"},"versions":{"0.1.5":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.5","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree":">=0.1.1","asyncjs":">=0.0.5"},"devDependencies":{},"licenses":[{"type":"MIT","url":""}],"_npmJsonOpts":{"file":"/Users/rando/.npm/auton/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"auton@0.1.5","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3f733d617a5ba63c64feb0dcaef8897620f0ad3f","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.5.tgz"},"scripts":{},"maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}],"directories":{}},"0.1.6":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.6","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree":">=0.1.1","asyncjs":">=0.0.5"},"devDependencies":{},"licenses":[{"type":"MIT","url":""}],"_id":"auton@0.1.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"558578b04940880feb5f9b815e95d613d4b4e292","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.6.tgz"},"scripts":{},"maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}],"directories":{}},"0.1.7":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.7","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree":">=0.1.1","asyncjs":">=0.0.5","colorize":">=0.1.0"},"devDependencies":{},"licenses":[{"type":"MIT","url":""}],"_id":"auton@0.1.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d8002b9478436895291b6cceb14f2317b20b64a5","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.7.tgz"},"scripts":{},"maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}],"directories":{}},"0.1.8":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.8","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree":">=0.1.1","asyncjs":">=0.0.5","colorize":">=0.1.0"},"devDependencies":{},"licenses":[{"type":"MIT","url":""}],"_id":"auton@0.1.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ebb16ecb12a45a4b15b0f240355b9e2444445bac","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.8.tgz"},"scripts":{},"maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}],"directories":{}},"0.1.9":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.9","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree-maintained":">=0.1.2","asyncjs":">=0.0.5","colorize":">=0.1.0"},"devDependencies":{},"licenses":[{"type":"MIT","url":""}],"_npmUser":{"name":"digiwano","email":"digiwano@gmail.com"},"_id":"auton@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d5fe1b838008b9f67e10ebd037fa3408b5dc3001","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.9.tgz"},"readme":"# Auton - automated resource compiler\n\n(for a quick start, see example/example.js. The code below is a simple example of how to define your own rules / chains)\n\nthis is very rudimentary and i'd like a more complicated example in here.\n\n```javascript\nvar auton    = require('./lib/auton'),\n    Compiler = auton.Compiler,\n    plugins  = auton.plugins,\n    path     = require('path');\n\nvar compiler = new Compiler('build', 'htdocs', true); // true is whether or not watch mode is on\n\ncompiler.addRule(\n  /.js$/,\n  javascriptSave,\n  [plugins.read, plugins.jshint, plugins.uglify, plugins.gzip, plugins.save]\n);\n\ncompiler.start();\n\n\n// decide what the filename of saved files should be\nfunction javascriptSave(type, filePath) {\n  var filename = path.basename(filePath, '.js'),\n      dirname  = path.dirname(filePath),\n      output   = dirname + \"/\" + filename;\n\n  if (type === 'minified') {\n    return output + \".min.js\";\n  }\n  else if (type === 'compressed') {\n    return output + \".min.js.gz\";\n  }\n  else if (type === 'plain' || type === '__age_check__') {\n    return output + \".js\";\n  }\n  else {\n    return null;\n  }\n}\n```\n\nthis example will find all files ending with .js within the folder 'build', run them through jshint, uglify-js, and gzip, and save a non-minified, a minified, and a minified+gzipped version.\n","maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}]},"0.1.10":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.10","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","less":">=1.3.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree-maintained":">=0.1.2","asyncjs":">=0.0.5","colorize":">=0.1.0","handlebars":">=1.0.4"},"devDependencies":{"vows":">=0.5.0"},"scripts":{"test":"vows --spec"},"licenses":[{"type":"MIT","url":""}],"_npmUser":{"name":"digiwano","email":"digiwano@gmail.com"},"_id":"auton@0.1.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f03dee85ee0ef02cf09c04df5ea6f92ae463e493","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.10.tgz"},"readme":"# Auton - automated resource compiler\n\n(for a quick start, see example/example.js. The code below is a simple example of how to define your own rules / chains)\n\nthis is very rudimentary and i'd like a more complicated example in here.\n\n```javascript\nvar auton    = require('./lib/auton'),\n    Compiler = auton.Compiler,\n    plugins  = auton.plugins,\n    path     = require('path');\n\nvar compiler = new Compiler('build', 'htdocs', true); // true is whether or not watch mode is on\n\ncompiler.addRule(\n  /.js$/,\n  javascriptSave,\n  [plugins.read, plugins.jshint, plugins.uglify, plugins.gzip, plugins.save]\n);\n\ncompiler.start();\n\n\n// decide what the filename of saved files should be\nfunction javascriptSave(type, filePath) {\n  var filename = path.basename(filePath, '.js'),\n      dirname  = path.dirname(filePath),\n      output   = dirname + \"/\" + filename;\n\n  if (type === 'minified') {\n    return output + \".min.js\";\n  }\n  else if (type === 'compressed') {\n    return output + \".min.js.gz\";\n  }\n  else if (type === 'plain' || type === '__age_check__') {\n    return output + \".js\";\n  }\n  else {\n    return null;\n  }\n}\n```\n\nthis example will find all files ending with .js within the folder 'build', run them through jshint, uglify-js, and gzip, and save a non-minified, a minified, and a minified+gzipped version.\n","maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}]},"0.1.11":{"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"name":"auton","description":"Extensible resource compiler/minifier/compressor tool","version":"0.1.11","homepage":"https://github.com/digiwano/auton","repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"main":"lib/auton","engines":{"node":">=v0.4.7"},"dependencies":{"stylus":">=0.13.0","less":">=1.3.0","nib":">=0.0.8","cssmin":">=0.3.0","gzip":">=0.1.0","jshint":">=0.2.3","uglify-js":">=1.0.6","coffee-script":">=1.1.1","watch-tree-maintained":">=0.1.2","asyncjs":">=0.0.5","colorize":">=0.1.0","handlebars":">=1.0.4"},"devDependencies":{"vows":">=0.5.0"},"scripts":{"test":"vows --spec"},"licenses":[{"type":"MIT","url":""}],"_npmUser":{"name":"digiwano","email":"digiwano@gmail.com"},"_id":"auton@0.1.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"07b0c0ac0e1714e27fae9ea1e1065d69d8bc691b","tarball":"http://registry.npmjs.org/auton/-/auton-0.1.11.tgz"},"readme":"# Auton - automated resource compiler\n\n(for a quick start, see example/example.js. The code below is a simple example of how to define your own rules / chains)\n\nthis is very rudimentary and i'd like a more complicated example in here.\n\n```javascript\nvar auton    = require('./lib/auton'),\n    Compiler = auton.Compiler,\n    plugins  = auton.plugins,\n    path     = require('path');\n\nvar compiler = new Compiler('build', 'htdocs', true); // true is whether or not watch mode is on\n\ncompiler.addRule(\n  /.js$/,\n  javascriptSave,\n  [plugins.read, plugins.jshint, plugins.uglify, plugins.gzip, plugins.save]\n);\n\ncompiler.start();\n\n\n// decide what the filename of saved files should be\nfunction javascriptSave(type, filePath) {\n  var filename = path.basename(filePath, '.js'),\n      dirname  = path.dirname(filePath),\n      output   = dirname + \"/\" + filename;\n\n  if (type === 'minified') {\n    return output + \".min.js\";\n  }\n  else if (type === 'compressed') {\n    return output + \".min.js.gz\";\n  }\n  else if (type === 'plain' || type === '__age_check__') {\n    return output + \".js\";\n  }\n  else {\n    return null;\n  }\n}\n```\n\nthis example will find all files ending with .js within the folder 'build', run them through jshint, uglify-js, and gzip, and save a non-minified, a minified, and a minified+gzipped version.\n","maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}]}},"maintainers":[{"name":"digiwano","email":"digiwano@gmail.com"}],"time":{"modified":"2012-04-25T21:58:43.794Z","created":"2011-08-04T19:07:37.888Z","0.1.5":"2011-08-04T19:07:40.092Z","0.1.6":"2011-08-11T08:29:43.337Z","0.1.7":"2011-08-23T08:30:40.977Z","0.1.8":"2011-08-23T09:43:55.966Z","0.1.9":"2012-03-14T18:04:12.347Z","0.1.10":"2012-04-25T19:42:34.719Z","0.1.11":"2012-04-25T21:58:43.794Z"},"author":{"name":"Rando Christensen","email":"digiwano@gmail.com"},"repository":{"type":"git","url":"git://github.com/digiwano/auton.git"},"_attachments":{"auton-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-tYh4EEVo88dvaSO9Df783Q==","length":8240,"stub":true},"auton-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-mw9mQX5OxsgwxSjd1jXaQA==","length":8195,"stub":true},"auton-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-dY2wYvCgikOVJAeVzDCXPA==","length":7845,"stub":true},"auton-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-mitbmKCOCojCSsZ3QFAiFw==","length":7469,"stub":true},"auton-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-zhhmkUOyrUr9iqVPOsDZEw==","length":6168,"stub":true},"auton-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YudERhSisXGHYCpyyfhiWQ==","length":5546,"stub":true},"auton-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HqResgjjVOm2vdtlN7OzGg==","length":3583,"stub":true}}}},
{"id":"autonode","key":"autonode","value":{"rev":"3-5a46543f53862750fa042158e2ad1cfc"},"doc":{"_id":"autonode","_rev":"3-5a46543f53862750fa042158e2ad1cfc","name":"autonode","description":"Create a node that starts a tcp server on a port, but if the address is in use, connect to that port instead.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"autonode","version":"0.0.0","homepage":"https://github.com/dominictarr/autonode","repository":{"type":"git","url":"git://github.com/dominictarr/autonode.git"},"dependencies":{},"devDependencies":{"tap":"0.3.0"},"scripts":{"test":"tap test"},"author":{"name":"'Dominic Tarr'","email":"dominic.tarr@gmail.com","url":"http://dominictarr.com"},"license":"MIT","readme":"# autonode\n\nCreate a node that starts a tcp server on a port,\nbut if the address is in use, connect to that port instead.\n\nAlso, if the current server goes down, \nanother node will become the server.\n\n>NOTE: this only works for a cluster on a single machine.\n\n## Example\n\nThis is the code for both the _server_ and the _client_.\n\n``` js\nvar autonode = require('autonode')\n\nautonode(function (stream) {\n  // called when a connection is made, whether\n  // this node turns out to be the client or the server.\n}).listen(PORT)\n```\n\nNaturally you will need to use a decentralized communication protocol.\ncheckout [crdt](https://github.com/dominictarr/crdt) \nor [scuttlebutt](https://github.com/dominictarr/scuttlebutt)\n\n## License\n\nMIT\n","_id":"autonode@0.0.0","description":"Create a node that starts a tcp server on a port, but if the address is in use, connect to that port instead.","dist":{"shasum":"c6e7fef20964083aef1bd9cba0265edb804f2fa1","tarball":"http://registry.npmjs.org/autonode/-/autonode-0.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"# autonode\n\nCreate a node that starts a tcp server on a port,\nbut if the address is in use, connect to that port instead.\n\nAlso, if the current server goes down, \nanother node will become the server.\n\n>NOTE: this only works for a cluster on a single machine.\n\n## Example\n\nThis is the code for both the _server_ and the _client_.\n\n``` js\nvar autonode = require('autonode')\n\nautonode(function (stream) {\n  // called when a connection is made, whether\n  // this node turns out to be the client or the server.\n}).listen(PORT)\n```\n\nNaturally you will need to use a decentralized communication protocol.\ncheckout [crdt](https://github.com/dominictarr/crdt) \nor [scuttlebutt](https://github.com/dominictarr/scuttlebutt)\n\n## License\n\nMIT\n","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-08-14T23:55:36.523Z","created":"2012-08-14T23:55:34.617Z","0.0.0":"2012-08-14T23:55:36.523Z"},"author":{"name":"'Dominic Tarr'","email":"dominic.tarr@gmail.com","url":"http://dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/autonode.git"},"_attachments":{"autonode-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PrlfFccdNzyM9irzC1Q2FQ==","length":1971,"stub":true}}}},
{"id":"autonomy","key":"autonomy","value":{"rev":"7-30e8e4ae1d9184f14ec5e6020af2bde1"},"doc":{"_id":"autonomy","_rev":"7-30e8e4ae1d9184f14ec5e6020af2bde1","name":"autonomy","description":"Lightweight functional utility library complementing ES5","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"author":{"name":"Eirik Albrigtsen","email":"analsandblaster@gmail.com"},"name":"autonomy","description":"Lightweight functional helper library complementing ES5","version":"0.1.0","repository":{"type":"git","url":"git://github.com/clux/autonomy.git"},"main":"autonomy.js","scripts":{"test":"tap ./test"},"dependencies":{"operators":"~0.1.1"},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"clux","email":"analsandblaster@gmail.com"},"_id":"autonomy@0.1.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f6e8b6f2363e432ca4e1146f342e94e1589ac92a","tarball":"http://registry.npmjs.org/autonomy/-/autonomy-0.1.0.tgz"},"readme":"","maintainers":[{"name":"clux","email":"analsandblaster@gmail.com"}]},"0.2.0":{"author":{"name":"Eirik Albrigtsen","email":"analsandblaster@gmail.com"},"name":"autonomy","description":"Lightweight functional utility library complementing ES5","version":"0.2.0","repository":{"type":"git","url":"git://github.com/clux/autonomy.git"},"keywords":["utility","functional","haskell","partial","curry","zipWith","FP","ES5"],"main":"autonomy.js","scripts":{"test":"tap ./test"},"dependencies":{},"devDependencies":{"operators":"latest","tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"license":"MIT","_npmUser":{"name":"clux","email":"analsandblaster@gmail.com"},"_id":"autonomy@0.2.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"1bb5499c5547edb1d6d509d490b9ca1677b0136e","tarball":"http://registry.npmjs.org/autonomy/-/autonomy-0.2.0.tgz"},"readme":"","maintainers":[{"name":"clux","email":"analsandblaster@gmail.com"}]},"0.3.0":{"author":{"name":"Eirik Albrigtsen","email":"analsandblaster@gmail.com"},"name":"autonomy","description":"Lightweight functional utility library complementing ES5","version":"0.3.0","repository":{"type":"git","url":"git://github.com/clux/autonomy.git"},"keywords":["utility","functional","haskell","partial","curry","zipWith","FP","ES5"],"main":"autonomy.js","scripts":{"test":"tap ./test"},"dependencies":{},"devDependencies":{"operators":"latest","tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"license":"MIT","_npmUser":{"name":"clux","email":"analsandblaster@gmail.com"},"_id":"autonomy@0.3.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"212f57224f3ce81b0365526f56af25fabaa8c7c5","tarball":"http://registry.npmjs.org/autonomy/-/autonomy-0.3.0.tgz"},"readme":"","maintainers":[{"name":"clux","email":"analsandblaster@gmail.com"}]}},"readme":"","maintainers":[{"name":"clux","email":"analsandblaster@gmail.com"}],"time":{"modified":"2012-07-04T21:02:21.535Z","created":"2012-06-17T18:44:51.711Z","0.1.0":"2012-06-17T18:44:53.432Z","0.2.0":"2012-06-30T08:04:40.922Z","0.3.0":"2012-07-04T21:02:21.535Z"},"author":{"name":"Eirik Albrigtsen","email":"analsandblaster@gmail.com"},"repository":{"type":"git","url":"git://github.com/clux/autonomy.git"},"_attachments":{"autonomy-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-NvFSGe0R24YFeSfQNx9Puw==","length":8419,"stub":true},"autonomy-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-B055MAyzcHw9u2wBPKIelA==","length":8181,"stub":true},"autonomy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YEIVsSczvzG0FUg/QTyT/A==","length":8766,"stub":true}}}},
{"id":"autoquit","key":"autoquit","value":{"rev":"9-f2e7883f67392b99bf332a06bc1f4981"},"doc":{"_id":"autoquit","_rev":"9-f2e7883f67392b99bf332a06bc1f4981","name":"autoquit","description":"Automatically shut down servers when inactive","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"autoquit","version":"0.1.0","main":"./lib/autoquit.js","description":"Automatically shut down servers when inactive","keywords":["autoquit","server"],"url":"http://github.com/rubenv/node-autoquit","repositories":[{"type":"git","url":"git://github.com/rubenv/node-autoquit.git"}],"author":{"name":"Ruben Vermeersch","email":"ruben@savanne.be"},"contributors":[],"licenses":["MIT"],"dependencies":{},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"rubenv","email":"ruben@savanne.be"},"_id":"autoquit@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6f028ad426889c454ada279d5cec8eb085616203","tarball":"http://registry.npmjs.org/autoquit/-/autoquit-0.1.0.tgz"},"maintainers":[{"name":"rubenv","email":"ruben@savanne.be"}],"directories":{}},"0.1.2":{"name":"autoquit","version":"0.1.2","main":"./lib/autoquit.js","description":"Automatically shut down servers when inactive","keywords":["autoquit","server"],"url":"http://github.com/rubenv/node-autoquit","repositories":[{"type":"git","url":"git://github.com/rubenv/node-autoquit.git"}],"author":{"name":"Ruben Vermeersch","email":"ruben@savanne.be"},"contributors":[],"licenses":["MIT"],"dependencies":{},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"rubenv","email":"ruben@savanne.be"},"_id":"autoquit@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9e83c5fcb80ed9bee941dfc2656ab10d3a4bee73","tarball":"http://registry.npmjs.org/autoquit/-/autoquit-0.1.2.tgz"},"maintainers":[{"name":"rubenv","email":"ruben@savanne.be"}],"directories":{}}},"maintainers":[{"name":"rubenv","email":"ruben@savanne.be"}],"time":{"modified":"2012-04-01T09:19:37.101Z","created":"2012-04-01T07:58:11.767Z","0.1.0":"2012-04-01T07:58:13.070Z","0.1.1":"2012-04-01T08:38:48.479Z","0.1.2":"2012-04-01T08:59:57.337Z"},"author":{"name":"Ruben Vermeersch","email":"ruben@savanne.be"},"_attachments":{"autoquit-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Mjzxq2vtunBhB8ys430FWw==","length":10240,"stub":true},"autoquit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-p+l3FlOHhddTemnSBhAIAg==","length":10240,"stub":true}}}},
{"id":"autoreleasepool","key":"autoreleasepool","value":{"rev":"6-debd69d0cf6ba2ff3c66a10ba92be51a"},"doc":{"_id":"autoreleasepool","_rev":"6-debd69d0cf6ba2ff3c66a10ba92be51a","name":"autoreleasepool","description":"A very simple wrapper around the OS X NSAutoreleasePool","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"name":"autoreleasepool","description":"A very simple wrapper around the OS X NSAutoreleasePool","version":"0.0.1","repository":{"type":"git","url":"git://github.com/TooTallNate/node-autoreleasepool.git"},"main":"./index.js","directories":{"lib":"."},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"autoreleasepool@0.0.1","_engineSupported":true,"_npmVersion":"1.0.1rc7","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"3dd4573e07745b760dc816a8db0674597e86cb8a","tarball":"http://registry.npmjs.org/autoreleasepool/-/autoreleasepool-0.0.1.tgz"}},"0.0.2":{"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"name":"autoreleasepool","description":"A very simple wrapper around the OS X NSAutoreleasePool","version":"0.0.2","repository":{"type":"git","url":"git://github.com/TooTallNate/node-autoreleasepool.git"},"main":"./index.js","directories":{"lib":"."},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"scripts":{"preinstall":"node-waf clean || true; node-waf configure build"},"_id":"autoreleasepool@0.0.2","_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f71b36ebf90368b0b05951198dd3945a4484c762","tarball":"http://registry.npmjs.org/autoreleasepool/-/autoreleasepool-0.0.2.tgz"}}},"maintainers":[{"name":"TooTallNate","email":"nathan@tootalnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"time":{"modified":"2012-03-09T03:52:41.597Z","created":"2011-04-14T18:58:05.274Z","0.0.1":"2011-04-14T18:58:06.403Z","0.0.2":"2011-05-10T07:18:02.068Z"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-autoreleasepool.git"},"_attachments":{"autoreleasepool-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-PBl3zD5b9xbJcWd/tnyOrA==","length":2952,"stub":true},"autoreleasepool-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SSl7X8EqCU9vM7Qo1gxxCw==","length":127375,"stub":true}}}},
{"id":"autorequire","key":"autorequire","value":{"rev":"63-f2bf30588b0e0789266c3cd769cea191"},"doc":{"_id":"autorequire","_rev":"63-f2bf30588b0e0789266c3cd769cea191","name":"autorequire","description":"Automatically requires source for a module/project, provided you follow a convention.","dist-tags":{"latest":"0.3.4"},"versions":{"0.1.1":{"name":"autorequire","version":"0.1.1","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"~v0.4.11"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/coffee-script/bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/docco/bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/coffee-script/bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/vows/bin/vows test/*_test.coffee --isolate --spec"},"_npmJsonOpts":{"file":"/Users/ian/.npm/autorequire/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autorequire@0.1.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c968734c1a9b99c572c34c54ffa07b739f5bf41b","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.1.1.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}],"_npmUser":{"name":"nevir","email":"ian@nevir.net"}},"0.1.2":{"name":"autorequire","version":"0.1.2","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.3 - v0.4.11"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"scripts/test-all"},"_npmJsonOpts":{"file":"/Users/ian/.npm/autorequire/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autorequire@0.1.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"2969cfed4fa330508d9dab5a37513a8602c1bd59","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.1.2.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}],"_npmUser":{"name":"nevir","email":"ian@nevir.net"}},"0.2.0":{"name":"autorequire","version":"0.2.0","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.3 - v0.4.11"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"scripts/test-all"},"_npmJsonOpts":{"file":"/Users/ian/.npm/autorequire/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autorequire@0.2.0","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"7c15488ad0cd1c2d31c645bb2ba9c24f8b5524c0","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.0.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}],"_npmUser":{"name":"nevir","email":"ian@nevir.net"}},"0.2.1":{"name":"autorequire","version":"0.2.1","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.3 - v0.4.11"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"scripts/test-all"},"_npmJsonOpts":{"file":"/Users/ian/.npm/autorequire/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autorequire@0.2.1","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ecf5311b3cdb25416672a6eedaef13cf44700c5e","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.1.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}],"_npmUser":{"name":"nevir","email":"ian@nevir.net"}},"0.2.2":{"name":"autorequire","version":"0.2.2","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.3 - v0.4.11"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"scripts/test-all"},"_npmJsonOpts":{"file":"/Users/ian/.npm/autorequire/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autorequire@0.2.2","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b9aae16bc1e0ed0b360f92aa01e2e300e9ead11f","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.2.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}],"_npmUser":{"name":"nevir","email":"ian@nevir.net"}},"0.2.3":{"name":"autorequire","version":"0.2.3","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.0 - v0.4.12"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.3","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"aa1ff619e6f09b24e53cb4d32a6d96ec267d95c9","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.3.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.4":{"name":"autorequire","version":"0.2.4","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.0 - v0.4.12 || v0.5.0 - v0.5.10"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","vows":"~0.5.11"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.4","_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9539c70509f31e9aa6e14cb63d6a49454911185c","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.4.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.5":{"name":"autorequire","version":"0.2.5","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.0 - v0.4.12 || v0.5.0 - v0.5.10 || v0.6.0"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.5","_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"e75cff8884e00356da6607167a701729b4d9b6c5","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.5.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.6":{"name":"autorequire","version":"0.2.6","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.0 - v0.4.12 || v0.5.0 - v0.5.10 || v0.6.0"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build":"npm run-script build-lib && npm run-script build-doc","build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","pretest":"npm run-script build-lib","test":"node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.6","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1a0241da0c525528ddb9e1f686cced561e2981dd","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.6.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.7":{"name":"autorequire","version":"0.2.7","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.0 - v0.4.12 || v0.5.0 - v0.5.10 || v0.6.0"},"dependencies":{},"devDependencies":{"coffee-script":"~1.1.2","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","prepublish":"scripts/prepublish","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.7","_engineSupported":false,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"902912251b0c6439605e0b5d34da8fec6f0a2774","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.7.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.8":{"name":"autorequire","version":"0.2.8","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":"v0.4.0 - v0.4.12 || v0.5.0 - v0.5.10 || v0.6.0 - v0.6.2"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","docco":"https://github.com/nevir/docco/tarball/recursive_dirs","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && node_modules/.bin/docco src/","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","prepublish":"scripts/prepublish","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.8","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"fe6c397ba35a5fb97b749e05e9f3c87c5e2187f8","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.8.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.9":{"name":"autorequire","version":"0.2.9","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":">= 0.4.0 <= 0.4.12 || >= 0.5.0 <= 0.5.10 || >= 0.6.0 <= 0.6.5"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && groc","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","prepublish":"scripts/prepublish","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.9","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8e7391dd9f51089507682716224312fb1424c100","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.9.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.2.10":{"name":"autorequire","version":"0.2.10","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"engines":{"node":">= 0.4.0 <= 0.4.12 || >= 0.5.0 <= 0.5.10 || >= 0.6.0 <= 0.6.6"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && groc","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","prepublish":"scripts/prepublish","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.2.10","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"109d41b42aa015f03baee8cd2c39ff0b94afe25b","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.2.10.tgz"},"readme":"# Autorequire\n\n[![Build Status](https://secure.travis-ci.org/nevir/node-autorequire.png)](http://travis-ci.org/nevir/node-autorequire)\n\nAutorequire provides a means of defining a consistent file and directory structure for your Node.js\npackages.  It does not force any one structure upon you - instead, it provides common\nconventions, and the ability to define your own if they do not suit.\n\nAt its heart, autorequire is an extensible replacement for Node's `require()`.  It also provides a\nsimple way of navigating a node package (from within and out), using the package's directory\nstructure as a guide, and the convention to assist in naming modules.\n\nWhen interacting with an autorequired Node package, each module and directory is lazy-loaded and\nthen memoized upon reference.  This ensures that it is a minimal performance hit.\n\n\n## Usage\n\nTo use autorequire for your package, at its most basic, is just the following in your index:\n\n    module.exports = require('autorequire')('./lib');\n\nThat's it!  You no longer need to require the core Node modules in any of your project's source\nfiles, nor do they need to require each other.  Consumers of your Node.js package require it\nnormally, and should not notice a difference.\n\n\n## Defining Custom Conventions\n\nShould the default convention not suit your needs, there are [several more defined]\n(https://github.com/nevir/node-autorequire/tree/master/src/conventions).  You can specify a\nbuilt-in convention by passing its name as the second argument to autorequire:\n\n    module.exports = require('autorequire')('./lib', 'Classical');\n\nOr, should you want to override a specific piece of the convention, you can inherit from the default\nconvention.  Or, for ease, you can simply pass a hash of instance methods, and autorequire will\nmanage the inheritance for you:\n\n    module.exports = require('autorequire')('./lib', {\n      directoryToProperty: function(directoryName, parentPath) {\n        return this.underscore(directoryName);\n      }\n    });\n\nFor a full reference of the methods that a convention can define, see the docs for the default\nconvention.\n\n\n## Notes\n\n__The caveat__ to autorequire is that every autorequired module is loaded within a sandboxed\nenvironment via `vm`'s `runInNewContext`.  This is so that lazy-loaded modules do not pollute the\nglobal context for everyone.  It's also a good practice for Node.js projects to adhere to.\n","maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.3.0":{"name":"autorequire","version":"0.3.0","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"git://github.com/nevir/node-autorequire.git"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"testedEngines":{"node":">= 0.4.0 <= 0.4.12 || >= 0.5.0 <= 0.5.10 || >= 0.6.0 <= 0.6.7"},"engines":{"node":">= 0.4.0 < 0.7.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && groc","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","prepublish":"scripts/prepublish","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"_npmUser":{"name":"nevir","email":"ian@nevir.net"},"_id":"autorequire@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d82a9c0766353ac3bd351291ae681ee0fce457cf","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.3.0.tgz"},"readme":"# Autorequire [![Build Status](https://secure.travis-ci.org/nevir/node-autorequire.png)](http://travis-ci.org/nevir/node-autorequire)\n\nAutorequire provides a means of defining a consistent file and directory structure for your Node.js\npackages.  It does not force any one structure upon you - instead, it provides common\nconventions, and the ability to define your own if they do not suit.\n\nAt its heart, autorequire is an extensible replacement for Node's `require()`.  It also provides a\nsimple way of navigating a node package (from within and out), using the package's directory\nstructure as a guide, and the convention to assist in naming modules.\n\nWhen interacting with an autorequired Node package, each module and directory is lazy-loaded and\nthen memoized upon reference.  This ensures that it is a minimal performance hit.\n\n\n## Usage\n\nTo use autorequire for your package, at its most basic, is just the following in your index:\n\n    module.exports = require('autorequire')('./lib');\n\nThat's it!  You no longer need to require the core Node modules in any of your project's source\nfiles, nor do they need to require each other.  Consumers of your Node.js package require it\nnormally, and should not notice a difference.\n\n\n## Defining Custom Conventions\n\nShould the default convention not suit your needs, there are [several more defined]\n(https://github.com/nevir/node-autorequire/tree/master/src/conventions).  You can specify a\nbuilt-in convention by passing its name as the second argument to autorequire:\n\n    module.exports = require('autorequire')('./lib', 'Classical');\n\nOr, should you want to override a specific piece of the convention, you can inherit from the default\nconvention.  Or, for ease, you can simply pass a hash of instance methods, and autorequire will\nmanage the inheritance for you:\n\n    module.exports = require('autorequire')('./lib', {\n      directoryToProperty: function(directoryName, parentPath) {\n        return this.underscore(directoryName);\n      }\n    });\n\nFor a full reference of the methods that a convention can define, see the docs for the default\nconvention.\n\n\n## Notes\n\n__The caveat__ to autorequire is that every autorequired module is loaded within a sandboxed\nenvironment via `vm`'s `runInNewContext`.  This is so that lazy-loaded modules do not pollute the\nglobal context for everyone.  It's also a good practice for Node.js projects to adhere to.\n","maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.3.1":{"name":"autorequire","version":"0.3.1","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"https://github.com/nevir/node-autorequire"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"testedEngines":{"node":">= 0.4.0 <= 0.4.12 || >= 0.5.0 <= 0.5.10 || >= 0.6.0 <= 0.6.19 || >= 0.7.0 <= 0.7.12 || >= 0.8.0"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && groc","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"readme":"# Autorequire [![Build Status](https://secure.travis-ci.org/nevir/node-autorequire.png)](http://travis-ci.org/nevir/node-autorequire)\n\nAutorequire provides a means of defining a consistent file and directory structure for your Node.js\npackages.  It does not force any one structure upon you - instead, it provides common\nconventions, and the ability to define your own if they do not suit.\n\nAt its heart, autorequire is an extensible replacement for Node's `require()`.  It also provides a\nsimple way of navigating a node package (from within and out), using the package's directory\nstructure as a guide, and the convention to assist in naming modules.\n\nWhen interacting with an autorequired Node package, each module and directory is lazy-loaded and\nthen memoized upon reference.  This ensures that it is a minimal performance hit.\n\n\n## Usage\n\nTo use autorequire for your package, at its most basic, is just the following in your index:\n\n    module.exports = require('autorequire')('./lib');\n\nThat's it!  You no longer need to require the core Node modules in any of your project's source\nfiles, nor do they need to require each other.  Consumers of your Node.js package require it\nnormally, and should not notice a difference.\n\n\n## Defining Custom Conventions\n\nShould the default convention not suit your needs, there are [several more defined]\n(https://github.com/nevir/node-autorequire/tree/master/src/conventions).  You can specify a\nbuilt-in convention by passing its name as the second argument to autorequire:\n\n    module.exports = require('autorequire')('./lib', 'Classical');\n\nOr, should you want to override a specific piece of the convention, you can inherit from the default\nconvention.  Or, for ease, you can simply pass a hash of instance methods, and autorequire will\nmanage the inheritance for you:\n\n    module.exports = require('autorequire')('./lib', {\n      directoryToProperty: function(directoryName, parentPath) {\n        return this.underscore(directoryName);\n      }\n    });\n\nFor a full reference of the methods that a convention can define, see the docs for the default\nconvention.\n\n\n## Notes\n\n__The caveat__ to autorequire is that every autorequired module is loaded within a sandboxed\nenvironment via `vm`'s `runInNewContext`.  This is so that lazy-loaded modules do not pollute the\nglobal context for everyone.  It's also a good practice for Node.js projects to adhere to.\n","_id":"autorequire@0.3.1","dist":{"shasum":"210b6436fa3c901576ffaddfb4fbd1cb77cfc8a6","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.3.1.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.3.2":{"name":"autorequire","version":"0.3.2","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"https://github.com/nevir/node-autorequire"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"testedEngines":{"node":">= 0.4.0 <= 0.4.12 || >= 0.5.0 <= 0.5.10 || >= 0.6.0 <= 0.6.19 || >= 0.7.0 <= 0.7.12 || >= 0.8.0"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && groc","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"readme":"# Autorequire [![Build Status](https://secure.travis-ci.org/nevir/node-autorequire.png)](http://travis-ci.org/nevir/node-autorequire)\n\nAutorequire provides a means of defining a consistent file and directory structure for your Node.js\npackages.  It does not force any one structure upon you - instead, it provides common\nconventions, and the ability to define your own if they do not suit.\n\nAt its heart, autorequire is an extensible replacement for Node's `require()`.  It also provides a\nsimple way of navigating a node package (from within and out), using the package's directory\nstructure as a guide, and the convention to assist in naming modules.\n\nWhen interacting with an autorequired Node package, each module and directory is lazy-loaded and\nthen memoized upon reference.  This ensures that it is a minimal performance hit.\n\n\n## Usage\n\nTo use autorequire for your package, at its most basic, is just the following in your index:\n\n    module.exports = require('autorequire')('./lib');\n\nThat's it!  You no longer need to require the core Node modules in any of your project's source\nfiles, nor do they need to require each other.  Consumers of your Node.js package require it\nnormally, and should not notice a difference.\n\n\n## Defining Custom Conventions\n\nShould the default convention not suit your needs, there are [several more defined]\n(https://github.com/nevir/node-autorequire/tree/master/src/conventions).  You can specify a\nbuilt-in convention by passing its name as the second argument to autorequire:\n\n    module.exports = require('autorequire')('./lib', 'Classical');\n\nOr, should you want to override a specific piece of the convention, you can inherit from the default\nconvention.  Or, for ease, you can simply pass a hash of instance methods, and autorequire will\nmanage the inheritance for you:\n\n    module.exports = require('autorequire')('./lib', {\n      directoryToProperty: function(directoryName, parentPath) {\n        return this.underscore(directoryName);\n      }\n    });\n\nFor a full reference of the methods that a convention can define, see the docs for the default\nconvention.\n\n\n## Notes\n\n__The caveat__ to autorequire is that every autorequired module is loaded within a sandboxed\nenvironment via `vm`'s `runInNewContext`.  This is so that lazy-loaded modules do not pollute the\nglobal context for everyone.  It's also a good practice for Node.js projects to adhere to.\n","_id":"autorequire@0.3.2","dist":{"shasum":"0bffa46eeeac091adea35baa5a4c3bf5b9f770e2","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.3.2.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]},"0.3.4":{"name":"autorequire","version":"0.3.4","description":"Automatically requires source for a module/project, provided you follow a convention.","keywords":["require","autorequire","autoload","modules","load","loader"],"homepage":"https://github.com/nevir/node-autorequire","author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"licenses":[{"type":"MIT","url":"https://github.com/nevir/node-autorequire/MIT-LICENSE.txt"}],"repository":{"type":"git","url":"https://github.com/nevir/node-autorequire"},"main":"./lib/autorequire","directories":{"lib":"./lib"},"testedEngines":{"node":">= 0.4.0 <= 0.4.12 || >= 0.5.0 <= 0.5.10 || >= 0.6.0 <= 0.6.19 || >= 0.7.0 <= 0.7.12 || >= 0.8.0"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.1.3","semver":"~1.0.10","underscore":"~1.2.1","vows":"~0.5.13"},"scripts":{"build-lib":"rm -rf lib && node_modules/.bin/coffee -c -o lib/ src/","build-doc":"rm -rf doc && rm -rf doc && groc","console":"npm run-script build-lib && rlwrap --always-readline node_modules/.bin/coffee","test":"npm run-script build-lib && node_modules/.bin/vows test/*_test.coffee --isolate --spec","test-all":"npm run-script build-lib && scripts/test"},"readme":"# Autorequire [![Build Status](https://secure.travis-ci.org/nevir/node-autorequire.png)](http://travis-ci.org/nevir/node-autorequire)\n\nAutorequire provides a means of defining a consistent file and directory structure for your Node.js\npackages.  It does not force any one structure upon you - instead, it provides common\nconventions, and the ability to define your own if they do not suit.\n\nAt its heart, autorequire is an extensible replacement for Node's `require()`.  It also provides a\nsimple way of navigating a node package (from within and out), using the package's directory\nstructure as a guide, and the convention to assist in naming modules.\n\nWhen interacting with an autorequired Node package, each module and directory is lazy-loaded and\nthen memoized upon reference.  This ensures that it is a minimal performance hit.\n\n\n## Usage\n\nTo use autorequire for your package, at its most basic, is just the following in your index:\n\n    module.exports = require('autorequire')('./lib');\n\nThat's it!  You no longer need to require the core Node modules in any of your project's source\nfiles, nor do they need to require each other.  Consumers of your Node.js package require it\nnormally, and should not notice a difference.\n\n\n## Defining Custom Conventions\n\nShould the default convention not suit your needs, there are [several more defined]\n(https://github.com/nevir/node-autorequire/tree/master/src/conventions).  You can specify a\nbuilt-in convention by passing its name as the second argument to autorequire:\n\n    module.exports = require('autorequire')('./lib', 'Classical');\n\nOr, should you want to override a specific piece of the convention, you can inherit from the default\nconvention.  Or, for ease, you can simply pass a hash of instance methods, and autorequire will\nmanage the inheritance for you:\n\n    module.exports = require('autorequire')('./lib', {\n      directoryToProperty: function(directoryName, parentPath) {\n        return this.underscore(directoryName);\n      }\n    });\n\nFor a full reference of the methods that a convention can define, see the docs for the default\nconvention.\n\n\n## Notes\n\n__The caveat__ to autorequire is that every autorequired module is loaded within a sandboxed\nenvironment via `vm`'s `runInNewContext`.  This is so that lazy-loaded modules do not pollute the\nglobal context for everyone.  It's also a good practice for Node.js projects to adhere to.\n","_id":"autorequire@0.3.4","dist":{"shasum":"bbbb3c0e7a48cf43667d7bba22759f0de38e110a","tarball":"http://registry.npmjs.org/autorequire/-/autorequire-0.3.4.tgz"},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}]}},"maintainers":[{"name":"nevir","email":"ian@nevir.net"}],"time":{"modified":"2012-07-17T01:59:31.749Z","created":"2011-08-25T09:56:18.372Z","0.1.0":"2011-08-25T09:56:19.519Z","0.1.1":"2011-12-07T03:32:14.376Z","0.1.2":"2011-12-07T03:32:14.376Z","0.2.0":"2011-12-07T03:32:14.376Z","0.2.1":"2011-12-07T03:32:14.376Z","0.2.2":"2011-12-07T03:32:14.376Z","0.2.3":"2011-10-30T20:03:10.233Z","0.2.4":"2011-10-31T01:40:52.230Z","0.2.5":"2011-11-06T08:34:17.474Z","0.2.6":"2011-11-06T21:33:06.989Z","0.2.7":"2011-11-10T05:28:38.989Z","0.2.8":"2011-11-22T03:46:34.250Z","0.2.9":"2011-12-07T04:44:44.412Z","0.2.10":"2011-12-21T00:43:14.665Z","0.3.0":"2012-01-10T03:43:23.602Z","0.3.1":"2012-06-27T18:46:53.503Z","0.3.2":"2012-07-11T18:24:08.089Z","0.3.3":"2012-07-17T01:47:25.332Z","0.3.4":"2012-07-17T01:58:32.397Z"},"author":{"name":"Ian MacLeod","email":"ian@nevir.net","url":"https://github.com/nevir"},"repository":{"type":"git","url":"https://github.com/nevir/node-autorequire"},"_attachments":{"autorequire-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-f9GkDvfMJciSLoHVKag+zw==","length":34782,"stub":true},"autorequire-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-occWOPTWZhG2ues4qE78vQ==","length":34765,"stub":true},"autorequire-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-+JoLTvUBrsGtW3R2VqNKYA==","length":34727,"stub":true},"autorequire-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-wKj9Ou6F+8+ZIznags8cgw==","length":35003,"stub":true},"autorequire-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-yrKxPSXVRNixOi1KDPDG5g==","length":34935,"stub":true},"autorequire-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-0OpOpaEWcS9dHAYnbAKQxg==","length":34941,"stub":true},"autorequire-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-D1Y+pQgd5LYu2HwV1XHS1g==","length":40960,"stub":true},"autorequire-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-uE20rmxVkUQHJkuMpFfHWA==","length":40960,"stub":true},"autorequire-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-9KdkiUwd8HVeN8ZDc4opjA==","length":40960,"stub":true},"autorequire-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-uBzyHGThb2Mn1J5tTbmODg==","length":30720,"stub":true},"autorequire-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-l5rs8TffNniKPjGNo6BlNg==","length":30720,"stub":true},"autorequire-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-NWdghBD4oV4TRi3hSaI+Mw==","length":30720,"stub":true},"autorequire-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-c43pdHB9Gmv5NLYpMs5WVw==","length":27207,"stub":true},"autorequire-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-8/vdpyijNFqXhXELVQ5zcw==","length":23723,"stub":true},"autorequire-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-kMJUxQH4D+masPbAJpJc1w==","length":22462,"stub":true},"autorequire-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-owVDjmMA6GaHoAJl/dhT9Q==","length":22152,"stub":true},"autorequire-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kZiUmAhfczpMMxqG+xEmQA==","length":21746,"stub":true}}}},
{"id":"autoresolve","key":"autoresolve","value":{"rev":"11-c5c48b587b0f2964c865f4821c76cead"},"doc":{"_id":"autoresolve","_rev":"11-c5c48b587b0f2964c865f4821c76cead","name":"autoresolve","description":"A simple module to auto resolve module paths.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"autoresolve","version":"0.0.1","description":"A simple module to auto resolve module paths.","homepage":["https://github.com/jprichardson/node-autoresolve"],"repository":{"type":"git","url":"git://github.com/jprichardson/node-autoresolve.git"},"keywords":["require","autoresolve","path","resolve"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":"http://github.com/jprichardson/node-autoresolve/raw/master/LICENSE"}],"devDepdencies":{"mocha":"1.1.x"},"main":"./lib/autoresolve","scripts":{"test":"mocha test"},"_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"autoresolve@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"538367685d9aa3cbbed8ea85310380f0e70ad03d","tarball":"http://registry.npmjs.org/autoresolve/-/autoresolve-0.0.1.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}],"directories":{}},"0.0.2":{"name":"autoresolve","version":"0.0.2","description":"A simple module to auto resolve module paths.","homepage":["https://github.com/jprichardson/node-autoresolve"],"repository":{"type":"git","url":"git://github.com/jprichardson/node-autoresolve.git"},"keywords":["require","autoresolve","path","resolve"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":"http://github.com/jprichardson/node-autoresolve/raw/master/LICENSE"}],"devDepdencies":{"mocha":"1.1.x"},"main":"./lib/autoresolve","scripts":{"test":"mocha test"},"_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"autoresolve@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cf9044c06ec209b39869ff89936aaef403f76066","tarball":"http://registry.npmjs.org/autoresolve/-/autoresolve-0.0.2.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}],"directories":{}},"0.0.3":{"name":"autoresolve","version":"0.0.3","description":"A simple module to auto resolve module paths.","homepage":["https://github.com/jprichardson/node-autoresolve"],"repository":{"type":"git","url":"git://github.com/jprichardson/node-autoresolve.git"},"keywords":["require","autoresolve","path","resolve"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":"http://github.com/jprichardson/node-autoresolve/raw/master/LICENSE"}],"devDepdencies":{"mocha":"1.1.x"},"main":"./lib/autoresolve","scripts":{"test":"mocha test"},"_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"autoresolve@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f6f0c79ed900c0c0941225e8a7ad5e219d9d42c0","tarball":"http://registry.npmjs.org/autoresolve/-/autoresolve-0.0.3.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]}},"readme":"Node.js - autoresolve\n=====================\n\nThis autoresolves package locations for you. This prevents such ugliness as:\n\n```js\nvar mypackage = require('../../../lib/models/customer');\nvar another = require(path.join(__dirname, 'lib/models/customer'));\nvar somepack = require(path.join(process.cwd(), 'lib/models/customer'));\n\nInstallation\n------------\n\n    npm install autoresolve\n\n\n\nExample\n-------\n\n`autoresolve` simply looks for your `package.json` file and considers that its base directory. If it can't find `package.json`, it then uses `process.cwd()`.\n\n\n```javascript\nvar P = require('autoresolve');\nvar customer = require(P('lib/models/customer'));\n```\n\n\nLicense\n-------\n\nLicensed under MIT. See `LICENSE` for more details.\n\nCopyright (c) 2012 JP Richardson","maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}],"time":{"modified":"2012-07-17T17:58:45.218Z","created":"2012-07-17T16:47:06.531Z","0.0.1":"2012-07-17T16:47:09.882Z","0.0.2":"2012-07-17T17:50:46.763Z","0.0.3":"2012-07-17T17:58:45.218Z"},"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"repository":{"type":"git","url":"git://github.com/jprichardson/node-autoresolve.git"},"_attachments":{"autoresolve-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-E9Grh4GpPCT8AogUvktUWA==","length":2417,"stub":true},"autoresolve-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Jtmz/7HSDpdTV0FdoEq37A==","length":2410,"stub":true},"autoresolve-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uEvO6jVpNT8C5Ec3KcuOdw==","length":2200,"stub":true}}}},
{"id":"autorev","key":"autorev","value":{"rev":"3-bc482ccc61bdb082bfc03b99f7d30a70"},"doc":{"_id":"autorev","_rev":"3-bc482ccc61bdb082bfc03b99f7d30a70","name":"autorev","description":"blindly update couchdb documents","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"autorev","description":"blindly update couchdb documents","version":"0.0.0","repository":{"type":"git","url":"git://github.com/substack/autorev.git"},"main":"index.js","bin":{"autorev":"bin/autorev.js"},"keywords":["couchdb","_rev","_id","ddoc","design","document"],"directories":{"lib":".","example":"example","test":"test"},"dependencies":{"request":"2.9.x","deep-equal":"0.0.x","traverse":"0.5.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"autorev@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3ca017b9446f3fb46c663ecfc82fbfbdf7aea1f4","tarball":"http://registry.npmjs.org/autorev/-/autorev-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"readme":null,"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-02-19T17:47:37.617Z","created":"2012-02-19T17:47:36.254Z","0.0.0":"2012-02-19T17:47:37.617Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/autorev.git"},"_attachments":{"autorev-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oHxcq2etaMdJd0ImOKtyjg==","length":2244,"stub":true}}}},
{"id":"autosave","key":"autosave","value":{"rev":"52-bf637f9934e731441305c91243ae98ef"},"doc":{"_id":"autosave","_rev":"52-bf637f9934e731441305c91243ae98ef","name":"autosave","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","dist-tags":{"latest":"1.0.2"},"versions":{"0.1.0":{"name":"autosave","version":"0.1.0","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.97","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"66cbb734a31d2bc477a2e5fec41cc5330bf5fc1c","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.1.0.tgz"},"maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.2.0":{"name":"autosave","version":"0.2.0","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.97","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"2d4c08ca0cd9fc55061f9a1844c1b699811ddbda","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.2.0.tgz"},"maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.2.1":{"name":"autosave","version":"0.2.1","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"017acb05fb349788106465787c1bf4e743bc6782","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.2.1.tgz"},"maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.2.2":{"name":"autosave","version":"0.2.2","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"615bd3f6633d3a25bf5174c3fc00f4018e00af3e","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.2.2.tgz"},"maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.2.3":{"name":"autosave","version":"0.2.3","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"71d5fae721f0f2e38b276b0cf74a06d97732d2c7","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.2.3.tgz"},"maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.3.0":{"name":"autosave","version":"0.3.0","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.3.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4c6933380bb8acc46d8360bfa6dc64c056facc2c","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.3.0.tgz"},"readme":"","maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.3.1":{"name":"autosave","version":"0.3.1","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.3.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"6d96191210bb2c5ec9d6777cee1201a14b9f8f2c","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.3.1.tgz"},"readme":"","maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"0.3.2":{"name":"autosave","version":"0.3.2","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@0.3.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"dc1114ad8a3a977f48bfb9ccb2becc84409d6af9","tarball":"http://registry.npmjs.org/autosave/-/autosave-0.3.2.tgz"},"readme":"","maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"1.0.0":{"name":"autosave","version":"1.0.0","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"scripts":{"autostart":"./scripts/autostart.sh","install":"node ./scripts/install.js"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@1.0.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f7d2ce148eee3ad956fbca0260a225a04e4c6f49","tarball":"http://registry.npmjs.org/autosave/-/autosave-1.0.0.tgz"},"readme":"","maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"1.0.1":{"name":"autosave","version":"1.0.1","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"scripts":{"autostart":"./scripts/autostart.sh","install":"node ./scripts/install.js"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@1.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e477f19c27e178b1125c6bdb27d8076946715238","tarball":"http://registry.npmjs.org/autosave/-/autosave-1.0.1.tgz"},"readme":"","maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"directories":{}},"1.0.2":{"name":"autosave","version":"1.0.2","description":"A server for Chrome Devtools Autosave (https://github.com/NV/chrome-devtools-autosave)","keywords":["devtools"],"bin":{"autosave":"./bin/autosave"},"scripts":{"autostart":"./scripts/autostart.sh","install":"node ./scripts/install.js"},"preferGlobal":true,"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"main":"index","engines":{"node":">= 0.4.x"},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"bugs":{"url":"https://github.com/NV/chrome-devtools-autosave-server/issues"},"dependencies":{"commander":"0.5.x"},"_npmUser":{"name":"nv","email":"me@elv1s.ru"},"_id":"autosave@1.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"713cb8ad7f10f93ce8a9dc7899f6a97a44d82a63","tarball":"http://registry.npmjs.org/autosave/-/autosave-1.0.2.tgz"},"readme":"","maintainers":[{"name":"nv","email":"me@elv1s.ru"}]}},"maintainers":[{"name":"nv","email":"me@elv1s.ru"}],"time":{"modified":"2012-06-13T11:31:40.987Z","created":"2011-12-19T03:30:50.972Z","0.1.0":"2011-12-19T03:30:51.786Z","0.2.0":"2011-12-20T17:04:07.674Z","0.2.1":"2011-12-20T22:05:22.643Z","0.2.2":"2011-12-22T18:38:38.514Z","0.2.3":"2012-01-13T22:32:02.386Z","0.3.0":"2012-02-07T12:12:51.194Z","0.3.1":"2012-02-10T23:58:40.966Z","0.3.2":"2012-02-28T22:57:36.769Z","1.0.0":"2012-06-12T13:39:20.736Z","1.0.1":"2012-06-12T13:40:53.429Z","1.0.2":"2012-06-13T11:31:40.987Z"},"author":{"name":"Nikita Vasilyev","email":"me@elv1s.ru"},"users":{"nv":true},"repository":{"type":"git","url":"git://github.com/NV/chrome-devtools-autosave-server.git"},"_attachments":{"autosave-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-EtXx+pvBG75Z+z8K3gpqMA==","length":21395,"stub":true},"autosave-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-pfmhjazoWP6+4BdWFRizLA==","length":21487,"stub":true},"autosave-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-zWkXwKHOFMudncoYRJk8xw==","length":21483,"stub":true},"autosave-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-hrxAhrzqCOBxi5jf8hek5g==","length":1907,"stub":true},"autosave-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-6QCcPPTAT/6tAXiY/4zDig==","length":1916,"stub":true},"autosave-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-mIY7l9CtS1QIhNzGucG2XA==","length":1814,"stub":true},"autosave-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-DaQrErzbBG28PHuIkhXSOw==","length":10240,"stub":true},"autosave-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-BULZy4qAKrUnsoEG+o2mgw==","length":10240,"stub":true},"autosave-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-lihSeiqSpo7nW1RfK5OhJA==","length":10240,"stub":true},"autosave-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-5EktaZPgdSVo54+AcemxSA==","length":10240,"stub":true},"autosave-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gzBxTmAc8oC4PQ7EyaUtmQ==","length":10240,"stub":true}}}},
{"id":"autostatic","key":"autostatic","value":{"rev":"27-964d029f821e4b28bedff6b32b3dc3f7"},"doc":{"_id":"autostatic","_rev":"27-964d029f821e4b28bedff6b32b3dc3f7","name":"autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","dist-tags":{"latest":"0.0.9-4"},"versions":{"0.0.1":{"name":"autostatic","version":"0.0.1","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control, compression and CDN support. This makes it possible to get rid of all the annoying packaging process of deployment.","keywords":["express","assets management","compression","minify"],"contributors":[{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"}],"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ca1685063d7296745cb4766c9a91f1a681c11f46","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.1.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.2":{"name":"autostatic","version":"0.0.2","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control, compression and CDN support. This makes it possible to get rid of all the annoying packaging process of deployment.","keywords":["express","packaging","compression","minify","assets management","cdn"],"contributors":[{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"}],"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"08dfc2403fae015ac4f5f89b43f0ef191b507fbe","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.2.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.3":{"name":"autostatic","version":"0.0.3","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control, compression and CDN support. This makes it possible to get rid of all the annoying packaging process of deployment.","keywords":["express","packaging","compression","minify","assets management","cdn"],"contributors":[{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"}],"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7f5f81c604010f1fe3e947b83e3ad52fe62bd477","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.3.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.4-1":{"name":"autostatic","version":"0.0.4-1","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.4-1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"71bfcd7a748a4e268da2ee8028dec4d264144fe8","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.4-1.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.5-1":{"name":"autostatic","version":"0.0.5-1","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.5-1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d5510e0e24f26a53bd1ae7c81ca880a3e7ea51ad","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.5-1.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.6":{"name":"autostatic","version":"0.0.6","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8152e4ec9304d298deb10988471a74bedca2bf02","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.6.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.7":{"name":"autostatic","version":"0.0.7","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.7","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"743c8e6bbabcfb152b4a90f8e962ed174376d10b","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.7.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.8":{"name":"autostatic","version":"0.0.8","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.8","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2476f20d1c923dac66ae1862ffe459c24b1dfd97","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.8.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.9":{"name":"autostatic","version":"0.0.9","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.9","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"be80fe534f305696404f2bbd1176b8aea3f95c98","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.9.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.9-1":{"name":"autostatic","version":"0.0.9-1","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.9-1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1adaf9a0055f643f62045b005c0a98ca143f2d20","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.9-1.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.9-2":{"name":"autostatic","version":"0.0.9-2","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.9-2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0d6351a03ed0dfe166495f83b09a284a789ba235","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.9-2.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.9-3":{"name":"autostatic","version":"0.0.9-3","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","debug":"*","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.9-3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"51fec471e50454611af123118b070259d8ca9dd9","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.9-3.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]},"0.0.9-4":{"name":"autostatic","version":"0.0.9-4","homepage":"http://github.com/ktmud/autostatic","description":"Automatically serve static files, with version control (etag support), compression and CDN support. This makes it possible to skip all the annoying packaging process when deploying your application.","keywords":["express","packaging","compression","minify","assets","cdn","deploy"],"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"main":"./lib/autostatic","repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"dependencies":{"less":">= 1.0","debug":"*","stylus":">= 0.1","uglify-js":">= 1.0","uglifycss":">= 0.0.5"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"ktmud","email":"jyyjcc@gmail.com"},"_id":"autostatic@0.0.9-4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ee0af324d3566370b4d581cc954f92fe9cbace22","tarball":"http://registry.npmjs.org/autostatic/-/autostatic-0.0.9-4.tgz"},"maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}]}},"readme":"== AutoStatic ==\n\nAutomatically serve static files, with version control, compression and CDN support. This makes it possible to get rid of all the annoying packaging process of deployment.\n","maintainers":[{"name":"ktmud","email":"jyyjcc@gmail.com"}],"time":{"modified":"2012-06-08T09:01:27.167Z","created":"2012-03-20T17:27:20.654Z","0.0.1":"2012-03-20T17:27:24.241Z","0.0.2":"2012-03-20T17:35:03.337Z","0.0.3":"2012-03-24T17:08:31.846Z","0.0.4-1":"2012-03-24T17:20:15.626Z","0.0.5-1":"2012-03-25T07:10:51.550Z","0.0.6":"2012-03-26T10:01:45.353Z","0.0.7":"2012-03-28T14:37:14.116Z","0.0.8":"2012-04-07T08:05:18.523Z","0.0.9":"2012-04-07T15:39:15.871Z","0.0.9-1":"2012-04-07T17:42:59.550Z","0.0.9-2":"2012-06-07T07:12:52.567Z","0.0.9-3":"2012-06-07T15:43:26.982Z","0.0.9-4":"2012-06-08T09:01:27.167Z"},"repository":{"type":"git","url":"git@github.com/ktmud/autostatic.git"},"author":{"name":"ktmud","email":"jyyjcc@gmail.com","url":"http://ktmud.com"},"_attachments":{"autostatic-0.0.9-4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-az+hACCKAPkzoNAE86W6fw==","length":5665,"stub":true},"autostatic-0.0.9-3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-xY25ILESaWfwrbOSU8eVDg==","length":5634,"stub":true},"autostatic-0.0.9-2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-6SCElHT3TkAMPHF4Jsav3g==","length":5674,"stub":true},"autostatic-0.0.9-1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-7DzFMPZZZxwlB3iRdlSaCw==","length":5403,"stub":true},"autostatic-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-P6q8U3LpeGTY20CyHn9RSQ==","length":5364,"stub":true},"autostatic-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-hmvPMat+jdxcXZ5PKoXucw==","length":5361,"stub":true},"autostatic-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-nihPkXwBqlLyJ5pD5ZtkwQ==","length":5276,"stub":true},"autostatic-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-WadV2OqIhHeJ1kVnUWHjCg==","length":4422,"stub":true},"autostatic-0.0.5-1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Mvch5DzJSp0Zhk4zIHwOww==","length":4263,"stub":true},"autostatic-0.0.4-1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-cAxoe5zf1trFw+/YN75ooQ==","length":3895,"stub":true},"autostatic-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-u9dyE9X3xqbH6UWwt5HkRw==","length":3922,"stub":true},"autostatic-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QqHmJYiC0Nk0kdI2LND5Yw==","length":3168,"stub":true},"autostatic-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WXb03pdfpQaag5zhfU+t8Q==","length":3156,"stub":true}}}},
{"id":"autotest","key":"autotest","value":{"rev":"13-9c25a35423a73f8ae4e6c06a1b6b83cc"},"doc":{"_id":"autotest","_rev":"13-9c25a35423a73f8ae4e6c06a1b6b83cc","name":"autotest","description":"Simple script to provide some autotest capabilities for node or python.","dist-tags":{"latest":"0.2.6"},"versions":{"0.1.1":{"name":"autotest","homepage":"http://github.com/realistschuckle/autotest","author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"bin":{"autotest":"./autotest.js"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"description":"Simple script to provide some autotest capabilities.","keywords":["monitor","development","restart","autotest","reload"],"version":"0.1.1","preferGlobal":"true","main":"./autotest","dependencies":{},"devDependencies":{},"_id":"autotest@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"1d2829c697bb7b479035ea857f91c58aeb358293","tarball":"http://registry.npmjs.org/autotest/-/autotest-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"autotest","homepage":"http://github.com/realistschuckle/autotest","author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"bin":{"autotest":"./autotest.js"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"description":"Simple script to provide some autotest capabilities.","keywords":["monitor","development","restart","autotest","reload"],"version":"0.1.2","preferGlobal":"true","main":"./autotest","dependencies":{},"devDependencies":{},"_id":"autotest@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5e64d4bfd48b3c5884867996e2def994aa582523","tarball":"http://registry.npmjs.org/autotest/-/autotest-0.1.2.tgz"},"scripts":{}},"0.2.0":{"name":"autotest","homepage":"http://github.com/realistschuckle/autotest","author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"bin":{"autotest":"./autotest.js"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"description":"Simple script to provide some autotest capabilities for node or python.","keywords":["monitor","development","restart","autotest","reload"],"version":"0.2.0","preferGlobal":"true","main":"./autotest","dependencies":{},"devDependencies":{},"_id":"autotest@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"4cfdce2ba4e529f0623dec35e117b68caef3b459","tarball":"http://registry.npmjs.org/autotest/-/autotest-0.2.0.tgz"},"scripts":{}},"0.2.2":{"name":"autotest","homepage":"http://github.com/realistschuckle/autotest","author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"bin":{"autotest":"./autotest.js"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"description":"Simple script to provide some autotest capabilities for node or python.","keywords":["monitor","development","restart","autotest","reload"],"version":"0.2.2","preferGlobal":"true","main":"./autotest","_npmJsonOpts":{"file":"/Users/curtis/.npm/autotest/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autotest@0.2.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4dec734a3fc36889edc88a612d0b911f8c04614e","tarball":"http://registry.npmjs.org/autotest/-/autotest-0.2.2.tgz"},"maintainers":[{"name":"realistschuckle","email":"realistschuckle@gmail.com"}]},"0.2.4":{"name":"autotest","homepage":"http://github.com/realistschuckle/autotest","author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"bin":{"autotest":"./autotest.js"},"dependencies":{"colors":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"description":"Simple script to provide some autotest capabilities for node or python.","keywords":["monitor","development","restart","autotest","reload"],"version":"0.2.4","preferGlobal":"true","main":"./autotest","_npmJsonOpts":{"file":"/Users/curtis/.npm/autotest/0.2.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"autotest@0.2.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"941832f24db757646db42e3164a125c322f3ebbc","tarball":"http://registry.npmjs.org/autotest/-/autotest-0.2.4.tgz"},"maintainers":[{"name":"realistschuckle","email":"realistschuckle@gmail.com"}]},"0.2.6":{"name":"autotest","homepage":"http://github.com/realistschuckle/autotest","author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"bin":{"autotest":"./autotest.js"},"dependencies":{"colors":">= 0.5.0"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"description":"Simple script to provide some autotest capabilities for node or python.","keywords":["monitor","development","restart","autotest","reload"],"version":"0.2.6","preferGlobal":"true","main":"./autotest","_npmUser":{"name":"realistschuckle","email":"realistschuckle@gmail.com"},"_id":"autotest@0.2.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3f73cee95de0b7c79330675dea5ac61f7f5d3640","tarball":"http://registry.npmjs.org/autotest/-/autotest-0.2.6.tgz"},"maintainers":[{"name":"realistschuckle","email":"realistschuckle@gmail.com"}]}},"maintainers":[{"name":"realistschuckle","email":"realistschuckle@gmail.com"}],"time":{"modified":"2012-06-01T00:47:42.377Z","created":"2011-05-14T04:30:59.380Z","0.1.1":"2011-05-14T04:31:00.377Z","0.1.2":"2011-05-14T15:37:06.556Z","0.2.0":"2011-05-28T00:59:28.572Z","0.2.2":"2011-10-07T17:04:52.079Z","0.2.4":"2011-10-17T18:22:37.707Z","0.2.6":"2012-06-01T00:47:42.377Z"},"author":{"name":"Curtis Schlak","url":"http://github.com/realistschuckle"},"repository":{"type":"git","url":"git://github.com/realistschuckle/autotest.git"},"_attachments":{"autotest-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-sQ3jXj7ghWw5DqDycRIX1g==","length":10240,"stub":true},"autotest-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+5Kbu7hp2oYpHUd1+5bkhw==","length":4213,"stub":true},"autotest-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-63MEEJOIvR/hJ5bBl1J2mw==","length":3593,"stub":true},"autotest-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8izdl9eeMD0dPy+jzajqgQ==","length":2933,"stub":true},"autotest-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4bNFJH4TRMpkLnyG0La8jg==","length":2736,"stub":true},"autotest-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Um+nazM5v0L4ov5yW9KOqg==","length":2722,"stub":true}}}},
{"id":"avahi","key":"avahi","value":{"rev":"3-64ef7dfcc4d5a5c0a64b6c50a4b5f805"},"doc":{"_id":"avahi","_rev":"3-64ef7dfcc4d5a5c0a64b6c50a4b5f805","name":"avahi","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"avahi","main":"avahi.js","version":"0.0.1","author":{"name":"Izaak Schroeder"},"_npmUser":{"name":"izaakschroeder","email":"izaak.schroeder@gmail.com"},"_id":"avahi@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"610ed4a2360838656ce4b86ac6e54dc5eb862d8d","tarball":"http://registry.npmjs.org/avahi/-/avahi-0.0.1.tgz"},"readme":"","maintainers":[{"name":"izaakschroeder","email":"izaak.schroeder@gmail.com"}]}},"readme":"","maintainers":[{"name":"izaakschroeder","email":"izaak.schroeder@gmail.com"}],"time":{"modified":"2012-03-06T16:18:07.598Z","created":"2012-03-06T16:18:06.027Z","0.0.1":"2012-03-06T16:18:07.598Z"},"author":{"name":"Izaak Schroeder"},"_attachments":{"avahi-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mZNKxg3GE+nb9UUta/EwAg==","length":2840,"stub":true}}}},
{"id":"avatars.io","key":"avatars.io","value":{"rev":"13-54450d2d0edc1ac528f2556ce22686ba"},"doc":{"_id":"avatars.io","_rev":"13-54450d2d0edc1ac528f2556ce22686ba","name":"avatars.io","description":"Avatars.io client","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"avatars.io","version":"0.1.0","description":"Avatars.io client","author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"license":"MIT","dependencies":{"request":"2.9.202"},"devDependencies":{"should":"*"},"engine":{"node":">= 0.4"},"_id":"avatars.io@0.1.0","dist":{"shasum":"add0ef942b1f78e8df2dfa8b16734c1607c3af71","tarball":"http://registry.npmjs.org/avatars.io/-/avatars.io-0.1.0.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}]},"0.1.1":{"name":"avatars.io","version":"0.1.1","description":"Avatars.io client","author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"license":"MIT","dependencies":{"request":"2.9.202"},"devDependencies":{"should":"*"},"engine":{"node":">= 0.4"},"_id":"avatars.io@0.1.1","dist":{"shasum":"b7a025f5ab45ab2b53cef8bedb788f329dcd1dcd","tarball":"http://registry.npmjs.org/avatars.io/-/avatars.io-0.1.1.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}]},"0.1.2":{"name":"avatars.io","version":"0.1.2","description":"Avatars.io client","author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"license":"MIT","dependencies":{"request":"2.9.202"},"devDependencies":{"should":"*"},"engine":{"node":">= 0.4"},"_id":"avatars.io@0.1.2","dist":{"shasum":"d89bb30eef25c290474134d9febdf9cb4baa489d","tarball":"http://registry.npmjs.org/avatars.io/-/avatars.io-0.1.2.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}]},"0.1.3":{"name":"avatars.io","version":"0.1.3","description":"Avatars.io client","author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"license":"MIT","dependencies":{"request":"2.9.202"},"devDependencies":{"should":"*"},"engine":{"node":">= 0.4"},"_id":"avatars.io@0.1.3","dist":{"shasum":"5368a29a02a15c29cfc0313144a02bc1d961bd39","tarball":"http://registry.npmjs.org/avatars.io/-/avatars.io-0.1.3.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}]},"0.1.4":{"name":"avatars.io","version":"0.1.4","description":"Avatars.io client","author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"license":"MIT","dependencies":{"request":"2.9.202"},"devDependencies":{"should":"*"},"engine":{"node":">= 0.4"},"_id":"avatars.io@0.1.4","dist":{"shasum":"beea132cd9f1ad82b9305a00702efad602f9a2b0","tarball":"http://registry.npmjs.org/avatars.io/-/avatars.io-0.1.4.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}]},"0.1.5":{"name":"avatars.io","version":"0.1.5","description":"Avatars.io client","author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"license":"MIT","dependencies":{"request":"2.9.202"},"devDependencies":{"should":"*"},"engine":{"node":">= 0.4"},"_id":"avatars.io@0.1.5","dist":{"shasum":"75c25a4337b9aa8bf722d6cdff67280086b05794","tarball":"http://registry.npmjs.org/avatars.io/-/avatars.io-0.1.5.tgz"},"maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}]}},"readme":"# Avatars.io client library\n\nHosted User Avatar Service for your Apps and Site.\n\n# Installation\n\n`npm install avatars.io`\n\n# Usage\n\n```javascript\nvar AvatarsIO = require('avatars.io');\n\n// getting URLs to avatars from social networks\n\nAvatarsIO.assetURL('twitter', 'vdemedes'); // http://avatars.io/twitter/vdemedes\n\n// uploading own avatars\n\nAvatarsIO.appId = 'your app id';\nAvatarsIO.accessToken = 'your access token';\n\nAvatarsIO.upload('path/to/image.jpg', function(err, url){\n\t// url is a URL of just uploaded avatar\n});\n\n// uploading own avatars with custom identifier assigned to them\n\nAvatarsIO.upload('path/to/image.jpg', 'awesome-image', function(err, url){\n\t// url could be http://avatars.io/asfsd8fh45fjisdf/awesome-image\n});\n```\n\n# Tests\n\nRun tests by executing `mocha` in Terminal.\n\n# License\n\nMIT.","maintainers":[{"name":"vdemedes","email":"sbioko@gmail.com"}],"time":{"modified":"2012-07-20T15:37:12.877Z","created":"2012-06-26T17:36:40.179Z","0.1.0":"2012-06-26T17:36:41.929Z","0.1.1":"2012-07-07T16:41:18.916Z","0.1.2":"2012-07-07T17:09:04.479Z","0.1.3":"2012-07-10T13:05:07.755Z","0.1.4":"2012-07-10T14:12:52.562Z","0.1.5":"2012-07-20T15:37:12.877Z"},"author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"_attachments":{"avatars.io-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-lI9ayAm/gZpjKf9ChENwhw==","length":2550,"stub":true},"avatars.io-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-T/zY6uDUExuhXqu2MqEEHg==","length":2542,"stub":true},"avatars.io-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zloGHFw7xKh7jcQhOvyjqQ==","length":2515,"stub":true},"avatars.io-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+Y/e4MH1UFE+pfU10kZQAw==","length":2515,"stub":true},"avatars.io-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kzkcgodVN6IuWaJcXnDbMQ==","length":2347,"stub":true},"avatars.io-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GH/KPeqLcEZw/O6R4zRvlg==","length":2238,"stub":true}}}},
{"id":"avro","key":"avro","value":{"rev":"3-daf48539abe3bafc429a49def6186f64"},"doc":{"_id":"avro","_rev":"3-daf48539abe3bafc429a49def6186f64","name":"avro","description":"Avro","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"avro","description":"Avro","version":"0.1.0","main":"./avro","_npmUser":{"name":"jeromyc","email":"jeromyc@x.com"},"_id":"avro@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"07fcd35e197a3bd4cb9db2fb61bfe71074100c68","tarball":"http://registry.npmjs.org/avro/-/avro-0.1.0.tgz"},"maintainers":[{"name":"jeromyc","email":"jeromyc@x.com"}]}},"readme":"# Native Javascript Avro Implementation\n\n## Background\n\nThis code was initially taken from http://code.google.com/p/javascript-avro/, then significantly improved by Ali Bawany.  Since, it's been substantially trimmed, restricted to meet the needs of the X.commerce infrastructure (see below) and converted into a Node.js module.\n\n## Limitations\n\nTo optimize for use with the X.commerce platform, the module operates with Avro schemas, not protocols.","maintainers":[{"name":"jeromyc","email":"jeromyc@x.com"}],"time":{"modified":"2012-02-01T02:57:36.911Z","created":"2012-02-01T02:57:35.248Z","0.1.0":"2012-02-01T02:57:36.911Z"},"_attachments":{"avro-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ef4enLCWIhDP6zx1AKqqOA==","length":61440,"stub":true}}}},
{"id":"avrojs","key":"avrojs","value":{"rev":"5-cc410e441cfa1956ad1cb8886f7f0a6f"},"doc":{"_id":"avrojs","_rev":"5-cc410e441cfa1956ad1cb8886f7f0a6f","name":"avrojs","description":"Avro JS","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"avrojs","description":"Avro JS","version":"0.0.1","author":{"name":"Richard S Allinson","email":"rsa@mounitainmansoftware.com"},"main":"index","engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"mountainmansoftware","email":"npm@mountainmansoftware.com"},"_id":"avrojs@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"3a2c6d67c92b53b52f0f6e01e550f8ec66726f68","tarball":"http://registry.npmjs.org/avrojs/-/avrojs-0.0.1.tgz"},"maintainers":[{"name":"mountainmansoftware","email":"npm@mountainmansoftware.com"}]},"0.0.2":{"name":"avrojs","description":"Avro JS","version":"0.0.2","author":{"name":"Richard S Allinson","email":"rsa@mounitainmansoftware.com"},"main":"index","engines":{"node":">= 0.6.0"},"_npmUser":{"name":"mountainmansoftware","email":"npm@mountainmansoftware.com"},"_id":"avrojs@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"f25b8620319ac1e257a58981cbb3ee2c09669f56","tarball":"http://registry.npmjs.org/avrojs/-/avrojs-0.0.2.tgz"},"maintainers":[{"name":"mountainmansoftware","email":"npm@mountainmansoftware.com"}]}},"readme":"# Native Javascript Avro Implementation\n\n## Background\n\nThis code was taken from http://search.npmjs.org/#/avro. Which was initially taken from http://code.google.com/p/javascript-avro/, then significantly improved by Ali Bawany.  Since, it's been substantially trimmed, restricted to meet the needs of the X.commerce infrastructure (see below) and converted into a Node.js module.\n\n## Limitations\n\nTo optimize for use with the X.commerce platform, the module operates with Avro schemas, not protocols.","maintainers":[{"name":"mountainmansoftware","email":"npm@mountainmansoftware.com"}],"time":{"modified":"2012-06-08T19:46:38.083Z","created":"2012-06-05T23:47:40.839Z","0.0.1":"2012-06-05T23:47:42.247Z","0.0.2":"2012-06-08T19:46:38.083Z"},"author":{"name":"Richard S Allinson","email":"rsa@mounitainmansoftware.com"},"_attachments":{"avrojs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GIx/NA5hzflS7p8tafgv0g==","length":12817,"stub":true},"avrojs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sqdsHyalwKaR1POiVtAncg==","length":13012,"stub":true}}}},
{"id":"awesome","key":"awesome","value":{"rev":"15-4458b746e4722214bd26ea15e453288e"},"doc":{"_id":"awesome","_rev":"15-4458b746e4722214bd26ea15e453288e","name":"awesome","description":"awesome framework","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"connect":"=0.5.8","express":"=1.0.3","connect-redis":"=0.2.3","redis":"=0.5.2","hiredis":"=0.1.6","async":"=0.1.8","nodeunit":"=0.5.0","zombie":"=0.8.12","should":"=0.0.4"},"version":"0.0.1","directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":"= 0.3.7"},"_id":"awesome@0.0.1","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.7","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9bb2cfa9b7ae28dbf253c2ecea383bae1b25a52b","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.1.tgz"}},"0.0.2":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"connect":"=0.5.7","express":"=1.0.3","connect-redis":"=0.2.3","redis":"=0.5.2","hiredis":"=0.1.6","async":"=0.1.8","nodeunit":"=0.5.0","zombie":"=0.8.12","should":"=0.0.4"},"version":"0.0.2","directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":"= 0.3.7"},"files":[""],"_id":"awesome@0.0.2","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.7","_defaultsLoaded":true,"dist":{"shasum":"35e0b0c901477a80403e85c14787015e2ae76a56","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.2.tgz"}},"0.0.3":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"express":"=1.0.5","connect-redis":"=0.2.3","redis":"=0.5.2","hiredis":"=0.1.6","async":"=0.1.8","nodeunit":"=0.5.0","zombie":"=0.8.12","should":"=0.0.4"},"version":"0.0.3","directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.3.7"},"files":[""],"_id":"awesome@0.0.3","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.7","_defaultsLoaded":true,"dist":{"shasum":"1833774cc4d4698fc18f0b26d6271833b944ee74","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.3.tgz"}},"0.0.4":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"express":"=1.0.5","connect-redis":"=0.2.3","redis":"=0.5.2","hiredis":"=0.1.6","async":"=0.1.8","nodeunit":"=0.5.0","zombie":"=0.8.12","it-is":"=0.0.0"},"version":"0.0.4","directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.3.7"},"files":[""],"_id":"awesome@0.0.4","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.7","_defaultsLoaded":true,"dist":{"shasum":"9211eb86a946dca7c0d17c3a682e9aa3c8c047ba","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.4.tgz"}},"0.0.5":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"express":"=1.0.5","connect-redis":"=0.2.3","redis":"=0.5.2","hiredis":"=0.1.6","async":"=0.1.8","nodeunit":"=0.5.0","yeti":"=0.1.3","zombie":"=0.8.12","underscore":"=1.1.4"},"version":"0.0.5","directories":{"lib":"./lib"},"main":"./lib/index","engines":{"node":">= 0.3.7"},"files":[""],"_id":"awesome@0.0.5","_engineSupported":false,"_npmVersion":"0.2.17","_nodeVersion":"v0.2.6","_defaultsLoaded":true,"dist":{"shasum":"328a5fc6977b2b66b76b10b36dcf6404d56b5b14","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.5.tgz"}},"0.0.6":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"express":">=1.0.5","connect-redis":">=0.2.3","redis":">=0.5.2","hiredis":">=0.1.8","async":">=0.1.8","nodeunit":">=0.5.0","yeti":">=0.1.3","zombie":">=0.8.12","underscore":">=1.1.4"},"version":"0.0.6","directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/index","engines":{"node":">= 0.3.7"},"files":[""],"_id":"awesome@0.0.6","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","bin":{},"_defaultsLoaded":true,"dist":{"shasum":"7f9b726d771a9dafe1e2e675e9d1367b8f50aeee","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.6.tgz"}},"0.0.7":{"name":"awesome","description":"awesome framework","maintainers":[{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com"}],"dependencies":{"express":">=1.0.5","connect-redis":">=0.2.3","redis":">=0.5.2","async":">=0.1.8","nodeunit":">=0.5.0","yeti":">=0.1.3","zombie":">=0.8.12","underscore":">=1.1.4"},"version":"0.0.7","directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/index","engines":{"node":">= 0.3.7"},"files":[""],"bin":{},"_id":"awesome@0.0.7","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","_defaultsLoaded":true,"dist":{"shasum":"b497b599d446635033d9b9c213444132fe7fa06d","tarball":"http://registry.npmjs.org/awesome/-/awesome-0.0.7.tgz"}}},"maintainers":[{"name":"alfredwesterveld","email":"alfredwesterveld@gmail.com"}],"time":{"modified":"2011-02-08T22:29:28.978Z","created":"2011-02-05T11:53:02.575Z","0.0.1":"2011-02-05T11:53:02.915Z","0.0.2":"2011-02-05T12:05:35.701Z","0.0.3":"2011-02-06T21:07:05.826Z","0.0.4":"2011-02-06T22:42:20.883Z","0.0.5":"2011-02-08T00:44:43.908Z","0.0.6":"2011-02-08T21:48:55.818Z","0.0.7":"2011-02-08T22:29:28.978Z"},"_attachments":{"awesome-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-g8wMt9sqGgz/vzdVGSnbmA==","length":2092,"stub":true},"awesome-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-0kIxrXixCDS60RSG2+DxyQ==","length":2338,"stub":true},"awesome-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-PxBGWL5rm7bx4L4flTFkWA==","length":1870,"stub":true},"awesome-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-l3qND2XK1prEpljtlhRV2Q==","length":455997,"stub":true},"awesome-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YERDGfOnKBllGnSHaU7kjA==","length":456014,"stub":true},"awesome-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-PvpgqFAPejAxhzXEjwvV0A==","length":1573,"stub":true},"awesome-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jkVchRqpgcrCQf9c8erFRw==","length":1577,"stub":true}}}},
{"id":"awesomeport","key":"awesomeport","value":{"rev":"7-a4301bd560b009c61cdc47ca45b63ecc"},"doc":{"_id":"awesomeport","_rev":"7-a4301bd560b009c61cdc47ca45b63ecc","name":"awesomeport","description":"find a nice looking free port","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"awesomeport","version":"0.1.0","description":"find a nice looking free port","author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"bin":{"awesomeport":"./index.js"},"_npmUser":{"name":"mafintosh","email":"mathiasbuus@gmail.com"},"_id":"awesomeport@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9f83351c8aaee3d1a0bfeb29acfc33b91225a73d","tarball":"http://registry.npmjs.org/awesomeport/-/awesomeport-0.1.0.tgz"},"maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}]},"0.1.1":{"name":"awesomeport","version":"0.1.1","description":"find a nice looking free port","author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"bin":{"awesomeport":"./index.js"},"_npmUser":{"name":"mafintosh","email":"mathiasbuus@gmail.com"},"_id":"awesomeport@0.1.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"02b8c5f6dcc7dfb62252f07146d30e54c59b98c4","tarball":"http://registry.npmjs.org/awesomeport/-/awesomeport-0.1.1.tgz"},"maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}]},"0.1.2":{"name":"awesomeport","version":"0.1.2","description":"find a nice looking free port","author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"bin":{"awesomeport":"./index.js"},"_npmUser":{"name":"mafintosh","email":"mathiasbuus@gmail.com"},"_id":"awesomeport@0.1.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"679ae31191bdb1beec01d48a3cc39c435f957d35","tarball":"http://registry.npmjs.org/awesomeport/-/awesomeport-0.1.2.tgz"},"maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}]}},"readme":"# awesomeport\n\nfind a free and awesome looking port. just install it through npm:\n\n\tnpm install -g awesomeport\n\nand afterwards just go to your terminal and type:\n\n\tawesomeport\n\nit will then find a good looking port for you, e.g. `6000` or `8888`","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"time":{"modified":"2011-11-16T18:25:12.146Z","created":"2011-11-12T19:41:49.642Z","0.1.0":"2011-11-12T19:41:50.945Z","0.1.1":"2011-11-12T20:12:10.587Z","0.1.2":"2011-11-16T18:25:12.146Z"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"_attachments":{"awesomeport-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-M8x4PAvno1DiHTaKqc+tYg==","length":10240,"stub":true},"awesomeport-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-drjaql46M2Z5gXcP1FPcKg==","length":10240,"stub":true},"awesomeport-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pdUysk1tcHQUOufjpucmVw==","length":10240,"stub":true}}}},
{"id":"awesomium","key":"awesomium","value":{"rev":"3-22036d30f23399b5a65e451755315acf"},"doc":{"_id":"awesomium","_rev":"3-22036d30f23399b5a65e451755315acf","name":"awesomium","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"awesomium","version":"0.0.1","scripts":{"install":"node-waf configure build"},"_npmUser":{"name":"architectd","email":"craig@spiceapps.com"},"_id":"awesomium@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.93","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8f39b6a33a794446aacb78fe04b08bd609a2ab74","tarball":"http://registry.npmjs.org/awesomium/-/awesomium-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig@spiceapps.com"}]}},"maintainers":[{"name":"architectd","email":"craig@spiceapps.com"}],"time":{"modified":"2011-10-16T04:14:13.584Z","created":"2011-10-16T04:14:12.851Z","0.0.1":"2011-10-16T04:14:13.584Z"},"_attachments":{"awesomium-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-O1GlEYTlxh9m9zbk+MwcLw==","length":23695360,"stub":true}}}},
{"id":"aws","key":"aws","value":{"rev":"14-9a8f0989be29034d3fa5c66c594b649b"},"doc":{"_id":"aws","_rev":"14-9a8f0989be29034d3fa5c66c594b649b","name":"aws","description":"evil wrapper for the amazon command line tools","dist-tags":{"latest":"0.0.3-1"},"versions":{"0.0.1":{"name":"aws","description":"evil wrapper for the amazon command line tools","url":"http://github.com/teemow/node-aws","keywords":["amazon","aws","ec2","cloud"],"author":{"name":"Timo Derstappen","email":"teemow@gmail.com"},"repository":{"type":"git","url":"http://github.com/teemow/node-aws.git"},"main":"./lib/aws","dependencies":{"vows":">= 0.5.1","vargs":">= 0.1.0"},"engines":{"node":">= 0.2.0"},"version":"0.0.1","_id":"aws@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/aws/-/aws-0.0.1.tgz"},"directories":{}},"0.0.2-1":{"name":"aws","description":"evil wrapper for the amazon command line tools","url":"http://github.com/teemow/node-aws","keywords":["amazon","aws","ec2","cloud"],"author":{"name":"Timo Derstappen","email":"teemow@gmail.com"},"repository":{"type":"git","url":"git://github.com/teemow/node-aws.git"},"main":"./lib/aws","dependencies":{"vows":">= 0.5.1"},"engines":{"node":">= 0.2.0"},"version":"0.0.2-1","_id":"aws@0.0.2-1","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c0b75c6d09e98cf44d60170983cf10cc16d1a907","tarball":"http://registry.npmjs.org/aws/-/aws-0.0.2-1.tgz"}},"0.0.3-1":{"name":"aws","description":"evil wrapper for the amazon command line tools","url":"http://github.com/teemow/node-aws","keywords":["amazon","aws","ec2","cloud"],"author":{"name":"Timo Derstappen","email":"teemow@gmail.com"},"repository":{"type":"git","url":"git://github.com/adcloud/node-aws.git"},"main":"./lib/aws","dependencies":{"vows":">= 0.5.1"},"engines":{"node":">= 0.2.0"},"version":"0.0.3-1","devDependencies":{},"_id":"aws@0.0.3-1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b1f12c328e18c46421bdf5cc86e54f5fa744b20d","tarball":"http://registry.npmjs.org/aws/-/aws-0.0.3-1.tgz"},"scripts":{}}},"maintainers":[{"name":"teemow","email":"teemow@gmail.com"}],"author":{"name":"Timo Derstappen","email":"teemow@gmail.com"},"repository":{"type":"git","url":"git://github.com/adcloud/node-aws.git"},"time":{"modified":"2011-07-19T05:57:35.291Z","created":"2011-03-21T09:57:24.256Z","0.0.1":"2011-03-21T09:57:24.256Z","0.0.2-1":"2011-03-21T09:57:24.256Z","0.0.3-1":"2011-06-06T14:04:53.409Z"},"_attachments":{"aws-0.0.3-1.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-tp22NT88+29hOjoSmzcB0Q==","length":3632,"stub":true},"aws-0.0.2-1.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-8PLYLF6xqA16dX5VH2KDBA==","length":3568,"stub":true},"aws-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PvSj5BuQvZrOQ6t29WQ6hg==","length":3554,"stub":true}}}},
{"id":"aws-api","key":"aws-api","value":{"rev":"9-7613bda270f3c0dbab46762173687c8c"},"doc":{"_id":"aws-api","_rev":"9-7613bda270f3c0dbab46762173687c8c","name":"aws-api","description":"A client interface to various AWS services.","dist-tags":{"latest":"0.2.3"},"versions":{"0.2.0":{"name":"aws-api","description":"A client interface to various AWS services.","version":"0.2.0","repository":{"type":"git","url":"git://github.com/teen-/node-aws.git"},"author":{"name":"Jordan Ryan Moore","email":"jordanryanmoore@rainclouddev.com"},"main":"index.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"libxmljs":">= 0.4.0"},"_npmUser":{"name":"ssimon","email":"trisma@gmail.com"},"_id":"aws-api@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"77718e0b61b71406dc9f9f18540a48a100d48198","tarball":"http://registry.npmjs.org/aws-api/-/aws-api-0.2.0.tgz"},"maintainers":[{"name":"ssimon","email":"trisma@gmail.com"}]},"0.2.1":{"name":"aws-api","description":"A client interface to various AWS services.","version":"0.2.1","repository":{"type":"git","url":"git://github.com/teen-/node-aws.git"},"author":{"name":"Jordan Ryan Moore","email":"jordanryanmoore@rainclouddev.com"},"main":"index.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"libxmljs":">= 0.4.0"},"_npmUser":{"name":"ssimon","email":"trisma@gmail.com"},"_id":"aws-api@0.2.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4deb3e22107402a7e694ae771e9c70dfcee87037","tarball":"http://registry.npmjs.org/aws-api/-/aws-api-0.2.1.tgz"},"maintainers":[{"name":"ssimon","email":"trisma@gmail.com"}]},"0.2.2":{"name":"aws-api","description":"A client interface to various AWS services.","version":"0.2.2","repository":{"type":"git","url":"git://github.com/teen-/node-aws.git"},"author":{"name":"Jordan Ryan Moore","email":"jordanryanmoore@rainclouddev.com"},"main":"index.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"libxmljs":">= 0.4.0"},"_npmUser":{"name":"ssimon","email":"trisma@gmail.com"},"_id":"aws-api@0.2.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"346c25e7b0bbaf82517c189d5728ee497352ea0a","tarball":"http://registry.npmjs.org/aws-api/-/aws-api-0.2.2.tgz"},"maintainers":[{"name":"ssimon","email":"trisma@gmail.com"}]},"0.2.3":{"name":"aws-api","description":"A client interface to various AWS services.","version":"0.2.3","repository":{"type":"git","url":"git://github.com/shawn-simon/node-aws.git"},"author":{"name":"Jordan Ryan Moore","email":"jordanryanmoore@rainclouddev.com"},"main":"index.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"libxmljs":">= 0.4.0"},"_npmUser":{"name":"ssimon","email":"trisma@gmail.com"},"_id":"aws-api@0.2.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"25bb57129b0a9492db3310722690c401086163bc","tarball":"http://registry.npmjs.org/aws-api/-/aws-api-0.2.3.tgz"},"maintainers":[{"name":"ssimon","email":"trisma@gmail.com"}]}},"readme":"# node-aws\n\n`node-aws` is an easy-to-use AWS client for node.\n\n## Usage\n\n```javascript\nvar aws = require('node-aws').createClient(\n  'yourAccessKeyId',\n  'yourSecretAccessKey',\n  // You can optionally provide a hash of service endpoints,\n  // but they each have reasonable defaults (typically US-East-1).\n  {\n    'sdb': 'sdb.eu-west-1.amazonaws.com',\n  }\n);\n\n// All method request return a promise that will be fulfilled\n// once the response is received and parsed.\naws.sdb.putAttributes(\n  {\n    domainName: \"test\",\n    itemName: \"item1\",\n    attributes: [\n      {\n        name: 'foo',\n        value: 'bar',\n      },\n    ],\n  },\n  // You can optionally override the default endpoint on a\n  // per-request basis as well.\n  'sdb.ap-southeast-1.amazonaws.com'\n).onSuccess(function() {\n  // it worked!\n  console.log(this.requestId, this.data);\n}).onFailure(function() {\n  // uh oh!\n  console.log(this.requestId, this.error);\n});\n```\n\n## Status\n\nA potentially outdated list of supported AWS services and methods is provided below:\n\n### EC2 (Elastic Compute Cloud)\n\n * allocateAddress\n * associateAddress\n * createKeyPair\n * deleteKeyPair\n * describeAddresses\n * describeAvailabilityZones\n * describeInstances\n * describeKeyPairs\n * describeRegions\n * disassociateAddress\n * getConsoleOutput\n * importKeyPair\n * rebootInstances\n * releaseAddress\n * startInstances\n * stopInstances\n\n### Route53\n\n * changeResourceRecordSets\n * createHostedZone\n * deleteHostedZone\n * getChange\n * getHostedZone\n * listHostedZones\n * listResourceRecordSets\n\n### S3 (Simple Storage Service)\n\n * createBucket\n * deleteBucket\n * deleteObject\n * getObject\n * listAllMyBuckets\n * listBucket\n * putObject\n\n### SES (Simple Email Service)\n\n * deleteVerifiedEmailAddress\n * getSendQuota\n * getSendStatistics\n * listVerifiedEmailAddresses\n * sendEmail\n * verifyEmailAddress\n\n### SimpleDB\n\n * batchDeleteAttributes\n * batchPutAttributes\n * createDomain\n * deleteAttributes\n * deleteDomain\n * domainMetadata\n * getAttributes\n * listDomains\n * putAttributes\n * select\n\n### SNS (Simple Notification Service)\n\n * addPermission\n * confirmSubscription\n * createTopic\n * deleteTopic\n * getSubscriptionAttributes\n * getTopicAttributes\n * listSubscriptions\n * listSubscriptionsByTopic\n * listTopics\n * publish\n * removePermission\n * setSubscriptionAttributes\n * setTopicAttributes\n * subscribe\n * unsubscribe\n\n### SQS (Simple Queue Service)\n\n * createQueue\n * deleteQueue\n * listQueues\n * getQueueUrl\n * getQueueAttributes\n * setQueueAttributes\n * addPermission\n * removePermission\n * sendMessage\n * sendMessageBatch\n * receiveMessage\n * deleteMessage\n * deleteMessageBatch\n * changeMessageVisibility\n * changeMessageVisibilityBatch\n","maintainers":[{"name":"ssimon","email":"trisma@gmail.com"}],"time":{"modified":"2012-04-05T18:05:08.554Z","created":"2012-01-28T00:12:52.309Z","0.2.0":"2012-01-28T00:12:53.689Z","0.2.1":"2012-02-01T19:09:00.460Z","0.2.2":"2012-02-03T19:52:15.365Z","0.2.3":"2012-04-05T18:05:08.554Z"},"author":{"name":"Jordan Ryan Moore","email":"jordanryanmoore@rainclouddev.com"},"repository":{"type":"git","url":"git://github.com/shawn-simon/node-aws.git"},"_attachments":{"aws-api-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-emKSfkHC3i2mU8NIbk/sQA==","length":22925,"stub":true},"aws-api-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2+uCkK2s8j/gbtEvJ6PMrQ==","length":22415,"stub":true},"aws-api-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-x7+6xju6yOP7Rc8d1p+skw==","length":22362,"stub":true},"aws-api-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-F4GxHXOUksgWOYl1SNlY2A==","length":22218,"stub":true}}}},
{"id":"aws-arn-parser","key":"aws-arn-parser","value":{"rev":"3-afcc5e8c9cbc036fbdb29fd453ee4ccf"},"doc":{"_id":"aws-arn-parser","_rev":"3-afcc5e8c9cbc036fbdb29fd453ee4ccf","name":"aws-arn-parser","description":"Parser for Amazon Resource Name strings","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"aws-arn-parser","description":"Parser for Amazon Resource Name strings","version":"0.0.1","repository":{"type":"git","url":"git://github.com/sandfox/aws-arn-parser.git"},"main":"lib/aws-arn-parser.js","keywords":["amazon","aws","parser","arn"],"directories":{"lib":"lib","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"~0.2.5"},"bugs":{"name":"https://github.com/sandfox/aws-arn-parser/issues"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Butler","email":"james.butler@sandfox.co.uk","url":"https://github.com/sandfox/"},"_npmUser":{"name":"sandfox","email":"james.butler@sandfox.co.uk"},"_id":"aws-arn-parser@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7360c4fa81408afb7f45dbd42086e3b0dbbd1097","tarball":"http://registry.npmjs.org/aws-arn-parser/-/aws-arn-parser-0.0.1.tgz"},"maintainers":[{"name":"sandfox","email":"james.butler@sandfox.co.uk"}]}},"readme":"aws-arn-parser\n==============\n\nDoes what it says on the tin! Parsers an Amazon Resource Name and\ngives it back as object. \nNOTE: this module is in early days, at some point later I might make it actually\nvalidate and normalize the returned object, or completely change how it works\n\nexample\n=======\n\nthing.js\n\n``` js\nvar parser = require('aws-arn-parser');\nvar myAwsString = \"arn:aws:iam::123456789012:server-certificate/division_abc/subdivision_xyz/ProdServerCert\";\n\nvar arn = parser(myAwsString);\n\nconsole.log(arn);\n\n```\n\nand when we run it\n```\n$ node thing.js\n{ arn: 'arn',\n  aws: 'aws',\n  service: 'iam',\n  region: '',\n  namespace: '123456789012',\n  relativeId: 'server-certificate/division_abc/subdivision_xyz/ProdServerCert' }\n```\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install aws-arn-parser\n```\n\nlicense\n=======\n\nMIT\n\n[![Build Status](https://secure.travis-ci.org/sandfox/aws-arn-parser.png?branch=master)](http://travis-ci.org/[sandfox]/[aws-arn-parser])","maintainers":[{"name":"sandfox","email":"james.butler@sandfox.co.uk"}],"time":{"modified":"2012-07-01T18:54:19.521Z","created":"2012-07-01T18:54:17.855Z","0.0.1":"2012-07-01T18:54:19.521Z"},"author":{"name":"James Butler","email":"james.butler@sandfox.co.uk","url":"https://github.com/sandfox/"},"repository":{"type":"git","url":"git://github.com/sandfox/aws-arn-parser.git"},"_attachments":{"aws-arn-parser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-x0S/E28N5MM3hLFNC0Esbg==","length":3388,"stub":true}}}},
{"id":"aws-cred","key":"aws-cred","value":{"rev":"5-39aaa3783f5d82f801d7d630f6a3db9f"},"doc":{"_id":"aws-cred","_rev":"5-39aaa3783f5d82f801d7d630f6a3db9f","name":"aws-cred","description":"Share your aws credentials across apps through yaml files in /etc","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"aws-cred","description":"Share your aws credentials across apps through yaml files in /etc","url":"https://github.com/hamman/aws-cred","keywords":["amazon","aws","credentials","authentication"],"author":{"name":"Brian Hamman","email":"hamman+github@gmail.com"},"licenses":["MIT"],"repository":{"type":"git","url":"git://github.com/hamman/aws-cred.git"},"dependencies":{"js-yaml":"0.3.7"},"main":"./lib/aws-cred","version":"0.1.0","scripts":{"test":"node_modules/.bin/nodeunit test"},"directories":{"lib":"./lib","test":"./test"},"engines":{"node":"> 0.1.90"},"_id":"aws-cred@0.1.0","devDependencies":{"nodeunit":">=0.6.2"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"_from":"aws-cred","_npmUser":{"name":"hamman","email":"hamman@gmail.com"},"dist":{"shasum":"1176ac8349458fea26d2ac497de8adccfa525456","tarball":"http://registry.npmjs.org/aws-cred/-/aws-cred-0.1.0.tgz"},"maintainers":[{"name":"hamman","email":"hamman@gmail.com"}]},"0.1.1":{"name":"aws-cred","description":"Share your aws credentials across apps through yaml files in /etc","url":"https://github.com/hamman/aws-cred","keywords":["amazon","aws","credentials","authentication"],"author":{"name":"Brian Hamman","email":"hamman+github@gmail.com"},"licenses":["MIT"],"repository":{"type":"git","url":"git://github.com/hamman/aws-cred.git"},"dependencies":{"js-yaml":"0.3.7"},"main":"./lib/aws-cred","version":"0.1.1","scripts":{"test":"node_modules/.bin/nodeunit test"},"directories":{"lib":"./lib","test":"./test"},"engines":{"node":"> 0.1.90"},"_id":"aws-cred@0.1.1","devDependencies":{"nodeunit":">=0.6.2"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"_from":"aws-cred","_npmUser":{"name":"hamman","email":"hamman@gmail.com"},"dist":{"shasum":"5cf8b9040b88cec6b767cc3a718d41dc10a66061","tarball":"http://registry.npmjs.org/aws-cred/-/aws-cred-0.1.1.tgz"},"maintainers":[{"name":"hamman","email":"hamman@gmail.com"}]}},"readme":"Aws-Cred\n========\n\nA Javascript port of Ben Koski's ruby gem aws_credentials, which provides a simple way to manage your Amazon credentials across multiple apps and servers through a config file on the system. This version is compatible with the config files from the ruby gem, with additional support for account_id.\n\nInstallation\n------------\n\n\tnpm install aws-cred\n\nUsage\n-----\n\nPut a yaml file on your server under /etc/aws.conf that contains:\n\n\taccess_key: YOUR_KEY_HERE (required)\n\tsecret_access_key: YOUR_SECRET_KEY_HERE (required)\n\taccount_id: YOUR_KEY_HERE (optional)\n\nRequire and configure aws-cred in your app. This loads /etc/aws.conf:\n\n\tvar AWSCred = require('aws-cred');\n\tawscred = AWSCred.new({});\n\tawscred.access_key;\n\tawscred.secret_access_key;\n\tawscred.account_id;\n\nYou can also specify an environment to load different files. This is useful if you want to maintain different keys for production, development, staging, etc:\n\n\t//this sets the environment do \"donkey\" and loads /etc/aws.donkey.conf\n\tawscred = AWSCred.new({\"env\": \"donkey\"});\n\nAnd you can manually set the path, in which case it ignores the environment:\n\n\t//this will load from /exactly/where/you/said/yourfile.conf\n\tawscred = AWSCred.new({\"config_path\": \"/exactly/where/you/said/yourfile.conf\"});\n\n","maintainers":[{"name":"hamman","email":"hamman@gmail.com"}],"time":{"modified":"2012-06-09T18:28:23.150Z","created":"2012-06-09T18:21:54.885Z","0.1.0":"2012-06-09T18:21:55.383Z","0.1.1":"2012-06-09T18:28:23.150Z"},"author":{"name":"Brian Hamman","email":"hamman+github@gmail.com"},"repository":{"type":"git","url":"git://github.com/hamman/aws-cred.git"},"_attachments":{"aws-cred-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yhwciJFVkmcbdLEoFOpfIA==","length":2577,"stub":true},"aws-cred-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-g2hV/RGwX0pZsToyv0QJ0Q==","length":2586,"stub":true}}}},
{"id":"aws-ec2","key":"aws-ec2","value":{"rev":"5-80de5c572e02629517b56b0490395baa"},"doc":{"_id":"aws-ec2","_rev":"5-80de5c572e02629517b56b0490395baa","name":"aws-ec2","description":"A tiny little module for managing ec2 instance from node","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Cameron Gray","email":"cameron@mindflash.com"},"name":"aws-ec2","description":"A tiny little module for managing ec2 instance from node","version":"0.1.0","repository":{"type":"git","url":"git://github.com/mindflash/aws-ec2.git"},"main":"index.js","scripts":{"test":"make test"},"engines":{"node":">=0.6.0"},"dependencies":{"aws-lib":">=0.0.6"},"devDependencies":{"mocha":"0.13.x"},"_npmUser":{"name":"camerondgray","email":"cameron.gray@gmail.com"},"_id":"aws-ec2@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"95be6c0035500968b85be200367887abb1701d1c","tarball":"http://registry.npmjs.org/aws-ec2/-/aws-ec2-0.1.0.tgz"},"maintainers":[{"name":"camerondgray","email":"cameron.gray@gmail.com"}]},"0.1.1":{"author":{"name":"Cameron Gray","email":"cameron@mindflash.com"},"name":"aws-ec2","description":"A tiny little module for managing ec2 instance from node","version":"0.1.1","repository":{"type":"git","url":"git://github.com/camerondgray/aws-ec2.git"},"main":"index.js","scripts":{"test":"make test"},"engines":{"node":">=0.6.0"},"dependencies":{"aws-lib":">=0.0.6"},"devDependencies":{"mocha":"0.13.x"},"_npmUser":{"name":"camerondgray","email":"cameron.gray@gmail.com"},"_id":"aws-ec2@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8ba5405361cc07dbc18d49a18c68f3c532b049c9","tarball":"http://registry.npmjs.org/aws-ec2/-/aws-ec2-0.1.1.tgz"},"maintainers":[{"name":"camerondgray","email":"cameron.gray@gmail.com"}]}},"readme":"# aws-ec2\n\n  A small library for launching, describing, and terminating Amazon Web Services (AWS) EC2 instances\n\n## Disclaimer\nThis module has a suite of integration tests and I am using it in my production environment. That being said, this module\nallows you to start and terminate instances on EC2 which can have serious consequences. Running instances costs money,\nand terminating the wrong instances can be a serious problem in a production environment. You are STRONGLY encouraged\nto test this module thoroughly before deploying it in a production environment. I provide no warranty or guarantee that\nthis module will perform as expected in your environment. Use this module wisely.\n\n\n## Installation\n\n    $ npm install aws-ec2\n\n## Usage\n\n\n```js\nvar aws = require('aws-ec2')(myAccessKey, mySecretAccessKey);\n\nvar instanceId;\nvar options = {\n                'numToLaunch':1,\n                'ami':'myAMI',\n\t            'awsZone':'us-east-1a',\n\t            'instanceType':'t1-micro',\n\t\t\t    'securityGroups':[\"Production\", \"Web\"]\n\t\t    };\naws.launchOnDemandInstances(options, function (err, response) {\n        instanceId = response.item.instanceId;\n    });\n\n```\n\n## Methods\n\n### launchOnDemandInstances(params, callback)\nLaunch one or more on demand instances.\nami, awsZone, and instanceType are required. The other options can be found [here](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-RunInstances.html)\n\nReceive a callback with ```callback(error,response)``` where the response is a [RunningInstanceItemType](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html)\n\n### launchSpotInstances(params, callback)\nLaunch one ore more spot instances. Spot instances are reserved based on a maximum price bid for each instance.\nSee [AWS Spot Instances](http://aws.amazon.com/ec2/spot-instances/) for more info on this cheaper alternative.\nami, awsZone, and instanceType are required.\n\nReceive a callback with ```callback(error,response)```.\n\n### getInstanceDescriptionFromPrivateIp(privateIp, callback)\nGet the description of an instance based on the instance's private up. The returned description is a\n[RunningInstanceItemType](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html)\n\n### getInstanceDescriptionFromId(instanceId, callback)\nGet the description of an instance based on the instance's id. The returned description is a\n[RunningInstanceItemType](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html)\n\n### describeSpotInstanceRequest(requestId, callback)\nGet the description of a spot instance request. The returned description is a\n[SpotInstanceRequestSetItemType](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-SpotInstanceRequestSetItemType.html)\n\n### terminateEc2Instance(instanceId, callback)\nShut down a running Ec2 instance based on an instanceId. The returned response is a\n[TerminateInstancesResponse](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-TerminateInstances.html)\n\n### cancelSpotRequest(requestId, callback)\nCancel a spot request based on the requestId. The returned response is a\n[SpotInstanceRequestSetItemType](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-SpotInstanceRequestSetItemType.html)\n\n\n## Running tests\n### WARNING the integration tests will launch and terminate actual instances on EC2 which will cost you $$$!!\n  Install dev deps:\n\n    $ npm install -d\n\n  Edit /test/testConfig.json to include your actual awsKey and awsSecretKey and the options you want to use for testing\n\n```js\n  {\n      'accessKey':'yourAccessKey',\n      'secretAccessKey':'yourSecretAccessKey',\n      'awsZone':'us-east-1a',\n      'instanceType':'t1.micro',\n      'securityGroups':[\"YourSecurityGroup1\", \"YourSecurityGroup2\"],\n      'ami':'ami-yourAmi',\n      'spotPrice':0.001\n  }\n```\n\n  Run the integration tests:\n  Again, will launch and terminate actual instances\n\n    $ make test-integration\n\n## License\n\nMIT","maintainers":[{"name":"camerondgray","email":"cameron.gray@gmail.com"}],"time":{"modified":"2012-05-16T00:14:10.245Z","created":"2012-05-16T00:09:33.483Z","0.1.0":"2012-05-16T00:09:34.905Z","0.1.1":"2012-05-16T00:14:10.245Z"},"author":{"name":"Cameron Gray","email":"cameron@mindflash.com"},"repository":{"type":"git","url":"git://github.com/camerondgray/aws-ec2.git"},"_attachments":{"aws-ec2-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-F7pkzLETkpgSW1EsOmR9bw==","length":4306,"stub":true},"aws-ec2-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UTbsQbGUWeESKkPi+3HZ/g==","length":4299,"stub":true}}}},
{"id":"aws-js","key":"aws-js","value":{"rev":"6-c61d87b8ad948cd065d2ca222808c209"},"doc":{"_id":"aws-js","_rev":"6-c61d87b8ad948cd065d2ca222808c209","name":"aws-js","description":"Amazon Web Services API Client","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"aws-js","description":"Amazon Web Services API Client","version":"0.0.1","author":{"name":"Renat Zubairov","email":"renat.zubairov@gmail.com"},"keywords":["aws","cloud","amazon"],"dependencies":{"oauth":">= 0.8.2"},"repository":{"type":"git","url":"http://github.com/zubairov/aws-js.git"},"engines":{"node":">= 0.2.0"},"_id":"aws-js@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/aws-js/-/aws-js-0.0.1.tgz"},"mtime":"2010-11-09T23:16:31Z","ctime":"2010-11-09T23:16:31Z"}},"maintainers":[{"name":"zubairov","email":"renat.zubairov@gmail.com"}],"mtime":"2010-11-09T23:16:31Z","ctime":"2010-11-09T23:16:31Z","author":{"name":"Renat Zubairov","email":"renat.zubairov@gmail.com"},"repository":{"type":"git","url":"http://github.com/zubairov/aws-js.git"},"_attachments":{"aws-js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sBD/eBxgQpqsrelul9t/Yw==","length":1943,"stub":true}}}},
{"id":"aws-lib","key":"aws-lib","value":{"rev":"45-eb23e05a69ee436b9a796b70cfca1737"},"doc":{"_id":"aws-lib","_rev":"45-eb23e05a69ee436b9a796b70cfca1737","name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"aws-lib","description":"Extendable Node.js library for the Amazon Web Services API","version":"0.0.1","homepage":"https://github.com/mirkok/Node-AWS","repository":"https://github.com/mirkok/Node-AWS.git","author":{"name":"Mirko Kiefer","email":"kiefer.mirko@googlemail.com","url":"http://mirkokiefer.com/blog/"},"contributors":[{"name":"Mirko Kiefer","email":"kiefer.mirko@googlemail.com","url":"http://mirkokiefer.com/blog/"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"main":"lib/aws","directories":{"lib":"lib","example":"examples"},"engines":{"node":"*"},"_id":"aws-lib@0.0.1","_engineSupported":true,"_npmVersion":"0.2.14-2","_nodeVersion":"v0.3.0-pre","modules":{"b/aws.js":"lib/aws.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"70a0fd892dd3dc77412a115ddfcdd69b06b1f244","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.0.1.tgz"}},"0.0.2":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.0.2","homepage":"https://github.com/mirkok/Node-AWS","repository":"https://github.com/mirkok/Node-AWS.git","author":{"name":"Mirko Kiefer","email":"kiefer.mirko@googlemail.com","url":"http://mirkokiefer.com/blog/"},"contributors":[{"name":"Mirko Kiefer","email":"kiefer.mirko@googlemail.com","url":"http://mirkokiefer.com/blog/"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":"*"},"_id":"aws-lib@0.0.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.3.7-pre","modules":{"b/aws.js":"lib/aws.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6de5b1f9a7422d2653943c43be7227a6c4ad06c0","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.0.2.tgz"}},"0.0.3":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.0.3","homepage":"https://github.com/mirkok/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","database","wrapper","api"],"repository":"https://github.com/mirkok/Node-AWS.git","author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":"*"},"_id":"aws-lib@0.0.3","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","modules":{"b/aws.js":"lib/aws.js","b/ec2.js":"lib/ec2.js","b/prodAdv.js":"lib/prodAdv.js","b/simpledb.js":"lib/simpledb.js","b/sns.js":"lib/sns.js","b/sqs.js":"lib/sqs.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7e3df719b062b5d7a87b2480848215be46d58921","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.0.3.tgz"}},"0.0.4":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.0.4","homepage":"https://github.com/mirkok/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","Simple Email Service","SES","database","wrapper","api"],"repository":"git://github.com/mirkok/aws-lib.git","author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":"0.2.6"},"_id":"aws-lib@0.0.4","_engineSupported":false,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"b/aws.js":"lib/aws.js","b/ec2.js":"lib/ec2.js","b/prodAdv.js":"lib/prodAdv.js","b/ses.js":"lib/ses.js","b/simpledb.js":"lib/simpledb.js","b/sns.js":"lib/sns.js","b/sqs.js":"lib/sqs.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"89507cfee18b383cad41cc845365120f6cd40d76","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.0.4.tgz"}},"0.0.5":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.0.5","homepage":"https://github.com/mirkok/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","Simple Email Service","SES"],"repository":{"type":"git","url":"git://github.com/mirkok/aws-lib.git"},"author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":">=0.4"},"_id":"aws-lib@0.0.5","_engineSupported":true,"_npmVersion":"0.3.11","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"971b8995078d83c80f2372f134c496e71b293a46","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.0.5.tgz"}},"0.0.6":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.0.6","homepage":"http://github.com/livelycode/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","Simple Email Service","SES"],"repository":{"type":"git","url":"git://github.com/livelycode/aws-lib.git"},"author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":">=0.4"},"_npmUser":{"name":"mirkok","email":"mail@mirkokiefer.com"},"_id":"aws-lib@0.0.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"10d3941c411ab0c4cbcba6315e46794d94801554","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.0.6.tgz"},"readme":"Node.js library for the Amazon Web Services\n=====\n\nA simple [Node.js](http://github.com/ry/node) library to communicate with the Amazon Web Services API.\n\nThis version of aws-lib has been tested on Node v0.6.11.\n\nIt includes clients for the following services:\n\n   * EC2\n   * Product Advertising API\n   * SimpleDB\n   * SQS (Simple Queue Service)\n   * SNS (Simple Notification Service)\n   * SES (Simple Email Service)\n   * ELB (Elastic Load Balancing Service) - added by [Bernhard Weißhuhn](https://github.com/bkw)\n   * CW (CloudWatch)\n   * IAM (Identity and Access Management)\n\nRichard Rodger maintains a user-friendly [SimpleDB library](http://github.com/rjrodger/simpledb) which is based on aws-lib.\n\naws-lib is designed to be easily extensible. If you want to add your own API client, have a look at ec2.js or simpledb.js and simply follow their example.\n\n### Usage\n\nThe following snippet implements an ec2 client and makes a call to DescribeInstances\n\n    var aws = require(\"aws-lib\");\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey);\n\n    ec2.call(\"DescribeInstances\", {}, function(result) {\n      console.log(JSON.stringify(result));\n    })\n\nWhich returns a JSON response similar to:\n\n    [...]\n    {\"item\":{\n      \"instanceId\":\"i-acb2d1db\",\"imageId\":\"ami-03765c77\",\n      \"instanceState\": {\"code\":\"80\",\"name\":\"stopped\"},\n      \"privateDnsName\":{},\"dnsName\":{},\n      \"reason\":\"User initiated (2010-07-28 19:37:54 GMT)\"\n    [...] \n\nAnother example, using Product Advertising API:\n\n    prodAdv = aws.createProdAdvClient(yourAccessKeyId, yourSecretAccessKey, yourAssociateTag);\n\n    prodAdv.call(\"ItemSearch\", {SearchIndex: \"Books\", Keywords: \"Javascript\"}, function(result) {\n      console.log(JSON.stringify(result));\n    })\n\nWill return a long list of books.\n\nMost clients, such as ec2, ses, simpledb, etc. accept an optional third parameter `options` which should be an object of options used to instantiate the client.  For example, the ec2 client could be instantiated with an options object like:\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey, {version: '2010-08-31'});\n    \nwhich would instantiate the ec2 client, but using the 2010-08-31 API version.  See the library code for each service to learn about other possible options.\n","maintainers":[{"name":"pib","email":"pib@paulbonser.com"},{"name":"mirkok","email":"mail@mirkokiefer.com"}]},"0.1.0":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.1.0","homepage":"http://github.com/livelycode/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","Simple Email Service","SES"],"repository":{"type":"git","url":"git://github.com/livelycode/aws-lib.git"},"author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"devDependencies":{"mocha":"*"},"scripts":{"test":"./node_modules/.bin/mocha"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":">=0.4"},"_npmUser":{"name":"mirkok","email":"mail@mirkokiefer.com"},"_id":"aws-lib@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7ca9fe42371e35033a0fa1cbb9a01f4cc97d0dbd","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.1.0.tgz"},"readme":"Node.js library for the Amazon Web Services\n=====\n\nA simple [Node.js](http://github.com/ry/node) library to communicate with the Amazon Web Services API.\n\nThis version of aws-lib has been tested on Node v0.6.11.\n\nIt includes clients for the following services:\n\n   * [EC2](https://github.com/livelycode/aws-lib/blob/master/examples/ec2.js)\n   * [Product Advertising API](https://github.com/livelycode/aws-lib/blob/master/examples/prod-adv.js)\n   * [SimpleDB](https://github.com/livelycode/aws-lib/blob/master/test/simpledb.js)\n   * [SQS (Simple Queue Service)](https://github.com/livelycode/aws-lib/blob/master/examples/sqs.js)\n   * SNS (Simple Notification Service)\n   * [SES (Simple Email Service)](https://github.com/livelycode/aws-lib/blob/master/examples/ses.js)\n   * [ELB (Elastic Load Balancing Service)](https://github.com/livelycode/aws-lib/blob/master/examples/elb.js)\n   * [CW (CloudWatch)](https://github.com/livelycode/aws-lib/blob/master/examples/cw.js)\n   * [IAM (Identity and Access Management)](https://github.com/livelycode/aws-lib/blob/master/examples/iam.js)\n\nRichard Rodger maintains a user-friendly [SimpleDB library](http://github.com/rjrodger/simpledb) which is based on aws-lib.\n\n## Usage\n\nThe following snippet implements an ec2 client and makes a call to DescribeInstances\n\n    var aws = require(\"aws-lib\");\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey);\n\n    ec2.call(\"DescribeInstances\", {}, function(err, result) {\n      console.log(JSON.stringify(result));\n    })\n\nWhich returns a JSON response similar to:\n\n    [...]\n    {\"item\":{\n      \"instanceId\":\"i-acb2d1db\",\"imageId\":\"ami-03765c77\",\n      \"instanceState\": {\"code\":\"80\",\"name\":\"stopped\"},\n      \"privateDnsName\":{},\"dnsName\":{},\n      \"reason\":\"User initiated (2010-07-28 19:37:54 GMT)\"\n    [...] \n\nAnother example, using Product Advertising API:\n\n    prodAdv = aws.createProdAdvClient(yourAccessKeyId, yourSecretAccessKey, yourAssociateTag);\n\n    prodAdv.call(\"ItemSearch\", {SearchIndex: \"Books\", Keywords: \"Javascript\"}, function(err, result) {\n      console.log(JSON.stringify(result));\n    })\n\nWill return a long list of books.\n\nMost clients, such as ec2, ses, simpledb, etc. accept an optional third parameter `options` which should be an object of options used to instantiate the client.  For example, the ec2 client could be instantiated with an options object like:\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey, {version: '2010-08-31'});\n    \nwhich would instantiate the ec2 client, but using the 2010-08-31 API version.  See the library code for each service to learn about other possible options.\n\nFor more examples have a look at [/examples](https://github.com/livelycode/aws-lib/tree/master/examples) and [/test](https://github.com/livelycode/aws-lib/tree/master/test).\n\n## Tests\nIn order to run the tests you need to copy \"test/credentials_template.js\" to \"test/credentials.js\" and add your access key and secret.  \ncredentials.js is part of .gitignore so you don't have to worry about accidentially commiting your secret.\n\nTo run the tests execute:\n\n    npm test\n\n\n## Contributing\naws-lib is designed to be easily extensible.  \nIf you want to add support for a service, have a look at an [existing client](https://github.com/livelycode/aws-lib/blob/master/lib/ec2.js) and simply follow the pattern.  \nWhen submitting a pull request please add a test for at least one API call.\n\nMany thanks to the following people who have contributed so far (ordered by number of commits):\n\n```\nMirko Kiefer\nPaul Bonser\nBernhard K. Weisshuhn\nKent\nDavid Valentiate\nRichard Rodger\nSean Coates\njohn\nJonathan Leibiusky\nMatt Duncan\nCameron Gray\nBryon\nnagoodman\nBlake Matheny\nVan Nguyen\nIan Ward\nJohannes Auer\nChris Castle\n```\n","maintainers":[{"name":"pib","email":"pib@paulbonser.com"},{"name":"mirkok","email":"mail@mirkokiefer.com"}]},"0.1.1":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.1.1","homepage":"http://github.com/livelycode/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","Simple Email Service","SES"],"repository":{"type":"git","url":"git://github.com/livelycode/aws-lib.git"},"author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"devDependencies":{"mocha":"*"},"scripts":{"test":"./node_modules/.bin/mocha"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":">=0.4"},"_npmUser":{"name":"mirkok","email":"mail@mirkokiefer.com"},"_id":"aws-lib@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8b39eeb4e6cde37ef831ea65a9be89ee8e6a9f37","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.1.1.tgz"},"readme":"Node.js library for the Amazon Web Services\n=====\n\nA simple [Node.js](http://github.com/ry/node) library to communicate with the Amazon Web Services API.\n\nThis version of aws-lib has been tested on Node v0.6.11.\n\nIt includes clients for the following services:\n\n   * [EC2](https://github.com/livelycode/aws-lib/blob/master/examples/ec2.js)\n   * [Product Advertising API](https://github.com/livelycode/aws-lib/blob/master/examples/prod-adv.js)\n   * [SimpleDB](https://github.com/livelycode/aws-lib/blob/master/test/simpledb.js)\n   * [SQS (Simple Queue Service)](https://github.com/livelycode/aws-lib/blob/master/examples/sqs.js)\n   * SNS (Simple Notification Service)\n   * [SES (Simple Email Service)](https://github.com/livelycode/aws-lib/blob/master/examples/ses.js)\n   * [ELB (Elastic Load Balancing Service)](https://github.com/livelycode/aws-lib/blob/master/examples/elb.js)\n   * [CW (CloudWatch)](https://github.com/livelycode/aws-lib/blob/master/examples/cw.js)\n   * [IAM (Identity and Access Management)](https://github.com/livelycode/aws-lib/blob/master/examples/iam.js)\n   * [CFN (CloudFormation)](https://github.com/livelycode/aws-lib/blob/master/test/cfn.js)\n\nRichard Rodger maintains a user-friendly [SimpleDB library](http://github.com/rjrodger/simpledb) which is based on aws-lib.\n\n## Usage\n\nThe following snippet implements an ec2 client and makes a call to DescribeInstances\n\n    var aws = require(\"aws-lib\");\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey);\n\n    ec2.call(\"DescribeInstances\", {}, function(err, result) {\n      console.log(JSON.stringify(result));\n    })\n\nWhich returns a JSON response similar to:\n\n    [...]\n    {\"item\":{\n      \"instanceId\":\"i-acb2d1db\",\"imageId\":\"ami-03765c77\",\n      \"instanceState\": {\"code\":\"80\",\"name\":\"stopped\"},\n      \"privateDnsName\":{},\"dnsName\":{},\n      \"reason\":\"User initiated (2010-07-28 19:37:54 GMT)\"\n    [...] \n\nAnother example, using Product Advertising API:\n\n    prodAdv = aws.createProdAdvClient(yourAccessKeyId, yourSecretAccessKey, yourAssociateTag);\n\n    prodAdv.call(\"ItemSearch\", {SearchIndex: \"Books\", Keywords: \"Javascript\"}, function(err, result) {\n      console.log(JSON.stringify(result));\n    })\n\nWill return a long list of books.\n\nMost clients, such as ec2, ses, simpledb, etc. accept an optional third parameter `options` which should be an object of options used to instantiate the client.  For example, the ec2 client could be instantiated with an options object like:\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey, {version: '2010-08-31'});\n    \nwhich would instantiate the ec2 client, but using the 2010-08-31 API version.  See the library code for each service to learn about other possible options.\n\nFor more examples have a look at [/examples](https://github.com/livelycode/aws-lib/tree/master/examples) and [/test](https://github.com/livelycode/aws-lib/tree/master/test).\n\n## Tests\nIn order to run the tests you need to copy \"test/credentials_template.js\" to \"test/credentials.js\" and add your access key and secret.  \ncredentials.js is part of .gitignore so you don't have to worry about accidentially commiting your secret.\n\nTo run the tests execute:\n\n    npm test\n\n\n## Contributing\naws-lib is designed to be easily extensible.  \nIf you want to add support for a service, have a look at an [existing client](https://github.com/livelycode/aws-lib/blob/master/lib/ec2.js) and simply follow the pattern.  \nWhen submitting a pull request please add a test for at least one API call.\n\nMany thanks to the following people who have contributed so far (ordered by number of commits):\n\n```\nMirko Kiefer\nPaul Bonser\nBernhard K. Weisshuhn\nKent\nDavid Valentiate\nRichard Rodger\nSean Coates\njohn\nJonathan Leibiusky\nMatt Duncan\nCameron Gray\nBryon\nnagoodman\nBlake Matheny\nVan Nguyen\nIan Ward\nJohannes Auer\nChris Castle\n```\n","maintainers":[{"name":"pib","email":"pib@paulbonser.com"},{"name":"mirkok","email":"mail@mirkokiefer.com"}]},"0.1.2":{"name":"aws-lib","description":"Extensible Node.js library for the Amazon Web Services API","version":"0.1.2","homepage":"http://github.com/livelycode/aws-lib","keywords":["amazon","aws","ec2","product advertising","simpledb","Simple Queue Service","SQS","Simple Email Service","SES"],"repository":{"type":"git","url":"git://github.com/livelycode/aws-lib.git"},"author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"contributors":[{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},{"name":"Paul Bonser","email":"pib@paulbonser.com","url":"http://probablyprogramming.com"},{"name":"Richard Rodger","email":"richard@ricebridge.com","url":"http://www.ricebridge.com/"},{"name":"Ross Duggan","email":"ross@boards.ie","url":"http://rossduggan.ie/"}],"dependencies":{"xml2js":"0.1.x","sax":"0.1.x"},"devDependencies":{"mocha":"*"},"scripts":{"test":"./node_modules/.bin/mocha"},"main":"lib/aws","directories":{"lib":"lib","example":"examples","test":"test"},"engines":{"node":">=0.4"},"_npmUser":{"name":"mirkok","email":"mail@mirkokiefer.com"},"_id":"aws-lib@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f4c6d484a2b043aff7e337e88f999193c1ee2a44","tarball":"http://registry.npmjs.org/aws-lib/-/aws-lib-0.1.2.tgz"},"readme":"Node.js library for the Amazon Web Services\n=====\n\nA simple [Node.js](http://github.com/ry/node) library to communicate with the Amazon Web Services API.\n\nThis version of aws-lib has been tested on Node v0.6.11.\n\nIt includes clients for the following services:\n\n   * [EC2](https://github.com/livelycode/aws-lib/blob/master/examples/ec2.js)\n   * [Product Advertising API](https://github.com/livelycode/aws-lib/blob/master/examples/prod-adv.js)\n   * [SimpleDB](https://github.com/livelycode/aws-lib/blob/master/test/simpledb.js)\n   * [SQS (Simple Queue Service)](https://github.com/livelycode/aws-lib/blob/master/examples/sqs.js)\n   * SNS (Simple Notification Service)\n   * [SES (Simple Email Service)](https://github.com/livelycode/aws-lib/blob/master/examples/ses.js)\n   * [ELB (Elastic Load Balancing Service)](https://github.com/livelycode/aws-lib/blob/master/examples/elb.js)\n   * [CW (CloudWatch)](https://github.com/livelycode/aws-lib/blob/master/examples/cw.js)\n   * [IAM (Identity and Access Management)](https://github.com/livelycode/aws-lib/blob/master/examples/iam.js)\n   * [CFN (CloudFormation)](https://github.com/livelycode/aws-lib/blob/master/test/cfn.js)\n   * STS (Security Token Service)\n\nRichard Rodger maintains a user-friendly [SimpleDB library](http://github.com/rjrodger/simpledb) which is based on aws-lib.\n\n## Usage\n\nThe following snippet implements an ec2 client and makes a call to DescribeInstances\n\n    var aws = require(\"aws-lib\");\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey);\n\n    ec2.call(\"DescribeInstances\", {}, function(err, result) {\n      console.log(JSON.stringify(result));\n    })\n\nWhich returns a JSON response similar to:\n\n    [...]\n    {\"item\":{\n      \"instanceId\":\"i-acb2d1db\",\"imageId\":\"ami-03765c77\",\n      \"instanceState\": {\"code\":\"80\",\"name\":\"stopped\"},\n      \"privateDnsName\":{},\"dnsName\":{},\n      \"reason\":\"User initiated (2010-07-28 19:37:54 GMT)\"\n    [...] \n\nAnother example, using Product Advertising API:\n\n    prodAdv = aws.createProdAdvClient(yourAccessKeyId, yourSecretAccessKey, yourAssociateTag);\n\n    prodAdv.call(\"ItemSearch\", {SearchIndex: \"Books\", Keywords: \"Javascript\"}, function(err, result) {\n      console.log(JSON.stringify(result));\n    })\n\nWill return a long list of books.\n\nMost clients, such as ec2, ses, simpledb, etc. accept an optional third parameter `options` which should be an object of options used to instantiate the client.  For example, the ec2 client could be instantiated with an options object like:\n\n    ec2 = aws.createEC2Client(yourAccessKeyId, yourSecretAccessKey, {version: '2010-08-31'});\n    \nwhich would instantiate the ec2 client, but using the 2010-08-31 API version.  See the library code for each service to learn about other possible options.\n\nFor more examples have a look at [/examples](https://github.com/livelycode/aws-lib/tree/master/examples) and [/test](https://github.com/livelycode/aws-lib/tree/master/test).\n\n## Tests\nIn order to run the tests you need to copy \"test/credentials_template.js\" to \"test/credentials.js\" and add your access key and secret.  \ncredentials.js is part of .gitignore so you don't have to worry about accidentially commiting your secret.\n\nTo run the tests execute:\n\n    npm test\n\n\n## Contributing\naws-lib is designed to be easily extensible.  \nIf you want to add support for a service, have a look at an [existing client](https://github.com/livelycode/aws-lib/blob/master/lib/ec2.js) and simply follow the pattern.  \nWhen submitting a pull request please add a test for at least one API call.\n\nMany thanks to the following people who have contributed so far (ordered by number of commits):\n\n```\nMirko Kiefer\nPaul Bonser\nBernhard K. Weisshuhn\nKent\nDavid Valentiate\nRichard Rodger\nSean Coates\njohn\nJonathan Leibiusky\nMatt Duncan\nCameron Gray\nBryon\nnagoodman\nBlake Matheny\nVan Nguyen\nIan Ward\nJohannes Auer\nChris Castle\n```\n","maintainers":[{"name":"pib","email":"pib@paulbonser.com"},{"name":"mirkok","email":"mail@mirkokiefer.com"}]}},"maintainers":[{"name":"pib","email":"pib@paulbonser.com"},{"name":"mirkok","email":"mail@mirkokiefer.com"}],"time":{"modified":"2012-08-06T12:16:20.345Z","created":"2011-01-10T22:43:25.776Z","0.0.1":"2011-01-10T22:43:26.014Z","0.0.2":"2011-01-25T00:43:48.033Z","0.0.3":"2011-01-27T21:30:56.342Z","0.0.4":"2011-02-07T20:10:18.359Z","0.0.5":"2011-02-16T00:40:37.951Z","0.0.6":"2012-03-18T01:53:45.253Z","0.1.0":"2012-07-10T19:20:25.578Z","0.1.1":"2012-07-14T12:02:27.086Z","0.1.2":"2012-07-17T22:55:43.746Z"},"author":{"name":"Mirko Kiefer","email":"mail@mirkokiefer.com","url":"http://mirkokiefer.com"},"repository":{"type":"git","url":"git://github.com/livelycode/aws-lib.git"},"users":{"sjonnet19":true},"_attachments":{"aws-lib-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-fzkG6C5dXYvEz4HUyOePUQ==","length":7470,"stub":true},"aws-lib-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-BjydNNu1oOrP0iO10FUNtg==","length":7693,"stub":true},"aws-lib-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-0Pqc13wEF8WbOFElpNxP0A==","length":7474,"stub":true},"aws-lib-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-dKAxomE5Cv5YO8yDgPeXaA==","length":7125,"stub":true},"aws-lib-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-MqwzEe4WmpLjhZ5DyxD69w==","length":5484,"stub":true},"aws-lib-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-A6zSOLg/mtwd/JcJnNRZXw==","length":5466,"stub":true},"aws-lib-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-0b6jTN51nGfz9IpNkineVA==","length":5059,"stub":true},"aws-lib-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-LW6ogEOQVhYZgpWZLbzFhA==","length":4738,"stub":true},"aws-lib-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gOFnfETfYHWvEte406d4nQ==","length":3290,"stub":true}}}},
{"id":"aws-sign","key":"aws-sign","value":{"rev":"5-dbd04e4cfed6d7d0b7e83a08ce9d98a0"},"doc":{"_id":"aws-sign","_rev":"5-dbd04e4cfed6d7d0b7e83a08ce9d98a0","name":"aws-sign","description":"Calculates Authorization header for Amazon AWS REST requests","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"aws-sign","description":"Calculates Authorization header for Amazon AWS REST requests","version":"0.0.1","author":{"name":"Egor Egorov","email":"me@egorfine.com"},"homepage":"https://github.com/egorFiNE/node-aws-sign","repository":{"type":"git","url":"git://github.com/egorFiNE/node-aws-sign.git"},"devDependencies":{"nodeunit":">= 0.6.0"},"_npmUser":{"name":"egorfine","email":"me@egorfine.com"},"_id":"aws-sign@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"bdbef9355666df0cc6684e100c57b44d8e231b5e","tarball":"http://registry.npmjs.org/aws-sign/-/aws-sign-0.0.1.tgz"},"maintainers":[{"name":"egorfine","email":"me@egorfine.com"}]},"0.0.2":{"name":"aws-sign","description":"Calculates Authorization header for Amazon AWS REST requests","version":"0.0.2","author":{"name":"Egor Egorov","email":"me@egorfine.com"},"homepage":"https://github.com/egorFiNE/node-aws-sign","repository":{"type":"git","url":"git://github.com/egorFiNE/node-aws-sign.git"},"devDependencies":{"nodeunit":">= 0.6.0"},"_npmUser":{"name":"egorfine","email":"me@egorfine.com"},"_id":"aws-sign@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2c37c720a92e5ca1befcecce4dd63847e9acfa90","tarball":"http://registry.npmjs.org/aws-sign/-/aws-sign-0.0.2.tgz"},"maintainers":[{"name":"egorfine","email":"me@egorfine.com"}]}},"readme":"# node-aws-sign\n\nSimple module to calculate `Authorization` header for Amazon AWS REST requests.\n\nSimple it is: \n\t\n```javascript\nvar AwsSign = require('aws-sign');\nvar signer = new AwsSign({ \n\taccessKeyId: 'AKIAIOSFODNN7EXAMPLE',\n\tsecretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'\n});\n\nvar authorization = signer.sign({\n\tmethod: 'PUT', \n\tbucket: 'johnsmith', \n\tpath: '/photos/puppy.jpg',  \n\tdate: 'Tue, 27 Mar 2007 19:36:42 +0000', \n\tcontentType: 'image/puppy',\n\tcontentMd5: null, \n\txAmzHeaders: {}\n});\n```\n\t\nThe following keys are mandatory: \n\n* `method`\n* `bucket`\n* `path`\n\nOthers are optional. `Date` is set to current date if not specified.\n\n## Non-goals\n\nNode.js has no legacy ;-) so there is no need to support some legacy features of Amazon API for older software. I.e. there is no support for path-style bucket access.\n\n`x-amz-date` substitution is not supported because Node's http module has no problems setting `Date` header.\n\nMultiple `x-amz-` keys are not supported. I.e. the following part of the example won't work: \n\n\tX-Amz-Meta-ReviewedBy: joe@johnsmith.net\n\tX-Amz-Meta-ReviewedBy: jane@johnsmith.net\n\nUse a single header instead: \n\n\tX-Amz-Meta-ReviewedBy: joe@johnsmith.net,jane@johnsmith.net\n\n## Testing\n\n\tnodeunit test/\n\t\n## Installation\n\n\tnpm install aws-sign\n\n## Author\n\nEgor Egorov, me@egorfine.com.\n\n## License\n\nMIT, of course. \n","maintainers":[{"name":"egorfine","email":"me@egorfine.com"}],"time":{"modified":"2012-06-10T12:20:47.017Z","created":"2012-06-10T11:16:38.251Z","0.0.1":"2012-06-10T11:16:40.304Z","0.0.2":"2012-06-10T12:20:47.017Z"},"author":{"name":"Egor Egorov","email":"me@egorfine.com"},"repository":{"type":"git","url":"git://github.com/egorFiNE/node-aws-sign.git"},"_attachments":{"aws-sign-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KvxfukA6qXud+HxryHVYUQ==","length":3079,"stub":true},"aws-sign-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UyQ/m9JmWqUssqhbb65J8g==","length":3054,"stub":true}}}},
{"id":"aws-snsclient","key":"aws-snsclient","value":{"rev":"7-f13e94111d08b6e6f790a01e1650a013"},"doc":{"_id":"aws-snsclient","_rev":"7-f13e94111d08b6e6f790a01e1650a013","name":"aws-snsclient","description":"A client for parsing Amazon AWS SNS requests.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"aws-snsclient","description":"A client for parsing Amazon AWS SNS requests.","keywords":["amazon","aws","sns","client"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/mattrobenolt/node-snsclient.git"},"author":{"name":"Matt Robenolt","email":"matt@ydekproductions.com","url":"http://mattrobenolt.com"},"main":"./index","bugs":{"url":"https://github.com/mattrobenolt/node-snsclient/issues"},"directories":{"lib":"lib","example":"examples"},"engines":{"node":">= 0.4.0"},"dependencies":{},"_npmUser":{"name":"mattrobenolt","email":"matt@ydekproductions.com"},"_id":"aws-snsclient@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"780ad5186e4fa498305e7bc364cbbe46daaeb4df","tarball":"http://registry.npmjs.org/aws-snsclient/-/aws-snsclient-0.1.0.tgz"},"maintainers":[{"name":"mattrobenolt","email":"matt@ydekproductions.com"}]},"0.1.1":{"name":"aws-snsclient","description":"A client for parsing Amazon AWS SNS requests.","keywords":["amazon","aws","sns","client"],"version":"0.1.1","repository":{"type":"git","url":"git://github.com/mattrobenolt/node-snsclient.git"},"author":{"name":"Matt Robenolt","email":"matt@ydekproductions.com","url":"http://mattrobenolt.com"},"main":"./index","bugs":{"url":"https://github.com/mattrobenolt/node-snsclient/issues"},"scripts":{"test":"make test"},"directories":{"lib":"lib","example":"examples"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"mocha":"*","should":"*","nock":"*"},"_npmUser":{"name":"mattrobenolt","email":"matt@ydekproductions.com"},"_id":"aws-snsclient@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"3fe222f999a59bec55785dff1a5b06e13cf1d6a0","tarball":"http://registry.npmjs.org/aws-snsclient/-/aws-snsclient-0.1.1.tgz"},"maintainers":[{"name":"mattrobenolt","email":"matt@ydekproductions.com"}]},"0.1.2":{"name":"aws-snsclient","description":"A client for parsing Amazon AWS SNS requests.","keywords":["amazon","aws","sns","client"],"version":"0.1.2","repository":{"type":"git","url":"git://github.com/mattrobenolt/node-snsclient.git"},"author":{"name":"Matt Robenolt","email":"matt@ydekproductions.com","url":"http://mattrobenolt.com"},"main":"./index","bugs":{"url":"https://github.com/mattrobenolt/node-snsclient/issues"},"directories":{"lib":"lib","example":"examples"},"engines":{"node":">= 0.4.0"},"dependencies":{},"readme":"# Amazon AWS SNS (Simple Notification Service) http(s) endpoint\n## Installation\n```\n$ npm install aws-snsclient\n```\n\n## Basic Usage\n```javascript\nvar http = require('http')\n  , SNSClient = require('aws-snsclient');\n\nvar client = SNSClient(function(message) {\n    console.log(message);\n});\n\nhttp.createServer(function(req, res) {\n    if(req.method === 'POST' && req.url === '/receive') {\n        return client(req, res);\n    }\n    res.writeHead(404);\n    res.end('Not found.');\n}).listen(9000);\n```\nYour client only needs to accept one callback, which accepts an object of the decoded message sent from the SNS topic.\n\n`message` is the raw JSON. You'll probably want access to: `message.Message` to get the actual message that you sent.\n\n## Confirmation Requests\n\nThe initial confirmation request sent out by Amazon is automatically confirmed at the same endpoint. No additional effort needed.\n\n## Request Verification\n\nSignatures are automatically verified, but we can optionally verify the correct account id, region, and topics.\n\n### Ignore signature verification (recommended for debugging only)\n```javascript\nvar auth = {\n    verify: false\n};\nvar client = SNSClient(auth, function(message) {\n    console.log(message);\n});\n```\n\n### Verify all credentials\n```javascript\nvar auth = {\n    region: 'us-east-1'\n  , account: 'xxx'\n  , topic: 'xxx'\n};\nvar client = SNSClient(auth, function(message) {\n    console.log(message);\n});\n```\n\n## Use with Express\n```javascript\nvar express = require('express')\n  , app = express.createServer()\n  , SNSClient = require('aws-snsclient');\n\nvar auth = {\n    region: 'us-east-1'\n  , account: 'xxx'\n  , topic: 'xxx'\n}\nvar client = SNSClient(auth, function(message) {\n    console.log(message);\n});\n\napp.post('/receive', client);\n\napp.listen(9000);\n```","_id":"aws-snsclient@0.1.2","dist":{"shasum":"cca3fd585c69650a251d2ea88d9b3d68a786103b","tarball":"http://registry.npmjs.org/aws-snsclient/-/aws-snsclient-0.1.2.tgz"},"maintainers":[{"name":"mattrobenolt","email":"matt@ydekproductions.com"}]}},"readme":"# Amazon AWS SNS (Simple Notification Service) http(s) endpoint\n## Installation\n```\n$ npm install aws-snsclient\n```\n\n## Basic Usage\n```javascript\nvar http = require('http')\n  , SNSClient = require('aws-snsclient');\n\nvar client = SNSClient(function(message) {\n    console.log(message);\n});\n\nhttp.createServer(function(req, res) {\n    if(req.method === 'POST' && req.url === '/receive') {\n        return client(req, res);\n    }\n    res.writeHead(404);\n    res.end('Not found.');\n}).listen(9000);\n```\nYour client only needs to accept one callback, which accepts an object of the decoded message sent from the SNS topic.\n\n`message` is the raw JSON. You'll probably want access to: `message.Message` to get the actual message that you sent.\n\n## Confirmation Requests\n\nThe initial confirmation request sent out by Amazon is automatically confirmed at the same endpoint. No additional effort needed.\n\n## Request Verification\n\nSignatures are automatically verified, but we can optionally verify the correct account id, region, and topics.\n\n### Ignore signature verification (recommended for debugging only)\n```javascript\nvar auth = {\n    verify: false\n};\nvar client = SNSClient(auth, function(message) {\n    console.log(message);\n});\n```\n\n### Verify all credentials\n```javascript\nvar auth = {\n    region: 'us-east-1'\n  , account: 'xxx'\n  , topic: 'xxx'\n};\nvar client = SNSClient(auth, function(message) {\n    console.log(message);\n});\n```\n\n## Use with Express\n```javascript\nvar express = require('express')\n  , app = express.createServer()\n  , SNSClient = require('aws-snsclient');\n\nvar auth = {\n    region: 'us-east-1'\n  , account: 'xxx'\n  , topic: 'xxx'\n}\nvar client = SNSClient(auth, function(message) {\n    console.log(message);\n});\n\napp.post('/receive', client);\n\napp.listen(9000);\n```","maintainers":[{"name":"mattrobenolt","email":"matt@ydekproductions.com"}],"time":{"modified":"2012-08-08T15:19:29.358Z","created":"2012-01-20T21:47:54.196Z","0.1.0":"2012-01-20T21:47:54.669Z","0.1.1":"2012-03-23T19:56:37.959Z","0.1.2":"2012-08-08T15:19:29.358Z"},"author":{"name":"Matt Robenolt","email":"matt@ydekproductions.com","url":"http://mattrobenolt.com"},"repository":{"type":"git","url":"git://github.com/mattrobenolt/node-snsclient.git"},"_attachments":{"aws-snsclient-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-lje79DYrggPCw14/DbDlZg==","length":3639,"stub":true},"aws-snsclient-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TCoY0UwuG7mzIZPDltsP/Q==","length":3763,"stub":true},"aws-snsclient-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+yrwkJqMre3seZnOC37Qrg==","length":3453,"stub":true}}}},
{"id":"aws-sqs","key":"aws-sqs","value":{"rev":"5-5ad62a3b29d2f9865e1479e5570b9d7d"},"doc":{"_id":"aws-sqs","_rev":"5-5ad62a3b29d2f9865e1479e5570b9d7d","name":"aws-sqs","description":"Amazon AWS SQS (Simple Queue Service) library for Node.js that is user-friendly","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"aws-sqs","version":"0.0.1","author":{"name":"Modulus","email":"support@onmodulus.com"},"description":"Amazon AWS SQS (Simple Queue Service) library for Node.js that is user-friendly","keywords":["amazon","aws","sqs","simple queue service","wrapper","api","queue"],"homepage":"https://github.com/onmodulus/aws-sqs","contributors":[{"name":"Charlie Key","email":"charlie@onmodulus.com","url":"http://www.paranoidferret.com/"}],"dependencies":{"aws-lib":"0.0.6"},"devDependencies":{"vows":"0.6.2"},"main":"lib/sqs","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/onmodulus/aws-sqs.git"},"engines":{"node":">=0.4.10"},"_npmUser":{"name":"zwigby","email":"ckey@paranoidferret.com"},"_id":"aws-sqs@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4cb37727d8bae336f3f70587339ed59d13600d88","tarball":"http://registry.npmjs.org/aws-sqs/-/aws-sqs-0.0.1.tgz"},"maintainers":[{"name":"zwigby","email":"ckey@paranoidferret.com"}]},"0.0.2":{"name":"aws-sqs","version":"0.0.2","author":{"name":"Modulus","email":"support@onmodulus.com"},"description":"Amazon AWS SQS (Simple Queue Service) library for Node.js that is user-friendly","keywords":["amazon","aws","sqs","simple queue service","wrapper","api","queue"],"homepage":"http://onmodulus.github.com/aws-sqs/symbols/SQS.html","contributors":[{"name":"Charlie Key","email":"charlie@onmodulus.com","url":"http://www.paranoidferret.com/"}],"dependencies":{"aws-lib":"0.0.6"},"devDependencies":{"vows":"0.6.2"},"main":"lib/sqs","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/onmodulus/aws-sqs.git"},"engines":{"node":">=0.4.10"},"_npmUser":{"name":"zwigby","email":"ckey@paranoidferret.com"},"_id":"aws-sqs@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4d25c568af09735a596ce1a5983685b70e7224d3","tarball":"http://registry.npmjs.org/aws-sqs/-/aws-sqs-0.0.2.tgz"},"maintainers":[{"name":"zwigby","email":"ckey@paranoidferret.com"}]}},"readme":"aws-sqs\n=======\n\nAWS Simple Queue Service library for Node.js\n\n## Install\n\n    npm install aws-sqs\n\n## Docs\nYou can checkout the class documentation at [SQS Class](http://onmodulus.github.com/aws-sqs/symbols/SQS.html).\n\n## Simple usage\n\n    var sqs = new SQS('awsId', 'awsSecret');\n    sqs.createQueue('testTimeoutQueue', {VisibilityTimeout : 120}, function(err, res) {\n      if(err) {\n        //handle error\n      }\n      console.log(res); // something like /158795553855/testTimeoutQueue\n    });","maintainers":[{"name":"zwigby","email":"ckey@paranoidferret.com"}],"time":{"modified":"2012-06-19T03:18:19.422Z","created":"2012-06-08T04:10:30.073Z","0.0.1":"2012-06-08T04:10:30.871Z","0.0.2":"2012-06-19T03:18:19.422Z"},"author":{"name":"Modulus","email":"support@onmodulus.com"},"repository":{"type":"git","url":"git://github.com/onmodulus/aws-sqs.git"},"_attachments":{"aws-sqs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9p5cCb2gcJ4vQy+mmFyvrQ==","length":18581,"stub":true},"aws-sqs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WIawbpEthdBUBmQJ4XLYWQ==","length":5015,"stub":true}}}},
{"id":"aws-stuff","key":"aws-stuff","value":{"rev":"21-d623597e755ff66a3a6e44ec27d47d08"},"doc":{"_id":"aws-stuff","_rev":"21-d623597e755ff66a3a6e44ec27d47d08","name":"aws-stuff","description":"{S3,...}{Server,Client}, e.g. for your tests.","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.1":{"name":"aws-stuff","version":"0.0.1","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"devDependencies":{},"_id":"aws-stuff@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f65f6a1a0baaaaa34101ed2ffaf0aa3d7ffb5311","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.2":{"name":"aws-stuff","version":"0.0.2","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"devDependencies":{},"_id":"aws-stuff@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"dd6c19193c60b134bc02fd8c979bee2ef8ffcc0e","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.3":{"name":"aws-stuff","version":"0.0.3","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"devDependencies":{},"_id":"aws-stuff@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b1f77c08008f34e6d82417617fd5b61b3ee4ee7e","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.4":{"name":"aws-stuff","version":"0.0.4","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"devDependencies":{},"_id":"aws-stuff@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"455edafcef36311129b5aa6ff307ccfe383db11c","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.5":{"name":"aws-stuff","version":"0.0.5","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"aws-stuff@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6ee416de7648f5959bf18136f9554cbc40dac5d1","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.5.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.6":{"name":"aws-stuff","version":"0.0.6","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"aws-stuff@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"1bc53a1b78676cd8c066f1a23eef441cd5bb05cc","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.6.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.7":{"name":"aws-stuff","version":"0.0.7","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"aws-stuff@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a29387b57172189c59e85eccde750505bf341b7b","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.7.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.8":{"name":"aws-stuff","version":"0.0.8","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"aws-stuff@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b15754b8d86d8b8dca9fcd04eb34a24d30e3302a","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.8.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.9":{"name":"aws-stuff","version":"0.0.9","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"aws-stuff@0.0.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"90fe13498c8e51d07dc89868aae1fd9b9fbe329c","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.9.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]},"0.0.10":{"name":"aws-stuff","version":"0.0.10","description":"{S3,...}{Server,Client}, e.g. for your tests.","url":"https://github.com/andrewschaaf/node-aws-stuff","main":"lib/aws-stuff.js","dependencies":{"underscore":">=1.1.7","async":">=0.1.9","strftime":">=0.4.6","tafa-misc-util":">=0.1.6","parted":">=0.0.4","s3-post":">=0.0.3"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_npmUser":{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"},"_id":"aws-stuff@0.0.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.96","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"be43af2801068eb9caa4408d731f8f15b167907e","tarball":"http://registry.npmjs.org/aws-stuff/-/aws-stuff-0.0.10.tgz"},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}]}},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}],"time":{"modified":"2011-10-31T18:46:12.300Z","created":"2011-09-26T13:44:56.771Z","0.0.1":"2011-09-26T13:44:56.971Z","0.0.2":"2011-09-26T21:13:32.341Z","0.0.3":"2011-09-27T13:30:39.412Z","0.0.4":"2011-09-27T14:25:53.481Z","0.0.5":"2011-10-31T16:35:17.847Z","0.0.6":"2011-10-31T16:44:03.912Z","0.0.7":"2011-10-31T17:28:52.267Z","0.0.8":"2011-10-31T17:41:10.772Z","0.0.9":"2011-10-31T17:44:04.656Z","0.0.10":"2011-10-31T18:46:12.300Z"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com","url":"http://andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-aws-stuff.git"},"_attachments":{"aws-stuff-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-6Gs6Md1is4thK2nU6p1dmQ==","length":20480,"stub":true},"aws-stuff-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-+RQ1j9VTIjQnAkubVuwf7w==","length":20480,"stub":true},"aws-stuff-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-zg9uYK+XopoGtVOYcLWpUA==","length":20480,"stub":true},"aws-stuff-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ooJeJ7IsHkaBKqqV48FS5g==","length":20480,"stub":true},"aws-stuff-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-rpTMBmvVEJbq7R98HV8+kg==","length":20480,"stub":true},"aws-stuff-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-fvaCIU/4DTKQywsdYaxEpg==","length":20480,"stub":true},"aws-stuff-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-nuWrVSFOIo9j7LvgGuJvMg==","length":11833,"stub":true},"aws-stuff-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sgg+D8WhbQ+bZSwHSaK7hg==","length":11714,"stub":true},"aws-stuff-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8P9TAhg3syXSgaN5rQonrg==","length":10794,"stub":true},"aws-stuff-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-T1xbcEQ9W0iMNptB/HdmVA==","length":10772,"stub":true}}}},
{"id":"aws-swf","key":"aws-swf","value":{"rev":"20-8027a6556c16471308bf27e03833758a"},"doc":{"_id":"aws-swf","_rev":"20-8027a6556c16471308bf27e03833758a","name":"aws-swf","description":"Node.js toolkit for the Amazon SWF API","dist-tags":{"latest":"1.0.3"},"versions":{"0.1.0":{"name":"aws-swf","version":"0.1.0","description":"Node.js helpers to access the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"licenses":[{"type":"MIT","url":"http://github.com/ciaranj/node-oauth/raw/master/LICENSE"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6aced8a4b5aace28db34fc10de67cfbe54082b63","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-0.1.0.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"0.2.0":{"name":"aws-swf","version":"0.2.0","description":"Node.js helpers to access the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"cf1f664283f8d250bab792d2f7cf412e28d25061","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-0.2.0.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"0.3.0":{"name":"aws-swf","version":"0.3.0","description":"Node.js helpers to access the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@0.3.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8ced9bcc266bcb6f507fc03a932e0fa2f7500d05","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-0.3.0.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"0.4.0":{"name":"aws-swf","version":"0.4.0","description":"Node.js helpers to access the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@0.4.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"bf36facd90c999d1beb34da3df6bf6d3f8760bb3","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-0.4.0.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"0.6.0":{"name":"aws-swf","version":"0.6.0","description":"Node.js toolkit for the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"bin":{"swf-activity":"./cli/swf-activity.js","swf-decider":"./cli/swf-decider.js","swf-register":"./cli/swf-register.js","swf-set-credentials":"./cli/swf-set-credentials.js","swf-start":"./cli/swf-start.js"},"scripts":{"install":"./cli/swf-set-credentials.js"},"dependencies":{"optimist":"0.3.4","colors":"0.6.0-1"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@0.6.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"561ffa5827d384307eee21fe45be50339228e0ae","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-0.6.0.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"1.0.0":{"name":"aws-swf","version":"1.0.0","description":"Node.js toolkit for the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"bin":{"swf-activity":"./cli/swf-activity.js","swf-decider":"./cli/swf-decider.js","swf-register":"./cli/swf-register.js","swf-set-credentials":"./cli/swf-set-credentials.js","swf-start":"./cli/swf-start.js"},"scripts":{"install":"./cli/swf-set-credentials.js"},"dependencies":{"optimist":"0.3.4","async":"0.1.22","colors":"0.6.0-1"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@1.0.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"877e7e83663e63236edad26ffbdf6e03897c8e63","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-1.0.0.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"1.0.1":{"name":"aws-swf","version":"1.0.1","description":"Node.js toolkit for the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"engines":{"node":">=0.6.0"},"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"bin":{"swf-activity":"./cli/swf-activity.js","swf-decider":"./cli/swf-decider.js","swf-register":"./cli/swf-register.js","swf-set-credentials":"./cli/swf-set-credentials.js","swf-start":"./cli/swf-start.js"},"scripts":{"install":"./cli/swf-set-credentials.js"},"dependencies":{"optimist":"0.3.4","async":"0.1.22","colors":"0.6.0-1"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@1.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"689d50e92dab744e5f1216a3937204f39d20836c","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-1.0.1.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"1.0.2":{"name":"aws-swf","version":"1.0.2","description":"Node.js toolkit for the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"preferGlobal":"true","engines":{"node":">=0.6.0"},"keywords":["cli","amazon","aws","swf","workflow"],"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/neyric/aws-swf.git"},"bin":{"swf-activity":"./cli/swf-activity.js","swf-decider":"./cli/swf-decider.js","swf-register":"./cli/swf-register.js","swf-set-credentials":"./cli/swf-set-credentials.js","swf-start":"./cli/swf-start.js"},"scripts":{"install":"./cli/swf-set-credentials.js"},"dependencies":{"optimist":"0.3.4","async":"0.1.22","colors":"0.6.0-1"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"_npmUser":{"name":"neyric","email":"eric.abouaf@gmail.com"},"_id":"aws-swf@1.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d582ea2d5ba36d53fbc7b39ff7e104ede703f56d","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-1.0.2.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]},"1.0.3":{"name":"aws-swf","version":"1.0.3","description":"Node.js toolkit for the Amazon SWF API","author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"preferGlobal":"true","engines":{"node":">=0.6.0"},"keywords":["cli","amazon","aws","swf","workflow"],"main":"index.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"http://github.com/neyric/aws-swf.git"},"bin":{"swf-activity":"./cli/swf-activity.js","swf-decider":"./cli/swf-decider.js","swf-register":"./cli/swf-register.js","swf-set-credentials":"./cli/swf-set-credentials.js","swf-start":"./cli/swf-start.js"},"scripts":{"install":"./cli/swf-set-credentials.js"},"dependencies":{"optimist":"0.3.4","async":"0.1.22","colors":"0.6.0-1"},"licenses":[{"type":"MIT","url":"https://raw.github.com/neyric/aws-swf/master/LICENSE.txt"}],"readme":"# Amazon SWF (Simple WorkFlow) toolkit for Node.js\n\nThis toolkit provides :\n\n * Command-line tools to interact with AWS SWF :\n   * [swf-activity](#swf-activity): start activity pollers\n   * [swf-decider](#swf-decider): start decider pollers\n   * [swf-register](#swf-register): register SWF resources\n   * [swf-start](#swf-start): start workflow executions\n\n * Library classes to wrap the common concepts of the AWS SWF API :\n   * ActivityPoller\n   * ActivityTask\n   * Decider\n   * DecisionTask\n   * Workflow\n   * WorkflowExecution\n\n\n## Requirements\n\n * NodeJS & npm\n * An active AWS account and API credentials\n * Some understanding of [AWS SimpleWorkflow](http://aws.amazon.com/en/documentation/swf/) concepts\n\n\n## Installation\n\n````sh\n$ [sudo] npm install aws-swf -g\n````\n\nThe installation process will ask you for your AWS credentials, and store them in a config file.\n\nYou can change the credentials by calling :\n\n````sh\n$ [sudo] swf-set-credentials\n````\n\n\n## Command-line usage & Beginners' Guide\n\nThis small tutorial will use the examples in the *examples/* directory.\n\n### Step1: register all components\n\nFirst we need to register a domain :\n\n````sh\n$ swf-register -k domain aws-swf-test-domain\n````\n\nWe then register all workflows from examples/workflows :\n\n````sh\n$ cd examples/workflows\n$ swf-register\n````\n\nFinally, we will register all activity types from examples/activities :\n\n````sh\n$ cd examples/activities\n$ swf-register\n````\n\n\n### Step2: run the decider, and the activity poller\n\nLaunch a decider Poller:\n\n````sh\n$ cd examples/workflows\n$ swf-decider\n````\n\nLaunch an Activity Poller:\n\n````sh\n$ cd examples/activities\n$ swf-activity\n````\n\n### Step3: Start the workflow !\n\n````sh\n$ swf-start hello-workflow \"{\\\"a\\\":4,\\\"b\\\":6}\"\n````\n\n\n\n### Step4: How does this first example works\n\nFirst, let's have a look at the first decider example :\n\n````javascript\n// step1 -> step2 -> terminate\n\nexports.workflow = function(dt) {\n\n   if( dt.just_started() ) {\n      \n      dt.schedule('step1', {\n         activityType: 'echo',\n         input: dt.workflow_input()\n      });\n      \n   }\n   else if( dt.completed('step1') && !dt.scheduled('step2')  ) {\n      \n      dt.schedule('step2', {\n         activityType: 'sum',\n         input: dt.results('step1')\n      });\n      \n   }\n   else if( dt.completed('step2')  ) {\n      dt.stop(\"finished !\");\n   }\n   \n};\n````\n\n#### What happened ?\n\n * The hello-workflow is started on SWF through the swf-start command, with the string \"{\\\"a\\\":4,\\\"b\\\":6}\" as input\n * SWF: schedules a Decision task\n * DECIDER: Receives the decision task. As dt.just_started() is true, the step1 is scheduled.\n * SWF: schedules the step1 activity\n * ACTIVITY: Receives the activity task. The echo task will return as \"result\" what it as been given as input (ie the \"{\\\"a\\\":4,\\\"b\\\":6}\" string...)\n * SWF: receives step1 results and schedule a decision task\n * DECIDER: receives the decision task. This time, step1 is completed, but step2 is not completed, so step2 is scheduled\n * SWF: schedules the step2 activity\n * ACTIVITY: Receives the activity task. The sum task will decode its input (in JSON format), and return the sum of a and b\n * SWF: receives step2 results and schedule a decision task\n * DECIDER: receives the decision task. step2 is completed so we send a CompleteWorkflowExecution through the stop() function\n * SWF: mark the workflow execution as completed\n\n\n## swf-set-credentials\n\nAll swf-* command line tools use the credentials given to *swf-set-credentials* or at installation.\n\n*swf-set-credentials* also stores a default SWF domain and tasklist, which are used as the default values for all swf-* commands.\n\n\n## swf-register\n\nRegister a new activity-type, workflow or domain on AWS SWF.\n\nUsage: swf-register -k resource-kind resource-name\n\n    Options:\n      -k, --kind     Kind of resource to register. \"activity\", \"workflow\", or \"domain\"  [default: \"activity\"]\n      -d, --domain   SWF domain of the activity-type or workflow to register            [default: \"aws-swf-test-domain\"]\n      -v, --version  version of the activity-type or workflow to register               [default: \"1.0\"]\n      -h, --help     show this help                                                   \n\n\nExamples :\n\n    # Register all workflows and activities in the working directory\n    $ swf-register\n    \n    # Register a new domain\n    $ swf-register -k domain my-domain-name\n    \n    # Register a new activity\n    $ swf-register -k activity -d my-domain-name -v 2.0\n    \n    # Register a new workflow\n    $ swf-register -k workflow -d my-domain-name -v 1.0\n\n\n## swf-activity\n\nStart an activity-poller for AWS SWF.\n\nUsage: swf-activity\n\n    Options:\n        -f, --file      file to execute in a node spawed process  [default: \"/Users/neyric/git/aws-swf/cli/activity-worker.js\"]\n        -d, --domain    SWF domain                                [default: \"aws-swf-test-domain\"]\n        -t, --tasklist  tasklist                                  [default: \"aws-swf-tasklist\"]\n        -i, --identity  identity of the poller                    [default: \"ActivityPoller-hostname-PID\"]\n        -h, --help      show this help                          \n\nExamples :\n\n    # Start an activity poller for all activity modules in the working directory\n    $ cd examples/activities\n    $ swf-activity\n    \n    # Same thing but on a different domain & taskList\n    $ cd examples/activities\n    $ swf-activity -t server-A-taskList -d my-domain-name\n\n\n### How it works\n\nWhat does swf-activity do :\n\n * Creates an *ActivityPoller*, which polls SWF for new activity tasks\n * For each new activity task received, spawns a node process (specified by -f), passing the activity task as an argument in JSON.\n * The default process file (activity-worker.js), will look for a node.js module in the current working directory with the same name as the activity type, and call *worker(task)*\n * When the spawed process exits, polls for new activity tasks\n\nWhat does swf-activity doesn't do :\n\n * The main poller process doesn't send any result to SWF. It is up to the worker module to send the response ! ( task.respondCompleted or respondFailed )\n\n\nCheck out the [aws-swf-activities](https://github.com/neyric/aws-swf-activities) project which provides some common activity workers such as :\n\n * making an HTTP request\n * sending an email\n * making a SOAP request\n * making an XMLRPC request\n * etc...\n\n\n## swf-decider\n\nStart a decider-poller for AWS SWF.\n\nUsage: swf-decider\n\n\n    Options:\n      -f, --file      file to execute in a node spawed process  [default: \"/Users/neyric/git/aws-swf/cli/decider-worker.js\"]\n      -d, --domain    SWF domain                                [default: \"aws-swf-test-domain\"]\n      -t, --tasklist  tasklist                                  [default: \"aws-swf-tasklist\"]\n      -i, --identity  identity of the poller                    [default: \"Decider-new-host-4.home-95630\"]\n      -h, --help      show this help                          \n\nExamples :\n\n      # Start an decider poller for all workflow modules in the working directory\n      $ cd examples/workflows\n      $ swf-decider\n      \n      # Same thing but on a different domain & taskList\n      $ cd examples/workflows\n      $ swf-decider -t my-decider-taskList -d my-domain-name\n\n### How it works\n\nWhat does swf-decider do :\n\n * Creates a *Decider*, which polls SWF for new decision tasks\n * For each new decision task received, spawns a node process (specified by -f), passing the decision task as an argument in JSON.\n * The default process file (decider-worker.js), will look for a node.js module in the current working directory with the same name as the workflow, and call *workflow(decisionTask)*\n * When the spawed process exits, polls for new decision tasks\n\n\nAdvantages of spawning the decider in a new process :\n\n * When a decider crashes, the poller still continues to poll for new decision tasks\n * In development mode, you don't need to restart the poller to change the decider\n\n\n### Writing deciders\n\nHere is a list of API methods available on the *decisionTask* passed to the workflow module :\n\n\nQuery the state of the workflow :\n\n * dt.just_started() : returns true if no activity has been scheduled yet (workflow just started)\n * dt.completed('step1') : returns true if the activityId 'step1' is completed\n * dt.scheduled('step2') : returns true if the activityId 'step2' has been scheduled (event if it's completed, failed, timedout, ...)\n \nRespond some decisions :\n\n * dt.schedule('step1', { activityType: 'hello-activity' }) : schedule a new activity task. 'step1' will be used as the activityId. The second parameter can contain any SWF property (timeouts, tasklists, etc...)\n * dt.waiting_for('step1','step2') : respond no decision, but assert that step1 and step2 can eventually finish. If not, throws an exception, which will result in a FailWorkflowExecution.\n\n\nGet the data :\n\n * dt.workflow_input() : returns the string passed as \"input\" at workflow start\n * dt.results('step1') : returns the result value of activity 'step1'\n\nEnd workflow executions :\n\n * dt.stop(\"finished !\") : stops the workflow execution (CompleteWorkflowExecution)\n * dt.fail(\"reason of failure\") : stops the workflow execution (FailWorkflowExecution)\n\n## swf-start\n\nStart a workflow execution on AWS SWF.\n\nUsage: swf-start workflow-name [input data]\n\n\n    Options:\n      -d, --domain                    SWF domain                                                      [default: \"aws-swf-test-domain\"]\n      -t, --tasklist                  tasklist                                                        [default: \"aws-swf-tasklist\"]\n      -v, --version                   version of the workflow to start                                [default: \"1.0\"]\n      -i, --workflowId                user defined identifier associated with the workflow execution\n      --executionStartToCloseTimeout  executionStartToCloseTimeout in seconds                         [default: \"1800\"]\n      --taskStartToCloseTimeout       taskStartToCloseTimeout in seconds                              [default: \"1800\"]\n      --childPolicy                   childPolicy                                                     [default: \"TERMINATE\"]\n      --tag                           tag to add to this workflow execution. Can have multiple.     \n\n\nExamples :\n\n    # Start a hello-workflow on the default domain and tasklist\n    $ swf-start hello-workflow\n    \n    # Start a hello-workflow on another domain and tasklist\n    $ swf-start hello-workflow -d my-domain-name -t hello-tasklist\n\n\n\n\n\n\n\n\n\n\n## Library Usage\n\n\n### Creating an SWF client object\n\n````javascript\nvar swf = require(\"aws-swf\");\nvar swfClient = swf.createClient({\n    accessKeyId: \"... access key id here ...\",\n    secretAccessKey: \"... secret key here ...\"\n});\n````\n\nIf no config is passed to createClient, we'll use the config.js file written by swf-set-credentials.\n\n````javascript\nvar swf = require(\"aws-swf\"),\n    swfClient = swf.createClient();\n````\n\n\n### Creating an ActivityPoller\n\nAn *ActivityPoller* polls Amazon SWF for new tasks to be done.\n\nAn *ActivityTask* is instantiated by an *ActivityPoller* when it receives a task from SWF.\n\nIt is passed to your callback and adds the respondCompleted() and respondFailed() methods.\n\nExample :\n\n\n````javascript\nvar activityPoller = new ActivityPoller(swfClient, {\n    \n   \"domain\": \"test-domain\",\n   \"taskList\": { \"name\": \"test-taskList\" },\n   \"identity\": \"ActivityPoller-1\"\n   \n}, function(activityTask, cb) {\n   \n   console.log('A new task is available !');\n   // Do something here...\n   \n   // sends \"RespondActivityTaskCompleted\" to SWF\n   // result: Maximum length of 32768.\n   activityTask.respondCompleted(result, function(err) {\n      cb(true); // free the poller for new activities\n   }); \n   \n   // or :\n   \n   // sends \"RespondActivityTaskFailed\" to SWF\n   // parameters: \n   // reason (string or undefined): Maximum length of 256\n   // details (string or undefined): Maximum length of 32768\n   activityTask.respondFailed(reason, details, function(err) {\n       cb(true); // free the poller for new activities\n   });\n   \n});\n\nactivityPoller.start();\n````\n\n\nIt is not recommanded to stop the poller in the middle of a long-polling request, because SWF might schedule an ActivityTask to this poller anyway, which will obviously timeout.\nThe .stop() method will wait for the end of the current polling request, eventually wait for a last activity execution, then stop properly :\n\n````javascript\n// on SIGINT event, close the poller properly\nprocess.on('SIGINT', function () {\n   console.log('Got SIGINT ! Stopping activity poller after this request...please wait...');\n   activityPoller.stop();\n});\n````\n\n\n### Creating a Decider\n\nA *Decider* will poll Amazon SWF for new decision tasks.\n\nA *DecisionTask* is instantiated by a *Decider* when it receives a decision task from SWF.\n\n````javascript\nvar myDecider = new swf.Decider(swfClient, {\n    \n   \"domain\": \"test-domain\",\n   \"taskList\": {\"name\": \"my-workflow-tasklist\"},\n   \"identity\": \"Decider-01\",\n   \n   \"maximumPageSize\": 500,\n   \"reverseOrder\": false // IMPORTANT: must replay events in the right order, ie. from the start\n   \n}, function(decisionTask, cb) {\n    \n    // do something here and send decisions...\n    \n    decisionTask.complete_workflow_execution(\"details of ending here ?\", function(err) {\n        \n    });\n    \n    cb(true); // to continue polling\n});\n````\n\n\nIt is not recommanded to stop the poller in the middle of a long-polling request, because SWF might schedule an ActivityTask to this poller anyway, which will obviously timeout.\nThe .stop() method will wait for the end of the current polling request, eventually wait for a last activity execution, then stop properly :\n\n\n````javascript\n// on SIGINT event, close the poller properly\nprocess.on('SIGINT', function () {\n   console.log('Got SIGINT ! Stopping decider poller after this request...please wait...');\n   myDecider.stop();\n});\n````\n\n\n### Using the simplified history (experimental)\n\nA *getSimpleWorkflowHistory* is available on the *decisionTask* instance, which gives a simpler way to write deciders...\n\n````javascript\nvar workflowHistory = decisionTask.getSimpleWorkflowHistory();\n/*\nworkflowHistory = {\n    input: \"...workflow input data...\",\n    activities: [\n        {\n            input: \"...activity input data...\",\n            activityId: \"theActivityId\",\n            lastEvent: \"...\"\n            result: \"...\"\n        }\n    ]\n}\n*/\n````\n\n\n\n### Starting a Workflow\n\n````javascript\nvar workflow = new swf.Workflow(swfClient, {\n   \"domain\": \"test-domain\",\n   \"workflowType\": {\n      \"name\": name,\n      \"version\": version\n   },\n   \"taskList\": { \"name\": \"my-workflow-tasklist\" },\n\n   \"executionStartToCloseTimeout\": \"1800\",\n   \"taskStartToCloseTimeout\": \"1800\",\n\n   \"tagList\": [\"music purchase\", \"digital\"],\n   \"childPolicy\": \"TERMINATE\"\n});\n````\n\nTo start a new *workflowExecution* :\n\n````javascript\nvar workflowExecution = workflow.start({ input: \"{}\"}, function(err, runId) {\n\n   if(err) {\n      console.log(\"Cannot start workflow : \", err);\n      return;\n   }\n\n   console.log(\"Workflow started, runId: \"+runId);\n\n});\n````\n\n\n\n### Register(Domain|ActivityType|WorkflowType)\n\n    swfClient.RegisterDomain({...}, function(err, result) { ... });\n    swfClient.RegisterActivityType({...}, function(err, result) { ... });\n    swfClient.RegisterWorkflowType({...}, function(err, result) { ... });\n\n\n### Generic SWF call (RAW call to the API)\n\n````javascript\nswfClient.DescribeDomain({\"name\": \"test-my-swf\"}, function(err, result) {\n    \n    if(err) console.log(\"error\", err);\n    \n    console.log(\"result\", JSON.stringify(result));\n});\n````\n\n\n### Raw Methods\n\nThe detailed API documentation http://docs.amazonwebservices.com/amazonswf/latest/apireference/Welcome.html\n\n * CountClosedWorkflowExecutions\n * CountOpenWorkflowExecutions\n * CountPendingActivityTasks\n * CountPendingDecisionTasks\n * DeprecateActivityType\n * DeprecateDomain\n * DeprecateWorkflowType\n * DescribeActivityType\n * DescribeDomain\n * DescribeWorkflowExecution\n * DescribeWorkflowType\n * GetWorkflowExecutionHistory\n * ListActivityTypes\n * ListClosedWorkflowExecutions\n * ListDomains\n * ListOpenWorkflowExecutions\n * ListWorkflowTypes\n * PollForActivityTask\n * PollForDecisionTask\n * RecordActivityTaskHeartbeat\n * RegisterActivityType\n * RegisterDomain\n * RegisterWorkflowType\n * RequestCancelWorkflowExecution\n * RespondActivityTaskCanceled\n * RespondActivityTaskCompleted\n * RespondActivityTaskFailed\n * RespondDecisionTaskCompleted\n * SignalWorkflowExecution\n * StartWorkflowExecution\n * TerminateWorkflowExecution\n\n\n","_id":"aws-swf@1.0.3","dist":{"shasum":"805b81b12026ce1e1711605506329c8431be7836","tarball":"http://registry.npmjs.org/aws-swf/-/aws-swf-1.0.3.tgz"},"maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}]}},"readme":"# Amazon SWF (Simple Workflow) Framework for Node.js\n\nThis library contains a simple client to use the Amazon SWF API methods.\n\nIt also provides classes to wrap the common concepts of the API.\n\n * ActivityPoller\n * ActivityTask\n * Decider\n * DecisionTask\n * Workflow\n * WorkflowExecution\n\n## Disclaimer\n\naws-swf is still under development, and is not suitable for production yet.\n\n## Install\n\n    npm install aws-swf\n\n## Usage\n\n### Connecting to AWS SWF\n\n    \n    var swf = require(\"aws-swf\");\n    var swfClient = swf.createClient({\n        accessKeyId: \"... access key id here ...\",\n        secretAccessKey: \"... secret key here ...\"\n    });\n    \n\n### Generic SWF call (RAW call to the API)\n\n    swfClient.DescribeDomain({\"name\": \"test-my-swf\"}, function(err, result) {\n        \n        if(err) console.log(\"error\", err);\n        \n        console.log(\"result\", JSON.stringify(result));\n    });\n\n\n### Raw Methods\n\nThe detailed API documentation http://docs.amazonwebservices.com/amazonswf/latest/apireference/Welcome.html\n\n * CountClosedWorkflowExecutions\n * CountOpenWorkflowExecutions\n * CountPendingActivityTasks\n * CountPendingDecisionTasks\n * DeprecateActivityType\n * DeprecateDomain\n * DeprecateWorkflowType\n * DescribeActivityType\n * DescribeDomain\n * DescribeWorkflowExecution\n * DescribeWorkflowType\n * GetWorkflowExecutionHistory\n * ListActivityTypes\n * ListClosedWorkflowExecutions\n * ListDomains\n * ListOpenWorkflowExecutions\n * ListWorkflowTypes\n * PollForActivityTask\n * PollForDecisionTask\n * RecordActivityTaskHeartbeat\n * RegisterActivityType\n * RegisterDomain\n * RegisterWorkflowType\n * RequestCancelWorkflowExecution\n * RespondActivityTaskCanceled\n * RespondActivityTaskCompleted\n * RespondActivityTaskFailed\n * RespondDecisionTaskCompleted\n * SignalWorkflowExecution\n * StartWorkflowExecution\n * TerminateWorkflowExecution\n\n\n### Register(Domain|ActivityType|WorkflowType)\n\n    swfClient.RegisterDomain({...}, function(err, result) { ... });\n    swfClient.RegisterActivityType({...}, function(err, result) { ... });\n    swfClient.RegisterWorkflowType({...}, function(err, result) { ... });\n\n### Creating an Activity Poller\n\n    TODO\n    \n\n### Creating a Decider\n\n\n### Starting a Workflow\n\n\n\n## Running the examples\n\n * Copy examples/config.example.js to examples/config.js and edit  your AWS credentials\n * run the examples :)\n\n\n\n","maintainers":[{"name":"neyric","email":"eric.abouaf@gmail.com"}],"time":{"modified":"2012-08-08T07:56:03.472Z","created":"2012-05-04T12:12:46.692Z","0.1.0":"2012-05-04T12:12:50.436Z","0.2.0":"2012-06-24T14:45:40.315Z","0.3.0":"2012-06-28T23:01:34.843Z","0.4.0":"2012-07-17T10:05:45.676Z","0.6.0":"2012-07-18T17:08:29.422Z","1.0.0":"2012-07-20T16:25:58.017Z","1.0.1":"2012-07-20T16:31:50.738Z","1.0.2":"2012-07-27T19:48:00.921Z","1.0.3":"2012-08-08T07:56:03.472Z"},"author":{"name":"Eric Abouaf","email":"eric.abouaf@gmail.com"},"repository":{"type":"git","url":"http://github.com/neyric/aws-swf.git"},"users":{"fgribreau":true},"_attachments":{"aws-swf-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-WWLmZZulrgJXRPujE4nrEg==","length":16959,"stub":true},"aws-swf-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-+ZgmseBPj1NCoyBQMeOHEw==","length":16905,"stub":true},"aws-swf-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-yWPmx2yW1qK5c5RZngi4/g==","length":611954,"stub":true},"aws-swf-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-kIeG0Y8ip/LJ9yYGbINymA==","length":611967,"stub":true},"aws-swf-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-RvJK6ENTUBKq4Rsbda4A4g==","length":12429,"stub":true},"aws-swf-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-1CZS2NoLamx/ux/GI8s8Vg==","length":7672,"stub":true},"aws-swf-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OU0NYvp8yJ/o6Y9jeBSIWg==","length":7572,"stub":true},"aws-swf-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-foJ3dY0sd89SQkliTgL0GA==","length":7482,"stub":true},"aws-swf-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-O5oh+jBqER5ydm6IQ1ThKQ==","length":7563,"stub":true}}}},
{"id":"aws.js","key":"aws.js","value":{"rev":"7-f57f8da07825552c6cfe2eb0ddf7df6e"},"doc":{"_id":"aws.js","_rev":"7-f57f8da07825552c6cfe2eb0ddf7df6e","name":"aws.js","description":"Dead simple Amazon Web Services client","dist-tags":{"latest":"0.2.2"},"versions":{"0.0.1":{"name":"aws.js","version":"0.0.1","description":"Dead simple AWS client","author":{"name":"Jonathan Leibiusky","email":"ionathan@gmail.com"},"repository":{"type":"git","url":"git://github.com/xetorthio/aws.js.git"},"dependencies":{"xml2js-expat":"0.2.0"},"devDependencies":{},"main":"index","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"xetorthio","email":"ionathan@gmail.com"},"_id":"aws.js@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"70534f82d04b228a6d4a2ec311b038640687a276","tarball":"http://registry.npmjs.org/aws.js/-/aws.js-0.0.1.tgz"},"maintainers":[{"name":"xetorthio","email":"ionathan@gmail.com"}]},"0.1.0":{"name":"aws.js","version":"0.1.0","description":"Dead simple Amazon Web Services client","keywords":["ec2","amazon","amazon web services","aws","sqs","s3"],"author":{"name":"Jonathan Leibiusky","email":"ionathan@gmail.com"},"repository":{"type":"git","url":"git://github.com/xetorthio/aws.js.git"},"bugs":{"email":"ionathan@gmail.com","url":"http://github.com/xetorthio/aws.js/issues"},"dependencies":{"xml2js-expat":"0.2.0"},"devDependencies":{},"main":"index","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"xetorthio","email":"ionathan@gmail.com"},"_id":"aws.js@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6b8554f4276cf9a6a44f1b73925e7f57d1b575eb","tarball":"http://registry.npmjs.org/aws.js/-/aws.js-0.1.0.tgz"},"maintainers":[{"name":"xetorthio","email":"ionathan@gmail.com"}]},"0.2.2":{"name":"aws.js","version":"0.2.2","description":"Dead simple Amazon Web Services client","keywords":["ec2","amazon","amazon web services","aws","sqs","s3"],"author":{"name":"Jonathan Leibiusky","email":"ionathan@gmail.com"},"repository":{"type":"git","url":"git://github.com/xetorthio/aws.js.git"},"bugs":{"email":"ionathan@gmail.com","url":"http://github.com/xetorthio/aws.js/issues"},"dependencies":{"xml2js-expat":"0.2.0"},"devDependencies":{"mocha":"0.x.x"},"main":"index","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"xetorthio","email":"ionathan@gmail.com"},"_id":"aws.js@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4cdd56cd5f0e35f670e94c4d715c0c501c3f8248","tarball":"http://registry.npmjs.org/aws.js/-/aws.js-0.2.2.tgz"},"scripts":{},"readme":"# aws.js\n\naws.js is a dead simple and sane Amazon Web Services client for node.js\n\naws.js is very simple to use and do only the most basic stuff for you: signing the request and converting XML to a usable data structure.\n\n## How do I install it?\n\nInstall it as an npm package\n\n```bash\nnpm install aws.js\n```\n\n## How do I use it?\n\n```javascript\nvar client = aws.createClient('secret_access_key', 'aws_access_key_id', 'ec2.amazonaws.com');\nvar signature = client.run('/', 'RunInstances', {'ImageId':'ami-60a54009', 'MaxCount':3, 'MinCount':1, 'Placement.AvailabilityZone':'us-east-1b', 'Monitoring.Enabled':'true'}, function(response) {\n    console.log('Everything is OK. Here is what amazon API returned:');\n    console.log(response);\n}, function(error) {\n    console.log('There is an error:');\n    console.log(error);\n});\n\n```\n\nFor more usage examples check the tests.\n\n## I want to contribute!\n\nThat is great! Just fork the project in github. Create a topic branch, write some code, and add some tests for your new code.\n\nTo run the tests use mocha.\n\nThanks for helping!\n\n## License\n\nCopyright (c) 2012 Jonathan Leibiusky\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"xetorthio","email":"ionathan@gmail.com"}]}},"readme":null,"maintainers":[{"name":"xetorthio","email":"ionathan@gmail.com"}],"time":{"modified":"2012-04-17T18:18:00.986Z","created":"2012-01-17T13:49:53.117Z","0.0.1":"2012-01-17T13:49:54.433Z","0.1.0":"2012-01-24T18:52:40.604Z","0.2.2":"2012-04-17T18:18:00.986Z"},"author":{"name":"Jonathan Leibiusky","email":"ionathan@gmail.com"},"repository":{"type":"git","url":"git://github.com/xetorthio/aws.js.git"},"_attachments":{"aws.js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-J4CCtZUYELPpIJEz11GUGQ==","length":6478,"stub":true},"aws.js-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-q4cUTWupnY7BiQJUG1379Q==","length":2822,"stub":true},"aws.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cUMGtAp2rEEfuqayBy95sA==","length":1302,"stub":true}}}},
{"id":"aws2js","key":"aws2js","value":{"rev":"114-78709327005751bb8eaa903d1491ea99"},"doc":{"_id":"aws2js","_rev":"114-78709327005751bb8eaa903d1491ea99","name":"aws2js","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dist-tags":{"latest":"0.7.2"},"versions":{"0.2.0":{"name":"aws2js","main":"./lib/aws.js","version":"0.2.0","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.1.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"bcb2cf12f393e2bf8ab18f5adada6fc00ca3b846","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.2.0.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.2.1":{"name":"aws2js","main":"./lib/aws.js","version":"0.2.1","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.1.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"41d8dac70ca664f287c93739329a8cae05cccb24","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.2.1.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.2.2":{"name":"aws2js","main":"./lib/aws.js","version":"0.2.2","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.2.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"3bfdbb48f67cfa31882613bdf87458b14913a10f","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.2.2.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.3.0":{"name":"aws2js","main":"./lib/aws.js","version":"0.3.0","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.2.x","mime":">=1.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"635f4de901362185c0cbf4ea6400392b0f3fe287","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.3.0.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.3.1":{"name":"aws2js","main":"./lib/aws.js","version":"0.3.1","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.2.x","mime":">=1.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.3.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"9a909ee582e5a8c3f9eebeef5a3de983f1c6ffc3","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.3.1.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.3.2":{"name":"aws2js","main":"./lib/aws.js","version":"0.3.2","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.2.x","mime":">=1.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.3.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"0f79a56ee767435a3489c5b041079246b8ef877d","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.3.2.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.3.3":{"name":"aws2js","main":"./lib/aws.js","version":"0.3.3","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.x","libxmljs":">=0.x","libxml-to-js":">=0.2.x","mime":">=1.x"},"engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.3.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.3.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"acfaa9819c2ff4372471a194cb3eb78989123d93","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.3.3.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.3.4":{"name":"aws2js","main":"./lib/aws.js","version":"0.3.4","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.2.x","mime":">=1.x"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.3.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.3.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c8189a97e9cf8d9beda762ebff60583e4e980c66","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.3.4.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.3.5":{"name":"aws2js","main":"./lib/aws.js","version":"0.3.5","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.10-1","libxmljs":">=0.x","libxml-to-js":">=0.2.x","mime":">=1.x"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.3.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.3.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6a5c4bbd97b1b308bc53598ff7b3377c0239b92c","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.3.5.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.4.0":{"name":"aws2js","main":"./lib/aws.js","version":"0.4.0","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.10-2","libxmljs":">=0.x","libxml-to-js":">=0.3.1","mime":">=1.x"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.4.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9c0e03f515550c892ab2217756e24b73621b6be4","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.4.0.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{},"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"}},"0.4.1":{"name":"aws2js","main":"./lib/aws.js","version":"0.4.1","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.10-2","libxmljs":">=0.x","libxml-to-js":">=0.3.3","mime":">=1.x"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.4.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.4.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"88f26a24d3934cc73fd8f08064ed551099f0a497","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.4.1.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"directories":{}},"0.4.2":{"name":"aws2js","main":"./lib/aws.js","version":"0.4.2","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.11-1","libxmljs":">=0.x","libxml-to-js":">=0.3.4","mime":">=1.x"},"engines":{"node":">=0.4.9"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.4.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.4.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"722744665ae7a896ae1e53e6399d67d6d2dc423c","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.4.2.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"directories":{}},"0.4.3":{"name":"aws2js","main":"./lib/aws.js","version":"0.4.3","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.11-1","libxmljs":">=0.x","libxml-to-js":">=0.3.4","mime":">=1.x"},"engines":{"node":">=0.4.9"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.4.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.4.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0c40257035a758aa10b17d8dc3b083088f5fef7a","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.4.3.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"directories":{}},"0.4.4":{"name":"aws2js","main":"./lib/aws.js","version":"0.4.4","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"backport-0.4":">=0.4.11-1","libxmljs":">=0.x","libxml-to-js":">=0.3.4","mime":">=1.x"},"engines":{"node":">=0.4.9"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/aws2js/0.4.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"aws2js@0.4.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6bf771265c0e69ea8298dff2ad8343dbdb67b209","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.4.4.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"directories":{}},"0.5.0":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.0","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.8","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a8652c4be26f6d927808810b397049047f082345","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.0.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.1":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.1","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.8","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"064f7a4478371590b76b04f2e16a832bf850d1f0","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.1.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.2":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.2","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.8","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3eb9e9c351e93efe274817ab5cafe8ba5ca303b8","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.2.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.3":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.3","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.8","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"378456368a87e4e25604b6ca8268fedcb8262cf4","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.3.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.4":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.4","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.8","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9a260dd5276237011b15c00c33cfe3272d092a03","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.4.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.5":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.5","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.9","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"575364aabd0b579a4467c00fa45a3c5c67813744","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.5.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.6":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.6","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.9","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"68075f57f2d992726439a420f379ee1c29a18407","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.6.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.5.7":{"name":"aws2js","main":"./lib/aws.js","version":"0.5.7","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.9","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.5.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9b7f9dd6d6feced8f4e5201e8e262edbb048d80b","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.5.7.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.6.0":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.0","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.x","libxml-to-js":">=0.3.9","mime-magic":">=0.2.2"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0d2ede1b6ec151e5622ac9be98c8796ebeb3c5cc","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.0.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.6.1":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.1","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.3"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1ff489adde566ecb92ee9049f2fe17060f287d08","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.1.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.6.2":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.2","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.3"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b0508d0eaf82b3732e806c86796fb8782e7656a3","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.2.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.6.3":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.3","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.3"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","secure token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9a8809b57a5604de40f59e18635fbf437b8ec1eb","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.3.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.6.4":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.4","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.4"},"engines":{"node":">=0.4.10 <=0.6.8"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","secure token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"165fa9ba627e7dabfcd0611f21e183cbf9a88f42","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.4.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"directories":{}},"0.6.5":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.5","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.5"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","secure token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"271275962d85b576dc3315e280e55388a6f40c64","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.5.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.6":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.6","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.5"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9422c09ab933038f321bf645802b1f353d56e3ab","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.6.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.7":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.7","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3fda7cb601b73297507d2ead1efb7688af4e10ed","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.7.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.8":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.8","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"5cd77ef93524a8a966ad8b566159ff4059abe2bc","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.8.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.9":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.9","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.9","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.9","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"cd3c7483a961ee78f8ffc1803f4a6fda7c6c559a","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.9.tgz"},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.11":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.11","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"8c35a71f035b89dc6581cd0db5c8ff66de5586db","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.11.tgz"},"readme":"## About ![still maintained](http://stillmaintained.com/SaltwaterC/aws2js.png)\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.12":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.12","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"754713f496b7dc5860ed4086be8d05b436bc72b8","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.12.tgz"},"readme":"## About ![still maintained](http://stillmaintained.com/SaltwaterC/aws2js.png)\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.14":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.14","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.14","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8fc642ff2b63b4085c9edb48d1f5e5c8a306d60e","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.14.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.15":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.15","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.15","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"198b8adf9d353b6d8c701015d347be30a4e87106","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.15.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.16":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.16","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.16","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f55f8d5081e32e12ca152056821a1ef5fc8a6a9a","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.16.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.17":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.17","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.17","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"5004edd42260d4a1defbee73efe1216d9fd84465","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.17.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.18":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.18","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.4"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.18","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"9fef85e19bd06aa2851196db16dde3057e6bdb2a","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.18.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.19":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.19","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.4"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.19","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"799f992af180a288d0fb7d0f90047b593607436b","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.19.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.20":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.20","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.4"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.20","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"c8b852992690b78b6d75f42cb8cbd7fa7a34502b","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.20.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon EMR](https://github.com/SaltwaterC/aws2js/wiki/EMR-Client) (Elastic MapReduce)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.21":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.21","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.4"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"},{"name":"Jacky Jiang","url":"https://github.com/t83714"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.21","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"6b62b6ae8c48be3174e9129bedaba7707a22c10e","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.21.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon EMR](https://github.com/SaltwaterC/aws2js/wiki/EMR-Client) (Elastic MapReduce)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.6.22":{"name":"aws2js","main":"./lib/aws.js","version":"0.6.22","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.4"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"},{"name":"Jacky Jiang","url":"https://github.com/t83714"},{"name":"Alon Burg","url":"http://burg-alon.9folds.com/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns","emr","elastic mapreduce"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.6.22","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"2fe78b3cc4ffa569cc3029377724564df5aa8e21","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.6.22.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon EMR](https://github.com/SaltwaterC/aws2js/wiki/EMR-Client) (Elastic MapReduce)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.7.0":{"name":"aws2js","main":"./lib/aws.js","version":"0.7.0","description":"AWS (Amazon Web Services) APIs client implementation for node.js","scripts":{"install":"node install.js"},"dependencies":{"npm":">=1.0.x"},"devDependencies":{"http-get":">=0.4.0"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"},{"name":"Jacky Jiang","url":"https://github.com/t83714"},{"name":"Alon Burg","url":"http://burg-alon.9folds.com/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns","emr","elastic mapreduce"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.7.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"24a54fe6d45900dfbe83544e64bea88b528c106f","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.7.0.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, then run `npm install` on the aws2js top directory, or the recommended method:\n\n> npm install aws2js\n\n[npm](https://github.com/isaacs/npm) is the only direct dependency of this library. It is used programmatically to install the dependencies.\n\nBy default, the module installs as dependencies the [libxml-to-js](https://github.com/SaltwaterC/libxml-to-js) and the [mime-magic](https://github.com/SaltwaterC/mime-magic) libraries. Under Windows, it installs by default with [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) and mime-magic.\n\nBasically, under Windows the default installation is the equivalent of:\n\n> npm install aws2js --xml2js true\n\nIf you want to install the library without binary dependencies, you can issue this npm command:\n\n> npm install aws2js --xml2js true --mime true\n\nThis installs the library with xml2js and [mime](https://github.com/broofa/node-mime) as dependencies. Please notice that the mime library detects the MIME type by doing a file extension lookup, while mime-magic does it the proper way by wrapping the functionality of libmagic. You have been warned.\n\nThe '--xml2js true' and '--mime true' are boolean flags, therefore you may use them in any combination, if applicable.\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon EMR](https://github.com/SaltwaterC/aws2js/wiki/EMR-Client) (Elastic MapReduce)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributions\n\nFor the moment, this project is largely a one man show. Bear with me if things don't move as fast as they should. There are a handful of [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md) as well. The community makes things to be better for everyone.\n\nIf you'd like to contribute your line of code (or more), please send a pull request against the future branch. This makes things to be easier on my side. Feature branches are also acceptable. Even commits in your master branch are acceptable. I don't rely on GitHub's merge functionality as I always pull from remotes and manually issue the merge command.\n\nI ask you to patch against the future branch since that's the place where all the development happens, therefore it should be the least conflicts when merging your code. I use the master only for integrating the releases. The master branch always contains the latest stable release.\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.7.1":{"name":"aws2js","main":"./lib/aws.js","version":"0.7.1","description":"AWS (Amazon Web Services) APIs client implementation for node.js","scripts":{"install":"node install.js"},"dependencies":{"npm":">=1.0.x"},"devDependencies":{"http-get":">=0.4.0"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"},{"name":"Jacky Jiang","url":"https://github.com/t83714"},{"name":"Alon Burg","url":"http://burg-alon.9folds.com/"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns","emr","elastic mapreduce"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.7.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"d2f3dd006f94f95c13e31da9347f5bedfb15ab4e","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.7.1.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, then run `npm install` on the aws2js top directory, or the recommended method:\n\n> npm install aws2js\n\n[npm](https://github.com/isaacs/npm) is the only direct dependency of this library. It is used programmatically to install the dependencies.\n\nBy default, the module installs as dependencies the [libxml-to-js](https://github.com/SaltwaterC/libxml-to-js) and the [mime-magic](https://github.com/SaltwaterC/mime-magic) libraries. Under Windows, it installs by default with [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) and mime-magic.\n\nBasically, under Windows the default installation is the equivalent of:\n\n> npm install aws2js --xml2js true\n\nIf you want to install the library without binary dependencies, you can issue this npm command:\n\n> npm install aws2js --xml2js true --mime true\n\nThis installs the library with xml2js and [mime](https://github.com/broofa/node-mime) as dependencies. Please notice that the mime library detects the MIME type by doing a file extension lookup, while mime-magic does it the proper way by wrapping the functionality of libmagic. You have been warned.\n\nThe '--xml2js true' and '--mime true' are boolean flags, therefore you may use them in any combination, if applicable.\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon EMR](https://github.com/SaltwaterC/aws2js/wiki/EMR-Client) (Elastic MapReduce)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributions\n\nFor the moment, this project is largely a one man show. Bear with me if things don't move as fast as they should. There are a handful of [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md) as well. The community makes things to be better for everyone.\n\nIf you'd like to contribute your line of code (or more), please send a pull request against the future branch. This makes things to be easier on my side. Feature branches are also acceptable. Even commits in your master branch are acceptable. I don't rely on GitHub's merge functionality as I always pull from remotes and manually issue the merge command.\n\nI ask you to patch against the future branch since that's the place where all the development happens, therefore it should be the least conflicts when merging your code. I use the master only for integrating the releases. The master branch always contains the latest stable release.\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.7.2":{"name":"aws2js","main":"./lib/aws.js","version":"0.7.2","description":"AWS (Amazon Web Services) APIs client implementation for node.js","scripts":{"install":"node install.js"},"dependencies":{"npm":">=1.0.x"},"devDependencies":{"http-get":">=0.4.0"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"},{"name":"Joe Roberts","url":"https://github.com/zefer"},{"name":"sauvainr","url":"https://github.com/sauvainr"},{"name":"Thomas Bruyelle","url":"https://github.com/tbruyelle"},{"name":"Dan Ordille","url":"https://github.com/dordille"},{"name":"ubert","url":"https://github.com/ubert"},{"name":"Jacky Jiang","url":"https://github.com/t83714"},{"name":"Alon Burg","url":"http://burg-alon.9folds.com/"},{"name":"Matt Monson","url":"https://github.com/mattmonson"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns","emr","elastic mapreduce"],"_npmUser":{"name":"saltwaterc","email":"saltwaterc@gmail.com"},"_id":"aws2js@0.7.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"6734c41f2863ad80de6e41368bac0d4abaaced0d","tarball":"http://registry.npmjs.org/aws2js/-/aws2js-0.7.2.tgz"},"readme":"## About\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, then run `npm install` on the aws2js top directory, or the recommended method:\n\n> npm install aws2js\n\n[npm](https://github.com/isaacs/npm) is the only direct dependency of this library. It is used programmatically to install the dependencies.\n\nBy default, the module installs as dependencies the [libxml-to-js](https://github.com/SaltwaterC/libxml-to-js) and the [mime-magic](https://github.com/SaltwaterC/mime-magic) libraries. Under Windows, it installs by default with [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) and mime-magic.\n\nBasically, under Windows the default installation is the equivalent of:\n\n> npm install aws2js --xml2js true\n\nIf you want to install the library without binary dependencies, you can issue this npm command:\n\n> npm install aws2js --xml2js true --mime true\n\nThis installs the library with xml2js and [mime](https://github.com/broofa/node-mime) as dependencies. Please notice that the mime library detects the MIME type by doing a file extension lookup, while mime-magic does it the proper way by wrapping the functionality of libmagic. You have been warned.\n\nThe '--xml2js true' and '--mime true' are boolean flags, therefore you may use them in any combination, if applicable.\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon EMR](https://github.com/SaltwaterC/aws2js/wiki/EMR-Client) (Elastic MapReduce)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributions\n\nFor the moment, this project is largely a one man show. Bear with me if things don't move as fast as they should. There are a handful of [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md) as well. The community makes things to be better for everyone.\n\nIf you'd like to contribute your line of code (or more), please send a pull request against the future branch. This makes things to be easier on my side. Feature branches are also acceptable. Even commits in your master branch are acceptable. I don't rely on GitHub's merge functionality as I always pull from remotes and manually issue the merge command.\n\nI ask you to patch against the future branch since that's the place where all the development happens, therefore it should be the least conflicts when merging your code. I use the master only for integrating the releases. The master branch always contains the latest stable release.\n","maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]}},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"time":{"modified":"2012-08-08T14:24:09.776Z","created":"2011-06-29T07:51:31.647Z","0.2.0":"2011-12-08T08:20:59.015Z","0.2.1":"2011-12-08T08:20:59.015Z","0.2.2":"2011-12-08T08:20:59.015Z","0.3.0":"2011-12-08T08:20:59.015Z","0.3.1":"2011-12-08T08:20:59.015Z","0.3.2":"2011-12-08T08:20:59.015Z","0.3.3":"2011-12-08T08:20:59.015Z","0.3.4":"2011-12-08T08:20:59.015Z","0.3.5":"2011-12-08T08:20:59.015Z","0.4.0":"2011-12-08T08:20:59.015Z","0.4.1":"2011-12-08T08:20:59.015Z","0.4.2":"2011-12-08T08:20:59.015Z","0.4.3":"2011-12-08T08:20:59.015Z","0.4.4":"2011-12-08T08:20:59.015Z","0.5.0":"2011-11-15T12:25:52.469Z","0.5.1":"2011-11-16T13:55:59.454Z","0.5.2":"2011-11-18T09:15:52.018Z","0.5.3":"2011-12-05T08:03:20.112Z","0.5.4":"2011-12-05T08:14:07.930Z","0.5.5":"2011-12-08T08:20:59.015Z","0.5.6":"2011-12-14T17:06:10.753Z","0.5.7":"2011-12-16T14:32:50.721Z","0.6.0":"2011-12-19T09:33:36.135Z","0.6.1":"2012-01-14T16:01:43.573Z","0.6.2":"2012-01-19T09:03:06.611Z","0.6.3":"2012-01-20T14:13:19.617Z","0.6.4":"2012-01-30T14:02:05.498Z","0.6.5":"2012-02-10T11:33:46.526Z","0.6.6":"2012-03-07T16:49:20.736Z","0.6.7":"2012-03-08T16:08:01.039Z","0.6.8":"2012-03-15T12:13:30.233Z","0.6.9":"2012-03-23T14:02:27.792Z","0.6.11":"2012-04-05T08:18:31.314Z","0.6.12":"2012-04-07T19:34:15.747Z","0.6.14":"2012-05-04T09:14:24.832Z","0.6.15":"2012-05-08T07:59:09.999Z","0.6.16":"2012-05-22T09:37:20.859Z","0.6.17":"2012-05-28T12:23:51.643Z","0.6.18":"2012-06-15T13:08:44.294Z","0.6.19":"2012-06-25T11:59:48.589Z","0.6.20":"2012-07-13T14:49:37.389Z","0.6.21":"2012-07-23T15:40:53.340Z","0.6.22":"2012-07-30T11:56:03.221Z","0.7.0":"2012-07-31T16:24:03.169Z","0.7.1":"2012-08-07T08:20:44.595Z","0.7.2":"2012-08-08T14:24:09.776Z"},"author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"users":{"fgribreau":true},"_attachments":{"aws2js-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":114,"digest":"md5-Xy3oQb3JufQa/3dWnQD+PQ==","length":38919,"stub":true},"aws2js-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":112,"digest":"md5-1jrjNV1EfcRDxgSguhIX8A==","length":38718,"stub":true},"aws2js-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-nk1xnzqoUvGsUWUi6myksA==","length":38572,"stub":true},"aws2js-0.6.22.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-Fqi0CpUyyibmoeFkjvfT1w==","length":37016,"stub":true},"aws2js-0.6.21.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-NjU9YePa5QjVpLX8akThSA==","length":36921,"stub":true},"aws2js-0.6.20.tgz":{"content_type":"application/octet-stream","revpos":103,"digest":"md5-jwdUFFhTmZ34mgKTmZwy+A==","length":36305,"stub":true},"aws2js-0.6.19.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-w2zOkv3PB7fJw5g7UZGPgA==","length":35871,"stub":true},"aws2js-0.6.18.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-4+PHaKgyaRNTjMqj66b89A==","length":34757,"stub":true},"aws2js-0.6.17.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-Aq31nz5JYM2W76fz6UA17g==","length":34444,"stub":true},"aws2js-0.6.16.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-/6dHeaCX2t/2WJXY1Yh86A==","length":34374,"stub":true},"aws2js-0.6.15.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-AZVZ15dpivaKgsLxcFOErQ==","length":32736,"stub":true},"aws2js-0.6.14.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-ygDENSr4PK0WV7lT4U7UWA==","length":32629,"stub":true},"aws2js-0.6.12.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-jnkXiUBi27nqAjCnMDnCtw==","length":31597,"stub":true},"aws2js-0.6.11.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-abv+hX3wmd8yV0+Ur05zhA==","length":32314,"stub":true},"aws2js-0.6.9.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-YLu/OExqc7s8S+fQW44W7Q==","length":31059,"stub":true},"aws2js-0.6.8.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-SpjqM6tlw9M2TonJ76NeXA==","length":30198,"stub":true},"aws2js-0.6.7.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-jcv3fWSeXkJ32v4Mx36hGg==","length":30154,"stub":true},"aws2js-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-kC01hDS9XwE6d8DlEp9jrA==","length":29534,"stub":true},"aws2js-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-g5F9sZvE+8/+qIGYMW10dQ==","length":28637,"stub":true},"aws2js-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-ABu1y7V1slakZfBiTIDfjQ==","length":28429,"stub":true},"aws2js-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-Je+FmYURn3jim+5LVxTZoQ==","length":25941,"stub":true},"aws2js-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-bijYCsgCjPzHvFOjfRAY1A==","length":24157,"stub":true},"aws2js-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-vUzkGIn6IE/WJfjtsSVItA==","length":23818,"stub":true},"aws2js-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-J/mREL5TCa1D7khcn/IdyA==","length":23718,"stub":true},"aws2js-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-mw2e89D1OVjDcoaWK4KJjw==","length":23528,"stub":true},"aws2js-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-vXnBb1rRZ2zXtkEG3sfkgQ==","length":23462,"stub":true},"aws2js-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-j4zsNIzDqi/iJgOgC6A09w==","length":23242,"stub":true},"aws2js-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-vG1wFn7q4r2pwJySX7i93w==","length":23109,"stub":true},"aws2js-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-hGQ6dZ2c9Rf4/MiARuXN8g==","length":23045,"stub":true},"aws2js-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-nt91Kk9IrXYMza/Dk9PtDA==","length":22808,"stub":true},"aws2js-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-WZGfJtNykxKjFxaeM17sIQ==","length":22777,"stub":true},"aws2js-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-NzsS2TxqEmOwuAQ/SOXUxg==","length":22567,"stub":true},"aws2js-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-dMug1Dc1aOATc9sM134XkQ==","length":9927,"stub":true},"aws2js-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-xqs303TWt950q7vggYaLBg==","length":9886,"stub":true},"aws2js-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-gXgvIUCmToCnlIHRfO8dkQ==","length":9397,"stub":true},"aws2js-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-65JkOCVyPExJvdoWAa3XwA==","length":8628,"stub":true},"aws2js-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-z/tJOn/SAtPDvvUD4KPU9A==","length":8592,"stub":true},"aws2js-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-8H7l02jzJeYyEw0GqoRRtQ==","length":7903,"stub":true},"aws2js-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-NB35bhqziwHa8lPIpkCU4A==","length":7794,"stub":true},"aws2js-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ZaOJFUgEUOeIobTYLY+lZg==","length":7347,"stub":true},"aws2js-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-opJf1BsL9cQV+wd6cqumwQ==","length":7368,"stub":true},"aws2js-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IYBeDpliAlElRFk0qIhu0g==","length":7006,"stub":true},"aws2js-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NO3VkUi+m4sDraBJwG9wMw==","length":6842,"stub":true},"aws2js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-HJmRo95FBU607z5o+SH40g==","length":4565,"stub":true},"aws2js-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-narUhgWHPsgggV7oAnOLzw==","length":4247,"stub":true},"aws2js-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WKLpsGg1ubeIzdWwyq8oEA==","length":3930,"stub":true}}}},
{"id":"aws2js-patched","key":"aws2js-patched","value":{"rev":"3-5b8ff5cab629e6994b670b146c2cdae1"},"doc":{"_id":"aws2js-patched","_rev":"3-5b8ff5cab629e6994b670b146c2cdae1","name":"aws2js-patched","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dist-tags":{"latest":"0.6.12"},"versions":{"0.6.12":{"name":"aws2js-patched","main":"./lib/aws.js","version":"0.6.12","description":"AWS (Amazon Web Services) APIs client implementation for node.js","dependencies":{"libxmljs":">=0.5.0","libxml-to-js":">=0.3.10","mime-magic":">=0.2.5"},"devDependencies":{"http-get":">=0.3.13"},"engines":{"node":">=0.4.10"},"homepage":"https://github.com/SaltwaterC/aws2js","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"contributors":[{"name":"Dan Tillberg","url":"http://tillberg.us/"},{"name":"Andrew Paulin","url":"https://github.com/ConstantineXVI"},{"name":"Dave Cleal","url":"https://github.com/dcleal"},{"name":"Carlos Guerreiro","url":"http://perceptiveconstructs.com/"},{"name":"Nikita","url":"https://github.com/nab"},{"name":"AYUkawa,Yasuyuk","url":"https://github.com/toomore-such"},{"name":"ske","url":"https://github.com/ske"}],"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"keywords":["amazon","aws","rest","api","https","query api","ec2","rds","ses","elb","s3","iam","auto scaling","cloudwatch","elasticache","sqs","simpledb","sdb","security token service","sts","dynamodb","sns"],"_npmUser":{"name":"johnnyhalife","email":"johnny.halife@me.com"},"_id":"aws2js-patched@0.6.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f42bb9046b86beecaa762cff1bb485f608aa0a35","tarball":"http://registry.npmjs.org/aws2js-patched/-/aws2js-patched-0.6.12.tgz"},"maintainers":[{"name":"johnnyhalife","email":"johnny.halife@me.com"}]}},"readme":"## About ![still maintained](http://stillmaintained.com/SaltwaterC/aws2js.png)\n\nAmazon Web Services node.js module. Originally a fork of [aws-lib](https://github.com/livelycode/aws-lib/).\n\n## Installation\n\nEither manually clone this repository into your node_modules directory, or the recommended method:\n\n> npm install aws2js\n\n## Project and Design goals\n\n * HTTPS-only APIs communication (exceptions allowed for HTTP-only APIs)\n * Proper error reporting\n * Simple to write clients for a specific AWS service (abstracts most of the low level plumbing)\n * Simple to use AWS API calls\n * Higher level clients for specific work flows\n * Proper documentation\n\n## Supported\n\n * [Amazon EC2](https://github.com/SaltwaterC/aws2js/wiki/EC2-Client) (Elastic Compute Cloud)\n * [Amazon RDS](https://github.com/SaltwaterC/aws2js/wiki/RDS-Client) (Relational Database Service)\n * [Amazon SES](https://github.com/SaltwaterC/aws2js/wiki/SES-Client) (Simple Email Service)\n * [Amazon ELB](https://github.com/SaltwaterC/aws2js/wiki/ELB-Client) (Elastic Load Balancing)\n * [Amazon IAM](https://github.com/SaltwaterC/aws2js/wiki/IAM-Client) (Identity and Access Management)\n * [Amazon Auto Scaling](https://github.com/SaltwaterC/aws2js/wiki/Auto-Scaling-Client)\n * [Amazon CloudWatch](https://github.com/SaltwaterC/aws2js/wiki/CloudWatch-Client)\n * [Amazon ElastiCache](https://github.com/SaltwaterC/aws2js/wiki/ElastiCache-Client)\n * [Amazon SQS](https://github.com/SaltwaterC/aws2js/wiki/SQS-Client) (Simple Queue Service)\n * [Amazon CloudFormation](https://github.com/SaltwaterC/aws2js/wiki/CloudFormation-Client)\n * [Amazon SDB](https://github.com/SaltwaterC/aws2js/wiki/SDB-Client) (SimpleDB)\n * [Amazon STS](https://github.com/SaltwaterC/aws2js/wiki/STS-Client) (Security Token Service)\n * [Amazon DynamoDB](https://github.com/SaltwaterC/aws2js/wiki/DynamoDB-Client)\n * [Amazon SNS](https://github.com/SaltwaterC/aws2js/wiki/SNS-Client) (Simple Notification Service)\n * [Amazon S3](https://github.com/SaltwaterC/aws2js/wiki/S3-Client) (Simple Storage Service)\n\n## Contributors\n\nYou should also send your special thanks to the [aws2js contributors](https://github.com/SaltwaterC/aws2js/blob/master/CONTRIBUTORS.md).\n","maintainers":[{"name":"johnnyhalife","email":"johnny.halife@me.com"}],"time":{"modified":"2012-04-24T19:38:26.540Z","created":"2012-04-24T19:38:23.609Z","0.6.12":"2012-04-24T19:38:26.540Z"},"author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/aws2js.git"},"_attachments":{"aws2js-patched-0.6.12.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wmL8+1huy2pIkMKg7MioyQ==","length":65233,"stub":true}}}},
{"id":"awsbox","key":"awsbox","value":{"rev":"51-712c472fb80f935ae8714d1cb266432a"},"doc":{"_id":"awsbox","_rev":"51-712c472fb80f935ae8714d1cb266432a","name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","dist-tags":{"latest":"0.2.15"},"versions":{"0.0.1":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.1","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"91a2a9322b5594e09f5da5de8c6ac5fd9869403a","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.1.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.2":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.2","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0c7883d579a978b7d7a38cdacc89b32e10b0136f","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.2.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.3":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.3","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d4bf0b9be1385750159877e2385b63b0931cc6ce","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.3.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.4":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.4","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"dd617403ce79d3e57c2a6a9c6b51708552885ff2","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.4.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.5":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.5","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5e6297d0970c6c65faa68581cc34ce2eefbd7434","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.5.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.6":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.6","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fbdc6981571286c154a479b0344a4052e8e85b92","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.6.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.7":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A DIYy NodeJS specific PaaS-like system for deploying on AWS","version":"0.0.7","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f9af3befbc89644d122bffb7d783709c47701ea0","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.7.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.8":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.0.8","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d91aeb725d83bf4a59d199372a6e79c75d4b8834","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.8.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.9":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.0.9","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"6d97b39ebba569e6250f2855592873e9b7abdfba","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.9.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.10":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.0.10","homepage":"https://github.com/lloyd/awsbox","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.0.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"37b2a5f4360effefdb9243a2e6b01c294a5ee76f","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.0.10.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.0":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.0","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e675c170cf448f681955a35c3f5d4f80a5fa6a7a","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.0.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.1":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.1","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"5c53cd9f24d30bb9fe9fd834a0b922335930741a","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.1.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.2":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.2","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7c344eb50afafb27739ebfa361b6e07409ed7167","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.2.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.4":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.4","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"dbc1399beacddd60df42267f58b4a8e553eead9c","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.4.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.5":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.5","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b5cc43dc72a18543f3c7705064a0bb9572f073a7","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.5.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.6":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.6","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"91e926c9232cc860d870f900e78f6b17e2fbc035","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.6.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.7":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.7","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"4e8a1ebf480485d6be7742b376f706f8bae467a5","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.7.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.8":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.8","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d1876766fa5245adb59824ec6502f338a4f94bb4","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.8.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.9":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.9","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.9","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"42c1aa243ea5a88baed58e2b9346e0186833470b","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.9.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.10":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.10","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.10","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9d7b2341175d3fa36527d589db8a792125f26a76","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.10.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.11":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.11","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.11","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f7e556ae99a394570a3d5809acaea2ace8c15394","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.11.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.12":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.12","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.12","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"58d5d93ca8122ff0264bc2fd1668ddb3c0fa4ced","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.12.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.13":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.13","homepage":"http://awsbox.org","repository":{"type":"git","url":"git://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"awsbox@0.2.13","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cd892ee823fd1486b0cf302a0f4b7ba57e470fa0","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.13.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.14":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.14","homepage":"http://awsbox.org","repository":{"type":"git","url":"https://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"readme":"## A Lightweight DIY PaaS for Amazon Web Services\n\nAmazon Web Services (AWS) \"Elastic Compute Cloud\" provides low cost, instant\non VMs that can be used to deploy any kind of service.  AWS also provides a\nfull set of APIs that make it possible to programatically allocate servers.\nFinally, AWS offers the ability to create \"template\" instances (Amazon Machine\nImages) that are VM snapshots.\n\n*The problem:* For small scale nodejs projects, there's a lot of\nadministrative boiler plate work that one must to set up a machine.\nYou must install web server software, set up security policies and network\naccess, copy up your keypair, determine how you'll deploy your software on the\nnew VM, etc.\n\n\"Platform as a service\" providers like heroku make most of these decisions for\nyou, providing a demand spun \"vm-like\" thing that you can deploy code on by\nadhering to a couple conventions and `git pushing`.  Where heroku breaks down\nis in *generativity* - you are limited to doing things that heroku has thought\nof, and when you want to do something custom (install a new native software\nlibrary, run an experimental database for which you cannot find a third party\nhosted provider) - you are screwed.\n\nAlso, heroku is relatively expensive.  The moment you want to run two\nprocesses, you're paying 0.05$/hr for that process vs. on aws where\nyou can purchase a \"micro\" instance for 0.02$/hr for the whole VM.\nThe final area of expense is in \"add-ons\" - service providers that offer\nthings like hosted databases, email sending, etc.  A small scale database\ncan cost another .015$/hr.\n\nBut Wait!  What about [nodejitsu]?  Well, probably use them: they're\nawesome, smart, admirably share their work, have a free service for\nnon-commercial deployments, and *just work* for most apps.  But\nsometimes you might want full control.  That you?  Read on...  (NOTE:\nawsbox is *built* on lots of nodejistu stuffs).\n  \n  [nodejitsu]: http://nodejitsu.com/\n\nSo what we maybe want is the convenience of Nodejitsu and Heroku, and the\npricing and freedom of a raw amazon image...\n\n*The solution:* **awsbox** is a set of nodejs scripts, a command line utility,\nand a template image (AMI).  Together it allows you to deploy a new server\nfrom the command line that is pre-configured to run your Node.JS service.\n\n## Features\n\n  * **nodejs focused** - While other stacks could be supported in the future,\n    awsbox is laser focused on node.js to start.\n  * **full root access** - awsbox just gets you started, after that you can do\n    Whatever You Want.\n  * **magic ssh key config** - Your SSH key will be copied up and installed for you.\n  * **git push support** - After you provision a vm, it's pre-configured so you can\n    push to deploy\n  * **command line or programmatic usage** - type at it, or script it.\n  * **OS level user isolation** - all deployed code is run with user permissions under\n    a single account.\n  * **HTTP forwarding with custom 503 page** - [http-proxy] is pre-configured to forward\n    requests to your nodejs process bound to a local port.\n  * **SSL support** - By default you're process runs with a self-signed cert.  Enabling\n    SSL support is as easy as copying up a private key and certificate in [PEM] format.\n  * **WebSocket support** - AWSBOX fully supports WebSockets, via [socket.io] or otherwise.\n\n  [http-proxy]: https://github.com/nodejitsu/node-http-proxy\n  [PEM]: http://en.wikipedia.org/wiki/X.509\n  [socket.io]: http://socket.io\n\n## Get Started\n\nStart by working through [the tutorial].  Then have a look at the [Hello World] sample app.\nAnd after that, check out [the documentation] in this repository.\n\n  [the tutorial]: https://github.com/lloyd/awsbox/blob/master/doc/TUTORIAL.md\n  [Hello World]: https://github.com/lloyd/awsbox-helloworld\n  [the documentation]: https://github.com/lloyd/awsbox/tree/master/doc\n","_id":"awsbox@0.2.14","dist":{"shasum":"2c9a27fe6c0e7e39129188a4b17b0e13f645a632","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.14.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.2.15":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"awsbox","description":"A featherweight, DIY, PaaS system for deploying on NodeJS apps on Amazon's EC2","version":"0.2.15","homepage":"http://awsbox.org","repository":{"type":"git","url":"https://github.com/lloyd/awsbox.git"},"main":"src/awsbox.js","engines":{"node":">=0.4.7"},"dependencies":{"aws-lib":"0.0.5","JSONSelect":"0.4.0","temp":"0.4.0","xml2js":"0.1.13","optimist":"0.3.1","urlparse":"0.0.1","relative-date":"1.1.1"},"devDependencies":{},"scripts":{},"bin":{"awsbox":"./awsbox.js"},"readme":"## A Lightweight DIY PaaS for Amazon Web Services\n\nAmazon Web Services (AWS) \"Elastic Compute Cloud\" provides low cost, instant\non VMs that can be used to deploy any kind of service.  AWS also provides a\nfull set of APIs that make it possible to programatically allocate servers.\nFinally, AWS offers the ability to create \"template\" instances (Amazon Machine\nImages) that are VM snapshots.\n\n*The problem:* For small scale nodejs projects, there's a lot of\nadministrative boiler plate work that one must to set up a machine.\nYou must install web server software, set up security policies and network\naccess, copy up your keypair, determine how you'll deploy your software on the\nnew VM, etc.\n\n\"Platform as a service\" providers like heroku make most of these decisions for\nyou, providing a demand spun \"vm-like\" thing that you can deploy code on by\nadhering to a couple conventions and `git pushing`.  Where heroku breaks down\nis in *generativity* - you are limited to doing things that heroku has thought\nof, and when you want to do something custom (install a new native software\nlibrary, run an experimental database for which you cannot find a third party\nhosted provider) - you are screwed.\n\nAlso, heroku is relatively expensive.  The moment you want to run two\nprocesses, you're paying 0.05$/hr for that process vs. on aws where\nyou can purchase a \"micro\" instance for 0.02$/hr for the whole VM.\nThe final area of expense is in \"add-ons\" - service providers that offer\nthings like hosted databases, email sending, etc.  A small scale database\ncan cost another .015$/hr.\n\nBut Wait!  What about [nodejitsu]?  Well, probably use them: they're\nawesome, smart, admirably share their work, have a free service for\nnon-commercial deployments, and *just work* for most apps.  But\nsometimes you might want full control.  That you?  Read on...  (NOTE:\nawsbox is *built* on lots of nodejistu stuffs).\n  \n  [nodejitsu]: http://nodejitsu.com/\n\nSo what we maybe want is the convenience of Nodejitsu and Heroku, and the\npricing and freedom of a raw amazon image...\n\n*The solution:* **awsbox** is a set of nodejs scripts, a command line utility,\nand a template image (AMI).  Together it allows you to deploy a new server\nfrom the command line that is pre-configured to run your Node.JS service.\n\n## Features\n\n  * **nodejs focused** - While other stacks could be supported in the future,\n    awsbox is laser focused on node.js to start.\n  * **full root access** - awsbox just gets you started, after that you can do\n    Whatever You Want.\n  * **magic ssh key config** - Your SSH key will be copied up and installed for you.\n  * **git push support** - After you provision a vm, it's pre-configured so you can\n    push to deploy\n  * **command line or programmatic usage** - type at it, or script it.\n  * **OS level user isolation** - all deployed code is run with user permissions under\n    a single account.\n  * **HTTP forwarding with custom 503 page** - [http-proxy] is pre-configured to forward\n    requests to your nodejs process bound to a local port.\n  * **SSL support** - By default you're process runs with a self-signed cert.  Enabling\n    SSL support is as easy as copying up a private key and certificate in [PEM] format.\n  * **WebSocket support** - AWSBOX fully supports WebSockets, via [socket.io] or otherwise.\n\n  [http-proxy]: https://github.com/nodejitsu/node-http-proxy\n  [PEM]: http://en.wikipedia.org/wiki/X.509\n  [socket.io]: http://socket.io\n\n## Get Started\n\nStart by working through [the tutorial].  Then have a look at the [Hello World] sample app.\nAnd after that, check out [the documentation] in this repository.\n\n  [the tutorial]: https://github.com/lloyd/awsbox/blob/master/doc/TUTORIAL.md\n  [Hello World]: https://github.com/lloyd/awsbox-helloworld\n  [the documentation]: https://github.com/lloyd/awsbox/tree/master/doc\n","_id":"awsbox@0.2.15","dist":{"shasum":"10fe4fa8833c4a0310469446ac222dfeaf2fe17c","tarball":"http://registry.npmjs.org/awsbox/-/awsbox-0.2.15.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]}},"readme":"this is a sham.\n","maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}],"time":{"modified":"2012-08-09T19:11:21.216Z","created":"2012-04-02T20:05:42.351Z","0.0.1":"2012-04-02T20:05:43.535Z","0.0.2":"2012-04-02T21:23:48.849Z","0.0.3":"2012-04-04T16:28:54.957Z","0.0.4":"2012-04-04T16:40:49.423Z","0.0.5":"2012-04-04T21:47:53.066Z","0.0.6":"2012-04-04T22:40:40.601Z","0.0.7":"2012-04-06T17:40:10.622Z","0.0.8":"2012-04-06T17:59:13.412Z","0.0.9":"2012-04-25T19:51:27.084Z","0.0.10":"2012-04-25T20:09:30.246Z","0.2.0":"2012-06-01T12:31:57.419Z","0.2.1":"2012-06-01T12:48:55.967Z","0.2.2":"2012-06-01T13:57:33.063Z","0.2.4":"2012-06-01T15:22:31.237Z","0.2.5":"2012-06-07T12:52:20.235Z","0.2.6":"2012-06-07T13:23:50.928Z","0.2.7":"2012-06-08T09:31:53.353Z","0.2.8":"2012-06-11T08:02:20.149Z","0.2.9":"2012-06-11T12:00:14.681Z","0.2.10":"2012-06-11T12:38:30.247Z","0.2.11":"2012-06-13T10:37:53.780Z","0.2.12":"2012-06-14T12:08:46.928Z","0.2.13":"2012-06-20T11:05:03.250Z","0.2.14":"2012-07-16T16:22:34.180Z","0.2.15":"2012-08-09T19:11:21.216Z"},"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"repository":{"type":"git","url":"https://github.com/lloyd/awsbox.git"},"_attachments":{"awsbox-0.2.15.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-hMBKDE9e3y8N2KnRtl6gXw==","length":99660,"stub":true},"awsbox-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-3R8SP3LoeagiiyazzyS1fg==","length":99518,"stub":true},"awsbox-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-rj0cbgYN/Z4y1Z4ppAkQ3A==","length":20480,"stub":true},"awsbox-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-XPbDzT/yIVZWnLdOriKAkQ==","length":20480,"stub":true},"awsbox-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-owjzcUSogRL2P7HeMRc0ew==","length":20480,"stub":true},"awsbox-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-+a2aLNrYbgxeSYF8U15c/Q==","length":20480,"stub":true},"awsbox-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-uJYD9S3zxNQpo0GMOsDbzA==","length":20480,"stub":true},"awsbox-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-R1rP8ExAYNhm/Pf8O1BhLA==","length":20480,"stub":true},"awsbox-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-PXQgB8Cd03NsOTlnN9vfVw==","length":20480,"stub":true},"awsbox-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-tmY2BanQaqsIDz2/7sMnGg==","length":20480,"stub":true},"awsbox-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-ndkT9Ig55Junr6XE41oyRg==","length":20480,"stub":true},"awsbox-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-+HnPKPjXni8Ezm52+JzWYQ==","length":20480,"stub":true},"awsbox-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-qtd+oOZpP5ymEPPpxrHMyQ==","length":20480,"stub":true},"awsbox-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-2u3+TkD/cMcu99ud3EsgyQ==","length":20480,"stub":true},"awsbox-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-xowCkK3UFCLQ8NV5q0b03w==","length":20480,"stub":true},"awsbox-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-OkLYoKDVtl36SvQupX/pMQ==","length":11100,"stub":true},"awsbox-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-8i39p8XgKDiGVOjJgXk0wQ==","length":10932,"stub":true},"awsbox-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-CiM8D+w254Q9gt1EVBvEBQ==","length":10620,"stub":true},"awsbox-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-XwgsapNqoDeTx8evuR1Z6Q==","length":10544,"stub":true},"awsbox-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ODTE3SkRoFQpf2nxJ6mAHw==","length":9955,"stub":true},"awsbox-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KE6TeWtN27senGik/Jf8iA==","length":9955,"stub":true},"awsbox-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hzG7cQH9w7pgFUiSFc1Ndw==","length":8728,"stub":true},"awsbox-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ggj4ynb3qtDt/0yNPsyjqg==","length":8571,"stub":true},"awsbox-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-EEFsYg4FQz/yZQSMZpFtPw==","length":6960,"stub":true},"awsbox-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VBTAT0vJwKghAlGu78/qvA==","length":6635,"stub":true}}}},
{"id":"awssum","key":"awssum","value":{"rev":"32-6f015b555815f6dd545bde70489b8f7f"},"doc":{"_id":"awssum","_rev":"32-6f015b555815f6dd545bde70489b8f7f","name":"awssum","description":"NodeJS modules for talking to SaaS providers, such as Amazon, RackspaceCloud etc.","dist-tags":{"latest":"0.8.0"},"versions":{"0.1.0":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.1.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11"},"dependencies":{"underscore":">= 1.2.0","xml2js":">= 0.1.11","request":">= 2.1.1","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.5","data2xml":">= 0.1.0"},"main":"lib/awssum","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.1.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"8cb54061e22362ae686830620f9be6f402feb2c0","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.1.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.1.1":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.1.1","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11"},"dependencies":{"underscore":">= 1.2.0","xml2js":">= 0.1.11","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.5","data2xml":">= 0.1.0"},"main":"lib/awssum","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.1.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"017f168e5424791bd5dc18cc571ca0416dbcc749","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.1.1.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.1.2":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.1.2","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11"},"dependencies":{"underscore":">= 1.2.0","xml2js":">= 0.1.11","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.5","data2xml":">= 0.1.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.1.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"c125c5b0f4b70d03559076e54a95254b6540d4b1","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.1.2.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.3.0":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.3.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.13","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d49c60c05d3318f2676284ece389db52517ac2c1","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.3.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.3.1":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.3.1","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.13","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.3.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"1eb78b5e0ba0f825fd371b0f097c58d232c377d0","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.3.1.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.3.2":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.3.2","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.13","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.3.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"52822a83611bc4687b51fef080675e77b91e84a7","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.3.2.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.3.3":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.3.3","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.13","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":"*"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.3.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ecf4e6961b6522f60c90bcf56e85e37dfca9f753","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.3.3.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.4.0":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.4.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.13","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"429ee6604ab7260ee98f5d88a21f7be9afd6d659","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.4.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.4.1":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.4.1","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.13","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"49147bdaf19dbba1b2dcf24e8480e669f8de21af","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.4.1.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.5.0":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.5.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","jshint":">= 0.6.1","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.14","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0","passgen":">= 1.0.1"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"48a99e0da77e9d40c30b401071c5d248b1d1dea6","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.5.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.5.1":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.5.1","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.0.11","jshint":">= 0.6.1","commander":">= 0.6.0","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.2.4","xml2js":">= 0.1.14","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0","passgen":">= 1.0.1"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.5.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"189dc6e4f4c56d8288ca95a622bd98fb42a53e0d","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.5.1.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.6.0":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.6.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.2.5","jshint":">= 0.6.1","commander":">= 0.6.0","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.3.3","xml2js":">= 0.1.14","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0","passgen":">= 1.0.1"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.6.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c62db7a26a1538888d1c344fe920423c809a715b","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.6.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.6.1":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.6.1","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.2.5","jshint":">= 0.6.1","commander":">= 0.6.0","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.3.3","xml2js":">= 0.1.14","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0","passgen":">= 1.0.1"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"email":"chilts@appsattic.com","url":"http://github.com/appsattic/node-awssum/issues"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","clodufront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/"},"_npmUser":{"name":"chilts","email":"chilts@appsattic.com"},"_id":"awssum@0.6.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c2df059df1ff44d31da796d220c0a3be88bbf294","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.6.1.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.7.0":{"name":"awssum","description":"NodeJS modules for talking to lots of Web Service APIs.","version":"0.7.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.2.5","jshint":">= 0.6.1","commander":">= 0.6.0","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.3.3","xml2js":">= 0.1.14","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0","passgen":">= 1.0.1"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"url":"http://github.com/appsattic/node-awssum/issues","mail":"chilts@appsattic.com"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","cloudfront","fps","rackspacecloud","flickr","paypal","xero"],"scripts":{"test":"tap test/*.js test/integration/*.js"},"readme":"```\n                              _______           _______  _______           _______ \n                             (  ___  )|\\     /|(  ____ \\(  ____ \\|\\     /|(       )\n                             | (   ) || )   ( || (    \\/| (    \\/| )   ( || () () |\n                             | (___) || | _ | || (_____ | (_____ | |   | || || || |\n                             |  ___  || |( )| |(_____  )(_____  )| |   | || |(_)| |\n                             | (   ) || || || |      ) |      ) || |   | || |   | |\n                             | )   ( || () () |/\\____) |/\\____) || (___) || )   ( |\n                             |/     \\|(_______)\\_______)\\_______)(_______)|/     \\|\n                                                                                   \n```\n\nNodeJS client libraries for talking to lots of Web Service APIs.\n\n[![Build Status](https://secure.travis-ci.org/appsattic/node-awssum.png?branch=master)](http://travis-ci.org/appsattic/node-awssum)\n\nIRC : Come and say hello in #awssum on Freenode. :)\n\nNote: that I am looking for sponsorship for various libraries, especially larger ones such as GitHub, PayPal and\nFlickr. Please contact me.\n\n# How to get AwsSum #\n\n    $ npm -d install awssum\n\n# Example #\n\n```\nvar awssum = require('awssum');\nvar amazon = awssum.load('amazon/amazon');\nvar S3 = awssum.load('amazon/s3').S3;\n\nvar s3 = new S3('access_key_id', 'secret_access_key', 'aws_account_id', amazon.US_WEST_1);\n\ns3.ListBuckets(function(err, data) {\n    if (err) {\n        // something went wrong with the request\n        console.log(err);\n        return;\n    }\n\n    // request was fine\n    console.log(data);\n});\n\ns3.CreateBucket({ BucketName : 'my-bucket' }, function(err, data) {\n    if (err) {\n        console.log(err);\n        return;\n    }\n\n    // creation of bucket was ok, now let's put an object into it\n    s3.PutObject({\n        BucketName : 'my-bucket',\n        ObjectName : 'some.txt',\n        ContentLength : '14',\n        Body          : \"Hello, World!\\n\",\n    }, function(err, data) {\n        console.log(err)\n        console.log(data)\n    });\n});\n```\n\n# What services does 'node-awssum' talk to? #\n\nCurrently AwsSum has coverage of the following services:\n\n<table>\n  <thead>\n    <tr>\n      <th>Company</th>\n      <th>Service</th>\n      <th>SignatureMethod</th>\n      <th>Signature</th>\n      <th>Operations</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>Amazon</td>\n      <td>SimpleDB</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>10/10 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>SQS</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>15/15 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>SES</td>\n      <td>X-Amzn-Authorization &quot;AWS3-HTTPS&quot; header, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>18/18 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>SNS</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>15/15 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>S3</td>\n      <td>Authorization &quot;AWS&quot; header (SHA1)</td>\n      <td>✔</td>\n      <td>43/43 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>EC2</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>134/134 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Route53</td>\n      <td>X-Amzn-Authorization &quot;AWS3-HTTPS&quot; header, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>7/7 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>ElastiCache</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>21/21 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudFront</td>\n      <td>Authorization &quot;AWS&quot; header (sha1)</td>\n      <td>✔</td>\n      <td>21/21 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Elastic Load Balancing</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>23/23 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>DynamoDB</td>\n      <td>X-Amzn-Authorization &quot;AWS3&quot; (HmacSHA256)</td>\n      <td>✔</td>\n      <td>13/13 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Simple Workflow Service</td>\n      <td>X-Amzn-Authorization &quot;AWS3&quot; (HmacSHA256)</td>\n      <td>✔</td>\n      <td>31/31 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Flexible Payments Service (FPS)</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>22/22 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudWatch</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>11/11 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Identity and Access Management (IAM)</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>69/69 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Relational Database Service (RDS)</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>39/39 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudFormation</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>12/12 (100%)</td>\n    </tr>\n\n    <tr>\n      <td>Twitter</td>\n      <td>Twitter</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>98/101</td>\n    </tr>\n\n    <tr>\n      <td>Tumblr</td>\n      <td>Tumblr</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>0/???</td>\n    </tr>\n\n    <tr>\n      <td>Xero</td>\n      <td>Xero</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>~12/~40?</td>\n    </tr>\n\n    <tr>\n      <td>Yahoo!</td>\n      <td>Contacts</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>3/???</td>\n    </tr>\n\n  </tbody>\n</table>\n\nIn future releases we will be targeting (in no particular order):\n\n* AWS:\n    * CloudSearch ([Request or Sponsor Development][sponsor])\n    * Elastic MapReduce (EMR) ([Request or Sponsor Development][sponsor])\n    * Virtual Private Cloud\n    * AutoScaling\n    * Elastic Beanstalk\n    * Storage Gateway\n    * Mechanical Turk\n* RackspaceCloud:\n    * Servers ([Request or Sponsor Development][sponsor])\n    * Files ([Request or Sponsor Development][sponsor])\n    * LoadBalances ([Request or Sponsor Development][sponsor])\n    * DNS ([Request or Sponsor Development][sponsor])\n* Flickr ([Request or Sponsor Development][sponsor])\n* PayPal ([Request or Sponsor Development][sponsor])\n* some Google services ([Request or Sponsor Development][sponsor])\n* URL shorteners ([Request or Sponsor Development][sponsor])\n* anything else you'd like? ([Request or Sponsor Development][sponsor])\n\nThere are lots of services out there, so please [Request or Sponsor Development][sponsor] if you'd like one\nimplemented.\n\n# What 'node-awssum' is? #\n\nnode-awssum is an abstraction layer to many web service APIs. It abstracts out the service endpoints, the HTTP verbs to\nuse, what headers and parameters to set, how to sign the request and finally how to decode the result. It let's you\npass a data structure in and get a data structure out. It also helps in the odd small way when dealing with complex\ninput such as creating XML (e.g. Amazon S3), JSON data structures (e.g. Amazon SQS) or parameters with lots of values\n(e.g. Amazon SimpleDB).\n\nIn saying this, there are some web service operations that are inherently nasty and since node-awssum is essentially a\nproxy to the operation itself it can't abstract away all nastiness.\n\nFor an example of where node-awssum helps is when creating a Bucket in Amazon S3. We take a single 'LocationConstraint'\nparameter in the 'createBucket' call and node-awssum takes that and builds (the horrible) XML which it needs to send\nwith the request. This makes it much easier to perform calls to the various web services and their individual\noperations since this simple notion is across all web services.\n\nHowever, there are also examples of where node-awssum can't really help make the operation nicer. Many of the Amazon\nWeb Services return XML which we blindly convert to a data structure and return that to the caller. In these cases we\ndon't perform any kind of manipulation or conversion to a canonical structure to make the returned data nicer. In these\ncases, a small library which sits on top of node-awssums libraries may be a good choice (see *winston-simpledb* for an\nexample of this - http://github.com/appsattic/winston-simpledb). This would be especially true for SimpleDB where the\nhigher level library could perform number padding, date conversions, creation of multi-field indexes and default field\nvalues - none of which node-awssum does.\n\n# Examples #\n\nExample 1. This is what node-awssum looks like when adding a topic to Amazon's Simple Notification Service:\n\n``` js\nsns.CreateTopic({ TopicName : 'my-topic' })\n=>  {\n        Headers: {\n            date: 'Wed, 16 May 2012 10:32:24 GMT',\n            content-type: 'text/xml',\n            x-amzn-requestid: '6d099dcd-9f42-11e1-a8a2-0f9b48899c6b',\n            content-length: '315'\n        },\n        Body: {\n            CreateTopicResponse: {\n                @: {\n                    xmlns: 'http://sns.amazonaws.com/doc/2010-03-31/'\n                },\n                ResponseMetadata: {\n                    RequestId: '6d099dcd-9f42-11e1-a8a2-0f9b48899c6b'\n                },\n                CreateTopicResult: {\n                    TopicArn: 'arn:aws:sns:us-east-1:616781752028:my-topic'\n                }\n            }\n        },\n        StatusCode: 200\n    }\n```\n\nWhat you would probably like to do is the following (with an example SNS Wrapper Library):\n\n``` js\nsnsWrapperLibrary.createTopic('my-topic')\n=>  arn:aws:sns:us-east-1:616781752028:my-topic\n```\n\nThis is pretty easy to do but annoying to have to find and extract the information you really want. node-awssum comes\nwith some example libraries. :)\n\nExample 2. Saving some attributes for AWS SimpleDB.\n\n...\n\n# What is 'node-awssum' for? #\n\nThis library has a number of uses but mostly it should be used from within a more friendly wrapper library. Let's look\nat some examples.\n\nExample 1: A SimpleDB Wrapper library. Since node-awssum doesn't do any kind of conversion of the values you want to\nput into SimpleDB, it would make sense that you used a library which did those conversions for you, such as padding\ninteger values, normalising dates into an ISO string, setting defaults or helping with queries.\n\nExample 2: When using Amazon Route53, you sometimes have to do a request, manipulate what you got back and then send a\nnew bit of data. Instead a wrapper library around node-awssum which just helps you add or delete resource records would\nbe much easier to use.\n\nExample 3: A small wrapper around the Simple Queue Service means you could simply have some commands such as send(...),\nreceive() and delete() would make using the service a breeze.\n\nThe reason for this is because the data structures it receives, and more especially those it returns, are far too\ncomplicated for dealing with them in your main program. Therefore in general, a wrapper library around these simple\noperations would make each service easier to use.\n\n# How to use it #\n\nThis library provides basic client functionality to each of these services. It's pretty simple but this means it's also\nquite powerful. In general you wouldn't use these libraries directly (though there is nothing stopping you making the\nodd call here and there, especially when setting your environment up) but instead you would use them via a more\nfriendly API via a wrapper library.\n\nYou can use this library in your programs and applications, but it can also be built on for more\nuser-friendly (from the perspective of the programmer) wrapper libraries.\n\nEssentially it's a \"data in, data out\" kinda library without too many bells and whistles. It doesn't really check what\nyou pass it, apart from when a parameter is required. As I sa\n\nAs a quick example, to create a domain in AWS SimpleDB:\n\n``` js\nvar awssum = require('awssum');\nvar amazon = awssum.load('amazon/amazon');\nvar SimpleDB = awssum.load('amazon/simpledb').SimpleDB;\n\nvar sdb = new SimpleDB({\n    'accessKeyId'     : 'my-access-key-id',\n    'secretAccessKey' : 'my-secret-access-key',\n    // 'awsAccountId'    : 'my-aws-account-id', // optional\n    'region'          : amazon.US_EAST_1\n});\n\nsdb.CreateDomain({ DomainName : 'test' }, function(err, data) {\n    console.log('Error :', err);\n    console.log('Data  :', data);\n});\n```\n\nA successful run puts the pertinent information into 'data' ('err' is undefined). An unsuccessful run results in a value\nin 'err' but nothing in 'data'.\n\n# Author #\n\nWritten by [Andrew Chilton](http://chilts.org/) - [Blog](http://chilts.org/blog/) - [Twitter](https://twitter.com/andychilton).\n\n# License #\n\nThe MIT License : http://opensource.org/licenses/MIT\n\nCopyright (c) 2011-2012 AppsAttic Ltd. http://appsattic.com/\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the 'Software'), to deal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[sponsor]: mailto:chilts%40appsattic.com\n","_id":"awssum@0.7.0","dist":{"shasum":"17fbdcb6b28227c11408e5b504980eb9dfd19fb2","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.7.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]},"0.8.0":{"name":"awssum","description":"NodeJS modules for talking to SaaS providers, such as Amazon, RackspaceCloud etc.","version":"0.8.0","author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"homepage":"https://github.com/appsattic/node-awssum","contributors":[],"devDependencies":{"tap":">= 0.2.5","jshint":">= 0.6.1","commander":">= 0.6.0","eyes":">= 0.1.7"},"dependencies":{"underscore":">= 1.3.3","xml2js":">= 0.1.14","dateformat":">= 1.0.2-1.2.3","xml":">= 0.0.7","data2xml":">= 0.4.0","passgen":">= 1.0.1"},"main":"lib/awssum.js","directories":{"lib":"lib"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"bugs":{"url":"http://github.com/appsattic/node-awssum/issues","mail":"chilts@appsattic.com"},"licenses":[{"type":"MIT","url":"http://github.com/appsattic/node-awssum/raw/master/LICENSE"}],"keywords":["api","amazon","aws","ec2","simpledb","s3","sqs","ses","sns","route53","rds","elasticache","cloudfront","fps","cloudformation","cloudwatch","dynamodb","iam","swf","rackspacecloud","openstack"],"scripts":{"test":"tap test/*.js test/integration/*.js"},"readme":"```\n _______           _______  _______           _______ \n(  ___  )|\\     /|(  ____ \\(  ____ \\|\\     /|(       )\n| (   ) || )   ( || (    \\/| (    \\/| )   ( || () () |\n| (___) || | _ | || (_____ | (_____ | |   | || || || |\n|  ___  || |( )| |(_____  )(_____  )| |   | || |(_)| |\n| (   ) || || || |      ) |      ) || |   | || |   | |\n| )   ( || () () |/\\____) |/\\____) || (___) || )   ( |\n|/     \\|(_______)\\_______)\\_______)(_______)|/     \\|\n\n```\n\nNodeJS client libraries for talking to lots of Web Service APIs.\n\n[![Build Status](https://secure.travis-ci.org/appsattic/node-awssum.png?branch=master)](http://travis-ci.org/appsattic/node-awssum)\n\nIRC : Come and say hello in #awssum on Freenode. :)\n\nNote: that I am looking for sponsorship for various libraries, especially larger ones such as GitHub, PayPal and\nFlickr. Please contact me.\n\n# How to get AwsSum #\n\n    $ npm -d install awssum\n\n# Example #\n\n```\nvar awssum = require('awssum');\nvar amazon = awssum.load('amazon/amazon');\nvar S3 = awssum.load('amazon/s3').S3;\n\nvar s3 = new S3('access_key_id', 'secret_access_key', 'aws_account_id', amazon.US_WEST_1);\n\ns3.ListBuckets(function(err, data) {\n    if (err) {\n        // something went wrong with the request\n        console.log(err);\n        return;\n    }\n\n    // request was fine\n    console.log(data);\n});\n\ns3.CreateBucket({ BucketName : 'my-bucket' }, function(err, data) {\n    if (err) {\n        console.log(err);\n        return;\n    }\n\n    // creation of bucket was ok, now let's put an object into it\n    s3.PutObject({\n        BucketName : 'my-bucket',\n        ObjectName : 'some.txt',\n        ContentLength : '14',\n        Body          : \"Hello, World!\\n\",\n    }, function(err, data) {\n        console.log(err)\n        console.log(data)\n    });\n});\n```\n\n# What services does 'node-awssum' talk to? #\n\nCurrently AwsSum has coverage of the following services:\n\n<table>\n  <thead>\n    <tr>\n      <th>Company</th>\n      <th>Service</th>\n      <th>SignatureMethod</th>\n      <th>Signature</th>\n      <th>Operations</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>Amazon</td>\n      <td>SimpleDB</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>10/10 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>SQS</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>15/15 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>SES</td>\n      <td>X-Amzn-Authorization &quot;AWS3-HTTPS&quot; header, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>18/18 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>SNS</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>15/15 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>S3</td>\n      <td>Authorization &quot;AWS&quot; header (SHA1)</td>\n      <td>✔</td>\n      <td>43/43 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>EC2</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>134/134 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Route53</td>\n      <td>X-Amzn-Authorization &quot;AWS3-HTTPS&quot; header, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>7/7 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>ElastiCache</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>21/21 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudFront</td>\n      <td>Authorization &quot;AWS&quot; header (sha1)</td>\n      <td>✔</td>\n      <td>21/21 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Elastic Load Balancing</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>23/23 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>DynamoDB</td>\n      <td>X-Amzn-Authorization &quot;AWS3&quot; (HmacSHA256)</td>\n      <td>✔</td>\n      <td>13/13 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Simple Workflow Service</td>\n      <td>X-Amzn-Authorization &quot;AWS3&quot; (HmacSHA256)</td>\n      <td>✔</td>\n      <td>31/31 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Flexible Payments Service (FPS)</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>22/22 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudWatch</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>11/11 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Identity and Access Management (IAM)</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>69/69 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Relational Database Service (RDS)</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>39/39 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudFormation</td>\n      <td>Signature v2, (HmacSHA256)</td>\n      <td>✔</td>\n      <td>12/12 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Instance MetaData (IMD)</td>\n      <td>[none]</td>\n      <td>✔</td>\n      <td>2/2 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>ElasticBeanstalk</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>29/29 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>AutoScaling</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>33/33 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Import/Export</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>5/5 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Elastic MapReduce (EMR)</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>7/7 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Storage Gateway</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>26/26 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>CloudSearch (CS)</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>20/20 (100%)</td>\n    </tr>\n    <tr>\n      <td></td>\n      <td>Elastic LoadBalancing (ELB)</td>\n      <td>Signature v2, (Hmac256)</td>\n      <td>✔</td>\n      <td>23/23 (100%)</td>\n    </tr>\n\n    <tr>\n      <td>Twitter</td>\n      <td>Twitter</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>98/101</td>\n    </tr>\n\n    <tr>\n      <td>Tumblr</td>\n      <td>Tumblr</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>0/???</td>\n    </tr>\n\n    <tr>\n      <td>Xero</td>\n      <td>Xero</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>~12/~40?</td>\n    </tr>\n\n    <tr>\n      <td>Yahoo!</td>\n      <td>Contacts</td>\n      <td>OAuth 1.0a</td>\n      <td>✔</td>\n      <td>3/???</td>\n    </tr>\n\n  </tbody>\n</table>\n\nIn future releases we will be targeting (in no particular order):\n\n* AWS:\n    * Mechanical Turk ([Request or Sponsor Development][sponsor])\n    * Marketplace Web Services ([Request or Sponsor Development][sponsor])\n* RackspaceCloud:\n    * Servers ([Request or Sponsor Development][sponsor])\n    * Files ([Request or Sponsor Development][sponsor])\n    * LoadBalances ([Request or Sponsor Development][sponsor])\n    * DNS ([Request or Sponsor Development][sponsor])\n* Flickr ([Request or Sponsor Development][sponsor])\n* PayPal ([Request or Sponsor Development][sponsor])\n* some Google services ([Request or Sponsor Development][sponsor])\n* URL shorteners ([Request or Sponsor Development][sponsor])\n* anything else you'd like? ([Request or Sponsor Development][sponsor])\n\nThere are lots of services out there, so please [Request or Sponsor Development][sponsor] if you'd like one\nimplemented.\n\n# What 'node-awssum' is? #\n\nnode-awssum is an abstraction layer to many web service APIs. It abstracts out the service endpoints, the HTTP verbs to\nuse, what headers and parameters to set, how to sign the request and finally how to decode the result. It let's you\npass a data structure in and get a data structure out. It also helps in the odd small way when dealing with complex\ninput such as creating XML (e.g. Amazon S3), JSON data structures (e.g. Amazon SQS) or parameters with lots of values\n(e.g. Amazon SimpleDB).\n\nIn saying this, there are some web service operations that are inherently nasty and since node-awssum is essentially a\nproxy to the operation itself it can't abstract away all nastiness.\n\nFor an example of where node-awssum helps is when creating a Bucket in Amazon S3. We take a single 'LocationConstraint'\nparameter in the 'createBucket' call and node-awssum takes that and builds (the horrible) XML which it needs to send\nwith the request. This makes it much easier to perform calls to the various web services and their individual\noperations since this simple notion is across all web services.\n\nHowever, there are also examples of where node-awssum can't really help make the operation nicer. Many of the Amazon\nWeb Services return XML which we blindly convert to a data structure and return that to the caller. In these cases we\ndon't perform any kind of manipulation or conversion to a canonical structure to make the returned data nicer. In these\ncases, a small library which sits on top of node-awssums libraries may be a good choice (see *winston-simpledb* for an\nexample of this - http://github.com/appsattic/winston-simpledb). This would be especially true for SimpleDB where the\nhigher level library could perform number padding, date conversions, creation of multi-field indexes and default field\nvalues - none of which node-awssum does.\n\n# Examples #\n\nExample 1. This is what node-awssum looks like when adding a topic to Amazon's Simple Notification Service:\n\n``` js\nsns.CreateTopic({ TopicName : 'my-topic' })\n=>  {\n        Headers: {\n            date: 'Wed, 16 May 2012 10:32:24 GMT',\n            content-type: 'text/xml',\n            x-amzn-requestid: '6d099dcd-9f42-11e1-a8a2-0f9b48899c6b',\n            content-length: '315'\n        },\n        Body: {\n            CreateTopicResponse: {\n                @: {\n                    xmlns: 'http://sns.amazonaws.com/doc/2010-03-31/'\n                },\n                ResponseMetadata: {\n                    RequestId: '6d099dcd-9f42-11e1-a8a2-0f9b48899c6b'\n                },\n                CreateTopicResult: {\n                    TopicArn: 'arn:aws:sns:us-east-1:616781752028:my-topic'\n                }\n            }\n        },\n        StatusCode: 200\n    }\n```\n\nWhat you would probably like to do is the following (with an example SNS Wrapper Library):\n\n``` js\nsnsWrapperLibrary.createTopic('my-topic')\n=>  arn:aws:sns:us-east-1:616781752028:my-topic\n```\n\nThis is pretty easy to do but annoying to have to find and extract the information you really want. node-awssum comes\nwith some example libraries. :)\n\nExample 2. Saving some attributes for AWS SimpleDB.\n\n...\n\n# What is 'node-awssum' for? #\n\nThis library has a number of uses but mostly it should be used from within a more friendly wrapper library. Let's look\nat some examples.\n\nExample 1: A SimpleDB Wrapper library. Since node-awssum doesn't do any kind of conversion of the values you want to\nput into SimpleDB, it would make sense that you used a library which did those conversions for you, such as padding\ninteger values, normalising dates into an ISO string, setting defaults or helping with queries.\n\nExample 2: When using Amazon Route53, you sometimes have to do a request, manipulate what you got back and then send a\nnew bit of data. Instead a wrapper library around node-awssum which just helps you add or delete resource records would\nbe much easier to use.\n\nExample 3: A small wrapper around the Simple Queue Service means you could simply have some commands such as send(...),\nreceive() and delete() would make using the service a breeze.\n\nThe reason for this is because the data structures it receives, and more especially those it returns, are far too\ncomplicated for dealing with them in your main program. Therefore in general, a wrapper library around these simple\noperations would make each service easier to use.\n\n# How to use it #\n\nThis library provides basic client functionality to each of these services. It's pretty simple but this means it's also\nquite powerful. In general you wouldn't use these libraries directly (though there is nothing stopping you making the\nodd call here and there, especially when setting your environment up) but instead you would use them via a more\nfriendly API via a wrapper library.\n\nYou can use this library in your programs and applications, but it can also be built on for more\nuser-friendly (from the perspective of the programmer) wrapper libraries.\n\nEssentially it's a \"data in, data out\" kinda library without too many bells and whistles. It doesn't really check what\nyou pass it, apart from when a parameter is required. As I sa\n\nAs a quick example, to create a domain in AWS SimpleDB:\n\n``` js\nvar awssum = require('awssum');\nvar amazon = awssum.load('amazon/amazon');\nvar SimpleDB = awssum.load('amazon/simpledb').SimpleDB;\n\nvar sdb = new SimpleDB({\n    'accessKeyId'     : 'my-access-key-id',\n    'secretAccessKey' : 'my-secret-access-key',\n    // 'awsAccountId'    : 'my-aws-account-id', // optional\n    'region'          : amazon.US_EAST_1\n});\n\nsdb.CreateDomain({ DomainName : 'test' }, function(err, data) {\n    console.log('Error :', err);\n    console.log('Data  :', data);\n});\n```\n\nA successful run puts the pertinent information into 'data' ('err' is undefined). An unsuccessful run results in a value\nin 'err' but nothing in 'data'.\n\n# Author #\n\nWritten by [Andrew Chilton](http://chilts.org/) - [Blog](http://chilts.org/blog/) - [Twitter](https://twitter.com/andychilton).\n\n# License #\n\nThe MIT License : http://opensource.org/licenses/MIT\n\nCopyright (c) 2011-2012 AppsAttic Ltd. http://appsattic.com/\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the 'Software'), to deal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n[sponsor]: mailto:chilts%40appsattic.com\n","_id":"awssum@0.8.0","dist":{"shasum":"c95c18ed0a613ebad502006fa32950715cf01731","tarball":"http://registry.npmjs.org/awssum/-/awssum-0.8.0.tgz"},"maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}]}},"readme":"NodeJS client libraries for talking to lots of Web Service APIs\n\n# How to get it\n\nThe easiest way to get it is via [npm][]\n\n``` bash\n    $ npm install irc\n```\n\nIf you want to run the latest version (i.e. later than the version available\nvia [npm][]) you can clone this repo, then use [npm][] to link-install it:\n\n``` bash\n    $ npm link /path/to/your/clone\n```\n\nOf course, you can just clone this, and manually point at the library itself,\nbut I really recommend using [npm][]!\n\n# What services does 'node-awssum' talk to?\n\nCurrently this has 100% coverage of the following services:\n\n* AWS:\n    * SimpleDB\n    * Simple Queue Service (SQS)\n    * Simple Notification Service (SNS)\n    * Simple Email Service (SES)\n    * Simple Storage Service (S3)\n    * Route53\n\nIt has partial support for these services. This means that the complex signatures have been done, but not all\noperations have been implemented:\n\n* AWS:\n    * Elastic Compute Cloud (EC2) ([Request or Sponsor Development][sponsor])\n    * Elastic Load Balancing (ELB) ([Request or Sponsor Development][sponsor])\n\nIn future releases we will be targeting (in no particular order):\n\n* AWS:\n    * Relational Database Service (RDS) ([Request or Sponsor Development][sponsor])\n    * ElastiCache ([Request or Sponsor Development][sponsor])\n    * CloudFront ([Request or Sponsor Development][sponsor])\n    * Flexible Payments Service (FPS) ([Request or Sponsor Development][sponsor])\n* RackspaceCloud:\n    * Servers (In Progress)\n    * Files (In Progress)\n    * LoadBalances (In Progress)\n    * DNS (In Progress)\n* Flickr ([Request or Sponsor Development][sponsor])\n* PayPal ([Request or Sponsor Development][sponsor])\n* Xero ([Request or Sponsor Development][sponsor])\n* some Google services ([Request or Sponsor Development][sponsor])\n* URL shorteners ([Request or Sponsor Development][sponsor])\n* anything else you'd like? ([Request or Sponsor Development][sponsor])\n\nThere are lots of services out there, so please [Request or Sponsor Development][sponsor] if you'd like one\nimplemented.\n\n# What 'node-awssum' is?\n\nnode-awssum is an abstraction layer to many web service APIs. It abstracts out the service endpoints, the HTTP verbs to\nuse, what headers and parameters to set, how to sign the request and finally how to decode the result. It let's you\npass a data structure in and get a data structure out. It also helps in the odd small way when dealing with complex\ninput such as creating XML (e.g. Amazon S3), JSON data structures (e.g. Amazon SQS) or parameters with lots of values\n(e.g. Amazon SimpleDB).\n\nIn saying this, there are some web service operations that are inherently nasty and since node-awssum is essentially a\nproxy to the operation itself it can't abstract away all nastiness.\n\nFor an example of where node-awssum helps is when creating a Bucket in Amazon S3. We take a single 'LocationConstraint'\nparameter in the 'createBucket' call and node-awssum takes that and builds (the horrible) XML which it needs to send\nwith the request. This makes it much easier to perform calls to the various web services and their individual\noperations since this simple notion is across all web services.\n\nHowever, there are also examples of where node-awssum can't really help make the operation nicer. Many of the Amazon\nWeb Services return XML which we blindly convert to a data structure and return that to the caller. In these cases we\ndon't perform any kind of manipulation or conversion to a canonical structure to make the returned data nicer. In these\ncases, a small library which sits on top of node-awssums libraries may be a good choice (see *winston-simpledb* for an\nexample of this - http://github.com/appsattic/winston-simpledb). This would be especially true for SimpleDB where the\nhigher level library could perform number padding, date conversions, creation of multi-field indexes and default field\nvalues - none of which node-awssum does.\n\n# Examples\n\nExample 1. This is what node-awssum looks like when adding a topic to Amazon's Simple Notification Service:\n\n``` js\n    sns.createTopic({ topicName : 'my-topic' })\n    =>  {\n            CreateTopicResponse:\n            {\n                '@': {\n                    xmlns: 'http://sns.amazonaws.com/doc/2010-03-31/'\n                },\n                CreateTopicResult: {\n                    TopicArn: 'arn:aws:sns:us-east-1:616781752028:my-topic'\n                },\n                ResponseMetadata: {\n                    RequestId: '0928273f-fc34-11e0-945d-17a52825d3d9'\n                }\n            }\n        }\n```\n\nWhat you would probably like to do is the following (with an example SNS Wrapper Library):\n\n``` js\n    snsWrapperLibrary.createTopic('my-topic')\n    =>  arn:aws:sns:us-east-1:616781752028:my-topic\n```\n\nThis is pretty easy to do but annoying to have to find and extract the information you really want. node-awssum comes\nwith some example libraries. :)\n\nExample 2. Saving some attributes for AWS SimpleDB.\n\n...\n\n# What is 'node-awssum' for?\n\nThis library has a number of uses but mostly it should be used from within a more friendly wrapper library. Let's look\nat some examples.\n\nExample 1: A SimpleDB Wrapper library. Since node-awssum doesn't do any kind of conversion of the values you want to\nput into SimpleDB, it would make sense that you used a library which did those conversions for you, such as padding\ninteger values, normalising dates into an ISO string, setting defaults or helping with queries.\n\nExample 2: When using Amazon Route53, you sometimes have to do a request, manipulate what you got back and then send a\nnew bit of data. Instead a wrapper library around node-awssum which just helps you add or delete resource records would\nbe much easier to use.\n\nExample 3: A small wrapper around the Simple Queue Service means you could simply have some commands such as send(...),\nreceive() and delete() would make using the service a breeze.\n\nThe reason for this is because the data structures it receives, and more especially those it returns, are far too\ncomplicated for dealing with them in your main program. Therefore in general, a wrapper library around these simple\noperations would make each service easier to use.\n\n# How to use it\n\nThis library provides basic client functionality to each of these services. It's pretty simple but this means it's also\nquite powerful. In general you wouldn't use these libraries directly (though there is nothing stopping you making the\nodd call here and there, especially when setting your environment up) but instead you would use them via a more\nfriendly API via a wrapper library.\n\nYou can use this library in your programs and applications, but it can also be built on for more\nuser-friendly (from the perspective of the programmer) wrapper libraries.\n\nEssentially it's a \"data in, data out\" kinda library without too many bells and whistles. It doesn't really check what\nyou pass it, apart from when a parameter is required. As I sa\n\nAs a quick example, to create a domain in AWS SimpleDB:\n\n``` js\n    var amazon = require(\"../lib/amazon\");\n    var simpledb = require(\"../lib/simpledb\");\n\n    var sdb = new simpledb.SimpleDB('key', 'secret', amazon.US_WEST_1);\n\n    sdb.createDomain('test', function(err, data) {\n        console.log('Error :', err);\n        console.log('Data  :', data);\n    });\n```\n\nA successful run outputs:\n\n``` js\n    Error : null\n    Data  : { ok: true }\n```\n\nA non-successful run results in a true error value, just like any other idiomatic NodeJS. :)\n\n[npm]: http://github.com/isaacs/npm\n[sponsor]: mailto:chilts%40appsattic.com\n\n# Author\n\nWritten by [Andrew Chilton](http://www.chilts.org/blog/)\n\nCopyright 2011 [AppsAttic](http://www.appsattic.com/)\n","maintainers":[{"name":"chilts","email":"chilts@appsattic.com"}],"time":{"modified":"2012-08-10T08:50:32.455Z","created":"2011-11-16T20:12:41.621Z","0.1.0":"2011-11-16T20:12:45.960Z","0.1.1":"2011-11-16T21:19:59.082Z","0.1.2":"2011-11-20T08:56:37.418Z","0.3.0":"2012-01-09T07:57:51.657Z","0.3.1":"2012-01-09T08:32:01.491Z","0.3.2":"2012-01-10T06:18:08.417Z","0.3.3":"2012-01-10T06:21:33.222Z","0.4.0":"2012-04-02T10:19:26.494Z","0.4.1":"2012-04-02T23:55:01.232Z","0.5.0":"2012-05-16T10:45:45.638Z","0.5.1":"2012-05-17T07:10:44.726Z","0.6.0":"2012-05-26T07:51:16.098Z","0.6.1":"2012-05-28T10:36:04.406Z","0.7.0":"2012-07-30T06:54:26.549Z","0.8.0":"2012-08-10T08:50:32.455Z"},"author":{"name":"Andrew Chilton","email":"chilts@appsattic.com","url":"http://www.chilts.org/"},"repository":{"type":"git","url":"git://github.com/appsattic/node-awssum.git"},"users":{"fgribreau":true},"_attachments":{"awssum-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-pNiMJmIysNfupDYTykqAzA==","length":110361,"stub":true},"awssum-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-qLjO/HgEjcW2FmibRqsiug==","length":98602,"stub":true},"awssum-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-+DGLMfTkGrvRqB6bFbmEUQ==","length":80707,"stub":true},"awssum-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-a+M0HLYemDtxC+VCYklRhw==","length":79780,"stub":true},"awssum-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Y3NDZYJ1c/vaDWNtTSygTw==","length":74374,"stub":true},"awssum-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-0JKggJFZEV9ZefMgasxD9Q==","length":73490,"stub":true},"awssum-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-pBXXlRqtJB5n71EO6e2G/A==","length":56614,"stub":true},"awssum-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-G69jmtTV/NxOx3v6a6sLrA==","length":50848,"stub":true},"awssum-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-UAzvyxgzMhKtCkSFBtlIVw==","length":47780,"stub":true},"awssum-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-c2gcny1kkIH+f760TD7tfg==","length":48129,"stub":true},"awssum-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-u+IRc1HGzmO/yZK0gHsVZA==","length":49265,"stub":true},"awssum-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hLGyyDfXlFZBHZ5PGP7VMA==","length":49828,"stub":true},"awssum-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Th6GDouRzfsjzh/u52Lbqg==","length":40187,"stub":true},"awssum-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-e1/zsKQmHDTERRqVTfA5ig==","length":40236,"stub":true},"awssum-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-b5rbNm7Yp9OuWSwRR1meSQ==","length":40280,"stub":true}}}},
{"id":"ax","key":"ax","value":{"rev":"32-f1bd2198ad3542a8247b9ac1a13076ac"},"doc":{"_id":"ax","_rev":"32-f1bd2198ad3542a8247b9ac1a13076ac","name":"ax","description":"A simple logger","dist-tags":{"latest":"0.1.6"},"versions":{"0.0.1":{"name":"ax","version":"0.0.1","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"}],"contributers":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"dyoder@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"..."},"files":["examples","lib"],"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.2.0"},"devDependencies":{"docco":"0.3.0","vows":"0.5.11"},"engine":"node >= 0.4.10","_npmJsonOpts":{"file":"/Users/jxson/.npm/ax/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ax@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e92e961d39e5aeca60b65cbd489e5024f12b3014","tarball":"http://registry.npmjs.org/ax/-/ax-0.0.1.tgz"},"scripts":{},"_npmUser":{"name":"dyoder","email":"danielyoder@gmail.com"}},"0.0.2":{"name":"ax","version":"0.0.2","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"}],"contributers":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"dyoder@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"files":["examples","lib"],"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.2.0"},"devDependencies":{"docco":"0.3.0","vows":"0.5.11"},"engine":"node >= 0.4.10","_npmJsonOpts":{"file":"/Users/jxson/.npm/ax/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"ax@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"71d67ff131364300610c8dc931b6f3c033cbf785","tarball":"http://registry.npmjs.org/ax/-/ax-0.0.2.tgz"},"scripts":{},"_npmUser":{"name":"dyoder","email":"danielyoder@gmail.com"}},"0.1.0":{"name":"ax","version":"0.1.0","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"}],"contributors":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"jason@spire.io"},{"name":"Aaveg Mittal","email":"amittal@spire.io"},{"name":"Nikhil Ratan","email":"nratan@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.2.0"},"devDependencies":{"docco":"0.3.0","vows":"0.5.11","express":"2.5.1"},"engine":"node >= 0.4.10","_npmUser":{"name":"jxson","email":"jason@greatergood.cc"},"_id":"ax@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"bb228bbac5290972eb942b7f2baa9f8d20f63430","tarball":"http://registry.npmjs.org/ax/-/ax-0.1.0.tgz"}},"0.1.1":{"name":"ax","version":"0.1.1","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"}],"contributors":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"jason@spire.io"},{"name":"Aaveg Mittal","email":"amittal@spire.io"},{"name":"Nikhil Ratan","email":"nratan@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.2.0"},"devDependencies":{"docco":"0.3.0","vows":"0.5.11","express":"2.5.1"},"engine":"node >= 0.4.10","_npmUser":{"name":"jxson","email":"jason@greatergood.cc"},"_id":"ax@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"16c4da011f4243a1dff8c3dd45954f773f3efa98","tarball":"http://registry.npmjs.org/ax/-/ax-0.1.1.tgz"}},"0.1.2":{"name":"ax","version":"0.1.2","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"},{"name":"nlacasse","email":"nlacasse@borderstylo.com"}],"contributors":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"jason@spire.io"},{"name":"Aaveg Mittal","email":"amittal@spire.io"},{"name":"Nikhil Ratan","email":"nratan@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.3.0"},"devDependencies":{"docco":"0.3.0","vows":"0.6.1","express":"2.5.6","browserify":"1.9.2","uglify-js":"1.2.5"},"engine":"node >= 0.4.10","_npmUser":{"name":"nlacasse","email":"nlacasse@borderstylo.com"},"_id":"ax@0.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f5350c773b199f96d08ab068b3cce07842714ac4","tarball":"http://registry.npmjs.org/ax/-/ax-0.1.2.tgz"},"readme":""},"0.1.3":{"name":"ax","version":"0.1.3","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"},{"name":"nlacasse","email":"nlacasse@borderstylo.com"}],"contributors":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"jason@spire.io"},{"name":"Aaveg Mittal","email":"amittal@spire.io"},{"name":"Nikhil Ratan","email":"nratan@spire.io"},{"name":"Matthew King","email":"mking@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.3.0"},"devDependencies":{"docco":"0.3.0","vows":"0.6.1","express":"2.5.6","browserify":"1.9.2","uglify-js":"1.2.5"},"engine":"node >= 0.4.10","_npmUser":{"name":"nlacasse","email":"nlacasse@borderstylo.com"},"_id":"ax@0.1.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"bbc1043176479e2f0b932bdfe759b4c4a5f993da","tarball":"http://registry.npmjs.org/ax/-/ax-0.1.3.tgz"},"readme":""},"0.1.5":{"name":"ax","version":"0.1.5","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"},{"name":"nlacasse","email":"nlacasse@borderstylo.com"},{"name":"automatthew","email":"mking@spire.io"}],"contributors":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"jason@spire.io"},{"name":"Aaveg Mittal","email":"amittal@spire.io"},{"name":"Nikhil Ratan","email":"nratan@spire.io"},{"name":"Matthew King","email":"mking@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"colors":"0.5.0","underscore":"1.3.0"},"devDependencies":{"docco":"0.3.0","vows":"0.6.1","express":"2.5.6","browserify":"1.9.2","uglify-js":"1.2.5"},"engine":"node >= 0.4.10","_npmUser":{"name":"nlacasse","email":"nlacasse@alum.mit.edu"},"_id":"ax@0.1.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4424801f97e77d07a6d5f2403d5873f2ea30fe2a","tarball":"http://registry.npmjs.org/ax/-/ax-0.1.5.tgz"},"readme":""},"0.1.6":{"name":"ax","version":"0.1.6","description":"A simple logger","keywords":["log","logger"],"licenses":[{"type":"MIT","url":"https://github.com/spire-io/ax/blob/master/ReadMe.md"}],"homepage":"https://github.com/spire-io/ax","bugs":{"url":"https://github.com/spire-io/ax/issues"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"},{"name":"nlacasse","email":"nlacasse@borderstylo.com"},{"name":"automatthew","email":"mking@spire.io"}],"contributors":[{"name":"Dan Yoder","email":"dyoder@spire.io"},{"name":"Jason Campbell","email":"jason@spire.io"},{"name":"Aaveg Mittal","email":"amittal@spire.io"},{"name":"Nikhil Ratan","email":"nratan@spire.io"},{"name":"Matthew King","email":"mking@spire.io"}],"main":"./lib/ax.js","repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"directories":{"lib":"./lib","examples":"./examples"},"dependencies":{"underscore":"1.3.0"},"devDependencies":{"docco":"0.3.0","vows":"0.6.1","express":"2.5.6","browserify":"1.9.2","uglify-js":"1.2.5"},"engine":"node >= 0.4.10","_npmUser":{"name":"nlacasse","email":"nlacasse@alum.mit.edu"},"_id":"ax@0.1.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"900e39771b86e1edce16cbc166945a1f44c075ee","tarball":"http://registry.npmjs.org/ax/-/ax-0.1.6.tgz"},"readme":""}},"maintainers":[{"name":"jxson","email":"jason@greatergood.cc"},{"name":"dyoder","email":"danielyoder@gmail.com"},{"name":"nlacasse","email":"nlacasse@borderstylo.com"},{"name":"automatthew","email":"mking@spire.io"}],"time":{"modified":"2012-06-06T06:44:46.086Z","created":"2011-10-12T22:35:04.875Z","0.0.1":"2011-12-06T20:19:20.475Z","0.0.2":"2011-12-06T20:19:20.475Z","0.1.0":"2011-12-21T19:27:54.095Z","0.1.1":"2011-12-21T19:28:07.551Z","0.1.2":"2012-01-19T20:00:50.442Z","0.1.3":"2012-01-31T20:16:41.348Z","0.1.5":"2012-02-27T20:14:33.586Z","0.1.6":"2012-06-06T06:44:46.086Z"},"author":{"name":"Dan Yoder","email":"dyoder@spire.io"},"repository":{"type":"git","url":"git://github.com/spire-io/ax.git"},"_attachments":{"ax-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-wQShbjkzZAHvhe/LxiXNUQ==","length":32312,"stub":true},"ax-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-bIgS8Qkeg4EDjRslvwwfEw==","length":40108,"stub":true},"ax-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-66qxYcspQzGBgiB1XAIoyg==","length":39916,"stub":true},"ax-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-KQFhAMCcIUJH0c7d36GHew==","length":39874,"stub":true},"ax-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-WBBHTqvf89M52/43nU+PZQ==","length":40960,"stub":true},"ax-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-WdRqBUR3rLCpyGH3D3ZCbw==","length":40960,"stub":true},"ax-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CsukcgqzXPNjpcoVF/Yqtg==","length":1773,"stub":true},"ax-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-k4wEHWsztDC5MnYV5Zbv2w==","length":1769,"stub":true}}}},
{"id":"axe","key":"axe","value":{"rev":"5-0eb7180baffd045bf84b80b45e08e0da"},"doc":{"_id":"axe","_rev":"5-0eb7180baffd045bf84b80b45e08e0da","name":"axe","description":"Express-like API for dealing with native clusters in Node >= .6","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"axe","description":"Express-like API for dealing with native clusters in Node >= .6","version":"0.0.0","repository":{"type":"git","url":"git://github.com/ecto/axe.git"},"main":"axe.js","engines":{"node":"~0.6.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"axe@0.0.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"85c58ee6cf9864bda520239059ca93c8e85eb9f4","tarball":"http://registry.npmjs.org/axe/-/axe-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.0.1":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"axe","description":"Express-like API for dealing with native clusters in Node >= .6","version":"0.0.1","repository":{"type":"git","url":"git://github.com/ecto/axe.git"},"main":"axe.js","engines":{"node":"~0.6.0"},"dependencies":{"colors":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"axe@0.0.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"f7b637a871b0c223cba7b6727b5872a05763d2d5","tarball":"http://registry.npmjs.org/axe/-/axe-0.0.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2011-11-21T06:22:53.740Z","created":"2011-11-21T05:49:05.948Z","0.0.0":"2011-11-21T05:49:06.535Z","0.0.1":"2011-11-21T06:22:53.740Z"},"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/axe.git"},"_attachments":{"axe-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Jw7HRXpvWX0r5PmJQxFNqw==","length":10240,"stub":true},"axe-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dENqo5mBWUyGkxmzgymD4A==","length":10240,"stub":true}}}},
{"id":"axon","key":"axon","value":{"rev":"5-16de2fdf0900d7326296aa37048ab626"},"doc":{"_id":"axon","_rev":"5-16de2fdf0900d7326296aa37048ab626","name":"axon","description":"High-level messaging & socket patterns implemented in pure js","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.3":{"name":"axon","description":"High-level messaging & socket patterns implemented in pure js","version":"0.0.3","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"debug":"*"},"devDependencies":{"should":"*","mocha":"*"},"keywords":["zmq","zeromq","pubsub","socket","emitter","ipc","rpc"],"_id":"axon@0.0.3","dist":{"shasum":"83d0a77e7dc16293ade6d15e1ed38f01eef8f988","tarball":"http://registry.npmjs.org/axon/-/axon-0.0.3.tgz"},"readme":"","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-06T12:18:25.856Z","created":"2012-08-03T15:08:10.236Z","0.0.3":"2012-08-03T15:08:11.600Z"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"users":{"sjonnet19":true},"_attachments":{"axon-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7EIO0l8QIqxXV9wFSpBPPQ==","length":6215,"stub":true}}}},
{"id":"ayah","key":"ayah","value":{"rev":"3-5f2fad5230ec9ba39a208ab4b1a3caa8"},"doc":{"_id":"ayah","_rev":"3-5f2fad5230ec9ba39a208ab4b1a3caa8","name":"ayah","description":"An API frontend for captcha replacement 'are you a human' http://www.areyouahuman.com/","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"ayah","version":"0.1.0","description":"An API frontend for captcha replacement 'are you a human' http://www.areyouahuman.com/","keywords":["are you a human","ayah","captcha"],"url":"https://github.com/herzi/node-ayah","bugs":{"name":"https://guthub.com/herzi/node-ayah/issues"},"author":{"name":"Sven Herzberg","email":"herzberg.sven@googlemail.com","url":"https://github.com/herzi"},"main":"./index","repository":{"type":"git","url":"git://github.com/herzi/node-ayah.git"},"_npmUser":{"name":"herzi","email":"herzberg.sven@googlemail.com"},"_id":"ayah@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7304f7e1fdf6bd44c31083f6e3b2897a66cdc077","tarball":"http://registry.npmjs.org/ayah/-/ayah-0.1.0.tgz"},"readme":"","maintainers":[{"name":"herzi","email":"herzberg.sven@googlemail.com"}]}},"readme":"","maintainers":[{"name":"herzi","email":"herzberg.sven@googlemail.com"}],"time":{"modified":"2012-05-04T18:44:20.993Z","created":"2012-05-04T18:44:19.199Z","0.1.0":"2012-05-04T18:44:20.993Z"},"author":{"name":"Sven Herzberg","email":"herzberg.sven@googlemail.com","url":"https://github.com/herzi"},"repository":{"type":"git","url":"git://github.com/herzi/node-ayah.git"},"_attachments":{"ayah-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qySZKruvz+HYsc9n9fiNhg==","length":1677,"stub":true}}}},
{"id":"aye","key":"aye","value":{"rev":"5-d9012218368faf7c1f295057b801ff6b"},"doc":{"_id":"aye","_rev":"5-d9012218368faf7c1f295057b801ff6b","name":"aye","description":"watch stuff and exec something when there's a change","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"author":{"name":"Mihai Tomescu","email":"matomesc@gmail.com","url":"https://github.com/matomesc"},"name":"aye","description":"watch stuff and exec something when there's a change","version":"0.0.0","homepage":"https://github.com/matomesc/aye","repository":{"type":"git","url":"git://github.com/matomesc/aye.git"},"main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha -R spec"},"dependencies":{"colors":"~0.6.x","glob":"~3.1.9","seq":"~0.3.5"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"matomesc","email":"matomesc@gmail.com"},"_id":"aye@0.0.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"6c462a04a0f8b6cc9189c18546e78c6c7f72e1db","tarball":"http://registry.npmjs.org/aye/-/aye-0.0.0.tgz"},"maintainers":[{"name":"matomesc","email":"matomesc@gmail.com"}]},"0.0.1":{"author":{"name":"Mihai Tomescu","email":"matomesc@gmail.com","url":"https://github.com/matomesc"},"name":"aye","description":"watch stuff and exec something when there's a change","version":"0.0.1","homepage":"https://github.com/matomesc/aye","repository":{"type":"git","url":"git://github.com/matomesc/aye.git"},"main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha -R spec"},"dependencies":{"colors":"~0.6.x","glob":"~3.1.9","seq":"~0.3.5"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"matomesc","email":"matomesc@gmail.com"},"_id":"aye@0.0.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"60e9f854d402ffa54fe53ffbbdc26ff572e3f480","tarball":"http://registry.npmjs.org/aye/-/aye-0.0.1.tgz"},"maintainers":[{"name":"matomesc","email":"matomesc@gmail.com"}]}},"readme":"# aye\n\n> aye watches files for you and execs commands when they change\n\n## example\n\n```javascript\nvar aye = require('aye');\naye('jshint lib/**', ['lib/**']);\n```\n\n## install\n\n```\n$ npm install aye\n```\n\n## usage\n\n### aye(command, includes, excludes)\n\nThe includes and excludes are expanded and the differences is watched. Upon a change, `command` is exec'd.","maintainers":[{"name":"matomesc","email":"matomesc@gmail.com"}],"time":{"modified":"2012-03-27T03:28:48.188Z","created":"2012-03-27T02:07:47.794Z","0.0.0":"2012-03-27T02:07:48.479Z","0.0.1":"2012-03-27T03:28:48.188Z"},"author":{"name":"Mihai Tomescu","email":"matomesc@gmail.com","url":"https://github.com/matomesc"},"repository":{"type":"git","url":"git://github.com/matomesc/aye.git"},"_attachments":{"aye-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MQsXDxvk+UU9KHO39GeeSA==","length":1466,"stub":true},"aye-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yd0vvROyfTopE1dvvkYsJw==","length":1412,"stub":true}}}},
{"id":"azure","key":"azure","value":{"rev":"49-7d8a4a9cbc884e9c7da83cd6a181d342"},"doc":{"_id":"azure","_rev":"49-7d8a4a9cbc884e9c7da83cd6a181d342","name":"azure","description":"Windows Azure Client Library for node and Command Line Tool","dist-tags":{"latest":"0.6.1"},"versions":{"0.5.0":{"name":"azure","author":{"name":"Microsoft Corporation"},"version":"0.5.0","description":"Windows Azure Client Library for node","tags":["azure","sdk"],"keywords":["node","azure"],"main":"./lib/azure.js","engines":{"node":">= 0.6.4"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"dependencies":{"xml2js":">= 0.1.11","sax":">= 0.1.1","qs":">= 0.3.1","log":">= 1.2.0","xmlbuilder":">= 0.3.1","mime":">= 1.2.4"},"devDependencies":{"nodeunit":">= 0.6.4","jshint":">= 0.5.2"},"homepage":"http://github.com/WindowsAzure/azure-sdk-for-node","repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"bugs":{"url":"http://github.com/WindowsAzure/azure-sdk-for-node/issues"},"scripts":{"test":"node test/runtests.js","jshint":"node test/runjshint.js","extendedtests":"node test/runextendedtests.js"},"_npmUser":{"name":"andrerod","email":"andrerod@microsoft.com"},"_id":"azure@0.5.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3cae5a2c37cad99d9fe566f9694731cb5ea7f6e1","tarball":"http://registry.npmjs.org/azure/-/azure-0.5.0.tgz"},"maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"directories":{}},"0.5.1":{"name":"azure","author":{"name":"Microsoft Corporation"},"version":"0.5.1","description":"Windows Azure Client Library for node","tags":["azure","sdk"],"keywords":["node","azure"],"main":"./lib/azure.js","engines":{"node":">= 0.6.4"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"dependencies":{"xml2js":">= 0.1.11","sax":">= 0.1.1","qs":">= 0.3.1","log":">= 1.2.0","xmlbuilder":">= 0.3.1","mime":">= 1.2.4"},"devDependencies":{"nodeunit":">= 0.6.4","jshint":">= 0.5.2"},"homepage":"http://github.com/WindowsAzure/azure-sdk-for-node","repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"bugs":{"url":"http://github.com/WindowsAzure/azure-sdk-for-node/issues"},"scripts":{"test":"node test/runtests.js","jshint":"node test/runjshint.js","extendedtests":"node test/runextendedtests.js"},"_npmUser":{"name":"andrerod","email":"andrerod@microsoft.com"},"_id":"azure@0.5.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"63be4ddbb0ff7adc179e8ddec266b953cdd44599","tarball":"http://registry.npmjs.org/azure/-/azure-0.5.1.tgz"},"maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"directories":{}},"0.5.2":{"name":"azure","author":{"name":"Microsoft Corporation"},"version":"0.5.2","description":"Windows Azure Client Library for node","tags":["azure","sdk"],"keywords":["node","azure"],"main":"./lib/azure.js","engines":{"node":">= 0.4.7"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"dependencies":{"xml2js":">= 0.1.11","sax":">= 0.1.1","qs":">= 0.3.1","log":">= 1.2.0","xmlbuilder":">= 0.3.1","mime":">= 1.2.4","dateformat":"1.0.2-1.2.3"},"devDependencies":{"nodeunit":">= 0.6.4"},"homepage":"http://github.com/WindowsAzure/azure-sdk-for-node","repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"bugs":{"url":"http://github.com/WindowsAzure/azure-sdk-for-node/issues"},"scripts":{"test":"node test/runtests.js","jshint":"node test/runjshint.js","extendedtests":"node test/runextendedtests.js"},"_npmUser":{"name":"andrerod","email":"andrerod@microsoft.com"},"_id":"azure@0.5.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.7.4-pre","_defaultsLoaded":true,"dist":{"shasum":"bd6b5e5e4055662afddedb4cd2267a01b3f890d6","tarball":"http://registry.npmjs.org/azure/-/azure-0.5.2.tgz"},"maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"directories":{}},"0.5.3":{"name":"azure","author":{"name":"Microsoft Corporation"},"version":"0.5.3","description":"Windows Azure Client Library for node","tags":["azure","sdk"],"keywords":["node","azure"],"main":"./lib/azure.js","engines":{"node":">= 0.4.7"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"dependencies":{"xml2js":">= 0.1.11","sax":">= 0.1.1","qs":">= 0.3.1","log":">= 1.2.0","xmlbuilder":">= 0.3.1","mime":">= 1.2.4","dateformat":"1.0.2-1.2.3","underscore":">= 1.3.1","underscore.string":">= 2.0.0","node-uuid":"> = 1.2.0"},"devDependencies":{"mocha":"*","jshint":"*","sinon":"*"},"homepage":"http://github.com/WindowsAzure/azure-sdk-for-node","repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"bugs":{"url":"http://github.com/WindowsAzure/azure-sdk-for-node/issues"},"scripts":{"test":"node test/runtests.js testlist.txt","jshint":"node test/runjshint.js","coverage":"node test/runtests.js testlist.txt -coverage > coverage.html","extendedtests":"node test/runtests.js extendedtestlist.txt"},"_npmUser":{"name":"andrerod","email":"andrerod@microsoft.com"},"_id":"azure@0.5.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7712f2ff8b7087252db9d98919ea6bbbf66f8479","tarball":"http://registry.npmjs.org/azure/-/azure-0.5.3.tgz"},"maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"directories":{}},"0.6.0":{"name":"azure","author":{"name":"Microsoft Corporation"},"version":"0.6.0","description":"Windows Azure Client Library for node and Command Line Tool","tags":["azure","sdk"],"keywords":["node","azure"],"main":"./lib/azure.js","engines":{"node":">= 0.6.15"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"dependencies":{"xml2js":">= 0.1.11","sax":">= 0.1.1","qs":">= 0.3.1","log":">= 1.2.0","xmlbuilder":">= 0.3.1","mime":">= 1.2.4","dateformat":"1.0.2-1.2.3","underscore":">= 1.3.1","underscore.string":">= 2.0.0","node-uuid":"> = 1.2.0","tunnel":">= 0.0.1","async":">= 0.1.18","streamline":"0.2.4","commander":">= 0.5.2","winston":">= 0.5.10","colors":"0.x.x","eyes":"0.x.x","easy-table":"0.0.1"},"devDependencies":{"mocha":"*","jshint":"*","sinon":"*","should":"*"},"homepage":"http://github.com/WindowsAzure/azure-sdk-for-node","repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"bugs":{"url":"http://github.com/WindowsAzure/azure-sdk-for-node/issues"},"scripts":{"test":"node test/runtests.js testlist.txt","jshint":"node test/runjshint.js","coverage":"node test/runtests.js testlist.txt -coverage > coverage.html","extendedtests":"node test/runtests.js extendedtestlist.txt"},"bin":{"azure":"./bin/azure"},"_npmUser":{"name":"andrerod","email":"andrerod@microsoft.com"},"_id":"azure@0.6.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"07e4fb694dc043af89623739c6e88da790a9d949","tarball":"http://registry.npmjs.org/azure/-/azure-0.6.0.tgz"},"maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"directories":{}},"0.6.1":{"name":"azure","author":{"name":"Microsoft Corporation"},"version":"0.6.1","description":"Windows Azure Client Library for node and Command Line Tool","tags":["azure","sdk"],"keywords":["node","azure"],"main":"./lib/azure.js","engines":{"node":">= 0.6.15"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"dependencies":{"xml2js":">= 0.1.11","sax":">= 0.1.1","qs":">= 0.3.1","log":">= 1.2.0","xmlbuilder":">= 0.3.1","mime":">= 1.2.4","dateformat":"1.0.2-1.2.3","underscore":">= 1.3.1","underscore.string":">= 2.0.0","node-uuid":"> = 1.2.0","tunnel":">= 0.0.1","async":">= 0.1.18","streamline":"0.2.4","commander":">= 0.5.2","winston":">= 0.5.10","colors":"0.x.x","eyes":"0.x.x","easy-table":"0.0.1"},"devDependencies":{"mocha":"*","jshint":"*","sinon":"*","should":"*"},"homepage":"http://github.com/WindowsAzure/azure-sdk-for-node","repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"bugs":{"url":"http://github.com/WindowsAzure/azure-sdk-for-node/issues"},"scripts":{"test":"node test/runtests.js testlist.txt","jshint":"node test/runjshint.js","coverage":"node test/runtests.js testlist.txt -coverage > coverage.html","extendedtests":"node test/runtests.js extendedtestlist.txt"},"bin":{"azure":"./bin/azure"},"_npmUser":{"name":"andrerod","email":"andrerod@microsoft.com"},"_id":"azure@0.6.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"49b71e41715222c4a0951cde4cd70687e1e69ef5","tarball":"http://registry.npmjs.org/azure/-/azure-0.6.1.tgz"},"maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"directories":{}}},"readme":"<h1>Windows Azure SDK for Node.js</h1>\r\n<p>This project provides a set of Node.js packages that make it easy to access\r\nthe Windows Azure storage and queue services. For documentation on how\r\nto host Node.js applications on Windows Azure, please see the\r\n<a href=\"http://www.windowsazure.com/en-us/develop/nodejs/\">Windows Azure\r\nNode.js Developer Center</a>.</p>\r\n\r\n<h1>Features</h1>\r\n<ul>\r\n    <li>Tables\r\n        <ul>\r\n            <li>create and delete tables</li>\r\n            <li>create, query, insert, update, merge, and delete entities</li>\r\n    </li>\r\n    <li>Blobs\r\n        <ul>\r\n            <li>create, list, and delete containers, work with container metadata\r\n            and permissions, list blobs in container</li>\r\n            <li>create block and page blobs (from a stream, a file, or a string),\r\n            work with blob blocks and pages, delete blobs</li>\r\n            <li>work with blob properties, metadata, leases, snapshot a blob</li>\r\n    </li>\r\n    <li>Queues\r\n        <ul>\r\n            <li>create, list, and delete queues, and work with queue metadata</li>\r\n            <li>create, get, peek, update, delete messages</li>\r\n    </li>\r\n</ul>\r\n\r\n<h1>Getting Started</h1>\r\n<h2>Download Source Code</h2>\r\n<p>To get the source code of the SDK via <strong>git</strong> just type:<br/>\r\n<pre>git clone https://github.com/WindowsAzure/azure-sdk-for-node.git<br/>cd ./azure-sdk-for-node</pre>\r\n</p>\r\n\r\n<h2>Download Package</h2>\r\n<p>Alternatively, to get the source code via the Node Package Manager (npm), type<br/>\r\n<pre>npm install azure</pre>\r\n<p>You can use these packages against the cloud Windows Azure Services, or against\r\nthe local Storage Emulator.</p>\r\n<ol>\r\n    <li>To use the cloud services, you need to first create an account with\r\n    Windows Azure. You need to set the AZURE_STORAGE_ACCOUNT and the AZURE_STORAGE_ACCESS_KEY\r\n    environment variables to the storage account name and primary access key you\r\n    obtain from the Azure Portal.</li>\r\n    <li>To use the Storage Emulator, make sure the latest version of the\r\n    Windows Azure SDK is installed on the machine, and set the EMULATED environment\r\n    variable to any value (\"true\", \"1\", etc.)</li>\r\n</ol>\r\n\r\n<h1>Usage</h1>\r\n<h2>Table Storage</h2>\r\n<p>To ensure a table exists, call <strong>createTableIfNotExists</strong>:</p>\r\n<pre>\r\nvar tableService = azure.createTableService();\r\ntableService.createTableIfNotExists('tasktable', function(error){\r\n    if(!error){\r\n        // Table exists\r\n    }\r\n});\r\n</pre>\r\n<p>A new entity can be added by calling <strong>insertEntity</strong>:</p>\r\n<pre>\r\nvar tableService = azure.createTableService(),\r\n    task1 = {\r\n        PartitionKey : 'tasksSeattle',\r\n        RowKey: '1',\r\n        Description: 'Take out the trash',\r\n        DueDate: new Date(2011, 12, 14, 12) \r\n    };\r\ntableService.insertEntity('tasktable', task1, function(error){ \r\n    if(!error){\r\n        // Entity inserted\r\n    }\r\n});\r\n</pre>\r\n<p>The method <strong>queryEntity</strong> can then be used to fetch the entity that was just inserted:</p>\r\n<pre>\r\nvar tableService = azure.createTableService();\r\ntableService.queryEntity('tasktable', 'tasksSeattle', '1', function(error, serverEntity){\r\n    if(!error){\r\n        // Entity available in serverEntity variable\r\n    }\r\n});\r\n</pre> \r\n<h2>Blob Storage</h2>\r\n<p>The <strong>createContainerIfNotExists</strong> method can be used to create a \r\ncontainer in which to store a blob:</p>\r\n<pre>\r\nvar blobService = azure.createBlobService();\r\nblobService.createContainerIfNotExists('taskcontainer', {publicAccessLevel : 'blob'}, function(error){\r\n    if(!error){\r\n        // Container exists and is public\r\n    }\r\n});\r\n</pre>\r\n<p>To upload a file (assuming it is called task1-upload.txt, it contains the exact text \"hello world\" (no quotation marks), and it is placed in the same folder as the script below), the method <strong>createBlockBlobFromStream</strong> can be used:</p>\r\n<pre>\r\nvar blobService = azure.createBlobService();\r\nblobService.createBlockBlobFromStream('taskcontainer', 'task1', fs.createReadStream('task1-upload.txt'), 11, function(error){\r\n    if(!error){\r\n        // Blob uploaded\r\n    }\r\n});\r\n</pre>\r\n<p>To download the blob and write it to the file system, the <strong>getBlobToStream</strong> method can be used:</p>\r\n<pre>\r\nvar blobService = azure.createBlobService();\r\nblobService.getBlobToStream('taskcontainer', 'task1', fs.createWriteStream('task1-download.txt'), function(error, serverBlob){\r\n    if(!error){\r\n        // Blob available in serverBlob.blob variable\r\n    }\r\n});\r\n</pre>\r\n<h2>Queues</h2>\r\n<p>The <strong>createQueueIfNotExists</strong> method can be used to ensure a queue exists:</p>\r\n<pre>\r\nvar queueService = azure.createQueueService();\r\nqueueService.createQueueIfNotExists('taskqueue', function(error){\r\n    if(!error){\r\n        // Queue exists\r\n    }\r\n});\r\n</pre>\r\n<p>The <strong>createMessage</strong> method can then be called to insert the message into the queue:</p>\r\n<pre>\r\nvar queueService = azure.createQueueService();\r\nqueueService.createMessage('taskqueue', \"Hello world!\", function(error){\r\n    if(!error){\r\n        // Message inserted\r\n    }\r\n});\r\n</pre>\r\n<p>It is then possible to call the <strong>getMessage</strong> method, process the message and then call <strong>deleteMessage</strong> inside the callback. This two-step process ensures messages don't get lost when they are removed from the queue.</p>\r\n<pre>\r\nvar queueService = azure.createQueueService(),\r\n    queueName = 'taskqueue';\r\nqueueService.getMessages(queueName, function(error, serverMessages){\r\n    if(!error){\r\n        // Process the message in less than 30 seconds, the message\r\n        // text is available in serverMessages[0].messagetext \r\n\r\n        queueService.deleteMessage(queueName, serverMessages[0].messageid, serverMessages[0].popreceipt, function(error){\r\n            if(!error){\r\n                // Message deleted\r\n            }\r\n        });\r\n    }\r\n});\r\n</pre>\r\n<p><strong>For more examples please see the <a href=\"http://www.windowsazure.com/en-us/develop/nodejs/\">\r\nWindows Azure Node.js Developer Center</a>.</strong></p>\r\n\r\n<h1>Need Help?</h1>\r\n<p>Be sure to check out the Windows Azure <a href=\"http://go.microsoft.com/fwlink/?LinkId=234489\">\r\nDeveloper Forums on Stack Overflow</a> if you have trouble with the provided code.</p>\r\n\r\n<h1>Feedback</h1>\r\n<p>For feedback related specifically to this SDK, please use the Issues\r\nsection of the repository.</p>\r\n<p>For general suggestions about Windows Azure please use our\r\n<a href=\"http://www.mygreatwindowsazureidea.com/forums/34192-windows-azure-feature-voting\">UserVoice forum</a>.</p>\r\n\r\n<h1>Learn More</h1>\r\n<a href=\"http://www.windowsazure.com/en-us/develop/nodejs/\">Windows Azure Node.js Developer Center</a>\r\n","maintainers":[{"name":"andrerod","email":"andrerod@microsoft.com"}],"time":{"modified":"2012-08-15T08:08:57.927Z","created":"2011-12-10T00:20:01.523Z","0.5.0":"2011-12-10T00:20:03.123Z","0.5.1":"2012-01-17T01:55:45.276Z","0.5.2":"2012-02-16T05:16:58.049Z","0.5.3":"2012-04-21T15:51:49.349Z","0.6.0":"2012-06-11T05:23:01.496Z","0.6.1":"2012-07-09T20:41:53.055Z","0.6.2":"2012-08-15T08:06:05.382Z"},"author":{"name":"Microsoft Corporation"},"repository":{"type":"git","url":"git@github.com:WindowsAzure/azure-sdk-for-node.git"},"_attachments":{"azure-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-sjMAx4PDD9SfeyLqY90YGA==","length":484708,"stub":true},"azure-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-TMGmIRTG4sepUO0rX2Blew==","length":858752,"stub":true},"azure-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-qGQ+y5sT3vyIqsDUloAFdg==","length":419514,"stub":true},"azure-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-+4daiwviR6F8Uv0K6SWDWg==","length":196200,"stub":true},"azure-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VqpX6038QluWQr8Q3a+gtw==","length":105388,"stub":true},"azure-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Fdm6f3B1TSr4YdnbaFCtlw==","length":106000,"stub":true}}}},
{"id":"azzydor","key":"azzydor","value":{"rev":"3-d05b604afc7f1075c707260affc13f6f"},"doc":{"_id":"azzydor","_rev":"3-d05b604afc7f1075c707260affc13f6f","name":"azzydor","description":"an MVC framework for Node (hacky version)","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"azzydor","description":"an MVC framework for Node (hacky version)","version":"1.0.0","homepage":"https://github.com/Obvious/matador","authors":["Dustin Diaz <dustin@obvious.com> (https://github.com/ded)","Dustin Senos <ds@obvious.com> (https://github.com/dustinsenos)","Jeremy Stanley <jeremy@obvious.com> (https://github.com/azulus)"],"main":"src/matador.js","repository":{"type":"git","url":"git://github.com/Obvious/matador.git"},"engines":{"node":">=0.6.0 <0.7.0"},"bin":{"matador":"bin/matador.js"},"dependencies":{"express":">=2.5.0 <3.0.0","valentine":"*","klass":"*","colors":"*","hogan.js":"*","optimist":"*"},"_npmUser":{"name":"azulus","email":"npm@azulus.com"},"_id":"azzydor@1.0.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"4f8dc5379d666b6d09819efd9628bb93605240ac","tarball":"http://registry.npmjs.org/azzydor/-/azzydor-1.0.0.tgz"},"maintainers":[{"name":"azulus","email":"npm@azulus.com"}]}},"readme":"# Matador\nSane defaults and a simple structure, scaling as your application grows.\n\nMatador is a clean, organized framework for [Node.js](http://nodejs.org) architected to suit MVC enthusiasts. It gives you a well-defined development environment with flexible routing, easy controller mappings, and basic request filtering.\nIt&#8217;s built on open source libraries such as [Hogan.js](http://twitter.github.com/hogan.js) for view rendering, [Klass](https://github.com/ded/klass) for its inheritance model, [Valentine](https://github.com/ded/valentine)\nfor functional development, and [Express](http://expressjs.com) to give a bundle of other Node server related helpers.\n\n# Installation\n### Get the CLI\n    $ npm install matador -g\n\n### Create an app\n    $ matador init my-app\n    $ cd !$ && npm install matador\n\n### Start your app\n    $ node server.js\n\n# Dancing with the Bulls\n### Build on your app\n\n``` js\n// app/config/routes.js\n['get', '/hello/:name', 'Home', 'hello']\n\n// app/controllers/HomeController.js\nhello: function (request, response, name) {\n  response.send('hello ' + name)\n}\n```\n\n### View Rendering\nUses Twitters [Hogan.js](http://twitter.github.com/hogan.js/) with layouts, partials, and i18n support.\n\n``` js\n// app/controllers/HomeController.js\nthis.render(response, 'index', {\n  title: 'Hello Bull Fighters'\n})\n```\n\n``` html\n<!-- app/views/layout.html -->\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\">\n    <title>{{title}}</title>\n  </head>\n  <body>\n    {{{body}}}\n  </body>\n</html>\n```\n\n``` html\n<!-- app/views/index.html -->\n<h1>{{title}}</h1>\n```\n\n### View Partials\n\nMatador looks for view partials in a folder named partials in the views directory: ```app/views/partials/```\n\n``` js\n// app/controllers/HomeController.js\nmodule.exports = function (app, config) {\n  return app.controllers.Base.extend()\n  .methods({\n    index: function (req, res) {\n      this.render(res, 'index', {\n          user: {\n              first: \"John\"\n            , last: \"Smith\"\n          }\n        , todo: [{ name: 'dishes', id: 0 }, { name: 'mow lawn', id: 1 }]\n      })\n    }\n  })\n}\n```\n\n```html\n<!-- app/views/partials/fullname.html -->\n{{first}} {{last}}\n```\n\n```html\n<!-- app/views/partials/tasks.html -->\n<ul>\n  {{#todo}}\n  <li>{{name}}</li>\n  {{/todo}}\n</ul>\n```\n\n```html\n<!-- app/views/index.html -->\n<h1>Hello {{#user}}{{> fullname}}{{/user}} welcome to Matador!</h1>\n{{> tasks}}\n```\n\nProduces the following HTML:\n\n```html\n<h1>Hello John Smith welcome to Matador!</h1>\n<ul>\n  <li>dishes</li>\n  <li>mow lawn</li>\n</ul>\n```\n\n### Overriding View Partials\n\nMatador allows you to easily override view partials on a per-directory basis.\nTo override a partial create a new folder named 'partials' in the folder your controller is using as its ```viewFolder```.\nMatador will look first in this folder for partials, if no matching partial exists it will traverse up the directory tree until it finds a matching partial.\n\n``` js\n// app/controllers/admin/AdminController.js\nmodule.exports = function (app, config) {\n  return app.getController('Application', true).extend(function () {\n    this.viewFolder = \"admin\" // we've set the view folder to \"admin\"\n  })\n  .methods({\n    index: function (req, res) {\n      this.render(res, 'index', {\n          user: {\n              first: \"John\"\n            , last: \"Smith\"\n          }\n        , todo: [{ name: 'dishes', id: 0 }, { name: 'mow lawn', id: 1 }]\n      })\n    }\n  })\n}\n```\n\n```html\n<!-- app/views/admin/partials/tasks.html -->\n<!-- This file will override the tasks.html partial found in app/views/partials -->\n<ul>\n{{#todo}}\n<li><a href=\"/edit/{{id}}\">Edit the \"{{name}}\" task </a> or <a href=\"/delete/{{id}}\">delete it</a></li>\n{{/todo}}\n</ul>\n```\n\n```html\n<!-- app/views/admin/index.html -->\n<!-- 'app/views/admin/partials/fullname.html' Does not exist, so 'app/views/partials/fullname.html' will be used -->\n<h1>Welcome {{#user}}{{> fullname}}{{/user}} to the Admin Area</h1>\n{{> tasks}}\n```\n\nProduces the following HTML:\n\n```html\n<h1>Welcome John Smith to the Admin Area</h1>\n<ul>\n  <li><a href=\"/edit/0\">Edit the \"dishes\" task</a> or <a href=\"/delete/0\">delete it</a></li>\n  <li><a href=\"/edit/1\">Edit the \"mow lawn\" task</a> or <a href=\"/delete/1\">delete it</a></li>\n</ul>\n```\n\n**Note:** For performance reasons, partials are fetched when the application starts. You must restart your application for changes in partials to be reflected.\n\n### Request Filtering\n``` js\n// app/controllers/ApplicationController.js\nmodule.exports = function (app, config) {\n  return app.controllers.Base.extend(function () {\n    this.addBeforeFilter(this.requireAuth)\n    this.addExcludeFilter(['welcome'], this.requireAuth)\n  })\n  .methods({\n    requireAuth: function (callback) {\n      if (this.request.cookies.authed) return callback(null)\n      this.response.redirect('/welcome')\n    }\n  , welcome: function () {\n      this.render('welcome')\n    }\n  })\n}\n```\n\n### Routing\nThe `app/config/routes.js` file is where you specify an array of tuples indicating where incoming requests will map to a `controller` and the appropriate method. When a method isn't defined, it uses `index` by default.\n\nNesting routes under `root` will receive all bottom level routes at `/` - but you could also nest them under custom keys as illustrated below:\n\n``` js\nmodule.exports = {\n  root: [\n    ['get', '/', 'Home'] // maps to ./HomeController.js => index\n  ]\n, admin: [\n    ['get', '/', 'Admin', 'show'] // maps to ./admin/AdminController.js => show\n  ]\n}\n```\n\n### How can I organize my Models?\nBy default, Models are thin with just a Base and Application Model in place. You can give them some meat, for example, and embed [Mongo](http://mongoosejs.com) Schemas. See the following as a brief illustration:\n\n``` js\n// app/models/ApplicationModel.js\nmodule.exports = function (app, config) {\n  return app.getModel('Base', true).extend(function () {\n    this.mongo = require('mongodb')\n    this.mongoose = require('mongoose')\n    this.Schema = this.mongoose.Schema\n    this.mongoose.connect('mongodb://localhost/myapp')\n  })\n}\n```\n\nThen create, for example, a UserModel.js that extended it...\n\n``` js\nmodule.exports = function (app, config) {\n  return app.getModel('Application', true).extend(function () {\n    this.DBModel = this.mongoose.model('User', new this.Schema({\n        name: { type: String, required: true, trim: true }\n      , email: { type: String, required: true, lowercase: true, trim: true }\n    }))\n  })\n  .methods({\n    create: function (name, email, callback) {\n      var user = new this.DBModel({\n          name: name\n        , email: email\n      })\n      user.save(callback)\n    }\n  , find: function (id, callback) {\n      this.DBModel.findById(id, callback)\n    }\n  })\n}\n```\n\nThis provides a proper abstraction between controller logic and how your models interact with a database then return data back to controllers.\n\nTake special note that models do not have access to requests or responses, as they rightfully shouldn't.\n\n### Model & Controller Inheritance\nThe inheritance model Matador uses is built with [Klass](https://github.com/ded/klass), and is exposed via a global `Class` variable (not all globals are bad). Class comes in two flavors where by constructors can be set via an `initialize` method, or a function reference, and by default (in the scaffold), Matador uses the function reference style so that you may benefit from the auto-initialization of super classes, and there is no need to call `this.supr()` in your constructors.\n\n### Valentine\nThe Valentine module is included as a simple tool giving you type checking, functional iterators, and some other nice utilities that often get used in applications of any size. It is exposed globally as `v`. It is used liberally in the Matador router, thus feel free to take advantage of its existence as well.\n\n# Scaffolding\n\n    $ matador controller [name]\n    $ matador model [name]\n\n# Todo\nThere are always things to do. Our short-list currently includes the following:\n\n  * ~~build more scaffolding commands (for models, controllers, helpers)~~\n  * ~~better view partials support~~\n  * official docs\n\n\n# Contributing\n\nQuestions, pull requests, bug reports are all welcome. Submit them here on Github.\n\n# Authors\n\nObviously, [Dustin Senos](https://github.com/dustinsenos) & [Dustin Diaz](https://github.com/ded)\n\n# License\n\nCopyright 2012 [Obvious Corporation](http://obvious.com)\n\nLicensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0","maintainers":[{"name":"azulus","email":"npm@azulus.com"}],"time":{"modified":"2012-02-26T22:52:17.146Z","created":"2012-02-26T22:52:15.516Z","1.0.0":"2012-02-26T22:52:17.146Z"},"repository":{"type":"git","url":"git://github.com/Obvious/matador.git"},"_attachments":{"azzydor-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BbKozPvPf21AWVkKUo2MRQ==","length":12947,"stub":true}}}},
{"id":"b","key":"b","value":{"rev":"7-9e50fe1640b08a3aac105124df001223"},"doc":{"_id":"b","_rev":"7-9e50fe1640b08a3aac105124df001223","name":"b","description":"Benchmarks for Node.js.","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.0":{"name":"b","version":"0.0.0","description":"Benchmarks for Node.js.","keywords":["benchmarks","benchmarking"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{},"devDependencies":{"mocha":"0.3.3","should":"0.3.2"},"repository":{"type":"git","url":"git://github.com/vesln/b.git"},"homepage":"http://github.com/vesln/b","scripts":{"test":"make test"},"main":"./lib/index","engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"b@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"91a16cd77dea80ed0a972fab532bbdb9cf2e7924","tarball":"http://registry.npmjs.org/b/-/b-0.0.0.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}]},"0.0.1":{"name":"b","version":"0.0.1","description":"Benchmarks for Node.js.","keywords":["benchmarks","benchmarking"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2","super":"0.0.1"},"repository":{"type":"git","url":"git://github.com/vesln/b.git"},"homepage":"http://github.com/vesln/b","scripts":{"test":"make test"},"main":"./lib/index","engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"b@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"33fef479baa02a46045d53095db6a71e32375d7c","tarball":"http://registry.npmjs.org/b/-/b-0.0.1.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}]},"1.0.0":{"name":"b","version":"1.0.0","description":"Benchmarks for Node.js.","keywords":["benchmarks","benchmarking"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"devDependencies":{"mocha":"*","chai":"*"},"repository":{"type":"git","url":"git://github.com/vesln/b.git"},"homepage":"http://github.com/vesln/b","scripts":{"test":"make test"},"main":"./lib/b","engines":{"node":">= 0.6.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"b@1.0.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"31d7caac55032d0d80f60e53e880fc521658a3f3","tarball":"http://registry.npmjs.org/b/-/b-1.0.0.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}]}},"readme":"[![Build Status](https://secure.travis-ci.org/vesln/b.png)](http://travis-ci.org/vesln/b)\n\n# B -\n\n## Description\n\t\n## Features\n\n## Synopsis\n\n## Requirements\n\n- NPM (http://npmjs.org/)\n- Node.js 0.6 (http://nodejs.org/)\n\n## Install\n\n```\n$ npm install b\n```\n\n## Tests\n\n```\n$ npm install\n$ make test\n```\n\n## License\n\nMIT License\n\nCopyright (C) 2012 Veselin Todorov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","maintainers":[{"name":"vesln","email":"hi@vesln.com"}],"time":{"modified":"2012-05-17T19:10:53.586Z","created":"2012-01-27T18:10:33.232Z","0.0.0":"2012-01-27T18:10:35.125Z","0.0.1":"2012-01-27T21:24:30.542Z","1.0.0":"2012-05-17T19:10:53.586Z"},"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"repository":{"type":"git","url":"git://github.com/vesln/b.git"},"_attachments":{"b-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MCi+LV3JsAcNR8hs6BB8EA==","length":4027,"stub":true},"b-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vj8fTacMc+6YRPhjywnT0g==","length":3219,"stub":true},"b-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vOrd9G4c19QRrFov9MHEEw==","length":1574,"stub":true}}}},
{"id":"b-tree","key":"b-tree","value":{"rev":"5-31dff5e3f2baa091312d30f39feb7dc3"},"doc":{"_id":"b-tree","_rev":"5-31dff5e3f2baa091312d30f39feb7dc3","name":"b-tree","description":"Evented I/O B-tree in pure JavaScript for Node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"b-tree","description":"Evented I/O B-tree","url":"http://bigeasy.github.com/strata","keywords":["btree","database","json"],"author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"contributors":[],"devDependencies":{"coffee-script":">=1.1.3","proof":">=0.0.1"},"dependencies":{"streamline":">=0.2.4"},"lib":"lib","main":"./lib/strata","version":"0.0.1","scripts":{"test":"proof t/*/*.t"},"engines":{"node":"> 0.6.0"},"_npmUser":{"name":"bigeasy","email":"alan@prettyrobots.com"},"_id":"b-tree@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4ff9d0ccfc35ee977b747713ae6187b8c763947c","tarball":"http://registry.npmjs.org/b-tree/-/b-tree-0.0.1.tgz"},"readme":"","maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]},"0.0.2":{"name":"b-tree","version":"0.0.2","description":"Evented I/O B-tree in pure JavaScript for Node.js","url":"http://bigeasy.github.com/strata","keywords":["btree","database","json","b-tree"],"author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"contributors":[],"devDependencies":{"proof":"0.0.15"},"scripts":{"test":"proof t/*/*.t"},"engines":{"node":"> 0.6.0"},"homepage":"https://github.com/bigeasy/strata","licenses":[{"type":"MIT","url":"http://github.com/bigeasy/strata/raw/master/LICENSE"}],"repository":{"type":"git","url":"http://github.com/bigeasy/strta.git"},"readme":"<a href=\"http://www.flickr.com/photos/rickz/2207171252/\" title=\"&quot;The Wave&quot; by rickz, on Flickr\"><img src=\"http://farm3.staticflickr.com/2363/2207171252_6ebe988904_z.jpg?zz=1\" width=\"850\" height=\"567\" alt=\"&quot;The Wave&quot;\"></a>\n\n# Strata [![Build Status](https://secure.travis-ci.org/bigeasy/strata.png?branch=master)](http://travis-ci.org/bigeasy/strata)\n\nAn Evented I/O B-tree for Node.js.\n\n# Purpose\n\nStrata is part of a collection of database primitives that you can use to design\nyour own distributed databases for your Node.js applications.\n","_id":"b-tree@0.0.2","dist":{"shasum":"f3812cee3c4090e61ef49892085d5331d90dbd9a","tarball":"http://registry.npmjs.org/b-tree/-/b-tree-0.0.2.tgz"},"maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}]}},"readme":"","maintainers":[{"name":"bigeasy","email":"alan@prettyrobots.com"}],"time":{"modified":"2012-07-19T07:16:33.114Z","created":"2012-05-24T08:37:12.707Z","0.0.1":"2012-05-24T08:37:14.181Z","0.0.2":"2012-07-19T07:16:33.114Z"},"author":{"name":"Alan Gutierrez","email":"alan@prettyrobots.com"},"repository":{"type":"git","url":"http://github.com/bigeasy/strta.git"},"_attachments":{"b-tree-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-axbyO2SP3pUO0Xv90jShPg==","length":49880,"stub":true},"b-tree-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vuXXYI4L8MGRGG4qkA9Rzg==","length":55813,"stub":true}}}},
{"id":"b2g-scripts","key":"b2g-scripts","value":{"rev":"13-1e885b4c98a6d8db76a579123484f6c7"},"doc":{"_id":"b2g-scripts","_rev":"13-1e885b4c98a6d8db76a579123484f6c7","name":"b2g-scripts","description":"B2G/Gaia Helper Scripts","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.1":{"name":"b2g-scripts","version":"0.0.1","author":{"name":"James Lal","email":"jlal@mozilla.com"},"description":"B2G/Gaia Helper Scripts","main":"lib/index.js","preferGlobal":true,"bin":{"b2g-scripts":"bin/b2g-scripts"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"keywords":["b2g","cli","gaia","tools"],"dependencies":{"test-agent":"0.5.1","marionette-client":"0.3.0","match-files":"~0.1","optimist":"0.3.4"},"devDependencies":{},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"lights-of-apollo","email":"james@lightsofapollo.com"},"_id":"b2g-scripts@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"dc4fc77f8e7808fb0520802e5a4ba68f97d7f0f9","tarball":"http://registry.npmjs.org/b2g-scripts/-/b2g-scripts-0.0.1.tgz"},"maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}]},"0.1.0":{"name":"b2g-scripts","version":"0.1.0","author":{"name":"James Lal","email":"jlal@mozilla.com"},"description":"B2G/Gaia Helper Scripts","main":"lib/index.js","preferGlobal":true,"bin":{"b2g-scripts":"bin/b2g-scripts"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"keywords":["b2g","cli","gaia","tools"],"dependencies":{"test-agent":"0.5.1","marionette-client":"0.3.0","match-files":"~0.1","optimist":"0.3.4","node-static":"0.5.9"},"devDependencies":{},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"lights-of-apollo","email":"james@lightsofapollo.com"},"_id":"b2g-scripts@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f4503081ff858b58d290af9090103912eb89eb01","tarball":"http://registry.npmjs.org/b2g-scripts/-/b2g-scripts-0.1.0.tgz"},"maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}]},"0.2.0":{"name":"b2g-scripts","version":"0.2.0","author":{"name":"James Lal","email":"jlal@mozilla.com"},"description":"B2G/Gaia Helper Scripts","main":"lib/index.js","preferGlobal":true,"bin":{"b2g-scripts":"bin/b2g-scripts"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"keywords":["b2g","cli","gaia","tools"],"dependencies":{"test-agent":"0.5.1","marionette-client":"0.3.0","match-files":"~0.1","optimist":"0.3.4","node-static":"0.5.9"},"devDependencies":{},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"lights-of-apollo","email":"james@lightsofapollo.com"},"_id":"b2g-scripts@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"245ab4ccd5ae5bf50861410dc5865edcf7a6328f","tarball":"http://registry.npmjs.org/b2g-scripts/-/b2g-scripts-0.2.0.tgz"},"maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}]},"0.2.1":{"name":"b2g-scripts","version":"0.2.1","author":{"name":"James Lal","email":"jlal@mozilla.com"},"description":"B2G/Gaia Helper Scripts","main":"lib/index.js","preferGlobal":true,"bin":{"b2g-scripts":"bin/b2g-scripts"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"keywords":["b2g","cli","gaia","tools"],"dependencies":{"test-agent":"0.5.1","marionette-client":"0.3.0","match-files":"~0.1","optimist":"0.3.4","node-static":"0.5.9"},"devDependencies":{},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"lights-of-apollo","email":"james@lightsofapollo.com"},"_id":"b2g-scripts@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"d605c7dd4f1711ed02a8d7d42f4d6f710ca5bf67","tarball":"http://registry.npmjs.org/b2g-scripts/-/b2g-scripts-0.2.1.tgz"},"maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}]},"0.3.0":{"name":"b2g-scripts","version":"0.3.0","author":{"name":"James Lal","email":"jlal@mozilla.com"},"description":"B2G/Gaia Helper Scripts","main":"lib/index.js","preferGlobal":true,"bin":{"b2g-scripts":"bin/b2g-scripts"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"keywords":["b2g","cli","gaia","tools"],"dependencies":{"test-agent":"0.5.1","marionette-client":"0.3.0","match-files":"~0.1","optimist":"0.3.4","node-static":"0.5.9"},"devDependencies":{},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"lights-of-apollo","email":"james@lightsofapollo.com"},"_id":"b2g-scripts@0.3.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"cc472af15ee58bd3deeb59c9c4ecd5d3ed43bd71","tarball":"http://registry.npmjs.org/b2g-scripts/-/b2g-scripts-0.3.0.tgz"},"maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}]},"0.4.0":{"name":"b2g-scripts","version":"0.4.0","author":{"name":"James Lal","email":"jlal@mozilla.com"},"description":"B2G/Gaia Helper Scripts","main":"lib/index.js","preferGlobal":true,"bin":{"b2g-scripts":"bin/b2g-scripts"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"keywords":["b2g","cli","gaia","tools"],"dependencies":{"test-agent":"0.5.1","marionette-client":"0.3.0","match-files":"~0.1","optimist":"0.3.4","node-static":"0.5.9"},"devDependencies":{},"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"lights-of-apollo","email":"james@lightsofapollo.com"},"_id":"b2g-scripts@0.4.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7d6def451f3712646684f1f19db0260b20c532ef","tarball":"http://registry.npmjs.org/b2g-scripts/-/b2g-scripts-0.4.0.tgz"},"maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}]}},"readme":"# B2G Scripts\n\nContains a single cli script - `b2g-scripts` with a growing number of subcommands.\n\nIn general it is assumed you have a working b2g emulator/desktop/phone with \nmarionette turned on and listening on port 2828.\n\nCommands like reload-app are not going to be useful if your not in DEBUG mode\n(everything is in offline cache).\n\n## Install\n\n```` sh\n# notice the -g option for global\nnpm install b2g-scripts -g\n````\n\n## Recomended B2G Desktop settings\n\n``` sh\ncd $GAIA_DIR\nmake DEBUG=1\n```\n\n## Commands\n\nRun `b2g-scripts` with no arguments to see the list of current commands.\nEach command has sub options as well and all respond to the --help option.\n\n````sh\nb2g-scripts watch --help\n````\n\n### b2g-scripts watch\n\nWatches a directory for web dev changes js/css/html/properties files.\nExecutes a cli command. You can use this to chain other sub commands.\n\n```` sh\n# I use this all the time to reload app when I am making rapid\n# html/css changes\nb2g-scripts watch \"b2g-scripts reload-app\"\n````\n\n### b2g-scripts cmd\n\nRuns any of the marionette commands with _n_ number of arguments\n\n```` sh\nb2g-scripts cmd goUrl http://google.com\n````\n\n### b2g-scripts reload-app\n\nReloads currently running app.\n\n*warning* this is bound to the current implementation\nof gaia and _will_ break if that implementation changes.\n\n```` sh\nb2g-scripts reload-app\n````\n","maintainers":[{"name":"lights-of-apollo","email":"james@lightsofapollo.com"}],"time":{"modified":"2012-07-20T15:57:08.796Z","created":"2012-05-24T21:50:27.971Z","0.0.1":"2012-05-24T21:50:29.510Z","0.1.0":"2012-05-24T22:57:00.575Z","0.2.0":"2012-05-31T23:35:51.646Z","0.2.1":"2012-06-01T16:55:09.960Z","0.3.0":"2012-06-13T19:39:39.753Z","0.4.0":"2012-07-20T15:57:08.796Z"},"author":{"name":"James Lal","email":"jlal@mozilla.com"},"repository":{"type":"git","url":"git://github.com/lightsofapollo/b2g-scripts.git"},"_attachments":{"b2g-scripts-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-YHSHgKdk+Vd9UckjMIwTPA==","length":5381,"stub":true},"b2g-scripts-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-D37/1uf73eyooUrxNtG0cw==","length":5246,"stub":true},"b2g-scripts-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ilYRLPDpOIsXxyZoxfSJRQ==","length":4960,"stub":true},"b2g-scripts-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-GqEP/oaxPQt0fAzr/yAk3Q==","length":4894,"stub":true},"b2g-scripts-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WDLXLMYgN+XEmeGoJsjYBg==","length":4249,"stub":true},"b2g-scripts-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-p3a0V/kOvNqWkg/2N6fceg==","length":3297,"stub":true}}}},
{"id":"b64","key":"b64","value":{"rev":"5-dd7f282409a03379ab1df68ebe1d269c"},"doc":{"_id":"b64","_rev":"5-dd7f282409a03379ab1df68ebe1d269c","name":"b64","description":"Base64 encode and decode UTF-8 strings","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"author":{"name":"Nuno Job","email":"nunojobpinto@gmail.com"},"description":"Base64 encode and decode UTF-8 strings","name":"b64","tags":["base64","encode","decode","base 64","string"],"version":"1.0.0","repository":{"type":"git","url":"git://github.com/dscape/b64.git"},"engines":{"node":"~v0.4.8"},"_npmJsonOpts":{"file":"/Users/njob/.npm/b64/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"b64@1.0.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e1506c588a7d7bd31be964a39376c6b0183bcf4b","tarball":"http://registry.npmjs.org/b64/-/b64-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"dscape","email":"nunojobpinto@gmail.com"}]},"1.0.1":{"author":{"name":"Nuno Job","email":"nunojobpinto@gmail.com"},"description":"Base64 encode and decode UTF-8 strings","name":"b64","tags":["base64","encode","decode","base 64","string"],"version":"1.0.1","repository":{"type":"git","url":"git://github.com/dscape/b64.git"},"engines":{"node":">=v0.4.8"},"_npmUser":{"name":"dscape","email":"nunojobpinto@gmail.com"},"_id":"b64@1.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"6da89db8e270b23f42822e9b657ce6c66d16c1c2","tarball":"http://registry.npmjs.org/b64/-/b64-1.0.1.tgz"},"maintainers":[{"name":"dscape","email":"nunojobpinto@gmail.com"}]}},"maintainers":[{"name":"dscape","email":"nunojobpinto@gmail.com"}],"time":{"modified":"2011-11-19T18:25:31.905Z","created":"2011-08-04T22:22:11.144Z","1.0.0":"2011-08-04T22:22:13.789Z","1.0.1":"2011-11-19T18:25:31.905Z"},"author":{"name":"Nuno Job","email":"nunojobpinto@gmail.com"},"repository":{"type":"git","url":"git://github.com/dscape/b64.git"},"_attachments":{"b64-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qFuXKwugZE47ie+muof08Q==","length":10240,"stub":true},"b64-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HUO+K7+ipP+rD0vJ72DQ8Q==","length":1241,"stub":true}}}},
{"id":"b64url","key":"b64url","value":{"rev":"9-ab3b017f00a53b0078261254704c30ba"},"doc":{"_id":"b64url","_rev":"9-ab3b017f00a53b0078261254704c30ba","name":"b64url","description":"URL safe base64 encoding/decoding.","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"b64url","description":"URL safe base64 encoding/decoding.","version":"1.0.0","homepage":"https://github.com/nshah/nodejs-b64url","author":{"name":"Naitik Shah","email":"n@daaku.org"},"main":"lib/b64url","repository":{"type":"git","url":"git://github.com/nshah/nodejs-b64url.git"},"scripts":{"test":"./node_modules/.bin/expresso -c"},"devDependencies":{"expresso":">= 0.8.1"},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/naitik/.npm/b64url/1.0.0/package/package.json","wscript":false,"serverjs":false,"contributors":false},"_id":"b64url@1.0.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"952da8d3c1318be075621ade7c2b318e066d38e1","tarball":"http://registry.npmjs.org/b64url/-/b64url-1.0.0.tgz"},"maintainers":[{"name":"naitik","email":"n@daaku.org"}]},"1.0.1":{"name":"b64url","description":"URL safe base64 encoding/decoding.","version":"1.0.1","homepage":"https://github.com/nshah/nodejs-b64url","author":{"name":"Naitik Shah","email":"n@daaku.org"},"main":"lib/b64url","repository":{"type":"git","url":"git://github.com/nshah/nodejs-b64url.git"},"scripts":{"test":"./node_modules/.bin/expresso -c"},"devDependencies":{"expresso":">= 0.8.1"},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/naitik/.npm/b64url/1.0.1/package/package.json","wscript":false,"serverjs":false,"contributors":false},"_id":"b64url@1.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"aa1c5d836864a75285dcfc97daa67dba45b182a9","tarball":"http://registry.npmjs.org/b64url/-/b64url-1.0.1.tgz"},"maintainers":[{"name":"naitik","email":"n@daaku.org"}]},"1.0.2":{"name":"b64url","description":"URL safe base64 encoding/decoding.","version":"1.0.2","homepage":"https://github.com/nshah/nodejs-b64url","author":{"name":"Naitik Shah","email":"n@daaku.org"},"main":"lib/b64url","repository":{"type":"git","url":"git://github.com/nshah/nodejs-b64url.git"},"scripts":{"test":"./node_modules/.bin/expresso -c"},"devDependencies":{"expresso":">= 0.8.1"},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/naitik/.npm/b64url/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"b64url@1.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"79bd61a881898860a2ea1c00d6fb56017800ea32","tarball":"http://registry.npmjs.org/b64url/-/b64url-1.0.2.tgz"},"maintainers":[{"name":"naitik","email":"n@daaku.org"}]},"1.0.3":{"name":"b64url","description":"URL safe base64 encoding/decoding.","version":"1.0.3","homepage":"https://github.com/nshah/nodejs-b64url","author":{"name":"Naitik Shah","email":"n@daaku.org"},"main":"lib/b64url","repository":{"type":"git","url":"git://github.com/nshah/nodejs-b64url.git"},"scripts":{"test":"./node_modules/.bin/expresso -c"},"devDependencies":{"expresso":">= 0.8.1"},"engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/naitik/.npm/b64url/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"b64url@1.0.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"294dc436c4e5b5d6d8a4d9e4fc354f7bf37cc557","tarball":"http://registry.npmjs.org/b64url/-/b64url-1.0.3.tgz"},"maintainers":[{"name":"naitik","email":"n@daaku.org"}]}},"maintainers":[{"name":"naitik","email":"n@daaku.org"}],"time":{"modified":"2011-08-17T21:08:20.535Z","created":"2011-08-07T22:55:19.743Z","1.0.0":"2011-08-07T22:55:22.891Z","1.0.1":"2011-08-07T23:31:50.914Z","1.0.2":"2011-08-08T02:52:16.216Z","1.0.3":"2011-08-17T21:08:20.535Z"},"author":{"name":"Naitik Shah","email":"n@daaku.org"},"repository":{"type":"git","url":"git://github.com/nshah/nodejs-b64url.git"},"_attachments":{"b64url-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-X/drFMTMNG6buwn/f+5sSw==","length":868,"stub":true},"b64url-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-TrwVJ/hU0Vw9ImVkJR7qzg==","length":1428,"stub":true},"b64url-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cSwvkV8MgioKfkG6cwUodQ==","length":1440,"stub":true},"b64url-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rKPE+fA4AdISvoTZtvimdA==","length":1374,"stub":true}}}},
{"id":"ba","key":"ba","value":{"rev":"11-3cec7ec9a566fe95fbeb34271538d60a"},"doc":{"_id":"ba","_rev":"11-3cec7ec9a566fe95fbeb34271538d60a","name":"ba","description":"web client benchmark tool (the opposite of ab)","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"ba","description":"web client benchmark tool (the opposite of ab)","keywords":["web client benchmark","ab","ba"],"version":"0.0.1","preferGlobal":true,"config":{"publishtest":false},"homepage":"http://github.com/capotej/ba","author":{"name":"Julio Capote","email":"jcapote@gmail.com","url":"http://www.juliocapote.com"},"repository":{"type":"git","url":"git://github.com/capotej/ba.git"},"bugs":{"email":"jcapote@gmail.com","url":"http://github.com/capotej/ba/issues"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"main":"ba","bin":{"ba":"./bin/ba.js"},"dependencies":{},"bundleDependencies":[],"devDependencies":{},"engines":{"node":"0.4 || 0.5","npm":"1"},"scripts":{},"licenses":[{"type":"MIT","url":"http://github.com/isaacs/npm/raw/master/LICENSE"}],"_id":"ba@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"man":[],"dist":{"shasum":"df896f17c7fd6046395b240554ceb75508cd6384","tarball":"http://registry.npmjs.org/ba/-/ba-0.0.1.tgz"}},"0.0.2":{"name":"ba","description":"web client benchmark tool (the opposite of ab)","keywords":["web client benchmark","ab","ba"],"version":"0.0.2","preferGlobal":true,"config":{"publishtest":false},"homepage":"http://github.com/capotej/ba","author":{"name":"Julio Capote","email":"jcapote@gmail.com","url":"http://www.juliocapote.com"},"repository":{"type":"git","url":"git://github.com/capotej/ba.git"},"bugs":{"email":"jcapote@gmail.com","url":"http://github.com/capotej/ba/issues"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"main":"ba","bin":{"ba":"./bin/ba.js"},"dependencies":{},"bundleDependencies":[],"devDependencies":{},"engines":{"node":"0.4 || 0.5","npm":"1"},"scripts":{},"licenses":[{"type":"MIT","url":"http://github.com/isaacs/npm/raw/master/LICENSE"}],"_id":"ba@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"man":[],"dist":{"shasum":"aceaf840435d91f4910e6f9b2aa4a15c8d5a4b38","tarball":"http://registry.npmjs.org/ba/-/ba-0.0.2.tgz"}},"0.0.3":{"name":"ba","description":"web client benchmark tool (the opposite of ab)","keywords":["web client benchmark","ab","ba"],"version":"0.0.3","config":{"publishtest":false},"homepage":"http://github.com/capotej/ba","author":{"name":"Julio Capote","email":"jcapote@gmail.com","url":"http://www.juliocapote.com"},"repository":{"type":"git","url":"git://github.com/capotej/ba.git"},"bugs":{"email":"jcapote@gmail.com","url":"http://github.com/capotej/ba/issues"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"main":"ba","bin":{"ba":"./bin/ba"},"dependencies":{},"bundleDependencies":[],"devDependencies":{},"engines":{"node":"0.4 || 0.5","npm":"1"},"scripts":{},"licenses":[{"type":"MIT","url":"http://github.com/isaacs/npm/raw/master/LICENSE"}],"_id":"ba@0.0.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"man":[],"dist":{"shasum":"3bb586cb49ee4c6aa703d67c2b0e0dc9a169b7c6","tarball":"http://registry.npmjs.org/ba/-/ba-0.0.3.tgz"}},"0.0.4":{"name":"ba","description":"web client benchmark tool (the opposite of ab)","keywords":["web client benchmark","ab","ba"],"version":"0.0.4","config":{"publishtest":false},"homepage":"http://github.com/capotej/ba","author":{"name":"Julio Capote","email":"jcapote@gmail.com","url":"http://www.juliocapote.com"},"repository":{"type":"git","url":"git://github.com/capotej/ba.git"},"bugs":{"email":"jcapote@gmail.com","url":"http://github.com/capotej/ba/issues"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"main":"ba","bin":{"ba":"./bin/ba"},"dependencies":{},"bundleDependencies":[],"devDependencies":{},"engines":{"node":"0.4 || 0.5","npm":"1"},"scripts":{},"licenses":[{"type":"MIT","url":"http://github.com/isaacs/npm/raw/master/LICENSE"}],"_id":"ba@0.0.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"man":[],"dist":{"shasum":"058b0da335ecb8a695757a894de34f40143594b1","tarball":"http://registry.npmjs.org/ba/-/ba-0.0.4.tgz"}},"0.0.5":{"name":"ba","description":"web client benchmark tool (the opposite of ab)","preferGlobal":"true","keywords":["web client benchmark","ab","ba"],"version":"0.0.5","config":{"publishtest":false},"homepage":"http://github.com/capotej/ba","author":{"name":"Julio Capote","email":"jcapote@gmail.com","url":"http://www.juliocapote.com"},"repository":{"type":"git","url":"git://github.com/capotej/ba.git"},"bugs":{"email":"jcapote@gmail.com","url":"http://github.com/capotej/ba/issues"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"main":"ba","bin":{"ba":"./bin/ba"},"dependencies":{"cli":"0.3.6"},"bundleDependencies":[],"devDependencies":{},"engines":{"node":"0.4 || 0.5","npm":"1"},"scripts":{},"licenses":[{"type":"MIT","url":"http://github.com/isaacs/npm/raw/master/LICENSE"}],"_id":"ba@0.0.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"man":[],"dist":{"shasum":"fffa6f55076c569fe00810a6c79f7919fc215bfa","tarball":"http://registry.npmjs.org/ba/-/ba-0.0.5.tgz"}}},"maintainers":[{"name":"capotej","email":"jcapote@gmail.com"}],"time":{"modified":"2011-05-28T23:30:41.636Z","created":"2011-05-28T20:05:52.702Z","0.0.1":"2011-05-28T20:05:53.455Z","0.0.2":"2011-05-28T22:27:55.200Z","0.0.3":"2011-05-28T22:29:23.568Z","0.0.4":"2011-05-28T22:37:41.669Z","0.0.5":"2011-05-28T23:30:41.636Z"},"author":{"name":"Julio Capote","email":"jcapote@gmail.com","url":"http://www.juliocapote.com"},"repository":{"type":"git","url":"git://github.com/capotej/ba.git"},"_attachments":{"ba-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-EAizi4U4W01uxoYSDOCiJA==","length":1045,"stub":true},"ba-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-u2DW6S/aUqIX2q94LuLxAg==","length":896,"stub":true},"ba-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-jkFrEUt7vrE9f1/fnBeIAw==","length":895,"stub":true},"ba-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8IOx0CQzdGJxBqap4kVGkA==","length":912,"stub":true},"ba-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hNQZ7y4oVnscQ0Gl/bt+nw==","length":852,"stub":true}}}},
{"id":"babelfish","key":"babelfish","value":{"rev":"3-6a7a1d63e772773a6c2590ffc9a41e89"},"doc":{"_id":"babelfish","_rev":"3-6a7a1d63e772773a6c2590ffc9a41e89","name":"babelfish","description":"i18n with easy syntax for node.js","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"babelfish","version":"0.1.0","description":"i18n with easy syntax for node.js","keywords":["i18n"],"homepage":"https://github.com/nodeca/babelfish","author":{"name":"Aleksey V Zapparov","email":"ixti@member.fsf.org","url":"http://www.ixti.net/"},"bugs":{"url":"https://github.com/nodeca/babelfish/issues"},"license":{"type":"MIT","url":"https://github.com/nodeca/babelfish/blob/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/nodeca/babelfish.git"},"main":"./index.js","scripts":{"test":"make test"},"dependencies":{"underscore":"~ 1.3.3"},"devDependencies":{"vows":"~ 0.6.1","collector":"git://github.com/nodeca/collector.git","pegjs":"~> 0.7.0"},"engines":{"node":"> 0.4.11"},"readme":"BabelFish - i18n for node.js\n============================\n\n[![Build Status](https://secure.travis-ci.org/nodeca/babelfish.png)](http://travis-ci.org/nodeca/babelfish)\n\nInternationalisation with easy syntax for node.js. Classic solutions use multiple phrases\nfor plurals. But we define plurals inline - that's more compact, and easier to maintain.\nAlso, phrases are grouped into nested scopes, like in Ruby.\n\nWe support all pluralisation rules from [unicode CLDR](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html),\nversion [2.0.1](http://cldr.unicode.org/index/downloads).\n\n\nIf you need cli tools to generate language files - see [babelfish.tools](https://github.com/nodeca/babelfish.tools).\n\n\n## Phrases Syntax\n\n-  `#{varname}` Echoes value of variable\n-  `((Singular|Plural1|Plural2)):count` Plural form\n\nexample:\n\n    А у меня в кармане #{nails_count} ((гвоздь|гвоздя|гвоздей)):nails_count\n\nYou can also omit anchor variable for plurals, by default it will be `count`.\nThus following variants are equal:\n\n- `I have #{count} ((nail|nails))`\n- `I have #{count} ((nail|nails)):count`\n\n\n#### Escape chars\n\nIf you need `#{`, `((`, `|` or `))` somewhere in text, where it can be considered\nas markup part - just escape them with `\\`.\n\n\n#### Example with YAML\n\nAs BabelFish supports scopes, it's really fun and nice to store translations in\nYAML files:\n\n    ---\n    ru-RU:\n      profile: Профиль\n      forums: Форумы\n      apps:\n        forums:\n          new_topic: Новая тема\n          last_post:\n            title : Последнее сообщение\n            by : от\n      demo:\n        apples: \"На столе лежит #{apples.count} ((яблоко|яблока|яблок)):apples.count\"\n\n\n## Usage\n\n    // Create new instance of BabelFish with default lnguage/locale: 'en'\n    var i18n = require('babelfish').create('en-GB');\n\n\n    // Fill in some phrases\n    i18n.addPhrase('en-GB', 'demo.hello',         'Hello, #{user.name}.');\n    i18n.addPhrase('en-GB', 'demo.conv.wazup',    'Whats up?');\n    i18n.addPhrase('en-GB', 'demo.conv.alright',  'Alright, man!');\n\n    i18n.addPhrase('ru-RU', 'demo.hello',         'Привет, #{user.name}.');\n    i18n.addPhrase('ru-RU', 'demo.conv.wazup',    'Как дела?');\n\n    i18n.addPhrase('uk-UA', 'demo.hello',         'Здоровенькі були, #{user.name}.');\n\n\n    // Set locale fallback so we use most appropriate translation\n    i18n.setLocaleFallback('uk-UA', 'ru-RU');\n\n\n    // Translate\n    var params = {user: {name: 'ixti'}};\n\n    i18n.t('ru-RU', 'demo.hello', params);  // -> 'Привет, ixti.'\n    i18n.t('ru-RU', 'demo.conv.wazup');     // -> 'Как дела?'\n    i18n.t('ru-RU', 'demo.conv.alright');   // -> 'Alright, man!'\n\n    i18n.t('uk-UA', 'demo.hello', params);  // -> 'Здоровенькі були, ixti.'\n    i18n.t('uk-UA', 'demo.conv.wazup');     // -> 'Как дела?'\n    i18n.t('uk-UA', 'demo.conv.alright');   // -> 'Alright, man!'\n\n\n    // Get compiled phrase or all phrases within scope.\n    i18n.getTranslation('ru-RU', 'demo');\n    // -> { hello : [Function],\n    //      conv  : { wazup   : 'Как дела?',\n    //                alright : 'Alright, man!' } }\n\n    // You may want to get translations within only one level of the scope\n    // This might be useful for exporting translations partially to browser\n    i18n.getTranslation('ru-RU', 'demo', {deep: false});\n    // -> { hello : [Function] }\n\n    i18n.getTranslation('ru-RU', 'demo.hello');\n    // -> [Function]\n\n\n## License\n\nView the [LICENSE](https://github.com/nodeca/babelfish.tools/blob/master/LICENSE) file (MIT).\n","_id":"babelfish@0.1.0","dist":{"shasum":"0c0b53c5b8384b7d6809f170a5eec9c28f600a2f","tarball":"http://registry.npmjs.org/babelfish/-/babelfish-0.1.0.tgz"},"maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}]}},"readme":"BabelFish - i18n for node.js\n============================\n\n[![Build Status](https://secure.travis-ci.org/nodeca/babelfish.png)](http://travis-ci.org/nodeca/babelfish)\n\nInternationalisation with easy syntax for node.js. Classic solutions use multiple phrases\nfor plurals. But we define plurals inline - that's more compact, and easier to maintain.\nAlso, phrases are grouped into nested scopes, like in Ruby.\n\nWe support all pluralisation rules from [unicode CLDR](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html),\nversion [2.0.1](http://cldr.unicode.org/index/downloads).\n\n\nIf you need cli tools to generate language files - see [babelfish.tools](https://github.com/nodeca/babelfish.tools).\n\n\n## Phrases Syntax\n\n-  `#{varname}` Echoes value of variable\n-  `((Singular|Plural1|Plural2)):count` Plural form\n\nexample:\n\n    А у меня в кармане #{nails_count} ((гвоздь|гвоздя|гвоздей)):nails_count\n\nYou can also omit anchor variable for plurals, by default it will be `count`.\nThus following variants are equal:\n\n- `I have #{count} ((nail|nails))`\n- `I have #{count} ((nail|nails)):count`\n\n\n#### Escape chars\n\nIf you need `#{`, `((`, `|` or `))` somewhere in text, where it can be considered\nas markup part - just escape them with `\\`.\n\n\n#### Example with YAML\n\nAs BabelFish supports scopes, it's really fun and nice to store translations in\nYAML files:\n\n    ---\n    ru-RU:\n      profile: Профиль\n      forums: Форумы\n      apps:\n        forums:\n          new_topic: Новая тема\n          last_post:\n            title : Последнее сообщение\n            by : от\n      demo:\n        apples: \"На столе лежит #{apples.count} ((яблоко|яблока|яблок)):apples.count\"\n\n\n## Usage\n\n    // Create new instance of BabelFish with default lnguage/locale: 'en'\n    var i18n = require('babelfish').create('en-GB');\n\n\n    // Fill in some phrases\n    i18n.addPhrase('en-GB', 'demo.hello',         'Hello, #{user.name}.');\n    i18n.addPhrase('en-GB', 'demo.conv.wazup',    'Whats up?');\n    i18n.addPhrase('en-GB', 'demo.conv.alright',  'Alright, man!');\n\n    i18n.addPhrase('ru-RU', 'demo.hello',         'Привет, #{user.name}.');\n    i18n.addPhrase('ru-RU', 'demo.conv.wazup',    'Как дела?');\n\n    i18n.addPhrase('uk-UA', 'demo.hello',         'Здоровенькі були, #{user.name}.');\n\n\n    // Set locale fallback so we use most appropriate translation\n    i18n.setLocaleFallback('uk-UA', 'ru-RU');\n\n\n    // Translate\n    var params = {user: {name: 'ixti'}};\n\n    i18n.t('ru-RU', 'demo.hello', params);  // -> 'Привет, ixti.'\n    i18n.t('ru-RU', 'demo.conv.wazup');     // -> 'Как дела?'\n    i18n.t('ru-RU', 'demo.conv.alright');   // -> 'Alright, man!'\n\n    i18n.t('uk-UA', 'demo.hello', params);  // -> 'Здоровенькі були, ixti.'\n    i18n.t('uk-UA', 'demo.conv.wazup');     // -> 'Как дела?'\n    i18n.t('uk-UA', 'demo.conv.alright');   // -> 'Alright, man!'\n\n\n    // Get compiled phrase or all phrases within scope.\n    i18n.getTranslation('ru-RU', 'demo');\n    // -> { hello : [Function],\n    //      conv  : { wazup   : 'Как дела?',\n    //                alright : 'Alright, man!' } }\n\n    // You may want to get translations within only one level of the scope\n    // This might be useful for exporting translations partially to browser\n    i18n.getTranslation('ru-RU', 'demo', {deep: false});\n    // -> { hello : [Function] }\n\n    i18n.getTranslation('ru-RU', 'demo.hello');\n    // -> [Function]\n\n\n## License\n\nView the [LICENSE](https://github.com/nodeca/babelfish.tools/blob/master/LICENSE) file (MIT).\n","maintainers":[{"name":"vitaly","email":"vitaly@rcdesign.ru"}],"time":{"modified":"2012-08-14T05:08:28.913Z","created":"2012-08-14T05:08:26.588Z","0.1.0":"2012-08-14T05:08:28.913Z"},"author":{"name":"Aleksey V Zapparov","email":"ixti@member.fsf.org","url":"http://www.ixti.net/"},"repository":{"type":"git","url":"git://github.com/nodeca/babelfish.git"},"_attachments":{"babelfish-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AKWq2GI5WN64Tca1qAPmng==","length":22435,"stub":true}}}},
{"id":"babelweb","key":"babelweb","value":{"rev":"13-cab913f1b8fb85b38cd6cef6611e647b"},"doc":{"_id":"babelweb","_rev":"13-cab913f1b8fb85b38cd6cef6611e647b","name":"babelweb","description":"Web-based monitoring tool for the Babel routing protocol","dist-tags":{"latest":"0.2.4"},"versions":{"0.1.0":{"name":"babelweb","version":"0.1.0","description":"Web-based monitoring tool for the Babel routing protocol","homepage":"http://www.pps.jussieu.fr/~kerneis/software","keywords":["babel","routing","monitoring"],"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"scripts":{"start":"./bin/babelweb"},"dependencies":{"socket.io":"0.7.x","connect":"1.6.x"},"devDependencies":{"ronn":"0.3.x"},"engines":{"node":"0.4.x"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"bin":{"babelweb":"./bin/babelweb"},"preferGlobal":true,"licenses":[{"type":"MIT","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE"},{"type":"3-clause BSD","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE.d3"}],"_npmJsonOpts":{"file":"/home/gabriel/.npm/babelweb/0.1.0/package/package.json","wscript":false,"serverjs":true,"contributors":["Gabriel Kerneis <kerneis@pps.jussieu.fr> (http://www.pps.jussieu.fr/~kerneis/)"]},"_id":"babelweb@0.1.0","contributors":[{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"}],"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"man":["man1/babelweb-changelog.1","man1/babelweb.1"],"dist":{"shasum":"84b345f3abea511cb468f4da11e91f607cffb57f","tarball":"http://registry.npmjs.org/babelweb/-/babelweb-0.1.0.tgz"},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}]},"0.2.0":{"name":"babelweb","version":"0.2.0","description":"Web-based monitoring tool for the Babel routing protocol","homepage":"http://www.pps.jussieu.fr/~kerneis/software/babelweb","keywords":["babel","routing","monitoring"],"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"scripts":{"start":"./bin/babelweb"},"dependencies":{"socket.io":"0.7.x","connect":"1.6.x"},"devDependencies":{"ronn":"0.3.x"},"engines":{"node":"0.4.x"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"bin":{"babelweb":"./bin/babelweb"},"preferGlobal":true,"licenses":[{"type":"MIT","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE"},{"type":"3-clause BSD","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE.d3"}],"_npmJsonOpts":{"file":"/home/gabriel/.npm/babelweb/0.2.0/package/package.json","wscript":false,"serverjs":true,"contributors":["Gabriel Kerneis <kerneis@pps.jussieu.fr> (http://www.pps.jussieu.fr/~kerneis/)"]},"_id":"babelweb@0.2.0","contributors":[{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"}],"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"man":["man1/babelweb-changelog.1","man1/babelweb.1"],"dist":{"shasum":"b103e24627f1a885e28ee490b78a77d651d657ea","tarball":"http://registry.npmjs.org/babelweb/-/babelweb-0.2.0.tgz"},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}]},"0.2.1":{"name":"babelweb","version":"0.2.1","description":"Web-based monitoring tool for the Babel routing protocol","homepage":"http://www.pps.jussieu.fr/~kerneis/software/babelweb","keywords":["babel","routing","monitoring"],"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"scripts":{"start":"./bin/babelweb"},"dependencies":{"socket.io":"0.7.x","connect":"1.6.x"},"devDependencies":{"ronn":"0.3.x"},"engines":{"node":"0.4.x"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"bin":{"babelweb":"./bin/babelweb"},"preferGlobal":true,"licenses":[{"type":"MIT","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE"},{"type":"3-clause BSD","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE.d3"}],"_npmJsonOpts":{"file":"/home/kerneis/.npm/babelweb/0.2.1/package/package.json","wscript":false,"serverjs":true,"contributors":["Gabriel Kerneis <kerneis@pps.jussieu.fr> (http://www.pps.jussieu.fr/~kerneis/)"]},"_id":"babelweb@0.2.1","contributors":[{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"}],"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"man":["man1/babelweb.1","man1/babelweb-changelog.1"],"dist":{"shasum":"5184928c45937ccf1c455a607e08a7e77896d054","tarball":"http://registry.npmjs.org/babelweb/-/babelweb-0.2.1.tgz"},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}]},"0.2.2":{"name":"babelweb","version":"0.2.2","description":"Web-based monitoring tool for the Babel routing protocol","homepage":"http://www.pps.jussieu.fr/~kerneis/software/babelweb","keywords":["babel","routing","monitoring"],"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"scripts":{"start":"./bin/babelweb"},"dependencies":{"socket.io":"0.7.x","connect":"1.6.x"},"devDependencies":{"ronn":"0.3.x"},"engines":{"node":"0.4.x"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"bin":{"babelweb":"./bin/babelweb"},"preferGlobal":true,"licenses":[{"type":"MIT","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE"},{"type":"3-clause BSD","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE.d3"}],"_npmJsonOpts":{"file":"/home/kerneis/.npm/babelweb/0.2.2/package/package.json","wscript":false,"serverjs":true,"contributors":["Gabriel Kerneis <kerneis@pps.jussieu.fr> (http://www.pps.jussieu.fr/~kerneis/)"]},"_id":"babelweb@0.2.2","contributors":[{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"}],"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"man":["man1/babelweb.1","man1/babelweb-changelog.1"],"dist":{"shasum":"b85ed160dd3c3755ff50854d594393ca6e830ee0","tarball":"http://registry.npmjs.org/babelweb/-/babelweb-0.2.2.tgz"},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}]},"0.2.3":{"name":"babelweb","version":"0.2.3","description":"Web-based monitoring tool for the Babel routing protocol","homepage":"http://www.pps.jussieu.fr/~kerneis/software/babelweb","keywords":["babel","routing","monitoring"],"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"scripts":{"start":"./bin/babelweb","preinstall":"node-waf clean || true; node-waf configure build"},"dependencies":{"socket.io":"0.7.x","connect":"1.6.x"},"devDependencies":{"ronn":"0.3.x"},"engines":{"node":"0.4.x"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"bin":{"babelweb":"./bin/babelweb"},"preferGlobal":true,"licenses":[{"type":"MIT","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE"},{"type":"3-clause BSD","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE.d3"}],"_npmJsonOpts":{"file":"/home/kerneis/.npm/babelweb/0.2.3/package/package.json","serverjs":true,"wscript":true,"contributors":["Gabriel Kerneis <kerneis@pps.jussieu.fr> (http://www.pps.jussieu.fr/~kerneis/)"]},"_id":"babelweb@0.2.3","contributors":[{"name":"Gabriel Kerneis","email":"kerneis@pps.jussieu.fr","url":"http://www.pps.jussieu.fr/~kerneis/"}],"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"man":["man1/babelweb.1","man1/babelweb-changelog.1"],"dist":{"shasum":"3eb5e4b303e46893e552d043fb9bb2db79e17496","tarball":"http://registry.npmjs.org/babelweb/-/babelweb-0.2.3.tgz"},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}]},"0.2.4":{"name":"babelweb","version":"0.2.4","description":"Web-based monitoring tool for the Babel routing protocol","homepage":"http://www.pps.univ-paris-diderot.fr/~kerneis/software/babelweb","keywords":["babel","routing","monitoring"],"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.univ-paris-diderot.fr","url":"http://www.pps.univ-paris-diderot.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"scripts":{"start":"./bin/babelweb","preinstall":"node-waf clean || true; node-waf configure build"},"dependencies":{"socket.io":"0.7.x","connect":"1.7.x"},"devDependencies":{"ronn":"0.3.x"},"engines":{"node":"0.6.x"},"directories":{"doc":"./doc","man":"./man1","bin":"./bin"},"bin":{"babelweb":"./bin/babelweb"},"preferGlobal":true,"licenses":[{"type":"MIT","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE"},{"type":"3-clause BSD","url":"http://github.com/kerneis/babelweb/raw/master/LICENSE.d3"}],"_npmJsonOpts":{"file":"/home/kerneis/.npm/babelweb/0.2.4/package/package.json","serverjs":true,"wscript":true,"contributors":["Gabriel Kerneis <kerneis@pps.univ-paris-diderot.fr> (http://www.pps.univ-paris-diderot.fr/~kerneis/)"]},"_id":"babelweb@0.2.4","contributors":[{"name":"Gabriel Kerneis","email":"kerneis@pps.univ-paris-diderot.fr","url":"http://www.pps.univ-paris-diderot.fr/~kerneis/"}],"_engineSupported":false,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"man":["man1/babelweb.1","man1/babelweb-changelog.1"],"dist":{"shasum":"46c6432406533de8e8967dc50b9316c9bcdd1874","tarball":"http://registry.npmjs.org/babelweb/-/babelweb-0.2.4.tgz"},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}]}},"maintainers":[{"name":"kerneis","email":"kerneis@pps.jussieu.fr"}],"time":{"modified":"2012-05-29T14:22:30.272Z","created":"2011-08-02T23:38:58.845Z","0.1.0":"2011-08-02T23:39:00.763Z","0.2.0":"2011-08-05T23:17:45.123Z","0.2.1":"2011-08-08T16:31:55.467Z","0.2.2":"2011-08-29T08:47:25.261Z","0.2.3":"2011-09-07T12:20:13.064Z","0.2.4":"2012-05-29T14:22:30.272Z"},"author":{"name":"Gabriel Kerneis","email":"kerneis@pps.univ-paris-diderot.fr","url":"http://www.pps.univ-paris-diderot.fr/~kerneis/"},"repository":{"type":"git","url":"git://kerneis.info/babelweb"},"_attachments":{"babelweb-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-QR7Qz8RNNwCOhwIkI+z2Yg==","length":104448,"stub":true},"babelweb-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-WutbD1wOFxXvLWSqoquoiQ==","length":78575,"stub":true},"babelweb-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-i6GGaB4N8RgPjEKoo8U14g==","length":77578,"stub":true},"babelweb-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-q0q37ra7pw1LlHPAMrl/Yw==","length":77553,"stub":true},"babelweb-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OgMh7V6w+Aa4jOUvvAvJWw==","length":76995,"stub":true},"babelweb-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sn9i8PCbEPQDQjL9O5F0XA==","length":34786,"stub":true}}}},
{"id":"backbone","key":"backbone","value":{"rev":"56-f5ffde5cceb3b7511a0bfc842bb33f3a"},"doc":{"_id":"backbone","_rev":"56-f5ffde5cceb3b7511a0bfc842bb33f3a","name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","dist-tags":{"stable":"0.9.2","latest":"0.9.2"},"versions":{"0.1.1":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{},"lib":".","main":"backbone","version":"0.1.1","_id":"backbone@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.1.1.tgz"},"directories":{}},"0.1.2":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone","version":"0.1.2","_id":"backbone@0.1.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.1.2.tgz"},"directories":{}},"0.2.0":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone","version":"0.2.0","_id":"backbone@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.2.0.tgz"},"directories":{}},"0.3.0":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone","version":"0.3.0","_id":"backbone@0.3.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.3.0.tgz"},"directories":{}},"0.3.1":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone","version":"0.3.1","_id":"backbone@0.3.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-3","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.3.1.tgz"},"directories":{}},"0.3.2":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone","version":"0.3.2","_id":"backbone@0.3.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.5","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.3.2.tgz"},"directories":{}},"0.3.3":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone","version":"0.3.3","_id":"backbone@0.3.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.2.5","dist":{"tarball":"http://registry.npmjs.org/backbone/-/backbone-0.3.3.tgz"},"directories":{}},"0.5.0":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone.js","version":"0.5.0","devDependencies":{},"_id":"backbone@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"718b70d8d742fcee2408795d9483c4d411959292","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.5.0.tgz"},"scripts":{},"directories":{}},"0.5.1":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone.js","version":"0.5.1","devDependencies":{},"_id":"backbone@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"5a67431e550c87d2a7c3be93ec7d16e470d339c6","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.5.1.tgz"},"scripts":{},"directories":{}},"0.5.2":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone.js","version":"0.5.2","devDependencies":{},"_id":"backbone@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"84bbfc9b7712aada8e11e145e6174a820c5e8e89","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.5.2.tgz"},"scripts":{},"directories":{}},"0.5.3":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":".","main":"backbone.js","version":"0.5.3","_npmJsonOpts":{"file":"/Users/jashkenas/.npm/backbone/0.5.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone@0.5.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f606cc6b4f7c7600d83bd4fa3e7737024df175f8","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.5.3.tgz"},"scripts":{},"maintainers":[{"name":"jashkenas","email":"jashkenas@gmail.com"}],"directories":{}},"0.9.0":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://backbonejs.org","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.3.1"},"lib":".","main":"backbone.js","version":"0.9.0","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"backbone@0.9.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"436ce3fe27129d545e073ee675e96377c3b61993","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.9.0.tgz"},"maintainers":[{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"0.9.1":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://backbonejs.org","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.3.1"},"lib":".","main":"backbone.js","version":"0.9.1","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"backbone@0.9.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1c57bb766394b2ed879bd8317fe0ca02568b288a","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.9.1.tgz"},"maintainers":[{"name":"jashkenas","email":"jashkenas@gmail.com"}]},"0.9.2":{"name":"backbone","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://backbonejs.org","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.3.1"},"lib":".","main":"backbone.js","version":"0.9.2","_npmUser":{"name":"jashkenas","email":"jashkenas@gmail.com"},"_id":"backbone@0.9.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"53537bc2eaa85b615faf11de1622c03d26371be5","tarball":"http://registry.npmjs.org/backbone/-/backbone-0.9.2.tgz"},"readme":"     ____                     __      __                                                 \n    /\\  _`\\                  /\\ \\    /\\ \\                                   __           \n    \\ \\ \\ \\ \\     __      ___\\ \\ \\/'\\\\ \\ \\____    ___     ___      __      /\\_\\    ____  \n     \\ \\  _ <'  /'__`\\   /'___\\ \\ , < \\ \\ '__`\\  / __`\\ /' _ `\\  /'__`\\    \\/\\ \\  /',__\\ \n      \\ \\ \\ \\ \\/\\ \\ \\.\\_/\\ \\__/\\ \\ \\\\`\\\\ \\ \\ \\ \\/\\ \\ \\ \\/\\ \\/\\ \\/\\  __/  __ \\ \\ \\/\\__, `\\\n       \\ \\____/\\ \\__/.\\_\\ \\____\\\\ \\_\\ \\_\\ \\_,__/\\ \\____/\\ \\_\\ \\_\\ \\____\\/\\_\\_\\ \\ \\/\\____/\n        \\/___/  \\/__/\\/_/\\/____/ \\/_/\\/_/\\/___/  \\/___/  \\/_/\\/_/\\/____/\\/_/\\ \\_\\ \\/___/ \n                                                                           \\ \\____/      \n                                                                            \\/___/       \n    (_'_______________________________________________________________________________'_)\n    (_.———————————————————————————————————————————————————————————————————————————————._)\n                                               \n                                              \nBackbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.\n\nFor Docs, License, Tests, pre-packed downloads, and everything else, really, see:\nhttp://backbonejs.org\n\nTo suggest a feature, report a bug, or general discussion:\nhttp://github.com/documentcloud/backbone/issues/\n\nAll contributors are listed here:\nhttp://github.com/documentcloud/backbone/contributors\n\nSpecial thanks to Robert Kieffer for the original philosophy behind Backbone. \nhttp://github.com/broofa\n","maintainers":[{"name":"jashkenas","email":"jashkenas@gmail.com"}]}},"maintainers":[{"name":"jashkenas","email":"jashkenas@gmail.com"}],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"time":{"modified":"2012-08-09T20:13:28.847Z","created":"2011-07-01T17:58:59.581Z","0.1.1":"2011-07-01T17:58:59.581Z","0.1.2":"2011-07-01T17:58:59.581Z","0.2.0":"2011-07-01T17:58:59.581Z","0.3.0":"2011-07-01T17:58:59.581Z","0.3.1":"2011-07-01T17:58:59.581Z","0.3.2":"2011-07-01T17:58:59.581Z","0.3.3":"2011-07-01T17:58:59.581Z","0.5.0":"2011-07-01T17:58:59.581Z","0.5.1":"2011-07-05T14:00:26.305Z","0.5.2":"2011-07-26T17:32:13.339Z","0.5.3":"2011-08-09T14:39:31.451Z","0.9.0":"2012-01-30T21:25:46.270Z","0.9.1":"2012-02-02T21:55:21.701Z","0.9.2":"2012-03-21T18:57:24.034Z"},"users":{"dodo":true,"bat":true,"sjonnet":true,"fgribreau":true,"sjonnet19":true,"gillesruppert":true},"_attachments":{"backbone-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-eMIGZjYnzSQxhWqxznO98g==","length":7122031,"stub":true},"backbone-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-aYI2jGwt4yC3B0ZZ/KJjrQ==","length":11868160,"stub":true},"backbone-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-jPAfNw3z+WUj3/2Mit0ZRg==","length":61440,"stub":true},"backbone-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-Lewi3wA72C+z4K+M1YUhIg==","length":4979529,"stub":true},"backbone-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-yvLVHkaeHJrpIgmuNrrY8w==","length":3173122,"stub":true},"backbone-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-MBR/r3qnNgGu15qFXve7sQ==","length":2448206,"stub":true},"backbone-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-djKr/apvS05wFWFhvE9ITg==","length":2449789,"stub":true},"backbone-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-wHKS/oRGW6lyGaSDxJj7OQ==","length":610344,"stub":true},"backbone-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-xa7fchteOAUyzgYbuqaXUA==","length":605716,"stub":true},"backbone-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Fg7jw8vLDFQP+YTqiPnRfg==","length":408573,"stub":true},"backbone-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-HGKIpWfNPoLu0UbOwZDeHQ==","length":409489,"stub":true},"backbone-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gVeNbsU/E/ReKUMGKnU3Ww==","length":247211,"stub":true},"backbone-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RZDIfpxIzwpEU+7ML57IvA==","length":244712,"stub":true},"backbone-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uBObv1LUluGbLBt9EpYsyA==","length":240203,"stub":true}}}},
{"id":"backbone-articulation","key":"backbone-articulation","value":{"rev":"15-a513990961022c96ee8264b07bb6698e"},"doc":{"_id":"backbone-articulation","_rev":"15-a513990961022c96ee8264b07bb6698e","name":"backbone-articulation","description":"Backbone-Articulation.js enhances Backbone.js model attributes with object serialization and deserialization","dist-tags":{"latest":"0.3.3"},"versions":{"0.3.1":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"backbone-articulation","description":"Backbone-Articulation.js enhances Backbone.js model attributes with object serialization and deserialization","keywords":["backbone-articulation","backbone-articulationjs","backbone","backbonejs","backbone-relational","backbone-rel"],"url":"http://kmalakoff.github.com/backbone-articulation/","homepage":"http://kmalakoff.github.com/backbone-articulation/","repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-articulation.git"},"optionalDependencies":{"underscore":">=1.3.3","backbone":">=0.9.2","json-serialize":">=1.1.1","lifecycle":">=1.0.1"},"main":"backbone-articulation.js","version":"0.3.1","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-articulation@0.3.1","dependencies":{"underscore":">=1.3.3","backbone":">=0.9.2","json-serialize":">=1.1.1","lifecycle":">=1.0.1"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"be1a2b46b973932f04cf049ffd1384c4da06d335","tarball":"http://registry.npmjs.org/backbone-articulation/-/backbone-articulation-0.3.1.tgz"},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"directories":{}},"0.3.2":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"backbone-articulation","description":"Backbone-Articulation.js enhances Backbone.js model attributes with object serialization and deserialization","keywords":["backbone-articulation","backbone-articulationjs","backbone","backbonejs","backbone-relational","backbone-rel"],"url":"http://kmalakoff.github.com/backbone-articulation/","homepage":"http://kmalakoff.github.com/backbone-articulation/","repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-articulation.git"},"optionalDependencies":{"underscore":">=1.3.3","backbone":">=0.9.2","json-serialize":">=1.1.1","lifecycle":">=1.0.1"},"main":"backbone-articulation.js","version":"0.3.2","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-articulation@0.3.2","dependencies":{"underscore":">=1.3.3","backbone":">=0.9.2","json-serialize":">=1.1.1","lifecycle":">=1.0.1"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"eedefec09a131f879f88f4cb6aed2791a059b394","tarball":"http://registry.npmjs.org/backbone-articulation/-/backbone-articulation-0.3.2.tgz"},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"directories":{}},"0.3.3":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"backbone-articulation","description":"Backbone-Articulation.js enhances Backbone.js model attributes with object serialization and deserialization","keywords":["backbone-articulation","backbone-articulationjs","backbone","backbonejs","backbone-relational","backbone-rel"],"url":"http://kmalakoff.github.com/backbone-articulation/","homepage":"http://kmalakoff.github.com/backbone-articulation/","repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-articulation.git"},"optionalDependencies":{"underscore":">=1.3.3","backbone":">=0.9.2","json-serialize":">=1.1.1","lifecycle":">=1.0.1"},"main":"backbone-articulation.js","version":"0.3.3","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-articulation@0.3.3","dependencies":{"underscore":">=1.3.3","backbone":">=0.9.2","json-serialize":">=1.1.1","lifecycle":">=1.0.1"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"41364340231d4761e81e26ad25c5bf97f70af447","tarball":"http://registry.npmjs.org/backbone-articulation/-/backbone-articulation-0.3.3.tgz"},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}]}},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"time":{"modified":"2012-07-10T02:55:19.291Z","created":"2012-06-15T11:03:31.679Z","0.3.1":"2012-06-15T11:03:34.892Z","0.3.2":"2012-06-16T13:22:12.126Z","0.3.3":"2012-07-10T02:55:19.291Z"},"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-articulation.git"},"_attachments":{"backbone-articulation-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-y9XqsLsgpkP7+jkRcFQNTw==","length":4499,"stub":true},"backbone-articulation-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7jnTFz8fFMQLjmqY3NDqMw==","length":4392,"stub":true},"backbone-articulation-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Kd38ybf54UEAXx/EDnjgfw==","length":3420,"stub":true}}}},
{"id":"backbone-browserify","key":"backbone-browserify","value":{"rev":"11-24d23a40f473c9cb77b115feb171e8e1"},"doc":{"_id":"backbone-browserify","_rev":"11-24d23a40f473c9cb77b115feb171e8e1","name":"backbone-browserify","description":"Give your JS App some Backbone with Models, Views, Collections, and Events. - For Browserify","dist-tags":{"latest":"0.9.2-1"},"versions":{"0.5.3":{"name":"backbone-browserify","description":"Give your JS App some Backbone with Models, Views, Collections, and Events. - For Browserify","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser","browserify","backbone"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":"lib","main":"lib/backbone-browserify.js","repository":{"type":"git","url":"git://github.com/kmiyashiro/backbone-browserify.git"},"version":"0.5.3","browserify":{"dependencies":{"underscore":">=1.1.2"},"main":"lib/backbone-browserify.js"},"_npmJsonOpts":{"file":"/Users/kelly/.npm/backbone-browserify/0.5.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-browserify@0.5.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fd178bc3cfe9e1f6a3cfc1b41ea52d6be1938bc9","tarball":"http://registry.npmjs.org/backbone-browserify/-/backbone-browserify-0.5.3.tgz"},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}],"directories":{}},"0.9.2":{"name":"backbone-browserify","description":"Give your JS App some Backbone with Models, Views, Collections, and Events. - For Browserify","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser","browserify","backbone"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"lib":"lib","main":"lib/backbone-browserify.js","repository":{"type":"git","url":"git://github.com/kmiyashiro/backbone-browserify.git"},"version":"0.9.2","browserify":{"dependencies":{"underscore":">=1.1.2"},"main":"lib/backbone-browserify.js"},"_npmUser":{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"},"_id":"backbone-browserify@0.9.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"f67a176a1e0e243472f813c2ae17aec6e2fa44ab","tarball":"http://registry.npmjs.org/backbone-browserify/-/backbone-browserify-0.9.2.tgz"},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}]},"0.9.2-1":{"name":"backbone-browserify","description":"Give your JS App some Backbone with Models, Views, Collections, and Events. - For Browserify","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser","browserify","backbone"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.1.2"},"devDependencies":{"jquery-browserify":"~1.7","express":"~2","browserify":"*"},"lib":"lib","main":"lib/backbone-browserify.js","repository":{"type":"git","url":"git://github.com/kmiyashiro/backbone-browserify.git"},"version":"0.9.2-1","browserify":{"dependencies":{"underscore":">=1.1.2"},"main":"lib/backbone-browserify.js"},"_npmUser":{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"},"_id":"backbone-browserify@0.9.2-1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"3f8e039c68715ead2783394bad06b8fa856e2002","tarball":"http://registry.npmjs.org/backbone-browserify/-/backbone-browserify-0.9.2-1.tgz"},"readme":"# Backbone-browserify\n## packaged for use with [node-browserify](https://github.com/substack/node-browserify).\n\n### Breaking change 0.9.2-1\n\nRemoved require('jquery') in Backbone source for `$` assignment. Didn't make sense, see #6\n\n### Install\n\n```bash\nnpm install backbone-browserify\n```\n\n**Important:** You must require `jquery-browserify`, 'br-jquery', or Zepto (untested) with Browserify before you require Backbone, just like normal.\n\nJust add it to your browserify require list and use it! Make sure you also have Underscore installed via npm as Backbone will automatically require it.\n\n### Server Side\n````javascript\nbrowserify({\n  require : [ 'jquery-browserify', 'backbone-browserify' ]\n});\n````\n\n... or to alias it to just \"backbone\":\n\n````javascript\nbrowserify({\n  require : { jquery: 'jquery-browserify', backbone: 'backbone-browserify' }\n});\n````\n\n#### Express example\n```js\napp.configure(function(){\n  app.set('views', __dirname + '/views');\n  app.set('view engine', 'jade');\n  app.use(express.bodyParser());\n  app.use(express.methodOverride());\n  app.use(app.router);\n  app.use(express.static(__dirname + '/public'));\n  app.use(browserify({\n    require : { jquery: 'jquery-browserify', backbone: 'backbone-browserify' }\n  }));\n});\n```\n\n### Client Side\n\n***Include `browserify.js` like this first: `<script src=\"browserify.js\"></script>`\n\n````javascript\nvar $ = jQuery = require('jquery-browserify'),\n    Backbone = require('backbone-browserify'),\n    MyView = Backbone.View.extend({\n        el: 'body',\n        initialize: function() {\n            this.render();\n        },\n        render: function() {\n            $(this.el).html('<h1>Oh hi</h1>');\n        }\n    });\n    \n$(document).ready(function() { var myView = new MyView(); });\n````\n\n... or if you aliased it to 'backbone':\n\n````javascript\nvar $ = jQuery = require('jquery'),\n    Backbone = require('backbone'),\n    MyView = Backbone.View.extend({\n        el: 'body',\n        initialize: function() {\n            this.render();\n        },\n        render: function() {\n            $(this.el).html('<h1>Oh hi</h1>');\n        }\n    });\n    \n$(document).ready(function() { var myView = new MyView(); });\n````","maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}]}},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}],"time":{"modified":"2012-06-18T16:37:38.203Z","created":"2011-10-01T23:08:11.958Z","0.5.3":"2011-10-01T23:08:13.253Z","0.9.2":"2012-04-10T21:01:02.820Z","0.9.2-1":"2012-06-18T16:37:38.203Z"},"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/backbone-browserify.git"},"_attachments":{"backbone-browserify-0.9.2-1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-NYfY8o16k2x+++Uz7CdKwQ==","length":17120,"stub":true},"backbone-browserify-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-HqOdvbtiivfCjv4D7bfdYg==","length":20480,"stub":true},"backbone-browserify-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aHuwtAqxV3ARStjItbpdhg==","length":13213,"stub":true}}}},
{"id":"backbone-callbacks","key":"backbone-callbacks","value":{"rev":"9-96fa4506c3c879122ade717d9504f269"},"doc":{"_id":"backbone-callbacks","_rev":"9-96fa4506c3c879122ade717d9504f269","name":"backbone-callbacks","description":"Anonymous callback style interface for Backbone.js async methods","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"backbone-callbacks","version":"0.1.0","main":"./backbone-callbacks.js","description":"Anonymous callback style interface for Backbone.js async methods","author":{"name":"Loren West","email":"open_source@lorenwest.com"},"homepage":"http://lorenwest.github.com/backbone-callbacks/","dependencies":{"underscore":"1.3.x","backbone":"0.9.x"},"devDependencies":{"grunt":"~0.3.6"},"engines":{"node":">0.4.x"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"lorenwest","email":"npm@lorenwest.com"},"_id":"backbone-callbacks@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5f922d72d74701836cd33bf0dbc1ab10fac033aa","tarball":"http://registry.npmjs.org/backbone-callbacks/-/backbone-callbacks-0.1.0.tgz"},"maintainers":[{"name":"lorenwest","email":"npm@lorenwest.com"}]},"0.1.1":{"name":"backbone-callbacks","version":"0.1.1","main":"./backbone-callbacks.js","description":"Anonymous callback style interface for Backbone.js async methods","author":{"name":"Loren West","email":"open_source@lorenwest.com"},"homepage":"http://lorenwest.github.com/backbone-callbacks/","dependencies":{"underscore":"1.3.x","backbone":"0.9.x"},"devDependencies":{"grunt":"~0.3.6"},"engines":{"node":">0.4.x"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"lorenwest","email":"npm@lorenwest.com"},"_id":"backbone-callbacks@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0803ee8e396df47b2f463a2af32636ec87399ea1","tarball":"http://registry.npmjs.org/backbone-callbacks/-/backbone-callbacks-0.1.1.tgz"},"maintainers":[{"name":"lorenwest","email":"npm@lorenwest.com"}]},"0.1.2":{"name":"backbone-callbacks","version":"0.1.2","main":"./backbone-callbacks.js","description":"Anonymous callback style interface for Backbone.js async methods","author":{"name":"Loren West","email":"open_source@lorenwest.com"},"homepage":"http://lorenwest.github.com/backbone-callbacks/","dependencies":{"underscore":"1.3.x","backbone":"0.9.x"},"devDependencies":{"grunt":"~0.3.6"},"engines":{"node":">0.4.x"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"lorenwest","email":"npm@lorenwest.com"},"_id":"backbone-callbacks@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ceafb8a350a278009a51d1017bc4f93e43de55f2","tarball":"http://registry.npmjs.org/backbone-callbacks/-/backbone-callbacks-0.1.2.tgz"},"maintainers":[{"name":"lorenwest","email":"npm@lorenwest.com"}]},"0.1.3":{"name":"backbone-callbacks","version":"0.1.3","main":"./backbone-callbacks.js","description":"Anonymous callback style interface for Backbone.js async methods","author":{"name":"Loren West","email":"open_source@lorenwest.com"},"homepage":"http://lorenwest.github.com/backbone-callbacks/","dependencies":{"underscore":"1.3.x","backbone":"0.9.x"},"devDependencies":{"grunt":"~0.3.6"},"engines":{"node":">0.4.x"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"lorenwest","email":"npm@lorenwest.com"},"_id":"backbone-callbacks@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"8bde000a3c14745821cad6000c64848e5dcf8801","tarball":"http://registry.npmjs.org/backbone-callbacks/-/backbone-callbacks-0.1.3.tgz"},"maintainers":[{"name":"lorenwest","email":"npm@lorenwest.com"}]}},"readme":"## Anonymous callback interface for Backbone.js async methods\n\n[Backbone.js](http://documentcloud.github.com/backbone>Backbone.js) exposes a ```success/error``` style callback interface to the asynchronous methods ```fetch```, ```save```, and ```destroy```.  Example:\n\n    myModel.fetch({success: function() {\n        ...\n      },\n      error: function() {\n        ...\n      }\n    });\n\nThis library adds a simpler node.js style callback interface for these methods:\n\n    myModel.fetch(function(error) {\n     ...\n    });\n\nTo use this libary:\n\n1) Download from github, or ```npm install backbone-callbacks```\n\n2) Attach the interfaces to Backbone in your initialization script:\n\n    // In a browser...\n    BackboneCallbacks.attach(Backbone);\n\n    // In node.js...\n    var Backbone = require('backbone');\n    require('backbone-callbacks').attach(Backbone);\n\nThis small library (under 1k) adds to the existing interface, allowing either style to be used.  If a callback function is provided as the last argument, it will use the simpler style.  Otherwise it will use the original ```success/error``` style.\n","maintainers":[{"name":"lorenwest","email":"npm@lorenwest.com"}],"time":{"modified":"2012-06-25T21:36:03.052Z","created":"2012-06-06T05:18:22.488Z","0.1.0":"2012-06-06T05:18:23.867Z","0.1.1":"2012-06-13T15:51:43.932Z","0.1.2":"2012-06-14T00:30:33.578Z","0.1.3":"2012-06-25T21:36:03.052Z"},"author":{"name":"Loren West","email":"open_source@lorenwest.com"},"_attachments":{"backbone-callbacks-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OFaPN0VMcVtWiKUSlOFtFA==","length":4449,"stub":true},"backbone-callbacks-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-VOCLgUxdbKg9sXFIE+z7Ig==","length":4346,"stub":true},"backbone-callbacks-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-aA/EIr7GLOeTId93SJErVw==","length":4183,"stub":true},"backbone-callbacks-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UBKUBYeg0bRbGO6GRFR7jg==","length":4116,"stub":true}}}},
{"id":"backbone-celtra","key":"backbone-celtra","value":{"rev":"3-775a5ebb25c1cd84723add52774ece84"},"doc":{"_id":"backbone-celtra","_rev":"3-775a5ebb25c1cd84723add52774ece84","name":"backbone-celtra","description":"Give your JS App some Backbone with Models, Views, Collections, and Events. Packaged for browserify by Celtra","dist-tags":{"latest":"0.5.3"},"versions":{"0.5.3":{"name":"backbone-celtra","description":"Give your JS App some Backbone with Models, Views, Collections, and Events. Packaged for browserify by Celtra","url":"http://documentcloud.github.com/backbone/","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[{"name":"Klemen Slavič","email":"klemen@celtra.com"}],"dependencies":{"underscore":">=1.1.2","jquery-browserify":"1.6.2"},"lib":".","main":"backbone.js","version":"0.5.3","_npmJsonOpts":{"file":"/home/rod/.npm/backbone-celtra/0.5.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-celtra@0.5.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"91f0658900ba22cff08bf0d72a6ebb276c8f1789","tarball":"http://registry.npmjs.org/backbone-celtra/-/backbone-celtra-0.5.3.tgz"},"maintainers":[{"name":"celtra","email":"developers@celtra.com"}]}},"maintainers":[{"name":"celtra","email":"developers@celtra.com"}],"time":{"modified":"2011-09-07T11:46:46.027Z","created":"2011-09-07T11:46:43.924Z","0.5.3":"2011-09-07T11:46:46.027Z"},"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"_attachments":{"backbone-celtra-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gLO20yXcMtliA5xbgtektA==","length":4978733,"stub":true}}}},
{"id":"backbone-couch","key":"backbone-couch","value":{"rev":"25-8f693175c56a3edcc2d14aa716a00912"},"doc":{"_id":"backbone-couch","_rev":"25-8f693175c56a3edcc2d14aa716a00912","name":"backbone-couch","description":"Backbone.js sync for CouchDB","dist-tags":{"latest":"1.1.0"},"versions":{"0.4.0":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"0.4.0","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"1.9.x","backbone":"= 0.3.3","underscore":"1.1.x"},"scripts":{"test":"expresso"},"_id":"backbone-couch@0.4.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"9cd5f7f192eb0f0d5c1c1933ec711610dd72ade1","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-0.4.0.tgz"},"directories":{}},"1.0.0":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"1.0.0","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"1.9.x","backbone":"= 0.5.1","underscore":"1.1.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"backbone-couch@1.0.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"37ba9a9ca5343f133fbeb66af9cf50af44638d38","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-1.0.0.tgz"},"directories":{}},"0.5.0":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"0.5.0","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"1.9.x","backbone":"= 0.3.3","underscore":"1.1.x"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/backbone-couch/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-couch@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"51ce7fbb1f35eefbfc298287c895a013ff5e9ff3","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-0.5.0.tgz"},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"}]},"0.5.1":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"0.5.1","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"1.9.x","backbone":"= 0.3.3","underscore":"1.1.x"},"scripts":{"test":"expresso"},"_npmUser":{"name":"yhahn","email":"young@developmentseed.org"},"_id":"backbone-couch@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a3078c4bc0435018e1c74edc4714494638942526","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-0.5.1.tgz"},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"}]},"0.5.2":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"0.5.2","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"1.9.x","backbone":"= 0.3.3","underscore":"1.1.x"},"scripts":{"test":"expresso"},"_npmUser":{"name":"yhahn","email":"young@developmentseed.org"},"_id":"backbone-couch@0.5.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"326dcc8b7badc3bc572822ed8992fa0a817e8ea6","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-0.5.2.tgz"},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"}]},"0.5.3":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"0.5.3","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"1.9.x","backbone":"= 0.3.3","underscore":"1.1.x"},"scripts":{"test":"expresso"},"_npmUser":{"name":"miccolis","email":"jeff@miccolis.net"},"_id":"backbone-couch@0.5.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e8124257667b51e3a73820135e134af9cd96105a","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-0.5.3.tgz"},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"miccolis","email":"jeff@miccolis.net"}]},"0.5.4":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"0.5.4","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"2.9.x","backbone":"= 0.3.3","underscore":"1.1.x"},"devDependencies":{"mocha":"1.0.x"},"scripts":{"test":"mocha -R spec"},"_npmUser":{"name":"willwhite","email":"will@developmentseed.org"},"_id":"backbone-couch@0.5.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"dc9a7b177adf70bdabcc02a221a96e79a8338340","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-0.5.4.tgz"},"readme":"Backbone Couch\n--------------\nOverrides for [Backbone](http://documentcloud.github.com/backbone/) to use\n[CouchDB](http://couchdb.apache.org/) for Model persistence. Intended for\nserver-side use of Backbone like in\n[Bones](https://github.com/developmentseed/bones).\n\n### Installation\n\n    npm install backbone-couch\n\n### Usage\n\n    var Backbone = require('backbone');\n\n    // Create a new backbone-couch handler for a database 'documents'.\n    var couch = require('backbone-couch')({\n        host: '127.0.0.1',\n        port: '5984',\n        name: 'documents'\n    });\n\n    // Create database, push default design documents to it and\n    // assign sync method to Backbone.\n    couch.install(function(err) {\n        Backbone.sync = couch.sync;\n    });\n\n    // Backbone.sync will now load and save models from a 'documents' couch db.\n\n### Conventions\n\n`backbone-couch` stores models in using the `model.url` as its `_id`.\nBy default, Collections retrieve models by matching the Collection url against\nthe initial portion of the Model url. See `backbone.json` for the default\ndesign document and collection view.\n\n    var orange = new FruitModel({id: 'orange'});\n    var apple = new FruitModel({id: 'apple'});\n    var banana = new FruitModel({id: 'banana'});\n\n    console.log(orange.url()); // fruits/orange\n    console.log(apple.url());  // fruits/apple\n    console.log(banana.url()); // fruits/banana\n\n    var fruits = new FruitCollection();\n\n    console.log(fruits.url);   // fruits\n\n    fruits.fetch();            // retrieves orange, apple, banana\n\nTo override the default design doc with your own special sauce use the `doc`\noption when calling `couch.install()`.\n\n    // Pass a filepath to your design doc.\n    couch.install({doc: '/path/to/my/doc.json'}, callback);\n\n    // Or provide a literal js object directly.\n    couch.install({doc: {\n        _id: '_design/backbone',\n        language: 'javascript'\n    }, callback);\n\nYour design doc should use `_design/backbone` as its `_id`. Collections will be\ncalled against this design doc using their `url`. For example, if you have a\nCollection `/blog/recent`, your design doc should provide a rewrite rule to\nrespond to this path:\n\n    {\n        \"_id\":\"_design/backbone\",\n        \"language\":\"javascript\",\n        \"views\": {\n            \"recent\": {\n                \"map\": \"function(doc) { emit(doc._id, doc._id) }\"\n            }\n        },\n        \"rewrites\": [\n            {\n                \"from\": \"/blog/recent\",\n                \"to\": \"_view/recent\",\n                \"query\": {\n                    \"limit\": 10\n                    \"include_docs\": true\n                }\n            }\n        ]\n    }\n\nSee the [rewrite handler docs](http://wiki.apache.org/couchdb/Rewriting_urls)\nor this [blog post](http://blog.couchbase.com/whats-new-in-apache-couchdb-0-11-part-one-nice-urls)\nfor more info on design doc rewrites.\n\n### Run tests\n\nRequires [Expresso](http://visionmedia.github.com/expresso/). Tested with version 0.7.6.\n\n    cd backbone-couch/\n    npm test\n\n","maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"miccolis","email":"jeff@miccolis.net"},{"name":"willwhite","email":"will@developmentseed.org"}]},"1.1.0":{"name":"backbone-couch","description":"Backbone.js sync for CouchDB","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"version":"1.1.0","homepage":"https://github.com/developmentseed/backbone-couch","repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"main":"./backbone-couch","engines":{"node":"*"},"dependencies":{"request":"2.9.x","backbone":"= 0.5.1","underscore":"1.1.x"},"devDependencies":{"mocha":"1.0.x"},"scripts":{"test":"mocha -R spec"},"_npmUser":{"name":"willwhite","email":"will@mapbox.com"},"_id":"backbone-couch@1.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6d8c32766cb9355c4255284dff195fbdcbef30dc","tarball":"http://registry.npmjs.org/backbone-couch/-/backbone-couch-1.1.0.tgz"},"readme":"Backbone Couch\n--------------\nOverrides for [Backbone](http://documentcloud.github.com/backbone/) to use\n[CouchDB](http://couchdb.apache.org/) for Model persistence. Intended for\nserver-side use of Backbone like in\n[Bones](https://github.com/developmentseed/bones).\n\n### Installation\n\n    npm install backbone-couch\n\n### Usage\n\n    var Backbone = require('backbone');\n\n    // Create a new backbone-couch handler for a database 'documents'.\n    var couch = require('backbone-couch')({\n        host: '127.0.0.1',\n        port: '5984',\n        name: 'documents'\n    });\n\n    // Create database, push default design documents to it and\n    // assign sync method to Backbone.\n    couch.install(function(err) {\n        Backbone.sync = couch.sync;\n    });\n\n    // Backbone.sync will now load and save models from a 'documents' couch db.\n\n### Conventions\n\n`backbone-couch` stores models in using the `model.url` as its `_id`.\nBy default, Collections retrieve models by matching the Collection url against\nthe initial portion of the Model url. See `backbone.json` for the default\ndesign document and collection view.\n\n    var orange = new FruitModel({id: 'orange'});\n    var apple = new FruitModel({id: 'apple'});\n    var banana = new FruitModel({id: 'banana'});\n\n    console.log(orange.url()); // fruits/orange\n    console.log(apple.url());  // fruits/apple\n    console.log(banana.url()); // fruits/banana\n\n    var fruits = new FruitCollection();\n\n    console.log(fruits.url);   // fruits\n\n    fruits.fetch();            // retrieves orange, apple, banana\n\nTo override the default design doc with your own special sauce use the `doc`\noption when calling `couch.install()`.\n\n    // Pass a filepath to your design doc.\n    couch.install({doc: '/path/to/my/doc.json'}, callback);\n\n    // Or provide a literal js object directly.\n    couch.install({doc: {\n        _id: '_design/backbone',\n        language: 'javascript'\n    }, callback);\n\nYour design doc should use `_design/backbone` as its `_id`. Collections will be\ncalled against this design doc using their `url`. For example, if you have a\nCollection `/blog/recent`, your design doc should provide a rewrite rule to\nrespond to this path:\n\n    {\n        \"_id\":\"_design/backbone\",\n        \"language\":\"javascript\",\n        \"views\": {\n            \"recent\": {\n                \"map\": \"function(doc) { emit(doc._id, doc._id) }\"\n            }\n        },\n        \"rewrites\": [\n            {\n                \"from\": \"/blog/recent\",\n                \"to\": \"_view/recent\",\n                \"query\": {\n                    \"limit\": \"10\"\n                    \"include_docs\": \"true\"\n                }\n            }\n        ]\n    }\n\nSee the [rewrite handler docs](http://wiki.apache.org/couchdb/Rewriting_urls)\nor this [blog post](http://blog.couchbase.com/whats-new-in-apache-couchdb-0-11-part-one-nice-urls)\nfor more info on design doc rewrites.\n\n### Run tests\n\n    cd backbone-couch/\n    npm test\n\n","maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"miccolis","email":"jeff@miccolis.net"},{"name":"willwhite","email":"will@developmentseed.org"}]}},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"miccolis","email":"jeff@miccolis.net"},{"name":"willwhite","email":"will@developmentseed.org"}],"time":{"modified":"2012-07-20T19:41:37.322Z","created":"2011-06-10T18:56:14.361Z","0.4.0":"2011-06-10T18:56:14.548Z","0.5.0":"2011-07-21T13:59:44.557Z","1.0.0":"2011-07-22T22:51:48.353Z","0.5.1":"2011-11-04T15:48:32.773Z","0.5.2":"2011-12-02T20:46:39.926Z","0.5.3":"2012-03-26T19:05:31.573Z","0.5.4":"2012-04-04T19:41:43.585Z","1.1.0":"2012-07-20T19:41:37.322Z"},"author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"repository":{"type":"git","url":"git://github.com/developmentseed/backbone-couch.git"},"_attachments":{"backbone-couch-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-/EYZdggjEGvEKl4bMlwOtQ==","length":5132,"stub":true},"backbone-couch-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-ON4bPMZq4X3paq7SIB3grQ==","length":5241,"stub":true},"backbone-couch-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-odl44p/MBgb+oPBvBqPw0A==","length":10240,"stub":true},"backbone-couch-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-6DlUYfzziC50WFYwtgj0Og==","length":5086,"stub":true},"backbone-couch-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-KIgaXlZCwCSEK2DB59VuPQ==","length":5080,"stub":true},"backbone-couch-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-MYYS7s47sWbmyxDcp+Li4Q==","length":5106,"stub":true},"backbone-couch-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-lalTDcz3NA9fOKmEvo6r9w==","length":4980,"stub":true},"backbone-couch-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AHphHhQ/NNKJ3d9XXB08lA==","length":5091,"stub":true}}}},
{"id":"backbone-cradle","key":"backbone-cradle","value":{"rev":"5-bc8a10f6bd8bb4ad5e3389bb814e65cd"},"doc":{"_id":"backbone-cradle","_rev":"5-bc8a10f6bd8bb4ad5e3389bb814e65cd","name":"backbone-cradle","description":"Backbone.js sync for CouchDB using Cradle","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"backbone-cradle","description":"Backbone.js sync for CouchDB using Cradle","author":{"name":"Sam Lown","email":"me@samlown.com","url":"http://samlown.com/"},"version":"0.1.0","homepage":"https://github.com/samlown/backbone-cradle","repository":{"type":"git","url":"git://github.com/samlown/backbone-cradle.git"},"main":"./backbone-cradle","directories":{"test":"./test"},"engines":{"node":"*"},"dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.0","cradle":">= 0.5.5"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/sam/.npm/backbone-cradle/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-cradle@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"3be810bcd3677b66c4964392a3ccfa21c6a61258","tarball":"http://registry.npmjs.org/backbone-cradle/-/backbone-cradle-0.1.0.tgz"},"maintainers":[{"name":"samlown","email":"me@samlown.com"}]},"0.1.1":{"name":"backbone-cradle","description":"Backbone.js sync for CouchDB using Cradle","author":{"name":"Sam Lown","email":"me@samlown.com","url":"http://samlown.com/"},"version":"0.1.1","homepage":"https://github.com/samlown/backbone-cradle","repository":{"type":"git","url":"git://github.com/samlown/backbone-cradle.git"},"main":"./backbone-cradle","directories":{"test":"./test"},"engines":{"node":"*"},"dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.0","cradle":">= 0.5.7"},"scripts":{"test":"expresso"},"_npmUser":{"name":"samlown","email":"me@samlown.com"},"_id":"backbone-cradle@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8599b2d05f08b47e605a287c39ff690f9a923e6d","tarball":"http://registry.npmjs.org/backbone-cradle/-/backbone-cradle-0.1.1.tgz"},"maintainers":[{"name":"samlown","email":"me@samlown.com"}]}},"maintainers":[{"name":"samlown","email":"me@samlown.com"}],"time":{"modified":"2011-10-31T10:07:45.346Z","created":"2011-08-05T09:50:08.797Z","0.1.0":"2011-08-05T09:50:10.281Z","0.1.1":"2011-10-31T10:07:45.346Z"},"author":{"name":"Sam Lown","email":"me@samlown.com","url":"http://samlown.com/"},"repository":{"type":"git","url":"git://github.com/samlown/backbone-cradle.git"},"_attachments":{"backbone-cradle-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hFlSU25OIKDc+6icwZFxPg==","length":3867,"stub":true},"backbone-cradle-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kNjZxbLKlFJ+frVX58HAwg==","length":3815,"stub":true}}}},
{"id":"backbone-define","key":"backbone-define","value":{"rev":"32-901cc4732fdd79313129d34df525dff2"},"doc":{"_id":"backbone-define","_rev":"32-901cc4732fdd79313129d34df525dff2","name":"backbone-define","description":"ExtJS style class definition for name aware Classes","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"backbone-define","version":"0.0.1","author":{"name":"Morgan 'ARR!' Allen"},"description":"ExtJS style class definition for name aware Classes","contributors":[{"name":"Morgan 'ARR!' Allen","email":"morganrallen@gmail.com"}],"scripts":{"test":"node ./node_modules/qunit/bin/cli.js -t ./test/tests.js -c ./lib/BackboneDefine.js"},"repository":{"type":"git","url":""},"dependencies":{"backbone":"0.9.2","underscore":"1.3.3","qunit":"0.5.2"},"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"morganrallen","email":"morganrallen@gmail.com"},"_id":"backbone-define@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"2fe609eb8f50ab2c53db57deeebc9fa062e3547c","tarball":"http://registry.npmjs.org/backbone-define/-/backbone-define-0.0.1.tgz"},"maintainers":[{"name":"morganrallen","email":"morganrallen@gmail.com"}],"directories":{}},"0.0.2":{"name":"backbone-define","version":"0.0.2","author":{"name":"Morgan 'ARR!' Allen"},"description":"ExtJS style class definition for name aware Classes","contributors":[{"name":"Morgan 'ARR!' Allen","email":"morganrallen@gmail.com"}],"scripts":{"test":"node ./node_modules/qunit/bin/cli.js -t ./test/tests.js -c ./lib/BackboneDefine.js"},"repository":{"type":"git","url":"git://github.com/morganrallen/backbone-define.git"},"dependencies":{"backbone":"0.9.2","underscore":"1.3.3","qunit":"0.5.2"},"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"morganrallen","email":"morganrallen@gmail.com"},"_id":"backbone-define@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"ec2615e73a272696a9b0830db0d5bd97305ab443","tarball":"http://registry.npmjs.org/backbone-define/-/backbone-define-0.0.2.tgz"},"maintainers":[{"name":"morganrallen","email":"morganrallen@gmail.com"}],"directories":{}},"0.0.3":{"name":"backbone-define","version":"0.0.3","author":{"name":"Morgan 'ARR!' Allen"},"description":"ExtJS style class definition for name aware Classes","contributors":[{"name":"Morgan 'ARR!' Allen","email":"morganrallen@gmail.com"}],"keywords":["backbone","plugin"],"scripts":{"test":"node ./node_modules/qunit/bin/cli.js -t ./test/tests.js -c ./lib/BackboneDefine.js"},"repository":{"type":"git","url":"git://github.com/morganrallen/backbone-define.git"},"dependencies":{"backbone":"0.9.2","underscore":"1.3.3"},"devDependencies":{"qunit":"0.5.2"},"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"morganrallen","email":"morganrallen@gmail.com"},"_id":"backbone-define@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"be1632096422952ce70686dc1f8ae0079d56a844","tarball":"http://registry.npmjs.org/backbone-define/-/backbone-define-0.0.3.tgz"},"maintainers":[{"name":"morganrallen","email":"morganrallen@gmail.com"}]}},"readme":"Add ExtJS style class definition to Backbone.\nUseful for being able to iterate available classes such as when defining classes server side and sharing with client.\nThis can be done without knowing to code in names on both sides.\n\nBy default store Classes on Backbone.Collections, Backbone.Models, etc;\n\n```javascript\nBackbone.Model.define(\"Person\", {\n\tinitialize: function(attributes) {\n\t\tBackbone.Model.prototype.initialize.call(this, attributes);\n\t}\n}, {\n\tsomeClassProperty: \"withvalue\"\n});\n\nvar zaphod = new Backbone.Models.Person({\n\tname: \"Zap\"\n});\n```\n\nIncluding in the browser will automatically bootstrap Backbone with the Class Objects and adding .define to available extensible Classes.\n\nUse in Node\n```javascript\nvar Backbone = require(\"Backbone\");\nrequire(\"backbone-define\")(Backbone);\n```\n","maintainers":[{"name":"morganrallen","email":"morganrallen@gmail.com"}],"time":{"modified":"2012-06-12T17:38:53.728Z","created":"2012-06-06T04:52:34.695Z","0.0.1":"2012-06-06T04:52:48.588Z","0.0.2":"2012-06-06T04:57:17.137Z","0.0.3":"2012-06-07T12:18:32.137Z"},"author":{"name":"Morgan 'ARR!' Allen"},"repository":{"type":"git","url":"git://github.com/morganrallen/backbone-define.git"},"users":{},"_attachments":{"backbone-define-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uNv0SglWefyWbHgmf8KAYw==","length":7233074,"stub":true},"backbone-define-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1O0TNVuIPWfxuuUfXV+XRA==","length":1747,"stub":true},"backbone-define-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GJACcEsP52pAA+ukyHMuqg==","length":1730,"stub":true}}}},
{"id":"backbone-dirty","key":"backbone-dirty","value":{"rev":"23-39f525f1c5b1b2390693ee4ac289a4b3"},"doc":{"_id":"backbone-dirty","_rev":"23-39f525f1c5b1b2390693ee4ac289a4b3","name":"backbone-dirty","dist-tags":{"latest":"1.1.3"},"versions":{"1.1.0":{"name":"backbone-dirty","version":"1.1.0","author":{"name":"Young Hahn"},"dependencies":{"underscore":"1.1.x","dirty":"https://github.com/felixge/node-dirty/tarball/51c6f867e8b177892d7083685e5f0a2978c4f385"},"licenses":[{"type":"BSD"}],"main":"./backbone-dirty","scripts":{"test":"expresso"},"devDependencies":{},"_id":"backbone-dirty@1.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"255f104ded28b6cddd960a72cbf82e94e0a8c352","tarball":"http://registry.npmjs.org/backbone-dirty/-/backbone-dirty-1.1.0.tgz"},"directories":{}},"1.1.1":{"name":"backbone-dirty","version":"1.1.1","author":{"name":"Development Seed","url":"http://developmentseed.org"},"dependencies":{"underscore":"1.1.x","dirty":"0.9.x"},"licenses":[{"type":"BSD"}],"main":"./backbone-dirty","scripts":{"test":"expresso"},"devDependencies":{},"_id":"backbone-dirty@1.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"af145c2b2d6bf4fe8b7799dfad66bd2947a816d0","tarball":"http://registry.npmjs.org/backbone-dirty/-/backbone-dirty-1.1.1.tgz"}},"1.1.2":{"name":"backbone-dirty","version":"1.1.2","author":{"name":"Development Seed","url":"http://developmentseed.org"},"dependencies":{"underscore":"1.1.x","dirty":"0.9.x"},"licenses":[{"type":"BSD"}],"main":"./backbone-dirty","scripts":{"test":"expresso"},"_id":"backbone-dirty@1.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"871dce74c37334b782f804e93fc411583f04c048","tarball":"http://registry.npmjs.org/backbone-dirty/-/backbone-dirty-1.1.2.tgz"}},"1.1.3":{"name":"backbone-dirty","version":"1.1.3","author":{"name":"Development Seed","url":"http://developmentseed.org"},"dependencies":{"underscore":"~1.3.3","dirty":"0.9.x"},"licenses":[{"type":"BSD"}],"main":"./backbone-dirty","scripts":{"test":"expresso"},"_npmUser":{"name":"springmeyer","email":"dane@dbsgeo.com"},"_id":"backbone-dirty@1.1.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"2f957de8fc3f8a975180ede968484a4cdd24064c","tarball":"http://registry.npmjs.org/backbone-dirty/-/backbone-dirty-1.1.3.tgz"},"readme":"Backbone Dirty\n--------------\nServer-side overrides for Backbone to use `node-dirty` for Model persistence.\n\n### Compatibility\n\nBackbone 0.3.3.\n\n### Usage\n\nPass a filepath to the db (will be created if it doesn't exist yet) when\ncalling `require()`.\n\n    var Backbone = require('backbone');\n    Backbone.sync = require('backbone-dirty')('app.db').sync;\n\n    // Backbone.sync will now load and save models from app.db.\n\n### Conventions\n\n`backbone-dirty` stores models in the `node-dirty` db using the `model.url` as\nits key. Collections retrieve models by matching the Collection url against\nthe initial portion of the Model url.\n\n    var orange = new FruitModel({id: 'orange'});\n    var apple = new FruitModel({id: 'apple'});\n    var banana = new FruitModel({id: 'banana'});\n\n    console.log(orange.url()); // fruits/orange\n    console.log(apple.url());  // fruits/apple\n    console.log(banana.url()); // fruits/banana\n\n    var fruits = new FruitCollection();\n\n    console.log(fruits.url);   // fruits\n\n    fruits.fetch();            // retrieves orange, apple, banana\n\n### Authors\n\n- [Will White](http://github.com/willwhite)\n- [Young Hahn](http://github.com/yhahn)\n\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"time":{"modified":"2012-04-16T22:52:49.047Z","created":"2011-05-20T16:37:41.876Z","1.1.0":"2011-05-20T16:38:02.704Z","0.1.0":"2011-05-25T07:31:07.016Z","1.1.1":"2011-05-25T07:35:12.372Z","1.1.2":"2011-06-09T15:30:25.874Z","1.1.3":"2012-04-16T22:52:49.047Z"},"author":{"name":"Development Seed","url":"http://developmentseed.org"},"_attachments":{"backbone-dirty-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-RAnm+FyOtQRMvyY+3UdGXg==","length":3560,"stub":true},"backbone-dirty-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-xcBSv3Rr1Nl1SI/BnAiuyA==","length":3516,"stub":true},"backbone-dirty-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-GyN+WpcZ7gSIl1m8RiTreA==","length":3497,"stub":true},"backbone-dirty-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4JVpuqNGTQsbddP57KilXQ==","length":3580,"stub":true}}}},
{"id":"backbone-dnode","key":"backbone-dnode","value":{"rev":"69-75fab2aedc2d33d60095d7b3546b9aa7"},"doc":{"_id":"backbone-dnode","_rev":"69-75fab2aedc2d33d60095d7b3546b9aa7","name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.0","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","underscore":">= 1.1.4","socket.io":">= 0.6.2"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.0","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"92d506d88f21f53ad5cb7abf2aef10d652f508b7","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.0.tgz"}},"0.1.1":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.1","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","underscore":">= 1.1.5","socket.io":">= 0.6.17","dnode":">= 0.6.10","mongoose":">= 0.6.10","node-gravatar":">= 0.6.10"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.1","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"579ecaedfacbe4fdb3c0f3c52c671813100b8774","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.1.tgz"}},"0.1.2":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.2","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.2","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"3e21efa2775bb8bdd4ef8870301e9dfda9d656df","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.2.tgz"}},"0.1.3":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.3","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.3","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"20cf4438d84d34d3f0c43d8b048449e1271e9fcf","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.3.tgz"}},"0.1.4":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.4","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.4","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"9f20d33f88d3b8f64b4507b485e6a54aeb95e108","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.4.tgz"}},"0.1.5":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.5","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.5","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"f55da5bf68a14318d2dac2e8260c6775c4752e49","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.5.tgz"}},"0.1.6":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.6","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.0","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.6","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"a7fda7fbb60bc6277b2c7233f892ecf624e53645","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.6.tgz"}},"0.1.7":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.7","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-dnode@0.1.7","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"3d12e351512e90452e44e72fd4ae131127a30efe","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.7.tgz"}},"0.1.8":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.8","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.8","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"4785121476f88f1b5ada5a900ed9377ee25b0e18","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.8.tgz"}},"0.1.9":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.9","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.9","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"e16aa4d7a1c731fc7df45894ece93e29a25c1daf","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.9.tgz"}},"0.1.10":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.10","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.10","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"c55466da16da3ab4d0c5df5dc3510ed3b8d3bcce","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.10.tgz"}},"0.1.11":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.11","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.11","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"5ba86dc14bf81598fdcf10a9b94c80d227a636aa","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.11.tgz"}},"0.1.12":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.12","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.12","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"7760bc538700946f80d8f78a67fd41a2ce9b4e4b","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.12.tgz"}},"0.1.14":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.14","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.14","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"7453f20db38d127f08cbc272413262402a719d54","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.14.tgz"}},"0.1.15":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.15","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.15","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"d80827e29c6dd39d7ace67a7cac7217c278ff904","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.15.tgz"}},"0.1.16":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.16","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.16","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"fba82506bd01a2cd799f23d9bc9812a6315a0605","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.16.tgz"}},"0.1.17":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.17","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.17","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"487da79d09038c4a8d44d51067027b5c29da6a8d","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.17.tgz"}},"0.1.18":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.1.18","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongo"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.1.18","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"d00df98ef058c314c7174846c703be9976f97adb","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.1.18.tgz"}},"0.2.0":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.0","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.0","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"1f2ff066903e4d1ff6270c4c52d344d16144cd4c","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.0.tgz"}},"0.2.1":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.1","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.1","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"8d362ef9110967f8ad61728434e1325264e27063","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.1.tgz"}},"0.2.2":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.2","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.2","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"363c9ca7d0fcc511867cb3108024bf047e6d26a8","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.2.tgz"}},"0.2.3":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.3","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":">= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.3","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"f86ad4657f58bbd5a4210aec126908c1a1b2ea89","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.3.tgz"}},"0.2.4":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.4","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":"= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.4","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"af5075b7ced315be840eaa74cb322276d33d03da","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.4.tgz"}},"0.2.5":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.5","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":"= 1.6.0","node-gravatar":">= 1.0.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.5","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"3ef36faf51b4547b36b034fd614d96fc63d30bb8","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.5.tgz"}},"0.2.6":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.6","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":"= 1.6.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_id":"backbone-dnode@0.2.6","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"ebedf4917b753a1e4c028b698a29382e5838fd7d","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.6.tgz"}},"0.2.8":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.2.8","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":"= 1.6.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_npmJsonOpts":{"file":"/home/darkteal.org/.npm/backbone-dnode/0.2.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-dnode@0.2.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b827aa9474b572f8868c337bbbde9b4d36bc4af8","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.2.8.tgz"},"scripts":{}},"0.3.0":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.3.0","homepage":"https://github.com/sorensen/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.1","underscore":">= 1.1.6","dnode":">= 0.7.3","mongoose":"= 1.6.0"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_npmJsonOpts":{"file":"/home/darkteal.org/.npm/backbone-dnode/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-dnode@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"baf7580d88f9f4ea1210a2333ea1dd58a68f225c","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.3.0.tgz"},"scripts":{}},"0.3.2":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.3.2","homepage":"http://sorensen.github.com/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":"0.5.3","underscore":"1.1.7","dnode":"0.8.1","mongoose":"1.8.3"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_npmJsonOpts":{"file":"/Users/sorensen/.npm/backbone-dnode/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-dnode@0.3.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8c1c76a55319b263334c981d1a074a1675a02b4c","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.3.2.tgz"},"scripts":{},"maintainers":[{"name":"sorensen","email":"mail@beausorensen.com"}]},"0.4.0":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.4.0","homepage":"http://sorensen.github.com/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.3","underscore":">= 1.1.7","dnode":">= 0.8.1","mongoose":">= 1.8.3","redis":">= 0.6.7"},"devDependencies":{"vows":"0.4.9","assert":"0.6.0"},"browserify":"browser/index.js","engines":{"node":">= 0.6.2"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_npmUser":{"name":"sorensen","email":"mail@beausorensen.com"},"_id":"backbone-dnode@0.4.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6c64d098cc37a86d7372077be9319558a6a91563","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.4.0.tgz"},"readme":"# Backbone DNode\n\nBackbone-DNode is a server to client integration package for use with, you guessed it, \nBackbone and DNode. The package brovides both node.js server side code for CRUD and \nPubsub routines, as well as the matching client (or server) side routines.\n\nThe idea is to make writing a real-time Backbone application as simple as possible, \nthe app is supported on the server side by using the Mongoose ORM for final validation\nand persistence. \n\nThe pubsub mechanics will default to using socket.io for updating the connected clients, \nhowever, you can pass a redis server and connection options to the pubsub `config` method\nto utilize the built in redis publish and subscribe methods.\n\n## Installation\n\nThe project can be installed via NPM, or by cloning this repo into your project.\n\n    npm install backbone-dnode\n\nor\n\n    git clone git://github.com/sorensen/backbone-dnode.git\n\n\n## Server usage\n\nWhip up a server and attatch DNode, while using the backbone-dnode\nmethods as middleware.\n\n```javascript\n\nvar express = require('express')\n  , DNode = require('dnode')\n  , BackboneDNode = require('backbone-dnode')\n  , server = express.createServer()\n````\n\nSimply allow the package to be served through your express static if \nyou have included the package via `npm`. Serving up the client side script \ncan also be done via [browserify](https://github.com/substack/node-browserify), \nbut that is entirely up to you, as this can be done many ways, and I generally \nprefer to bundle all client-side javascript into a single minifified file.\n\n```javascript\n\nserver.use(express.static(__dirname + '/node_modules/backbone-dnode/browser'))\n````\n\nRegister your Mongoose schemas, and then pass the database \ninstance to the CRUD configuration. At least one mongoose \nschema must be registered to use the CRUD routines.\n\n```javascript\n\nvar Mongoose = require('mongoose')\n  , Schema = mongoose.Schema\n\nMongoose.connect('mongodb://localhost/db')\n\nFoo = new Schema({\n  bar: { type: String, index: true }\n})\n\ndb = Mongoose.connect('mongodb://localhost/db')\n````\n\n(Optional) Configure the Redis connection if you would like to use Redis \nas the pubsub mechanics. This will allow you to use other libraries \nsuch as Cluster, letting Redis act as the message queue. If you don't \nuse redis, the package will default to a single-threaded mode, which will \nwork fine so long as you don't have multiple instances of node running.\n\n```javascript\n\nvar redis = require('redis')\n  , pub = redis.createClient()\n  , sub = redis.createClient()\n````\n\nStart the node server, and attach the backbone-dnode middleware\nto the DNode instance.\n\n```javascript\n\nserver.listen(8080)\ndnode()\n  .use(BackboneDNode.pubsub({\n    publish: pub\n  , subscribe: sub \n  }))\n  .use(BackboneDNode.crud({\n    database: db\n  }))\n  .listen(server)\n````\n\n## Client usage\n\nSimply include the client-side part of the package onto the page, which\nmay differ depending on how you serve up your static content.\n\n```html\n<script src=\"/dnode.js\"></script>\n<script src=\"/dnode.backbone.js\"></script>\n````\n\nThe package will need to be configured as well, allowing it to be used\nas DNode middleware, if you wish to use the pubsub methods of the package, \nenable it, as it is not used by default.  This will broadcast all changes \nto any models to anyone else connected, otherwise, it will only call back to \nthe current client, and use the default Backbone `success` methods.\n\n```javascript\n\nDNode()\n  .use(root.dnodeBackbone({\n    pubsub: true\n  }))\n  .connect()\n````\n\n\nTo connect to node.js and mongoose from the browser (or on the server), \na model `type` for mongoose must be specified, as well as overriding the \n`sync` method on each model, an underscore mixin has been created to\nprovide optional support based on the model, in case you have different \npersistant support in mind.\n\n```javascript\n\nfoo = Backbone.Model.extend({\n  type: 'room'\n, sync: _.sync\n})\n````\n\nNow create the collection, the attributes are set on both the model and \ncollection to ensure that they will both use the same persistance, even if \na model is created outside of the collection.\n\n```javascript\n\nFooCollection = Backbone.Collection.extend({\n  url: 'foos'\n, type: 'foo'\n, sync: _.sync\n, model: Foo\n})\n````\n\nYou can also override the sync method globally, by overriding \nthe default `Backbone.sync` method\n\n```javascript\n\nBackbone.sync = _.sync\n````\n\nOnce the middleware has been established, and a model has been set to use \nit (or if as been overridden globally), the default Backbone methods will \nautomatically send the changes through the socket (dnode), where they will \nbe mapped to the corresponding Mongoose schema, and then published to the \nconnected clients that have been subscribed to the model or collection's URL.\n\n```javascript\nvar options = {}\n  , foos = new FooCollection()\n\nfoos.subscribe(options, function() {\n  foos.fetch({\n    finished: function(model, resp, options) {\n      // The server has responded with the fetched data, \n      // and has added to the collection\n    }\n  , error: function(model, resp, options) {\n      // Something went wrong, the server has responded with \n      // an error code for client side handling\n    }\n  })\n})\n````\n\nWhen the `subscribe` method has returned, you are now able to use all of the default \nBackbone model methods and have them interact with the server.  When using any of the \nBackbone `fetch`, `save`, `create`, or `delete` methods, a callback function will be \nused when the server responds, and a `finished` method will be executed when the middleware \nis done with the Backbone integration methods. Can optionally pass in an `error` method that \nwill be triggered if anything goes wrong on the server side.  Think of `finished` as the \nBackbone `success` callback when normally using these methods, the name is changed to avoid \nconflicts.\n\n```javascript\n\nfoos.create({\n    bar : 'something'\n})\n````\n\nBackbone.fetch() has been overloaded to accept a `query` and `sorting` argument, which will be \ndirectly used on the server against the Mongoose ORM.  The default behavior for passing in `silent:true` \nor `add:true` will still be used.\n\n```javascript\n\nfoos.fetch({\n  query: { bar : 'something' }\n, sorting: { sort: [['created',-1]], limit: 20 }\n})\n````\n\n## Package dependancies (npm)\n\n* [dnode @ 0.6.10](http://github.com/substack/dnode)\n* [backbone @ 0.3.3](http://github.com/documentcloud/backbone)\n* [underscore @ 1.1.5](http://github.com/documentcloud/underscore)\n* [mongoose @ 1.3.0](http://github.com/LearnBoost/mongoose)\n","maintainers":[{"name":"sorensen","email":"mail@beausorensen.com"}]},"0.4.1":{"name":"backbone-dnode","description":"Persistant backbone storage through dnode pub/sub","version":"0.4.1","homepage":"http://sorensen.github.com/backbone-dnode","repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","dnode","mongodb","mongoose"],"main":"./index","dependencies":{"backbone":">= 0.5.3","underscore":">= 1.1.7","dnode":">= 0.8.1","mongoose":">= 1.8.3","redis":">= 0.6.7"},"devDependencies":{"mocha":"0.5.0"},"browserify":"browser/index.js","engines":{"node":">= 0.6.2"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_npmUser":{"name":"sorensen","email":"mail@beausorensen.com"},"_id":"backbone-dnode@0.4.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5c7b0d627cdb5a22d1c6da18bc4aa8a691870960","tarball":"http://registry.npmjs.org/backbone-dnode/-/backbone-dnode-0.4.1.tgz"},"readme":"# Backbone DNode\n\nBackbone-DNode is a server to client integration package for use with, you guessed it, \nBackbone and DNode. The package brovides both node.js server side code for CRUD and \nPubsub routines, as well as the matching client (or server) side routines.\n\nThe idea is to make writing a real-time Backbone application as simple as possible, \nthe app is supported on the server side by using the Mongoose ORM for final validation\nand persistence. \n\n## Installation\n\nThe project can be installed via NPM, or by cloning this repo into your project.\n\n    npm install backbone-dnode\n\nor\n\n    git clone git://github.com/sorensen/backbone-dnode.git\n\n\n## Server usage\n\nWhip up a server and attatch DNode, while using the backbone-dnode\nmethods as middleware.\n\n```javascript\n\nvar express = require('express')\n  , DNode = require('dnode')\n  , BackboneDNode = require('backbone-dnode')\n  , server = express.createServer()\n````\n\nSimply allow the package to be served through your express static if \nyou have included the package via `npm`. Serving up the client side script \ncan also be done via [browserify](https://github.com/substack/node-browserify), \nbut that is entirely up to you, as this can be done many ways, and I generally \nprefer to bundle all client-side javascript into a single minifified file.\n\n```javascript\n\nserver.use(express.static(__dirname + '/node_modules/backbone-dnode/browser'))\n````\n\nRegister your Mongoose schemas, and then pass the database \ninstance to the CRUD configuration. At least one mongoose \nschema must be registered to use the CRUD routines.\n\n```javascript\n\nvar Mongoose = require('mongoose')\n  , Schema = mongoose.Schema\n\nMongoose.connect('mongodb://localhost/db')\n\nFoo = new Schema({\n  bar: { type: String, index: true }\n})\n\ndb = Mongoose.connect('mongodb://localhost/db')\n````\n\n(Optional) Configure the Redis connection if you would like to use Redis \nas the pubsub mechanics. This will allow you to use other libraries \nsuch as Cluster, letting Redis act as the message queue. If you don't \nuse redis, the package will default to a single-threaded mode, which will \nwork fine so long as you don't have multiple instances of node running.\n\n```javascript\n\nvar redis = require('redis')\n  , pub = redis.createClient()\n  , sub = redis.createClient()\n````\n\nStart the node server, and attach the backbone-dnode middleware\nto the DNode instance.\n\n```javascript\n\nserver.listen(8080)\ndnode()\n  .use(BackboneDNode.pubsub({\n    publish: pub\n  , subscribe: sub \n  }))\n  .use(BackboneDNode.crud({\n    database: db\n  }))\n  .listen(server)\n````\n\n## Client usage\n\nSimply include the client-side part of the package onto the page, which\nmay differ depending on how you serve up your static content.\n\n```html\n<script src=\"/dnode.js\"></script>\n<script src=\"/dnode.backbone.js\"></script>\n````\n\nThe package will need to be configured as well, allowing it to be used\nas DNode middleware, if you wish to use the pubsub methods of the package, \nenable it, as it is not used by default.  This will broadcast all changes \nto any models to anyone else connected, otherwise, it will only call back to \nthe current client, and use the default Backbone `success` methods.\n\n```javascript\n\nDNode()\n  .use(root.dnodeBackbone({\n    pubsub: true\n  }))\n  .connect()\n````\n\n\nTo connect to node.js and mongoose from the browser (or on the server), \na model `type` for mongoose must be specified, as well as overriding the \n`sync` method on each model, an underscore mixin has been created to\nprovide optional support based on the model, in case you have different \npersistant support in mind.\n\n```javascript\n\nfoo = Backbone.Model.extend({\n  type: 'room'\n, sync: _.sync\n})\n````\n\nNow create the collection, the attributes are set on both the model and \ncollection to ensure that they will both use the same persistance, even if \na model is created outside of the collection.\n\n```javascript\n\nFooCollection = Backbone.Collection.extend({\n  url: 'foos'\n, type: 'foo'\n, sync: _.sync\n, model: Foo\n})\n````\n\nYou can also override the sync method globally, by overriding \nthe default `Backbone.sync` method\n\n```javascript\n\nBackbone.sync = _.sync\n````\n\nOnce the middleware has been established, and a model has been set to use \nit (or if as been overridden globally), the default Backbone methods will \nautomatically send the changes through the socket (dnode), where they will \nbe mapped to the corresponding Mongoose schema, and then published to the \nconnected clients that have been subscribed to the model or collection's URL.\n\n```javascript\nvar options = {}\n  , foos = new FooCollection()\n\nfoos.subscribe(options, function() {\n  foos.fetch({\n    finished: function(model, resp, options) {\n      // The server has responded with the fetched data, \n      // and has added to the collection\n    }\n  , error: function(model, resp, options) {\n      // Something went wrong, the server has responded with \n      // an error code for client side handling\n    }\n  })\n})\n````\n\nWhen the `subscribe` method has returned, you are now able to use all of the default \nBackbone model methods and have them interact with the server.  When using any of the \nBackbone `fetch`, `save`, `create`, or `delete` methods, a callback function will be \nused when the server responds, and a `finished` method will be executed when the middleware \nis done with the Backbone integration methods. Can optionally pass in an `error` method that \nwill be triggered if anything goes wrong on the server side.  Think of `finished` as the \nBackbone `success` callback when normally using these methods, the name is changed to avoid \nconflicts.\n\n```javascript\n\nfoos.create({\n    bar : 'something'\n})\n````\n\nBackbone.fetch() has been overloaded to accept a `query` and `sorting` argument, which will be \ndirectly used on the server against the Mongoose ORM.  The default behavior for passing in `silent:true` \nor `add:true` will still be used.\n\n```javascript\n\nfoos.fetch({\n  query: { bar : 'something' }\n, sorting: { sort: [['created',-1]], limit: 20 }\n})\n````\n\n","maintainers":[{"name":"sorensen","email":"mail@beausorensen.com"}]}},"maintainers":[{"name":"sorensen","email":"mail@beausorensen.com"}],"time":{"modified":"2012-01-07T20:34:26.474Z","created":"2011-07-07T16:05:10.564Z","0.1.0":"2011-07-07T16:05:10.717Z","0.1.1":"2011-07-09T01:02:57.535Z","0.1.2":"2011-07-09T01:06:47.681Z","0.1.3":"2011-07-09T01:10:47.568Z","0.1.4":"2011-07-09T19:09:24.402Z","0.1.5":"2011-07-09T21:04:25.801Z","0.1.6":"2011-07-09T21:20:42.615Z","0.1.7":"2011-07-09T21:58:50.719Z","0.1.8":"2011-07-10T23:44:19.226Z","0.1.9":"2011-07-10T23:54:23.279Z","0.1.10":"2011-07-11T00:20:33.786Z","0.1.11":"2011-07-11T00:22:55.100Z","0.1.12":"2011-07-11T00:24:17.344Z","0.1.14":"2011-07-11T02:20:17.439Z","0.1.15":"2011-07-11T03:35:49.220Z","0.1.16":"2011-07-11T05:42:45.704Z","0.1.17":"2011-07-11T20:40:44.921Z","0.1.18":"2011-07-11T20:43:39.168Z","0.2.0":"2011-07-12T02:18:33.644Z","0.2.1":"2011-07-12T20:12:08.175Z","0.2.2":"2011-07-13T02:52:03.547Z","0.2.3":"2011-07-13T06:32:00.470Z","0.2.4":"2011-07-13T06:33:51.265Z","0.2.5":"2011-07-16T20:15:28.799Z","0.2.6":"2011-07-16T23:33:46.881Z","0.2.8":"2011-07-18T01:00:09.200Z","0.3.0":"2011-07-23T19:09:41.905Z","0.3.2":"2011-08-25T00:35:02.410Z","0.4.0":"2011-12-22T02:38:58.650Z","0.4.1":"2012-01-07T20:34:26.474Z"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"repository":{"type":"git","url":"git://github.com/sorensen/backbone-dnode.git"},"_attachments":{"backbone-dnode-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-vQsKZ49UqoMX7G8udBg7UQ==","length":73572,"stub":true},"backbone-dnode-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-ioIeKXHHZVApc4v9hQ9B2g==","length":73702,"stub":true},"backbone-dnode-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-z9Cb4Oe48SM6r8pynElO5g==","length":97733,"stub":true},"backbone-dnode-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-YttsX/VKIXyPfM0Uu4qSlA==","length":42970,"stub":true},"backbone-dnode-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-BoeyJWj1NkVA75oVoUAewA==","length":42456,"stub":true},"backbone-dnode-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-6SolcdFrLUM6sR/Il/G4fg==","length":40550,"stub":true},"backbone-dnode-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-2ZLntCxMnv98tvqnsQTI4w==","length":56749,"stub":true},"backbone-dnode-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-lP43e88c04JLGFB/nZcGvQ==","length":56507,"stub":true},"backbone-dnode-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-yBBD+3hT/PngqMSE0WxVvQ==","length":56513,"stub":true},"backbone-dnode-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-xo6kWqDZdfxdlV9Ji7vO/Q==","length":51832,"stub":true},"backbone-dnode-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-A9FSfl9OKMaPpDjL6C76vw==","length":51962,"stub":true},"backbone-dnode-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-4rCkcTblolmAkLqJmKKnZA==","length":51908,"stub":true},"backbone-dnode-0.1.18.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-s6oShzq7O9OoRn9OW9t/uw==","length":51515,"stub":true},"backbone-dnode-0.1.17.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Gk3g6wyuctPQEk2/q6MRsw==","length":51562,"stub":true},"backbone-dnode-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-brQ9CYPQqNavGOx7OjNmcQ==","length":51588,"stub":true},"backbone-dnode-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-BkbwkY3gLGsRb3fvPRe/Wg==","length":51573,"stub":true},"backbone-dnode-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-zS9MvxZnSQ1pQUXIn/aFoQ==","length":51533,"stub":true},"backbone-dnode-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-/eaX469M4MaUL/H++1sIBQ==","length":51484,"stub":true},"backbone-dnode-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-B5dKwk958LaSZphi50X3Jw==","length":51468,"stub":true},"backbone-dnode-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-HlnX7+17inN2mfmAVmc/YQ==","length":51964,"stub":true},"backbone-dnode-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-tjSuuL7RQ8V95nmfXTYYyw==","length":51453,"stub":true},"backbone-dnode-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-PF2AH3QqM6I8xWo1B/b0tQ==","length":51455,"stub":true},"backbone-dnode-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-YDIDECRHEa94zU6RXtEmag==","length":51457,"stub":true},"backbone-dnode-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-N7EIxcZWm2pqBLBAcnGuAg==","length":51786,"stub":true},"backbone-dnode-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Ackv0cJgu0CCUaDwa2bXAw==","length":51616,"stub":true},"backbone-dnode-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-A5JebrPO9Gr5nZL7ZRG5fw==","length":51237,"stub":true},"backbone-dnode-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lEokooDFFwYJHWlmI/8m1A==","length":51023,"stub":true},"backbone-dnode-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1MDbGCg2admzQ84VJxKoGA==","length":51620,"stub":true},"backbone-dnode-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2mnWcX9qCDw2oFsggGSymw==","length":51231,"stub":true},"backbone-dnode-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xK7t9YkLKZJ9sYuZ7Q0WQA==","length":43014,"stub":true}}}},
{"id":"backbone-ducktyped","key":"backbone-ducktyped","value":{"rev":"3-46e65dcbd02ed6731829566d4a493f62"},"doc":{"_id":"backbone-ducktyped","_rev":"3-46e65dcbd02ed6731829566d4a493f62","name":"backbone-ducktyped","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","dist-tags":{"latest":"0.9.2"},"versions":{"0.9.2":{"name":"backbone-ducktyped","description":"Give your JS App some Backbone with Models, Views, Collections, and Events.","url":"http://backbonejs.org","keywords":["util","functional","server","client","browser"],"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"contributors":[],"dependencies":{"underscore":">=1.3.1"},"lib":".","main":"backbone.js","version":"0.9.2","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"backbone-ducktyped@0.9.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"16f89adc57e613dae56f4b71c1f9b9549598d5fa","tarball":"http://registry.npmjs.org/backbone-ducktyped/-/backbone-ducktyped-0.9.2.tgz"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}]}},"readme":"     ____                     __      __                                                 \n    /\\  _`\\                  /\\ \\    /\\ \\                                   __           \n    \\ \\ \\ \\ \\     __      ___\\ \\ \\/'\\\\ \\ \\____    ___     ___      __      /\\_\\    ____  \n     \\ \\  _ <'  /'__`\\   /'___\\ \\ , < \\ \\ '__`\\  / __`\\ /' _ `\\  /'__`\\    \\/\\ \\  /',__\\ \n      \\ \\ \\ \\ \\/\\ \\ \\.\\_/\\ \\__/\\ \\ \\\\`\\\\ \\ \\ \\ \\/\\ \\ \\ \\/\\ \\/\\ \\/\\  __/  __ \\ \\ \\/\\__, `\\\n       \\ \\____/\\ \\__/.\\_\\ \\____\\\\ \\_\\ \\_\\ \\_,__/\\ \\____/\\ \\_\\ \\_\\ \\____\\/\\_\\_\\ \\ \\/\\____/\n        \\/___/  \\/__/\\/_/\\/____/ \\/_/\\/_/\\/___/  \\/___/  \\/_/\\/_/\\/____/\\/_/\\ \\_\\ \\/___/ \n                                                                           \\ \\____/      \n                                                                            \\/___/       \n    (_'_______________________________________________________________________________'_)\n    (_.———————————————————————————————————————————————————————————————————————————————._)\n                                               \n                                              \nBackbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.\n\nFor Docs, License, Tests, pre-packed downloads, and everything else, really, see:\nhttp://backbonejs.org\n\nTo suggest a feature, report a bug, or general discussion:\nhttp://github.com/documentcloud/backbone/issues/\n\nAll contributors are listed here:\nhttp://github.com/documentcloud/backbone/contributors\n\nSpecial thanks to Robert Kieffer for the original philosophy behind Backbone. \nhttp://github.com/broofa\n","maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"time":{"modified":"2012-05-08T00:03:30.545Z","created":"2012-05-08T00:03:26.150Z","0.9.2":"2012-05-08T00:03:30.545Z"},"author":{"name":"Jeremy Ashkenas","email":"jeremy@documentcloud.org"},"_attachments":{"backbone-ducktyped-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sa+Zm6Ut+w7oyGkm+X9iXA==","length":7121656,"stub":true}}}},
{"id":"backbone-ender","key":"backbone-ender","value":{"rev":"5-d9fe84f63457b2a939b3c55918605b30"},"doc":{"_id":"backbone-ender","_rev":"5-d9fe84f63457b2a939b3c55918605b30","name":"backbone-ender","description":"Backbone powered by Ender instead of jQuery/Zepto","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"backbone-ender","version":"0.0.1","description":"Backbone powered by Ender instead of jQuery/Zepto","author":{"name":"Alexander Kovalev","email":"alexander.kovaleff@gmail.com"},"repository":{"type":"git","url":"git@github.com:akovalev/backbone-ender.git"},"dependencies":{"ender-sc":"=0.0.1","underscore":">=1.1.2"},"main":"./index.js","engines":{"node":"~>0.4.0"},"_npmJsonOpts":{"file":"/Users/kovalev/.npm/backbone-ender/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-ender@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4fbfd79f486c7ff99439adcea6ce5ff51d4c43b5","tarball":"http://registry.npmjs.org/backbone-ender/-/backbone-ender-0.0.1.tgz"},"maintainers":[{"name":"akovalev","email":"alexander.kovaleff@gmail.com"}]},"0.0.2":{"name":"backbone-ender","version":"0.0.2","description":"Backbone powered by Ender instead of jQuery/Zepto","author":{"name":"Alexander Kovalev","email":"alexander.kovaleff@gmail.com"},"repository":{"type":"git","url":"git@github.com:akovalev/backbone-ender.git"},"dependencies":{"ender-sc":"=0.0.1","underscore":">=1.1.2"},"main":"./index.js","engines":{"node":"~>0.4.0"},"_npmJsonOpts":{"file":"/Users/kovalev/.npm/backbone-ender/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-ender@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"13bc36b7adf95168c2f6f870cad979e677043cd4","tarball":"http://registry.npmjs.org/backbone-ender/-/backbone-ender-0.0.2.tgz"},"maintainers":[{"name":"akovalev","email":"alexander.kovaleff@gmail.com"}]}},"maintainers":[{"name":"akovalev","email":"alexander.kovaleff@gmail.com"}],"time":{"modified":"2011-10-06T14:25:28.139Z","created":"2011-10-05T14:47:53.207Z","0.0.1":"2011-10-05T14:47:54.692Z","0.0.2":"2011-10-06T14:25:28.139Z"},"author":{"name":"Alexander Kovalev","email":"alexander.kovaleff@gmail.com"},"repository":{"type":"git","url":"git@github.com:akovalev/backbone-ender.git"},"_attachments":{"backbone-ender-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZmVWwmoV1l8uuNY+u5Qwyg==","length":15261,"stub":true},"backbone-ender-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GDyRg4anPtl4N20PrQO8yA==","length":15356,"stub":true}}}},
{"id":"backbone-forms","key":"backbone-forms","value":{"rev":"3-c01ec3d3506c28c2afa4f4abe5d714b2"},"doc":{"_id":"backbone-forms","_rev":"3-c01ec3d3506c28c2afa4f4abe5d714b2","name":"backbone-forms","description":"Form framework for BackboneJS with nested forms, editable lists and validation","dist-tags":{"latest":"0.10.0"},"versions":{"0.10.0":{"name":"backbone-forms","description":"Form framework for BackboneJS with nested forms, editable lists and validation","author":{"name":"Charles Davison"},"version":"0.10.0","dependencies":{"backbone":">=0.9.2"},"devDependencies":{"buildify":"latest","underscore":"latest","uglify-js":"latest"},"main":"src/backbone-forms.js","_npmUser":{"name":"powmedia","email":"charlie@powmedia.co.uk"},"_id":"backbone-forms@0.10.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8d9b6aa6d48b804c6c58e402e713d86b2ce7c1b6","tarball":"http://registry.npmjs.org/backbone-forms/-/backbone-forms-0.10.0.tgz"},"maintainers":[{"name":"powmedia","email":"charlie@powmedia.co.uk"}]}},"readme":"#backbone-forms\n\nA flexible, customisable form framework for Backbone.JS applications.\n\n- Simple schema definition to auto-generate forms\n- Validation\n- Nested forms\n- Advanced and custom editors (e.g. NestedModel, List, Date, DateTime)\n- Custom HTML templates\n\n\n###Example\n\n    var User = Backbone.Model.extend({\n        schema: {\n            title:      { type: 'Select', options: ['Mr', 'Mrs', 'Ms'] },\n            name:       'Text',\n            email:      { validators: ['required', 'email'] },\n            birthday:   'Date',\n            password:   'Password',\n            address:    { type: 'NestedModel', model: Address },\n            notes:      { type: 'List', listType: 'Text' }\n        }\n    });\n    \n    var user = new User();\n    \n    var form = new Backbone.Form({\n        model: user\n    }).render();\n    \n    $('body').append(form.el);\n\n\n###Live editable demos\n- [User form](http://jsfiddle.net/evilcelery/VkUFu/)\n- [Form with Bootstrap templates and a List of NestedModels using the Bootstrap Modal adapter](http://jsfiddle.net/evilcelery/4XZMb/)\n\n\n\n<a name=\"top\"/>\n##Guide\n\n###Table of Contents:\n- [Installation](#installation)\n- [Usage](#usage)\n- [Schema Definition](#schema-definition)\n  - [Text](#editor-text)\n  - [Checkboxes](#editor-checkboxes)\n  - [Select](#editor-select)\n  - [Radio](#editor-radio)\n  - [Object](#editor-object)\n  - [NestedModel](#editor-nestedmodel)\n  - [Date](#editor-date)\n  - [DateTime](#editor-datetime)\n  - [List](#editor-list)\n- [Validation](#validation)  \n- [Customising templates](#customising-templates)\n- [More](#more)\n  - [Editors without forms](#editors-without-forms)\n  - [Using nested fields](#nested-fields)\n  - [Custom editors](#custom-editors)\n  - [Help](#help)\n  - [Changelog](#changelog)\n\n\n\n<a name=\"installation\"/>\n##Installation\n\nDependencies:\n- [Backbone 0.9.2](http://documentcloud.github.com/backbone/)\n\n\nInclude backbone-forms.js and backbone-forms.css:\n\n    <script src=\"backbone-forms/distribution/backbone-forms.min.js\"></script>\n    <link href=\"backbone-forms/distribution/templates/default.css\" rel=\"stylesheet\" />\n\nOptionally, you can include the extra editors, for example the List editor:\n\n    <script src=\"backbone-forms/distribution/editors/list.min.js\"></script>\n    \nTo use a custom template pack, e.g. Bootstrap, include the relevants file after backbone-forms.js. You can remove `templates/default.css` and replace it with `templates/bootstrap.css`.\n\n    <script src=\"backbone-forms/distribution/templates/bootstrap.js\"></script>\n    <link href=\"backbone-forms/distribution/templates/bootstrap.css\" rel=\"stylesheet\" />\n\nIf you use Backbone with node.js, you can just `require('backbone-forms');` in your index file.\n\nNote there is also a distribution file for RequireJS / AMD.\n\n[Back to top](#top)\n\n\n\n<a name=\"usage\"/>\n##Usage\n\nDefine a 'schema' attribute on your Backbone models. The schema keys should match the attributes that get set on the model. `type` defaults to `Text`.  When you don't need to specify any options you can use the shorthand by passing the editor name as a string.\nSee [schema definition](#schema-definition) for more information.\n\n    var User = Backbone.Model.extend({\n        schema: {\n            title:      { type: 'Select', options: ['Mr', 'Mrs', 'Ms'] },\n            name:       'Text',\n            email:      { validators: ['required', 'email'] },\n            birthday:   'Date',\n            password:   'Password',\n            address:    { type: 'NestedModel', model: Address },\n            notes:      { type: 'List', listType: 'Text' }\n        }\n    });\n    \n    var user = new User();\n    \n    var form = new Backbone.Form({\n        model: user\n    }).render();\n    \n    $('body').append(form.el);\n\n\nOnce the user is done with the form, call commit() to apply the updated values to the model. If there are validation errors they will be returned. See [validation](#validation) for more information.\n\n    var errors = form.commit();\n\nTo update a field after the form has been rendered, use `setValue`:\n\n    model.bind('change:name', function(model, name) {\n        form.setValue({ name: name });\n    });\n\n\n###Usage without models\n\nYou can create a form without tying it to a model. For example, to create a form for a simple object of data:\n\n    var form = new Backbone.Form({\n        //Data to populate the form with\n        data: {\n          id: 123,\n          name: 'Rod Kimble',\n          password: 'cool beans'\n        },\n        \n        //Schema\n        schema: {\n            id:         'Number',\n            name:       'Text',\n            password:   'Password'\n        }\n    }).render();\n\nThen instead of form.commit(), do:\n    \n    var data = form.getValue(); //Returns object with new form values\n\n\n###Initial data\nIf a form has a model attached to it, the initial values are taken from the model's defaults. Otherwise, you may pass default values using the `schema.data`.\n\n\n<a name=\"schema-definition\"/>\n##Schema definition\n\nThe schema defined on your model can be the schema object itself, or a function that returns a schema object. This can be useful if you're referencing variables that haven't been initialized yet.\n\nThe following default editors are included:\n\n- [Text](#editor-text)\n- Number\n- Password\n- TextArea\n- Checkbox\n- [Checkboxes](#editor-checkboxes)\n- Hidden\n- [Select](#editor-select)\n- [Radio](#editor-radio)\n- [Object](#editor-object)\n- [NestedModel](#editor-nestedmodel)\n- [Date](#editor-date)\n- [DateTime](#editor-datetime)\n- [List](#editor-list) An editable list of items (included in a separate file: distribution/editors/list.min.js)\n\n\nThe old jQuery editors are still included but may be moved to another repository:\n- [jqueryui.List](#editor-jui-list)\n- jqueryui.Date (uses the jQuery UI popup calendar)\n- jqueryui.DateTime\n\n\n\n##Main attributes\n\nFor each field definition in the schema you can use the following optional attributes:\n\n**`type`**\n\n- The editor to use in the field\n- Can be a string for any editor that has been added to Backbone.Form.editors, such as the built-in editors. E.g.: `{ type: 'TextArea' }`\n- Or can be a constructor function, e.g. for a custom editor: `{ type: MyEditor }`\n- If not defined, defaults to 'Text'\n\n**`title`**\n\n- Defines the text that appears in a form field's &lt;label&gt;\n- If not defined, defaults to a formatted version of the camelCased field key. E.g. `firstName` becomes `First Name`. This behaviour can be changed by assigning your own function to Backbone.Form.helpers.keyToTitle.\n\n**`validators`**\n\n- A list of validators. See [Validation](#validation) for more information\n\n**`help`**\n\n- Help text to add next to the editor.\n\n**`editorClass`**\n\n- String of CSS class name(s) to add to the editor\n\n**`editorAttrs`**\n\n- A map of attributes to add to the editor, e.g. `{ maxlength: 30, title: 'Tooltip help' }`\n\n**`fieldClass`**\n\n- String of CSS class name(s) to add to the field\n\n**`fieldAttrs`**\n\n- A map of attributes to add to the field, e.g. `{ style: 'background: red', title: 'Tooltip help' }`\n\n**`template`**\n\n- Name of the template to use for this field. See [Customising templates](#customising-templates) for more information.\n\n\n\n<a name=\"editor-text\"/>\n##Text\n\nCreates a normal text input.\n\n**`dataType`**\n\n- Changes the type=\"text\" attribute. Used for HTML5 form inputs such as `url`, `tel`, `email`.  When viewing on a mobile device e.g. iOS, this will change the type of keyboard that is opened. For example, `tel` opens a numeric keypad.\n\n\n<a name=\"editor-select\"/>\n##Select\n\nCreates and populates a &lt;select&gt; element.\n\n**`options`**\n\n- Options to populate the &lt;select&gt;\n- Can be either:\n    - String of HTML &lt;option&gt;`s\n    - Array of strings/numbers\n    - Array of objects in the form `{ val: 123, label: 'Text' }`\n    - A Backbone collection\n    - A function that calls back with one of the above \n\nExamples:\n    \n    var schema = {\n        country: { type: 'Select', options: new CountryCollection() }\n    };\n    \n    var schema = {\n        users: { type: 'Select', options: function(callback) {\n            users = db.getUsers();\n            \n            callback(users);\n        }}\n    }\n\n**Backbone collection notes**\n\nIf using a Backbone collection as the `option` attribute, models in the collection must implement a `toString()` method. This populates the label of the &lt;option&gt;. The ID of the model populates the `value` attribute.\n\nIf there are no models in the collection, it will be `fetch()`ed.\n\n\n<a name=\"editor-radio\"/>\n##Radio\n\nCreates and populates a list of radio inputs. Behaves the same way and has the same options as a `Select`.\n\n\n<a name=\"editor-checkboxes\"/>\n##Checkboxes\n\nCreates and populates a list of checkbox inputs. Behaves the same way and has the same options as a `Select`. To set defaults for this editor, use an array of values.\n\n\n<a name=\"editor-object\"/>\n##Object\n\nThe Object editor creates an embedded child form representing a Javascript object.\n\n**`subSchema`**\n\n- A schema object which defines the field schema for each attribute in the object\n\nExamples:\n\n    var schema = {\n        address: { type: 'Object', subSchema: {\n            street: {},\n            zip: { type: 'Number' },\n            country: { 'Select', options: countries }\n        }}\n    };\n\n\n<a name=\"editor-nestedmodel\"/>\n##NestedModel\n\nUsed to embed models within models.  Similar to the Object editor, but adds validation of the child form (if it is defined on the model), and keeps your schema cleaner.\n\n**`model`**\n\n- A reference to the constructor function for your nested model\n- The referenced model must have it's own `schema` attribute\n\nExamples:\n\n    var schema = {\n        address: { type: 'NestedModel', model: Address }\n    };\n    \n\n\n<a name=\"editor-date\"/>\n##Date\n\nCreates `<select>`s for date, month and year.\n\n**`yearStart`**\n- First year in the list. Default: 100 years ago\n\n**`yearEnd`**\n- Last year in the list. Default: current year\n\n\n####Extra options\nYou can customise the way this editor behaves, throughout your app:\n\n    var editors = Backbone.Form.editors;\n    \n    editors.Date.showMonthNames = false; //Defaults to true\n    editors.Date.monthNames = ['Jan', 'Feb', ...] //Defaults to full month names in English\n\n\n<a name=\"editor-datetime\"/>\n##DateTime\n\nCreates a Date editor and adds `<select>`s for time (hours and minutes).\n\n**`minsInterval`**\n\n- Optional. Controls the numbers in the minutes dropdown.\n- Defaults to 15, so it is populated with 0, 15, 30, and 45 minutes.\n\n\n<a name=\"editor-list\"/>\n##List\n\nCreates a list of items that can be added, removed and edited. Used to manage arrays of data.\n\nThis is a special editor which is in **a separate file and must be included**:\n\n    <script src=\"backbone-forms/distribution/editors/list.min.js\" />\n\n**If using the `Object` or `NestedModel` listType**, you will need to include a modal adapter on the page. [Backbone.BootstrapModal](http://github.com/powmedia/backbone.bootstrap-modal) is provided for this purpose. It must be included on the page:\n\n    <script src=\"backbone-forms/distribution/adapters/backbone.bootstrap-modal.min.js\" />\n\n*This list replaces the old jQueryUI list, but may need some upgrade work. The old jQueryUI List editor is still included in a separate file.*\n\n\n####Schema options\n**`itemType`**\n\n- Defines the editor that will be used for each item in the list.\n- Similar in use to the main 'type' schema attribute.\n- Defaults to 'Text'.\n\n**`confirmDelete`**\n\n- Optional. Text to display in a delete confirmation dialog. If falsey, will not ask for confirmation.\n\n**`itemToString`**\n\n- Optional, but recommended when using listType 'Object'\n- A function that returns a string representing how the object should be displayed in a list item.\n- When listType is 'NestedModel', the model's `toString()` method will be used, unless a specific `itemToString()` function is defined on the schema.\n\n\nExamples:\n    \n    function userToName(user) {\n        return user.firstName + ' ' + user.lastName;\n    }\n    \n    var schema = {\n        users: { type: 'List', itemType: 'Object', itemToString: userToName }\n    };\n\n\n\n<a name=\"form-options\"/>\n##Form options\n\n**`model`**\n\nThe model to tie the form to. Calling `form.commit()` will update the model with new values.\n\n**`data`**\n\nIf not using the `model` option, pass a native object through the `data` option. Then use `form.getValue()` to get the new values.\n\n**`schema`**\n\nThe schema to use to create the form. Pass it in if you don't want to store the schema on the model, or to override the model schema.\n\n**`fieldsets`**\n\nAn array of fieldsets descriptions. A fieldset is either a list of field names, or an object with `legend` and `fields` attributes. The `legend` will be inserted at the top of the fieldset inside a `<legend>` tag; the list of fields will be treated as `fields` is below.\n\n`fieldsets` takes priority over `fields`.\n\n**`fields`**\n\nAn array of field names (keys). Only the fields defined here will be added to the form. You can also use this to re-order the fields.\n\n**`idPrefix`**\n\nA string that will be prefixed to the form DOM element IDs. Useful if you will have multiple forms on the same page. E.g. `idPrefix: 'user-'` will result in IDs like 'user-name', 'user-email', etc.\n\nIf not defined, the model's CID will be used as a prefix to avoid conflicts when there are multiple instances of the form on the page. To override this behaviour, pass a null value to `idPrefix`.\n\n**`template`**\n\nThe template name to use for generating the form. E.g.:\n\n    Backbone.Form.setTemplates({\n      customForm: '<form class=\"custom-form\">{{fieldsets}}</form>'\n    });\n    \n    var form = new Backbone.Form({\n      model: user,\n      template: 'customForm'\n    });\n\n[Back to top](#top)\n\n\n\n<a name=\"validation\"/>\n##Validation\n\nThere are 2 levels of validation: schema validators and the regular built-in Backbone model validation. Backbone Forms will run both when either `form.commit()` or `form.validate()` are called.\n\n\n###Schema validation\n\nValidators can be defined in several ways:\n\n- **As a string** - Shorthand for adding a built-in validator. You can add custom validators to this list by adding them to `Backbone.Form.validators`. See the source for more information.\n- **As an object** - For adding a built-in validator with options, e.g. overriding the default error message.\n- **As a function** - Runs a custom validation function. Each validator the following arguments: `value` and `formValues`\n- **As a regular expression** - Runs the built-in `regexp` validator with a custom regular expresssion.\n\n###Examples\n\n    var schema = {\n        //Built-in validator\n        name: { validators: ['required'] },\n        \n        //Multiple built-in validators\n        email: { validators: ['required', 'email'] },\n        \n        //Built-in editors with options:\n        password: { validators: [\n            { type: 'match', field: 'passwordConfirm', message: 'Passwords must match!' }\n        ] },\n        \n        //Regular expression\n        foo: { validators: [/foo/] },\n        \n        //Custom function\n        username: { validators: [\n            function checkUsername(value, formValues) {\n                var err = {\n                    type: 'username',\n                    message: 'Usernames must be at least 3 characters long'\n                };\n                \n                if (value.length < 3) return err;\n            }\n        ] }\n    }\n\n\n###Handling errors\n\nError messages will be added to the field's help text area, and a customisable `bbf-error` class will be added to the field element so it can be styled with CSS.\n\nValidation runs when `form.commit()` or `form.validate()` are called.  If validation fails, an error object is returned with the `type` (validator that failed) and customisable `message`:\n\n    //Example returned errors from form validation:\n    {\n        name:   { type: 'required', message: 'Required' },              //Error on the name field\n        email:  { type: 'email', message: 'Invalid email address' },    //Error on the email field\n        _others: ['Custom model.validate() error']                      //Error from model.validate()\n    }\n\n\n###Built-in validators\n\n- **required**: Checks the field has been filled in\n- **email**: Checks it is a valid email address\n- **url**: Checks it is a valid URL\n- **match**: Checks that the field matches another. The other field name must be set in the `field` option.\n- **regexp**: Runs a regular expression. Requires the `regexp` option, which takes a compiled regular expression.\n\n\n###Customising error messages\n\nAfter including the Backbone Forms file, you can override the default error messages.\n\n{{mustache}} tags are supported; they will be replaced with the options passed into the validator configuration object. `{{value}}` is a special tag which is passed the current field value.\n\n    Backbone.Form.validators.errMessages.required = 'Please enter a value for this field.';\n    \n    Backbone.Form.validators.errMessages.match = 'This value must match the value of {{field}}';\n    \n    Backbone.Form.validators.errMessages.email = '{{value}} is an invalid email address.';\n\nYou can also override the error message on a field by field basis by passing the `message` option in the validator config.\n\n\n###Model validation\n\nIf your models have a `validate()` method the errors will be added to the error object.  To make the most of the validation system, the method should return an error object, keyed by the field object. If an unrecognised field is added, or just a string is returned, it will be added to the `_others` array of errors:\n\n    var User = Backbone.Model.extend({\n        validate: function(attrs) {\n            var errs = {};\n            \n            if (usernameTaken(attrs.username)) errs.username = 'The username is taken'\n            \n            if !_.isEmpty(errs) return errs;\n        }\n    })\n\n\n\n\n###Schema validators\nForms provide a `validate` method, which returns a dictionary of errors, or `null`. Validation is determined using the `validators` attribute on the schema (see above).\n\nIf you model provides a `validate` method, then this will be called when you call `Form.validate`. Forms are also validated when you call `commit`. See the Backbone documentation for more details on model validation.\n\nExample:\n\n    //Schema definition:\n    var schema = {\n        name: { validators: ['required']\n    }\n    \n    var errors = form.commit();\n\n[Back to top](#top)\n\n\n\n<a name=\"customising-templates\"/>\n##Customising templates\n\nBackbone-Forms comes with a few options for rendering HTML. To use another template pack, such as for [Bootstrap](http://twitter.github.com/bootstrap/), just include the .js file from the `templates` folder, after including `backbone-forms.js`.\n\nYou can use your own custom templates by passing your templates (in Mustache syntax) and class names into `Backbone.Form.setTemplates()`. See the included templates files for examples.\n\nYou can include different field templates and then use them on a field-by-field basis by passing the `template` option in the field schema.\n\nExample: \n\n    var templates = {\n      //field is the default template used\n      field: '\\\n        <div>\\\n          <label for=\"{{id}}\">{{title}}</label>\\\n          <div>{{editor}}</div> <div>{{help}}</div>\\\n        </div>\\\n      ',\n    \n      //Specify an alternate field template\n      altField: '<div class=\"altField\">{{editor}}</div>'\n    };\n    \n    //Set the templates\n    Backbone.Form.setTemplates(templates, classNames);\n    \n    var schema = {\n      age: { type: 'Number' }, //Uses the default 'field' template\n      name: { template: 'altField' } //Uses the 'altField' template\n    };\n\n[Back to top](#top)\n\n\n\n<a name=\"changing-template-compiler\"/>\n###Changing template compiler\n\nYou can use your own custom template compiler, like [Handlebars](http://handlebarsjs.com/) by passing a reference to the function into `Backbone.Form.setTemplateCompiler()`.\n\nExample:\n\n    Backbone.Form.setTemplateCompiler(Handlebars.compile);\n\n[Back to top](#top)\n\n\n\n<a name=\"more\"/>\n##More\n\n<a name=\"editors-without-forms\"/>\n###Editors without forms\n\nYou can add editors by themselves, without being part of a form. For example: \n\n    var select = new Backbone.Form.editors.Select({\n        model: user,\n        key: 'country',\n        options: getCountries()\n    }).render();\n    \n    //When done, apply selection to model:\n    select.commit();\n\n\n<a name=\"nested-fields\"/>\n###Using nested fields\n\nIf you are using a schema with nested attributes (using the `Object` type), you may want to include only some of the nested fields in a form. This can be accomplished by using 'path' syntax as in the example below.\n\nHowever, due to Backbone's lack of support for nested model attributes, getting and setting values will not work out of the box.  For this to work as expected you must adapt your model's get() and set() methods to handle the path names, or simply use [DeepModel](http://github.com/powmedia/backbone-deep-model) which will handle paths for you automatically.\n\n    var Model = Backbone.DeepModel.extend({\n        schema: {\n            title: 'Text',\n            author: { type: 'Object', subSchema: {\n                id: 'Number',\n                name: { type: 'Object', subSchema: {\n                    first: 'Text',\n                    last: 'Text'\n                }}\n            }}\n        }\n    });\n    \n    var form = new Backbone.Form({\n        model: new Model,\n        fields: ['title', 'author.id', 'author.name.last']\n    }).render();\n\nThe following shorthand is also valid:\n\n    var Model = Backbone.DeepModel.extend({\n        schema: {\n            title: 'Text',\n            'author.id': 'Number',\n            'author.name.first': 'Text'\n        }\n    });\n\n    var form = new Backbone.Form({\n        model: new Model\n    })\n\n\n<a name=\"custom-editors\"/>\n###Custom editors\n\nWriting a custom editor is simple. They must extend from Backbone.Form.editors.Base.\n    \n    var CustomEditor = Backbone.Form.editors.Base.extend({\n        \n        tagName: 'input',\n        \n        initialize: function(options) {\n            //Call parent constructor\n            Backbone.Form.editors.Base.prototype.initialize.call(this, options);\n            \n            //Custom setup code.\n            if (this.schema.customParam) this.doSomething();\n        },\n        \n        render: function() {\n            this.setValue(this.value);\n            \n            return this;\n        },\n        \n        getValue: function() {\n            return $(this.el).val();\n        },\n        \n        setValue: function(value) {\n            $(this.el).val(this.value);\n        }\n        \n    });\n\n**Notes:**\n\n- The editor must implement a getValue() and setValue().\n- The original value is available through this.value.\n- The field schema can be accessed via this.schema. This allows you to pass in custom parameters.\n\n\n\n<a name=\"help\"/>\n##Help & discussion\n\n- [Google Groups](http://groups.google.com/group/backbone-forms)\n\n\n<a name=\"changelog\"/>\n##Changelog\n\n###0.10.0\n- Refactor rendering.\n    - <legend> tags are now defined in the template.\n    - Where a template is used, (e.g. advanced editors, field etc.), the entirety of the HTML is now defined in the template to make custom templating easier.\n    - All templates must now have a main 'parent' element.\n- Create new List, Date and DateTime editors that don't rely on jQuery UI.\n    - You will still need to use jQuery UI editors for the calendar.\n    - For list items of type `Object` and `NestedModel` you must include a modal adapter, such as the included Bootstrap Modal one. Should create one for jQuery UI.\n- Improve the way dependencies are defined and module is exported for browser & CommonJS\n- Add underscore dependency to AMD version\n- Use [buildify](http://github.com/powmedia/buildify) for building distribution files.\n- Rename jQuery UI editors to jqueryui.List, jqueryui.Date, jqueryui.DateTime. These may be moved to a separate repository soon.\n- Fix #65 Number editor Firefox NaN bug\n- Fix bug with hidden fields (jeffutter)\n- Fix AMD distribution bug (ikr)\n\n####Required changes when upgrading:\n- List editor:\n    - Change 'listType' to 'itemType' in schema definition.\n    - Make sure you have a modal adapter included if using Object and NestedModel itemTypes. See the List editor section.\n\n###0.9.0\n- Added ability to use a custom template compiler (geowa4)\n- Added distribution files (development and minified production versions)\n- Added AMD-compatible version (development and minified production versions)\n","maintainers":[{"name":"powmedia","email":"charlie@powmedia.co.uk"}],"time":{"modified":"2012-06-01T11:56:49.737Z","created":"2012-06-01T11:56:48.155Z","0.10.0":"2012-06-01T11:56:49.737Z"},"author":{"name":"Charles Davison"},"_attachments":{"backbone-forms-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hs3XQZVwNi8CPvX4uzQ8vA==","length":284988,"stub":true}}}},
{"id":"backbone-github","key":"backbone-github","value":{"rev":"3-a70a44a159148057dfccc5b46bcc24eb"},"doc":{"_id":"backbone-github","_rev":"3-a70a44a159148057dfccc5b46bcc24eb","name":"backbone-github","description":"Backbone models for the GitHub API","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.3":{"name":"backbone-github","version":"0.0.3","description":"Backbone models for the GitHub API","homepage":"https://github.com/trabian/backbone-github","author":{"name":"Matt Dean","email":"matt@trabian.com"},"bugs":{"email":"matt@trabian.com","url":"https://github.com/trabian/backbone-github/issues"},"stitch":{"paths":["src"]},"_npmUser":{"name":"trabianmatt","email":"matt@trabian.com"},"_id":"backbone-github@0.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"112cd8f2ab296d771d72eaa2a4503255beff70ee","tarball":"http://registry.npmjs.org/backbone-github/-/backbone-github-0.0.3.tgz"},"maintainers":[{"name":"trabianmatt","email":"matt@trabian.com"}]}},"readme":"The purpose of this project is to extract Backbone models that can be\nused to interact with the GitHub API.\n\nIt's currently being used primarily as part of [titanium-backbone-ks](https://github.com/trabian/titanium-backbone-ks) but will hopefully be improved to the point where it can be used in multiple contexts.\n","maintainers":[{"name":"trabianmatt","email":"matt@trabian.com"}],"time":{"modified":"2012-03-21T05:49:03.651Z","created":"2012-03-21T05:49:02.714Z","0.0.3":"2012-03-21T05:49:03.651Z"},"author":{"name":"Matt Dean","email":"matt@trabian.com"},"_attachments":{"backbone-github-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5EobzyGZojUhtDPzwi8K0A==","length":10240,"stub":true}}}},
{"id":"backbone-indexeddb","key":"backbone-indexeddb","value":{"rev":"17-fb3b62042ade9e0516e6b8b75e5535b4"},"doc":{"_id":"backbone-indexeddb","_rev":"17-fb3b62042ade9e0516e6b8b75e5535b4","name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.0":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.0","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","engines":{"node":"~0.6.9"},"dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"6838b7ee9f4e8496398517f2029fcc22163a4075","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.0.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.1":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.1","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","engines":{"node":"~0.6.9"},"dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"cdb7b7acb48ecded26184a01cc1409681ea2ee3f","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.1.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.2":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.2","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","engines":{"node":"~0.6.9"},"dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"a465c2cc09bfc19bc421ac5efeeb0e75e351e4d7","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.2.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.3":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.3","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","engines":{"node":"~0.6.9"},"dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"dad70a4647bbb523efe8aa6408ea9678674f60c8","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.3.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.4":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.4","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","engines":{"node":"~0.6.9"},"dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.4","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"c88454aff4701ec911ded9f63e18cb33362977e1","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.4.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.5":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.5","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","engines":{"node":"~0.6.9"},"dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"3f7a687a90209cd8c1a399b1caaeb15b81f6141f","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.5.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.6":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.6","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"af1fb87769c47057eb41c285ed4cc1b721f0581c","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.6.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]},"0.0.7":{"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"name":"backbone-indexeddb","description":"An backbone adapter for indexeddb. Useless for most people untile indexeddb is ported to the browser","version":"0.0.7","repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"main":"backbone-indexeddb.js","dependencies":{"backbone":"*","underscore":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"julien51","email":"julien@superfeedr.com"},"_id":"backbone-indexeddb@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"93262ca87f053c3b07091d9d793e1209e385e96a","tarball":"http://registry.npmjs.org/backbone-indexeddb/-/backbone-indexeddb-0.0.7.tgz"},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}]}},"readme":"","maintainers":[{"name":"julien51","email":"julien@superfeedr.com"}],"time":{"modified":"2012-04-15T13:15:39.892Z","created":"2012-01-30T20:53:40.178Z","0.0.0":"2012-01-30T20:53:43.478Z","0.0.1":"2012-01-30T21:49:15.277Z","0.0.2":"2012-01-30T21:55:02.425Z","0.0.3":"2012-02-02T14:56:05.980Z","0.0.4":"2012-02-21T14:13:15.146Z","0.0.5":"2012-03-14T15:58:16.775Z","0.0.6":"2012-04-10T18:27:58.713Z","0.0.7":"2012-04-15T13:15:39.892Z"},"author":{"name":"Julien Genestoux","email":"julien@superfeedr.com","url":"http://ouvre-boite.com"},"repository":{"type":"git","url":"git://github.com/superfeedr/indexeddb-backbonejs-adapter.git"},"_attachments":{"backbone-indexeddb-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-m3128skTYxOELvaK2B1uCQ==","length":70538,"stub":true},"backbone-indexeddb-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+zUGrkFwF2DYkR9Wh2L7WA==","length":70640,"stub":true},"backbone-indexeddb-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-4tR/+h6Tet2VMd5tcmQKJA==","length":78633,"stub":true},"backbone-indexeddb-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dIE3qIK/X9/6onbbE1In1Q==","length":78627,"stub":true},"backbone-indexeddb-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-a18AyV95EBbQiAMphAEVMQ==","length":78608,"stub":true},"backbone-indexeddb-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZAyRemUaSD44hTDNakTEkA==","length":78610,"stub":true},"backbone-indexeddb-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-25nFuCvwKYJdZTRDDrmW4Q==","length":78619,"stub":true},"backbone-indexeddb-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5nzIHsXkKTz9eSE/dR283A==","length":78591,"stub":true}}}},
{"id":"backbone-modelref","key":"backbone-modelref","value":{"rev":"67-92c226484fbaf4f16c004e1c602a9cd1"},"doc":{"_id":"backbone-modelref","_rev":"67-92c226484fbaf4f16c004e1c602a9cd1","name":"backbone-modelref","description":"Backbone-ModelRef.js provides a mechanism to respond to lazy-loaded Backbone.js models.","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.1":{"author":{"name":"Kevin Malakoff","email":"https://github.com/kmalakoff"},"name":"backbone-modelref","description":"Knockback.js provides Knockout.js magic for Backbone.js Models and Collections","keywords":["backbone","backbone.js","javascript","coffeescript","browser"],"url":"http://kmalakoff.github.com/backbone-modelref/","homepage":"http://kmalakoff.github.com/backbone-modelref/","repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-modelref.git"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9.1"},"devDependencies":{"coffee-script":">=1.3.0"},"lib":".","main":"backbone-modelref.js","version":"0.1.1","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-modelref@0.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f2f506046e8d58b3027cb92ca3582ed151a2ed38","tarball":"http://registry.npmjs.org/backbone-modelref/-/backbone-modelref-0.1.1.tgz"},"maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"backbone-modelref","description":"Backbone-ModelRef.js provides a mechanism to respond to lazy-loaded Backbone.js models.","keywords":["backbone-modelref","backbone-modelrefjs","backbone","backbonejs","knockback","knockbackjs"],"url":"http://kmalakoff.github.com/backbone-modelref/","homepage":"http://kmalakoff.github.com/backbone-modelref/","repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-modelref.git"},"optionalDependencies":{"underscore":">=1.3.3","backbone":">=0.9.2"},"main":"backbone-modelref.js","version":"0.1.2","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-modelref@0.1.2","dependencies":{"underscore":">=1.3.3","backbone":">=0.9.2"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ed540821105102867d40d707e6c3da311377bce3","tarball":"http://registry.npmjs.org/backbone-modelref/-/backbone-modelref-0.1.2.tgz"},"maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"backbone-modelref","description":"Backbone-ModelRef.js provides a mechanism to respond to lazy-loaded Backbone.js models.","keywords":["backbone-modelref","backbone-modelrefjs","backbone","backbonejs","knockback","knockbackjs"],"url":"http://kmalakoff.github.com/backbone-modelref/","homepage":"http://kmalakoff.github.com/backbone-modelref/","repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-modelref.git"},"optionalDependencies":{"underscore":">=1.3.3","backbone":">=0.9.2"},"main":"backbone-modelref.js","version":"0.1.3","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-modelref@0.1.3","dependencies":{"underscore":">=1.3.3","backbone":">=0.9.2"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0fd264ebbb6c2f22889f37a43e5a846a346bd320","tarball":"http://registry.npmjs.org/backbone-modelref/-/backbone-modelref-0.1.3.tgz"},"maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}]}},"readme":"````\n|_) _. _ | |_  _ ._  _ __ |\\/| _  _| _ ||_) _ _|_\n|_)(_|(_ |<|_)(_)| |(/_   |  |(_)(_|(/_|| \\(/_ |\n````\n\nBackbone-ModelRef.js provides a mechanism to respond to lazy-loaded Backbone.js models.\n\nYou can get the library here:\n\n* Development version: https://github.com/kmalakoff/backbone-modelref/raw/master/backbone-modelref.js\n* Production version: https://github.com/kmalakoff/backbone-modelref/raw/master/backbone-modelref.min.js\n\n# An Example:\n\n````\n  class MyView extends Backbone.View\n    constructor: (@model_ref) ->\n      super; _.bindAll(this, 'render', 'renderWaiting')\n      @model_ref.bind('loaded', @render); @model_ref.bind('unloaded', @renderWaiting)\n      if @model_ref.isLoaded() then @render() else @renderWaiting()\n\n    render: -> @is_waiting = false\n    renderWaiting: -> @is_waiting = true\n\n  collection = new MyCollection()\n  view = new MyView(new Backbone.ModelRef(collection, 'dog')) # view is now rendering in waiting state\n  collection.add(collection.parse([{id: 'dog'}]))             # view is now rendering in loaded state\n````\n\nClasses\n-------\n*Backbone.ModelRef*: This is the only class! It just wraps a collection and a model id, and tells you when the model is loaded and unloaded.\n\nAPI Signature Parity between Backbone.Model and Backbone.ModelRef\n-----------------------------------------------------------------\n\n|*Function*|*Backbone.Model*|*Backbone.ModelRef*|\n-----------------|--------------|-----------------|\n*get(attribute_name)*|returns model.get(attribute_name)|returns the model id only and throws an exception otherwise|\n*model()*|returns this|returns its model if it is loaded or null if not|\n*isLoaded()*|returns true|returns true if its model is loaded and false otherwise|\n*bindLoadingStates( loaded_fn or {loaded:fn, unloaded:fn} )*|loaded function called one time (immediately) and unloaded function never called. No Backbone.Event binding occurs|loaded function called immediately if the model is loaded otherwise they are bound using Backbone.Events 'loaded' and 'unloaded' where each is called when the model is loaded or unloaded, respectively|\n*unbindLoadingStates( loaded_fn or {loaded:fn, unloaded:fn} )*|ignored|unbinds Backbone.Events 'loaded' and 'unloaded'|\n\n## Other notes:\n\n* Backbone.ModelRefs are reference counted so use retain() and release() to properly ensure non-dangling pointers.\n* You can optionally provide an function Backbone.Model.isLoaded() id you have custom loading checks like for lazy-loaded Backbone.Relational models.\n* You can optionally provide a reference counted collection (implementing retain() and release()).\n\nPlease look at the provided examples and specs for sample code:\n\n* https://github.com/kmalakoff/backbone-modelref/blob/master/test\n","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"time":{"modified":"2012-07-10T02:55:37.781Z","created":"2012-05-10T15:49:39.324Z","0.1.1":"2012-05-10T15:49:42.993Z","0.1.2":"2012-06-15T11:04:02.194Z","0.1.3":"2012-07-10T02:55:37.781Z"},"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"repository":{"type":"git","url":"git://github.com/kmalakoff/backbone-modelref.git"},"_attachments":{"backbone-modelref-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-TIjnP80d/s6ub72hBjy50w==","length":3387,"stub":true},"backbone-modelref-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-sh+gzHL0mp7ZSeFkaZVNdg==","length":3291,"stub":true},"backbone-modelref-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8Wm8Gm13k/aOfnugvaUOuA==","length":73572,"stub":true}}}},
{"id":"backbone-mongodb","key":"backbone-mongodb","value":{"rev":"5-5273d7094c5065ff057a366b202024c5"},"doc":{"_id":"backbone-mongodb","_rev":"5-5273d7094c5065ff057a366b202024c5","name":"backbone-mongodb","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"backbone-mongodb","version":"0.0.1","author":{"name":"Andrew Dunkman","email":"andrew@dunkman.org","url":"http://dunkman.org"},"dependencies":{"mongoose":"2.2.3","underscore":"1.1.7"},"licenses":[{"type":"BSD"}],"main":"./backbone-mongodb","_npmJsonOpts":{"file":"/Users/adunkman/.npm/backbone-mongodb/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-mongodb@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e214a85c4127682419590c02d3e6ddfebf438e97","tarball":"http://registry.npmjs.org/backbone-mongodb/-/backbone-mongodb-0.0.1.tgz"},"maintainers":[{"name":"adunkman","email":"andrew@dunkman.org"}]}},"maintainers":[{"name":"adunkman","email":"andrew@dunkman.org"},{"name":"akasha","email":"viktor.nagy@gmail.com"},{"name":"jsapara","email":"jsapara@slicedprojects.ca"}],"time":{"modified":"2012-03-22T20:56:12.613Z","created":"2011-10-01T06:40:25.562Z","0.0.1":"2011-10-01T06:40:25.903Z"},"author":{"name":"Andrew Dunkman","email":"andrew@dunkman.org","url":"http://dunkman.org"},"_attachments":{"backbone-mongodb-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5Zn+0XqhrHceepyHbulF6g==","length":775,"stub":true}}}},
{"id":"backbone-nowjs","key":"backbone-nowjs","value":{"rev":"27-c778ab2a54e0e432d8f04c4e0dba0b1b"},"doc":{"_id":"backbone-nowjs","_rev":"27-c778ab2a54e0e432d8f04c4e0dba0b1b","name":"backbone-nowjs","description":"Backbone connector for nowjs","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"backbone-nowjs","version":"0.1.0","description":"Backbone connector for nowjs","keywords":["backbone","nowjs","connector"],"author":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"dependencies":{"now":"0.7","underscore":"1.1.7","backbone":"0.5.3"},"main":"backbone-nowjs.js","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/mkuklis/.npm/backbone-nowjs/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-nowjs@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"edf94b23b3b11f47e194f818b5f65894bd0ca0ff","tarball":"http://registry.npmjs.org/backbone-nowjs/-/backbone-nowjs-0.1.0.tgz"},"maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}],"directories":{}},"0.1.1":{"name":"backbone-nowjs","version":"0.1.1","description":"Backbone connector for nowjs","keywords":["backbone","nowjs","connector"],"author":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"dependencies":{"now":"0.7","underscore":"1.1.7","backbone":"0.5.3"},"main":"backbone-nowjs.js","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/Users/mkuklis/.npm/backbone-nowjs/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-nowjs@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6b4557204f7069c46636a8ee7ec66fd7acc97820","tarball":"http://registry.npmjs.org/backbone-nowjs/-/backbone-nowjs-0.1.1.tgz"},"maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}],"directories":{}},"0.1.2":{"name":"backbone-nowjs","version":"0.1.2","description":"Backbone connector for nowjs","homepage":"http://github.com/mkuklis/backbone-nowjs","keywords":["backbone","nowjs","connector"],"author":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"dependencies":{"now":"0.7","underscore":"1.2.0","backbone":"0.5.3"},"main":"backbone-nowjs.js","engines":{"node":"0.4.x"},"repository":{"type":"git","url":"git://github.com/mkuklis/backbone-nowjs.git"},"licenses":[{"type":"MIT","url":"http://github.com/mkuklis/backbone-nowjs/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/mkuklis/.npm/backbone-nowjs/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-nowjs@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"71be86661d20589a45ac02945b2f39f8ba867a3a","tarball":"http://registry.npmjs.org/backbone-nowjs/-/backbone-nowjs-0.1.2.tgz"},"maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}]}},"maintainers":[{"name":"mkuklis","email":"michal.kuklis@gmail.com"}],"time":{"modified":"2011-10-24T05:23:04.513Z","created":"2011-10-05T03:11:12.193Z","0.1.0":"2011-10-05T03:11:13.224Z","0.1.1":"2011-10-06T01:36:15.185Z","0.1.2":"2011-10-23T05:34:59.387Z"},"author":{"name":"mkuklis","email":"michal.kuklis@gmail.com"},"repository":{"type":"git","url":"git://github.com/mkuklis/backbone-nowjs.git"},"_attachments":{"backbone-nowjs-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-fcuCzfb00MZaa2cMwS0TZA==","length":10737,"stub":true},"backbone-nowjs-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-BaAuWuAkkTCjvzV9eshpJQ==","length":9251,"stub":true},"backbone-nowjs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9LliXr6dFSXb89sQx7yg4g==","length":8520,"stub":true}}}},
{"id":"backbone-postgresql","key":"backbone-postgresql","value":{"rev":"3-c289a6a7f452da028f6bc8166f7fbaad"},"doc":{"_id":"backbone-postgresql","_rev":"3-c289a6a7f452da028f6bc8166f7fbaad","name":"backbone-postgresql","description":"A storage adapter for PostgreSQL when running Backbone.js on the server","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Ben Pirt","email":"ben@pirt.co.uk"},"name":"backbone-postgresql","description":"A storage adapter for PostgreSQL when running Backbone.js on the server","version":"0.0.1","homepage":"http://github.com/bjpirt/backbone-postgresql","license":"MIT","repository":{"type":"git","url":"git://github.com/bjpirt/backbone-postgresql.git"},"main":"backbone-postgresql.js","scripts":{"test":"./node_modules/mocha/bin/mocha -R spec test/*_test.js"},"dependencies":{"backbone":"0.9.2","pg":"0.6.13","underscore":"1.3.3"},"devDependencies":{"mocha":"0.14.1","should":"0.6.0"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bjpirt","email":"ben@pirt.co.uk"},"_id":"backbone-postgresql@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d5ac9dc05a74b8ce26d1b316969db27e5d9ee74e","tarball":"http://registry.npmjs.org/backbone-postgresql/-/backbone-postgresql-0.0.1.tgz"},"maintainers":[{"name":"bjpirt","email":"ben@pirt.co.uk"}]}},"readme":"backbone-postgresql\n===================\n\n[![Build Status](https://secure.travis-ci.org/bjpirt/backbone-postgresql.png)](http://travis-ci.org/bjpirt/backbone-postgresql)\n\nThis is a sync library for server-side Backbone.js running on node.js that enables it to store data in PostgreSQL. It uses a hybrid approach to the schema whereby you can mix up old-school columns with all of their associated relational integrity and an hstore column that allows you to store arbitrary attributes with no schema changes.\n\nSee this article for some more details about hstore, and also the PostgreSQL docs here. To set up your database with the hstore extension you need to log into postgres as an admin and use the database you want to add it to, then run \"CREATE EXTENSION hstore\". It should then be ready for you to use.\n\nThe library uses all of the standard Backbone methods for syncing objects and works with both models and collections. Here's an example, it assumes you've created a database and set it up with the hstore extension and then set up a database with the following schema:\n\n    CREATE TABLE badgers (\n      id SERIAL,\n      name VARCHAR(128),\n      attributes hstore\n    );\n\nThis won't really run as one script because otherwise it would all have to be nested to make sure things had executed before moving on to the next example, but this way is a lot easier to read.\n\n    // Require the library as Backbone so that it can extend its prototype\n    Backbone = require('backbone-postgresql');\n    \n    // Tell the Postgres connector how to connect to the database\n    Backbone.pg_connector.config = {db: ''pg://username:password@localhost/backbone-pg-demo'};\n    \n    // Define our models and collections. We're using the urlRoot parameter to define the table name\n    var Badger = Backbone.Model.extend({\n      urlRoot: '/badgers'\n    });\n    \n    var BadgerCollection = Backbone.Collection.extend({\n      urlRoot: '/badgers',\n      model: Badger\n    });\n    \n    // Let's create a new badger\n    var badger = new Badger({name: 'Bodger', age: 2});\n    // and save it - with this schema the age attribute will be stored in hstore, whilst the name attribute will go in a proper column\n    badger.save();\n    // Here we use the event emitter approach\n    badger.on('sync', function(model){\n      console.log('Badger saved: ' + model.name);\n    });\n    badger.on('error', function(model, err){\n      console.log('Error saving badger');\n    });\n\n    //then we could change some attributes - obviously we should really put this in the success callback, but for keeping the examples simple I haven't\n    model.set('age', 3);\n    // then let's save it again but this time we can use callbacks as an argument\n    // the first argument is null because you can pass in new attributes to save. Always catches me out.\n    model.save(null, {\n      success: function(model){\n        console.log('Badger updated: ' + model.name);\n      },\n      error: function(model, err){\n        console.log('Error updating badger');\n      }\n    });\n    \n    // Let's say that the id of a badger is 345 - here is how we retrieve it from the database:\n    var another_badger = new Badger({id: 345});\n    another_badger.fetch({\n      success: function(model){\n        console.log(\"Successfully retrieved badger: \" + model.attributes.name + \" (Age: \" + model.attributes.age + \")\");\n      },\n      error: function(model, err){\n        console.log(err instanceof Error);\n        console.log(err.message); // \"Not found\"\n        console.log('Error retrieving badger');\n      }\n    });\n    \n    // If it can't be found, the error callback will be fired and the \"err\" parameter will return a \"Not found\" error\n    \n    // If you want to put some constraints on what you're fetching (e.g. if you want to fetch a resource, but wanted to make sure it was owned by the correct person)\n    // you can add a filter parameter like so:\n    \n    another_badger.fetch({\n      filter: {owner_id: 123},\n      success: ...\n      error: ...\n    });\n    \n    // The filter parameter can be an object, in which case each of the key:value pairs are turned into where constraints ANDed together, e.g.\n    // {owner_id: 123, name: 'bob'}\n    // will get turned into a snippet of SQL like:\n    // WHERE owner_id = 123 AND name = 'bob'\n    \n    // If you want to apply more complex conditions, you can create a series of conditions which will be ANDed together as well, e.g.\n    // ['owner_id = 123', \"name = 'bob'\"]\n    // is equivalent to the same thing:\n    // WHERE owner_id = 123 AND name = 'bob'\n    \n    // And if we wanted to delete it we could just do:\n    another_badger.destroy({\n      success: function(model){\n        console.log(\"You just destroyed an endangered animal\");\n      },\n      error: function(model, err){\n        console.log(\"No badger was harmed\");\n      }\n    });\n    \n# Collections\nYou can also work with collections in the same way as you are used to in Backbone as well as being able to apply filters to the collection\n\n    // Let's make a collection of badgers\n    var badgers = new BadgerCollection();\n    \n    badgers.fetch({\n      success: function(collection){\n        console.log(\"Successfully fetched badgers\");\n      },\n      error: function(collection, err){\n        console.log(\"Error fetching badgers\");\n      }\n    });\n    \n    // You can also apply a filter to this fetch as in the fetch example for Models, e.g.\n    \n    badgers.fetch({\n      filter: {name: 'bob'},\n      success: ...\n      error: ...\n    });\n  \n    // will return all badgers named bob\n\n# Relations\n\nIf you set the urlRoot attribute on a model or collection with a nested resource (e.g. /resource_a/3/resource_b ) then it will automatically add this as a query parameter when fetching the model and extract the table name from the last part of the urlRoot. The idea is that this should make the impedance between having a RESTful API and a model pretty low. Examples:\n\n    var badgers = new BadgerCollection();\n    badgers.urlRoot = '/location/3/badger';\n    badgers.fetch({success: function(){\n      console.log(\"Successfully fetched\");\n    }});\n\nAlso, if you add a new model to a collection, it will use that scoping to automatically set attributes on the model, e.g.\n\n    var new_badger = new Badger();\n    badgers.add(badger);\n    new_badger.save(null, {success: function(){\n      console.log(\"New badger just got saved with a location_id of 3\");\n    }});\n\nYou can also use it to fetch, save and destroy models. This is primarily as a way of enforcing things like ownership before doing something like deleting an object. You might set the urlRoot to /users/432/products and it would only work on a model whose user_id matched the expected value, e.g.\n\n    // saving\n    var badger = new Badger();\n    badger.urlRoot = '/location/32/badger';\n    badger.save(null, {success: function(){\n      console.log(\"This will have set the location_id attribute to 32 before saving it\");\n    }});\n\n    // updating\n    var badger = new Badger({id: 42});\n    badger.urlRoot = '/location/32/badger';\n    badger.save(null, {success: function(){\n      console.log(\"This will only succeed if there is a badger with id: 42 and location_id: 32\");\n    }});\n\n    // updating\n    var badger = new Badger({id: 42});\n    badger.urlRoot = '/location/32/badger';\n    badger.destroy({success: function(){\n      console.log(\"This will only succeed if there is a badger with id: 42 and location_id: 32\");\n    }});\n\nBy default, these relation constraints work by adding _id to the first level scope, however, if you like the Rails style of having pluralised APIs you can specify the pruralisations as follows:\n\n    Backbone.pg_connector.singulars = {\n      locations: 'location'\n    }\n    var badgers = new BadgerCollection();\n    badgers.urlRoot = '/locations/3/badgers';\n    badgers.fetch({success: function(){\n      console.log(\"Successfully fetched\");\n    }});\n\n(Aside: I always used to like the pluralised API style, but now I've implemented this I think it's a bad idea and just adds application complexity)\n\n# Contributions\n\nThe best contribution is a pull request! Let me know if there are things you'd like to see it do. If you do submit a pull request, make sure you add tests. It's pretty well covered so if there are any bugs let me know and I'll get them tested and fixed.\n\n# Credits\n\nObviously without Backbone this wouldn't even exist so thanks to Jeremy Ashkenas for creating that to begin with. I used the backbone-mongodb module as inspiration for the structure of the code and shamefully stole the hstore serialisation method from backbone-hstore. Thanks all.\n\n\n\n\n\n\n\n\n\n\n\n\n","maintainers":[{"name":"bjpirt","email":"ben@pirt.co.uk"}],"time":{"modified":"2012-05-18T09:55:27.620Z","created":"2012-05-18T09:55:26.464Z","0.0.1":"2012-05-18T09:55:27.620Z"},"author":{"name":"Ben Pirt","email":"ben@pirt.co.uk"},"repository":{"type":"git","url":"git://github.com/bjpirt/backbone-postgresql.git"},"_attachments":{"backbone-postgresql-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-l3SjmizGOT4ZSwq0QTbHoQ==","length":9771,"stub":true}}}},
{"id":"backbone-proxy","key":"backbone-proxy","value":{"rev":"3-3602cb984bdd266516a3145663f9a5c6"},"doc":{"_id":"backbone-proxy","_rev":"3-3602cb984bdd266516a3145663f9a5c6","name":"backbone-proxy","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"backbone-proxy","version":"0.1.0","author":{"name":"Young Hahn"},"dependencies":{"underscore":"1.1.x","get":"0.3.x"},"licenses":[{"type":"BSD"}],"main":"./backbone-proxy","devDependencies":{},"_id":"backbone-proxy@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"f545a440b7666cd8860e97191ab1825557ca19dc","tarball":"http://registry.npmjs.org/backbone-proxy/-/backbone-proxy-0.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"}],"time":{"modified":"2011-05-16T17:25:26.784Z","created":"2011-05-16T17:25:26.186Z","0.1.0":"2011-05-16T17:25:26.784Z"},"author":{"name":"Young Hahn"},"_attachments":{"backbone-proxy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1E1hwP3gOq7C8fTBPHqu1A==","length":1470,"stub":true}}}},
{"id":"backbone-query","key":"backbone-query","value":{"rev":"5-e811f3727c9342db28bae2f639ee9860"},"doc":{"_id":"backbone-query","_rev":"5-e811f3727c9342db28bae2f639ee9860","name":"backbone-query","description":"Lightweight Query API for Backbone Collections","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"backbone-query","description":"Lightweight Query API for Backbone Collections","version":"0.1.1","author":{"name":"Dave Tonge","email":"dave@simplecreativity.co.uk","url":"https://github.com/davidgtonge"},"tags":["backbone","underscore","mongo","query"],"main":"./js/backbone-query","repository":{"type":"git","url":"git://github.com/davidgtonge/backbone_query.git"},"dependencies":{"backbone":">=0.5.x","underscore":">=1.1.x"},"devDependencies":{"coffee-script":">=1.x.x","nodeunit":"0.6.x","uglify-js":"1.2.2"},"scripts":{"test":"cake test"},"_npmUser":{"name":"davidgtonge","email":"dave@simplecreativity.co.uk"},"_id":"backbone-query@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"684a8c235e607bce5587829d2a0203792df685ad","tarball":"http://registry.npmjs.org/backbone-query/-/backbone-query-0.1.1.tgz"},"maintainers":[{"name":"davidgtonge","email":"dave@simplecreativity.co.uk"}]},"0.1.2":{"name":"backbone-query","description":"Lightweight Query API for Backbone Collections","version":"0.1.2","author":{"name":"Dave Tonge","email":"dave@simplecreativity.co.uk","url":"https://github.com/davidgtonge"},"tags":["backbone","underscore","mongo","query"],"main":"./js/backbone-query","repository":{"type":"git","url":"git://github.com/davidgtonge/backbone_query.git"},"dependencies":{"backbone":">=0.5.x","underscore":">=1.1.x"},"devDependencies":{"coffee-script":">=1.x.x","nodeunit":"0.6.x","uglify-js":"1.2.2"},"scripts":{"test":"cake test"},"_npmUser":{"name":"davidgtonge","email":"dave@simplecreativity.co.uk"},"_id":"backbone-query@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1db68687614f8b6144e0543595f14fc1eb52a6c8","tarball":"http://registry.npmjs.org/backbone-query/-/backbone-query-0.1.2.tgz"},"maintainers":[{"name":"davidgtonge","email":"dave@simplecreativity.co.uk"}]}},"readme":"backbone-query\r\n===================\r\n\r\n.. |travis_status| image:: https://secure.travis-ci.org/davidgtonge/backbone_query.png\r\n   :target: http://travis-ci.org/davidgtonge/backbone_query\r\n\r\nA lightweight (3KB minified) utility for Backbone projects, that works in the Browser and on the Server.\r\nAdds the ability to search for models with a Query API similar to\r\n[MongoDB](http://www.mongodb.org/display/DOCS/Advanced+Queries)\r\nPlease report any bugs, feature requests in the issue tracker.\r\nPull requests are welcome!\r\n\r\nUsage\r\n=====\r\n\r\n.. Client Side Installation:\r\nTo install, include the `js/backbone-query.min.js` file in your HTML page, after Backbone and it's dependencies.\r\nThen extend your collections from Backbone.QueryCollection rather than from Backbone.Collection.\r\n\r\n.. Server side (node.js) installation\r\n\r\n\r\nYour collections will now have a `query` method that can be used like this:\r\n\r\n```js\r\nMyCollection.query({ {featured:true}, {likes: $gt:10} )};\r\n// Returns all models where the featured attribute is true and there are\r\n// more than 10 likes\r\n\r\nMyCollection.query(\r\n    {tags: { $any: [\"coffeescript\", \"backbone\", \"mvc\"]}},\r\n    {sortBy: \"likes\", order: \"desc\", limit:10, page:2, cache:true}\r\n);\r\n// Finds models that have either \"coffeescript\", \"backbone\", \"mvc\" in their \"tags\" attribute\r\n// Sorts these models by the \"likes\" attribute in descending order\r\n// Caches the results and returns only 10 models, starting from the 11th model (page 2)\r\n\r\nMyCollection.query({\r\n  // Models must match all these queries\r\n  $and:{\r\n    title: {$like: \"news\"}, // Title attribute contains the string \"news\"\r\n    likes: {$gt: 10}}, // Likes attribute is greater than 10\r\n\r\n  // Models must match one of these queries\r\n  $or:{\r\n    featured: true, // Featured attribute is true\r\n    category:{$in:[\"code\",\"programming\",\"javascript\"]}}\r\n    //Category attribute is either \"code\", \"programming\", or \"javascript\"\r\n});\r\n```\r\n\r\nOr if CoffeeScript is your thing (the source is written in CoffeeScript), try this:\r\n\r\n```coffeescript\r\nMyCollection.query\r\n  $and:\r\n    likes: $lt: 15\r\n  $or:\r\n    content: $like: \"news\"\r\n    featured: $exists: true\r\n  $not:\r\n    colors: $contains: \"yellow\"\r\n```\r\n\r\nQuery API\r\n===\r\n\r\n### $equal\r\nPerforms a strict equality test using `===`. If no operator is provided and the query value isn't a regex then `$equal` is assumed.\r\n\r\n```javascript\r\nMyCollection.query({ title:\"Test\" });\r\n// Returns all models which have a \"title\" attribute of \"Test\"\r\n\r\nMyCollection.query({ title: {$equal:\"Test\"} }); // Same as above\r\n```\r\n\r\n### $contains\r\nAssumes that the model property is an array and searches for the query value in the array\r\n\r\n```js\r\nMyCollection.query({ colors: {$contains: \"red\"} });\r\n// Returns models which contain the value \"red\" in a \"colors\" attribute that is an array.\r\n// e.g. a model with this attribute colors:[\"red\",\"yellow\",\"blue\"] would be returned\r\n```\r\n\r\n### $ne\r\n\"Not equal\", the opposite of $equal, returns all models which don't have the query value\r\n\r\n```js\r\nMyCollection.query({ title: {$ne:\"Test\"} });\r\n// Returns all models which don't have a \"title\" attribute of \"Test\"\r\n```\r\n\r\n### $lt, $lte, $gt, $gte\r\nThese conditional operators can be used for greater than and less than comparisons in queries\r\n\r\n```js\r\nMyCollection.query({ likes: {$lt:10} });\r\n// Returns all models which have a \"likes\" attribute of less than 10\r\nMyCollection.query({ likes: {$lte:10} });\r\n// Returns all models which have a \"likes\" attribute of less than or equal to 10\r\nMyCollection.query({ likes: {$gt:10} });\r\n// Returns all models which have a \"likes\" attribute of greater than 10\r\nMyCollection.query({ likes: {$gte:10} });\r\n// Returns all models which have a \"likes\" attribute of greater than or equal to 10\r\n```\r\n\r\n### $between\r\nTo check if a value is in-between 2 query values use the $between operator and supply an array with the min and max value\r\n\r\n```js\r\nMyCollection.query({ likes: {$between:[5,15} });\r\n// Returns all models which have a \"likes\" attribute of greater than 5 and less then 15\r\n```\r\n\r\n### $in\r\nAn array of possible values can be supplied using $in, a model will be returned if any of the supplied values is matched\r\n\r\n```js\r\nMyCollection.query({ title: {$in:[\"About\", \"Home\", \"Contact\"] } });\r\n// Returns all models which have a title attribute of either \"About\", \"Home\", or \"Contact\"\r\n```\r\n\r\n### $nin\r\n\"Not in\", the opposite of $in. A model will be returned if none of the supplied values is matched\r\n\r\n```js\r\nMyCollection.query({ title: {$nin:[\"About\", \"Home\", \"Contact\"] } });\r\n// Returns all models which don't have a title attribute of either\r\n// \"About\", \"Home\", or \"Contact\"\r\n```\r\n\r\n### $all\r\nAssumes the model property is an array and only returns models where all supplied values are matched.\r\n\r\n```js\r\nMyCollection.query({ colors: {$all:[\"red\", \"yellow\"] } });\r\n// Returns all models which have \"red\" and \"yellow\" in their colors attribute.\r\n// A model with the attribute colors:[\"red\",\"yellow\",\"blue\"] would be returned\r\n// But a model with the attribute colors:[\"red\",\"blue\"] would not be returned\r\n```\r\n\r\n### $any\r\nAssumes the model property is an array and returns models where any of the supplied values are matched.\r\n\r\n```js\r\nMyCollection.query({ colors: {$any:[\"red\", \"yellow\"] } });\r\n// Returns models which have either \"red\" or \"yellow\" in their colors attribute.\r\n```\r\n\r\n### $size\r\nAssumes the model property has a length (i.e. is either an array or a string).\r\nOnly returns models the model property's length matches the supplied values\r\n\r\n```js\r\nMyCollection.query({ colors: {$size:2 } });\r\n// Returns all models which 2 values in the colors attribute\r\n```\r\n\r\n### $exists or $has\r\nChecks for the existence of an attribute. Can be supplied either true or false.\r\n\r\n```js\r\nMyCollection.query({ title: {$exists: true } });\r\n// Returns all models which have a \"title\" attribute\r\nMyCollection.query({ title: {$has: false } });\r\n// Returns all models which don't have a \"title\" attribute\r\n```\r\n\r\n### $like\r\nAssumes the model attribute is a string and checks if the supplied query value is a substring of the property.\r\nUses indexOf rather than regex for performance reasons\r\n\r\n```js\r\nMyCollection.query({ title: {$like: \"Test\" } });\r\n//Returns all models which have a \"title\" attribute what\r\n//contains the string \"Test\", e.g. \"Testing\", \"Tests\", \"Test\", etc.\r\n```\r\n\r\n### $regex\r\nChecks if the model attribute matches the supplied regular expression. The regex query can be supplied without the `$regex` keyword\r\n\r\n```js\r\nMyCollection.query({ content: {$regex: /coffeescript/gi } });\r\n// Checks for a regex match in the content attribute\r\nMyCollection.query({ content: /coffeescript/gi });\r\n// Same as above\r\n```\r\n\r\n### $cb\r\nA callback function can be supplied as a test. The callback will receive the attribute and should return either true or false.\r\n`this` will be set to the current model, this can help with tests against computed properties\r\n\r\n```js\r\nMyCollection.query({ title: {$cb: function(attr){ return attr.charAt(0) === \"c\";}} });\r\n// Returns all models that have a title attribute that starts with \"c\"\r\n\r\nMyCollection.query({ computed_test: {$cb: function(){ return this.computed_property() > 10;}} });\r\n// Returns all models where the computed_property method returns a value greater than 10.\r\n```\r\n\r\nFor callbacks that use `this` rather than the model attribute, the key name supplied is arbitrary and has no\r\neffect on the results. If the only test you were performing was like the above test it would make more sense\r\nto simply use `MyCollection.filter`. However if you are performing other tests or are using the paging / sorting /\r\ncaching options of backbone query, then this functionality is useful.\r\n\r\nCombined Queries\r\n================\r\n\r\nMultiple queries can be combined together. By default all supplied queries must be matched `$and`. However it is possible\r\nto specify either `$or`, `$nor`, `$not` to implement alternate logic.\r\n\r\n### $and\r\n\r\n```js\r\nMyCollection.query({ $and: { title: {$like: \"News\"}, likes: {$gt: 10}}});\r\n// Returns all models that contain \"News\" in the title and have more than 10 likes.\r\nMyCollection.query({ title: {$like: \"News\"}, likes: {$gt: 10} });\r\n// Same as above as $and is assumed if not supplied\r\n```\r\n\r\n### $or\r\n\r\n```js\r\nMyCollection.query({ $or: { title: {$like: \"News\"}, likes: {$gt: 10}}});\r\n// Returns all models that contain \"News\" in the title OR have more than 10 likes.\r\n```\r\n\r\n### $nor\r\nThe opposite of `$or`\r\n\r\n```js\r\nMyCollection.query({ $nor: { title: {$like: \"News\"}, likes: {$gt: 10}}});\r\n// Returns all models that don't contain \"News\" in the title NOR have more than 10 likes.\r\n```\r\n\r\n### $not\r\nThe opposite of `$and`\r\n\r\n```js\r\nMyCollection.query({ $not: { title: {$like: \"News\"}, likes: {$gt: 10}}});\r\n// Returns all models that don't contain \"News\" in the title AND DON'T have more than 10 likes.\r\n```\r\n\r\nCompound Queries\r\n================\r\n\r\nIt is possible to use multiple combined queries, for example searching for models that have a specific title attribute,\r\nand either a category of \"abc\" or a tag of \"xyz\"\r\n\r\n```js\r\nMyCollection.query({\r\n    $and: { title: {$like: \"News\"}},\r\n    $or: {likes: {$gt: 10}, color:{$contains:\"red\"}}\r\n});\r\n//Returns models that have \"News\" in their title and\r\n//either have more than 10 likes or contain the color red.\r\n```\r\n\r\nSorting\r\n=======\r\nOptional `sortBy` and `order` attributes can be supplied as part of an options object.\r\n`sortBy` can either be a model key or a callback function which will be called with each model in the array.\r\n\r\n```js\r\nMyCollection.query({title: {$like: \"News\"}}, {sortBy: \"likes\"});\r\n// Returns all models that contain \"News\" in the title,\r\n// sorted according to their \"likes\" attribute (ascending)\r\n\r\nMyCollection.query({title: {$like: \"News\"}}, {sortBy: \"likes\", order:\"desc\"});\r\n// Same as above, but \"descending\"\r\nMyCollection.query(\r\n    {title: {$like: \"News\"}},\r\n    {sortBy: function(model){ return model.get(\"title\").charAt(1);}}\r\n);\r\n// Results sorted according to 2nd character of the title attribute\r\n```\r\n\r\n\r\nPaging\r\n======\r\nTo return only a subset of the results paging properties can be supplied as part of an options object.\r\nA `limit` property must be supplied and optionally a `offset` or a `page` property can be supplied.\r\n\r\n```js\r\nMyCollection.query({likes:{$gt:10}}, {limit:10});\r\n// Returns the first 10 models that have more than 10 likes\r\n\r\nMyCollection.query({likes:{$gt:10}}, {limit:10, offset:5});\r\n// Returns 10 models that have more than 10 likes starting\r\n//at the 6th model in the results\r\n\r\nMyCollection.query({likes:{$gt:10}}, {limit:10, page:2});\r\n// Returns 10 models that have more than 10 likes starting\r\n//at the 11th model in the results (page 2)\r\n```\r\n\r\nWhen using the paging functionality, you will normally need to know the number of pages so that you can render\r\nthe correct interface for the user. Backbone Query can send the number of pages of results to a supplied callback.\r\nThe callback should be passed as a `pager` property on the options object. This callback will also receive the sliced\r\nmodels as a second variable.\r\n\r\nHere is a coffeescript example of a simple paging setup using the pager callback option:\r\n\r\n```coffeescript\r\nclass MyView extends Backbone.View\r\n    initialize: ->\r\n        @template = -> #templating setup here\r\n\r\n    events:\r\n        \"click .page\": \"change_page\"\r\n\r\n    query_collection: (page = 1) ->\r\n        #Collection should be passed in when the view is instantiated\r\n        @collection.query {category:\"javascript\"}, {limit:5, page:page, pager:@render_pages}\r\n\r\n    change_page: (e) =>\r\n        page_number = $(e.target).data('page_number')\r\n        @query_collection page_number\r\n\r\n    render_pages: (total_pages, results) =>\r\n        content = @template results\r\n        pages = [1..total_pages]\r\n        nav = \"\"\"\r\n        <nav>\r\n            <span>Total Pages: #{total_pages}</span>\r\n        \"\"\"\r\n        for page in pages\r\n          nav += \"<a href='#' data-page_number='#{page}'>#{page}</a>\"\r\n\r\n        nav += \"</nav>\"\r\n\r\n        @$el.html content + nav\r\n\r\n    render: => @query_collection()\r\n\r\n```\r\n\r\n\r\nCaching Results\r\n================\r\nTo enable caching set the cache flag to true in the options object. This can greatly improve performance when paging\r\nthrough results as the unpaged results will be saved. This options is not enabled by default as if models are changed,\r\nadded to, or removed from the collection, then the query cache will be out of date. If you know\r\nthat your data is static and won't change then caching can be enabled without any problems.\r\nIf your data is dynamic (as in most Backbone Apps) then a helper cache reset method is provided:\r\n`reset_query_cache`. This method should be bound to your collections change, add and remove events\r\n(depending on how your data can be changed).\r\n\r\nCache will be saved in a `_query_cache` property on each collection where a cache query is performed.\r\n\r\n```js\r\nMyCollection.query({likes:{$gt:10}}, {limit:10, page:1, cache:true});\r\n//The first query will operate as normal and return the first page of results\r\nMyCollection.query({likes:{$gt:10}}, {limit:10, page:2, cache:true});\r\n//The second query has an identical query object to the first query, so therefore the results will be retrieved\r\n//from the cache, before the paging paramaters are applied.\r\n\r\n// Binding the reset_query_cache method\r\nvar MyCollection = Backbone.QueryCollection.extend({\r\n    initialize: function(){\r\n        this.bind(\"change\", this.reset_query_cache, this);\r\n    }\r\n});\r\n\r\n\r\n```\r\n\r\n\r\nAuthor\r\n======\r\n\r\nDave Tonge - [davidgtonge](http://github.com/davidgtonge)\r\n","maintainers":[{"name":"davidgtonge","email":"dave@simplecreativity.co.uk"}],"time":{"modified":"2012-02-13T19:32:34.038Z","created":"2012-02-02T13:26:29.600Z","0.1.1":"2012-02-02T13:26:33.137Z","0.1.2":"2012-02-13T19:32:34.038Z"},"author":{"name":"Dave Tonge","email":"dave@simplecreativity.co.uk","url":"https://github.com/davidgtonge"},"repository":{"type":"git","url":"git://github.com/davidgtonge/backbone_query.git"},"_attachments":{"backbone-query-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-O7jVCAg3h5Muxtvr1C96xQ==","length":67167,"stub":true},"backbone-query-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HBGJ9sDVAoX09P2383NVeQ==","length":66641,"stub":true}}}},
{"id":"backbone-recursive-model","key":"backbone-recursive-model","value":{"rev":"5-6cfea3270d91c415f0d9bd406bc57495"},"doc":{"_id":"backbone-recursive-model","_rev":"5-6cfea3270d91c415f0d9bd406bc57495","name":"backbone-recursive-model","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"backbone-recursive-model","version":"0.0.1","repository":{"type":"git","url":"https://github.com/icetan/backbone-recursive-model.git"},"dependencies":{"underscore":"~1.3.3"},"_id":"backbone-recursive-model@0.0.1","dist":{"shasum":"4b092e4f74139a9d36d874d693c3e0af17d2c5c3","tarball":"http://registry.npmjs.org/backbone-recursive-model/-/backbone-recursive-model-0.0.1.tgz"},"readme":"","maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}]},"0.0.2":{"name":"backbone-recursive-model","version":"0.0.2","repository":{"type":"git","url":"https://github.com/icetan/backbone-recursive-model.git"},"dependencies":{"underscore":"~1.3.3"},"readme":"# Backbone Recursive Model\n\n## Is this for me?\n\nIf you need to nestle Backbone models in each other and keep instance\nreferences and event bindings after .save(), then this is the\nticket.\n\n## Node.js\n\n    $ npm install backbone backbone-recursive-model\n\nBackbone is not set as a dependency in the package.json but is required to be\ninstalled to use the RecursiveModel class. The reason for this is because you\nneed to share the same instance of Backbone.\n\n```javascript\nrequire('backbone-recursive-model');\nvar Backbone = require('backbone');\n\nvar MyModel = Backbone.RecursiveModel.extend({});\n```\n\nOr\n\n```javascript\nvar RecursiveModel = require('backbone-recursive-model');\n\nvar MyModel = RecursiveModel.extend({});\n```\n\n## Browser\n\nJust include the ```index.js``` file in a script tag together with Backbone and\nyour ready to go.\n","_id":"backbone-recursive-model@0.0.2","description":"## Is this for me?","dist":{"shasum":"1e1c9b57c7ce9d4b978b06c5edeae2fc7070d1b5","tarball":"http://registry.npmjs.org/backbone-recursive-model/-/backbone-recursive-model-0.0.2.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}]}},"readme":"","maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"time":{"modified":"2012-08-06T08:34:28.573Z","created":"2012-08-03T23:27:00.274Z","0.0.1":"2012-08-03T23:27:01.780Z","0.0.2":"2012-08-06T08:34:28.573Z"},"repository":{"type":"git","url":"https://github.com/icetan/backbone-recursive-model.git"},"description":"## Is this for me?","_attachments":{"backbone-recursive-model-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MVBkg8EEJUDAbcDe3VDXCw==","length":1741,"stub":true},"backbone-recursive-model-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kuxQOSnvjfNLNXVZo/r8Jw==","length":1267,"stub":true}}}},
{"id":"backbone-redis","key":"backbone-redis","value":{"rev":"9-2e3f6a9e095b00ccec9aa19b3fbc65eb"},"doc":{"_id":"backbone-redis","_rev":"9-2e3f6a9e095b00ccec9aa19b3fbc65eb","name":"backbone-redis","description":"Persistant backbone storage through redis pub/sub and socket.io","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"backbone-redis","description":"Persistant backbone storage through redis pub/sub and socket.io","version":"0.0.1","homepage":"https://github.com/sorensen/backbone-redis","repository":{"type":"git","url":"git://github.com/sorensen/backbone-redis.git"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"directories":{"lib":"./lib"},"main":"./index","dependencies":{"backbone":">= 0.3.3","underscore":">= 1.1.4","socket.io":">= 0.6.2"},"keywords":["backbone","redis","pubsub","socket"],"engines":{"node":">= 0.4.1 < 0.5.0"},"_id":"backbone-redis@0.0.1","_engineSupported":true,"_npmVersion":"1.0.0rc8","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c949ab3c4732488663a79ad18d0ccfaad5044e37","tarball":"http://registry.npmjs.org/backbone-redis/-/backbone-redis-0.0.1.tgz"}},"0.0.4":{"name":"backbone-redis","description":"Persistant backbone storage through redis pub/sub and socket.io","version":"0.0.4","homepage":"https://github.com/sorensen/backbone-redis","repository":{"type":"git","url":"git://github.com/sorensen/backbone-redis.git"},"directories":{"lib":"./lib"},"keywords":["backbone","redis","pubsub","socket"],"main":"./index","dependencies":{"backbone":"0.5.3","underscore":"1.1.7","redis":"0.6.7","socket.io":"0.7.9","hooks":"0.1.9"},"browserify":"browser/index.js","engines":{"node":">= 0.4.1 < 0.5.0"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"_npmJsonOpts":{"file":"/Users/sorensen/.npm/backbone-redis/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-redis@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"61cdc6e564f83e0e636f81803677e35613fbc5fc","tarball":"http://registry.npmjs.org/backbone-redis/-/backbone-redis-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"sorensen","email":"mail@beausorensen.com"}]}},"maintainers":[{"name":"sorensen","email":"mail@beausorensen.com"}],"time":{"modified":"2011-08-25T02:05:52.984Z","created":"2011-03-28T09:31:52.342Z","0.0.1":"2011-03-28T09:31:52.488Z","0.0.4":"2011-08-25T00:39:56.886Z"},"author":{"name":"Beau Sorensen","email":"mail@beausorensen.com","url":"http://beausorensen.com"},"repository":{"type":"git","url":"git://github.com/sorensen/backbone-redis.git"},"_attachments":{"backbone-redis-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-iNzjp3DplaJAzE7ftOMLIA==","length":112904,"stub":true},"backbone-redis-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ecpgKChtceqSN+Chgp0dnA==","length":1862252,"stub":true}}}},
{"id":"backbone-rel","key":"backbone-rel","value":{"rev":"5-f9773dc85f1c502e61c163a22d2f74aa"},"doc":{"_id":"backbone-rel","_rev":"5-f9773dc85f1c502e61c163a22d2f74aa","name":"backbone-rel","description":"Provides one-to-one, one-to-many and many-to-one relations between models for Backbone","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"backbone-rel","description":"Provides one-to-one, one-to-many and many-to-one relations between models for Backbone","keywords":["Backbone","relation","nested","model"],"repository":{"type":"git","url":"git://github.com/PaulUithol/Backbone-relational.git"},"author":{"name":"Paul Uithol"},"contributors":[{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"}],"dependencies":{"underscore":"","backbone":""},"lib":".","main":"backbone-relational.js","version":"0.0.1","devDependencies":{},"_id":"backbone-rel@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b22d8a8efaa4def2fbd0385db84a2cc81daa0d15","tarball":"http://registry.npmjs.org/backbone-rel/-/backbone-rel-0.0.1.tgz"},"scripts":{}},"0.3.0":{"name":"backbone-rel","description":"Provides one-to-one, one-to-many and many-to-one relations between models for Backbone","keywords":["Backbone","relation","nested","model"],"repository":{"type":"git","url":"git://github.com/PaulUithol/Backbone-relational.git"},"author":{"name":"Paul Uithol"},"contributors":[{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"}],"dependencies":{"underscore":"","backbone":""},"lib":".","main":"backbone-relational.js","version":"0.3.0","devDependencies":{},"_id":"backbone-rel@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"cc9696f598680ff3c843c1df932582aec4618560","tarball":"http://registry.npmjs.org/backbone-rel/-/backbone-rel-0.3.0.tgz"},"scripts":{}}},"maintainers":[{"name":"dvv","email":"dronnikov@gmail.com"}],"time":{"modified":"2011-05-25T16:19:14.851Z","created":"2011-05-24T15:38:20.943Z","0.0.1":"2011-05-24T15:38:24.524Z","0.3.0":"2011-05-25T16:19:14.851Z"},"author":{"name":"Paul Uithol"},"repository":{"type":"git","url":"git://github.com/PaulUithol/Backbone-relational.git"},"_attachments":{"backbone-rel-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8gW/BN28YyMbfVnR6OKKyg==","length":9409,"stub":true},"backbone-rel-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mM1AkC5hutDaOiML4bVaeA==","length":9381,"stub":true}}}},
{"id":"backbone-relational","key":"backbone-relational","value":{"rev":"3-9c3b5a3301f6e03486e592809bd81c44"},"doc":{"_id":"backbone-relational","_rev":"3-9c3b5a3301f6e03486e592809bd81c44","name":"backbone-relational","description":"Get and set relations (one-to-one, one-to-many, many-to-one) for Backbone models","dist-tags":{"latest":"0.5.0"},"versions":{"0.5.0":{"author":{"name":"Paul Uithol","url":"https://github.com/PaulUithol"},"name":"backbone-relational","contributors":[{"name":"Vladimir Dronnikov","email":"dronnikov@gmail.com"}],"description":"Get and set relations (one-to-one, one-to-many, many-to-one) for Backbone models","keywords":["backbone-relational","backbone","backbonejs","relation","relational","nested","model"],"url":"https://github.com/PaulUithol/Backbone-relational/","homepage":"https://github.com/PaulUithol/Backbone-relational/","repository":{"type":"git","url":"git://github.com/PaulUithol/Backbone-relational.git"},"optionalDependencies":{"underscore":"latest","backbone":"latest"},"main":"backbone-relational.js","version":"0.5.0","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"backbone-relational@0.5.0","dependencies":{"underscore":"latest","backbone":"latest"},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"12ee56eb52ef47e5dcbdad9a3f8875f045f63e23","tarball":"http://registry.npmjs.org/backbone-relational/-/backbone-relational-0.5.0.tgz"},"maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}]}},"readme":"This provides an up-to-date npm package for backbone-relational: https://github.com/PaulUithol/Backbone-relational\n\nTo install using npm: 'npm install backbone-relational'","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"time":{"modified":"2012-06-14T00:16:01.265Z","created":"2012-06-14T00:15:58.502Z","0.5.0":"2012-06-14T00:16:01.265Z"},"author":{"name":"Paul Uithol","url":"https://github.com/PaulUithol"},"repository":{"type":"git","url":"git://github.com/PaulUithol/Backbone-relational.git"},"_attachments":{"backbone-relational-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DpNEBQec5DHcUcz6fR+D9g==","length":18716,"stub":true}}}},
{"id":"backbone-relational-mapper","key":"backbone-relational-mapper","value":{"rev":"3-5ba8f043c882787f03c88384b4b18252"},"doc":{"_id":"backbone-relational-mapper","_rev":"3-5ba8f043c882787f03c88384b4b18252","name":"backbone-relational-mapper","description":"An ORM for Backbone-Relational.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"backbone-relational-mapper","version":"0.0.1","description":"An ORM for Backbone-Relational.","main":"index.js","scripts":{"test":"node test.js"},"repository":{"type":"git","url":"https://github.com/emilecantin/backbone-relational-mapper.git"},"keywords":["backbone","orm","sql","postgres","pg"],"author":{"name":"Emile cantin"},"license":"BSD","dependencies":{"coffee-script":"~1.3.3","amd-loader":"0.0.4","backbone-relational":"~0.5.0"},"devDependencies":{"sinon":"~1.4.2","sinon-chai":"~2.1.2","chai":"~1.2.0","mocha":"~1.3.2","glob":"~3.1.12","pg":">=0.7.1"},"readme":"Backbone-Relational-Mapper\r\n==========================\r\n\r\nImportant note\r\n--------------\r\n\r\nThis module is absolutely not ready for any usage, as it is in _very_ early development. Pull requests are welcome, but be aware that everything may change very fast; your relevant pull request today may not be relevant tomorrow.\r\n\r\nInstallation\r\n------------\r\n\r\nA simple `npm install backbone-relational-mapper` should do the trick. Open an issue if it doesn't.\r\n\r\nUsage\r\n-----\r\n\r\nYou should define your models as you would do in Backbone-Relational, with an added `fields` object:\r\n\r\n    class SomeModel extends Backbone.RelationalModel\r\n\r\n      fields:\r\n        some_text_field: Backbone.Types.Text\r\n","_id":"backbone-relational-mapper@0.0.1","dist":{"shasum":"ee4830366de0436a9f1b060b4a1da6e35d97f2b6","tarball":"http://registry.npmjs.org/backbone-relational-mapper/-/backbone-relational-mapper-0.0.1.tgz"},"maintainers":[{"name":"emilecantin","email":"emile.cantin@gmail.com"}]}},"readme":"Backbone-Relational-Mapper\r\n==========================\r\n\r\nImportant note\r\n--------------\r\n\r\nThis module is absolutely not ready for any usage, as it is in _very_ early development. Pull requests are welcome, but be aware that everything may change very fast; your relevant pull request today may not be relevant tomorrow.\r\n\r\nInstallation\r\n------------\r\n\r\nA simple `npm install backbone-relational-mapper` should do the trick. Open an issue if it doesn't.\r\n\r\nUsage\r\n-----\r\n\r\nYou should define your models as you would do in Backbone-Relational, with an added `fields` object:\r\n\r\n    class SomeModel extends Backbone.RelationalModel\r\n\r\n      fields:\r\n        some_text_field: Backbone.Types.Text\r\n","maintainers":[{"name":"emilecantin","email":"emile.cantin@gmail.com"}],"time":{"modified":"2012-08-14T18:46:22.532Z","created":"2012-08-14T18:46:21.172Z","0.0.1":"2012-08-14T18:46:22.532Z"},"author":{"name":"Emile cantin"},"repository":{"type":"git","url":"https://github.com/emilecantin/backbone-relational-mapper.git"},"_attachments":{"backbone-relational-mapper-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wV5pPsz/7Y5/NmkKnBxfVQ==","length":3837,"stub":true}}}},
{"id":"backbone-request","key":"backbone-request","value":{"rev":"3-5979f833d99a29c4b1773c1bfa1070e8"},"doc":{"_id":"backbone-request","_rev":"3-5979f833d99a29c4b1773c1bfa1070e8","name":"backbone-request","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Marak","email":"marak.squires@gmail.com"},"name":"backbone-request","version":"0.0.1","repository":{"type":"git","url":"git://github.com/Marak/backbone-request.git"},"main":"./backbone-request","dependencies":{"request":"2.9.x"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"marak","email":"marak.squires@gmail.com"},"_id":"backbone-request@0.0.1","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"c468175714a439e3e531af0c1278dfcabe32300f","tarball":"http://registry.npmjs.org/backbone-request/-/backbone-request-0.0.1.tgz"},"maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}]}},"readme":"# backbone-request\n\nA sync engine for **server-side** [backbone.js](http://backbonejs.org) built on the well-established [request](http://github.com/mikeal/request) library.\n\n\n# Installation\n\n     npm install backbone-request\n\n# Usage\n\n    var Backbone = require('backbone');\n    var request = require('backbone-request');\n    Backbone.sync = request.sync;\n\nIt doesn't really get any easier than that. Now server-side Backbone can sync with any HTTP endpoint using [request](http://github.com/mikeal/request) ","maintainers":[{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2012-06-15T08:10:15.028Z","created":"2012-06-15T08:10:13.500Z","0.0.1":"2012-06-15T08:10:15.028Z"},"author":{"name":"Marak","email":"marak.squires@gmail.com"},"repository":{"type":"git","url":"git://github.com/Marak/backbone-request.git"},"_attachments":{"backbone-request-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Sat9l7Yvt2hxe0oCy+aBHA==","length":1548,"stub":true}}}},
{"id":"backbone-server","key":"backbone-server","value":{"rev":"25-905906dafc68f20ede8f6c7f6eff3a1b"},"doc":{"_id":"backbone-server","_rev":"25-905906dafc68f20ede8f6c7f6eff3a1b","name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","dist-tags":{"latest":"0.3.9"},"versions":{"0.2.0":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"An interface between Backbone and Express. Creates a Backbone.Server object.","version":"0.2.0","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"express":">= 2.4.6","backbone":">= 0.0.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.2.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"c9306ed8328c7b1aab130793a76c4d12cac80900","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.2.0.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.2.1":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"An interface between Backbone and Express. Creates a Backbone.Server object.","version":"0.2.1","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"express":">= 2.4.6","backbone":">= 0.5.3"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.2.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"0e75d9b991a92f4fb3da99d734e0b8f23ec38975","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.2.1.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.2.2":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"An interface between Backbone and Express. Creates a Backbone.Server object.","version":"0.2.2","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"express":">= 2.4.6","backbone":">= 0.5.3"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.2.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"6b7ab7df4ad3c419f212fb183c38cb5783f58024","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.2.2.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.0":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.0","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":"*","backbone":"*","express":"*","socket.io":"*","ejs":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d88617bcbf1d6ed524061d637b89b87cf692ec46","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.0.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.1":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.1","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":"*","backbone":"*","express":"*","socket.io":"*","ejs":"*","connect":"*","qs":"*","mime":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"0f3025bd5554a13df67f98031ded5aa1c1eafd1c","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.1.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.2":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.2","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":"*","backbone":"*","express":"*","socket.io":"*","ejs":"*","connect":"*","qs":"*","mime":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d1e6e3de2f31a1c84564aec80abfb7982bc8511d","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.2.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.3":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.3","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":"*","backbone":"*","express":"*","socket.io":"*","socket.io-client":"*","ejs":"*","connect":"*","qs":"*","mime":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.3","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ea8a8a69b93b69b48c7a0189fab3bf3e65ad0e5a","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.3.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.5":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.5","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":">=1.1.2","backbone":">=0.5.3","express":">=2.4.6","socket.io":">=0.8.4","socket.io-client":">=0.8.4","ejs":">=0.4.3","connect":">= 1.5.2 < 2.0.0","mime":">= 0.0.1","qs":">= 0.3.1"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.5","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"01346570b61d69acaec1a704bcd5a7a6a9362b5a","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.5.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.6":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.6","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":">=1.1.2","backbone":">=0.5.3","express":">=2.4.6","socket.io":">=0.8.4","socket.io-client":">=0.8.4","ejs":">=0.4.3","connect":">= 1.5.2 < 2.0.0","mime":">= 0.0.1","qs":">= 0.3.1"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.6","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f7b7dcfa67d529d59ba54ae51e78b400d38b7f29","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.6.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.7":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.7","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":">=1.1.2","backbone":">=0.5.3","express":">=2.4.6","socket.io":">=0.8.4","socket.io-client":">=0.8.4","ejs":">=0.4.3","connect":">= 1.5.2 < 2.0.0","mime":">= 0.0.1","qs":">= 0.3.1"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/nate/.npm/backbone-server/0.3.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-server@0.3.7","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"86618a93f289587919bdafed1128fd7c291cd137","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.7.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.8":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.8","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":">=1.1.2","backbone":">=0.5.3","express":">=2.4.6","socket.io":">=0.8.4","socket.io-client":">=0.8.4","ejs":">=0.4.3","connect":">= 1.5.2 < 2.0.0","mime":">= 0.0.1","qs":">= 0.3.1","mongoose":"*","colors":"*"},"devDependencies":{},"_npmUser":{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"},"_id":"backbone-server@0.3.8","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"40fa2ea0ab011ace7cf37628ca649e2fa12a01cd","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.8.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]},"0.3.9":{"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"name":"backbone-server","description":"Creates a Backbone.Server object which interfaces between Backbone, Socket.IO and Express.","version":"0.3.9","main":"./lib/backbone-server.js","repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"engines":{"node":"~v0.4.8"},"dependencies":{"underscore":">=1.1.2","backbone":">=0.5.3","express":">=2.4.6","socket.io":">=0.8.4","socket.io-client":">=0.8.4","ejs":">=0.4.3","connect":">= 1.5.2 < 2.0.0","mime":">= 0.0.1","qs":">= 0.3.1","mongoose":"*","colors":"*"},"devDependencies":{},"_npmUser":{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"},"_id":"backbone-server@0.3.9","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d1d26843dde7c4f3aa6c210b2c4f53f7d28e7862","tarball":"http://registry.npmjs.org/backbone-server/-/backbone-server-0.3.9.tgz"},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}]}},"maintainers":[{"name":"natehunzaker","email":"nate.hunzaker@gmail.com"}],"time":{"modified":"2011-12-04T19:55:16.702Z","created":"2011-09-24T22:42:57.867Z","0.2.0":"2011-09-24T22:42:58.139Z","0.2.1":"2011-09-25T02:19:54.649Z","0.2.2":"2011-09-25T02:35:39.049Z","0.3.0":"2011-09-26T00:36:41.129Z","0.3.1":"2011-09-26T00:59:42.321Z","0.3.2":"2011-09-26T12:55:18.755Z","0.3.3":"2011-09-26T23:07:17.313Z","0.3.5":"2011-09-30T02:17:22.010Z","0.3.6":"2011-10-03T22:30:12.164Z","0.3.7":"2011-10-03T22:41:10.163Z","0.3.8":"2011-12-04T19:52:52.820Z","0.3.9":"2011-12-04T19:55:16.702Z"},"author":{"name":"Nate Hunzaker","email":"nate.hunzaker@gmail.com","url":"natehunzaker.com"},"repository":{"type":"git","url":"git://github.com/nhunzaker/backbone-server.git"},"_attachments":{"backbone-server-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-1NkaHyb3ijN7AK34nu9FTA==","length":5191680,"stub":true},"backbone-server-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-f12qzUx4WqPRTCkAmM6TXw==","length":5191680,"stub":true},"backbone-server-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-K7miWexE6VailT/IdE9t6g==","length":5137110,"stub":true},"backbone-server-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-B+Yhi0l5DgHr5zdmasoQxg==","length":5136760,"stub":true},"backbone-server-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-rEBVqhCTBbl+2FcG7ebCww==","length":5136431,"stub":true},"backbone-server-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-pcVQ6+ClqEnz8yM2/P4KPg==","length":5137407,"stub":true},"backbone-server-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IiBG6h0e9ab4w7bsB9VGgg==","length":5138336,"stub":true},"backbone-server-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-XywgE+ansFf/Ysc2nZduHA==","length":5138754,"stub":true},"backbone-server-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/N+RzqIcaikE9sFoeYESRA==","length":5138264,"stub":true},"backbone-server-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6g/VBQJgWRaGqLoia2RRKA==","length":5013633,"stub":true},"backbone-server-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-S4KhGxkGlteqyjKLtn6Ntg==","length":5013913,"stub":true},"backbone-server-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-d4ByNWft1cnf7hmJUH8SGA==","length":2453,"stub":true}}}},
{"id":"backbone-simpledb","key":"backbone-simpledb","value":{"rev":"5-a815128e1e3593696f666f8b3da36d78"},"doc":{"_id":"backbone-simpledb","_rev":"5-a815128e1e3593696f666f8b3da36d78","name":"backbone-simpledb","description":"AWS SimpleDB sync backend for backbone.js.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"backbone-simpledb","description":"AWS SimpleDB sync backend for backbone.js.","version":"0.1.0","author":{"name":"Young Hahn"},"engines":{"node":"0.4.x"},"dependencies":{"underscore":"1.1.x","simpledb":"0.0.x"},"licenses":[{"type":"BSD"}],"main":"./backbone-simpledb","scripts":{"test":"./test/run.sh"},"devDependencies":{},"_id":"backbone-simpledb@0.1.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"048d9e0113c30dc322afd930ebb00f78f22f6136","tarball":"http://registry.npmjs.org/backbone-simpledb/-/backbone-simpledb-0.1.0.tgz"}},"0.1.1":{"name":"backbone-simpledb","description":"AWS SimpleDB sync backend for backbone.js.","version":"0.1.1","author":{"name":"Young Hahn"},"engines":{"node":"0.4.x"},"dependencies":{"underscore":"1.1.x","simpledb":"0.0.x"},"licenses":[{"type":"BSD"}],"main":"./backbone-simpledb","scripts":{"test":"./test/run.sh"},"_id":"backbone-simpledb@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a5667e6d619ba30c2b1f4e7bd842609a67cbd18d","tarball":"http://registry.npmjs.org/backbone-simpledb/-/backbone-simpledb-0.1.1.tgz"}}},"maintainers":[{"name":"yhahn","email":"young@developmentseed.org"}],"time":{"modified":"2011-06-09T15:31:14.210Z","created":"2011-05-19T15:29:05.000Z","0.1.0":"2011-05-19T15:29:05.159Z","0.1.1":"2011-06-09T15:31:14.210Z"},"author":{"name":"Young Hahn"},"_attachments":{"backbone-simpledb-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xgIhf6VzBy67i/myYLELuw==","length":3600,"stub":true},"backbone-simpledb-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lyExXdm4Adw7QazlmwrprQ==","length":3552,"stub":true}}}},
{"id":"backbone-sockjs","key":"backbone-sockjs","value":{"rev":"3-c2c5c8644fa9773a0deca56e8f5fa253"},"doc":{"_id":"backbone-sockjs","_rev":"3-c2c5c8644fa9773a0deca56e8f5fa253","name":"backbone-sockjs","description":"A storage adapter for syncing client-side Backbone.js models with server-side ones","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Ben Pirt","email":"ben@pirt.co.uk"},"name":"backbone-sockjs","description":"A storage adapter for syncing client-side Backbone.js models with server-side ones","version":"0.0.1","homepage":"http://github.com/bjpirt/backbone-sockjs","license":"MIT","repository":{"type":"git","url":"git://github.com/bjpirt/backbone-sockjs.git"},"main":"backbone-sockjs.js","scripts":{"test":"./node_modules/mocha/bin/mocha -R spec test/*_test.js"},"dependencies":{"backbone":"0.9.2"},"devDependencies":{"mocha":"0.14.1","should":"0.6.0"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bjpirt","email":"ben@pirt.co.uk"},"_id":"backbone-sockjs@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2514bb6b8cc568d57fea60f1cee86228996f9f4a","tarball":"http://registry.npmjs.org/backbone-sockjs/-/backbone-sockjs-0.0.1.tgz"},"maintainers":[{"name":"bjpirt","email":"ben@pirt.co.uk"}]}},"readme":"backbone-sockjs\n===================\n\n[![Build Status](https://secure.travis-ci.org/bjpirt/backbone-sockjs.png)](http://travis-ci.org/bjpirt/backbone-sockjs)\n\nThis is a sync library for syncing client-side Backbone.js models with their server-side counterparts. It's very much a work in progress at the moment so use at your own risk.\n\n","maintainers":[{"name":"bjpirt","email":"ben@pirt.co.uk"}],"time":{"modified":"2012-05-24T08:22:25.314Z","created":"2012-05-24T08:22:24.277Z","0.0.1":"2012-05-24T08:22:25.314Z"},"author":{"name":"Ben Pirt","email":"ben@pirt.co.uk"},"repository":{"type":"git","url":"git://github.com/bjpirt/backbone-sockjs.git"},"_attachments":{"backbone-sockjs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7xbRgwOdzlv4y0m0tLcaiA==","length":2513,"stub":true}}}},
{"id":"backbone-stash","key":"backbone-stash","value":{"rev":"19-8d3cc5f9ed28f9a56856154e2b4e7f78"},"doc":{"_id":"backbone-stash","_rev":"19-8d3cc5f9ed28f9a56856154e2b4e7f78","name":"backbone-stash","dist-tags":{"latest":"0.5.0"},"versions":{"0.0.3":{"name":"backbone-stash","version":"0.0.3","author":{"name":"Young Hahn"},"dependencies":{"stash":"= 0.0.2"},"licenses":[{"type":"BSD"}],"main":"./backbone-stash","_id":"backbone-stash@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"f3566c1174d8d62291b667a3f2a68e04d056037e","tarball":"http://registry.npmjs.org/backbone-stash/-/backbone-stash-0.0.3.tgz"},"directories":{}},"0.0.4":{"name":"backbone-stash","version":"0.0.4","author":{"name":"Young Hahn"},"dependencies":{"underscore":"= 1.1.5","backbone":"= 0.3.3","stash":"= 0.0.2"},"licenses":[{"type":"BSD"}],"main":"./backbone-stash","_id":"backbone-stash@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"3b7c9f9edc90db47ccbb3fbcd66d8d22c6a6241a","tarball":"http://registry.npmjs.org/backbone-stash/-/backbone-stash-0.0.4.tgz"},"directories":{}},"0.0.5":{"name":"backbone-stash","version":"0.0.5","author":{"name":"Young Hahn"},"dependencies":{"underscore":">= 1.1.5 < 1.2.0","stash":"= 0.0.2"},"licenses":[{"type":"BSD"}],"main":"./backbone-stash","devDependencies":{},"_id":"backbone-stash@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"1695cb436d6fa7e5c27dbc7866f03e4c9bea3528","tarball":"http://registry.npmjs.org/backbone-stash/-/backbone-stash-0.0.5.tgz"},"scripts":{},"directories":{}},"0.5.0":{"name":"backbone-stash","version":"0.5.0","author":{"name":"Young Hahn"},"dependencies":{"underscore":">= 1.1.5 < 1.2.0","stash":"= 0.0.2"},"licenses":[{"type":"BSD"}],"main":"./backbone-stash","_npmJsonOpts":{"file":"/Users/adrian/.npm/backbone-stash/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backbone-stash@0.5.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a622283cdb16a58de3d2946ea4ed5d2bef61d153","tarball":"http://registry.npmjs.org/backbone-stash/-/backbone-stash-0.5.0.tgz"},"scripts":{},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"time":{"modified":"2011-08-01T16:24:47.026Z","created":"2011-04-07T17:54:56.114Z","0.0.3":"2011-04-07T17:54:58.124Z","0.0.4":"2011-04-07T18:05:04.585Z","0.0.5":"2011-05-03T21:19:11.352Z","0.0.6":"2011-08-01T16:12:36.777Z","0.5.0":"2011-08-01T16:24:47.026Z"},"author":{"name":"Young Hahn"},"_attachments":{"backbone-stash-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-QgafjQJCUqWKr2/nWM5NEQ==","length":2366,"stub":true},"backbone-stash-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OxVzF1EYT/1LDjMc0S4FyA==","length":2339,"stub":true},"backbone-stash-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZMwdo5eOw9KwI6yq2nwt9w==","length":2384,"stub":true},"backbone-stash-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BbmHvQHdxmjnsCP79J3mQA==","length":2365,"stub":true}}}},
{"id":"backbone-validation","key":"backbone-validation","value":{"rev":"10-388d0f7c09b8a70a667d870e4b3c12b2"},"doc":{"_id":"backbone-validation","_rev":"10-388d0f7c09b8a70a667d870e4b3c12b2","name":"backbone-validation","description":"Backbone.Validation.","dist-tags":{"latest":"0.6.2"},"versions":{"0.1.1":{"name":"backbone-validation","description":"Backbone.Validation.","url":"http://jatek.toolpart.hu","keywords":["backbone","validation"],"author":{"name":"Bika","email":"viktor.nagy@toolpart.hu"},"contributors":[],"dependencies":{"underscore":">=1.3.1","backbone":"0.9.x","node-static":">=0.5.9"},"lib":".","main":"backbone-validation.js","version":"0.1.1","_npmUser":{"name":"akasha","email":"viktor.nagy@gmail.com"},"_id":"backbone-validation@0.1.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"de38a3e86a5889dbb86e12e828b9f8dc555ee1f4","tarball":"http://registry.npmjs.org/backbone-validation/-/backbone-validation-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"akasha","email":"viktor.nagy@gmail.com"}]},"0.6.1":{"name":"backbone-validation","title":"Backbone.Validation","version":"0.6.1","author":{"name":"Thomas Pedersen","url":"http://thedersen.com/"},"homepage":"http://thedersen.com/projects/backbone-validation","licenses":[{"type":"MIT","url":"http://thedersen.mit-license.org/"}],"bugs":{"url":"http://github.com/thedersen/backbone.validation/issues"},"directories":{"lib":"./dist"},"repository":{"type":"git","url":"git://github.com/thedersen/backbone.validation.git"},"scripts":{"test":"grunt buster","prepublish":"grunt"},"main":"./dest/backbone-validation-amd.js","dependencies":{"backbone":">=0.9.1","underscore":">=1.3.1"},"devDependencies":{"buster":">=0.6.2","grunt-buster":">=0.1.1"},"_npmUser":{"name":"thedersen","email":"thedersen@gmail.com"},"_id":"backbone-validation@0.6.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"1d1bfd30a89f078bd8751ae4c99822851cf3c31b","tarball":"http://registry.npmjs.org/backbone-validation/-/backbone-validation-0.6.1.tgz"},"maintainers":[{"name":"thedersen","email":"thedersen@gmail.com"}]},"0.6.2":{"name":"backbone-validation","title":"Backbone.Validation","version":"0.6.2","author":{"name":"Thomas Pedersen","url":"http://thedersen.com/"},"homepage":"http://thedersen.com/projects/backbone-validation","licenses":[{"type":"MIT","url":"http://thedersen.mit-license.org/"}],"bugs":{"url":"http://github.com/thedersen/backbone.validation/issues"},"directories":{"lib":"./dist"},"repository":{"type":"git","url":"git://github.com/thedersen/backbone.validation.git"},"scripts":{"test":"grunt buster","prepublish":"grunt"},"main":"./dist/backbone-validation-amd.js","dependencies":{"backbone":">=0.9.1","underscore":">=1.3.1"},"devDependencies":{"buster":">=0.6.2","grunt-buster":">=0.1.1"},"_npmUser":{"name":"thedersen","email":"thedersen@gmail.com"},"_id":"backbone-validation@0.6.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d06d492d4c9776f11bdc2fe865ca76b78308d329","tarball":"http://registry.npmjs.org/backbone-validation/-/backbone-validation-0.6.2.tgz"},"maintainers":[{"name":"thedersen","email":"thedersen@gmail.com"}]}},"readme":"# Backbone.Validation v0.4.0\n\nA validation plugin for [Backbone.js](http://documentcloud.github.com/backbone) inspired by [Backbone.ModelBinding](http://github.com/derickbailey/backbone.modelbinding), and another implementation with a slightly different approach than mine at [Backbone.Validations](http://github.com/n-time/backbone.validations).\n\n## Getting started\n\nIt's easy to get up and running. You only need to have Backbone (including underscore.js) in your page before including the Backbone.Validation plugin. If you are using the default implementation of the callbacks, you also need to include jQuery.\n\n### Configure validation rules on the Model\n\nTo configure your validation rules, simply add a validation property with a property for each attribute you want to validate on your model. The validation rules can either be an object with one of the built-in validators or a combination of two or more of them, or a function where you implement your own custom validation logic. If you want to provide a custom error message when using one of the built-in validators, simply define the `msg` property with your message.\n\n#### Example\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    name: {\n\t\t  required: true,\n\t\t  msg: 'Name is required'\n\t\t},\n\t    age: {\n\t\t  range: [1, 80]\n\t\t},\n\t\temail: {\n\t\t  pattern: 'email'\n\t\t},\n\t\tsomeAttribute: function(value) {\n\t\t  if(value !== 'somevalue') {\n\t\t    return 'Error';\n\t\t  }\n\t\t}\n\t  }\n});\n\nSee the **built-in validators** section in this readme for a list of the validators and patterns that you can use.\n\n### Validation binding\n\nThe validation binding code is executed with a call to `Backbone.Validation.bind(view)`. The [validate](http://documentcloud.github.com/backbone/#Model-validate) method on the view's model is then overridden to perform the validation. In addition, the model is extended with an `isValid()` method.\n\nThere are several places that it can be called from, depending on your circumstances.\n\n\t// Binding when rendering\n\tvar SomeView = Backbone.View.extend({\n\t  render: function(){\n\t    Backbone.Validation.bind(this);\n\t  }\n\t});\n\n\t// Binding when initializing\n\tvar SomeView = Backbone.View.extend({\n\t  initialize: function(){\n\t    Backbone.Validation.bind(this);\n\t  }\n\t});\n\n\t// Binding from outside a view\n\tvar SomeView = Backbone.View.extend({\n\t});\n\tvar someView = new SomeView();\n\tBackbone.Validation.bind(someView);\n\n### Specifying error messages\n\nYou can specify an error message per attribute:\n\n\tMyModel = Backbone.Model.extend({\n    \tvalidation: {\n        \temail: {\n            \trequired: true,\n            \tpattern: \"email\",\n            \tmsg: \"Please enter a valid email\"\n            }\n        }\n\t});\n\nOr, you can specify an error message per validator:\n\n\tMyModel = Backbone.Model.extend({\n    \tvalidation: {\n        \temail: [{\n            \trequired: true,\n            \tmsg: \"Please enter an email address\"\n        \t},{\n            \tpattern: \"email\",\n            \tmsg: \"Please enter a valid email\"\n        \t}]\n        }\n\t});\n\n\n## Configuration\n\n### Callbacks\n\nThe `Backbone.Validation.callbacks` contains two methods: `valid` and `invalid`. These are called after validation of an attribute is performed.\n\nThe default implementation of `invalid` tries to look up an element within the view with an name attribute equal to the name of the attribute that is validated. If it finds one, an `invalid` class is added to the element as well as a `data-error` attribute with the error message. The `valid` method removes these if they exists.\n\nThe default implementation of these can of course be overridden:\n\n\t_.extend(Backbone.Validation.callbacks, {\n      valid: function(view, attr, selector) {\n\t    // do something\n\t  },\n      invalid: function(view, attr, error, selector) {\n\t\t// do something\n\t  }\n    });\n\nYou can also override these per view when binding:\n\n\tvar SomeView = Backbone.View.extend({\n\t  render: function(){\n\t    Backbone.Validation.bind(this, {\n\t\t  valid: function(view, attr) {\n\t\t    // do something\n\t\t  },\n\t      invalid: function(view, attr, error) {\n\t\t\t// do something\n\t\t  }\n\t\t});\n\t  }\n\t});\n\n### Selector\n\nIf you need to look up elements in the view by using for instance a class name or id instead of name, there are two ways to configure this.\n\nYou can configure it globally by calling:\n\n\tBackbone.Validation.configure({\n\t\tselector: 'class'\n\t});\n\nOr, you can configure it per view when binding:\n\n\tBackbone.Validation.bind(this.view, {\n        selector: 'class'\n    });\n\nIf you have set the global selector to class, you can of course set the selector to name or id on specific views.\n\n### Force update\n\nSometimes it can be useful to update the model with invalid values. Especially when using automatic modelbinding and late validation (e.g. when submitting the form).\n\nYou can turn this on globally by calling:\n\n\tBackbone.Validation.configure({\n\t\tforceUpdate: true\n\t});\n\nOr, you can turn it on per view when binding:\n\n\tBackbone.Validation.bind(this.view, {\n        forceUpdate: true\n    });\n\nNote that when switching this on, the error event is no longer triggered.\n\n## Events\n\nAfter validation is performed, the model will trigger some events with the result of the validation.\n\n### validated\n\nThe `validated` event is triggered after validation is performed, either it was successful or not. `isValid` is `true` or `false` depending on the result of the validation.\n\n\tmodel.bind('validated', function(isValid, model, attrs) {\n\t\t// do something\n\t});\n\n### validated:valid\n\nThe `validated:valid` event is triggered after a successful validation is performed.\n\n\tmodel.bind('validated:valid', function(model) {\n\t\t// do something\n\t});\n\n### validated:invalid\n\nThe `validated:invalid` event is triggered after an unsuccessful validation is performed.\n\n\tmodel.bind('validated:invalid', function(model, attrs) {\n\t\t// do something\n\t});\n\n## Built-in validators\n\n### method validator\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    name: function(value) {\n          if(value !== 'something') {\n            return 'Name is invalid';\n          }\n\t\t}\n\t  }\n\t});\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    name: {\n\t\t  fn: function(value) {\n\t       \tif(value !== 'something') {\n\t       \t  return 'Name is invalid';\n\t      \t}\n\t      }\n\t\t}\n\t  }\n\t});\n\n### named method validator\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    name: 'validateName'\n\t  },\n\t  validateName: function(value, attr) {\n\t\tif(value !== 'something') {\n          return 'Name is invalid';\n        }\n\t  }\n\t});\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t\tname: {\n\t\t  fn: 'validateName'\n\t\t}\n\t  },\n\t  validateName: function(value, attr) {\n\t\tif(value !== 'something') {\n          return 'Name is invalid';\n        }\n\t  }\n\t});\n\n### required\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    name: {\n\t\t  required: true | false\n\t\t}\n\t  }\n\t});\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    name: {\n\t\t  required: function() {\n\t\t\treturn true | false;\n\t\t  }\n\t\t}\n\t  }\n\t});\n\n### acceptance\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    termsOfUse: {\n\t\t  acceptance: true\n\t\t}\n\t  }\n\t});\n\n### min\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    age: {\n\t\t  min: 1\n\t\t}\n\t  }\n\t});\n\n### max\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    age: {\n\t\t  max: 100\n\t\t}\n\t  }\n\t});\n\n### range\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    age: {\n\t\t  range: [1, 10]\n\t\t}\n\t  }\n\t});\n\n### length\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    postalCode: {\n\t\t  length: 4\n\t\t}\n\t  }\n\t});\n\n### minLength\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    password: {\n\t\t  minLength: 8\n\t\t}\n\t  }\n\t});\n\n### maxLength\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    password: {\n\t\t  maxLength: 100\n\t\t}\n\t  }\n\t});\n\n### rangeLength\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    password: {\n\t\t  rangeLength: [6, 100]\n\t\t}\n\t  }\n\t});\n\n### oneOf\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    country: {\n\t\t  oneOf: ['Norway', 'Sweeden']\n\t\t}\n\t  }\n\t});\n\n### equalTo\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    password: {\n\t\t  required: true\n\t\t},\n\t\tpasswordRepeat: {\n\t\t\tequalTo: 'password'\n\t\t}\n\t  }\n\t});\n\n### pattern\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    email: {\n\t\t  pattern: 'email'\n\t\t}\n\t  }\n\t});\n\nwhere the built-in patterns are:\n\n* number\n* email\n* url\n* digits\n\nor specify any regular expression you like:\n\n\tvar SomeModel = Backbone.Model.extend({\n\t  validation: {\n\t    email: {\n\t\t  pattern: /^sample/\n\t\t}\n\t  }\n\t});\n\nSee the [wiki](https://github.com/thedersen/backbone.validation/wiki) for more details about the validators.\n\n## Extending Backbone.Validation\n\n### Adding custom validators\n\nIf you have custom validation logic that are used several places in your code, you can extend the validators with your own. And if you don't like the default implementation of one of the built-ins, you can override it.\n\n\t_.extend(Backbone.Validation.validators, {\n      myValidator: function(value, attr, customValue, model) {\n        if(value !== customValue){\n          return 'error';\n        }\n      },\n      required: function(value, attr, customValue, model) {\n        if(!value){\n          return 'My version of the required validator';\n        }\n      },\n   \t});\n\n   \tvar Model = Backbone.Model.extend({\n      validation: {\n        age: {\n       \t  myValidator: 1 // uses your custom validator\n        }\n      }\n   \t});\n\nThe validator should return an error message when the value is invalid, and nothing (`undefined`) if the value is valid. If the validator returns `false`, this will result in that all other validators specified for the attribute is bypassed, and the attribute is considered valid.\n\n### Adding custom patterns\n\nIf you have custom patterns that are used several places in your code, you can extend the patterns with your own. And if you don't like the default implementation of one of the built-ins, you can override it.\n\n\t_.extend(Backbone.Validation.patterns, {\n\t  myPattern: /my-pattern/,\n\t  email: /my-much-better-email-regex/\n\t});\n\n\tvar Model = Backbone.Model.extend({\n      validation: {\n        name: {\n          pattern: 'myPattern'\n        }\n      }\n\t});\n\n### Overriding the default error messages\n\nIf you don't like the default error messages there are several ways of customizing them.\n\nYou can override the default ones globally:\n\n\t_.extend(Backbone.Validation.messages, {\n\t\trequired: 'This field is required',\n\t\tmin: '{0}' should be at least {1} characters\n\t});\n\nThe message can contain placeholders for arguments that will be replaced:\n\n* `{0}` will be replaced with the name of the attribute being validated\n* `{1}` will be replaced with the allowed value configured in the validation (or the first one in a range validator)\n* `{2}` will be replaced with the second value in a range validator\n\n## Release notes\n\n#### v0.4.0\n\n* `isValid` returns `undefined` when no validatation has occured and the model has validation\n* Passing `true` to `isValid` forces an validation\n* When specifying multiple validators for one attribute, all can have it's own error message (thanks to [GarethElms](https://github.com/GarethElms))\n* method validator and named method validator can be combined with other built-in validators\n* acceptance validator accepts 'true' as valid (Fixes issue #12)\n* Can configure per view or globally to force update the model with invalid values. This can be very useful when using automatic modelbinding and late validation (e.g. when submitting the form)\n* email pattern is case insensitive\n* Breaking changes (unfortunate, but necessary):\n\t* `setDefaultSelector` is removed, and you need to call `configure({selector: 'class'})` instead\n\n#### v0.3.1\n\n* Fixed issue with validated events being triggered before model was updated\n* Added model and an array of invalid attribute names as arguments to the events\n\n#### v0.3.0\n\n* Triggers events when validation is performed (thanks to [GarethElms](https://github.com/GarethElms)):\n\t* 'validated' with `true` or `false` as argument\n\t* 'validated:valid' when model is valid\n\t* 'validated:invalid' when model is invalid\n* Named method validator get the name of the attribute being validate as the second argument (thanks to [goreckm](https://github.com/goreckm))\n* `error` argument passed to the error event raised by Backbone contains an array of errors when validating multiple attributed in one go, otherwise a string\n* Breaking changes (unfortunate, but necessary):\n\t* isValid attribute (`model.get('isValid')`) is replaced with a method `model.isValid()`\n\t* Default selector is 'name' instead of 'id'\n\n#### v0.2.0\n\n* New validators:\n\t* named method\n\t* length\n\t* acceptance (which is typically used when the user has to accept something (e.g. terms of use))\n\t* equalTo\n\t* range\n\t* rangeLength\n\t* oneOf\n* Added possibility to validate entire model by explicitly calling `model.validate()` without any parameters. (Note: `Backbone.Validation.bind(..)` must still be called)\n* required validator can be specified as a method returning either `true` or `false`\n* Can override the default error messages globally\n* Can override the id selector (#) used in the callbacks either globally or per view when binding\n* Improved email pattern for better matching\n* Added new pattern 'digits'\n* Possible breaking changes:\n\t* Removed the unused msg parameter when adding custom validators\n\t* Number pattern matches negative numbers (Fixes issue #4), decimals and numbers with 1000-separator (e.g. 123.000,45)\n\t* Context (this) in the method validators is now the model instead of the global object (Fixes issue #6)\n\t* All validators except required and acceptance invalidates null, undefined or empty value. However, required:false can be specified to allow null, undefined or empty value\n* Breaking changes (unfortunate, but necessary):\n\t* Required validator no longer invalidates false boolean, use the new acceptance validator instead\n\n#### v0.1.3\n\n* Fixed issue where min and max validators treated strings with leading digits as numbers\n* Fixed issue with undefined Backbone reference when running Backbone in no conflict mode\n* Fixed issue with numeric string with more than one number not being recognized as a number\n\n#### v0.1.2\n\n* Initial release\n\n## License\n\nhttp://thedersen.mit-license.org/\n","maintainers":[{"name":"thedersen","email":"thedersen@gmail.com"}],"time":{"modified":"2012-08-07T16:28:50.539Z","created":"2012-03-09T21:29:54.221Z","0.1.1":"2012-03-09T21:29:56.933Z","0.6.1":"2012-08-01T12:46:10.975Z","0.6.2":"2012-08-07T16:28:50.539Z"},"author":{"name":"Thomas Pedersen","url":"http://thedersen.com/"},"repository":{"type":"git","url":"git://github.com/thedersen/backbone.validation.git"},"users":{"fgribreau":true},"_attachments":{"backbone-validation-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-oyZT+ohotnGeL7SPd7BGnw==","length":147535,"stub":true},"backbone-validation-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AdHyCPQXaUvjqr3DKvYP0g==","length":147491,"stub":true},"backbone-validation-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gs8oeuT1UGVlvlkUvKvILg==","length":6978,"stub":true}}}},
{"id":"backbone.io","key":"backbone.io","value":{"rev":"38-21db6332e26b9351ab70c2d874880439"},"doc":{"_id":"backbone.io","_rev":"38-21db6332e26b9351ab70c2d874880439","name":"backbone.io","description":"Backbone.js sync via Socket.IO","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"backbone.io","version":"0.1.0","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7","underscore":">= 1.2.1"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b0668f64360dae86252361478134dcc6dfe1e131","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.1.0.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.1.1":{"name":"backbone.io","version":"0.1.1","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7","underscore":">= 1.2.1"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5cf3cad5ed388c6ddfe2a5adb49d219c355af86f","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.1.1.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.1.2":{"name":"backbone.io","version":"0.1.2","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7","underscore":">= 1.2.1"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0daf83bbb3a2c4d95c5087e245b89211ae27df87","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.1.2.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.1.3":{"name":"backbone.io","version":"0.1.3","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7","underscore":">= 1.2.1"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e21a1f45dfff9a1a68843a635883d77ff00bbc36","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.1.3.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.2.0":{"name":"backbone.io","version":"0.2.0","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"bec93e9bda2373f4aaebe239f93419cde80d4def","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.0.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.2.1":{"name":"backbone.io","version":"0.2.1","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"ab638a94e0d02295b791901437f58afff38b0516","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.1.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.2.2":{"name":"backbone.io","version":"0.2.2","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"7e08f58060f150112ed82eef9547a622a8ff7b3c","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.2.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.2.3":{"name":"backbone.io","version":"0.2.3","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a8f1b31fce81dd147190a841ccc1cb764f63de63","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.3.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"directories":{}},"0.2.4":{"name":"backbone.io","version":"0.2.4","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"e4616e08b89084fd5c17050eb92bc6e559431690","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.4.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}]},"0.2.5":{"name":"backbone.io","version":"0.2.5","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"38b3fe48b1ef55e99fd3370d50e22b8447c861f2","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.5.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}]},"0.2.6":{"name":"backbone.io","version":"0.2.6","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a7bba548ee0c110af89345c123ce925d10413b83","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.6.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}]},"0.2.7":{"name":"backbone.io","version":"0.2.7","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"_npmUser":{"name":"scttnlsn","email":"scottbnel@gmail.com"},"_id":"backbone.io@0.2.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"51fea27983d80444266074a18f34564fa743ebeb","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.2.7.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}]},"0.3.0":{"name":"backbone.io","version":"0.3.0","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"readme":"Backbone.IO\n===========\n\nBackend-agnostic Backbone.js sync override and server notifications via Socket.IO.\n\nInstall\n-------\n\n    npm install backbone.io\n    \nUsage\n-----\n\nOn the server:\n\n    var http = require('http');\n    var backboneio = require('backbone.io');\n    \n    var app = http.createServer();    \n    app.listen(3000);\n\n    var backend = backboneio.createBackend();\n    backend.use(backboneio.middleware.memoryStore());\n    \n    backboneio.listen(app, { mybackend: backend });\n\nOn the client:\n\n    <!-- Include Underscore, Backbone -->\n    \n    <script src=\"/socket.io/socket.io.js\"></script>\n    <script src=\"/socket.io/backbone.io.js\"></script>\n    \n    <script>\n        Backbone.io.connect();\n\n        var MyCollection = Backbone.Collection.extend({\n            backend: 'mybackend'\n        });\n    </script>\n    \nModels in `MyCollection` will now be synced to `mybackend`.\n\nNote that as of 0.3.x, one must explicitly call `Backbone.io.connect`.  Any\noptional arguments will be passed to Socket.IO's `io.connect` function.\n\nEvents\n------\n\nWhen a model is synced with a particular backend, the backend will trigger events\non collections (across multiple clients) that share the backend.  For example, we\ncould keep collections synced in realtime with the following event bindings:\n\n    var MyCollection = Backbone.Collection.extend({\n        \n        backend: 'mybackend',\n        \n        initialize: function() {\n            var self = this;\n        \n            this.bind('backend:create', function(model) {\n                self.add(model);\n            });\n            this.bind('backend:update', function(model) {\n                self.get(model.id).set(model);\n            });\n            this.bind('backend:delete', function(model) {\n                self.remove(model.id);\n            });\n        }\n        \n    });\n    \nOr use the provided shortcut:\n    \n    backend: 'mybackend',\n    \n    initialize: function() {\n        this.bindBackend();\n    }\n    \nIn addition to `backend:create`, `backend:read`, `backend:update`, and `backend:delete`\nevents, a generic `backend` event is also triggered when a model is synced.\n\n    this.bind('backend', function(method, model) {\n        // Method will be one of create, read, update, or delete\n    });\n    \nThe event prefix `backend` is used by default but this can be customized by setting the\nevent name on the server.\n\n    backboneio.listen(app, { mybackend: backend }, { event: 'myevent' });\n\nBackends and Middleware\n-----------------------\n\nBackends are stacks of composable middleware (inspired by Connect) that are responsible\nfor handling sync requests and responding appropriately.  Each middleware is a function\nthat accepts request and response objects (and optionally a function that can be called\nto continue down the stack).  A middleware will generally either return a result by\ncalling `end` on the response object or pass control downward.  For example, let's add a\nlogger middleware to our backend:\n\n    var backend = backboneio.createBackend();\n    \n    backend.use(function(req, res, next) {\n        console.log(req.backend);\n        console.log(req.method);\n        console.log(JSON.stringify(req.model));\n        next();\n    });\n    \n    backend.use(backboneio.middleware.memoryStore());\n    \nA request object will contain the following components (in addition to those set by\nvarious middleware):\n\n* `method`: the sync method (`create`, `read`, `update`, or `delete`)\n* `model`: the model object to by synced\n* `options`: any options set by the client (except success and error callbacks)\n* `backend`: name of the backend responsible for handling the request\n* `socket`: the client socket that initiated the request\n    \nMiddleware can also be applied to only particular types of requests by passing the desired\ncontexts to `use`:\n\n    backend.use('create', 'update', 'delete', function(req, res, next) {\n        if (isAuthorized(req)) {\n            next();\n        } else {\n            next(new Error('Unauthorized'));\n        }\n    });\n    \nOr alternatively by using one of the four helper methods (`create`, `read`, `update`, `delete`):\n\n    backend.read(function(req, res) {\n        if (req.model.id) {\n            req.end(mymodels[req.model.id]);\n        } else {\n            req.end(mymodels);\n        }\n    });\n    \nIf the bottom of the middleware stack is reached before a result is returned then the requested\nmodel is returned by default: `res.end(req.model)`.  Look in the `middleware` directory for more\nexamples.\n\nClients are automatically notified of events triggered by other clients, however, there may\nbe cases where other server-side code needs to make updates to a model outside of a backend\nhandler.  In such a case, one can notify clients by emitting events directly on the backend.\nFor example:\n\n    var backend = backboneio.createBackend();\n    backend.use(backboneio.middleware.memoryStore());\n    \n    // Clients will receive 'backend:create', 'backend:update',\n    // and 'backend:delete' events respectively.\n    backend.emit('created', { id: 'myid', foo: 'bar' });\n    backend.emit('updated', { id: 'myid', foo: 'baz' });\n    backend.emit('deleted', { id: 'myid' });\n\nChannels\n--------\n\nTo synchronize models between a subset of all clients sharing a single backend, you can\nspecify a channel.\n\n    var MyCollection = Backbone.Collection.extend({\n        \n        backend: { name: 'mybackend', channel: 'mychannel' }\n        \n    });\n\nOnly clients sharing the same channel will receive updates from each other.  The channel\nassociated with a given request is available from any middleware in `req.channel`.\n    \nCustomizing\n-----------\n\nIn addition to middleware, the behavior of Backbone.IO can be customized via standard Socket.IO\nmechanisms.  The object returned from the call to `listen` is the Socket.IO object and can be\nmanipulated further.  See http://socket.io for more details.\n\nTests\n-----\n\nInstall development dependencies:\n\n    npm install\n    \nRun the test suite:\n\n    make test","_id":"backbone.io@0.3.0","dist":{"shasum":"e495a89c94c17548b9acbed18264ca9a0cf7f33c","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.3.0.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}]},"0.3.1":{"name":"backbone.io","version":"0.3.1","description":"Backbone.js sync via Socket.IO","homepage":"http://github.com/scttnlsn/backbone.io","author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"main":"./lib/index","repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"dependencies":{"socket.io":">= 0.8.7"},"devDependencies":{"express":">= 2.5.0","mocha":">= 0.3.6","sinon":">= 1.2.0"},"readme":"Backbone.IO\n===========\n\nBackend-agnostic Backbone.js sync override and server notifications via Socket.IO.\n\nInstall\n-------\n\n    npm install backbone.io\n    \nUsage\n-----\n\nOn the server:\n\n    var http = require('http');\n    var backboneio = require('backbone.io');\n    \n    var app = http.createServer();    \n    app.listen(3000);\n\n    var backend = backboneio.createBackend();\n    backend.use(backboneio.middleware.memoryStore());\n    \n    backboneio.listen(app, { mybackend: backend });\n\nOn the client:\n\n    <!-- Include Underscore, Backbone -->\n    \n    <script src=\"/socket.io/socket.io.js\"></script>\n    <script src=\"/socket.io/backbone.io.js\"></script>\n    \n    <script>\n        Backbone.io.connect();\n\n        var MyCollection = Backbone.Collection.extend({\n            backend: 'mybackend'\n        });\n    </script>\n    \nModels in `MyCollection` will now be synced to `mybackend`.\n\nNote that as of 0.3.x, one must explicitly call `Backbone.io.connect`.  Any\noptional arguments will be passed to Socket.IO's `io.connect` function.\n\nEvents\n------\n\nWhen a model is synced with a particular backend, the backend will trigger events\non collections (across multiple clients) that share the backend.  For example, we\ncould keep collections synced in realtime with the following event bindings:\n\n    var MyCollection = Backbone.Collection.extend({\n        \n        backend: 'mybackend',\n        \n        initialize: function() {\n            var self = this;\n        \n            this.bind('backend:create', function(model) {\n                self.add(model);\n            });\n            this.bind('backend:update', function(model) {\n                self.get(model.id).set(model);\n            });\n            this.bind('backend:delete', function(model) {\n                self.remove(model.id);\n            });\n        }\n        \n    });\n    \nOr use the provided shortcut:\n    \n    backend: 'mybackend',\n    \n    initialize: function() {\n        this.bindBackend();\n    }\n    \nIn addition to `backend:create`, `backend:read`, `backend:update`, and `backend:delete`\nevents, a generic `backend` event is also triggered when a model is synced.\n\n    this.bind('backend', function(method, model) {\n        // Method will be one of create, read, update, or delete\n    });\n    \nThe event prefix `backend` is used by default but this can be customized by setting the\nevent name on the server.\n\n    backboneio.listen(app, { mybackend: backend }, { event: 'myevent' });\n\nBackends and Middleware\n-----------------------\n\nBackends are stacks of composable middleware (inspired by Connect) that are responsible\nfor handling sync requests and responding appropriately.  Each middleware is a function\nthat accepts request and response objects (and optionally a function that can be called\nto continue down the stack).  A middleware will generally either return a result by\ncalling `end` on the response object or pass control downward.  For example, let's add a\nlogger middleware to our backend:\n\n    var backend = backboneio.createBackend();\n    \n    backend.use(function(req, res, next) {\n        console.log(req.backend);\n        console.log(req.method);\n        console.log(JSON.stringify(req.model));\n        next();\n    });\n    \n    backend.use(backboneio.middleware.memoryStore());\n    \nA request object will contain the following components (in addition to those set by\nvarious middleware):\n\n* `method`: the sync method (`create`, `read`, `update`, or `delete`)\n* `model`: the model object to by synced\n* `options`: any options set by the client (except success and error callbacks)\n* `backend`: name of the backend responsible for handling the request\n* `socket`: the client socket that initiated the request\n    \nMiddleware can also be applied to only particular types of requests by passing the desired\ncontexts to `use`:\n\n    backend.use('create', 'update', 'delete', function(req, res, next) {\n        if (isAuthorized(req)) {\n            next();\n        } else {\n            next(new Error('Unauthorized'));\n        }\n    });\n    \nOr alternatively by using one of the four helper methods (`create`, `read`, `update`, `delete`):\n\n    backend.read(function(req, res) {\n        if (req.model.id) {\n            req.end(mymodels[req.model.id]);\n        } else {\n            req.end(mymodels);\n        }\n    });\n    \nIf the bottom of the middleware stack is reached before a result is returned then the requested\nmodel is returned by default: `res.end(req.model)`.  Look in the `middleware` directory for more\nexamples.\n\nClients are automatically notified of events triggered by other clients, however, there may\nbe cases where other server-side code needs to make updates to a model outside of a backend\nhandler.  In such a case, one can notify clients by emitting events directly on the backend.\nFor example:\n\n    var backend = backboneio.createBackend();\n    backend.use(backboneio.middleware.memoryStore());\n    \n    // Clients will receive 'backend:create', 'backend:update',\n    // and 'backend:delete' events respectively.\n    backend.emit('created', { id: 'myid', foo: 'bar' });\n    backend.emit('updated', { id: 'myid', foo: 'baz' });\n    backend.emit('deleted', { id: 'myid' });\n\nChannels\n--------\n\nTo synchronize models between a subset of all clients sharing a single backend, you can\nspecify a channel.\n\n    var MyCollection = Backbone.Collection.extend({\n        \n        backend: { name: 'mybackend', channel: 'mychannel' }\n        \n    });\n\nOnly clients sharing the same channel will receive updates from each other.  The channel\nassociated with a given request is available from any middleware in `req.channel`.\n    \nCustomizing\n-----------\n\nIn addition to middleware, the behavior of Backbone.IO can be customized via standard Socket.IO\nmechanisms.  The object returned from the call to `listen` is the Socket.IO object and can be\nmanipulated further.  See http://socket.io for more details.\n\nTests\n-----\n\nInstall development dependencies:\n\n    npm install\n    \nRun the test suite:\n\n    make test","_id":"backbone.io@0.3.1","dist":{"shasum":"b7f43cb00a8dec0fd84022a7d9b6678c1839d0bc","tarball":"http://registry.npmjs.org/backbone.io/-/backbone.io-0.3.1.tgz"},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}]}},"maintainers":[{"name":"scttnlsn","email":"scottbnel@gmail.com"}],"time":{"modified":"2012-08-02T13:43:56.683Z","created":"2011-11-11T21:31:11.629Z","0.1.0":"2011-11-11T21:31:12.366Z","0.1.1":"2011-11-16T05:08:39.840Z","0.1.2":"2011-11-16T18:16:20.963Z","0.1.3":"2011-11-23T15:16:01.326Z","0.2.0":"2011-12-04T00:24:04.997Z","0.2.1":"2011-12-07T18:54:36.023Z","0.2.2":"2011-12-07T21:12:37.452Z","0.2.3":"2012-01-23T19:06:55.477Z","0.2.4":"2012-02-22T15:13:59.476Z","0.2.5":"2012-03-22T12:59:22.304Z","0.2.6":"2012-04-09T21:02:04.842Z","0.2.7":"2012-04-10T04:09:58.532Z","0.3.0":"2012-07-29T14:09:30.548Z","0.3.1":"2012-07-30T00:44:55.608Z"},"author":{"name":"Scott Nelson","email":"scottbnel@gmail.com"},"repository":{"type":"git","url":"git://github.com/scttnlsn/backbone.io.git"},"users":{"fgribreau":true},"_attachments":{"backbone.io-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-0UkHy1bB1WAidThu01IOYg==","length":9709,"stub":true},"backbone.io-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-iEEMTsxvAXaX+zq1tI8mVg==","length":9715,"stub":true},"backbone.io-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-5yZYXj6c8+BnHf/+bd/fpw==","length":10240,"stub":true},"backbone.io-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-jvtEAZMx73wcJehOKsgFZA==","length":10240,"stub":true},"backbone.io-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-MhqA4atWtCwKKhFu/Mqdpw==","length":10240,"stub":true},"backbone.io-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-zBYzQYI/XYsZ597nrZ/xtA==","length":10240,"stub":true},"backbone.io-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-OOu4mu2mVwWXzKS/077GpA==","length":10240,"stub":true},"backbone.io-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-UI2qBFN3tSko9orTybQbWA==","length":10240,"stub":true},"backbone.io-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-U2Gm8pO16/EiSLBDThj1Zw==","length":10240,"stub":true},"backbone.io-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-iYOYMtVbRxpVYSj8zhYMkQ==","length":10240,"stub":true},"backbone.io-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-CAT7tSCSpdJvyYZwAFWMHw==","length":10240,"stub":true},"backbone.io-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tPJotUzHYHY/I328j3bsrQ==","length":10240,"stub":true},"backbone.io-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wcyriWYTCnbJSYfTnX24ig==","length":10240,"stub":true},"backbone.io-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vL/JPRP5SEb3m7pyY2UPbA==","length":10240,"stub":true}}}},
{"id":"backbone.iobind","key":"backbone.iobind","value":{"rev":"11-ce6f413e1f4d2d1503ef096076c3d8f3"},"doc":{"_id":"backbone.iobind","_rev":"11-ce6f413e1f4d2d1503ef096076c3d8f3","name":"backbone.iobind","description":"Bind socket.io events to backbone models & collections.","dist-tags":{"latest":"0.4.3"},"versions":{"0.3.0":{"author":{"name":"Jake Luer","email":"@jakeluer"},"name":"backbone.iobind","description":"Bind socket.io events to backbone models & collections.","version":"0.3.0","homepage":"http://logicalparadox.github.com/backbone.iobind","repository":{"type":"git","url":"git://github.com/logicalparadox/backbone.iobind.git"},"engines":{"node":"~v0.4.12"},"dependencies":{},"devDependencies":{"folio":"0.1.x","seed":"0.0.10","colors":"0.5.x","express":"2.5.x","socket.io":"0.8.x","jade":"0.16.x","stylus":"0.19.0","nib":"0.2.x","fez":"0.0.x","jq":"1.6.x","backbone":"0.5.x","underscore":"1.2.x"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"backbone.iobind@0.3.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bf620394a00aefb06c0fe686b3adfbfd1c1cc5c8","tarball":"http://registry.npmjs.org/backbone.iobind/-/backbone.iobind-0.3.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.4.0":{"author":{"name":"Jake Luer","email":"@jakeluer"},"name":"backbone.iobind","description":"Bind socket.io events to backbone models & collections.","version":"0.4.0","homepage":"http://logicalparadox.github.com/backbone.iobind","repository":{"type":"git","url":"git://github.com/logicalparadox/backbone.iobind.git"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"folio":"0.1.x","seed":"0.0.10","colors":"0.5.x","express":"2.5.x","socket.io":"0.8.x","jade":"0.16.x","stylus":"0.19.0","nib":"0.2.x","fez":"0.0.x","jq":"1.6.x","backbone":"0.5.x","underscore":"1.2.x"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"backbone.iobind@0.4.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"fd1553ff41a0988de9d1f2125a6d52a334ec23d5","tarball":"http://registry.npmjs.org/backbone.iobind/-/backbone.iobind-0.4.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.4.1":{"author":{"name":"Jake Luer","email":"@jakeluer"},"name":"backbone.iobind","description":"Bind socket.io events to backbone models & collections.","version":"0.4.1","homepage":"http://logicalparadox.github.com/backbone.iobind","repository":{"type":"git","url":"git://github.com/logicalparadox/backbone.iobind.git"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"codex":"0.0.x","folio":"0.1.x","seed":"0.0.10","colors":"0.5.x","express":"2.5.x","socket.io":"0.8.x","jade":"0.16.x","stylus":"0.19.0","nib":"0.2.x","fez":"0.0.x","jq":"1.6.x","backbone":"0.5.x","underscore":"1.2.x"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"backbone.iobind@0.4.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"725b10748e131fc16cc6aac0a16180819185a958","tarball":"http://registry.npmjs.org/backbone.iobind/-/backbone.iobind-0.4.1.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.4.2":{"author":{"name":"Jake Luer","email":"@jakeluer"},"name":"backbone.iobind","description":"Bind socket.io events to backbone models & collections.","version":"0.4.2","homepage":"http://logicalparadox.github.com/backbone.iobind","repository":{"type":"git","url":"git://github.com/logicalparadox/backbone.iobind.git"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"codex":"0.0.x","folio":"0.1.x","seed":"0.1.x","colors":"0.6.x","express":"2.5.x","socket.io":"0.8.x","jade":"0.19.x","stylus":"0.20.0","nib":"0.3.x","fez":"0.0.x","backbone":"0.5.x","underscore":"1.2.x"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"backbone.iobind@0.4.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b99124310c8a970edaf42c46e1d9c46dd047b0b3","tarball":"http://registry.npmjs.org/backbone.iobind/-/backbone.iobind-0.4.2.tgz"},"readme":"# Backbone.ioBind\n\nBackbone.ioBind allows you to bind socket.io events to backbone model & collection events.\nAlso includes `backbone.iosync.js`, a drop in replacement for `Backbone.sync` that uses socket.io.\n\nYour best best for starting is to check out the [API Documentation](http://alogicalparadox.com/backbone.iobind/).\n\n#### Quick Links\n\n* [Example App Installation](http://alogicalparadox.com/backbone.iobind/index.html#exampleapp)\n* [Google Group](https://groups.google.com/group/backboneiobind)\n* [Changelog](https://github.com/logicalparadox/backbone.iobind/blob/master/History.md)\n\n#### Dependancies\n\n* [Socket.io](http://socket.io/) 0.7.x || 0.8.x\n* [Backbone](http://documentcloud.github.com/backbone/) 0.5.x\n\n### Usage\n\nDownload and include in your projects.\n\n```html\n<script src=\"/js/backbone.iosync.js\"></script>\n<script src=\"/js/backbone.iobind.js\"></script>\n```\n\nOr use the minimized versions.\n\n```html\n<script src=\"/js/backbone.iosync.min.js\"></script>\n<script src=\"/js/backbone.iobind.min.js\"></script>\n```\n\n### Where to Get Help\n\nPlease post issues to [GitHub Issues](https://github.com/logicalparadox/backbone.iobind/issues).\nCommunity forum is available at the [Google Group](https://groups.google.com/group/backboneiobind).\n\n## Using the Backbone.sync Replacement for Socket.io\n\nThe Backbone.sync replacement, `backbone.iosync.js`, is a drop-in replacement for Backbone.sync that\nwill make Backbone use socket.io for all normal CRUD operations. By this, anytime you `save` a model,\n`fetch` a collection, `remove` a model, or other database operation, socket.io will be used as the\ntransport.\n\n### Namespaces / Urls\n\nBackbone has a dedicated attribute, `urlRoot` for models, and `url` for collections, that is used\nby the default sync method to direct AJAX request. ioSync uses this same attribute to create a\nnamespace tag for that model.\n\n*For Example:* If your collection url is 'posts' or '/posts', the events to listen for server-side will be:\n\n* `posts:create`\n* `posts:read`\n* `posts:update`\n* `posts:delete`\n\nAs with the default sync method, for a given model, ioSync will default to the `url` of the collection\nthat model is a part of, else it will use the models `urlRoot`.\n\nIf your url has a depth of more than one, only the first will be used. Example: `/posts/comments` will still only have a namespace of `posts`.*\n\n### RPC / Callbacks\n\nThis replacement assumes that you are using socket.io's RPC (callback) formula for these events.\nExamine this psuedo-code:\n\n```js\nsocket.on('posts:read', function (data, callback) {\n  db.query({_id: data.id}, function (err, model) {\n    if (err) {\n      callback(err);\n    } else {\n      // ... some data scrubbing\n      callback(null, model);\n    }\n  });\n});\n```\n\nThe callback accepts two parameters: `error` and `model`. If no error has occurred, send `null` for `error`.\n\nThe `model` should be a JSON representation of the client-side model's attributes.\n\n## Using Backbone.ioBind for Custom Events\n\nThe primary function for Backbone.ioBind is to make it easy to create client-side listeners\nfor server-side socket.io events. The most likely use case for this is to broadcast changes\nmade by one client to all other clients watching a particular data object.\n\nThe example app demonstrates a very basic usage scenario. If you would like to see specific code\nexamples, please check out the\n[wiki page on using the example app](http://alogicalparadox.com/backbone.iobind/index.html#exampleapp).\n\n### ioBind\n\nThe ioBind function is available for both Models and Collections, and behaves almost identically in both scenarios\n\n```js\n// Example Model.extend\nurlRoot: 'todo',\ninitialize: function () {\n  _.bindAll(this, 'serverChange', 'serverDelete', 'modelCleanup');\n  this.ioBind('update', window.socket, this.serverChange, this);\n  this.ioBind('delete', window.socket, this.serverDelete, this);\n}\n\n// Example Collection.exend\nurl: 'todos',\ninitialize: function () {\n  _.bindAll(this, 'serverCreate', 'collectionCleanup');\n  this.ioBind('create', window.socket, this.serverCreate, this);\n}\n```\n\nThe primary difference between `ioBind` on Models and Collection is the event string that is listened for.\nOn models, the event string includes the Model `id`, whereas on collection it is simply the collection namespace.\n\nThe above example will respond to the following socket.io events.\n\n```js\n// Model events\nsocket.emit('todo/' + todo_obj.id + ':update', todo_obj);\nsocket.emit('todo/' + todo_obj.id + ':delete', todo_obj);\n\n// Collection events\nsocket.emit('todos:create', todo_obj);\n```\n\n### Usage Guidelines\n\n*Model binding without ID:* Do NOT bind to Models that do NOT have an `id` assigned. This will cause for extra listeners\nand cause potentially large memory leak problems. See the example app for one possible workaround.\n\n*Namespace construction:* When constructing the namespace, as with the the ioSync method, for a given model ioBind\nwill default to the `url` of the collectionthat model is a part of, else it will use the models `urlRoot`.\n\n*Reserved events:* Do NOT bind to reserved backbone events, such as `change`, `remove`, and `add`. Proxy these\nevents using different event tags such as `update`, `delete`, and `create`.\n\n## Building\n\nClone this repo:\n\n`$ git clone https://github.com/logicalparadox/backbone.iobind`\n\nInstall development/build dependancies (Ie: [folio](https://github.com/logicalparadox/folio)).:\n\n`$ npm install`\n\nRun make\n\n`$ make`\n\n#### Example Tasks Application\n\nThere is an example application demonstrating the basics of using the\n`ioSync` and `ioBind` components. It is a tasks application that will keep itself syncronized across all open\nbrowser instances. The foundation is an [Express](https://github.com/visionmedia/express)\nserver using [Seed](https://github.com/logicalparadox/seed) as an in-memory data store.\n\nThe app is found in the `example` folder.\nView the [Documentation Article](http://alogicalparadox.com/backbone.iobind/index.html#exampleapp)\non the example app for instructions on how to get everything set up.\n\nIn short, run `node example/app.js` from the root directory.\n\n## Protip\n\nWorks great with the awesome [backbone.modelbinding](https://github.com/derickbailey/backbone.modelbinding).\n\n## Contributors\n\nInterested in contributing? Fork to get started. Contact [@logicalparadox](http://github.com/logicalparadox) if you are interested in being regular contributor.\n\n* Jake Luer [[Github: @logicalparadox](http://github.com/logicalparadox)] [[Twitter: @jakeluer](http://twitter.com/jakeluer)] [[Website](http://alogicalparadox.com)]\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Jake Luer <jake@alogicalparadox.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.4.3":{"author":{"name":"Jake Luer","email":"@jakeluer"},"name":"backbone.iobind","description":"Bind socket.io events to backbone models & collections.","version":"0.4.3","homepage":"http://logicalparadox.github.com/backbone.iobind","repository":{"type":"git","url":"git://github.com/logicalparadox/backbone.iobind.git"},"engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{"codex":"0.0.x","folio":"0.2.x","seed":"0.1.x","colors":"0.6.x","express":"2.5.x","socket.io":"0.8.x","jade":"0.20.x","stylus":"0.22.x","nib":"0.3.x","fez":"0.0.x","backbone":"0.5.x","underscore":"1.2.x"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"backbone.iobind@0.4.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"f935555fd5ae0fb4e3643871e4ca00b74caf570c","tarball":"http://registry.npmjs.org/backbone.iobind/-/backbone.iobind-0.4.3.tgz"},"readme":"# Backbone.ioBind\n\nBackbone.ioBind allows you to bind socket.io events to backbone model & collection events.\nAlso includes `backbone.iosync.js`, a drop in replacement for `Backbone.sync` that uses socket.io.\n\nYour best best for starting is to check out the [API Documentation](http://alogicalparadox.com/backbone.iobind/).\n\n#### Quick Links\n\n* [Example App Installation](http://alogicalparadox.com/backbone.iobind/index.html#exampleapp)\n* [Google Group](https://groups.google.com/group/backboneiobind)\n* [Changelog](https://github.com/logicalparadox/backbone.iobind/blob/master/History.md)\n\n#### Dependancies\n\n* [Socket.io](http://socket.io/) 0.7.x || 0.8.x\n* [Backbone](http://documentcloud.github.com/backbone/) 0.5.x\n\n### Usage\n\nDownload and include in your projects.\n\n```html\n<script src=\"/js/backbone.iosync.js\"></script>\n<script src=\"/js/backbone.iobind.js\"></script>\n```\n\nOr use the minimized versions.\n\n```html\n<script src=\"/js/backbone.iosync.min.js\"></script>\n<script src=\"/js/backbone.iobind.min.js\"></script>\n```\n\n### Where to Get Help\n\nPlease post issues to [GitHub Issues](https://github.com/logicalparadox/backbone.iobind/issues).\nCommunity forum is available at the [Google Group](https://groups.google.com/group/backboneiobind).\n\n## Using the Backbone.sync Replacement for Socket.io\n\nThe Backbone.sync replacement, `backbone.iosync.js`, is a drop-in replacement for Backbone.sync that\nwill make Backbone use socket.io for all normal CRUD operations. By this, anytime you `save` a model,\n`fetch` a collection, `remove` a model, or other database operation, socket.io will be used as the\ntransport.\n\n### Namespaces / Urls\n\nBackbone has a dedicated attribute, `urlRoot` for models, and `url` for collections, that is used\nby the default sync method to direct AJAX request. ioSync uses this same attribute to create a\nnamespace tag for that model.\n\n*For Example:* If your collection url is 'posts' or '/posts', the events to listen for server-side will be:\n\n* `posts:create`\n* `posts:read`\n* `posts:update`\n* `posts:delete`\n\nAs with the default sync method, for a given model, ioSync will default to the `url` of the collection\nthat model is a part of, else it will use the models `urlRoot`.\n\nIf your url has a depth of more than one, only the first will be used. Example: `/posts/comments` will still only have a namespace of `posts`.*\n\n### RPC / Callbacks\n\nThis replacement assumes that you are using socket.io's RPC (callback) formula for these events.\nExamine this psuedo-code:\n\n```js\nsocket.on('posts:read', function (data, callback) {\n  db.query({_id: data.id}, function (err, model) {\n    if (err) {\n      callback(err);\n    } else {\n      // ... some data scrubbing\n      callback(null, model);\n    }\n  });\n});\n```\n\nThe callback accepts two parameters: `error` and `model`. If no error has occurred, send `null` for `error`.\n\nThe `model` should be a JSON representation of the client-side model's attributes.\n\n## Using Backbone.ioBind for Custom Events\n\nThe primary function for Backbone.ioBind is to make it easy to create client-side listeners\nfor server-side socket.io events. The most likely use case for this is to broadcast changes\nmade by one client to all other clients watching a particular data object.\n\nThe example app demonstrates a very basic usage scenario. If you would like to see specific code\nexamples, please check out the\n[wiki page on using the example app](http://alogicalparadox.com/backbone.iobind/index.html#exampleapp).\n\n### ioBind\n\nThe ioBind function is available for both Models and Collections, and behaves almost identically in both scenarios\n\n```js\n// Example Model.extend\nurlRoot: 'todo',\ninitialize: function () {\n  _.bindAll(this, 'serverChange', 'serverDelete', 'modelCleanup');\n  this.ioBind('update', window.socket, this.serverChange, this);\n  this.ioBind('delete', window.socket, this.serverDelete, this);\n}\n\n// Example Collection.exend\nurl: 'todos',\ninitialize: function () {\n  _.bindAll(this, 'serverCreate', 'collectionCleanup');\n  this.ioBind('create', window.socket, this.serverCreate, this);\n}\n```\n\nThe primary difference between `ioBind` on Models and Collection is the event string that is listened for.\nOn models, the event string includes the Model `id`, whereas on collection it is simply the collection namespace.\n\nThe above example will respond to the following socket.io events.\n\n```js\n// Model events\nsocket.emit('todo/' + todo_obj.id + ':update', todo_obj);\nsocket.emit('todo/' + todo_obj.id + ':delete', todo_obj);\n\n// Collection events\nsocket.emit('todos:create', todo_obj);\n```\n\n### Usage Guidelines\n\n*Model binding without ID:* Do NOT bind to Models that do NOT have an `id` assigned. This will cause for extra listeners\nand cause potentially large memory leak problems. See the example app for one possible workaround.\n\n*Namespace construction:* When constructing the namespace, as with the the ioSync method, for a given model ioBind\nwill default to the `url` of the collectionthat model is a part of, else it will use the models `urlRoot`.\n\n*Reserved events:* Do NOT bind to reserved backbone events, such as `change`, `remove`, and `add`. Proxy these\nevents using different event tags such as `update`, `delete`, and `create`.\n\n## Building\n\nClone this repo:\n\n`$ git clone https://github.com/logicalparadox/backbone.iobind`\n\nInstall development/build dependancies (Ie: [folio](https://github.com/logicalparadox/folio)).:\n\n`$ npm install`\n\nRun make\n\n`$ make`\n\n#### Example Tasks Application\n\nThere is an example application demonstrating the basics of using the\n`ioSync` and `ioBind` components. It is a tasks application that will keep itself syncronized across all open\nbrowser instances. The foundation is an [Express](https://github.com/visionmedia/express)\nserver using [Seed](https://github.com/logicalparadox/seed) as an in-memory data store.\n\nThe app is found in the `example` folder.\nView the [Documentation Article](http://alogicalparadox.com/backbone.iobind/index.html#exampleapp)\non the example app for instructions on how to get everything set up.\n\nIn short, run `node example/app.js` from the root directory.\n\n## Protip\n\nWorks great with the awesome [backbone.modelbinding](https://github.com/derickbailey/backbone.modelbinding).\n\n## Contributors\n\nInterested in contributing? Fork to get started. Contact [@logicalparadox](http://github.com/logicalparadox) if you are interested in being regular contributor.\n\n* Jake Luer [[Github: @logicalparadox](http://github.com/logicalparadox)] [[Twitter: @jakeluer](http://twitter.com/jakeluer)] [[Website](http://alogicalparadox.com)]\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Jake Luer <jake@alogicalparadox.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]}},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}],"time":{"modified":"2012-01-26T04:15:36.503Z","created":"2011-11-02T17:44:15.125Z","0.3.0":"2011-11-02T17:44:15.754Z","0.4.0":"2011-11-28T21:18:55.074Z","0.4.1":"2011-12-09T04:28:33.209Z","0.4.2":"2011-12-31T18:39:57.398Z","0.4.3":"2012-01-26T04:15:36.503Z"},"author":{"name":"Jake Luer","email":"@jakeluer"},"repository":{"type":"git","url":"git://github.com/logicalparadox/backbone.iobind.git"},"_attachments":{"backbone.iobind-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hp/Wpve+vVVqJ5HsdtFXUQ==","length":8549,"stub":true},"backbone.iobind-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Xxd+Rm2erR/p5uGYoitAlg==","length":9844,"stub":true},"backbone.iobind-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-eMtuW09rzGH5Oa/Z2TVYkw==","length":9834,"stub":true},"backbone.iobind-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vsJQeUBMXrSm3kBOGTclUA==","length":17015,"stub":true},"backbone.iobind-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ROBGdHRXP90IYtE7umRdXQ==","length":20480,"stub":true}}}},
{"id":"backbone.layoutmanager","key":"backbone.layoutmanager","value":{"rev":"9-d02576081faad560af94e779e928419d"},"doc":{"_id":"backbone.layoutmanager","_rev":"9-d02576081faad560af94e779e928419d","name":"backbone.layoutmanager","description":"A manager for templates & layouts in Backbone.js","dist-tags":{"latest":"0.6.2"},"versions":{"0.0.0":{"author":{"name":"Tim Branyen","url":"@tbranyen"},"name":"backbone.layoutmanager","description":"A manager for templates & layouts in Backbone.js","version":"0.0.0","homepage":"http://tbranyen.github.com/backbone.layoutmanager/","repository":{"type":"git","url":"git://github.com/tbranyen/backbone.layoutmanager.git"},"main":"node/index","engines":{"node":">=0.6"},"dependencies":{"backbone":"0.9.2","underscore.deferred":"0.1.4","cheerio":"0.8.3"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"backbone.layoutmanager@0.0.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"daff3d382b007f22b6155be68af536ae28c4f767","tarball":"http://registry.npmjs.org/backbone.layoutmanager/-/backbone.layoutmanager-0.0.0.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.6.0":{"author":{"name":"Tim Branyen","url":"@tbranyen"},"name":"backbone.layoutmanager","description":"A manager for templates & layouts in Backbone.js","version":"0.6.0","homepage":"http://tbranyen.github.com/backbone.layoutmanager/","repository":{"type":"git","url":"git://github.com/tbranyen/backbone.layoutmanager.git"},"main":"node/index","engines":{"node":">=0.6"},"dependencies":{"backbone":"0.9.2","underscore.deferred":"0.1.4","cheerio":"0.8.3"},"devDependencies":{},"optionalDependencies":{},"_id":"backbone.layoutmanager@0.6.0","dist":{"shasum":"b604fb80c3a61afbba39149f01ade95bd8e783e1","tarball":"http://registry.npmjs.org/backbone.layoutmanager/-/backbone.layoutmanager-0.6.0.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.6.1":{"author":{"name":"Tim Branyen","url":"@tbranyen"},"name":"backbone.layoutmanager","description":"A manager for templates & layouts in Backbone.js","version":"0.6.1","homepage":"http://tbranyen.github.com/backbone.layoutmanager/","repository":{"type":"git","url":"git://github.com/tbranyen/backbone.layoutmanager.git"},"main":"node/index","engines":{"node":">=0.6"},"dependencies":{"backbone":"0.9.2","underscore.deferred":"0.1.5","cheerio":"0.9.1"},"readme":"backbone.layoutmanager v0.6.1\n=============================\n\nCreated by Tim Branyen [@tbranyen](http://twitter.com/tbranyen) with\n[contributions](https://github.com/tbranyen/backbone.layoutmanager/contributors)\n\nProvides a logical structure for assembling layouts with Backbone Views.\nDesigned to be adaptive and configurable for painless integration.\n\nDepends on Underscore, Backbone and jQuery.  You can swap out the dependencies\ncompletely with a custom configuration.\n\n## Tutorials, Screencasts, & Examples ##\n\n* [Initial Screencast](http://vimeo.com/32765088)\n* [Node.js Support Screencast](https://vimeo.com/46033641)\n* Example Application: [GitHub Viewer](http://githubviewer.org) &\n  [Source](http://github.com/tbranyen/github-viewer)\n* [Integrating with Backbone Boilerplate with Handlebars](https://github.com/tbranyen/boilerplate-handlebars-layoutmanager)\n\n## Download & Include ##\n\nDevelopment is fully commented source, Production is minified and stripped of\nall comments except for license/credits.\n\n* [Development](https://raw.github.com/tbranyen/backbone.layoutmanager/master/backbone.layoutmanager.js)\n* [Production](https://raw.github.com/tbranyen/backbone.layoutmanager/master/dist/backbone.layoutmanager.min.js)\n\nInclude in your application *after* jQuery, Underscore, and Backbone have been\nincluded.\n\n``` html\n<script src=\"/js/jquery.js\"></script>\n<script src=\"/js/underscore.js\"></script>\n<script src=\"/js/backbone.js\"></script>\n\n<script src=\"/js/backbone.layoutmanager.js\"></script>\n```\n\n### Using with Node.js ###\n\nYep, thats right... LayoutManager is 100% compatible with Node.js projects and\nis available as a module in NPM.\n\nTo install, simply:\n\n``` javascript\n[sudo] npm install backbone.layoutmanager\n```\n\nThen you can easily require it into your application.\n\n``` javascript\nvar Backbone = require(\"backbone\");\nvar LayoutManager = require(\"backbone.layoutmanager\");\n```\n\nBackbone will be augmented with the proper methods exactly like in the browser.\n\n### Using with AMD ###\n\nIf you are using RequireJS you can include using the shim configuration.\n\n``` javascript\nrequire.config({\n  shim: {\n    // Include layoutmanager and ensure Backbone is a loaded dependency.\n    \"backbone.layoutmanager\": [\"backbone\"]\n  }\n});\n```\n\nIf you are using a different AMD loader, perhaps the\n[use.js](https://github.com/tbranyen/use.js) plugin will work for you.\n\n## Usage ##\n\nThis example renders a View into a template which is injected into a layout.\n\n### Defining the layout and template ###\n\nThese example templates are defined using a common pattern which leverages how\nbrowsers ignore `<script></script>` contents when using a custom `type`\nattribute.\n\n*Note: This is how LayoutManager expects templates to be defined by default\n(using script tags).*\n\n#### Main Layout ####\n\n``` plain\n<script id=\"main-layout\" type=\"layout\">\n  <section class=\"content\"></section>\n\n  <!-- Login template below will be injected here -->\n  <aside class=\"secondary\"></aside>\n</script>\n```\n\n#### Login Template ####\n\n``` plain\n<script id=\"login-template\" type=\"template\">\n  <form class=\"login\">\n    <p><label for=\"user\">Username</label><input type=\"text\" name=\"user\"></p>\n    <p><label for=\"pass\">Password</label><input type=\"text\" name=\"pass\"></p>\n    <p><input class=\"loginBtn\" type=\"submit\" value=\"Login\"></p>\n  </form>\n</script>\n```\n\n### Structuring a View ###\n\nEach View can associate a template via the `template` property.  This name by\ndefault is a jQuery selector, but if you have a custom configuration this could\npotentially be a filename or JST function name.\n\n*Note: If you do not specify a template LayoutManager will assume the View's\nrender method knows what it's doing and won't attempt to fetch/render anything\nfor you.*\n\n``` javascript\nvar LoginView = Backbone.LayoutView.extend({\n  template: \"#login-template\"\n});\n```\n\nIf you would prefer to use `Backbone.View` as your construct, you can simply\nadd the `manage: true` assignment to your View:\n\n``` javascript\nvar LoginView = Backbone.View.extend({\n  manage: true\n});\n```\n\nAlternatively, you can globally configure this (Recommended):\n\n``` javascript\nBackbone.LayoutManager.configure({\n  manage: true\n});\n```\n\n*Note: The `manage` property has been designed to make it possible to mix\nbetween LayoutManager specific and non-specific Views.*\n\n### Create and render a layout ###\n\nEach Layout can associate a template via the `template` property.  This\nname by default is a jQuery selector, but if you have a custom configuration\nthis could potentially be a filename or JST function name.\n\nThis code typically resides in a route callback.\n\n``` javascript\nvar main = new Backbone.Layout({\n  template: \"#main-layout\",\n\n  // In the secondary column, put a new Login View.\n  views: {\n    \".secondary\": new LoginView()\n  }\n});\n\n// Attach the Layout to the <body></body>.\n$(\"body\").empty().append(main.el);\n\n// Render the Layout.\nmain.render();\n```\n\n### Adding a layout to the DOM ###\n\nTo add a layout into the page, simply inject it into a container at the time of\ncreation.  Do **not** call `empty().append()` more than once for a layout\nelement, unless you detach it first.  This is not recommended as it may cause a\nflicker during re-rendering.  It's cleaner and more efficient to only create a\nlayout when you need it and insert into the DOM at that time.\n\n``` javascript\n// Create the Layout.\nvar main = new Backbone.Layout(...);\n\n// Attach Layout to the DOM.\n$(\".some-selector\").empty().append(main.el);\n\n// Optional: (Not recommeded) Detach first if you cache the layout\n// main.$el.detach();\n\n// Render the Layout.\nmain.render();\n```\n\nViews may also be alternatively declared outside the Layout initialization:\n\n#### Using the setView function ####\n\nUse the following function to change out views at a later time.  Remember to\ncall the View's `render` method after swapping out to have it displayed.  The\n`setView` return value is the view, so chaining a `render` is super simple.\n\n``` javascript\nmain.setView(\".header\", new HeaderView());\nmain.setView(\".footer\", new FooterView());\n\n// Chain a render method\nmain.setView(\".header\", new HeaderView2()).render();\n```\n\n*Note: `setView` and `setViews` methods are available on all views.  This\nallows for nested Views, explained below.*\n\n*Note: The first argument *selector* can be omitted completely if you would\nlike the nested View to exist directly on the element.  This works well when\nyour parent View is something like a `UL` and your nested View is an `LI`.*\n\n*Note: The third argument is optional, but when set to `true` it will\nautomatically append the View into the container instead of replacing the\ncontent.*\n\n#### Using the setViews function ####\n\nThis is identical to how views are being assigned in the Layout example.  It\ncan be used in the following way:\n\n\n``` javascript\nvar main = new Backbone.Layout({\n  template: \"#some-layout\"\n});\n\n// Set the views outside of the layout\nmain.setViews({\n  \".partial\": new PartialView()\n});\n```\n\n### Nested Views ###\n\nYou may have a situation where a View is defined that encapsulates other nested\nViews.  In these cases you should use nested views inside your LayoutManager\nView assignments.\n\nCheck out this example to see how easy this is:\n\n``` javascript\nvar main = new Backbone.Layout({\n  template: \"#some-layout\",\n\n  views: {\n    \".partial\": new PartialView({\n      views: {\n        \".inner\": new InnerView()\n      }\n    })\n  }\n});\n```\n\n*Note: You can nest Views infinitely.*\n\n#### Re-rendering Views ####\n\nInstead of re-rendering the entire layout after data in a single View changes,\nyou can simply call `render()` on the View and it will automatically update\nthe DOM.\n\n*This syntax is completely valid*\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  initialize: function() {\n    this.model.on(\"change\", this.render, this);\n  }\n});\n```\n\n*As well as this syntax*\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  initialize: function() {\n    this.model.on(\"change\", function() {\n      this.render();\n    }, this);\n  }\n});\n```\n\n*Note: Do not forget to add event cleanup code whenever you bind events inside\nyour Views.  There are examples of cleanup below.*\n\n### Rendering repeating views ###\n\nThere are many times in which you will end up with a list of nested views\nthat result from either iterating a `Backbone.Collection` or `Array`\nand will need to dynamically add these nested views into a main view.\n\nLayoutManager solves this by exposing a method to change the insert mode\nfrom replacing the `innerHTML` to `appendChild` instead.  Whenever you\nuse the `insertView` method you will put the nested view into this special\nmode.\n\nSub views are always inserted in order, regardless if the `fetch` method has\nbeen overwritten to be asynchronous.\n\nAn example will illustrate the pattern easier:\n\n#### Item Template ####\n\nThis item template doesn't need to do much since it will be automatically\nwrapped in an `<li></li>` by the View. \n\n``` plain\n<script id=\"#item\" type=\"template\">\n  <%= name %>\n</script>\n```\n\n#### Item View ####\n\n``` javascript\n// You may find it easier to have Backbone render the LI/TD/etc element\n// instead of including this in your template.  This is purely convention\n// use what works for you.\nvar ItemView = Backbone.View.extend({\n  template: \"#item\",\n\n  // In this case we'll say the item is an <LI>\n  tagName: \"li\"\n});\n```\n\n#### List View ####\n\nThe list View simply needs to provide an outlet for the above `<li>` to be\nappended into.\n\n``` javascript\n// You will need to override the `render` function with custom functionality.  \nvar ListView = Backbone.View.extend({\n  tagName: \"ul\"\n\n  // Insert all subViews prior to rendering the View.\n  beforeRender: function() {\n    // Iterate over the passed collection and create a view for each item.\n    this.collection.each(function(model) {\n      // Pass the sample data to the new SomeItem View.\n      this.insertView(new ItemView({\n        serialize: { name: \"Just testing!\" }\n      }));\n    }, this);\n  }\n});\n```\n\n### How does this not duplicate Views? ###\n\nInternally LayoutManager will remove all View's marked as in *append* mode.\nThis is any View contained in an array via `setView` or `insertView`.  This\nallows View's like ListView above to work without duplicating list items.\n\nIf you wanted to keep a View from being removed pre-render, for instance,\nkeeping a history of items in the DOM or you're just adding new stuff every\nrender you will need to flag the View to be retained.\n\n``` javascript\nvar ItemView = Backbone.View.extend({\n  template: \"#item\",\n\n  // In this case we'll say the item is an <LI>\n  tagName: \"li\",\n\n  // This will keep the View from being automatically removed by LayoutManager.\n  keep: true\n});\n```\n\n### insertView function ###\n\nThe `insertView` function as seen above is simply a shortcut to the `setView`\nfunction, but automatically adds `true` to the append argument.\n\nIf you decide to add the selector partial to `insertView`, LayoutManager\nwill insert into the specified element.\n\nFor instance if you had a `<UL>` in your View and you wanted to insert into\nthat:\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  beforeRender: function() {\n    // Append a new ItemView into the nested <UL>\n    this.insertView(\"ul\", new ItemView());\n  }\n});\n```\n\nIf your View *is* a `<UL>` then you can simply do the following:\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  // Ensure this View is a UL and not a DIV\n  tagName: \"ul\",\n\n  beforeRender: function() {\n    // Append a new ItemView to the View.el\n    this.insertView(new ItemView());\n  }\n});\n```\n\nIf you wish to change `append` to `prepend` you can easily change how the\nView is inserted by setting a new `append` function.\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  beforeRender: function() {\n    // Append a new ItemView into the nested <UL>.\n    this.insertView(\"ul\", new ItemView({\n      // Prepend the element instead of append.\n      append: function(root, child) {\n        $(root).prepend(child);\n      }\n    }));\n  }\n});\n```\n\n*Note `insertView` can be used outside of `beforeRender` and is especially\nuseful for when you have an `add` event fire on a Collection.*\n\n#### insertViews function ####\n\nThe `insertViews` function is identical to `insertView` except that you can\nbulk append like with `setViews`.  You can one or more items by using an array.\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  beforeRender: function() {\n    // Append a new ItemView into the nested <UL>.\n    this.insertViews({\n      // Append a single item.\n      \"div\": new ItemView(),\n\n      // Append multiple items.\n      \"ul\": [new ItemView(), new ItemView()]\n    });\n  }\n});\n```\n### getView function ###\n\nThe `getView` function allows you to find a specific View by some filter\nfunction.\n\n``` javascript\n// Find an remove a View if it has the exact Model.\nmain.getView(function(view) {\n  return view.model === someModel;\n}).remove();\n```\n\n#### getViews function ####\n\nThis function works very similar to the `getView` function, except that it will\nalways return an `Array` of matching View's.  If you omit the filter function,\nit will return all subViews flattened.\n\n``` javascript\n// Find all sub views flattened in an Array.\nmain.getViews()\n\n// Find all sub views that have a model.\nmain.getViews(function(view) {\n  return view.model;\n});\n```\n\n### Working with template data ###\n\nTemplate engines bind data to a template.  The term context refers to the\ndata object passed.\n\nLayoutManager will look for a `serialize` method or object automatically:\n\n``` javascript\nvar LoginView = Backbone.View.extend({\n  template: \"#login-template\",\n\n  // Provide data to the template\n  serialize: function() {\n    return this.model.toJSON();\n  }\n});\n```\n\n## Advanced View Concepts ##\n\nOnce you've mastered the above features, you will want to learn more about how\nthese methods actually work and how to integrate 3rd party plugins like jQuery\ninto your Views.\n\n### Render function ###\n\n*Breaking change from 0.5.3*: The traditional `render` function is now\ncompletely managed by LayoutManager.  If you attempt to override this on any\nView, it will be the `render(template, context)` function, which can be used to\nswap the template engine on a specific View. This is **not* the function you\nwould use to add new Views or set up jQuery plugins.\n\nEvery `render` function accepts an optional callback function that will return\nthe View element once it has rendered itself and all of its children.  The\n`render` function returns a `promise` object that can be chained off of as\nwell.\n\n``` javascript\n// Using the callback method\nnew MyView().render(function(el) {\n  // Use the DOMNode el here\n});\n\n// Using the promise resolve method\nnew MyView().render().then(function(el) {\n  // Use the DOMNode el here\n});\n```\n\n### BeforeRender function ###\n\nYou now use the `beforeRender` function to add new subViews / run code before\nthe View has rendered.\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  beforeRender: function() {\n    /* Work with the View before render. */\n  }\n});\n```\n\n### AfterRender function ###\n\nYou now use the `afterRender` function to attach jQuery plugins / run code\nafter the View has rendered.\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  afterRender: function() {\n    /* Work with the View after render. */\n  }\n});\n```\n\n### Cleanup function ###\n\nEvery `Backbone.View` managed by LayoutManager can provide a custom `cleanup`\nfunction that will run whenever the View is overwritten or removed.\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  // This is a custom cleanup method that will remove the model events owned by\n  // this View.\n  cleanup: function() {\n    this.model.off(null, null, this);\n  },\n\n  initialize: function() {\n    this.model.on(\"change\", this.render, this);\n  }\n});\n```\n\n*Note: Be careful with unbinding, you don't want to inadvertently remove events\nfrom this model in other parts of your code.  These are shared objects.*\n\n### Using jQuery Plugins ###\n\nAttaching jQuery plugins should happen inside the `render` or `afterRender`\nmethods.  You can attach at either the Layout render or the View render.  To\nattach in the layout render:\n\n``` javascript\n$(\".container\").empty().append(main.el);\n\nmain.render(function() {\n  // Elements are guarenteed to be in the DOM\n  this.$(\".some-element\").somePlugin();\n});\n```\n\nTo attach in the View render, you will need to override the `afterRender`\nmethod like so:\n\n``` javascript\nafterRender: function() {\n  this.$(\".some-element\").somePlugin();\n}\n```\n\n## Configuration ##\n\nOverriding LayoutManager options has been designed to work just like\n`Backbone.sync`.  You can override at a global level using\n`LayoutManager.configure` or you can specify when instantiating a\n`LayoutManager` instance.\n\n### Global level ###\n\nLets say you wanted to use `Handlebars` for templating in all your Views.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  // Override render to use Handlebars\n  render: function(template, context) {\n    return Handlebars.compile(template)(context);\n  }\n});\n```\n\n### Instance level ###\n\nIn this specific layout, define custom prefixed paths for template paths.\n\n``` javascript\nvar main = new Backbone.Layout({\n  template: \"#main\",\n\n  // Custom paths for this layout\n  paths: {\n    template: \"/assets/templates/\"\n  }\n});\n```\n\n### Defaults ###\n\n* __Paths__:\nAn empty object.  Two valid property names: `template` and `layout`.\n\n``` javascript\npaths: {}\n```\n\n* __Deferred__:\nUses jQuery deferreds for internal operation, this may be overridden to use\na different Promises/A compliant deferred.\n\n``` javascript\ndeferred: function() {\n  return $.Deferred();\n}\n```\n\n* __Fetch__:\nUses jQuery to find a selector and returns its `innerHTML` content as a string\nor template function (either works).\n\n``` javascript\nfetch: function(path) {\n  return _.template($(path).html());\n}\n```\n\n* __Partial__: \nUses jQuery to find the View's location and inserts the rendered\nelement there.  The append property determines if the View should\nappend, defaults to replace via innerHTML.\n\n``` javascript\npartial: function(root, name, el, append) {\n  // If no selector is specified, assume the parent should be added to.\n  var $root = name ? $(root).find(name) : $(root);\n\n  // If no root found, return false\n  if (!$root.length) {\n    return false;\n  }\n\n  // Use the append method if append argument is true.\n  this[append ? \"append\" : \"html\"]($root, el);\n\n  // If successfully added, return true\n  return true;\n}\n```\n\n* __HTML__:\nOverride this with a custom HTML method, passed a root element and an\nelement to replace the innerHTML with.\n\n``` javascript\nhtml: function(root, el) {\n  $(root).html(el);\n}\n```\n\n* __Append__:\nVery similar to HTML except this one will appendChild.\n\n``` javascript\nappend: function(root, el) {\n  $(root).append(el);\n}\n```\n\n* __Detach__:\nRemove an element from the DOM, but maintain events.\n\n``` javascript\ndetach: function(el) {\n  $(el).detach();\n}\n```\n\n* __When__:\nThis function will trigger callbacks based on the success/failure of one or\nmore deferred objects.\n\n``` javascript\nwhen: function(promises) {\n  return $.when.apply(null, promises);\n}\n```\n\n* __Render__:\nRenders a template with the `Function` or `String` provided as the template\nvariable.\n\n``` javascript\nrender: function(template, context) {\n  return template(context);\n}\n```\n\n### Asynchronous & Synchronous fetching ###\n\nThe `fetch` method is overridden to get the contents of layouts and templates.\nIf you can instantly get the contents (DOM/JST) you can return the\ncontents inside the function.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(name) {\n    return $(\"script#\" + name).html();\n  }\n});\n```\n\nIf you need to fetch the contents asynchronously, you will need to put the\nmethod into \"asynchronous mode\".  To do this, assign `this.async()`\nto a variable and call that variable with the contents when you are done.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(name) {\n    var done = this.async();\n\n    $.get(name, function(contents) {\n      done(contents);\n    });\n  }\n});\n```\n\n## Sample Configurations ##\n\nYou may need to combine a mix of **Engines** and **Transports** to integrate.\n\n### Engines (Mustache, Handlebars, etc.) ###\n\nCustom templating engines can be used by overriding `render`.\n\n#### Underscore ####\n\n``` plain\nNo configuration necessary for this engine.\n```\n\n#### Mustache ####\n\n``` javascript\nBackbone.LayoutManager.configure({\n  render: function(template, context) {\n    return Mustache.to_html(template, context);\n  }\n});\n```\n\n#### Handlebars ####\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function (path){\n    return Handlebars.compile($(path).html());\n  },\n  render: function(template, context) {\n    return template(context);\n  }\n});\n```\n\n### Transports (DOM, AJAX, etc.) ###\n\nYou can swap out how templates are loaded by overriding `fetch`.\n\n#### DOM ####\n\n``` plain\nNo configuration necessary for this transport.\n```\n\n#### AJAX ####\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(path) {\n    var done = this.async();\n\n    $.get(path, function(contents) {\n      done(contents);\n    });\n  }\n});\n```\n\n### Using an Engine and Transport Override for JST ###\n\nWhatever you decide to return as a template in `fetch`, can be used in the\n`render` method.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(name) {\n    return window.JST[name];\n  },\n\n  render: function(template, context) {\n    return template(context);\n  }\n});\n```\n\n## Release notes ##\n\n### 0.6.1 ###\n\n* Patch release fixing issues and upgrading Node.js dependencies\n* Fixed error where inserted views rendered out of order #116, #117\n* Fixed issue where events were not being bound correctly #118\n\n[Full Release Log](https://github.com/tbranyen/backbone.layoutmanager/blob/master/changelog.md)\n","_id":"backbone.layoutmanager@0.6.1","dist":{"shasum":"56a1d2ca87c5bcb74c524328307063608f2dba68","tarball":"http://registry.npmjs.org/backbone.layoutmanager/-/backbone.layoutmanager-0.6.1.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.6.2":{"author":{"name":"Tim Branyen","url":"@tbranyen"},"name":"backbone.layoutmanager","description":"A manager for templates & layouts in Backbone.js","version":"0.6.2","homepage":"http://tbranyen.github.com/backbone.layoutmanager/","repository":{"type":"git","url":"git://github.com/tbranyen/backbone.layoutmanager.git"},"main":"node/index","engines":{"node":">=0.6"},"dependencies":{"backbone":"0.9.2","underscore.deferred":"0.1.5","cheerio":"0.9.1"},"_id":"backbone.layoutmanager@0.6.2","dist":{"shasum":"b984caa38850e25904f5d062e36a301785b1b62b","tarball":"http://registry.npmjs.org/backbone.layoutmanager/-/backbone.layoutmanager-0.6.2.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]}},"readme":"backbone.layoutmanager v0.5.2\n=============================\n\nCreated by Tim Branyen [@tbranyen](http://twitter.com/tbranyen) with\n[contributions](https://github.com/tbranyen/backbone.layoutmanager/contributors)\n\nProvides a logical structure for assembling layouts with Backbone Views.\nDesigned to be adaptive and configurable for painless integration.\n\nDepends on Underscore, Backbone and jQuery.  You can swap out the \njQuery dependency completely with a custom configuration.\n\n## Tutorials, Screencasts, & Examples ##\n\n* [Initial Screencast](http://vimeo.com/32765088)\n* Example Application: [GitHub Viewer](http://githubviewer.org) &\n  [Source](http://github.com/tbranyen/github-viewer)\n* [Integrating with Backbone Boilerplate with Handlebars](https://github.com/tbranyen/boilerplate-handlebars-layoutmanager)\n\n## Download & Include ##\n\nDevelopment is fully commented source, Production is minified and stripped of\nall comments except for license/credits.\n\n* [Development](https://raw.github.com/tbranyen/backbone.layoutmanager/master/backbone.layoutmanager.js)\n* [Production](https://raw.github.com/tbranyen/backbone.layoutmanager/master/dist/backbone.layoutmanager.min.js)\n\nInclude in your application *after* jQuery, Underscore, and Backbone have been\nincluded.\n\n``` html\n<script src=\"/js/jquery.js\"></script>\n<script src=\"/js/underscore.js\"></script>\n<script src=\"/js/backbone.js\"></script>\n\n<script src=\"/js/backbone.layoutmanager.js\"></script>\n```\n\n## Usage ##\n\nThis example renders a View into a template which is injected into a layout.\n\n### Defining the layout and template ###\n\nThese example templates are defined using a common pattern which leverages how\nbrowsers ignore `<script></script>` contents when using a custom `type`\nattribute.\n\n*Note: This is how LayoutManager expects templates to be defined by default\n(using script tags).*\n\n#### Main Layout ####\n\n``` plain\n<script id=\"main-layout\" type=\"layout\">\n  <section class=\"content\"></section>\n\n  <!-- Login template below will be injected here -->\n  <aside class=\"secondary\"></aside>\n</script>\n```\n\n#### Login Template ####\n\n``` plain\n<script id=\"login-template\" type=\"template\">\n  <form class=\"login\">\n    <p><label for=\"user\">Username</label><input type=\"text\" name=\"user\"></p>\n    <p><label for=\"pass\">Password</label><input type=\"text\" name=\"pass\"></p>\n    <p><input class=\"loginBtn\" type=\"submit\" value=\"Login\"></p>\n  </form>\n</script>\n```\n\n### Structuring a View ###\n\nEach View can associate a template via the `template` property.  This name by\ndefault is a jQuery selector, but if you have a custom configuration this could\npotentially be a filename or JST function name.\n\n*Note: If you do not specify a template LayoutManager will assume the View's\nrender method knows what it's doing and won't attempt to fetch/render anything\nfor you.*\n\n``` javascript\nvar LoginView = Backbone.View.extend({\n  template: \"#login-template\",\n\n  // The render function will be called internally by LayoutManager.\n  render: function(manage) {\n    // Have LayoutManager manage this View and call render.\n    return manage(this).render();\n  }\n});\n```\n\nIf you are using the default `render` method above, you can simply omit it and\nLayoutManager will add it for you.\n\n``` javascript\nvar LoginView = Backbone.View.extend({\n  template: \"#login-template\"\n});\n```\n\n### Create and render a layout ###\n\nEach LayoutManager can associate a template via the `template` property.  This\nname by default is a jQuery selector, but if you have a custom configuration\nthis could potentially be a filename or JST function name.\n\n*Note: Nesting LayoutManagers is not supported.  If you want sub layouts,\nsimply read on about nesting Views.*\n\nThis code typically resides in a route callback.\n\n``` javascript\nvar main = new Backbone.LayoutManager({\n  template: \"#main-layout\",\n\n  // In the secondary column, put a new Login View.\n  views: {\n    \".secondary\": new LoginView()\n  }\n});\n\n// Attach the Layout to the <body></body>.\n$(\"body\").html(main.el);\n\n// Render the Layout.\nmain.render();\n```\n\n### Adding a layout to the DOM ###\n\nTo add a layout into the page, simply inject it into a container at the time of\ncreation.  Do **not** call `html` more than once for a layout element, unless\nyou detach it first.  This is not recommended as it may cause a flicker during\nre-rendering.  It's cleaner and more efficient to only create a layout when\nyou need it and insert into the DOM at that time.\n\n``` javascript\n// Create the Layout.\nvar main = new Backbone.LayoutManager(...);\n\n// Attach Layout to the DOM.\n$(\".some-selector\").html(main.el);\n\n// Optional: (Not recommeded) Detach first if you cache the layout\n// main.$el.detach();\n\n// Render the Layout.\nmain.render();\n```\n\nViews may also be alternatively defined outside the LayoutManager:\n\n#### Using the setView function ####\n\nUse the following function to change out views at a later time.  Remember to\ncall the View's `render` method after swapping out to have it displayed.  The\n`setView` return value is the view, so chaining a `render` is super simple.\n\n``` javascript\nmain.setView(\".header\", new HeaderView());\nmain.setView(\".footer\", new FooterView());\n\n// Chain a render method\nmain.setView(\".header\", new HeaderView2()).render();\n```\n\n*Note: `setView` and `setViews` methods are available on all views.  This\nallows for nested Views, explained below.*\n\n*Note: The first argument *selector* can be omitted completely if you would\nlike the nested View to exist directly on the element.  This works well when\nyour parent View is something like a `UL` and your nested View is an `LI`.*\n\n*Note: The third argument is optional, but when set to `true` it will\nautomatically append the View into the container instead of replacing the\ncontent.*\n\n#### Using the setViews function ####\n\nThis is identical to how views are being assigned in the Layout example.  It\ncan be used in the following way:\n\n\n``` javascript\nvar main = new Backbone.LayoutManager({\n  template: \"#some-layout\"\n});\n\n// Set the views outside of the layout\nmain.setViews({\n  \".partial\": new PartialView()\n});\n```\n\n### Nested Views ###\n\nYou may have a situation where a View is defined that encapsulates other nested\nViews.  In these cases you should use nested views inside your LayoutManager\nView assignments.\n\nCheck out this example to see how easy this is:\n\n``` javascript\nvar main = new Backbone.LayoutManager({\n  template: \"#some-layout\",\n\n  views: {\n    \".partial\": new PartialView({\n      views: {\n        \".inner\": new InnerView()\n      }\n    })\n  }\n});\n```\n\n*Note: You can nest Views infinitely.*\n\n#### Re-rendering Views ####\n\nInstead of re-rendering the entire layout after data in a single View changes,\nyou can simply call `render()` on the View and it will automatically update\nthe DOM.\n\n*This syntax is completely valid*\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  initialize: function() {\n    this.model.on(\"change\", this.render, this);\n  }\n});\n```\n\n*As well as this syntax*\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  initialize: function() {\n    this.model.on(\"change\", function() {\n      this.render();\n    }, this);\n  }\n});\n```\n\n### Rendering repeating views ###\n\nThere are many times in which you will end up with a list of nested views\nthat result from either iterating a `Backbone.Collection` or `Array`\nand will need to dynamically add these nested views into a main view.\n\nLayoutManager solves this by exposing a method to change the insert mode\nfrom replacing the `innerHTML` to `appendChild` instead.  Whenever you\nuse the `insertView` method you will put the nested view into this special\nmode.\n\nSub views are always inserted in order, regardless if the `fetch` method has\nbeen overwritten to be asynchronous.\n\nAn example will illustrate the pattern easier:\n\n#### Item Template ####\n\nThis item template doesn't need to do much since it will be automatically\nwrapped in an `<li></li>` by the View. \n\n``` plain\n<script id=\"#item\" type=\"template\">\n  <%= name %>\n</script>\n```\n\n#### Item View ####\n\n``` javascript\n// You may find it easier to have Backbone render the LI/TD/etc element\n// instead of including this in your template.  This is purely convention\n// use what works for you.\nvar ItemView = Backbone.View.extend({\n  template: \"#item\",\n\n  // In this case we'll say the item is an <LI>\n  tagName: \"li\"\n});\n```\n\n#### List View ####\n\nThe list View simply needs to provide an outlet for the above `<li>` to be\nappended into.\n\n``` javascript\n// You will need to override the `render` function with custom functionality.  \nvar ListView = Backbone.View.extend({\n  tagName: \"ul\"\n\n  render: function(manage) {\n    // Iterate over the passed collection and create a view for each item.\n    this.collection.each(function(model) {\n      // Pass the sample data to the new SomeItem View.\n      this.insertView(new ItemView({\n        serialize: { name: \"Just testing!\" }\n      }));\n    }, this);\n\n    // You still must return this view to render, works identical to\n    // existing functionality.\n    return manage(this).render();\n  }\n});\n```\n\n### How does this not duplicate Views? ###\n\nInternally LayoutManager will remove all View's marked as in *append* mode.\nThis is any View contained in an array via `setView` or `insertView`.  This\nallows View's like ListView above to work without duplicating list items.\n\nIf you wanted to keep a View from being removed pre-render, for instance,\nkeeping a history of items in the DOM or you're just adding new stuff every\nrender you will need to flag the View to be retained.\n\n``` javascript\nvar ItemView = Backbone.View.extend({\n  template: \"#item\",\n\n  // In this case we'll say the item is an <LI>\n  tagName: \"li\",\n\n  // This will keep the View from being automatically removed by LayoutManager.\n  keep: true\n});\n```\n\n### insertView function ###\n\nThe `insertView` function as seen above is simply a shortcut to the `setView`\nfunction, but automatically adds `true` to the append argument.\n\nIf you decide to add the selector partial to `insertView`, LayoutManager\nwill insert into the specified element.\n\nFor instance if you had a `<UL>` in your View and you wanted to insert into\nthat:\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  render: function(manage) {\n    // Append a new ItemView into the nested <UL>\n    this.insertView(\"ul\", new ItemView());\n\n    return manage(this).render();\n  }\n});\n```\n\nIf your View *is* a `<UL>` then you can simply do the following:\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  // Ensure this View is a UL and not a DIV\n  tagName: \"ul\",\n\n  render: function(manage) {\n    // Append a new ItemView to the View.el\n    this.insertView(new ItemView());\n\n    return manage(this).render();\n  }\n});\n```\n\nIf you wish to change `append` to `prepend` you can easily change how the\nView is inserted by setting a new `append` function.\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  render: function(manage) {\n    // Append a new ItemView into the nested <UL>.\n    this.insertView(\"ul\", new ItemView({\n      // Prepend the element instead of append.\n      append: function(root, child) {\n        $(root).prepend(child);\n      }\n    }));\n\n    return manage(this).render();\n  }\n});\n```\n\n*Note `insertView` can be used outside of `render` and is especially useful\nfor when you have an `add` event off a Collection.*\n\n#### insertViews function ####\n\nThe `insertViews` function is identical to `insertView` except that you can\nbulk append like with `setViews`.  You can one or more items by using an array.\n\n``` javascript\nvar ListView = Backbone.View.extend({\n  render: function(manage) {\n    // Append a new ItemView into the nested <UL>.\n    this.insertViews({\n      // Append a single item.\n      \"div\": new ItemView(),\n\n      // Append multiple items.\n      \"ul\": [new ItemView(), new ItemView()]\n    });\n\n    return manage(this).render();\n  }\n});\n```\n### getView function ###\n\nThe `getView` function allows you to find a specific View by some filter\nfunction.\n\n``` javascript\n// Find an remove a View if it has the exact Model.\nmain.getView(function(view) {\n  return view.model === someModel;\n}).remove();\n```\n\n#### getViews function ####\n\nThis function works very similar to the `getView` function, except that it will\nalways return an `Array` of matching View's.  If you omit the filter function,\nit will return all subViews flattened.\n\n``` javascript\n// Find all sub views flattened in an Array.\nmain.getViews()\n\n// Find all sub views that have a model.\nmain.getViews(function(view) {\n  return view.model;\n});\n```\n\n### removeView function ###\n\nThe `removeView` function is available on all View's and should be called in\nplace of `remove` when applicable.  It's mainly used internally, but if you\nfind that you need to scrub and remove a View and all its subView's you can use\nthis.\n\n``` javascript\n// Will remove the View and all subViews.\nmain.removeView();\n\n// Will remove only append-mode (lists) items.\nmain.removeView(true);\n```\n\n### Working with template data ###\n\nTemplate engines bind data to a template.  The term context refers to the\ndata object passed.\n\nLayoutManager will look for a `serialize` method or object automatically:\n\n``` javascript\nvar LoginView = Backbone.View.extend({\n  template: \"#login-template\",\n\n  // Provide data to the template\n  serialize: function() {\n    return this.model.toJSON();\n  }\n});\n```\n\nYou can also pass the context object inside the `render` method:\n\n``` javascript\nvar LoginView = Backbone.View.extend({\n  template: \"#login-template\",\n\n  render: function(manage) {\n    // Have LayoutManager manage this View and call render with data you\n    // provide.\n    return manage(this).render(this.model.toJSON());\n  }\n});\n```\n\n## Advanced View Concepts ##\n\nOnce you've mastered the above features, you will want to learn more about how\nthese methods actually work and how to integrate 3rd party plugins like jQuery\ninto your Views.\n\n### Render function ###\n\nThe `render` function is overwritten on every `LayoutManager` and\n`Backbone.View` instance.  The overwritten render saves a reference to the\ncustom function you provide and will call this internally whenever you invoke\n`view.render()`.\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  // This function gets wrapped by LayoutManager internally so you don't have\n  // to pass any arguments to re-render.\n  render: function(manage) {\n    return manage(this).render();\n  }\n});\n```\n\nEvery `render` function accepts an optional callback function that will return\nthe View element once it has rendered itself and all of its children.  The\n`render` function returns a `promise` object that can be chained off of as\nwell.\n\n``` javascript\n// Using the callback method\nnew MyView().render(function(el) {\n  // Use the DOMNode el here\n});\n\n// Using the promise resolve method\nnew MyView().render().then(function(el) {\n  // Use the DOMNode el here\n});\n```\n\n### Cleanup function ###\n\nEvery `Backbone.View` managed by LayoutManager can provide a custom `cleanup`\nfunction that will run whenever the View is overwritten or removed.\n\n``` javascript\nvar MyView = Backbone.View.extend({\n  // This is a custom cleanup method that will remove the model events owned by\n  // this View.\n  cleanup: function() {\n    this.model.off(null, null, this);\n  },\n\n  initialize: function() {\n    this.model.on(\"change\", this.render, this);\n  }\n});\n```\n\n*Note: Be careful with unbinding, you don't want to inadvertently remove events\nfrom this model in other parts of your code.  These are shared objects.*\n\n### Using jQuery Plugins ###\n\nAttaching jQuery plugins should happen inside the `render` methods.  You can\nattach at either the Layout render or the View render.  To attach in the\nlayout render:\n\n``` javascript\n$(\".container\").html(main.el);\n\nmain.render(function() {\n  // Elements are guarenteed to be in the DOM\n  this.$(\".some-element\").somePlugin();\n});\n```\n\nTo attach in the View render, you will need to override the `render` method\nlike so:\n\n``` javascript\nrender: function(manage) {\n  return manage(this).render().then(function() {\n    this.$(\".some-element\").somePlugin();\n  });\n}\n```\n\nThis is a very cool example of the power in using deferreds. =)\n\n## Configuration ##\n\nOverriding LayoutManager options has been designed to work just like\n`Backbone.sync`.  You can override at a global level using\n`LayoutManager.configure` or you can specify when instantiating a\n`LayoutManager` instance.\n\n### Global level ###\n\nLets say you wanted to use `Handlebars` for templating in all your Views.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  // Override render to use Handlebars\n  render: function(template, context) {\n    return Handlebars.compile(template)(context);\n  }\n});\n```\n\n### Instance level ###\n\nIn this specific layout, define custom prefixed paths for template paths.\n\n``` javascript\nvar main = new Backbone.LayoutManager({\n  template: \"#main\",\n\n  // Custom paths for this layout\n  paths: {\n    template: \"/assets/templates/\"\n  }\n});\n```\n\n### Defaults ###\n\n* __Paths__:\nAn empty object.  Two valid property names: `template` and `layout`.\n\n``` javascript\npaths: {}\n```\n\n* __Deferred__:\nUses jQuery deferreds for internal operation, this may be overridden to use\na different Promises/A compliant deferred.\n\n``` javascript\ndeferred: function() {\n  return $.Deferred();\n}\n```\n\n* __Fetch__:\nUses jQuery to find a selector and returns its `innerHTML` content as a string\nor template function (either works).\n\n``` javascript\nfetch: function(path) {\n  return _.template($(path).html());\n}\n```\n\n* __Partial__: \nUses jQuery to find the View's location and inserts the rendered\nelement there.  The append property determines if the View should\nappend, defaults to replace via innerHTML.\n\n``` javascript\npartial: function(root, name, el, append) {\n  // If no selector is specified, assume the parent should be added to.\n  var $root = name ? $(root).find(name) : $(root);\n\n  // If no root found, return false\n  if (!$root.length) {\n    return false;\n  }\n\n  // Use the append method if append argument is true.\n  this[append ? \"append\" : \"html\"]($root, el);\n\n  // If successfully added, return true\n  return true;\n}\n```\n\n* __HTML__:\nOverride this with a custom HTML method, passed a root element and an\nelement to replace the innerHTML with.\n\n``` javascript\nhtml: function(root, el) {\n  $(root).html(el);\n}\n```\n\n* __Append__:\nVery similar to HTML except this one will appendChild.\n\n``` javascript\nappend: function(root, el) {\n  $(root).append(el);\n}\n```\n\n* __Detach__:\nRemove an element from the DOM, but maintain events.\n\n``` javascript\ndetach: function(el) {\n  $(el).detach();\n}\n```\n\n* __When__:\nThis function will trigger callbacks based on the success/failure of one or\nmore deferred objects.\n\n``` javascript\nwhen: function(promises) {\n  return $.when.apply(null, promises);\n}\n```\n\n* __Render__:\nRenders a template with the `Function` or `String` provided as the template\nvariable.\n\n``` javascript\nrender: function(template, context) {\n  return template(context);\n}\n```\n\n### Asynchronous & Synchronous fetching ###\n\nThe `fetch` method is overridden to get the contents of layouts and templates.\nIf you can instantly get the contents (DOM/JST) you can return the\ncontents inside the function.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(name) {\n    return $(\"script#\" + name).html();\n  }\n});\n```\n\nIf you need to fetch the contents asynchronously, you will need to put the\nmethod into \"asynchronous mode\".  To do this, assign `this.async()`\nto a variable and call that variable with the contents when you are done.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(name) {\n    var done = this.async();\n\n    $.get(name, function(contents) {\n      done(contents);\n    });\n  }\n});\n```\n\n## Sample Configurations ##\n\nYou may need to combine a mix of **Engines** and **Transports** to integrate.\n\n### Engines (Mustache, Handlebars, etc.) ###\n\nCustom templating engines can be used by overriding `render`.\n\n#### Underscore ####\n\n``` plain\nNo configuration necessary for this engine.\n```\n\n#### Mustache ####\n\n``` javascript\nBackbone.LayoutManager.configure({\n  render: function(template, context) {\n    return Mustache.to_html(template, context);\n  }\n});\n```\n\n#### Handlebars ####\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function (path){\n    return Handlebars.compile($(path).html());\n  },\n  render: function(template, context) {\n    return template(context);\n  }\n});\n```\n\n### Transports (DOM, AJAX, etc.) ###\n\nYou can swap out how templates are loaded by overriding `fetch`.\n\n#### DOM ####\n\n``` plain\nNo configuration necessary for this transport.\n```\n\n#### AJAX ####\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(path) {\n    var done = this.async();\n\n    $.get(path, function(contents) {\n      done(contents);\n    });\n  }\n});\n```\n\n### Using an Engine and Transport Override for JST ###\n\nWhatever you decide to return as a template in `fetch`, can be used in the\n`render` method.\n\n``` javascript\nBackbone.LayoutManager.configure({\n  fetch: function(name) {\n    return window.JST[name];\n  },\n\n  render: function(template, context) {\n    return template(context);\n  }\n});\n```\n\n## Release notes ##\n\n### 0.5.2 ###\n\n* More methods can be overwritten from initialization\n* Render can now be bound like `this.collection.on(\"reset\", this.render, this);`\n* Fixes to `keep: true` and append example, only checking `keep` if View has\n  already rendered\n\n[Full Release Log](https://github.com/tbranyen/backbone.layoutmanager/blob/master/changelog.md)\n","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"time":{"modified":"2012-08-10T18:42:19.613Z","created":"2012-07-19T06:04:17.789Z","0.0.0":"2012-07-19T06:04:18.319Z","0.6.0":"2012-08-03T20:40:59.956Z","0.6.1":"2012-08-08T20:01:41.774Z","0.6.2":"2012-08-10T18:42:19.613Z"},"author":{"name":"Tim Branyen","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/backbone.layoutmanager.git"},"_attachments":{"backbone.layoutmanager-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ff/qrpHmRB73wOffOGipJw==","length":142963,"stub":true},"backbone.layoutmanager-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1lfTeN29axLO4B9fAFQ71w==","length":139150,"stub":true},"backbone.layoutmanager-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Rb76Avo/VJXhzXAZCI3n3A==","length":137748,"stub":true},"backbone.layoutmanager-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jZrGMElaX9iT/0EOw7ghqQ==","length":136711,"stub":true}}}},
{"id":"backboneio","key":"backboneio","value":{"rev":"8-a84701db321a525838912f616c9d7cfe"},"doc":{"_id":"backboneio","_rev":"8-a84701db321a525838912f616c9d7cfe","name":"backboneio","description":"Share Backbone.js models between client and server and sync them with socket.io","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"backboneio","version":"0.0.1","description":"Share Backbone.js models between client and server and sync them with socket.io","main":"index.js","repository":{"type":"git","url":"git://github.com/MiLk/backboneio.git"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9","socket.io":">=0.9.7"},"engines":{"node":">=0.8"},"keywords":["backbone","underscore","socket.io"],"author":{"name":"Emilien Kenler","email":"hello@emilienkenler.com","url":"http://www.emilienkenler.com"},"license":"BSD","readme":"= BackboneIO\n\nThis module allow you to reuse the same _Backbone.js_ model between the client and the server (_Node.js_) and synchronize them with _socket.io_.\nThis solution is built on top of _Backbone.iobind_ (http://alogicalparadox.com/backbone.iobind/).\nBackboneIO extend the Backbone module and provide a _BackboneIO.sync_ function that communicate with socket.io instead of using HTTP methods.\nThe _BackboneIO.Model_ has default functions to _update_ or _delete_ a _Model_.\nThe _BackboneIO.Collection_ has default functions to _create_ a _Model_ or _read_ a _Collection_.\n\n== Install\n\nFor the server just type :\n```\nnpm install backboneio\n```\n\nFor the client you need to copy the files _backbone.js_ and _backboneio.js_ in your javascript directory.\nThen put this code in your HTML :\n```html\n<script src=\"/js/backbone.js\"></script>\n<script src=\"/js/backboneio.js\"></script>\n```\n\n== Use\n\nComing soon ...\nYou can look at https://github.com/MiLk/backboneio/tree/master/solution-2\n\n== Thanks\n\n* Jake Luer [[Github: @logicalparadox](http://github.com/logicalparadox)] [[Twitter: @jakeluer](http://twitter.com/jakeluer)] [[Website](http://alogicalparadox.com)]\n\n== LICENSE\n\nNew BSD License\n\nCopyright (c) 2012, Emilien Kenler hello@emilienkenler.com\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","_id":"backboneio@0.0.1","dist":{"shasum":"21c7e94521339376b244cf3e3d428ac7db7020bd","tarball":"http://registry.npmjs.org/backboneio/-/backboneio-0.0.1.tgz"},"maintainers":[{"name":"milk","email":"hello@emilienkenler.com"}]},"0.0.2":{"name":"backboneio","version":"0.0.2","description":"Share Backbone.js models between client and server and sync them with socket.io","main":"index.js","repository":{"type":"git","url":"git://github.com/MiLk/backboneio.git"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9","socket.io":">=0.9.7"},"engines":{"node":">=0.8"},"keywords":["backbone","underscore","socket.io"],"author":{"name":"Emilien Kenler","email":"hello@emilienkenler.com","url":"http://www.emilienkenler.com"},"license":"BSD","readme":"= BackboneIO\n\nThis module allow you to reuse the same _Backbone.js_ model between the client and the server (_Node.js_) and synchronize them with _socket.io_.\nThis solution is built on top of _Backbone.iobind_ (http://alogicalparadox.com/backbone.iobind/).\n_BackboneIO_ extend the _Backbone_ module and provide a _BackboneIO.sync_ function that communicate with _socket.io_ instead of using HTTP methods.\nThe _BackboneIO.Model_ has default functions to _update_ or _delete_ a _Model_.\nThe _BackboneIO.Collection_ has default functions to _create_ a _Model_ or _read_ a _Collection_.\n\n== Install\n\nFor the server just type :\n```\nnpm install backboneio\n```\n\nFor the client you need to copy the files _backbone.js_ and _backboneio.js_ in your javascript directory.\nThen put this code in your HTML :\n```html\n<script src=\"/js/backbone.js\"></script>\n<script src=\"/js/backboneio.js\"></script>\n```\n\n== Use\n\nA basic example is available in sample directory.\n\n== Thanks\n\n* Jake Luer [[Github: @logicalparadox](http://github.com/logicalparadox)] [[Twitter: @jakeluer](http://twitter.com/jakeluer)] [[Website](http://alogicalparadox.com)]\n\n== LICENSE\n\nNew BSD License\n\nCopyright (c) 2012, Emilien Kenler hello@emilienkenler.com\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","_id":"backboneio@0.0.2","dist":{"shasum":"62540568124af280b30d51e36ad71328d48f71f9","tarball":"http://registry.npmjs.org/backboneio/-/backboneio-0.0.2.tgz"},"maintainers":[{"name":"milk","email":"hello@emilienkenler.com"}]},"0.0.3":{"name":"backboneio","version":"0.0.3","description":"Share Backbone.js models between client and server and sync them with socket.io","main":"index.js","repository":{"type":"git","url":"git://github.com/MiLk/backboneio.git"},"dependencies":{"underscore":">=1.3.1","backbone":">=0.9","socket.io":">=0.9.7"},"engines":{"node":">=0.8"},"keywords":["backbone","underscore","socket.io"],"author":{"name":"Emilien Kenler","email":"hello@emilienkenler.com","url":"http://www.emilienkenler.com"},"license":"BSD","readme":"= BackboneIO\n\nThis module allow you to reuse the same _Backbone.js_ model between the client and the server (_Node.js_) and synchronize them with _socket.io_.\nThis solution is built on top of _Backbone.iobind_ (http://alogicalparadox.com/backbone.iobind/).\n_BackboneIO_ extend the _Backbone_ module and provide a _BackboneIO.sync_ function that communicate with _socket.io_ instead of using HTTP methods.\nThe _BackboneIO.Model_ has default functions to _update_ or _delete_ a _Model_.\nThe _BackboneIO.Collection_ has default functions to _create_ a _Model_ or _read_ a _Collection_.\n\n== Install\n\nFor the server just type :\n```\nnpm install backboneio\n```\nor via git repository :\n```\nnpm install git://github.com/MiLk/backboneio.git\n```\n\nFor the client you need to copy the files _backbone.js_ and _backboneio.js_ in your javascript directory.\nThen put this code in your HTML :\n```html\n<script src=\"/js/backbone.js\"></script>\n<script src=\"/js/backboneio.js\"></script>\n```\n\n== Use\n\nA basic example is available in sample directory.\n\n== Thanks\n\n* Jake Luer [[Github: @logicalparadox](http://github.com/logicalparadox)] [[Twitter: @jakeluer](http://twitter.com/jakeluer)] [[Website](http://alogicalparadox.com)]\n\n== LICENSE\n\nNew BSD License\n\nCopyright (c) 2012, Emilien Kenler hello@emilienkenler.com\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","_id":"backboneio@0.0.3","dist":{"shasum":"00aded25769fd04da8868dbdf80ac82a5289c0f8","tarball":"http://registry.npmjs.org/backboneio/-/backboneio-0.0.3.tgz"},"maintainers":[{"name":"milk","email":"hello@emilienkenler.com"}]}},"readme":"= BackboneIO\n\nThis module allow you to reuse the same _Backbone.js_ model between the client and the server (_Node.js_) and synchronize them with _socket.io_.\nThis solution is built on top of _Backbone.iobind_ (http://alogicalparadox.com/backbone.iobind/).\nBackboneIO extend the Backbone module and provide a _BackboneIO.sync_ function that communicate with socket.io instead of using HTTP methods.\nThe _BackboneIO.Model_ has default functions to _update_ or _delete_ a _Model_.\nThe _BackboneIO.Collection_ has default functions to _create_ a _Model_ or _read_ a _Collection_.\n\n== Install\n\nFor the server just type :\n```\nnpm install backboneio\n```\n\nFor the client you need to copy the files _backbone.js_ and _backboneio.js_ in your javascript directory.\nThen put this code in your HTML :\n```html\n<script src=\"/js/backbone.js\"></script>\n<script src=\"/js/backboneio.js\"></script>\n```\n\n== Use\n\nComing soon ...\nYou can look at https://github.com/MiLk/backboneio/tree/master/solution-2\n\n== Thanks\n\n* Jake Luer [[Github: @logicalparadox](http://github.com/logicalparadox)] [[Twitter: @jakeluer](http://twitter.com/jakeluer)] [[Website](http://alogicalparadox.com)]\n\n== LICENSE\n\nNew BSD License\n\nCopyright (c) 2012, Emilien Kenler hello@emilienkenler.com\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","maintainers":[{"name":"milk","email":"hello@emilienkenler.com"}],"time":{"modified":"2012-08-02T13:43:34.729Z","created":"2012-07-27T21:12:45.393Z","0.0.1":"2012-07-27T21:12:47.752Z","0.0.2":"2012-07-28T06:37:30.090Z","0.0.3":"2012-08-01T15:56:55.953Z"},"author":{"name":"Emilien Kenler","email":"hello@emilienkenler.com","url":"http://www.emilienkenler.com"},"repository":{"type":"git","url":"git://github.com/MiLk/backboneio.git"},"users":{"fgribreau":true},"_attachments":{"backboneio-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RlcdPvE//RDWVi/VElFMOw==","length":115690,"stub":true},"backboneio-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6v/cPRIiLp16bV526pY0Lg==","length":115661,"stub":true},"backboneio-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4SUePdrdrLLaJ/XaUKts7A==","length":3904,"stub":true}}}},
{"id":"backchatio-hookup","key":"backchatio-hookup","value":{"rev":"17-1df8514157928c297161af14464616e9"},"doc":{"_id":"backchatio-hookup","_rev":"17-1df8514157928c297161af14464616e9","name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","dist-tags":{"latest":"0.1.15"},"versions":{"0.1.8":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.8","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.8","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"24435e251d9b32d5ee88a740ec06da0f4dc45dfe","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.8.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.9":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.9","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.9","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4e030efd5ab974eb697481b6e56932b62531c7a7","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.9.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.10":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.10","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.10","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b5828029243070af65fb728be9a401556cad9624","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.10.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.11":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.11","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.11","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"af8f28f32de6f0e6400cf086e1dd80661700a75e","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.11.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.12":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.12","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.12","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"775867394614f8dd573bd012765f4630dfde5639","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.12.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.13":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.13","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.13","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8da08dfe6674f068a0914434b8a29f0241bd9707","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.13.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.14":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.14","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.14","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"51002ee63a39a7789f0b4cdd04fbbfeed9d4d463","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.14.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.15":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-hookup","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.15","homepage":"https://backchatio.github.com/hookup","repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":"","jsdoc-toolkit":""},"main":"./lib/backchatio-hookup.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-hookup@0.1.15","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9cdb61d6fdea89e9fc2833c898e13d3c5e18dc85","tarball":"http://registry.npmjs.org/backchatio-hookup/-/backchatio-hookup-0.1.15.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]}},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}],"time":{"modified":"2012-05-22T10:41:42.817Z","created":"2012-05-11T10:12:08.279Z","0.1.8":"2012-05-11T10:12:09.499Z","0.1.9":"2012-05-16T13:14:33.486Z","0.1.10":"2012-05-16T13:32:36.239Z","0.1.11":"2012-05-16T13:33:48.535Z","0.1.12":"2012-05-16T13:35:40.624Z","0.1.13":"2012-05-16T13:38:44.959Z","0.1.14":"2012-05-16T13:45:21.994Z","0.1.15":"2012-05-22T10:41:42.817Z"},"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"repository":{"type":"git","url":"git://github.com/backchatio/hookup.git"},"_attachments":{"backchatio-hookup-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Hw/tthq/ZlYB/Mirf1E28Q==","length":8882,"stub":true},"backchatio-hookup-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-WyVYzUvpiEjksQZd7csBmQ==","length":8799,"stub":true},"backchatio-hookup-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-pQBSCzXSDAWna+ZuLc9lQA==","length":8799,"stub":true},"backchatio-hookup-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ooRvVI3j9EDPB1Ia9pzjFw==","length":8772,"stub":true},"backchatio-hookup-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-4f/1GZHjJLK/FTf+IYUIvQ==","length":8784,"stub":true},"backchatio-hookup-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6h2zqV0vzZCF22QEFK9q+Q==","length":8767,"stub":true},"backchatio-hookup-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mCjp6/P2yd9SSDX7w74d9w==","length":8710,"stub":true},"backchatio-hookup-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Xw+nw0zByNo3yQSZsrbRFA==","length":6760,"stub":true}}}},
{"id":"backchatio-websocket","key":"backchatio-websocket","value":{"rev":"15-78d721899efec6a982f578d348d44a8f"},"doc":{"_id":"backchatio-websocket","_rev":"15-78d721899efec6a982f578d348d44a8f","name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.0","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"~0.6.13"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"53bfce14a571c13db0828b15d3ac75f7bd7a95c3","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.0.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.1":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.1","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"~0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"247d9930d2e6fa976b412f7767025139f4c1e0b0","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.1.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.2":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.2","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5cb495a09613a61e9e249a088025e843a27973fa","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.2.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.3":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.3","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8a9ce7a488ed6bdd44d94982c6d21141bd0f7475","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.3.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.4":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.4","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.4","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"25766d9f012cea7b5b8c4f04af70132c360422a4","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.4.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.5":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.5","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.5","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ee00ce5d17c229e845f9f77dca2132d83a5c7c75","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.5.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]},"0.1.6":{"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"name":"backchatio-websocket","description":"Provides a reliable messaging layer on top of websockets","version":"0.1.6","homepage":"https://backchat.io","repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"engines":{"node":"0.6.x"},"dependencies":{"underscore":"","faye-websocket":"","dateformat":"","mkdirp":""},"devDependencies":{"vows":"0.6.x","sinon":"","rimraf":""},"main":"./lib/backchat-websocket.js","scripts":{"test":"vows --spec --isolate"},"_npmUser":{"name":"casualjim","email":"ivan@flanders.co.nz"},"_id":"backchatio-websocket@0.1.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e35ed2dd9f7d510aee42f85eab1e2f0aec8c788d","tarball":"http://registry.npmjs.org/backchatio-websocket/-/backchatio-websocket-0.1.6.tgz"},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}]}},"readme":"","maintainers":[{"name":"casualjim","email":"ivan@flanders.co.nz"}],"time":{"modified":"2012-05-08T16:49:30.118Z","created":"2012-04-12T11:19:33.421Z","0.1.0":"2012-04-12T11:19:35.065Z","0.1.1":"2012-04-12T11:46:41.732Z","0.1.2":"2012-04-12T11:49:01.363Z","0.1.3":"2012-04-12T11:49:45.635Z","0.1.4":"2012-05-04T14:30:42.187Z","0.1.5":"2012-05-04T16:56:52.129Z","0.1.6":"2012-05-08T16:49:30.118Z"},"author":{"name":"Ivan Porto Carrero","email":"ivan@backchat.io","url":"https://backchat.io"},"repository":{"type":"git","url":"git://github.com/mojolly/backchat-websocket.git"},"_attachments":{"backchatio-websocket-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-01mPxSiuzXFRz5GpObc0jw==","length":6770,"stub":true},"backchatio-websocket-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-FncYxgxAomz7iGKl8HwQ6g==","length":6758,"stub":true},"backchatio-websocket-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-20UjMyD0xLKDViEAdS1Q9Q==","length":6629,"stub":true},"backchatio-websocket-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-alOWaEdmHgzzpKt9c7/Otw==","length":6632,"stub":true},"backchatio-websocket-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QwymDkEI7as3fuxXwwaJxw==","length":6635,"stub":true},"backchatio-websocket-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-utSZILGX1XfuhrG+/PkS+A==","length":6638,"stub":true},"backchatio-websocket-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ggNOU7H2+ZIjnKP0rXcLxg==","length":6640,"stub":true}}}},
{"id":"backdroid","key":"backdroid","value":{"rev":"5-0e1f73e25d3e66d79f81b8a1e0b0dd34"},"doc":{"_id":"backdroid","_rev":"5-0e1f73e25d3e66d79f81b8a1e0b0dd34","name":"backdroid","description":"it's a backdoor for Android formed by a client written in JavaScript, with the help of http://onx.ms/, and a server written in NodeJS.","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"backdroid","version":"1.0.0","author":{"name":"yeikos"},"description":"it's a backdoor for Android formed by a client written in JavaScript, with the help of http://onx.ms/, and a server written in NodeJS.","homepage":"https://github.com/yeikos/backdroid","main":"server.js","dependencies":{"express":"2.5.x","socket.io":"0.9.x"},"_npmUser":{"name":"yeikos","email":"yeikos@gmail.com"},"_id":"backdroid@1.0.0","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"3fcb6b4dde072e58e7038611328e1f717a6c22d9","tarball":"http://registry.npmjs.org/backdroid/-/backdroid-1.0.0.tgz"},"maintainers":[{"name":"yeikos","email":"yeikos@gmail.com"}]},"1.0.1":{"name":"backdroid","version":"1.0.1","author":{"name":"yeikos"},"description":"it's a backdoor for Android formed by a client written in JavaScript, with the help of http://onx.ms/, and a server written in NodeJS.","homepage":"https://github.com/yeikos/backdroid","main":"server.js","dependencies":{"express":"2.5.x","socket.io":"0.9.x"},"_npmUser":{"name":"yeikos","email":"yeikos@gmail.com"},"_id":"backdroid@1.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"1e204daddb787f273ad6a7e138460c7e97612ca9","tarball":"http://registry.npmjs.org/backdroid/-/backdroid-1.0.1.tgz"},"maintainers":[{"name":"yeikos","email":"yeikos@gmail.com"}]}},"readme":"Backdroid v1.0.0 BETA\r\n==================================================\r\n\r\nWhat is this?\r\n--------------------------------------\r\n\r\nit's a backdoor for Android formed by a client written in JavaScript, with the help of http://onx.ms/, and a server written in NodeJS.\r\n\r\nFeatures\r\n--------------------------------------\r\n\r\n\tEncrypted connection in AES-256\r\n\tWeb panel control\r\n\tVery flexible and scalable to add new features\r\n\r\nHow to install?\r\n--------------------------------------\r\n\r\n1º Download and install NodeJS (http://nodejs.org/).\r\n2º Install backdroid with npm by the console (npm install -g backdroid).\r\n3º Download and install Onx App for Android (https://play.google.com/store/apps/details?id=com.microsoft.onx.app).\r\n4º Login in https://www.onx.ms/.\r\n5º Download backdroid proyect.\r\n6º Copy client.js source code (https://github.com/yeikos/nodejs.backdroid/blob/master/client.js) and paste it into https://www.onx.ms/#!createScriptPage (new rule).\r\n7º Go to examples project folder and launch each example by the console (node SCRIPTNAME).\r\n\r\nExample\r\n--------------------------------------\r\n\t\r\n\tvar backdroid = require('backdroid');\r\n\r\n\tbackdroid.setCommand('location', { provider: 'CELL' }, function(command, value) {\r\n\r\n\t\tconsole.log('[sent]', command, value);\r\n\r\n\t}, function(command, value, response) {\r\n\r\n\t\tconsole.log('[response]', command, value, response);\r\n\r\n\t});\r\n\r\n\tbackdroid.createCommandServer({\r\n\r\n\t\tpassword: 'secret',\r\n\t\tpassword_encryptation: 'secret123',\r\n\t\t\r\n\t\tport: 8888\r\n\r\n\t});","maintainers":[{"name":"yeikos","email":"yeikos@gmail.com"}],"time":{"modified":"2012-06-25T08:31:57.512Z","created":"2012-06-25T08:16:14.314Z","1.0.0":"2012-06-25T08:16:21.514Z","1.0.1":"2012-06-25T08:31:57.512Z"},"author":{"name":"yeikos"},"_attachments":{"backdroid-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VQC3lAy5MDykNRdI6aXOeA==","length":113507,"stub":true},"backdroid-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mIgmaDi1dFlr1HrlRg8dRA==","length":113503,"stub":true}}}},
{"id":"background","key":"background","value":{"rev":"77-707202b58b955757ee01da778373fe79"},"doc":{"_id":"background","_rev":"77-707202b58b955757ee01da778373fe79","name":"background","description":"Background.js provides a background job queue and list with array iterators for Javascript applications.","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.2":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"background","description":"Background.js provides a background job queue and list with array iterators for Javascript applications.","keywords":["background","backgroundjs","jobs","workers","tasks","javascript","coffeescript"],"url":"http://kmalakoff.github.com/background/","homepage":"http://kmalakoff.github.com/background/","repository":{"type":"git","url":"git://github.com/kmalakoff/background.git"},"main":"background.js","version":"0.2.2","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"background@0.2.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cd3adff5881e9d81a49743fa425157127f46d627","tarball":"http://registry.npmjs.org/background/-/background-0.2.2.tgz"},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"directories":{}},"0.3.0":{"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"name":"background","description":"Background.js provides a background job queue and list with array iterators for Javascript applications.","keywords":["background","backgroundjs","jobs","workers","tasks","javascript","coffeescript"],"url":"http://kmalakoff.github.com/background/","homepage":"http://kmalakoff.github.com/background/","repository":{"type":"git","url":"git://github.com/kmalakoff/background.git"},"main":"background.js","version":"0.3.0","_npmUser":{"name":"kmalakoff","email":"xmann.intl@gmail.com"},"_id":"background@0.3.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2eb0fb15fddc9e249522bb334f745116e4046ec3","tarball":"http://registry.npmjs.org/background/-/background-0.3.0.tgz"},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}]}},"readme":"","maintainers":[{"name":"kmalakoff","email":"xmann.intl@gmail.com"}],"time":{"modified":"2012-07-10T14:45:15.916Z","created":"2012-06-15T11:04:20.585Z","0.2.2":"2012-07-08T11:51:38.139Z","0.3.0":"2012-07-10T14:45:15.916Z"},"author":{"name":"Kevin Malakoff","url":"https://github.com/kmalakoff"},"repository":{"type":"git","url":"git://github.com/kmalakoff/background.git"},"_attachments":{"background-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-Et52vYZgPY9bdpAyxEX9mQ==","length":4781,"stub":true},"background-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-l/X7052JqkwIE3P+uEKe/w==","length":4871,"stub":true}}}},
{"id":"background-magick","key":"background-magick","value":{"rev":"3-09123d834438a499426eb3cc54c97010"},"doc":{"_id":"background-magick","_rev":"3-09123d834438a499426eb3cc54c97010","name":"background-magick","description":"Pipe an image to ImageMagick's composite and add it to a background.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Geert Pasteels","email":"geert.pasteels@gmail.com"},"name":"background-magick","description":"Pipe an image to ImageMagick's composite and add it to a background.","version":"1.0.0","keywords":["imagemagick","background","composite"],"_id":"background-magick@1.0.0","dist":{"shasum":"e916375e7681ad2418f2d590b8218d2efae2cfd3","tarball":"http://registry.npmjs.org/background-magick/-/background-magick-1.0.0.tgz"},"readme":"","maintainers":[{"name":"enome","email":"geert.pasteels@gmail.com"}]}},"readme":"","maintainers":[{"name":"enome","email":"geert.pasteels@gmail.com"}],"time":{"modified":"2012-08-04T18:48:19.618Z","created":"2012-08-04T18:48:17.974Z","1.0.0":"2012-08-04T18:48:19.618Z"},"author":{"name":"Geert Pasteels","email":"geert.pasteels@gmail.com"},"_attachments":{"background-magick-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jwR3ySoqkk0TxuWo2yAisw==","length":7817,"stub":true}}}},
{"id":"backgrounder","key":"backgrounder","value":{"rev":"23-789c2433d681c6ac2fb040ec81b517a7"},"doc":{"_id":"backgrounder","_rev":"23-789c2433d681c6ac2fb040ec81b517a7","name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them; the library also supports callback between processes","dist-tags":{"latest":"0.2.7"},"versions":{"0.0.1":{"name":"backgrounder","description":"","url":"http://github.com/jolia/backgrounder","version":"0.0.1","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmJsonOpts":{"file":"/home/jfk/.npm/backgrounder/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backgrounder@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9b3820b7a0ea489d6dd7edf2f1cd86cbbe04656f","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.0.1.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.0.2":{"name":"backgrounder","description":"","url":"http://github.com/jolia/backgrounder","version":"0.0.2","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmJsonOpts":{"file":"/home/jfk/.npm/backgrounder/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backgrounder@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"852618568b0bb3f845a390a1dde466c204809768","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.0.2.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.0.3":{"name":"backgrounder","description":"","url":"http://github.com/jolia/backgrounder","version":"0.0.3","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmJsonOpts":{"file":"/home/jfk/.npm/backgrounder/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backgrounder@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"961be251dc666960385ddead928953c628601aeb","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.0.3.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.1.0":{"name":"backgrounder","description":"","url":"http://github.com/jolia/backgrounder","version":"0.1.0","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmJsonOpts":{"file":"/home/jfk/.npm/backgrounder/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backgrounder@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ee2aa34b3dec34eb22082507ecef43cf13454d35","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.1.0.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.1.5":{"name":"backgrounder","description":"yet another library for creating background workers; supports multiple independent workers, v0.5 fork API to communicate with them as well as callbacks between processes","url":"http://jolira.github.com/backgrounder/","version":"0.1.5","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmJsonOpts":{"file":"/home/jfk/.npm/backgrounder/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backgrounder@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8a3fddfd856854ca5e8036b857e79d842b3d4089","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.1.5.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.2.0":{"name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them as well as callbacks between processes","url":"http://jolira.github.com/backgrounder/","version":"0.2.0","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmJsonOpts":{"file":"/home/jfk/.npm/backgrounder/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backgrounder@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e92fcfdf6de15999eca38481dc47b3eae20e62c7","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.2.0.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.2.1":{"name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them as well as callbacks between processes","version":"0.2.1","homepage":"http://jolira.github.com/backgrounder/","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"backgrounder@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7b2ebd59b8107d8eab99b3522ae6185f5a97d839","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.2.1.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.2.2":{"name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them; there is also communications API based on callbacks","version":"0.2.2","homepage":"http://jolira.github.com/backgrounder","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":">= 1.1.7"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"backgrounder@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"241de2e1bb5261e571089353549c77386097098d","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.2.2.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.2.4":{"name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them; the library also supports callback between processes","version":"0.2.4","homepage":"http://jolira.github.com/backgrounder","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":"1.1.7"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"backgrounder@0.2.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"411ea806e2910700fbc44e695e09478181991027","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.2.4.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.2.6":{"name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them; the library also supports callback between processes","version":"0.2.6","homepage":"http://jolira.github.com/backgrounder","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":"1.1.7"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"backgrounder@0.2.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"adf3a24fc4965b1dd323968b4b46fccc3ee7b245","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.2.6.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]},"0.2.7":{"name":"backgrounder","description":"yet another library for spawning multiple independent background workers as well as multiple pool of workers, v0.5 fork API to communicate with them; the library also supports callback between processes","version":"0.2.7","homepage":"http://jolira.github.com/backgrounder","author":{"name":"Joachim Kainz","email":"info@jolira.com"},"contributors":[{"name":"Joachim Kainz","email":"info@jolira.com"}],"keywords":["fork","spawn","child","process","worker","webworker"],"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.4.9"},"dependencies":{"underscore":"1.1.7"},"_npmUser":{"name":"jfk","email":"jfk@jolira.com"},"_id":"backgrounder@0.2.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c67b52f3ac9e41644843eee974f351e6f5fbb95c","tarball":"http://registry.npmjs.org/backgrounder/-/backgrounder-0.2.7.tgz"},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}]}},"maintainers":[{"name":"jfk","email":"jfk@jolira.com"}],"time":{"modified":"2011-10-12T15:28:22.055Z","created":"2011-09-25T04:11:20.543Z","0.0.1":"2011-09-25T04:11:21.877Z","0.0.2":"2011-09-26T22:56:30.456Z","0.0.3":"2011-09-28T18:40:13.810Z","0.1.0":"2011-09-28T21:05:50.859Z","0.1.5":"2011-10-02T03:01:00.401Z","0.2.0":"2011-10-03T05:22:26.492Z","0.2.1":"2011-10-03T17:00:01.767Z","0.2.2":"2011-10-04T06:38:43.227Z","0.2.4":"2011-10-06T21:29:05.125Z","0.2.6":"2011-10-11T15:25:24.730Z","0.2.7":"2011-10-12T15:28:22.055Z"},"author":{"name":"Joachim Kainz","email":"info@jolira.com"},"repository":{"type":"git","url":"git://github.com/jolira/backgrounder.git"},"_attachments":{"backgrounder-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-I2eqh3eaSiMa3c5WslMdqw==","length":5773,"stub":true},"backgrounder-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-Sb1v9Cpe5bNacTIYpVm0kw==","length":5741,"stub":true},"backgrounder-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-DIJfgYXVnFv6zJ6UI1Tl5Q==","length":5205,"stub":true},"backgrounder-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ZcHegiINttwEDfRZO5hRkQ==","length":4985,"stub":true},"backgrounder-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-l4geTRgb//9qKjwbbDdXnQ==","length":4856,"stub":true},"backgrounder-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-DHCR1qo0iVygjGQJE741wQ==","length":4850,"stub":true},"backgrounder-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-BrAeVB7R3j+RTFKqXoL+zg==","length":4171,"stub":true},"backgrounder-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fmTXLBKh8o9dBkzkR9t+NQ==","length":4029,"stub":true},"backgrounder-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-CyFpj+eDRNu5t3Re3dCgfA==","length":4014,"stub":true},"backgrounder-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QpMMRw/HlAxdwEMkOjU6bw==","length":4015,"stub":true},"backgrounder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5Kj2ZL3i1I3nkeJpoJiiGA==","length":2700,"stub":true}}}},
{"id":"backnode","key":"backnode","value":{"rev":"3-b40dd42aec2a56bafbae81d7c690c90c"},"doc":{"_id":"backnode","_rev":"3-b40dd42aec2a56bafbae81d7c690c90c","name":"backnode","description":"Express inspired web development framework, built on Backbone and Connect","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"mkklabs"},"name":"backnode","version":"0.1.0","description":"Express inspired web development framework, built on Backbone and Connect","keywords":["backbone","mvc"],"homepage":"https://github.com/mklabs/backnode","repository":{"type":"git","url":"git://github.com/mklabs/backnode.git"},"main":"lib/backnode","engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"underscore":"~1.3.1","backbone":"~0.9.1","connect":"~2.0.2","cfg":"0.0.2","consolidate":"~0.1.0","hogan.js":"~2.0.0"},"devDependencies":{"superagent":"~0.4.0"},"scripts":{"test":"node test/run.js","debug":"node --debug-brk test/run.js"},"_npmUser":{"name":"mklabs","email":"daniel.mickael@gmail.com"},"_id":"backnode@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"32474a865101761568bb5299ae88e06d6754029f","tarball":"http://registry.npmjs.org/backnode/-/backnode-0.1.0.tgz"},"maintainers":[{"name":"mklabs","email":"daniel.mickael@gmail.com"}]}},"readme":"# Backnode\n\n**Experiment on making Backbone usable in Node**. \n\nExpress inspired web development framework, built on\n[Backbone](http://documentcloud.github.com/backbone/) and\n[Connect](http://github.com/senchalabs/connect).\n\n## Synopsis\n\n    var app = backnode();\n\n    var Router = backnode.Router.extend({\n      routes: {\n        '/basic'                  : 'basic',\n        '/json'                   : 'json',\n        'GET /verb'               : 'verb',\n        'POST /verb'              : 'post',\n        '/param/:param'           : 'param',\n        '/pipe'                   : 'pipe'\n      },\n\n      // res is always last argument and is the response object,\n      // wrapping req and next to hook into middleware logic and\n      // eventually end the response.\n      basic: function basic(res) {\n        res.end('basic!');\n      },\n\n      json: function foo(res) {\n        res.json({ message: '' });\n      },\n\n      verb: function verb(res) {\n        res.end('verb!');\n      },\n\n      post: function post(res) {\n        res.end('post!');\n      },\n\n      param: function param(value, res) {\n        res.end(value + '!');\n      },\n\n      render: function render(res) {\n        res.render('index', { foo: 'bar' });\n      },\n\n      view: function view(res) {\n        new backnode.View({ id: 'index.html' }).render(function(e, str) {\n          if(e) return res.next();\n          res.end(str);\n        });\n      },\n\n      pipe: function pipe(res) {\n        new backnode.View({ id: 'index.html' }).pipe(res);\n      },\n\n      model: function model() {\n        var model = new backnode.Model({ name: 'backnode' });\n        new backnode.View({ id: 'index.html', model: model }).pipe(res);\n      }\n    });\n\n    var app = backnode()\n      .use(backnode.favicon())\n      .use(backnode.logger('dev'))\n      .use(backnode.static('public'))\n      .use(backnode.directory('public'))\n      .use(backnode.cookieParser('my secret here'))\n      .use(backnode.session())\n      .use(new Router)\n      .use('/subpath', new Router)\n\n    app.listen(3000);\n\n## Installation\n\n    $ npm install backnode\n\n## Tests\n\n[![Build Status](https://secure.travis-ci.org/mklabs/backnode.png?branch=master)](http://travis-ci.org/mklabs/backnode)\n\n    $ npm test\n\nIt'll run every assertion `test/test-*.js` files.\n\n","maintainers":[{"name":"mklabs","email":"daniel.mickael@gmail.com"}],"time":{"modified":"2012-03-19T02:22:27.123Z","created":"2012-03-19T02:22:24.861Z","0.1.0":"2012-03-19T02:22:27.123Z"},"author":{"name":"mkklabs"},"repository":{"type":"git","url":"git://github.com/mklabs/backnode.git"},"_attachments":{"backnode-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zXwiCaJQ+thMIIYYD/DAPg==","length":31689,"stub":true}}}},
{"id":"backoff","key":"backoff","value":{"rev":"18-31cdac68426ddca23621ae4a49265b39"},"doc":{"_id":"backoff","_rev":"18-31cdac68426ddca23621ae4a49265b39","name":"backoff","description":"Fibonacci and exponential backoffs.","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"backoff","description":"Exponential backoff implementation.","version":"0.0.1","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","exponential"],"repository":{"type":"git","url":"git://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.3","nodeunit":"0.7"},"scripts":{"test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"main":"backoff.js","_npmUser":{"name":"Mathieu","email":"turcotte.mat@gmail.com"},"_id":"backoff@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a2be0d56d658e9297090c4095763c3c6138aff08","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.0.1.tgz"},"maintainers":[{"name":"Mathieu","email":"turcotte.mat@gmail.com"}]},"0.0.2":{"name":"backoff","description":"Exponential backoff implementation.","version":"0.0.2","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","exponential"],"repository":{"type":"git","url":"git://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.3","nodeunit":"0.7"},"scripts":{"test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"main":"backoff.js","_npmUser":{"name":"Mathieu","email":"turcotte.mat@gmail.com"},"_id":"backoff@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"08b4cb64931b0b069f3d5ca8f8e8504fb0058239","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.0.2.tgz"},"maintainers":[{"name":"Mathieu","email":"turcotte.mat@gmail.com"}]},"0.0.3":{"name":"backoff","description":"Exponential backoff implementation.","version":"0.0.3","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","exponential"],"repository":{"type":"git","url":"git://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.3","nodeunit":"0.7","jshint":"0.7"},"scripts":{"pretest":"node_modules/jshint/bin/hint *.js tests/*.js","test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"main":"backoff.js","_npmUser":{"name":"Mathieu","email":"turcotte.mat@gmail.com"},"_id":"backoff@0.0.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8f66d0d5d4138a4a10b6db80e10d1265f93b97b6","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.0.3.tgz"},"maintainers":[{"name":"Mathieu","email":"turcotte.mat@gmail.com"}]},"0.1.0":{"name":"backoff","description":"Fibonnaci backoff implementation.","version":"0.1.0","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","fibonnaci"],"repository":{"type":"git","url":"https://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.4","nodeunit":"0.7","jshint":"0.7"},"scripts":{"pretest":"node_modules/jshint/bin/hint *.js tests/*.js","test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"main":"backoff.js","readme":"# Backoff for Node.js [![Build Status](https://secure.travis-ci.org/MathieuTurcotte/node-backoff.png?branch=master)](http://travis-ci.org/MathieuTurcotte/node-backoff)\n\nFibonnaci backoff implementation for Node.js.\n\n## Installation\n\n```\nnpm install backoff\n```\n## Usage\n\nIn order to use backoff, require `backoff`.\n\n```js\nvar Backoff = require('backoff');\n```\n\n`Backoff` inherits from `EventEmitter`. One can listen for backoff completion\nby listening for `backoff` events. Registered handlers will be called with the\ncurrent backoff number and delay.\n\n``` js\nvar backoff = new Backoff({\n    randomisationFactor: 0,\n    initialDelay: 10,\n    maxDelay: 1000\n});\n\nbackoff.on('backoff', function(number, delay) {\n    console.log(number + ' ' + delay + 'ms');\n\n    if (number < 12) {\n        backoff.backoff();\n    }\n});\n\nbackoff.backoff();\n```\n\nThe previous example would print:\n\n```\n1 10ms\n2 10ms\n3 20ms\n4 30ms\n5 50ms\n6 80ms\n7 130ms\n8 210ms\n9 340ms\n10 550ms\n11 890ms\n12 1000ms\n```\n\nBackoff objects are meant to be instantiated once and reused several times\nby calling `reset` after each successful backoff operation.\n\n## API\n\n### new Backoff([options])\n\nConstruct a new backoff object.\n\n`options` is an object with the following defaults:\n\n```js\noptions = {\n    randomisationFactor: 0,\n    initialDelay: 100,\n    maxDelay: 10000\n};\n```\n\nWith these values, the backoff delay will increase from 100ms to 10000ms. The\nrandomisation factor controls the range of randomness and must be between 0\nand 1. By default, no randomisation is applied on the backoff delay.\n\n### backoff.backoff()\n\nStart a backoff operation. Will throw an error if a backoff operation is already\nin progress.\n\nIn practice, this method should be called after a failed attempt to perform a\nsensitive operation (connecting to a database, downloading a resource over the\nnetwork, etc.).\n\n### backoff.reset()\n\nReset the backoff delay to the initial backoff delay and stop any backoff\noperation in progress. After reset, a backoff instance can and should be\nreused.\n\nIn practice, this method should be called after having successfully completed\nthe sensitive operation guarded by the backoff instance or if the client code\nrequest to stop any reconnection attempt.\n\n### Event: 'backoff'\n\n- number: number of backoff since last reset\n- delay: current backoff delay\n\nEmitted on backoff completion, effectively signaling that the failing operation\nshould be retried.\n\n## License\n\nThis code is free to use under the terms of the [MIT license](http://mturcotte.mit-license.org/).\n","_id":"backoff@0.1.0","dist":{"shasum":"84a21e7c1c305743705a49981aec6b0f0d8bd8f2","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.1.0.tgz"},"maintainers":[{"name":"Mathieu","email":"turcotte.mat@gmail.com"}]},"0.2.0":{"name":"backoff","description":"Exponential and Fibonnaci backoffs.","version":"0.2.0","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","fibonnaci","exponential"],"repository":{"type":"git","url":"https://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.4","nodeunit":"0.7","jshint":"0.7"},"scripts":{"pretest":"node_modules/jshint/bin/hint lib/*.js lib/strategy/*.js tests/*.js","test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"readme":"# Backoff for Node.js [![Build Status](https://secure.travis-ci.org/MathieuTurcotte/node-backoff.png?branch=master)](http://travis-ci.org/MathieuTurcotte/node-backoff)\n\nBackoff implementation for Node.js.\n\n## Installation\n\n```\nnpm install backoff\n```\n## Usage\n\nIn order to use backoff, require `backoff`.\n\n```js\nvar backoff = require('backoff');\n```\n\nThe usual way to instantiate a new `Backoff` object is to use one predefined\nfactory method: `backoff.fibonnaci([options])`, `backoff.exponential([options])`.\n\n`Backoff` inherits from `EventEmitter`. One can listen for backoff completion\nby listening for `backoff` events. Registered handlers will be called with the\ncurrent backoff number and delay.\n\n``` js\nvar fibonnaciBackoff = backoff.fibonnaci({\n    initialDelay: 10,\n    maxDelay: 1000\n});\n\nfibonnaciBackoff.on('backoff', function(number, delay) {\n    console.log(number + ' ' + delay + 'ms');\n\n    if (number < 15) {\n        fibonnaciBackoff.backoff();\n    }\n});\n\nfibonnaciBackoff.backoff();\n```\n\nThe previous example would print:\n\n```\n0 10ms\n1 10ms\n2 20ms\n3 30ms\n4 50ms\n5 80ms\n6 130ms\n7 210ms\n8 340ms\n9 550ms\n10 890ms\n11 1000ms\n12 1000ms\n13 1000ms\n14 1000ms\n15 1000ms\n```\n\nBackoff objects are meant to be instantiated once and reused several times\nby calling `reset` after each successful backoff operation.\n\n## API\n\n### backoff.exponential([options])\n\nConstructs an exponential backoff (10, 20, 40, 80, etc.).\n\n`options` is an object with the following defaults:\n\n```js\noptions = {\n    randomisationFactor: 0,\n    initialDelay: 100,\n    maxDelay: 10000\n};\n```\n\nWith these values, the backoff delay will increase from 100ms to 10000ms. The\nrandomisation factor controls the range of randomness and must be between 0\nand 1. By default, no randomisation is applied on the backoff delay.\n\n### backoff.fibonnaci([options])\n\nConstructs a Fibonnaci backoff (10, 10, 20, 30, 50, etc.).\n\nThe Fibonnaci backoff has the same set of options as the exponential backoff.\n\n### Class Backoff\n\n#### new Backoff(strategy)\n\n- strategy: the backoff strategy to use\n\nConstructs a new backoff object from a specific backoff strategy. The backoff\nstrategy must implement the `BackoffStrategy` interface defined bellow.\n\n#### backoff.backoff()\n\nStarts a backoff operation. Will throw an error if a backoff operation is\nalready in progress.\n\nIn practice, this method should be called after a failed attempt to perform a\nsensitive operation (connecting to a database, downloading a resource over the\nnetwork, etc.).\n\n#### backoff.reset()\n\nResets the backoff delay to the initial backoff delay and stop any backoff\noperation in progress. After reset, a backoff instance can and should be\nreused.\n\nIn practice, this method should be called after having successfully completed\nthe sensitive operation guarded by the backoff instance or if the client code\nrequest to stop any reconnection attempt.\n\n#### Event: 'backoff'\n\n- number: number of backoff since last reset\n- delay: current backoff delay\n\nEmitted on backoff completion, effectively signaling that the failing operation\nshould be retried.\n\n### Interface BackoffStrategy\n\nA backoff strategy must provide the following methods.\n\n#### strategy.next()\n\nComputes and returns the next backoff delay.\n\n#### strategy.reset()\n\nReset the backoff delay to its initial value.\n\n## License\n\nThis code is free to use under the terms of the [MIT license](http://mturcotte.mit-license.org/).\n","_id":"backoff@0.2.0","dist":{"shasum":"1abbe9393a28dd35d55c5403ec132472136b21ce","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.2.0.tgz"},"maintainers":[{"name":"Mathieu","email":"turcotte.mat@gmail.com"}]},"0.2.1":{"name":"backoff","description":"Exponential and Fibonacci backoffs.","version":"0.2.1","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","fibonacci","exponential"],"repository":{"type":"git","url":"https://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.4","nodeunit":"0.7","jshint":"0.7"},"scripts":{"pretest":"node_modules/jshint/bin/hint lib/*.js lib/strategy/*.js tests/*.js","test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"readme":"# Backoff for Node.js [![Build Status](https://secure.travis-ci.org/MathieuTurcotte/node-backoff.png?branch=master)](http://travis-ci.org/MathieuTurcotte/node-backoff)\n\nBackoff implementation for Node.js.\n\n## Installation\n\n```\nnpm install backoff\n```\n## Usage\n\nIn order to use backoff, require `backoff`.\n\n```js\nvar backoff = require('backoff');\n```\n\nThe usual way to instantiate a new `Backoff` object is to use one predefined\nfactory method: `backoff.fibonacci([options])`, `backoff.exponential([options])`.\n\n`Backoff` inherits from `EventEmitter`. One can listen for backoff completion\nby listening for `backoff` events. Registered handlers will be called with the\ncurrent backoff number and delay.\n\n``` js\nvar fibonacciBackoff = backoff.fibonacci({\n    initialDelay: 10,\n    maxDelay: 1000\n});\n\nfibonacciBackoff.on('backoff', function(number, delay) {\n    console.log(number + ' ' + delay + 'ms');\n\n    if (number < 15) {\n        fibonacciBackoff.backoff();\n    }\n});\n\nfibonacciBackoff.backoff();\n```\n\nThe previous example would print:\n\n```\n0 10ms\n1 10ms\n2 20ms\n3 30ms\n4 50ms\n5 80ms\n6 130ms\n7 210ms\n8 340ms\n9 550ms\n10 890ms\n11 1000ms\n12 1000ms\n13 1000ms\n14 1000ms\n15 1000ms\n```\n\nBackoff objects are meant to be instantiated once and reused several times\nby calling `reset` after each successful backoff operation.\n\n## API\n\n### backoff.exponential([options])\n\nConstructs an exponential backoff (10, 20, 40, 80, etc.).\n\n`options` is an object with the following defaults:\n\n```js\noptions = {\n    randomisationFactor: 0,\n    initialDelay: 100,\n    maxDelay: 10000\n};\n```\n\nWith these values, the backoff delay will increase from 100ms to 10000ms. The\nrandomisation factor controls the range of randomness and must be between 0\nand 1. By default, no randomisation is applied on the backoff delay.\n\n### backoff.fibonacci([options])\n\nConstructs a Fibonacci backoff (10, 10, 20, 30, 50, etc.).\n\nThe Fibonacci backoff has the same set of options as the exponential backoff.\n\n### Class Backoff\n\n#### new Backoff(strategy)\n\n- strategy: the backoff strategy to use\n\nConstructs a new backoff object from a specific backoff strategy. The backoff\nstrategy must implement the `BackoffStrategy` interface defined bellow.\n\n#### backoff.backoff()\n\nStarts a backoff operation. Will throw an error if a backoff operation is\nalready in progress.\n\nIn practice, this method should be called after a failed attempt to perform a\nsensitive operation (connecting to a database, downloading a resource over the\nnetwork, etc.).\n\n#### backoff.reset()\n\nResets the backoff delay to the initial backoff delay and stop any backoff\noperation in progress. After reset, a backoff instance can and should be\nreused.\n\nIn practice, this method should be called after having successfully completed\nthe sensitive operation guarded by the backoff instance or if the client code\nrequest to stop any reconnection attempt.\n\n#### Event: 'backoff'\n\n- number: number of backoff since last reset\n- delay: current backoff delay\n\nEmitted on backoff completion, effectively signaling that the failing operation\nshould be retried.\n\n### Interface BackoffStrategy\n\nA backoff strategy must provide the following methods.\n\n#### strategy.next()\n\nComputes and returns the next backoff delay.\n\n#### strategy.reset()\n\nReset the backoff delay to its initial value.\n\n## License\n\nThis code is free to use under the terms of the [MIT license](http://mturcotte.mit-license.org/).\n","_id":"backoff@0.2.1","dist":{"shasum":"affea29debd29fe48680019b9967e84c636e799d","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.2.1.tgz"},"maintainers":[{"name":"mathieu","email":"turcotte.mat@gmail.com"}]},"0.3.0":{"name":"backoff","description":"Fibonacci and exponential backoffs.","version":"0.3.0","author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"keywords":["backoff","fibonacci","exponential"],"repository":{"type":"git","url":"https://github.com/MathieuTurcotte/node-backoff.git"},"devDependencies":{"sinon":"1.4","nodeunit":"0.7","jshint":"0.7"},"scripts":{"pretest":"node_modules/jshint/bin/hint lib/*.js lib/strategy/*.js tests/*.js","test":"node_modules/nodeunit/bin/nodeunit tests/"},"engines":{"node":">= 0.6"},"readme":"# Backoff for Node.js [![Build Status](https://secure.travis-ci.org/MathieuTurcotte/node-backoff.png?branch=master)](http://travis-ci.org/MathieuTurcotte/node-backoff)\n\nFibonacci and exponential backoffs for Node.js.\n\n## Installation\n\n```\nnpm install backoff\n```\n## Usage\n\nIn order to use backoff, require `backoff`.\n\n```js\nvar backoff = require('backoff');\n```\n\nThe usual way to instantiate a new `Backoff` object is to use one predefined\nfactory method: `backoff.fibonacci([options])`, `backoff.exponential([options])`.\n\n`Backoff` inherits from `EventEmitter`. One can listen for backoff completion\nby listening for `backoff` events. Registered handlers will be called with the\ncurrent backoff number and delay.\n\n``` js\nvar fibonacciBackoff = backoff.fibonacci({\n    initialDelay: 10,\n    maxDelay: 1000\n});\n\nfibonacciBackoff.on('backoff', function(number, delay) {\n    console.log(number + ' ' + delay + 'ms');\n\n    if (number < 15) {\n        fibonacciBackoff.backoff();\n    }\n});\n\nfibonacciBackoff.backoff();\n```\n\nThe previous example would print:\n\n```\n0 10ms\n1 10ms\n2 20ms\n3 30ms\n4 50ms\n5 80ms\n6 130ms\n7 210ms\n8 340ms\n9 550ms\n10 890ms\n11 1000ms\n12 1000ms\n13 1000ms\n14 1000ms\n15 1000ms\n```\n\nBackoff objects are meant to be instantiated once and reused several times\nby calling `reset` after each successful backoff operation.\n\n## API\n\n### backoff.exponential([options])\n\nConstructs an exponential backoff (10, 20, 40, 80, etc.).\n\n`options` is an object with the following defaults:\n\n```js\noptions = {\n    randomisationFactor: 0,\n    initialDelay: 100,\n    maxDelay: 10000\n};\n```\n\nWith these values, the backoff delay will increase from 100ms to 10000ms. The\nrandomisation factor controls the range of randomness and must be between 0\nand 1. By default, no randomisation is applied on the backoff delay.\n\n### backoff.fibonacci([options])\n\nConstructs a Fibonacci backoff (10, 10, 20, 30, 50, etc.).\n\nThe Fibonacci backoff has the same set of options as the exponential backoff.\n\n### Class Backoff\n\n#### new Backoff(strategy)\n\n- strategy: the backoff strategy to use\n\nConstructs a new backoff object from a specific backoff strategy. The backoff\nstrategy must implement the `BackoffStrategy`interface defined bellow.\n\n#### backoff.backoff()\n\nStarts a backoff operation. Will throw an error if a backoff operation is\nalready in progress.\n\nIn practice, this method should be called after a failed attempt to perform a\nsensitive operation (connecting to a database, downloading a resource over the\nnetwork, etc.).\n\n#### backoff.reset()\n\nResets the backoff delay to the initial backoff delay and stop any backoff\noperation in progress. After reset, a backoff instance can and should be\nreused.\n\nIn practice, this method should be called after having successfully completed\nthe sensitive operation guarded by the backoff instance or if the client code\nrequest to stop any reconnection attempt.\n\n#### Event: 'backoff'\n\n- number: number of backoff since last reset\n- delay: current backoff delay\n\nEmitted on backoff completion, effectively signaling that the failing operation\nshould be retried.\n\n### Interface BackoffStrategy\n\nA backoff strategy must provide the following methods.\n\n#### strategy.next()\n\nComputes and returns the next backoff delay.\n\n#### strategy.reset()\n\nResets the backoff delay to its initial value.\n\n### Class ExponentialStrategy\n\nExponential (10, 20, 40, 80, etc.) backoff strategy implementation.\n\n#### new ExponentialStrategy([options])\n\nThe options are:\n\n- randomisationFactor: defaults to 0, must be between 0 and 1\n- initialDelay: defaults to 100 ms\n- maxDelay: defaults to 10000 ms\n\n### Class FibonacciStrategy\n\nFibonnaci (10, 10, 20, 30, 50, etc.) backoff strategy implementation.\n\n#### new FibonacciStrategy([options])\n\nThe options are:\n\n- randomisationFactor: defaults to 0, must be between 0 and 1\n- initialDelay: defaults to 100 ms\n- maxDelay: defaults to 10000 ms\n\n## License\n\nThis code is free to use under the terms of the [MIT license](http://mturcotte.mit-license.org/).\n","_id":"backoff@0.3.0","dist":{"shasum":"d63cbab90b0475d3ccf2fac929e11af963a96608","tarball":"http://registry.npmjs.org/backoff/-/backoff-0.3.0.tgz"},"maintainers":[{"name":"mathieu","email":"turcotte.mat@gmail.com"}]}},"readme":"# Exponential backoff implementation for Node.js\n\nAn exponential backoff implementation for Node.js.\n\n## Installation\n\n```\nnpm install backoff\n```\n## Usage\n\nThe Backoff object inherits from EventEmitter. One can listen for\nbackoff completion by listening for 'backoff' events. Registered handlers\nwill be called with the current backoff number and delay.\n\n``` js\nvar Backoff = require('backoff');\n\nvar backoff = new Backoff();\n\nbackoff.on('backoff', function(number, delay) {\n    // Retry operation...\n    backoff.backoff();\n});\n\nbackoff.backoff();\n```\n\nIt's also possible to reset 'Backoff' instance. Once reset, a 'Backoff'\ninstance can be reused. On reset, the 'reset' event will be emitted.\n\n```js\nvar Backoff = require('backoff');\n\nvar backoff = new Backoff();\n\nbackoff.on('backoff', function(number, delay) {\n    backoff.backoff();\n});\n\nbackoff.on('reset', function() {\n    console.log('reset');\n});\n\nbackoff.backoff();\n\nsetTimeout(function() {\n    backoff.reset();\n}, 5000);\n```\n\n","maintainers":[{"name":"mathieu","email":"turcotte.mat@gmail.com"}],"time":{"modified":"2012-08-10T16:33:30.276Z","created":"2012-04-20T01:04:30.744Z","0.0.1":"2012-04-20T01:04:31.437Z","0.0.2":"2012-04-24T19:14:30.591Z","0.0.3":"2012-06-27T22:32:10.567Z","0.1.0":"2012-07-25T12:33:33.583Z","0.2.0":"2012-07-27T02:55:58.435Z","0.2.1":"2012-08-07T22:27:47.797Z","0.3.0":"2012-08-10T16:33:30.276Z"},"author":{"name":"Mathieu Turcotte","email":"turcotte.mat@gmail.com"},"repository":{"type":"git","url":"https://github.com/MathieuTurcotte/node-backoff.git"},"users":{"fgribreau":true},"_attachments":{"backoff-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-ATda2jbvHRcNUYFIMEj8UA==","length":7248,"stub":true},"backoff-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-jQhxiB2XDuJyAZSUdyfLUw==","length":7180,"stub":true},"backoff-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-1IZ0+hhbri5FyttrlUVURQ==","length":7010,"stub":true},"backoff-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-KnjHhdrWGG9ew4CnoNx0nQ==","length":5502,"stub":true},"backoff-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4w0ogACwVMMw4RpksmDDOA==","length":5146,"stub":true},"backoff-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pEflpLVdicLbXaz3kRXMLA==","length":3513,"stub":true},"backoff-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NFKuKyQyKHPTJ9y39BEuWg==","length":2840,"stub":true}}}},
{"id":"backpacker","key":"backpacker","value":{"rev":"5-815df8531be7f2af2e314c360a536e86"},"doc":{"_id":"backpacker","_rev":"5-815df8531be7f2af2e314c360a536e86","name":"backpacker","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"author":{"name":"Mark Engel"},"name":"backpacker","version":"1.0.0","dependencies":{"underscore":"1.3"},"main":"lib/backpacker","_npmUser":{"name":"mren","email":"mark.c.engel@gmail.com"},"_id":"backpacker@1.0.0","devDependencies":{"nodeunit":"*"},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8be03654a2c14f5d752f1a6d6f88199a027fe7f4","tarball":"http://registry.npmjs.org/backpacker/-/backpacker-1.0.0.tgz"},"maintainers":[{"name":"mren","email":"mark.c.engel@gmail.com"}]},"1.0.1":{"author":{"name":"Mark Engel","email":"mark.c.engel@gmail.com","url":"https://github.com/mren"},"name":"backpacker","version":"1.0.1","dependencies":{"underscore":"1.3"},"devDependencies":{},"main":"lib/backpacker","readme":"backpacker\n======\n\nsimple rails inspired barebone router.\nbackpacker is as minimalistic as routing can get.\nI build this module as an foundation for an more usable router middleware.\n","_id":"backpacker@1.0.1","description":"backpacker ======","dist":{"shasum":"59af7fd1525e2c66a7fbae907d721e297a9e7309","tarball":"http://registry.npmjs.org/backpacker/-/backpacker-1.0.1.tgz"},"maintainers":[{"name":"mren","email":"mark.c.engel@gmail.com"}]}},"readme":"backpacker\n======\n\nsimple rails inspired barebone router.\nbackpacker is as minimalistic as routing can get.\nI build this module as an foundation for an more usable router middleware.\n","maintainers":[{"name":"mren","email":"mark.c.engel@gmail.com"}],"time":{"modified":"2012-08-13T12:12:09.823Z","created":"2012-06-19T11:57:45.298Z","1.0.0":"2012-06-19T11:57:54.748Z","1.0.1":"2012-08-13T12:12:09.823Z"},"author":{"name":"Mark Engel","email":"mark.c.engel@gmail.com","url":"https://github.com/mren"},"description":"backpacker ======","_attachments":{"backpacker-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-E/e35XUgZaDy8zjJzmD7mg==","length":1515,"stub":true},"backpacker-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ohy0pZrO96yp7SYVcdgFWA==","length":1459,"stub":true}}}},
{"id":"backpassage","key":"backpassage","value":{"rev":"7-f374ecf666664285720afa91b6268c9a"},"doc":{"_id":"backpassage","_rev":"7-f374ecf666664285720afa91b6268c9a","name":"backpassage","description":"A TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"author":{"name":"Peter Lejeck","email":"peter.lejeck@gmail.com"},"name":"backpassage","description":"A TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.","version":"0.1.0","repository":{"url":"git://github.com/NuckChorris/BackPassage.git"},"dependencies":{"underscore":"1.3.x"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# BackPassage\nA Node.js TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.\n\nAlso butts.\n\n**>>> UNSTABLE, MIGHT SHIT ALL OVER <<<**\n\n## Install\n*(soon, but not yet)*\n\n\t$ npm install backpassage\n\n## Test\nI haven't written the tests yet, but they will be written using [Mocha](https://github.com/visionmedia/mocha) and [Should](https://github.com/visionmedia/should.js).\n\n## Use\nUsing this is incredibly easy, having an API based on a combination of EventEmitters and TCP Sockets.\n\n## Example\nThe following example shows the two ends of a connection, the client and server, setting up a connection, then creating an annoying feedback loop.\n\n### Server Server\n```javascript\nvar backpassage = require('backpassage');\n\nbackpassage.createServer(function (socket) {\n\tconsole.log('connected');\n\tsocket.on('probe', function () {\n\t\tsocket.emit('accept');\n\t});\n}).listen(4567);\n```\n\n### Client Server\n```javascript\nvar backpassage = require('backpassage');\nvar client = backpassage.createConnection(4567);\n\nclient.emit('probe');\nclient.on('accept', function () {\n\tclient.emit('probe');\n});","_id":"backpassage@0.1.0","dist":{"shasum":"fa1eb39b476289bf4489326d1d4ea8c67c558f65","tarball":"http://registry.npmjs.org/backpassage/-/backpassage-0.1.0.tgz"},"maintainers":[{"name":"nuck","email":"peter.lejeck@gmail.com"}]},"0.2.0":{"author":{"name":"Peter Lejeck","email":"peter.lejeck@gmail.com"},"name":"backpassage","description":"A TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.","version":"0.2.0","repository":{"url":"git://github.com/NuckChorris/BackPassage.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# BackPassage\nA Node.js TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.\n\nAlso butts.\n\n**>>> UNSTABLE, MIGHT SHIT ALL OVER <<<**\n\n## Install\n*(soon, but not yet)*\n\n\t$ npm install backpassage\n\n## Test\nI haven't written the tests yet, but they will be written using [Mocha](https://github.com/visionmedia/mocha) and [Should](https://github.com/visionmedia/should.js).\n\n## Use\nUsing this is incredibly easy, having an API based on a combination of EventEmitters and TCP Sockets.\n\n## Example\nThe following example shows the two ends of a connection, the client and server, setting up a connection, then creating an annoying feedback loop.\n\n### Server Server\n```javascript\nvar backpassage = require('backpassage');\n\nbackpassage.createServer(function (socket) {\n\tconsole.log('connected');\n\tsocket.on('probe', function () {\n\t\tsocket.emit('accept');\n\t});\n}).listen(4567);\n```\n\n### Client Server\n```javascript\nvar backpassage = require('backpassage');\nvar client = backpassage.createConnection(4567);\n\nclient.emit('probe');\nclient.on('accept', function () {\n\tclient.emit('probe');\n});","_id":"backpassage@0.2.0","dist":{"shasum":"297fe571e08e148f28ffb8aa6c48f70500b36669","tarball":"http://registry.npmjs.org/backpassage/-/backpassage-0.2.0.tgz"},"maintainers":[{"name":"nuck","email":"peter.lejeck@gmail.com"}]},"0.2.1":{"author":{"name":"Peter Lejeck","email":"peter.lejeck@gmail.com"},"name":"backpassage","description":"A TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.","version":"0.2.1","repository":{"url":"git://github.com/NuckChorris/BackPassage.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# BackPassage\nA Node.js TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.\n\nAlso butts.\n\n**>>> UNSTABLE, MIGHT SHIT ALL OVER <<<**\n\n## Install\n*(soon, but not yet)*\n\n\t$ npm install backpassage\n\n## Test\nI haven't written the tests yet, but they will be written using [Mocha](https://github.com/visionmedia/mocha) and [Should](https://github.com/visionmedia/should.js).\n\n## Use\nUsing this is incredibly easy, having an API based on a combination of EventEmitters and TCP Sockets.\n\n## Example\nThe following example shows the two ends of a connection, the client and server, setting up a connection, then creating an annoying feedback loop.\n\n### Server Server\n```javascript\nvar backpassage = require('backpassage');\n\nbackpassage.createServer(function (socket) {\n\tconsole.log('connected');\n\tsocket.on('probe', function () {\n\t\tsocket.emit('accept');\n\t});\n}).listen(4567);\n```\n\n### Client Server\n```javascript\nvar backpassage = require('backpassage');\nvar client = backpassage.createConnection(4567);\n\nclient.emit('probe');\nclient.on('accept', function () {\n\tclient.emit('probe');\n});","_id":"backpassage@0.2.1","dist":{"shasum":"0574b9230c495a8e1a737c10060e0114b5902c5c","tarball":"http://registry.npmjs.org/backpassage/-/backpassage-0.2.1.tgz"},"maintainers":[{"name":"nuck","email":"peter.lejeck@gmail.com"}]}},"readme":"# BackPassage\nA Node.js TCP/TLS communications system styled after socket.io, aimed at bidirectional inter-server communications.\n\nAlso butts.\n\n**>>> UNSTABLE, MIGHT SHIT ALL OVER <<<**\n\n## Install\n*(soon, but not yet)*\n\n\t$ npm install backpassage\n\n## Test\nI haven't written the tests yet, but they will be written using [Mocha](https://github.com/visionmedia/mocha) and [Should](https://github.com/visionmedia/should.js).\n\n## Use\nUsing this is incredibly easy, having an API based on a combination of EventEmitters and TCP Sockets.\n\n## Example\nThe following example shows the two ends of a connection, the client and server, setting up a connection, then creating an annoying feedback loop.\n\n### Server Server\n```javascript\nvar backpassage = require('backpassage');\n\nbackpassage.createServer(function (socket) {\n\tconsole.log('connected');\n\tsocket.on('probe', function () {\n\t\tsocket.emit('accept');\n\t});\n}).listen(4567);\n```\n\n### Client Server\n```javascript\nvar backpassage = require('backpassage');\nvar client = backpassage.createConnection(4567);\n\nclient.emit('probe');\nclient.on('accept', function () {\n\tclient.emit('probe');\n});","maintainers":[{"name":"nuck","email":"peter.lejeck@gmail.com"}],"time":{"modified":"2012-07-21T05:53:34.347Z","created":"2012-07-18T10:52:22.174Z","0.1.0":"2012-07-18T10:52:23.630Z","0.2.0":"2012-07-20T09:30:15.433Z","0.2.1":"2012-07-21T05:53:34.347Z"},"author":{"name":"Peter Lejeck","email":"peter.lejeck@gmail.com"},"repository":{"url":"git://github.com/NuckChorris/BackPassage.git"},"_attachments":{"backpassage-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8yDh8pvkLLRW2IKiTnZKVA==","length":1792,"stub":true},"backpassage-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-A3pOCYBmtVkHQ472GtAxGA==","length":2231,"stub":true},"backpassage-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kelzQNxbaVOgu9TaEbgYIg==","length":1928,"stub":true}}}},
{"id":"backplane","key":"backplane","value":{"rev":"7-f69188dac21e007b09efe1b5b3575087"},"doc":{"_id":"backplane","_rev":"7-f69188dac21e007b09efe1b5b3575087","name":"backplane","description":"Backplane module for node","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"backplane","description":"Backplane module for node","version":"0.0.1","repository":{"type":"git","url":"git://github.com/digitalbutter/node-backplane.git"},"author":{"name":"Ed Bosher","email":"ed@tikibooth.com"},"contributors":[{"name":"Ed Bosher","email":"ed@tikibooth.com"},{"name":"Emmanuel Prochasson","email":"emmanuel@tikibooth.com"}],"scripts":{"test":"node specs.js"},"engines":{"node":"0.4.0"},"files":[""],"main":"./index","_id":"backplane@0.0.1","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"_defaultsLoaded":true,"dist":{"shasum":"8d212c198e615340cabb3d42941e62b7deba8276","tarball":"http://registry.npmjs.org/backplane/-/backplane-0.0.1.tgz"}},"0.0.3":{"name":"backplane","description":"Backplane module for node","version":"0.0.3","repository":{"type":"git","url":"git://github.com/digitalbutter/node-backplane.git"},"author":{"name":"Ed Bosher","email":"ed@tikibooth.com"},"contributors":[{"name":"Ed Bosher","email":"ed@tikibooth.com"},{"name":"Emmanuel Prochasson","email":"emmanuel@tikibooth.com"}],"scripts":{"test":"node specs.js"},"engines":{"node":">=0.4.0"},"dependencies":{"traits":""},"main":"./lib/","directories":{"lib":"./lib/"},"_id":"backplane@0.0.3","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"94aff70346742b0b7189021cd6e407afdb22fde5","tarball":"http://registry.npmjs.org/backplane/-/backplane-0.0.3.tgz"}},"0.0.4":{"name":"backplane","description":"Backplane module for node","version":"0.0.4","repository":{"type":"git","url":"git://github.com/digitalbutter/node-backplane.git"},"author":{"name":"Ed Bosher","email":"ed@tikibooth.com"},"contributors":[{"name":"Ed Bosher","email":"ed@tikibooth.com"},{"name":"Emmanuel Prochasson","email":"emmanuel@tikibooth.com"}],"scripts":{"test":"node specs.js"},"engines":{"node":">=0.4.0"},"dependencies":{"traits":""},"main":"./lib/","directories":{"lib":"./lib/"},"_id":"backplane@0.0.4","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.7","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4983fbbaf8b6299b10f2c75cfe46c0f491592eb9","tarball":"http://registry.npmjs.org/backplane/-/backplane-0.0.4.tgz"}}},"maintainers":[{"name":"eprochasson","email":"eprochasson@gmail.com"}],"time":{"modified":"2011-05-03T09:33:32.295Z","created":"2011-03-18T08:58:32.617Z","0.0.1":"2011-03-18T08:58:33.450Z","0.0.3":"2011-04-12T09:48:02.476Z","0.0.4":"2011-05-03T09:33:32.295Z"},"author":{"name":"Ed Bosher","email":"ed@tikibooth.com"},"repository":{"type":"git","url":"git://github.com/digitalbutter/node-backplane.git"},"_attachments":{"backplane-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-cx/dUrgvPFz6Wq4RFn2xlA==","length":27764,"stub":true},"backplane-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-EcALhNlErjx5r/Le2UcXuw==","length":25665,"stub":true},"backplane-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IetZneOVH1iNjqAwLUhpEQ==","length":14424,"stub":true}}}},
{"id":"backport-0.4","key":"backport-0.4","value":{"rev":"11-25e15f01f1ef9e626433a82284bc00d6"},"doc":{"_id":"backport-0.4","_rev":"11-25e15f01f1ef9e626433a82284bc00d6","name":"backport-0.4","description":"node.js core modules with backported fixes","dist-tags":{"latest":"0.4.11-1"},"versions":{"0.4.9-1":{"name":"backport-0.4","main":"./lib/load.js","version":"0.4.9-1","description":"core modules with fixes backported from node v0.5","engines":{"node":">=0.4.x"},"homepage":"https://github.com/SaltwaterC/backport-0.4","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"_npmJsonOpts":{"file":"/home/saltwater/.npm/backport-0.4/0.4.9-1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backport-0.4@0.4.9-1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.16","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"65185da27c9032fc165c48262a36310d389ef0af","tarball":"http://registry.npmjs.org/backport-0.4/-/backport-0.4-0.4.9-1.tgz"},"scripts":{}},"0.4.9-2":{"name":"backport-0.4","main":"./lib/load.js","version":"0.4.9-2","description":"node.js core modules with fixes backported from node v0.5.x","engines":{"node":">=0.4.9 <0.5.0"},"homepage":"https://github.com/SaltwaterC/backport-0.4","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/backport-0.4.git"},"keywords":["backport","node","core","library","http","https","tls"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/backport-0.4/0.4.9-2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backport-0.4@0.4.9-2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"cf7fd11d5b69e71d307d25de0d69732ccbc14112","tarball":"http://registry.npmjs.org/backport-0.4/-/backport-0.4-0.4.9-2.tgz"},"scripts":{}},"0.4.10-1":{"name":"backport-0.4","main":"./lib/load.js","version":"0.4.10-1","description":"node.js core modules with backported fixes","engines":{"node":">=0.4.10 <0.5.0"},"homepage":"https://github.com/SaltwaterC/backport-0.4","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/backport-0.4.git"},"keywords":["backport","node","core","library","http","https"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/backport-0.4/0.4.10-1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backport-0.4@0.4.10-1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9a7d12009b106c6d554ee63bb84920c64f8202b3","tarball":"http://registry.npmjs.org/backport-0.4/-/backport-0.4-0.4.10-1.tgz"},"scripts":{}},"0.4.10-2":{"name":"backport-0.4","main":"./lib/load.js","version":"0.4.10-2","description":"node.js core modules with backported fixes","engines":{"node":">=0.4.10 <0.5.0"},"homepage":"https://github.com/SaltwaterC/backport-0.4","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/backport-0.4.git"},"keywords":["backport","node","core","library","http","https"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/backport-0.4/0.4.10-2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backport-0.4@0.4.10-2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c7e82a7dfc9c1be344df93e5dec26b571b8a4449","tarball":"http://registry.npmjs.org/backport-0.4/-/backport-0.4-0.4.10-2.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]},"0.4.11-1":{"name":"backport-0.4","main":"./lib/load.js","version":"0.4.11-1","description":"node.js core modules with backported fixes","engines":{"node":">=0.4.9 <0.5.0"},"homepage":"https://github.com/SaltwaterC/backport-0.4","author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/backport-0.4.git"},"keywords":["backport","node","core","library","http","https"],"_npmJsonOpts":{"file":"/home/saltwater/.npm/backport-0.4/0.4.11-1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backport-0.4@0.4.11-1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"96808fb707cb9d4a2a63a75f20c7457317ad6ac7","tarball":"http://registry.npmjs.org/backport-0.4/-/backport-0.4-0.4.11-1.tgz"},"scripts":{},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}]}},"maintainers":[{"name":"saltwaterc","email":"saltwaterc@gmail.com"}],"time":{"modified":"2011-09-02T07:13:15.725Z","created":"2011-07-17T12:13:43.010Z","0.4.9-1":"2011-07-17T12:13:43.744Z","0.4.9-2":"2011-07-19T10:43:23.028Z","0.4.10-1":"2011-07-26T14:57:58.468Z","0.4.10-2":"2011-08-11T09:30:19.418Z","0.4.11-1":"2011-09-02T07:13:15.725Z"},"author":{"name":"Stefan Rusu","url":"http://www.saltwaterc.eu/"},"repository":{"type":"git","url":"git://github.com/SaltwaterC/backport-0.4.git"},"_attachments":{"backport-0.4-0.4.11-1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IxA+rKbVbTpVmLnsgVazaw==","length":14917,"stub":true},"backport-0.4-0.4.10-2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ykl7wn67btO9s2gpHj+dVQ==","length":15010,"stub":true},"backport-0.4-0.4.10-1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-B2aVcM/HVpR3PWQn+22Zqg==","length":14851,"stub":true},"backport-0.4-0.4.9-2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BxsnWhW8lhHcmR6RtJXshw==","length":21394,"stub":true},"backport-0.4-0.4.9-1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yjk3WWQeotN6+U6on/ZVvQ==","length":20476,"stub":true}}}},
{"id":"backstretch","key":"backstretch","value":{"rev":"3-d967d9c325197a956bce82f4edc7df82"},"doc":{"_id":"backstretch","_rev":"3-d967d9c325197a956bce82f4edc7df82","name":"backstretch","description":"add a dynamically-resized background image to any page","dist-tags":{"latest":"1.2.2"},"versions":{"1.2.2":{"name":"backstretch","description":"add a dynamically-resized background image to any page","version":"1.2.2","homepage":"http://srobbin.com/jquery-plugins/jquery-backstretch/","author":{"name":"Scott Robin"},"contributors":[{"name":"Humza Yaqoob"}],"main":"./ender.backstretch.js","keywords":["ender","image"],"ender":"noop","repository":{"type":"git","url":"git://github.com/secondplanet/ender-backstretch.git"},"_npmJsonOpts":{"file":"/Users/humza/.npm/backstretch/1.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backstretch@1.2.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"ddf5a6321341b2ea3faf3a63d7e4849fdb5ea24b","tarball":"http://registry.npmjs.org/backstretch/-/backstretch-1.2.2.tgz"},"maintainers":[{"name":"secondplanet","email":"contact@secondplanetanimation.com"}]}},"maintainers":[{"name":"secondplanet","email":"contact@secondplanetanimation.com"}],"time":{"modified":"2011-10-04T00:36:17.791Z","created":"2011-10-04T00:36:17.215Z","1.2.2":"2011-10-04T00:36:17.791Z"},"author":{"name":"Scott Robin"},"repository":{"type":"git","url":"git://github.com/secondplanet/ender-backstretch.git"},"_attachments":{"backstretch-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jHpho+EvlIOpdO0eFXmwgw==","length":8372,"stub":true}}}},
{"id":"backtrack","key":"backtrack","value":{"rev":"3-30f4e9def0c899fe0dd308c82d56bfa1"},"doc":{"_id":"backtrack","_rev":"3-30f4e9def0c899fe0dd308c82d56bfa1","name":"backtrack","description":"simple backtracking sat solver","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Russ Frank","email":"me@russfrank.us"},"name":"backtrack","description":"simple backtracking sat solver","version":"0.0.0","repository":{"type":"git","url":"github.com:russfrank/backtrack"},"scripts":{"test":"mocha -R spec -u tdd test.js"},"main":"./backtrack","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"russfrank","email":"me@russfrank.us"},"_id":"backtrack@0.0.0","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"386e5fa470ef1a6ddc883edf69500a2affd5f4da","tarball":"http://registry.npmjs.org/backtrack/-/backtrack-0.0.0.tgz"},"maintainers":[{"name":"russfrank","email":"me@russfrank.us"}]}},"readme":"# backtrack\n\nThis is a simple backtracking SAT solver written in javascript.  I wrote it\npartially because I needed a SAT solver and partially because I was unable to\nfind a simple example of such an algorithm online.\n\nIt has no dependencies and it is written in clean ECMAScript 5.  It expects\ninput in Conjunctive Normal Form and will output a model which satisfies the\ngiven set of clauses.\n\nYou can install it like this:\n\n```shell\n$ npm i backtrack\n```\n\nand use it like this\n\n```javascript\nvar solve = require('backtrack').solve;\n\nvar clauses = [\n  ['blue', 'green', '-yellow'],\n  ['-blue', '-green', 'yellow'],\n  ['pink', 'purple', 'green', 'blue', '-yellow']\n];\n\nvar variables = ['blue', 'green', 'yellow', 'pink', 'purple'];\n\nvar model = solve(variables, clauses);\n// model => { purple: true, pink: true, yellow: true, green: true }\n```\n\nRead the [annotated source](http://russfrank.us/static/backtrack/backtrack.html)!\n\nTests are written in mocha\n\n```shell\n$ npm test\n```\n\nYou can also pass in a model and the solver will inform you if the expression\nis satisfiable under the assumptions you have given it:\n\n```javascript\nvar solvable = solve(variables, clauses, {blue: true, yellow: false, green: true});\n// solvable => false\n```\n\nSince the second clause is now unsolvable, the entire expression is unsolvable.\n\n# License\nMIT\n","maintainers":[{"name":"russfrank","email":"me@russfrank.us"}],"time":{"modified":"2012-06-11T16:48:23.480Z","created":"2012-06-11T16:48:23.079Z","0.0.0":"2012-06-11T16:48:23.480Z"},"author":{"name":"Russ Frank","email":"me@russfrank.us"},"repository":{"type":"git","url":"github.com:russfrank/backtrack"},"_attachments":{"backtrack-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-k+OgVsZg+WIYOpqAqIK1yA==","length":6624,"stub":true}}}},
{"id":"backuptweets","key":"backuptweets","value":{"rev":"3-68712682aada41082d3ae36c03c8f899"},"doc":{"_id":"backuptweets","_rev":"3-68712682aada41082d3ae36c03c8f899","name":"backuptweets","description":"Back up your Twitter tweets with Node.js without oAuth","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"backuptweets","author":{"name":"Hay Kranen","email":"hay@bykr.org"},"homepage":"http://github.com/hay/backuptweets","description":"Back up your Twitter tweets with Node.js without oAuth","keywords":["twitter","backup","json"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/hay/backuptweets.git"},"dependencies":{"async":">=0.1.9 <1.0.0","mustache":">=0.3.0 < 1.0.0","request":">=1.9.8 < 2.0.0","underscore":">=1.1.7 < 2.0.0"},"engine":"node >= 0.5.1","main":"./backuptweets","_npmJsonOpts":{"file":"/Users/hay/.npm/backuptweets/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"backuptweets@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.1","_defaultsLoaded":true,"dist":{"shasum":"5a8220a39fe748696d92dfa6e25f9ff64f7e7242","tarball":"http://registry.npmjs.org/backuptweets/-/backuptweets-0.1.0.tgz"},"scripts":{}}},"maintainers":[{"name":"hay","email":"hay@bykr.org"}],"time":{"modified":"2011-07-19T14:38:45.939Z","created":"2011-07-19T14:38:45.316Z","0.1.0":"2011-07-19T14:38:45.939Z"},"author":{"name":"Hay Kranen","email":"hay@bykr.org"},"repository":{"type":"git","url":"git://github.com/hay/backuptweets.git"},"_attachments":{"backuptweets-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/eO2gserZfuzm424hOmEJg==","length":3828,"stub":true}}}},
{"id":"badass","key":"badass","value":{"rev":"13-4be876f1e8777df97d74e07d25836378"},"doc":{"_id":"badass","_rev":"13-4be876f1e8777df97d74e07d25836378","name":"badass","description":"the proxy that breaks all the rules","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0":{"name":"badass","version":"0.0.0","description":"the proxy that breaks all the rules","homepage":"http://github.com/dominictarr/badass","repository":{"type":"git","url":"git://github.com/dominictarr/badass.git"},"dependencies":{},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"badass@0.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6d4d5679b8db88d6cf0545c23a0078b8b5944087","tarball":"http://registry.npmjs.org/badass/-/badass-0.0.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.1":{"name":"badass","version":"0.0.1","description":"the proxy that breaks all the rules","homepage":"http://github.com/dominictarr/badass","repository":{"type":"git","url":"git://github.com/dominictarr/badass.git"},"dependencies":{"event-stream":"~2"},"devDependencies":{"request":"~2.9"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"badass@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"826d5fe7ac2a2b99ff46aa30ff7acd4a0bee53a0","tarball":"http://registry.npmjs.org/badass/-/badass-0.0.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.0":{"name":"badass","version":"0.1.0","description":"the proxy that breaks all the rules","homepage":"http://github.com/dominictarr/badass","repository":{"type":"git","url":"git://github.com/dominictarr/badass.git"},"dependencies":{"event-stream":"~2"},"devDependencies":{"request":"~2.9"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"badass@0.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e62535d14dd9b13271ff2fab8c38bf6c943fb6e2","tarball":"http://registry.npmjs.org/badass/-/badass-0.1.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.1":{"name":"badass","version":"0.1.1","description":"the proxy that breaks all the rules","homepage":"http://github.com/dominictarr/badass","repository":{"type":"git","url":"git://github.com/dominictarr/badass.git"},"dependencies":{"event-stream":"~2"},"devDependencies":{"request":"~2.9"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"license":["MIT","Apache2"],"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"badass@0.1.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"cc8885affe360796f680d0c0c7733eca9371d73c","tarball":"http://registry.npmjs.org/badass/-/badass-0.1.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.2.0":{"name":"badass","version":"0.2.0","description":"the proxy that breaks all the rules","homepage":"http://github.com/dominictarr/badass","repository":{"type":"git","url":"git://github.com/dominictarr/badass.git"},"dependencies":{"event-stream":"~2"},"devDependencies":{"request":"~2.9","tap":"~2.5"},"scripts":{"test":"tap test/"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"license":["MIT","Apache2"],"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"badass@0.2.0","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7398b5b2f57f25c2001c6a1135cd4d66c775ee73","tarball":"http://registry.npmjs.org/badass/-/badass-0.2.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-08-07T14:38:24.858Z","created":"2012-06-15T12:54:10.487Z","0.0.0":"2012-06-15T12:54:24.284Z","0.0.1":"2012-06-15T13:45:54.195Z","0.1.0":"2012-06-15T15:00:33.937Z","0.1.1":"2012-06-15T15:11:55.455Z","0.2.0":"2012-06-18T14:49:14.331Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/badass.git"},"users":{},"_attachments":{"badass-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-wwcEzSTGmwTMG3hY6hblnA==","length":7358,"stub":true},"badass-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-h9AtZybmhF5JPYGqx1dN9A==","length":4787,"stub":true},"badass-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-JzT9X6PEoi41XUtZhpiccg==","length":3724,"stub":true},"badass-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7fctZFkYrjiBdlS6MC/qSQ==","length":3598,"stub":true},"badass-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Djtzv1IhCQrVpLdVcNpnTA==","length":3564,"stub":true}}}},
{"id":"badconnection","key":"badconnection","value":{"rev":"3-3275b28ba5e816bd035a14bac6c7afab"},"doc":{"_id":"badconnection","_rev":"3-3275b28ba5e816bd035a14bac6c7afab","name":"badconnection","description":"A TCP proxy which simulates a bad network connection","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"badconnection","description":"A TCP proxy which simulates a bad network connection","homepage":"https://github.com/Pita/Bad-Connection","author":{"name":"Peter 'Pita' Martischka","email":"petermartischka@googlemail.com"},"dependencies":{"async":"0.1.15","log4js":"0.4.1","optimist":"0.2.8"},"preferGlobal":true,"bin":{"badconnection":"./index.js"},"version":"0.0.1","_npmUser":{"name":"pita","email":"petermartischka@googlemail.com"},"_id":"badconnection@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0145586ae26cc30e54efa3877eafbb09ed9201e2","tarball":"http://registry.npmjs.org/badconnection/-/badconnection-0.0.1.tgz"},"maintainers":[{"name":"pita","email":"petermartischka@googlemail.com"}]}},"readme":null,"maintainers":[{"name":"pita","email":"petermartischka@googlemail.com"}],"time":{"modified":"2011-11-29T04:22:57.555Z","created":"2011-11-29T04:22:56.551Z","0.0.1":"2011-11-29T04:22:57.555Z"},"author":{"name":"Peter 'Pita' Martischka","email":"petermartischka@googlemail.com"},"_attachments":{"badconnection-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Gg0nVDq8Miaeb4xmrVmOUw==","length":2917,"stub":true}}}},
{"id":"badge","key":"badge","value":{"rev":"9-ccb69972427b882a0c325439352717ab"},"doc":{"_id":"badge","_rev":"9-ccb69972427b882a0c325439352717ab","name":"badge","description":"Oauth server and client on couchdb using Express.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"badge","description":"OAuth2 System","version":"0.0.1","repository":{"type":"git","url":"git://github.com/behere/badge.git"},"main":"./lib/badge.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"bin":{"help":"./bin/badge"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"badge@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d2b861f76033a9bb741f57e9ffa9f67232180d54","tarball":"http://registry.npmjs.org/badge/-/badge-0.0.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"badge","description":"Oauth server and client on couchdb using Express.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/behere/badge.git"},"main":"./lib/badge.js","engines":{"node":"*"},"dependencies":{"oauth2-provider":"*","serializer":"*","passport":"*","passport-local":"*","passport-windowslive":"*","passport-flickr":"*","passport-vimeo":"*","passport-yahoo-oauth":"*","passport-oauth":"*","passport-google-oauth":"*","passport-linkedin":"*","passport-github":"*","passport-twitter":"*","passport-facebook":"*"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"bin":{"badge":"./bin/badge"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"badge@0.1.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"237f6ef98cad97b150481ea93160d76ac17917cb","tarball":"http://registry.npmjs.org/badge/-/badge-0.1.0.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]}},"readme":"badge\r\n=====","maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"time":{"modified":"2012-07-02T23:37:53.335Z","created":"2012-06-13T17:14:57.068Z","0.0.1":"2012-06-13T17:15:34.384Z","0.1.0":"2012-07-02T23:37:53.335Z"},"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"repository":{"type":"git","url":"git://github.com/behere/badge.git"},"_attachments":{"badge-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-CElfPQKAZWJzZ9khqQpRFA==","length":7761,"stub":true},"badge-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5IyEogY4iThwS3CWEST/yQ==","length":503,"stub":true}}}},
{"id":"badoop","key":"badoop","value":{"rev":"3-76371208e30d47a32a878904afc1b3bd"},"doc":{"_id":"badoop","_rev":"3-76371208e30d47a32a878904afc1b3bd","name":"badoop","description":"Todo list management in bash","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"badoop","version":"0.0.1","description":"Todo list management in bash","scripts":{"test":"./test"},"repository":{"type":"git","url":"https://github.com/jergason/badoop.git"},"keywords":["todo-list","todo","tasks","productivity","procastination"],"bin":{"badoop":"./badoop"},"author":{"name":"Jamison Dance","email":"jergason@gmail.com","url":"http://jamisondance.com/"},"license":"MIT","readme":"# badoop\n\nTodo list in bash. No buckets, no priorities, no features, just awesomeness.\n\n\n## Installation\n\nDownload badoop and put it in your $PATH. You could try this:\n\n```bash\ncurl -o /usr/local/bin https://raw.github.com/jergason/badoop/master/badoop\n```\n\nIf you have [npm](http://npmjs.org) installed, you can install badoop like this:\n\n```bash\nnpm install -g badoop\n```\n\n## Usage\n\nUse it like so:\n\n\n```bash\n$ badoop Put badoop up on GitHub\n$ badoop Finish blog post about badoop\n$ badoop\n  • put badoop up on GitHub\n  • badoop Finish blog post about badoop\n$ badoop -d GitHub\n$ badoop\n  • badoop Finish blog post about badoop\n```\n\nbadoop can do four things.\n\n1. `badoop` with no arguments lists all todo items.\n1. `badoop` followed by anything but a `-d` or `-h` will add that as a todo\n    item to your todo list.\n1. `badoop -d` deletes any todo items matching the arguments passed in next\n1. `badoop -h` prints out a help message.\n\nIt doesn't do anything with priorities or sorting or nesting or tagging or\nlogging or anything. If you are wondering if it has a certain feature, the\nanswer is no. Frankly, if your todo list is that complicated, you may have too\nmany things to do. You should use a different todo app, or do less things.\n\n### Where The List is Stored\n\nBy default, badoop looks for a `$TODO` environment variable defining a path\nto a text file to use as the todo list. If it doesn't exist, it will use\n`~/.todo.txt` as the todo list.\n\n### Cloud Storage Woop Woop\n\n[Things 2](http://culturedcode.com/things/) just got cloud storage. Pffffft.\nbadoop has had this forever.\n\n```bash\n$ TODO=~/Dropbox/todo.txt\n$ badoop Tell everyone about my sweet cloud storage.\n$ badoop\n  • Tell everyone about my sweet cloud storage.\n```\n\nConsider it clouded.\n\n## Contributing\n\nRun the tests with `./test`. Make sure you have [roundup](https://github.com/bmizerany/roundup/)\nto run them. If you add new features, add new tests for them please.\n\n## TODOS\n\n* `npm test` doesn't like roundup. The tests never exit.\n","_id":"badoop@0.0.1","dist":{"shasum":"da9d526dd8731c820f7eaead46b4c42c2ef25f67","tarball":"http://registry.npmjs.org/badoop/-/badoop-0.0.1.tgz"},"maintainers":[{"name":"jergason","email":"jergason@gmail.com"}]}},"readme":"# badoop\n\nTodo list in bash. No buckets, no priorities, no features, just awesomeness.\n\n\n## Installation\n\nDownload badoop and put it in your $PATH. You could try this:\n\n```bash\ncurl -o /usr/local/bin https://raw.github.com/jergason/badoop/master/badoop\n```\n\nIf you have [npm](http://npmjs.org) installed, you can install badoop like this:\n\n```bash\nnpm install -g badoop\n```\n\n## Usage\n\nUse it like so:\n\n\n```bash\n$ badoop Put badoop up on GitHub\n$ badoop Finish blog post about badoop\n$ badoop\n  • put badoop up on GitHub\n  • badoop Finish blog post about badoop\n$ badoop -d GitHub\n$ badoop\n  • badoop Finish blog post about badoop\n```\n\nbadoop can do four things.\n\n1. `badoop` with no arguments lists all todo items.\n1. `badoop` followed by anything but a `-d` or `-h` will add that as a todo\n    item to your todo list.\n1. `badoop -d` deletes any todo items matching the arguments passed in next\n1. `badoop -h` prints out a help message.\n\nIt doesn't do anything with priorities or sorting or nesting or tagging or\nlogging or anything. If you are wondering if it has a certain feature, the\nanswer is no. Frankly, if your todo list is that complicated, you may have too\nmany things to do. You should use a different todo app, or do less things.\n\n### Where The List is Stored\n\nBy default, badoop looks for a `$TODO` environment variable defining a path\nto a text file to use as the todo list. If it doesn't exist, it will use\n`~/.todo.txt` as the todo list.\n\n### Cloud Storage Woop Woop\n\n[Things 2](http://culturedcode.com/things/) just got cloud storage. Pffffft.\nbadoop has had this forever.\n\n```bash\n$ TODO=~/Dropbox/todo.txt\n$ badoop Tell everyone about my sweet cloud storage.\n$ badoop\n  • Tell everyone about my sweet cloud storage.\n```\n\nConsider it clouded.\n\n## Contributing\n\nRun the tests with `./test`. Make sure you have [roundup](https://github.com/bmizerany/roundup/)\nto run them. If you add new features, add new tests for them please.\n\n## TODOS\n\n* `npm test` doesn't like roundup. The tests never exit.\n","maintainers":[{"name":"jergason","email":"jergason@gmail.com"}],"time":{"modified":"2012-08-11T15:33:31.094Z","created":"2012-08-11T15:33:29.748Z","0.0.1":"2012-08-11T15:33:31.094Z"},"author":{"name":"Jamison Dance","email":"jergason@gmail.com","url":"http://jamisondance.com/"},"repository":{"type":"git","url":"https://github.com/jergason/badoop.git"},"_attachments":{"badoop-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+4WbFNJlCGIf4mzZrK0v4w==","length":2224,"stub":true}}}},
{"id":"badrinarayanan","key":"badrinarayanan","value":{"rev":"3-c83082587e0c4eee5d42ad7af70251b1"},"doc":{"_id":"badrinarayanan","_rev":"3-c83082587e0c4eee5d42ad7af70251b1","name":"badrinarayanan","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"badrinarayanan","version":"1.0.0","email":"badri@badri123.com","url":"http://barnyrubble.tumblr.com/","_npmUser":{"name":"badrinarayanan","email":"badri@badri123.com"},"_id":"badrinarayanan@1.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"5c9324bb10dfbc4e2d266a2150628f683e1e3229","tarball":"http://registry.npmjs.org/badrinarayanan/-/badrinarayanan-1.0.0.tgz"},"readme":"","maintainers":[{"name":"badrinarayanan","email":"badri@badri123.com"}]}},"readme":"","maintainers":[{"name":"badrinarayanan","email":"badri@badri123.com"}],"time":{"modified":"2012-05-05T10:02:19.698Z","created":"2012-05-05T10:02:13.960Z","1.0.0":"2012-05-05T10:02:19.698Z"},"_attachments":{"badrinarayanan-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Uz6XIFesIOcd/zFS59cJnw==","length":444,"stub":true}}}},
{"id":"bagofholding","key":"bagofholding","value":{"rev":"25-2782970cd52be09ce93b1bd2281c79ac"},"doc":{"_id":"bagofholding","_rev":"25-2782970cd52be09ce93b1bd2281c79ac","name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","dist-tags":{"latest":"0.0.12"},"versions":{"0.0.1":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.1","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7ad4bb654c6efa8db8f3e55c0e8f6728fbfc3584","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.1.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.2":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.2","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"d8ab8ef33f30eb8113b0896f2935a342b61b2a9a","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.2.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.3":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.3","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8403d21de3e39d07587ae26b4d519c1ef15874c7","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.3.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.4":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.4","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"3b08c8ebd18c1ba7d40bd0d66cc59ef2f6278f45","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.4.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.5":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.5","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8c19fef5f9a1930c9da29ab347029d609e50778b","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.5.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.6":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.6","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d63795196e110ffaf1b9d96a033c4de894ae80b4","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.6.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.7":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.7","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"777dde141d8615a6331714e0f1162c890ab36e4f","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.7.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.8":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.8","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"7cd384d380ae05c677bc26797891f0587a91bb07","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.8.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.9":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.9","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.18","commander":"0.6.0","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.0.3","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"9ceb2dc64642425c207d28a2f0c462b64fea53cf","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.9.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.10":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.10","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"http://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.22","commander":"0.6.1","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.2.1","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"readme":"Bag Of Holding [![http://travis-ci.org/cliffano/bagofholding](https://secure.travis-ci.org/cliffano/bagofholding.png?branch=master)](http://travis-ci.org/cliffano/bagofholding)\n--------------\n\nAn uncursed bag of various Node.js utility functions.\n\nThis is an extract of the reusable parts from various Node.js modules I've written. It contains convenient utilities for command-line tools, unit test mock functions, and data manipulation.\n\nMostly for internal use.\n\nInstallation\n------------\n\n    npm install bagofholding\n\nor as a dependency in package.json file:\n\n    \"dependencies\": {\n      \"bagofholding\": \"x.y.z\"\n    }\n\nUsage\n-----\n\n    var bag = require('bagofholding');\n    bag.cli.*;\n    bag.mock.*;\n    bag.obj.*;\n    bag.text.*;\n\nCheck out the source code for a list of functions available for use.\n","_id":"bagofholding@0.0.10","dist":{"shasum":"125bab06d4320cd857f38f88202e30f4a3c13fb3","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.10.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.11":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.11","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.22","commander":"0.6.1","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.2.1","sandboxed-module":"0.1.3","should":"0.6.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a9617cbbe4b7eb5cdb6b40aa4c9144f284e729f8","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.11.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.0.12":{"name":"bagofholding","description":"An uncursed bag of various Node.js utility functions.","keywords":[],"version":"0.0.12","homepage":"http://github.com/cliffano/bagofholding","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"main":"./lib/bagofholding","repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"bugs":{"url":"http://github.com/cliffano/bagofholding/issues"},"directories":{"lib":"./lib","test":"./test"},"dependencies":{"async":"0.1.22","commander":"1.0.1","dateformat":"1.0.2-1.2.3","jazz":"0.0.18","underscore":"1.3.3"},"devDependencies":{"mocha":"1.3.2","sandboxed-module":"0.1.3","should":"1.1.0"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bagofholding/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bagofholding@0.0.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e785dd28137e5a71f07ea2b93db18953dab64081","tarball":"http://registry.npmjs.org/bagofholding/-/bagofholding-0.0.12.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]}},"readme":"Bag Of Holding [![http://travis-ci.org/cliffano/bagofholding](https://secure.travis-ci.org/cliffano/bagofholding.png?branch=master)](http://travis-ci.org/cliffano/bagofholding)\n-----------\n\nBag Of Holding is an uncursed bag of various Node.js utility functions.\n\nIt contains common functions used in various cliffano/* modules.\n\nInstallation\n------------\n\n    npm install bagofholding\n\nor specify it as a dependency in package.json file:\n\n    \"dependencies\": {\n      \"bagofholding\": \"x.y.z\"\n    }\n\nUsage\n-----\n\n    var bag = require('bagofholding');\n    bag.cli.*; // command-line tools utilities\n    bag.mock.*; // mock IO-related Node.js API\n    bag.obj.*; // object manipulation utilities\n    bag.text.*; // string manipulation utilities\n\nCheck out the source code for a list of functions available for use.\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.\n","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}],"time":{"modified":"2012-08-05T02:45:16.366Z","created":"2012-05-10T15:40:49.950Z","0.0.1":"2012-05-10T15:40:53.637Z","0.0.2":"2012-05-17T07:39:41.395Z","0.0.3":"2012-05-17T12:09:58.315Z","0.0.4":"2012-05-18T08:00:24.205Z","0.0.5":"2012-05-27T12:46:51.019Z","0.0.6":"2012-06-16T02:43:31.656Z","0.0.7":"2012-06-16T14:55:03.306Z","0.0.8":"2012-06-22T00:14:36.903Z","0.0.9":"2012-06-22T07:56:28.048Z","0.0.10":"2012-06-26T08:19:57.592Z","0.0.11":"2012-07-03T03:15:37.972Z","0.0.12":"2012-08-05T02:45:16.366Z"},"author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"repository":{"type":"git","url":"git://github.com/cliffano/bagofholding.git"},"_attachments":{"bagofholding-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-8qpnCW/XkTbGg59TOtdWjw==","length":11842,"stub":true},"bagofholding-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-PjBqIT1yaMC62ILnxH/ipg==","length":11541,"stub":true},"bagofholding-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-g2S5YwL5sE1PvMMN7yJoEA==","length":11262,"stub":true},"bagofholding-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-6oIXH6fjtQ8K2pOWHqw2Lg==","length":11173,"stub":true},"bagofholding-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-N57W15XzFVGrJ7yzNOIFsw==","length":11278,"stub":true},"bagofholding-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-DBBA40CA5Agd5y5yFhy9Jg==","length":10418,"stub":true},"bagofholding-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-9coODcPdAs000hyerUkWPg==","length":10154,"stub":true},"bagofholding-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-UZKbQVQm29gwz7s3E2zFeA==","length":10054,"stub":true},"bagofholding-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-2kAeA++4SDQqjK4LWLb/DA==","length":9674,"stub":true},"bagofholding-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Sc2n44MCurRdaAIjEFJbfA==","length":9356,"stub":true},"bagofholding-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Z+QrIB9vhU0CX5cB8cn8QA==","length":9249,"stub":true},"bagofholding-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AMLolmGZ4A0gqMBM4KaerQ==","length":10240,"stub":true}}}},
{"id":"baidu","key":"baidu","value":{"rev":"3-ee1dd843989a2aa412b26188a534968b"},"doc":{"_id":"baidu","_rev":"3-ee1dd843989a2aa412b26188a534968b","name":"baidu","description":"hello baidu","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"baidu","version":"0.0.1","description":"hello baidu","_id":"baidu@0.0.1","readme":"ERROR: No README.md file found!","dist":{"shasum":"d84d2dd0a7d52fffa9340778925321850825ab68","tarball":"http://registry.npmjs.org/baidu/-/baidu-0.0.1.tgz"},"maintainers":[{"name":"errorrik","email":"errorrik@gmail.com"}]}},"readme":"ERROR: No README.md file found!","maintainers":[{"name":"errorrik","email":"errorrik@gmail.com"}],"time":{"modified":"2012-08-10T06:56:18.590Z","created":"2012-08-10T06:56:11.350Z","0.0.1":"2012-08-10T06:56:18.590Z"},"_attachments":{"baidu-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tsyGswvSEbrx1HLN4mbu2w==","length":171,"stub":true}}}},
{"id":"baidutemplate","key":"baidutemplate","value":{"rev":"6-b57823e8b4aada363cb4c6ce345fd114"},"doc":{"_id":"baidutemplate","_rev":"6-b57823e8b4aada363cb4c6ce345fd114","name":"baidutemplate","description":"a very easy to use javascript template engine","dist-tags":{"latest":"1.0.5-dev"},"versions":{"1.0.4-dev":{"name":"baidutemplate","version":"1.0.4-dev","description":"a very easy to use javascript template engine","homepage":"http://baidufe.github.com/BaiduTemplate","author":{"name":"baiduTemplate.js authors {1988wangxiao@gmail.com | http://weibo.com/crazycomputer}"},"keywords":["baidu","baidufe","javascript","template","baiduTemplate","baidutemplate"],"repository":{"type":"git","url":"git://github.com/BaiduFE/BaiduTemplate.git"},"main":"./BaiduTemplate","_npmUser":{"name":"wangxiao","email":"1988wangxiao@gmail.com"},"_id":"baidutemplate@1.0.4-dev","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b47d3e7c1a5b7850c2cd0e364d4c78912bc5683e","tarball":"http://registry.npmjs.org/baidutemplate/-/baidutemplate-1.0.4-dev.tgz"},"readme":"","maintainers":[{"name":"wangxiao","email":"1988wangxiao@gmail.com"}]},"1.0.5-dev":{"name":"baidutemplate","version":"1.0.5-dev","description":"a very easy to use javascript template engine","homepage":"http://baidufe.github.com/BaiduTemplate","author":{"name":"baiduTemplate.js authors {1988wangxiao@gmail.com | http://weibo.com/crazycomputer}"},"keywords":["baidu","baidufe","javascript","template","baiduTemplate","baidutemplate"],"repository":{"type":"git","url":"git://github.com/BaiduFE/BaiduTemplate.git"},"main":"./BaiduTemplate","_npmUser":{"name":"wangxiao","email":"1988wangxiao@gmail.com"},"_id":"baidutemplate@1.0.5-dev","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"95bf6be659deb48e842a55e15afb39b5c0b19439","tarball":"http://registry.npmjs.org/baidutemplate/-/baidutemplate-1.0.5-dev.tgz"},"readme":"","maintainers":[{"name":"wangxiao","email":"1988wangxiao@gmail.com"}]}},"readme":"","maintainers":[{"name":"wangxiao","email":"1988wangxiao@gmail.com"}],"time":{"modified":"2012-08-02T13:44:17.700Z","created":"2012-07-10T12:32:02.751Z","1.0.4-dev":"2012-07-10T12:32:09.815Z","1.0.5-dev":"2012-07-26T09:07:33.148Z"},"author":{"name":"baiduTemplate.js authors {1988wangxiao@gmail.com | http://weibo.com/crazycomputer}"},"repository":{"type":"git","url":"git://github.com/BaiduFE/BaiduTemplate.git"},"users":{"fgribreau":true},"_attachments":{"baidutemplate-1.0.5-dev.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-EKqNmo77HAG7JtQmKZQv8w==","length":4929,"stub":true},"baidutemplate-1.0.4-dev.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Cm2XHMR8BKgha9YgxpTndg==","length":4905,"stub":true}}}},
{"id":"bake","key":"bake","value":{"rev":"161-26994db74f846052ebcf7671c78cece3"},"doc":{"_id":"bake","_rev":"161-26994db74f846052ebcf7671c78cece3","name":"bake","description":"static file bakery","dist-tags":{"stable":"1.0.1","latest":"1.0.5"},"versions":{"0.0.0":{"name":"bake","description":"javascript website bakery for markdown files","tags":["website","blog","markdown","template","git"],"version":"0.0.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":["node >= 0.4.10"],"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.2","marked":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2eccb7736060888cf7f772ca124202cee77ba135","tarball":"http://registry.npmjs.org/bake/-/bake-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.1":{"name":"bake","description":"javascript website bakery for markdown files","tags":["website","blog","markdown","template","git"],"version":"0.0.1","author":{"name":"Paul Vorbach","email":"paul@vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":["node >= 0.4.10"],"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.2","marked":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0294ba047b5c11221a373f882d49a9a832397d12","tarball":"http://registry.npmjs.org/bake/-/bake-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.2":{"name":"bake","description":"javascript website bakery for markdown files","tags":["website","blog","markdown","template","git"],"version":"0.0.2","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.10"},"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.2","marked":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d6f3cde7ce6587e250a0f3053bbf575a0524db55","tarball":"http://registry.npmjs.org/bake/-/bake-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.3":{"name":"bake","description":"javascript website bakery for markdown files","tags":["website","blog","markdown","template","git"],"version":"0.0.3","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.10"},"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.2","marked":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"73dab27ad33e0789e11eb3b37bf8c8968ba74dcc","tarball":"http://registry.npmjs.org/bake/-/bake-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.4":{"name":"bake","description":"javascript website bakery for markdown files","tags":["website","blog","markdown","template","git"],"version":"0.0.4","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.10"},"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.3","marked":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ac9915fb9a84a35e9c65e9c20200e2a5e26b8d65","tarball":"http://registry.npmjs.org/bake/-/bake-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.5":{"name":"bake","description":"javascript website bakery for markdown files","tags":["website","blog","markdown","template","git"],"version":"0.0.5","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.3","marked":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9bddf3e6461df10011714c5d08d4ca4753be03b5","tarball":"http://registry.npmjs.org/bake/-/bake-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.0":{"name":"bake","description":"bakery for static files that supports embedded JS templates","tags":["ejs","template"],"version":"0.1.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"lib/bake.js","dependencies":{"cjson":">=0.0.3","dive":">=0.0.3","props":">=0.0.3","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"67466b2343027fc89285e567e828c2157e41ba0a","tarball":"http://registry.npmjs.org/bake/-/bake-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.1":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.1.1","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"lib/bake.js","dependencies":{"dive":">=0.0.3","props":">=0.0.3","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"459df4dc5697d77b2aa1b34d9c5151421be4b92e","tarball":"http://registry.npmjs.org/bake/-/bake-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.2.0":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.2.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"lib/bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"cbe0d81f45e9c802e0d3d9bcb636ac8e838b48ec","tarball":"http://registry.npmjs.org/bake/-/bake-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.3.0":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.3.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f6f4114a593292753093b3649ae123cd5594445e","tarball":"http://registry.npmjs.org/bake/-/bake-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.4.0":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.4.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.4.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"aba46cfa993af011f2f8d329216436ed7184524c","tarball":"http://registry.npmjs.org/bake/-/bake-0.4.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.4.1":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.4.1","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.4.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.4.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e08a64006847432faecbdddc32feb8d8a88a93d7","tarball":"http://registry.npmjs.org/bake/-/bake-0.4.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.5.0":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.5.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"086a167a4ddf54d1319447e88de6ca6278e84e11","tarball":"http://registry.npmjs.org/bake/-/bake-0.5.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.5.1":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.5.1","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.5.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8d6f132b8b78e6e9b4b0f30029303870082449b2","tarball":"http://registry.npmjs.org/bake/-/bake-0.5.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.5.2":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.5.2","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.5.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.5.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fc700d39f68c6c6596d5578e188f787e31d2c3f9","tarball":"http://registry.npmjs.org/bake/-/bake-0.5.2.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.5.3":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.5.3","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"bake.js","dependencies":{"dive":">=0.0.3","props":">=0.1.0","ejs":">=0.4.3"},"_npmJsonOpts":{"file":"/home/paul/.npm/bake/0.5.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bake@0.5.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d63bdaeb4c5e34665b5170ff387f9e53415da61a","tarball":"http://registry.npmjs.org/bake/-/bake-0.5.3.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.6.0":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.6.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"./bake.js","dependencies":{"dive":">=0.0.3","marked":">=0.1.7","props":">=0.1.0","ejs":">=0.4.3"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@0.6.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bf4a374ecc6720229a80764a3c20a898e0e4028f","tarball":"http://registry.npmjs.org/bake/-/bake-0.6.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.7.0":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.7.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"./bake.js","dependencies":{"dive":">=0.0.3","marked":">=0.1.7","props":">=0.1.0","ejs":">=0.4.3"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@0.7.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6a011eb122df32217bca7a848994864c401be749","tarball":"http://registry.npmjs.org/bake/-/bake-0.7.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.7.1":{"name":"bake","description":"bakery for static files (like jekyll) that supports embedded JS templates","tags":["ejs","template"],"version":"0.7.1","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">= 0.4.0"},"main":"./bake.js","dependencies":{"dive":">=0.0.3","marked":">=0.1.7","props":">=0.1.0","ejs":">=0.4.3"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@0.7.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9bf68df57070b1c0057c3eadc7d543790a7a4d94","tarball":"http://registry.npmjs.org/bake/-/bake-0.7.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.0":{"name":"bake","description":"static file bakery","tags":["ejs","template"],"version":"1.0.0","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">=0.4.0"},"main":"./bake.js","dependencies":{"append":">=0.1.1","async":">=0.1.16","clone":">=0.0.4","dive":">=0.2.0","ejs":">=0.6.1","props":">=0.2.2"},"devDependencies":{"marked":"0.1.7"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@1.0.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0ca5d9f1f6dae084b7aa66a9c4ac57821f936a4c","tarball":"http://registry.npmjs.org/bake/-/bake-1.0.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.1":{"name":"bake","description":"static file bakery","tags":["ejs","template"],"version":"1.0.1","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">=0.4.0"},"main":"./bake.js","dependencies":{"append":">=0.1.1","async":">=0.1.16","clone":">=0.0.4","dive":">=0.2.0","ejs":">=0.6.1","props":">=0.2.2"},"devDependencies":{"marked":"0.1.7"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@1.0.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"195b4d71e0120014025e4f291438b7c56a4d658b","tarball":"http://registry.npmjs.org/bake/-/bake-1.0.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.2":{"name":"bake","description":"static file bakery","tags":["ejs","template"],"version":"1.0.2","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">=0.4.0"},"main":"./bake.js","dependencies":{"append":">=0.1.1","async":">=0.1.16","clone":">=0.0.4","dive":">=0.2.0","ejs":">=0.6.1","props":">=0.2.2"},"devDependencies":{"marked":"0.1.7"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@1.0.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1e9f4fcaaecca847adab4abe7465a8e1957d5add","tarball":"http://registry.npmjs.org/bake/-/bake-1.0.2.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.3":{"name":"bake","description":"static file bakery","tags":["ejs","template"],"version":"1.0.3","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">=0.4.0"},"main":"./bake.js","dependencies":{"append":">=0.1.1","async":">=0.1.16","clone":">=0.0.4","dive":">=0.2.0","ejs":">=0.6.1","props":">=0.2.2"},"devDependencies":{"marked":"0.1.7"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@1.0.3","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4deadcdf233232504523c36a71400688a66b6d62","tarball":"http://registry.npmjs.org/bake/-/bake-1.0.3.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.4":{"name":"bake","description":"static file bakery","tags":["ejs","template"],"version":"1.0.4","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">=0.4.0"},"main":"./bake.js","dependencies":{"append":">=0.1.1","async":">=0.1.16","clone":">=0.0.4","dive":">=0.2.0","ejs":">=0.6.1","props":">=0.2.2"},"devDependencies":{"marked":"0.1.7"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@1.0.4","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c567b871c7969852ed198063b823df736b71d293","tarball":"http://registry.npmjs.org/bake/-/bake-1.0.4.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.5":{"name":"bake","description":"static file bakery","tags":["ejs","template"],"version":"1.0.5","author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"bugs":{"url":"http://github.com/pvorb/node-bake/issues"},"engines":{"node":">=0.4.0"},"main":"./bake.js","dependencies":{"append":">=0.1.1","async":">=0.1.16","clone":">=0.0.4","dive":">=0.2.0","ejs":">=0.6.1","props":">=0.2.2"},"devDependencies":{"marked":"0.1.7"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bake@1.0.5","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0b6705db6e63ff30d1648ba0b8cd36d11bd4c282","tarball":"http://registry.npmjs.org/bake/-/bake-1.0.5.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}}},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-02-17T16:47:25.708Z","created":"2011-08-13T18:15:27.614Z","0.0.1":"2011-08-13T18:15:32.673Z","0.0.2":"2011-08-13T18:33:04.153Z","0.0.3":"2011-08-13T23:08:06.660Z","0.0.4":"2011-08-14T15:21:11.946Z","0.0.5":"2011-08-14T16:02:36.204Z","0.1.0":"2011-08-21T16:54:09.942Z","0.1.1":"2011-08-21T17:06:11.382Z","0.2.0":"2011-08-22T15:53:56.592Z","0.3.0":"2011-08-24T13:01:39.487Z","0.4.0":"2011-08-24T13:51:51.221Z","0.4.1":"2011-08-24T20:42:31.530Z","0.5.0":"2011-08-25T11:55:18.107Z","0.5.1":"2011-08-25T14:51:44.207Z","0.0.0":"2011-08-26T00:43:30.761Z","0.5.2":"2011-08-27T19:02:13.212Z","0.5.3":"2011-09-02T23:01:30.424Z","0.6.0":"2012-01-21T20:28:52.693Z","0.7.0":"2012-02-04T19:38:40.489Z","0.7.1":"2012-02-08T12:50:03.687Z","1.0.0":"2012-02-15T11:21:08.856Z","1.0.1":"2012-02-15T11:29:22.204Z","1.0.2":"2012-02-15T19:49:02.321Z","1.0.3":"2012-02-15T20:44:38.750Z","1.1.0":"2012-02-16T01:32:30.070Z","1.0.4":"2012-02-16T14:35:45.775Z","1.0.5":"2012-02-17T15:30:38.099Z","1.0.6":"2012-02-17T15:45:06.878Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bake.git"},"_attachments":{"bake-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":157,"digest":"md5-vR9fimfy/NNgb+AdBw2kcg==","length":5119,"stub":true},"bake-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":151,"digest":"md5-/lrchc1LDxR8dFk3e9QhkQ==","length":5030,"stub":true},"bake-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":133,"digest":"md5-swI6pdke6Fwfa8fKUI0Nzg==","length":5032,"stub":true},"bake-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-/dxAPYBhbSlLZegcUd3yww==","length":5014,"stub":true},"bake-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":123,"digest":"md5-bM2wFX9vPkJLhvELUANFzA==","length":5013,"stub":true},"bake-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":121,"digest":"md5-fbWudompenbalxTErIYGkQ==","length":4999,"stub":true},"bake-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-jysgMk5wnZ3uq4rXVzBPCg==","length":3999,"stub":true},"bake-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":117,"digest":"md5-6gvjC2hMdcDl15UcEa1ItA==","length":3989,"stub":true},"bake-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":115,"digest":"md5-hv2hRWaj1QWPPCgOfH+YRw==","length":3985,"stub":true},"bake-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":113,"digest":"md5-P6f+Qe7dAv3ziUcx24oseQ==","length":3888,"stub":true},"bake-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-Zczay0QdguF9ooOvsiqbmw==","length":3796,"stub":true},"bake-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-xqqU/hPslprxoq6aTkKGyA==","length":3744,"stub":true},"bake-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-dUrntrgyWwB6KhswP33cgQ==","length":3743,"stub":true},"bake-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-BrM4H+WH05upP1S+dlrf2w==","length":3747,"stub":true},"bake-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-/4XSZ/rRWJCOZuxa/Z8h9g==","length":3751,"stub":true},"bake-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-ANtUzwTEWMFlrtH6nxHSaQ==","length":3807,"stub":true},"bake-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-mbmN4mWutAdWGFzKHB4Vdg==","length":3821,"stub":true},"bake-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-QZ1GPLbm3FKHwbzsEXXRgw==","length":3773,"stub":true},"bake-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-nW7meco50n9PP+8VJiGqBw==","length":3767,"stub":true},"bake-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-1JKDWxMcpCo2P5uO/CWRug==","length":3622,"stub":true},"bake-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-VOxE3H2/1wt02KZSJqxmTw==","length":3626,"stub":true},"bake-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-vFq5OgVcMnStuD5ZBY79KA==","length":2297,"stub":true},"bake-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-EjS1PcKT29WM4D4f++4duw==","length":1648,"stub":true},"bake-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-ww1KYKYhjRk7y0Xh0GWYsA==","length":1466,"stub":true},"bake-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-0pWhN3wO+h8bkhduS1bjPg==","length":1467,"stub":true}}}},
{"id":"bake-bash","key":"bake-bash","value":{"rev":"3-7f44234711265df4d8d5d6cf91d374e5"},"doc":{"_id":"bake-bash","_rev":"3-7f44234711265df4d8d5d6cf91d374e5","name":"bake-bash","description":"Simple bash make utility","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"author":{"name":"Mario Gutierrez","email":"mario@mgutz.com"},"name":"bake-bash","description":"Simple bash make utility","version":"0.1.1","repository":{"url":"http://github.com/mgutz/bake"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"bin":{"bake":"./bake"},"_npmUser":{"name":"mgutz","email":"mario@mgutz.com"},"_id":"bake-bash@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"0a2b74166404ac0868612bd5553b203550718f53","tarball":"http://registry.npmjs.org/bake-bash/-/bake-bash-0.1.1.tgz"},"maintainers":[{"name":"mgutz","email":"mario@mgutz.com"}]}},"readme":"# Bake\n\nSimple Bash build/project utility in the style of rake.\n\nNot trying to reinvent wheel. Most node project Makefiles are just\nBash scripts.\n\n\n## Installation\n\n    npm install bake-bash\n\n\n# Usage\n\nDisplay tasks\n\n    bake\n\nRun task\n\n    bake <task>\n\n\n## Example Bakefile\n\n    PATH=node_modules/coffee-script/bin:$PATH\n\n    function private {\n        echo in private\n    }\n\n\n    #. Builds the project\n    function build {\n        # ensures clean is called only once\n        invoke clean\n        bake_ok building ...\n    }\n\n\n    #. Cleans the project\n    function clean {\n        bake_ok \"cleaning ...\"\n        private\n    }\n\n\n    #. Compiles coffee scripts\n    function coffee {\n        outdated build src || return 0\n        coffee -c -o build src\n        bake_ok \"coffe\" \"compiled\"\n    }\n\n\n    function on_task_not_found {\n        echo \"Task not found $1\"\n    }\n\n## Rules\n\n* `bake` searches the current and parent directories for a `Bakefile` to run.\n* Tasks are defined as normal Bash functions.\n* A task description is simply a comment that starts with `#.` and precedes\n  a function.\n\n\n## Functions\n\nPrints a red error message.\n\n    bake_error <action> <description>\n\n    example: bake_error \"compiling\" \"src/lib/test.coffee\"\n\nPrints a plain message.\n\n    bake_log <action> <description>\n\n    example: bake_log \"bake\" \"Processing bakefile...\"\n\nPrints a green ok message.\n\n    bake_ok <action> <descsription>\n\n    example: bake_ok \"compiling\" \"compiled src/lib/test.js\"\n\nPrints a cyan info message.\n\n    bake_info <action> <description>\n\n    example: bake_info \"bake\" \"built project in 700ms\"\n\nInvokes a task only once.\n\n    invoke <function_name>\n\n    example: invoke \"clean\"\n\nDetermines if target is older than reference, returning 1 if outdated.\n\n    outdated <target> <reference>\n\n    examples:\n\n    outdated build src || return 1          # skip rest of task\n    outdated build src && invoke \"compile\"  # compile if outdated\n\n\nRun a dynamic task when task `$1` is not found. For example, to run\na test as the first argument to `bake`, add this to `Bakefile`\n\n    function on_task_not_found {\n        [[ -f test/$1.js ]] && mocha test/$1.js && return 0\n        return 1\n    }\n","maintainers":[{"name":"mgutz","email":"mario@mgutz.com"}],"time":{"modified":"2012-06-08T16:28:51.995Z","created":"2012-06-08T16:28:50.834Z","0.1.1":"2012-06-08T16:28:51.995Z"},"author":{"name":"Mario Gutierrez","email":"mario@mgutz.com"},"repository":{"url":"http://github.com/mgutz/bake"},"_attachments":{"bake-bash-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-C6HaAJDM7dPZgbPI5IY2PA==","length":3947,"stub":true}}}},
{"id":"bake-js","key":"bake-js","value":{"rev":"102-6ef8f6ffd8c2fc856ca8de943ad25595"},"doc":{"_id":"bake-js","_rev":"102-6ef8f6ffd8c2fc856ca8de943ad25595","name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.19":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.1.19","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/bake-js.git"},"bugs":{"url":"http://github.com/DamonOehlman/bake-js/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"bake-js@0.1.19","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"197bc348b9f929bd38b8899750c837d8c993ea69","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.1.19.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.22":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.1.22","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/bake-js.git"},"bugs":{"url":"http://github.com/DamonOehlman/bake-js/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"bake-js@0.1.22","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0354aab9bdca78926941f819712e822a8208023b","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.1.22.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.24":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.1.24","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/bake-js.git"},"bugs":{"url":"http://github.com/DamonOehlman/bake-js/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"bake-js@0.1.24","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9fc5d66559a75ff4524d1e22ae7b6e2caf1fe271","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.1.24.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.25":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.1.25","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/bake-js.git"},"bugs":{"url":"http://github.com/DamonOehlman/bake-js/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"bake-js@0.1.25","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"37ab1cfd6a993066e3d3bf02b89a27c14f1bd9c9","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.1.25.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.26":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.1.26","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/buildjs/bake-js.git"},"bugs":{"url":"http://github.com/buildjs/bake-js/issues"},"contributors":[],"optionalDependencies":{},"readme":"# BakeJS\n\nBake is a javascript __application__ build tool that is designed to make building web apps as simple as possible.  \n\nIt's core reason for existence is to help with managing the dependencies web applications will require, and to make it simple for you to include libraries without having to know where those libraries actually come from.\n\n## Comparison to Other Build Tools\n\nBake is quite different to other build tools, and in general works very well in partnership with these tools.  It is fairly common for us at [Sidelab](http://www.sidelab.com/) to be combine something like [grunt](https://github.com/cowboy/grunt) with bake (using a `Makefile` or similar) to create a streamlined process for building an application.\n\nWith regards to build tools that actually perform similar functionality, you should investigate [Ender](https://github.com/ender-js/Ender) to determine which tool is a better fit for your needs.  The essential difference is that Bake pulls in dependencies from directly from the web, whereas Ender uses [NPM](http://npmjs.org/) as it's source of modules.  Neither approach is more right than the other, but depending on your needs one will likely be a better fit.\n\nAdditionally, if you are developing using [NodeJS](http://nodejs.org/) and prefer to work with [CommonJS](http://www.commonjs.org/) style `require` statements (and some of the inbuilt Node libraries) then something like [Browserify](https://github.com/substack/node-browserify) might be a better fit for your needs.  It is somewhat magical in the way it works :)\n\nSo why use Bake?  Bake is designed to work with the current development styles of building web applications now.  Additionally, it has been built to support other module require patterns such as [AMD](https://github.com/amdjs/amdjs-api) as they become more popular.  If this is the kind of thing you are after, then read on.\n\n## Getting Started: Installation\n\nTo be completed.\n\n## Getting Started: Building a Simple Project\n\nTo be completed.\n\n## Documentation\n\nFull documentation for bake is available at:\n\n<http://bakejs.readthedocs.org/>","_id":"bake-js@0.1.26","dist":{"shasum":"ebe107846ee9c3c06623d4098afc132febac7d8a","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.1.26.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.1.27":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.1.27","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/buildjs/bake-js.git"},"bugs":{"url":"http://github.com/buildjs/bake-js/issues"},"contributors":[],"optionalDependencies":{},"readme":"# BakeJS\n\nBake is a javascript __application__ build tool that is designed to make building web apps as simple as possible.  \n\nIt's core reason for existence is to help with managing the dependencies web applications will require, and to make it simple for you to include libraries without having to know where those libraries actually come from.\n\n## Comparison to Other Build Tools\n\nBake is quite different to other build tools, and in general works very well in partnership with these tools.  It is fairly common for us at [Sidelab](http://www.sidelab.com/) to be combine something like [grunt](https://github.com/cowboy/grunt) with bake (using a `Makefile` or similar) to create a streamlined process for building an application.\n\nWith regards to build tools that actually perform similar functionality, you should investigate [Ender](https://github.com/ender-js/Ender) to determine which tool is a better fit for your needs.  The essential difference is that Bake pulls in dependencies from directly from the web, whereas Ender uses [NPM](http://npmjs.org/) as it's source of modules.  Neither approach is more right than the other, but depending on your needs one will likely be a better fit.\n\nAdditionally, if you are developing using [NodeJS](http://nodejs.org/) and prefer to work with [CommonJS](http://www.commonjs.org/) style `require` statements (and some of the inbuilt Node libraries) then something like [Browserify](https://github.com/substack/node-browserify) might be a better fit for your needs.  It is somewhat magical in the way it works :)\n\nSo why use Bake?  Bake is designed to work with the current development styles of building web applications now.  Additionally, it has been built to support other module require patterns such as [AMD](https://github.com/amdjs/amdjs-api) as they become more popular.  If this is the kind of thing you are after, then read on.\n\n## Getting Started: Installation\n\nTo be completed.\n\n## Getting Started: Building a Simple Project\n\nTo be completed.\n\n## Documentation\n\nFull documentation for bake is available at:\n\n<http://bakejs.readthedocs.org/>","_id":"bake-js@0.1.27","dist":{"shasum":"1d0d4d4acaf141f381270ad99011feddf0ac0798","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.1.27.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.2.1":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.2.1","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.6.x < 0.9.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"https://github.com/cujojs/when/tarball/master","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/buildjs/bake-js.git"},"bugs":{"url":"http://github.com/buildjs/bake-js/issues"},"contributors":[],"optionalDependencies":{},"readme":"# BakeJS\n\nBake is a javascript __application__ build tool that is designed to make building web apps as simple as possible.  \n\nIt's core reason for existence is to help with managing the dependencies web applications will require, and to make it simple for you to include libraries without having to know where those libraries actually come from.\n\n## Comparison to Other Build Tools\n\nBake is quite different to other build tools, and in general works very well in partnership with these tools.  It is fairly common for us at [Sidelab](http://www.sidelab.com/) to be combine something like [grunt](https://github.com/cowboy/grunt) with bake (using a `Makefile` or similar) to create a streamlined process for building an application.\n\nWith regards to build tools that actually perform similar functionality, you should investigate [Ender](https://github.com/ender-js/Ender) to determine which tool is a better fit for your needs.  The essential difference is that Bake pulls in dependencies from directly from the web, whereas Ender uses [NPM](http://npmjs.org/) as it's source of modules.  Neither approach is more right than the other, but depending on your needs one will likely be a better fit.\n\nAdditionally, if you are developing using [NodeJS](http://nodejs.org/) and prefer to work with [CommonJS](http://www.commonjs.org/) style `require` statements (and some of the inbuilt Node libraries) then something like [Browserify](https://github.com/substack/node-browserify) might be a better fit for your needs.  It is somewhat magical in the way it works :)\n\nSo why use Bake?  Bake is designed to work with the current development styles of building web applications now.  Additionally, it has been built to support other module require patterns such as [AMD](https://github.com/amdjs/amdjs-api) as they become more popular.  If this is the kind of thing you are after, then read on.\n\n## Getting Started: Installation\n\nTo be completed.\n\n## Getting Started: Building a Simple Project\n\nTo be completed.\n\n## Documentation\n\nFull documentation for bake is available at:\n\n<http://bakejs.readthedocs.org/>","_id":"bake-js@0.2.1","dist":{"shasum":"df79bbde36223d0415534ea1627553204c01d582","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.2.1.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"directories":{}},"0.2.2":{"name":"bake-js","description":"Composing Small Javascript Libraries, Homebrew Style","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build"],"version":"0.2.2","main":"lib/bake.js","bin":{"bake":"./bin/bake"},"global":"true","engines":{"node":">= 0.6.x < 0.9.0"},"dependencies":{"async":"0.1.x","commander":"0.5.x","debug":"*","fstream":"0.1.x","formatter":"0.1.x","getit":"*","mkdirp":"*","out":"0.4.1","request":"2.9.x","rigger":"0.2.x","semver":"1.0.x","tar":"0.1.x","when":"1.3.x","underscore":"1.3.x"},"devDependencies":{"expect.js":"*"},"repository":{"type":"git","url":"git://github.com/buildjs/bake-js.git"},"bugs":{"url":"http://github.com/buildjs/bake-js/issues"},"contributors":[],"optionalDependencies":{},"readme":"# BakeJS\n\nBake is a javascript __application__ build tool that is designed to make building web apps as simple as possible.  \n\nIt's core reason for existence is to help with managing the dependencies web applications will require, and to make it simple for you to include libraries without having to know where those libraries actually come from.\n\n## Comparison to Other Build Tools\n\nBake is quite different to other build tools, and in general works very well in partnership with these tools.  It is fairly common for us at [Sidelab](http://www.sidelab.com/) to be combine something like [grunt](https://github.com/cowboy/grunt) with bake (using a `Makefile` or similar) to create a streamlined process for building an application.\n\nWith regards to build tools that actually perform similar functionality, you should investigate [Ender](https://github.com/ender-js/Ender) to determine which tool is a better fit for your needs.  The essential difference is that Bake pulls in dependencies from directly from the web, whereas Ender uses [NPM](http://npmjs.org/) as it's source of modules.  Neither approach is more right than the other, but depending on your needs one will likely be a better fit.\n\nAdditionally, if you are developing using [NodeJS](http://nodejs.org/) and prefer to work with [CommonJS](http://www.commonjs.org/) style `require` statements (and some of the inbuilt Node libraries) then something like [Browserify](https://github.com/substack/node-browserify) might be a better fit for your needs.  It is somewhat magical in the way it works :)\n\nSo why use Bake?  Bake is designed to work with the current development styles of building web applications now.  Additionally, it has been built to support other module require patterns such as [AMD](https://github.com/amdjs/amdjs-api) as they become more popular.  If this is the kind of thing you are after, then read on.\n\n## Getting Started: Installation\n\nTo be completed.\n\n## Getting Started: Building a Simple Project\n\nTo be completed.\n\n## Documentation\n\nFull documentation for bake is available at:\n\n<http://bakejs.readthedocs.org/>","_id":"bake-js@0.2.2","dist":{"shasum":"1f5e795704e79f3447e81c16a0ab9b0457857abd","tarball":"http://registry.npmjs.org/bake-js/-/bake-js-0.2.2.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]}},"readme":"# BakeJS\n\nBakeJS is a project designed to ease the pain and complexity of creating client-side Javascript applications.\n\n## Installation\n\nTo get started with BakeJS first install the command line tools via npm.  If you don't already have [NodeJS](http://nodejs.org/) installed then you will need to install it to get access to npm.\n\n```\nnpm install -g bake-js\n```\n\n_Depending on your installation, you may need to run this with the `sudo` command._\n\nOnce BakeJS is installed, you will then be able to access the `bake` command.  First thing you will want to do is fetch the current recipes from this github repo by running the `update` command:\n\n```\nbake update\n```\n\nIf everything has gone to plan, you should see the following output:\n\n```\nretrieving recipes from remote server...\nextracting recipes\n✓ done\n```\n\nWhile similar to the way the [homebrew](https://github.com/mxcl/homebrew) update command works except bake downloads the latest `.tar.gz` of this repo from github rather than interfacing with git.  General intention is that while the process will be less optimal with regards to bandwidth it is something that should work natively in Windows.\n\n## Composing Applications\n\nUsing BakeJS to generate an application file that is packaged with your application dependencies all into a single file is very simple.\n\nThe following is an example of how you might create an application that has dependencies on both [backbone](https://github.com/documentcloud/backbone) and [eve](https://github.com/DmitryBaranovskiy/eve):\n\n```js\n// dep: backbone, eve\n\nvar myApp = (function() {\n    // your app code here...\n})();\n```\n\nThen run `bake` against your target file:\n\n```\nbake examples/test.js\n```\n\nWhen run the dependencies are analysed, child dependencies resolved (e.g. underscore is specified as a dependency in the [backbone recipe](/DamonOehlman/bake-js/blob/master/library/recipes/backbone)) and then all required files are pulled down from their remote sources and pushed to the start of the resulting output.\n\nBy default, bake writes output to `STDOUT` but in most cases you will want to redirect this output to a file.\n\n## Writing Recipes\n\nRecipes are simply plain text files that are stored in the [library/recipes](/DamonOehlman/bake-js/tree/master/library/recipes) folder in this repository.  For example, the backbone recipe is shown below:\n\n```\n# dsc: Give your JS App some Backbone with Models, Views, Collections, and Events\n# tag: mvc, framework\n# url: http://backbonejs.org\n# src: https://github.com/documentcloud/backbone\n# bug: https://github.com/documentcloud/backbone/issues\n# req: underscore\n\ngithub://documentcloud/backbone/backbone.js\n```\n\nThe structure of the file is pretty simple.  Lines starting with the hash character are used to describe attributes of the recipe, of which the most important one to take note of is the `req` attribute.  This attribute is used to specify other recipes that are require to make this library work correctly.  For multiple dependencies use a comma delimited list.\n\nAfter the attribute definition section comes one or more [getit](https://github.com/DamonOehlman/getit) URL schemes that reference the online location of the file(s) required to make this library work.  In the case of most libraries, this will be a single file, but you can include multiple lines here for multiple files if necessary.\n\n## Companion Tools\n\nBakeJS aims to make combining multiple JS libraries when building a JS-powered application simple.  It does not, however, aim to simplify the process of creating that library through allowing you to concatenate local files together into a single JS library.  \n\nIf you are writing a JS library, then I would highly recommend checking out one of the following tools, or alternatively, use a simple makefile to concatenate your files into a single JS file.  For many people this is the simplest and most effective way.","maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"time":{"modified":"2012-08-02T13:44:19.128Z","created":"2012-03-11T01:55:37.272Z","0.0.1":"2012-03-11T01:55:41.510Z","0.1.1":"2012-03-12T06:08:06.240Z","0.1.2":"2012-03-12T06:53:26.714Z","0.1.3":"2012-03-13T05:00:48.249Z","0.1.4":"2012-03-13T06:27:47.061Z","0.1.5":"2012-03-17T00:15:39.391Z","0.1.6":"2012-03-21T01:50:45.065Z","0.1.7":"2012-03-29T10:45:28.563Z","0.1.9":"2012-03-30T03:01:49.897Z","0.1.11":"2012-04-04T12:12:40.679Z","0.1.12":"2012-04-05T02:08:15.180Z","0.1.13":"2012-04-05T04:03:31.401Z","0.1.14":"2012-04-05T06:15:36.660Z","0.1.15":"2012-04-18T23:51:27.158Z","0.1.17":"2012-04-24T00:38:17.885Z","0.1.18":"2012-05-01T12:57:56.455Z","0.1.19":"2012-05-01T23:10:59.232Z","0.1.20":"2012-05-11T04:51:21.690Z","0.1.21":"2012-05-11T06:06:57.924Z","0.1.22":"2012-05-11T06:38:54.653Z","0.1.23":"2012-05-21T05:50:49.491Z","0.1.24":"2012-06-08T06:42:58.137Z","0.1.25":"2012-06-17T23:25:39.909Z","0.1.26":"2012-07-17T08:43:56.909Z","0.1.27":"2012-07-17T09:14:54.145Z","0.2.0":"2012-07-24T04:03:12.523Z","0.2.1":"2012-07-24T04:04:42.007Z","0.2.2":"2012-07-26T03:35:23.849Z"},"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"repository":{"type":"git","url":"git://github.com/buildjs/bake-js.git"},"users":{"fgribreau":true},"_attachments":{"bake-js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-XOpz2Ft0dUwD1lECWfb5Dg==","length":568779,"stub":true},"bake-js-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-eUmbtjEFa6j3T55u9wGmaA==","length":559258,"stub":true},"bake-js-0.1.27.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-wp+cT7HUhYdOqPFpXTjAJQ==","length":646773,"stub":true},"bake-js-0.1.26.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-bCf+0DbX6Sh/9OGcZ+fQwQ==","length":646402,"stub":true},"bake-js-0.1.25.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-DYc4y1DLLNqcDmC79LUoGQ==","length":645757,"stub":true},"bake-js-0.1.24.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-26+3mEGqtnUmk26qDTuhhg==","length":634852,"stub":true},"bake-js-0.1.22.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-TGwcrrQDH3wUudRnnZ+jow==","length":581371,"stub":true},"bake-js-0.1.19.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-R9bWJdAib6VGUeVkxKqN9A==","length":580824,"stub":true}}}},
{"id":"baker","key":"baker","value":{"rev":"17-41854eca76ab7aaccb7eef13eba88f78"},"doc":{"_id":"baker","_rev":"17-41854eca76ab7aaccb7eef13eba88f78","name":"baker","description":"bakes your cake","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"name":"baker","description":"bakes your cake","version":"0.0.0","repository":{"type":"git","url":"git://github.com/elliotlai/baker.git"},"main":"index.js","bin":{"baker":"bin/baker"},"engines":{"node":"~0.6.2 || 0.6.2-pre"},"dependencies":{"coffee-script":">= 1.1.3"},"devDependencies":{},"_npmUser":{"name":"elliot","email":"ellliotlai@gmail.com"},"_id":"baker@0.0.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2-pre","_defaultsLoaded":true,"dist":{"shasum":"fa5b59d9683d8c76a59e41af1feedaeaeb4443b0","tarball":"http://registry.npmjs.org/baker/-/baker-0.0.0.tgz"},"maintainers":[{"name":"elliot","email":"ellliotlai@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"name":"baker","description":"bakes your cake","version":"0.1.0","repository":{"type":"git","url":"git://github.com/elliotlai/baker.git"},"main":"index.js","bin":{"baker":"bin/baker"},"engines":{"node":"~0.6.2 || 0.6.2-pre"},"dependencies":{"coffee-script":">= 1.1.3"},"devDependencies":{},"_npmUser":{"name":"elliot","email":"ellliotlai@gmail.com"},"_id":"baker@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2-pre","_defaultsLoaded":true,"dist":{"shasum":"f6d83424a96f33f12280f2f0c317e9e6a3bcebae","tarball":"http://registry.npmjs.org/baker/-/baker-0.1.0.tgz"},"maintainers":[{"name":"elliot","email":"ellliotlai@gmail.com"}]}},"readme":"# Baker\n\nBake you a Cake\n\n## Install\n\n    npm install -g baker\n    \n## Usage\n\n    baker\n","maintainers":[{"name":"elliot","email":"ellliotlai@gmail.com"}],"time":{"modified":"2011-11-28T07:57:34.125Z","created":"2011-11-23T08:32:09.123Z","0.0.0":"2011-11-23T08:32:12.751Z","0.1.0":"2011-11-28T07:57:34.125Z"},"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"repository":{"type":"git","url":"git://github.com/elliotlai/baker.git"},"_attachments":{"baker-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ptyJ9/JHnx4up0AP48pLog==","length":4341,"stub":true},"baker-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gvGVK5Adn5rTyHZSANW/hw==","length":3277,"stub":true}}}},
{"id":"bal-util","key":"bal-util","value":{"rev":"126-acb2772dfff3f20f3186db4ee6ed90ef"},"doc":{"_id":"bal-util","_rev":"126-acb2772dfff3f20f3186db4ee6ed90ef","name":"bal-util","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","dist-tags":{"latest":"1.13.0"},"versions":{"0.1.0":{"name":"bal-util","version":"0.1.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"d47d1b909e63f8735722d9fb0a318cbdf3c56381","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"bal-util","version":"0.1.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"714e7ff5ad5a9c2622f67b39336cb223985c2285","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"bal-util","version":"0.1.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.2","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"4b83f51fdcba75b8c2e4c569186e4f46aa284ae3","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"bal-util","version":"0.1.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.3","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"2c1f4227072941ebb76fbb75baa2576fea9c3b2a","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"bal-util","version":"0.1.4","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.4","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c9fc6368246975a736a27b96e648d2e73f24a011","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.4.tgz"},"scripts":{}},"0.1.5":{"name":"bal-util","version":"0.1.5","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.5","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"71cb37498e74928ed5df4b2a5edba396e274a074","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.5.tgz"},"scripts":{}},"0.1.6":{"name":"bal-util","version":"0.1.6","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.1.6","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a97d82c9b22dbe6fc7325b9876b3f8553785770d","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.1.6.tgz"},"scripts":{}},"0.2.0":{"name":"bal-util","version":"0.2.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.2.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b9ca71fd12caa77226c1a0e927996bba3e2e6981","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"bal-util","version":"0.2.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.2.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"7feefadde8cff74645f2b97eb2327c9f268e02de","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.2.1.tgz"},"scripts":{}},"0.2.2":{"name":"bal-util","version":"0.2.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.2.2","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"957672329f1f8b32fca9fcb2951344c16791cb50","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.2.2.tgz"},"scripts":{}},"0.2.3":{"name":"bal-util","version":"0.2.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","dependencies":{},"devDependencies":{},"_id":"bal-util@0.2.3","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"f746a41d981eeff3f9f1ef4087d36b30d3b0d2df","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.2.3.tgz"},"scripts":{}},"0.3.0":{"name":"bal-util","version":"0.3.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_id":"bal-util@0.3.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.7","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b6c4e6f606213d13ec9738d728bbc4a604f5ffda","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.3.0.tgz"},"scripts":{}},"0.4.0":{"name":"bal-util","version":"0.4.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_id":"bal-util@0.4.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.7","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"8daafccebe025b4ab7acf9368e3f05bcde63cfab","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.4.0.tgz"},"scripts":{}},"0.5.0":{"name":"bal-util","version":"0.5.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/bal-util/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bal-util@0.5.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"f3f5a2e9800690ee4c6b34167f8692f97fb6007c","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.5.0.tgz"},"scripts":{}},"0.6.0":{"name":"bal-util","version":"0.6.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/bal-util/0.6.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bal-util@0.6.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f52c29ed9fd422cbc9ef41493865bc9677d653f5","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.6.0.tgz"},"scripts":{}},"0.7.0":{"name":"bal-util","version":"0.7.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.1.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/bal-util/0.7.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bal-util@0.7.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6cefbc4dbc00e175d0f30984cbaa2874fe1ea929","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.7.0.tgz"}},"0.8.0":{"name":"bal-util","version":"0.8.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.1.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@0.8.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"0d04c6541c4aca84a1a52a69610c22ce39c99b65","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.8.0.tgz"}},"0.8.1":{"name":"bal-util","version":"0.8.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.2.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@0.8.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"ad21fbba5192dff94edad180609475d3cad203bf","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.8.1.tgz"}},"0.9.0":{"name":"bal-util","version":"0.9.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.2.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@0.9.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a44c706bd648141208aa64002599f7dda0373e4b","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-0.9.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source file here](https://github.com/balupton/docpad/blob/master/lib/util.coffee#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tutil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tutil = require 'bal-util'\n\t```\n\n\n## History\n\n- v0.9 January 18, 2012\n\t- Added `exec`, `initNodeModules`, `initGitSubmodules`, `EventSystem.when`\n\t- Added support for no callbacks\n\n- v0.8 November 2, 2011\n\t- Considerable improvements to `scandir`, `cpdir` and `rmdir`\n\t\t- Note, passing `false` as the file or dir actions will now skip all of that type. Pass `null` if you do not want that.\n\t\t- `dirAction` is now fired before we read the directories children, if you want it to fire after then in the next callback, pass a callback in the 3rd argument. See `rmdir` for an example of this.\n\t- Fixed npm web to url warnings\n\n- v0.7 October 3, 2011\n\t- Added `versionCompare` and `packageCompare` functions\n\t\t- Added `request` dependency\n\n- v0.6 September 14, 2011\n\t- Updated `util.Group` to support `async` and `sync` grouping\n\n- v0.4 June 2, 2011\n\t- Added util.type for testing the type of a variable\n\t- Added util.expandPath and util.expandPaths\n\n- v0.3 June 1, 2011\n\t- Added util.Group class for your async needs :)\n\n- v0.2 May 20, 2011\n\t- Added some tests with expresso\n\t- util.scandir now returns err,list,tree\n\t- Added util.writetree\n\n- v0.1 May 18, 2011\n\t- Initial commit\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\nCopyright 2011 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.0.0":{"name":"bal-util","version":"1.0.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"mocha":"0.11.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/util.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.0.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b768d1212931f498a858bb996361bba28f23f6f1","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.0.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source file here](https://github.com/balupton/bal-util.npm/blob/master/lib/util.coffee#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tutil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tutil = require 'bal-util'\n\t```\n\n\n## History\n\nDiscover the history inside the `History.md` file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\nCopyright 2011 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.1.0":{"name":"bal-util","version":"1.1.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.11.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"main":"./lib/balutil.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"46aee3d5196aeff16eb5c27b91bb256cb90e2c06","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.1.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source file here](https://github.com/balupton/bal-util.npm/blob/master/lib/util.coffee#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require 'bal-util'\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util.npm/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](https://github.com/balupton/bal-util.npm/blob/master/LICENSE.txt)\nCopyright 2011 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.2.0":{"name":"bal-util","version":"1.2.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.11.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"scripts":{"test":"make test"},"main":"./lib/balutil.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.2.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0290d7976b931ef4d804901ff6b383f57fab6187","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.2.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util.npm/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require 'bal-util'\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util.npm/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.3.0":{"name":"bal-util","version":"1.3.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","collab","collaboration","sync","realtime"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.13.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha  --reporter spec  --ui bdd  --ignore-leaks  --growl"},"main":"./lib/balutil.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.3.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8fbdb8a43127313f90065631ed7e272c25cb3f78","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.3.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util.npm/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require 'bal-util'\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util.npm/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.4.0":{"name":"bal-util","version":"1.4.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util.npm","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.npm.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.13.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"fff4022c7b6717df900c0ad34c8a786a2b9fc13c","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.4.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util.npm/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require 'bal-util'\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util.npm/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.4.1":{"name":"bal-util","version":"1.4.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.13.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fa73d1eb068f5229d8c2d5ed13fd1dcb2fb2d28f","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.4.1.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util.npm/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require 'bal-util'\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util.npm/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.4.2":{"name":"bal-util","version":"1.4.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"dependencies":{"request":"2.9.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.13.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.4.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e786bb49211c58ee9d0d1f9347148ee65b85eadc","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.4.2.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util.npm/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\trequire('coffee-script');\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require 'bal-util'\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util.npm/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.4.3":{"name":"bal-util","version":"1.4.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"dependencies":{"request":"2.9.x","coffee-script":"1.3.x"},"devDependencies":{"docco":"0.3.x","mocha":"0.13.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./main.js","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.4.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"6a551bdf5c860220e824a294c2d65054180ee113","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.4.3.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require('bal-util')\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.5.0":{"name":"bal-util","version":"1.5.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x","coffee-script":"1.3.x"},"devDependencies":{"docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./main.js","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3d6c013f3cb8461c1505ea3cdc05b386a1e47320","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.5.0.tgz"},"readme":"# Balupton's Node.js Utility Functions\n\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n\n[Take a look at its source here](https://github.com/balupton/bal-util/tree/master/lib#files)\n\n\n## Installing\n\n\n1. [Install Node.js](https://github.com/balupton/node/wiki/Installing-Node.js)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n\n- With Node.js in JavaScript\n\n\t``` javascript\n\tvar balUtil = require('bal-util');\n\t```\n\n- With Node.js in CoffeeScript\n\t\n\t``` coffeescript\n\tbalUtil = require('bal-util')\n\t```\n\n\n## History\n\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util/blob/master/History.md#files) file\n\n\n## License\n\nLicensed under the [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n"},"1.6.0":{"name":"bal-util","version":"1.6.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.6.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a64c408d8f39f8110d55d06eeb9c69ca69fcc845","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.6.0.tgz"},"readme":""},"1.6.1":{"name":"bal-util","version":"1.6.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.6.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"141dbabcdf33d5ad02abe8935bf8e9d18ed4ac4b","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.6.1.tgz"},"readme":""},"1.6.2":{"name":"bal-util","version":"1.6.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.6.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ddc0a317c238e4656e2c43f7fe2530dc812faef9","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.6.2.tgz"},"readme":""},"1.6.3":{"name":"bal-util","version":"1.6.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.6.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f5d548d94b5cae61a2b976447f9ff3975e0f783f","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.6.3.tgz"},"readme":""},"1.6.4":{"name":"bal-util","version":"1.6.4","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.6.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"eb3b63cd3bdd99d01f05f28776379def025978f9","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.6.4.tgz"},"readme":""},"1.6.5":{"name":"bal-util","version":"1.6.5","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.0.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.6.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"688ed008964153eb8d63a31dff92df0f76554a13","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.6.5.tgz"},"readme":""},"1.7.0":{"name":"bal-util","version":"1.7.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.1.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.7.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3bd0858c6c45cfc801cbe8fbaf3246f318dffb11","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.7.0.tgz"},"readme":""},"1.8.0":{"name":"bal-util","version":"1.8.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","docco":"0.3.x","mocha":"1.1.x"},"directories":{"lib":"lib"},"scripts":{"test":"node ./node_modules/mocha/bin/mocha"},"main":"./lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e479bcce508d12e89c072911b40bba6b91176ae8","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.0.tgz"},"readme":""},"1.8.1":{"name":"bal-util","version":"1.8.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"optionalDependencies":{"request":"2.9.x"},"devDependencies":{"coffee-script":"1.3.x","joe":"0.3.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.1","dependencies":{"request":"2.9.x"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"c64453241dc499404c536190b9636c8feacf8971","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.1.tgz"},"readme":""},"1.8.2":{"name":"bal-util","version":"1.8.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"devDependencies":{"coffee-script":"1.3.x","joe":"0.3.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"85a5dfa4e788dee3b774a813092303aaed6d186b","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.2.tgz"},"readme":""},"1.8.3":{"name":"bal-util","version":"1.8.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"devDependencies":{"coffee-script":"1.3.x","joe":"0.3.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9ca35cd1215ebbb19d28fc2392ce6559e52b4754","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.3.tgz"}},"1.8.4":{"name":"bal-util","version":"1.8.4","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7722271b50a8cb0476fc6b02c2d47772ae528599","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.4.tgz"},"readme":""},"1.8.5":{"name":"bal-util","version":"1.8.5","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"84206994997c8e52cb8ad34afca2aa269328c9e7","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.5.tgz"},"readme":""},"1.8.6":{"name":"bal-util","version":"1.8.6","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.8.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"c3f5c1c6a1dca8b2cb1c4b43fce4a9e55c6a234f","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.6.tgz"},"readme":""},"1.8.8":{"name":"bal-util","version":"1.8.8","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.8.8","dist":{"shasum":"f431ebac8f07aa628b49cf81141f381b27f5670b","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.8.8.tgz"},"readme":""},"1.9.0":{"name":"bal-util","version":"1.9.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.9.0","dist":{"shasum":"10fc4c7fd54d9f47946a03ef2b7193c91d8a244c","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.9.0.tgz"},"readme":""},"1.9.1":{"name":"bal-util","version":"1.9.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.9.1","dist":{"shasum":"ab1d2cdca4abe2aa3975aaaa1f4fa2b8b4fe6057","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.9.1.tgz"},"readme":""},"1.9.2":{"name":"bal-util","version":"1.9.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.9.2","dist":{"shasum":"e8b5b04f2068f17b6993292631f2d6f4814548e7","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.9.2.tgz"},"readme":""},"1.9.3":{"name":"bal-util","version":"1.9.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.9.3","dist":{"shasum":"65dbc3764bd13a590075ddc1f956107d0f8ed161","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.9.3.tgz"},"readme":""},"1.9.4":{"name":"bal-util","version":"1.9.4","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"git://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"bal-util@1.9.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"bdec11f0bfc29abcceff096646af9e9ccbd63900","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.9.4.tgz"},"readme":""},"1.10.0":{"name":"bal-util","version":"1.10.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.10.0","dist":{"shasum":"4864e2d7fff38ef82468ae6d84740fae14012990","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.10.0.tgz"},"readme":""},"1.10.1":{"name":"bal-util","version":"1.10.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.10.1","dist":{"shasum":"b6c19714e9814d7174233a3ca3d6fdd564c15440","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.10.1.tgz"},"readme":""},"1.10.2":{"name":"bal-util","version":"1.10.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.10.2","dist":{"shasum":"f3eb3d74204d5216b2e3dc01f6e3ca9b1e6dffb3","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.10.2.tgz"},"readme":""},"1.10.3":{"name":"bal-util","version":"1.10.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.10.3","dist":{"shasum":"fc28e164870b5b1f26ac7c2c2450b49c6050f139","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.10.3.tgz"},"readme":""},"1.11.0":{"name":"bal-util","version":"1.11.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=list"},"main":"./out/lib/balutil","_id":"bal-util@1.11.0","dist":{"shasum":"579c8714389a8ce3701add4714e19de98a190c36","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.11.0.tgz"},"readme":""},"1.11.1":{"name":"bal-util","version":"1.11.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.11.1","dist":{"shasum":"ffdcd332dd69a7c455d4634666e6128c8e8fcdd8","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.11.1.tgz"},"readme":""},"1.11.2":{"name":"bal-util","version":"1.11.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.11.2","dist":{"shasum":"4961264a1b603aeffb60f688d99054313b22d414","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.11.2.tgz"},"readme":""},"1.12.0":{"name":"bal-util","version":"1.12.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.12.0","dist":{"shasum":"0f2263d3a3456253a302c66fb6714cbff9594a39","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.12.0.tgz"},"readme":""},"1.12.1":{"name":"bal-util","version":"1.12.1","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.12.1","dist":{"shasum":"151a631e7d73c7ffa1d53dc3fa95ff5924617334","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.12.1.tgz"},"readme":""},"1.12.2":{"name":"bal-util","version":"1.12.2","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.12.2","dist":{"shasum":"9782d377aee938927c831158a67a87703f6878ab","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.12.2.tgz"},"readme":""},"1.12.3":{"name":"bal-util","version":"1.12.3","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.12.3","dist":{"shasum":"c2d319939f67ee417e50b41377479d481b126e98","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.12.3.tgz"},"readme":""},"1.12.4":{"name":"bal-util","version":"1.12.4","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.12.4","dist":{"shasum":"afbe9c5621aa9682f8e002ef18324af833f176b3","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.12.4.tgz"},"readme":""},"1.12.5":{"name":"bal-util","version":"1.12.5","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","_id":"bal-util@1.12.5","dist":{"shasum":"709286c04d376801d2fc0fe1268834c5b0577dbc","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.12.5.tgz"},"readme":""},"1.13.0":{"name":"bal-util","version":"1.13.0","description":"Common utility functions for Node.js used and maintained by Benjamin Lupton","homepage":"https://github.com/balupton/bal-util","keywords":["javascript","flow","control","async","sync","tasks","batch","utility","util","utilities","paths","path","events","event","module","modules","compare","comparison","html"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bal-util/issues"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"coffee-script":"1.3.x","joe":"1.0.x"},"directories":{"lib":"./out/lib"},"scripts":{"test":"node ./out/test/everything.test.js --joe-reporter=console"},"main":"./out/lib/balutil","readme":"# Balupton's Node.js Utility Functions [![Build Status](https://secure.travis-ci.org/balupton/bal-util.png?branch=master)](http://travis-ci.org/balupton/bal-util)\nThis project contains several utility functions used and maintained by Benjamin Lupton\n\n\n## What it provides\n[Take a look at its source here](https://github.com/balupton/bal-util/tree/master/lib#files)\n\n\n## Installing\n1. [Install Node.js](https://github.com/bevry/community/wiki/Installing-Node)\n\n2. Install it\n\n\t\tnpm install bal-util\n\n\n## Using\n[You can discover how to use bal-util by referring to the `Using Page` on the Wiki](https://github.com/balupton/bal-util/wiki/Using). [You can check out the rest of the wiki here.](https://github.com/balupton/bal-util/wiki)\n\n\n## History\nYou can discover the history inside the [History.md](https://github.com/balupton/bal-util/blob/master/History.md#files) file\n\n\n## License\nLicensed under the incredibly [permissive](http://en.wikipedia.org/wiki/Permissive_free_software_licence) [MIT License](http://creativecommons.org/licenses/MIT/)\n<br/>Copyright &copy; 2011-2012 [Benjamin Arthur Lupton](http://balupton.com)\n","_id":"bal-util@1.13.0","dist":{"shasum":"5aaf11bc112a95f540dc96dcad4df4d9cf88db39","tarball":"http://registry.npmjs.org/bal-util/-/bal-util-1.13.0.tgz"}}},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"time":{"modified":"2012-08-09T13:16:00.916Z","created":"2011-05-18T02:18:42.678Z","0.1.0":"2011-05-18T02:18:44.212Z","0.1.1":"2011-05-18T04:57:26.003Z","0.1.2":"2011-05-18T04:59:26.176Z","0.1.3":"2011-05-19T03:06:27.171Z","0.1.4":"2011-05-19T03:11:50.034Z","0.1.5":"2011-05-19T03:15:00.600Z","0.1.6":"2011-05-19T03:22:17.115Z","0.2.0":"2011-05-20T00:30:53.570Z","0.2.1":"2011-05-20T01:46:51.268Z","0.2.2":"2011-05-20T01:56:24.701Z","0.2.3":"2011-05-23T06:45:11.994Z","0.3.0":"2011-05-31T15:37:51.450Z","0.4.0":"2011-06-02T03:48:08.752Z","0.5.0":"2011-07-15T04:01:09.377Z","0.6.0":"2011-09-14T10:46:42.076Z","0.7.0":"2011-10-03T03:47:40.905Z","0.8.0":"2011-11-02T08:42:17.674Z","0.8.1":"2011-11-13T11:41:31.434Z","0.9.0":"2012-01-18T08:31:51.477Z","1.0.0":"2012-02-05T12:07:24.502Z","1.1.0":"2012-02-11T09:02:50.017Z","1.2.0":"2012-02-14T07:11:12.679Z","1.3.0":"2012-02-26T07:33:21.895Z","1.4.0":"2012-04-01T23:39:30.493Z","1.4.1":"2012-04-05T10:16:29.469Z","1.4.2":"2012-04-05T10:48:08.757Z","1.4.3":"2012-04-14T02:56:15.382Z","1.5.0":"2012-04-18T07:35:18.959Z","1.6.0":"2012-05-04T02:37:23.003Z","1.6.1":"2012-05-04T03:37:28.681Z","1.6.2":"2012-05-14T06:00:48.429Z","1.6.3":"2012-05-22T08:04:41.259Z","1.6.4":"2012-05-30T04:56:27.820Z","1.6.5":"2012-05-30T06:03:42.868Z","1.7.0":"2012-06-06T10:09:04.579Z","1.8.0":"2012-06-09T01:24:17.501Z","1.8.1":"2012-06-09T02:22:49.052Z","1.8.2":"2012-06-09T03:50:42.398Z","1.8.3":"2012-06-09T04:06:08.043Z","1.8.4":"2012-06-11T07:09:50.534Z","1.8.5":"2012-06-11T10:12:36.571Z","1.8.6":"2012-06-19T10:40:34.737Z","1.8.8":"2012-06-20T10:16:39.153Z","1.9.0":"2012-06-20T23:43:44.419Z","1.9.1":"2012-06-21T01:07:11.158Z","1.9.2":"2012-06-21T01:43:47.344Z","1.9.3":"2012-06-22T03:26:28.978Z","1.9.4":"2012-06-22T09:59:37.146Z","1.10.0":"2012-06-26T10:25:23.311Z","1.10.1":"2012-06-26T10:48:06.407Z","1.10.2":"2012-06-26T12:15:08.163Z","1.10.3":"2012-06-26T12:39:55.346Z","1.11.0":"2012-07-01T04:10:18.949Z","1.11.1":"2012-07-04T02:18:13.995Z","1.11.2":"2012-07-07T10:37:53.492Z","1.12.0":"2012-07-07T13:42:28.489Z","1.12.1":"2012-07-09T19:22:47.061Z","1.12.2":"2012-07-12T02:51:49.997Z","1.12.3":"2012-07-12T03:43:08.753Z","1.12.4":"2012-07-12T06:12:04.322Z","1.12.5":"2012-07-18T00:39:11.871Z","1.13.0":"2012-08-09T13:16:00.916Z"},"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"repository":{"type":"git","url":"http://github.com/balupton/bal-util.git"},"users":{"fgribreau":true},"_attachments":{"bal-util-1.13.0.tgz":{"content_type":"application/octet-stream","revpos":126,"digest":"md5-SFjT+GrMjvPtvea7MTA6Ww==","length":18104,"stub":true},"bal-util-1.12.5.tgz":{"content_type":"application/octet-stream","revpos":123,"digest":"md5-2rK4FYCbaMWcFAqN7ZrjVA==","length":12853,"stub":true},"bal-util-1.12.4.tgz":{"content_type":"application/octet-stream","revpos":121,"digest":"md5-XGTSMLWfP+KYuvmi+dMj4Q==","length":12868,"stub":true},"bal-util-1.12.3.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-ad1eqtRQNdr+rTbY9PIE/Q==","length":12812,"stub":true},"bal-util-1.12.2.tgz":{"content_type":"application/octet-stream","revpos":117,"digest":"md5-Dou6b/mLbhuOlIrGkFEXGw==","length":12710,"stub":true},"bal-util-1.12.1.tgz":{"content_type":"application/octet-stream","revpos":115,"digest":"md5-Y2FOAdGYX2KAiaJRrKwOMA==","length":12694,"stub":true},"bal-util-1.12.0.tgz":{"content_type":"application/octet-stream","revpos":113,"digest":"md5-AHdGPRzUgFIWCxSO4FSTxg==","length":12706,"stub":true},"bal-util-1.11.2.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-bls1J8AicVvIwArQCkIxdA==","length":12529,"stub":true},"bal-util-1.11.1.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-04Cp+8bz+fhZHAEOzjwAOw==","length":12441,"stub":true},"bal-util-1.11.0.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-aeerLThJEUisxKOfBV1X6g==","length":12353,"stub":true},"bal-util-1.10.3.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-VkP4TnZFE9DjCV0pD2zQfw==","length":11499,"stub":true},"bal-util-1.10.2.tgz":{"content_type":"application/octet-stream","revpos":103,"digest":"md5-hLYqL2pkYRfuPOuPqQkI9w==","length":11489,"stub":true},"bal-util-1.10.1.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-YP1ZYCg9gR7YMDpJjRlVaw==","length":11479,"stub":true},"bal-util-1.10.0.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-0IVKc9t4KQrz02LkiQEw+w==","length":11492,"stub":true},"bal-util-1.9.4.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-tbG8ifhL6j8KOGPf/4SJbg==","length":11112,"stub":true},"bal-util-1.9.3.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-UvlPF5QbtPXa3bv0HOokFw==","length":11103,"stub":true},"bal-util-1.9.2.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-O51/LGeMTvbqM+9esMk4pQ==","length":10948,"stub":true},"bal-util-1.9.1.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-zPh5b7CDNfyjYycK8SOXcw==","length":10883,"stub":true},"bal-util-1.9.0.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-D7Uu2YmnRjYLxlFzYwHLuw==","length":10895,"stub":true},"bal-util-1.8.8.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-vxwRg/SJ43V4911CQhzA3w==","length":10831,"stub":true},"bal-util-1.8.6.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-BifwtgALosnUyWpSbt4eeQ==","length":10760,"stub":true},"bal-util-1.8.5.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-E8zj1i75ysONl6uT+KdXng==","length":10700,"stub":true},"bal-util-1.8.4.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-vFwS5/WDRBQ5a1sdTogYnw==","length":10849,"stub":true},"bal-util-1.8.3.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-0U5aBRS8qd6sA8c9VZWBGQ==","length":30720,"stub":true},"bal-util-1.8.2.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-TpHZBDQsheA5M0pl13YnDg==","length":21794,"stub":true},"bal-util-1.8.1.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-1s2SnVnd8qbSk+ZAWyib/w==","length":21664,"stub":true},"bal-util-1.8.0.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-tnJP1+t6g1gG6A5/8RM3WQ==","length":10536,"stub":true},"bal-util-1.7.0.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-6Y7CC+ByP+lOI2xmlTgOfA==","length":9896,"stub":true},"bal-util-1.6.5.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-UoJd8WczEulMCWSzyGiiXA==","length":9782,"stub":true},"bal-util-1.6.4.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-Tu4HF9JUcUiYxHu1wq+7LA==","length":9774,"stub":true},"bal-util-1.6.3.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-HdYotc0IPztFhWb8dEJ6Tg==","length":9576,"stub":true},"bal-util-1.6.2.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-fZjLxbMpf0GTuAoUunbPQQ==","length":9507,"stub":true},"bal-util-1.6.1.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-0cCa/+i6NqDoKWGBatNafQ==","length":9340,"stub":true},"bal-util-1.6.0.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-dwZXZbZW+yXHXHRHif8Qcw==","length":9358,"stub":true},"bal-util-1.5.0.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-jTEPq8myg0gxxYEvy718Pw==","length":34442,"stub":true},"bal-util-1.4.3.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-/pX6w5EaSlhum+tCNEy7lw==","length":33591,"stub":true},"bal-util-1.4.2.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-ABlKnRtpsZ+RjF3Ton7QhA==","length":30180,"stub":true},"bal-util-1.4.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-PLdHMwNSaoZQrn0Mrz+d4w==","length":30048,"stub":true},"bal-util-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-qnkmD67y+1y6jLGbAnzquw==","length":29763,"stub":true},"bal-util-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-wWi1JPW2/w93vmoJXgWyDg==","length":28313,"stub":true},"bal-util-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-fxNxIlFG1CIJPtkFf0nUQw==","length":27857,"stub":true},"bal-util-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-faw5VtAMzduukfD+ElOx5Q==","length":27535,"stub":true},"bal-util-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-wQ+8B5G2Cae9JRXX48/WSw==","length":11646,"stub":true},"bal-util-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-JkxGWFGS+gwwyIa4bOW1BA==","length":15682,"stub":true},"bal-util-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-A1moTZuEaEfGT/eRF9huSQ==","length":10240,"stub":true},"bal-util-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-hFuWoahpS0spWX5alYnblw==","length":10240,"stub":true},"bal-util-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-MVzdIRrE3+2LqISOcSI/vQ==","length":7076,"stub":true},"bal-util-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-gYJnik30DevBHktbQMIwEg==","length":5957,"stub":true},"bal-util-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-+z2/mO2+k17Mrav9cWo7nQ==","length":5468,"stub":true},"bal-util-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-yZ+XxSzpogSsUiqHAUvYaQ==","length":5270,"stub":true},"bal-util-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-VYJcRpRCxVB/ew51bcsVcA==","length":63738,"stub":true},"bal-util-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-GBAfYAWr54Zkj1v4PHFMcw==","length":63247,"stub":true},"bal-util-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-3E9yqFXmOreh0vs7DI3WMw==","length":63191,"stub":true},"bal-util-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-+6DsYYlkLz96mbCWoXCRew==","length":63339,"stub":true},"bal-util-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-4LWSeyVUpmyJxIz4k6pAAw==","length":63462,"stub":true},"bal-util-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-eEnUWXkUMjIUK4fLHfwjYg==","length":2464,"stub":true},"bal-util-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-tGcfOHWGULu27cY4W7azlg==","length":2442,"stub":true},"bal-util-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ufIEsQrAaZxjE0IpfNfayw==","length":2415,"stub":true},"bal-util-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-2f88OqRZxxoH6ySlZVWcCQ==","length":2398,"stub":true},"bal-util-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2HTqeTiPIZAfOUavZRJ3xQ==","length":2181,"stub":true},"bal-util-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Em7QKk6K3SW/WduxY0kkoA==","length":2162,"stub":true},"bal-util-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ecw+MqlpZecLJGOSuydQfw==","length":2179,"stub":true}}}},
{"id":"balance","key":"balance","value":{"rev":"7-f9377a1ca10db75c4f4369acc82c5655"},"doc":{"_id":"balance","_rev":"7-f9377a1ca10db75c4f4369acc82c5655","name":"balance","description":"A very simple load balancer based on http-proxy. Intended for testing apps in development.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"John Butler","email":"johnnypez@gmail.com"},"name":"balance","description":"A very simple load balancer based on http-proxy. Intended for testing apps in development.","version":"0.0.1","repository":{"url":""},"main":"balance.js","engines":{"node":"~0.4.3"},"dependencies":{"http-proxy":"~0.7.6","commander":"~0.4.0","underscore":"~1.1.7"},"bin":{"balance":"./bin/balance.js"},"devDependencies":{},"_npmUser":{"name":"johnnypez","email":"johnnypez@gmail.com"},"_id":"balance@0.0.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"266200f26b9e17f5e2789512d9aa187990c7fa27","tarball":"http://registry.npmjs.org/balance/-/balance-0.0.1.tgz"},"maintainers":[{"name":"johnnypez","email":"johnnypez@gmail.com"}]},"0.0.2":{"author":{"name":"John Butler","email":"johnnypez@gmail.com"},"name":"balance","description":"A very simple load balancer based on http-proxy. Intended for testing apps in development.","version":"0.0.2","repository":{"url":"https://github.com/johnnypez/balance"},"main":"balance.js","engines":{"node":"~0.4.3"},"dependencies":{"http-proxy":"~0.7.6","commander":"~0.4.0","underscore":"~1.1.7"},"bin":{"balance":"./bin/balance.js"},"devDependencies":{},"_npmUser":{"name":"johnnypez","email":"johnnypez@gmail.com"},"_id":"balance@0.0.2","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"870348f2886aa31c43873cfa5abaaefa7733ebed","tarball":"http://registry.npmjs.org/balance/-/balance-0.0.2.tgz"},"maintainers":[{"name":"johnnypez","email":"johnnypez@gmail.com"}]},"0.0.3":{"author":{"name":"John Butler","email":"johnnypez@gmail.com"},"name":"balance","description":"A very simple load balancer based on http-proxy. Intended for testing apps in development.","version":"0.0.3","repository":{"url":"https://github.com/johnnypez/balance"},"main":"balance.js","engines":{"node":"~0.4.3"},"dependencies":{"http-proxy":"~0.7.6","commander":"~0.4.0","underscore":"~1.1.7"},"bin":{"balance":"./bin/balance.js"},"devDependencies":{},"_npmUser":{"name":"johnnypez","email":"johnnypez@gmail.com"},"_id":"balance@0.0.3","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"70a018dbfef5d946b97410cc6d7e5dfa256fa935","tarball":"http://registry.npmjs.org/balance/-/balance-0.0.3.tgz"},"maintainers":[{"name":"johnnypez","email":"johnnypez@gmail.com"}]}},"maintainers":[{"name":"johnnypez","email":"johnnypez@gmail.com"}],"time":{"modified":"2011-11-16T14:52:32.450Z","created":"2011-11-16T14:42:15.891Z","0.0.1":"2011-11-16T14:42:16.418Z","0.0.2":"2011-11-16T14:48:43.580Z","0.0.3":"2011-11-16T14:52:32.450Z"},"author":{"name":"John Butler","email":"johnnypez@gmail.com"},"repository":{"url":"https://github.com/johnnypez/balance"},"_attachments":{"balance-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-LccKk5iZn7tXzpqEToJd2Q==","length":10240,"stub":true},"balance-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NvRA/4eJ4YezYTdi74ZhUQ==","length":10240,"stub":true},"balance-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rT8NNWgaOxQwT0QzkqR3hA==","length":10240,"stub":true}}}},
{"id":"balancer","key":"balancer","value":{"rev":"7-63dcb4327081a8ec4d6c51a21253cb4b"},"doc":{"_id":"balancer","_rev":"7-63dcb4327081a8ec4d6c51a21253cb4b","name":"balancer","description":"Load Balancer for node.js (supports WebSockets)","dist-tags":{"latest":"0.2.3"},"versions":{"0.2.2":{"name":"balancer","description":"Load Balancer for node.js (supports WebSockets)","homepage":"http://github.com/donnerjack13589/node-balancer","keywords":["load balancer","balancer","websocket"],"author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"contributors":[{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"}],"repository":{"type":"git","url":"git://github.com/donnerjack13589/node-balancer.git"},"version":"0.2.2","engines":{"node":">=0.2.0"},"main":"./lib/balancer/index","bin":{"node-balancer":"./node-balancer"},"_id":"balancer@0.2.2","_engineSupported":true,"_npmVersion":"0.3.0","_nodeVersion":"v0.4.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a53d3230a7ad0b9eca8423faddaf0036567a50c5","tarball":"http://registry.npmjs.org/balancer/-/balancer-0.2.2.tgz"}},"0.2.3":{"name":"balancer","description":"Load Balancer for node.js (supports WebSockets)","homepage":"http://github.com/donnerjack13589/node-balancer","keywords":["load balancer","balancer","websocket"],"author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"contributors":[{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"}],"repository":{"type":"git","url":"git://github.com/donnerjack13589/node-balancer.git"},"version":"0.2.3","engines":{"node":">=0.2.0"},"main":"./lib/balancer/index.js","bin":{"node-balancer":"./node-balancer"},"_id":"balancer@0.2.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7d04f75c6bfc0246a02923172732052c21fc9b2a","tarball":"http://registry.npmjs.org/balancer/-/balancer-0.2.3.tgz"}}},"maintainers":[{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"time":{"modified":"2011-04-13T08:52:19.742Z","created":"2011-02-09T17:08:57.700Z","0.2.2":"2011-02-09T17:08:58.074Z","0.2.3":"2011-04-13T08:52:19.742Z"},"author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"repository":{"type":"git","url":"git://github.com/donnerjack13589/node-balancer.git"},"_attachments":{"balancer-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-a45oBzKA1Eubj13YgiuRcQ==","length":3869,"stub":true},"balancer-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XUU7y/2VDSrcir1zafbpEw==","length":3897,"stub":true}}}},
{"id":"baleen","key":"baleen","value":{"rev":"3-b00cd7dd3a984013ca22b78c0629ed8d"},"doc":{"_id":"baleen","_rev":"3-b00cd7dd3a984013ca22b78c0629ed8d","name":"baleen","description":"Uses parsicle to create binary parsers and serializers for keratin data.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.2":{"name":"baleen","version":"0.1.2","description":"Uses parsicle to create binary parsers and serializers for keratin data.","main":"./baleen","author":{"name":"Liam Doherty"},"dependencies":{"keratin":"git://github.com/lfdoherty/keratin.git","parsicle":"git://github.com/lfdoherty/parsicle.git","structures":"git://github.com/lfdoherty/structures.git","underscorem":"git://github.com/lfdoherty/underscorem.git"},"engines":{"node":">=0.6"},"_npmUser":{"name":"lfdoherty","email":"lfdoherty@gmail.com"},"_id":"baleen@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"52af4645ca254808b8e2e805d4f76ec513e3e2d2","tarball":"http://registry.npmjs.org/baleen/-/baleen-0.1.2.tgz"},"maintainers":[{"name":"lfdoherty","email":"lfdoherty@gmail.com"}]}},"readme":"\nBaleen provides binary serializers and parsers for [keratin](https://github.com/lfdoherty/keratin) objects using the [parsicle](https://github.com/lfdoherty/parsicle) binary-parser-generator.\n\n[Minnow](https://github.com/lfdoherty/minnow) DB uses it for object persistence to disk and for transfer across TCP.\n","maintainers":[{"name":"lfdoherty","email":"lfdoherty@gmail.com"}],"time":{"modified":"2012-07-12T02:09:37.441Z","created":"2012-07-12T02:09:35.922Z","0.1.2":"2012-07-12T02:09:37.441Z"},"author":{"name":"Liam Doherty"},"_attachments":{"baleen-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LwjDG+5QQ3jk5s5ZLKb73w==","length":5186,"stub":true}}}},
{"id":"bam","key":"bam","value":{"rev":"71-6e7cb52c436d0e83f334fc77fa580a68"},"doc":{"_id":"bam","_rev":"71-6e7cb52c436d0e83f334fc77fa580a68","name":"bam","description":"The Easiest Static Site Generator on the Planet!","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.1.0","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"*","pkginfo":"*","eco":"*","github-flavored-markdown":"*","filed":"*","wrench":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"66674c70da84618a5cd65ef1fbf6ff0782068d05","tarball":"http://registry.npmjs.org/bam/-/bam-0.1.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.1.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.1.1","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"*","pkginfo":"*","eco":"*","github-flavored-markdown":"*","filed":"*","wrench":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"60e6360a33796810587ea2e3cb6187cb13f15b6e","tarball":"http://registry.npmjs.org/bam/-/bam-0.1.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.1.2":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.1.2","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"0.1.12-1","pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.1.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f8a199b894c709daa8c6b1bd53665d6d2016086f","tarball":"http://registry.npmjs.org/bam/-/bam-0.1.2.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.2.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.2.0","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"0.1.12-1","pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"453558073f0aff6a50fc92aacc5c29f3c87eb0d3","tarball":"http://registry.npmjs.org/bam/-/bam-0.2.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.2.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.2.1","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"0.1.12-1","pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8c8fa5ba1c9508b1c8516838b22a11b118bee481","tarball":"http://registry.npmjs.org/bam/-/bam-0.2.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.3.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.3.0","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"0.1.12-1","pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b2cc7bcab84c4a6aced07706fa5a1c290e7246a5","tarball":"http://registry.npmjs.org/bam/-/bam-0.3.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.3.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.3.1","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"flatiron":"0.1.12-1","pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"03997cde47e752e070a692de4da5bdab9a412786","tarball":"http://registry.npmjs.org/bam/-/bam-0.3.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.3.2":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.3.2","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5126729c80e6857d942ae5424dfa744e08804aab","tarball":"http://registry.npmjs.org/bam/-/bam-0.3.2.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.3.9":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.3.9","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"0.6 || 0.7"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","zeke":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.3.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8db27eaaa0bfb07d52a40bc6168dae496697b704","tarball":"http://registry.npmjs.org/bam/-/bam-0.3.9.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.4.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.4.0","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","zeke":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"dfd78f05f14440bb1bcee49912fa682f54e259af","tarball":"http://registry.npmjs.org/bam/-/bam-0.4.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.4.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.4.1","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","zeke":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"e40fa7c9d2397ab4961c10570d0bb28b99059dda","tarball":"http://registry.npmjs.org/bam/-/bam-0.4.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.4.2":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.4.2","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.4.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"356ee897ab2390757b7eb5f5e1bca56fc6343640","tarball":"http://registry.npmjs.org/bam/-/bam-0.4.2.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.4.7":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.4.7","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.4.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ea5d218d657ab7eba3b8aba927fcf2aa26882551","tarball":"http://registry.npmjs.org/bam/-/bam-0.4.7.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.0","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"d4cc3a86146a09266852d2ad25dfa770186030a3","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.1","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"5de157ee24387a93fe2d9c245037915438dcd3be","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.3":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.3","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"036be4adb5416b5756055603e56a442010b9f04b","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.3.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.4":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.4","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b72266207d439a839319aa3b760e3dd36e023583","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.4.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.5":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.5","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6fad08446a16770e3422a23977793b5288ece8f0","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.5.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.6":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.6","homepage":"http://github.com/beautifulnode/bam","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b6cf4b510eeeac12d6d1532e436283de771809cd","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.6.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.7":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.7","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.7","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"afee4d714e285b0b02aa8c3cbd9f25b4a47a45c5","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.7.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"directories":{}},"0.5.8":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.5.8","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"engines":{"node":"~0.6.17"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"0.0.5","wrench":"1.3.6","fortknox":"0.1.0","flatiron":"0.1.17","zeke":"~0.2.0","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"_npmUser":{"name":"jackhq","email":"tom@jackhq.com"},"_id":"bam@0.5.8","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8d16e9864ebb070cb0b4ac472940dc3df93e938a","tarball":"http://registry.npmjs.org/bam/-/bam-0.5.8.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.6.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.6.0","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.6.0","dist":{"shasum":"807d8b6350bd5d2ccbeb326b5b83f1a1012cad73","tarball":"http://registry.npmjs.org/bam/-/bam-0.6.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.0","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.0","dist":{"shasum":"28b2174b2127b82cf60d3a2d17b2ea4c3c51935f","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.1","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.1","dist":{"shasum":"0bbad0bccf56c3f697463a78748a607a78a60190","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.2":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.2","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.2","dist":{"shasum":"2d5407c6cfb3569f2f854cfbd0f030f0246a937a","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.2.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.3":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.3","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.3","dist":{"shasum":"e0e8cd144a7f056f850472bad8fcdb34816b5b26","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.3.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.4":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.4","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*","zeke-request":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.4","dist":{"shasum":"5b22be64ead4a4c115d0dbf0a4a2035cf8bbc751","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.4.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.5":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.5","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*","zeke-request":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.5","dist":{"shasum":"a2a275595055ae6fd303921efab890fd23b9e4e8","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.5.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.7.6":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.7.6","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.7.6","dist":{"shasum":"8630e950db1b33e673bec8e3e71d400a1c94b183","tarball":"http://registry.npmjs.org/bam/-/bam-0.7.6.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.8.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.8.0","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.8.0","dist":{"shasum":"e54719adfa75e52902a3768fe6f526373004da81","tarball":"http://registry.npmjs.org/bam/-/bam-0.8.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.8.1":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.8.1","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*","zeke-bootstrap":"*","zeke-bam":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.8.1","dist":{"shasum":"6447f5e9509ccb8c299ed611223a7e7fa6e1fb2f","tarball":"http://registry.npmjs.org/bam/-/bam-0.8.1.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.8.4":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.8.4","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","fortknox":"0.1.0","zeke":"*","zeke-markdown":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\nAfter you have nodejs installed, simply open a terminal window\nand enter:\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site with http://getskeleton.com\n\nIn a terminal window enter the `bam new` command to\ncreate a new project.\n\n``` sh\nbam new foosite\n```\n\n## Create a new site with http://twitter.github.com/bootstrap\n\n``` sh\nbam new foosite bootstrap\n```\n\n## Create a new site with http://revealjs.org\n\n``` sh\nbam new foosite reveal\n```\n\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.8.4","dist":{"shasum":"e42733aa32418945f11d74f527230afba984c0da","tarball":"http://registry.npmjs.org/bam/-/bam-0.8.4.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]},"0.9.0":{"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"name":"bam","description":"The Easiest Static Site Generator on the Planet!","version":"0.9.0","homepage":"http://www.usebam.com","repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"scripts":{"test":"mocha"},"dependencies":{"pkginfo":"0.2.3","eco":"1.1.0-rc-3","github-flavored-markdown":"1.0.1","filed":"*","wrench":"*","flatiron":"*","jade":"*","zeke":"*","zeke-markdown":"*"},"devDependencies":{"mocha":"*"},"bin":{"bam":"./bin/bam"},"optionalDependencies":{},"readme":"# BAM\n\n![bam](http://bam.jpg.to)\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\nAfter you have nodejs installed, simply open a terminal window\nand enter:\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site with http://getskeleton.com\n\nIn a terminal window enter the `bam new` command to\ncreate a new project.\n\n``` sh\nbam new foosite\n```\n\n## Create a new site with http://twitter.github.com/bootstrap\n\n``` sh\nbam new foosite bootstrap\n```\n\n## Create a new site with http://revealjs.org\n\n``` sh\nbam new foosite reveal\n```\n\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","_id":"bam@0.9.0","dist":{"shasum":"c8f160415e04e3278f3de13684eec0aa26602fca","tarball":"http://registry.npmjs.org/bam/-/bam-0.9.0.tgz"},"maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}]}},"readme":"# BAM\n\nThe easiest static site generator on the planet.\n\n# Requirements\n\n* [nodejs](http://nodejs.org)\n\n## Install\n\n``` sh\nnpm install bam -g\n```\n\n## Create a new site\n\n``` sh\nbam new foo-site\n```\n\n## Run in dev mode\n\n``` sh\ncd foo-site\nbam run\n```\n\n## Generate site\n\n``` sh\nbam gen\n```\n## Test Generated site\n\n``` sh\nbam serve\n```\n\n## More Info\n\n[more](http://github.com/beautifulnode/bam/wiki)\n\n## License\n\nSee LICENSE\n\n## Contributions\n\n* Pull Requests are accepted.\n\n## Support\n\n* [issues](http://github.com/beautifulnode/bam/issues)\n\n","maintainers":[{"name":"jackhq","email":"tom@jackhq.com"}],"time":{"modified":"2012-08-05T14:10:01.368Z","created":"2012-02-19T01:54:53.351Z","0.1.0":"2012-02-19T01:54:54.040Z","0.1.1":"2012-02-19T02:47:27.615Z","0.1.2":"2012-02-19T03:54:46.011Z","0.2.0":"2012-02-19T13:34:06.532Z","0.2.1":"2012-02-24T03:35:45.809Z","0.3.0":"2012-02-25T21:33:21.905Z","0.3.1":"2012-05-10T10:30:06.701Z","0.3.2":"2012-05-10T10:36:07.459Z","0.3.9":"2012-05-12T13:33:29.893Z","0.4.0":"2012-05-12T13:36:09.390Z","0.4.1":"2012-05-12T21:15:21.613Z","0.4.2":"2012-05-12T21:27:49.484Z","0.4.7":"2012-05-13T19:41:32.885Z","0.5.0":"2012-05-17T09:06:58.829Z","0.5.1":"2012-05-17T09:16:40.572Z","0.5.3":"2012-05-17T18:27:33.930Z","0.5.4":"2012-06-01T11:25:06.550Z","0.5.5":"2012-06-01T11:39:40.464Z","0.5.6":"2012-06-03T11:43:29.581Z","0.5.7":"2012-06-11T17:06:38.142Z","0.5.8":"2012-06-11T17:25:18.530Z","0.6.0":"2012-07-18T11:22:25.459Z","0.7.0":"2012-07-18T11:41:17.927Z","0.7.1":"2012-07-19T03:02:55.845Z","0.7.2":"2012-07-19T14:38:26.708Z","0.7.3":"2012-07-19T21:10:37.553Z","0.7.4":"2012-07-29T01:37:56.896Z","0.7.5":"2012-07-31T13:37:54.433Z","0.7.6":"2012-07-31T15:59:12.288Z","0.8.0":"2012-08-04T13:00:09.001Z","0.8.1":"2012-08-04T13:04:27.035Z","0.8.4":"2012-08-05T14:05:17.668Z","0.9.0":"2012-08-05T14:10:01.368Z"},"author":{"name":"Tom Wilson","email":"tom@beautifulnode.com","url":"http://www.twilson63.com"},"repository":{"type":"git","url":"git://github.com/beautifulnode/bam.git"},"users":{"fgribreau":true},"_attachments":{"bam-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-Cz29luxLqPvb+WNg9HZQaA==","length":1278611,"stub":true},"bam-0.8.4.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-ss7JRvfTXvIgTmK3JTG5yw==","length":1278624,"stub":true},"bam-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-OtGudtuvKBXJKasE1izsYQ==","length":1278923,"stub":true},"bam-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-dt7nN5HK9joQ2PuCn8qYJQ==","length":1278924,"stub":true},"bam-0.7.6.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-4p3EXWclRThkuD+vWCaIcw==","length":1216782,"stub":true},"bam-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-VeyxYwwW1/0O7eAHn8kuoA==","length":1216793,"stub":true},"bam-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-eaLE01ZhVZC/b5zE+xPe+Q==","length":1216803,"stub":true},"bam-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-BBs+C15rWlFs32ZWf32mQA==","length":1216797,"stub":true},"bam-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-Syvl+mkjWHcHboAB/Y/ttQ==","length":1216788,"stub":true},"bam-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-joWsPFvnbuB61DmtETjTsw==","length":1216781,"stub":true},"bam-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-GTy2JBwfEm+X4IAWFgljjA==","length":1216572,"stub":true},"bam-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-t7+V6mutFu3LZ4dOMUNM2A==","length":1216566,"stub":true},"bam-0.5.8.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-UB1KsN6J1a/ApkdGcKjmaA==","length":1216061,"stub":true},"bam-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-nEYitB0tXTYXe4MHw+VM/Q==","length":1216061,"stub":true},"bam-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-MC7o5ABoBrw4bC11ENBZuw==","length":1216032,"stub":true},"bam-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-55+1LSFPmaWxSnd/TiDBag==","length":1216020,"stub":true},"bam-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-4UQlmQAiOkMzQM1yiwekkg==","length":1215991,"stub":true},"bam-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Ej5s3D58oe8veqsd4tUQmQ==","length":1215595,"stub":true},"bam-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-pNfrSnwHoOx8VMHEFrv7qw==","length":1215522,"stub":true},"bam-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-QWbUOVpKr6MvxKyMnybA4w==","length":1215513,"stub":true},"bam-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-KlTwslXbKeHiSMRiNAUSzw==","length":877861,"stub":true},"bam-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-7frCIl6uIRK4CQcVRWEK3Q==","length":877739,"stub":true},"bam-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-fRj2aC+/rr0ezX4V2aAqMw==","length":877763,"stub":true},"bam-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-Z4/tbqUqxZF/krYS32kyWw==","length":877762,"stub":true},"bam-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-fxB0hPdUCjKBkyiwu6VMWQ==","length":877751,"stub":true},"bam-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-lq4r+YZlVdz+4lZriSgnxQ==","length":877394,"stub":true},"bam-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-WogEoMMKRjDNKD+wOjmvIw==","length":877401,"stub":true},"bam-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-6t+Q8I58y/9olC6izzHosQ==","length":877018,"stub":true},"bam-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Y65yaGyqxaR5zpYP8iQWrA==","length":28073,"stub":true},"bam-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-XBuDAW7T+uoNa77dLMOw5A==","length":27462,"stub":true},"bam-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DrsAnY/A9L0YRdLad5ipHA==","length":27401,"stub":true},"bam-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3XGQWvmC/y/t67wI5WC/uw==","length":27370,"stub":true},"bam-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pvm5IJ74aqmCB1aUzQ5mMQ==","length":27274,"stub":true}}}},
{"id":"bamboo","key":"bamboo","value":{"rev":"25-38e04ed32b7a339109a48157426014f4"},"doc":{"_id":"bamboo","_rev":"25-38e04ed32b7a339109a48157426014f4","name":"bamboo","description":"url router for panda","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bamboo","description":"url router for panda","version":"0.0.1","author":{"name":"yawn","email":"yawn.localhost@gmail.com"},"devDependencies":{"vows":"*"},"repository":{"type":"git","url":"git://github.com/MrYawn/Bamboo.git"},"main":"index","_npmUser":{"name":"yawn","email":"yawn.localhost@gmail.com"},"_id":"bamboo@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9046e04d6cc5356444854056b4d1814ff61bdfe8","tarball":"http://registry.npmjs.org/bamboo/-/bamboo-0.0.1.tgz"},"maintainers":[{"name":"yawn","email":"yawn.localhost@gmail.com"}],"directories":{}},"0.0.2":{"name":"bamboo","description":"url router for panda","version":"0.0.2","author":{"name":"yawn","email":"yawn.localhost@gmail.com"},"devDependencies":{"vows":"*"},"repository":{"type":"git","url":"git://github.com/MrYawn/Bamboo.git"},"main":"index","_npmUser":{"name":"yawn","email":"yawn.localhost@gmail.com"},"_id":"bamboo@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"84579643f38e941977781a183e25a95202888caf","tarball":"http://registry.npmjs.org/bamboo/-/bamboo-0.0.2.tgz"},"maintainers":[{"name":"yawn","email":"yawn.localhost@gmail.com"}]}},"readme":"Bamboo - URL Router for Pandas\n---------------------\n\ni was bored so i decided to create a crappy router.. hell yeah!\n\n![Bamboo](http://cache.io9.com/assets/images/8/2010/12/090116_panda.jpg)","maintainers":[{"name":"yawn","email":"yawn.localhost@gmail.com"}],"time":{"modified":"2012-03-04T14:19:23.600Z","created":"2012-03-04T13:26:25.441Z","0.0.1":"2012-03-04T13:26:28.008Z","0.0.2":"2012-03-04T14:19:23.600Z"},"author":{"name":"yawn","email":"yawn.localhost@gmail.com"},"repository":{"type":"git","url":"git://github.com/MrYawn/Bamboo.git"},"_attachments":{"bamboo-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-tLFqYa6U0z5MLgF6VEyeBw==","length":2163,"stub":true},"bamboo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-491pwVl13BXq9DmLT/UXIA==","length":2078,"stub":true}}}},
{"id":"banana","key":"banana","value":{"rev":"3-1cce73455c67792c39d5dd919c33f26a"},"doc":{"_id":"banana","_rev":"3-1cce73455c67792c39d5dd919c33f26a","name":"banana","description":"food for monkeys, toolbox for lazy developers","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"name":"banana","description":"food for monkeys, toolbox for lazy developers","version":"0.0.0","homepage":"banana.no.de","repository":{"type":"git","url":"git://github.com/elliotlai/banana.git"},"main":"index.js","engines":{"node":">= 0.6"},"dependencies":{"express":">= 2.5","socket.io":">= 0.8"},"devDependencies":{},"_npmUser":{"name":"elliot","email":"ellliotlai@gmail.com"},"_id":"banana@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"078bdf205a1a2796e9505493e61a4e71ff70e832","tarball":"http://registry.npmjs.org/banana/-/banana-0.0.0.tgz"},"maintainers":[{"name":"elliot","email":"ellliotlai@gmail.com"}]}},"readme":"# Banana - food for monkeys\n\n*No, seriously, a web-based pluggable toolbox that do all the tedious works for you.*\n","maintainers":[{"name":"elliot","email":"ellliotlai@gmail.com"}],"time":{"modified":"2012-02-01T20:45:18.251Z","created":"2012-02-01T20:45:15.135Z","0.0.0":"2012-02-01T20:45:18.251Z"},"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"repository":{"type":"git","url":"git://github.com/elliotlai/banana.git"},"_attachments":{"banana-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FAvyXuaah+2oYtcTNEo1xQ==","length":147930,"stub":true}}}},
{"id":"bancroft","key":"bancroft","value":{"rev":"17-4009cf5c5f5601688fa0ad4da41267ad"},"doc":{"_id":"bancroft","_rev":"17-4009cf5c5f5601688fa0ad4da41267ad","name":"bancroft","description":"gpsd client for GPS tracking device.","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.1","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":"v0.4.5"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/pdeschen/.npm/bancroft/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bancroft@0.0.1","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"0b1ae624ae2f5babbf776c0af78553742731e054","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.1.tgz"},"scripts":{}},"0.0.2":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.2","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":"v0.4.5"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/pdeschen/.npm/bancroft/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bancroft@0.0.2","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"54a31f6847b7941aa69a1f6fab376dc3b46d9ecd","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.2.tgz"},"scripts":{}},"0.0.3":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.3","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":"v0.4.5"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/pdeschen/.npm/bancroft/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bancroft@0.0.3","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"54006c9500d6941093f6fc74ec743c427543b048","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.3.tgz"},"scripts":{}},"0.0.4":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.4","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":"v0.4.5"},"dependencies":{"winston":"v0.3.3"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/pdeschen/.npm/bancroft/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bancroft@0.0.4","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"e939a1477c2c26d90aa1e3dfc19c40a0ce9329c4","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.4.tgz"},"scripts":{}},"0.0.5":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.5","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":"v0.4.5"},"dependencies":{"winston":"v0.3.3"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/pdeschen/.npm/bancroft/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bancroft@0.0.5","_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"ba53ef3adde1d0ad0f7a567a4b964c3ca5126fff","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"pdeschen","email":"pdeschen@rassemblr.com"}]},"0.0.6":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.6","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":">=v0.4.5 <=v0.4.9"},"dependencies":{"winston":"v0.3.3"},"devDependencies":{},"_npmUser":{"name":"pdeschen","email":"pdeschen@rassemblr.com"},"_id":"bancroft@0.0.6","_engineSupported":false,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"80c08c72cd66cfb39088b3f7f353f3dbcac47316","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.6.tgz"},"readme":"","maintainers":[{"name":"pdeschen","email":"pdeschen@rassemblr.com"}]},"0.0.7":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.7","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":">=v0.6.0"},"dependencies":{"winston":"v0.3.3"},"devDependencies":{},"contributors":[{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},{"name":"eelcocramer","email":"eelco.cramer@gmail.com"}],"_npmUser":{"name":"pdeschen","email":"pdeschen@rassemblr.com"},"_id":"bancroft@0.0.7","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"e6374699969f4d9c08b42cf7f46fb8a9ee2fc6eb","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.7.tgz"},"readme":"","maintainers":[{"name":"pdeschen","email":"pdeschen@rassemblr.com"}]},"0.0.8":{"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"name":"bancroft","description":"gpsd client for GPS tracking device.","version":"0.0.8","keywords":["gps","gpsd","location","tracking","position"],"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"bugs":{"email":"pdeschen+bancroft@gmail.com","url":"http://github.com/pdeschen/bancroft/issues"},"main":"bancroft","engines":{"node":">=v0.4.0 <=v0.6.x"},"dependencies":{"winston":">=v0.3.3"},"devDependencies":{},"contributors":[{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},{"name":"eelcocramer","email":"eelco.cramer@gmail.com"}],"_npmUser":{"name":"pdeschen","email":"pdeschen@rassemblr.com"},"_id":"bancroft@0.0.8","_engineSupported":false,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"8ed0a419dd39b3282baefaf15641f82a2970549b","tarball":"http://registry.npmjs.org/bancroft/-/bancroft-0.0.8.tgz"},"readme":"","maintainers":[{"name":"pdeschen","email":"pdeschen@rassemblr.com"}]}},"maintainers":[{"name":"pdeschen","email":"pdeschen@rassemblr.com"}],"time":{"modified":"2012-04-03T20:59:44.188Z","created":"2011-07-19T21:18:05.593Z","0.0.1":"2011-07-19T21:18:05.854Z","0.0.2":"2011-07-22T01:12:19.447Z","0.0.3":"2011-07-26T03:04:24.771Z","0.0.4":"2011-07-28T12:50:59.265Z","0.0.5":"2011-09-09T00:46:04.119Z","0.0.6":"2012-03-26T14:53:35.617Z","0.0.7":"2012-04-03T20:42:01.884Z","0.0.8":"2012-04-03T20:59:44.188Z"},"author":{"name":"Pascal Deschenes","email":"pdeschen@rassemblr.com","url":"http://blog.rassemblr.com"},"repository":{"type":"git","url":"git://github.com/pdeschen/bancroft.git"},"_attachments":{"bancroft-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-VsomsFVE7o958YWM47JxTQ==","length":4741,"stub":true},"bancroft-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-rKfgz7yLqFk5HuylKYEJ/g==","length":4737,"stub":true},"bancroft-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-5vGm8uUTDEOykEtDZ1HG6Q==","length":4686,"stub":true},"bancroft-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-TydjFOXgZrl6NDPbqCyhww==","length":4675,"stub":true},"bancroft-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6I8SFx5PIgH5FHws6+Aelw==","length":4660,"stub":true},"bancroft-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Es9xfKjbjV8NzTxXh1pQRQ==","length":4100,"stub":true},"bancroft-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WfdM7L1ycBpgCr1smGdQUA==","length":3632,"stub":true},"bancroft-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1kYdSpXDYp/zOSVscDhGLA==","length":3182,"stub":true}}}},
{"id":"bandcamp","key":"bandcamp","value":{"rev":"47-1c354cacef46f28d884711bd58872ef5"},"doc":{"_id":"bandcamp","_rev":"47-1c354cacef46f28d884711bd58872ef5","name":"bandcamp","description":"Library for rocking out with Bandcamp's API","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"bandcamp","description":"Library for rocking out with Bandcamp's API","version":"0.0.1","directories":{"lib":"./lib"},"main":"index.js","author":{"name":"Kelly Miyashiro","email":"miyashiro.kelly@gmail.com","url":"http://non-diligent.com"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/node-bandcamp.git"},"homepage":"https://github.com/kmiyashiro/node-bandcamp","dependencies":{},"_npmJsonOpts":{"file":"/Users/Kelly/.npm/bandcamp/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bandcamp@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5a0c257613c5612255a6ed94c72f5af6cfc24248","tarball":"http://registry.npmjs.org/bandcamp/-/bandcamp-0.0.1.tgz"},"scripts":{}},"0.0.4":{"name":"bandcamp","description":"Library for rocking out with Bandcamp's API","version":"0.0.4","directories":{"lib":"./lib","test":"./test"},"main":"index.js","keywords":["bandcamp","api","music"],"author":{"name":"Kelly Miyashiro","email":"miyashiro.kelly@gmail.com","url":"http://non-diligent.com"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/node-bandcamp.git"},"homepage":"https://github.com/kmiyashiro/node-bandcamp","dependencies":{},"devDependencies":{"should":">= 0.2.1"},"_npmJsonOpts":{"file":"/Users/Kelly/.npm/bandcamp/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bandcamp@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"694458692a27ceb5b45042423e21e7855af38435","tarball":"http://registry.npmjs.org/bandcamp/-/bandcamp-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}]},"0.0.5":{"name":"bandcamp","description":"Library for rocking out with Bandcamp's API","version":"0.0.5","directories":{"lib":"./lib","test":"./test"},"main":"index.js","keywords":["bandcamp","api","music"],"author":{"name":"Kelly Miyashiro","email":"miyashiro.kelly@gmail.com","url":"http://non-diligent.com"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/node-bandcamp.git"},"homepage":"https://github.com/kmiyashiro/node-bandcamp","dependencies":{},"devDependencies":{"should":">= 0.2.1"},"_npmUser":{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"},"_id":"bandcamp@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6896cf96a96878a5604661890599f99010737d6c","tarball":"http://registry.npmjs.org/bandcamp/-/bandcamp-0.0.5.tgz"},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}]},"0.0.6":{"name":"bandcamp","description":"Library for rocking out with Bandcamp's API","version":"0.0.6","directories":{"lib":"./lib","test":"./test"},"main":"index.js","keywords":["bandcamp","api","music"],"author":{"name":"Kelly Miyashiro","email":"miyashiro.kelly@gmail.com","url":"http://non-diligent.com"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/node-bandcamp.git"},"homepage":"https://github.com/kmiyashiro/node-bandcamp","dependencies":{},"devDependencies":{"mocha":"~1","chai":"~0"},"_npmUser":{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"},"_id":"bandcamp@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"12fec4a5fc2c4d63785f3b20194206e30ffb525f","tarball":"http://registry.npmjs.org/bandcamp/-/bandcamp-0.0.6.tgz"},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}]},"0.0.7":{"name":"bandcamp","description":"Library for rocking out with Bandcamp's API","version":"0.0.7","directories":{"lib":"./lib","test":"./test"},"main":"index.js","keywords":["bandcamp","api","music"],"author":{"name":"Kelly Miyashiro","email":"miyashiro.kelly@gmail.com","url":"http://non-diligent.com"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/node-bandcamp.git"},"homepage":"https://github.com/kmiyashiro/node-bandcamp","dependencies":{},"devDependencies":{"mocha":"~1","chai":"~0"},"_npmUser":{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"},"_id":"bandcamp@0.0.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"57f6675d5aed8a13dd4c358b6c1799dbe3bda6c5","tarball":"http://registry.npmjs.org/bandcamp/-/bandcamp-0.0.7.tgz"},"readme":"# Bandcamp Library for Node.js #\n\nA simple library to easily interact with the [Bandcamp API](http://bandcamp.com/developer).\n\n[Bandcamp](http://bandcamp.com) is an awesome platform for musicians, both physically large and small. You could be, like, tiny... or HUGE. It doesn't matter how big you are as long as you can use a computer. Just visit Bandcamp to setup your account and start selling music to your fans. It also does not discriminate against large or small fans, you just need a computer to listen to and buy music from Bandcamp. If you're a nerd, you can get uncompressed formats. The musician gets a large cut.\n\n## Installation\n\n```\nnpm install bandcamp\n```\n\n## Usage\n\n*View `test/test.js` for examples for every method.*\n\n```js\nvar key = 'yourbandcampAPIkey', // contact <support@bandcamp.com> to request one\n    bandcamp = require('bandcamp')(key),\n    i = require('util').inspect;\n    \nbandcamp.band.search('the internet', function(err, result, status) {\n    console.log(i(result));\n});\n```\n\nMost of the methods use the pattern: `module.method('search parameter', callback, optVersionOverride)`\n\nSee [Bandcamp API Documentation](http://bandcamp.com/developer) for details on all the calls and view `test/test.js` for examples for every method.\n\n## Options\n\nBandcamp split up different parts of their API into modules:\n\n* Band\n* Album\n* Track\n* URL\n\nEach module is versioned. You may pass a version object after your key to set custom versions of each module. In the future, I will update this library to always use the latest version of each module, so if you want to explicitly set the versions for your app and upgrade without fear, you can.\n\n```js\nvar versions = {\n    band: 3,\n    album: 2,\n    track: 1,\n    url: 1\n};\n\nvar key = 'yourbandcampAPIkey', // contact <support@bandcamp.com> to request one\n    bandcamp = require('bandcamp')(key, versions);\n```\n\n### Partial application/Curry\n\nYou may pass an arbitrary number of arguments after the 3 default ones (searchParam, Callback, [version]). For example:\n\n```js\n// Track module, default version (null), passed a URL\nbandcamp.track.search('1269403107', function(err, result, status, url) {\n    console.log(result, url);\n}, null, 'http://bandcamp.com');\n```\n\nThe fourth parameter passed to track.search() will be passed as the fourth parameter to the callback. In this case, I passed a URL `http://bandcamp.com` and the callback can access it via the fourth argument, `url`.\n\n### Optional version override\n\nYou may want to set your versions explicitly since I will update this library to always use the latest tested version of Bandcamp's API modules. They do not update them frequently, but just in case.\n\nYou may also include specific modules if you don't want to include all of them. The optional version parameter is a config object for individual modules.\n\n```js\n// Set the \"band\" module to use version 2.\nvar band = require('bandcamp')('apikeygoeshere', { band: 2 }).band,\n    bandcamp = require('bandcamp')('apikeygoeshere'); // uses default versions.\n\n// Band module version 2\nband.search('the internet', function(err, result, status) {\n    console.log(result);\n});\n\n// Track module version 1, overridden by third parameter\nbandcamp.track.search('1269403107', function(err, result, status) {\n    console.log(result);\n}, 1); // Override the track module version to 1 just for this call\n```\n## License \n\ntl;dr: Do whatever you want, as long as you keep this notice:\n\n(The MIT License)\n\nCopyright (c) 2011 Kelly Miyashiro &lt;miyashiro.kelly@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}]}},"maintainers":[{"name":"kmiyashiro","email":"miyashiro.kelly@gmail.com"}],"time":{"modified":"2012-05-24T17:03:16.873Z","created":"2011-07-16T02:03:23.147Z","0.0.1":"2011-07-16T02:03:23.764Z","0.0.2":"2011-07-26T21:53:39.659Z","0.0.3":"2011-08-18T21:35:13.235Z","0.0.4":"2011-08-20T19:31:01.594Z","0.0.5":"2012-03-18T19:41:16.453Z","0.0.6":"2012-05-06T05:19:09.065Z","0.0.7":"2012-05-24T17:03:16.873Z"},"author":{"name":"Kelly Miyashiro","email":"miyashiro.kelly@gmail.com","url":"http://non-diligent.com"},"repository":{"type":"git","url":"git://github.com/kmiyashiro/node-bandcamp.git"},"_attachments":{"bandcamp-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-Ln9z+Dv1sf2GcpeV4khEog==","length":5683,"stub":true},"bandcamp-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-RbDyC5TKLAYzQHZq0CojGA==","length":10240,"stub":true},"bandcamp-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-cNf/XXJz6lgAVeGxNW7ZrA==","length":10240,"stub":true},"bandcamp-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-lBSZAj6wAhYjJLGYXD4+nQ==","length":5011,"stub":true},"bandcamp-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a8DTgFsylneULvDMicC7KA==","length":35993,"stub":true}}}},
{"id":"bane","key":"bane","value":{"rev":"3-6032d07ceeaae961c2dd3da213414c27"},"doc":{"_id":"bane","_rev":"3-6032d07ceeaae961c2dd3da213414c27","name":"bane","description":"(Yet another) Event emitter for Node, Browser globals and AMD","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bane","version":"0.1.0","description":"(Yet another) Event emitter for Node, Browser globals and AMD","homepage":"http://busterjs.org/docs/bane/","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Christian Johansen","url":"christian@cjohansen.no"},{"name":"August Lilleaas","url":"august@augustl.com"}],"main":"./lib/bane","repository":{"type":"git","url":"git://github.com/busterjs/bane.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test --node"},"devDependencies":{"buster":"0.6.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"bane@0.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d7d907ca464f6deaf9a76c0205bf179f8f8dd8db","tarball":"http://registry.npmjs.org/bane/-/bane-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2012-07-19T23:20:43.699Z","created":"2012-07-19T23:20:41.779Z","0.1.0":"2012-07-19T23:20:43.699Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://github.com/busterjs/bane.git"},"_attachments":{"bane-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lnweE26Zy7UIv+HwLpN0Cw==","length":5565,"stub":true}}}},
{"id":"bang","key":"bang","value":{"rev":"21-332d4e91801995b0cb1ae2e0b9fbf28e"},"doc":{"_id":"bang","_rev":"21-332d4e91801995b0cb1ae2e0b9fbf28e","name":"bang","description":"Text snippets on the command line.","dist-tags":{"latest":"1.0.3"},"versions":{"0.0.1":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"0.0.1","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@0.0.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c2819de360371c6b66ab9f7b94914712f605010b","tarball":"http://registry.npmjs.org/bang/-/bang-0.0.1.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"0.1.0":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"0.1.0","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1ee231a38f999c4157d5b63c875ec7ea88fbd917","tarball":"http://registry.npmjs.org/bang/-/bang-0.1.0.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"0.1.1":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"0.1.1","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@0.1.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"174c7ec0cb86c25d033aa328acd9710e738ea1d5","tarball":"http://registry.npmjs.org/bang/-/bang-0.1.1.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"0.1.2":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"0.1.2","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@0.1.2","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e638ec1baa0da32c1b8b91318a17640ac4d5f3ca","tarball":"http://registry.npmjs.org/bang/-/bang-0.1.2.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"0.2.0":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"0.2.0","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"main":"./lib/bang","bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@0.2.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"67b741b9e28712ff26d65a43590f41c6486c385e","tarball":"http://registry.npmjs.org/bang/-/bang-0.2.0.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"0.2.1":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"0.2.1","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"main":"./lib/bang","bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@0.2.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8528fba8342ad10f5ed343681eab987026683906","tarball":"http://registry.npmjs.org/bang/-/bang-0.2.1.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"1.0.0":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"1.0.0","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"main":"./lib/bang","bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@1.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"be21a2e5f57ad548a715bf56fbd40f1e33ce1a4a","tarball":"http://registry.npmjs.org/bang/-/bang-1.0.0.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"1.0.1":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"1.0.1","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"main":"./lib/bang","bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"engines":{"node":">= 0.4"},"dependencies":{"commander":"~0.3.2"},"devDependencies":{"jasmine-node":"~1.0.12","nodewatch":"~0.0.4"},"_npmUser":{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"},"_id":"bang@1.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8c9fc3ecb5fdc441e939728eff26414278e252ca","tarball":"http://registry.npmjs.org/bang/-/bang-1.0.1.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"1.0.2":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"1.0.2","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"main":"./lib/bang","bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"dependencies":{"commander":"~0.6.1"},"devDependencies":{"jasmine-node":"~1.0.26","nodewatch":"~0.1.0"},"_id":"bang@1.0.2","dist":{"shasum":"1673e20158f966dee9a5a8e5489d22763aa521bf","tarball":"http://registry.npmjs.org/bang/-/bang-1.0.2.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]},"1.0.3":{"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"name":"bang","description":"Text snippets on the command line.","version":"1.0.3","homepage":"https://github.com/jimmycuadra/bang","repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"main":"./lib/bang","bin":{"bang":"./bin/bang"},"scripts":{"test":"cake spec"},"dependencies":{"commander":"~0.6.1"},"devDependencies":{"jasmine-node":"~1.0.26","nodewatch":"~0.1.0","coffee-script":"~1.3.3","docco":"~0.3.0"},"_id":"bang@1.0.3","dist":{"shasum":"20d128bb39e2d1161c00759a4c8a616031cfb647","tarball":"http://registry.npmjs.org/bang/-/bang-1.0.3.tgz"},"maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}]}},"readme":"# Bang\n\n**Bang** is a command line tool for quick storage and retriveal of text snippets. It is inspired by and very similar to [holman](https://github.com/holman)'s [Boom](https://github.com/holman/boom). The main difference is that Bang has no concept of lists: it is only one level deep. It also has a simpler interface to avoid accidentally creating stuff.\n\n## Installation\n\nRequirements:\n\n* [Node](http://nodejs.org)\n* [npm](http://npmjs.org/)\n\nThen:\n\n    $ npm install -g bang\n\n## Get help\n\n    $ bang -h\n\nOr, if you have not yet stored any data, simply run `bang`.\n\n## Add a snippet\n\n    $ bang jimmy http://jimmycuadra.com/\n\n## Retrieve a snippet\n\n    $ bang jimmy\n    http://jimmycuadra.com/\n\n## Delete a snippet\n\n    $ bang -d jimmy\n\n## List all snippets\n\n    $ bang\n      jimmy: http://jimmycuadra.com/\n       mtnt: http://morethingsneed.to/\n    address: 237 Overlook Street\n\n## Storage\n\nBang's data is serialized to JSON and peristed to a file at `~/.bang`. If you want to share your Bang data across multiple machines, you can move the file to [Dropbox](https://www.dropbox.com/) or some other type of network disk, and then symlink it to `~/.bang` on your local machine.\n\n## Tests\n\nBang includes a comprehensive test suite using [Jasmine](http://pivotal.github.com/jasmine/). To run it:\n\n    $ npm install -g coffee-script\n    $ git clone http://github.com/jimmycuadra/bang.git\n    $ cd bang\n    $ npm install\n    $ cake spec\n\nFor continuous testing, use `cake watch`. This also rebuilds CoffeeScript files whenever the tests are run.\n","maintainers":[{"name":"jimmycuadra","email":"jimmycuadra@gmail.com"}],"time":{"modified":"2012-07-07T03:15:17.228Z","created":"2011-11-11T09:30:15.344Z","0.0.1":"2011-11-11T09:30:16.426Z","0.1.0":"2011-11-12T07:34:17.236Z","0.1.1":"2011-11-13T02:11:34.117Z","0.1.2":"2011-11-13T08:02:50.326Z","0.2.0":"2011-11-14T04:09:34.365Z","0.2.1":"2011-11-14T12:53:23.423Z","1.0.0":"2011-12-16T03:37:10.466Z","1.0.1":"2011-12-22T08:09:52.471Z","1.0.2":"2012-06-28T05:29:07.820Z","1.0.3":"2012-07-07T03:15:17.228Z"},"author":{"name":"Jimmy Cuadra","email":"jimmy@jimmycuadra.com","url":"http://jimmycuadra.com/"},"repository":{"type":"git","url":"git://github.com/jimmycuadra/bang.git"},"_attachments":{"bang-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-q85ZbtPTr+4GXee39v4IkA==","length":2486,"stub":true},"bang-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-qmwswmxQSg8sW7z+FF/8Tw==","length":2451,"stub":true},"bang-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Z9gWe1BchDG33KY967Lx8g==","length":10240,"stub":true},"bang-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Ffk6Vo+lW4q568mI8+iATA==","length":10240,"stub":true},"bang-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-pVH9aYTfuLqDruXgks+jYA==","length":10240,"stub":true},"bang-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Hf5oPb8q5aMX5MO4EIb1jg==","length":10240,"stub":true},"bang-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qgxOjh2pzNE2OLbOmxX5AQ==","length":10240,"stub":true},"bang-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-bXSmzE2xf+dnHscWWOvb1w==","length":10240,"stub":true},"bang-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SrAwVjG06ZaTQVgjaklidA==","length":10240,"stub":true},"bang-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vajf66FcsZ4TBNknvTz5fA==","length":10240,"stub":true}}}},
{"id":"banking","key":"banking","value":{"rev":"9-e3acc1f5eb1476d4ed5019642ddace76"},"doc":{"_id":"banking","_rev":"9-e3acc1f5eb1476d4ed5019642ddace76","name":"banking","description":"The missing Bank API for getting you statement data","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"banking","description":"The missing Bank API for getting you statement data","version":"0.1.0","author":{"name":"Christian Sullivan","email":"cs@euforic.co"},"keywords":["banking","ofx","financial","bank"],"private":false,"homepage":"http://euforic.github.com/banking.js","dependencies":{"xml2json":">=0.2.4","request":">=2.1.1"},"repository":{"type":"git","url":"git://github.com/euforic/banking.js.git"},"main":"lib/banking.js","engines":{"node":">= 0.6.2"},"_npmUser":{"name":"euforic","email":"cs@euforic.co"},"_id":"banking@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"f32d1dd3441987ff23464583cbfa427fa164844c","tarball":"http://registry.npmjs.org/banking/-/banking-0.1.0.tgz"},"maintainers":[{"name":"euforic","email":"cs@euforic.co"}]},"0.2.0":{"name":"banking","description":"The missing Bank API for getting you statement data","version":"0.2.0","author":{"name":"Christian Sullivan","email":"cs@euforic.co"},"keywords":["banking","ofx","financial","bank"],"private":false,"homepage":"http://euforic.github.com/banking.js","dependencies":{"xml2json":"0.2.4","request":"2.1.1"},"devDependencies":{"mocha":"*","should":"*"},"repository":{"type":"git","url":"git://github.com/euforic/banking.js.git"},"main":"lib/banking.js","scripts":{"prepublish":"npm prune","test":"make test"},"engines":{"node":">= 0.6.2"},"_npmUser":{"name":"euforic","email":"cs@euforic.co"},"_id":"banking@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"127ea74df8d1416efa39baa465dce2b3e9c81fc1","tarball":"http://registry.npmjs.org/banking/-/banking-0.2.0.tgz"},"maintainers":[{"name":"euforic","email":"cs@euforic.co"}]},"0.2.1":{"name":"banking","description":"The missing Bank API for getting you statement data","version":"0.2.1","author":{"name":"Christian Sullivan","email":"cs@euforic.co"},"keywords":["banking","ofx","financial","bank","quickbooks"],"private":false,"homepage":"http://euforic.github.com/banking.js","dependencies":{"xml2json":"0.2.4","request":"2.1.1"},"devDependencies":{"mocha":"*","should":"*"},"repository":{"type":"git","url":"git://github.com/euforic/banking.js.git"},"main":"lib/banking.js","scripts":{"prepublish":"npm prune","test":"make test"},"engines":{"node":">= 0.6.2"},"_npmUser":{"name":"euforic","email":"cs@euforic.co"},"_id":"banking@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4683757940172a1a2ddc609a48b3fb02d17ccc8d","tarball":"http://registry.npmjs.org/banking/-/banking-0.2.1.tgz"},"maintainers":[{"name":"euforic","email":"cs@euforic.co"}]},"0.2.2":{"name":"banking","description":"The missing Bank API for getting you statement data","version":"0.2.2","author":{"name":"Christian Sullivan","email":"cs@euforic.co"},"keywords":["banking","ofx","financial","bank","quickbooks"],"private":false,"homepage":"http://euforic.github.com/banking.js","dependencies":{"xml2json":">=0.2.4","request":">=2.1.1"},"devDependencies":{"mocha":"*","should":"*"},"repository":{"type":"git","url":"git://github.com/euforic/banking.js.git"},"main":"lib/banking.js","scripts":{"prepublish":"npm prune","test":"make test"},"engines":{"node":">= 0.6.2"},"_npmUser":{"name":"euforic","email":"cs@euforic.co"},"_id":"banking@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d7f575023500961bdd6378a03758b09ce3b812d2","tarball":"http://registry.npmjs.org/banking/-/banking-0.2.2.tgz"},"maintainers":[{"name":"euforic","email":"cs@euforic.co"}]}},"readme":"# Banking.js \n \n## The Missing API for your bank.  \n  * Bank statement results in JSON or Valid XML\n  * Supports all financial institutions (File an issue if yours does not work)\n\n## Installation  \n\n```bash\n$ npm install banking\n```\n\n## Usage\n\n```json\nvar banking = require('banking');\n\nvar bankInfo = {\n    fid: 10898\n  , fidorg: 'B1'\n  , url: 'https://yourBanksOfxApiURL.com'\n  , bankid: 0123456 /* If bank account use your bank routing number otherwise set to null */\n  , user: username\n  , pass: password\n  , accid: 0123456789\n  , acctype: 'CHECKING' /* CHECKING || SAVINGS || MONEYMRKT || CREDITCARD */\n  , date_start: 20010125 /* Statement start date YYYYMMDDHHMMSS */\n  , date_end: 20110125 /* Statement end date YYYYMMDDHHMMSS */  \n};\n\n//If second param is omitted JSON will be returned by default\n\nbanking.getStatement(bankInfo, 'xml', function(res, err)\n    if(err) console.log(err)\n    console.log(res);        \n}\n```\n## Sample Response\n\n```javascript\n{\n  \"OFX\": {\n    \"SIGNONMSGSRSV1\": {\n      \"SONRS\": {\n        \"STATUS\": {\n          \"CODE\": \"0\",\n          \"SEVERITY\": \"INFO\",\n          \"MESSAGE\": \"SUCCESS\"\n        },\n        \"DTSERVER\": \"20120126212302.454[-8:PST]\",\n        \"LANGUAGE\": \"ENG\",\n        \"FI\": {\n          \"ORG\": \"DI\",\n          \"FID\": \"321081669\"\n        }\n      }\n    },\n    \"BANKMSGSRSV1\": {\n      \"STMTTRNRS\": {\n        \"TRNUID\": \"BiJNgqjvbw5vg18Z5T8kZASgUKmsFnNY\",\n        \"STATUS\": {\n          \"CODE\": \"0\",\n          \"SEVERITY\": \"INFO\",\n          \"MESSAGE\": \"SUCCESS\"\n        },\n        \"CLTCOOKIE\": \"iXus7\",\n        \"STMTRS\": {\n          \"CURDEF\": \"USD\",\n          \"BANKACCTFROM\": {\n            \"BANKID\": \"321081669\",\n            \"ACCTID\": \"3576960405\",\n            \"ACCTTYPE\": \"CHECKING\"\n          },\n          \"BANKTRANLIST\": {\n            \"DTSTART\": \"20010125120000.000\",\n            \"DTEND\": \"20120126212302.638[-8:PST]\",\n            \"STMTTRN\": [{\n              \"TRNTYPE\": \"DEP\",\n              \"DTPOSTED\": \"20110407070000.000\",\n              \"DTAVAIL\": \"20110407070000.000\",\n              \"TRNAMT\": \"1934.65\",\n              \"FITID\": \"156599402\",\n              \"NAME\": \"CLIENT DEPOSIT\",\n              \"MEMO\": \"CLIENT DEPOSIT\"\n            }, {\n              \"TRNTYPE\": \"DEBIT\",\n              \"DTPOSTED\": \"20110412070000.000\",\n              \"DTAVAIL\": \"20110412070000.000\",\n              \"TRNAMT\": \"-700.00\",\n              \"FITID\": \"156950780\",\n              \"NAME\": \"DOMESTIC WIRE FUNDS-DEBIT CHRIST\",\n              \"MEMO\": \"DOMESTIC WIRE FUNDS-DEBIT CHRISTIAN SULLIVAN\"\n            }, {\n              \"TRNTYPE\": \"CHECK\",\n              \"DTPOSTED\": \"20110414070000.000\",\n              \"DTAVAIL\": \"20110414070000.000\",\n              \"TRNAMT\": \"-38.20\",\n              \"FITID\": \"157222076\",\n              \"CHECKNUM\": \"10004\",\n              \"NAME\": \"CHECK WITHDRAWAL\",\n              \"MEMO\": \"CHECK WITHDRAWAL\"\n            }, {\n              \"TRNTYPE\": \"CHECK\",\n              \"DTPOSTED\": \"20110414070000.000\",\n              \"DTAVAIL\": \"20110414070000.000\",\n              \"TRNAMT\": \"-349.79\",\n              \"FITID\": \"157222077\",\n              \"CHECKNUM\": \"10006\",\n              \"NAME\": \"CHECK WITHDRAWAL\",\n              \"MEMO\": \"CHECK WITHDRAWAL\"\n            }]\n          },\n          \"LEDGERBAL\": {\n            \"BALAMT\": \"1661.41\",\n            \"DTASOF\": \"20120126212302.751[-8:PST]\"\n          },\n          \"AVAILBAL\": {\n            \"BALAMT\": \"2761.41\",\n            \"DTASOF\": \"20120126212302.751[-8:PST]\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n## TODO  \n  * Retrieve users available accounts with out account numbers\n  * Add directory of common banks\n\n## More Information\n  * [Banking Connection Parameters](http://www.ofxhome.com/index.php/home/directory)\n  * [Offical OFX Home Page](http://www.ofx.net/)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2010-2012 Christian Sullivan &lt;cs@euforic.co&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"euforic","email":"cs@euforic.co"}],"time":{"modified":"2012-06-05T23:19:46.302Z","created":"2012-01-27T08:22:22.251Z","0.1.0":"2012-01-27T08:22:23.519Z","0.2.0":"2012-01-28T04:09:33.641Z","0.2.1":"2012-01-30T21:08:49.567Z","0.2.2":"2012-06-05T23:19:46.302Z"},"author":{"name":"Christian Sullivan","email":"cs@euforic.co"},"repository":{"type":"git","url":"git://github.com/euforic/banking.js.git"},"_attachments":{"banking-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-bFzFdJ9ggVpEMJX3rhWi+A==","length":5205,"stub":true},"banking-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-d8Z/RyaPueHsaXzbj+c1+Q==","length":5232,"stub":true},"banking-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lKBnqqvaK0hhN9cs2xQDJQ==","length":4650,"stub":true},"banking-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DPnyGTymJ5zPgswCSVeZJw==","length":3965,"stub":true}}}},
{"id":"banner","key":"banner","value":{"rev":"25-f2bb4960d380ea69d69cad1691b0f759"},"doc":{"_id":"banner","_rev":"25-f2bb4960d380ea69d69cad1691b0f759","name":"banner","description":"A banner generator","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.0":{"name":"banner","description":"A banner generator","version":"0.0.0","main":"./bin/banner","keywords":["readme"],"url":"http://github.com/tmcw/banner","bin":{"banner":"./bin/banner"},"repositories":[{"type":"git","url":"git://github.com/tmcw/banner.git"}],"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"= 0.7.x","jshint":"= 0.2.x","docco":"= 0.3.x"},"_npmJsonOpts":{"file":"/Users/tmcw/.npm/banner/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banner@0.0.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"a88b487218620b5c8b3fef25c92265899551962e","tarball":"http://registry.npmjs.org/banner/-/banner-0.0.0.tgz"},"scripts":{},"directories":{}},"0.0.1":{"name":"banner","description":"A banner generator","version":"0.0.1","keywords":["readme"],"url":"http://github.com/tmcw/banner","bin":{"banner":"./bin/banner.js"},"repositories":[{"type":"git","url":"git://github.com/tmcw/banner.git"}],"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"= 0.7.x","jshint":"= 0.2.x","docco":"= 0.3.x"},"_npmJsonOpts":{"file":"/Users/tmcw/.npm/banner/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banner@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"92eff887a216cdd77ce5b135901dd79daf5ab7ed","tarball":"http://registry.npmjs.org/banner/-/banner-0.0.1.tgz"},"scripts":{},"directories":{}},"0.0.2":{"name":"banner","description":"A banner generator","version":"0.0.2","keywords":["readme"],"url":"http://github.com/tmcw/banner","bin":{"banner":"./bin/banner.js"},"repositories":[{"type":"git","url":"git://github.com/tmcw/banner.git"}],"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"= 0.7.x","jshint":"= 0.2.x","docco":"= 0.3.x"},"_npmJsonOpts":{"file":"/Users/tmcw/.npm/banner/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banner@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"1a2e5ed1c87044be3fa0328dfaa0fbebacabc18e","tarball":"http://registry.npmjs.org/banner/-/banner-0.0.2.tgz"},"scripts":{},"directories":{}},"0.0.3":{"name":"banner","description":"A banner generator","version":"0.0.3","keywords":["readme"],"url":"http://github.com/tmcw/banner","bin":{"banner":"./bin/banner.js"},"repositories":[{"type":"git","url":"git://github.com/tmcw/banner.git"}],"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"= 0.7.x","jshint":"= 0.2.x","docco":"= 0.3.x"},"_npmJsonOpts":{"file":"/Users/tmcw/.npm/banner/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banner@0.0.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"17f967a8825dafa1b005de3dc3cce0ca4f8c8c1e","tarball":"http://registry.npmjs.org/banner/-/banner-0.0.3.tgz"},"scripts":{},"directories":{}},"0.0.4":{"name":"banner","description":"A banner generator","version":"0.0.4","keywords":["readme"],"url":"http://github.com/tmcw/banner","bin":{"banner":"./bin/banner.js"},"repositories":[{"type":"git","url":"git://github.com/tmcw/banner.git"}],"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"= 0.7.x","jshint":"= 0.2.x","docco":"= 0.3.x"},"_npmJsonOpts":{"file":"/Users/tmcw/.npm/banner/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banner@0.0.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"31adbb21dd9fce7f89af69c24eb0f7d1895e4336","tarball":"http://registry.npmjs.org/banner/-/banner-0.0.4.tgz"},"scripts":{},"directories":{}},"0.0.5":{"name":"banner","description":"A banner generator","version":"0.0.5","keywords":["readme"],"url":"http://github.com/tmcw/banner","bin":{"banner":"./bin/banner.js"},"repositories":[{"type":"git","url":"git://github.com/tmcw/banner.git"}],"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"licenses":[{"type":"BSD"}],"devDependencies":{},"_npmUser":{"name":"tmcw","email":"macwright@gmail.com"},"_id":"banner@0.0.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"33136b62f3e08afe20a2e245a3a06d8ff31b8e60","tarball":"http://registry.npmjs.org/banner/-/banner-0.0.5.tgz"},"maintainers":[{"name":"tmcw","email":"macwright@gmail.com"}]}},"maintainers":[{"name":"tmcw","email":"macwright@gmail.com"}],"time":{"modified":"2012-01-30T16:44:10.632Z","created":"2011-07-07T17:18:32.425Z","0.0.0":"2011-07-07T17:18:32.607Z","0.0.1":"2011-07-07T17:21:01.610Z","0.0.2":"2011-07-07T17:24:11.397Z","0.0.3":"2011-07-08T14:09:24.504Z","0.0.4":"2011-07-08T14:23:57.904Z","0.0.5":"2012-01-30T16:44:10.632Z"},"author":{"name":"Tom MacWright","email":"macwright@gmail.com"},"_attachments":{"banner-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-tDIcgpK2UH00HdkAKenqUQ==","length":1343,"stub":true},"banner-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Q12pR7fvHcc++dfN9rJLXQ==","length":970,"stub":true},"banner-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-GKojIR9w1StGWXKq48S/OQ==","length":1015,"stub":true},"banner-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Ap/ZJOG3qO7ie7mykvHbTA==","length":1022,"stub":true},"banner-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-dU2lIIBRTiJ3H4WZBTbkMg==","length":1021,"stub":true},"banner-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xqutYQXsT2RSM7qHYQjggg==","length":1019,"stub":true}}}},
{"id":"banzai","key":"banzai","value":{"rev":"3-9359dfc16e3912a07fec6a8f4649a0a6"},"doc":{"_id":"banzai","_rev":"3-9359dfc16e3912a07fec6a8f4649a0a6","name":"banzai","description":"Library for creating document processing pipelines","dist-tags":{"latest":"0.5.12"},"versions":{"0.5.12":{"name":"banzai","description":"Library for creating document processing pipelines","tags":["ETL","pipeline","document","state machine"],"version":"0.5.12","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai.git"},"bugs":{"url":"http://github.com/pgte/banzai/issues"},"engines":["node >= 0.4.0"],"main":"./index","devDependencies":{"fake-queue":"1.0.x","banzai-statestore-mem":"1.1.x"},"scripts":{"test":"make"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"banzai@0.5.12","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"55c39b2f66b5efde526546ec6b89e558770891f0","tarball":"http://registry.npmjs.org/banzai/-/banzai-0.5.12.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"readme":"# Intro\n\n`Banzai` (short for BanzaiETL) is a document processing framework. It operates by defining pipelines. We have a `PubSub` model where publishers (e.g. our api) place things in a priority queue that then gets consumed by a pipeline worker. A pipeline worker subscribes to the work queue and when it finds a task that needs to be done starts working on it. A pipeline is basically a state machine that allows you to execute multiple operations on a single file. You can use it to enrich documents with stuff from the internet, convert images, replicate a database to another datastore, etc. In our case we use the pipelines to process emails, convert pdf attachments to images, resize images, process information we get from mechanical turk, etc.\n\n# Terminology\n\n## Pipeline\n\nYou can define one or more pipelines like this:\n\n    var banzai = require('banzai');\n    var pipeline = banzai.pipeline('order pipeline');\n\nThe pipeline object has a chainable configuration API which you can use to later configure this object.\n\nTo start with, a pipeline processes documents in a document store.\n\n## States and Transitions\n\nEach document that enters a pipeline has a state at each moment in time.\n\nYou can trigger a handle when a document state changes. This handle is a function that receives the document and then transforms it.\n\nYou can define the pipeline states and transitions like this:\n\n    pipeline\n        .on('initial', initialHandler, {\n            next: 'order received email sent'\n        })\n        .on('order received email sent', orderEmailSentHandler, {\n            priority: 2\n          , condition: allItemsAvailable\n          , next: 'items available'\n        })\n        .on('order received email sent', confirmationEmailSentHandler, {\n            priority: 1\n          , next: 'items not available'\n        })\n        .on('items not available', itemsNotAvailableHandler)\n        .on('items available', itemsAvailableHandler, {\n          next: 'order placed'\n        })\n        .on('order placed', orderPlacedHandler, {\n          next: 'order placed email sent'\n        });\n\n\n### State handlers\n\n`initlalHandler`, `orderEmailSentHandler`, `itemsNotAvailableHandler` and all the others are functions that handle the state entry. They could look something like this;\n\n    var initialHandler = function(orderDoc, done) {\n      email.sendOrderReceivedEmail(orderDoc, done);\n    };\n\n    var confirmationEmailSentHandler = function(orderDoc, done) {\n      done();\n    };\n\n    var itemsNotAvailableHandler = function(orderDoc, done) {\n      email.sendItemsNotAvailable(orderDoc, done);\n    };\n\n\nIt is necessary that the handlers call the done function once they are done. If an error occurs, done should be called with an error on the first argument. If not, the first argument should be `null`.\n\nYou can see that the `confirmationEmailSentHandler` handler does not pass the document to the callback function. If that happens, the previous version of the document is used.\n\n#### Condition functions\n\n`allItemsAvailable` is a condition function, which could look something like this;\n\n    var allItemsAvailable = function(orderDoc, done) {\n      inventory.checkAvailabilityAndReserveItems(orderDoc.items, function(err, availability) {\n        if (err) { return done(err); }\n        done(null, availability.allAvailable);\n      });\n    };\n\nA condition function should either return a boolean or call the `done` function with `(err, boolean)`. The first argument should be null if there is no error and the second argument should be a boolean, telling if the condition was met or not.\n\n### Error handling\n\nTODO!!!!\n\n### Logging\n\nTODO!!!!\n\n### Meta-data\n\nTODO!!!!\n\n## Document Store\n\nEach pipeline has a document store, which is where the docs that are processed are stored.\n\nYou can define the document store on a pipeline like this:\n\n    pipline.docStore(docStore);\n\nA doc store is an object that has to have these 2 functions:\n\n* load(docId, callback) - callback is a function with the signature (err, doc);\n* save(doc, callback) - callback is a function with the signature (err, doc);\n\nBy convention, you should expect doc.id or doc._id if the document exists and update it.\n\nThere already exists a store for CouchDB named [banzai-docstore-couchdb]. You can install it like this:\n\n    $ cd <PROJECT ROOT DIR>\n    $ npm install banzai-docstore-couchdb\n\n... and use it like this:\n\n    var banzaiDocstoreCouchdb = require('banzai-docstore-couchdb');\n    var docStore = banzaiDocstoreCouchdb({\n        url: 'http://localhost:5984'\n      , db: 'docs'\n    });\n    pipeline.docStore(docStore);\n\n## State Store\n\nEach pipeline has a state store, which is where the document states are stored.\n\n(If you don't define a state store, the document state will be stored inside a \"state\" property of your document).\n\nA state store is an object that has to have these 2 functions:\n\n* load(stateDocId, callback) - callback is a function with the signature (err, doc);\n* save(stateDoc, callback) - callback is a function with the signature (err, doc);\n\nBy convention, you should expect doc.id or doc._id if the document exists and update it.\n\nThere already exists a state store for CouchDB named [banzai-statestore-couchdb]. You can install it like this:\n\n    $ cd <PROJECT ROOT DIR>\n    $ npm install banzai-statestore-couchdb\n\n... and use it like this:\n\n    var banzaiStatestoreCouchdb = require('banzai-statestore-couchdb');\n    var stateStore = banzaiDocstoreCouchdb({\n        url: 'http://localhost:5984'\n      , db: 'states'\n    });\n    pipeline.stateStore(stateStore);\n\n## Work Queue\n\nA work queue is a queue where pending transitions are put so that they are picked up by interested workers.\n\nEach pipeline has a work queue, which is an object that has to have these functions:\n\n* push(state_name, jobData, callback)\n  * state_name: a string to identify the state;\n  * jobData: an object to be passed onto the worker\n  * callback: a function with the signature (err).\n* pop(state_name, callback)\n  * state_name\n  * callback: a function with the signature (err, jobData).\n\n[banzai-docstore-couchdb]: https://github.com/pgte/banzai-docstore-couchdb\n[banzai-statestore-couchdb]: https://github.com/pgte/banzai-statestore-couchdb","maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2011-11-23T15:46:18.705Z","created":"2011-11-23T15:46:16.464Z","0.5.12":"2011-11-23T15:46:18.705Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai.git"},"_attachments":{"banzai-0.5.12.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rPkh/KUVzCxp7qCzCBn8Bg==","length":10240,"stub":true}}}},
{"id":"banzai-couchdb-store","key":"banzai-couchdb-store","value":{"rev":"3-eaef6480693b54c1a92a586c783318d7"},"doc":{"_id":"banzai-couchdb-store","_rev":"3-eaef6480693b54c1a92a586c783318d7","name":"banzai-couchdb-store","description":"CouchDB plugin module for Banzai document store.","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.3":{"name":"banzai-couchdb-store","description":"CouchDB plugin module for Banzai document store.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.3","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-docstore-couchdb.git"},"bugs":{"url":"http://github.com/pgte/banzai-docstore-couchdb/issues"},"engines":["node >= 0.4.10"],"dependencies":{"nano":"0.8.x"},"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-couchdb-store/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-couchdb-store@1.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"23cb12ce3bb6f3f58a46faa11aafffb0e013425b","tarball":"http://registry.npmjs.org/banzai-couchdb-store/-/banzai-couchdb-store-1.0.3.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2011-09-26T12:40:37.774Z","created":"2011-09-26T12:40:35.757Z","1.0.3":"2011-09-26T12:40:37.774Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-docstore-couchdb.git"},"_attachments":{"banzai-couchdb-store-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-25aBIQHtSrOHxmWvGIhzjg==","length":1630,"stub":true}}}},
{"id":"banzai-docstore-couchdb","key":"banzai-docstore-couchdb","value":{"rev":"5-950c115737d634e2f48ee1c772788321"},"doc":{"_id":"banzai-docstore-couchdb","_rev":"5-950c115737d634e2f48ee1c772788321","name":"banzai-docstore-couchdb","description":"CouchDB plugin module for Banzai document store.","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"banzai-docstore-couchdb","description":"CouchDB plugin module for Banzai document store.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.0","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-docstore-couchdb.git"},"bugs":{"url":"http://github.com/pgte/banzai-docstore-couchdb/issues"},"engines":["node >= 0.4.10"],"dependencies":{"nano":"0.8.x"},"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-docstore-couchdb/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-docstore-couchdb@1.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5b2bfdedbe050b0a3e3751a80ad08e0505c39272","tarball":"http://registry.npmjs.org/banzai-docstore-couchdb/-/banzai-docstore-couchdb-1.0.0.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"1.0.1":{"name":"banzai-docstore-couchdb","description":"CouchDB plugin module for Banzai document store.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.1","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-docstore-couchdb.git"},"bugs":{"url":"http://github.com/pgte/banzai-docstore-couchdb/issues"},"engines":["node >= 0.4.10"],"dependencies":{"nano":"0.8.x"},"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-docstore-couchdb/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-docstore-couchdb@1.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8db1ba4e6f7a7159884eb12b2670bf9a7d826a83","tarball":"http://registry.npmjs.org/banzai-docstore-couchdb/-/banzai-docstore-couchdb-1.0.1.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2011-09-21T15:53:37.678Z","created":"2011-09-15T15:20:10.308Z","1.0.0":"2011-09-15T15:20:12.204Z","1.0.1":"2011-09-21T15:53:37.678Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-docstore-couchdb.git"},"_attachments":{"banzai-docstore-couchdb-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jujA3ycEIEIgbZCfdBPa0w==","length":1632,"stub":true},"banzai-docstore-couchdb-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q4abZ50j58WjzWTTCPIFEw==","length":1624,"stub":true}}}},
{"id":"banzai-redis","key":"banzai-redis","value":{"rev":"9-771fc4d07eaff06ffde5b0f9d49db0cc"},"doc":{"_id":"banzai-redis","_rev":"9-771fc4d07eaff06ffde5b0f9d49db0cc","name":"banzai-redis","description":"Redis queueing plugin module for Banzai","dist-tags":{"latest":"0.3.6"},"versions":{"0.1.0":{"name":"banzai-redis","description":"Redis queueing plugin module for Banzai","tags":["ETL","pipeline","document","state machine","redis","queue","banzai"],"version":"0.1.0","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-redis.git"},"bugs":{"url":"http://github.com/pgte/banzai-redis/issues"},"engines":["node >= 0.4.10"],"main":"./index","dependencies":{"kue":"0.2.0","redis":"0.6.0"},"scripts":{"test":"make"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-redis/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-redis@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"dccfe25b6b327783831b1a23252a0c4ee6799010","tarball":"http://registry.npmjs.org/banzai-redis/-/banzai-redis-0.1.0.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.1.1":{"name":"banzai-redis","description":"Redis queueing plugin module for Banzai","tags":["ETL","pipeline","document","state machine","redis","queue","banzai"],"version":"0.1.1","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-redis.git"},"bugs":{"url":"http://github.com/pgte/banzai-redis/issues"},"engines":["node >= 0.4.10"],"main":"./index","dependencies":{"kue":"0.3.x","redis":"0.6.0"},"scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-redis/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-redis@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d9be12af0c57d833f9690cd777c49661e6c08707","tarball":"http://registry.npmjs.org/banzai-redis/-/banzai-redis-0.1.1.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.3.4":{"name":"banzai-redis","description":"Redis queueing plugin module for Banzai","tags":["ETL","pipeline","document","state machine","redis","queue","banzai"],"version":"0.3.4","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-redis.git"},"bugs":{"url":"http://github.com/pgte/banzai-redis/issues"},"engines":["node >= 0.4.10"],"main":"./index","dependencies":{"redis":"0.6.x"},"scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-redis/0.3.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-redis@0.3.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"57d4dd955a8964e9ab526524468b254f2cf6a62f","tarball":"http://registry.npmjs.org/banzai-redis/-/banzai-redis-0.3.4.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.3.6":{"name":"banzai-redis","description":"Redis queueing plugin module for Banzai","tags":["ETL","pipeline","document","state machine","redis","queue","banzai"],"version":"0.3.6","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"contributors":[{"name":"Nathan Oehlman"}],"repository":{"type":"git","url":"git://github.com/pgte/banzai-redis.git"},"bugs":{"url":"http://github.com/pgte/banzai-redis/issues"},"engines":["node >= 0.4.10"],"main":"./index","dependencies":{"redis":"0.6.x"},"scripts":{"test":"expresso test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"banzai-redis@0.3.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0a2bcf4c02aaf593848d09fbb3975c749cbe9e8c","tarball":"http://registry.npmjs.org/banzai-redis/-/banzai-redis-0.3.6.tgz"},"readme":"# banzai-redis\n\nRedis queueing plugin module for Banzai.\n\n# Install\n\n    $ cd <PROJECT ROOT>\n    $ npm install banzai-redis","maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2012-03-08T09:43:27.829Z","created":"2011-09-10T23:29:32.765Z","0.1.0":"2011-09-10T23:29:34.750Z","0.1.1":"2011-10-17T15:06:46.123Z","0.3.4":"2011-10-18T15:59:11.313Z","0.3.6":"2012-03-08T09:43:27.829Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-redis.git"},"_attachments":{"banzai-redis-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-uDHxAz/iRp7qdAZCvJj9lQ==","length":2536,"stub":true},"banzai-redis-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-iuySMuBvOnxSAsnaCr0VAA==","length":2483,"stub":true},"banzai-redis-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9LZzYToI62utBELT13+S/w==","length":1129,"stub":true},"banzai-redis-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-C9Vtkkm3UtmKADca0psKjw==","length":1590,"stub":true}}}},
{"id":"banzai-statestore-couchdb","key":"banzai-statestore-couchdb","value":{"rev":"5-c965442821741ce6f20e266fe43aea4a"},"doc":{"_id":"banzai-statestore-couchdb","_rev":"5-c965442821741ce6f20e266fe43aea4a","name":"banzai-statestore-couchdb","description":"CouchDB plugin module for Banzai state store.","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"banzai-statestore-couchdb","description":"CouchDB plugin module for Banzai state store.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.0","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-couchdb.git"},"bugs":{"url":"http://github.com/pgte/banzai-statestore-couchdb/issues"},"engines":["node >= 0.4.10"],"dependencies":{"nano":"0.8.x"},"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-statestore-couchdb/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-statestore-couchdb@1.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d46957edce7beb7e610c5d6ce8cf0eb5d8098cc9","tarball":"http://registry.npmjs.org/banzai-statestore-couchdb/-/banzai-statestore-couchdb-1.0.0.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"1.0.1":{"name":"banzai-statestore-couchdb","description":"CouchDB plugin module for Banzai state store.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.1","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-couchdb.git"},"bugs":{"url":"http://github.com/pgte/banzai-statestore-couchdb/issues"},"engines":["node >= 0.4.10"],"dependencies":{"nano":"0.8.x"},"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-statestore-couchdb/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-statestore-couchdb@1.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ba55b3edbd530644cdc2df651ca8a903d812cede","tarball":"http://registry.npmjs.org/banzai-statestore-couchdb/-/banzai-statestore-couchdb-1.0.1.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2011-09-21T15:56:29.092Z","created":"2011-09-15T14:51:08.554Z","1.0.0":"2011-09-15T14:51:10.427Z","1.0.1":"2011-09-21T15:56:29.092Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-couchdb.git"},"_attachments":{"banzai-statestore-couchdb-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kjWH8vH39CpNshc/q2bsGQ==","length":1617,"stub":true},"banzai-statestore-couchdb-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uHyhUKC63HqX8cuTyyWjcg==","length":1617,"stub":true}}}},
{"id":"banzai-statestore-mem","key":"banzai-statestore-mem","value":{"rev":"9-6f9d51fa52320cf77fad40b9019bee48"},"doc":{"_id":"banzai-statestore-mem","_rev":"9-6f9d51fa52320cf77fad40b9019bee48","name":"banzai-statestore-mem","description":"Plugin module for Banzai state store. Mainly used for testing.","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.1":{"name":"banzai-statestore-mem","description":"Plugin module for Banzai state store. Mainly used for testing.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.1","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-mem.git"},"bugs":{"url":"http://github.com/pgte/banzai-statestore-mem/issues"},"engines":["node >= 0.4.10"],"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-statestore-mem/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-statestore-mem@1.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"00b7f227f83e58bc76990d5e45d3fdbeebd15999","tarball":"http://registry.npmjs.org/banzai-statestore-mem/-/banzai-statestore-mem-1.0.1.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"1.0.2":{"name":"banzai-statestore-mem","description":"Plugin module for Banzai state store. Mainly used for testing.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.2","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-mem.git"},"bugs":{"url":"http://github.com/pgte/banzai-statestore-mem/issues"},"engines":["node >= 0.4.10"],"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-statestore-mem/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-statestore-mem@1.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"19d479c40d04db6d16a31ab4fe9094a7697b7ad9","tarball":"http://registry.npmjs.org/banzai-statestore-mem/-/banzai-statestore-mem-1.0.2.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"1.0.3":{"name":"banzai-statestore-mem","description":"Plugin module for Banzai state store. Mainly used for testing.","tags":["ETL","pipeline","document","state machine"],"version":"1.0.3","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-mem.git"},"bugs":{"url":"http://github.com/pgte/banzai-statestore-mem/issues"},"engines":["node >= 0.4.10"],"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-statestore-mem/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-statestore-mem@1.0.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2ac86ece1bbe9e5a2849cf0c12f9d7a9c0f9c8ae","tarball":"http://registry.npmjs.org/banzai-statestore-mem/-/banzai-statestore-mem-1.0.3.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"1.1.0":{"name":"banzai-statestore-mem","description":"Plugin module for Banzai state store. Mainly used for testing.","tags":["ETL","pipeline","document","state machine"],"version":"1.1.0","author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-mem.git"},"bugs":{"url":"http://github.com/pgte/banzai-statestore-mem/issues"},"engines":["node >= 0.4.10"],"main":"./index","scripts":{"test":"expresso test.js"},"_npmJsonOpts":{"file":"/Users/pedroteixeira/.npm/banzai-statestore-mem/1.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"banzai-statestore-mem@1.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d57f28a53e2d2b787eddc42aef69d6949ecad17a","tarball":"http://registry.npmjs.org/banzai-statestore-mem/-/banzai-statestore-mem-1.1.0.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2011-10-11T16:03:20.354Z","created":"2011-09-17T22:24:44.887Z","1.0.1":"2011-09-17T22:24:46.743Z","1.0.2":"2011-10-10T13:37:03.556Z","1.0.3":"2011-10-10T17:43:54.230Z","1.1.0":"2011-10-11T16:03:20.355Z"},"author":{"name":"Pedro Teixeira","email":"pedro.teixeira@gmail.com"},"repository":{"type":"git","url":"git://github.com/pgte/banzai-statestore-mem.git"},"_attachments":{"banzai-statestore-mem-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-LiWvm9gkXJHbat2y3ARv5A==","length":1324,"stub":true},"banzai-statestore-mem-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-jt40UrKlmmXRaU2bvX2Miw==","length":1322,"stub":true},"banzai-statestore-mem-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gDwxATe3/NJC6HarrvLzGg==","length":1313,"stub":true},"banzai-statestore-mem-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ViqVhrFvBcH43rmzW7XgNw==","length":1033,"stub":true}}}},
{"id":"bapi","key":"bapi","value":{"rev":"3-5a79d41509c0869907b8533fa809d431"},"doc":{"_id":"bapi","_rev":"3-5a79d41509c0869907b8533fa809d431","name":"bapi","description":"A small wrapper to Alfredo API services","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bapi","version":"0.1.0","description":"A small wrapper to Alfredo API services","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git@bitbucket.org:bu/bapi.git"},"keywords":["api","post","get","put","delete","request"],"author":{"name":"Buwei Chiu","email":"bu@hax4","url":"bu"},"license":"MIT","_id":"bapi@0.1.0","readme":"ERROR: No README.md file found!","dist":{"shasum":"ad6b6660307c0a1ec4724fe2e83653ea9551cb69","tarball":"http://registry.npmjs.org/bapi/-/bapi-0.1.0.tgz"},"maintainers":[{"name":"bu","email":"bu@hax4.in"}]}},"readme":"ERROR: No README.md file found!","maintainers":[{"name":"bu","email":"bu@hax4.in"}],"time":{"modified":"2012-08-14T04:22:57.294Z","created":"2012-08-14T04:22:53.404Z","0.1.0":"2012-08-14T04:22:57.294Z"},"author":{"name":"Buwei Chiu","email":"bu@hax4","url":"bu"},"repository":{"type":"git","url":"git@bitbucket.org:bu/bapi.git"},"_attachments":{"bapi-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mFkHtSgfyVckFsUZqzvN9A==","length":1483,"stub":true}}}},
{"id":"bar","key":"bar","value":{"rev":"7-fbb44a76cb023e6a8941f15576cf190b"},"doc":{"_id":"bar","_rev":"7-fbb44a76cb023e6a8941f15576cf190b","name":"bar","description":"Node.js framework for building large modular web applications","dist-tags":{"latest":"0.1.1","stable":"0.1.1"},"versions":{"0.1.0":{"name":"bar","description":"Node.js framework for building large modular web applications","version":"0.1.0","author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"dependencies":{"watch":">= 0.3.2","eventemitter2":">= 0.1.3","optimist":">= 0.2.4"},"bin":{"node-bar":"./bin/bar"},"main":"./lib/bar","scripts":{"test":"vows --spec tests/*-test.js"},"_id":"bar@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"366da8596a5f8aa926b2e454d206c0f606a54584","tarball":"http://registry.npmjs.org/bar/-/bar-0.1.0.tgz"}},"0.1.1":{"name":"bar","description":"Node.js framework for building large modular web applications","version":"0.1.1","author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"dependencies":{"watch":">= 0.3.2","optimist":">= 0.2.4"},"bin":{"node-bar":"./bin/bar"},"main":"./lib/bar","scripts":{"test":"vows --spec tests/*-test.js"},"_id":"bar@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f98a2fc5343d9f844bafb17f5d382549dcd5c7a9","tarball":"http://registry.npmjs.org/bar/-/bar-0.1.1.tgz"}}},"maintainers":[{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"time":{"modified":"2011-06-19T10:39:31.532Z","created":"2011-06-19T10:21:47.871Z","0.1.0":"2011-06-19T10:21:49.805Z","0.1.1":"2011-06-19T10:39:17.723Z"},"author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"_attachments":{"bar-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-ntnkbU04hn0JLl2p7iTb/g==","length":400391,"stub":true},"bar-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-opngwnfljBq0y+aS365neg==","length":5269,"stub":true}}}},
{"id":"barc","key":"barc","value":{"rev":"7-dfe352b410782543d6b1aea292f123eb"},"doc":{"_id":"barc","_rev":"7-dfe352b410782543d6b1aea292f123eb","name":"barc","description":"Library for creating 1D barcodes with node.js. Backed by node-canvas.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Peter Magnusson","email":"kmpm@birchroad.net"},"name":"barc","description":"Library for creating 1D barcodes with node.js. Backed by node-canvas.","keywords":["barcode","canvas"],"version":"0.0.1","repository":{"url":"git://github.com/birchroad/node-barc"},"main":"index.js","engines":{"node":">=v0.4.8"},"dependencies":{"canvas":">=0.0.1"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/peterm/.npm/barc/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"barc@0.0.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9d3cab8f19620a5ce0017213774043d1fa8451f9","tarball":"http://registry.npmjs.org/barc/-/barc-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"birchroad","email":"info@birchroad.net"}]},"0.0.2":{"author":{"name":"Peter Magnusson","email":"kmpm@birchroad.net"},"name":"barc","description":"Library for creating 1D barcodes with node.js. Backed by node-canvas.","keywords":["barcode","canvas"],"version":"0.0.2","repository":{"url":"git://github.com/birchroad/node-barc"},"main":"index.js","engines":{"node":">=v0.4.8"},"dependencies":{"canvas":">=0.0.1"},"devDependencies":{},"_npmJsonOpts":{"file":"/home/sysadmin/.npm/barc/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"barc@0.0.2","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b8c7f1ec41edf43d553b1c89db4f3a348e5a092c","tarball":"http://registry.npmjs.org/barc/-/barc-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"birchroad","email":"info@birchroad.net"}]},"0.0.3":{"author":{"name":"Peter Magnusson","email":"kmpm@birchroad.net"},"name":"barc","description":"Library for creating 1D barcodes with node.js. Backed by node-canvas.","keywords":["barcode","canvas","code 128","code 2of5"],"version":"0.0.3","repository":{"type":"git","url":"git://github.com/birchroad/node-barc.git"},"bugs":{"url":"http://github.com/birchroad/node-barc/issues"},"main":"index.js","engines":{"node":">=v0.4.8"},"dependencies":{"canvas":">=0.0.1"},"devDependencies":{},"licenses":[{"type":"MIT","url":"http://github.com/birchroad/node-barc/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/sysadmin/.npm/barc/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"barc@0.0.3","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6effc2d17bf178327e37559fe2d130e98f2abe41","tarball":"http://registry.npmjs.org/barc/-/barc-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"birchroad","email":"info@birchroad.net"}]}},"maintainers":[{"name":"birchroad","email":"info@birchroad.net"}],"time":{"modified":"2011-08-17T14:40:05.917Z","created":"2011-08-11T07:44:43.430Z","0.0.1":"2011-08-11T07:44:45.690Z","0.0.2":"2011-08-11T11:56:21.185Z","0.0.3":"2011-08-17T14:40:05.917Z"},"author":{"name":"Peter Magnusson","email":"kmpm@birchroad.net"},"repository":{"type":"git","url":"git://github.com/birchroad/node-barc.git"},"_attachments":{"barc-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mFDZD8/VkkVuYwDIs0fOUw==","length":8101,"stub":true},"barc-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-aABN8eHh+kW5/DBluaEi7A==","length":7673,"stub":true},"barc-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tS6lv7jrH+yOhQ+zAlBUrg==","length":4694,"stub":true}}}},
{"id":"barchat2","key":"barchat2","value":{"rev":"3-64ed0e0d90bd303378d4ab270def6f59"},"doc":{"_id":"barchat2","_rev":"3-64ed0e0d90bd303378d4ab270def6f59","name":"barchat2","description":"A real-time chat system.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Owen Winkler","url":"http://owenw.com"},"name":"barchat2","description":"A real-time chat system.","version":"0.0.1","repository":{"type":"git","url":"git@github.com:ringmaster/barchat2.git"},"main":"barchat.js","engines":{"node":">=0.4.10"},"dependencies":{"mongoose":"2.5.10","express":"2.5.8"},"devDependencies":{},"_id":"barchat2@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"532d9609297711f5495a0a3e22c9e7596d5a2fcb","tarball":"http://registry.npmjs.org/barchat2/-/barchat2-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"ringmaster","email":"epithet@gmail.com"}]}},"maintainers":[{"name":"ringmaster","email":"epithet@gmail.com"}],"time":{"modified":"2012-03-14T18:52:09.881Z","created":"2012-03-14T18:52:09.716Z","0.0.1":"2012-03-14T18:52:09.881Z"},"author":{"name":"Owen Winkler","url":"http://owenw.com"},"repository":{"type":"git","url":"git@github.com:ringmaster/barchat2.git"},"_attachments":{"barchat2-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GESZR0lTu7CNPU0y06tVuA==","length":34811,"stub":true}}}},
{"id":"barista","key":"barista","value":{"rev":"11-79c007130530dc9301412550e3d82d43"},"doc":{"_id":"barista","_rev":"11-79c007130530dc9301412550e3d82d43","name":"barista","description":"URL router & generator, similar to Rails / merb","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"barista","description":"URL router / generator","version":"0.0.1","author":{"name":"Kieran Huggins","email":"kieran@kieran.ca"},"repository":{"type":"git","url":"git://github.com/kieran/barista.git"},"main":"./index.js","engines":{"node":">= 0.3.0"},"_id":"barista@0.0.1","_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"5ce592c410340445b4cbbdea946acd0d175e50cf","tarball":"http://registry.npmjs.org/barista/-/barista-0.0.1.tgz"}},"0.0.2":{"name":"barista","description":"URL router & generator, similar to Rails / merb","version":"0.0.2","author":{"name":"Kieran Huggins","email":"kieran@kieran.ca"},"repository":{"type":"git","url":"git://github.com/kieran/barista.git"},"main":"./index.js","engines":{"node":">= 0.3.0"},"_id":"barista@0.0.2","_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"51be860248978b29efda24dd5f91c81f77d01cbf","tarball":"http://registry.npmjs.org/barista/-/barista-0.0.2.tgz"}},"0.0.3":{"name":"barista","description":"URL router & generator, similar to Rails / merb","version":"0.0.3","author":{"name":"Kieran Huggins","email":"kieran@kieran.ca"},"repository":{"type":"git","url":"git://github.com/kieran/barista.git"},"main":"./index.js","engines":{"node":">= 0.3.0"},"_id":"barista@0.0.3","_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"f4a96343f244596c6b01c41abf1ef471987517a6","tarball":"http://registry.npmjs.org/barista/-/barista-0.0.3.tgz"},"maintainers":[{"name":"kieran","email":"kieran@kieran.ca"}]},"0.0.4":{"name":"barista","description":"URL router & generator, similar to Rails / merb","version":"0.0.4","author":{"name":"Kieran Huggins","email":"kieran@kieran.ca"},"repository":{"type":"git","url":"git://github.com/kieran/barista.git"},"main":"./index.js","engines":{"node":">= 0.3.0"},"_npmJsonOpts":{"file":"/Users/kieran/.npm/barista/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"barista@0.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"9d040664f4f27bf83b82c8552ee0c25b3c0afd57","tarball":"http://registry.npmjs.org/barista/-/barista-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"kieran","email":"kieran@kieran.ca"}]},"0.0.5":{"name":"barista","description":"URL router & generator, similar to Rails / merb","version":"0.0.5","author":{"name":"Kieran Huggins","email":"kieran@kieran.ca"},"repository":{"type":"git","url":"git://github.com/kieran/barista.git"},"main":"./index.js","engines":{"node":">= 0.3.0"},"_npmUser":{"name":"kieran","email":"kieran@kieran.ca"},"_id":"barista@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b5a69ebbee66ea32b369e541ead3d05a721f2e87","tarball":"http://registry.npmjs.org/barista/-/barista-0.0.5.tgz"},"readme":"Barista is a simple URL router for NodeJS.\n\n\nIn a nutshell\n=============\n\n```javascript\nrouter.get( '/:beverage/near/:location(.:format)' )\n      .to( 'beverage.byLocation' )\n\nrouter.first( '/coffee/near/90210', 'GET' )\n// -> { controller:'beverage', action:'byLocation', beverage:'coffee', location:90210 }\n\nrouter.url({\n  controller: 'beverage',\n  action: 'byLocation',\n  beverage: 'coffee',\n  location: 90210,\n  format: 'json'\n})\n// -> '/coffee/near/90210.json'\n```\n\n\nGetting Barista\n===============\n\nInstall via npm, thusly:\n\n```javascript\nnpm install barista\n```\n\nUsing Barista\n-------------\n\n```javascript\nvar Router = require('barista').Router;\n\nvar router = new Router;\n```\n\nAdding routes\n-------------\n\n### A simple example\n\n```javascript\nrouter.match( '/products', 'GET' )\n      .to( 'products.index' )\n```\n\n### Rails-esque variable names\n\n```javascript\nrouter.match( '/products/:id', 'GET' )\n      .to( 'products.show' )\n\nrouter.match( '/profiles/:username', 'GET' )\n      .to( 'users.show' )\n\nrouter.match( '/products/:id(.:format)', 'GET' )\n      .to( 'products.show' )\n```\n\n### Globs (they also capture slashes)\n\n```javascript\nrouter.match( '/*path', 'GET' )\n      .to( 'errors.notFound' )\n\nrouter.first( '/somewhere/that/four-oh-fours', 'GET' )\n// -> { controller:'errors', action:'notFound', path:'somewhere/that/four-oh-fours' }\n\n\nrouter.match( '/*path(.:format)', 'GET' )\n      .to( 'errors.notFound' )\n\nrouter.first( '/somewhere/that/four-oh-fours.json', 'GET' )\n// -> { controller:'errors', action:'notFound', path:'somewhere/that/four-oh-fours', format:'json' }\n\n```\n\n### Match conditions\n\n```javascript\nrouter.match( '/:beverage/near/:zipcode', 'GET' )\n      .to( 'beverage.byZipCode' )\n      .where({\n        // an array of options\n        beverage: [ 'coffee', 'tea', 'beer', 'warm_sake' ],\n        // a regex pattern\n        zipcode: /^\\d{5}(-\\d{4})?$/\n      })\n\nrouter.match( '/:beverage/near/:location', 'GET' )\n      .to( 'beverage.byLocation' )\n      .where({\n        // could be a postal code\n        // OR a zip code\n        // OR the word 'me' (geolocation FTW)\n        location: [ /^\\d{5}(-\\d{4})?$/, /^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$/, 'me' ]\n      })\n```\n\n### Convenience methods\n\n```javascript\nrouter.get( '/products/:id(.:format)' )\n      .to( 'products.show' )\n\nrouter.put( '/products/:id(.:format)' )\n      .to( 'products.update' )\n\nrouter.post( '/products' )\n      .to( 'products.create' )\n\nrouter.del( '/products' )\n      .to( 'products.destroy' )\n```\n\n### REST Resources\n\n```javascript\nrouter.resource( 'products' )\n```\n\nis equivalent to:\n\n```javascript\nrouter.get( '/products(.:format)' )\n      .to( 'products.index' )\n\nrouter.get( '/products/add(.:format)' )\n      .to( 'products.add' )\n\nrouter.get( '/products/:id(.:format)' )\n      .to('products.show' )\n\nrouter.get('/products/:id/edit(.:format)' )\n      .to( 'products.edit' )\n\nrouter.post('/products(.:format)' )\n      .to( 'products.create' )\n\nrouter.put('/products/:id(.:format)' )\n      .to( 'products.update' )\n\nrouter.del('/products/:id(.:format)' )\n      .to( 'products.destroy' )\n```\n\nResolution & dispatching\n------------------------\n\nThe `router.first( url, method [, callback] )` method can be used in two ways:\n\n```javascript\nvar params = router.first( '/products/15', 'GET' )\n```\n\nOR\n\n```javascript\nrouter.first( '/products/15', 'GET', function( params ){\n  // dispatch the request or something\n})\n```\n\nYou can get all the matching routes like so:\n\n```javascript\nvar params = router.all( '/products/15', 'GET' )\n\n//=> [params, params, params....]\n```\n\nRoute generation\n----------------\n\nPass in a params hash, get back a tasty string:\n\n```javascript\nrouter.url( {\n  controller: 'products',\n  action: 'show',\n  id: 5\n} )\n//=> '/products/5'\n\nrouter.url( {\n  controller: 'products',\n  action: 'show',\n  id: 5,\n  format: 'json'\n} )\n//=> '/products/5.json'\n```\n\nSet the optional second parameter to `true` if you want\nextra params appended as a query string:\n\n```javascript\nrouter.url({\n  controller: 'products',\n  action: 'show',\n  id: 5,\n  format: 'json',\n  love: 'cheese'\n}, true )\n//=> '/products/5.json?love=cheese'\n```\n\n\nCaveats & TODOs\n---------------\nnested optional segments are currently unsupported. e.g. this won't work:\n\n```javascript\nrouter.get( '/:controller(/:action(/:id(.:format)))' )\n```\n\nnesting routes & resources is also still on the TODO list\n\n\nThings I forgot...\n------------------\n...might be in the `/docs` folder...\n\n...or might not exist at all.\n\n\nIt's broken!\n------------\nShit happens.\n\nWrite a test that fails and add it to the tests folder,\nthen create an issue!\n\nPatches welcome :-)\n\n\nWho are you?\n------------\nI'm [Kieran Huggins](mailto:kieran@refactory.ca), partner at [Refactory](http://refactory.ca) in Toronto, Canada.","maintainers":[{"name":"kieran","email":"kieran@kieran.ca"}]}},"maintainers":[{"name":"kieran","email":"kieran@kieran.ca"}],"time":{"modified":"2012-02-19T09:24:44.302Z","created":"2011-06-25T01:36:10.061Z","0.0.1":"2011-06-25T01:36:10.419Z","0.0.2":"2011-06-25T05:59:39.033Z","0.0.3":"2011-08-13T04:40:18.115Z","0.0.4":"2011-08-29T18:21:31.348Z","0.0.5":"2012-02-19T09:24:44.302Z"},"author":{"name":"Kieran Huggins","email":"kieran@kieran.ca"},"repository":{"type":"git","url":"git://github.com/kieran/barista.git"},"_attachments":{"barista-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Wkgn/Vy8mcyrP1xDrkSSjA==","length":22384,"stub":true},"barista-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lbfLWVOmhjmiNAcL2Sxg4w==","length":21927,"stub":true},"barista-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ELDla3uEqzlkJUQeEyXYkg==","length":21823,"stub":true},"barista-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QSz6bHE0JaQcqbm49b3ryw==","length":21823,"stub":true},"barista-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ixkjVLPM+kQSCYAlpeinQw==","length":21200,"stub":true}}}},
{"id":"bark","key":"bark","value":{"rev":"20-fc1a94f80cfa199c16aa075e940e06dc"},"doc":{"_id":"bark","_rev":"20-fc1a94f80cfa199c16aa075e940e06dc","name":"bark","description":"A collection of web rendering functions","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"bark","version":"0.0.1","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"async-ejs":">=0.0.1","github-flavored-markdown":">=1.0.0","less":">=0.0.1","mime":">=0.0.1","common":">=0.0.1","mud":">=0.0.1"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bark@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"1a457cfce29737e89f61329abc1ff3f0f2540c62","tarball":"http://registry.npmjs.org/bark/-/bark-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}]},"0.0.2":{"name":"bark","version":"0.0.2","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"async-ejs":">=0.0.1","github-flavored-markdown":">=1.0.0","less":">=0.0.1","mime":">=0.0.1","common":">=0.0.1","mud":">=0.0.1"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bark@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a45b06bdfe1fdb70b2d172a649ba99cfc71d8b0c","tarball":"http://registry.npmjs.org/bark/-/bark-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}]},"0.0.3":{"name":"bark","version":"0.0.3","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"async-ejs":">=0.0.1","github-flavored-markdown":">=1.0.0","less":">=0.0.1","mime":">=0.0.1","common":">=0.0.1","mud":">=0.0.1"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bark@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8df80ba1c396939fa52c45d165730b27716dbd31","tarball":"http://registry.npmjs.org/bark/-/bark-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}]},"0.0.4":{"name":"bark","version":"0.0.4","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"async-ejs":">=0.0.1","github-flavored-markdown":">=1.0.0","less":">=0.0.1","mime":">=0.0.1","common":">=0.0.1","mud":">=0.0.1"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bark@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"35a953120fd6e3e9cef92f707ae7be6bdc7667ca","tarball":"http://registry.npmjs.org/bark/-/bark-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}]},"0.0.5":{"name":"bark","version":"0.0.5","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"async-ejs":">=0.0.1","github-flavored-markdown":">=1.0.0","less":">=0.0.1","mime":">=0.0.1","common":">=0.0.1","mud":">=0.0.1"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bark@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"4a2c802be56f658d608efbaf3efb1872e4618ec9","tarball":"http://registry.npmjs.org/bark/-/bark-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}]},"0.0.6":{"name":"bark","version":"0.0.6","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"async-ejs":">=0.0.1","github-flavored-markdown":">=1.0.0","less":">=0.0.1","mime":">=0.0.1","common":">=0.0.1","mud":">=0.0.1"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bark@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5b8558e4d9bdbfd0e59b94a5543925dd5229bbd8","tarball":"http://registry.npmjs.org/bark/-/bark-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"}]},"0.1.0":{"name":"bark","version":"0.1.0","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"main":"./render.js","dependencies":{"rex":">=0.3.2","jade":">=0.15.4","stylus":">=0.15.2","mime":">=0.0.1","common":">=0.2.0"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"bark@0.1.0","scripts":{"start":"node server.js"},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a1c83ce1f17026ddec1e6bcab31e91bd24d80254","tarball":"http://registry.npmjs.org/bark/-/bark-0.1.0.tgz"},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"},{"name":"mafintosh","email":"mathiasbuus@gmail.com"}]},"0.1.1":{"name":"bark","version":"0.1.1","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"dependencies":{"rex":">=0.3.2","jade":">=0.15.4","stylus":">=0.15.2","mime":">=0.0.1","common":">=0.2.0"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"bark@0.1.1","scripts":{"start":"node server.js"},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ca655b0dcb2b3e9a26822c6b8630d66d277ecc14","tarball":"http://registry.npmjs.org/bark/-/bark-0.1.1.tgz"},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"},{"name":"mafintosh","email":"mathiasbuus@gmail.com"}]},"0.1.2":{"name":"bark","version":"0.1.2","description":"A collection of web rendering functions","keywords":["framework","web","middleware","render"],"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"dependencies":{"rex":">=0.3.2","jade":">=0.15.4","stylus":">=0.15.2","mime":">=0.0.1","common":">=0.2.0"},"devDependencies":{"router":">=0.0.1"},"_npmJsonOpts":{"file":"/Users/ian/.npm/bark/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"bark@0.1.2","scripts":{"start":"node server.js"},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8c41e6a6871ed93f13f40cc3557131c16a45f245","tarball":"http://registry.npmjs.org/bark/-/bark-0.1.2.tgz"},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"},{"name":"mafintosh","email":"mathiasbuus@gmail.com"}]}},"maintainers":[{"name":"ianjorgensen","email":"jorgensen.ian@gmail.com"},{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"time":{"modified":"2011-09-10T19:18:22.968Z","created":"2011-08-01T12:33:02.211Z","0.0.1":"2011-08-01T12:33:02.810Z","0.0.2":"2011-08-01T12:38:05.372Z","0.0.3":"2011-08-01T13:51:58.164Z","0.0.4":"2011-08-01T14:44:00.363Z","0.0.5":"2011-08-01T14:48:46.875Z","0.0.6":"2011-08-01T15:25:34.276Z","0.1.0":"2011-09-10T18:49:44.107Z","0.1.1":"2011-09-10T19:05:06.071Z","0.1.2":"2011-09-10T19:18:22.968Z"},"author":{"name":"Ian Jorgensen","email":"jorgensen.ian@gmail.com"},"repository":{"type":"git","url":"git://github.com/ianjorgensen/bark.git"},"_attachments":{"bark-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-peyeduQiW5Yx6yLIiCwIkQ==","length":242485,"stub":true},"bark-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-EHGhp6yz6Lhlt46Tmdy3xg==","length":242566,"stub":true},"bark-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-nZ9Krq+GSSk5q94VIukbaw==","length":243343,"stub":true},"bark-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vPAjo6gAosDL956ibT0HKQ==","length":2580,"stub":true},"bark-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jplXpo6YMgTKogccyOZGCA==","length":2495,"stub":true},"bark-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-X0rlCAwjWVedWqp/aQ6Q9g==","length":2495,"stub":true},"bark-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AK1ChLrJg3YmQiMT6hyHVQ==","length":2496,"stub":true},"bark-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+lWkZdJy54rULl3WzbFZ5w==","length":2462,"stub":true},"bark-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wCgEmAX4BQ10+xBjingG7Q==","length":2434,"stub":true}}}},
{"id":"barnode","key":"barnode","value":{"rev":"13-aea7b69425c9cb1209318377b28a75aa"},"doc":{"_id":"barnode","_rev":"13-aea7b69425c9cb1209318377b28a75aa","name":"barnode","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"barnode","version":"0.0.1","scripts":{"start":"node server.js"},"dependencies":{"express":">=2.0.0","jade":"latest"},"_npmUser":{"name":"lo","email":"lo@petalphile.com"},"_id":"barnode@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"69048627dc7f8268fdb58a2bc13801d7497b9b1a","tarball":"http://registry.npmjs.org/barnode/-/barnode-0.0.1.tgz"},"maintainers":[{"name":"lo","email":"lo@petalphile.com"}],"directories":{}},"0.0.2":{"name":"barnode","description":"Checks your favorite bar.  in progress","author":{"name":"flores","email":"github@petalphile.com"},"version":"0.0.2","scripts":{"start":"TZ='PST8DST' node server.js"},"repository":{"type":"git","url":"git://github.com/flores/barnode.git"},"dependencies":{"express":"latest","connect":"latest","jade":"latest","DateZ":"latest"},"_npmUser":{"name":"lo","email":"lo@petalphile.com"},"_id":"barnode@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f86a2381f59166d2e3458a99edc93c27a5b7f7f0","tarball":"http://registry.npmjs.org/barnode/-/barnode-0.0.2.tgz"},"maintainers":[{"name":"lo","email":"lo@petalphile.com"}]}},"maintainers":[{"name":"lo","email":"lo@petalphile.com"}],"time":{"modified":"2012-01-11T02:50:20.570Z","created":"2012-01-09T21:22:54.616Z","0.0.1":"2012-01-09T21:22:55.671Z","0.0.2":"2012-01-11T02:50:20.570Z"},"description":"Checks your favorite bar.  in progress","author":{"name":"flores","email":"github@petalphile.com"},"repository":{"type":"git","url":"git://github.com/flores/barnode.git"},"_attachments":{"barnode-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-0SfOJ4zNzOdTA/fSk+aapg==","length":2403,"stub":true},"barnode-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IRkOmTpyiudgigs1m1EUXw==","length":816,"stub":true}}}},
{"id":"barricane-db","key":"barricane-db","value":{"rev":"3-450947b9a05047fe195f76a69a3144e8"},"doc":{"_id":"barricane-db","_rev":"3-450947b9a05047fe195f76a69a3144e8","name":"barricane-db","description":"A NodeJS-based in-process database.","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"barricane-db","description":"A NodeJS-based in-process database.","version":"0.2.0","maintainers":[{"name":"Chris Dew","email":"cmsdew@gmail.com"}],"bugs":{"url":"http://github.com/chrisdew/barricane-db/issues"},"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/chrisdew/barricane-db"}],"main":"./lib/barricane-db","engines":{"node":">=0.2.6"},"dependencies":{"vows":">=0.5.2","docco":">=0.3.0","node-uuid":">=1.1.0","datejs":">=0.0.1"},"_id":"barricane-db@0.2.0","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.2.6","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"47daa4c8515cbbc1b1b7f6a228ce269fca54d0c4","tarball":"http://registry.npmjs.org/barricane-db/-/barricane-db-0.2.0.tgz"}}},"maintainers":[{"name":"chrisdew","email":"cmsdew@gmail.com"}],"time":{"modified":"2011-02-10T12:14:23.819Z","created":"2011-02-10T12:14:23.557Z","0.2.0":"2011-02-10T12:14:23.819Z"},"_attachments":{"barricane-db-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SdVufT/9LELzyv9BhFUmpQ==","length":23737,"stub":true}}}},
{"id":"barrier","key":"barrier","value":{"rev":"3-6160235a04c4496226a25d89dc4af88a"},"doc":{"_id":"barrier","_rev":"3-6160235a04c4496226a25d89dc4af88a","name":"barrier","description":"A very simple implementation of Barrier as a coordination primitive","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"barrier","description":"A very simple implementation of Barrier as a coordination primitive","version":"0.1.0","contributors":[{"name":"Dave Dopson","email":"ddopson@gmail.com"}],"dependencies":{},"devDependencies":{"mocha":"*","expect.js":"*"},"main":"lib/barrier.js","directories":{"bin":"./bin"},"repository":{"type":"git","url":"git://github.com/ddopson/node-barrier.git"},"scripts":{"test":"mocha -R spec test/*-test.js"},"_npmUser":{"name":"ddopson","email":"ddopson@gmail.com"},"_id":"barrier@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"bin":{},"dist":{"shasum":"1198c2786fe611a153ffb230ad4a8bba3edb849a","tarball":"http://registry.npmjs.org/barrier/-/barrier-0.1.0.tgz"},"maintainers":[{"name":"ddopson","email":"ddopson@gmail.com"}]}},"readme":"\n# Overview\n\n    var Barrier = require('barrier');\n\n    var b = new Barrier();\n\n    b.once(function() {\n      // do some stuff\n    });\n\n\n    fs.doSomethingAsync(function () {\n      b.complete();\n    });\n","maintainers":[{"name":"ddopson","email":"ddopson@gmail.com"}],"time":{"modified":"2012-04-05T00:18:21.400Z","created":"2012-04-05T00:18:19.414Z","0.1.0":"2012-04-05T00:18:21.400Z"},"repository":{"type":"git","url":"git://github.com/ddopson/node-barrier.git"},"_attachments":{"barrier-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2ITcyVBfAawX5sz1sx6MxA==","length":1337,"stub":true}}}},
{"id":"barrister","key":"barrister","value":{"rev":"33-a44b6f208cf6cbf98559e08f05f62b63"},"doc":{"_id":"barrister","_rev":"33-a44b6f208cf6cbf98559e08f05f62b63","name":"barrister","description":"Client and server bindings for Barrister RPC","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.0","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"dist/barrister.node","files":["dist/barrister.node.js","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"repository":{"type":"git","url":"git://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"coopernurse","email":"james@bitmechanic.com"},"_id":"barrister@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9e521a6a46ef0f25723e0949c8f805b416c0b650","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.0.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}],"directories":{}},"0.1.1":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.1","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"dist/barrister.node","files":["dist/barrister.node.js","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"repository":{"type":"git","url":"git://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"coopernurse","email":"james@bitmechanic.com"},"_id":"barrister@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"a2900c848617ae8e21cce54a4d1beb0efe22449d","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.1.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}],"directories":{}},"0.1.2":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.2","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"dist/barrister.node","files":["dist/barrister.node.js","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"repository":{"type":"git","url":"git://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"coopernurse","email":"james@bitmechanic.com"},"_id":"barrister@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"9764648cc6d88c7c85316113569a5266b784205b","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.2.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}],"directories":{}},"0.1.3":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.3","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"dist/barrister.node.js","directories":["dist"],"files":["dist/barrister.node.js","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"devDependencies":{"chai":">0.0.0","mocha":">0.0.0"},"repository":{"type":"git","url":"git://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"coopernurse","email":"james@bitmechanic.com"},"_id":"barrister@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"9f63fd8f06fdfbb6f3374924301724bdd03e3eab","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.3.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}]},"0.1.4":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.4","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"./dist/barrister.node.js","directories":{"dist":"./dist"},"files":["./dist/barrister.node.js","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"devDependencies":{"chai":">0.0.0","mocha":">0.0.0"},"repository":{"type":"git","url":"https://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"readme":"# Barrister Javascript Bindings\n\nDevelop type safe contracts for your web services!\n\n* Usable from Node.js (client and server) or a web browser (client only)\n* For an overview of Barrister RPC, visit: http://barrister.bitmechanic.com/\n\n## Installation\n\nFor Node.js:\n\n    npm install barrister\n    \nFor web browsers:\n\n    # download either of these:\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.js  > barrister.browser.js\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.min.js > barrister.browser.min.js\n    \n    # download Crockford's json2.min.js to provide JSON support\n    curl http://barrister.bitmechanic.com/dist/js/latest/json2.min.js > json2.min.js\n    \n## Demo\n\nhttps://github.com/coopernurse/barrister-demo-contact/tree/master/js\n\n* Includes a Node.js server implementation using Express\n* Includes both Node.js and browser based clients you can test against the server\n\n## More Information\n\n* Read the [IDL Docs](http://barrister.bitmechanic.com/docs.html) for more info on writing \n  Barrister IDL files\n* View the annotated source:\n  * [Node.js](http://barrister.bitmechanic.com/api/js/latest/barrister.node.html)\n  * [Browser](http://barrister.bitmechanic.com/api/js/latest/barrister.browser.html)\n* [Barrister Google Group](https://groups.google.com/forum/#!forum/barrister-rpc) - Post questions and ideas here\n\n## License\n\nDistributed under the MIT license.  See LICENSE file for details.\n\n## Release / Tag notes\n\nNote to self on how to tag release\n\n    # Edit package.json, bump version, then run:\n    \n    make clean all\n    git add -u\n    git commit -m \"bump npm v0.1.0\"\n    git tag -a v0.1.0 -m \"version 0.1.0\"\n    git push --tags\n    npm publish\n    \n    ","_id":"barrister@0.1.4","dist":{"shasum":"b3a84d10e1799209ffe8952f4c8987c5f37e5358","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.4.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}]},"0.1.5":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.5","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"./dist/barrister.node.js","directories":{"dist":"./dist"},"files":["./dist/barrister.node.js","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"devDependencies":{"chai":">0.0.0","mocha":">0.0.0"},"repository":{"type":"git","url":"https://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"readme":"# Barrister Javascript Bindings\n\nDevelop type safe contracts for your web services!\n\n* Usable from Node.js (client and server) or a web browser (client only)\n* For an overview of Barrister RPC, visit: http://barrister.bitmechanic.com/\n\n## Installation\n\nFor Node.js:\n\n    npm install barrister\n    \nFor web browsers:\n\n    # download either of these:\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.js  > barrister.browser.js\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.min.js > barrister.browser.min.js\n    \n    # download Crockford's json2.min.js to provide JSON support\n    curl http://barrister.bitmechanic.com/dist/js/latest/json2.min.js > json2.min.js\n    \n## Demo\n\nhttps://github.com/coopernurse/barrister-demo-contact/tree/master/js\n\n* Includes a Node.js server implementation using Express\n* Includes both Node.js and browser based clients you can test against the server\n\n## More Information\n\n* Read the [IDL Docs](http://barrister.bitmechanic.com/docs.html) for more info on writing \n  Barrister IDL files\n* View the annotated source:\n  * [Node.js](http://barrister.bitmechanic.com/api/js/latest/barrister.node.html)\n  * [Browser](http://barrister.bitmechanic.com/api/js/latest/barrister.browser.html)\n* [Barrister Google Group](https://groups.google.com/forum/#!forum/barrister-rpc) - Post questions and ideas here\n\n## License\n\nDistributed under the MIT license.  See LICENSE file for details.\n\n## Release / Tag notes\n\nNote to self on how to tag release\n\n    # Edit package.json, bump version, then run:\n    \n    make clean all\n    git add -u\n    git commit -m \"bump npm v0.1.0\"\n    git tag -a v0.1.0 -m \"version 0.1.0\"\n    git push --tags\n    npm publish\n    \n    ","_id":"barrister@0.1.5","dist":{"shasum":"4feff931461ca0829d0a6e97038939267b16b941","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.5.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}]},"0.1.6":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.6","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"./dist/barrister.node.js","files":["dist","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"devDependencies":{"chai":">0.0.0","mocha":">0.0.0"},"repository":{"type":"git","url":"https://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"readme":"# Barrister Javascript Bindings\n\nDevelop type safe contracts for your web services!\n\n* Usable from Node.js (client and server) or a web browser (client only)\n* For an overview of Barrister RPC, visit: http://barrister.bitmechanic.com/\n\n## Installation\n\nFor Node.js:\n\n    npm install barrister\n    \nFor web browsers:\n\n    # download either of these:\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.js  > barrister.browser.js\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.min.js > barrister.browser.min.js\n    \n    # download Crockford's json2.min.js to provide JSON support\n    curl http://barrister.bitmechanic.com/dist/js/latest/json2.min.js > json2.min.js\n    \n## Demo\n\nhttps://github.com/coopernurse/barrister-demo-contact/tree/master/js\n\n* Includes a Node.js server implementation using Express\n* Includes both Node.js and browser based clients you can test against the server\n\n## More Information\n\n* Read the [IDL Docs](http://barrister.bitmechanic.com/docs.html) for more info on writing \n  Barrister IDL files\n* View the annotated source:\n  * [Node.js](http://barrister.bitmechanic.com/api/js/latest/barrister.node.html)\n  * [Browser](http://barrister.bitmechanic.com/api/js/latest/barrister.browser.html)\n* [Barrister Google Group](https://groups.google.com/forum/#!forum/barrister-rpc) - Post questions and ideas here\n\n## License\n\nDistributed under the MIT license.  See LICENSE file for details.\n\n## Release / Tag notes\n\nNote to self on how to tag release\n\n    # Edit package.json, bump version, then run:\n    \n    make clean all\n    git add -u\n    git commit -m \"bump npm v0.1.0\"\n    git tag -a v0.1.0 -m \"version 0.1.0\"\n    git push --tags\n    npm publish\n    \n    ","_id":"barrister@0.1.6","dist":{"shasum":"05f2e998cffa3374d353c5663968ec6a4a621eb6","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.6.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}],"directories":{}},"0.1.7":{"name":"barrister","description":"Client and server bindings for Barrister RPC","version":"0.1.7","author":{"name":"James Cooper","email":"james@bitmechanic.com"},"license":"MIT","contributors":[{"name":"James Cooper","email":"james@bitmechanic.com"}],"keywords":["rpc","server"],"main":"lib/barrister.node.js","files":["lib","README.md","LICENSE"],"dependencies":{"request":"2.9.x"},"devDependencies":{"chai":">0.0.0","mocha":">0.0.0"},"repository":{"type":"git","url":"https://github.com/coopernurse/barrister-js.git"},"engines":{"node":">=0.4.0"},"readme":"# Barrister Javascript Bindings\n\nDevelop type safe contracts for your web services!\n\n* Usable from Node.js (client and server) or a web browser (client only)\n* For an overview of Barrister RPC, visit: http://barrister.bitmechanic.com/\n\n## Installation\n\nFor Node.js:\n\n    npm install barrister\n    \nFor web browsers:\n\n    # download either of these:\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.js  > barrister.browser.js\n    curl http://barrister.bitmechanic.com/dist/js/latest/barrister.browser.min.js > barrister.browser.min.js\n    \n    # download Crockford's json2.min.js to provide JSON support\n    curl http://barrister.bitmechanic.com/dist/js/latest/json2.min.js > json2.min.js\n    \n## Demo\n\nhttps://github.com/coopernurse/barrister-demo-contact/tree/master/js\n\n* Includes a Node.js server implementation using Express\n* Includes both Node.js and browser based clients you can test against the server\n\n## More Information\n\n* Read the [IDL Docs](http://barrister.bitmechanic.com/docs.html) for more info on writing \n  Barrister IDL files\n* View the annotated source:\n  * [Node.js](http://barrister.bitmechanic.com/api/js/latest/barrister.node.html)\n  * [Browser](http://barrister.bitmechanic.com/api/js/latest/barrister.browser.html)\n* [Barrister Google Group](https://groups.google.com/forum/#!forum/barrister-rpc) - Post questions and ideas here\n\n## License\n\nDistributed under the MIT license.  See LICENSE file for details.\n\n## Release / Tag notes\n\nNote to self on how to tag release\n\n    # Edit package.json, bump version, then run:\n    \n    make clean all\n    git add -u\n    git commit -m \"bump npm v0.1.0\"\n    git tag -a v0.1.0 -m \"version 0.1.0\"\n    git push --tags\n    npm publish\n    \n    ","_id":"barrister@0.1.7","dist":{"shasum":"d222bfcbc5b785d0a8db4e0842af236cdea8c66f","tarball":"http://registry.npmjs.org/barrister/-/barrister-0.1.7.tgz"},"maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}]}},"readme":"# Barrister Javascript Bindings\n\nDevelop type safe contracts for your web services!\n\n* Usable from Node.js (client and server) or a web browser (client only)\n* For an overview of Barrister RPC, visit: http://barrister.bitmechanic.com/\n\n## Installation\n\nFor Node.js:\n\n    npm install barrister\n    \nFor web browsers:\n\n    # download either of these:\n    curl http://bit.ly/HjyeZl > barrister.browser.js\n    curl http://bit.ly/Hh9kIs > barrister.browser.min.js\n    \n    # download Crockford's json2.min.js to provide JSON support\n    curl http://bit.ly/HccvOi > json2.min.js\n    \n## Demo\n\nhttps://github.com/coopernurse/barrister-demo-contact/tree/master/js\n\n* Includes a Node.js server implementation using Express\n* Includes both Node.js and browser based clients you can test against the server\n\n## More Information\n\n* Read the [IDL Docs](http://barrister.bitmechanic.com/docs.html) for more info on writing \n  Barrister IDL files\n* View the annotated source:\n  * [Node.js](http://barrister.bitmechanic.com/api/js/latest/barrister.node.html)\n  * [Browser](http://barrister.bitmechanic.com/api/js/latest/barrister.browser.html)\n* [Barrister Google Group](https://groups.google.com/forum/#!forum/barrister-rpc) - Post questions and ideas here\n\n## License\n\nDistributed under the MIT license.  See LICENSE file for details.\n","maintainers":[{"name":"coopernurse","email":"james@bitmechanic.com"}],"time":{"modified":"2012-06-27T08:51:43.352Z","created":"2012-04-05T20:32:54.967Z","0.1.0":"2012-04-05T20:32:56.783Z","0.1.1":"2012-04-25T14:22:44.078Z","0.1.2":"2012-06-17T02:26:35.263Z","0.1.3":"2012-06-27T08:17:00.581Z","0.1.4":"2012-06-27T08:39:59.276Z","0.1.5":"2012-06-27T08:40:53.390Z","0.1.6":"2012-06-27T08:47:02.692Z","0.1.7":"2012-06-27T08:51:43.352Z"},"author":{"name":"James Cooper","email":"james@bitmechanic.com"},"repository":{"type":"git","url":"https://github.com/coopernurse/barrister-js.git"},"_attachments":{"barrister-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-18s26QRePJn8KZdFChHJow==","length":13144,"stub":true},"barrister-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-LHWheaAilSPmQYaQikZ1sA==","length":25863,"stub":true},"barrister-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-KZ+kxh8D8sHmxCHT9GPJdA==","length":1864,"stub":true},"barrister-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-n2inpE5iKJ8L93mXQItFpA==","length":1864,"stub":true},"barrister-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-QA1wlQSXTPqeLS9MUfjAww==","length":40960,"stub":true},"barrister-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MAh0KDl+TtKnEIt8ZwGxeA==","length":30720,"stub":true},"barrister-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-YILilOD80DGo5wpJHyxHkA==","length":30720,"stub":true},"barrister-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aBOyKQBXlVB7KyRzfVNAMg==","length":20480,"stub":true}}}},
{"id":"base","key":"base","value":{"rev":"31-9279785b31d665621a9d05fd89afc82e"},"doc":{"_id":"base","_rev":"31-9279785b31d665621a9d05fd89afc82e","name":"base","description":"A lightweight micro web framework that build on connect.js and written in CoffeeScript.","dist-tags":{"latest":"0.5.0"},"versions":{"0.0.1dev":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework.","keywords":["framework","api","web","mvc","extensible","micro"],"version":"0.0.1dev","homepage":"http://base.antz29.com","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.2.0","slicer":">=0.2.0"},"devDependencies":{"expresso":">=0.9.0","linter":">=0.0.7"},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.0.1dev","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"336f770cee6049e3520d85b757aa58d3c712f62b","tarball":"http://registry.npmjs.org/base/-/base-0.0.1dev.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.0":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.0","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"4ff98dec36793f6b3b80a4553b76c6887b64a021","tarball":"http://registry.npmjs.org/base/-/base-0.2.0.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.1":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.1","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"e082b8cdbd4bd7412f52247bfa29e6594f3bdc9b","tarball":"http://registry.npmjs.org/base/-/base-0.2.1.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.2":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.2","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"cb31d8cd1edf6c902af09ebc8835c3f6f569ac80","tarball":"http://registry.npmjs.org/base/-/base-0.2.2.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.3":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.3","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"3a8fe22212ac77dbccc95454292ebc7da291fe3f","tarball":"http://registry.npmjs.org/base/-/base-0.2.3.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.4":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.4","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"580614bbfecf54a233fcf7009423df7d97d6ac36","tarball":"http://registry.npmjs.org/base/-/base-0.2.4.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.5":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.5","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"fc813a6b4a7b4986779a022d23840d090be3b559","tarball":"http://registry.npmjs.org/base/-/base-0.2.5.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.2.6":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.2.6","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.js","dependencies":{"twister":">=0.0.1","slicer":">=0.0.1","configr":">=0.0.1","underscore":">=0.0.1","async":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.2.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"e619941ac71fc4b3e5516400359c71a074e0bbf0","tarball":"http://registry.npmjs.org/base/-/base-0.2.6.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.3.0":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.3.0","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.coffee","dependencies":{"coffee-script":"*","twister":"*","slicer":"*","configr":"*","underscore":"*","async":"*","connect":"*"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"96a6bb31f04cae6d16273b7609e4d1d64e82f9e5","tarball":"http://registry.npmjs.org/base/-/base-0.3.0.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.4.0":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.4.0","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.coffee","dependencies":{"coffee-script":"*","twister":"*","slicer":"*","configr":"*","underscore":"*","async":"*","connect":"*"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.4.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"cb91cc5121748dd6475099a5b21de5cbbe052feb","tarball":"http://registry.npmjs.org/base/-/base-0.4.0.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.4.1":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.4.1","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.coffee","dependencies":{"coffee-script":"*","twister":"*","slicer":"*","configr":"*","underscore":"*","async":"*","connect":"*"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.4.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"51eda9f25855a7b8234c9354553ba893f75c6501","tarball":"http://registry.npmjs.org/base/-/base-0.4.1.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.4.2":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that integrates with connect.js","keywords":["framework","api","web","mvc","extensible","micro","connect"],"version":"0.4.2","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.coffee","dependencies":{"coffee-script":"*","twister":"*","slicer":"*","configr":"*","underscore":"*","async":"*","connect":"*"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.4.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"658e80d9ab946a4292d45e3cd3358990df1e1716","tarball":"http://registry.npmjs.org/base/-/base-0.4.2.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]},"0.5.0":{"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"name":"base","description":"A lightweight micro web framework that build on connect.js and written in CoffeeScript.","keywords":["framework","coffeescript","api","web","mvc","extensible","micro","connect"],"version":"0.5.0","homepage":"http://github.com/antz29/node-base","repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"bugs":{"email":"base-bugs@antz29.com","url":"http://github.com/antz29/node-base/issues"},"engines":{"node":">=0.6.0"},"directories":{"lib":"./src/lib"},"main":"./src/lib/base.coffee","dependencies":{"coffee-script":"*","twister":"*","slicer":"*","configr":"*","underscore":"*","async":"*","connect":"*"},"devDependencies":{},"_npmUser":{"name":"antz29","email":"jp@antz29.com"},"_id":"base@0.5.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"74d3cfebc64c9445537a18cd68af7c99d9aa1234","tarball":"http://registry.npmjs.org/base/-/base-0.5.0.tgz"},"maintainers":[{"name":"antz29","email":"jp@antz29.com"}]}},"readme":"# node-base - The Base Framework for NodeJS\n\n## Installation\n\n    npm install base\n\n## What's it do?\n\nIt's a lightweight, full stack web framework for NodeJS.\n\n## Usage\n\n\n## Rules\n\n\n## Bugs\n\nSee <https://github.com/antz29/node-base/issues>.\n","maintainers":[{"name":"antz29","email":"jp@antz29.com"}],"time":{"modified":"2012-04-09T09:50:01.207Z","created":"2011-11-08T04:22:33.424Z","0.0.1dev":"2011-11-08T04:22:36.796Z","0.2.0":"2011-12-04T22:49:58.672Z","0.2.1":"2011-12-07T14:01:47.016Z","0.2.2":"2011-12-07T14:10:24.662Z","0.2.3":"2011-12-07T14:17:25.007Z","0.2.4":"2012-03-05T03:35:16.334Z","0.2.5":"2012-03-06T09:44:43.789Z","0.2.6":"2012-03-16T08:57:30.638Z","0.3.0":"2012-04-06T20:17:27.816Z","0.4.0":"2012-04-07T08:41:14.190Z","0.4.1":"2012-04-07T09:13:16.349Z","0.4.2":"2012-04-07T21:23:58.009Z","0.5.0":"2012-04-09T09:50:01.207Z"},"author":{"name":"John Le Drew","email":"jp@antz29.com","url":"http://antz29.com"},"repository":{"type":"git","url":"git://github.com/antz29/node-base.git"},"_attachments":{"base-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-FOliAsb+xBvwID+EB6ePbw==","length":10240,"stub":true},"base-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-WUsdRi9fSz9nPMl8ztTS3A==","length":10240,"stub":true},"base-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Cfi+fUdX7cCunQvg8X4+Wg==","length":10240,"stub":true},"base-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-lWGTS7psWgme58f7bdCVvg==","length":10240,"stub":true},"base-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-V7fcpiLfj0off7ioqZ85UA==","length":10240,"stub":true},"base-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-o6Ffn/8pBMYQJVLcDIxl2A==","length":10240,"stub":true},"base-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-vxJQ7INyhqBF0U1TqTtIhA==","length":10240,"stub":true},"base-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-nbTgGB0egUpnfMg6vD/s5Q==","length":10240,"stub":true},"base-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-9mlSCb9H/Ol6h+BjpNX9JQ==","length":10240,"stub":true},"base-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Bt7SfUzcC7Vwm+1Qnruqig==","length":10240,"stub":true},"base-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-DEUJ7vCeMbOe7P1Imp0vUQ==","length":10240,"stub":true},"base-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fdI9xWkkyRAW2PLi/9IbuA==","length":10240,"stub":true},"base-0.0.1dev.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WqipXXuF6Ue8wfGaktcWpA==","length":10240,"stub":true}}}},
{"id":"base-converter","key":"base-converter","value":{"rev":"9-352d7fdf805ae1921cf68c49dd036385"},"doc":{"_id":"base-converter","_rev":"9-352d7fdf805ae1921cf68c49dd036385","name":"base-converter","description":"Simple math tool for base convertion : decimal from/to any base","dist-tags":{"latest":"1.1.2"},"versions":{"1.0.0":{"name":"base-converter","description":"Simple math tool for base convertion : decimal from/to any base","version":"1.0.0","repository":"http://github.com/naholyr/node-base-converter.git","author":{"name":"Nicolas Chambrier","email":"naholyr@gmail.com"},"main":"base-converter","directories":{"lib":"."},"engines":{"node":"*"},"_id":"base-converter@1.0.0","_engineSupported":true,"_npmVersion":"0.2.14-2","_nodeVersion":"v0.3.4-pre","modules":{"index.js":"index.js","README.md":"README.md","package.json":"package.json",".git/index":".git/index",".git/description":".git/description",".git/COMMIT_EDITMSG":".git/COMMIT_EDITMSG",".git/config":".git/config",".git/HEAD":".git/HEAD",".git/hooks/update.sample":".git/hooks/update.sample",".git/hooks/pre-rebase.sample":".git/hooks/pre-rebase.sample",".git/hooks/commit-msg.sample":".git/hooks/commit-msg.sample",".git/hooks/post-update.sample":".git/hooks/post-update.sample",".git/hooks/pre-commit.sample":".git/hooks/pre-commit.sample",".git/hooks/post-receive.sample":".git/hooks/post-receive.sample",".git/hooks/prepare-commit-msg.sample":".git/hooks/prepare-commit-msg.sample",".git/hooks/post-commit.sample":".git/hooks/post-commit.sample",".git/hooks/pre-applypatch.sample":".git/hooks/pre-applypatch.sample",".git/hooks/applypatch-msg.sample":".git/hooks/applypatch-msg.sample",".git/info/exclude":".git/info/exclude",".git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc":".git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc",".git/objects/42/14967a0cac14ded346beb241bddf17bd4fa75c":".git/objects/42/14967a0cac14ded346beb241bddf17bd4fa75c",".git/objects/a4/348b5a78a0b7817777ea81fa11e21b10fad7df":".git/objects/a4/348b5a78a0b7817777ea81fa11e21b10fad7df",".git/objects/50/ffda26950466ede21e221336b081430cd57d05":".git/objects/50/ffda26950466ede21e221336b081430cd57d05",".git/objects/f0/a9c3e9deb55ce6a8796073dfa5a5c266f729c6":".git/objects/f0/a9c3e9deb55ce6a8796073dfa5a5c266f729c6",".git/objects/d4/a04491685b8b90309ff7e0c65746e66647eb23":".git/objects/d4/a04491685b8b90309ff7e0c65746e66647eb23",".git/objects/8a/ebff3f145214e4cf0140e1179fc7f94004fb58":".git/objects/8a/ebff3f145214e4cf0140e1179fc7f94004fb58",".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391":".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391",".git/objects/8d/d3580cd8c8d1d5799effcf17162579827032ff":".git/objects/8d/d3580cd8c8d1d5799effcf17162579827032ff",".git/objects/0b/4ded5515ddf32a606cdcd96ed97083734c7e06":".git/objects/0b/4ded5515ddf32a606cdcd96ed97083734c7e06",".git/objects/83/b98c2df2b42409998a8fdb0ae32bc94fe023f1":".git/objects/83/b98c2df2b42409998a8fdb0ae32bc94fe023f1",".git/refs/heads/master":".git/refs/heads/master",".git/refs/remotes/origin/master":".git/refs/remotes/origin/master",".git/logs/HEAD":".git/logs/HEAD",".git/logs/refs/heads/master":".git/logs/refs/heads/master",".git/logs/refs/remotes/origin/master":".git/logs/refs/remotes/origin/master"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"32ef3ea79c798b71cba141a58e9090acf3df198a","tarball":"http://registry.npmjs.org/base-converter/-/base-converter-1.0.0.tgz"}},"1.1.0":{"name":"base-converter","description":"Simple math tool for base convertion : decimal from/to any base","version":"1.1.0","repository":{"type":"git","url":"git://github.com/naholyr/node-base-converter.git"},"author":{"name":"Nicolas Chambrier","email":"naholyr@gmail.com"},"main":"index","directories":{"lib":"."},"engines":{"node":"*"},"_id":"base-converter@1.1.0","_engineSupported":true,"_npmVersion":"0.3.2","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d720fb051e7d0374b0bd25da3efd30f450dda748","tarball":"http://registry.npmjs.org/base-converter/-/base-converter-1.1.0.tgz"}},"1.1.1":{"name":"base-converter","description":"Simple math tool for base convertion : decimal from/to any base","version":"1.1.1","author":{"name":"Nicolas Chambrier","email":"naholyr@gmail.com","url":"http://naholyr.fr"},"directories":{"lib":"."},"engines":{"node":"*"},"dependencies":{},"devDependencies":{},"homepage":"http://github.com/naholyr/node-base-converter","repository":{"type":"git","url":"git://github.com/naholyr/node-base-converter.git"},"main":"index.js","scripts":{"test":"node test"},"_id":"base-converter@1.1.1","_engineSupported":true,"_npmVersion":"1.0.1","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"049ca7128b033ff9c900ef32b705968666c4d4e9","tarball":"http://registry.npmjs.org/base-converter/-/base-converter-1.1.1.tgz"}},"1.1.2":{"name":"base-converter","description":"Simple math tool for base convertion : decimal from/to any base","version":"1.1.2","author":{"name":"Nicolas Chambrier","email":"naholyr@gmail.com","url":"http://naholyr.fr"},"directories":{"lib":"."},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{},"homepage":"http://github.com/naholyr/node-base-converter","repository":{"type":"git","url":"git://github.com/naholyr/node-base-converter.git"},"main":"index.js","scripts":{"test":"node test"},"_npmUser":{"name":"naholyr","email":"naholyr@gmail.com"},"_id":"base-converter@1.1.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"3abd417c6277c28bc3dedb6ac1af16d4b720615a","tarball":"http://registry.npmjs.org/base-converter/-/base-converter-1.1.2.tgz"},"maintainers":[{"name":"naholyr","email":"naholyr@gmail.com"}]}},"maintainers":[{"name":"naholyr","email":"naholyr@gmail.com"}],"time":{"modified":"2011-11-29T22:11:58.130Z","created":"2011-01-11T21:05:24.548Z","1.0.0":"2011-01-11T21:05:24.906Z","1.1.0":"2011-02-19T22:28:50.269Z","1.1.1":"2011-05-02T15:30:58.855Z","1.1.2":"2011-11-29T22:11:58.130Z"},"author":{"name":"Nicolas Chambrier","email":"naholyr@gmail.com","url":"http://naholyr.fr"},"repository":{"type":"git","url":"git://github.com/naholyr/node-base-converter.git"},"_attachments":{"base-converter-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qSna4E3ISxoVqWCBVw9egQ==","length":3442,"stub":true},"base-converter-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qn+N3ZZA0AKszscfXEj9xg==","length":3237,"stub":true},"base-converter-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rOGA5oSNnoI8ueObQDgMBA==","length":3205,"stub":true},"base-converter-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-acGJ+Rhud0ftz2+KbsBAPQ==","length":1245,"stub":true}}}},
{"id":"base-framework","key":"base-framework","value":{"rev":"5-aba8e3b8dbf474d94a81f464c1efbb47"},"doc":{"_id":"base-framework","_rev":"5-aba8e3b8dbf474d94a81f464c1efbb47","name":"base-framework","description":"An object prototype building framework","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"base-framework","description":"An object prototype building framework","keywords":["objects","prototyping","framework"],"version":"1.0.0","homepage":"https://CharlotteGore@github.com/CharlotteGore/Base.git","author":{"name":"Charlotte Gore","email":"conspiracygore@gmail.com","url":"http://charlottegore.com/"},"contributors":[{"name":"Charlotte Gore","email":"conspiracygore@gmail.com","url":"http://charlottegore.com/"}],"dependencies":{"underscore":"1.3.x"},"devDependencies":{"mocha":"*","should":"*"},"main":"lib/base","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/CharlotteGore/Base.git"},"engines":{"node":"*"},"_npmUser":{"name":"CharlotteGore","email":"conspiracygore@gmail.com"},"_id":"base-framework@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ad5f38a9cf3c6c818196bf46f04fe3f982729c8a","tarball":"http://registry.npmjs.org/base-framework/-/base-framework-1.0.0.tgz"},"maintainers":[{"name":"CharlotteGore","email":"conspiracygore@gmail.com"}]},"1.0.1":{"name":"base-framework","description":"An object prototype building framework","keywords":["objects","prototyping","framework"],"version":"1.0.1","homepage":"https://CharlotteGore@github.com/CharlotteGore/Base.git","author":{"name":"Charlotte Gore","email":"conspiracygore@gmail.com","url":"http://charlottegore.com/"},"contributors":[{"name":"Charlotte Gore","email":"conspiracygore@gmail.com","url":"http://charlottegore.com/"}],"dependencies":{"underscore":"1.3.x"},"devDependencies":{"mocha":"*","should":"*"},"main":"lib/base","directories":{"lib":"lib"},"repository":{"type":"git","url":"git://github.com/CharlotteGore/Base.git"},"engines":{"node":"*"},"_npmUser":{"name":"CharlotteGore","email":"conspiracygore@gmail.com"},"_id":"base-framework@1.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7336163860b4edbb33e40ac7a708d6375775c253","tarball":"http://registry.npmjs.org/base-framework/-/base-framework-1.0.1.tgz"},"maintainers":[{"name":"CharlotteGore","email":"conspiracygore@gmail.com"}]}},"readme":"## The summary\n\nBase is a lightweight framework for creating consistent, highly readable, chainable and inheritable object prototypes in Javascript. This git repo is for an NPM module for use with Node. It can be used in the browser so long as you manually satisfy the [Underscore](http://documentcloud.github.com/underscore/) dependency. You're already using Underscore though, anyway, right?\n\n## The detail\n\n### Example\n\n\t// Require base...\n\tvar base = require('base');\n \n\t// create a base child. Add the default 'init' constructor which is\n\t// executed automatically when the object is invoked, and another \n\t// instance method.\n\n\tvar MyFactory = base.createChild()\n\t\t.AddInstanceMethods({\n\t\t\tinit : function( args ){\n\t\t\t\tthis.args = args;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tspewArgs : function(){\n\t\t\t\tconsole.log(this.args);\n\t\t\t}\n\t\t});\n\n\tvar myInstance = MyFactory({ hello : 'world'}).spewArgs() // outputs {hello : 'world'} to the console\n\nObjects created with `base.createChild()` have a number of static methods which are used to build your factory.\n\n### addStaticMethods\n\n\tvar Foo = base.createChild();\n\n\tFoo.addStaticMethods({\n\t\tsecretOfLifeUniverseAndEverything : function(){\n\t\t\treturn 42;\n\t\t}\n\t});\n\n\tFoo.secretOfLifeTheUniverseAndEverything() === 42 // TRUE\n\n\n","maintainers":[{"name":"CharlotteGore","email":"conspiracygore@gmail.com"}],"time":{"modified":"2012-04-21T15:19:29.886Z","created":"2012-04-21T15:03:22.228Z","1.0.0":"2012-04-21T15:03:23.937Z","1.0.1":"2012-04-21T15:19:29.886Z"},"author":{"name":"Charlotte Gore","email":"conspiracygore@gmail.com","url":"http://charlottegore.com/"},"repository":{"type":"git","url":"git://github.com/CharlotteGore/Base.git"},"_attachments":{"base-framework-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0SXJ2j4VFwZJukOulvZ1jQ==","length":2843,"stub":true},"base-framework-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lszEonhDzuWuMRYgE0rlew==","length":2388,"stub":true}}}},
{"id":"base12","key":"base12","value":{"rev":"43-ed97dc1e18f6af8634848f08f3e7e429"},"doc":{"_id":"base12","_rev":"43-ed97dc1e18f6af8634848f08f3e7e429","name":"base12","description":"12factor.net app platform for node.js, built on express 3","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.0","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"3.0.0alpha1-pre"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/hunterloftis/base12.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"45f09a17264bc31174490db6870d00b768aca07a","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.0.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.1":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.1","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"3.0.0alpha1-pre"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/hunterloftis/base12.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"fb4ddc8b49f35befc5b3fa828ad98468cfe326fd","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.1.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.2":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.2","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/hunterloftis/base12.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"120359c6ec569dea467be1b623beee23f9ea8cb1","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.2.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.3":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.3","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/hunterloftis/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"5d8dbc1d31515ca2f8b7b493f14e61937eb696c7","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.3.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.4":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.4","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/hunterloftis/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"6c491d176f66e145ee6192638e634387ed381c08","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.4.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.5":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.5","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"8eb80fef0c16bf32c1f7e09eb6809adb5833794a","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.5.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.6":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.6","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"c693cfdbf46984019ba2ca4e4c4e9e55a9f16157","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.6.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.7":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.7","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"069ecfacba616708bf7aea92c61a60310afdb8f9","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.7.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.1.8":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.1.8","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"28dfe57d5ec94a53c16f12a6bfc759f6628c5875","tarball":"http://registry.npmjs.org/base12/-/base12-0.1.8.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.0":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.0","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4179af49c7ed167a4b453c286a7639b9de11c2cb","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.0.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.1":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.1","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"88d047d1d767bdb472cbe12f81fb557855222bb2","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.1.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.2":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.2","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1fc0d18ac8af18a64e9162880874402c40f188f4","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.2.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.3":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.3","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a92f5d8b10e6977ad5cb34f8aa85a8277a71a578","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.3.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.4":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.4","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.1","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1542d0599d2f8586e25829c37eda7efce5ff8165","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.4.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.5":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.5","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.2","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f82f8d51344f64b541b59ed30706fa33c6d98e63","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.5.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.6":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.6","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.2","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"258e7042bceac66c0f30f5f98f166821cef3697e","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.6.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.7":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.7","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.2","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"5c4f700d89f4907af3c9f2654746e6fcd9533261","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.7.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.8":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.8","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.2","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"8d14ebb383ebcdbee86902f29f184ccb30ff4771","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.8.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.2.9":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.2.9","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.2","express":"git://github.com/visionmedia/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.2.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"8737ef4767395fb02d5fff70bc1afd9a6ad1b700","tarball":"http://registry.npmjs.org/base12/-/base12-0.2.9.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.3.1":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.3.1","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.3","express":"git://github.com/Skookum/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.3.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"309831447f5fcf977b76a4824adc27d96f2ba2d5","tarball":"http://registry.npmjs.org/base12/-/base12-0.3.1.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]},"0.3.2":{"name":"base12","description":"12factor.net app platform for node.js, built on express 3","version":"0.3.2","author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"contributors":[{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},{"name":"Jim Snodgrass","email":"jim@skookum.com"},{"name":"David Becher","email":"david@skookum.com"},{"name":"Chris Gomez","email":"akagomez@gmail.com"},{"name":"Kenny Parnell","email":"kenny@skoomum.com"}],"dependencies":{"connect":"2.0.3","express":"git://github.com/Skookum/express.git","async":"latest","underscore":"latest","jade":"latest","commander":"latest"},"devDependencies":{},"keywords":["base12","framework","web","rest","restful","deploy","deployment","12factor","cloud"],"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"main":"index","bin":{"base12":"./bin/base12"},"scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"hunterloftis","email":"hunter@hunterloftis.com"},"_id":"base12@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3fdc414fef6e85a3030ad4c5a5538d105b66e1f4","tarball":"http://registry.npmjs.org/base12/-/base12-0.3.2.tgz"},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}]}},"readme":"","maintainers":[{"name":"hunterloftis","email":"hunter@hunterloftis.com"}],"time":{"modified":"2012-07-12T06:48:32.484Z","created":"2012-03-04T02:09:22.764Z","0.1.0":"2012-03-04T02:09:23.438Z","0.1.1":"2012-03-04T21:19:06.774Z","0.1.2":"2012-03-04T21:20:54.446Z","0.1.3":"2012-03-04T21:35:55.071Z","0.1.4":"2012-03-04T21:38:38.860Z","0.1.5":"2012-03-04T23:31:05.229Z","0.1.6":"2012-03-05T01:53:23.708Z","0.1.7":"2012-03-06T15:29:42.315Z","0.1.8":"2012-03-06T18:34:55.784Z","0.2.0":"2012-03-07T14:20:08.273Z","0.2.1":"2012-03-07T14:48:02.415Z","0.2.2":"2012-03-08T05:10:14.316Z","0.2.3":"2012-03-08T05:51:23.525Z","0.2.4":"2012-03-08T05:55:52.831Z","0.2.5":"2012-03-08T18:59:29.532Z","0.2.6":"2012-03-14T02:28:45.415Z","0.2.7":"2012-03-21T14:08:33.302Z","0.2.8":"2012-03-21T14:36:12.085Z","0.2.9":"2012-03-21T16:55:41.704Z","0.3.1":"2012-04-12T14:05:10.155Z","0.3.2":"2012-07-12T06:48:32.484Z"},"author":{"name":"Hunter Loftis","email":"hunter@hunterloftis.com"},"repository":{"type":"git","url":"git://github.com/Skookum/base12.git"},"_attachments":{"base12-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-ib6BWUu/kddfQj/8OiS20g==","length":1948007,"stub":true},"base12-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-vthzgZ93y6hCWW4pQ04rsg==","length":1948325,"stub":true},"base12-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-TCHpC0behJD6uVCr7F0YGQ==","length":1948432,"stub":true},"base12-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-wOuYB2mRQoo5sRHxxM+26A==","length":1948245,"stub":true},"base12-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-VgJcPdqW5/OQzUyM9EtP1g==","length":1948229,"stub":true},"base12-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-mBTallp0L9JsSYazzSBFRA==","length":1948200,"stub":true},"base12-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-gvf+so7OPm/pSlVSna8rIQ==","length":1948161,"stub":true},"base12-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-mbSgW9pEsLxWpbWeLSsrfw==","length":1947288,"stub":true},"base12-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-9MyEk9Ky0gJBthArIbH4QA==","length":1947284,"stub":true},"base12-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-8q3A1KVBQKe4gpDT84hX1A==","length":1944806,"stub":true},"base12-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-ABA3Wa7NhznxclXFMlJ8YQ==","length":1944104,"stub":true},"base12-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-cIxEuj97PkFnrZ98Fqkp3w==","length":1944073,"stub":true},"base12-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Rh6nZrMbiWm2tKPUbCqV/g==","length":1941547,"stub":true},"base12-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-k6KgWYRlW0iEV6g6xSpUgA==","length":1941059,"stub":true},"base12-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-DjJ5xdLXP6nIoiYRcp6rXA==","length":2086,"stub":true},"base12-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-QQgL7qyGURnwvQfDXtbbRw==","length":2061,"stub":true},"base12-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-XbqqK/Jtl5Ff4CA3dl2zMg==","length":2049,"stub":true},"base12-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pcKk4LcPuGTr2iXyY8serw==","length":2022,"stub":true},"base12-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kvStlu1yYOOrvZRrkEnERQ==","length":2012,"stub":true},"base12-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ZeKP7tcyY+1wnjhStMSDCA==","length":2003,"stub":true},"base12-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eYlKRTs4Dd+RyKjPu0Ze3A==","length":1915,"stub":true}}}},
{"id":"base32","key":"base32","value":{"rev":"17-f30637ccde5939d8f1ccc707cce0c603"},"doc":{"_id":"base32","_rev":"17-f30637ccde5939d8f1ccc707cce0c603","name":"base32","description":"Base32 encoding and decoding","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"base32","description":"Base32 encoding and decoding, using a variant of Douglas Crockford's Base32","version":"0.0.1","repository":{},"author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"main":"lib/base32","directories":{"lib":"lib"},"scripts":{"test":"coffee test/*.coffee"},"engines":{"node":"*"},"devDependencies":{"coffee-script":">=1.0.0","vows":">=0.5.6"},"_id":"base32@0.0.1","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"484432bb96e7e3616e7c585b2286cb3ea6b162ef","tarball":"http://registry.npmjs.org/base32/-/base32-0.0.1.tgz"}},"0.0.2":{"name":"base32","description":"Base32 encoding and decoding","version":"0.0.2","author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"homepage":"https://github.com/agnoster/base32-js","repository":{"type":"git","url":"git://github.com/agnoster/base32-js.git"},"main":"./lib/base32","directories":{"lib":"./lib","bin":"./bin"},"scripts":{"test":"coffee test/*-test.coffee"},"engines":{"node":"*"},"dependencies":{"optimist":">=0.1.0"},"devDependencies":{"coffee-script":">=1.0.0","vows":">=0.5.6"},"_id":"base32@0.0.2","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","bin":{"base32":"bin/base32.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c59012b89f1901fc626a87639bec41cd957dc857","tarball":"http://registry.npmjs.org/base32/-/base32-0.0.2.tgz"}},"0.0.3":{"name":"base32","description":"Base32 encoding and decoding","version":"0.0.3","author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"homepage":"https://github.com/agnoster/base32-js","repository":{"type":"git","url":"git://github.com/agnoster/base32-js.git"},"main":"./lib/base32","directories":{"lib":"./lib","bin":"./bin"},"scripts":{"test":"coffee test/*-test.coffee"},"engines":{"node":"*"},"dependencies":{"optimist":">=0.1.0"},"devDependencies":{"coffee-script":">=1.0.0","vows":">=0.5.6"},"_id":"base32@0.0.3","_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","bin":{"base32":"bin/base32.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"78936a4d69b6cc4377560d1100388f07040aca2d","tarball":"http://registry.npmjs.org/base32/-/base32-0.0.3.tgz"}},"0.0.5":{"name":"base32","description":"Base32 encoding and decoding","version":"0.0.5","author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"homepage":"https://github.com/agnoster/base32-js","repository":{"type":"git","url":"git://github.com/agnoster/base32-js.git"},"main":"./lib/base32","bin":{"base32":"./bin/base32.js"},"scripts":{"test":"./node_modules/.bin/coffee test/*-test.coffee"},"engines":{"node":">0.4"},"dependencies":{"optimist":">=0.1.0"},"devDependencies":{"coffee-script":">=1.0.0","vows":">=0.5.6"},"readme":"# Base 32 encoding/decoding for JavaScript [![build status](https://secure.travis-ci.org/agnoster/base32-js.png?branch=master)](http://travis-ci.org/agnoster/base32-js)\n\nBase 32 is between hexadecimal notation and Base 64 encoding. It's intended to be a **human-friendly** -- you don't have to worry about punctuation, capitalization, or letters/numbers that are easy to confuse, making it easier to transmit in handwriting or over the phone.\n\nOne of the primary purposes is to have aesthetically pleasing SHA1 hashes. Compare:\n\n - Hex: `17O57684bea1f9331418b633a8f373119d765fd4`\n - B64: `xE_ptB5SeclHm8JEsD0-ST1mTBM`\n - B32: `2w2qd15ym7wk650rprtuh4vk26eqcqym`\n\nTry giving out the Base 64 hash over the phone! \"lowercase 'x', capital 'E', underscore, lowercase 'p', ...\" Base 32 will work the same with upper- or lowercase, you can mistake a number for a similar-looking letter, and it will *still* decode to the same data.\n\n## Getting started\n\nIn your shell, install with npm:\n\n```sh\nnpm install base32\n```\n\nIn your code:\n\n```javascript\nvar base32 = require('base32')\n\n// simple api\n\nvar encoded = base32.encode('some data to encode')\nvar decoded = base32.decode(encoded)\n\n// streaming api\nthis.encoder = new Base32.encoder()\nthis.dataCallback = function(chunk) {\n    this.emit(this.encoder(chunk))\n}\nthis.closeCallback = function(chunk) {\n    this.emit(this.finish()) // flush any remaining bits\n}\n\n// easy sha1 hash\nvar hash = base32.sha1(some_data_to_hash) // DONE.\n```\n\nOn the command-line (to install system-wide, use `npm install -g base32`):\n\n```sh\nbase32 -h\n#> Usage: base32 [input_file] [-o output_file] [-d|--decode] [-s|--sha]\necho \"Hello World\" | base32\n#> 91jprv3f41bpywkccg50\necho 'axqqeb10d5u20wk5c5p6ry90exqq4uvk44' | base32 -d\n#> Wow, it really works!\nbase32 -s test/*\n#> ky2t1raumjn9cghne773petngx3zz3q7  test/base32-test.coffee\n#> 6b4bkjaveddmg5jh7hnyw132yht20g6e  test/compare.coffee\n```\n\n## Warning: this is *a* Base 32 implementation, not *the* Base 32 implementation\n\nThere are about (128 choose 32) different specifications of something called \"Base 32\" - see [Wikipedia](http://en.wikipedia.org/wiki/Base_32) for some of them.\n\nThis is just one that should be simple, less error-prone, and streamable (for [Node](http://nodejs.org)).\n\n## Minispec\n\n- The *encoding* alphabet consists of the numerals 0-9 and the letters a-z, excluding a few letters that might look like numbers, which we simply interpret as follows:\n\n  - I -> 1\n  - L -> 1\n  - O -> 0\n  - S -> 5\n\n- When *decoding*, capital letters are converted to lowercase and the \"ambiguous\" letters mentioned above converted to their numeric counterparts.\n- Each character corresponds to 5 bits of input.\n- Lexicographic order of strings is preserved through Base 32 encoding.\n\n## Formalia\n\nUnder MIT License.\n\nFork as much as you like, I'm more than amenable to pull requests. I'm trying to keep it reasonably node-ish, so bear that in mind.\n","_id":"base32@0.0.5","dist":{"shasum":"41b312bd74fa3a123e53e15b5a292a10472f70e3","tarball":"http://registry.npmjs.org/base32/-/base32-0.0.5.tgz"},"maintainers":[{"name":"agnoster","email":"agnoster@gmail.com"}]}},"maintainers":[{"name":"agnoster","email":"agnoster@gmail.com"}],"time":{"modified":"2012-08-14T20:05:19.063Z","created":"2011-02-09T08:51:05.694Z","0.0.1":"2011-02-09T08:51:06.109Z","0.0.2":"2011-02-09T14:26:28.888Z","0.0.3":"2011-02-09T18:45:00.733Z","0.0.5":"2012-08-14T20:05:19.063Z"},"author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"repository":{"type":"git","url":"git://github.com/agnoster/base32-js.git"},"_attachments":{"base32-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-gGOYTI9XMa26ruGIrFxzEQ==","length":6680,"stub":true},"base32-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Oly0zopPbzL2bfRNJNl8cw==","length":5413,"stub":true},"base32-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-0aMH18L9lqQFmqTLTWFlhQ==","length":4530,"stub":true},"base32-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pyXY0AkJ+qLGwsySnzUzpw==","length":3684,"stub":true}}}},
{"id":"base58","key":"base58","value":{"rev":"7-898990d967aa842c88c3c3bc237d8daf"},"doc":{"_id":"base58","_rev":"7-898990d967aa842c88c3c3bc237d8daf","name":"base58","description":"Base58 encoding and decoding","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"base58","version":"0.0.1","keywords":["base58"],"description":"Base58 encoding and decoding","licenses":[{"type":"MIT","url":"https://raw.github.com/jimeh/node-base58/master/LICENSE.md"}],"author":{"name":"Jim Myhrberg","email":"contact@jimeh.me"},"repository":{"type":"git","url":"git://github.com/jimeh/node-base58.git"},"main":"./lib/base58","engines":{"node":">= 0.4.0 < 0.7.0"},"devDependencies":{"coffee-script":"1.3.1","mocha":"1.0.x","should":"0.6.x"},"scripts":{"test":"make test"},"_npmUser":{"name":"jimeh","email":"contact@jimeh.me"},"_id":"base58@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"400b44d4e0dbe538b2ae5c315f96bfb451d3f56a","tarball":"http://registry.npmjs.org/base58/-/base58-0.0.1.tgz"},"maintainers":[{"name":"jimeh","email":"contact@jimeh.me"}]},"0.0.2":{"name":"base58","version":"0.0.2","keywords":["base58"],"description":"Base58 encoding and decoding","licenses":[{"type":"MIT","url":"https://raw.github.com/jimeh/node-base58/master/LICENSE.md"}],"author":{"name":"Jim Myhrberg","email":"contact@jimeh.me"},"repository":{"type":"git","url":"git://github.com/jimeh/node-base58.git"},"main":"./lib/base58","engines":{"node":">= 0.4.0 < 0.7.0"},"devDependencies":{"coffee-script":"1.3.1","mocha":"1.0.x","should":"0.6.x"},"scripts":{"test":"make test"},"_npmUser":{"name":"jimeh","email":"contact@jimeh.me"},"_id":"base58@0.0.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e85560b60baa4eb9b4bab67345425dbbe7a7b2d2","tarball":"http://registry.npmjs.org/base58/-/base58-0.0.2.tgz"},"maintainers":[{"name":"jimeh","email":"contact@jimeh.me"}]},"0.1.0":{"name":"base58","version":"0.1.0","keywords":["base58"],"description":"Base58 encoding and decoding","licenses":[{"type":"MIT","url":"https://raw.github.com/jimeh/node-base58/master/LICENSE.md"}],"author":{"name":"Jim Myhrberg","email":"contact@jimeh.me"},"repository":{"type":"git","url":"git://github.com/jimeh/node-base58.git"},"main":"./lib/base58","engines":{"node":">= 0.4.0 < 0.7.0"},"devDependencies":{"coffee-script":"1.3.1","mocha":"1.0.x","should":"0.6.x"},"scripts":{"test":"make test"},"_npmUser":{"name":"jimeh","email":"contact@jimeh.me"},"_id":"base58@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"19b3eef18e0dbd726b6bd7c6d61fd1719330dca2","tarball":"http://registry.npmjs.org/base58/-/base58-0.1.0.tgz"},"maintainers":[{"name":"jimeh","email":"contact@jimeh.me"}]}},"readme":"# node-base58\n\n[![Build Status](https://secure.travis-ci.org/jimeh/node-base58.png)](http://travis-ci.org/jimeh/node-base58)\n\nA Base58 encoding and decoding library for [Node.js].\n\n[node.js]: http://nodejs.org/\n\n## What?\n\nBase58 allows you to represent a numeric value with fewer characters, useful\nfor short URLs among other things. Flickr is one the biggest sites that makes\nuse of it for short photo URLs.\n\nFor example `6857269519` becomes `brXijP` when Base58 encoded, and hence the\nFlickr short URL is: [`http://flic.kr/p/brXijP`](http://flic.kr/p/brXijP)\n\n## Installation\n\n    npm install base58\n\n## Usage\n\n```javascript\nvar Base58 = require('base58');\nBase58.encode(6857269519); // 'brXijP'\nBase58.decode('brXijP');   // 6857269519\n```\n\n## Credit\n\nThis package is more or less a port of the [Base58][gem] Ruby Gem by the same\nname.\n\n[gem]: https://github.com/dougal/base58\n\n## License\n\nReleased under the MIT license. Copyright (c) 2012 Jim Myhrberg.\n","maintainers":[{"name":"jimeh","email":"contact@jimeh.me"}],"time":{"modified":"2012-04-19T22:30:11.164Z","created":"2012-04-16T21:52:19.531Z","0.0.1":"2012-04-16T21:52:22.982Z","0.0.2":"2012-04-19T22:12:43.398Z","0.1.0":"2012-04-19T22:30:11.164Z"},"author":{"name":"Jim Myhrberg","email":"contact@jimeh.me"},"repository":{"type":"git","url":"git://github.com/jimeh/node-base58.git"},"_attachments":{"base58-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-rP9ygwumpQC7T0q2SRmfaQ==","length":8066,"stub":true},"base58-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XsIYJfG/vIl0b2txQITvUQ==","length":7973,"stub":true},"base58-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EN/vG7xFu2hUYMnsnrcf1A==","length":7950,"stub":true}}}},
{"id":"base62","key":"base62","value":{"rev":"3-892ade470a66aa48a0484457323eedc5"},"doc":{"_id":"base62","_rev":"3-892ade470a66aa48a0484457323eedc5","name":"base62","description":"Javascript Base62 encode/decoder","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Andrew Nesbitt","email":"andrewnez@gmail.com","url":"http://andrew-nesbitt.com/"},"name":"base62","description":"Javascript Base62 encode/decoder","version":"0.1.0","repository":{"type":"git","url":"git://github.com/andrew/base62.js.git"},"main":"base62.js","engines":{"node":"*"},"_npmUser":{"name":"andrewnez","email":"andrewnez@gmail.com"},"_id":"base62@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"03b8bde71477f095dff3455ccd5f8e0fd6bf91fa","tarball":"http://registry.npmjs.org/base62/-/base62-0.1.0.tgz"},"maintainers":[{"name":"andrewnez","email":"andrewnez@gmail.com"}]}},"readme":"# Base62.js\n\nA javascript Base62 encode/decoder for node.js\n\n## Install\n\n    npm install base62\n\n## Usage\n\n    Base62 = require('base62')\n    Base62.encode(999)  // 'g7'\n    Base62.encode('g7') // 999\n","maintainers":[{"name":"andrewnez","email":"andrewnez@gmail.com"}],"time":{"modified":"2012-02-24T18:04:06.916Z","created":"2012-02-24T18:04:05.588Z","0.1.0":"2012-02-24T18:04:06.916Z"},"author":{"name":"Andrew Nesbitt","email":"andrewnez@gmail.com","url":"http://andrew-nesbitt.com/"},"repository":{"type":"git","url":"git://github.com/andrew/base62.js.git"},"_attachments":{"base62-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/8DL5HGT+gtyKIfb6tnmbw==","length":862,"stub":true}}}},
{"id":"base64","key":"base64","value":{"rev":"31-e70bb848aa98e3b6496e29dd5a217e55"},"doc":{"_id":"base64","_rev":"31-e70bb848aa98e3b6496e29dd5a217e55","name":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","dist-tags":{"latest":"2.0.7"},"versions":{"1.0.0":{"name":"base64","version":"1.0.0","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"maintainers":[{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","web":"http://www.catonmat.net","twitter":"pkrumins"}],"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/pkrumins/node-base64.git"}],"directories":{"tests":"tests"},"engines":{"node":">=0.1.93"},"scripts":{"install":"node-waf configure build"},"_id":"base64@1.0.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/base64/-/base64-1.0.0.tgz"}},"1.0.1":{"name":"base64","version":"1.0.1","main":"./build/default/base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"maintainers":[{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","web":"http://www.catonmat.net","twitter":"pkrumins"}],"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/pkrumins/node-base64.git"}],"directories":{"tests":"tests"},"engines":{"node":">=0.1.93"},"scripts":{"install":"node-waf configure build"},"_id":"base64@1.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/base64/-/base64-1.0.1.tgz"}},"2.0.1":{"name":"base64","version":"2.0.1","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"maintainers":[{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","web":"http://www.catonmat.net","twitter":"pkrumins"}],"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/pkrumins/node-base64.git"}],"directories":{"tests":"tests"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_id":"base64@2.0.1","_nodeSupported":false,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/base64/-/base64-2.0.1.tgz"}},"2.0.2":{"name":"base64","version":"2.0.2","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"maintainers":[{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","web":"http://www.catonmat.net","twitter":"pkrumins"}],"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/pkrumins/node-base64.git"}],"directories":{"tests":"tests"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_id":"base64@2.0.2","_nodeSupported":false,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/base64/-/base64-2.0.2.tgz"}},"2.0.3":{"name":"base64","version":"2.0.3","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"maintainers":[{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","web":"http://www.catonmat.net","twitter":"pkrumins"}],"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/pkrumins/node-base64.git"}],"directories":{"tests":"tests"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_id":"base64@2.0.3","_nodeSupported":false,"_npmVersion":"0.2.5-1","_nodeVersion":"v0.2.4","dist":{"tarball":"http://registry.npmjs.org/base64/-/base64-2.0.3.tgz","bin":{"0.4-sunos-5.11":{"shasum":"60d285fb2fe8a051b4f32eb3acac2c29a3f861af","tarball":"http://registry.npmjs.org/base64/-/base64-2.0.3-0.4-sunos-5.11.tgz"}}}},"2.0.4":{"name":"base64","version":"2.0.4","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}],"licenses":[{"type":"MIT"}],"repositories":[{"type":"git","url":"http://github.com/pkrumins/node-base64.git"}],"directories":{"tests":"tests"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_npmUser":{"name":"pkrumins","email":"peteris.krumins@gmail.com"},"_id":"base64@2.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"df38a7db5ac410f5806ce14d07d807242a5407f7","tarball":"http://registry.npmjs.org/base64/-/base64-2.0.4.tgz"}},"2.0.6":{"name":"base64","version":"2.0.6","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"license":"MIT","repository":{"type":"git","url":"git://github.com/pkrumins/node-base64.git"},"directories":{"tests":"tests"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_npmUser":{"name":"pkrumins","email":"peteris.krumins@gmail.com"},"_id":"base64@2.0.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"5f7e7a268c46f6f7afc36afd21e993f7ba8e9a00","tarball":"http://registry.npmjs.org/base64/-/base64-2.0.6.tgz"},"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}]},"2.0.7":{"name":"base64","version":"2.0.7","main":"base64","description":"A C++ module for node-js that does base64 encoding and decoding.","keywords":["base conversion","base64","base64 encode","base64 decode","base64_encode","base64_decode","encode","decode"],"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"license":"MIT","repository":{"type":"git","url":"git://github.com/pkrumins/node-base64.git"},"directories":{"tests":"tests"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build install"},"_npmUser":{"name":"pkrumins","email":"peteris.krumins@gmail.com"},"_id":"base64@2.0.7","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"158974a04458ad3525955b7b232d09253e92c312","tarball":"http://registry.npmjs.org/base64/-/base64-2.0.7.tgz"},"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}]}},"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}],"time":{"modified":"2012-05-21T18:16:51.969Z","created":"2011-01-18T03:19:31.331Z","1.0.0":"2011-01-18T03:19:31.331Z","1.0.1":"2011-01-18T03:19:31.331Z","2.0.0":"2011-01-18T03:19:31.331Z","2.0.1":"2011-02-01T08:29:16.444Z","2.0.2":"2011-03-17T04:04:39.298Z","2.0.3":"2011-03-18T19:44:39.610Z","2.0.4":"2012-01-29T18:49:50.898Z","2.0.6":"2012-02-01T21:47:47.168Z","2.0.7":"2012-03-03T15:37:15.090Z"},"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"repository":{"type":"git","url":"git://github.com/pkrumins/node-base64.git"},"users":{"nornalbion":true},"_attachments":{"base64-2.0.7.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-yeG4QOhpFkhx6+7SfEMV4Q==","length":124805,"stub":true},"base64-2.0.6.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-5mtB1tmIngEucAnb/sfRCg==","length":124854,"stub":true},"base64-2.0.4.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-mGB153T73XNMg3VVoCfvTg==","length":124807,"stub":true},"base64-2.0.3-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-6zgidXHIQMhNU5kWFHHZNg==","length":167793,"stub":true},"base64-2.0.3.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-BzZUJ62QLCSzmWYmIWSOpQ==","length":124280,"stub":true},"base64-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-v32qZ8vTmf0Vpixrgj3eAA==","length":124278,"stub":true},"base64-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-8rugwtxgQ+sAiO6dd+8/1w==","length":124173,"stub":true},"base64-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-150xj+lp5dC71andn6sGVg==","length":124170,"stub":true},"base64-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CWSZoBUlYXslO6LWCAv8EA==","length":112368,"stub":true},"base64-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rqK+zg8HKS/8yeGJVkFLGQ==","length":112306,"stub":true}}}},
{"id":"base64-js","key":"base64-js","value":{"rev":"5-27548d79a0843998ed23d4140d40081b"},"doc":{"_id":"base64-js","_rev":"5-27548d79a0843998ed23d4140d40081b","name":"base64-js","description":"Base64 encoding/decoding in pure JS","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"T. Jameson Little","email":"t.jameson.little@gmail.com"},"name":"base64-js","description":"Base64 encoding/decoding in pure JS","version":"0.0.1","repository":{"type":"git","url":"git://github.com/beatgammit/deflate-js.git"},"main":"lib/b64.js","scripts":{"test":"cd test; node runner.js; cd -"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatgammit","email":"t.jameson.little@gmail.com"},"_id":"base64-js@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a0094eb63d2c01b094187f51ac9d82f2256a71ae","tarball":"http://registry.npmjs.org/base64-js/-/base64-js-0.0.1.tgz"},"maintainers":[{"name":"beatgammit","email":"t.jameson.little@gmail.com"}]},"0.0.2":{"author":{"name":"T. Jameson Little","email":"t.jameson.little@gmail.com"},"name":"base64-js","description":"Base64 encoding/decoding in pure JS","version":"0.0.2","repository":{"type":"git","url":"git://github.com/beatgammit/deflate-js.git"},"main":"lib/b64.js","scripts":{"test":"cd test; node runner.js; cd -"},"engines":{"node":">= 0.4"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"beatgammit","email":"t.jameson.little@gmail.com"},"_id":"base64-js@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"024f0f72afa25b75f9c0ee73cd4f55ec1bed9784","tarball":"http://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz"},"maintainers":[{"name":"beatgammit","email":"t.jameson.little@gmail.com"}]}},"readme":"Intro\n=====\n\n`base64-js` does basic base64 encoding/decoding in pure JS. Many browsers already have this functionality, but it is for text data, not all-purpose binary data.\n\nSometimes encoding/decoding binary data in the browser is useful, and that is what this module does.\n\nAPI\n===\n\n`base64-js` has two exposed functions, `toByteArray` and `fromByteArray`, which both take a single argument.\n\n* toByteArray- Takes a base64 string and returns a byte array\n* fromByteArray- Takes a byte array and returns a base64 string\n","maintainers":[{"name":"beatgammit","email":"t.jameson.little@gmail.com"}],"time":{"modified":"2011-11-26T22:06:33.304Z","created":"2011-11-26T00:08:51.996Z","0.0.1":"2011-11-26T00:08:55.134Z","0.0.2":"2011-11-26T22:06:33.304Z"},"author":{"name":"T. Jameson Little","email":"t.jameson.little@gmail.com"},"repository":{"type":"git","url":"git://github.com/beatgammit/deflate-js.git"},"_attachments":{"base64-js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-twDQluUJxr5UopZO9cfUaA==","length":1982,"stub":true},"base64-js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fNYLPcOpMuh5T1/Vxuq0eA==","length":1798,"stub":true}}}},
{"id":"base64js","key":"base64js","value":{"rev":"2-ad0383945be7e59e3fa18554afb20c09"},"doc":{"_id":"base64js","_rev":"2-ad0383945be7e59e3fa18554afb20c09","name":"base64js","description":"Simple base64 encoding/decoding","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"base64js","description":"Simple base64 encoding/decoding","version":"1.0.0","contributors":{"neekey":"ni184775761@gmail.com"},"keywords":["base64"],"main":"index.js","repository":{"type":"git","url":"git@github.com:neekey/base64.git"},"_npmUser":{"name":"neekey","email":"ni184775761@gmail.com"},"_id":"base64js@1.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"db3426f1ee4898ea8491b19d79cfc27feaaa5352","tarball":"http://registry.npmjs.org/base64js/-/base64js-1.0.0.tgz"},"maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}]}},"readme":"###Base64.js -- A simple Base64 encode & decode\n\n####Install\n\n`npm install base64js`\n\n####API\n\n#####**decode**( base64String, fileName, next )\n\n* `base64String`: the string you want to decode\n* `filename`: the filename you want to save\n* `next`: the callback when decoding is finished, The callback will be given one argument ( `err` )\n#####**encode**( filename, next )  \n\n`filename`: the name of the file you want to encode\n`next`: the callback when encoding is finished. The callback will be given two arguments ( `err`, `base64String` ), where `base64String` is the encoded string. ","maintainers":[{"name":"neekey","email":"ni184775761@gmail.com"}],"time":{"modified":"2012-04-13T08:29:57.120Z","created":"2012-04-13T08:29:49.384Z","1.0.0":"2012-04-13T08:29:57.120Z"},"repository":{"type":"git","url":"git@github.com:neekey/base64.git"}}},
{"id":"baseit","key":"baseit","value":{"rev":"11-56ff2e3de87c7a9f07053855b1a9eb4a"},"doc":{"_id":"baseit","_rev":"11-56ff2e3de87c7a9f07053855b1a9eb4a","name":"baseit","description":"A node.js module for simple(r) handling of radix 2 through 36 base encodings.","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"author":{"name":"DIY, Co.","email":"help@diy.org","url":"http://diy.org"},"name":"baseit","description":"A node.js module for simple handling of radix 2 through 36 base encodings.","keywords":["Base10","Base12","Base24","Base36","encode","encoder","decode","decoder"],"version":"0.0.1","homepage":"https://github.com/diy/baseit","repository":{"type":"git","url":"git://github.com/diy/baseit.git"},"main":"./lib/baseit.js","scripts":{"test":"vows test/*"},"engines":{"node":">=0.6"},"dependencies":{},"_npmUser":{"name":"diy","email":"help@diy.org"},"_id":"baseit@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"320f6ba57a29dc211fcd90c612a3485a2bc3e781","tarball":"http://registry.npmjs.org/baseit/-/baseit-0.0.1.tgz"},"maintainers":[{"name":"diy","email":"help@diy.org"}]},"0.0.2":{"author":{"name":"Andrew Sliwinski","email":"andrew@diy.org","url":"http://diy.org"},"name":"baseit","description":"A node.js module for simple(r) handling of radix 2 through 36 base encodings.","keywords":["Base10","Base12","Base24","Base36","encode","encoder","decode","decoder"],"version":"0.0.2","homepage":"https://github.com/thisandagain/baseit","repository":{"type":"git","url":"git://github.com/thisandagain/baseit.git"},"main":"./lib/baseit.js","scripts":{"test":"vows test/*"},"engines":{"node":">=0.6"},"dependencies":{},"_npmUser":{"name":"diy","email":"help@diy.org"},"_id":"baseit@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"f984ab79982ba4d8077dac0ba4d4909ed0de29f0","tarball":"http://registry.npmjs.org/baseit/-/baseit-0.0.2.tgz"},"maintainers":[{"name":"diy","email":"help@diy.org"}]},"0.0.3":{"author":{"name":"Andrew Sliwinski","email":"andrew@diy.org","url":"http://diy.org"},"name":"baseit","description":"A node.js module for simple(r) handling of radix 2 through 36 base encodings.","keywords":["Base10","Base12","Base24","Base36","encode","encoder","decode","decoder"],"version":"0.0.3","homepage":"https://github.com/thisandagain/baseit","repository":{"type":"git","url":"git://github.com/thisandagain/baseit.git"},"main":"./lib/baseit.js","scripts":{"test":"vows test/*"},"engines":{"node":">=0.6"},"dependencies":{},"_npmUser":{"name":"diy","email":"help@diy.org"},"_id":"baseit@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a25af25a1d89d8ed34343be4df8f95f026c542f0","tarball":"http://registry.npmjs.org/baseit/-/baseit-0.0.3.tgz"},"maintainers":[{"name":"diy","email":"help@diy.org"}]},"0.1.0":{"author":{"name":"DIY, Co.","url":"https://github.com/diy"},"name":"baseit","description":"A node.js module for simple(r) handling of radix 2 through 36 base encodings.","version":"0.1.0","homepage":"https://github.com/diy/baseit","repository":{"type":"git","url":"git://github.com/diy/baseit.git"},"main":"./lib/baseit.js","dependencies":{},"devDependencies":{"vows":"=0.6.2"},"optionalDependencies":{},"engines":{"node":">=0.6"},"_npmUser":{"name":"diy","email":"help@diy.org"},"_id":"baseit@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"40362e4b263939e1872bbed8bef2e4ace223a300","tarball":"http://registry.npmjs.org/baseit/-/baseit-0.1.0.tgz"},"maintainers":[{"name":"diy","email":"help@diy.org"}]},"0.2.0":{"author":{"name":"DIY, Co.","url":"https://github.com/diy"},"name":"baseit","description":"A node.js module for simple(r) handling of radix 2 through 36 base encodings.","version":"0.2.0","homepage":"https://github.com/thisandagain/baseit","repository":{"type":"git","url":"git://github.com/thisandagain/baseit.git"},"main":"./lib/index.js","scripts":{"test":"tap ./test/*.js"},"dependencies":{},"devDependencies":{"async":"0.1.X","tap":"0.3.X"},"optionalDependencies":{},"engines":{"node":">=0.6"},"_npmUser":{"name":"diy","email":"help@diy.org"},"_id":"baseit@0.2.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"afb30abcbbb212a7784162ed7dbc9fcd376cf808","tarball":"http://registry.npmjs.org/baseit/-/baseit-0.2.0.tgz"},"maintainers":[{"name":"diy","email":"help@diy.org"}]}},"readme":"# Baseit\n#### Base(x) In --> Base(x) Out\n\n## Install\n\tnpm install baseit\n\n## Basic Use\n```javascript\nvar baseit = require('baseit');\n\nbaseit({\n\tinput: \t120000,\n\tto: \t36,\n}, function (err, a) {\n\tif (err) throw err;\n\n\tconsole.log(a);\t\t// \"2klc\"\n});\n````\n\n## Slightly Less Basic Use\n```javascript\nvar baseit = require('baseit');\n\nbaseit({\n\tinput: \t1296,\n\tfrom: \t12,\n\tto: \t36,\n\tdigits: 6\n}, function (err, a) {\n\tif (err) throw err;\n\n\tconsole.log(a);\t\t// \"0001n6\"\n});\n````\n\n## Parameters\n####input (Required)\nInteger or string to be converted.\n\n####to (Optional)\nTarget encoding integer. If not specified, \"to\" will default to 10. Example for Base24: { to: 24 }.\n\n####from (Optional)\nInput encoding integer. If not specified, \"from\" will default to 10. Example for Base8: { from: 8 }.\n\n####digits (Optional)\nMinimum number of digits to return. Will append leading \"zeros\" to meet digit requirement. Example: { digits: 6 }\n\n## Why u no Base64!?\nNode.js already has a good way of [handling Base64 encoding](http://nodejs.org/docs/v0.3.1/api/buffers.html#new_Buffer).\n\n## Testing\n\tvows test/*","maintainers":[{"name":"diy","email":"help@diy.org"}],"time":{"modified":"2012-08-03T01:46:59.031Z","created":"2012-02-01T22:38:51.124Z","0.0.1":"2012-02-01T22:38:52.505Z","0.0.2":"2012-02-06T20:59:26.422Z","0.0.3":"2012-04-20T16:13:21.061Z","0.1.0":"2012-06-17T01:24:48.799Z","0.2.0":"2012-08-03T01:46:59.031Z"},"author":{"name":"DIY, Co.","url":"https://github.com/diy"},"repository":{"type":"git","url":"git://github.com/thisandagain/baseit.git"},"_attachments":{"baseit-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-bdyK1kxXD5hKoBPHvNwD2g==","length":2604,"stub":true},"baseit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zsmpf3s6JvY/AjurGqcOCw==","length":2482,"stub":true},"baseit-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0dg/XrTyUQYv/UxR+IeTug==","length":2583,"stub":true},"baseit-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jllWXEYjhXVJfGV7ShT66g==","length":2469,"stub":true},"baseit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gzmYA0Xg+uZGqPHL9+cBdg==","length":2480,"stub":true}}}},
{"id":"basejs","key":"basejs","value":{"rev":"3-db8e4e4a78a0de6402227e33ff2c70ad"},"doc":{"_id":"basejs","_rev":"3-db8e4e4a78a0de6402227e33ff2c70ad","name":"basejs","description":"Simple class-based inheritance for JavaScript (based on Dean Edwards' Base.js).","dist-tags":{"latest":"1.1.0a"},"versions":{"1.1.0a":{"name":"basejs","description":"Simple class-based inheritance for JavaScript (based on Dean Edwards' Base.js).","version":"1.1.0a","author":{"name":"Kenneth Powers","email":"mail@kenpowers.net"},"main":"Base","keywords":["class","inheritance","Dean Edwards"],"_npmUser":{"name":"KenPowers","email":"mail@kenpowers.net"},"_id":"basejs@1.1.0a","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e47ba20b925425b204c711acc2d9409d959e23b2","tarball":"http://registry.npmjs.org/basejs/-/basejs-1.1.0a.tgz"},"maintainers":[{"name":"KenPowers","email":"mail@kenpowers.net"}]}},"readme":"# Base.js Module\nThis is a modular version of Dean Edward's [Base.js](http://dean.edwards.name/weblog/2006/03/base/). The script first checks to see if it is in an [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) environment and if it is defines an AMD module. If the current environment is not an AMD environment then the script checks to see if it is in a web browser and attaches the `Base` constructor to the `window` object. If those two tests fail then it is assumed that the script is running in a CommonJS environment and it assigns `module.exports` to be a reference to the `Base` constructor.\n\nIn addition to modularizing the code I have also updated the entire implementation so that it passes [JSHint](http://www.jshint.com/) (with default settings in the installed version -- the web version turns on `strict` by default).\n\n# Getting Started\nThe first way to get started using the script is to simply include it wherever else you include scripts (be it at the top, bottom, through a script loader, or what have you):\n\n\t<script src=\"/path/to/Base.js\"></script>\n\nThe second way to get started is to include the script as a dependency for an AMD application or module (using something such as [RequireJS](http://requirejs.org/)):\n\n\t:::javascript\n\trequire('/path/to/Base', function (Base) {\n\t\t// You may now use Base.js as \"Base\" here.\n\t\t// Remember, AMD modules don't use the .js extension!\n\t});\n\nThe third and final way to get started is to `require` the module in a CommonJS environment (such as [node.js](http://nodejs.org/)):\n\n\t:::javascript\n\tvar Base = require('./path/to/Base');\n\nIf you are using [node.js](http://nodejs.org/) with [npm](http://npmjs.org) then you can also install the module as follows:\n\n\t:::text\n    npm install basejs\n\nThen in your script you only need to do the following:\n\n\t:::javascript\n\tvar Base = require('basejs');\n\n# Defining Classes\nMoving forward, whichever path you chose above you should now have a `Base` object to work with. Basic usage is as follows:\n\n\t:::javascript\n\t// Define Animal class\n\tvar Animal = Base.extend({\n\t\tconstructor: function (name) {\n\t\t\tthis.name = name;\n\t\t},\n\t\tname: '',\n\t\teat: function () {\n\t\t\tthis.say('Yum!');\n\t\t},\n\t\tsay: function (message) {\n\t\t\tconsole.log((this.name !== '' ? this.name + ': ' : this.name) + message);\n\t\t}\n\t});\n\n\t// Define the Cat class which extends Animal\n\tvar Cat = Animal.extend({\n\t\teat: function (food) {\n\t\t\tif (food instanceof Mouse)\n\t\t\t\tthis.base();\n\t\t\telse\n\t\t\t\tthis.say('Yuk! I only eat mice.');\n\t\t}\n\t});\n\n\t// Define the a few more animals\n\tvar Mouse = Animal.extend();\n\tvar Dog = Animal.extend();\n\n\t// Try out the classes\n\tvar kitty = new Cat('Kitty');\n\tkitty.eat(new Mouse()); // logs \"Yum!\"\n\tkitty.eat(new Dog()); // logs \"Yuk! I only eat mice.\"\n\nNotice the use of `this.base()`. `this.base()` is how you access the parent's method. This works in all methods (including constructors).\n\nYou can also define static (class-level) properties and methods:\n\n\t:::javascript\n\tvar Circle = Shape.extend({ // instance properties / methods\n\t\tconstructor: function (x, y, radius) {\n\t\t\tthis.base(x, y);\n\t\t\tthis.radius = radius;\n\t\t},\n\t\tradius: 0,\n\t\tgetCircumference: function () {\n\t\t\treturn 2 * Circle.PI * this.radius;\n\t\t}\n\t}, { // class properties / methods\n\t\tPI: 3.14\n\t});\n\nFor more details including private data and singleton objects check out Dean Edward's [original documentation](http://dean.edwards.name/weblog/2006/03/base/).\n\n# License\n\n**The MIT License**\n\nBased on Base.js 1.1a (c) 2006 - 2010 Dean Edwards  \nUpdated to pass JSHint and converted into a Module format by Kenneth Powers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"KenPowers","email":"mail@kenpowers.net"}],"time":{"modified":"2012-05-18T18:33:40.020Z","created":"2012-05-18T18:33:39.527Z","1.1.0a":"2012-05-18T18:33:40.020Z"},"author":{"name":"Kenneth Powers","email":"mail@kenpowers.net"},"_attachments":{"basejs-1.1.0a.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mVv2AfiNd19kJ/5lnxmaWQ==","length":3977,"stub":true}}}},
{"id":"baseline","key":"baseline","value":{"rev":"3-dcd03cb0b154447e003cb8aa30cc39b7"},"doc":{"_id":"baseline","_rev":"3-dcd03cb0b154447e003cb8aa30cc39b7","name":"baseline","description":"A simple, drag and drop 12px baseline grid plug-in for designing in the browser","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Brian Hurlow","email":"bhurlow@gmail.com","url":"brianhurlow.com"},"name":"baseline","description":"A simple, drag and drop 12px baseline grid plug-in for designing in the browser","version":"0.0.1","homepage":"bhurlow.github.com/baseline","repository":{"type":"git","url":"git://github.com/bhurlow/baseline.git"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bhurlow","email":"bhurlow@gmail.com"},"_id":"baseline@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"4ee290ef44d577417eaf3efce0b0a4b2583716d4","tarball":"http://registry.npmjs.org/baseline/-/baseline-0.0.1.tgz"},"maintainers":[{"name":"bhurlow","email":"bhurlow@gmail.com"}]}},"readme":"##Ever design a great looking PSD and find that once it travels through development that your carefully-crafted baseline grid is all mangled/non-existent?\n\n\nThis is a really simple plug to help designers/developers stay true to a baseline grid / vertical flow\n\n##Usage\n\nwith git:\n\n```bash\n$ git clone git@github.com:bhurlow/baseline.git\n<script src=\"src/baseline-min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n","maintainers":[{"name":"bhurlow","email":"bhurlow@gmail.com"}],"time":{"modified":"2012-05-21T16:46:25.990Z","created":"2012-05-21T16:46:24.713Z","0.0.1":"2012-05-21T16:46:25.990Z"},"author":{"name":"Brian Hurlow","email":"bhurlow@gmail.com","url":"brianhurlow.com"},"repository":{"type":"git","url":"git://github.com/bhurlow/baseline.git"},"_attachments":{"baseline-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-U6DSSHygIeiMz87MSJcw8g==","length":2754,"stub":true}}}},
{"id":"basement","key":"basement","value":{"rev":"11-437e92e6d137a7d212a167bce38333c5"},"doc":{"_id":"basement","_rev":"11-437e92e6d137a7d212a167bce38333c5","name":"basement","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"author":{"name":"Petr Janda","url":"petrjanda@me.com"},"name":"basement","version":"0.1.0","repository":{"url":"https://github.com/petrjanda/basement"},"engines":{"node":"~0.6.2"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"basement@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d17f72974d2f24d0f1d0626e9e07c3cd4a6fbf18","tarball":"http://registry.npmjs.org/basement/-/basement-0.1.0.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}],"directories":{}},"0.1.1":{"author":{"name":"Petr Janda","url":"petrjanda@me.com"},"name":"basement","version":"0.1.1","repository":{"url":"https://github.com/petrjanda/basement"},"engines":{"node":"~0.6.2"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"basement@0.1.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d181a5fcfc2b4827dccdc7815922091887781153","tarball":"http://registry.npmjs.org/basement/-/basement-0.1.1.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}],"directories":{}},"0.1.2":{"author":{"name":"Petr Janda","url":"petrjanda@me.com"},"name":"basement","version":"0.1.2","repository":{"url":"https://github.com/petrjanda/basement"},"engines":{"node":"~0.6.2"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"basement@0.1.2","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"ea5c0618e3a8af5ca8ba5ca7912acfb333dcf95b","tarball":"http://registry.npmjs.org/basement/-/basement-0.1.2.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}],"directories":{}}},"readme":null,"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}],"time":{"modified":"2012-02-05T19:54:21.199Z","created":"2012-02-03T00:32:11.424Z","0.1.0":"2012-02-03T00:32:13.392Z","0.1.1":"2012-02-03T00:43:02.124Z","0.1.2":"2012-02-03T01:14:04.618Z","0.1.3":"2012-02-03T16:46:05.211Z"},"author":{"name":"Petr Janda","url":"petrjanda@me.com"},"repository":{"url":"https://github.com/petrjanda/basement"},"_attachments":{"basement-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-v1rsRiDxtT9pxZGM4ZAsFQ==","length":10240,"stub":true},"basement-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qT8oAPv5OCDeyjzVC+ck8w==","length":10240,"stub":true},"basement-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5B7Vn3tAhWYeLvNbjuw8Pg==","length":10240,"stub":true}}}},
{"id":"bases","key":"bases","value":{"rev":"3-304ccefafd702ed5df0486488261c799"},"doc":{"_id":"bases","_rev":"3-304ccefafd702ed5df0486488261c799","name":"bases","description":"Utility for converting numbers to different bases/alphabets.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bases","version":"0.1.0","description":"Utility for converting numbers to different bases/alphabets.","author":{"name":"Aseem Kishore","email":"aseem.kishore@gmail.com"},"homepage":"https://github.com/aseemk/bases.js","keywords":["alphabet","base","base-36","base-58","base-62"],"repository":{"type":"git","url":"git://github.com/aseemk/bases.js.git"},"main":"bases.js","dependencies":{},"engines":{"node":"*"},"scripts":{"test":"node test"},"_npmUser":{"name":"aseemk","email":"aseem.kishore@gmail.com"},"_id":"bases@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"e068bae86bd526eae449e647aedfa34af8a4a741","tarball":"http://registry.npmjs.org/bases/-/bases-0.1.0.tgz"},"maintainers":[{"name":"aseemk","email":"aseem.kishore@gmail.com"}]}},"readme":"# bases.js\n\nUtility for converting numbers to different bases/alphabets. Common bases have\nconvenience aliases (see below), but arbitrary/custom alphabets can be used.\n\n\nE.g. base-2 uses an alphabet of `01`, base-16 `0123456789abcdef` (notice the\nletters are lowercase), base-36 continues to `z`, base-62 adds the uppercase\nletters\n\n## Installation\n\n```\nnpm install bases\n```\n\n## Usage\n\n```js\nvar bases = require('./bases');\n\nbases.toBase16(200);                // => 'c8'\nbases.toBase62(99999);              // => 'q0T'\nbases.toAlphabet(300, 'aAbBcC');    // => 'Abba'\n```\n\n## API\n\n- `toAlphabet(num, alphabet)`: returns a string representation of the given\n  number for the given alphabet, where the alphabet is an arbitrary string of\n  characters. (See known alphabets below for examples.)\n\n- `toBase(num, base)`: convenience helper for known bases (see below).\n\n- `toBaseX(num)`: convenience helpers for known bases (see below), e.g.\n  `toBase62(num)`.\n\n## Known Bases/Alphabets\n\n- Numbers: **base-2** (`01`) through **base-10** (`0123456789`).\n\n- Letters: **base-26** (`abcdefghijklmnopqrstuvwxyz`, notice lowercase only)\n  and **base-52** (adds uppercase, i.e. `abc...xyzABC...XYZ`).\n\n- Numbers and letters: base-11 (base-10 + `a`) through **base-16**\n  (base-10 + `abcdef`), **base-36** (base-10 + base-26) and **base-62**\n  (base-10 + base-52).\n\n- Human-friendly: **base-32** as specified by\n  [Douglas Crockford](http://www.crockford.com/wrmg/base32.html) (base-10 +\n  uppercase base-26 - `IOLU`) and **base-58** as specified\n  by [Flickr](http://www.flickr.com/groups/api/discuss/72157616713786392/)\n  (base-62 - `0lIO`).\n\n- **Base-64** <del>[as standardized](http://en.wikipedia.org/wiki/Base64)</del>\n  (`ABC...XYZabc...xyz012...789+/`). Besides there being many different\n  standards, padding isn't currently added and line lengths aren't tracked.\n  Not recommended for use with APIs that expect formal base-64 strings!\n  \n## License\n\n[MIT license](http://aseemk.mit-license.org/). (c) 2012 Aseem Kishore.\n\n","maintainers":[{"name":"aseemk","email":"aseem.kishore@gmail.com"}],"time":{"modified":"2012-07-16T20:35:50.218Z","created":"2012-07-16T20:35:48.904Z","0.1.0":"2012-07-16T20:35:50.218Z"},"author":{"name":"Aseem Kishore","email":"aseem.kishore@gmail.com"},"repository":{"type":"git","url":"git://github.com/aseemk/bases.js.git"},"_attachments":{"bases-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ksvLeKE6szOarqN2opJY4g==","length":3524,"stub":true}}}},
{"id":"baseview","key":"baseview","value":{"rev":"4-c5965abca390cea15084f5eaa6150170"},"doc":{"_id":"baseview","_rev":"4-c5965abca390cea15084f5eaa6150170","name":"baseview","description":"minimalistic couchbase view client for node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"baseview","description":"minimalistic couchbase view client for node.js","homepage":"http://about.me/PatrickHeneise","repository":{"type":"git","url":"git://github.com/PatrickHeneise/baseview.git"},"version":"0.0.1","author":{"name":"Patrick Heneise","email":"@PatrickHeneise"},"contributors":[{"name":"Nuno Job","email":"nunojobpinto@gmail.com","url":"http://nunojob.com"}],"keywords":["couchbase","request","json","nosql","micro","baseview","database"],"dependencies":{"request":"2.9.x","errs":"*"},"main":"./baseview.js","engines":{"node":">=0.3.6"},"readme":"# baseview\n\n`baseview` is a minimalistic CouchBase client for node.js based on the minimalistic CouchDB driver [nano][1].\n\nCouchBase provides view data as JSON, which can be accessed and streamed with this client. To store and retrieve single documents/key-value pairs, the [memcached][2]-library is required.\n\n# usage\n``` js\n  baseview = require('baseview')('http://127.0.0.1:8092')\n\n  ...\n\n  baseview.view('design_doc', 'view_name', function(error, data) {\n    console.log(error, data);\n  });\n```\n\n## example with socket.io\n````js\n  io.sockets.on('connection', function (socket) {\n    baseview.view('feed', 'images', function(error, data) {\n      socket.emit('image_feed', data.rows);\n    });\n  });\n````\n\n\n# contribute\n\neveryone is welcome to contribute. patches, tests, bugfixes, new features\n\n1. create an [issue][3] on github so the community can comment on your idea\n2. fork `baseview` in github\n3. create a new branch `git checkout -b my_branch`\n4. create tests for the changes you made\n5. make sure you pass both existing and newly inserted tests\n6. commit your changes\n7. push to your branch `git push origin my_branch`\n8. create an pull request\n\n# meta\n\nproudly presented by Patrick Heneise, Barcelona.\n\n[1]: https://github.com/dscape/nano\n[2]: https://github.com/elbart/node-memcache\n[3]: http://github.com/PatrickHeneise/baseview/issues","_id":"baseview@0.0.1","dist":{"shasum":"c4600d6665175e78d9c6cc3859ff7cece5f0b217","tarball":"http://registry.npmjs.org/baseview/-/baseview-0.0.1.tgz"},"maintainers":[{"name":"patrickheneise","email":"patrickheneise@gmail.com"}]}},"readme":"# baseview\n\n`baseview` is a minimalistic CouchBase client for node.js based on the minimalistic CouchDB driver [nano][1].\n\nCouchBase provides view data as JSON, which can be accessed and streamed with this client. To store and retrieve single documents/key-value pairs, the [memcached][2]-library is required.\n\n# usage\n``` js\n  baseview = require('baseview')('http://127.0.0.1:8092')\n\n  ...\n\n  baseview.view('design_doc', 'view_name', function(error, data) {\n    console.log(error, data);\n  });\n```\n\n## example with socket.io\n````js\n  io.sockets.on('connection', function (socket) {\n    baseview.view('feed', 'images', function(error, data) {\n      socket.emit('image_feed', data.rows);\n    });\n  });\n````\n\n\n# contribute\n\neveryone is welcome to contribute. patches, tests, bugfixes, new features\n\n1. create an [issue][3] on github so the community can comment on your idea\n2. fork `baseview` in github\n3. create a new branch `git checkout -b my_branch`\n4. create tests for the changes you made\n5. make sure you pass both existing and newly inserted tests\n6. commit your changes\n7. push to your branch `git push origin my_branch`\n8. create an pull request\n\n# meta\n\nproudly presented by Patrick Heneise, Barcelona.\n\n[1]: https://github.com/dscape/nano\n[2]: https://github.com/elbart/node-memcache\n[3]: http://github.com/PatrickHeneise/baseview/issues","maintainers":[{"name":"patrickheneise","email":"patrickheneise@gmail.com"}],"time":{"modified":"2012-08-02T13:43:25.315Z","created":"2012-08-02T11:07:36.462Z","0.0.1":"2012-08-02T11:07:38.085Z"},"author":{"name":"Patrick Heneise","email":"@PatrickHeneise"},"repository":{"type":"git","url":"git://github.com/PatrickHeneise/baseview.git"},"users":{"fgribreau":true},"_attachments":{"baseview-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KuRwYQhDB1JQJlrbZAZvtw==","length":3700,"stub":true}}}},
{"id":"basex","key":"basex","value":{"rev":"15-ed87dcbdd7b504da7186ec71a7af43eb"},"doc":{"_id":"basex","_rev":"15-ed87dcbdd7b504da7186ec71a7af43eb","name":"basex","description":"A BaseX (XML database) client library","dist-tags":{"latest":"0.5.1"},"versions":{"0.2.0":{"name":"basex","version":"0.2.0","description":"BaseX client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"node ./test.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"engines":{"node":"0.4 "},"_npmJsonOpts":{"file":"/home/andy/.npm/basex/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basex@0.2.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8c9fdef720524d774f64b975b6980a80ac4e1979","tarball":"http://registry.npmjs.org/basex/-/basex-0.2.0.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]},"0.3.0":{"name":"basex","version":"0.3.0","description":"A BaseX (XML database) client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"node ./test.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"engines":{"node":"0.4 "},"_npmJsonOpts":{"file":"/home/andy/.npm/basex/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basex@0.3.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0a9b5cecbdcbcf98bdcaf52669253b867baf3bfc","tarball":"http://registry.npmjs.org/basex/-/basex-0.3.0.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]},"0.3.1":{"name":"basex","version":"0.3.1","description":"A BaseX (XML database) client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"node ./test.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"engines":{"node":"0.4 "},"_npmJsonOpts":{"file":"/home/andy/.npm/basex/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basex@0.3.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ecda565397bd6519f7670d0de1f9fa523bf76cd5","tarball":"http://registry.npmjs.org/basex/-/basex-0.3.1.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]},"0.4.0":{"name":"basex","version":"0.4.0","description":"A BaseX (XML database) client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"node ./test.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"engines":{"node":"0.4 "},"_npmJsonOpts":{"file":"/home/andy/.npm/basex/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basex@0.4.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d686fcd7b98deb5657e967349f817634e7e5b8b8","tarball":"http://registry.npmjs.org/basex/-/basex-0.4.0.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]},"0.4.1":{"name":"basex","version":"0.4.1","description":"A BaseX (XML database) client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"node test/test.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"engines":{"node":">= 0.4 "},"_npmUser":{"name":"apb2006","email":"bunce.andy@gmail.com"},"_id":"basex@0.4.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"063c733d2e53745abab0268c49740bf26b058568","tarball":"http://registry.npmjs.org/basex/-/basex-0.4.1.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]},"0.5.0":{"name":"basex","version":"0.5.0","description":"A BaseX (XML database) client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"vows tests/*.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"dependencies":{},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">= 0.6 "},"license":"BSD","_npmUser":{"name":"apb2006","email":"bunce.andy@gmail.com"},"_id":"basex@0.5.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"602d7f95351e382b0a69876eeb705f6a409262fa","tarball":"http://registry.npmjs.org/basex/-/basex-0.5.0.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]},"0.5.1":{"name":"basex","version":"0.5.1","description":"A BaseX (XML database) client library","keywords":["xml","xquery","xslt","search","database"],"author":{"name":"Andy Bunce"},"contributors":[{"name":"Andy Bunce"}],"main":"./index.js","scripts":{"test":"vows tests/*.js"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"dependencies":{},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">= 0.6 "},"license":"BSD","_npmUser":{"name":"apb2006","email":"bunce.andy@gmail.com"},"_id":"basex@0.5.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"169da47c2cad7f9d57f626963dcddd0362967fc2","tarball":"http://registry.npmjs.org/basex/-/basex-0.5.1.tgz"},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}]}},"maintainers":[{"name":"apb2006","email":"bunce.andy@gmail.com"}],"time":{"modified":"2012-07-19T22:19:38.870Z","created":"2011-10-02T21:44:34.699Z","0.2.0":"2011-10-02T21:44:36.714Z","0.3.0":"2011-10-05T22:26:13.146Z","0.3.1":"2011-10-06T22:57:25.064Z","0.4.0":"2011-10-08T23:17:22.054Z","0.4.1":"2011-11-10T23:03:26.557Z","0.5.0":"2012-07-19T21:04:32.368Z","0.5.1":"2012-07-19T22:19:38.870Z"},"author":{"name":"Andy Bunce"},"repository":{"type":"git","url":"git://github.com/apb2006/basex-node.git"},"_attachments":{"basex-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-wzbjGIU7jCNjN3sNnXcLGA==","length":12556,"stub":true},"basex-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-RYZMS8H9LbCk8A08yRgGEA==","length":12553,"stub":true},"basex-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-vru71SfT28QMtO58gCYfaA==","length":12258,"stub":true},"basex-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-DaZyDfe5QPIUTwCSx50aeA==","length":11840,"stub":true},"basex-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-HZeLUVWpsehz+j8CjfSdQQ==","length":11260,"stub":true},"basex-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pptq6LCMS5RnoBUucWPOyQ==","length":11290,"stub":true},"basex-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CWOttq479F+YbC/oRDL/YQ==","length":10594,"stub":true}}}},
{"id":"bash","key":"bash","value":{"rev":"3-86a1c61babfa47da0ebc14c2f4e59a6a"},"doc":{"_id":"bash","_rev":"3-86a1c61babfa47da0ebc14c2f4e59a6a","name":"bash","description":"Utilities for using bash from node.js.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"bash","description":"Utilities for using bash from node.js.","version":"0.0.1","homepage":"https://github.com/felixge/node-bash","repository":{"type":"git","url":"git://github.com/felixge/node-bash.git"},"main":"./index","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/felix/.npm/bash/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bash@0.0.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10-pre","_defaultsLoaded":true,"dist":{"shasum":"9ee0e7a752bc5eef168bc48719556a74548aae0c","tarball":"http://registry.npmjs.org/bash/-/bash-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]}},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"time":{"modified":"2011-08-22T08:44:26.399Z","created":"2011-08-22T08:44:23.343Z","0.0.1":"2011-08-22T08:44:26.399Z"},"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"repository":{"type":"git","url":"git://github.com/felixge/node-bash.git"},"_attachments":{"bash-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UjGrOCZP9kk5XETpI/QWdw==","length":14132,"stub":true}}}},
{"id":"bashcoin","key":"bashcoin","value":{"rev":"23-4b2c1e10d5844be7828cbb90a5a54790"},"doc":{"_id":"bashcoin","_rev":"23-4b2c1e10d5844be7828cbb90a5a54790","name":"bashcoin","description":"Bitcoin market stats from the command line.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.2":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.2","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4292b952e1edeccd10066911578b2c0ecdd579bc","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.2.tgz"},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.3":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.3","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8f28a82c16b33832d23336fa631057ce58c8ef72","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.3.tgz"},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.4":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.4","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"06103b8d94e618e50e0a0a7b7b5e3bf6df4180a4","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.4.tgz"},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.5":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.5","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1c03975637fed7c4fee079f1e09684fca964cc85","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.5.tgz"},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.6":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.6","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"7c5443b8cf75789beab4b742775e7b53dfdcf879","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.6.tgz"},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.7":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.7","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"515e4603f6ffb78489c32cd41a0e6382eef5f336","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.7.tgz"},"readme":"# bashcoin\n\nRealtime Bitcoin market stats from the command line.\n\nTrade data from Mt. Gox.\n\nRequires node.js and npm.\n\n### Installation:\n\n```\n$ npm install -g bashcoin\n```\n\n### Default Usage:\n\n```\n$ bashcoin\n\n buy    3.6815\n sell   3.71998\n high   3.8975\n low    3.4\n\n```\n\n### Options:\n\n```\nUsage: bashcoin.js [options]\n\nOptions:\n\n  -h, --help            output usage information\n  -V, --version         output the version number\n  -c, --cont            run continuously, query every 30 seconds\n  -b, --buy             output buy\n  -s, --sell            output sell\n  -S, --spread          output spread (rounded)\n  -H, --high            output high\n  -L, --low             output low\n  -a, --avg, --average  output average\n  -v, --vol             output volume\n  -p, --vwap            output volume-weighted average price\n  -l, --last            output last\n\n```\n\n","maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.8":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.8","preferGlobal":"true","dependencies":{"commander":">= 0.2.0"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2f76efe067d8fec1b20065048d7b1b7c1e68d766","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.8.tgz"},"readme":"# bashcoin\n\nRealtime Bitcoin market stats from the command line.\n\nTrade data from Mt. Gox.\n\nRequires node.js and npm.\n\n### Installation:\n\n```\n$ npm install -g bashcoin\n```\n\n### Default Usage:\n\n```\n$ bashcoin\n\n buy    3.6815\n sell   3.71998\n high   3.8975\n low    3.4\n\n```\n\n### Options:\n\n```\nUsage: bashcoin.js [options]\n\nOptions:\n\n  -h, --help            output usage information\n  -V, --version         output the version number\n  -c, --cont            run continuously, query every 30 seconds\n  -b, --buy             output buy\n  -s, --sell            output sell\n  -S, --spread          output spread (rounded)\n  -H, --high            output high\n  -L, --low             output low\n  -a, --avg, --average  output average\n  -v, --vol             output volume\n  -p, --vwap            output volume-weighted average price\n  -l, --last            output last\n  -A, --all             output all available stats\n\n```\n\n","maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"directories":{}},"0.0.9":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"git://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin"],"version":"0.0.9","preferGlobal":"true","dependencies":{"commander":"0.6.x"},"main":"./bashcoin.js","_npmUser":{"name":"dmotz","email":"motzdc@gmail.com"},"_id":"bashcoin@0.0.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"6ed38aa001ffd11839522b8878cd08b4a559d103","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.0.9.tgz"},"readme":"# bashcoin\n\nRealtime Bitcoin market stats from the command line.\n\nTrade data from Mt. Gox.\n\nRequires node.js and npm.\n\n### Installation:\n\n```\n$ npm install -g bashcoin\n```\n\n### Default Usage:\n\n```\n$ bashcoin\n\n buy    5.13502\n sell   5.15\n high   5.1725\n low    5.1\n\n```\n\n### Options:\n\n```\nUsage: bashcoin [options]\n\nOptions:\n\n  -h, --help            output usage information\n  -V, --version         output the version number\n  -c, --cont            run continuously, query every 30 seconds\n  -b, --buy             output buy\n  -s, --sell            output sell\n  -S, --spread          output spread (rounded)\n  -H, --high            output high\n  -L, --low             output low\n  -a, --avg             output average\n  -v, --vol             output volume\n  -p, --vwap            output volume-weighted average price\n  -l, --last            output last\n  -A, --all             output all available stats\n\n```\n\n","maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}]},"0.1.0":{"name":"bashcoin","homepage":"http://github.com/dmotz/bashcoin","author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"bin":{"bashcoin":"./bashcoin.js"},"repository":{"type":"git","url":"http://github.com/dmotz/bashcoin.git"},"description":"Bitcoin market stats from the command line.","keywords":["bitcoin","cli","terminal","trading"],"version":"0.1.0","preferGlobal":"true","dependencies":{"commander":"0.6.x"},"main":"./bashcoin.js","readme":"# bashcoin\n\nRealtime Bitcoin market stats from the command line.\n\nTrade data from Mt. Gox.\n\nRequires node.js and npm.\n\n### Installation:\n\n```\n$ npm install -g bashcoin\n```\n\n### Default Usage:\n\n```\n$ bashcoin\n\n buy    5.13502\n sell   5.15\n high   5.1725\n low    5.1\n\n```\n\n### Options:\n\n```\n  Usage: bashcoin.js [options]\n  \n  Options:\n  \n    -h, --help                output usage information\n    -V, --version             output the version number\n    -c, --cont                run continuously, query every 30 seconds\n    -b, --buy                 output buy\n    -s, --sell                output sell\n    -S, --spread              output spread (rounded)\n    -H, --high                output high\n    -L, --low                 output low\n    -a, --avg                 output average\n    -v, --vol                 output volume\n    -p, --vwap                output volume-weighted average price\n    -l, --last                output last\n    -A, --all                 output all available stats\n    -i, --interval [seconds]  custom interval for continuous output\n\n```\n\nRun bashcoin with `-c` to see a continuous output with delta percentages:\n\n```\n buy    7.80999 +0%\n sell   7.81 +0.11%\n high   7.9 +0%\n low    7.1 -0.44%\n\n```\n\nTry `bashcoin -Ac` to see all available stats outputted every 30 seconds:\n\n```\n buy    7.47744 +0.366%\n sell   7.54687 -0.70%\n high   7.9 +0%\n low    7.1 +0%\n avg    7.570290517 +0.001%\n vol    95907 +0.016%\n vwap   7.510398611 +0.000%\n last   7.54687 +1.283%\n spread 0.0694 -116.1%\n\n```\n\nYou can define a custom output interval in seconds with `-i`.\n\n","_id":"bashcoin@0.1.0","dist":{"shasum":"eb2f710ad76028f51ef8b814e41fcf09141615d4","tarball":"http://registry.npmjs.org/bashcoin/-/bashcoin-0.1.0.tgz"},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}]}},"maintainers":[{"name":"dmotz","email":"motzdc@gmail.com"}],"time":{"modified":"2012-07-13T19:02:25.992Z","created":"2011-10-17T03:01:00.732Z","0.0.2":"2011-10-17T03:01:01.566Z","0.0.3":"2011-10-17T07:46:36.544Z","0.0.4":"2011-10-20T20:16:53.982Z","0.0.5":"2011-10-25T00:29:31.811Z","0.0.6":"2011-11-20T23:43:07.202Z","0.0.7":"2012-01-09T00:19:38.862Z","0.0.8":"2012-01-09T01:30:02.905Z","0.0.9":"2012-05-30T20:46:09.728Z","0.1.0":"2012-07-13T19:02:25.992Z"},"author":{"name":"Dan Motzenbecker","url":"http://github.com/dmotz"},"repository":{"type":"git","url":"http://github.com/dmotz/bashcoin.git"},"_attachments":{"bashcoin-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Mn/V+yzNtw7wby1Zn8l/3w==","length":2165,"stub":true},"bashcoin-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-mmClsBe7ZLxVt/8cMmstvQ==","length":1666,"stub":true},"bashcoin-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Q1qbS8H1wjDhH1BbJi+EUQ==","length":1697,"stub":true},"bashcoin-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Ko1h4uzIcK3VSXoxUBbeKQ==","length":1642,"stub":true},"bashcoin-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dIIcQ0RHTYcSbD5hKrk2HA==","length":10240,"stub":true},"bashcoin-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lEcNkPT48uBj2AimPhvy6w==","length":10240,"stub":true},"bashcoin-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WfMWFHw7BZIGOKH8HTwmpQ==","length":10240,"stub":true},"bashcoin-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XwZEtx/ir/RNKD7U720+ug==","length":10240,"stub":true},"bashcoin-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0M3qSauhPVl1GajKKJh8Hg==","length":10240,"stub":true}}}},
{"id":"basic-auth","key":"basic-auth","value":{"rev":"3-472a87af27264ae81bd4394d70792e55"},"doc":{"_id":"basic-auth","_rev":"3-472a87af27264ae81bd4394d70792e55","name":"basic-auth","description":"http basic auth","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com"},"name":"basic-auth","description":"http basic auth","version":"0.0.1","repository":{"type":"git","url":"git://github.com/dawnerd/node-basic-auth.git"},"main":"auth.js","dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/dawnerd/.npm/basic-auth/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basic-auth@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"da9fb3aecc0baf349d25cf0392edd6d24b05d439","tarball":"http://registry.npmjs.org/basic-auth/-/basic-auth-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"dawnerd","email":"troy@somanyscientists.com"}]}},"maintainers":[{"name":"dawnerd","email":"troy@somanyscientists.com"}],"time":{"modified":"2011-08-30T22:31:13.865Z","created":"2011-08-30T22:31:12.653Z","0.0.1":"2011-08-30T22:31:13.865Z"},"author":{"name":"Troy Whiteley","email":"troy@somanyscientists.com"},"repository":{"type":"git","url":"git://github.com/dawnerd/node-basic-auth.git"},"_attachments":{"basic-auth-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Zps3ShcUrGjAoYziRzfuMA==","length":1576,"stub":true}}}},
{"id":"basic-auth-parser","key":"basic-auth-parser","value":{"rev":"6-a9cc343e1922f60648e7819c7b507b4f"},"doc":{"_id":"basic-auth-parser","_rev":"6-a9cc343e1922f60648e7819c7b507b4f","name":"basic-auth-parser","description":"Parse Basic Auth `Authorization` HTTP headers","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"name":"basic-auth-parser","description":"Parse Basic Auth `Authorization` HTTP headers","author":{"name":"Maciej Małecki","email":"me@mmalecki.com"},"version":"0.0.0","main":"./lib/basic-auth-parser.js","devDependencies":{"vows":"0.6.x"},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"mmalecki","email":"me@mmalecki.com"},"_id":"basic-auth-parser@0.0.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"cb6bedb0e19bc9f0e519a6ea1cb629c910e751b8","tarball":"http://registry.npmjs.org/basic-auth-parser/-/basic-auth-parser-0.0.0.tgz"},"maintainers":[{"name":"mmalecki","email":"me@mmalecki.com"}]},"0.0.1":{"name":"basic-auth-parser","description":"Parse Basic Auth `Authorization` HTTP headers","author":{"name":"Maciej Małecki","email":"me@mmalecki.com"},"version":"0.0.1","main":"./lib/basic-auth-parser.js","devDependencies":{"vows":"0.6.x"},"scripts":{"test":"vows --spec"},"readme":"# basic-auth-parser [![Build Status](https://secure.travis-ci.org/mmalecki/basic-auth-parser.png)](http://travis-ci.org/mmalecki/basic-auth-parser)\n`basic-auth-parser` parses Basic Auth `Authorization` HTTP headers.\n\n## Installation\n\n    npm install basic-auth-parser\n\n## Usage\n```js\nvar basicAuthParser = require('./');\nconsole.dir(basicAuthParser('Basic YWRtaW46cGFzc3dvcmQ='));\n```\n\nOutput:\n```\n{ scheme: 'Basic', username: 'admin', password: 'password' }\n```\n","_id":"basic-auth-parser@0.0.1","dist":{"shasum":"20b98aa9a383bac8b02ad9139018164277c99f87","tarball":"http://registry.npmjs.org/basic-auth-parser/-/basic-auth-parser-0.0.1.tgz"},"maintainers":[{"name":"mmalecki","email":"me@mmalecki.com"}]}},"readme":"# basic-auth-parser [![Build Status](https://secure.travis-ci.org/mmalecki/basic-auth-parser.png)](http://travis-ci.org/mmalecki/basic-auth-parser)\n`basic-auth-parser` parses Basic Auth `Authorization` HTTP headers.\n\n## Installation\n\n    npm install basic-auth-parser\n\n## Usage\n```js\nvar basicAuthParser = require('./');\nconsole.dir(basicAuthParser('Basic YWRtaW46cGFzc3dvcmQ='));\n```\n\nOutput:\n```\n{ scheme: 'Basic', username: 'admin', password: 'password' }\n```\n","maintainers":[{"name":"mmalecki","email":"me@mmalecki.com"}],"time":{"modified":"2012-08-02T13:44:36.020Z","created":"2012-06-05T22:12:36.803Z","0.0.0":"2012-06-05T22:12:38.885Z","0.0.1":"2012-07-23T22:30:43.107Z"},"author":{"name":"Maciej Małecki","email":"me@mmalecki.com"},"users":{"fgribreau":true},"_attachments":{"basic-auth-parser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cEpv/IM9T2/T/GcSxbX1og==","length":1869,"stub":true},"basic-auth-parser-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-55VADQ7xvREgpfMM7z8K5w==","length":1766,"stub":true}}}},
{"id":"basic-logger","key":"basic-logger","value":{"rev":"21-1a64945abbf708ed26590feda374fc9e"},"doc":{"_id":"basic-logger","_rev":"21-1a64945abbf708ed26590feda374fc9e","name":"basic-logger","description":"basic logger supporting error, warning, debug and info messages with timestamp.","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"basic-logger","version":"0.1.0","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"lib/logger","directories":{"lib":"./lib"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o lib src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"0b208b3ac958c22b44f8a84c330149864bb1bb38","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.1.0.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.2.0":{"name":"basic-logger","version":"0.2.0","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"lib/logger","directories":{"lib":"./lib"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o lib src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"49b4657754314e9a63393cc35355126b4e17f450","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.2.0.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.2.1":{"name":"basic-logger","version":"0.2.1","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"lib/logger","directories":{"lib":"./lib"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o lib src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"2e503aa12dc9a01a633914ea8acfdb01b0625e86","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.2.1.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.3.0":{"name":"basic-logger","version":"0.3.0","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"logger.js","directories":{"lib":"./lib"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o . src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.3.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"ebeb7dc50ca3b42f9b2ce88b17b19a72c632003e","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.3.0.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.3.1":{"name":"basic-logger","version":"0.3.1","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"logger.js","licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o . src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.3.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"66ec454788d5200188f293f7bb54b473ce063e97","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.3.1.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.3.2":{"name":"basic-logger","version":"0.3.2","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"logger.js","licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o . src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.3.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"96de952a07c4c140cab7a2cb28fbcc8b4c469348","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.3.2.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.3.3":{"name":"basic-logger","version":"0.3.3","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"logger.js","licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o . src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.3.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"9aef77234d0447be96c6d5ba791f5a452d36e208","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.3.3.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]},"0.4.0":{"name":"basic-logger","version":"0.4.0","description":"basic logger supporting error, warning, debug and info messages with timestamp.","author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"keywords":["basic logger","log","logging","timestamp","log to console"],"homepage":"https://github.com/drd0rk/logger","bugs":{"url":"git://github.com/drd0rk/logger/issues/"},"dependencies":{"pkginfo":"0.2.x","underscore":"1.2.x"},"devDependencies":{"coffee-script":"1.2.x","vows":"0.5.x"},"main":"logger.js","licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"engines":{"node":">= 0.4"},"scripts":{"test":"NODE_ENV=test node_modules/.bin/vows --spec test/*.coffee","watch":"node_modules/.bin/coffee -c -w -o . src"},"_npmUser":{"name":"drd0rk","email":"s.bilharz@web.de"},"_id":"basic-logger@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"16ef09f767eab0b55c18463873f58c52b5fa76be","tarball":"http://registry.npmjs.org/basic-logger/-/basic-logger-0.4.0.tgz"},"maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}]}},"readme":"logger\n======\n\nBasic logger for nodejs supporting error, warning, debug and info messages with timestamp.\nEverything you log is printed to the console.\n\nInstallation\n------------\n\n\tnpm install logger\n\nUsage\n-----\n\n\tvar logger = require('logger');\n\n\tvar customConfig = {\n\t\tshowMillis: true;\n\t\tstringifyJSON: false;\n\t};\n\n\tvar log = new logger(customConfig)\n\n\tlog.info('New Info!');\n\tlog.error('An error occurred');\n\tlog.warn('I am not kidding!');\n\tlog.debug('this code is still alive...');\n\t\nConfig options\n--------------\n\n* `showMillis` - Show the milliseconds in the timestamp\n* `stringifyJSON` - Apply JSON.stringify to the given message. Good to log objects or arrays.\n\nTest\n----\n\nYou'll need `vows`. Then just run `npm test`.\n\nFuture versions\n---------------\n\nI am willing to add support for colored log messages and allow to define a prefix which is prepended to all messages.\n","maintainers":[{"name":"drd0rk","email":"s.bilharz@web.de"}],"time":{"modified":"2012-02-12T01:11:41.628Z","created":"2011-12-21T22:50:39.892Z","0.1.0":"2011-12-21T22:50:42.280Z","0.1.1":"2011-12-22T18:58:47.505Z","0.2.0":"2011-12-22T19:01:06.253Z","0.2.1":"2011-12-28T12:51:47.828Z","0.3.0":"2012-01-22T22:53:01.815Z","0.3.1":"2012-01-22T23:07:28.286Z","0.3.2":"2012-01-22T23:25:35.853Z","0.3.3":"2012-01-23T17:14:48.915Z","0.4.0":"2012-02-12T01:11:41.628Z"},"author":{"name":"Stefan Bilharz","email":"s.bilharz@web.de"},"_attachments":{"basic-logger-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-SSlpH9DC+WTAVLOUUyvf1w==","length":2269,"stub":true},"basic-logger-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-GGmFp8qX6gQ+gjlPdtzcvQ==","length":2220,"stub":true},"basic-logger-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-6rebQ9OP0xHd7Ri2QiLG4g==","length":2089,"stub":true},"basic-logger-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-mBJgsESAeQ9tOzK5q6bjIw==","length":2086,"stub":true},"basic-logger-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-TgxiyqdqK9Ll69biXZJrVw==","length":2037,"stub":true},"basic-logger-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MdUv76ZAJiq37LxktV/dzA==","length":3304,"stub":true},"basic-logger-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hD8QJsbQvOoMDYmOlCWbaQ==","length":3154,"stub":true},"basic-logger-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DbuxGry+Mi5jkaSoLBNiuA==","length":3041,"stub":true}}}},
{"id":"basicFFmpeg","key":"basicFFmpeg","value":{"rev":"15-3e87a41c543bde1e6f7c49d021fda62f"},"doc":{"_id":"basicFFmpeg","_rev":"15-3e87a41c543bde1e6f7c49d021fda62f","name":"basicFFmpeg","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"basicFFmpeg","version":"0.0.1","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.0"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"33f0ed4d55d461466594379751ef78034ca996ee","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.1.tgz"}},"0.0.2":{"name":"basicFFmpeg","version":"0.0.2","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.0"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"98ddd53e2c71c4b4dfcba897d05c98022e1dd165","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.2.tgz"}},"0.0.3":{"name":"basicFFmpeg","version":"0.0.3","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.0"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7e62f9b5887b496051148dbf84930ac3eb5b41f7","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.3.tgz"}},"0.0.4":{"name":"basicFFmpeg","version":"0.0.4","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.0"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.4","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"df18d67f507a8f4605407c4d827c7c03d1548ca8","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.4.tgz"}},"0.0.5":{"name":"basicFFmpeg","version":"0.0.5","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.9"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.5","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.9","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"351b3f437a91995cacbb73e008333b978fba5112","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.5.tgz"}},"0.0.6":{"name":"basicFFmpeg","version":"0.0.6","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.9"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.6","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.10","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1a3dd89c807a0adc0fde1feb4ce6cd163a3537fb","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.6.tgz"},"maintainers":[{"name":"tmedema","email":"tommedema@gmail.com"}]},"0.0.7":{"name":"basicFFmpeg","version":"0.0.7","description":"A basic wrapper for FFMPEG (http://www.ffmpeg.org)","keywords":["ffmpeg"],"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"bugs":{"url":"https://github.com/tommedema/NodeBasicFFmpeg/issues"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"engines":{"node":">=0.4.9"},"main":"./src/basicFFmpeg.js","_id":"basicFFmpeg@0.0.7","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.10","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"adae0a0bcdb6122cada0f84f905c5b05a6f7413c","tarball":"http://registry.npmjs.org/basicFFmpeg/-/basicFFmpeg-0.0.7.tgz"},"maintainers":[{"name":"tmedema","email":"tommedema@gmail.com"}]}},"maintainers":[{"name":"tmedema","email":"tommedema@gmail.com"}],"time":{"modified":"2011-08-14T11:04:34.828Z","created":"2011-07-08T23:36:03.922Z","0.0.1":"2011-07-08T23:36:04.391Z","0.0.2":"2011-07-10T19:42:57.704Z","0.0.3":"2011-07-11T11:11:20.788Z","0.0.4":"2011-07-11T19:08:52.514Z","0.0.5":"2011-07-14T14:48:39.834Z","0.0.6":"2011-08-14T10:56:25.175Z","0.0.7":"2011-08-14T11:04:34.828Z"},"author":{"name":"Tom Medema","email":"tommedema@gmail.com"},"repository":{"type":"git","url":"git@github.com:tommedema/NodeBasicFFmpeg.git"},"_attachments":{"basicFFmpeg-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-/1PgEyC2G80qPRjk437cBw==","length":20202623,"stub":true},"basicFFmpeg-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-dCOJZXqyE71Nv7MQJQQdyQ==","length":20202621,"stub":true},"basicFFmpeg-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-2tyAUNVmVc9QGDFeDliUsg==","length":14123331,"stub":true},"basicFFmpeg-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Jq7zm9KX2sFJlcafQHkkMQ==","length":14123297,"stub":true},"basicFFmpeg-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-PpqwdbpLfRklA86/q5Ne8Q==","length":14123280,"stub":true},"basicFFmpeg-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1Qo9OHZSq446AqfIPH8IBg==","length":6863246,"stub":true},"basicFFmpeg-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iIip2p1TCKCqZHmiZUlQ5Q==","length":10098487,"stub":true}}}},
{"id":"basicauth","key":"basicauth","value":{"rev":"3-15d95a05b6f5e7b6d7261f87c4eb73de"},"doc":{"_id":"basicauth","_rev":"3-15d95a05b6f5e7b6d7261f87c4eb73de","name":"basicauth","description":"http basic auth as simple as I could make it","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"basicauth","version":"0.0.1","description":"http basic auth as simple as I could make it","keywords":["http","basic","authentication"],"author":{"name":"rupa","email":"rupa@lrrr.us"},"homepage":"https://github.com/rupa/node-basicauth","private":false,"main":"./auth","_npmJsonOpts":{"file":"/home/localadm/.npm/basicauth/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basicauth@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a8239b0b8114a1d1b4821613c6c508372ca640ac","tarball":"http://registry.npmjs.org/basicauth/-/basicauth-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"rupa","email":"rupa@lrrr.us"}]}},"maintainers":[{"name":"rupa","email":"rupa@lrrr.us"}],"time":{"modified":"2011-08-26T07:41:19.970Z","created":"2011-08-26T07:41:19.405Z","0.0.1":"2011-08-26T07:41:19.970Z"},"author":{"name":"rupa","email":"rupa@lrrr.us"},"_attachments":{"basicauth-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cIRnqP+inJ56tSoQZ/Lezg==","length":1016,"stub":true}}}},
{"id":"basics","key":"basics","value":{"rev":"3-ff6a9f70652bd7339e8a3d3981fd4beb"},"doc":{"_id":"basics","_rev":"3-ff6a9f70652bd7339e8a3d3981fd4beb","name":"basics","description":"Basics are nice Express defaults","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Marcel Miranda","email":"m@reaktivo.com","url":"http://reaktivo.com"},"name":"basics","description":"Basics are nice Express defaults","version":"0.0.0","repository":{"url":""},"dependencies":{"express":"~2.5.8","express-resource":"0.2.4","jade":"~0.22.1","coffee-script":"~1.3.1","handler":"~0.1.2","request":"~2.9.153","connect-assets":"~2.1.9","mongoose":"~2.5.13","devcon":"*","stylus":"0.24.0","async":"~0.1.18","templates":"~0.1.5","underscore":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"scripts":{"pretest":"cake build","prepublish":"cake build","test":"mocha --compilers coffee:coffee-script --reporter spec --no-colors"},"_npmUser":{"name":"reaktivo","email":"m@reaktivo.com"},"_id":"basics@0.0.0","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9861563f61a62f270b5a6e4a64b6795ffe2648c6","tarball":"http://registry.npmjs.org/basics/-/basics-0.0.0.tgz"},"readme":"","maintainers":[{"name":"reaktivo","email":"m@reaktivo.com"}]}},"readme":"","maintainers":[{"name":"reaktivo","email":"m@reaktivo.com"}],"time":{"modified":"2012-05-01T00:58:22.584Z","created":"2012-05-01T00:58:21.044Z","0.0.0":"2012-05-01T00:58:22.584Z"},"author":{"name":"Marcel Miranda","email":"m@reaktivo.com","url":"http://reaktivo.com"},"repository":{"url":""},"_attachments":{"basics-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-on6kkLw0i91TRykoH0+yLw==","length":2066,"stub":true}}}},
{"id":"basictemplate","key":"basictemplate","value":{"rev":"19-6241e5b617f5d888f593e530aab1d1c5"},"doc":{"_id":"basictemplate","_rev":"19-6241e5b617f5d888f593e530aab1d1c5","name":"basictemplate","description":"A simple template engine","dist-tags":{"latest":"0.1.8"},"versions":{"0.1.0":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.0","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"79d4b43e9b1de9cf35c73d0e2e0874968257f527","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.0.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.1":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.1","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"eb42640bc59e01c25c1a46522a05088c72060897","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.1.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.2":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.2","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"373090f72d601a6ddcea5649dbb29ae840460456","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.2.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.3":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.3","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"912af8a2d71661706af23d25a6471accd37cfd82","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.3.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.4":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.4","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9c115e319e74586a0e52d716880db610560f422b","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.4.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.5":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.5","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f95915a17f5f22116b162b3caa347c4fec59c4b8","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.5.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.6":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.6","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"bd7833fb45a82eeaeff678d0e1d714ac825f123b","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.6.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.7":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.7","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"da99aa34c5c4c80c9b3b6626f7f388dcbf5d186e","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.7.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]},"0.1.8":{"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"name":"basictemplate","description":"A simple template engine","version":"0.1.8","repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"main":"basictemplate.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"keverw","email":"keverw92@gmail.com"},"_id":"basictemplate@0.1.8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fcf27ca7e98290133d3b8c3c1f3da2b826a1e235","tarball":"http://registry.npmjs.org/basictemplate/-/basictemplate-0.1.8.tgz"},"maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}]}},"readme":"#Basic Template v0.1#\n\nA basic template engine.\n\nA main view and data. Optionally a subview. uses `{variable}` styles.\n\n`render(view, data, subview)`\n\n\nview is the path the view. data is a javascript object to pass to your view(and subview if you include one). subview is the path to that view.\n\neg: \n\n\n```\nbasictemplate.render('./view.bt', {hello: 'World'}, function(err, html)\n{\n    console.log(err);\n    console.log(html);\n});\n```\n\nIf you include a subview.\n\n```\nbasictemplate.render_sub('./view.bt', './subview.bt', {hello: 'World'}, function(err, html)\n{\n    console.log(err);\n    console.log(html);\n});\n```\n\nTo display it within the view, use `{{subview}}`\n\n`{variable}` = escaped to HTML entities\n\n`{{variable}}` = unescaped\n\n\n##error:##\n\nerror is an object. \n\n`type`: the type of error. If it's a file system error, type will be `file`, and then another variable called `file` will contain the filesystem error object, if you want to analyze it. ","maintainers":[{"name":"keverw","email":"keverw92@gmail.com"}],"time":{"modified":"2012-05-20T04:39:20.934Z","created":"2012-05-18T08:00:13.706Z","0.1.0":"2012-05-18T08:00:14.306Z","0.1.1":"2012-05-18T08:11:23.739Z","0.1.2":"2012-05-18T08:53:21.864Z","0.1.3":"2012-05-18T18:33:59.314Z","0.1.4":"2012-05-18T19:06:47.388Z","0.1.5":"2012-05-19T19:44:20.496Z","0.1.6":"2012-05-19T21:04:33.599Z","0.1.7":"2012-05-20T04:05:06.311Z","0.1.8":"2012-05-20T04:39:20.934Z"},"author":{"name":"Kevin Whitman","url":"https://github.com/keverw"},"repository":{"type":"git","url":"git://github.com/keverw/basictemplate.git"},"_attachments":{"basictemplate-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-avSNFRsHhe8QymQKV5s2sg==","length":9734,"stub":true},"basictemplate-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-jUeY1I+Oo5KHb9ygbGKCjw==","length":9662,"stub":true},"basictemplate-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-X/W+LZWpTOD5FO60Hc5Dbg==","length":9604,"stub":true},"basictemplate-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ZucnXtGg1RaR5VKqiPmK1w==","length":9608,"stub":true},"basictemplate-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-iziFss9eMhdHjk+ovCCfOw==","length":9057,"stub":true},"basictemplate-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RrqadjMKQnQLFqmQJnwl6Q==","length":8916,"stub":true},"basictemplate-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QkuyPHrGmufzo3otMKO04w==","length":8642,"stub":true},"basictemplate-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-duf+WhPTwjgzFTLY0hYmDw==","length":8595,"stub":true},"basictemplate-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pOJHncTgSlRJK0h8SBX0rA==","length":7975,"stub":true}}}},
{"id":"basil-cookie","key":"basil-cookie","value":{"rev":"11-fff96b263f31b9d017e3cf59bf6fb23f"},"doc":{"_id":"basil-cookie","_rev":"11-fff96b263f31b9d017e3cf59bf6fb23f","name":"basil-cookie","description":"Cookie library for node with connect middleware","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"basil-cookie","version":"0.0.1","description":"Cookie library for node with connect middleware","keywords":["cookie","cookies","connect"],"author":{"name":"Michael Phan-Ba","email":"michael@mikepb.com"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/mikepb/basil-cookie.git"},"devDependencies":{"vows":"~0.5.9"},"engines":{"node":"~0.4.11"},"_npmJsonOpts":{"file":"/Users/mikepb/.npm/basil-cookie/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basil-cookie@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"01a0945618db1fb5a5098a12c2b852884577d1d8","tarball":"http://registry.npmjs.org/basil-cookie/-/basil-cookie-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}]},"0.1.0":{"name":"basil-cookie","version":"0.1.0","description":"Cookie library for node with connect middleware","keywords":["cookie","cookies","connect"],"author":{"name":"Michael Phan-Ba","email":"michael@mikepb.com"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/mikepb/basil-cookie.git"},"devDependencies":{"vows":"~0.5.9"},"engines":{"node":"~0.4.11"},"_npmJsonOpts":{"file":"/Users/mikepb/.npm/basil-cookie/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basil-cookie@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6beb9d30cc87a005e4c1595e2f0db9517ce2a58e","tarball":"http://registry.npmjs.org/basil-cookie/-/basil-cookie-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}]},"0.1.1":{"name":"basil-cookie","version":"0.1.1","description":"Cookie library for node with connect middleware","keywords":["cookie","cookies","connect"],"author":{"name":"Michael Phan-Ba","email":"michael@mikepb.com"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/mikepb/basil-cookie.git"},"devDependencies":{"vows":"~0.5.9"},"engines":{"node":"~0.4.11"},"_npmJsonOpts":{"file":"/Users/mikepb/.npm/basil-cookie/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basil-cookie@0.1.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"54b8f28d629af15103cbec9294e8e2e703bc367e","tarball":"http://registry.npmjs.org/basil-cookie/-/basil-cookie-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}]},"0.2.0":{"name":"basil-cookie","version":"0.2.0","description":"Cookie library for node with connect middleware","keywords":["cookie","cookies","connect"],"author":{"name":"Michael Phan-Ba","email":"michael@mikepb.com"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/mikepb/basil-cookie.git"},"devDependencies":{"vows":"~0.5.9"},"engines":{"node":"~0.4.11"},"_npmJsonOpts":{"file":"/Users/mikepb/.npm/basil-cookie/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basil-cookie@0.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"839ad7d0729aa7e8f7257706329b70ed57fef5a3","tarball":"http://registry.npmjs.org/basil-cookie/-/basil-cookie-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}]},"0.3.0":{"name":"basil-cookie","version":"0.3.0","description":"Cookie library for node with connect middleware","keywords":["cookie","cookies","connect"],"author":{"name":"Michael Phan-Ba","email":"michael@mikepb.com"},"main":"./lib/index.js","repository":{"type":"git","url":"git://github.com/mikepb/basil-cookie.git"},"devDependencies":{"vows":"~0.5.9"},"engines":{"node":"~0.4.11"},"_npmJsonOpts":{"file":"/Users/mikepb/.npm/basil-cookie/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"basil-cookie@0.3.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3136625c048034d31fc342779ce65fe2b5576b19","tarball":"http://registry.npmjs.org/basil-cookie/-/basil-cookie-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}]}},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}],"time":{"modified":"2011-08-25T00:15:19.301Z","created":"2011-08-21T08:48:43.802Z","0.0.1":"2011-08-21T08:48:46.575Z","0.1.0":"2011-08-21T21:20:27.261Z","0.1.1":"2011-08-22T03:22:08.335Z","0.2.0":"2011-08-23T01:46:21.355Z","0.3.0":"2011-08-25T00:15:19.301Z"},"author":{"name":"Michael Phan-Ba","email":"michael@mikepb.com"},"repository":{"type":"git","url":"git://github.com/mikepb/basil-cookie.git"},"_attachments":{"basil-cookie-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IvKE9GlCrwALZSAFmHwgqA==","length":16371,"stub":true},"basil-cookie-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-vqfY5/DCtWH9BqSKT2NRzg==","length":12586,"stub":true},"basil-cookie-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-1bNy3Nl28BWv7X+SmtYHMA==","length":11896,"stub":true},"basil-cookie-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wSqOEw4hqW8VKdWcd34yrg==","length":11497,"stub":true},"basil-cookie-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-g48TxUaKZphtJgovxHiBQQ==","length":9646,"stub":true}}}},
{"id":"basis-devtools","key":"basis-devtools","value":{"rev":"39-e2fd983ee335aefe75e11f3391fe9188"},"doc":{"_id":"basis-devtools","_rev":"39-e2fd983ee335aefe75e11f3391fe9188","name":"basis-devtools","description":"Developer tools for basis framework","dist-tags":{"latest":"0.0.20"},"versions":{"0.0.2":{"name":"basis-devtools","version":"0.0.2","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"preferGlobal":true,"bin":{"basis":"./basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.2","readme":"","dist":{"shasum":"a4cf8fd2dd5375ec5d522f68bbd85dde4cf8b10b","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.2.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.3":{"name":"basis-devtools","version":"0.0.3","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"preferGlobal":true,"bin":{"basis":"./basis"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.3","readme":"","_from":"basis-devtools","dist":{"shasum":"e817d955a7682f8103a6db99b750000a9ec06590","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.3.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.4":{"name":"basis-devtools","version":"0.0.4","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./basis"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.4","readme":"","dist":{"shasum":"150b2f8b8997c0cce87635b76b7a9b83aee5fa88","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.4.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.5":{"name":"basis-devtools","version":"0.0.5","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"node ./basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.5","readme":"","dist":{"shasum":"7f11e6b256991e01d5876ea9c1ecd1895214a597","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.5.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.6":{"name":"basis-devtools","version":"0.0.6","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"main":{"basis":"./basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.6","readme":"","dist":{"shasum":"18f9ef933995e792c09a64717b2e282a3d2b1124","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.6.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.7":{"name":"basis-devtools","version":"0.0.7","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.7","readme":"","dist":{"shasum":"239643177fbb96b0eb592883691c50ff2936db85","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.7.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.8":{"name":"basis-devtools","version":"0.0.8","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.8","readme":"","dist":{"shasum":"c89edfbe242312723dc547f950943872d3cc26bc","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.8.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.9":{"name":"basis-devtools","version":"0.0.9","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"_id":"basis-devtools@0.0.9","readme":"","dist":{"shasum":"32871f1d7f7babc25b68b19d862cc97be354e1c0","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.9.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.10":{"name":"basis-devtools","version":"0.0.10","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node)\r\n  - versions: 0.8.0 or later\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is present in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help","_id":"basis-devtools@0.0.10","dist":{"shasum":"03b7c0fcae1024ce16c35c7134a873b4e7532459","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.10.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.11":{"name":"basis-devtools","version":"0.0.11","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node)\r\n  - versions: 0.8.0 or later\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help","_id":"basis-devtools@0.0.11","dist":{"shasum":"b3170a8e41b0b4eff6291b949deebeb59a552b13","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.11.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.12":{"name":"basis-devtools","version":"0.0.12","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node)\r\n  - versions: 0.8.0 or later\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help","_id":"basis-devtools@0.0.12","dist":{"shasum":"1998e4b818263af90595c97638e0f1d4ed373a04","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.12.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.13":{"name":"basis-devtools","version":"0.0.13","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","jsdom-nocontextifiy":"~0.2.10","mime":"~1.2.6","socket.io":"~0.9.9"},"engines":{"node":">=8.0.0"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node)\r\n  - versions: 0.8.0 or later\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help","_id":"basis-devtools@0.0.13","dist":{"shasum":"b89883f151102432795c24e898edefca3b0a42e8","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.13.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.14":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.14","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis"},"engines":{"node":"~8.0.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## Tools\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.14","dist":{"shasum":"6f54c73ac90763f8db319c9cd8e87cc4b9ca73c8","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.14.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.15":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.15","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis"},"engines":{"node":">=0.8.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## License\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.15","dist":{"shasum":"1b1cc188f8db574c9dd47f6d9dac2b4d5b2c6a28","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.15.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.16":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.16","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"engines":{"node":">=0.8.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## License\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.16","dist":{"shasum":"2f6b1cb21927ad832ec54c01f5ba865cdebdb6f8","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.16.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.17":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.17","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"engines":{"node":">=0.8.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Common\r\n\r\n### basis.config\r\n\r\nBasis tries to find and use `basis.config` file by default. It attempts to find `basis.config` at the current working directory. If it is not found there, then it moves to the parent directory, and so on, until the root of the tree is reached.\r\n\r\nIf `basis.config` found, it's content parses as `json`. This file should contains a javascript object, where key is command name and value is setting for this command. Actually file can contains empty object, and it's not required specify setting for all commands.\r\n\r\n`basis.config` file and it's directory using as relative point for path resolving, for cases when other is not defined. Most properties treats as corresponding command flags, and could be overridden by flags in command line.\r\n\r\nAny command's flag could be put in config, as it's long name. If name contains `-` (dash) it should be camelize, i.e. `--css-pack` becomes `cssPack`. If flag contains '-no-', it must be ignored, i.e. `--js-no-single-file` becomes `jsSingleFile`.\r\n\r\nYou can disable `basis.config` usage by -n (--no-config) flag or specify your own file with -c (--config-file) argument.\r\n\r\nConfig file useful to set up command's defaults values.\r\n\r\nExample of `basis.config` at `/path/to/config`:\r\n\r\n```json\r\n  {\r\n    \"build\": {\r\n      \"file\": \"app.html\",\r\n      \"output\": \"build\"\r\n    },\r\n    \"server\": {\r\n      \"port\": 8123\r\n    }\r\n  }\r\n```\r\n\r\nWith this `basis.config` no difference at what directory you run `basis build` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/output` directory. But you still able to override settings, for example, if you run `basis build -o temp` at `/path/to/config/foo/bar` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/foo/bar/output`.\r\n\r\nUse `basis --help` for more help.\r\n\r\n### Relative path solving\r\n\r\nBasis works with many various paths, and often it is relative paths. There are two general rules for relative path resolving.\r\n\r\n* if path defined in config file (`basis.config`) it resolves to config file directory\r\n\r\n* if path defined in command line it resolves to current working directory\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## License\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.17","dist":{"shasum":"af3a1bd20e5c4fd5dcf53f4f91781378671c881b","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.17.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.18":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.18","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"engines":{"node":">=0.8.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Common\r\n\r\n### basis.config\r\n\r\nBasis tries to find and use `basis.config` file by default. It attempts to find `basis.config` at the current working directory. If it is not found there, then it moves to the parent directory, and so on, until the root of the tree is reached.\r\n\r\nIf `basis.config` found, it's content parses as `json`. This file should contains a javascript object, where key is command name and value is setting for this command. Actually file can contains empty object, and it's not required specify setting for all commands.\r\n\r\n`basis.config` file and it's directory using as relative point for path resolving, for cases when other is not defined. Most properties treats as corresponding command flags, and could be overridden by flags in command line.\r\n\r\nAny command's flag could be put in config, as it's long name. If name contains `-` (dash) it should be camelize, i.e. `--css-pack` becomes `cssPack`. If flag contains '-no-', it must be ignored, i.e. `--js-no-single-file` becomes `jsSingleFile`.\r\n\r\nYou can disable `basis.config` usage by -n (--no-config) flag or specify your own file with -c (--config-file) argument.\r\n\r\nConfig file useful to set up command's defaults values.\r\n\r\nExample of `basis.config` at `/path/to/config`:\r\n\r\n```json\r\n  {\r\n    \"build\": {\r\n      \"file\": \"app.html\",\r\n      \"output\": \"build\"\r\n    },\r\n    \"server\": {\r\n      \"port\": 8123\r\n    }\r\n  }\r\n```\r\n\r\nWith this `basis.config` no difference at what directory you run `basis build` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/output` directory. But you still able to override settings, for example, if you run `basis build -o temp` at `/path/to/config/foo/bar` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/foo/bar/output`.\r\n\r\nUse `basis --help` for more help.\r\n\r\n### Relative path solving\r\n\r\nBasis works with many various paths, and often it is relative paths. There are two general rules for relative path resolving.\r\n\r\n* if path defined in config file (`basis.config`) it resolves to config file directory\r\n\r\n* if path defined in command line it resolves to current working directory\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## License\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.18","dist":{"shasum":"58f0a1d3b33d5f9d0abaec8eaafa8b5139b7a5bb","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.18.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.19":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.19","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"engines":{"node":">=0.8.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Common\r\n\r\n### basis.config\r\n\r\nBasis tries to find and use `basis.config` file by default. It attempts to find `basis.config` at the current working directory. If it is not found there, then it moves to the parent directory, and so on, until the root of the tree is reached.\r\n\r\nIf `basis.config` found, it's content parses as `json`. This file should contains a javascript object, where key is command name and value is setting for this command. Actually file can contains empty object, and it's not required specify setting for all commands.\r\n\r\n`basis.config` file and it's directory using as relative point for path resolving, for cases when other is not defined. Most properties treats as corresponding command flags, and could be overridden by flags in command line.\r\n\r\nAny command's flag could be put in config, as it's long name. If name contains `-` (dash) it should be camelize, i.e. `--css-pack` becomes `cssPack`. If flag contains '-no-', it must be ignored, i.e. `--js-no-single-file` becomes `jsSingleFile`.\r\n\r\nYou can disable `basis.config` usage by -n (--no-config) flag or specify your own file with -c (--config-file) argument.\r\n\r\nConfig file useful to set up command's defaults values.\r\n\r\nExample of `basis.config` at `/path/to/config`:\r\n\r\n```json\r\n  {\r\n    \"build\": {\r\n      \"file\": \"app.html\",\r\n      \"output\": \"build\"\r\n    },\r\n    \"server\": {\r\n      \"port\": 8123\r\n    }\r\n  }\r\n```\r\n\r\nWith this `basis.config` no difference at what directory you run `basis build` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/output` directory. But you still able to override settings, for example, if you run `basis build -o temp` at `/path/to/config/foo/bar` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/foo/bar/output`.\r\n\r\nUse `basis --help` for more help.\r\n\r\n### Relative path solving\r\n\r\nBasis works with many various paths, and often it is relative paths. There are two general rules for relative path resolving.\r\n\r\n* if path defined in config file (`basis.config`) it resolves to config file directory\r\n\r\n* if path defined in command line it resolves to current working directory\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## License\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.19","dist":{"shasum":"cf8843bf990984ced9d07961c6439952a340628a","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.19.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]},"0.0.20":{"name":"basis-devtools","title":"Basis developer tools","version":"0.0.20","homepage":"https://github.com/lahmatiy/basis-devtools","description":"Developer tools for basis framework","author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"},{"type":"GPL","url":"http://www.opensource.org/licenses/GPL-2.0"}],"contributors":[{"name":"Ratsev Vladimir","email":"wuzykk@gmail.com"}],"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"bin":{"basis":"./bin/basis.js"},"engines":{"node":">=0.8.0"},"dependencies":{"commander":"~0.6.1","htmlparser2":"~2.2.9","csso":"~1.2.14","uglify-js":"~1.3.0","socket.io":"~0.9.9","mime":"~1.2.6","jsdom-nocontextifiy":"~0.2.10"},"readme":"Developer tools for [basis.js](https://github.com/lahmatiy/basisjs) framework.\r\n\r\n## Getting Started\r\n\r\n### Requirements\r\n\r\n* [nodeJS](http://github.com/ry/node) (0.8.0 or later)\r\n* [npm](http://github.com/isaacs/npm)\r\n\r\n### Install\r\n\r\n* With [npm](http://github.com/isaacs/npm)\r\n\r\n        $ npm install basis-devtools\r\n\r\nAfter that `basis` should be available in command line.\r\n\r\nNOTE: If you are on Windows make sure `path/to/nodejs/node_modules/.bin` is presented in PATH\r\n\r\n## Common\r\n\r\n### basis.config\r\n\r\nBasis tries to find and use `basis.config` file by default. It attempts to find `basis.config` at the current working directory. If it is not found there, then it moves to the parent directory, and so on, until the root of the tree is reached.\r\n\r\nIf `basis.config` found, it's content parses as `json`. This file should contains a javascript object, where key is command name and value is setting for this command. Actually file can contains empty object, and it's not required specify setting for all commands.\r\n\r\n`basis.config` file and it's directory using as relative point for path resolving, for cases when other is not defined. Most properties treats as corresponding command flags, and could be overridden by flags in command line.\r\n\r\nAny command's flag could be put in config, as it's long name. If name contains `-` (dash) it should be camelize, i.e. `--css-pack` becomes `cssPack`. If flag contains '-no-', it must be ignored, i.e. `--js-no-single-file` becomes `jsSingleFile`.\r\n\r\nYou can disable `basis.config` usage by -n (--no-config) flag or specify your own file with -c (--config-file) argument.\r\n\r\nConfig file useful to set up command's defaults values.\r\n\r\nExample of `basis.config` at `/path/to/config`:\r\n\r\n```json\r\n  {\r\n    \"build\": {\r\n      \"file\": \"app.html\",\r\n      \"output\": \"build\"\r\n    },\r\n    \"server\": {\r\n      \"port\": 8123\r\n    }\r\n  }\r\n```\r\n\r\nWith this `basis.config` no difference at what directory you run `basis build` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/output` directory. But you still able to override settings, for example, if you run `basis build -o temp` at `/path/to/config/foo/bar` - `/path/to/config/app.html` will be built and result will be at `/path/to/config/foo/bar/output`.\r\n\r\nUse `basis --help` for more help.\r\n\r\n### Relative path solving\r\n\r\nBasis works with many various paths, and often it is relative paths. There are two general rules for relative path resolving.\r\n\r\n* if path defined in config file (`basis.config`) it resolves to config file directory\r\n\r\n* if path defined in command line it resolves to current working directory\r\n\r\n## Tools\r\n\r\n### Server\r\n\r\nServer is a lightweight http server, which allow you run `basis.js` apps locally. Use follow command to launch server:\r\n\r\n        $ basis server\r\n\r\nAfter that current folder become a base for path resolving (you can change it using `--base` flag). You also can set listening port with `--port` flag.\r\n\r\nServer caches files you access for and inject it into html page (via `window.__resources__`) when send it to client. This approach speeds up loading of page with many files.\r\n\r\nAlso it watches for files changes and send new file content to client if neccessary (using `socket.io` and `basis.js` infrastructure). When you use `server` you don't need to refresh page when you change `.tmpl`, `.css` or l10n (`.json`) files.\r\n\r\nFor more help use:\r\n\r\n        $ basis server --help\r\n\r\n### Builder\r\n\r\nBuilder makes a build version of your app. Use follow command on certain path:\r\n\r\n        $ basis build\r\n\r\nBuilder search for `index` file (`index.html` in current folder by default, but use can use `--file` flag to specify file) and use it as start point. It scan files and search for linked files, processing it and put result in `build` folder. As a result you get all used by application files in one folder.\r\n\r\nOptionally builder may merge, optimize, pack etc. Use `--help` option to get more info:\r\n\r\n        $ basis server --help\r\n\r\n## License\r\n\r\nDual licensed under the MIT or GPL Version 2 licenses.","_id":"basis-devtools@0.0.20","dist":{"shasum":"c29b86fcb0caa5118b65498b12070c7173bf97d7","tarball":"http://registry.npmjs.org/basis-devtools/-/basis-devtools-0.0.20.tgz"},"maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}]}},"readme":"","maintainers":[{"name":"lahmatiy","email":"rdvornov@gmail.com"}],"time":{"modified":"2012-08-09T15:42:52.010Z","created":"2012-08-07T12:21:13.520Z","0.0.2":"2012-08-07T12:21:16.495Z","0.0.3":"2012-08-07T12:32:47.913Z","0.0.4":"2012-08-07T12:36:07.399Z","0.0.5":"2012-08-07T12:37:00.241Z","0.0.6":"2012-08-07T12:39:21.996Z","0.0.7":"2012-08-07T12:43:56.517Z","0.0.8":"2012-08-07T12:47:15.443Z","0.0.9":"2012-08-07T13:01:10.369Z","0.0.10":"2012-08-07T14:00:31.596Z","0.0.11":"2012-08-08T04:47:35.579Z","0.0.12":"2012-08-08T04:52:08.730Z","0.0.13":"2012-08-08T04:56:42.076Z","0.0.14":"2012-08-08T08:23:28.812Z","0.0.15":"2012-08-08T14:56:39.169Z","0.0.16":"2012-08-09T10:52:14.973Z","0.0.17":"2012-08-09T13:27:47.977Z","0.0.18":"2012-08-09T13:56:39.477Z","0.0.19":"2012-08-09T14:12:32.058Z","0.0.20":"2012-08-09T15:42:52.010Z"},"author":{"name":"Roman Dvornov","email":"rdvornov@gmail.com"},"repository":{"type":"git","url":"https://github.com/lahmatiy/basis-devtools.git"},"_attachments":{"basis-devtools-0.0.20.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-UtUmt31u5V4r3dOjmd2AQA==","length":244806,"stub":true},"basis-devtools-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-+pijyq/5h8nBFXYCdDAUGQ==","length":244297,"stub":true},"basis-devtools-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-vnviToFbOg0jQ965Kqi7BA==","length":244254,"stub":true},"basis-devtools-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-gRP9PI4AslAsQT1o1n87vA==","length":244228,"stub":true},"basis-devtools-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-/yggcrvLfBBoihtKeumjjg==","length":243524,"stub":true},"basis-devtools-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-g0VmwIcMAxujpwr/GlvHwg==","length":242950,"stub":true},"basis-devtools-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-iD0Ge19TLb5uXk/+bDLh+g==","length":243636,"stub":true},"basis-devtools-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-vEcilfmpGSjAP5E6BJZGDg==","length":236321,"stub":true},"basis-devtools-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-f62WLqjnHsijnNsEGSB/pg==","length":236319,"stub":true},"basis-devtools-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-8q2o/YiLN9NUvPxKm1fIjQ==","length":236315,"stub":true},"basis-devtools-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-KHQQmAgfObLlfE5F9uSH3w==","length":236329,"stub":true},"basis-devtools-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-2gifs/TwqN0lDuMuGo35CA==","length":235453,"stub":true},"basis-devtools-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-m2MiymJqWKEmmQ2UWSoD5A==","length":235454,"stub":true},"basis-devtools-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-LxYrBVPPaBI9yHDz8iUqeA==","length":235459,"stub":true},"basis-devtools-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0r7UgLkyqG+A9vk9F3saAw==","length":235438,"stub":true},"basis-devtools-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-uL/wPumBCYWp+ijwStDuRA==","length":235443,"stub":true},"basis-devtools-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7GwxVD1aLg9eQ/2CxdpfbQ==","length":235446,"stub":true},"basis-devtools-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-tXAjNEtyXrnXKci/Du+LOA==","length":235499,"stub":true},"basis-devtools-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9fHRoGLJTDBfOfmZW9PCTg==","length":235508,"stub":true}}}},
{"id":"basket","key":"basket","value":{"rev":"6-be455374d1d0f320cd498e8cd3a1ad15"},"doc":{"_id":"basket","_rev":"6-be455374d1d0f320cd498e8cd3a1ad15","name":"basket","description":"Couchdb layer with query like support.","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"basket","description":"Behere Framework - Module Data","version":"0.0.1","repository":{"type":"git","url":"git://github.com/behere/behere-data.git"},"main":"./lib/data","engines":{"node":"~0.6.7"},"dependencies":{"data":"0.x.x","cradle":"0.x.x","request":"2.x.x"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"bin":{"behere-data":"./bin/data"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"basket@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"dfb019b57213db29164c3de9e6b3710f57b70537","tarball":"http://registry.npmjs.org/basket/-/basket-0.0.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]},"0.1.0":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"basket","description":"Couchdb layer with query like support.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/behere/basket.git"},"main":"./lib/basket.js","engines":{"node":"*"},"dependencies":{"underscore":"*","cradle":"*","bike":"*"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"bin":{"basket":"./bin/basket"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"basket@0.1.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"046421835f2831231749f1efb48bc4301734fa1c","tarball":"http://registry.npmjs.org/basket/-/basket-0.1.0.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]},"0.1.1":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"basket","description":"Couchdb layer with query like support.","version":"0.1.1","repository":{"type":"git","url":"git://github.com/behere/basket.git"},"main":"./lib/basket.js","engines":{"node":"*"},"dependencies":{"underscore":"*","cradle":"*","bike":"*"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"bin":{"basket":"./bin/basket"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"basket@0.1.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"ff7f15390ed6248f71742d2871769d5228ddb3e1","tarball":"http://registry.npmjs.org/basket/-/basket-0.1.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]}},"readme":"> ![Stage](https://github.com/behere/behere.github.com/raw/master/assets/stage/development.png)  \r\n[![Build Status](https://secure.travis-ci.org/behere/behere-data.png)](http://travis-ci.org/behere/behere-data)\r\n\r\n> (unstable) version 0.0.1 - [History](https://github.com/behere/behere-data/blob/master/HISTORY.md)\r\n\r\n# Behere Data\r\n\r\n  Module `data` for [behere](http://github.com/behere/behere)\r\n\r\n## Installation\r\n\r\nInstall this using `npm` as follows\r\n\r\n    $ npm install behere-data\r\n\r\n  Dependencies:\r\n\r\n  * [behere](http://github.com/behere/behere) (Core)\r\n\r\n## Quick Start\r\n\r\n ...\r\n\r\n## Features\r\n\r\n  * ...\r\n\r\n## Running Tests\r\n\r\nInstall dev dependencies and make tests:\r\n\r\n    $ npm install -d\r\n    $ make test\r\n\r\n## Contributors\r\n\r\n```\r\nGabriele Di Stefano <gabriele.ds@gmail.com>\r\n```\r\n\r\n![Behere Logo](https://github.com/behere/behere.github.com/raw/master/assets/behere_logo.png)\r\n\r\n## License \r\n\r\n[The MIT License](https://github.com/behere/behere-data/blob/master/LICENSE)","maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"time":{"modified":"2012-07-03T22:39:41.344Z","created":"2012-06-29T18:40:48.115Z","0.0.1":"2012-06-29T18:40:51.495Z","0.1.0":"2012-07-02T23:25:32.874Z","0.1.1":"2012-07-03T22:39:41.344Z"},"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"repository":{"type":"git","url":"git://github.com/behere/basket.git"},"_attachments":{"basket-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kekP+8KTXpsTiSGm7mXHsg==","length":3682,"stub":true},"basket-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3GO/AmgFZxbzIu4aJRUexQ==","length":4451,"stub":true}}}},
{"id":"bassline","key":"bassline","value":{"rev":"9-243f7c4dfdb55573e995a705631550c0"},"doc":{"_id":"bassline","_rev":"9-243f7c4dfdb55573e995a705631550c0","name":"bassline","description":"JavaScript library providing Maybe, Either, and Promise objects","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"bassline","version":"0.0.1","description":"JavaScript library providing Maybe and Either objects","keywords":["maybe","nothing","just","either","left","right","functor","applicative","monad"],"author":{"name":"eric thul","email":"thul.eric@gmail.com"},"contributors":[{"name":"eric thul","email":"thul.eric@gmail.com"}],"devDependencies":{"jasmine-node":">= 1.0.13"},"licenses":["MIT"],"bugs":{"name":"https://github.com/ethul/bassline/issues"},"main":"./lib/bassline.js","repository":{"type":"git","url":"git://github.com/ethul/bassline.git"},"_npmUser":{"name":"ethul","email":"thul.eric@gmail.com"},"_id":"bassline@0.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c668c79e28745f68ed51906d5c115aa31ee86edd","tarball":"http://registry.npmjs.org/bassline/-/bassline-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"ethul","email":"thul.eric@gmail.com"}]},"0.0.2":{"name":"bassline","version":"0.0.2","description":"JavaScript library providing Maybe and Either objects","keywords":["maybe","nothing","just","either","left","right","functor","applicative","monad"],"author":{"name":"eric thul","email":"thul.eric@gmail.com"},"contributors":[{"name":"eric thul","email":"thul.eric@gmail.com"}],"devDependencies":{"jasmine-node":">= 1.0.13"},"licenses":["MIT"],"bugs":{"name":"https://github.com/ethul/bassline/issues"},"main":"./lib/bassline.js","repository":{"type":"git","url":"git://github.com/ethul/bassline.git"},"_npmUser":{"name":"ethul","email":"thul.eric@gmail.com"},"_id":"bassline@0.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3cf7255b5c45561c5b7e5178dbb3ebbd96cf9427","tarball":"http://registry.npmjs.org/bassline/-/bassline-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"ethul","email":"thul.eric@gmail.com"}]},"0.0.3":{"name":"bassline","version":"0.0.3","description":"JavaScript library providing Maybe and Either objects","keywords":["maybe","nothing","just","either","left","right","functor","applicative","monad"],"author":{"name":"eric thul","email":"thul.eric@gmail.com"},"contributors":[{"name":"eric thul","email":"thul.eric@gmail.com"}],"devDependencies":{"jasmine-node":">= 1.0.13"},"licenses":["MIT"],"bugs":{"name":"https://github.com/ethul/bassline/issues"},"main":"./lib/bassline.js","repository":{"type":"git","url":"git://github.com/ethul/bassline.git"},"_npmUser":{"name":"ethul","email":"thul.eric@gmail.com"},"_id":"bassline@0.0.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b8075fd12567a5e82183f8805232d6f6f76ade27","tarball":"http://registry.npmjs.org/bassline/-/bassline-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"ethul","email":"thul.eric@gmail.com"}]},"0.0.4":{"name":"bassline","version":"0.0.4","description":"JavaScript library providing Maybe, Either, and Promise objects","keywords":["maybe","nothing","just","either","left","right","functor","applicative","monad","promise"],"author":{"name":"eric thul","email":"thul.eric@gmail.com"},"contributors":[{"name":"eric thul","email":"thul.eric@gmail.com"}],"devDependencies":{"jasmine-node":">= 1.0.13"},"licenses":["MIT"],"bugs":{"name":"https://github.com/ethul/bassline/issues"},"main":"./lib/bassline.js","repository":{"type":"git","url":"git://github.com/ethul/bassline.git"},"_npmUser":{"name":"ethul","email":"thul.eric@gmail.com"},"_id":"bassline@0.0.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d2c6ca41832a5df722a41dbff9be6dfa075e4cbb","tarball":"http://registry.npmjs.org/bassline/-/bassline-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"ethul","email":"thul.eric@gmail.com"}]}},"maintainers":[{"name":"ethul","email":"thul.eric@gmail.com"}],"time":{"modified":"2012-02-12T03:10:52.510Z","created":"2012-02-05T23:05:56.022Z","0.0.1":"2012-02-05T23:05:56.836Z","0.0.2":"2012-02-05T23:53:43.619Z","0.0.3":"2012-02-06T14:07:22.992Z","0.0.4":"2012-02-12T03:10:52.510Z"},"author":{"name":"eric thul","email":"thul.eric@gmail.com"},"repository":{"type":"git","url":"git://github.com/ethul/bassline.git"},"_attachments":{"bassline-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YbpN2eYEoxgMzZld6mlapQ==","length":3847,"stub":true},"bassline-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-vNhOSnzA6yGlDbQOzBp2Vw==","length":2860,"stub":true},"bassline-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-blMQTueSskCdy/aGoJQMBQ==","length":2865,"stub":true},"bassline-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vwOOKmL/aGt3C7UKVC+2zw==","length":2864,"stub":true}}}},
{"id":"bastard","key":"bastard","value":{"rev":"79-56210d7818836f91b1dcd297dcf7004b"},"doc":{"_id":"bastard","_rev":"79-56210d7818836f91b1dcd297dcf7004b","name":"bastard","description":"A webserver for static files that does things right.","dist-tags":{"latest":"0.6.8"},"versions":{"0.5.1":{"name":"bastard","version":"0.5.1","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"hg","url":"ssh://hg.kuhu.org/bastard"},"config":{"port":80,"host":null,"base":null,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0304c42ac6c12d7be8a7091a8108273195f5246f","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.1.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.2":{"name":"bastard","version":"0.5.2","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"76eec28cb0429b94ccfbc74f3438fe569f4cf276","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.2.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.3":{"name":"bastard","version":"0.5.3","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"54d91cbdb4af95850b0d6c9e7171ece957a76f6e","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.3.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.4":{"name":"bastard","version":"0.5.4","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"975eafdd3d5cbefb0427b650e91019304e112623","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.4.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.5":{"name":"bastard","version":"0.5.5","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"009f9d261f11333196b8dead208a36b55647c632","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.5.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.6":{"name":"bastard","version":"0.5.6","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d977ab130b79dba42f785c647b6f348512c2e85b","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.6.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.7":{"name":"bastard","version":"0.5.7","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzbz2":">=0.1.4","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cde1e415b2b6cda16110db1f5e902f1af90e7618","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.7.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.8":{"name":"bastard","version":"0.5.8","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"52f9eb461cd469f0de1492b64f1c2106840be7b6","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.8.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.9":{"name":"bastard","version":"0.5.9","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c8d897a5766c5d2b3a57f4be0cf485eabe0b7e27","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.9.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.10":{"name":"bastard","version":"0.5.10","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.10","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e06f85ed01cd7280f7ab73cd331e96c8b51fdf52","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.10.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.5.11":{"name":"bastard","version":"0.5.11","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.5.11","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d7cba09087320adf289a905b7668cd3e0ccecc85","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.5.11.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.0":{"name":"bastard","version":"0.6.0","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"558e2d69590eeb6be0a144e6d60ddb8e963ef7b5","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.0.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.1":{"name":"bastard","version":"0.6.1","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2a22a4a37bfeb6a61e095f407e0911b8d94e933c","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.1.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.2":{"name":"bastard","version":"0.6.2","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e18ca2f1a40f8334e992815d16af86d15e697d9a","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.2.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.4":{"name":"bastard","version":"0.6.4","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5","htmlscanner":">=0.7.0"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f5565c63d090d6fd28dadfaaf106a974981cbc24","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.4.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.5":{"name":"bastard","version":"0.6.5","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5","htmlscanner":">=0.7.0"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6793eb1462189761e3adcc98b6aa51a01fe009f3","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.5.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.6":{"name":"bastard","version":"0.6.6","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5","htmlscanner":">=0.7.0"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"869edb76f2fa991fcc4f25f5a1c8a56abf8881b6","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.6.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.7":{"name":"bastard","version":"0.6.7","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5","htmlscanner":">=0.7.0"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4a45c0ff69c3080c2e35ca4cc77828ab268df0df","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.7.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"directories":{}},"0.6.8":{"name":"bastard","version":"0.6.8","description":"A webserver for static files that does things right.","keywords":["webserver","fingerprint","static"],"homepage":"http://jeremy.org/bastard/","bugs":{"email":"jeremy-bastard@jeremy.org"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"files":["bastard.js","start.js","README.md"],"main":"bastard.js","bin":{"bastard":"./start.js"},"NOT_REALLY_man":["./man/bastard.1"],"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"config":{"port":80,"host":null,"base":null,"alwaysCheckModTime":true,"preload":false,"debug":false,"directories":false,"rawURLPrefix":"/raw/","fingerprintURLPrefix":"/f/","urlPrefix":"/","workingDir":"/tmp/bastard"},"scripts":{"start":"node start.js"},"dependencies":{"uglify-js":">=1.1.1","csso":">=1.2.8","gzip":">=0.1.0","mime":">=1.2.4","html-minifier":">=0.4.5","htmlscanner":">=0.7.0"},"engines":{"node":">=0.4.12","npm":">=1.0.106"},"_npmUser":{"name":"jeremy","email":"npmjs.org@m.kuhu.org"},"_id":"bastard@0.6.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d80c1919e41ba34838093efe5157adbccc8246e4","tarball":"http://registry.npmjs.org/bastard/-/bastard-0.6.8.tgz"},"maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}]}},"readme":"BASTARD\n=======\n\nThe purpose of bastard is to serve static content over the web quickly, according to best practices, in a way that is easy to set up, run, and administer. It is implemented as a module intended to be run from within node.js. It may be invoked as part of another server process, serving only URLs with a given set of prefixes, or it may be the entire server all on its own. It will automatically minify and compress data, cache the data on disk, and verify the validity of its cached data on startup. While running, it keeps cached data in memory and does not expire data from the cache. Restarts should be relatively quick and easy because minified/compressed data will be read from the disk cache on the first request for that item.\n\nAdditionally, bastard will automatically generate cryptographic fingerprints for all files it serves. You can programmatically ask it for the current fingerprinted URL for a file so that you can use that URL in HTML you generate external to the server. When bastard serves fingerprinted files, they are served with very long cache times because those URLs should always serve the same content.\n\nBoth CSS and Javascript are minified, and HTML will probably be added soon. Files of other types are not touched, though they will be compressed if they're not image files. (Image files are never gzipped by this software.)\n\n\nInstalling\n==========\n\n\tnpm install bastard\n\n\nRunning Standalone\n==================\n\nConfigure the settings via npm. There are reasonable defaults but you definitely need to specify the base directory where your files are:\n\n    npm config bastard:base /path/with/good/intentions\n    npm start bastard\n\nIf you are running the standalone server and want to programmatically find out the current fingerprint for a file, make a request for the file with an incorrect fingerprint such as \"BASTARD\". The server's response will contain the valid fingerprint, which you may then parse out and use in your own externally-generated HTML.\n\n\nRunning from your own code\n==========================\n\n1. Create the bastard object:\n\n    var bastard = require ('bastard');\n    var Bastard = bastard.Bastard;\n    var bastardObj = new Bastard (config);\n\n\t// if you want to load every file into the cache before you get started:\n\tbastardObj.loadEveryFile (callback);\n\n2. Create your own HttpServer object and pass requests to it from within the associated handler:\n\n    var handled = bastardObj.possiblyHandleRequest (request, response);\n\nIf the above function returns true, the request has been handled and you don't need to do anything else. Depending on how you want to structure your server, you can check bastard before or after your own URLs.\n\n\n3. To find out the current fingerprint of a file:\n\n    bastardObj.getFingerprint (filePath, basePath, callback);\n\n* filePath: full path to the file\n* basePath: path to the file within the base directory (may be the same as the URL path for the file)\n* callback: if present, will be called with the first argument being any error (or null) and the second argument being the fingerprint\n\nIf callback is not present and the fingerprint is already known, it will be returned immediately as the result of the function call. If callback is not present and the fingerprint is not already known, the fingerprint will be internally calculated and null will be returned from the function call.\n\nYou only need to specify one of filePath and basePath.\n\nFor an example of how to run bastard from your own code, examine the file start.js in the bastard package.\n\n\nConfiguration\n=============\n\nhost\tHostname or IP address at which to listen. If empty, will bind to all available IP addresses. (Default: empty)\n\nport\tPort number at which to listen. (Default: 80)\n\nbase    Directory where files to be served reside. (Default: empty)\n\nrawURLPrefix\tThe prefix for URLs from which raw files should be served. These will be just as they are on disk: not minified, not compressed. (Default: /raw/)\n\nfingerprintURLPrefix\tThe prefix for URLs from which fingerprinted files should be served. The fingerprint will appear in the URLs after this prefix followed by the relative pathname to the file in the base directory. (Default: /f/)\n\nurlPrefix\tThe prefix for URLs from which non-fingerprinted files should be served.\n\nworkingDir\tThe location for temporary files to be kept. This includes on-disk copies of minified and compressed files that originate in the base directory. (Default: /tmp/bastard.dat)\n\ndebug\tIf true, turns on some debugging functionality. (Default: false)\n\ndirectories\tIf true, will generate directory listings. (Not yet implemented.) (Default: false)\n\n\n\nNote that first the raw prefix is checked, then the fingerprint prefix, and then only the regular prefix--and the first match is considered to be definitive. This means that with the default values, if you have a directory called \"raw\" in your base directory, those files will never be served.\n\n\nLimitations\n===========\n\nIf the mime type for a file begins with \"image/\", it will not be gzipped.  All other files will be gzipped if the client indicates that it can understand gzipped data. This may not be the best choice for all file types.\n\nDoes not do virtual hosting.\n\n\nProject Status\n==============\n\nThis is a project built by the author for his own use. Contributions are welcomed.\n\nThe public repository for the project is found at: https://github.com/unprolix/bastard\n\n\nLicense\n=======\n\nCopyright 2011, Jeremy Bornstein <jeremy@jeremy.org>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the project nor the names of its contributors may\n      be used to endorse or promote products derived from this software\n      without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL JEREMY BORNSTEIN BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.","maintainers":[{"name":"jeremy","email":"npmjs.org@m.kuhu.org"}],"time":{"modified":"2012-03-11T10:33:53.008Z","created":"2011-12-03T23:36:12.748Z","0.5.1":"2011-12-03T23:36:14.396Z","0.5.2":"2011-12-03T23:38:04.344Z","0.5.3":"2011-12-04T08:58:02.188Z","0.5.4":"2011-12-04T10:32:17.532Z","0.5.5":"2011-12-05T14:34:03.900Z","0.5.6":"2011-12-05T15:51:50.632Z","0.5.7":"2011-12-05T21:11:54.464Z","0.5.8":"2012-01-14T08:10:20.797Z","0.5.9":"2012-01-15T07:55:40.815Z","0.5.10":"2012-01-15T18:16:44.801Z","0.5.11":"2012-01-29T02:22:28.399Z","0.6.0":"2012-01-29T23:00:23.248Z","0.6.1":"2012-01-29T23:20:14.875Z","0.6.2":"2012-01-29T23:50:05.639Z","0.6.4":"2012-01-30T23:55:14.190Z","0.6.5":"2012-02-03T16:53:10.059Z","0.6.6":"2012-02-21T04:18:32.607Z","0.6.7":"2012-03-07T16:59:47.794Z","0.6.8":"2012-03-11T10:33:53.008Z"},"author":{"name":"Jeremy Bornstein","email":"jeremy@jeremy.org","url":"http://jeremy.org/"},"repository":{"type":"git","url":"git://github.com/unprolix/bastard.git"},"_attachments":{"bastard-0.6.8.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-CT2/smbjONCjpnB+h8M+Zg==","length":798720,"stub":true},"bastard-0.6.7.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-+9sx1Hy9Ex2o4CMRSqvd5Q==","length":798720,"stub":true},"bastard-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-LaNH+spaMZ2LFlgtRzLNsQ==","length":798720,"stub":true},"bastard-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-Mhnv6+jJcrPAD4QEjKJqSw==","length":798720,"stub":true},"bastard-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-Pv5ovsSfIEr8grlEHwnEjw==","length":798720,"stub":true},"bastard-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-G/HXUqkqLUn3zAg86WsL5w==","length":20480,"stub":true},"bastard-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-jAQszCDYnI4J3Fd09hgF6w==","length":20480,"stub":true},"bastard-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-A1vh3qYk2NAC+2eWSNxEYQ==","length":20480,"stub":true},"bastard-0.5.11.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-9k8RQ5x9X/JXvPTK8LecaA==","length":20480,"stub":true},"bastard-0.5.10.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-UZAVhGsUwXo92tpGrKNgEA==","length":20480,"stub":true},"bastard-0.5.9.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-tOYR203WcBsLl1hYqmkWWw==","length":20480,"stub":true},"bastard-0.5.8.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-EGkT2uXTJxVQ5EHZAWAlvg==","length":20480,"stub":true},"bastard-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-t01N6DvYJ1tpjZ94V8OXmQ==","length":20480,"stub":true},"bastard-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-5T0JYzjbUCrr+VGjWIZvew==","length":20480,"stub":true},"bastard-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-S32qYLkuIGz5hSENnJqekg==","length":20480,"stub":true},"bastard-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-ftppFCPq9DV+Ye1yz73+yg==","length":20480,"stub":true},"bastard-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-d7r9XeHl3TO1a8Dvy6o0Vg==","length":20480,"stub":true},"bastard-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cSnD20TULu3DRoCBkQrKjg==","length":10240,"stub":true},"bastard-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1702udempcHdz7tgVV6gXQ==","length":10240,"stub":true}}}},
{"id":"batbelt","key":"batbelt","value":{"rev":"5-09aaef7f490628b90ea244bee61ccdd8"},"doc":{"_id":"batbelt","_rev":"5-09aaef7f490628b90ea244bee61ccdd8","name":"batbelt","description":"General purpose utilities to help prevent an untimely death.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"batbelt","version":"0.0.1","description":"General purpose utilities to help prevent an untimely death.","homepage":"https://github.com/dokipen/batbelt","keywords":[],"license":"MIT","author":{"name":"Bob Corsaro","email":"rcorsaro@gmail.com","url":"http://www.google.com/profiles/rcorsaro"},"repository":{"type":"git","url":"git://github.com/embedly/batbelt.git"},"bugs":{"url":"http://github.com/embedly/batbelt/issues/"},"directories":{"lib":"./lib"},"dependencies":{"hashish":"","groc":""},"devDependencies":{"mocha":"0.7.x","should":"0.4.x"},"engines":{"node":">= 0.4.0","npm":">= 1.0.105"},"main":"./index.js","scripts":{"doc":"node_modules/.bin/groc index.js","test":"mocha test.js","publish-doc":"node_modules/.bin/groc --github index.js"},"_npmUser":{"name":"doki_pen","email":"rcorsaro@gmail.com"},"_id":"batbelt@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"00bcc518f7e30bd8798bc48c3004067bcda27572","tarball":"http://registry.npmjs.org/batbelt/-/batbelt-0.0.1.tgz"},"maintainers":[{"name":"doki_pen","email":"rcorsaro@gmail.com"}]},"0.0.2":{"name":"batbelt","version":"0.0.2","description":"General purpose utilities to help prevent an untimely death.","homepage":"https://github.com/dokipen/batbelt","keywords":[],"license":"MIT","author":{"name":"Bob Corsaro","email":"rcorsaro@gmail.com","url":"http://www.google.com/profiles/rcorsaro"},"repository":{"type":"git","url":"git://github.com/embedly/batbelt.git"},"bugs":{"url":"http://github.com/embedly/batbelt/issues/"},"directories":{"lib":"./lib"},"dependencies":{"hashish":""},"devDependencies":{"mocha":"0.7.x","should":"0.4.x","groc":""},"engines":{"node":">= 0.4.0","npm":">= 1.0.105"},"main":"./index.js","scripts":{"doc":"node_modules/.bin/groc index.js","test":"mocha test.js","publish-doc":"node_modules/.bin/groc --github index.js"},"optionalDependencies":{},"_npmUser":{"name":"doki_pen","email":"rcorsaro@gmail.com"},"_id":"batbelt@0.0.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2285bf5438b03502e5c5a3cdaf3ad68bf0ad4a65","tarball":"http://registry.npmjs.org/batbelt/-/batbelt-0.0.2.tgz"},"maintainers":[{"name":"doki_pen","email":"rcorsaro@gmail.com"}]}},"readme":"  [![Build Status](https://secure.travis-ci.org/dokipen/batbelt.png)](http://travis-ci.org/dokipen/batbelt)\n\n[doc](http://dokipen.github.com/batbelt \"BatBelt doc\")\n","maintainers":[{"name":"doki_pen","email":"rcorsaro@gmail.com"}],"time":{"modified":"2012-06-22T13:37:14.896Z","created":"2012-05-21T13:54:52.801Z","0.0.1":"2012-05-21T13:54:53.576Z","0.0.2":"2012-06-22T13:37:14.896Z"},"author":{"name":"Bob Corsaro","email":"rcorsaro@gmail.com","url":"http://www.google.com/profiles/rcorsaro"},"repository":{"type":"git","url":"git://github.com/embedly/batbelt.git"},"_attachments":{"batbelt-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-uKIYjYNLldh0+kjgzN0YjQ==","length":2390,"stub":true},"batbelt-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-csnqBj0abOgn8OjIJPJkkA==","length":2390,"stub":true}}}},
{"id":"batch","key":"batch","value":{"rev":"12-e7be69764fcd9b46faf501b7b01fce50"},"doc":{"_id":"batch","_rev":"12-e7be69764fcd9b46faf501b7b01fce50","name":"batch","description":"Simple async batch","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"batch","version":"0.0.1","description":"Simple async batch","keywords":[],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"mocha":"*","should":"*"},"main":"index","engines":{"node":"0.4.x"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"batch@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4abd5e273d3b0d07b41e2dc32a1e27978513b846","tarball":"http://registry.npmjs.org/batch/-/batch-0.0.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.0.2":{"name":"batch","version":"0.0.2","description":"Simple async batch","keywords":[],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"mocha":"*","should":"*"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"batch@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"fc558c82ded76cd8ddf049d2ba065f352d185f9c","tarball":"http://registry.npmjs.org/batch/-/batch-0.0.2.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.0.3":{"name":"batch","version":"0.0.3","description":"Simple async batch","keywords":[],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"mocha":"*","should":"*"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"batch@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4db7de56a489f3138f6e2ad73875b6acffffa424","tarball":"http://registry.npmjs.org/batch/-/batch-0.0.3.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.1.0":{"name":"batch","version":"0.1.0","description":"Simple async batch","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"mocha":"*","should":"*"},"main":"index","_id":"batch@0.1.0","dist":{"shasum":"34ee7b3bf200a416cc05b967273513e6fe2cd808","tarball":"http://registry.npmjs.org/batch/-/batch-0.1.0.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.1.1":{"name":"batch","version":"0.1.1","description":"Simple async batch","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"mocha":"*","should":"*"},"main":"index","_id":"batch@0.1.1","dist":{"shasum":"7550e96efb11c26db2032ca6f0ba6720e8cf971a","tarball":"http://registry.npmjs.org/batch/-/batch-0.1.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"\n# batch\n\n  Simple async batch\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-06T12:54:12.419Z","created":"2012-01-17T03:10:03.348Z","0.0.1":"2012-01-17T03:10:04.791Z","0.0.2":"2012-02-13T00:50:21.813Z","0.0.3":"2012-06-02T14:26:31.123Z","0.1.0":"2012-07-03T18:13:02.061Z","0.1.1":"2012-07-03T18:26:52.473Z"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"users":{"sjonnet19":true},"_attachments":{"batch-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-3qlORO2ZNEUsfZZaKK2caQ==","length":2006,"stub":true},"batch-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ch8/24td90TVlGA86x0qrA==","length":1982,"stub":true},"batch-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BdfwTySVCL7cibG1eKl5Vg==","length":1870,"stub":true},"batch-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-p39ybkbBKJeif/FVa6VLVw==","length":10240,"stub":true},"batch-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a/4FghwYCemqvShASfeVNA==","length":10240,"stub":true}}}},
{"id":"batch-resize","key":"batch-resize","value":{"rev":"3-a2d16bf483b1f08430b1269c01363c51"},"doc":{"_id":"batch-resize","_rev":"3-a2d16bf483b1f08430b1269c01363c51","name":"batch-resize","description":"Batch image resizer","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"batch-resize","version":"0.0.1","description":"Batch image resizer","keywords":["image","resize"],"author":{"name":"TJ Holowaychuk","email":"tj@learnboost.com"},"dependencies":{"resize":"0.0.3","debug":"*","batch":"*"},"main":"index","engines":{"node":"*"},"readme":"\n# batch-resize\n\n  Resize a single image input to multiple sizes.\n\n## Installation\n\n    $ npm install batch-resize\n\n## resize(path, sizes, callback)\n\n```js\nvar resize = require('batch-resize');\n\nresize('/path/to/image.png')\n  .to('small', 100, 100)\n  .to('medium', 200, 200)\n  .to('large', 500, 500)\n  .end(function(err, images){\n    \n  })\n```\n\n The `images` array now contains:\n\n```js\n[{\n  name: 'small',\n  width: 100,\n  height: 100,\n  buffer: Buffer\n}, ...]\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@learnboost.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"batch-resize@0.0.1","dist":{"shasum":"5ffe986f4d5f818610a9b903247caae6871fa476","tarball":"http://registry.npmjs.org/batch-resize/-/batch-resize-0.0.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"\n# batch-resize\n\n  Resize a single image input to multiple sizes.\n\n## Installation\n\n    $ npm install batch-resize\n\n## resize(path, sizes, callback)\n\n```js\nvar resize = require('batch-resize');\n\nresize('/path/to/image.png')\n  .to('small', 100, 100)\n  .to('medium', 200, 200)\n  .to('large', 500, 500)\n  .end(function(err, images){\n    \n  })\n```\n\n The `images` array now contains:\n\n```js\n[{\n  name: 'small',\n  width: 100,\n  height: 100,\n  buffer: Buffer\n}, ...]\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@learnboost.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-09T22:07:14.539Z","created":"2012-08-09T22:07:12.610Z","0.0.1":"2012-08-09T22:07:14.539Z"},"author":{"name":"TJ Holowaychuk","email":"tj@learnboost.com"},"_attachments":{"batch-resize-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-s056wsLYF5UYIULNh6ejiA==","length":1836,"stub":true}}}},
{"id":"batches","key":"batches","value":{"rev":"3-309a39b59e326d62995128cb28a0ec81"},"doc":{"_id":"batches","_rev":"3-309a39b59e326d62995128cb28a0ec81","name":"batches","description":"Control concurrency of massive async loops","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Jan Krems"},"name":"batches","description":"Control concurrency of massive async loops","version":"0.1.0","homepage":"https://github.com/jkrems/node-batches","repository":{"type":"git","url":"git://github.com/jkrems/node-batches.git"},"main":"./lib/index","scripts":{"test":"vows --spec test/*"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"vows":"*","assert":"*"},"licenses":[{"type":"MIT","url":"http://github.com/jkrems/node-batches/raw/master/LICENSE"}],"_npmUser":{"name":"jkrems","email":"jan.krems@gmail.com"},"_id":"batches@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"45d948d761501077a6e8dfc1efda76b3a35ceb84","tarball":"http://registry.npmjs.org/batches/-/batches-0.1.0.tgz"},"maintainers":[{"name":"jkrems","email":"jan.krems@gmail.com"}]}},"readme":"# batches\n\nYou have to make thousands of database queries or API calls? You don't want to throw those millions of queries all at once at your poor backend? Batches is here to help you out.\n\n## Examples\n\nFor one example is worth a thousand words:\n\n\tvar b = require('batches').batch({ concurrent: 10, context: 'Jimmy', collectData: true });\n\tfor (var i = 0; i < 100; ++i) {\n\t\tb.add(function(next, idx) {\n\t\t\tsetTimeout(function() {\n\t\t\t\tconsole.log('This is call #' + (idx + 1) + ', ' + this);\n\t\t\t\tnext(null, 'Result #' + (idx + 1));\n\t\t\t}, 101-idx);\n\t\t});\n\t}\n\tb.when(function(errors, data) {\n\t\tconsole.log('All done.');\n\t\tconsole.log(data);\n\t});\n\n## API\n\n### batches.batch(options)\n\nCreate a new batch. Available options:\n\n* `concurrent`: How many jobs to run at the same time. Default: `100`\n* `context`: Context to call the job-functions in. Default: the batch-object itself\n* `exitOnError`: If true, no new jobs are started after the first error occurred. Default: `true`\n* `collectData`: If true, the data passed to `next`-callbacks is collected and passed to the `when`-callback when all jobs are finished. Default: `false`\n\n### batch.add(callback)\n\nAdd a new job to a batch. The callback gets called immediately if concurrency allows it. The arguments of the callback are:\n\n* `next`: Has to be called when the job is done. Can be passed an error object and data.\n* `index`: The index of the job (the jobs get called in the order they are added to the batch)\n\n### batch.when(callback)\n\nAdd a callback that gets called when all jobs have finished (or `exitOnError` is set to `true` and an error occurred). First argument is either `null` or an array of errors (where array indices and job-index match up), the second argument is either an empty array (when `collectData` is set to `false`) or an array containing all data passed to the `next`-callbacks, again with indices matching the `index`-parameter of the jobs.","maintainers":[{"name":"jkrems","email":"jan.krems@gmail.com"}],"time":{"modified":"2012-03-03T16:00:47.553Z","created":"2012-03-03T16:00:45.191Z","0.1.0":"2012-03-03T16:00:47.553Z"},"author":{"name":"Jan Krems"},"repository":{"type":"git","url":"git://github.com/jkrems/node-batches.git"},"_attachments":{"batches-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-twXX+qz8QBxB5yTsQdHC7A==","length":10240,"stub":true}}}},
{"id":"batchflow","key":"batchflow","value":{"rev":"5-397acd28e7e2e83ea82180cfa13835f5"},"doc":{"_id":"batchflow","_rev":"5-397acd28e7e2e83ea82180cfa13835f5","name":"batchflow","description":"Batch process collections in parallel or sequentially.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"batchflow","version":"0.0.1","description":"Batch process collections in parallel or sequentially.","homepage":[""],"repository":{"type":"git","url":"git@github.com:jprichardson/node-batchflow.git"},"keywords":["batch","flow","parallel","control","sequence","sequentially","arrays","async","step","seq"],"author":{"name":"JP","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":""}],"dependencies":{},"devDepdencies":{"mocha":"1.3.x"},"main":"./lib/batchflow.js","scripts":{"test":"mocha test"},"readme":"Node.js - batchflow\n===================\n\nBatch process collections in parallel or sequentially.\n\n\nWhy?\n----\n\nI really got tired of writing the following patterns over and over again:\n\n**Sequential:**\n```javascript\nvar files = [... list of files ...];\nfunction again(x) {\n\tif (x < files.length) {\n\t\tfs.readFile(files[x], function(err, data) {\n\t\t\t//... do something with data ...\n\t\t\tagain(x + 1);\n\t\t});\n\t} else {\n\t\tconsole.log('Done.');\n\t}\n}\n\nagain(0);\n```\n\nor..\n\n**Parallel:**\n```javascript\nvar files = [... list of files ...];\nvar pending = 0;\nfiles.forEach(function(file, i) {\n\tpending += 1;\n\tfs.readFile(file, function(err, data) {\n\t\t//... do something with data ....\n\t\t\n\t\tpending -= 1;\n\t\tif (pending === 0 && i === files.length -1) {\n\t\t\tconsole.log('Done.');\n\t\t}\n\t});\n});\n```\n\nThat's ugly. For more complicated examples it requires a bit more thinking.\n\nWhy don't I use the wonderful library [async][1]? Well, `async` tries to do way too much. I also suffer from a server case of NIH syndrome. Kidding, or else I'd rewrite Express.js. Or, am I? Muahahhaa. `async` syntax is also very ugly and not CoffeeScript friendly.\n\n\n\n\nInstallation\n------------\n\n    npm install batchflow\n\n\n\nExamples\n--------\n\n### Arrays\n\nLet's rewrite the previous sequential example:\n\n**Sequential:**\n```javascript\nvar batch = require('batchflow');\n\nvar files = [... list of files ...];\nbatch(files).sequential()\n.each(function(i, item, done) {\n\tfs.readFile(item, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(results) {\n\t//analyze results\n});\n```\n\nHow about the parallel example?\n\n**Parallel:**\n ```javascript\nvar batch = require('batchflow');\n\nvar files = [... list of files ...];\nbatch(files).parallel()\n.each(function(i, item, done) {\n\tfs.readFile(item, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult); //<---- yes, you must still call done in parallel, this way we can know when to trigger `end()`.\n\t}\n}).end(results) {\n\t//analyze results\n});\n```\n\nWhat's that, your data is not stored in an array? Oh, you say it's stored in an object? That's OK too...\n\n### Objects\n\n**Sequential:**\n```javascript\nvar batch = require('batchflow');\n\nvar files = {'file1': 'path'.... 'filen': 'pathn'}\nbatch(files).sequential()\n.each(function(key, val, done) {\n\tfs.readFile(val, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(results) {\n\t//analyze results\n});\n```\n\nHow about the parallel example?\n\n**Parallel:**\n ```javascript\nvar batch = require('batchflow');\n\nvar files = {'file1': 'path'.... 'filen': 'pathn'}\nbatch(files).parallel()\n.each(function(key, val, done) {\n\tfs.readFile(val, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(results) {\n\t//analyze results\n});\n```\n\n### Misc\n\n1. Is `sequential()` or `parallel()` too long? Fine. Type `seq()` or `par()`.\n2. You don't like the fluent API? That's OK too:\n\nNon-fluent API BatchFlow\n```javascript\nvar batch = require('batchflow');\nvar bf = batch(files);\nbf.isSequential = true;\n\nbf.each(function(i, file, done) {\n\tdone(someResult);\n});\n \nbf.end(function(results) {\n\t//blah blah\n});\n\n\n\nLicense\n-------\n\n(MIT License)\n\nCopyright 2012, JP  <jprichardson@gmail.com>\n\n\n\n[1]: https://github.com/caolan/async/\n","_id":"batchflow@0.0.1","dist":{"shasum":"a68f9487ddc1f260640fe4847ab2bb40365276c9","tarball":"http://registry.npmjs.org/batchflow/-/batchflow-0.0.1.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]},"0.0.2":{"name":"batchflow","version":"0.0.2","description":"Batch process collections in parallel or sequentially.","homepage":[""],"repository":{"type":"git","url":"git@github.com:jprichardson/node-batchflow.git"},"keywords":["batch","flow","parallel","control","sequence","sequentially","arrays","async","step","seq"],"author":{"name":"JP","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":""}],"dependencies":{},"devDepdencies":{"mocha":"1.3.x"},"main":"./lib/batchflow.js","scripts":{"test":"mocha test"},"readme":"Node.js - batchflow\n===================\n\nBatch process collections in parallel or sequentially.\n\n\nWhy?\n----\n\nI really got tired of writing the following patterns over and over again:\n\n**Sequential:**\n```javascript\nvar files = [... list of files ...];\nfunction again(x) {\n\tif (x < files.length) {\n\t\tfs.readFile(files[x], function(err, data) {\n\t\t\t//... do something with data ...\n\t\t\tagain(x + 1);\n\t\t});\n\t} else {\n\t\tconsole.log('Done.');\n\t}\n}\n\nagain(0);\n```\n\nor..\n\n**Parallel:**\n```javascript\nvar files = [... list of files ...];\nvar pending = 0;\nfiles.forEach(function(file, i) {\n\tpending += 1;\n\tfs.readFile(file, function(err, data) {\n\t\t//... do something with data ....\n\t\t\n\t\tpending -= 1;\n\t\tif (pending === 0 && i === files.length -1) {\n\t\t\tconsole.log('Done.');\n\t\t}\n\t});\n});\n```\n\nThat's ugly. For more complicated examples it requires a bit more thinking.\n\nWhy don't I use the wonderful library [async][1]? Well, `async` tries to do way too much. I also suffer from a server case of NIH syndrome. Kidding, or else I'd rewrite Express.js. Or, am I? Muahahhaa. `async` syntax is also very ugly and not CoffeeScript friendly.\n\n\n\n\nInstallation\n------------\n\n    npm install batchflow\n\n\n\nExamples\n--------\n\n### Arrays\n\nLet's rewrite the previous sequential example:\n\n**Sequential:**\n```javascript\nvar batch = require('batchflow');\n\nvar files = [... list of files ...];\nbatch(files).sequential()\n.each(function(i, item, done) {\n\tfs.readFile(item, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(function(results) {\n\t//analyze results\n});\n```\n\nHow about the parallel example?\n\n**Parallel:**\n ```javascript\nvar batch = require('batchflow');\n\nvar files = [... list of files ...];\nbatch(files).parallel()\n.each(function(i, item, done) {\n\tfs.readFile(item, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult); //<---- yes, you must still call done in parallel, this way we can know when to trigger `end()`.\n\t});\n}).end(function(results) {\n\t//analyze results\n});\n```\n\nWhat's that, your data is not stored in an array? Oh, you say it's stored in an object? That's OK too...\n\n### Objects\n\n**Sequential:**\n```javascript\nvar batch = require('batchflow');\n\nvar files = {'file1': 'path'.... 'filen': 'pathn'}\nbatch(files).sequential()\n.each(function(key, val, done) {\n\tfs.readFile(val, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(function(results) {\n\t//analyze results\n});\n```\n\nHow about the parallel example?\n\n**Parallel:**\n ```javascript\nvar batch = require('batchflow');\n\nvar files = {'file1': 'path'.... 'filen': 'pathn'}\nbatch(files).parallel()\n.each(function(key, val, done) {\n\tfs.readFile(val, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(function(results) {\n\t//analyze results\n});\n```\n\n### Misc\n\n1. Is `sequential()` or `parallel()` too long? Fine. `series()` and `seq()` are aliases for `sequential()` and `par()` is an alias for `parallel()`.\n2. You don't like the fluent API? That's OK too:\n\nNon-fluent API BatchFlow\n\n```javascript\nvar batch = require('batchflow');\nvar bf = batch(files);\nbf.isSequential = true;\n\nbf.each(function(i, file, done) {\n\tdone(someResult);\n});\n \nbf.end(function(results) {\n\t//blah blah\n});\n```\n\n### CoffeeScript\n\n```coffee\nbatch = require('batchflow')\nfiles = [... list of files ...]\nbf = batch(files).seq().each (i, file, done) ->\n  fs.readFile file, done\nbf.error (err) ->\n  console.log(err);\nbf.end (results) ->\n  console.log fr.toString() for fr in results\n```\n\n### Error Handling\n\nWhat's that, you want error handling? Well, you might as well call me Burger King... have it your way.\n\n```javascript\nvar a = {'f': '/tmp/file_DOES_NOT_exist_hopefully' + Math.random()};\nbatch(a).parallel().each(function(i, item, done) {\n    fs.readFile(item, done);\n}).error(function(err) {\n    assert(err);\n    done();\n}).end(function() {\n    assert(false); //<--- shouldn't get here\n});\n\n\nvar a = ['/tmp/file_DOES_NOT_exist_hopefully' + Math.random()];\nbatch(a).series().each(function(i, item, done) {\n    throw new Error('err');\n}).error(function(err) {\n    assert(err);\n    done();\n}).end(function() {\n    assert(false); //<--- shouldn't get here\n});\n\n```\n\n\nLicense\n-------\n\n(MIT License)\n\nCopyright 2012, JP  <jprichardson@gmail.com>\n\n\n\n[1]: https://github.com/caolan/async/\n","_id":"batchflow@0.0.2","dist":{"shasum":"3466b0456b5f7dadb39eb8ac5693e629498f53fc","tarball":"http://registry.npmjs.org/batchflow/-/batchflow-0.0.2.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]}},"readme":"Node.js - batchflow\n===================\n\nBatch process collections in parallel or sequentially.\n\n\nWhy?\n----\n\nI really got tired of writing the following patterns over and over again:\n\n**Sequential:**\n```javascript\nvar files = [... list of files ...];\nfunction again(x) {\n\tif (x < files.length) {\n\t\tfs.readFile(files[x], function(err, data) {\n\t\t\t//... do something with data ...\n\t\t\tagain(x + 1);\n\t\t});\n\t} else {\n\t\tconsole.log('Done.');\n\t}\n}\n\nagain(0);\n```\n\nor..\n\n**Parallel:**\n```javascript\nvar files = [... list of files ...];\nvar pending = 0;\nfiles.forEach(function(file, i) {\n\tpending += 1;\n\tfs.readFile(file, function(err, data) {\n\t\t//... do something with data ....\n\t\t\n\t\tpending -= 1;\n\t\tif (pending === 0 && i === files.length -1) {\n\t\t\tconsole.log('Done.');\n\t\t}\n\t});\n});\n```\n\nThat's ugly. For more complicated examples it requires a bit more thinking.\n\nWhy don't I use the wonderful library [async][1]? Well, `async` tries to do way too much. I also suffer from a server case of NIH syndrome. Kidding, or else I'd rewrite Express.js. Or, am I? Muahahhaa. `async` syntax is also very ugly and not CoffeeScript friendly.\n\n\n\n\nInstallation\n------------\n\n    npm install batchflow\n\n\n\nExamples\n--------\n\n### Arrays\n\nLet's rewrite the previous sequential example:\n\n**Sequential:**\n```javascript\nvar batch = require('batchflow');\n\nvar files = [... list of files ...];\nbatch(files).sequential()\n.each(function(i, item, done) {\n\tfs.readFile(item, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(results) {\n\t//analyze results\n});\n```\n\nHow about the parallel example?\n\n**Parallel:**\n ```javascript\nvar batch = require('batchflow');\n\nvar files = [... list of files ...];\nbatch(files).parallel()\n.each(function(i, item, done) {\n\tfs.readFile(item, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult); //<---- yes, you must still call done in parallel, this way we can know when to trigger `end()`.\n\t}\n}).end(results) {\n\t//analyze results\n});\n```\n\nWhat's that, your data is not stored in an array? Oh, you say it's stored in an object? That's OK too...\n\n### Objects\n\n**Sequential:**\n```javascript\nvar batch = require('batchflow');\n\nvar files = {'file1': 'path'.... 'filen': 'pathn'}\nbatch(files).sequential()\n.each(function(key, val, done) {\n\tfs.readFile(val, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(results) {\n\t//analyze results\n});\n```\n\nHow about the parallel example?\n\n**Parallel:**\n ```javascript\nvar batch = require('batchflow');\n\nvar files = {'file1': 'path'.... 'filen': 'pathn'}\nbatch(files).parallel()\n.each(function(key, val, done) {\n\tfs.readFile(val, function(err, data) {\n\t\t//do something with data\n\t\tdone(someResult);\n\t});\n}).end(results) {\n\t//analyze results\n});\n```\n\n### Misc\n\n1. Is `sequential()` or `parallel()` too long? Fine. Type `seq()` or `par()`.\n2. You don't like the fluent API? That's OK too:\n\nNon-fluent API BatchFlow\n```javascript\nvar batch = require('batchflow');\nvar bf = batch(files);\nbf.isSequential = true;\n\nbf.each(function(i, file, done) {\n\tdone(someResult);\n});\n \nbf.end(function(results) {\n\t//blah blah\n});\n\n\n\nLicense\n-------\n\n(MIT License)\n\nCopyright 2012, JP  <jprichardson@gmail.com>\n\n\n\n[1]: https://github.com/caolan/async/\n","maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}],"time":{"modified":"2012-08-14T19:17:07.657Z","created":"2012-08-14T18:14:22.229Z","0.0.1":"2012-08-14T18:14:22.936Z","0.0.2":"2012-08-14T19:17:07.657Z"},"author":{"name":"JP","email":"jprichardson@gmail.com"},"repository":{"type":"git","url":"git@github.com:jprichardson/node-batchflow.git"},"_attachments":{"batchflow-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DKHJAXTJMfmJdWLlAeAzvQ==","length":4216,"stub":true},"batchflow-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lS3Qr75CK/s7mm2qjiwQmA==","length":3549,"stub":true}}}},
{"id":"batchify","key":"batchify","value":{"rev":"3-d9edbb2f980dee5bc030dc1d2e8749c3"},"doc":{"_id":"batchify","_rev":"3-d9edbb2f980dee5bc030dc1d2e8749c3","name":"batchify","description":"","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"batchify","version":"0.0.1","main":"./lib/batchify.coffee","description":"","dependencies":{"coffee-script":">=1.2.0"},"devDependencies":{"mocha":">=0.13.0","should":">=0.5.1"},"engines":{"node":">=0.6.10"},"scripts":{"test":"bin/run_tests"},"_npmUser":{"name":"davidmfoley","email":"davidmfoley@gmail.com"},"_id":"batchify@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0c9c7cff756579e1a827c1d10fd892736ef1c54f","tarball":"http://registry.npmjs.org/batchify/-/batchify-0.0.1.tgz"},"maintainers":[{"name":"davidmfoley","email":"davidmfoley@gmail.com"}]}},"readme":"# Batchify\n\nBatches calls to a particular resource (such as a database or network) so that, rather than making the call multiple times, a single call is made and all callbacks are triggered when it completes.\n\nFor example, let's say that we have the following code:\n\n```coffee\n  users.findAll (users) ->\n    # do something with each user\n```\n\nIf there are many concurrent requests that need to look up all of the users, each one will take time and resources to service.\n\nWith batchify, one request will be used to service all of the concurrent requests:\n```coffee\n  batchedFindAll = Batchify.wrap(users, 'findAll')\n\n  # Now you use batchedFindAll the same as you would the original function:\n  batchedFindAll (users) ->\n```\n\nBatchify invokes users.findAll once and triggers all of the subscribing callbacks when it is finished.\n\nThe wrapped function can have parameters too:\n\n```coffee\n  batchedFindByState = Batchify.wrap(users, 'findByState')\n\n  batchedFindAll 'active', (users) ->\n```\n\n(Batchify uses the parameter values as a hash key, so concurrent calls with different parameters will not conflict)\n\n","maintainers":[{"name":"davidmfoley","email":"davidmfoley@gmail.com"}],"time":{"modified":"2012-06-26T18:04:53.381Z","created":"2012-06-26T18:04:49.949Z","0.0.1":"2012-06-26T18:04:53.381Z"},"_attachments":{"batchify-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-T9Z1tMHkIGo0qZfpRaHB1g==","length":1894,"stub":true}}}},
{"id":"batik","key":"batik","value":{"rev":"7-a19ce28cbbf54649fa225ed5474eff02"},"doc":{"_id":"batik","_rev":"7-a19ce28cbbf54649fa225ed5474eff02","name":"batik","description":"Super Simple CoffeeScript Templating","dist-tags":{"latest":"0.1.2alpha"},"versions":{"0.1.0alpha":{"name":"batik","description":"Super Simple CoffeeScript Templating","version":"0.1.0alpha","author":{"name":"Ahmad Rizqi Meydiarso","email":"rizqi@namaku.de"},"repository":{"type":"git","url":"git://github.com/rizqme/batik.git"},"keywords":["template","view","coffeescript"],"main":"./lib/batik","engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/rizqme/.npm/batik/0.1.0alpha/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"batik@0.1.0alpha","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"cb306bab87d3e19bc2a51f8716a529cc6dccb122","tarball":"http://registry.npmjs.org/batik/-/batik-0.1.0alpha.tgz"},"scripts":{},"maintainers":[{"name":"rizqme","email":"rizqi@namaku.de"}]},"0.1.1alpha":{"name":"batik","description":"Super Simple CoffeeScript Templating","version":"0.1.1alpha","author":{"name":"Ahmad Rizqi Meydiarso","email":"rizqi@namaku.de"},"repository":{"type":"git","url":"git://github.com/rizqme/batik.git"},"keywords":["template","view","coffeescript"],"main":"./lib/batik","engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/rizqme/.npm/batik/0.1.1alpha/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"batik@0.1.1alpha","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"de9fce84c61748e1556255a970b769c5d2ad48b2","tarball":"http://registry.npmjs.org/batik/-/batik-0.1.1alpha.tgz"},"scripts":{},"maintainers":[{"name":"rizqme","email":"rizqi@namaku.de"}]},"0.1.2alpha":{"name":"batik","description":"Super Simple CoffeeScript Templating","version":"0.1.2alpha","author":{"name":"Ahmad Rizqi Meydiarso","email":"rizqi@namaku.de"},"repository":{"type":"git","url":"git://github.com/rizqme/batik.git"},"keywords":["template","view","coffeescript"],"main":"./lib/batik","engines":{"node":">= 0.4.1"},"_npmJsonOpts":{"file":"/Users/rizqme/.npm/batik/0.1.2alpha/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"batik@0.1.2alpha","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"1c8c1c0314cbf41e81fbcd0687b09c884b51a5f8","tarball":"http://registry.npmjs.org/batik/-/batik-0.1.2alpha.tgz"},"scripts":{},"maintainers":[{"name":"rizqme","email":"rizqi@namaku.de"}]}},"maintainers":[{"name":"rizqme","email":"rizqi@namaku.de"}],"time":{"modified":"2011-08-16T15:26:33.562Z","created":"2011-08-16T12:29:54.275Z","0.1.0alpha":"2011-08-16T12:29:55.071Z","0.1.1alpha":"2011-08-16T13:56:28.300Z","0.1.2alpha":"2011-08-16T15:26:33.562Z"},"author":{"name":"Ahmad Rizqi Meydiarso","email":"rizqi@namaku.de"},"repository":{"type":"git","url":"git://github.com/rizqme/batik.git"},"_attachments":{"batik-0.1.2alpha.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-e/x0f8XX1sqXBQP1uwauqg==","length":4500,"stub":true},"batik-0.1.1alpha.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-A0Dbtf0XIVgdt7b52rINVA==","length":3335,"stub":true},"batik-0.1.0alpha.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-J1BSVfy9O051Egw2QM93Pw==","length":2985,"stub":true}}}},
{"id":"batman","key":"batman","value":{"rev":"78-a4a2f54196d516ea69ea01a5dcf2d2dd"},"doc":{"_id":"batman","_rev":"78-a4a2f54196d516ea69ea01a5dcf2d2dd","name":"batman","description":"A client side JavaScript framework that helps you build rich, single-page applications with power and speed.","dist-tags":{"latest":"0.11.2"},"versions":{"0.8.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.8.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"connect":"~1.6.1","coffee-script":"1.1.2"},"engines":{"node":"0.4.x"},"devDependencies":{"daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"0.2.5","qunit":"0.1.5","q":"~>0.6.0","muffin":"0.2.4","uglify-js":"1.1.0","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.8.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"64758d6a1e065d7fd1d2accc3b319ed08960ceab","tarball":"http://registry.npmjs.org/batman/-/batman-0.8.0.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.5.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/Kktusznio"}],"version":"0.5.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"connect":"~1.6.1"},"engines":{"node":"0.4.x"},"devDependencies":{"coffee-script":"~1.1","daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"~0.2.0","qunit":"~0.1.5","q":"~>0.6.0","muffin":"~>0.1.7","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.5.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7990a620b74014208538641ce64de9d862d66a97","tarball":"http://registry.npmjs.org/batman/-/batman-0.5.0.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.5.1":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/Kktusznio"}],"version":"0.5.1","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"coffee-script":"~1.1","connect":"~1.6.1"},"engines":{"node":"0.4.x"},"devDependencies":{"coffee-script":"~1.1","daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"~0.2.0","qunit":"~0.1.5","q":"~>0.6.0","muffin":"~>0.1.7","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.5.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ed72e71e69261f65c37cf090920dbe4264754bbe","tarball":"http://registry.npmjs.org/batman/-/batman-0.5.1.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.6.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.6.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"coffee-script":"~1.1","connect":"~1.6.1"},"engines":{"node":"0.4.x"},"devDependencies":{"coffee-script":"~1.1","daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"~0.2.0","qunit":"0.1.5","q":"~>0.6.0","muffin":"~>0.1.7","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.6.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"870e55be0a1bb7d3640f1e8af0790ae461262f58","tarball":"http://registry.npmjs.org/batman/-/batman-0.6.0.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.6.1":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.6.1","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"coffee-script":"~1.1","connect":"~1.6.1"},"engines":{"node":"0.4.x"},"devDependencies":{"coffee-script":"~1.1","daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"0.2.5","qunit":"0.1.5","q":"~>0.6.0","muffin":"~>0.2.0","uglify-js":"1.0.3","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.6.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e0b9ae254c007de9864ef497d5fc6bb1f01b85c7","tarball":"http://registry.npmjs.org/batman/-/batman-0.6.1.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.7.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.7.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"coffee-script":"~1.1","connect":"~1.6.1"},"engines":{"node":"0.4.x"},"devDependencies":{"coffee-script":"~1.1","daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"0.2.5","qunit":"0.1.5","q":"~>0.6.0","muffin":"0.2.4","uglify-js":"1.1.0","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.7.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c0828b88b158920fb0853a4dc9c27647cd3748a5","tarball":"http://registry.npmjs.org/batman/-/batman-0.7.0.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.7.5":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.7.5","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"cake test","build":"cake build"},"dependencies":{"coffee-script":"~1.1","connect":"~1.6.1"},"engines":{"node":"0.4.x"},"devDependencies":{"coffee-script":"~1.1","daemon":"~0.3.0","docco":"~0.3.0","now":"~0.5","glob":"~2.0","jsdom":"0.2.5","qunit":"0.1.5","q":"~>0.6.0","muffin":"0.2.4","uglify-js":"1.1.0","temp":"~>0.2.0"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.7.5","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5e26125a412269c5add59e32debaf84790f4e028","tarball":"http://registry.npmjs.org/batman/-/batman-0.7.5.tgz"},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"directories":{}},"0.9.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.9.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"./node_modules/.bin/cake test","build":"./node_modules/.bin/cake build"},"dependencies":{"connect":"~1.8.5","coffee-script":"1.1.3"},"devDependencies":{"daemon":"~0.3.0","docco":"~0.3.0","glob":"~>3.0.1","q":"~>0.6.0","muffin":"0.2.7","uglify-js":"1.2.5","temp":"~>0.2.0","qqunit":"0.1.3","percolate":"~> 0.2.4"},"engines":{"node":"0.4.x || 0.6.x"},"batman":{"build":false},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.9.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"9bc996cd0fd3b584f5ceccba3edfefb2bb45955b","tarball":"http://registry.npmjs.org/batman/-/batman-0.9.0.tgz"},"readme":"# batman.js\n\n[batman.js](http://batmanjs.org/) is a framework for building rich single-page browser applications. It is written in [CoffeeScript](http://jashkenas.github.com/coffee-script/) and its API is developed with CoffeeScript in mind, but of course you can use plain old JavaScript too.\n\n#### It's got:\n\n* a stateful MVC architecture\n* a powerful binding system\n* routable controller actions\n* pure HTML views\n* toolchain support built on [node.js](http://nodejs.org) and [cake](http://jashkenas.github.com/coffee-script/#cake)\n\nThe APIs are heavily inspired by [Rails](http://rubyonrails.org/) and designed to make Rails devs feel right at home.\n\nWe're targeting Chrome, Safari 4+, Firefox 3+, and IE 7+ for compatibility, although some of those require you to include [es5shim](https://github.com/kriskowal/es5-shim).\n\n#### Here's some code:\n\n```coffeescript\nclass Shopify extends Batman.App\n  @root 'products#index'\n\n  @resources 'products'\n\nclass Shopify.Product extends Batman.Model\n  @persist Batman.RestStorage\n\nclass Shopify.ProductsController extends Batman.Controller\n  index: ->\n\n  show: (params) ->\n    Shopify.Product.find params.id, (err, product) =>\n      @set('product', product)\n```\n\n#### views/products/index.html\n\n```html\n<ul id=\"products\">\n  <li data-foreach-product=\"Product.all\" data-mixin=\"animation\">\n    <a data-route=\"product\" data-bind=\"product.name\">name will go here</a>\n  </li>\n\n  <li><span data-bind=\"'product' | pluralize products.length\"></span></li>\n</ul>\n```\n\n## Installation\n\nIf you haven't already, you'll need to install [node.js](http://nodejs.org) (0.4.x for now, 0.5.x support forthcoming) and [npm](http://npmjs.org/). Then:\n\n```bash\nnpm install -g batman\n```\n\nGenerate a new batman.js app somewhere, called my_app:\n\n```bash\ncd ~/code\nbatman new my_app\n```\n\nFire it up:\n\n```bash\ncd my_app\nbatman server # (or just \"batman s\")\n```\n\nNow visit [http://localhost:1047](http://localhost:1047) and start playing around!\n\n## The Basics\n\nMost of the classes you work with in your app code will descend from `Batman.Object`, which gives you some nice things that are used extensively by the rest of the system.\n\n### Events\n\nEvents in batman.js are pretty simple. Handling an event is like subscribing to a named channel on a particular object, and firing an event is like publishing an argument list (which might be empty) to all subscribers of that channel.\n\n```coffeescript\nclass BatBelt.Gadget extends Batman.Object\n  constructor: -> @usesRemaining = 5\n  use: (howManyTimes) ->\n    if howManyTimes <= @usesRemaining\n      @usesRemaining -= howManyTimes\n      @fire('use', howManyTimes)\n```\n\nYou can use the `on` method to register handler functions which then get called whenever `fire` is called for the specified event name. The handlers get whichever extra arguments were passed to `fire` after the event name itself:\n\n```coffeescript\ngadget.on 'use', (howManyTimes) ->\n  console.log \"gadget was used #{howManyTimes} times!\"\ngadget.use(2)\n# console output: \"gadget was used 2 times!\"\n```\n\n### Properties\n\nThe `observe` function is used to observe changes to properties. This forms the basis of the binding system. Here's a simple example:\n\n```coffeescript\ngadget.observe 'name', (newVal, oldVal) ->\n  console.log \"name changed from #{oldVal} to #{newVal}!\"\ngadget.set 'name', 'Batarang'\n# console output: \"name changed from undefined to Batarang!\"\n```\n\nWhen you `observe` a property, you are really just handling its \"change\" event, which happens to get fired with the new and old values.\n\nOf course you can also `get` properties to return their values, and if you want to remove them completely then you can `unset` them:\n\n```coffeescript\ngadget.get 'name'\n# returns: 'Batarang'\ngadget.unset 'name'\n# console output: \"name changed from Batarang to undefined!\"\n```\n\nBy default, these properties are stored like plain old JavaScript properties: that is, `gadget.name` would return \"Batarang\" just like you'd expect. But if you set the gadget's name with `gadget.name = 'Shark Spray'`, then the observer function you set on `gadget` will not fire. So when you're working with batman.js properties, use `get`/`set`/`unset` to read/write/delete them.\n\n\n### Custom Accessors\n\nWhat's the point of using `gadget.get 'name'` instead of just `gadget.name`? Well, batman.js properties don't always correspond with vanilla JS properties. Let's write a `Box` class with a custom getter for its volume:\n\n```coffeescript\nclass Box extends Batman.Object\n  constructor: (@length, @width, @height) ->\n  @accessor 'volume',\n    get: (key) -> @get('length') * @get('width') * @get('height')\n\nbox = new Box(16,16,12)\nbox.get 'volume'\n# returns 3072\n```\n\nThe really cool thing about this is that, because we used `@get` to access the component properties of `volume`, batman.js can keep track of those dependencies and let us observe the `volume` directly:\n\n```coffeescript\nbox.observe 'volume', (newVal, oldVal) ->\n  console.log \"volume changed from #{oldVal} to #{newVal}!\"\nbox.set 'height', 6\n# console output: \"volume changed from 3072 to 1536!\"\n```\n\nThe box's `volume` is a read-only attribute here, because we only provided a getter in the accessor we defined. Here's a `Person` class with a (rather naive) read-write accessor for their name:\n\n```coffeescript\nclass Person extends Batman.Object\n  constructor: (name) -> @set 'name', name\n  @accessor 'name',\n    get: (key) -> [@get('firstName'), @get('lastName')].join(' ')\n    set: (key, val) ->\n      [first, last] = val.split(' ')\n      @set 'firstName', first\n      @set 'lastName', last\n    unset: (key) ->\n      @unset 'firstName'\n      @unset 'lastName'\n```\n\n### Keypaths\n\nIf you want to get at properties of properties, use keypaths:\n\n```coffeescript\nemployee.get 'team.manager.name'\n```\n\nThis does what you expect and is pretty much the same as `employee.get('team').get('manager').get('name')`. If you want to observe a deep keypath for changes, go ahead:\n\n```coffeescript\nemployee.observe 'team.manager.name', (newVal, oldVal) ->\n  console.log \"you now answer to #{newVal || 'nobody'}!\"\nmanager = employee.get 'team.manager'\nmanager.set 'name', 'Bill'\n# console output: \"you now answer to Bill!\"\n```\n\nIf any component of the keypath is set to something that would change the overall value, then observers will fire:\n\n```coffeescript\nemployee.set 'team', larrysTeam\n# console output: \"you now answer to Larry!\"\nemployee.team.unset 'manager'\n# console output: \"you now answer to nobody!\"\nemployee.set 'team', jessicasTeam\n# console output: \"you now answer to Jessica!\"\n```\n\nbatman.js's dependency tracking system makes sure that no matter how weird your object graph gets, your observers will fire exactly when they should.\n\n## Architecture\n\nThe MVC architecture of batman.js fits together like this:\n\n* Controllers are persistent objects which render the views and give them mediated access to the model layer.\n* Views are written in pure HTML, and use `data-*` attributes to create bindings with model data and event handlers exposed by the controllers.\n* Models have validations, lifecycle events, a built-in identity map, and can use arbitrary storage backends (`Batman.LocalStorage`, `Batman.RestStorage`, and `Batman.RailsStorage` are included).\n\nA batman.js application is served up in one page load, followed by asynchronous requests for various resources as the user interacts with the app. Navigation within the app uses [pushState](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries) where supported, otherwise falling back to [hash-bang fragment identifers](http://www.w3.org/QA/2011/05/hash_uris.html).\n\n\n### The App Class\n\nSitting in front of everything else is a subclass of `Batman.App` which represents your application as a whole and acts as a namespace for your other app classes. The app class never gets instantiated; your main interactions with it are using macros in its class definition, and calling `run()` on it when it's time to fire up your app.\n\nHere's a simple app class:\n\n```coffeescript\nclass BatBelt extends Batman.App\n  @controller 'app', 'gadgets'\n  @model 'gadget'\n\n  @root 'app#index'\n  @route 'faq/:questionID', 'app#faq'\n  @resources 'gadgets'\n```\n\nThe calls to `@controller` and `@model` load external app classes with XHRs. For the controllers, this ends up fetching `/controllers/app_controller.coffee` and `/controllers/gadgets_controller.coffee`. The gadget model gets loaded from `/models/gadget.coffee`.\n\n#### Routes\n\nRoutes are defined in a few different ways.\n\n`@route` takes two strings, one representing a path pattern and the other representing a controller action. In the above example, `'faq/:questionID'` matches any path starting with \"/faq/\" and having one other segment. That segment is then passed as a named param to the controller action function specified by the second string argument.\n\nFor the FAQ route, `'app#faq'` specifies the `faq` function on `BatBelt.AppController`, which should take a `params` argument and do something sensible with `params.questionID`.\n\n`@root 'app#index'` is just a shorthand for `@route '/', 'app#index'`.\n\nThe `@resources` macro takes a resource name which should ideally be the underscored-pluralized name of one of your models. It sets up three routes, as if you'd used the `@route` macro like so:\n\n```coffeescript\n@route 'gadgets', 'gadgets#index'\n@route 'gadgets/new', 'gadgets#new'\n@route 'gadgets/:id', 'gadgets#show'\n@route 'gadgets/:id/edit', 'gadgets#edit'\n```\n\n`@resources` can also take an array of labels to set up routing for multiple models at once:\n\n```coffeescript\n@resources ['stores', 'products', 'customers']\n```\n\nIn addition to setting up these routes, the call to `@resources` keeps track of the fact that the `Gadget` model can be accessed in these ways. This lets you load these routes in your controllers or views by using model instances and classes on their own:\n\n```coffeescript\nclass BatBelt.GadgetsController extends Batman.Controller\n  someEventHandler: (node, event) ->\n    BatBelt.Gadget.find 1, (err, gadget) =>\n      @redirect gadget unless err? # redirects to \"/gadgets/1\"\n  someOtherHandler: (node, event) ->\n    @redirect BatBelt.Gadget # redirects to \"/gadgets\"\n```\n\n### Controllers\n\nbatman.js controllers are singleton classes with one or more instance methods that can serve as routable actions. Because they're singletons, instance variables persist as long as the app is running.\n\n```coffeescript\nclass BatBelt.AppController extends Batman.Controller\n  index: ->\n  faq: (params) ->\n    @set('question', @get('questions').get(params.questionID)\n```\n\nNow when you navigate to `/#!/faq/what-is-art`, the dispatcher runs this `faq` action with `{questionID: \"what-is-art\"}`. It also makes an implicit call to `@render`, which by default will look for a view at `/views/app/faq.html`. The view is rendered within the main content container of the page, which is designated by setting `data-yield=\"main\"` on some tag in the layout's HTML. You can prevent this implicit rendering by calling `@render false` in your action.\n\nControllers are also a fine place to put event handlers used by your views. Here's one that uses [jQuery](http://jquery.com/) to toggle a CSS class on a button:\n\n```coffeescript\nclass MyApp.BigRedButtonController extends Batman.Controller\n  index: ->\n\n  buttonWasClicked: (node, event) ->\n    $(node).toggleClass('activated')\n```\n\nIf you want to redirect to some route, you can use `@redirect`:\n\n```coffeescript\nbuttonWasClicked: (node, event) ->\n  $(node).toggleClass('activated')\n  @redirect '/apocalypse/'\n```\n\n### Views\n\nYou write views in plain HTML. These aren't templates in the usual sense: the HTML is rendered in the page as-is, and you use `data-*` attributes to specify how different parts of the view bind to your app's data. Here's a very small view which displays a user's name and avatar:\n\n```html\n<div class=\"user\">\n  <img data-bind-src=\"user.avatarURL\" />\n  <p data-bind=\"user.name\"></p>\n</div>\n```\n\nThe `data-bind` attribute on the `<p>` tag sets up a binding between the user's `name` property and the content of the tag. The `data-bind-src` attribute on the `<img>` tag binds the user's `avatarURL` property to the `src` attribute of the tag. You can do the same thing for arbitrary attribute names, so for example `data-bind-href` would bind to the `href` attribute.\n\nbatman.js uses a bunch of these data attributes for different things:\n\n#### Binding properties\n\n* `data-bind=\"foo.bar\"`: for most tags, this defines a one-way binding with the contents of the node: when the given property `foo.bar` changes, the contents of the node are set to that value. When `data-bind` is set on a form input tag, a _two-way_ binding is defined with the _value_ of the node, such that any changes from the user will update the property in realtime.\n\n* `data-bind-foo=\"bar.baz\"`: defines a one-way binding from the given property `bar.baz` to any attribute `foo` on the node.\n\n* `data-foreach-bar=\"foo.bars\"`: used to render a collection of zero or more items. If the collection descends from `Batman.Set`, then the DOM will be updated when items are added or removed.\n\n#### Handling DOM events\n\n* `data-event-click=\"foo.bar\"`: when this node is clicked, the function specified by the keypath `foo.bar` is called with the node object as the first argument, and the click event as the second argument.\n\n* `data-event-change=\"foo.bar\"`: like `data-event-click`, but fires on change events.\n\n* `data-event-submit=\"foo.bar\"`: like `data-event-click`, but fires either when a form is submitted (in the case of `<form>` nodes) or when a user hits the enter key when an `<input>` or `<textarea>` has focus.\n\n#### Managing contexts\n\n* `data-context=\"foo.bar\"`: pushes a new context onto the context stack for children of this node. If the context is `foo.bar`, then children of this node may access properties on `foo.bar` directly, as if they were properties of the controller.\n\n#### Rendering Views\n\n* `data-yield=\"identifier\"`: used in your layout to specify the locations that other views get rendered into when they are rendered. By default, a controller action renders each whole view into whichever node is set up to yield `\"main\"`. If you want some content in a view to be rendered into a different `data-yield` node, you can use `data-contentfor`.\n\n* `data-contentfor=\"identifier\"`: when the view is rendered into your layout, the contents of this node will be rendered into whichever node has `data-yield=\"identifier\"`. For example, if your layout has `\"main\"` and `\"sidebar\"` yields, then you may put a `data-contentfor=\"sidebar\"` node in a view and it will be rendered in the sidebar instead of the main content area. If multiple `data-contentfor` nodes with the same identifier are present in a view, their contents will be concatenated in the corresponding `data-yield` node.\n\n* `data-partial=\"shared/sidebar\"`: renders the view at the path `/views/shared/sidebar.html` within this node. Note that `/views/` is prepended.\n\n* `data-route=\"/some/path\"` or `data-route=\"some.model\"`: loads a route when this node is clicked. The route can either be specified by a path beginning with a slash \"/\", or by a property leading to either a model instance (resulting in a resource's \"show\" action) or a model class (for the resource's \"index\" action).\n\n\n### Models\n\nbatman.js models:\n\n* can persist to various storage backends\n* only serialize a defined subset of their properties as JSON\n* use a state machine to expose lifecycle events\n* can validate with synchronous or asynchronous operations\n\n#### Attributes\n\nA model object may have arbitrary properties set on it, just like any JS object. Only some of those properties are serialized and persisted to its storage backends, however. You define persisted attributes on a model with the `encode` macro:\n\n```coffeescript\n  class Article extends Batman.Model\n    @encode 'body_html', 'title', 'author', 'summary_html', 'blog_id', 'id', 'user_id'\n    @encode 'created_at', 'updated_at', 'published_at', Batman.Encoders.railsDate\n    @encode 'tags',\n      encode: (tagSet) -> tagSet.toArray().join(', ')\n      decode: (tagString) -> new Batman.Set(tagString.split(', ')...)\n```\n\nGiven one or more strings as arguments, `@encode` will register these properties as persisted attributes of the model, to be serialized in the model's `toJSON()` output and extracted in its `fromJSON()`. Properties that aren't specified with `@encode` will be ignored for both serialization and deserialization. If an optional coder object is provided as the last argument, its `encode` and `decode` functions will be used by the model for serialization and deserialization, respectively.\n\nBy default, a model's primary key (the unchanging property which uniquely indexes its instances) is its `id` property. If you want your model to have a different primary key, specify the name of the key on the `primaryKey` class property:\n\n```coffeescript\nclass User extends Batman.Model\n  @primaryKey: 'handle'\n  @encode 'handle', 'email'\n```\n\n#### States\n\n* `empty`: a new model instance remains in this state until some persisted attribute is set on it.\n* `loading`: entered when the model instance's `load()` method is called.\n* `loaded`: entered after the model's storage adapter has completed loading updated attributes for the instance. Immediately transitions to the `clean` state.\n* `dirty`: entered when one of the model's persisted attributes changes.\n* `validating`: entered when the validation process has started.\n* `validated`: entered when the validation process has completed. Immediately after entering this state, the model instance transitions back to either the `dirty` or `clean` state.\n* `saving`: entered when the storage adapter has begun saving the model.\n* `saved`: entered after the model's storage adapter has completed saving the model. Immediately transitions to the `clean` state.\n* `clean`: indicates that none of an instance's attributes have been changed since the model was `saved` or `loaded`.\n* `destroying`: entered when the model instance's `destroy()` method is called.\n* `destroyed`: indicates that the storage adapter has completed destroying this instance.\n\n#### Validation\n\nBefore models are saved to persistent storage, they run through any validations you've defined and the save is cancelled if any errors were added to the model during that process.\n\nValidations are defined with the `@validate` macro by passing it the properties to be validated and an options object representing the particular validations to perform:\n\n```coffeescript\nclass User extends Batman.Model\n  @encode 'login', 'password'\n  @validate 'login', presence: yes, maxLength: 16\n  @validate 'password', 'passwordConfirmation', presence: yes, lengthWithin: [6,255]\n```\n\nThe options get their meaning from subclasses of `Batman.Validator` which have been registered by adding them to the `Batman.Validators` array. For example, the `maxLength` and `lengthWithin` options are used by `Batman.LengthValidator`.\n\n\n#### Persistence\n\nTo specify a storage adapter for persisting a model, use the `@persist` macro in its class definition:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.LocalStorage\n```\n\nNow when you call `save()` or `load()` on a product, it will use the browser window's [localStorage](https://developer.mozilla.org/en/dom/storage) to retrieve or store the serialized data.\n\nIf you have a REST backend you want to connect to, `Batman.RestStorage` is a simple storage adapter which can be subclassed and extended to suit your needs. By default, it will assume your CamelCased-singular `Product` model is accessible at the underscored-pluralized \"/products\" path, with instances of the resource accessible at `/products/:id`. You can override these path defaults by assigning either a string or a function-returning-a-string to the `url` property of your model class (for the collection path) or to the prototype (for the member path). For example:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.RestStorage\n  @url = \"/admin/products\"\n  url: -> \"/admin/products/#{@id}\"\n```\n\n#### Associations\n\nBatman models support `belongsTo`, `hasOne`, and `hasMany` associations. Here's a simple example:\n\n```coffeescript\nclass App.Store extends Batman.Model\n  @hasMany 'products', options\n\nclass App.Product extends Batman.Model\n  @belongsTo 'store', options\n```\n\nThe following options are available:\n\n*  _namespace_: Tells Batman to look for the associated model under the provided namespace. (Defaults to `Batman.currentApp`.)\n*  _name_: Tells Batman to use the given model name instead. (Defaults to an interpretation of the association's label.)\n*  _saveInline_: Tells Batman whether to encode associations as inline JSON when the base model is saved. (Defaults to `false` for `belongsTo`, and `true` for `hasOne` and `hasMany`.)\n*  _autoload_: Tells Batman whether to make a request to the server the first time the association is `get`ted. Defaults to true.\n\nAssociations can be loaded via foreign keys or inline JSON:\n\n```coffeescript\nlocalStorage =\n  stores1:\n    id: 1\n    name: \"JSON Store\"\n    product: {id: 1, store_id: 1, name: \"JSON Product\"}\n\n  stores2:\n    id: 2\n    name: \"Foreign Key Store\"\n  products3:\n    id: 3\n    store_id: 2\n    name: \"Foreign Key Product Product\"\n```\n\nAssociation saving is done inline:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nproduct1 = new Product name: \"Foo\"\nproduct2 = new Product name: \"Bar\"\n\nstore.set 'products', new Batman.Set(product1, product2)\nstore.save (error, record) ->\n  throw error if error\n  console.log localStorage[\"stores#{record.get('id')}\"]\n  # => {\n  #   id: ...\n  #   name: \"Angry Birds\"\n  #   products: [{name: \"Foo\", store_id: ...}, {name: \"Bar\", store_id: ...}]\n  # }\n```\n\n(Notice that the products did not receive IDs. This is because association saving is non-cascading, meaning that each model needs to be saved individually to fully persist. You can always call `toJSON` on a model instance to see what will be stored.)\n\nAssociations also support reloading and loaded introspection:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nstore.get('products.loaded') #=> false\nstore.get('products').load (err, products) ->\n  throw err if err\n  store.get('products.loaded') #=> true\n```\n\nAssociations can be rendered via keypaths, using the same labels you use to create the association:\n\n```html\n<div data-foreach-product=\"store.products\" data-bind=\"product.name\"></div>\n```\n\n# Contributing\n\n[![Build Status](https://secure.travis-ci.org/Shopify/batman.png)](http://travis-ci.org/Shopify/batman)\n\nWell-tested contributions are always welcome! Here's what you should do:\n\n#### 1. Clone the repo\n\n```bash\ngit clone https://github.com/Shopify/batman.git\n```\n\n#### 2. Run the tests\n\nYou can test batman.js locally either on the command line or in the browser and both should work. Tests are written in Coffeescript using [QUnit](http://docs.jquery.com/QUnit#API_documentation).\n\nTo run on the command line, run the following command from the project root:\n\n```bash\ncake test\n```\n\nTo run in the browser, start a web server to serve up the tests:\n\n```bash\nbatman server\n```\n\n...then visit `http://localhost:1047/tests/batman/test.html`.\n\n#### 3. Write some test-driven code\n\nThe tests are in `tests/batman`. You'll need to source any new test files in `tests/batman/test.html`.\n\n#### 4. Create a pull request\n\nIf it's good code that fits with the goals of the project, we'll merge it in!\n\n# License\n\nbatman.js is copyright 2011 by [Shopify](http://www.shopify.com), released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}]},"0.10.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.10.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/dist/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"./node_modules/.bin/cake test","build":"./node_modules/.bin/cake build"},"dependencies":{"connect":"~>1.8.5 || ~>2.2.1","coffee-script":"~>1.3.2"},"devDependencies":{"daemon":"~>0.3.0","docco":"~>0.3.0","glob":"~>3.0.1","q":"~>0.8.0","muffin":"~>0.5.0","uglify-js":"1.2.5","temp":"~>0.2.0","qqunit":"~>0.3.0","percolate":"~>0.3.0","connect-assets":"~>2.2.0","liquor":"~>0.0.0"},"engines":{"node":"~>0.6.0 || ~>0.7.0"},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.10.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"cbf043154e73ac3614e67e8175e901ff29515280","tarball":"http://registry.npmjs.org/batman/-/batman-0.10.0.tgz"},"readme":"# batman.js\n\n[batman.js](http://batmanjs.org/) is a framework for building rich single-page browser applications. It is written in [CoffeeScript](http://jashkenas.github.com/coffee-script/) and its API is developed with CoffeeScript in mind, but of course you can use plain old JavaScript too.\n\n#### It's got:\n\n* a stateful MVC architecture\n* a powerful binding system\n* routable controller actions\n* pure HTML views\n* toolchain support built on [node.js](http://nodejs.org) and [cake](http://jashkenas.github.com/coffee-script/#cake)\n\nThe APIs are heavily inspired by [Rails](http://rubyonrails.org/) and designed to make Rails devs feel right at home.\n\nWe're targeting Chrome, Safari 4+, Firefox 3+, and IE 7+ for compatibility, although some of those require you to include [es5shim](https://github.com/kriskowal/es5-shim).\n\n#### Here's some code:\n\n```coffeescript\nclass Shopify extends Batman.App\n  @root 'products#index'\n\n  @resources 'products'\n\nclass Shopify.Product extends Batman.Model\n  @persist Batman.RestStorage\n\nclass Shopify.ProductsController extends Batman.Controller\n  index: ->\n\n  show: (params) ->\n    Shopify.Product.find params.id, (err, product) =>\n      @set('product', product)\n```\n\n#### views/products/index.html\n\n```html\n<ul id=\"products\">\n  <li data-foreach-product=\"Product.all\" data-mixin=\"animation\">\n    <a data-route=\"product\" data-bind=\"product.name\">name will go here</a>\n  </li>\n\n  <li><span data-bind=\"'product' | pluralize products.length\"></span></li>\n</ul>\n```\n\n## Installation\n\nIf you haven't already, you'll need to install [node.js](http://nodejs.org) (0.4.x for now, 0.5.x support forthcoming) and [npm](http://npmjs.org/). Then:\n\n```bash\nnpm install -g batman\n```\n\nGenerate a new batman.js app somewhere, called my_app:\n\n```bash\ncd ~/code\nbatman new my_app\n```\n\nFire it up:\n\n```bash\ncd my_app\nbatman server # (or just \"batman s\")\n```\n\nNow visit [http://localhost:1047](http://localhost:1047) and start playing around!\n\n## The Basics\n\nMost of the classes you work with in your app code will descend from `Batman.Object`, which gives you some nice things that are used extensively by the rest of the system.\n\n### Events\n\nEvents in batman.js are pretty simple. Handling an event is like subscribing to a named channel on a particular object, and firing an event is like publishing an argument list (which might be empty) to all subscribers of that channel.\n\n```coffeescript\nclass BatBelt.Gadget extends Batman.Object\n  constructor: -> @usesRemaining = 5\n  use: (howManyTimes) ->\n    if howManyTimes <= @usesRemaining\n      @usesRemaining -= howManyTimes\n      @fire('use', howManyTimes)\n```\n\nYou can use the `on` method to register handler functions which then get called whenever `fire` is called for the specified event name. The handlers get whichever extra arguments were passed to `fire` after the event name itself:\n\n```coffeescript\ngadget.on 'use', (howManyTimes) ->\n  console.log \"gadget was used #{howManyTimes} times!\"\ngadget.use(2)\n# console output: \"gadget was used 2 times!\"\n```\n\n### Properties\n\nThe `observe` function is used to observe changes to properties. This forms the basis of the binding system. Here's a simple example:\n\n```coffeescript\ngadget.observe 'name', (newVal, oldVal) ->\n  console.log \"name changed from #{oldVal} to #{newVal}!\"\ngadget.set 'name', 'Batarang'\n# console output: \"name changed from undefined to Batarang!\"\n```\n\nWhen you `observe` a property, you are really just handling its \"change\" event, which happens to get fired with the new and old values.\n\nOf course you can also `get` properties to return their values, and if you want to remove them completely then you can `unset` them:\n\n```coffeescript\ngadget.get 'name'\n# returns: 'Batarang'\ngadget.unset 'name'\n# console output: \"name changed from Batarang to undefined!\"\n```\n\nBy default, these properties are stored like plain old JavaScript properties: that is, `gadget.name` would return \"Batarang\" just like you'd expect. But if you set the gadget's name with `gadget.name = 'Shark Spray'`, then the observer function you set on `gadget` will not fire. So when you're working with batman.js properties, use `get`/`set`/`unset` to read/write/delete them.\n\n\n### Custom Accessors\n\nWhat's the point of using `gadget.get 'name'` instead of just `gadget.name`? Well, batman.js properties don't always correspond with vanilla JS properties. Let's write a `Box` class with a custom getter for its volume:\n\n```coffeescript\nclass Box extends Batman.Object\n  constructor: (@length, @width, @height) ->\n  @accessor 'volume',\n    get: (key) -> @get('length') * @get('width') * @get('height')\n\nbox = new Box(16,16,12)\nbox.get 'volume'\n# returns 3072\n```\n\nThe really cool thing about this is that, because we used `@get` to access the component properties of `volume`, batman.js can keep track of those dependencies and let us observe the `volume` directly:\n\n```coffeescript\nbox.observe 'volume', (newVal, oldVal) ->\n  console.log \"volume changed from #{oldVal} to #{newVal}!\"\nbox.set 'height', 6\n# console output: \"volume changed from 3072 to 1536!\"\n```\n\nThe box's `volume` is a read-only attribute here, because we only provided a getter in the accessor we defined. Here's a `Person` class with a (rather naive) read-write accessor for their name:\n\n```coffeescript\nclass Person extends Batman.Object\n  constructor: (name) -> @set 'name', name\n  @accessor 'name',\n    get: (key) -> [@get('firstName'), @get('lastName')].join(' ')\n    set: (key, val) ->\n      [first, last] = val.split(' ')\n      @set 'firstName', first\n      @set 'lastName', last\n    unset: (key) ->\n      @unset 'firstName'\n      @unset 'lastName'\n```\n\n### Keypaths\n\nIf you want to get at properties of properties, use keypaths:\n\n```coffeescript\nemployee.get 'team.manager.name'\n```\n\nThis does what you expect and is pretty much the same as `employee.get('team').get('manager').get('name')`. If you want to observe a deep keypath for changes, go ahead:\n\n```coffeescript\nemployee.observe 'team.manager.name', (newVal, oldVal) ->\n  console.log \"you now answer to #{newVal || 'nobody'}!\"\nmanager = employee.get 'team.manager'\nmanager.set 'name', 'Bill'\n# console output: \"you now answer to Bill!\"\n```\n\nIf any component of the keypath is set to something that would change the overall value, then observers will fire:\n\n```coffeescript\nemployee.set 'team', larrysTeam\n# console output: \"you now answer to Larry!\"\nemployee.team.unset 'manager'\n# console output: \"you now answer to nobody!\"\nemployee.set 'team', jessicasTeam\n# console output: \"you now answer to Jessica!\"\n```\n\nbatman.js's dependency tracking system makes sure that no matter how weird your object graph gets, your observers will fire exactly when they should.\n\n## Architecture\n\nThe MVC architecture of batman.js fits together like this:\n\n* Controllers are persistent objects which render the views and give them mediated access to the model layer.\n* Views are written in pure HTML, and use `data-*` attributes to create bindings with model data and event handlers exposed by the controllers.\n* Models have validations, lifecycle events, a built-in identity map, and can use arbitrary storage backends (`Batman.LocalStorage`, `Batman.RestStorage`, and `Batman.RailsStorage` are included).\n\nA batman.js application is served up in one page load, followed by asynchronous requests for various resources as the user interacts with the app. Navigation within the app uses [pushState](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries) where supported, otherwise falling back to [hash-bang fragment identifers](http://www.w3.org/QA/2011/05/hash_uris.html).\n\n\n### The App Class\n\nSitting in front of everything else is a subclass of `Batman.App` which represents your application as a whole and acts as a namespace for your other app classes. The app class never gets instantiated; your main interactions with it are using macros in its class definition, and calling `run()` on it when it's time to fire up your app.\n\nHere's a simple app class:\n\n```coffeescript\nclass BatBelt extends Batman.App\n  @controller 'app', 'gadgets'\n  @model 'gadget'\n\n  @root 'app#index'\n  @route 'faq/:questionID', 'app#faq'\n  @resources 'gadgets'\n```\n\nThe calls to `@controller` and `@model` load external app classes with XHRs. For the controllers, this ends up fetching `/controllers/app_controller.coffee` and `/controllers/gadgets_controller.coffee`. The gadget model gets loaded from `/models/gadget.coffee`.\n\n#### Routes\n\nRoutes are defined in a few different ways.\n\n`@route` takes two strings, one representing a path pattern and the other representing a controller action. In the above example, `'faq/:questionID'` matches any path starting with \"/faq/\" and having one other segment. That segment is then passed as a named param to the controller action function specified by the second string argument.\n\nFor the FAQ route, `'app#faq'` specifies the `faq` function on `BatBelt.AppController`, which should take a `params` argument and do something sensible with `params.questionID`.\n\n`@root 'app#index'` is just a shorthand for `@route '/', 'app#index'`.\n\nThe `@resources` macro takes a resource name which should ideally be the underscored-pluralized name of one of your models. It sets up three routes, as if you'd used the `@route` macro like so:\n\n```coffeescript\n@route 'gadgets', 'gadgets#index'\n@route 'gadgets/new', 'gadgets#new'\n@route 'gadgets/:id', 'gadgets#show'\n@route 'gadgets/:id/edit', 'gadgets#edit'\n```\n\n`@resources` can also take an array of labels to set up routing for multiple models at once:\n\n```coffeescript\n@resources ['stores', 'products', 'customers']\n```\n\nIn addition to setting up these routes, the call to `@resources` keeps track of the fact that the `Gadget` model can be accessed in these ways. This lets you load these routes in your controllers or views by using model instances and classes on their own:\n\n```coffeescript\nclass BatBelt.GadgetsController extends Batman.Controller\n  someEventHandler: (node, event) ->\n    BatBelt.Gadget.find 1, (err, gadget) =>\n      @redirect gadget unless err? # redirects to \"/gadgets/1\"\n  someOtherHandler: (node, event) ->\n    @redirect BatBelt.Gadget # redirects to \"/gadgets\"\n```\n\n### Controllers\n\nbatman.js controllers are singleton classes with one or more instance methods that can serve as routable actions. Because they're singletons, instance variables persist as long as the app is running.\n\n```coffeescript\nclass BatBelt.AppController extends Batman.Controller\n  index: ->\n  faq: (params) ->\n    @set('question', @get('questions').get(params.questionID)\n```\n\nNow when you navigate to `/#!/faq/what-is-art`, the dispatcher runs this `faq` action with `{questionID: \"what-is-art\"}`. It also makes an implicit call to `@render`, which by default will look for a view at `/views/app/faq.html`. The view is rendered within the main content container of the page, which is designated by setting `data-yield=\"main\"` on some tag in the layout's HTML. You can prevent this implicit rendering by calling `@render false` in your action.\n\nControllers are also a fine place to put event handlers used by your views. Here's one that uses [jQuery](http://jquery.com/) to toggle a CSS class on a button:\n\n```coffeescript\nclass MyApp.BigRedButtonController extends Batman.Controller\n  index: ->\n\n  buttonWasClicked: (node, event) ->\n    $(node).toggleClass('activated')\n```\n\nIf you want to redirect to some route, you can use `@redirect`:\n\n```coffeescript\nbuttonWasClicked: (node, event) ->\n  $(node).toggleClass('activated')\n  @redirect '/apocalypse/'\n```\n\n### Views\n\nYou write views in plain HTML. These aren't templates in the usual sense: the HTML is rendered in the page as-is, and you use `data-*` attributes to specify how different parts of the view bind to your app's data. Here's a very small view which displays a user's name and avatar:\n\n```html\n<div class=\"user\">\n  <img data-bind-src=\"user.avatarURL\" />\n  <p data-bind=\"user.name\"></p>\n</div>\n```\n\nThe `data-bind` attribute on the `<p>` tag sets up a binding between the user's `name` property and the content of the tag. The `data-bind-src` attribute on the `<img>` tag binds the user's `avatarURL` property to the `src` attribute of the tag. You can do the same thing for arbitrary attribute names, so for example `data-bind-href` would bind to the `href` attribute.\n\nbatman.js uses a bunch of these data attributes for different things:\n\n#### Binding properties\n\n* `data-bind=\"foo.bar\"`: for most tags, this defines a one-way binding with the contents of the node: when the given property `foo.bar` changes, the contents of the node are set to that value. When `data-bind` is set on a form input tag, a _two-way_ binding is defined with the _value_ of the node, such that any changes from the user will update the property in realtime.\n\n* `data-bind-foo=\"bar.baz\"`: defines a one-way binding from the given property `bar.baz` to any attribute `foo` on the node.\n\n* `data-foreach-bar=\"foo.bars\"`: used to render a collection of zero or more items. If the collection descends from `Batman.Set`, then the DOM will be updated when items are added or removed.\n\n#### Handling DOM events\n\n* `data-event-click=\"foo.bar\"`: when this node is clicked, the function specified by the keypath `foo.bar` is called with the node object as the first argument, and the click event as the second argument.\n\n* `data-event-change=\"foo.bar\"`: like `data-event-click`, but fires on change events.\n\n* `data-event-submit=\"foo.bar\"`: like `data-event-click`, but fires either when a form is submitted (in the case of `<form>` nodes) or when a user hits the enter key when an `<input>` or `<textarea>` has focus.\n\n#### Managing contexts\n\n* `data-context=\"foo.bar\"`: pushes a new context onto the context stack for children of this node. If the context is `foo.bar`, then children of this node may access properties on `foo.bar` directly, as if they were properties of the controller.\n\n#### Rendering Views\n\n* `data-yield=\"identifier\"`: used in your layout to specify the locations that other views get rendered into when they are rendered. By default, a controller action renders each whole view into whichever node is set up to yield `\"main\"`. If you want some content in a view to be rendered into a different `data-yield` node, you can use `data-contentfor`.\n\n* `data-contentfor=\"identifier\"`: when the view is rendered into your layout, the contents of this node will be rendered into whichever node has `data-yield=\"identifier\"`. For example, if your layout has `\"main\"` and `\"sidebar\"` yields, then you may put a `data-contentfor=\"sidebar\"` node in a view and it will be rendered in the sidebar instead of the main content area. If multiple `data-contentfor` nodes with the same identifier are present in a view, their contents will be concatenated in the corresponding `data-yield` node.\n\n* `data-partial=\"shared/sidebar\"`: renders the view at the path `/views/shared/sidebar.html` within this node. Note that `/views/` is prepended.\n\n* `data-route=\"/some/path\"` or `data-route=\"some.model\"`: loads a route when this node is clicked. The route can either be specified by a path beginning with a slash \"/\", or by a property leading to either a model instance (resulting in a resource's \"show\" action) or a model class (for the resource's \"index\" action).\n\n\n### Models\n\nbatman.js models:\n\n* can persist to various storage backends\n* only serialize a defined subset of their properties as JSON\n* use a state machine to expose lifecycle events\n* can validate with synchronous or asynchronous operations\n\n#### Attributes\n\nA model object may have arbitrary properties set on it, just like any JS object. Only some of those properties are serialized and persisted to its storage backends, however. You define persisted attributes on a model with the `encode` macro:\n\n```coffeescript\n  class Article extends Batman.Model\n    @encode 'body_html', 'title', 'author', 'summary_html', 'blog_id', 'id', 'user_id'\n    @encode 'created_at', 'updated_at', 'published_at', Batman.Encoders.railsDate\n    @encode 'tags',\n      encode: (tagSet) -> tagSet.toArray().join(', ')\n      decode: (tagString) -> new Batman.Set(tagString.split(', ')...)\n```\n\nGiven one or more strings as arguments, `@encode` will register these properties as persisted attributes of the model, to be serialized in the model's `toJSON()` output and extracted in its `fromJSON()`. Properties that aren't specified with `@encode` will be ignored for both serialization and deserialization. If an optional coder object is provided as the last argument, its `encode` and `decode` functions will be used by the model for serialization and deserialization, respectively.\n\nBy default, a model's primary key (the unchanging property which uniquely indexes its instances) is its `id` property. If you want your model to have a different primary key, specify the name of the key on the `primaryKey` class property:\n\n```coffeescript\nclass User extends Batman.Model\n  @primaryKey: 'handle'\n  @encode 'handle', 'email'\n```\n\n#### States\n\n* `empty`: a new model instance remains in this state until some persisted attribute is set on it.\n* `loading`: entered when the model instance's `load()` method is called.\n* `loaded`: entered after the model's storage adapter has completed loading updated attributes for the instance. Immediately transitions to the `clean` state.\n* `dirty`: entered when one of the model's persisted attributes changes.\n* `validating`: entered when the validation process has started.\n* `validated`: entered when the validation process has completed. Immediately after entering this state, the model instance transitions back to either the `dirty` or `clean` state.\n* `saving`: entered when the storage adapter has begun saving the model.\n* `saved`: entered after the model's storage adapter has completed saving the model. Immediately transitions to the `clean` state.\n* `clean`: indicates that none of an instance's attributes have been changed since the model was `saved` or `loaded`.\n* `destroying`: entered when the model instance's `destroy()` method is called.\n* `destroyed`: indicates that the storage adapter has completed destroying this instance.\n\n#### Validation\n\nBefore models are saved to persistent storage, they run through any validations you've defined and the save is cancelled if any errors were added to the model during that process.\n\nValidations are defined with the `@validate` macro by passing it the properties to be validated and an options object representing the particular validations to perform:\n\n```coffeescript\nclass User extends Batman.Model\n  @encode 'login', 'password'\n  @validate 'login', presence: yes, maxLength: 16\n  @validate 'password', 'passwordConfirmation', presence: yes, lengthWithin: [6,255]\n```\n\nThe options get their meaning from subclasses of `Batman.Validator` which have been registered by adding them to the `Batman.Validators` array. For example, the `maxLength` and `lengthWithin` options are used by `Batman.LengthValidator`.\n\n\n#### Persistence\n\nTo specify a storage adapter for persisting a model, use the `@persist` macro in its class definition:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.LocalStorage\n```\n\nNow when you call `save()` or `load()` on a product, it will use the browser window's [localStorage](https://developer.mozilla.org/en/dom/storage) to retrieve or store the serialized data.\n\nIf you have a REST backend you want to connect to, `Batman.RestStorage` is a simple storage adapter which can be subclassed and extended to suit your needs. By default, it will assume your CamelCased-singular `Product` model is accessible at the underscored-pluralized \"/products\" path, with instances of the resource accessible at `/products/:id`. You can override these path defaults by assigning either a string or a function-returning-a-string to the `url` property of your model class (for the collection path) or to the prototype (for the member path). For example:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.RestStorage\n  @url = \"/admin/products\"\n  url: -> \"/admin/products/#{@id}\"\n```\n\n#### Associations\n\nBatman models support `belongsTo`, `hasOne`, and `hasMany` associations. Here's a simple example:\n\n```coffeescript\nclass App.Store extends Batman.Model\n  @hasMany 'products', options\n\nclass App.Product extends Batman.Model\n  @belongsTo 'store', options\n```\n\nThe following options are available:\n\n*  _namespace_: Tells Batman to look for the associated model under the provided namespace. (Defaults to `Batman.currentApp`.)\n*  _name_: Tells Batman to use the given model name instead. (Defaults to an interpretation of the association's label.)\n*  _saveInline_: Tells Batman whether to encode associations as inline JSON when the base model is saved. (Defaults to `false` for `belongsTo`, and `true` for `hasOne` and `hasMany`.)\n*  _autoload_: Tells Batman whether to make a request to the server the first time the association is `get`ted. Defaults to true.\n\nAssociations can be loaded via foreign keys or inline JSON:\n\n```coffeescript\nlocalStorage =\n  stores1:\n    id: 1\n    name: \"JSON Store\"\n    product: {id: 1, store_id: 1, name: \"JSON Product\"}\n\n  stores2:\n    id: 2\n    name: \"Foreign Key Store\"\n  products3:\n    id: 3\n    store_id: 2\n    name: \"Foreign Key Product Product\"\n```\n\nAssociation saving is done inline:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nproduct1 = new Product name: \"Foo\"\nproduct2 = new Product name: \"Bar\"\n\nstore.set 'products', new Batman.Set(product1, product2)\nstore.save (error, record) ->\n  throw error if error\n  console.log localStorage[\"stores#{record.get('id')}\"]\n  # => {\n  #   id: ...\n  #   name: \"Angry Birds\"\n  #   products: [{name: \"Foo\", store_id: ...}, {name: \"Bar\", store_id: ...}]\n  # }\n```\n\n(Notice that the products did not receive IDs. This is because association saving is non-cascading, meaning that each model needs to be saved individually to fully persist. You can always call `toJSON` on a model instance to see what will be stored.)\n\nAssociations also support reloading and loaded introspection:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nstore.get('products.loaded') #=> false\nstore.get('products').load (err, products) ->\n  throw err if err\n  store.get('products.loaded') #=> true\n```\n\nAssociations can be rendered via keypaths, using the same labels you use to create the association:\n\n```html\n<div data-foreach-product=\"store.products\" data-bind=\"product.name\"></div>\n```\n\n# Contributing\n\n[![Build Status](https://secure.travis-ci.org/Shopify/batman.png)](http://travis-ci.org/Shopify/batman)\n\nWell-tested contributions are always welcome! Here's what you should do:\n\n#### 1. Clone the repo\n\n```bash\ngit clone https://github.com/Shopify/batman.git\n```\n\n#### 2. Run the tests\n\nYou can test batman.js locally either on the command line or in the browser and both should work. Tests are written in Coffeescript using [QUnit](http://docs.jquery.com/QUnit#API_documentation).\n\nTo run on the command line, run the following command from the project root:\n\n```bash\ncake test\n```\n\nTo run in the browser, start a web server to serve up the tests:\n\n```bash\ncoffee tests/serve.coffee\n```\n\n...then visit `http://localhost:1047/tests/batman/test.html`.\n\n#### 3. Write some test-driven code\n\nThe tests are in `tests/batman`. You'll need to source any new test files in `tests/batman/test.html`.\n\n#### 4. Create a pull request\n\nIf it's good code that fits with the goals of the project, we'll merge it in!\n\n# License\n\nbatman.js is copyright 2011 by [Shopify](http://www.shopify.com), released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}]},"0.11.0":{"name":"batman","description":"A full-stack JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.11.0","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/dist/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"./node_modules/.bin/cake test","build":"./node_modules/.bin/cake build"},"dependencies":{"connect":"~>1.8.5 || ~>2.2.1","coffee-script":"~>1.3.2"},"devDependencies":{"daemon":"~>0.3.0","docco":"~>0.3.0","glob":"~>3.0.1","q":"~>0.8.0","muffin":"~>0.6.0","uglify-js":"1.2.5","temp":"~>0.2.0","qqunit":"~>0.4.0","percolate":"~>0.4.0","connect-assets":"~>2.2.0","liquor":"~>0.0.0"},"engines":{"node":"~>0.6.0 || ~>0.8.0"},"optionalDependencies":{},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.11.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"a569c7f7c9de1d060e10e83adb67d53bf9fcc78b","tarball":"http://registry.npmjs.org/batman/-/batman-0.11.0.tgz"},"readme":"# batman.js\n\n[batman.js](http://batmanjs.org/) is a framework for building rich single-page browser applications. It is written in [CoffeeScript](http://jashkenas.github.com/coffee-script/) and its API is developed with CoffeeScript in mind, but of course you can use plain old JavaScript too.\n\n#### It's got:\n\n* a stateful MVC architecture\n* a powerful binding system\n* routable controller actions\n* pure HTML views\n* toolchain support built on [node.js](http://nodejs.org) and [cake](http://jashkenas.github.com/coffee-script/#cake)\n\nThe APIs are heavily inspired by [Rails](http://rubyonrails.org/) and designed to make Rails devs feel right at home.\n\nWe're targeting Chrome, Safari 4+, Firefox 3+, and IE 7+ for compatibility, although some of those require you to include [es5shim](https://github.com/kriskowal/es5-shim).\n\n#### Here's some code:\n\n```coffeescript\nclass Shopify extends Batman.App\n  @root 'products#index'\n\n  @resources 'products'\n\nclass Shopify.Product extends Batman.Model\n  @persist Batman.RestStorage\n\nclass Shopify.ProductsController extends Batman.Controller\n  index: ->\n\n  show: (params) ->\n    Shopify.Product.find params.id, (err, product) =>\n      @set('product', product)\n```\n\n#### views/products/index.html\n\n```html\n<ul id=\"products\">\n  <li data-foreach-product=\"Product.all\" data-mixin=\"animation\">\n    <a data-route=\"product\" data-bind=\"product.name\">name will go here</a>\n  </li>\n\n  <li><span data-bind=\"'product' | pluralize products.length\"></span></li>\n</ul>\n```\n\n## Installation\n\nIf you haven't already, you'll need to install [node.js](http://nodejs.org) (0.4.x for now, 0.5.x support forthcoming) and [npm](http://npmjs.org/). Then:\n\n```bash\nnpm install -g batman\n```\n\nGenerate a new batman.js app somewhere, called my_app:\n\n```bash\ncd ~/code\nbatman new my_app\n```\n\nFire it up:\n\n```bash\ncd my_app\nbatman server # (or just \"batman s\")\n```\n\nNow visit [http://localhost:1047](http://localhost:1047) and start playing around!\n\n## The Basics\n\nMost of the classes you work with in your app code will descend from `Batman.Object`, which gives you some nice things that are used extensively by the rest of the system.\n\n### Events\n\nEvents in batman.js are pretty simple. Handling an event is like subscribing to a named channel on a particular object, and firing an event is like publishing an argument list (which might be empty) to all subscribers of that channel.\n\n```coffeescript\nclass BatBelt.Gadget extends Batman.Object\n  constructor: -> @usesRemaining = 5\n  use: (howManyTimes) ->\n    if howManyTimes <= @usesRemaining\n      @usesRemaining -= howManyTimes\n      @fire('use', howManyTimes)\n```\n\nYou can use the `on` method to register handler functions which then get called whenever `fire` is called for the specified event name. The handlers get whichever extra arguments were passed to `fire` after the event name itself:\n\n```coffeescript\ngadget.on 'use', (howManyTimes) ->\n  console.log \"gadget was used #{howManyTimes} times!\"\ngadget.use(2)\n# console output: \"gadget was used 2 times!\"\n```\n\n### Properties\n\nThe `observe` function is used to observe changes to properties. This forms the basis of the binding system. Here's a simple example:\n\n```coffeescript\ngadget.observe 'name', (newVal, oldVal) ->\n  console.log \"name changed from #{oldVal} to #{newVal}!\"\ngadget.set 'name', 'Batarang'\n# console output: \"name changed from undefined to Batarang!\"\n```\n\nWhen you `observe` a property, you are really just handling its \"change\" event, which happens to get fired with the new and old values.\n\nOf course you can also `get` properties to return their values, and if you want to remove them completely then you can `unset` them:\n\n```coffeescript\ngadget.get 'name'\n# returns: 'Batarang'\ngadget.unset 'name'\n# console output: \"name changed from Batarang to undefined!\"\n```\n\nBy default, these properties are stored like plain old JavaScript properties: that is, `gadget.name` would return \"Batarang\" just like you'd expect. But if you set the gadget's name with `gadget.name = 'Shark Spray'`, then the observer function you set on `gadget` will not fire. So when you're working with batman.js properties, use `get`/`set`/`unset` to read/write/delete them.\n\n\n### Custom Accessors\n\nWhat's the point of using `gadget.get 'name'` instead of just `gadget.name`? Well, batman.js properties don't always correspond with vanilla JS properties. Let's write a `Box` class with a custom getter for its volume:\n\n```coffeescript\nclass Box extends Batman.Object\n  constructor: (@length, @width, @height) ->\n  @accessor 'volume',\n    get: (key) -> @get('length') * @get('width') * @get('height')\n\nbox = new Box(16,16,12)\nbox.get 'volume'\n# returns 3072\n```\n\nThe really cool thing about this is that, because we used `@get` to access the component properties of `volume`, batman.js can keep track of those dependencies and let us observe the `volume` directly:\n\n```coffeescript\nbox.observe 'volume', (newVal, oldVal) ->\n  console.log \"volume changed from #{oldVal} to #{newVal}!\"\nbox.set 'height', 6\n# console output: \"volume changed from 3072 to 1536!\"\n```\n\nThe box's `volume` is a read-only attribute here, because we only provided a getter in the accessor we defined. Here's a `Person` class with a (rather naive) read-write accessor for their name:\n\n```coffeescript\nclass Person extends Batman.Object\n  constructor: (name) -> @set 'name', name\n  @accessor 'name',\n    get: (key) -> [@get('firstName'), @get('lastName')].join(' ')\n    set: (key, val) ->\n      [first, last] = val.split(' ')\n      @set 'firstName', first\n      @set 'lastName', last\n    unset: (key) ->\n      @unset 'firstName'\n      @unset 'lastName'\n```\n\n### Keypaths\n\nIf you want to get at properties of properties, use keypaths:\n\n```coffeescript\nemployee.get 'team.manager.name'\n```\n\nThis does what you expect and is pretty much the same as `employee.get('team').get('manager').get('name')`. If you want to observe a deep keypath for changes, go ahead:\n\n```coffeescript\nemployee.observe 'team.manager.name', (newVal, oldVal) ->\n  console.log \"you now answer to #{newVal || 'nobody'}!\"\nmanager = employee.get 'team.manager'\nmanager.set 'name', 'Bill'\n# console output: \"you now answer to Bill!\"\n```\n\nIf any component of the keypath is set to something that would change the overall value, then observers will fire:\n\n```coffeescript\nemployee.set 'team', larrysTeam\n# console output: \"you now answer to Larry!\"\nemployee.team.unset 'manager'\n# console output: \"you now answer to nobody!\"\nemployee.set 'team', jessicasTeam\n# console output: \"you now answer to Jessica!\"\n```\n\nbatman.js's dependency tracking system makes sure that no matter how weird your object graph gets, your observers will fire exactly when they should.\n\n## Architecture\n\nThe MVC architecture of batman.js fits together like this:\n\n* Controllers are persistent objects which render the views and give them mediated access to the model layer.\n* Views are written in pure HTML, and use `data-*` attributes to create bindings with model data and event handlers exposed by the controllers.\n* Models have validations, lifecycle events, a built-in identity map, and can use arbitrary storage backends (`Batman.LocalStorage`, `Batman.RestStorage`, and `Batman.RailsStorage` are included).\n\nA batman.js application is served up in one page load, followed by asynchronous requests for various resources as the user interacts with the app. Navigation within the app uses [pushState](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries) where supported, otherwise falling back to [hash-bang fragment identifers](http://www.w3.org/QA/2011/05/hash_uris.html).\n\n\n### The App Class\n\nSitting in front of everything else is a subclass of `Batman.App` which represents your application as a whole and acts as a namespace for your other app classes. The app class never gets instantiated; your main interactions with it are using macros in its class definition, and calling `run()` on it when it's time to fire up your app.\n\nHere's a simple app class:\n\n```coffeescript\nclass BatBelt extends Batman.App\n  @root 'app#index'\n  @route 'faq/:questionID', 'app#faq'\n  @resources 'gadgets'\n```\n\nThe calls to `@controller` and `@model` load external app classes with XHRs. For the controllers, this ends up fetching `/controllers/app_controller.coffee` and `/controllers/gadgets_controller.coffee`. The gadget model gets loaded from `/models/gadget.coffee`.\n\n#### Routes\n\nRoutes are defined in a few different ways.\n\n`@route` takes two strings, one representing a path pattern and the other representing a controller action. In the above example, `'faq/:questionID'` matches any path starting with \"/faq/\" and having one other segment. That segment is then passed as a named param to the controller action function specified by the second string argument.\n\nFor the FAQ route, `'app#faq'` specifies the `faq` function on `BatBelt.AppController`, which should take a `params` argument and do something sensible with `params.questionID`.\n\n`@root 'app#index'` is just a shorthand for `@route '/', 'app#index'`.\n\nThe `@resources` macro takes a resource name which should ideally be the underscored-pluralized name of one of your models. It sets up three routes, as if you'd used the `@route` macro like so:\n\n```coffeescript\n@route 'gadgets', 'gadgets#index'\n@route 'gadgets/new', 'gadgets#new'\n@route 'gadgets/:id', 'gadgets#show'\n@route 'gadgets/:id/edit', 'gadgets#edit'\n```\n\n`@resources` can also take a list of labels to set up routing for multiple models at once:\n\n```coffeescript\n@resources 'stores', 'products', 'customers'\n```\n\nIn addition to setting up these routes, the call to `@resources` keeps track of the fact that the `Gadget` model can be accessed in these ways. This lets you load these routes in your controllers or views by using model instances and classes on their own:\n\n```coffeescript\nBatBelt.Gadget.find 1, (err, gadget) =>\n  @redirect gadget unless err? # redirects to \"/gadgets/1\"\n```\nor\n\n```coffeescript\n@redirect BatBelt.Gadget # redirects to \"/gadgets\"\n```\n\n### Controllers\n\nbatman.js controllers are singleton classes with one or more instance methods that can serve as routable actions. Because they're singletons, instance variables persist as long as the app is running.\n\n```coffeescript\nclass BatBelt.AppController extends Batman.Controller\n  index: ->\n\n  faq: (params) ->\n    @set('question', @get('questions').get(params.questionID)\n```\n\nNow when you navigate to `/#!/faq/what-is-art`, the dispatcher runs this `faq` action with `{questionID: \"what-is-art\"}`. It also makes an implicit call to `@render`, which by default will look for a view at `/views/app/faq.html`. The view is rendered within the main content container of the page, which is designated by setting `data-yield=\"main\"` on some tag in the layout's HTML. You can prevent this implicit rendering by calling `@render false` in your action.\n\nControllers are also a fine place to put event handlers used by your views. Here's one that uses [jQuery](http://jquery.com/) to toggle a CSS class on a button:\n\n```coffeescript\nclass MyApp.BigRedButtonController extends Batman.Controller\n  index: ->\n\n  buttonWasClicked: (node, event) ->\n    $(node).toggleClass('activated')\n```\n\nIf you want to redirect to some route, you can use `@redirect`:\n\n```coffeescript\nbuttonWasClicked: (node, event) ->\n  $(node).toggleClass('activated')\n  @redirect '/apocalypse/'\n```\n\n### Views\n\nYou write views in plain HTML. These aren't templates in the usual sense: the HTML is rendered in the page as-is, and you use `data-*` attributes to specify how different parts of the view bind to your app's data. Here's a very small view which displays a user's name and avatar:\n\n```html\n<div class=\"user\">\n  <img data-bind-src=\"user.avatarURL\" />\n  <p data-bind=\"user.name\"></p>\n</div>\n```\n\nThe `data-bind` attribute on the `<p>` tag sets up a binding between the user's `name` property and the content of the tag. The `data-bind-src` attribute on the `<img>` tag binds the user's `avatarURL` property to the `src` attribute of the tag. You can do the same thing for arbitrary attribute names, so for example `data-bind-href` would bind to the `href` attribute.\n\nbatman.js uses a bunch of these data attributes for different things:\n\n#### Binding properties\n\n* `data-bind=\"foo.bar\"`: for most tags, this defines a one-way binding with the contents of the node: when the given property `foo.bar` changes, the contents of the node are set to that value. When `data-bind` is set on a form input tag, a _two-way_ binding is defined with the _value_ of the node, such that any changes from the user will update the property in realtime.\n\n* `data-bind-foo=\"bar.baz\"`: defines a one-way binding from the given property `bar.baz` to any attribute `foo` on the node.\n\n* `data-foreach-bar=\"foo.bars\"`: used to render a collection of zero or more items. If the collection descends from `Batman.Set`, then the DOM will be updated when items are added or removed.\n\n#### Handling DOM events\n\n* `data-event-click=\"foo.bar\"`: when this node is clicked, the function specified by the keypath `foo.bar` is called with the node object as the first argument, and the click event as the second argument.\n\n* `data-event-change=\"foo.bar\"`: like `data-event-click`, but fires on change events.\n\n* `data-event-submit=\"foo.bar\"`: like `data-event-click`, but fires either when a form is submitted (in the case of `<form>` nodes) or when a user hits the enter key when an `<input>` or `<textarea>` has focus.\n\n#### Managing contexts\n\n* `data-context=\"foo.bar\"`: pushes a new context onto the context stack for children of this node. If the context is `foo.bar`, then children of this node may access properties on `foo.bar` directly, as if they were properties of the controller.\n\n#### Rendering Views\n\n* `data-yield=\"identifier\"`: used in your layout to specify the locations that other views get rendered into when they are rendered. By default, a controller action renders each whole view into whichever node is set up to yield `\"main\"`. If you want some content in a view to be rendered into a different `data-yield` node, you can use `data-contentfor`.\n\n* `data-contentfor=\"identifier\"`: when the view is rendered into your layout, the contents of this node will be rendered into whichever node has `data-yield=\"identifier\"`. For example, if your layout has `\"main\"` and `\"sidebar\"` yields, then you may put a `data-contentfor=\"sidebar\"` node in a view and it will be rendered in the sidebar instead of the main content area. If multiple `data-contentfor` nodes with the same identifier are present in a view, their contents will be concatenated in the corresponding `data-yield` node.\n\n* `data-partial=\"shared/sidebar\"`: renders the view at the path `/views/shared/sidebar.html` within this node. Note that `/views/` is prepended.\n\n* `data-route=\"/some/path\"` or `data-route=\"some.model\"`: loads a route when this node is clicked. The route can either be specified by a path beginning with a slash \"/\", or by a property leading to either a model instance (resulting in a resource's \"show\" action) or a model class (for the resource's \"index\" action).\n\n\n### Models\n\nbatman.js models:\n\n* can persist to various storage backends\n* only serialize a defined subset of their properties as JSON\n* use a state machine to expose lifecycle events\n* can validate with synchronous or asynchronous operations\n\n#### Attributes\n\nA model object may have arbitrary properties set on it, just like any JS object. Only some of those properties are serialized and persisted to its storage backends, however. You define persisted attributes on a model with the `encode` macro:\n\n```coffeescript\n  class Article extends Batman.Model\n    @encode 'body_html', 'title', 'author', 'summary_html', 'blog_id', 'id', 'user_id'\n    @encode 'created_at', 'updated_at', 'published_at', Batman.Encoders.railsDate\n    @encode 'tags',\n      encode: (tagSet) -> tagSet.toArray().join(', ')\n      decode: (tagString) -> new Batman.Set(tagString.split(', ')...)\n```\n\nGiven one or more strings as arguments, `@encode` will register these properties as persisted attributes of the model, to be serialized in the model's `toJSON()` output and extracted in its `fromJSON()`. Properties that aren't specified with `@encode` will be ignored for both serialization and deserialization. If an optional coder object is provided as the last argument, its `encode` and `decode` functions will be used by the model for serialization and deserialization, respectively.\n\nBy default, a model's primary key (the unchanging property which uniquely indexes its instances) is its `id` property. If you want your model to have a different primary key, specify the name of the key on the `primaryKey` class property:\n\n```coffeescript\nclass User extends Batman.Model\n  @primaryKey: 'handle'\n  @encode 'handle', 'email'\n```\n\n#### States\n\n* `empty`: a new model instance remains in this state until some persisted attribute is set on it.\n* `loading`: entered when the model instance's `load()` method is called.\n* `loaded`: entered after the model's storage adapter has completed loading updated attributes for the instance. Immediately transitions to the `clean` state.\n* `dirty`: entered when one of the model's persisted attributes changes.\n* `validating`: entered when the validation process has started.\n* `validated`: entered when the validation process has completed. Immediately after entering this state, the model instance transitions back to either the `dirty` or `clean` state.\n* `saving`: entered when the storage adapter has begun saving the model.\n* `saved`: entered after the model's storage adapter has completed saving the model. Immediately transitions to the `clean` state.\n* `clean`: indicates that none of an instance's attributes have been changed since the model was `saved` or `loaded`.\n* `destroying`: entered when the model instance's `destroy()` method is called.\n* `destroyed`: indicates that the storage adapter has completed destroying this instance.\n\n#### Validation\n\nBefore models are saved to persistent storage, they run through any validations you've defined and the save is cancelled if any errors were added to the model during that process.\n\nValidations are defined with the `@validate` macro by passing it the properties to be validated and an options object representing the particular validations to perform:\n\n```coffeescript\nclass User extends Batman.Model\n  @encode 'login', 'password'\n  @validate 'login', presence: yes, maxLength: 16\n  @validate 'password', 'passwordConfirmation', presence: yes, lengthWithin: [6,255]\n```\n\nThe options get their meaning from subclasses of `Batman.Validator` which have been registered by adding them to the `Batman.Validators` array. For example, the `maxLength` and `lengthWithin` options are used by `Batman.LengthValidator`.\n\n\n#### Persistence\n\nTo specify a storage adapter for persisting a model, use the `@persist` macro in its class definition:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.LocalStorage\n```\n\nNow when you call `save()` or `load()` on a product, it will use the browser window's [localStorage](https://developer.mozilla.org/en/dom/storage) to retrieve or store the serialized data.\n\nIf you have a REST backend you want to connect to, `Batman.RestStorage` is a simple storage adapter which can be subclassed and extended to suit your needs. By default, it will assume your CamelCased-singular `Product` model is accessible at the underscored-pluralized \"/products\" path, with instances of the resource accessible at `/products/:id`. You can override these path defaults by assigning either a string or a function-returning-a-string to the `url` property of your model class (for the collection path) or to the prototype (for the member path). For example:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.RestStorage\n  @url = \"/admin/products\"\n  url: -> \"/admin/products/#{@get('id')}\"\n```\n\n#### Associations\n\nBatman models support `belongsTo`, `hasOne`, and `hasMany` associations. Here's a simple example:\n\n```coffeescript\nclass App.Store extends Batman.Model\n  @hasMany 'products', options\n\nclass App.Product extends Batman.Model\n  @belongsTo 'store', options\n```\n\nThe following options are available:\n\n*  _namespace_: Tells Batman to look for the associated model under the provided namespace. (Defaults to `Batman.currentApp`.)\n*  _name_: Tells Batman to use the given model name instead. (Defaults to an interpretation of the association's label.)\n*  _saveInline_: Tells Batman whether to encode associations as inline JSON when the base model is saved. (Defaults to `false` for `belongsTo`, and `true` for `hasOne` and `hasMany`.)\n*  _autoload_: Tells Batman whether to make a request to the server the first time the association is `get`ted. Defaults to true.\n\nAssociations can be loaded via foreign keys or inline JSON:\n\n```coffeescript\nlocalStorage =\n  stores1:\n    id: 1\n    name: \"JSON Store\"\n    product: {id: 1, store_id: 1, name: \"JSON Product\"}\n\n  stores2:\n    id: 2\n    name: \"Foreign Key Store\"\n  products3:\n    id: 3\n    store_id: 2\n    name: \"Foreign Key Product Product\"\n```\n\nAssociation saving is done inline:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nproduct1 = new Product name: \"Foo\"\nproduct2 = new Product name: \"Bar\"\n\nstore.set 'products', new Batman.Set(product1, product2)\nstore.save (error, record) ->\n  throw error if error\n  console.log localStorage[\"stores#{record.get('id')}\"]\n  # => {\n  #   id: ...\n  #   name: \"Angry Birds\"\n  #   products: [{name: \"Foo\", store_id: ...}, {name: \"Bar\", store_id: ...}]\n  # }\n```\n\n(Notice that the products did not receive IDs. This is because association saving is non-cascading, meaning that each model needs to be saved individually to fully persist. You can always call `toJSON` on a model instance to see what will be stored.)\n\nAssociations also support reloading and loaded introspection:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nstore.get('products.loaded') #=> false\nstore.get('products').load (err, products) ->\n  throw err if err\n  store.get('products.loaded') #=> true\n```\n\nAssociations can be rendered via keypaths, using the same labels you use to create the association:\n\n```html\n<div data-foreach-product=\"store.products\" data-bind=\"product.name\"></div>\n```\n\n# Contributing\n\n[![Build Status](https://secure.travis-ci.org/Shopify/batman.png)](http://travis-ci.org/Shopify/batman)\n\nWell-tested contributions are always welcome! Here's what you should do:\n\n#### 1. Clone the repo\n\n```bash\ngit clone https://github.com/Shopify/batman.git\n```\n\n#### 2. Run the tests\n\nYou can test batman.js locally either on the command line or in the browser and both should work. Tests are written in CoffeeScript using [QUnit](http://docs.jquery.com/QUnit#API_documentation).\n\nTo run on the command line, run the following command from the project root:\n\n```bash\ncake test\n```\n\nTo run in the browser, start a web server to serve up the tests:\n\n```bash\ncoffee tests/serve.coffee\n```\n\n...then visit `http://localhost:1047/tests/batman/test.html`.\n\n#### 3. Write some test-driven code\n\nThe tests are in `tests/batman`. All test files in there are automatically included into the browser.\n\n#### 4. Create a pull request\n\nIf it's good code that fits with the goals of the project, we'll merge it in!\n\n# License\n\nbatman.js is copyright 2012 by [Shopify](http://www.shopify.com), released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}]},"0.11.1":{"name":"batman","description":"A client side JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.11.1","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/dist/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"./node_modules/.bin/cake test","build":"./node_modules/.bin/cake build"},"dependencies":{"connect":"~>1.8.5 || ~>2.2.1","coffee-script":"~>1.3.2"},"devDependencies":{"daemon":"~>0.3.0","docco":"~>0.3.0","glob":"~>3.0.1","q":"~>0.8.0","muffin":"~>0.6.1","uglify-js":"1.2.5","temp":"~>0.4.0","qqunit":"~>0.4.1","percolate":"~>0.4.1","connect-assets":"~>2.2.0","liquor":"~>0.0.0"},"engines":{"node":"~>0.6.0 || ~>0.8.0"},"optionalDependencies":{},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.11.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"d24c2d5b426298fbe712a052746c1af400afa3a7","tarball":"http://registry.npmjs.org/batman/-/batman-0.11.1.tgz"},"readme":"# batman.js\n\n[batman.js](http://batmanjs.org/) is a framework for building rich single-page browser applications. It is written in [CoffeeScript](http://jashkenas.github.com/coffee-script/) and its API is developed with CoffeeScript in mind, but of course you can use plain old JavaScript too.\n\n#### It's got:\n\n* a stateful MVC architecture\n* a powerful binding system\n* routable controller actions\n* pure HTML views\n* toolchain support built on [node.js](http://nodejs.org) and [cake](http://jashkenas.github.com/coffee-script/#cake)\n\nThe APIs are heavily inspired by [Rails](http://rubyonrails.org/) and designed to make Rails devs feel right at home.\n\nWe're targeting Chrome, Safari 4+, Firefox 3+, and IE 7+ for compatibility, although some of those require you to include [es5shim](https://github.com/kriskowal/es5-shim).\n\n#### Here's some code:\n\n```coffeescript\nclass Shopify extends Batman.App\n  @root 'products#index'\n\n  @resources 'products'\n\nclass Shopify.Product extends Batman.Model\n  @persist Batman.RestStorage\n\nclass Shopify.ProductsController extends Batman.Controller\n  index: ->\n\n  show: (params) ->\n    Shopify.Product.find params.id, (err, product) =>\n      @set('product', product)\n```\n\n#### views/products/index.html\n\n```html\n<ul id=\"products\">\n  <li data-foreach-product=\"Product.all\" data-mixin=\"animation\">\n    <a data-route=\"product\" data-bind=\"product.name\">name will go here</a>\n  </li>\n\n  <li><span data-bind=\"'product' | pluralize products.length\"></span></li>\n</ul>\n```\n\n## Installation\n\nIf you haven't already, you'll need to install [node.js](http://nodejs.org) (0.4.x for now, 0.5.x support forthcoming) and [npm](http://npmjs.org/). Then:\n\n```bash\nnpm install -g batman\n```\n\nGenerate a new batman.js app somewhere, called my_app:\n\n```bash\ncd ~/code\nbatman new my_app\n```\n\nFire it up:\n\n```bash\ncd my_app\nbatman server # (or just \"batman s\")\n```\n\nNow visit [http://localhost:1047](http://localhost:1047) and start playing around!\n\n## The Basics\n\nMost of the classes you work with in your app code will descend from `Batman.Object`, which gives you some nice things that are used extensively by the rest of the system.\n\n### Events\n\nEvents in batman.js are pretty simple. Handling an event is like subscribing to a named channel on a particular object, and firing an event is like publishing an argument list (which might be empty) to all subscribers of that channel.\n\n```coffeescript\nclass BatBelt.Gadget extends Batman.Object\n  constructor: -> @usesRemaining = 5\n  use: (howManyTimes) ->\n    if howManyTimes <= @usesRemaining\n      @usesRemaining -= howManyTimes\n      @fire('use', howManyTimes)\n```\n\nYou can use the `on` method to register handler functions which then get called whenever `fire` is called for the specified event name. The handlers get whichever extra arguments were passed to `fire` after the event name itself:\n\n```coffeescript\ngadget.on 'use', (howManyTimes) ->\n  console.log \"gadget was used #{howManyTimes} times!\"\ngadget.use(2)\n# console output: \"gadget was used 2 times!\"\n```\n\n### Properties\n\nThe `observe` function is used to observe changes to properties. This forms the basis of the binding system. Here's a simple example:\n\n```coffeescript\ngadget.observe 'name', (newVal, oldVal) ->\n  console.log \"name changed from #{oldVal} to #{newVal}!\"\ngadget.set 'name', 'Batarang'\n# console output: \"name changed from undefined to Batarang!\"\n```\n\nWhen you `observe` a property, you are really just handling its \"change\" event, which happens to get fired with the new and old values.\n\nOf course you can also `get` properties to return their values, and if you want to remove them completely then you can `unset` them:\n\n```coffeescript\ngadget.get 'name'\n# returns: 'Batarang'\ngadget.unset 'name'\n# console output: \"name changed from Batarang to undefined!\"\n```\n\nBy default, these properties are stored like plain old JavaScript properties: that is, `gadget.name` would return \"Batarang\" just like you'd expect. But if you set the gadget's name with `gadget.name = 'Shark Spray'`, then the observer function you set on `gadget` will not fire. So when you're working with batman.js properties, use `get`/`set`/`unset` to read/write/delete them.\n\n\n### Custom Accessors\n\nWhat's the point of using `gadget.get 'name'` instead of just `gadget.name`? Well, batman.js properties don't always correspond with vanilla JS properties. Let's write a `Box` class with a custom getter for its volume:\n\n```coffeescript\nclass Box extends Batman.Object\n  constructor: (@length, @width, @height) ->\n  @accessor 'volume',\n    get: (key) -> @get('length') * @get('width') * @get('height')\n\nbox = new Box(16,16,12)\nbox.get 'volume'\n# returns 3072\n```\n\nThe really cool thing about this is that, because we used `@get` to access the component properties of `volume`, batman.js can keep track of those dependencies and let us observe the `volume` directly:\n\n```coffeescript\nbox.observe 'volume', (newVal, oldVal) ->\n  console.log \"volume changed from #{oldVal} to #{newVal}!\"\nbox.set 'height', 6\n# console output: \"volume changed from 3072 to 1536!\"\n```\n\nThe box's `volume` is a read-only attribute here, because we only provided a getter in the accessor we defined. Here's a `Person` class with a (rather naive) read-write accessor for their name:\n\n```coffeescript\nclass Person extends Batman.Object\n  constructor: (name) -> @set 'name', name\n  @accessor 'name',\n    get: (key) -> [@get('firstName'), @get('lastName')].join(' ')\n    set: (key, val) ->\n      [first, last] = val.split(' ')\n      @set 'firstName', first\n      @set 'lastName', last\n    unset: (key) ->\n      @unset 'firstName'\n      @unset 'lastName'\n```\n\n### Keypaths\n\nIf you want to get at properties of properties, use keypaths:\n\n```coffeescript\nemployee.get 'team.manager.name'\n```\n\nThis does what you expect and is pretty much the same as `employee.get('team').get('manager').get('name')`. If you want to observe a deep keypath for changes, go ahead:\n\n```coffeescript\nemployee.observe 'team.manager.name', (newVal, oldVal) ->\n  console.log \"you now answer to #{newVal || 'nobody'}!\"\nmanager = employee.get 'team.manager'\nmanager.set 'name', 'Bill'\n# console output: \"you now answer to Bill!\"\n```\n\nIf any component of the keypath is set to something that would change the overall value, then observers will fire:\n\n```coffeescript\nemployee.set 'team', larrysTeam\n# console output: \"you now answer to Larry!\"\nemployee.team.unset 'manager'\n# console output: \"you now answer to nobody!\"\nemployee.set 'team', jessicasTeam\n# console output: \"you now answer to Jessica!\"\n```\n\nbatman.js's dependency tracking system makes sure that no matter how weird your object graph gets, your observers will fire exactly when they should.\n\n## Architecture\n\nThe MVC architecture of batman.js fits together like this:\n\n* Controllers are persistent objects which render the views and give them mediated access to the model layer.\n* Views are written in pure HTML, and use `data-*` attributes to create bindings with model data and event handlers exposed by the controllers.\n* Models have validations, lifecycle events, a built-in identity map, and can use arbitrary storage backends (`Batman.LocalStorage`, `Batman.RestStorage`, and `Batman.RailsStorage` are included).\n\nA batman.js application is served up in one page load, followed by asynchronous requests for various resources as the user interacts with the app. Navigation within the app uses [pushState](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries) where supported, otherwise falling back to [hash-bang fragment identifers](http://www.w3.org/QA/2011/05/hash_uris.html).\n\n\n### The App Class\n\nSitting in front of everything else is a subclass of `Batman.App` which represents your application as a whole and acts as a namespace for your other app classes. The app class never gets instantiated; your main interactions with it are using macros in its class definition, and calling `run()` on it when it's time to fire up your app.\n\nHere's a simple app class:\n\n```coffeescript\nclass BatBelt extends Batman.App\n  @root 'app#index'\n  @route 'faq/:questionID', 'app#faq'\n  @resources 'gadgets'\n```\n\nThe calls to `@controller` and `@model` load external app classes with XHRs. For the controllers, this ends up fetching `/controllers/app_controller.coffee` and `/controllers/gadgets_controller.coffee`. The gadget model gets loaded from `/models/gadget.coffee`.\n\n#### Routes\n\nRoutes are defined in a few different ways.\n\n`@route` takes two strings, one representing a path pattern and the other representing a controller action. In the above example, `'faq/:questionID'` matches any path starting with \"/faq/\" and having one other segment. That segment is then passed as a named param to the controller action function specified by the second string argument.\n\nFor the FAQ route, `'app#faq'` specifies the `faq` function on `BatBelt.AppController`, which should take a `params` argument and do something sensible with `params.questionID`.\n\n`@root 'app#index'` is just a shorthand for `@route '/', 'app#index'`.\n\nThe `@resources` macro takes a resource name which should ideally be the underscored-pluralized name of one of your models. It sets up three routes, as if you'd used the `@route` macro like so:\n\n```coffeescript\n@route 'gadgets', 'gadgets#index'\n@route 'gadgets/new', 'gadgets#new'\n@route 'gadgets/:id', 'gadgets#show'\n@route 'gadgets/:id/edit', 'gadgets#edit'\n```\n\n`@resources` can also take a list of labels to set up routing for multiple models at once:\n\n```coffeescript\n@resources 'stores', 'products', 'customers'\n```\n\nIn addition to setting up these routes, the call to `@resources` keeps track of the fact that the `Gadget` model can be accessed in these ways. This lets you load these routes in your controllers or views by using model instances and classes on their own:\n\n```coffeescript\nBatBelt.Gadget.find 1, (err, gadget) =>\n  @redirect gadget unless err? # redirects to \"/gadgets/1\"\n```\nor\n\n```coffeescript\n@redirect BatBelt.Gadget # redirects to \"/gadgets\"\n```\n\n### Controllers\n\nbatman.js controllers are singleton classes with one or more instance methods that can serve as routable actions. Because they're singletons, instance variables persist as long as the app is running.\n\n```coffeescript\nclass BatBelt.AppController extends Batman.Controller\n  index: ->\n\n  faq: (params) ->\n    @set('question', @get('questions').get(params.questionID)\n```\n\nNow when you navigate to `/#!/faq/what-is-art`, the dispatcher runs this `faq` action with `{questionID: \"what-is-art\"}`. It also makes an implicit call to `@render`, which by default will look for a view at `/views/app/faq.html`. The view is rendered within the main content container of the page, which is designated by setting `data-yield=\"main\"` on some tag in the layout's HTML. You can prevent this implicit rendering by calling `@render false` in your action.\n\nControllers are also a fine place to put event handlers used by your views. Here's one that uses [jQuery](http://jquery.com/) to toggle a CSS class on a button:\n\n```coffeescript\nclass MyApp.BigRedButtonController extends Batman.Controller\n  index: ->\n\n  buttonWasClicked: (node, event) ->\n    $(node).toggleClass('activated')\n```\n\nIf you want to redirect to some route, you can use `@redirect`:\n\n```coffeescript\nbuttonWasClicked: (node, event) ->\n  $(node).toggleClass('activated')\n  @redirect '/apocalypse/'\n```\n\n### Views\n\nYou write views in plain HTML. These aren't templates in the usual sense: the HTML is rendered in the page as-is, and you use `data-*` attributes to specify how different parts of the view bind to your app's data. Here's a very small view which displays a user's name and avatar:\n\n```html\n<div class=\"user\">\n  <img data-bind-src=\"user.avatarURL\" />\n  <p data-bind=\"user.name\"></p>\n</div>\n```\n\nThe `data-bind` attribute on the `<p>` tag sets up a binding between the user's `name` property and the content of the tag. The `data-bind-src` attribute on the `<img>` tag binds the user's `avatarURL` property to the `src` attribute of the tag. You can do the same thing for arbitrary attribute names, so for example `data-bind-href` would bind to the `href` attribute.\n\nbatman.js uses a bunch of these data attributes for different things:\n\n#### Binding properties\n\n* `data-bind=\"foo.bar\"`: for most tags, this defines a one-way binding with the contents of the node: when the given property `foo.bar` changes, the contents of the node are set to that value. When `data-bind` is set on a form input tag, a _two-way_ binding is defined with the _value_ of the node, such that any changes from the user will update the property in realtime.\n\n* `data-bind-foo=\"bar.baz\"`: defines a one-way binding from the given property `bar.baz` to any attribute `foo` on the node.\n\n* `data-foreach-bar=\"foo.bars\"`: used to render a collection of zero or more items. If the collection descends from `Batman.Set`, then the DOM will be updated when items are added or removed.\n\n#### Handling DOM events\n\n* `data-event-click=\"foo.bar\"`: when this node is clicked, the function specified by the keypath `foo.bar` is called with the node object as the first argument, and the click event as the second argument.\n\n* `data-event-change=\"foo.bar\"`: like `data-event-click`, but fires on change events.\n\n* `data-event-submit=\"foo.bar\"`: like `data-event-click`, but fires either when a form is submitted (in the case of `<form>` nodes) or when a user hits the enter key when an `<input>` or `<textarea>` has focus.\n\n#### Managing contexts\n\n* `data-context=\"foo.bar\"`: pushes a new context onto the context stack for children of this node. If the context is `foo.bar`, then children of this node may access properties on `foo.bar` directly, as if they were properties of the controller.\n\n#### Rendering Views\n\n* `data-yield=\"identifier\"`: used in your layout to specify the locations that other views get rendered into when they are rendered. By default, a controller action renders each whole view into whichever node is set up to yield `\"main\"`. If you want some content in a view to be rendered into a different `data-yield` node, you can use `data-contentfor`.\n\n* `data-contentfor=\"identifier\"`: when the view is rendered into your layout, the contents of this node will be rendered into whichever node has `data-yield=\"identifier\"`. For example, if your layout has `\"main\"` and `\"sidebar\"` yields, then you may put a `data-contentfor=\"sidebar\"` node in a view and it will be rendered in the sidebar instead of the main content area. If multiple `data-contentfor` nodes with the same identifier are present in a view, their contents will be concatenated in the corresponding `data-yield` node.\n\n* `data-partial=\"shared/sidebar\"`: renders the view at the path `/views/shared/sidebar.html` within this node. Note that `/views/` is prepended.\n\n* `data-route=\"/some/path\"` or `data-route=\"some.model\"`: loads a route when this node is clicked. The route can either be specified by a path beginning with a slash \"/\", or by a property leading to either a model instance (resulting in a resource's \"show\" action) or a model class (for the resource's \"index\" action).\n\n\n### Models\n\nbatman.js models:\n\n* can persist to various storage backends\n* only serialize a defined subset of their properties as JSON\n* use a state machine to expose lifecycle events\n* can validate with synchronous or asynchronous operations\n\n#### Attributes\n\nA model object may have arbitrary properties set on it, just like any JS object. Only some of those properties are serialized and persisted to its storage backends, however. You define persisted attributes on a model with the `encode` macro:\n\n```coffeescript\n  class Article extends Batman.Model\n    @encode 'body_html', 'title', 'author', 'summary_html', 'blog_id', 'id', 'user_id'\n    @encode 'created_at', 'updated_at', 'published_at', Batman.Encoders.railsDate\n    @encode 'tags',\n      encode: (tagSet) -> tagSet.toArray().join(', ')\n      decode: (tagString) -> new Batman.Set(tagString.split(', ')...)\n```\n\nGiven one or more strings as arguments, `@encode` will register these properties as persisted attributes of the model, to be serialized in the model's `toJSON()` output and extracted in its `fromJSON()`. Properties that aren't specified with `@encode` will be ignored for both serialization and deserialization. If an optional coder object is provided as the last argument, its `encode` and `decode` functions will be used by the model for serialization and deserialization, respectively.\n\nBy default, a model's primary key (the unchanging property which uniquely indexes its instances) is its `id` property. If you want your model to have a different primary key, specify the name of the key on the `primaryKey` class property:\n\n```coffeescript\nclass User extends Batman.Model\n  @primaryKey: 'handle'\n  @encode 'handle', 'email'\n```\n\n#### States\n\n* `empty`: a new model instance remains in this state until some persisted attribute is set on it.\n* `loading`: entered when the model instance's `load()` method is called.\n* `loaded`: entered after the model's storage adapter has completed loading updated attributes for the instance. Immediately transitions to the `clean` state.\n* `dirty`: entered when one of the model's persisted attributes changes.\n* `validating`: entered when the validation process has started.\n* `validated`: entered when the validation process has completed. Immediately after entering this state, the model instance transitions back to either the `dirty` or `clean` state.\n* `saving`: entered when the storage adapter has begun saving the model.\n* `saved`: entered after the model's storage adapter has completed saving the model. Immediately transitions to the `clean` state.\n* `clean`: indicates that none of an instance's attributes have been changed since the model was `saved` or `loaded`.\n* `destroying`: entered when the model instance's `destroy()` method is called.\n* `destroyed`: indicates that the storage adapter has completed destroying this instance.\n\n#### Validation\n\nBefore models are saved to persistent storage, they run through any validations you've defined and the save is cancelled if any errors were added to the model during that process.\n\nValidations are defined with the `@validate` macro by passing it the properties to be validated and an options object representing the particular validations to perform:\n\n```coffeescript\nclass User extends Batman.Model\n  @encode 'login', 'password'\n  @validate 'login', presence: yes, maxLength: 16\n  @validate 'password', 'passwordConfirmation', presence: yes, lengthWithin: [6,255]\n```\n\nThe options get their meaning from subclasses of `Batman.Validator` which have been registered by adding them to the `Batman.Validators` array. For example, the `maxLength` and `lengthWithin` options are used by `Batman.LengthValidator`.\n\n\n#### Persistence\n\nTo specify a storage adapter for persisting a model, use the `@persist` macro in its class definition:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.LocalStorage\n```\n\nNow when you call `save()` or `load()` on a product, it will use the browser window's [localStorage](https://developer.mozilla.org/en/dom/storage) to retrieve or store the serialized data.\n\nIf you have a REST backend you want to connect to, `Batman.RestStorage` is a simple storage adapter which can be subclassed and extended to suit your needs. By default, it will assume your CamelCased-singular `Product` model is accessible at the underscored-pluralized \"/products\" path, with instances of the resource accessible at `/products/:id`. You can override these path defaults by assigning either a string or a function-returning-a-string to the `url` property of your model class (for the collection path) or to the prototype (for the member path). For example:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.RestStorage\n  @url = \"/admin/products\"\n  url: -> \"/admin/products/#{@get('id')}\"\n```\n\n#### Associations\n\nBatman models support `belongsTo`, `hasOne`, and `hasMany` associations. Here's a simple example:\n\n```coffeescript\nclass App.Store extends Batman.Model\n  @hasMany 'products', options\n\nclass App.Product extends Batman.Model\n  @belongsTo 'store', options\n```\n\nThe following options are available:\n\n*  _namespace_: Tells Batman to look for the associated model under the provided namespace. (Defaults to `Batman.currentApp`.)\n*  _name_: Tells Batman to use the given model name instead. (Defaults to an interpretation of the association's label.)\n*  _saveInline_: Tells Batman whether to encode associations as inline JSON when the base model is saved. (Defaults to `false` for `belongsTo`, and `true` for `hasOne` and `hasMany`.)\n*  _autoload_: Tells Batman whether to make a request to the server the first time the association is `get`ted. Defaults to true.\n\nAssociations can be loaded via foreign keys or inline JSON:\n\n```coffeescript\nlocalStorage =\n  stores1:\n    id: 1\n    name: \"JSON Store\"\n    product: {id: 1, store_id: 1, name: \"JSON Product\"}\n\n  stores2:\n    id: 2\n    name: \"Foreign Key Store\"\n  products3:\n    id: 3\n    store_id: 2\n    name: \"Foreign Key Product Product\"\n```\n\nAssociation saving is done inline:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nproduct1 = new Product name: \"Foo\"\nproduct2 = new Product name: \"Bar\"\n\nstore.set 'products', new Batman.Set(product1, product2)\nstore.save (error, record) ->\n  throw error if error\n  console.log localStorage[\"stores#{record.get('id')}\"]\n  # => {\n  #   id: ...\n  #   name: \"Angry Birds\"\n  #   products: [{name: \"Foo\", store_id: ...}, {name: \"Bar\", store_id: ...}]\n  # }\n```\n\n(Notice that the products did not receive IDs. This is because association saving is non-cascading, meaning that each model needs to be saved individually to fully persist. You can always call `toJSON` on a model instance to see what will be stored.)\n\nAssociations also support reloading and loaded introspection:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nstore.get('products.loaded') #=> false\nstore.get('products').load (err, products) ->\n  throw err if err\n  store.get('products.loaded') #=> true\n```\n\nAssociations can be rendered via keypaths, using the same labels you use to create the association:\n\n```html\n<div data-foreach-product=\"store.products\" data-bind=\"product.name\"></div>\n```\n\n# Contributing\n\n[![Build Status](https://secure.travis-ci.org/Shopify/batman.png)](http://travis-ci.org/Shopify/batman)\n\nWell-tested contributions are always welcome! Here's what you should do:\n\n#### 1. Clone the repo\n\n```bash\ngit clone https://github.com/Shopify/batman.git\n```\n\n#### 2. Run the tests\n\nYou can test batman.js locally either on the command line or in the browser and both should work. Tests are written in CoffeeScript using [QUnit](http://docs.jquery.com/QUnit#API_documentation).\n\nTo run on the command line, run the following command from the project root:\n\n```bash\ncake test\n```\n\nTo run in the browser, start a web server to serve up the tests:\n\n```bash\ncoffee tests/serve.coffee\n```\n\n...then visit `http://localhost:1047/tests/batman/test.html`.\n\n#### 3. Write some test-driven code\n\nThe tests are in `tests/batman`. All test files in there are automatically included into the browser.\n\n#### 4. Create a pull request\n\nIf it's good code that fits with the goals of the project, we'll merge it in!\n\n# License\n\nbatman.js is copyright 2012 by [Shopify](http://www.shopify.com), released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}]},"0.11.2":{"name":"batman","description":"A client side JavaScript framework that helps you build rich, single-page applications with power and speed.","author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"contributors":[{"name":"Harry Brundage","email":"harry.brundage@shopify.com","url":"http://github.com/hornairs"},{"name":"James MacAulay","email":"james@shopify.com","url":"http://github.com/jamesmacaulay"},{"name":"Kamil Tusznio","email":"kamil.tusznio@shopify.com","url":"http://github.com/ktusznio"}],"version":"0.11.2","homepage":"http://batmanjs.org","repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"main":"./lib/dist/batman.node.js","bin":{"batman":"./tools/batman"},"scripts":{"test":"./node_modules/.bin/cake test","build":"./node_modules/.bin/cake build"},"dependencies":{"connect":"~>1.8.5 || ~>2.2.1","coffee-script":"~>1.3.2"},"devDependencies":{"daemon":"~>0.3.0","docco":"~>0.3.0","glob":"~>3.0.1","q":"~>0.8.0","muffin":"~>0.6.1","uglify-js":"1.2.5","temp":"~>0.4.0","qqunit":"~>0.4.1","percolate":"~>0.4.1","connect-assets":"~>2.2.0","liquor":"~>0.0.0"},"engines":{"node":"~>0.6.0 || ~>0.8.0"},"optionalDependencies":{},"_npmUser":{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},"_id":"batman@0.11.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"f7e29df6ba2fce86e9e6196a5fa4387583e4f2f8","tarball":"http://registry.npmjs.org/batman/-/batman-0.11.2.tgz"},"readme":"# batman.js\n\n[batman.js](http://batmanjs.org/) is a framework for building rich single-page browser applications. It is written in [CoffeeScript](http://jashkenas.github.com/coffee-script/) and its API is developed with CoffeeScript in mind, but of course you can use plain old JavaScript too.\n\n#### It's got:\n\n* a stateful MVC architecture\n* a powerful binding system\n* routable controller actions\n* pure HTML views\n* toolchain support built on [node.js](http://nodejs.org) and [cake](http://jashkenas.github.com/coffee-script/#cake)\n\nThe APIs are heavily inspired by [Rails](http://rubyonrails.org/) and designed to make Rails devs feel right at home.\n\nWe're targeting Chrome, Safari 4+, Firefox 3+, and IE 7+ for compatibility, although some of those require you to include [es5shim](https://github.com/kriskowal/es5-shim).\n\n#### Here's some code:\n\n```coffeescript\nclass Shopify extends Batman.App\n  @root 'products#index'\n\n  @resources 'products'\n\nclass Shopify.Product extends Batman.Model\n  @persist Batman.RestStorage\n\nclass Shopify.ProductsController extends Batman.Controller\n  index: ->\n\n  show: (params) ->\n    Shopify.Product.find params.id, (err, product) =>\n      @set('product', product)\n```\n\n#### views/products/index.html\n\n```html\n<ul id=\"products\">\n  <li data-foreach-product=\"Product.all\" data-mixin=\"animation\">\n    <a data-route=\"product\" data-bind=\"product.name\">name will go here</a>\n  </li>\n\n  <li><span data-bind=\"'product' | pluralize products.length\"></span></li>\n</ul>\n```\n\n## Installation\n\nIf you haven't already, you'll need to install [node.js](http://nodejs.org) (0.6.x and 0.8.x supported) and [npm](http://npmjs.org/). Then:\n\n```bash\nnpm install -g batman\n```\n\nGenerate a new batman.js app somewhere, called my_app:\n\n```bash\ncd ~/code\nbatman new my_app\n```\n\nFire it up:\n\n```bash\ncd my_app\nbatman server # (or just \"batman s\")\n```\n\nNow visit [http://localhost:1047](http://localhost:1047) and start playing around!\n\n## The Basics\n\nMost of the classes you work with in your app code will descend from `Batman.Object`, which gives you some nice things that are used extensively by the rest of the system.\n\n### Events\n\nEvents in batman.js are pretty simple. Handling an event is like subscribing to a named channel on a particular object, and firing an event is like publishing an argument list (which might be empty) to all subscribers of that channel.\n\n```coffeescript\nclass BatBelt.Gadget extends Batman.Object\n  constructor: -> @usesRemaining = 5\n  use: (howManyTimes) ->\n    if howManyTimes <= @usesRemaining\n      @usesRemaining -= howManyTimes\n      @fire('use', howManyTimes)\n```\n\nYou can use the `on` method to register handler functions which then get called whenever `fire` is called for the specified event name. The handlers get whichever extra arguments were passed to `fire` after the event name itself:\n\n```coffeescript\ngadget.on 'use', (howManyTimes) ->\n  console.log \"gadget was used #{howManyTimes} times!\"\ngadget.use(2)\n# console output: \"gadget was used 2 times!\"\n```\n\n### Properties\n\nThe `observe` function is used to observe changes to properties. This forms the basis of the binding system. Here's a simple example:\n\n```coffeescript\ngadget.observe 'name', (newVal, oldVal) ->\n  console.log \"name changed from #{oldVal} to #{newVal}!\"\ngadget.set 'name', 'Batarang'\n# console output: \"name changed from undefined to Batarang!\"\n```\n\nWhen you `observe` a property, you are really just handling its \"change\" event, which happens to get fired with the new and old values.\n\nOf course you can also `get` properties to return their values, and if you want to remove them completely then you can `unset` them:\n\n```coffeescript\ngadget.get 'name'\n# returns: 'Batarang'\ngadget.unset 'name'\n# console output: \"name changed from Batarang to undefined!\"\n```\n\nBy default, these properties are stored like plain old JavaScript properties: that is, `gadget.name` would return \"Batarang\" just like you'd expect. But if you set the gadget's name with `gadget.name = 'Shark Spray'`, then the observer function you set on `gadget` will not fire. So when you're working with batman.js properties, use `get`/`set`/`unset` to read/write/delete them.\n\n\n### Custom Accessors\n\nWhat's the point of using `gadget.get 'name'` instead of just `gadget.name`? Well, batman.js properties don't always correspond with vanilla JS properties. Let's write a `Box` class with a custom getter for its volume:\n\n```coffeescript\nclass Box extends Batman.Object\n  constructor: (@length, @width, @height) ->\n  @accessor 'volume',\n    get: (key) -> @get('length') * @get('width') * @get('height')\n\nbox = new Box(16,16,12)\nbox.get 'volume'\n# returns 3072\n```\n\nThe really cool thing about this is that, because we used `@get` to access the component properties of `volume`, batman.js can keep track of those dependencies and let us observe the `volume` directly:\n\n```coffeescript\nbox.observe 'volume', (newVal, oldVal) ->\n  console.log \"volume changed from #{oldVal} to #{newVal}!\"\nbox.set 'height', 6\n# console output: \"volume changed from 3072 to 1536!\"\n```\n\nThe box's `volume` is a read-only attribute here, because we only provided a getter in the accessor we defined. Here's a `Person` class with a (rather naive) read-write accessor for their name:\n\n```coffeescript\nclass Person extends Batman.Object\n  constructor: (name) -> @set 'name', name\n  @accessor 'name',\n    get: (key) -> [@get('firstName'), @get('lastName')].join(' ')\n    set: (key, val) ->\n      [first, last] = val.split(' ')\n      @set 'firstName', first\n      @set 'lastName', last\n    unset: (key) ->\n      @unset 'firstName'\n      @unset 'lastName'\n```\n\n### Keypaths\n\nIf you want to get at properties of properties, use keypaths:\n\n```coffeescript\nemployee.get 'team.manager.name'\n```\n\nThis does what you expect and is pretty much the same as `employee.get('team').get('manager').get('name')`. If you want to observe a deep keypath for changes, go ahead:\n\n```coffeescript\nemployee.observe 'team.manager.name', (newVal, oldVal) ->\n  console.log \"you now answer to #{newVal || 'nobody'}!\"\nmanager = employee.get 'team.manager'\nmanager.set 'name', 'Bill'\n# console output: \"you now answer to Bill!\"\n```\n\nIf any component of the keypath is set to something that would change the overall value, then observers will fire:\n\n```coffeescript\nemployee.set 'team', larrysTeam\n# console output: \"you now answer to Larry!\"\nemployee.team.unset 'manager'\n# console output: \"you now answer to nobody!\"\nemployee.set 'team', jessicasTeam\n# console output: \"you now answer to Jessica!\"\n```\n\nbatman.js's dependency tracking system makes sure that no matter how weird your object graph gets, your observers will fire exactly when they should.\n\n## Architecture\n\nThe MVC architecture of batman.js fits together like this:\n\n* Controllers are persistent objects which render the views and give them mediated access to the model layer.\n* Views are written in pure HTML, and use `data-*` attributes to create bindings with model data and event handlers exposed by the controllers.\n* Models have validations, lifecycle events, a built-in identity map, and can use arbitrary storage backends (`Batman.LocalStorage`, `Batman.RestStorage`, and `Batman.RailsStorage` are included).\n\nA batman.js application is served up in one page load, followed by asynchronous requests for various resources as the user interacts with the app. Navigation within the app uses [pushState](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries) where supported, otherwise falling back to [hash-bang fragment identifers](http://www.w3.org/QA/2011/05/hash_uris.html).\n\n\n### The App Class\n\nSitting in front of everything else is a subclass of `Batman.App` which represents your application as a whole and acts as a namespace for your other app classes. The app class never gets instantiated; your main interactions with it are using macros in its class definition, and calling `run()` on it when it's time to fire up your app.\n\nHere's a simple app class:\n\n```coffeescript\nclass BatBelt extends Batman.App\n  @root 'app#index'\n  @route 'faq/:questionID', 'app#faq'\n  @resources 'gadgets'\n```\n\nThe calls to `@controller` and `@model` load external app classes with XHRs. For the controllers, this ends up fetching `/controllers/app_controller.coffee` and `/controllers/gadgets_controller.coffee`. The gadget model gets loaded from `/models/gadget.coffee`.\n\n#### Routes\n\nRoutes are defined in a few different ways.\n\n`@route` takes two strings, one representing a path pattern and the other representing a controller action. In the above example, `'faq/:questionID'` matches any path starting with \"/faq/\" and having one other segment. That segment is then passed as a named param to the controller action function specified by the second string argument.\n\nFor the FAQ route, `'app#faq'` specifies the `faq` function on `BatBelt.AppController`, which should take a `params` argument and do something sensible with `params.questionID`.\n\n`@root 'app#index'` is just a shorthand for `@route '/', 'app#index'`.\n\nThe `@resources` macro takes a resource name which should ideally be the underscored-pluralized name of one of your models. It sets up three routes, as if you'd used the `@route` macro like so:\n\n```coffeescript\n@route 'gadgets', 'gadgets#index'\n@route 'gadgets/new', 'gadgets#new'\n@route 'gadgets/:id', 'gadgets#show'\n@route 'gadgets/:id/edit', 'gadgets#edit'\n```\n\n`@resources` can also take a list of labels to set up routing for multiple models at once:\n\n```coffeescript\n@resources 'stores', 'products', 'customers'\n```\n\nIn addition to setting up these routes, the call to `@resources` keeps track of the fact that the `Gadget` model can be accessed in these ways. This lets you load these routes in your controllers or views by using model instances and classes on their own:\n\n```coffeescript\nBatBelt.Gadget.find 1, (err, gadget) =>\n  @redirect gadget unless err? # redirects to \"/gadgets/1\"\n```\nor\n\n```coffeescript\n@redirect BatBelt.Gadget # redirects to \"/gadgets\"\n```\n\n### Controllers\n\nbatman.js controllers are singleton classes with one or more instance methods that can serve as routable actions. Because they're singletons, instance variables persist as long as the app is running.\n\n```coffeescript\nclass BatBelt.AppController extends Batman.Controller\n  index: ->\n\n  faq: (params) ->\n    @set('question', @get('questions').get(params.questionID)\n```\n\nNow when you navigate to `/#!/faq/what-is-art`, the dispatcher runs this `faq` action with `{questionID: \"what-is-art\"}`. It also makes an implicit call to `@render`, which by default will look for a view at `/views/app/faq.html`. The view is rendered within the main content container of the page, which is designated by setting `data-yield=\"main\"` on some tag in the layout's HTML. You can prevent this implicit rendering by calling `@render false` in your action.\n\nControllers are also a fine place to put event handlers used by your views. Here's one that uses [jQuery](http://jquery.com/) to toggle a CSS class on a button:\n\n```coffeescript\nclass MyApp.BigRedButtonController extends Batman.Controller\n  index: ->\n\n  buttonWasClicked: (node, event) ->\n    $(node).toggleClass('activated')\n```\n\nIf you want to redirect to some route, you can use `@redirect`:\n\n```coffeescript\nbuttonWasClicked: (node, event) ->\n  $(node).toggleClass('activated')\n  @redirect '/apocalypse/'\n```\n\n### Views\n\nYou write views in plain HTML. These aren't templates in the usual sense: the HTML is rendered in the page as-is, and you use `data-*` attributes to specify how different parts of the view bind to your app's data. Here's a very small view which displays a user's name and avatar:\n\n```html\n<div class=\"user\">\n  <img data-bind-src=\"user.avatarURL\" />\n  <p data-bind=\"user.name\"></p>\n</div>\n```\n\nThe `data-bind` attribute on the `<p>` tag sets up a binding between the user's `name` property and the content of the tag. The `data-bind-src` attribute on the `<img>` tag binds the user's `avatarURL` property to the `src` attribute of the tag. You can do the same thing for arbitrary attribute names, so for example `data-bind-href` would bind to the `href` attribute.\n\nbatman.js uses a bunch of these data attributes for different things:\n\n#### Binding properties\n\n* `data-bind=\"foo.bar\"`: for most tags, this defines a one-way binding with the contents of the node: when the given property `foo.bar` changes, the contents of the node are set to that value. When `data-bind` is set on a form input tag, a _two-way_ binding is defined with the _value_ of the node, such that any changes from the user will update the property in realtime.\n\n* `data-bind-foo=\"bar.baz\"`: defines a one-way binding from the given property `bar.baz` to any attribute `foo` on the node.\n\n* `data-foreach-bar=\"foo.bars\"`: used to render a collection of zero or more items. If the collection descends from `Batman.Set`, then the DOM will be updated when items are added or removed.\n\n#### Handling DOM events\n\n* `data-event-click=\"foo.bar\"`: when this node is clicked, the function specified by the keypath `foo.bar` is called with the node object as the first argument, and the click event as the second argument.\n\n* `data-event-change=\"foo.bar\"`: like `data-event-click`, but fires on change events.\n\n* `data-event-submit=\"foo.bar\"`: like `data-event-click`, but fires either when a form is submitted (in the case of `<form>` nodes) or when a user hits the enter key when an `<input>` or `<textarea>` has focus.\n\n#### Managing contexts\n\n* `data-context=\"foo.bar\"`: pushes a new context onto the context stack for children of this node. If the context is `foo.bar`, then children of this node may access properties on `foo.bar` directly, as if they were properties of the controller.\n\n#### Rendering Views\n\n* `data-yield=\"identifier\"`: used in your layout to specify the locations that other views get rendered into when they are rendered. By default, a controller action renders each whole view into whichever node is set up to yield `\"main\"`. If you want some content in a view to be rendered into a different `data-yield` node, you can use `data-contentfor`.\n\n* `data-contentfor=\"identifier\"`: when the view is rendered into your layout, the contents of this node will be rendered into whichever node has `data-yield=\"identifier\"`. For example, if your layout has `\"main\"` and `\"sidebar\"` yields, then you may put a `data-contentfor=\"sidebar\"` node in a view and it will be rendered in the sidebar instead of the main content area. If multiple `data-contentfor` nodes with the same identifier are present in a view, their contents will be concatenated in the corresponding `data-yield` node.\n\n* `data-partial=\"shared/sidebar\"`: renders the view at the path `/views/shared/sidebar.html` within this node. Note that `/views/` is prepended.\n\n* `data-route=\"/some/path\"` or `data-route=\"some.model\"`: loads a route when this node is clicked. The route can either be specified by a path beginning with a slash \"/\", or by a property leading to either a model instance (resulting in a resource's \"show\" action) or a model class (for the resource's \"index\" action).\n\n\n### Models\n\nbatman.js models:\n\n* can persist to various storage backends\n* only serialize a defined subset of their properties as JSON\n* use a state machine to expose lifecycle events\n* can validate with synchronous or asynchronous operations\n\n#### Attributes\n\nA model object may have arbitrary properties set on it, just like any JS object. Only some of those properties are serialized and persisted to its storage backends, however. You define persisted attributes on a model with the `encode` macro:\n\n```coffeescript\n  class Article extends Batman.Model\n    @encode 'body_html', 'title', 'author', 'summary_html', 'blog_id', 'id', 'user_id'\n    @encode 'created_at', 'updated_at', 'published_at', Batman.Encoders.railsDate\n    @encode 'tags',\n      encode: (tagSet) -> tagSet.toArray().join(', ')\n      decode: (tagString) -> new Batman.Set(tagString.split(', ')...)\n```\n\nGiven one or more strings as arguments, `@encode` will register these properties as persisted attributes of the model, to be serialized in the model's `toJSON()` output and extracted in its `fromJSON()`. Properties that aren't specified with `@encode` will be ignored for both serialization and deserialization. If an optional coder object is provided as the last argument, its `encode` and `decode` functions will be used by the model for serialization and deserialization, respectively.\n\nBy default, a model's primary key (the unchanging property which uniquely indexes its instances) is its `id` property. If you want your model to have a different primary key, specify the name of the key on the `primaryKey` class property:\n\n```coffeescript\nclass User extends Batman.Model\n  @primaryKey: 'handle'\n  @encode 'handle', 'email'\n```\n\n#### States\n\n* `empty`: a new model instance remains in this state until some persisted attribute is set on it.\n* `loading`: entered when the model instance's `load()` method is called.\n* `loaded`: entered after the model's storage adapter has completed loading updated attributes for the instance. Immediately transitions to the `clean` state.\n* `dirty`: entered when one of the model's persisted attributes changes.\n* `validating`: entered when the validation process has started.\n* `validated`: entered when the validation process has completed. Immediately after entering this state, the model instance transitions back to either the `dirty` or `clean` state.\n* `saving`: entered when the storage adapter has begun saving the model.\n* `saved`: entered after the model's storage adapter has completed saving the model. Immediately transitions to the `clean` state.\n* `clean`: indicates that none of an instance's attributes have been changed since the model was `saved` or `loaded`.\n* `destroying`: entered when the model instance's `destroy()` method is called.\n* `destroyed`: indicates that the storage adapter has completed destroying this instance.\n\n#### Validation\n\nBefore models are saved to persistent storage, they run through any validations you've defined and the save is cancelled if any errors were added to the model during that process.\n\nValidations are defined with the `@validate` macro by passing it the properties to be validated and an options object representing the particular validations to perform:\n\n```coffeescript\nclass User extends Batman.Model\n  @encode 'login', 'password'\n  @validate 'login', presence: yes, maxLength: 16\n  @validate 'password', 'passwordConfirmation', presence: yes, lengthWithin: [6,255]\n```\n\nThe options get their meaning from subclasses of `Batman.Validator` which have been registered by adding them to the `Batman.Validators` array. For example, the `maxLength` and `lengthWithin` options are used by `Batman.LengthValidator`.\n\n\n#### Persistence\n\nTo specify a storage adapter for persisting a model, use the `@persist` macro in its class definition:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.LocalStorage\n```\n\nNow when you call `save()` or `load()` on a product, it will use the browser window's [localStorage](https://developer.mozilla.org/en/dom/storage) to retrieve or store the serialized data.\n\nIf you have a REST backend you want to connect to, `Batman.RestStorage` is a simple storage adapter which can be subclassed and extended to suit your needs. By default, it will assume your CamelCased-singular `Product` model is accessible at the underscored-pluralized \"/products\" path, with instances of the resource accessible at `/products/:id`. You can override these path defaults by assigning either a string or a function-returning-a-string to the `url` property of your model class (for the collection path) or to the prototype (for the member path). For example:\n\n```coffeescript\nclass Product extends Batman.Model\n  @persist Batman.RestStorage\n  @url = \"/admin/products\"\n  url: -> \"/admin/products/#{@get('id')}\"\n```\n\n#### Associations\n\nBatman models support `belongsTo`, `hasOne`, and `hasMany` associations. Here's a simple example:\n\n```coffeescript\nclass App.Store extends Batman.Model\n  @hasMany 'products', options\n\nclass App.Product extends Batman.Model\n  @belongsTo 'store', options\n```\n\nThe following options are available:\n\n*  _namespace_: Tells Batman to look for the associated model under the provided namespace. (Defaults to `Batman.currentApp`.)\n*  _name_: Tells Batman to use the given model name instead. (Defaults to an interpretation of the association's label.)\n*  _saveInline_: Tells Batman whether to encode associations as inline JSON when the base model is saved. (Defaults to `false` for `belongsTo`, and `true` for `hasOne` and `hasMany`.)\n*  _autoload_: Tells Batman whether to make a request to the server the first time the association is `get`ted. Defaults to true.\n\nAssociations can be loaded via foreign keys or inline JSON:\n\n```coffeescript\nlocalStorage =\n  stores1:\n    id: 1\n    name: \"JSON Store\"\n    product: {id: 1, store_id: 1, name: \"JSON Product\"}\n\n  stores2:\n    id: 2\n    name: \"Foreign Key Store\"\n  products3:\n    id: 3\n    store_id: 2\n    name: \"Foreign Key Product Product\"\n```\n\nAssociation saving is done inline:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nproduct1 = new Product name: \"Foo\"\nproduct2 = new Product name: \"Bar\"\n\nstore.set 'products', new Batman.Set(product1, product2)\nstore.save (error, record) ->\n  throw error if error\n  console.log localStorage[\"stores#{record.get('id')}\"]\n  # => {\n  #   id: ...\n  #   name: \"Angry Birds\"\n  #   products: [{name: \"Foo\", store_id: ...}, {name: \"Bar\", store_id: ...}]\n  # }\n```\n\n(Notice that the products did not receive IDs. This is because association saving is non-cascading, meaning that each model needs to be saved individually to fully persist. You can always call `toJSON` on a model instance to see what will be stored.)\n\nAssociations also support reloading and loaded introspection:\n\n```coffeescript\nstore = new Store name: \"Angry Birds\"\nstore.get('products.loaded') #=> false\nstore.get('products').load (err, products) ->\n  throw err if err\n  store.get('products.loaded') #=> true\n```\n\nAssociations can be rendered via keypaths, using the same labels you use to create the association:\n\n```html\n<div data-foreach-product=\"store.products\" data-bind=\"product.name\"></div>\n```\n\n# Contributing\n\n[![Build Status](https://secure.travis-ci.org/Shopify/batman.png)](http://travis-ci.org/Shopify/batman)\n\nWell-tested contributions are always welcome! Here's what you should do:\n\n#### 1. Clone the repo\n\n```bash\ngit clone https://github.com/Shopify/batman.git\n```\n\n#### 2. Run the tests\n\nYou can test batman.js locally either on the command line or in the browser and both should work. Tests are written in CoffeeScript using [QUnit](http://docs.jquery.com/QUnit#API_documentation).\n\nTo run on the command line, run the following command from the project root:\n\n```bash\ncake test\n```\n\nTo run in the browser, start a web server to serve up the tests:\n\n```bash\ncoffee tests/serve.coffee\n```\n\n...then visit `http://localhost:1047/tests/batman/test.html`.\n\n#### 3. Write some test-driven code\n\nThe tests are in `tests/batman`. All test files in there are automatically included into the browser.\n\n#### 4. Create a pull request\n\nIf it's good code that fits with the goals of the project, we'll merge it in!\n\n# License\n\nbatman.js is copyright 2012 by [Shopify](http://www.shopify.com), released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}]}},"maintainers":[{"name":"nciagra","email":"nick@shopify.com"},{"name":"hornairs","email":"harry.brundage@jadedpixel.com"},{"name":"jamesmacaulay","email":"jmacaulay@gmail.com"}],"time":{"modified":"2012-07-17T17:30:03.616Z","created":"2011-08-24T23:07:26.106Z","0.5.0":"2012-01-24T15:48:26.278Z","0.5.1":"2012-01-24T15:50:35.920Z","0.6.0":"2012-01-24T15:51:26.066Z","0.6.1":"2012-01-24T15:52:08.565Z","0.7.0":"2012-01-24T15:53:36.317Z","0.7.5":"2012-01-24T15:54:11.510Z","0.8.0":"2011-11-22T21:24:07.847Z","0.9.0":"2012-04-02T02:04:41.298Z","0.10.0":"2012-05-30T13:36:45.103Z","0.11.0":"2012-06-25T19:35:23.686Z","0.11.1":"2012-07-11T18:37:24.735Z","0.11.2":"2012-07-17T17:30:03.616Z"},"author":{"name":"Nick Small","email":"nick@shopify.com","url":"http://github.com/nciagra"},"repository":{"type":"git","url":"git://github.com/Shopify/batman.git"},"_attachments":{"batman-0.11.2.tgz":{"content_type":"application/octet-stream","revpos":78,"digest":"md5-PjPoPQV25gASKdYkpPJFng==","length":4016198,"stub":true},"batman-0.11.1.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-JuZ5snUxR3GDgEn+R05GuQ==","length":4018231,"stub":true},"batman-0.11.0.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-IjOZkiD2NRA5XYx1q16EjQ==","length":4010594,"stub":true},"batman-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":72,"digest":"md5-R5WMOmumBhP4jYDYyxVpIQ==","length":4052578,"stub":true},"batman-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-UjLu5RHydKjN1Dvjs646Uw==","length":3890881,"stub":true},"batman-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-4+TH+qgrH/F+YrRTN7qXZQ==","length":4085760,"stub":true},"batman-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-DymuVmi9Flnn4bL1bumw8Q==","length":4055040,"stub":true},"batman-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-1DtN/QI8SklS5sHPk1tmXg==","length":4034560,"stub":true},"batman-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-QMUrLKVqHlNkLm20X2VVSw==","length":3983360,"stub":true},"batman-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-KEIKk+r7dkNY6OVmkG6c4w==","length":3952640,"stub":true},"batman-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-TbBIDh9w4ERCvKAei2NR+g==","length":3942400,"stub":true},"batman-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-qFZ+7vpNxfRqmnpRPC20tg==","length":4136960,"stub":true}}}},
{"id":"batteries","key":"batteries","value":{"rev":"21-0f7934e53cabff44db2539230101ffee"},"doc":{"_id":"batteries","_rev":"21-0f7934e53cabff44db2539230101ffee","name":"batteries","description":"A general purpose library for Node","dist-tags":{"latest":"0.4.2"},"versions":{"0.1.0":{"name":"batteries","description":"A general purpose library for Node","version":"0.1.0","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami.samhuri+batteries@gmail.com","url":"http://github.com/samsonjs/batteries/issues"},"directories":{"lib":"./lib"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/samsonjs/batteries/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"batteries@0.1.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"c1452ce07b10ee48502683cdf1c2a24d4124c523","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"batteries","description":"A general purpose library for Node","version":"0.1.1","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami.samhuri+batteries@gmail.com","url":"http://github.com/samsonjs/batteries/issues"},"directories":{"lib":"./lib"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/samsonjs/batteries/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"batteries@0.1.1","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"8eabf54cdfa80900029e60bbc8e4612a6e51ba68","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.1.1.tgz"},"scripts":{}},"0.2.0":{"name":"batteries","description":"A general purpose library for Node","version":"0.2.0","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami.samhuri+batteries@gmail.com","url":"http://github.com/samsonjs/batteries/issues"},"directories":{"lib":"./lib"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/samsonjs/batteries/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"batteries@0.2.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"09f135302fa20cae7a41fbb17e0b4d0e1da2d6e2","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.2.0.tgz"},"scripts":{}},"0.3.0":{"name":"batteries","description":"A general purpose library for Node","version":"0.3.0","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami@samhuri.net","url":"http://github.com/samsonjs/batteries/issues"},"directories":{"lib":"./lib"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/samsonjs/batteries/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"batteries@0.3.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4127dad249c6ff884fa83c54ab5958190899bc31","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.3.0.tgz"},"scripts":{}},"0.3.1":{"name":"batteries","description":"A general purpose library for Node","version":"0.3.1","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami@samhuri.net","url":"http://github.com/samsonjs/batteries/issues"},"directories":{"lib":"./lib"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/samsonjs/batteries/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"batteries@0.3.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d53829792ed29e4a51580cad122b30383195b33c","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.3.1.tgz"},"scripts":{}},"0.4.0":{"name":"batteries","description":"A general purpose library for Node","version":"0.4.0","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami@samhuri.net","url":"https://github.com/samsonjs/batteries/issues"},"directories":{"lib":"./lib"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":"0.4.x"},"licenses":[{"type":"MIT","url":"https://github.com/samsonjs/batteries/raw/master/LICENSE"}],"dependencies":{},"devDependencies":{},"_id":"batteries@0.4.0","_engineSupported":false,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5b4f98468ba623cd1f96d9e1a76cb01c48070ccb","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.4.0.tgz"},"scripts":{}},"0.4.1":{"name":"batteries","description":"A general purpose library for Node","version":"0.4.1","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami@samhuri.net","url":"https://github.com/samsonjs/batteries/issues"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":"0.4.x - 0.6.x"},"dependencies":{"strftime":"0.4.x"},"licenses":[{"type":"MIT","url":"https://github.com/samsonjs/batteries/raw/master/LICENSE"}],"_npmUser":{"name":"sjs","email":"sami@samhuri.net"},"_id":"batteries@0.4.1","devDependencies":{},"_engineSupported":false,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"33403bb50717e5186dfd854f86190d5ed5d86989","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.4.1.tgz"},"maintainers":[{"name":"sjs","email":"sami@samhuri.net"}]},"0.4.2":{"name":"batteries","description":"A general purpose library for Node","version":"0.4.2","homepage":"http://samhuri.net/proj/batteries","author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"bugs":{"email":"sami@samhuri.net","url":"https://github.com/samsonjs/batteries/issues"},"bin":{"node-batteries":"./repl.js"},"main":"./lib/index","engines":{"node":">=0.4.x"},"dependencies":{"strftime":"0.4.x"},"licenses":[{"type":"MIT","url":"https://github.com/samsonjs/batteries/raw/master/LICENSE"}],"devDependencies":{},"_npmUser":{"name":"sjs","email":"sami@samhuri.net"},"_id":"batteries@0.4.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"69513ae4f1d741560acc6f80132c647b134ad13d","tarball":"http://registry.npmjs.org/batteries/-/batteries-0.4.2.tgz"},"maintainers":[{"name":"sjs","email":"sami@samhuri.net"}]}},"maintainers":[{"name":"sjs","email":"sami@samhuri.net"}],"time":{"modified":"2011-11-06T02:00:50.763Z","created":"2011-05-14T03:42:57.374Z","0.1.0":"2011-05-14T03:42:58.210Z","0.1.1":"2011-05-14T04:27:09.773Z","0.2.0":"2011-05-14T23:34:50.226Z","0.3.0":"2011-05-30T07:06:44.039Z","0.3.1":"2011-05-30T08:13:00.460Z","0.4.0":"2011-06-05T05:02:02.523Z","0.4.1":"2011-11-06T01:44:31.814Z","0.4.2":"2011-11-06T02:00:50.763Z"},"author":{"name":"Sami Samhuri","email":"sami@samhuri.net"},"repository":{"type":"git","url":"git://github.com/samsonjs/batteries.git"},"_attachments":{"batteries-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-unHJ0kCmLVclDrghgccUkQ==","length":10240,"stub":true},"batteries-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-xcoR5uA3poqltaUJDAcUmQ==","length":10240,"stub":true},"batteries-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-bcPv+kk9XO3s3WG/7Bq06A==","length":8209,"stub":true},"batteries-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-j5eX93qYs0EyL92zWagadQ==","length":8230,"stub":true},"batteries-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-a1D5+pYyCm1OwC3vQWavQA==","length":7573,"stub":true},"batteries-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pbWP5qtjEzZLeBy+MXvDFA==","length":7537,"stub":true},"batteries-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qOvWQ00EFoWISmeWGQSRTA==","length":7567,"stub":true},"batteries-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+IROWkC1m8dMGfOMQuDf2w==","length":7545,"stub":true}}}},
{"id":"battery","key":"battery","value":{"rev":"6-20b7e34654a4f7ca86c7995aaa341bd1"},"doc":{"_id":"battery","_rev":"6-20b7e34654a4f7ca86c7995aaa341bd1","name":"battery","description":"command to check battery life","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://dominictarr.com"},"name":"battery","description":"command to check battery life","version":"0.0.0","homepage":"https://github.com/dominictarr/battery","repository":{"type":"git","url":"git://github.com/dominictarr/battery.git"},"bin":{"battery":"./index.sh"},"readme":"","_id":"battery@0.0.0","dist":{"shasum":"17b8673093980d503f53fe5c2fb602c752a53b80","tarball":"http://registry.npmjs.org/battery/-/battery-0.0.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://dominictarr.com"},"name":"battery","description":"command to check battery life","version":"0.1.0","homepage":"https://github.com/dominictarr/battery","repository":{"type":"git","url":"git://github.com/dominictarr/battery.git"},"bin":{"battery":"./index.sh"},"readme":"","_id":"battery@0.1.0","dist":{"shasum":"f2e6d7bd03bea00f1a34ca8f307d77f8ecf22172","tarball":"http://registry.npmjs.org/battery/-/battery-0.1.0.tgz"},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-08-02T13:43:53.667Z","created":"2012-07-25T09:29:13.747Z","0.0.0":"2012-07-25T09:29:21.246Z","0.1.0":"2012-07-30T12:02:30.111Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"http://dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/battery.git"},"users":{"fgribreau":true},"_attachments":{"battery-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2kEr+ZrGB268nt3h+QtSaA==","length":792,"stub":true},"battery-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Icb8yJoiY0Q5B5n0PAY0yg==","length":745,"stub":true}}}},
{"id":"battlefield","key":"battlefield","value":{"rev":"3-f3bc82a9277dad0499c5aec05e96a418"},"doc":{"_id":"battlefield","_rev":"3-f3bc82a9277dad0499c5aec05e96a418","name":"battlefield","description":"Client for connecting to Battlefield 3 servers.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Brian Barnekow"},"name":"battlefield","description":"Client for connecting to Battlefield 3 servers.","version":"0.1.0","homepage":"https://github.com/barncow/battlefield","repository":{"type":"git","url":"git://github.com/barncow/battlefield.git"},"main":"index.js","engines":{"node":">=0.6.0"},"dependencies":{"eventemitter2":">=0.4.1"},"devDependencies":{"should":">=0.3.2"},"_npmUser":{"name":"barncow","email":"brian.barnekow@gmail.com"},"_id":"battlefield@0.1.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"0c1ec661451631a6f9662bbd87ecdd8d867d603c","tarball":"http://registry.npmjs.org/battlefield/-/battlefield-0.1.0.tgz"},"maintainers":[{"name":"barncow","email":"brian.barnekow@gmail.com"}]}},"readme":null,"maintainers":[{"name":"barncow","email":"brian.barnekow@gmail.com"}],"time":{"modified":"2011-11-06T19:46:31.730Z","created":"2011-11-06T19:46:30.735Z","0.1.0":"2011-11-06T19:46:31.730Z"},"author":{"name":"Brian Barnekow"},"repository":{"type":"git","url":"git://github.com/barncow/battlefield.git"},"_attachments":{"battlefield-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q5EWMrd1l7tC7MQmZvVIHQ==","length":13850,"stub":true}}}},
{"id":"battlenet","key":"battlenet","value":{"rev":"3-ad2d8f4543f5082b3bf06923efee89ff"},"doc":{"_id":"battlenet","_rev":"3-ad2d8f4543f5082b3bf06923efee89ff","name":"battlenet","description":"Node.js client for the Blizzard Community Platform API","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Brandon Tilley","email":"brandon@brandontilley.com"},"name":"battlenet","description":"Node.js client for the Blizzard Community Platform API","version":"0.0.0","homepage":"https://github.com/BinaryMuse/node-battlenet","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"binarymuse","email":"brandon@brandontilley.com"},"_id":"battlenet@0.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ddec2fb12207430e365d649011d79e472a9858ee","tarball":"http://registry.npmjs.org/battlenet/-/battlenet-0.0.0.tgz"},"readme":"","maintainers":[{"name":"binarymuse","email":"brandon@brandontilley.com"}]}},"readme":"","maintainers":[{"name":"binarymuse","email":"brandon@brandontilley.com"}],"time":{"modified":"2012-05-12T02:22:10.591Z","created":"2012-05-12T02:22:07.179Z","0.0.0":"2012-05-12T02:22:10.591Z"},"author":{"name":"Brandon Tilley","email":"brandon@brandontilley.com"},"_attachments":{"battlenet-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qtpRCEXP08knYAPyQClFJg==","length":354,"stub":true}}}},
{"id":"baucis","key":"baucis","value":{"rev":"3-a7d0fcb989fcb06ce452d7a280dc7817"},"doc":{"_id":"baucis","_rev":"3-a7d0fcb989fcb06ce452d7a280dc7817","name":"baucis","description":"Module for automatically creating REST interfaces for mongoose schemata","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"baucis","version":"0.0.0","main":"index.js","scripts":{"test":"mocha --globals vegetables"},"repository":{"type":"git","url":"git://github.com/murmux/baucis.git"},"license":"GPLv3","description":"Module for automatically creating REST interfaces for mongoose schemata","devDependencies":{"mongoose":"~2.7.1","express":"~2.5.11"},"readme":"baucis\n=====================\n\n![David Rjckaert III - Philemon and Baucis Giving Hospitality to Jupiter and Mercury](http://github.com/murmux/baucis/raw/master/david_rijckaert_iii-philemon_and_baucis.jpg \"Hermes is like: 'Hey Baucis, don't kill that goose.  And thanks for the REST.'\")\n\nDavid Rijckaert - Philemon and Baucis Giving Hospitality to Jupiter and Mercury\n\nLike Baucis and Philemon of old, this library provides REST to the weary traveler.  Automatically creates REST services from Mongoose models:\n\n    var Vegetable = new Schema({\n      name: String\n    });\n\n    Vegetable.metadata({\n      singular: 'vegetable',\n      plural: 'vegetables'\n    });\n\n    var app = express.createServer();\n    app.configure(function(){\n      app.use(express.bodyParser());\n    });\n\n    // create RESTful routes\n    app.rest(Vegetable);\n\n    app.listen(80);\n\nLater make requests:\n\n * GET /vegetable/:id &mdash; get the addressed document\n * POST /vegetable/:id &mdash; currently unimplemented (in the future will push the data into a field specified for the addressed object)\n * PUT /vegetable/:id &mdash; create or update the given document\n * DEL /vegetable/:id &mdash; delete the addressed object\n\n * GET /vegetables/ &mdash; get all documents (in the future will accept query args to pass to the mongo server)\n * POST /vegetables/ &mdash; creates a new object and sends back its ID  \n * PUT /vegetables/ &mdash; replace all documents with given new documents\n * DEL /vegetables/ &mdash; delete all documents (also will accept query args in future)\n\nExamples with jQuery:\n\n    $.getJSON('/vegetable/4f4028e6e5139bf4e472cca1', function (data) {\n      console.log(data);\n    });\n\n    $.ajax({\n      type: 'POST',\n      dataType: 'json',\n      url: '/vegetables/',\n      data: { name: 'Potato' }\n    }).done(function( id ) {\n      console.log(id);\n    });\n\n\napp.rest will accept arrays, hashes, or single Schema objects.  An example with require-index:\n\n    var schemata = requireindex('./schemata');\n    app.rest(schemata);\n\nUse middleware for security, etc.  Middleware is plain old Connect middleware, so it can be used with pre-existing modules like passport.  Set the middleware metadata to a function or array of functions.\n\n    Vegetable.metadata({\n      singular: 'vegetable',\n      plural: 'vegetables',\n      middleware: function(request, response, next) {\n        if (request.isAuthenticated()) return next();\n        else return response.send(401);\n      }\n    });\n\nContact Info\n\n * http://william.nodejitsu.com/\n * @wprl\n\n&copy; 2012 William P. Riley-Land\nLicensed under the GPL v3  \nPlease fork and create issues!\n","_id":"baucis@0.0.0","dist":{"shasum":"6c099241ce48823d3cd1382c718df155537b4129","tarball":"http://registry.npmjs.org/baucis/-/baucis-0.0.0.tgz"},"maintainers":[{"name":"jagwio","email":"william.riley.land@gmail.com"}]}},"readme":"baucis\n=====================\n\n![David Rjckaert III - Philemon and Baucis Giving Hospitality to Jupiter and Mercury](http://github.com/murmux/baucis/raw/master/david_rijckaert_iii-philemon_and_baucis.jpg \"Hermes is like: 'Hey Baucis, don't kill that goose.  And thanks for the REST.'\")\n\nDavid Rijckaert - Philemon and Baucis Giving Hospitality to Jupiter and Mercury\n\nLike Baucis and Philemon of old, this library provides REST to the weary traveler.  Automatically creates REST services from Mongoose models:\n\n    var Vegetable = new Schema({\n      name: String\n    });\n\n    Vegetable.metadata({\n      singular: 'vegetable',\n      plural: 'vegetables'\n    });\n\n    var app = express.createServer();\n    app.configure(function(){\n      app.use(express.bodyParser());\n    });\n\n    // create RESTful routes\n    app.rest(Vegetable);\n\n    app.listen(80);\n\nLater make requests:\n\n * GET /vegetable/:id &mdash; get the addressed document\n * POST /vegetable/:id &mdash; currently unimplemented (in the future will push the data into a field specified for the addressed object)\n * PUT /vegetable/:id &mdash; create or update the given document\n * DEL /vegetable/:id &mdash; delete the addressed object\n\n * GET /vegetables/ &mdash; get all documents (in the future will accept query args to pass to the mongo server)\n * POST /vegetables/ &mdash; creates a new object and sends back its ID  \n * PUT /vegetables/ &mdash; replace all documents with given new documents\n * DEL /vegetables/ &mdash; delete all documents (also will accept query args in future)\n\nExamples with jQuery:\n\n    $.getJSON('/vegetable/4f4028e6e5139bf4e472cca1', function (data) {\n      console.log(data);\n    });\n\n    $.ajax({\n      type: 'POST',\n      dataType: 'json',\n      url: '/vegetables/',\n      data: { name: 'Potato' }\n    }).done(function( id ) {\n      console.log(id);\n    });\n\n\napp.rest will accept arrays, hashes, or single Schema objects.  An example with require-index:\n\n    var schemata = requireindex('./schemata');\n    app.rest(schemata);\n\nUse middleware for security, etc.  Middleware is plain old Connect middleware, so it can be used with pre-existing modules like passport.  Set the middleware metadata to a function or array of functions.\n\n    Vegetable.metadata({\n      singular: 'vegetable',\n      plural: 'vegetables',\n      middleware: function(request, response, next) {\n        if (request.isAuthenticated()) return next();\n        else return response.send(401);\n      }\n    });\n\nContact Info\n\n * http://william.nodejitsu.com/\n * @wprl\n\n&copy; 2012 William P. Riley-Land\nLicensed under the GPL v3  \nPlease fork and create issues!\n","maintainers":[{"name":"jagwio","email":"william.riley.land@gmail.com"}],"time":{"modified":"2012-07-14T19:56:20.023Z","created":"2012-07-14T19:56:17.292Z","0.0.0":"2012-07-14T19:56:20.023Z"},"repository":{"type":"git","url":"git://github.com/murmux/baucis.git"},"_attachments":{"baucis-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vZclvQCJPnUiDPvVTpfwpw==","length":152848,"stub":true}}}},
{"id":"bauhaus","key":"bauhaus","value":{"rev":"5-66c59c8b7f185d75fc9f7fff2412fc62"},"doc":{"_id":"bauhaus","_rev":"5-66c59c8b7f185d75fc9f7fff2412fc62","name":"bauhaus","description":"A library of functional, list, pagination, iteration methods for arrays for Client and Nodejs.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"bauhaus","version":"0.1.1","url":"http://www.unifiedapplications.com/github/Bauhaus","description":"A library of functional methods for Client and Nodejs.","keywords":["functional","underscore","array","javascript","nodejs","lists","list","data","data structures"],"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"main":"bauhaus","engines":{"node":">= 0.6.1"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Bauhaus.git"},"_npmUser":{"name":"sandropasquali","email":"spasquali@gmail.com"},"_id":"bauhaus@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"d4896bd8f388472744388fa12bda4edcc09bb9db","tarball":"http://registry.npmjs.org/bauhaus/-/bauhaus-0.1.1.tgz"},"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}]},"0.1.2":{"name":"bauhaus","version":"0.1.2","url":"http://www.unifiedapplications.com/github/Bauhaus","description":"A library of functional, list, pagination, iteration methods for arrays for Client and Nodejs.","keywords":["functional","underscore","array","javascript","nodejs","lists","list","data","data structures"],"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"main":"bauhaus","engines":{"node":">= 0.6.1"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Bauhaus.git"},"_npmUser":{"name":"sandropasquali","email":"spasquali@gmail.com"},"_id":"bauhaus@0.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"bc83cf31ba2de34ded4fe8ce0fc8b634a02ab808","tarball":"http://registry.npmjs.org/bauhaus/-/bauhaus-0.1.2.tgz"},"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}]}},"readme":null,"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}],"time":{"modified":"2012-01-30T14:11:21.874Z","created":"2012-01-29T22:29:00.209Z","0.1.1":"2012-01-29T22:29:00.802Z","0.1.2":"2012-01-30T14:11:21.874Z"},"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Bauhaus.git"},"_attachments":{"bauhaus-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lounhilzbQSwTEuzseXR9A==","length":5932,"stub":true},"bauhaus-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AQsMlnS7Hpq9/rSkjHnniA==","length":2421,"stub":true}}}},
{"id":"baunsu","key":"baunsu","value":{"rev":"3-6a188cb4ab298d72288cd68a5c3b9363"},"doc":{"_id":"baunsu","_rev":"3-6a188cb4ab298d72288cd68a5c3b9363","name":"baunsu","description":"Library to parse and detect bounced emails","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.1":{"name":"baunsu","description":"Library to parse and detect bounced emails","version":"0.2.1","engines":{"node":"*"},"main":"./lib/baunsu.js","author":{"name":"Ardie Saeidi","email":"ardalan.saeidi@gmail.com"},"repository":{"type":"git","url":"git://github.com/ardiesaeidi/node-baunsu.git"},"keywords":["bounce","bounced email","bounce detection","bounce parser","email","email parser"],"dependencies":{"hasshu":"0.2.x","iconv":"1.x.x"},"license":"MIT","_npmUser":{"name":"ardiesaeidi","email":"ardalan.saeidi@gmail.com"},"_id":"baunsu@0.2.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"376265b833d380b4e0bf5e3cf7f77ee439b1dc1a","tarball":"http://registry.npmjs.org/baunsu/-/baunsu-0.2.1.tgz"},"maintainers":[{"name":"ardiesaeidi","email":"ardalan.saeidi@gmail.com"}]}},"readme":"Baunsu\n======\nBaunsu (bounce in japanese) is an email bounce detection library inspired by [Lamson Project's bounce detection algorithm](http://lamsonproject.org/blog/2009-07-09.html \"Lamson Project's bounce detection algorithm\").\n\n\nUsage\n------\n    var fs = require('fs'), \n      Baunsu = require('baunsu');\n\n    fs.readFile('./bouncedEmail.txt', function(err, data) {\n      var bounce = new Baunsu();\n  \n      bounce.on('end', function(err, baunsuResult) {\n        if (err)\n          throw err;\n  \n        console.log(baunsuResult.bounced);\n      });\n  \n      bounce.detect(data);\n    });\n    \n\n\nInstallation\n============\n    npm install baunsu\n\n\n\nBaunsu\n===============\n\n## Methods:\n\ndetect(msg: Buffer or string)\n-------\nDetects bounce signatures in email asynchronously.\n\ndetectSync(msg: Buffer or string)\n-----------\nDetects bounce signatures in email and returns a BaunsuResult object.\n\n\n## Events:\n\n'line': function(line) {}\n--------------------------\nEmits every line being walked by baunsu.\n\n'match': function(match) {}\n---------------------------\nEmitted every time a bounce header is matched.\n    { header: string, match: string }\n\n'detect': function(detect) {}\n-----------------------------\nEmiited every time bounce signature is detected.\n    { header: string, matches: array }\n\n'end': function(baunsuResult) {}\n--------------------------------\nEmitted at the end of bounce detection.\n\n\n\nBaunsu Result\n================\n\n## Properties:\n\nmatches\n--------\nReturns a hash of matched email headers and regex values. (Hasshu instance)\n\nscore\n------\nCalculated score determining bounce probabilty.\n\nbounced\n--------\nReturns true/false if email is considered bounce. (Can be adjusted by threshold)\n\nthreshold\n----------\nSets bounce score threshold. Default is 0.3.\n\nstatus\n-------\nReturns object containing enhanced status code, class, subject and detail.\n\n    { \n      code: string,\n      class: { code: number, message: '' },\n      subject: { code: number, message: '' },\n      detail: { code: number, message: '' }\n    }\n\nremoteMta\n----------\nReturns array if remote mta headers were found.\n\nreportingMta\n-------------\nReturns array if reporting mta headers were found.\n\ndiagnosticCodes\n---------------\nReturns array if diagnostic codes were found.\n\naction\n-------\nReturns action value if header was found.\n\n\n## Methods:\n\nisHard\n--------\nReturns true if email is considered a hard bounce.\n\nisSoft\n--------\nReturns true if email is considered a soft bounce.\n\n\n\n\nLicense\n=======\n(The MIT License)\n\nCopyright (c) 2012 Ardie Saeidi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"ardiesaeidi","email":"ardalan.saeidi@gmail.com"}],"time":{"modified":"2012-06-01T07:32:40.587Z","created":"2012-06-01T07:32:39.107Z","0.2.1":"2012-06-01T07:32:40.587Z"},"author":{"name":"Ardie Saeidi","email":"ardalan.saeidi@gmail.com"},"repository":{"type":"git","url":"git://github.com/ardiesaeidi/node-baunsu.git"},"_attachments":{"baunsu-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IG+ceeb8mumFXX6Ks91cxg==","length":19737,"stub":true}}}},
{"id":"baxter","key":"baxter","value":{"rev":"7-83f447683f7326d2ed9d247f997d9ecc"},"doc":{"_id":"baxter","_rev":"7-83f447683f7326d2ed9d247f997d9ecc","name":"baxter","description":"Running a background job as long as the main process is alive","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"baxter","description":"Running a background job as long as the main process is alive","main":"./bin/baxter.js","version":"0.1.0","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"bin":{"baxter":"./bin/baxter"},"repository":{"type":"git","url":"git@github.com:jakobmattsson/baxter.git"},"engines":{"node":">=0.6.0"},"devDependencies":{"coffee-script":"1.3.x"},"scripts":{"prepublish":"mkdir -p bin && (echo '#!/usr/bin/env node' && coffee -p src/baxter.coffee) > bin/baxter.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"baxter@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f408aa68991055c561003df6cc5a28ee92af5780","tarball":"http://registry.npmjs.org/baxter/-/baxter-0.1.0.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.1.1":{"name":"baxter","description":"Running a background job as long as the main process is alive","main":"./bin/baxter.js","version":"0.1.1","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"bin":{"baxter":"./bin/baxter.js"},"repository":{"type":"git","url":"git@github.com:jakobmattsson/baxter.git"},"engines":{"node":">=0.6.0"},"devDependencies":{"coffee-script":"1.3.x"},"scripts":{"prepublish":"mkdir -p bin && (echo '#!/usr/bin/env node' && coffee -p src/baxter.coffee) > bin/baxter.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"baxter@0.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2ba8fc044b4104be5850560b2783680624a82abd","tarball":"http://registry.npmjs.org/baxter/-/baxter-0.1.1.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.2.0":{"name":"baxter","description":"Running a background job as long as the main process is alive","main":"./bin/baxter.js","version":"0.2.0","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"bin":{"baxter":"./bin/baxter.js"},"repository":{"type":"git","url":"git@github.com:jakobmattsson/baxter.git"},"engines":{"node":">=0.6.0"},"devDependencies":{"coffee-script":"1.3.x"},"scripts":{"prepublish":"mkdir -p bin && (echo '#!/usr/bin/env node' && coffee -p src/baxter.coffee) > bin/baxter.js"},"readme":"baxter\n======\n\nRunning a background job as long as the main process is alive","_id":"baxter@0.2.0","dist":{"shasum":"51090faeccc7c62697ac7458708b39e0c594acbc","tarball":"http://registry.npmjs.org/baxter/-/baxter-0.2.0.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]}},"readme":"baxter\n======\n\nRunning a background job as long as the main process is alive","maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}],"time":{"modified":"2012-08-10T17:35:30.887Z","created":"2012-08-03T17:50:47.278Z","0.1.0":"2012-08-03T17:50:48.777Z","0.1.1":"2012-08-03T17:54:55.295Z","0.2.0":"2012-08-10T17:35:30.887Z"},"author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"repository":{"type":"git","url":"git@github.com:jakobmattsson/baxter.git"},"_attachments":{"baxter-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-skB3yByYQdneCCF6aP2jmA==","length":1086,"stub":true},"baxter-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GoBRjGmeruwmLwUdd8wfDw==","length":1012,"stub":true},"baxter-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-27i41apFtYF4e/iIxewuYA==","length":1010,"stub":true}}}},
{"id":"bb","key":"bb","value":{"rev":"3-eaea4614531d4026659afaf1054e57c9"},"doc":{"_id":"bb","_rev":"3-eaea4614531d4026659afaf1054e57c9","name":"bb","description":"Build client-side libraries using CommonJS syntax","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bb","version":"0.0.1","description":"Build client-side libraries using CommonJS syntax","keywords":[],"author":{"name":"Matt Mueller","email":"mattmuelle@gmail.com"},"dependencies":{},"devDependencies":{"mocha":"*","should":"*"},"main":"index","readme":"\n# bb\n\n  Build client-side libraries using CommonJS syntax\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Matt Mueller &lt;mattmuelle@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"bb@0.0.1","dist":{"shasum":"ea01c0f2b2361e4fb902d12563f27950abbfc3a6","tarball":"http://registry.npmjs.org/bb/-/bb-0.0.1.tgz"},"maintainers":[{"name":"mattmueller","email":"mattmuelle@gmail.com"}]}},"readme":"\n# bb\n\n  Build client-side libraries using CommonJS syntax\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Matt Mueller &lt;mattmuelle@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"mattmueller","email":"mattmuelle@gmail.com"}],"time":{"modified":"2012-08-11T23:55:13.916Z","created":"2012-08-11T23:55:12.320Z","0.0.1":"2012-08-11T23:55:13.916Z"},"author":{"name":"Matt Mueller","email":"mattmuelle@gmail.com"},"_attachments":{"bb-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-D7Zf2Tj9aT1uOHFfPrauyQ==","length":1281,"stub":true}}}},
{"id":"bbb","key":"bbb","value":{"rev":"80-289ea09fce1e6c2229ed965f92214236"},"doc":{"_id":"bbb","_rev":"80-289ea09fce1e6c2229ed965f92214236","name":"bbb","description":"Backbone Boilerplate Build Tool","dist-tags":{"latest":"0.1.10"},"versions":{"0.0.0":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.0","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"~0.3.4","build-tasks":"*"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"1d085d9bbc5b53c4fa06cd5059bd9b13eca68b58","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.0.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.1":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.1","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.5","build-tasks":"0.0.1"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"c0fda70eb61c3e4a23d1daba378c69cadbf0d2cc","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.1.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.2":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.2","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.5","build-tasks":"0.1.0"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a016f59ba10fd3b7daa72d38ebaeb8c179ae31bf","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.2.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.3":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.3","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.5","build-tasks":"0.1.1"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"6fb00384c3c719b79208920c507e0e05a5668ddd","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.3.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.4":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.4","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.6","build-tasks":"0.1.1"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"982229a98451d166b1a3668d4137171b44e9ddf2","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.4.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.5":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.5","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.6","rimraf":"1.0.9","less":"1.2.1","clean-css":"0.3.2","requirejs":"1.0.7","express":"2.5.4"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"90f23ed00f5f0ff38b0a407b02d69d9a4e9a5749","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.5.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.6":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.6","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.6","rimraf":"1.0.9","less":"1.2.1","clean-css":"0.3.2","requirejs":"1.0.7","express":"2.5.4"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ce29017509408e39b7fa0ac140518e5e36735bef","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.6.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.7":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.7","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.6","rimraf":"1.0.9","less":"1.2.1","clean-css":"0.3.2","requirejs":"1.0.7","express":"2.5.4"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"af8619b84ac91844947867549dda70067742fe69","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.7.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.8":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.8","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.9","rimraf":"1.0.9","less":"1.2.1","clean-css":"0.3.2","requirejs":"1.0.7","express":"2.5.4"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"610ec5cf26f2cd8f403fdeb321afda91d5f16264","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.8.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.0.9":{"name":"bbb","description":"Backbone Boilerplate","version":"0.0.9","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.9","grunt-contrib":"0.0.4","requirejs":"2.0.0","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.0.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"693ddc6ed86124dcc55d4be888e95ef0786b2972","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.0.9.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.0":{"name":"bbb","description":"Backbone Boilerplate","version":"0.1.0","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.9","grunt-contrib":"0.0.4","requirejs":"2.0.0","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c2c67877ebfc1a1d9b972d5456ef74de706a5aeb","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.0.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.1":{"name":"bbb","description":"Backbone Boilerplate","version":"0.1.1","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.9","grunt-contrib":"0.0.4","requirejs":"2.0.1","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0e7cc90f22e1c85ae360f06f4842799bb75fa53b","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.1.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.2":{"name":"bbb","description":"Backbone Boilerplate","version":"0.1.2","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.9","grunt-contrib":"0.0.7","requirejs":"2.0.2","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a07af001537c26b2740da9df7caf8d142240046f","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.2.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.3":{"name":"bbb","description":"Backbone Boilerplate","version":"0.1.3","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/bbb.git"},"bugs":{"url":"https://github.com/tbranyen/bbb/issues"},"dependencies":{"grunt":"0.3.9","grunt-contrib":"0.0.7","requirejs":"2.0.2","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"2fcef1fa370e1cd7330c099ebfb720d386002956","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.3.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.4":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.4","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.9","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.0"},"keywords":[],"engines":{"node":"~0.6"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5d1f844943d88f0ac01427a0920412f795255175","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.4.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.5":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.5","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.11","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9"},"devDependencies":{"grunt":"~0.3.10"},"keywords":[],"engines":{"node":">= 0.6.0"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"738bd96adad8aa481c82feb9bf5ade8297fff78e","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.5.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"directories":{}},"0.1.6":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.6","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.11","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9","cdir":"0.1.2","phantom":"0.3.5"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["gruntplugin"],"engines":{"node":">= 0.6.0"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7f5a31a11d563bf426a4ef974322060312ce12f4","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.6.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.1.7":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.7","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.11","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9","stylus":"0.28.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["gruntplugin"],"engines":{"node":">= 0.6.0"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5c3df3808b049048ea45b56130e0c1ae61aace66","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.7.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.1.8":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.8","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.11","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9","stylus":"0.28.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["gruntplugin"],"engines":{"node":">= 0.6.0"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"14f2535008fc4b2c8e5b1ca9db7f07b6570e9c03","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.8.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.1.9":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.9","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.11","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9","stylus":"0.28.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["gruntplugin"],"engines":{"node":">= 0.6.0"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"bbb@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"409f267f5bc27e09f637b196393d0ede4c4d708b","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.9.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.1.10":{"name":"bbb","description":"Backbone Boilerplate Build Tool","version":"0.1.10","homepage":"https://github.com/tbranyen/bbb","author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"bugs":{"url":"https://github.com/backbone-boilerplate/grunt-bbb/issues"},"dependencies":{"grunt":"0.3.11","grunt-contrib":"0.0.8","grunt-jasmine-task":"0.2.0","requirejs":"2.0.2","express":"2.5.9","stylus":"0.28.2"},"devDependencies":{"grunt":"~0.3.10"},"keywords":["gruntplugin"],"engines":{"node":">= 0.6.0"},"main":"grunt.js","bin":{"bbb":"bin/bbb"},"scripts":{"test":"grunt test"},"readme":"Backbone Boilerplate framework tool.\n\n## Getting Started ##\n\nInstall this [Grunt](https://github.com/cowboy/grunt) plugin with:\n`npm install -g bbb`\n\nTo test installation, run the `bbb` command.  You should see something like\nthis:\n\n![screenshot](https://github.com/backbone-boilerplate/grunt-bbb/raw/assets/screenshot.png)\n\n## Development ##\n\nIf you wish to contribute or just want to install from source, simply run the\nfollowing commands:\n\n``` bash\n# Clone the repository.\ngit clone git://github.com/backbone-boilerplate/grunt-bbb.git\n\n# Change directory into it.\ncd grunt-bbb\n\n# Update all the submodules recursively.\ngit submodule update --init --recursive\n\n# Allow bbb to be globally accessible.\nsudo npm link\n```\n\n## Commands ##\n\nAll commands are prefixed with `bbb` in your terminal.  For example the command\n`init` below would be executed like this:\n\n``` bash\n$ bbb init\n```\n\nTasks are defined inside the grunt-bbb project, but also borrowed from other\ngrunt projects: [grunt-contrib](https://github.com/gruntjs/grunt-contrib) &\n[grunt-jasmine-task](https://github.com/creynders/grunt-jasmine-task)\n\nIf you have problems with borrowed tasks, please file issues on the respective\nprojects.\n\n### Scaffolding ###\n\nThese commands will build out files for you.\n\n#### `init` (bbb) ####\n\nCreates a bare boilerplate project.\n\n#### `init:tutorial` (bbb) ####\n\n*Run bbb init before this command*\n\nCreates a boilerplate which contains the tutorial.\n\n#### `init:todomvc` (bbb) ####\n\n*Run bbb init before this command*\n\nCreates a boilerplate which contains the TodoMVC application that utilizes\nLayoutManager.\n\n#### `init:module` (bbb) ####\n\n*Run bbb init before this command*\n\nCreates a new module in the `app/modules` directory.\n\n### Maintenence ###\n\nThese commands help you maintain your project.\n\n#### `lint` (grunt) ####\n\nEnsures all your code conforms to JSHint.\n\n#### `list` (bbb) ####\n\nShows a tree of your application's modules and dependencies.\n\n### Build ###\n\nThese commmands help you build your application.\n\n#### `debug` (bbb) ####\n\nLints all your JavaScript, compiles all your templates to JST (JavaScript\nTemplates), builds your application using RequireJS build tool (figures out\ndependencies and concatenates all files), and then finally concatenates the\ntemplates and application together.  This task also swaps out RequireJS for\nAlmond (signficantly smaller filesize AMD manager).\n\n#### `release` (bbb) ####\n\nEverything that debug command does, except the final tasks here are minified\nCSS and minified JavaScript.\n\n#### `clean` (grunt-contrib) ####\n\nRemoves all files inside `dist/` directory.\n\n#### `handlebars` (grunt-contrib) ####\n\nCompiles handlebars templates - *this requires setup*.\n\n#### `jst` (grunt-contrib) ####\n\nCompiles all templates as underscore template functions and outputs them to\n`dist/debug/templates.js`.\n\n#### `less` (grunt-contrib) ####\n\nCompiles LESS stylesheets.\n\n#### `mincss` (grunt-contrib) ####\n\nMinifies your CSS into `dist/release/index.css`.\n\n#### `requirejs` (bbb) ####\n\nBuilds out your application using the defaults specified into the root\n`grunt.js` file.\n\n#### `server` (bbb) ####\n\nWill by default run with normal files perfect for development and debugging.\n\n##### `server:debug` (bbb) #####\n\nThis command serves the same files excepts that your application is mapped to\nthe `dist/debug` directory. This is mostly useful for detecting issues with the\nbuild, since files are not minified.\n\n##### `server:release` (bbb) #####\n\nThis command will serve the same was debug except mapping to `dist/release`\ninstead. This setup is how your application should be deployed.\n\n## License\nCopyright (c) 2012 Tim Branyen (@tbranyen)  \nLicensed under the MIT license.\n","_id":"bbb@0.1.10","dist":{"shasum":"8454e04196c702e9c3f290661123926f05a43185","tarball":"http://registry.npmjs.org/bbb/-/bbb-0.1.10.tgz"},"maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]}},"readme":"*WIP* Backbone Boilerplate framework tool.\n\n## Getting Started ##\nInstall this grunt plugin with: `npm install -g bbb`\n\n## Commands ##\n\n### Scaffolding ###\n\nThese commands will automatically build out files for you.\n\n#### `init` ####\n\nCreates a bare boilerplate.\n\n#### `init:tutorial` ####\n\nCreates a boilerplate which contains the tutorial.\n\n#### `init:module` ####\n\nCreates a new module in the `app/modules` directory.\n\n### Build ###\n\nThese commmands help you build your application.\n\n#### `debug` ####\n\n#### `release` ####\n\n#### `clean` ####\n\n#### `handlebars` ####\n\n#### `jst` ####\n\n#### `less` ####\n\n#### `mincss` ####\n\n#### `requirejs` ####\n\n#### `server` ####\n\n#### `templatize` ####\n\n### Other commands ###\n\n#### `update` ####\n\nUpdates to the latest Boilerplate files. You will not get fixes with this\ncommand, since it would be impossible to merge them in.\n\n#### `list` ####\n\nShows a graph of your application's modules and dependencies.\n\n## License\nCopyright (c) 2012 Tim Branyen (@tbranyen)  \nLicensed under the MIT license.\n","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"time":{"modified":"2012-08-02T13:44:36.416Z","created":"2012-03-28T03:10:59.268Z","0.0.0":"2012-03-28T03:10:59.836Z","0.0.1":"2012-03-29T02:34:26.480Z","0.0.2":"2012-03-29T02:48:26.083Z","0.0.3":"2012-03-29T03:00:42.148Z","0.0.4":"2012-03-29T03:47:44.182Z","0.0.5":"2012-04-05T04:01:36.917Z","0.0.6":"2012-04-05T04:11:37.540Z","0.0.7":"2012-04-05T04:55:39.696Z","0.0.8":"2012-04-22T06:23:51.114Z","0.0.9":"2012-06-02T22:45:15.826Z","0.1.0":"2012-06-02T23:08:47.415Z","0.1.1":"2012-06-08T00:41:29.288Z","0.1.2":"2012-06-13T03:20:49.300Z","0.1.3":"2012-06-20T04:20:49.850Z","0.1.4":"2012-06-23T21:47:30.872Z","0.1.5":"2012-07-09T00:38:54.905Z","0.1.6":"2012-07-13T05:32:19.376Z","0.1.7":"2012-07-18T05:14:55.854Z","0.1.8":"2012-07-18T08:05:18.337Z","0.1.9":"2012-07-18T16:31:02.777Z","0.1.10":"2012-07-23T20:19:02.561Z"},"author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/backbone-boilerplate/grunt-bbb.git"},"users":{"fgribreau":true},"_attachments":{"bbb-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-Zs6iRf0spb4SHZilCV8p0Q==","length":231850,"stub":true},"bbb-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-aG5gxWE9dEaeq0bADNccJw==","length":231852,"stub":true},"bbb-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-iOfJOAt6SHGYTqdbKBtbJQ==","length":231845,"stub":true},"bbb-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-LlqNf1+LgLA+yMgxfqVBtw==","length":231929,"stub":true},"bbb-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-1IqtNVN1cSuczaIYfU15oA==","length":228151,"stub":true},"bbb-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-ptUbqccr5bBHhAReFddUVQ==","length":228066,"stub":true},"bbb-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-/bJwPt5Q6Ca0hQHqeNBpkQ==","length":227478,"stub":true},"bbb-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-8/TH/HhuH1juzt/uY2PFDA==","length":228171,"stub":true},"bbb-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-JW+PaqdTKQMohq5rQaYyHg==","length":228158,"stub":true},"bbb-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-gguAckL5R+ixkl5ezHPeQA==","length":227304,"stub":true},"bbb-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-Qrov8sCOt+PG6+vPSNEzJA==","length":225948,"stub":true},"bbb-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-NQ9iqoOgE5m2oE/xYRY6jQ==","length":228482,"stub":true},"bbb-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-gNxnB7AlrwqTZp1ZVImxeg==","length":201714,"stub":true},"bbb-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-MUM5gRc1bOsnuNvUwcLVqw==","length":202383,"stub":true},"bbb-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-y5QJPuFNgIn+juwhZ7MrkQ==","length":202299,"stub":true},"bbb-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-IQUm7epVFEnXZ1/faqJTmw==","length":202253,"stub":true},"bbb-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uO3lwJoeGz832kA9BEbs/g==","length":362648,"stub":true},"bbb-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-982T7QSsmdj9m+saHPrzxw==","length":517286,"stub":true},"bbb-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YFEiplgMTbWLIjIISwuL2w==","length":512097,"stub":true},"bbb-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-a8OK+HDa/fiX3KsWBr9tBQ==","length":361995,"stub":true},"bbb-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3o114rcvZ2SAPQUOZ2wxtg==","length":360820,"stub":true}}}},
{"id":"bbcode","key":"bbcode","value":{"rev":"5-e79a8b62125f8a3a1751bf7bd8875f33"},"doc":{"_id":"bbcode","_rev":"5-e79a8b62125f8a3a1751bf7bd8875f33","name":"bbcode","description":"A BBCode Parser for NodeJS","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bbcode","description":"A BBCode Parser for NodeJS","main":"./lib/bbcode","version":"0.0.1","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"http://github.com/ncb000gt/node-bbcode.git"},"licenses":[{"type":"BSD"}],"bugs":{"url":"http://github.com/ncb000gt/node-bbcode/issues"},"dependencies":{"nodeunit":">=0.3.1"},"_id":"bbcode@0.0.1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.5","directories":{"lib":"./lib"},"modules":{"bbcode.js":"lib/bbcode.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"556ead15ffcfb58fb9f7bbba6c692d58fc7b5c4e","tarball":"http://registry.npmjs.org/bbcode/-/bbcode-0.0.1.tgz"}},"0.0.2":{"name":"bbcode","description":"A BBCode Parser for NodeJS","main":"./lib/bbcode","version":"0.0.2","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"http://github.com/ncb000gt/node-bbcode.git"},"licenses":[{"type":"BSD"}],"bugs":{"url":"http://github.com/ncb000gt/node-bbcode/issues"},"dependencies":{"nodeunit":">=0.3.1"},"_id":"bbcode@0.0.2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.5","directories":{"lib":"./lib"},"modules":{"bbcode.js":"lib/bbcode.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"005df3f61c53587e56c2eb48785aca03cb644fa0","tarball":"http://registry.npmjs.org/bbcode/-/bbcode-0.0.2.tgz"}}},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}],"time":{"modified":"2011-02-01T04:49:02.931Z","created":"2011-02-01T04:14:24.258Z","0.0.1":"2011-02-01T04:14:24.647Z","0.0.2":"2011-02-01T04:49:02.931Z"},"author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"repository":{"type":"git","url":"http://github.com/ncb000gt/node-bbcode.git"},"_attachments":{"bbcode-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iQHH8p/lx9kEAZrqlcw3Jw==","length":7597,"stub":true},"bbcode-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xINhiMcYKsPcEipRHE8Q7A==","length":8895,"stub":true}}}},
{"id":"bbgurl","key":"bbgurl","value":{"rev":"20-bce1c9e753f2b089625a862449734cf6"},"doc":{"_id":"bbgurl","_rev":"20-bce1c9e753f2b089625a862449734cf6","name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","dist-tags":{"latest":"0.0.4-2"},"versions":{"0.0.0":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.0","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"16ec9452399fc8f5df81e1569b5847805ef13eb2","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.0.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.1":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.1","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"290b575f733a1ed04d6d6eb1dd57f5e7ab9b59c5","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.1.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.2","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"839649608e183c00dd38f744ddb95c4826a66de1","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.2.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.3","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"86b4c100fd3de9b4be28c13a7f4dd8bb80bf087c","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.3.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.4","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4","streamspeed":"~0.1.3","multimeter":"~0.1.0"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"6f325e99a8555b8f589789a321822cc62b7efca1","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.4.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.4-1":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.4-1","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4","streamspeed":"~0.1.3","multimeter":"~0.1.0"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.4-1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"14f4517975e7c17fbeecd930a7cdc71690161f51","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.4-1.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.4-2":{"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"name":"bbgurl","description":"bbgurl: A tiny cli http client; a thin wrapper around mikeal/request. Named by @blakmatrix.","version":"0.0.4-2","homepage":"https://github.com/jesusabdullah/bbgurl","repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"dependencies":{"request":"~2.9.203","optimist":"~0.3.4","streamspeed":"~0.1.3","multimeter":"~0.1.0"},"bin":{"bbgurl":"./bbgurl.js"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"bbgurl@0.0.4-2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"82b844bd720f737704d5fd95f00f95fd3d828174","tarball":"http://registry.npmjs.org/bbgurl/-/bbgurl-0.0.4-2.tgz"},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}]}},"readme":"# bbgurl\n\n* npm-installable cli http client\n* thin wrapper around [mikeal/request](https://github.com/mikeal/request)\n* named by [@blakmatrix](https://github.com/blakmatrix)\n\n## Usage:\n\n```\n$ bbgurl\nbbgurl: A tiny cli http client; a thin wrapper of mikeal/request. Named by @blakmatrix.\n\nUSAGE: bbgurl <url> [<options>]\n\nOptions:\n  --body, -d            String body for http request.               \n  --followRedirect      Follow the first http 30x redirect (if any).  [boolean]  [default: true]\n  --followAllRedirects  Follow *all* http 30x redirects (if any).     [boolean]  [default: false]\n  --headers, -H         A JSON representation of any headers.       \n  --logfile             Optional file to write logs to.             \n  --method, -X          HTTP method.                                  [default: \"GET\"]\n  --output, -o          HTTP response output file (default stdout)  \n  --strictSSL           Require that SSL certificates be valid.       [boolean]  [default: false]\n  --verbose, -v         Output logs to stderr.                        [boolean]\n\nArgument check failed: Must specify a uri.\n```\n\n## A Few Examples:\n\n### Hit an endpoint\n\n```\n$ bbgurl http://whatismyip.nodejitsu.com/index.json\n{ \"ip\": \"71.198.76.200\" }\n```\n\n### Set some headers\n\n```\n$ bbgurl http://whatismyip.jit.su -H '{ \"accept\": \"application/json\" }'\n{ \"ip\": \"71.198.76.200\" }\n```\n\n### Download a tarball\n\n```\n$ bbgurl --verbose http://nodejs.org/dist/v0.8.4/node-v0.8.4.tar.gz -o node-v0.8.4.tar.gz\n[request] GET http://nodejs.org/dist/v0.8.4/node-v0.8.4.tar.gz\n$ tar -xzf node-v0.8.4.tar.gz \n$ cd node-v0.8.4/\n$ ls\nAUTHORS    BSDmakefile  common.gypi  deps  lib      Makefile  README.md  test   vcbuild.bat\nbenchmark  ChangeLog    configure    doc   LICENSE  node.gyp  src        tools\n```\n\n## License:\n\nMIT/X11.\n","maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"time":{"modified":"2012-08-02T13:44:04.482Z","created":"2012-07-28T00:26:56.642Z","0.0.0":"2012-07-28T00:26:58.185Z","0.0.1":"2012-07-28T00:57:57.778Z","0.0.2":"2012-07-28T05:36:48.284Z","0.0.3":"2012-07-28T07:00:37.018Z","0.0.4":"2012-07-28T08:29:14.860Z","0.0.4-1":"2012-07-28T08:58:18.761Z","0.0.4-2":"2012-07-28T09:05:59.043Z"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.net"},"repository":{"url":"git@github.com:jesusabdullah/bbgurl.git"},"users":{"blakmatrix":true,"fgribreau":true},"_attachments":{"bbgurl-0.0.4-2.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-9duSa4Zdkd1wKxVOpNKmKg==","length":3877,"stub":true},"bbgurl-0.0.4-1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-RVOI0QcOkCdUC3Y/1+E2Tw==","length":3874,"stub":true},"bbgurl-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MbpkuDnCwyXr599Nw5Aj2w==","length":11818131,"stub":true},"bbgurl-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-jLbcpKQ2ToEKpm7mq/LePA==","length":3006,"stub":true},"bbgurl-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-I3a5sVmlZufD5olut2l/tg==","length":2657,"stub":true},"bbgurl-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SPMG9FWcqhSIbgSK4NzyWQ==","length":2419,"stub":true},"bbgurl-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YRjqsBawT3XaUBV/DtyFZA==","length":2255,"stub":true}}}},
{"id":"bcp47","key":"bcp47","value":{"rev":"18-77bfc5890f4d38f8e8369103e8f3e914"},"doc":{"_id":"bcp47","_rev":"18-77bfc5890f4d38f8e8369103e8f3e914","name":"bcp47","description":"Parser for the BCP 47 language tag specification.","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"bcp47","version":"0.0.1","description":"Parser for the BCP 47 language tag specification.","keywords":["bcp47","parser","internationalization","i18n","language"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/BCP-47-parser.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"bcp47","readme":"<a name=\"start\"></a>\r\n\r\nBCP 47 parser\r\n=============\r\n\r\n#### Parser for the BCP 47 language tag specification for node.js. ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.0.1\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install bcp47\r\n```\r\n\r\nOr simply copying `build/bcp47.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BCP47/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BCP47/tree/master/examples)  \r\n[Change Log](https://github.com/Gagle/Node-BCP47/wiki/Change-Log)  \r\n[MIT License](https://github.com/Gagle/Node-BCP47/blob/master/LICENSE)","_id":"bcp47@0.0.1","dist":{"shasum":"8aa49be6839a69fa7847544c29d0973cdeb58c74","tarball":"http://registry.npmjs.org/bcp47/-/bcp47-0.0.1.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"1.0.0":{"name":"bcp47","version":"1.0.0","description":"Parser for the BCP 47 language tag specification.","keywords":["bcp47","parser","internationalization","i18n","language"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/BCP-47-parser.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"bcp47","readme":"<a name=\"start\"></a>\r\n\r\nNode BCP47\r\n==========\r\n\r\n#### Parser for the BCP 47 language tag specification for node.js. ####\r\n\r\n[Show me!](#showme) | [Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 1.0.0\r\n\r\n<a name=\"showme\"></a>\r\n#### Show me! [↑](#start) ####\r\n\r\n```javascript\r\nvar BCP47 = require (\"bcp47\");\r\n\r\n//Eastern Armenian written in Latin script, as used in Italy\r\nconsole.log (BCP47.parse (\"hy-Latn-IT-arevela\"));\r\n\r\n/*\r\nPrints:\r\n\r\n{\r\n\tlanguage: {\r\n\t\tlanguage: \"hy\",\r\n\t\textlang: []\r\n\t},\r\n\tscript: \"Latn\",\r\n\tregion: \"IT\",\r\n\tvariant: [\"arevela\"],\r\n\textension: null,\r\n\tprivateuse: null,\r\n\tgrandfathered: {\r\n\t\tirregular: null,\r\n\t\tregular: null\r\n\t}\r\n}\r\n*/\r\n```\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install bcp47\r\n```\r\n\r\nOr simply copying `build/bcp47.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BCP47/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BCP47/tree/master/examples)  \r\n[Change Log](https://github.com/Gagle/Node-BCP47/wiki/Change-Log)  \r\n[MIT License](https://github.com/Gagle/Node-BCP47/blob/master/LICENSE)","_id":"bcp47@1.0.0","dist":{"shasum":"b5f9fbfda9d1782c63abeb6d4379e2e3fd690b8b","tarball":"http://registry.npmjs.org/bcp47/-/bcp47-1.0.0.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}]}},"readme":"<a name=\"start\"></a>\r\n\r\nBCP 47 parser\r\n=============\r\n\r\n#### Parser for the BCP 47 language tag specification for node.js. ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.0.1\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install bcp47\r\n```\r\n\r\nOr simply copying `build/bcp47.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BCP47/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BCP47/tree/master/examples)  \r\n[Change Log](https://github.com/Gagle/Node-BCP47/wiki/Change-Log)  \r\n[MIT License](https://github.com/Gagle/Node-BCP47/blob/master/LICENSE)","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"time":{"modified":"2012-08-02T13:43:27.287Z","created":"2012-07-31T19:21:14.064Z","0.0.1":"2012-07-31T19:21:18.677Z","1.0.0":"2012-08-02T07:52:23.307Z"},"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/BCP-47-parser.git"},"users":{"fgribreau":true},"_attachments":{"bcp47-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-89FFQeI/5JeaojNfnQHzOg==","length":1703,"stub":true},"bcp47-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-O/aVlLBAgC37e9IjIsrZhA==","length":811,"stub":true}}}},
{"id":"bcrypt","key":"bcrypt","value":{"rev":"48-ba451f0a61a45f56e02ed228dd3de0f2"},"doc":{"_id":"bcrypt","_rev":"48-ba451f0a61a45f56e02ed228dd3de0f2","name":"bcrypt","description":"A bcrypt library for NodeJS.","dist-tags":{"latest":"0.7.1"},"versions":{"0.1.2":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.1.2","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"directories":{"lib":"."},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.3.1"},"_id":"bcrypt@0.1.2","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d00c887a9366912c3408475174da1a6ad0c5098b","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.1.2.tgz"},"deprecated":"security fix"},"0.2.0":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.2.0","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.5.1"},"_id":"bcrypt@0.2.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1c93e3048c07fb1341504e09c8f81cc1e6f2fcb1","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.0.tgz","bin":{"0.4-sunos-5.11":{"shasum":"92e425b0f62e6d5cb822993afbe5b20d50d35644","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.0-0.4-sunos-5.11.tgz"}}},"deprecated":"security fix"},"0.2.1":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.2.1","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.5.1"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"}],"_id":"bcrypt@0.2.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6f62f49984ebc8a85113a3002a7fa978ddb86241","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.1.tgz"},"deprecated":"doesn't compile correctly"},"0.1.3":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.1.3","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.3.1"},"_id":"bcrypt@0.1.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ea5bdd817a828e40b87a41412cdaa8afa23c567e","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.1.3.tgz"}},"0.2.2":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.2.2","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.5.1"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"}],"_id":"bcrypt@0.2.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fa051d13aea3d7e7c7b28712f5b3a9746a6f273f","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.2.tgz","bin":{"0.4-sunos-5.11":{"shasum":"14fe34396eaa6793b1e4dcfd7a96f28534346dbc","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.2-0.4-sunos-5.11.tgz"}}}},"0.2.3":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.2.3","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"dependencies":{"nodeunit":">=0.5.1"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"}],"_id":"bcrypt@0.2.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8eb612ffaffbffc0041141bb4fee2c748f0b18de","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.3.tgz"}},"0.2.4":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","main":"./bcrypt","version":"0.2.4","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.1.100"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"node-waf configure build","test":"node-waf configure build; nodeunit test/"},"devDependencies":{"nodeunit":">=0.5.1"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"}],"_npmJsonOpts":{"file":"/home/ncampbell/.npm/bcrypt/0.2.4/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bcrypt@0.2.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"07d977afab3da66b45f2f37996e4d6e4a828e333","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.2.4.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.3.0":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.3.0","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.4.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"make build","test":"make test"},"devDependencies":{"nodeunit":">=0.5.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"}],"_npmJsonOpts":{"file":"/home/ncampbell/.npm/bcrypt/0.3.0/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bcrypt@0.3.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.5.4","_defaultsLoaded":true,"dist":{"shasum":"d84543bef358fd325d7acef53552f9589c1b534b","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.3.0.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.3.1":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.3.1","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.4.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"make build","test":"make test"},"devDependencies":{"nodeunit":">=0.5.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"}],"_npmJsonOpts":{"file":"/Users/ncampbell/.npm/bcrypt/0.3.1/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bcrypt@0.3.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.5.3","_defaultsLoaded":true,"dist":{"shasum":"35189eb1bc38f349727dabef66d397839d7b74e6","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.3.1.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.3.2":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.3.2","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.4.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"make build","test":"make test"},"devDependencies":{"nodeunit":">=0.5.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"}],"_npmJsonOpts":{"file":"/home/ncampbell/.npm/bcrypt/0.3.2/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bcrypt@0.3.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e94b7f67aed1a6d95e9e9268b0c688c93540f3af","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.3.2.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.4.0":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.4.0","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.4.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"make build","test":"make test"},"devDependencies":{"nodeunit":">=0.5.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"}],"_npmJsonOpts":{"file":"/Users/ncampbell/.npm/bcrypt/0.4.0/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bcrypt@0.4.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"646daf99707d584d7d814b47c421858af8e23247","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.4.0.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.4.1":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.4.1","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.4.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"make build","test":"make test"},"devDependencies":{"nodeunit":">=0.5.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"},{"name":"Ben Noorduis","url":"https://github.com/bnoordhuis"}],"_npmUser":{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"},"_id":"bcrypt@0.4.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"0e0f84582ebd6ea0a4190739001b4af3d2c3d188","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.4.1.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.5.0":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.5.0","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"install":"make build","test":"make test"},"devDependencies":{"nodeunit":">=0.6.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"},{"name":"Ben Noorduis","url":"https://github.com/bnoordhuis"}],"_npmUser":{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"},"_id":"bcrypt@0.5.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"612e01afa125c7332310f94e5186425c482b55f8","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.5.0.tgz"},"readme":"node.bcrypt.js\n=============\n\n[![Build Status](https://secure.travis-ci.org/ncb000gt/node.bcrypt.js.png)](http://travis-ci.org/#!/ncb000gt/node.bcrypt.js) \n\nLib to help you hash passwords.\n[bcrypt on wikipedia][bcryptwiki]\n\nCatalyst for this module: [How To Safely Store A Password][codahale]\n\n\nSecurity Issues/Concerns\n=============\n\nAs should be the case with any security tool, this library should be scrutinized by anyone using it. If you find or suspect an issue with the code- please bring it to my attention and I'll spend some time trying to make sure that this tool is as secure as possible.\n\nTo make it easier for people using this tool to analyze what has been surveyed, here is a list of BCrypt related security issues/concerns as they've come up.\n\n* An [issue with passwords][jtr] was found with a version of the Blowfish algorithm developed for John the Ripper. This is not present in the OpenBSD version and is thus not a problem for this module. HT [zooko][zooko].\n\nDependencies\n=============\n\n* NodeJS\n* OpenSSL\n\nFrom NPM\n============\n\nnpm install bcrypt\n\n\nFrom Source\n============\n\nAssuming you've already built node, you can run the waf script:  \n\n    node-waf configure\n    node-waf build\n    npm link\n\nUsage - Sync\n============\n\nTo hash a password:  \n\n    var bcrypt = require('bcrypt');  \n    var salt = bcrypt.genSaltSync(10);  \n    var hash = bcrypt.encryptSync(\"B4c0/\\/\", salt);\n    // Store hash in your password DB.\n\nTo check a password:  \n\n    // Load hash from your password DB.\n    bcrypt.compareSync(\"B4c0/\\/\", hash); // true    \n    bcrypt.compareSync(\"not_bacon\", hash); // false\n\nUsage - Async\n============\n\nTo hash a password:  \n\n    var bcrypt = require('bcrypt');  \n    bcrypt.genSalt(10, function(err, salt) {\n        bcrypt.hash(\"B4c0/\\/\", salt, function(err, hash) {\n            // Store hash in your password DB.\n        });\n    });\n\nTo check a password:  \n\n    // Load hash from your password DB.\n    bcrypt.compare(\"B4c0/\\/\", hash, function(err, res) {\n        // res == true    \n    });\n    bcrypt.compare(\"not_bacon\", hash, function(err, res) {\n        // res = false\n    });\n\nAPI\n============\n\n`BCrypt.`\n\n  * `genSaltSync(rounds, seed_length)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n  * `genSalt(rounds, seed_length, cb)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n    * `cb` - [REQUIRED] - a callback to be fired once the salt has been generated. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `salt` - Second parameter to the callback providing the generated salt.\n  * `hashSync(data, salt)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used in encryption.\n  * `hash(data, salt, cb)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used in encryption.\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been encrypted. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `encrypted` - Second parameter to the callback providing the encrypted form.\n  * `compareSync(data, encrypted)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n  * `compare(data, encrypted, cb)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been compared. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `same` - Second parameter to the callback providing whether the data and encrypted forms match [true | false].\n  * `getRounds(encrypted)` - return the number of rounds used to encrypt a given hash\n    * `encrypted` - [REQUIRED] - hash from which the number of rounds used should be extracted.\n\n\nHash Info\n============\n\nThe characters that comprise the resultant hash are `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$`.\n\nTesting\n============\n\nI am using nodeunit. I like the way you write tests with it and I like the default output. As such you'll need it to run the tests. I suspect my tests would run on an older version, but these were written and worked against 0.5.1\n\n    npm install nodeunit@0.5.1\n    nodeunit test/\n\nCredits\n============\n\nThe code for this comes from a few sources:\n\n* blowfish.cc - OpenBSD\n* bcrypt.cc - OpenBSD\n* bcrypt::gen_salt - [gen_salt inclusion to bcrypt][bcryptgs]\n* bcrypt_node.cc - me\n\nContributors\n============\n\n* [Antonio Salazar Cardozo][shadowfiend] - Early MacOS X support (when we used libbsd)\n* [Ben Glow][pixelglow] - Fixes for thread safety with async calls\n* [Van Nguyen][thegoleffect] - Found a timing attack in the comparator\n* [NewITFarmer][newitfarmer] - Initial Cygwin support\n* [David Trejo][dtrejo] - packaging fixes\n* [Alfred Westerveld][alfredwesterveld] - packaging fixes\n* [Vincent Côté-Roy][vincentr] - Testing around concurrency issues\n* [Lloyd Hilaiel][lloyd] - Documentation fixes\n* [Roman Shtylman][shtylman] - Code refactoring, general rot reduction, compile options, better memory management with delete and new, and an upgrade to libuv over eio/ev.\n* [Vadim Graboys][vadimg] - Code changes to support 0.5.5+\n* [Ben Noordhuis][bnoordhuis] - Fixed a thread safety issue in nodejs that was perfectly mappable to this module.\n\nLicense\n============\n\nUnless stated elsewhere, file headers or otherwise, the license as stated in the LICENSE file.\n\n\n\n[bcryptwiki]: http://en.wikipedia.org/wiki/Crypt_(Unix)#Blowfish-based_scheme  \n[bcryptgs]: http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html\n[codahale]: http://codahale.com/how-to-safely-store-a-password/\n[gh13]: https://github.com/ncb000gt/node.bcrypt.js/issues/13\n[jtr]: http://www.openwall.com/lists/oss-security/2011/06/20/2\n\n[shadowfiend]:https://github.com/Shadowfiend\n[thegoleffect]:https://github.com/thegoleffect\n[pixelglow]:https://github.com/pixelglow\n[dtrejo]:https://github.com/dtrejo\n[alfredwesterveld]:https://github.com/alfredwesterveld\n[newitfarmer]:https://github.com/newitfarmer\n[zooko]:https://twitter.com/zooko\n[vincentr]:https://twitter.com/vincentcr\n[lloyd]:https://github.com/lloyd\n[shtylman]:https://github.com/shtylman\n[vadimg]:https://github.com/vadimg\n","maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.6.0":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.6.0","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"test":"make test","install":"node-gyp rebuild"},"devDependencies":{"nodeunit":">=0.6.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"},{"name":"Ben Noorduis","url":"https://github.com/bnoordhuis"}],"_npmUser":{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"},"_id":"bcrypt@0.6.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"3f49d8c78c0887c1b420f07e4abe6e7a03874c81","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.6.0.tgz"},"readme":"node.bcrypt.js\n=============\n\n[![Build Status](https://secure.travis-ci.org/ncb000gt/node.bcrypt.js.png)](http://travis-ci.org/#!/ncb000gt/node.bcrypt.js) \n\nLib to help you hash passwords.\n[bcrypt on wikipedia][bcryptwiki]\n\nCatalyst for this module: [How To Safely Store A Password][codahale]\n\n\nVersion Compatability\n=============\n\n<table>\n<tr>\n<td>Node Ver</td><td>Bcrypt Version</td>\n</tr>\n<tr>\n<td>&lt;= 0.4.x</td><td>&lt;= 0.4.x</td>\n</tr>\n<tr>\n<td>&gt;= 0.6.x</td><td>&gt;= 0.5.x</td>\n</tr>\n</table>\n\n\nSecurity Issues/Concerns\n=============\n\nAs should be the case with any security tool, this library should be scrutinized by anyone using it. If you find or suspect an issue with the code- please bring it to my attention and I'll spend some time trying to make sure that this tool is as secure as possible.\n\nTo make it easier for people using this tool to analyze what has been surveyed, here is a list of BCrypt related security issues/concerns as they've come up.\n\n* An [issue with passwords][jtr] was found with a version of the Blowfish algorithm developed for John the Ripper. This is not present in the OpenBSD version and is thus not a problem for this module. HT [zooko][zooko].\n\nDependencies\n=============\n\n* NodeJS\n* OpenSSL (Development Libraries (header files) for compilation)\n\nFrom NPM\n============\n\nnpm install bcrypt\n\n\nFrom Source\n============\n\nAssuming you've already built node, you can compile the module with `node-gyp`:\n\n    git clone git://github.com/ncb000gt/node.bcrypt.js.git\n    cd node.bcrypt.js\n    node-gyp configure\n    node-gyp build\n\nNote: if you do not have node-gyp installed, install it using: `npm install -g node-gyp`\n\nUsage - Sync\n============\n\nTo hash a password:  \n\n    var bcrypt = require('bcrypt');  \n    var salt = bcrypt.genSaltSync(10);  \n    var hash = bcrypt.hashSync(\"B4c0/\\/\", salt);\n    // Store hash in your password DB.\n\nTo check a password:  \n\n    // Load hash from your password DB.\n    bcrypt.compareSync(\"B4c0/\\/\", hash); // true    \n    bcrypt.compareSync(\"not_bacon\", hash); // false\n\nUsage - Async\n============\n\nTo hash a password:  \n\n    var bcrypt = require('bcrypt');  \n    bcrypt.genSalt(10, function(err, salt) {\n        bcrypt.hash(\"B4c0/\\/\", salt, function(err, hash) {\n            // Store hash in your password DB.\n        });\n    });\n\nTo check a password:  \n\n    // Load hash from your password DB.\n    bcrypt.compare(\"B4c0/\\/\", hash, function(err, res) {\n        // res == true    \n    });\n    bcrypt.compare(\"not_bacon\", hash, function(err, res) {\n        // res = false\n    });\n\nAPI\n============\n\n`BCrypt.`\n\n  * `genSaltSync(rounds, seed_length)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n  * `genSalt(rounds, seed_length, cb)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n    * `cb` - [REQUIRED] - a callback to be fired once the salt has been generated. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `salt` - Second parameter to the callback providing the generated salt.\n  * `hashSync(data, salt)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used in encryption.\n  * `hash(data, salt, cb)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used in encryption.\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been encrypted. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `encrypted` - Second parameter to the callback providing the encrypted form.\n  * `compareSync(data, encrypted)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n  * `compare(data, encrypted, cb)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been compared. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `same` - Second parameter to the callback providing whether the data and encrypted forms match [true | false].\n  * `getRounds(encrypted)` - return the number of rounds used to encrypt a given hash\n    * `encrypted` - [REQUIRED] - hash from which the number of rounds used should be extracted.\n\n\nHash Info\n============\n\nThe characters that comprise the resultant hash are `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$`.\n\nTesting\n============\n\nI am using nodeunit. I like the way you write tests with it and I like the default output. As such you'll need it to run the tests. I suspect my tests would run on an older version, but these were written and worked against 0.5.1\n\n    npm install nodeunit@0.5.1\n    nodeunit test/\n\nCredits\n============\n\nThe code for this comes from a few sources:\n\n* blowfish.cc - OpenBSD\n* bcrypt.cc - OpenBSD\n* bcrypt::gen_salt - [gen_salt inclusion to bcrypt][bcryptgs]\n* bcrypt_node.cc - me\n\nContributors\n============\n\n* [Antonio Salazar Cardozo][shadowfiend] - Early MacOS X support (when we used libbsd)\n* [Ben Glow][pixelglow] - Fixes for thread safety with async calls\n* [Van Nguyen][thegoleffect] - Found a timing attack in the comparator\n* [NewITFarmer][newitfarmer] - Initial Cygwin support\n* [David Trejo][dtrejo] - packaging fixes\n* [Alfred Westerveld][alfredwesterveld] - packaging fixes\n* [Vincent Côté-Roy][vincentr] - Testing around concurrency issues\n* [Lloyd Hilaiel][lloyd] - Documentation fixes\n* [Roman Shtylman][shtylman] - Code refactoring, general rot reduction, compile options, better memory management with delete and new, and an upgrade to libuv over eio/ev.\n* [Vadim Graboys][vadimg] - Code changes to support 0.5.5+\n* [Ben Noordhuis][bnoordhuis] - Fixed a thread safety issue in nodejs that was perfectly mappable to this module.\n\nLicense\n============\n\nUnless stated elsewhere, file headers or otherwise, the license as stated in the LICENSE file.\n\n\n\n[bcryptwiki]: http://en.wikipedia.org/wiki/Crypt_(Unix)#Blowfish-based_scheme  \n[bcryptgs]: http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html\n[codahale]: http://codahale.com/how-to-safely-store-a-password/\n[gh13]: https://github.com/ncb000gt/node.bcrypt.js/issues/13\n[jtr]: http://www.openwall.com/lists/oss-security/2011/06/20/2\n\n[shadowfiend]:https://github.com/Shadowfiend\n[thegoleffect]:https://github.com/thegoleffect\n[pixelglow]:https://github.com/pixelglow\n[dtrejo]:https://github.com/dtrejo\n[alfredwesterveld]:https://github.com/alfredwesterveld\n[newitfarmer]:https://github.com/newitfarmer\n[zooko]:https://twitter.com/zooko\n[vincentr]:https://twitter.com/vincentcr\n[lloyd]:https://github.com/lloyd\n[shtylman]:https://github.com/shtylman\n[vadimg]:https://github.com/vadimg\n[bnoordhuis]:https://github.com/bnoordhuis\n","maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.7.0":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.7.0","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"http://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"test":"make test","install":"node-gyp rebuild"},"dependencies":{"bindings":"1.0.0"},"devDependencies":{"nodeunit":">=0.6.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"},{"name":"Ben Noorduis","url":"https://github.com/bnoordhuis"}],"gypfile":true,"readme":"node.bcrypt.js\n=============\n\n[![Build Status](https://secure.travis-ci.org/ncb000gt/node.bcrypt.js.png)](http://travis-ci.org/#!/ncb000gt/node.bcrypt.js) \n\nLib to help you hash passwords.\n[bcrypt on wikipedia][bcryptwiki]\n\nCatalyst for this module: [How To Safely Store A Password][codahale]\n\n\nVersion Compatability\n=============\n\n<table>\n<tr>\n<td>Node Ver</td><td>Bcrypt Version</td>\n</tr>\n<tr>\n<td>&lt;= 0.4.x</td><td>&lt;= 0.4.x</td>\n</tr>\n<tr>\n<td>&gt;= 0.6.x</td><td>&gt;= 0.5.x</td>\n</tr>\n</table>\n\n\nSecurity Issues/Concerns\n=============\n\nAs should be the case with any security tool, this library should be scrutinized by anyone using it. If you find or suspect an issue with the code- please bring it to my attention and I'll spend some time trying to make sure that this tool is as secure as possible.\n\nTo make it easier for people using this tool to analyze what has been surveyed, here is a list of BCrypt related security issues/concerns as they've come up.\n\n* An [issue with passwords][jtr] was found with a version of the Blowfish algorithm developed for John the Ripper. This is not present in the OpenBSD version and is thus not a problem for this module. HT [zooko][zooko].\n\nDependencies\n=============\n\n* NodeJS\n* OpenSSL (Development Libraries (header files) for compilation)\n\nFrom NPM\n============\n\nnpm install bcrypt\n\n\nFrom Source\n============\n\nAssuming you've already built node, you can compile the module with `node-gyp`:\n\n    git clone git://github.com/ncb000gt/node.bcrypt.js.git\n    cd node.bcrypt.js\n    node-gyp configure\n    node-gyp build\n\nNote: if you do not have node-gyp installed, install it using: `npm install -g node-gyp`\n\nUsage - Sync\n============\n\nTo hash a password:  \n\n    var bcrypt = require('bcrypt');  \n    var salt = bcrypt.genSaltSync(10);  \n    var hash = bcrypt.hashSync(\"B4c0/\\/\", salt);\n    // Store hash in your password DB.\n\nTo check a password:  \n\n    // Load hash from your password DB.\n    bcrypt.compareSync(\"B4c0/\\/\", hash); // true    \n    bcrypt.compareSync(\"not_bacon\", hash); // false\n\nAuto-gen a salt and hash:\n\n    var hash = bcrypt.hashSync('bacon', 8)\n\nUsage - Async\n============\n\nTo hash a password:  \n\n    var bcrypt = require('bcrypt');  \n    bcrypt.genSalt(10, function(err, salt) {\n        bcrypt.hash(\"B4c0/\\/\", salt, function(err, hash) {\n            // Store hash in your password DB.\n        });\n    });\n\nTo check a password:  \n\n    // Load hash from your password DB.\n    bcrypt.compare(\"B4c0/\\/\", hash, function(err, res) {\n        // res == true    \n    });\n    bcrypt.compare(\"not_bacon\", hash, function(err, res) {\n        // res = false\n    });\n\nAuto-gen a salt and hash:\n\n    bcrypt.hash('bacon', 8, function(err, hash) {\n    });\n\nAPI\n============\n\n`BCrypt.`\n\n  * `genSaltSync(rounds, seed_length)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n  * `genSalt(rounds, seed_length, cb)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n    * `cb` - [REQUIRED] - a callback to be fired once the salt has been generated. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `salt` - Second parameter to the callback providing the generated salt.\n  * `hashSync(data, salt)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used in encryption.\n  * `hash(data, salt, cb)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used to hash the password. if specified as a number then a salt will be generated and used (see examples).\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been encrypted. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `encrypted` - Second parameter to the callback providing the encrypted form.\n  * `compareSync(data, encrypted)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n  * `compare(data, encrypted, cb)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been compared. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `same` - Second parameter to the callback providing whether the data and encrypted forms match [true | false].\n  * `getRounds(encrypted)` - return the number of rounds used to encrypt a given hash\n    * `encrypted` - [REQUIRED] - hash from which the number of rounds used should be extracted.\n\n\nHash Info\n============\n\nThe characters that comprise the resultant hash are `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$`.\n\nTesting\n============\n\nI am using nodeunit. I like the way you write tests with it and I like the default output. As such you'll need it to run the tests. I suspect my tests would run on an older version, but these were written and worked against 0.5.1\n\n    npm install nodeunit@0.5.1\n    nodeunit test/\n\nCredits\n============\n\nThe code for this comes from a few sources:\n\n* blowfish.cc - OpenBSD\n* bcrypt.cc - OpenBSD\n* bcrypt::gen_salt - [gen_salt inclusion to bcrypt][bcryptgs]\n* bcrypt_node.cc - me\n\nContributors\n============\n\n* [Antonio Salazar Cardozo][shadowfiend] - Early MacOS X support (when we used libbsd)\n* [Ben Glow][pixelglow] - Fixes for thread safety with async calls\n* [Van Nguyen][thegoleffect] - Found a timing attack in the comparator\n* [NewITFarmer][newitfarmer] - Initial Cygwin support\n* [David Trejo][dtrejo] - packaging fixes\n* [Alfred Westerveld][alfredwesterveld] - packaging fixes\n* [Vincent Côté-Roy][vincentr] - Testing around concurrency issues\n* [Lloyd Hilaiel][lloyd] - Documentation fixes\n* [Roman Shtylman][shtylman] - Code refactoring, general rot reduction, compile options, better memory management with delete and new, and an upgrade to libuv over eio/ev.\n* [Vadim Graboys][vadimg] - Code changes to support 0.5.5+\n* [Ben Noordhuis][bnoordhuis] - Fixed a thread safety issue in nodejs that was perfectly mappable to this module.\n\nLicense\n============\n\nUnless stated elsewhere, file headers or otherwise, the license as stated in the LICENSE file.\n\n\n\n[bcryptwiki]: http://en.wikipedia.org/wiki/Crypt_(Unix)#Blowfish-based_scheme  \n[bcryptgs]: http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html\n[codahale]: http://codahale.com/how-to-safely-store-a-password/\n[gh13]: https://github.com/ncb000gt/node.bcrypt.js/issues/13\n[jtr]: http://www.openwall.com/lists/oss-security/2011/06/20/2\n\n[shadowfiend]:https://github.com/Shadowfiend\n[thegoleffect]:https://github.com/thegoleffect\n[pixelglow]:https://github.com/pixelglow\n[dtrejo]:https://github.com/dtrejo\n[alfredwesterveld]:https://github.com/alfredwesterveld\n[newitfarmer]:https://github.com/newitfarmer\n[zooko]:https://twitter.com/zooko\n[vincentr]:https://twitter.com/vincentcr\n[lloyd]:https://github.com/lloyd\n[shtylman]:https://github.com/shtylman\n[vadimg]:https://github.com/vadimg\n[bnoordhuis]:https://github.com/bnoordhuis\n","_id":"bcrypt@0.7.0","dist":{"shasum":"57b5b06290718aa34f080d2bfa289e351172e559","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.7.0.tgz"},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]},"0.7.1":{"name":"bcrypt","description":"A bcrypt library for NodeJS.","keywords":["bcrypt","password","auth","authentication","encryption","crypt","crypto"],"main":"./bcrypt","version":"0.7.1","author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"engines":{"node":">= 0.6.0"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"licenses":[{"type":"MIT"}],"bugs":{"url":"http://github.com/ncb000gt/node.bcrypt.js/issues"},"scripts":{"test":"node-gyp configure build && nodeunit test","install":"node-gyp rebuild"},"dependencies":{"bindings":"1.0.0"},"devDependencies":{"nodeunit":">=0.6.4"},"contributors":[{"name":"Antonio Salazar Cardozo","email":"savedfastcool@gmail.com","url":"https://github.com/Shadowfiend"},{"name":"Van Nguyen","email":"the.gol.effect@gmail.com","url":"https://github.com/thegoleffect"},{"name":"David Trejo","email":"david@dtrejo.com","url":"https://github.com/dtrejo"},{"name":"Ben Glow","email":"glen.low@pixelglow.com","url":"https://github.com/pixelglow"},{"name":"NewITFarmer.com","url":"https://github.com/newitfarmer"},{"name":"Alfred Westerveld","email":"alfredwesterveld@gmail.com","url":"https://github.com/alfredwesterveld"},{"name":"Vincent Côté-Roy","email":"vincentcr@gmail.com","url":"https://github.com/vincentcr"},{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"https://github.com/lloyd"},{"name":"Roman Shtylman","email":"shtylman@gmail.com","url":"https://github.com/shtylman"},{"name":"Vadim Graboys","email":"dimva13@gmail.com","url":"https://github.com/vadimg"},{"name":"Ben Noorduis","url":"https://github.com/bnoordhuis"},{"name":"Nate Rajlich","email":"nathan@tootallnate.net","url":"https://github.com/tootallnate"},{"name":"Sean McArthur","email":"sean.monstar@gmail.com","url":"https://github.com/seanmonstar"},{"name":"Fanie Oosthuysen","email":"fanie.oosthuysen@gmail.com","url":"https://github.com/weareu"}],"_npmUser":{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"},"_id":"bcrypt@0.7.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"923e2623331211adcab6ac84ec4fcd41713e1e58","tarball":"http://registry.npmjs.org/bcrypt/-/bcrypt-0.7.1.tgz"},"readme":"node.bcrypt.js\n=============\n\n[![Build Status](https://secure.travis-ci.org/ncb000gt/node.bcrypt.js.png)](http://travis-ci.org/#!/ncb000gt/node.bcrypt.js) \n\nLib to help you hash passwords.\n[bcrypt on wikipedia][bcryptwiki]\n\nCatalyst for this module: [How To Safely Store A Password][codahale]\n\n\nVersion Compatability\n=============\n\n<table>\n<tr>\n<td>Node Ver</td><td>Bcrypt Version</td>\n</tr>\n<tr>\n<td>&lt;= 0.4.x</td><td>&lt;= 0.4.x</td>\n</tr>\n<tr>\n<td>&gt;= 0.6.x</td><td>&gt;= 0.5.x</td>\n</tr>\n</table>\n\nWindows users should make sure to have at least node 0.8.5 installed and version >= 0.7.1 of this module.\n\n\nSecurity Issues/Concerns\n=============\n\nAs should be the case with any security tool, this library should be scrutinized by anyone using it. If you find or suspect an issue with the code- please bring it to my attention and I'll spend some time trying to make sure that this tool is as secure as possible.\n\nTo make it easier for people using this tool to analyze what has been surveyed, here is a list of BCrypt related security issues/concerns as they've come up.\n\n* An [issue with passwords][jtr] was found with a version of the Blowfish algorithm developed for John the Ripper. This is not present in the OpenBSD version and is thus not a problem for this module. HT [zooko][zooko].\n\nDependencies\n=============\n\n* NodeJS\n* OpenSSL (Development Libraries (header files) for compilation)\n * For Windows you'll need http://slproweb.com/products/Win32OpenSSL.html installed to the default location of `C:\\OpenSSL-Win32`\n\nFrom NPM\n============\n\nnpm install bcrypt\n\n\nFrom Source\n============\n\nAssuming you've already built node, you can compile the module with `node-gyp`:\n\n```\ngit clone git://github.com/ncb000gt/node.bcrypt.js.git\ncd node.bcrypt.js\nnode-gyp configure\nnode-gyp build\n```\n\nNote: if you do not have node-gyp installed, install it using: `npm install -g node-gyp`\n\nUsage - Sync\n============\n\nTo hash a password:  \n\n```javascript\nvar bcrypt = require('bcrypt');\nvar salt = bcrypt.genSaltSync(10);\nvar hash = bcrypt.hashSync(\"B4c0/\\/\", salt);\n// Store hash in your password DB.\n```\n\nTo check a password:  \n\n```javascript\n// Load hash from your password DB.\nbcrypt.compareSync(\"B4c0/\\/\", hash); // true\nbcrypt.compareSync(\"not_bacon\", hash); // false\n```\n\nAuto-gen a salt and hash:\n\n```javascript\nvar hash = bcrypt.hashSync('bacon', 8);\n```\n\nUsage - Async\n============\n\nTo hash a password:  \n\n```javascript\nvar bcrypt = require('bcrypt');\nbcrypt.genSalt(10, function(err, salt) {\n    bcrypt.hash(\"B4c0/\\/\", salt, function(err, hash) {\n        // Store hash in your password DB.\n    });\n});\n```\n\nTo check a password:  \n\n```javascript\n// Load hash from your password DB.\nbcrypt.compare(\"B4c0/\\/\", hash, function(err, res) {\n    // res == true\n});\nbcrypt.compare(\"not_bacon\", hash, function(err, res) {\n    // res = false\n});\n```\n\nAuto-gen a salt and hash:\n\n```javascript\nbcrypt.hash('bacon', 8, function(err, hash) {\n});\n```\n\nAPI\n============\n\n`BCrypt.`\n\n  * `genSaltSync(rounds, seed_length)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n  * `genSalt(rounds, seed_length, cb)`\n    * `rounds` - [OPTIONAL] - the number of rounds to process the data for. (default - 10)\n    * `seed_length` - [OPTIONAL] - RAND_bytes wants a length. to make that a bit flexible, you can specify a seed_length. (default - 20)\n    * `cb` - [REQUIRED] - a callback to be fired once the salt has been generated. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `salt` - Second parameter to the callback providing the generated salt.\n  * `hashSync(data, salt)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used in encryption.\n  * `hash(data, salt, cb)`\n    * `data` - [REQUIRED] - the data to be encrypted.\n    * `salt` - [REQUIRED] - the salt to be used to hash the password. if specified as a number then a salt will be generated and used (see examples).\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been encrypted. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `encrypted` - Second parameter to the callback providing the encrypted form.\n  * `compareSync(data, encrypted)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n  * `compare(data, encrypted, cb)`\n    * `data` - [REQUIRED] - data to compare.\n    * `encrypted` - [REQUIRED] - data to be compared to.\n    * `cb` - [REQUIRED] - a callback to be fired once the data has been compared. uses eio making it asynchronous.\n      * `err` - First parameter to the callback detailing any errors.\n      * `same` - Second parameter to the callback providing whether the data and encrypted forms match [true | false].\n  * `getRounds(encrypted)` - return the number of rounds used to encrypt a given hash\n    * `encrypted` - [REQUIRED] - hash from which the number of rounds used should be extracted.\n\n\nHash Info\n============\n\nThe characters that comprise the resultant hash are `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$`.\n\nTesting\n============\n\nIf you create a pull request, tests better pass :)\n\n    npm install\n    npm test\n\nCredits\n============\n\nThe code for this comes from a few sources:\n\n* blowfish.cc - OpenBSD\n* bcrypt.cc - OpenBSD\n* bcrypt::gen_salt - [gen_salt inclusion to bcrypt][bcryptgs]\n* bcrypt_node.cc - me\n\nContributors\n============\n\n* [Antonio Salazar Cardozo][shadowfiend] - Early MacOS X support (when we used libbsd)\n* [Ben Glow][pixelglow] - Fixes for thread safety with async calls\n* [Van Nguyen][thegoleffect] - Found a timing attack in the comparator\n* [NewITFarmer][newitfarmer] - Initial Cygwin support\n* [David Trejo][dtrejo] - packaging fixes\n* [Alfred Westerveld][alfredwesterveld] - packaging fixes\n* [Vincent Côté-Roy][vincentr] - Testing around concurrency issues\n* [Lloyd Hilaiel][lloyd] - Documentation fixes\n* [Roman Shtylman][shtylman] - Code refactoring, general rot reduction, compile options, better memory management with delete and new, and an upgrade to libuv over eio/ev.\n* [Vadim Graboys][vadimg] - Code changes to support 0.5.5+\n* [Ben Noordhuis][bnoordhuis] - Fixed a thread safety issue in nodejs that was perfectly mappable to this module.\n* [Nate Rajlich][tootallnate] - Bindings and build process.\n* [Sean McArthur][seanmonstar] - Windows Support\n* [Fanie Oosthuysen][weareu] - Windows Support\n\nLicense\n============\n\nUnless stated elsewhere, file headers or otherwise, the license as stated in the LICENSE file.\n\n\n\n[bcryptwiki]: http://en.wikipedia.org/wiki/Crypt_(Unix)#Blowfish-based_scheme  \n[bcryptgs]: http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html\n[codahale]: http://codahale.com/how-to-safely-store-a-password/\n[gh13]: https://github.com/ncb000gt/node.bcrypt.js/issues/13\n[jtr]: http://www.openwall.com/lists/oss-security/2011/06/20/2\n\n[shadowfiend]:https://github.com/Shadowfiend\n[thegoleffect]:https://github.com/thegoleffect\n[pixelglow]:https://github.com/pixelglow\n[dtrejo]:https://github.com/dtrejo\n[alfredwesterveld]:https://github.com/alfredwesterveld\n[newitfarmer]:https://github.com/newitfarmer\n[zooko]:https://twitter.com/zooko\n[vincentr]:https://twitter.com/vincentcr\n[lloyd]:https://github.com/lloyd\n[shtylman]:https://github.com/shtylman\n[vadimg]:https://github.com/vadimg\n[bnoordhuis]:https://github.com/bnoordhuis\n[tootallnate]:https://github.com/tootallnate\n[seanmonstar]:https://github.com/seanmonstar\n[weareu]:https://github.com/weareu","maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}]}},"maintainers":[{"name":"ncb000gt","email":"nicholas.j.campbell@gmail.com"}],"time":{"modified":"2012-08-05T00:01:50.175Z","created":"2011-02-21T19:08:55.959Z","0.1.2":"2011-02-21T19:08:56.225Z","0.2.0":"2011-03-28T05:57:12.566Z","0.2.1":"2011-04-12T05:10:00.455Z","0.1.3":"2011-04-12T05:25:27.185Z","0.2.2":"2011-04-13T02:03:37.294Z","0.2.3":"2011-04-24T19:32:38.008Z","0.2.4":"2011-08-08T01:52:14.334Z","0.3.0":"2011-09-02T03:39:02.622Z","0.3.1":"2011-09-02T22:19:18.125Z","0.3.2":"2011-09-26T23:54:54.796Z","0.4.0":"2011-10-05T12:48:59.793Z","0.4.1":"2011-11-18T13:57:42.489Z","0.5.0":"2012-01-09T04:15:26.039Z","0.6.0":"2012-06-26T17:23:19.824Z","0.7.0":"2012-07-04T17:36:17.751Z","0.7.1":"2012-08-04T04:42:55.593Z"},"author":{"name":"Nick Campbell","url":"http://github.com/ncb000gt"},"repository":{"type":"git","url":"git://github.com/ncb000gt/node.bcrypt.js.git"},"users":{"linus":true,"fgribreau":true,"pid":true},"_attachments":{"bcrypt-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-JDWGf5k4AcrYhAp04UMszQ==","length":26352,"stub":true},"bcrypt-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-IAcJgQQFFh4FCpx3W92zPw==","length":24729,"stub":true},"bcrypt-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-AQwsGpoQuHVmtAHg4zpivw==","length":24478,"stub":true},"bcrypt-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-T5VSFwCa2B2nMiCeEZwWow==","length":24369,"stub":true},"bcrypt-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-TxV6/kgr0f+yUYtx56m+fQ==","length":22987,"stub":true},"bcrypt-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-IXMar5w0d5xNNJW4AYmmtQ==","length":22147,"stub":true},"bcrypt-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Ef9hel3l3Fr1I8HTMMwqTw==","length":21732,"stub":true},"bcrypt-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-pV/IlAmolSuYVpRX66EkCg==","length":21777,"stub":true},"bcrypt-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-HCCKDCCbEFUaFESQjOutEQ==","length":21684,"stub":true},"bcrypt-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ntYXnSzay+F1PiAdtLcmsA==","length":21850,"stub":true},"bcrypt-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-TWdUBKOohYSPf6sHH5u0BA==","length":29984,"stub":true},"bcrypt-0.2.2-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-I4AMn6ux55LqJlbFeS1GqQ==","length":134376,"stub":true},"bcrypt-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-GDkPPSeyXijCcQ/g5O6fRA==","length":23676,"stub":true},"bcrypt-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jj5xhqpINS489DN4dOHDKg==","length":19109,"stub":true},"bcrypt-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-yc3ZMcr6NtWliDk2FZfD8Q==","length":24516,"stub":true},"bcrypt-0.2.0-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-87jGDq5kDoGKZh5ujZNLkg==","length":133814,"stub":true},"bcrypt-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9VNQL947VF9B2WfrAhuxCQ==","length":20529,"stub":true},"bcrypt-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qk2+vz8289hmzpMVPs3Tiw==","length":17236,"stub":true}}}},
{"id":"bea","key":"bea","value":{"rev":"3-8b54ce44f9fa0b76a5ff7726c638068e"},"doc":{"_id":"bea","_rev":"3-8b54ce44f9fa0b76a5ff7726c638068e","name":"bea","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"bea","version":"0.2.0","keywords":["javascript","c++","module","bea","converter","generator","library"],"dependencies":{"underscore":"*","argsparser":"*","coffee-script":"1.3.3"},"main":"./bea","bin":{"bea":"./bin/bea"},"_npmUser":{"name":"codeboost","email":"florin@libertv.ro"},"_id":"bea@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.7.0","_defaultsLoaded":true,"dist":{"shasum":"93ed15f5d3c23b7810d9a6e33927007a6e4c8756","tarball":"http://registry.npmjs.org/bea/-/bea-0.2.0.tgz"},"maintainers":[{"name":"codeboost","email":"florin@libertv.ro"}]}},"readme":"What is bea?\n============\n\nBea helps you expose C++ libraries to Javascript.\n\nWhat does it do ?\n=================\n\nIt generates the 'glue' code between your C++ classes and the V8 Javascript engine.\nThe objects and functions which you want to expose are defined in special '.bea' files.\nBea parses these files and generates a .h and .cpp which you include in your project and build it.\nThen you can write Javascript applications which use your C++ classes.\n\nSo far, bea has been successfully used to expose the OpenFrameworks C++ library to Javascript (https://github.com/codeboost/JOpenFrameworks),\nOpenGL 1.1 and the OpenCV library.\n\n\nWhat is supported / Features ?\n==============================\n\n* Static functions\n* C++ classes\n* Virtual functions -- allows you to subclass and override C++ virtual functions from Javascript\n* Multiple inheritance is supported\n* Raw pointers and buffers \n* Pointers from javascript Array and vice-versa\n* Javascript accessors from member variables\n* Object-notation js types to native C++ types\n\nInstalling & Running \n===========\nInstall node.js, then Coffee-Script, then run npm install to get bea dependencies:\n\t\n\tnpm install -g coffee-script\n\t...\n\tgit clone git@github.com:codeboost/bea.git \n\tcd bea\n\tnpm install\n\t\nAfter that, you can run bea, like so:\n\n\tcoffee bea fileName.bea \n\n\n\t\nBea file syntax\n===============\n\nPlease read the DOCUMENTATION.md file.\n","maintainers":[{"name":"codeboost","email":"florin@libertv.ro"}],"time":{"modified":"2012-06-24T09:45:44.529Z","created":"2012-06-24T09:45:41.780Z","0.2.0":"2012-06-24T09:45:44.529Z"},"_attachments":{"bea-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xEq2cdZ40/TmaPtWhNjA7g==","length":46677,"stub":true}}}},
{"id":"beaconpush","key":"beaconpush","value":{"rev":"3-956fcd87a6d3f9d5b9775d47e36aa3e5"},"doc":{"_id":"beaconpush","_rev":"3-956fcd87a6d3f9d5b9775d47e36aa3e5","name":"beaconpush","description":"node.js client for the Beaconpush API (cloud hosted service for Web Sockets and other push technologies)","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"beaconpush","version":"0.1.0","description":"node.js client for the Beaconpush API (cloud hosted service for Web Sockets and other push technologies)","homepage":"http://beaconpush.com","author":{"name":"Carl Byström","email":"cgbystrom@gmail.com"},"keywords":["websocket","websockets","realtime","html5","cloud","push"],"repository":{"type":"git","url":"https://github.com/cgbystrom/node-beaconpush.git"},"bugs":{"url":"https://github.com/cgbystrom/node-beaconpush/issues"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.4.0"},"dependencies":{"request":">= 1.2.0"},"devDependencies":{"coffee-script":">= 1.0.1","vows":"0.5.6"},"licenses":[{"type":"MIT","url":"https://github.com/cgbystrom/node-beaconpush/raw/master/LICENSE"}],"_id":"beaconpush@0.1.0","_nodeSupported":true,"_npmVersion":"0.2.11-5","_nodeVersion":"v0.4.0","dist":{"shasum":"998a219527252f168b0e659fafbb7b2d997e33ce","tarball":"http://registry.npmjs.org/beaconpush/-/beaconpush-0.1.0.tgz"}}},"maintainers":[{"name":"cgbystrom","email":"cgbystrom+npm@gmail.com"}],"time":{"modified":"2011-02-20T15:58:34.294Z","created":"2011-02-20T15:58:32.965Z","0.1.0":"2011-02-20T15:58:34.294Z"},"author":{"name":"Carl Byström","email":"cgbystrom@gmail.com"},"repository":{"type":"git","url":"https://github.com/cgbystrom/node-beaconpush.git"},"_attachments":{"beaconpush-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9uKLg4TzbeUUzzo35MKYqg==","length":285609,"stub":true}}}},
{"id":"bean","key":"bean","value":{"rev":"115-b19fba8b066410b98178caa81ffdfaf7"},"doc":{"_id":"bean","_rev":"115-b19fba8b066410b98178caa81ffdfaf7","name":"bean","description":"an events api for javascript","dist-tags":{"latest":"0.4.11-1","dev":"1.0.0a1"},"versions":{"0.0.1":{"name":"bean","description":"an events api for javascript","version":"0.0.1","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1f03cb5a9880f037fc1ffa158261b3d41cceb405","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.1.tgz"}},"0.0.2":{"name":"bean","description":"an events api for javascript","version":"0.0.2","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b8c6111dca48d995a708f0767d78ce05be3c31dc","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.2.tgz"}},"0.0.3":{"name":"bean","description":"an events api for javascript","version":"0.0.3","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"96445503f9ee2da6b055a22302395a0fe4bf8efb","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.3.tgz"}},"0.0.35":{"name":"bean","description":"an events api for javascript","version":"0.0.35","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.35","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8ea9f30f4111e8ada007e5c4cdf648c2c9190f4e","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.35.tgz"}},"0.0.4":{"name":"bean","description":"an events api for javascript","version":"0.0.4","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"17d1d66ad506d5f978cb1a966fc0a4bcdd8b7094","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.4.tgz"}},"0.0.5":{"name":"bean","description":"an events api for javascript","version":"0.0.5","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"37ae43fad5c5470c119f916a7deb895b44917c6d","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.5.tgz"}},"0.0.6":{"name":"bean","description":"an events api for javascript","version":"0.0.6","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","_id":"bean@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5c2e199d8f08bed64d659ada1ab3cff8fa88c3a7","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.6.tgz"}},"0.0.7":{"name":"bean","description":"an events api for javascript","version":"0.0.7","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"c4ea8959c19a057fd9226f9f114f184e7b364319","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.7.tgz"},"directories":{}},"0.0.8":{"name":"bean","description":"an events api for javascript","version":"0.0.8","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"1b21ea9af85020f43c00afbdc1c243e01b3fcca9","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.8.tgz"},"directories":{}},"0.0.9":{"name":"bean","description":"an events api for javascript","version":"0.0.9","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"b261983e3268a522e66b1dc409d943353066367d","tarball":"http://registry.npmjs.org/bean/-/bean-0.0.9.tgz"},"directories":{}},"0.1.0":{"name":"bean","description":"an events api for javascript","version":"0.1.0","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"07bbe2bed023477e7c6568feb68c419200e02346","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"bean","description":"an events api for javascript","version":"0.1.1","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"900d67710b8a75d2d9726e8d664c6c0ad926f763","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.1.tgz"},"directories":{}},"0.1.2":{"name":"bean","description":"an events api for javascript","version":"0.1.2","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"c4bd257252eb551026571b703536b2338760063d","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.2.tgz"},"directories":{}},"0.1.3":{"name":"bean","description":"an events api for javascript","version":"0.1.3","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"2f5fb3c4b487ad31ba62c418b0c6975f20a6b977","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.3.tgz"},"directories":{}},"0.1.4":{"name":"bean","description":"an events api for javascript","version":"0.1.4","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"c3d3de260480b110996c504d2e6905a3ae42ccf7","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.4.tgz"},"directories":{}},"0.1.5":{"name":"bean","description":"an events api for javascript","version":"0.1.5","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"46278fe8fe13b0d50a55bf07f034e198534107c9","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.5.tgz"},"directories":{}},"0.1.6":{"name":"bean","description":"an events api for javascript","version":"0.1.6","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"a6ed040d75249957ad855479ff368b22b141368b","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.6.tgz"},"directories":{}},"0.1.7":{"name":"bean","description":"an events api for javascript","version":"0.1.7","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"68c2a16e21d8855451b92e3472e3b259e17286c2","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.7.tgz"},"scripts":{},"directories":{}},"0.1.8":{"name":"bean","description":"an events api for javascript","version":"0.1.8","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ebf9bb98b27a288ba4bd3f46da44b847dc65387a","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.8.tgz"},"scripts":{},"directories":{}},"0.1.9":{"name":"bean","description":"an events api for javascript","version":"0.1.9","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bean@0.1.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1b8698248b306b5a136acae0ef03b31a1ed4e9eb","tarball":"http://registry.npmjs.org/bean/-/bean-0.1.9.tgz"},"scripts":{},"directories":{}},"0.2.1":{"name":"bean","description":"an events api for javascript","version":"0.2.1","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"86b7636b16cb0d03611c0fd7dd16710f6dc3cf3b","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.1.tgz"},"scripts":{},"directories":{}},"0.2.2":{"name":"bean","description":"an events api for javascript","version":"0.2.2","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ef28c469ad77510d216b200090923eb1df4b9dca","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.2.tgz"},"scripts":{},"directories":{}},"0.2.3":{"name":"bean","description":"an events api for javascript","version":"0.2.3","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ed5fbe9d9fd410db8b3363e0b468f1e971830949","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.3.tgz"},"scripts":{},"directories":{}},"0.2.4":{"name":"bean","description":"an events api for javascript","version":"0.2.4","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.5.0","_defaultsLoaded":true,"dist":{"shasum":"85c4cbf6f9c5005a7f43dc5a6d5040b8f203ffbd","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.4.tgz"},"scripts":{},"directories":{}},"0.2.5":{"name":"bean","description":"an events api for javascript","version":"0.2.5","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"33af9acf5d51b39a45f56a1059de5a8d2ff53139","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.5.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}],"directories":{}},"0.2.6":{"name":"bean","description":"an events api for javascript","version":"0.2.6","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.6/package/package.json","contributors":false,"serverjs":false,"wscript":false},"_id":"bean@0.2.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b1063fbffb42f6d35427cf1f9eb112f41604333f","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.6.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}],"directories":{}},"0.2.7":{"name":"bean","description":"an events api for javascript","version":"0.2.7","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"6631911ced8a773d9b210300fb05efe29aac2513","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.7.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}],"directories":{}},"0.2.8":{"name":"bean","description":"an events api for javascript","version":"0.2.8","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bean/0.2.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"563f30ebd63fc7431ea55d9b794040796ed8265f","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.8.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}],"directories":{}},"0.2.9":{"name":"bean","description":"an events api for javascript","version":"0.2.9","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.2.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.2.9","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5c2d96936eb1133382930835ffef4140c143b1cf","tarball":"http://registry.npmjs.org/bean/-/bean-0.2.9.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}],"directories":{}},"0.3.0":{"name":"bean","description":"an events api for javascript","version":"0.3.0","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bean/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c6d928fc24bc6fcbaf348d111434ee0ab6dd373a","tarball":"http://registry.npmjs.org/bean/-/bean-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}],"directories":{}},"0.4.1":{"name":"bean","description":"an events api for javascript","version":"0.4.1","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d927ba4d3d2e1a9bbde0d253ec0af959193fc5b1","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.1.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.2":{"name":"bean","description":"an events api for javascript","version":"0.4.2","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c148d5f5323d6338b03f95c38bd1d99d43e166af","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.2.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.3":{"name":"bean","description":"an events api for javascript","version":"0.4.3","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d75eaaf94490a67e6d6659478e87266ca1af4e14","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.3.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.4":{"name":"bean","description":"an events api for javascript","version":"0.4.4","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b922582481d3544c8a1a5d702e348470d43335f9","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.4.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.5":{"name":"bean","description":"an events api for javascript","version":"0.4.5","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1812d7b2ae679c3bf6ee7d429049fd1917d0a361","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.5.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler, queryEngine);\n```\n\n*(note: to use event delegation with a selector, you must pass bean.add a reference to a selector engine like qwery or sizzle)*\nDevelopers working on Mobile Webkit applications like iPhone or Android, you may wish to simply provide the following query selector with Bean:\n\n```javascript\nbean.add(element, '.content p', 'click', fn, function (selector) {\n  return document.querySelectorAll(selector);\n});\n```\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\n\ncustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nobject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code>\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.6":{"name":"bean","description":"an events api for javascript","version":"0.4.6","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f9c758195486a6713f5d183fa5fa23c8233ebb0f","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.6.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler, queryEngine);\n```\n\n*(note: to use event delegation with a selector, you must pass bean.add a reference to a selector engine like qwery or sizzle)*\nDevelopers working on Mobile Webkit applications like iPhone or Android, you may wish to simply provide the following query selector with Bean:\n\n```javascript\nbean.add(element, '.content p', 'click', fn, function (selector) {\n  return document.querySelectorAll(selector);\n});\n```\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\n\ncustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nobject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code>\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.7":{"name":"bean","description":"an events api for javascript","version":"0.4.7","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"0822be57a04f1b9eba4530b05240c7efd6ae6099","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.7.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler, queryEngine);\n```\n\n*(note: to use event delegation with a selector, you must pass bean.add a reference to a selector engine like qwery or sizzle)*\nDevelopers working on Mobile Webkit applications like iPhone or Android, you may wish to simply provide the following query selector with Bean:\n\n```javascript\nbean.add(element, '.content p', 'click', fn, function (selector) {\n  return document.querySelectorAll(selector);\n});\n```\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\n\ncustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nobject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code>\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.8":{"name":"bean","description":"an events api for javascript","version":"0.4.8","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.8","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"1aa3d339af53054ffdbbef9fc20f12889b4c0d71","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.8.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler, queryEngine);\n```\n\n*(note: to use event delegation with a selector, you must pass bean.add a reference to a selector engine like qwery or sizzle)*\nDevelopers working on Mobile Webkit applications like iPhone or Android, you may wish to simply provide the following query selector with Bean:\n\n```javascript\nbean.add(element, '.content p', 'click', fn, function (selector) {\n  return document.querySelectorAll(selector);\n});\n```\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\n\ncustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nobject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code>\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.9":{"name":"bean","description":"an events api for javascript","version":"0.4.9","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.9","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"94b99733bedb25a003b99a112c87468b89550459","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.9.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler, queryEngine);\n```\n\n*(note: to use event delegation with a selector, you must pass bean.add a reference to a selector engine like qwery or sizzle)*\nDevelopers working on Mobile Webkit applications like iPhone or Android, you may wish to simply provide the following query selector with Bean:\n\n```javascript\nbean.add(element, '.content p', 'click', fn, function (selector) {\n  return document.querySelectorAll(selector);\n});\n```\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\n\ncustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nobject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code> *NOTE: This API is likely to change slightly in the near future see [#55](https://github.com/fat/bean/issues/55)*\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.10":{"name":"bean","description":"an events api for javascript","version":"0.4.10","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.10","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.14-pre","_defaultsLoaded":true,"dist":{"shasum":"664dd7314ac090a7265837abb06aa69263e31476","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.10.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler, queryEngine);\n```\n\n*(note: to use event delegation with a selector, you must pass bean.add a reference to a selector engine like qwery or sizzle)*\nDevelopers working on Mobile Webkit applications like iPhone or Android, you may wish to simply provide the following query selector with Bean:\n\n```javascript\nbean.add(element, '.content p', 'click', fn, function (selector) {\n  return document.querySelectorAll(selector);\n});\n```\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\n\ncustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nobject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code> *NOTE: This API is likely to change slightly in the near future see [#55](https://github.com/fat/bean/issues/55)*\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.11":{"name":"bean","description":"an events api for javascript","version":"0.4.11","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.11","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"dist":{"shasum":"544c2bcdb1223e451a0ce4d9b13ab59f75cbb1bb","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.11.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler);\n```\n\n**Note**: the 5th parameter (selector engine) of previous Bean releases is now deprecated and will be removed in future versions. Use `setSelectorEngine()` instead.\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\nsetSelectorEngine()\n----\n<code>bean.setSelectorEngine()</code> allows you to set a default selector engine for all your delegation needs.\n\n```javascript\nbean.setSelectorEngine(qwery);\n```\n\n**Note**: `querySelectorAll()` is used as the default selector engine, this is available on most modern platforms such as mobile WebKit. To support event delegation on older browsers you will need to install a selector engine.\n\nCustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nObject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code> *NOTE: This API is likely to change slightly in the near future see [#55](https://github.com/fat/bean/issues/55)*\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"0.4.11-1":{"name":"bean","description":"an events api for javascript","version":"0.4.11-1","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"git://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","ender":"./src/ender.js","_npmUser":{"name":"rvagg","email":"rod@vagg.org"},"_id":"bean@0.4.11-1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.16-pre","_defaultsLoaded":true,"dist":{"shasum":"2f3f760771e6d67d243f6196c4fd120014497de8","tarball":"http://registry.npmjs.org/bean/-/bean-0.4.11-1.tgz"},"readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler);\n```\n\n**Note**: the 5th parameter (selector engine) of previous Bean releases is now deprecated and will be removed in future versions. Use `setSelectorEngine()` instead.\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\nsetSelectorEngine()\n----\n<code>bean.setSelectorEngine()</code> allows you to set a default selector engine for all your delegation needs.\n\n```javascript\nbean.setSelectorEngine(qwery);\n```\n\n**Note**: `querySelectorAll()` is used as the default selector engine, this is available on most modern platforms such as mobile WebKit. To support event delegation on older browsers you will need to install a selector engine.\n\nCustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nObject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself. Run *make* in the root of the project.\n\nTests\n-----\npoint your browser at <code>bean/tests/index.html</code>\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code> *NOTE: This API is likely to change slightly in the near future see [#55](https://github.com/fat/bean/issues/55)*\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"directories":{}},"1.0.0a1":{"name":"bean","description":"an events api for javascript","version":"1.0.0a1","homepage":"https://github.com/fat/bean","authors":["Jacob Thornton <@fat>","Dustin Diaz <@ded>","Rod Vagg <@rvagg>"],"repository":{"type":"git","url":"https://github.com/fat/bean.git"},"keywords":["ender","events","event"],"main":"./bean.js","devDependencies":{"buster":"~0.6.2","smoosh":"~0.3.x","qwery":"~3.3.11"},"ender":"./src/ender.js","readme":"Bean\n----\nBean is a small, slick, cross-platform, framework-agnostic event utility designed for desktop, mobile, and touch-based browsers. In its simplest form - it works like this:\n\n```javascript\nbean.add(element, 'click', function (e) {\n  console.log('hello');\n});\n```\n\nAPI\n---\nBean has five methods, each packing quite a punch.\n\n  * bean.<code>add()</code>\n  * bean.<code>one()</code>\n  * bean.<code>remove()</code>\n  * bean.<code>clone()</code>\n  * bean.<code>fire()</code>\n\nadd()\n---\n<code>bean.add()</code> lets you attach event listeners to both elements and objects.\n\n<h3>Signature</h3>\n\n  * {1} element {DOM Element} an HTML DOM element\n  * {2} event type(s) {String} an event (or multiple events) to listen to\n  * {3} handler {Function} the callback function\n\n  * {2,3} handlers {Object} a list of event keys with callback functions as the values\n\n  * {4,n} optional args\n\n<h3>Examples</h3>\n\n```javascript\n// simple\nbean.add(element, 'click', handler);\n\n// optional arguments passed to handler\nbean.add(element, 'click', function(e, o1, o2) {\n  console.log(o1, o2);\n}, 'fat', 'ded');\n\n// multiple events\nbean.add(element, 'keydown keyup', handler);\n\n// multiple handlers\nbean.add(element, {\n  click: function (e) {},\n  mouseover: function (e) {},\n  'focus blur': function (e) {}\n});\n\n// event delegated events\nbean.add(element, '.content p', 'click', handler);\n```\n\n**Note**: the 5th parameter (selector engine) of previous Bean releases is now deprecated and will be removed in future versions. Use `setSelectorEngine()` instead.\n\nOr alternatively, you can pass an array of elements (this actually cuts down on selector engine work, and is a more performant means of delegation if you know your DOM won't be changing:\n\n```javascript\nbean.add(element, [el, el2, el3], 'click', handler);\n//or\nbean.add(element, $('.myClass'), 'click', handler);\n```\n\n*(note: the focus, blur, and submit events will not delegate)*\n\n<h3>Namespacing</h3>\nBean also now supports namespacing your events! This makes it much easier to target them down the line with things like remove or fire. To name space an event just add a dot followed by your unique name identifier:\n\n```javascript\nbean.add(element, 'click.fat', fn);\nbean.add(element, 'click.ded', fn);\nbean.add(element, 'click', fn);\n\n//later...\nbean.fire(element, 'click.ded');\nbean.remove(element, 'click.fat');\n\n//alternatively you can specify mutliple remove or fire handlers at once\nbean.fire(element, 'click.ded.fat');\nbean.remove(element, 'click.fat.ded');\n```\n\none()\n---\n<code>bean.one()</code> is an alias for <code>bean.add()</code> except that the handler will only be executed once and then removed for the event type(s).\n\nremove()\n------\n<code>bean.remove()</code> is how you get rid of listeners once you no longer want them. It's also a good idea to call remove on elements before you remove elements from your dom (this gives Bean a chance to clean up some things and prevents memory leaks)\n\n```javascript\n// remove a single event handlers\nbean.remove(element, 'click', handler);\n\n// remove all click handlers\nbean.remove(element, 'click');\n\n// remove handler for all events\nbean.remove(element, handler);\n\n// remove multiple events\nbean.remove(element, 'mousedown mouseup');\n\n// remove all events\nbean.remove(element);\n\n// remove handlers for events using object literal\nbean.remove(element, { click: clickHandler, keyup: keyupHandler })\n```\n\nclone()\n-----\n<code>bean.clone()</code> is a method for cloning events from one element to another.\n\n```javascript\n// clone all events at once by doing this:\nbean.clone(toElement, fromElement);\n\n// clone events of a specific type\nbean.clone(toElement, fromElement, 'click');\n```\n\nfire()\n----\n<code>bean.fire()</code> gives you the ability to trigger events.\n\n```javascript\n// fire a single event on an element\nbean.fire(element, 'click');\n\n// fire multiple types\nbean.fire(element, 'mousedown mouseup');\n```\n\nsetSelectorEngine()\n----\n<code>bean.setSelectorEngine()</code> allows you to set a default selector engine for all your delegation needs.\n\n```javascript\nbean.setSelectorEngine(qwery);\n```\n\n**Note**: `querySelectorAll()` is used as the default selector engine, this is available on most modern platforms such as mobile WebKit. To support event delegation on older browsers you will need to install a selector engine.\n\nCustom events\n-------------\nBean uses methods similar to [Dean Edwards' event model](http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/) to ensure custom events behave like real events, rather than just callbacks.\n\nFor all intents and purposes, you can just think of them as native events, which will bubble up, and everything else you would expect...\n\nuse them like this:\n\n```javascript\nbean.add(element, 'partytime', handler);\nbean.fire(element, 'partytime');\n```\n\nmouseenter, mouseleave\n----------------------\nBean provides you with two custom DOM events, <code>mouseenter</code> and <code>mouseleave</code>. They are essentially just helpers for making your mouseover/mouseout lives a bit easier.\n\nuse them like regular events:\n\n    bean.add(element, 'mouseenter', handler);\n\nObject support\n--------------\nGood news, everything you can do in Bean with an element, you can also do with an object! This is particularly useful for working with classes or plugins.\n\n```javascript\nvar inst = new Klass();\nbean.add(inst, 'complete', handler);\n\n//later on...\nbean.fire(inst, 'complete');\n```\n\nBrowser Support\n---------------\nBean passes our tests in all the following browsers. If you've found bugs in these browsers or others please let us know!\n\n  - IE6, IE7, IE8, IE9\n  - Chrome 1-10\n  - Safari 4-5\n  - Firefox 3, 4\n\nOther important browser notes\n--------------\nOne of the great things about Bean is that it fixes a number of distinguishable browser differences and also provides proper cross-platform support for certain special events.\n\n```javascript\n// normalized browser event model for default behavior and propagation\nbean.add(el, 'click', function (e) {\n  e.preventDefault();\n  e.stopPropagation();\n});\n\n// a simple shortcut, since you usually want preventDefault() and stopPropagation() at the same time\n// (works the same as the previous example)\nbean.add(el, 'click', function (e) {\n  e.stop();\n});\n\n// Note that your mileage with e.stop() may vary with delegated events as the events are not\n// intercepted at the element in question\n\n// DOMContentLoaded\nbean.add(document, 'DOMContentLoaded', fn);\n\n// mousewheel\nbean.add(el, 'mousewheel', fn);\n\n// mobile\nbean.add(window, 'orientationchange', fn);\n\n// touch events\nbean.add(el, 'touchstart touchmove touchend touchcancel', fn);\n\n// gestures\nbean.add(el, 'gesturestart gesturechange gestureend', fn);\n```\n\nBuilding Bean\n-------------\n\nBean uses [JSHint](http://www.jshint.com/) to keep some house rules as well as [UglifyJS](https://github.com/mishoo/UglifyJS) for its compression. For those interested in building Bean yourself, first install the development dependencies with *npm install* in the root of the project and then run *make* to build the project.\n\nTests\n-----\n\nBean uses [BusterJS](http://busterjs.org/) for its unit tests. *npm install* will install Buster for you and then you can simply point your browser at <code>bean/tests/tests.html</code>.\n\nA Buster configuration file also exists so you can use *buster-server* to run a capture server to attach multiple browsers to and then *buster-test* to run the tests.\n\nEnder Integration API\n---------------------\n\nIf you use Bean with Ender its API is greatly extended through its bridge file. This extension aims to give Bean the look and feel of jQuery, but at the tiny size of Bean.\n\nHere's the run down of the method alias' added...\n\n**ADD EVENTS**\n\n + on - <code>$(element).on('click', fn);</code> *NOTE: This API is likely to change slightly in the near future see [#55](https://github.com/fat/bean/issues/55)*\n + addListener - <code>$(element).addListener('click', fn);</code>\n + bind - <code>$(element).bind('click', fn);</code>\n + listen - <code>$(element).listen('click', fn);</code>\n\n\n**REMOVE EVENTS**\n\n + unbind - <code>$(element).unbind('click');</code>\n + unlisten - <code>$(element).unlisten('click');</code>\n + removeListener - <code>$(element).removeListener('click');</code>\n\n\n**DELEGATE EVENTS**\n\n + delegate - <code>$(element).delegate('.foo', 'click', fn);</code>\n + undelegate - <code>$(element).undelegate('.foo', 'click');</code>\n\n\n**CLONE EVENTS**\n\n + cloneEvents - <code>$(element).cloneEvents('.foo', fn);</code>\n\n\n**CUSTOM EVENTS**\n\n + fire / emit / trigger - <code>$(element).trigger('click')\n\n**SPECIAL EVENTS**\n\n + hover - <code>$(element).hover(enterfn, leavefn);</code>\n + blur - <code>$(element).blur(fn);</code>\n + change - <code>$(element).change(fn);</code>\n + click - <code>$(element).click(fn);</code>\n + dblclick - <code>$(element).dblclick(fn);</code>\n + focusin - <code>$(element).focusin(fn);</code>\n + focusout - <code>$(element).focusout(fn);</code>\n + keydown - <code>$(element).keydown(fn);</code>\n + keypress - <code>$(element).keypress(fn);</code>\n + keyup - <code>$(element).keyup(fn);</code>\n + mousedown - <code>$(element).mousedown(fn);</code>\n + mouseenter - <code>$(element).mouseenter(fn);</code>\n + mouseleave - <code>$(element).mouseleave(fn);</code>\n + mouseout - <code>$(element).mouseout(fn);</code>\n + mouseover - <code>$(element).mouseover(fn);</code>\n + mouseup - <code>$(element).mouseup(fn);</code>\n + mousemove - <code>$(element).mousemove(fn);</code>\n + resize - <code>$(element).resize(fn);</code>\n + scroll - <code>$(element).scroll(fn);</code>\n + select - <code>$(element).select(fn);</code>\n + submit - <code>$(element).submit(fn);</code>\n + unload - <code>$(element).unload(fn);</code>\n\nContributors\n-------\n\n  * [Dustin Diaz](https://github.com/fat/bean/commits/master?author=ded)\n  * [Jacob Thornton](https://github.com/fat/bean/commits/master?author=fat)\n  * Follow our software [@dedfat](http://twitter.com/dedfat)\n","_id":"bean@1.0.0a1","dist":{"shasum":"23cbc3dcbd4713e5a945e376d96bb814b3ddf943","tarball":"http://registry.npmjs.org/bean/-/bean-1.0.0a1.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}]}},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"time":{"modified":"2012-08-11T08:45:32.553Z","created":"2011-04-10T00:24:49.783Z","0.0.1":"2011-04-10T00:24:50.178Z","0.0.2":"2011-04-12T17:53:22.185Z","0.0.3":"2011-04-14T05:14:22.360Z","0.0.35":"2011-04-14T06:25:18.448Z","0.0.4":"2011-04-14T23:28:51.327Z","0.0.5":"2011-04-15T21:04:37.411Z","0.0.6":"2011-04-15T23:09:54.115Z","0.0.7":"2011-04-18T04:16:59.856Z","0.0.8":"2011-04-27T04:16:47.148Z","0.0.9":"2011-05-02T17:16:55.133Z","0.1.0":"2011-05-02T18:21:45.074Z","0.1.1":"2011-05-03T19:08:57.724Z","0.1.2":"2011-05-03T20:17:13.913Z","0.1.3":"2011-05-04T22:46:09.743Z","0.1.4":"2011-05-04T23:34:47.344Z","0.1.5":"2011-05-04T23:51:16.482Z","0.1.6":"2011-05-17T02:31:43.641Z","0.1.7":"2011-05-18T19:19:52.791Z","0.1.8":"2011-06-04T10:04:54.326Z","0.1.9":"2011-06-13T07:59:04.907Z","0.2.1":"2011-06-26T22:42:04.498Z","0.2.2":"2011-06-26T23:01:06.309Z","0.2.3":"2011-07-01T04:01:04.769Z","0.2.4":"2011-07-13T07:23:34.585Z","0.2.5":"2011-08-18T23:07:18.095Z","0.2.6":"2011-08-18T23:12:07.387Z","0.2.7":"2011-08-26T03:41:19.672Z","0.2.8":"2011-09-28T02:15:55.184Z","0.2.9":"2011-10-04T21:17:39.186Z","0.3.0":"2011-10-18T17:29:32.916Z","0.4.1":"2012-01-02T23:53:33.425Z","0.4.2":"2012-01-06T00:10:30.252Z","0.4.3":"2012-01-09T09:05:02.418Z","0.4.4":"2012-01-09T10:08:06.715Z","0.4.5":"2012-01-18T22:32:20.049Z","0.4.6":"2012-01-19T22:58:15.049Z","0.4.7":"2012-01-30T00:50:56.588Z","0.4.8":"2012-01-30T04:30:12.000Z","0.4.9":"2012-02-12T03:45:16.037Z","0.4.10":"2012-03-22T09:05:42.438Z","0.4.11":"2012-04-10T02:05:37.205Z","0.4.11-1":"2012-07-02T02:28:18.863Z","1.0.0a1":"2012-08-11T01:08:30.807Z"},"repository":{"type":"git","url":"https://github.com/fat/bean.git"},"users":{"fgribreau":true,"tahu":true},"_attachments":{"bean-1.0.0a1.tgz":{"content_type":"application/octet-stream","revpos":114,"digest":"md5-p59DufylgAlEg1PTfS0+bg==","length":51859,"stub":true},"bean-0.4.11-1.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-jogaveXfA+g4i6wgzL+pNg==","length":68772,"stub":true},"bean-0.4.11.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-8TIH7YV672zZKx3bCSQ03A==","length":287052,"stub":true},"bean-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-fVOIEbWfwmYiLthLw1z5aA==","length":276546,"stub":true},"bean-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-S4jRC3ulikMJ+kjAa/bq3w==","length":276521,"stub":true},"bean-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-KST2KUL+lSqHdFwGCnNk4w==","length":270168,"stub":true},"bean-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-+CQoRQ6MzTC5m2brqMPEbQ==","length":269992,"stub":true},"bean-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-zlzjDcFI/CAXqnA1iNa4aQ==","length":275287,"stub":true},"bean-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-TXcEbaWXAQDfABdc5q0GBA==","length":275256,"stub":true},"bean-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-41FaW4vSg/xGdegvg1sTgQ==","length":276389,"stub":true},"bean-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-DjoG+WT+PnJeAZBGcZbQww==","length":276305,"stub":true},"bean-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-DESOnYA9BrTg9vCfCMi/uA==","length":276061,"stub":true},"bean-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-FUTbgkR3Od56A0bchbhV6w==","length":276032,"stub":true},"bean-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-iJLHrG0u6qv4f0L0o2Vwhw==","length":186683,"stub":true},"bean-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-6dSbP1FyXo6S46HUbdx+Fw==","length":186626,"stub":true},"bean-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-1nsXZNstJ9CnFwdEZuwIhw==","length":186700,"stub":true},"bean-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-a2u0jEOFUphCLCw+Py7Siw==","length":185669,"stub":true},"bean-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-7J8OGJ65v1dJCvnCVJiAxA==","length":185509,"stub":true},"bean-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-kV8wlXTVpKpd5fBEfkrKnA==","length":185410,"stub":true},"bean-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-2vXsyAeH23zC4lk//LgVHA==","length":185349,"stub":true},"bean-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-8YwDyFL/sjyMzd8chia7cw==","length":187168,"stub":true},"bean-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-pievIY6nuDK+yg2+s4gvSQ==","length":183680,"stub":true},"bean-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-ONpYqrpl+qezkP0WIAJzSA==","length":183713,"stub":true},"bean-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-dfH70+QHlXmJHnLYwWQmvg==","length":183489,"stub":true},"bean-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-YmGyWVX0F2DsUv/V3XVCBA==","length":183488,"stub":true},"bean-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-Z5X3qxqA8sTTndTw5B3Mvg==","length":183407,"stub":true},"bean-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-DK3y5xy5zybLY6bx2NsNWQ==","length":183388,"stub":true},"bean-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-KDJ6TSDfPqhYx7zxK0RrXw==","length":181681,"stub":true},"bean-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-l9+dcMDHR0kte6hb2AtEuA==","length":183346,"stub":true},"bean-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-JxHkcsG7EjoIKHAKhVUAIw==","length":183314,"stub":true},"bean-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-ROFUJYCKusxMtCpUFTLnZA==","length":183320,"stub":true},"bean-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-OBmcVvsmKVSQQDhz1rCBSg==","length":183196,"stub":true},"bean-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-nsNyHMSvEpB8Cgya+eGOIg==","length":183009,"stub":true},"bean-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-wMPbPTaF1bWADtw3HbuzPw==","length":182990,"stub":true},"bean-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-lpDKKwPE1V3SItVGX2ndQA==","length":180919,"stub":true},"bean-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-xiSqCPov8rK3+eNfIZJyaQ==","length":180673,"stub":true},"bean-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-3Wu23g7/AzdKEv3p42/eYQ==","length":184748,"stub":true},"bean-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-Iqtpgs1/OMX/Lbn+My2NSA==","length":183247,"stub":true},"bean-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-f7V2ZjyvJNlczPSePAl60w==","length":183251,"stub":true},"bean-0.0.35.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-6hvs33y4lL3HRw1obi16Dg==","length":183165,"stub":true},"bean-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-A3UaC2x7tAZ4BPECY7DMaQ==","length":187839,"stub":true},"bean-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-UlMLxyd17GbPzNK9Ieqxlg==","length":179499,"stub":true},"bean-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q4rIZYgSqljgxfGY1J2RSg==","length":24723,"stub":true}}}},
{"id":"bean.database.mongo","key":"bean.database.mongo","value":{"rev":"57-27107fb0c23b9f3cee9d4c614348ea15"},"doc":{"_id":"bean.database.mongo","_rev":"57-27107fb0c23b9f3cee9d4c614348ea15","name":"bean.database.mongo","description":"mongo bean for beanpole","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"bean.database.mongo","description":"mongo bean for beanpole","version":"0.0.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bean.database.mongo.git"},"directories":{"lib":"./lib"},"dependencies":{"mongoose":"*"},"main":"./plugin/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/bean.database.mongo/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean.database.mongo@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e2ea913bdb965538134172e40cad10e73607377d","tarball":"http://registry.npmjs.org/bean.database.mongo/-/bean.database.mongo-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.2":{"name":"bean.database.mongo","description":"mongo bean for beanpole","version":"0.0.2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.database.mongo.git"},"directories":{"lib":"./lib"},"dependencies":{"mongoose":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.database.mongo@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5b9748deb55b84f593370c1044e68ec0f7c6b859","tarball":"http://registry.npmjs.org/bean.database.mongo/-/bean.database.mongo-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.3":{"name":"bean.database.mongo","description":"mongo bean for beanpole","version":"0.0.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.database.mongo.git"},"directories":{"lib":"./lib"},"dependencies":{"mongoose":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.database.mongo@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"411b22889851b734d558f84098af3c4bb144ace2","tarball":"http://registry.npmjs.org/bean.database.mongo/-/bean.database.mongo-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.4":{"name":"bean.database.mongo","description":"mongo bean for beanpole","version":"0.0.4","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.database.mongo.git"},"directories":{"lib":"./lib"},"dependencies":{"mongoose":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.database.mongo@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3b9b63502a1aaf9ae5a0fb9e708ec18623cfcb22","tarball":"http://registry.npmjs.org/bean.database.mongo/-/bean.database.mongo-0.0.4.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-26T04:12:04.760Z","created":"2011-09-21T03:56:28.557Z","0.0.1":"2011-09-21T03:56:29.288Z","0.0.2":"2011-11-30T18:54:48.459Z","0.0.3":"2012-02-17T20:54:24.921Z","0.0.4":"2012-02-26T04:12:04.760Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.database.mongo.git"},"_attachments":{"bean.database.mongo-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-OGp/1qphlBAT7oiEOd4ABg==","length":10240,"stub":true},"bean.database.mongo-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-IQ892U1xnFoqFVzlRTupfw==","length":10240,"stub":true},"bean.database.mongo-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ouQmaQjtyFUgzTDqehde7A==","length":10240,"stub":true},"bean.database.mongo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1M9OLRNk0yxnp4K1IGkN0w==","length":813,"stub":true}}}},
{"id":"bean.http","key":"bean.http","value":{"rev":"109-c5ca95143762584cb59b3e2454cde7d3"},"doc":{"_id":"bean.http","_rev":"109-c5ca95143762584cb59b3e2454cde7d3","name":"bean.http","description":"HTTP beans for beanpole","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*"},"main":"./plugin/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/bean.http/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bean.http@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"79b54ff1b7f235a7f8c2635f99a00b7276db1ae2","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.2":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f773edc1afdebcf6be9ff726c1d6b03146fe3262","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.3":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*"},"devDependencies":{"beanpole":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"564ed3addd0a7dc39feedde49a7707c2ff42c6e4","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.4":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.4","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*"},"devDependencies":{"beanpole":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d1de3685e5bd3d71f2ce9f668b1c105ea6df8c57","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.4.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.5":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.5","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*"},"devDependencies":{"beanpole":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"525f304ddb8febb81a461ae5ab324c09fadc1202","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.5.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.6":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.6","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*","underscore":"*"},"devDependencies":{"beanpole":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f63e9e159d6003d4bccc82be0171fab06f3f2ccf","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.6.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.7":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.7","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"structr":"*","vine":"*","mime":"*","underscore":"*"},"devDependencies":{"beanpole":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ffe606d84c932195e524085c0032679a89e67eff","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.7.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.8":{"name":"bean.http","description":"HTTP beans for beanpole","version":"0.0.8","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"connect":"*","haba":"*","structr":"*","vine":"*","mime":"*","underscore":"*","winston":"<0.6.0","sprintf":"*","tq":"*"},"devDependencies":{"beanpole":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bean.http@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6981f38d9d7222d0dfcb7d7eb0b4d194c50a73ba","tarball":"http://registry.npmjs.org/bean.http/-/bean.http-0.0.8.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-15T17:17:46.706Z","created":"2011-10-05T13:45:23.266Z","0.0.1":"2011-10-05T13:45:23.913Z","0.0.2":"2011-10-06T21:15:34.801Z","0.0.3":"2011-10-06T23:33:25.428Z","0.0.4":"2011-10-10T04:03:28.518Z","0.0.5":"2011-11-30T18:55:21.168Z","0.0.6":"2012-01-18T06:43:18.358Z","0.0.7":"2012-01-18T19:41:13.585Z","0.0.8":"2012-02-15T17:17:46.706Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"_attachments":{"bean.http-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-2pjElUyKRH3jSLRO2jzUnQ==","length":20480,"stub":true},"bean.http-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-fhQXqIDbt1uYll65vg5hGA==","length":10240,"stub":true},"bean.http-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-//mFndxCTgyJQFDu6NlypA==","length":10240,"stub":true},"bean.http-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-djN8CFSpASWifor2Bz1o+A==","length":10240,"stub":true},"bean.http-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-D9HRf82hQ2Hb/RFefMwUPQ==","length":10240,"stub":true},"bean.http-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EpMgnkIAjvsnzHW10jrnzg==","length":10240,"stub":true},"bean.http-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pA56kxloFCidlpyONXU+tA==","length":10240,"stub":true},"bean.http-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9N+oIGTKRWdseXtDV+yUoQ==","length":7591,"stub":true}}}},
{"id":"beandocs","key":"beandocs","value":{"rev":"31-974293f4e8214214fecee82e9f3f591e"},"doc":{"_id":"beandocs","_rev":"31-974293f4e8214214fecee82e9f3f591e","name":"beandocs","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"beandocs","descriptions":"Documentation engine for beanpole","version":"0.0.1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beandocs":"./bin/build"},"repository":{"type":"git","url":"git://github.com/spiceapps/beandocs.git"},"main":"./lib/index.js","dependencies":{"node-fs":"*","beanpole":"*","structr":"*","ejs":"*","findit":"*","vine":"*"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beandocs/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beandocs@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e1054c5f21a4304b031df7dcbf5d090618ff080d","tarball":"http://registry.npmjs.org/beandocs/-/beandocs-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.3":{"name":"beandocs","descriptions":"Documentation engine for beanpole","version":"0.0.3","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beandocs":"./bin/build"},"repository":{"type":"git","url":"git://github.com/spiceapps/beandocs.git"},"main":"./lib/index.js","dependencies":{"node-fs":"*","beanpole":"*","structr":"*","ejs":"*","findit":"*","vine":"*","jstoxml":"*"},"os":["linux","darwin","freebsd"],"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beandocs@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.97","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"aaa09e7c4d110e0209806f768da1c4c1730b0e3e","tarball":"http://registry.npmjs.org/beandocs/-/beandocs-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.2":{"name":"beandocs","descriptions":"Documentation engine for beanpole","version":"0.0.2","author":{"name":"Craig Condon","email":"craig@crcn.com"},"bin":{"beandocs":"./bin/build"},"repository":{"type":"git","url":"git://github.com/crcn/beandocs.git"},"main":"./lib/index.js","dependencies":{"node-fs":"*","beanpole":"*","structr":"*","ejs":"*","findit":"*","vine":"*","jstoxml":"*"},"os":["linux","darwin","freebsd"],"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beandocs@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bf8ba9b28c9ed3d905c0ef0d3c3a33c980e9f09a","tarball":"http://registry.npmjs.org/beandocs/-/beandocs-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-17T20:54:36.838Z","created":"2011-09-19T02:21:21.069Z","0.0.1":"2011-09-19T02:21:21.810Z","0.0.3":"2011-10-15T18:04:12.200Z","0.0.2":"2012-02-17T20:54:36.838Z"},"author":{"name":"Craig Condon","email":"craig@crcn.com"},"repository":{"type":"git","url":"git://github.com/crcn/beandocs.git"},"_attachments":{"beandocs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-h/eT2NrjhehHwltxRd4lMg==","length":10240,"stub":true},"beandocs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xFukj5G13ephUIVPEFguSA==","length":10240,"stub":true},"beandocs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VtqrA79tzNBay+YyIX0mBw==","length":6928,"stub":true}}}},
{"id":"beanie","key":"beanie","value":{"rev":"23-44a0ceb8300b8bef56cb39ff3f67c5a4"},"doc":{"_id":"beanie","_rev":"23-44a0ceb8300b8bef56cb39ff3f67c5a4","name":"beanie","description":"haba + beanpoll","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"beanie","description":"haba + beanpoll","author":"","version":"0.0.1","dependencies":{"plugin":"<0.2.0","beanpoll":"<0.3.0"},"devDependencies":{},"main":"./lib/node/index.js","directories":{"mesh-src":"./src","lib":"./lib"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanie@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0078453436d26f6e8c2e095f4127b37a82c36a62","tarball":"http://registry.npmjs.org/beanie/-/beanie-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.2":{"name":"beanie","description":"haba + beanpoll","author":"","version":"0.0.2","repository":{"type":"git","url":"git://github.com/crcn/beanie.git"},"dependencies":{"plugin":"<0.2.0","beanpoll":"<0.3.0"},"devDependencies":{},"main":"./lib/node/index.js","directories":{"mesh-src":"./src","lib":"./lib"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanie@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6b38706cf5e8f33e7ebcd7f73c0be16f2e773b9f","tarball":"http://registry.npmjs.org/beanie/-/beanie-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.3":{"name":"beanie","description":"haba + beanpoll","author":"","version":"0.0.3","repository":{"type":"git","url":"git://github.com/crcn/beanie.git"},"dependencies":{"plugin":"<0.2.0","beanpoll":"<0.3.0"},"devDependencies":{},"main":"./lib/node/index.js","directories":{"src":"./src","lib":"./lib"},"mesh":true,"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanie@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e4b9662059b6182de1e3cb7c46fdbd7889cc6c6c","tarball":"http://registry.npmjs.org/beanie/-/beanie-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"## Example\n\n```javascript\n\t\nvar beanie = require('beanie').loader();\n\nbeanie.\nrequire(__dirname + \"/path/to/plugin.js\").\nrequire(__dirname + \"/path/to/dir\").\nrequire(__dirname + \"/path/to/**/*.plugin.js\").\nload(function() {\n\tbeanie.router.push('init');\n})\n\n```\n\nPlugin example:\n\n```javascript\n\nexports.plugin = function(router) {\n\t\n\n\trouter.on({\n\t\t'push init': function() {\n\t\t\t//do something\n\t\t}\n\t})\n}\n\n```\n\n","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-03-15T06:47:01.469Z","created":"2012-02-16T04:05:07.942Z","0.0.1":"2012-02-16T04:05:08.760Z","0.0.2":"2012-02-17T20:55:29.141Z","0.0.3":"2012-03-15T06:47:01.469Z"},"repository":{"type":"git","url":"git://github.com/crcn/beanie.git"},"_attachments":{"beanie-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-jTnuaekjcGN46AzSZQSGDg==","length":10240,"stub":true},"beanie-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ikIBI5XNgiIffI9ftJa4xA==","length":10240,"stub":true},"beanie-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9/9tPNNnzhHW/soMr2JxIA==","length":10240,"stub":true}}}},
{"id":"beanpole","key":"beanpole","value":{"rev":"198-99c62109512a90e572738b77366e8187"},"doc":{"_id":"beanpole","_rev":"198-99c62109512a90e572738b77366e8187","name":"beanpole","description":"Routing on Steroids","dist-tags":{"latest":"0.1.19"},"versions":{"0.0.2":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.2.tgz"},"directories":{}},"0.0.2-1":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.2-1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.2-1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.2-1.tgz"},"directories":{}},"0.0.2-2":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.2-2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.2-2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.2-2.tgz"},"directories":{}},"0.0.2-3":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.2-3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.2-3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.2-3.tgz"},"directories":{}},"0.0.2-4":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.2-4","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.2-4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.2-4.tgz"},"directories":{}},"0.0.3":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.3.tgz"},"directories":{}},"0.0.7":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.7","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.7","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.7.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.8":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.8","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"http://github.com/spiceapps/beanpole.git"},"dependencies":{"sk":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index","_id":"beanpole@0.0.8","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.8.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.9":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.9","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","socket.io":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.0.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.0.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"deb941a6a8d85c0968861ae5ae7600fcc00d9780","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.9.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.10":{"name":"beanpole","description":"Routing on Steroids","version":"0.0.10","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","socket.io":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.0.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.0.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a4a985c5e492fbff189a85c044688cecb39e9e52","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.0.10.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.0":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.0","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"86f70f76896d2db335832abad72f48f98a16f669","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.1":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9af97b4231d3451310f5b629c90452a7d199634f","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.3":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5007d08fb82729edcfcabd2d858bc43f5df8ad5d","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.4":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.4","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9c618034cf0bcded25be75305eeed2894d62d0fd","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.4.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.5":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.5","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","base64":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"82e1908f88c360473b2fe674698bc406add4b500","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.5.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.6":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.6","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8a97524bce7978ea0f454ab064529d9e6c5ab14f","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.6.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.7":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.7","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4a32728e0426c71b98a56a44b45a9703d97aabc0","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.7.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.8":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.8","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a272f013c4582a4fa6530a1425a942ece38e7e89","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.8.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.9":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.9","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanpole/0.1.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanpole@0.1.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9e48e928248985c008c9afcb3ecb1b92e4b89990","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.9.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.10":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.10","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d139138926dba0fcbb3682e2b15e989afd6a46ff","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.10.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.12":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.12","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.12","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cdf974d0fc498e593412f115f85c111c78d62851","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.12.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.13":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.13","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","socket.io":"*","socket.io-client":"*","structr":"*","express":"*","vows":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.13","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5e5fd8d4249d32e585a7f000d90674b95903d694","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.13.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.14":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.14","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.14","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5a533c71c41e651bdbdc212e04815db835e2ab0b","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.14.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.15":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.15","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.15","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"254b92ad6731dc13690917fb2d52f6bbff31c512","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.15.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.0":{"name":"beanpole","description":"Routing on Steroids","version":"0.2.0","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<=0.1.0","underscore":"*"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d6a94716cac78362ec9f68c9ff6e95a7c68785ec","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.2.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.16":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.16","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*"},"devDependencies":{"ebnf-diagram":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"363efb2ef8111f33ec3b3850364c7b04049fbcac","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.16.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.17":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.17","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*"},"devDependencies":{"ebnf-diagram":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.17","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3c1e88614806c3707079d3f4b466f8ae69b11e28","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.17.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.18":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.18","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*"},"devDependencies":{"ebnf-diagram":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.18","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b8d828dbd919369fe69fb72e34c9e2bcae4b6d79","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.18.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.19":{"name":"beanpole","description":"Routing on Steroids","version":"0.1.19","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*","crema":"*"},"devDependencies":{"ebnf-diagram":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpole@0.1.19","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6812d89fe529f50c531b7660373b054bcc57a381","tarball":"http://registry.npmjs.org/beanpole/-/beanpole-0.1.19.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-01-27T21:19:31.685Z","created":"2011-07-26T07:39:51.352Z","0.0.2":"2011-07-26T07:39:51.574Z","0.0.2-1":"2011-07-28T05:24:17.931Z","0.0.2-2":"2011-07-28T07:19:10.681Z","0.0.2-3":"2011-07-28T07:46:55.451Z","0.0.2-4":"2011-07-28T08:01:25.237Z","0.0.3":"2011-07-31T22:47:43.744Z","0.0.7":"2011-08-10T02:59:22.816Z","0.0.8":"2011-08-10T04:49:58.905Z","0.0.9":"2011-08-28T22:13:43.035Z","0.0.10":"2011-08-29T01:34:43.756Z","0.1.0":"2011-09-12T05:17:51.963Z","0.1.1":"2011-09-13T17:42:05.560Z","0.1.3":"2011-09-18T07:53:05.777Z","0.1.4":"2011-09-19T02:19:52.713Z","0.1.5":"2011-09-19T18:56:47.616Z","0.1.6":"2011-09-23T04:20:50.847Z","0.1.7":"2011-09-24T19:14:12.644Z","0.1.8":"2011-09-26T23:48:10.403Z","0.1.9":"2011-09-30T18:28:12.372Z","0.1.10":"2011-10-02T02:16:48.953Z","0.1.12":"2011-10-10T04:07:36.491Z","0.1.13":"2011-10-11T18:53:59.317Z","0.1.14":"2011-10-11T18:55:03.735Z","0.1.15":"2011-10-13T18:54:42.784Z","0.1.16":"2011-12-22T22:29:32.854Z","0.2.0":"2011-12-22T22:27:09.922Z","0.1.17":"2012-01-18T06:56:02.274Z","0.1.18":"2012-01-20T19:13:29.945Z","0.1.19":"2012-01-27T21:19:31.685Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"_attachments":{"beanpole-0.1.19.tgz":{"content_type":"application/octet-stream","revpos":198,"digest":"md5-fvoBQ+mMuJFjRkfkgV3LNw==","length":112640,"stub":true},"beanpole-0.1.18.tgz":{"content_type":"application/octet-stream","revpos":192,"digest":"md5-700v4/k6sEQzdDj00fQshQ==","length":112640,"stub":true},"beanpole-0.1.17.tgz":{"content_type":"application/octet-stream","revpos":190,"digest":"md5-1NxYqmOfNL/IwwaDn+HuTw==","length":112640,"stub":true},"beanpole-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":184,"digest":"md5-UgtCCT73V5KjOYrJKP7ljA==","length":112640,"stub":true},"beanpole-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":180,"digest":"md5-IhlfpA8JQiDIjm8mKOKrMg==","length":81920,"stub":true},"beanpole-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-pY3Dq1pW/POXXHYD3TXfNA==","length":51200,"stub":true},"beanpole-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-ctHx+9FlnYD9etq39E/V9w==","length":51200,"stub":true},"beanpole-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-zWAaPCQJ2UzxH6vxfHebkg==","length":51200,"stub":true},"beanpole-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-LTiOLsC918leBW6BqGE5WA==","length":51200,"stub":true},"beanpole-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-F5pURUu9DHd5ZA1YdkXswg==","length":51200,"stub":true},"beanpole-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-Nfdj8X5brrvsZVEQA/4bmw==","length":61036,"stub":true},"beanpole-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-VURjtqFq+oHz1wjiBl2Iog==","length":61019,"stub":true},"beanpole-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-08XB/0wrc23kZOdObBZuQw==","length":60213,"stub":true},"beanpole-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-se3FzzDUc/mDARGcJSuLDA==","length":60584,"stub":true},"beanpole-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-L08NZTSBwadhzGufklDcMg==","length":59973,"stub":true},"beanpole-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-bkcL77XKDwYhxGTK3zjfhg==","length":60507,"stub":true},"beanpole-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-sFbyTeqb8EoDGIg6Jwx2hw==","length":60403,"stub":true},"beanpole-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-8GWVC92YjQslXcwa8IVhJQ==","length":59992,"stub":true},"beanpole-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-3sKkWMNgBYdMUyI6xkKTrg==","length":59903,"stub":true},"beanpole-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-g1cOD6T7xQBZppy4A4Dxog==","length":47836,"stub":true},"beanpole-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-UYUvhWwmuajxxpsaFq255Q==","length":47009,"stub":true},"beanpole-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-6ReVTS17eFd0QfWalCqz1g==","length":55731,"stub":true},"beanpole-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-sqZtS2IGDVCSPTCP/Nscvg==","length":55729,"stub":true},"beanpole-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-DGk4ldTNaN05GEKc0FekwQ==","length":29825,"stub":true},"beanpole-0.0.2-4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Ad46slQ2wqx5FofATpuACg==","length":28313,"stub":true},"beanpole-0.0.2-3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-4blcuBgqXim7j+IZHv+kfQ==","length":28233,"stub":true},"beanpole-0.0.2-2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mCnRxrlmgKsJjRp5w4dU8g==","length":28225,"stub":true},"beanpole-0.0.2-1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qjDlqiiyyd0nVwdakBBAVg==","length":28197,"stub":true},"beanpole-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-k13SUwTm6de2a/TYoztMfQ==","length":25091,"stub":true}}}},
{"id":"beanpoll","key":"beanpoll","value":{"rev":"440-e13a40254197a46df249531a0872cef7"},"doc":{"_id":"beanpoll","_rev":"440-e13a40254197a46df249531a0872cef7","name":"beanpoll","description":"Routing with syntactic sugar","dist-tags":{"latest":"0.2.17"},"versions":{"0.2.0":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.0","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","outcome":"<0.2.0","underscore":"*"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bab8557bce0dba92c88bebdceafeba3ca1e6e589","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.1":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","outcome":"<0.2.0","underscore":"*"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2fd64be71591202d24b424e8d43aea4ec5317d7c","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.16":{"name":"beanpoll","description":"Routing on Steroids","version":"0.1.16","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*"},"devDependencies":{"ebnf-diagram":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.1.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b5d7c8710e5167c86fe22651018a7f9a372d4418","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.1.16.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.1.17":{"name":"beanpoll","description":"Routing on Steroids","version":"0.1.17","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"sk":"*","vine":"*","mime":"*","gumbo":"*","cashew":"*","structr":"*","coffee-script":"*"},"devDependencies":{"ebnf-diagram":"*"},"main":"./lib/node/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.1.17","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b42e08c9ca6c0e39edf58faca2fd23a46cd50e7c","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.1.17.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.3":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","underscore":"*","dolce":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9da270fd6efb44616f71347390b29b129e9b0056","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.4":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.4","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d7abf608a40c2bc9d28f09445e803c6667f47867","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.4.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.6":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.6","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"be9b8898b90a8803f1dfa81df0d8f512ff00130d","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.6.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.7":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.7","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a281ebd76c15d6251e4b02b97873cfc0caeaa237","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.7.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.8":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.8","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c6eb6e023726e6a0085027c97bffbe98714abae1","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.8.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.9":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.9","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a4d68b19cd9a7928b99e3996c5bdab773d5a666a","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.9.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.10":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.10","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"56ef2130ac4ccf550891f97e84de9beac0058534","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.10.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.11":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.11","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b76720ad997e0d2d7d6c2e271084ef57c95e821c","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.11.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.12":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.12","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpole.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"db3e7b1e7adce741c5b75e8562077755e6a371db","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.12.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.13":{"name":"beanpoll","description":"Routing on Steroids","version":"0.2.13","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll.js.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"57ca1f76030e39ae95ff7d404aa1606dc9a80496","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.13.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.14":{"name":"beanpoll","description":"Routing with syntactic sugar","version":"0.2.14","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll.js.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1f3ddc059efe64d42dea43aad53c6406c1d21641","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.14.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.15":{"name":"beanpoll","description":"Routing with syntactic sugar","version":"0.2.15","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll.js.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.15","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b48ca871df2fd5655288ddfa52cce8b322921190","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.15.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.16":{"name":"beanpoll","description":"Routing with syntactic sugar","version":"0.2.16","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll.js.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","mesh":{"load":"./make.json"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e3302d53a871fa71136cbcc56369e815d6e3043a","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.16.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.2.17":{"name":"beanpoll","description":"Routing with syntactic sugar","version":"0.2.17","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll.js.git"},"directories":{"lib":"./lib"},"dependencies":{"disposable":"*","crema":"<0.2.0","underscore":"*","dolce":"<0.2.0","outcome":"<0.2.0"},"devDependencies":{"ebnf-diagram":"*","vows":"<0.7.0","haba":"<0.1.0","outcome":"<0.2.0","disposable":"0.0.1"},"main":"./lib/index.js","mesh":{"load":"./make.json"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll@0.2.17","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"a48f5121b52fc10871881f0a479d44529d76347f","tarball":"http://registry.npmjs.org/beanpoll/-/beanpoll-0.2.17.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"## Beanpole - Routing framework      \n\n\n### Motivation\n\n- Abstract communication between parts of an application\n\t- keeps code modular\n\t- works in-app, or with other protocols: amqp, http, etc.\n\nThis:\n\n```javascript\n\nrouter.on({\n\t\n\t/**\n\t */\n\n\t'pull auth/user': function(req, res) {\n\t\t//auth here\n\t},\n\n\t/**\n\t */\n\n\t'pull auth/user -> add/photos': function(req, res) {\n\t\t//add photos here\n\t}\n})\n```\n\n\nVersus somethine like this:\n\n```javascript\n\n\nvar addPhotos = function(req, res) {\n\tauthUser(req, res, function() {\n\t\t//do stuff here\n\t});\n}\n\n```\n\n\n\n### Projects using Beanpole\n\n- [celeri](https://github.com/crcn/celeri) - CLI library\n- [bonsai](https://github.com/crcn/bonsai) - application server\n- [leche](https://github.com/crcn/leche) - Framework to build frontend / backend applications with the same code.\n- [daisy](https://github.com/crcn/daisy) - Expose beanpole to: http, websockets, amqp (rabbitmq), etc.    \n- [beandocs](https://github.com/crcn/beandocs) - Generate documentation from your beanpole route comments.\n- [beanprep](https://github.com/crcn/beanprep) - Scans beans in a given directory, and installs their dependencies. \n- [cupboard](https://github.com/crcn/beanprep) - Reverse package manager.       \n\n### Beanpole ports\n\n- [Actionscript](https://github.com/crcn/beanpole.as)  \n- [C++](https://github.com/crcn/beanpoll)     \n\n### Overview          \n\n\n![Alt ebnf diagram](http://i.imgur.com/v1wdO.png)\n                \n\nThe basic route consists of a few parts: the `type` of route, and the `channel`. Here are some examples:\n\n\trouter.on('pull hello/:name', ...);\n\t\nand\n\n\trouter.on('push hello/:name', ...);           \n\t\n\n#### Push Routes:  \n\n- Used to broadcast a message, or change (1 to many).\n- Doesn't expect a response.    \n- Multiple listeners per route.         \n\n#### Pull Routes:\n\n- Used to request data from a particular route (1 to 1).\n- Expects a response.\n- One listener per route. \n- examples:\n\t- request to http-exposed route       \n\t\n\t\n\n\n\n\n\n\n                                                                                                              \n\n","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-05-02T22:59:26.392Z","created":"2011-12-29T04:36:11.984Z","0.2.0":"2011-12-29T04:36:12.744Z","0.1.16":"2012-01-18T06:43:02.021Z","0.2.1":"2011-12-30T21:54:44.280Z","0.2.3":"2012-01-29T05:25:15.877Z","0.1.17":"2012-01-18T06:52:53.947Z","0.2.4":"2012-02-01T19:47:20.669Z","0.2.6":"2012-02-02T19:21:43.593Z","0.2.7":"2012-02-03T19:32:16.460Z","0.2.8":"2012-02-03T21:27:21.476Z","0.2.9":"2012-02-04T20:36:46.220Z","0.2.10":"2012-02-07T21:16:10.028Z","0.2.11":"2012-02-09T21:07:02.518Z","0.2.12":"2012-02-15T00:30:48.248Z","0.2.13":"2012-02-24T20:05:22.331Z","0.2.14":"2012-03-01T05:14:56.819Z","0.2.15":"2012-03-15T05:29:59.630Z","0.2.16":"2012-04-10T04:21:11.633Z","0.2.17":"2012-05-02T22:59:26.392Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll.js.git"},"_attachments":{"beanpoll-0.2.17.tgz":{"content_type":"application/octet-stream","revpos":440,"digest":"md5-9a3ZF1pmjNvPfuV2h5W52Q==","length":133120,"stub":true},"beanpoll-0.2.16.tgz":{"content_type":"application/octet-stream","revpos":434,"digest":"md5-huGi5KDeqGC4xoZCoDc+SA==","length":122880,"stub":true},"beanpoll-0.2.15.tgz":{"content_type":"application/octet-stream","revpos":432,"digest":"md5-cGbDwPuJ9xyMAfaMJvEjZg==","length":92160,"stub":true},"beanpoll-0.2.14.tgz":{"content_type":"application/octet-stream","revpos":430,"digest":"md5-vV4hhpHrDwfRizAmemq3lw==","length":92160,"stub":true},"beanpoll-0.2.13.tgz":{"content_type":"application/octet-stream","revpos":384,"digest":"md5-tafNVgnD1NFqzTmIAQz0Pg==","length":92160,"stub":true},"beanpoll-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":346,"digest":"md5-yH5nZvMCymlz2qkKqnKQ5g==","length":92160,"stub":true},"beanpoll-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":344,"digest":"md5-tXp3iA+QYcqTzEieoQ4rvw==","length":92160,"stub":true},"beanpoll-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":334,"digest":"md5-47Lhnf0/aNNyRVJ3eJN/ng==","length":92160,"stub":true},"beanpoll-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":293,"digest":"md5-1walIIjckyd8IhDXAzGs0A==","length":92160,"stub":true},"beanpoll-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":271,"digest":"md5-q+g8ldlrg2Bqge/ELIukjg==","length":92160,"stub":true},"beanpoll-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":269,"digest":"md5-WwcXMDd/D1xxmAd99vsSdA==","length":92160,"stub":true},"beanpoll-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":255,"digest":"md5-gcY6HADj4GZlzkXVWCdHtw==","length":92160,"stub":true},"beanpoll-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":141,"digest":"md5-wwrpbW4VhW7MRMDXJJCP9Q==","length":92160,"stub":true},"beanpoll-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-zM5UdccXvV2ok+IC7OCZHw==","length":92160,"stub":true},"beanpoll-0.1.17.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-dJEDcQ1P439IdoP9KyikUw==","length":112640,"stub":true},"beanpoll-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-S+kG6bPgcdytEKWf67uQQA==","length":112640,"stub":true},"beanpoll-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-l/YHdr73RbWkBwwSl8U4pw==","length":81920,"stub":true},"beanpoll-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jSaigRfok3l+v93d7D/N0Q==","length":81920,"stub":true}}}},
{"id":"beanpoll-cache","key":"beanpoll-cache","value":{"rev":"3-e6ef186d588b5dc67520751a1a51efdb"},"doc":{"_id":"beanpoll-cache","_rev":"3-e6ef186d588b5dc67520751a1a51efdb","name":"beanpoll-cache","description":"cache middleware for beanpoll","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Craig Condon"},"name":"beanpoll-cache","description":"cache middleware for beanpoll","version":"0.0.1","repository":{"type":"git","url":"git://github.com/crcn/beanpoll-cache.git"},"main":"./lib/node/index.js","dependencies":{"mesh-winston":"0.0.x","crema":"0.1.x"},"devDependencies":{},"directories":{"mesh-src":"./src","lib":"./lib"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-cache@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"edf74d7ca232ca90de9b4e4735d97b225d5f3248","tarball":"http://registry.npmjs.org/beanpoll-cache/-/beanpoll-cache-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"\n## Transports\n\n- redis\n- memory \n- mongodb\n\n##\n\nExample:\n\nbootstrap.js\n\n```javascript\nvar beanie = require('beanie')\n\nbeanie.\nloader().\nparams({\n\t'beanpoll-cache': {\n\t\t'memory': {\n\t\t\t'max-entries': 20000\t\n\t\t},\n\t\t'default': {\n\t\t\t'transport': 'redis',\n\t\t\t'ttl': 3600\n\t\t}\n\t}\n}).\nrequire('beanpoll-cache').\nrequire('./route.js').\nload();\n```\n\nroute.js:\n\n```javascript\nexports.plugin = function(router) {\n\t\n\n\trouter.on({\n\t\t\n\t\t/**\n\t\t * cache users in for default ttl, and using the default transport\n\t\t */\n\n\t\t'pull -method=GET users': function() {\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * clear cache\n\t\t */\n\n\t\t'pull -method=POST users': function() {\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * cache for 1 minute, using in-memory transport\n\t\t */\n\n\t\t'pull -method=GET -cache-ttl=60 -cache-trans=memory users/:user': function() {\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * clear user cache\n\t\t */\n\n\t\t'pull -method=POST users/:user': function() {\n\t\t\t\n\t\t},\n\n\n\t\t/**\n\t\t */\n\n\n\n\t});\n}\n```","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-04-03T00:10:40.637Z","created":"2012-04-03T00:10:38.677Z","0.0.1":"2012-04-03T00:10:40.637Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-cache.git"},"_attachments":{"beanpoll-cache-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JP4FP9xOWjFVfGml/dtlnQ==","length":10240,"stub":true}}}},
{"id":"beanpoll-growl","key":"beanpoll-growl","value":{"rev":"3-d3edb56bb053058e9794955d347564f2"},"doc":{"_id":"beanpoll-growl","_rev":"3-d3edb56bb053058e9794955d347564f2","name":"beanpoll-growl","description":"growl notification plugin for beanpoll","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"beanpoll-growl","description":"growl notification plugin for beanpoll","version":"0.0.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-growl.git"},"dependencies":{"growl":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-growl@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ce7b73b442bb6641639aff4015d71b60fee8f054","tarball":"http://registry.npmjs.org/beanpoll-growl/-/beanpoll-growl-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"### Growl notifications for your beanpole-based app\n\n\n#### Requirements\n\n- growlnotify         \n    \n#### How easy is it to implement?\n                            \n1. In your app directory\n\n          npm install bean.notify.growl\n\n2. In your app\n\n```javascript\n   \nvar beanie = require('beanie').loader();\n\n\nbeanie.\nrequire('beanpoll-growl').\nload();\n\nbeanie.router.push(\"user/notification\", { message: \"hello!\" });\n\n```\n","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-17T21:01:23.097Z","created":"2012-02-17T21:01:22.046Z","0.0.1":"2012-02-17T21:01:23.097Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-growl.git"},"_attachments":{"beanpoll-growl-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JGrgoKlklJiUBau1aCkCMw==","length":20480,"stub":true}}}},
{"id":"beanpoll-http","key":"beanpoll-http","value":{"rev":"35-2f42ef5776c7948b4d863510ffdf760e"},"doc":{"_id":"beanpoll-http","_rev":"35-2f42ef5776c7948b4d863510ffdf760e","name":"beanpoll-http","description":"HTTP beans for beanpole","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.8":{"name":"beanpoll-http","description":"HTTP beans for beanpole","version":"0.0.8","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"connect":"*","plugin":"*","structr":"*","vine":"*","mime":"*","underscore":"*","winston":"<0.6.0","sprintf":"*","tq":"*"},"devDependencies":{"beanie":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-http@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0d14687742ad3400b69739dd8a6987a1fe5f4418","tarball":"http://registry.npmjs.org/beanpoll-http/-/beanpoll-http-0.0.8.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.9":{"name":"beanpoll-http","description":"HTTP beans for beanpole","version":"0.0.9","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"connect":"*","plugin":"*","structr":"*","vine":"*","mime":"*","underscore":"*","winston":"<0.6.0","sprintf":"*","tq":"*"},"devDependencies":{"beanie":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-http@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cf171ba6701ee747b5218d13451102d2d8053bfb","tarball":"http://registry.npmjs.org/beanpoll-http/-/beanpoll-http-0.0.9.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.10":{"name":"beanpoll-http","description":"HTTP beans for beanpole","version":"0.0.10","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"directories":{"lib":"./lib"},"dependencies":{"connect":"*","plugin":"*","structr":"*","vine":"*","mime":"*","underscore":"*","winston":"<0.6.0","sprintf":"*","tq":"*"},"devDependencies":{"beanie":"*"},"main":"./plugin/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-http@0.0.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b376d77a84ed08e8256358ac9dcdff65d3a7394b","tarball":"http://registry.npmjs.org/beanpoll-http/-/beanpoll-http-0.0.10.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"\n\n### Features\n\n- expose your beanpole routes over HTTP\n- easy to specify HTTP Middleware\n\n\n### Plugins\n\n- `http.gateway` exposes your beanpole routes over HTTP.\n- `http.server` starts up the http server.\n- `http.middleware` middleware for http specific routes\n\n\n\n### Usage\n\nBasic Configuration:\n\n```javascript\n\n//sets add a require path to the app\n\nvar loader = require('beanie');\n\n\nloader.params({\n\tpublicDir: __dirname + \"/public\"\n\thttp: {\n\t\tport: 8080\n\t}\n});\n\nloader.\nrequire('beanpoll-http').\nload();\n```\n\n\n### Middleware\n\n\n#### Basic Auth Middleware\n\n\n```javascript\n\n\nrouter.on({\n\t\n\t/**\n\t */\n\t\n\t'pull basic/auth/user/pass -> secret/route': function() {\n\t\treturn \"authorized!\";\n\t},\n\t\n\t\n\t/**\n\t */\n\t\n\t'pull secret/route': function(request) {\n\n\t\tfunction login(user, pass, callback) {\n\n\t\t\tif(user == 'user' && pass == 'pass') return callback(false, { user: 'user' });\n\t\t\t\n\t\t\tcallback('wrong user / pass');\n\t\t}\n\t\t\n\t\trequest.forward('basic/auth', { login: login }, function(response) {\n\n\t\t\trequest.end('authorized!');\n\t\t})\n\t}\n});\n\n```\n\n#### Session Middleware\n\n```javascript\n\nrouter.on({\n\t\n\t/**\n\t */\n\t\n\t'pull session -> account': function(request) {\n\t\t\n\t\t//should be \"test\" on next call\n\t\tconsole.log(request.session.data.username);\n\t\t\n\t\trequest.session.data.username = 'test';\n\t},\n\t\n})\n\n```\n\n\n\n\n\n","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-04-13T21:58:47.442Z","created":"2012-02-24T18:15:41.331Z","0.0.8":"2012-02-24T18:15:44.250Z","0.0.9":"2012-02-27T03:03:24.094Z","0.0.10":"2012-04-13T21:58:47.442Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bean.http.git"},"_attachments":{"beanpoll-http-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-c0/gTEB91FtUUM/VAydrfw==","length":20480,"stub":true},"beanpoll-http-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-VPhD0S/nizef0QdV3x+jxQ==","length":20480,"stub":true},"beanpoll-http-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kNE7CxQ7hgbdMUogYNgWqw==","length":20480,"stub":true}}}},
{"id":"beanpoll-mixpanel","key":"beanpoll-mixpanel","value":{"rev":"3-3d918ad6f723f3685e0a78864d7f29ae"},"doc":{"_id":"beanpoll-mixpanel","_rev":"3-3d918ad6f723f3685e0a78864d7f29ae","name":"beanpoll-mixpanel","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Craig Condon"},"name":"beanpoll-mixpanel","version":"0.0.1","repository":{"type":"git","url":"git://github.com/crcn/beanpoll-mixpanel.git"},"main":"./lib/index.js","dependencies":{"mixpanel":"0.0.x"},"devDependencies":{},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-mixpanel@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"5b3df3669cd9eb43c7f955adacc5769eb32276ff","tarball":"http://registry.npmjs.org/beanpoll-mixpanel/-/beanpoll-mixpanel-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"Example:\n\n\nbootstrap.js: \n\n```javascript\n\nvar beanie = require('beanie');\n\nbeanie.\nloader().\nrequire('beanpoll-mixpanel').\nrequire('trackTime').\nload();\n\n```\n\n\nsomePlugin.js:\n\n```javascript\n\nexports.plugin = function(router) {\n\t\n\n\trouter.on({\n\n\t\t'pull -http /*': function(req, res, mw) {\n\n\t\t\tvar start = Date.now();\n\n\t\t\tres.on('end', function() {\n\n\t\t\t\trouter.push('track', { event: 'page load time' }, { time: Date.now() - start });\n\t\t\t});\n\n\t\t\tnw.next();\n\t\t}\n\t})\n}\n```","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-03-28T02:35:43.515Z","created":"2012-03-28T02:35:42.695Z","0.0.1":"2012-03-28T02:35:43.515Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-mixpanel.git"},"_attachments":{"beanpoll-mixpanel-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+MyHAuEI6MnT5WgvhNUStQ==","length":10240,"stub":true}}}},
{"id":"beanpoll-store","key":"beanpoll-store","value":{"rev":"9-6aa7ea7105c76974a96a08636ef00216"},"doc":{"_id":"beanpoll-store","_rev":"9-6aa7ea7105c76974a96a08636ef00216","name":"beanpoll-store","description":"","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"beanpoll-store","description":"","author":"","version":"0.0.1","dependencies":{"mesh-winston":"0.0.x"},"devDependencies":{},"main":"./lib/web/index.js","directories":{"mesh-src":"./src","lib":"./lib"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-store.git"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-store@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bdfb3d10af13c6a2673c7593fd968ca6f004e4be","tarball":"http://registry.npmjs.org/beanpoll-store/-/beanpoll-store-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.2":{"name":"beanpoll-store","description":"","author":"","version":"0.0.2","dependencies":{"mesh-winston":"0.0.x"},"devDependencies":{},"main":"./lib/web/index.js","directories":{"src":"./src","lib":"./lib"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-store.git"},"mesh":true,"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-store@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"c8ca419c01c587c14786866c33673a899a93b14a","tarball":"http://registry.npmjs.org/beanpoll-store/-/beanpoll-store-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-03-05T05:34:17.153Z","created":"2012-02-17T20:54:08.652Z","0.0.1":"2012-02-17T20:54:09.548Z","0.0.2":"2012-03-05T05:34:17.153Z"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-store.git"},"_attachments":{"beanpoll-store-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-aPzc8zGSE/LeS9lmvSOR8w==","length":10240,"stub":true},"beanpoll-store-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3raKCuHpyl95MkEVP+ya5A==","length":10240,"stub":true}}}},
{"id":"beanpoll-twilio","key":"beanpoll-twilio","value":{"rev":"3-7d8b342d67807bcc64be3bec2a9c6cda"},"doc":{"_id":"beanpoll-twilio","_rev":"3-7d8b342d67807bcc64be3bec2a9c6cda","name":"beanpoll-twilio","description":"Thyme client for beanpoll","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Craig Condon"},"name":"beanpoll-twilio","description":"Thyme client for beanpoll","version":"0.0.0","repository":{"type":"git","url":"git://github.com/crcn/beanpoll-twilio.git"},"main":"./lib/plugin.js","engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanpoll-twilio@0.0.0","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"73092ebf6d78064f6cae10d19b55f73ef6db65e6","tarball":"http://registry.npmjs.org/beanpoll-twilio/-/beanpoll-twilio-0.0.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"\n## Example\n\n```javascript\nvar beanie = require('beanie');\n\nbeanie.\nloader().\nparams({\n\t'hostname': 'mysite.com',\n\t'beanpoll-twilio': {\n\t\taccountSid: 'SID HERE',\n\t\tauth_token: ''\n\t\tphoneNumbers: {\n\t\t\t'craig': '+16269239971',\n\t\t\t'john':  '+11643280333'\n\t\t}\n\t}\n})\nrequire('beanpoll-twilio').\nrequire('my-custom-plugin').\nload();\n```\n\n\n```javascript\n```","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-03-05T05:34:12.923Z","created":"2012-03-05T05:34:12.246Z","0.0.0":"2012-03-05T05:34:12.923Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanpoll-twilio.git"},"_attachments":{"beanpoll-twilio-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fGKpIUFLXZy90aNUS8DMvg==","length":10240,"stub":true}}}},
{"id":"beanprep","key":"beanprep","value":{"rev":"59-d52e266351c93c940abc11486cac1343"},"doc":{"_id":"beanprep","_rev":"59-d52e266351c93c940abc11486cac1343","name":"beanprep","description":"Prepares beanpole-based applications","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"beanprep","description":"Prepares beanpole-based applications","version":"0.0.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/beanprep.git"},"dependencies":{"require-analyzer":"0.3.3","structr":"0.0.10","celeri":"0.0.9","findit":"0.1.1","colors":"*","npm":"*"},"bin":{"beanprep":"./bin/beanprep"},"main":"./lib/index.js","_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beanprep/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beanprep@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8ea3d77385f1c7e22285170d27fc61e6d3395446","tarball":"http://registry.npmjs.org/beanprep/-/beanprep-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.2":{"name":"beanprep","description":"Prepares beanpole-based applications","version":"0.0.2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanprep.git"},"dependencies":{"require-analyzer":"0.3.3","structr":"0.0.10","celeri":"0.0.9","findit":"0.1.1","colors":"*","npm":"*"},"bin":{"beanprep":"./bin/beanprep"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanprep@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8ba34dd60ff8e13df81d08848eeb2c894b4045ff","tarball":"http://registry.npmjs.org/beanprep/-/beanprep-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.3":{"name":"beanprep","description":"Prepares beanpole-based applications","version":"0.0.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanprep.git"},"dependencies":{"require-analyzer":"0.3.3","structr":"0.0.10","celeri":"0.0.9","findit":"0.1.1","colors":"*","npm":"*"},"bin":{"beanprep":"./bin/beanprep"},"main":"./lib/index.js","_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beanprep@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a50b873fbf09b553c4a2650aa397207066cd7159","tarball":"http://registry.npmjs.org/beanprep/-/beanprep-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-04-03T00:10:38.326Z","created":"2011-09-23T18:04:50.594Z","0.0.1":"2011-09-23T18:04:51.463Z","0.0.2":"2011-11-26T20:10:38.069Z","0.0.3":"2012-04-03T00:10:38.326Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/beanprep.git"},"_attachments":{"beanprep-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-0BM5a8O5PdNvfjU2WOsIDQ==","length":10240,"stub":true},"beanprep-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-v0vPGv+D9M7nWoKgxaf7ug==","length":10240,"stub":true},"beanprep-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5KbM1ffBCn9iEGiMGS9AKA==","length":1948,"stub":true}}}},
{"id":"beans","key":"beans","value":{"rev":"82-5f5051d48660439148e3de10764eb0e4"},"doc":{"_id":"beans","_rev":"82-5f5051d48660439148e3de10764eb0e4","name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","dist-tags":{"latest":"0.6.5"},"versions":{"0.3.0":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.3.0","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmJsonOpts":{"file":"/Users/Home/.npm/beans/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beans@0.3.0","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"14dd852bf1bd4d533208bc902177807dfd99ba75","tarball":"http://registry.npmjs.org/beans/-/beans-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.3.1":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.3.1","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmJsonOpts":{"file":"/Users/Home/.npm/beans/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beans@0.3.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"909dd94f322f9b2111d2b4fa64bc8e8cc61d07c6","tarball":"http://registry.npmjs.org/beans/-/beans-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.4.1":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.4.1","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmJsonOpts":{"file":"/Users/Home/.npm/beans/0.4.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beans@0.4.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"650911856e10a4898e599eb30409fd06ad232989","tarball":"http://registry.npmjs.org/beans/-/beans-0.4.1.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.4.2":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.4.2","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmJsonOpts":{"file":"/Users/Home/.npm/beans/0.4.2/package/package.json","contributors":false,"serverjs":false,"wscript":false},"_id":"beans@0.4.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3595e02a142d91be67fb03c73e2c566f85ab5134","tarball":"http://registry.npmjs.org/beans/-/beans-0.4.2.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.4.3":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.4.3","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmJsonOpts":{"file":"/Users/Home/.npm/beans/0.4.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beans@0.4.3","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2cac7fb5c21781322411199c1b36c31e201115f6","tarball":"http://registry.npmjs.org/beans/-/beans-0.4.3.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.4.5":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.4.5","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.4.5","_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"972821001a1bfb5e3f32071aa750c611f2ef03eb","tarball":"http://registry.npmjs.org/beans/-/beans-0.4.5.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.5.0":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.5.0","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","request":"~2.1.1","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.5.0","_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"24739b9f20e102ad1cf152f18069cec26bf8557d","tarball":"http://registry.npmjs.org/beans/-/beans-0.5.0.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.5.1":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.5.1","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","request":"~2.1.1","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.5.1","_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1fafc69fc66c96694fd7c1490b7adca12d09c9a8","tarball":"http://registry.npmjs.org/beans/-/beans-0.5.1.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.5.2":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.5.2","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","request":"~2.1.1","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.5.2","_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c5f9458a1dc0056d6d4fb013612954f3e7a26ad5","tarball":"http://registry.npmjs.org/beans/-/beans-0.5.2.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.5.3":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.5.3","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","request":"~2.1.1","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.5.3","_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"076ebb5d73bc0de47421ab567fb21a5b37a06816","tarball":"http://registry.npmjs.org/beans/-/beans-0.5.3.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"directories":{}},"0.6.1":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.6.1","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.4.10"},"dependencies":{"glob":"~2.0.7","nodeunit":"~0.5.3","request":"~2.1.1","rimraf":"~1.0.4","stitch":"~0.3.2","uglify-js":"~1.0.6","which":"~1.0.0"},"devDependencies":{},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.6.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"979a0a6f56cd8ed061f801265b0dbfc62cb721fb","tarball":"http://registry.npmjs.org/beans/-/beans-0.6.1.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}]},"0.6.2":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.6.2","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.6.4"},"dependencies":{"glob":"~2.1.0","nodeunit":"~0.6.4","request":"~2.2.9","rimraf":"~1.0.8","stitch":"~0.3.2","uglify-js":"~1.1.1","which":"~1.0.2"},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.6.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"3b0d5c4a829d367c9ea86ba84a2bcd3f4aa38a86","tarball":"http://registry.npmjs.org/beans/-/beans-0.6.2.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}]},"0.6.3":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.6.3","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.6.4"},"dependencies":{"glob":"~2.1.0","nodeunit":"~0.6.4","request":"~2.2.9","rimraf":"~1.0.8","stitch":"~0.3.2","uglify-js":"~1.1.1","which":"~1.0.2"},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.6.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"05f98b0401d54cf0074ee5ed1f43a8dc48175656","tarball":"http://registry.npmjs.org/beans/-/beans-0.6.3.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}]},"0.6.4":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.6.4","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.6.4"},"dependencies":{"glob":"~2.1.0","nodeunit":"~0.6.4","request":"~2.2.9","rimraf":"~1.0.8","stitch":"~0.3.2","uglify-js":"~1.1.1","which":"~1.0.2"},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.6.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"992f6664dba6a8fc5dd020d7319c3d96d92ffbd3","tarball":"http://registry.npmjs.org/beans/-/beans-0.6.4.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}]},"0.6.5":{"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"name":"beans","description":"Build tasks for CoffeeScript projects targeting Node and the browser.","keywords":["browser","build","coffeescript"],"version":"0.6.5","repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"main":"./lib/beans","engines":{"node":"~0.6.4"},"dependencies":{"glob":"~2.1.0","nodeunit":"~0.6.4","request":"~2.2.9","rimraf":"~1.0.8","stitch":"~0.3.2","uglify-js":"~1.1.1","which":"~1.0.2"},"bin":{"beans":"./bin/beans"},"_npmUser":{"name":"dimituri","email":"dimituri@gmail.com"},"_id":"beans@0.6.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"7464b234c96553688e5417f69b20598308571ed8","tarball":"http://registry.npmjs.org/beans/-/beans-0.6.5.tgz"},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}]}},"maintainers":[{"name":"dimituri","email":"dimituri@gmail.com"}],"time":{"modified":"2011-12-29T10:46:21.128Z","created":"2011-08-14T07:32:45.471Z","0.2.1":"2011-08-14T07:32:48.049Z","0.2.2":"2011-08-14T19:54:25.989Z","0.2.3":"2011-08-16T21:25:23.040Z","0.2.4":"2011-08-16T21:37:58.855Z","0.2.5":"2011-08-16T23:55:13.901Z","0.3.0":"2011-08-18T16:27:50.586Z","0.3.1":"2011-08-23T23:58:38.004Z","0.4.0":"2011-08-28T17:51:38.766Z","0.4.1":"2011-09-02T13:18:19.855Z","0.4.2":"2011-09-06T14:37:06.807Z","0.4.3":"2011-09-16T09:42:30.195Z","0.4.4":"2011-10-13T11:51:31.136Z","0.4.5":"2011-10-13T12:10:05.786Z","0.5.0":"2011-10-16T21:13:16.684Z","0.5.1":"2011-10-19T15:34:55.610Z","0.5.2":"2011-10-19T15:41:12.403Z","0.5.3":"2011-10-23T18:44:49.961Z","0.6.0":"2011-11-22T15:01:31.544Z","0.6.1":"2011-11-22T19:21:36.697Z","0.6.2":"2011-12-03T11:37:48.499Z","0.6.3":"2011-12-21T08:04:30.608Z","0.6.4":"2011-12-21T15:57:19.173Z","0.6.5":"2011-12-29T10:46:21.128Z"},"author":{"name":"Dimitry Solovyov","email":"dimituri@gmail.com","url":"http://100-hour.com"},"repository":{"type":"git","url":"git://github.com/dimituri/beans.git"},"_attachments":{"beans-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-cge2VBHP+SqQ2oip+72o3Q==","length":10240,"stub":true},"beans-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":80,"digest":"md5-AS098OHaGZphQDBh7joS3g==","length":10240,"stub":true},"beans-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":78,"digest":"md5-cTTqjKNREeF0rrnvjhrdjQ==","length":10240,"stub":true},"beans-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-s4k6u8H4s7+F+ZTBi2F2wQ==","length":10240,"stub":true},"beans-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-mgmRjgbBg+GVCiFvi+e5Fw==","length":10240,"stub":true},"beans-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":68,"digest":"md5-eYiLK78P3mv+nqHq72FNBQ==","length":10240,"stub":true},"beans-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":66,"digest":"md5-WrklN5OPazZzKDPaKovgKQ==","length":10240,"stub":true},"beans-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-nNnm0xpSESvT5V+F9e5qqQ==","length":10240,"stub":true},"beans-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-+MssqNBv/6cUhEkgLnTv7g==","length":10240,"stub":true},"beans-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-o8u6EuLzriI4zh15lPKe+Q==","length":10240,"stub":true},"beans-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-uCimz2a5Z/2pK4Xy7Nzu9A==","length":7905,"stub":true},"beans-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-hC5nVAlu4NYbjM97DGIm1Q==","length":7769,"stub":true},"beans-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-gMDB6LPl4Pby/RNNU5m2YQ==","length":7750,"stub":true},"beans-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-HVrH84tLT7/I+TEM9xEn3A==","length":6426,"stub":true},"beans-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-99kk2dLfVve3Tq5t/goDkQ==","length":5977,"stub":true}}}},
{"id":"beanstalk_client","key":"beanstalk_client","value":{"rev":"6-13c8c80aa6469b5dcf20d65909289383"},"doc":{"_id":"beanstalk_client","_rev":"6-13c8c80aa6469b5dcf20d65909289383","name":"beanstalk_client","description":"client library for the beanstalkd message queue server","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"beanstalk_client","version":"0.2.0","main":"lib/beanstalk_client","description":"client library for the beanstalkd message queue server","_id":"beanstalk_client@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/beanstalk_client/-/beanstalk_client-0.2.0.tgz"},"mtime":"2010-11-09T23:16:36Z","ctime":"2010-11-09T23:16:36Z"}},"maintainers":[{"name":"benlund","email":"ben@benlund.com"}],"mtime":"2010-11-09T23:16:36Z","ctime":"2010-11-09T23:16:36Z","_attachments":{"beanstalk_client-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PMKNxhEQALg1HZ1Y/2mBYg==","length":3698,"stub":true}}}},
{"id":"beanstalk_worker","key":"beanstalk_worker","value":{"rev":"8-893b9cc0ead685974e9fa3d6df4cb868"},"doc":{"_id":"beanstalk_worker","_rev":"8-893b9cc0ead685974e9fa3d6df4cb868","name":"beanstalk_worker","description":"library and example script for building workers to handle jobs held in a beanstalkd message queue server","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.0":{"name":"beanstalk_worker","version":"0.2.0","main":"lib/beanstalk_worker","bin":{"nbworker":"bin/worker.js"},"description":"library and example script for building workers to handle jobs held in a beanstalkd message queue server","dependencies":{"beanstalk_client":"0.2.0"},"_id":"beanstalk_worker@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/beanstalk_worker/-/beanstalk_worker-0.2.0.tgz"}},"0.2.1":{"name":"beanstalk_worker","version":"0.2.1","main":"lib/beanstalk_worker","bin":{"nbworker":"bin/worker.js"},"description":"library and example script for building workers to handle jobs held in a beanstalkd message queue server","dependencies":{"beanstalk_client":"0.2.0"},"_npmUser":{"name":"benlund","email":"ben@benlund.com"},"_id":"beanstalk_worker@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"2e7fe68c3f9d38c0419b15d8ef7eb3a67dcc2bdc","tarball":"http://registry.npmjs.org/beanstalk_worker/-/beanstalk_worker-0.2.1.tgz"},"maintainers":[{"name":"benlund","email":"ben@benlund.com"}]}},"maintainers":[{"name":"benlund","email":"ben@benlund.com"}],"time":{"0.2.1":"2012-03-05T22:57:33.250Z","modified":"2012-03-05T22:57:33.250Z","created":"2012-03-05T22:57:33.250Z","0.2.0":"2012-03-05T22:57:33.250Z"},"_attachments":{"beanstalk_worker-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-oPgHZ03ZZqW7GM6qZzY3Vw==","length":10240,"stub":true},"beanstalk_worker-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2R5q3gH/HHOoWqXX29be0w==","length":5973,"stub":true}}}},
{"id":"beantest","key":"beantest","value":{"rev":"15-9d2afe75df47dcae51ee7fe14defc7b9"},"doc":{"_id":"beantest","_rev":"15-9d2afe75df47dcae51ee7fe14defc7b9","name":"beantest","description":"Beantest: autotest jasmine-node tests","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"beantest","version":"0.0.1","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":"1.0.9","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmJsonOpts":{"file":"/Users/1000memories/.npm/beantest/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beantest@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.6-pre","_defaultsLoaded":true,"dist":{"shasum":"c49c5fe8d23db39a4418f5c6502d4f2a8bbc7e06","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.1.tgz"}},"0.0.2":{"name":"beantest","version":"0.0.2","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":"1.0.9","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmJsonOpts":{"file":"/Users/1000memories/.npm/beantest/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beantest@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.6-pre","_defaultsLoaded":true,"dist":{"shasum":"aa76b8d530a17b5def3f285cf0822952f6a64fbd","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.2.tgz"}},"0.0.3":{"name":"beantest","version":"0.0.3","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":"1.0.9","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmJsonOpts":{"file":"/Users/1000memories/.npm/beantest/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beantest@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.6-pre","_defaultsLoaded":true,"dist":{"shasum":"66f5b6576564908c60c38963c3f7d9764ed80d4b","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.3.tgz"}},"0.0.4":{"name":"beantest","version":"0.0.4","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":"1.0.9","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmUser":{"name":"davidpeter","email":"david.a.peter@gmail.com"},"_id":"beantest@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.6-pre","_defaultsLoaded":true,"dist":{"shasum":"f3f130ac0f4e7cd1b6b7fb50d8a6f53b134149d0","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.4.tgz"}},"0.0.5":{"name":"beantest","version":"0.0.5","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":">=1.0.11","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmUser":{"name":"davidpeter","email":"david.a.peter@gmail.com"},"_id":"beantest@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"66a89212e5b3b35243016b00fec88bd91ab23d9d","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.5.tgz"}},"0.0.6":{"name":"beantest","version":"0.0.6","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":">=1.0.11","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmUser":{"name":"davidpeter","email":"david.a.peter@gmail.com"},"_id":"beantest@0.0.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cc970d12a1ab71856a30cd9a086aed95d2a0833e","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.6.tgz"}},"0.0.7":{"name":"beantest","version":"0.0.7","description":"Beantest: autotest jasmine-node tests","bugs":{"name":"https://github.com/sarenji/beantest/issues"},"keywords":["autotest","testing","jasmine","node"],"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"licenses":[{"type":"MIT","url":"https://github.com/sarenji/beantest/raw/master/LICENSE"}],"repositories":[{"type":"git","url":"git://github.com/sarenji/beantest.git"}],"engines":{"node":">=0.4.0"},"dependencies":{"coffee-script":">=1.1.2","jasmine-node":">=1.0.11","growl":">=1.1.0","notify-send":">=0.1.2"},"scripts":{"postinstall":"coffee -b -c lib/*.coffee"},"bin":{"beantest":"bin/beantest"},"main":"./lib/beantest","_npmUser":{"name":"davidpeter","email":"david.a.peter@gmail.com"},"_id":"beantest@0.0.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5a13fb59f5fdd5e3107e2b08a4018961b74bb68c","tarball":"http://registry.npmjs.org/beantest/-/beantest-0.0.7.tgz"}}},"maintainers":[{"name":"davidpeter","email":"david.a.peter@gmail.com"}],"time":{"modified":"2011-11-16T07:58:56.407Z","created":"2011-09-21T07:49:36.996Z","0.0.1":"2011-09-21T07:49:38.436Z","0.0.2":"2011-09-22T04:46:55.704Z","0.0.3":"2011-09-22T05:01:29.075Z","0.0.4":"2011-11-01T03:16:13.486Z","0.0.5":"2011-11-07T00:54:10.579Z","0.0.6":"2011-11-16T07:44:37.464Z","0.0.7":"2011-11-16T07:58:56.407Z"},"_attachments":{"beantest-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Zrs06HSAnkMnw4y8+ZVDcA==","length":10240,"stub":true},"beantest-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-twb7JX6G+FFHGxEEgZbcUQ==","length":10240,"stub":true},"beantest-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-8Ouuudfb2kc/m1bllMT8Lg==","length":10240,"stub":true},"beantest-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-J+QAw2/96zB5nCpG2x+Eyw==","length":10240,"stub":true},"beantest-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oJUV8kT3mj0+85aDVJlcXg==","length":3381,"stub":true},"beantest-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JL/K8gG4avkv9ip1RX8WIg==","length":3287,"stub":true},"beantest-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-15TRngr8n4DE/kc4t+g1Yw==","length":3071,"stub":true}}}},
{"id":"beard","key":"beard","value":{"rev":"9-64b09c1f10937c0f01a2e84de87441c3"},"doc":{"_id":"beard","_rev":"9-64b09c1f10937c0f01a2e84de87441c3","name":"beard","description":"More than a mustache.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"beard","version":"0.0.1","description":"More than a mustache.","keywords":["template engine","node","browser"],"repository":{"type":"git","url":"git://github.com/shanebo/beard.git"},"author":{"name":"Shane Thacker","email":"shane@steadymade.com"},"engine":"node >= 0.4.1","main":"./lib/beard","_npmUser":{"name":"shanebo","email":"shane@steadymade.com"},"_id":"beard@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3a0d8521d24c87f0de1774a415fc8218cb5860ee","tarball":"http://registry.npmjs.org/beard/-/beard-0.0.1.tgz"},"maintainers":[{"name":"shanebo","email":"shane@steadymade.com"}],"directories":{}},"0.0.2":{"name":"beard","version":"0.0.2","description":"More than a mustache.","keywords":["template engine","node","browser"],"repository":{"type":"git","url":"git://github.com/shanebo/beard.git"},"author":{"name":"Shane Thacker","email":"shane@steadymade.com"},"engine":">= 0.4.1","main":"./lib/beard","readme":"Beard\n===================\n\nMore than a mustache.\n\nReleased under a [MIT license](http://en.wikipedia.org/wiki/MIT_License).\n\nFeatures\n--------\n\n* Clean syntax\n\nUsage\n-----\n\n### Syntax ###\n\n\tBeard.render(template, view);\n\n### Arguments ###\n\n**template** - (string) A string to be parsed and populated by the view object.\n\n**view** - (object) An object of data and/or methods which will populate the template string.\n\n### Example ###\n\n\tvar Beard = require('beard');\n\n\tvar view = {\n\t\tnoun: \"Beards\",\n\t\tmakeUpperCase: function(str){\n\t\t\treturn str.toUpperCase();\n\t\t}\n\t};\n\n\tvar html = Beard.render('{noun} are {makeUpperCase('awesome')}!', view);\n\n\nMore docs later...\n\n\n### Thanks to ###\n\n* keeto (Mark Obcena) for the parser/compiler\n* shinetech (Danny Brain) for syntax ideas","_id":"beard@0.0.2","dist":{"shasum":"cd00236edfc8fafb671846b91319ab8971e521c3","tarball":"http://registry.npmjs.org/beard/-/beard-0.0.2.tgz"},"maintainers":[{"name":"shanebo","email":"shane@steadymade.com"}]}},"readme":null,"maintainers":[{"name":"shanebo","email":"shane@steadymade.com"}],"time":{"modified":"2012-08-09T21:59:42.558Z","created":"2012-01-11T10:15:42.123Z","0.0.1":"2012-01-11T10:15:42.862Z","0.0.2":"2012-08-09T21:59:42.558Z"},"author":{"name":"Shane Thacker","email":"shane@steadymade.com"},"repository":{"type":"git","url":"git://github.com/shanebo/beard.git"},"_attachments":{"beard-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-12k1J2RUFtDr0+QNqzrt3w==","length":2522,"stub":true},"beard-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uRmHq01FHPkT/Z9XHzscOw==","length":2042,"stub":true}}}},
{"id":"beardcomb","key":"beardcomb","value":{"rev":"13-065f1b06e255f61067246a9b878f2393"},"doc":{"_id":"beardcomb","_rev":"13-065f1b06e255f61067246a9b878f2393","name":"beardcomb","description":"Hogan.js adaptor for Express","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"author":{"name":"Stephane P. Pericat","email":"contact@pericat.net","url":"http://spperic.at"},"name":"beardcomb","description":"Hogan.js adaptor for Express","version":"0.1.0","repository":{"type":"git","url":"git://github.com/stephanepericat/beardcomb.git"},"main":"./lib/beardcomb","engines":{"node":">= v0.4.x"},"dependencies":{"hogan.js":"1.0.x"},"devDependencies":{},"_npmUser":{"name":"sppericat","email":"contact@pericat.net"},"_id":"beardcomb@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b578676169b8ac3164bcb5d23fe47b92c9db29c9","tarball":"http://registry.npmjs.org/beardcomb/-/beardcomb-0.1.0.tgz"},"maintainers":[{"name":"sppericat","email":"contact@pericat.net"}],"directories":{}},"0.1.1":{"author":{"name":"Stephane P. Pericat","email":"contact@pericat.net","url":"http://spperic.at"},"name":"beardcomb","description":"Hogan.js adaptor for Express","version":"0.1.1","repository":{"type":"git","url":"git://github.com/stephanepericat/beardcomb.git"},"main":"./lib/beardcomb","engines":{"node":">= v0.4.x"},"dependencies":{"hogan.js":"1.0.x"},"devDependencies":{},"_npmUser":{"name":"sppericat","email":"contact@pericat.net"},"_id":"beardcomb@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"bd5aecc298333c2d53e41f37e243a8791bb4f158","tarball":"http://registry.npmjs.org/beardcomb/-/beardcomb-0.1.1.tgz"},"maintainers":[{"name":"sppericat","email":"contact@pericat.net"}],"directories":{}},"0.2.1":{"author":{"name":"Stephane P. Pericat","email":"contact@pericat.net"},"name":"beardcomb","description":"Hogan.js adaptor for Express","version":"0.2.1","repository":{"type":"git","url":"git://github.com/stephanepericat/beardcomb.git"},"main":"./lib/beardcomb","engines":{"node":">= v0.4.x"},"dependencies":{"hogan.js":"1.0.x","file":"0.2.x"},"devDependencies":{},"_npmUser":{"name":"sppericat","email":"contact@pericat.net"},"_id":"beardcomb@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0ec4263094d1a1c1ebe2067d4ed4a473d73c02a0","tarball":"http://registry.npmjs.org/beardcomb/-/beardcomb-0.2.1.tgz"},"maintainers":[{"name":"sppericat","email":"contact@pericat.net"}]},"0.2.2":{"author":{"name":"Stephane P. Pericat","email":"contact@pericat.net"},"name":"beardcomb","description":"Hogan.js adaptor for Express","version":"0.2.2","repository":{"type":"git","url":"git://github.com/stephanepericat/beardcomb.git"},"main":"./lib/beardcomb","engines":{"node":">= v0.4.x"},"dependencies":{"hogan.js":"1.0.x","file":"0.2.x"},"devDependencies":{},"_npmUser":{"name":"sppericat","email":"contact@pericat.net"},"_id":"beardcomb@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"08749ad23e864c3dc9c8fce9973483d2bc6fac47","tarball":"http://registry.npmjs.org/beardcomb/-/beardcomb-0.2.2.tgz"},"maintainers":[{"name":"sppericat","email":"contact@pericat.net"}]}},"readme":"#Beardcomb v0.1.0#\n\nHogan.js adaptor for Express.\n\n##License##\n\nThe MIT License (MIT)\nCopyright (c) 2012 Stephane P. Pericat\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n##Installation##\n\n    git clone git://github.com/stephanepericat/beardcomb.git\n    cd beardcomb/\n    npm install\n    \n##How to use##\n\n    var express = require('express'),\n        app = express.createServer(),\n        beardcomb = require('beardcomb');\n    \n    //express config\n    app.set('view engine', 'html')\n    app.set(\"views\", __dirname + '/views');\n    app.register(\".html\", beardcomb);\n    app.use(express.static(__dirname + '/public'));\n\n    app.get('/', function(req, res) {\n        res.render('index', {\n            locals: {\n                title: 'Beardcomb'\n            },\n            partials: {\n                footer: '<p align=\"center\">Powered by {{title}}</p>'\n            }\n        });    \n    });\n\n    app.listen(8080);\n\n##Features##\n\n- layout enabled: create a file called 'layout.html' and add the tag {{{contents}}}, it will parse the view contents into it\n- partials can be passed either as html code as seen above, or as a template file (in the views folder)\n\n##Demo##\n\n    node demo/app.js\n","maintainers":[{"name":"sppericat","email":"contact@pericat.net"}],"time":{"modified":"2012-03-22T08:26:43.267Z","created":"2012-02-20T09:16:52.987Z","0.1.0":"2012-02-20T09:16:54.705Z","0.1.1":"2012-02-22T15:27:34.518Z","0.2.0":"2012-03-14T11:22:06.437Z","0.2.1":"2012-03-14T11:29:01.067Z","0.2.2":"2012-03-22T08:26:43.267Z"},"author":{"name":"Stephane P. Pericat","email":"contact@pericat.net"},"repository":{"type":"git","url":"git://github.com/stephanepericat/beardcomb.git"},"_attachments":{"beardcomb-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-ESrB2+Ir6la/hgtNHuma9g==","length":3204,"stub":true},"beardcomb-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MPzAQIL9+LH1diq1XMy5TQ==","length":3037,"stub":true},"beardcomb-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-x+G9cLqS/qq1THFNWJ96jw==","length":2763,"stub":true},"beardcomb-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LcTaHitilPBIHUrlaFfPpQ==","length":2677,"stub":true}}}},
{"id":"beare","key":"beare","value":{"rev":"5-1f7cca35df0c7c243d1075146bf854e2"},"doc":{"_id":"beare","_rev":"5-1f7cca35df0c7c243d1075146bf854e2","name":"beare","description":"Cross-platform helper for node.js projects.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"name":"beare","description":"Cross-platform helper for node.js projects.","version":"0.1.0","homepage":"https://github.com/paulmillr/beare","repository":{"type":"git","url":"git://github.com/paulmillr/beare.git"},"main":"./lib/index.js","dependencies":{"coffee-script":"1.3.1","glob":"3.1.9","mkdirp":"0.3.1"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"0.6 || 0.7 || 0.8"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"beare@0.1.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"6b1c0e96a687b8764b9bce59edb85ce2fbe90c83","tarball":"http://registry.npmjs.org/beare/-/beare-0.1.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]},"0.1.1":{"author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"name":"beare","description":"Cross-platform helper for node.js projects.","version":"0.1.1","homepage":"https://github.com/paulmillr/beare","repository":{"type":"git","url":"git://github.com/paulmillr/beare.git"},"main":"./lib/index.js","dependencies":{"coffee-script":"1.3.1","glob":"3.1.9","mkdirp":"0.3.1"},"devDependencies":{},"optionalDependencies":{},"bundleDependencies":["coffee-script","glob","mkdirp"],"engines":{"node":"0.6 || 0.7 || 0.8"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"beare@0.1.1","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7dca730bc44883ab8f80205317119fc1fc7646a8","tarball":"http://registry.npmjs.org/beare/-/beare-0.1.1.tgz"},"maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}]}},"readme":"# Beare\nBeare is a cross-platform helper for node.js projects.\n\nBeare is useful if you write projects in CoffeeScript and don't want do store compiled files in repo, because it greatly pollutes it. Beare will compile your `src` coffeescript files to `lib` even on windows which is impossible with plain `package.json`.\n\n## Getting started\nInstall chokidar via node.js package manager / add it to `package.json`:\n\n    npm install beare\n\n* Create `beare.js` file in project root with content\n`require('beare').parseArgs();`.\n* Add code to your package.json.\n\n```json\n  \"scripts\": {\n    \"postinstall\": \"node beare.js compileCoffeeScripts\"\n    \"test\": \"node beare.js testWithMocha\"\n  }\n```\n\n## API\n* `compileCoffeeScripts([source = 'src', destination = 'lib'])`\n* `testWithMocha()`\n* `parseArgs()`\n\n## License\nThe MIT license.\n\nCopyright (c) Paul Miller (http://paulmillr.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-04-26T01:22:41.788Z","created":"2012-04-26T00:42:41.775Z","0.1.0":"2012-04-26T00:42:44.808Z","0.1.1":"2012-04-26T01:22:41.788Z"},"author":{"name":"Paul Miller","url":"http://paulmillr.com/"},"repository":{"type":"git","url":"git://github.com/paulmillr/beare.git"},"_attachments":{"beare-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VkTKfZyJjWoddn2MhTC2rA==","length":105278,"stub":true},"beare-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nFEuFORwd0PmL8JkdDHbrw==","length":2328,"stub":true}}}},
{"id":"beatit","key":"beatit","value":{"rev":"7-c0ba5f95b0601dcb628e4820555cc252"},"doc":{"_id":"beatit","_rev":"7-c0ba5f95b0601dcb628e4820555cc252","name":"beatit","description":"Simple agent that can stay hooked on a log file (even if while log rotated and send each line to a remote Syslog Server","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"beatit","version":"0.2.0","author":{"name":"Paolo Freuli - https://github.com/wuatanabe"},"email":"paolo.freuli@gmail.com","description":"Simple agent that can stay hooked on a log file (even if while log rotated and send each line to a remote Syslog Server","repositories":[{"type":"git","url":"http://github.com/wuatanabe/beatit.git"}],"dependencies":{"inotify":">= 0.1.6","inotify-plusplus":">= 1.0.0","supervisor":">= 0.1.3"},"main":"./beatit.js","devDependencies":{},"_id":"beatit@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"59bcc92eade4fb6a6f7520f7092afa038f7e0d22","tarball":"http://registry.npmjs.org/beatit/-/beatit-0.2.0.tgz"},"scripts":{},"directories":{}}},"maintainers":[{"name":"wuatanabe","email":"paolo.freuli@gmail.com"}],"time":{"modified":"2011-05-22T19:48:21.886Z","created":"2011-05-22T19:35:47.907Z","0.22222222222222222222222.0":"2011-05-22T19:43:44.948Z","0.2.0":"2011-05-22T19:45:07.659Z"},"author":{"name":"Paolo Freuli - https://github.com/wuatanabe"},"_attachments":{"beatit-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-N/8XWJMEUKeVlOhVMCxFtw==","length":2439,"stub":true}}}},
{"id":"beatport","key":"beatport","value":{"rev":"5-3b186b633ceea7f047e1df91e7b683a5"},"doc":{"_id":"beatport","_rev":"5-3b186b633ceea7f047e1df91e7b683a5","name":"beatport","description":"Beatport API client for Node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"beatport","description":"Beatport API client for Node.js","version":"0.0.1","homepage":"https://github.com/stagas/node-beatport","author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com/"},"repository":{"type":"git","url":"git://github.com/stagas/node-beatport.git"},"dependencies":{"superagent":">=0.0.1"},"main":"./beatport","engines":{"node":">=0.4.7"},"_id":"beatport@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3ffe56c539dd3ed4036b6de34bbbdc9e46388a5e","tarball":"http://registry.npmjs.org/beatport/-/beatport-0.0.1.tgz"}},"0.0.2":{"name":"beatport","description":"Beatport API client for Node.js","version":"0.0.2","homepage":"https://github.com/stagas/node-beatport","author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com/"},"repository":{"type":"git","url":"git://github.com/stagas/node-beatport.git"},"dependencies":{"superagent":">=0.0.1"},"main":"./beatport","engines":{"node":">=0.4.7"},"_id":"beatport@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fb8d114d876db0f04cec1809e7e665102798455b","tarball":"http://registry.npmjs.org/beatport/-/beatport-0.0.2.tgz"}}},"maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}],"time":{"modified":"2011-06-09T16:45:43.696Z","created":"2011-06-08T08:27:19.226Z","0.0.1":"2011-06-08T08:27:19.935Z","0.0.2":"2011-06-09T16:45:43.696Z"},"author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com/"},"repository":{"type":"git","url":"git://github.com/stagas/node-beatport.git"},"_attachments":{"beatport-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DBLZjZ+8o/NNscKODkcusA==","length":42300,"stub":true},"beatport-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JcrQ6JeiQTboT4AMlZ94Ww==","length":41336,"stub":true}}}},
{"id":"beautifier","key":"beautifier","value":{"rev":"9-cc0046ed58695a6fb82bc933b90ebdb7"},"doc":{"_id":"beautifier","_rev":"9-cc0046ed58695a6fb82bc933b90ebdb7","name":"beautifier","description":"The JavaScript, html, and css beautifier","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.2":{"name":"beautifier","description":"The JavaScript, html, and css beautifier","homepage":"https://github.com/einars/js-beautify","keywords":["beautify"],"version":"0.1.2","author":{"name":"Rickey Visinski"},"contributors":[{"name":"Einar Lielmanis","email":"einar@jsbeautifier.org"},{"name":"Nochum Sossonko","email":"nsossonko@hotmail.com"},{"name":"Harutyun Amirjanyan","email":"amirjanyan@gmail.com"},{"name":"Anders Conbere","email":"aconbere@gmail.com"}],"bin":{"beautifier":"./bin/beautifier.js"},"main":"./lib/beautify.js","dependencies":{"nopt":"~1.0.0"},"engines":{"node":">=0.4.12"},"directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/rickeyski/node-beautifier.git"},"bugs":{"url":"https://github.com/rickeyski/node-beautifier/issues"},"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/rickeyski/node-beautifier/blob/master/LICENSE"}],"_npmUser":{"name":"rickeyski","email":"rickeyvisinski@gmail.com"},"_id":"beautifier@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"cf66ab9d3d074f4e365f1f549568aabe1bd6231d","tarball":"http://registry.npmjs.org/beautifier/-/beautifier-0.1.2.tgz"},"maintainers":[{"name":"rickeyski","email":"rickeyvisinski@gmail.com"}]},"0.1.3":{"name":"beautifier","description":"The JavaScript, html, and css beautifier","homepage":"https://github.com/einars/js-beautify","keywords":["beautify"],"version":"0.1.3","author":{"name":"Rickey Visinski"},"contributors":[{"name":"Einar Lielmanis","email":"einar@jsbeautifier.org"},{"name":"Nochum Sossonko","email":"nsossonko@hotmail.com"},{"name":"Harutyun Amirjanyan","email":"amirjanyan@gmail.com"},{"name":"Anders Conbere","email":"aconbere@gmail.com"}],"bin":{"beautifier":"./bin/beautifier.js"},"main":"./lib/beautify.js","dependencies":{"nopt":"~1.0.0"},"engines":{"node":">=0.4.12"},"directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/rickeyski/node-beautifier.git"},"bugs":{"url":"https://github.com/rickeyski/node-beautifier/issues"},"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/rickeyski/node-beautifier/blob/master/LICENSE"}],"_npmUser":{"name":"rickeyski","email":"rickeyvisinski@gmail.com"},"_id":"beautifier@0.1.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"339233853b629efc3e8b08f1b80f42fe0be4684a","tarball":"http://registry.npmjs.org/beautifier/-/beautifier-0.1.3.tgz"},"maintainers":[{"name":"rickeyski","email":"rickeyvisinski@gmail.com"}]},"0.1.4":{"name":"beautifier","description":"The JavaScript, html, and css beautifier","homepage":"https://github.com/einars/js-beautify","keywords":["beautify"],"version":"0.1.4","author":{"name":"Rickey Visinski"},"contributors":[{"name":"Einar Lielmanis","email":"einar@jsbeautifier.org"},{"name":"Nochum Sossonko","email":"nsossonko@hotmail.com"},{"name":"Harutyun Amirjanyan","email":"amirjanyan@gmail.com"},{"name":"Anders Conbere","email":"aconbere@gmail.com"}],"bin":{"beautifier":"./bin/beautifier.js"},"main":"./lib/beautify.js","dependencies":{"nopt":"~1.0.0"},"engines":{"node":">=0.4.12"},"directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/rickeyski/node-beautifier.git"},"bugs":{"url":"https://github.com/rickeyski/node-beautifier/issues"},"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/rickeyski/node-beautifier/blob/master/LICENSE"}],"_npmUser":{"name":"rickeyski","email":"rickeyvisinski@gmail.com"},"_id":"beautifier@0.1.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6b3cf10f769522b8042ffbfd6322006fc6a50617","tarball":"http://registry.npmjs.org/beautifier/-/beautifier-0.1.4.tgz"},"maintainers":[{"name":"rickeyski","email":"rickeyvisinski@gmail.com"}]},"0.1.5":{"name":"beautifier","description":"The JavaScript, html, and css beautifier","homepage":"https://github.com/einars/js-beautify","keywords":["beautify"],"version":"0.1.5","author":{"name":"Rickey Visinski"},"contributors":[{"name":"Einar Lielmanis","email":"einar@jsbeautifier.org"},{"name":"Nochum Sossonko","email":"nsossonko@hotmail.com"},{"name":"Harutyun Amirjanyan","email":"amirjanyan@gmail.com"},{"name":"Anders Conbere","email":"aconbere@gmail.com"}],"bin":{"beautifier":"./bin/beautifier.js"},"main":"./lib/beautify.js","dependencies":{"nopt":"~1.0.0"},"engines":{"node":">=0.4.12"},"directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/rickeyski/node-beautifier.git"},"bugs":{"url":"https://github.com/rickeyski/node-beautifier/issues"},"licenses":[{"type":"Modified MIT / BSD","url":"https://github.com/rickeyski/node-beautifier/blob/master/LICENSE"}],"readme":"# node-beautifier\n\nThis is a nodejs module built upon Einars js-beautifier.\nIt also incorporates the css and html beautifier based upon file extension.\nEasily use [js-beautify][https://github.com/einars/js-beautify] from the command line.\n\n    beautifier app.js style.css index.html\n\n## Install\n\n    npm install beautifier\n\n## License\n\nSee LICENSE file.\n\n[js-beautify]: http://jsbeautifier.org/\n","_id":"beautifier@0.1.5","dist":{"shasum":"5c5918394c25d72c10612046c959fa6bd3c75cf9","tarball":"http://registry.npmjs.org/beautifier/-/beautifier-0.1.5.tgz"},"maintainers":[{"name":"rickeyski","email":"rickeyvisinski@gmail.com"}]}},"readme":"# node-beautifier\n\nThis is a nodejs module built upon Einars js-beautifier.\nIt also incorporates the css and html beautifier based upon file extension.\nEasily use [js-beautify][https://github.com/einars/js-beautify] from the command line.\n\n    beautifier app.js style.css index.html\n\n## Install\n\n    npm install beautifier\n\n## License\n\nSee LICENSE file.\n\n[js-beautify]: http://jsbeautifier.org/\n","maintainers":[{"name":"rickeyski","email":"rickeyvisinski@gmail.com"}],"time":{"modified":"2012-07-13T04:27:25.884Z","created":"2012-05-01T22:02:33.368Z","0.1.2":"2012-05-01T22:02:34.040Z","0.1.3":"2012-05-17T04:34:44.595Z","0.1.4":"2012-07-03T02:23:32.760Z","0.1.5":"2012-07-13T04:27:25.884Z"},"author":{"name":"Rickey Visinski"},"repository":{"type":"git","url":"git://github.com/rickeyski/node-beautifier.git"},"_attachments":{"beautifier-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-mFt7BxafpnubvpDxyWxa5w==","length":8441,"stub":true},"beautifier-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-aaW5LRrNNqNsTvSLwzDhFA==","length":8379,"stub":true},"beautifier-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WQ4m7NMhM36k/xiuCtQWkw==","length":8181,"stub":true},"beautifier-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OiM0ONH568BLfgI7Gk3VRA==","length":8167,"stub":true}}}},
{"id":"beautiful-docs","key":"beautiful-docs","value":{"rev":"7-ee185372b881c9a91ab6d9e98336bec3"},"doc":{"_id":"beautiful-docs","_rev":"7-ee185372b881c9a91ab6d9e98336bec3","name":"beautiful-docs","description":"A documentation viewer based on markdown files","dist-tags":{"latest":"0.6.1"},"versions":{"0.5.0":{"name":"beautiful-docs","version":"0.5.0","author":{"name":"Maxime Bouroumeau-Fuseau","url":"http://maximebf.com"},"keywords":["docs markdown"],"description":"A documentation viewer based on markdown files","licenses":[{"type":"MIT","url":"http://github.com/maximebf/beautiful-docs/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maximebf/beautiful-docs.git"},"dependencies":{"coffee-script":">=1.2.0","eco":">=1.0.0","express":">=2.5.6","less":">=1.2.0","marked":">=0.1.6","underscore":">=1.3.1","async":">=0.1.15"},"main":"./index","bin":{"bfdocs":"./bin/bfdocs"},"_npmUser":{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"},"_id":"beautiful-docs@0.5.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fa1b8b11a84750154708a846557050fd33147bcf","tarball":"http://registry.npmjs.org/beautiful-docs/-/beautiful-docs-0.5.0.tgz"},"maintainers":[{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"}]},"0.6.0":{"name":"beautiful-docs","version":"0.6.0","author":{"name":"Maxime Bouroumeau-Fuseau","url":"http://maximebf.com"},"keywords":["docs markdown"],"description":"A documentation viewer based on markdown files","licenses":[{"type":"MIT","url":"http://github.com/maximebf/beautiful-docs/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maximebf/beautiful-docs.git"},"dependencies":{"coffee-script":">=1.2.0","eco":">=1.0.0","express":">=2.5.6","less":">=1.2.0","marked":">=0.1.6","underscore":">=1.3.1","async":">=0.1.15"},"main":"./index","bin":{"bfdocs":"./bin/bfdocs"},"_npmUser":{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"},"_id":"beautiful-docs@0.6.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"58ffa35b634fba04701e41681980bceddaad4447","tarball":"http://registry.npmjs.org/beautiful-docs/-/beautiful-docs-0.6.0.tgz"},"maintainers":[{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"}]},"0.6.1":{"name":"beautiful-docs","version":"0.6.1","author":{"name":"Maxime Bouroumeau-Fuseau","url":"http://maximebf.com"},"keywords":["docs markdown"],"description":"A documentation viewer based on markdown files","licenses":[{"type":"MIT","url":"http://github.com/maximebf/beautiful-docs/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/maximebf/beautiful-docs.git"},"dependencies":{"coffee-script":">=1.2.0","eco":">=1.0.0","express":">=2.5.6","less":">=1.2.0","marked":">=0.1.6","underscore":">=1.3.1","async":">=0.1.15"},"main":"./index","bin":{"bfdocs":"./bin/bfdocs"},"_npmUser":{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"},"_id":"beautiful-docs@0.6.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"557c81c822fd8da8319188a07c6bc94aa67a2d1b","tarball":"http://registry.npmjs.org/beautiful-docs/-/beautiful-docs-0.6.1.tgz"},"maintainers":[{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"}]}},"readme":"# Beautiful docs\n\nBeautiful docs is a documentation viewer based on markdown files.  \nDocumentation manuals can be described in a manifest file using JSON.\n\nFeatures:\n\n - [Markdown syntax](http://daringfireball.net/projects/markdown/syntax) (with support for [Github Flavored Markdown](http://github.github.com/github-flavored-markdown/))\n - Uses files (store them anywhere, in git for example)\n - Automatically generate the table of content\n - Clean and simple to use interface\n - Stylesheet for printing\n - Supports [embedly](http://embed.ly/)\n - Easy to customize (eg.: for organizations)\n - Support for multiple manifests with an index page\n\nCheckout [beautifuldocs.com](http://beautifuldocs.com) for an example or [github](https://github.com/maximebf/beautiful-docs) for the sources.  \nYou can find a screenshot of the generated doc [here](https://github.com/maximebf/beautiful-docs/raw/master/docs/screenshot.png).\n\nRequires a recent build of nodejs (tested on 0.6.7).  \nInstall using npm:\n\n    npm install beautiful-docs\n\n## Manifests\n\nManifests are not mandatory but they allow to specify custom options for your documentation.  \nA manifest file contains a JSON object with the following properties:\n\n - *title*: Title of the manual (optional, default \"Documentation\")\n - *files*: An array of files\n - *home*: The file to display as the manual homepage (won't be used when computing the TOC)\n - *category*: Category of the manual (used on the homepage) (optional, default none)\n - *css*: An absolute URL to a CSS stylesheet that will be included in the page\n - *codeHighlightTheme*: The highlightjs theme for code highlighting (http://softwaremaniacs.org/soft/highlight/en/)\n - *embedly*: Activate embedly with the specified api key. Links to embed must be placed alone in a paragraph.\n\nFiles can be absolute URIs or relative to the manifest file.  \nExample:\n\n    {\n        \"title\": \"Beautiful Docs\",\n        \"files\": [\"README.md\"]\n    }\n\n## Usage\n\n    bfdocs [options] [/path/to/manifest.json] [/path/to/output/dir]\n\nAvailable options:\n\n - *--help* : Display the help information\n - *--server* : Create an HTTP server to access the generated documentation\n - *--port* : The port on which the HTTP server shoud listen\n - *--watch* : Watch files for modifications and reload them automatically\n - *--manifests-only* : Do not treat the last argument as the output dir but also as a manifest\n - *--title* : Title of the index page\n - *--base-url* : Base url of all links\n - *--index-only* : Only generate the index file. The last argument should be the filename of the index\n - *--version* : Display the installed version of beautiful-docs\n\nDefault output dir is *./out*.  \nYou can specify the path to a directory containing markdown files (\\*.md) instead of a manifest file.\n\n## Mutliple manifests\n\nBeautiful docs can handle multiple manifests at once and generate and index file to\neasily access each of them.\n\n    bfdocs [options] [--manifests-only] /path/to/first/manifest.json /path/to/second/manifest.json /path/to/third/manifest.json [/path/to/output/dir]\n\nIf you have more than one manifest and you don't want to specify the output dir, you must use the *--manifests-only* option.\n\nWhen multiple manifests are specified, each generated ones will be located in its own subfolder.\n\nYou can also generate the index file on its own using *--index-only*:\n\n    bfdocs --index-only /path/to/manifest.json /path/to/manifest.json index.html\n\n## Styling\n\nYou can use the following css classes to style your documentation (suround a block with a div tag):\n\n - *note*: grey box\n - *warning*: orange box\n - *tip*: green box\n\nTables will be automatically formated.\n","maintainers":[{"name":"maximebf","email":"maxime.bouroumeau@gmail.com"}],"time":{"modified":"2012-02-08T14:19:27.677Z","created":"2012-01-30T22:36:48.582Z","0.5.0":"2012-01-30T22:36:50.748Z","0.6.0":"2012-02-07T13:12:01.546Z","0.6.1":"2012-02-08T14:19:27.677Z"},"author":{"name":"Maxime Bouroumeau-Fuseau","url":"http://maximebf.com"},"repository":{"type":"git","url":"git://github.com/maximebf/beautiful-docs.git"},"_attachments":{"beautiful-docs-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-No0grlcJMHmdj861Ugu+qw==","length":103781,"stub":true},"beautiful-docs-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ccJgveikh4uEVWsbiiHeUQ==","length":103764,"stub":true},"beautiful-docs-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mVQuvanQVEx6+kYhoZRB4A==","length":94577,"stub":true}}}},
{"id":"beautifyjs","key":"beautifyjs","value":{"rev":"3-89ce050152aca0727c099060229ddc73"},"doc":{"_id":"beautifyjs","_rev":"3-89ce050152aca0727c099060229ddc73","name":"beautifyjs","description":"Beautifier for javascript","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"einars"},"name":"beautifyjs","description":"Beautifier for javascript","version":"0.1.0","homepage":"http://jsbeautifier.org/","repository":{"type":"git","url":"git://github.com/einars/js-beautify.git"},"main":"./beautify","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/clark/.npm/beautifyjs/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beautifyjs@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"40fdd9bd2e7ed4dedc90886e2986e0ddcdb6bdce","tarball":"http://registry.npmjs.org/beautifyjs/-/beautifyjs-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"clarkf","email":"clark.fischer@gmail.com"}]}},"maintainers":[{"name":"clarkf","email":"clark.fischer@gmail.com"}],"time":{"modified":"2011-09-13T23:04:47.824Z","created":"2011-09-13T23:04:45.862Z","0.1.0":"2011-09-13T23:04:47.824Z"},"author":{"name":"einars"},"repository":{"type":"git","url":"git://github.com/einars/js-beautify.git"},"_attachments":{"beautifyjs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zkKcBhLsxDV1jykooSndBA==","length":8285,"stub":true}}}},
{"id":"beauty-queen","key":"beauty-queen","value":{"rev":"3-efb2d0b6c0aa0464d790f4c1c2a6b62a"},"doc":{"_id":"beauty-queen","_rev":"3-efb2d0b6c0aa0464d790f4c1c2a6b62a","name":"beauty-queen","description":"A cli tool for beautifying your codes","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"name":"beauty-queen","description":"A cli tool for beautifying your codes","version":"0.0.1","homepage":"http://github.com/addisonj/beauty-queen","repository":{"type":"git","url":"git://github.com/addisonj/beauty-queen.git"},"main":"index.js","engines":{"node":"0.6.x"},"bin":{"beauty-queen":"./bin/beauty-queen"},"dependencies":{"beautifyjs":"0.1.0","commander":"0.6.0","underscore":"1.3.3"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"addisonj","email":"addisonj@gmail.com"},"_id":"beauty-queen@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5bc1713ad9152729a513d9185915fc5aa9e574c5","tarball":"http://registry.npmjs.org/beauty-queen/-/beauty-queen-0.0.1.tgz"},"readme":"","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}]}},"readme":"","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}],"time":{"modified":"2012-06-14T19:09:33.728Z","created":"2012-06-14T19:09:32.597Z","0.0.1":"2012-06-14T19:09:33.728Z"},"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"repository":{"type":"git","url":"git://github.com/addisonj/beauty-queen.git"},"_attachments":{"beauty-queen-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hwVzOIGc6ANY2FXArBRofw==","length":1214,"stub":true}}}},
{"id":"beaver","key":"beaver","value":{"rev":"17-3b56116e8e40205e8efcedefee0319e3"},"doc":{"_id":"beaver","_rev":"17-3b56116e8e40205e8efcedefee0319e3","name":"beaver","description":"CLI tool for piping a log's tail over TCP","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"beaver","preferGlobal":"true","description":"CLI tool for piping logs anywhere via TCP","version":"0.0.1","author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"keywords":["cli","loggly","sysadmin","tools"],"dependencies":{"forever":"~> 0.6.3"},"bin":{"beaver":"./bin/beaver"},"main":"./lib/beaver","engines":{"node":">= 0.4.0"},"_id":"beaver@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e2a69de041658aa515ddd1539b4d120d8d6f901d","tarball":"http://registry.npmjs.org/beaver/-/beaver-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}],"directories":{}},"0.0.2":{"name":"beaver","preferGlobal":"true","description":"CLI tool for piping logs anywhere via TCP","version":"0.0.2","author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"keywords":["cli","loggly","sysadmin","tools"],"dependencies":{"forever":"~> 0.6.3"},"bin":{"beaver":"./bin/beaver"},"main":"./lib/beaver","engines":{"node":">= 0.4.0"},"_id":"beaver@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"0d04be60e75afcbe403b01d0859ae887b522e4cf","tarball":"http://registry.npmjs.org/beaver/-/beaver-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}],"directories":{}},"0.0.3":{"name":"beaver","preferGlobal":"true","description":"CLI tool for piping logs anywhere via TCP","version":"0.0.3","author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"keywords":["cli","loggly","sysadmin","tools"],"dependencies":{"forever":"~> 0.6.3"},"bin":{"beaver":"./bin/beaver"},"main":"./lib/beaver","engines":{"node":">= 0.4.0"},"_id":"beaver@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"94a34abeb49fc6ff755b75ad0544a4489531418a","tarball":"http://registry.npmjs.org/beaver/-/beaver-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}]},"0.0.4":{"name":"beaver","preferGlobal":"true","description":"CLI tool for piping a log's tail over TCP","version":"0.0.4","author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"keywords":["cli","loggly","sysadmin","tools","logging","tcp"],"bin":{"beaver":"./bin/beaver"},"engines":{"node":">= 0.4.0"},"_id":"beaver@0.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"03fdfb7811c2782246257586d5c37c0bec306fa5","tarball":"http://registry.npmjs.org/beaver/-/beaver-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}]},"0.0.5":{"name":"beaver","preferGlobal":"true","description":"CLI tool for piping a log's tail over TCP","version":"0.0.5","author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"keywords":["cli","loggly","sysadmin","tools","logging","tcp"],"bin":{"beaver":"./bin/beaver"},"engines":{"node":">= 0.4.0"},"_id":"beaver@0.0.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e98e79622b5014b55f17cbaad65808f5d27fd4d8","tarball":"http://registry.npmjs.org/beaver/-/beaver-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}]},"0.0.6":{"name":"beaver","preferGlobal":"true","description":"CLI tool for piping a log's tail over TCP","version":"0.0.6","author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"keywords":["cli","loggly","sysadmin","tools","logging","tcp"],"bin":{"beaver":"./bin/beaver"},"engines":{"node":">= 0.4.0"},"_id":"beaver@0.0.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"8dccc6de242f34b4abf9601a314c1a79431d135b","tarball":"http://registry.npmjs.org/beaver/-/beaver-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}]}},"maintainers":[{"name":"clifton","email":"clifton@orgsync.com"}],"time":{"modified":"2011-09-09T23:28:47.314Z","created":"2011-08-11T00:15:51.544Z","0.0.1":"2011-08-11T00:15:52.578Z","0.0.2":"2011-08-11T00:21:26.075Z","0.0.3":"2011-08-11T09:13:00.379Z","0.0.4":"2011-08-11T10:47:14.785Z","0.0.5":"2011-09-08T18:11:14.651Z","0.0.6":"2011-09-09T23:28:47.314Z"},"author":{"name":"Clifton King","email":"cliftonk@gmail.com"},"repository":{"type":"git","url":"git://github.com/clifton/beaver.git"},"_attachments":{"beaver-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-/cP2xV2HvQ+MxMYJpZCF1A==","length":2205,"stub":true},"beaver-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-SfDwDTasoth6s6oz2R0nmA==","length":2221,"stub":true},"beaver-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-xUKwlOEH+ztg7DSPE+KNFA==","length":2266,"stub":true},"beaver-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-qYQIsrx0YQ54Ub8ZJr6KfA==","length":1969,"stub":true},"beaver-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Z1oJw+k7NStVWWh9L53/MQ==","length":2037,"stub":true},"beaver-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-P3znAe2Ibs8WyNeuH6u1mA==","length":2031,"stub":true}}}},
{"id":"bebop","key":"bebop","value":{"rev":"11-62ef0cb4f7513a0b1bbf21b01a4ef589"},"doc":{"_id":"bebop","_rev":"11-62ef0cb4f7513a0b1bbf21b01a4ef589","name":"bebop","description":"A tool for rapidly building web sites","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"bebop","description":"A tool for rapidly building web sites","version":"0.1.0","homepage":"http://github.com/zeekay/bebop","keywords":["autocomplete","autocompletion","cli","command line","vim","websocket"],"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"http://github.com/zeekay"},"files":["bin/bebop-client","lib/bebop.js","README.md"],"directories":{"lib":"lib","bin":"bin"},"main":"lib/bebop","bin":{"bebop-client":"bin/bebop-client"},"bugs":{"email":"zeekayy@gmail.com","url":"http://github.com/zeekay/bebop/issues"},"repository":{"type":"git","url":"git://github.com/zeekay/bebop.git"},"dependencies":{"ws":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"preferGlobal":true,"_npmUser":{"name":"zeekay","email":"zeekay@gmail.com"},"_id":"bebop@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"ff2492c3928164179429753489de1d63cdfa2738","tarball":"http://registry.npmjs.org/bebop/-/bebop-0.1.0.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.2.0":{"name":"bebop","description":"A tool for rapidly building web sites","version":"0.2.0","homepage":"http://github.com/zeekay/bebop","keywords":["autocomplete","autocompletion","cli","command line","vim","websocket"],"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"http://github.com/zeekay"},"files":["bin/bebop-client","lib/bebop.js","README.md"],"directories":{"lib":"lib","bin":"bin"},"main":"lib/bebop","bin":{"bebop-client":"bin/bebop-client"},"bugs":{"email":"zeekayy@gmail.com","url":"http://github.com/zeekay/bebop/issues"},"repository":{"type":"git","url":"git://github.com/zeekay/bebop.git"},"dependencies":{"ws":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"preferGlobal":true,"_npmUser":{"name":"zeekay","email":"zeekay@gmail.com"},"_id":"bebop@0.2.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"4593d2e432d97b07a652d070d2351c553b2dd5c0","tarball":"http://registry.npmjs.org/bebop/-/bebop-0.2.0.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.2.2":{"name":"bebop","description":"A tool for rapidly building web sites","version":"0.2.2","homepage":"http://github.com/zeekay/bebop","keywords":["autocomplete","autocompletion","cli","command line","vim","websocket"],"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"http://github.com/zeekay"},"files":["bin/bebop-client","lib/bebop.js","README.md"],"directories":{"lib":"lib","bin":"bin"},"main":"lib/bebop","bin":{"bebop-client":"bin/bebop-client"},"bugs":{"email":"zeekayy@gmail.com","url":"http://github.com/zeekay/bebop/issues"},"repository":{"type":"git","url":"git://github.com/zeekay/bebop.git"},"dependencies":{"ws":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"preferGlobal":true,"_npmUser":{"name":"zeekay","email":"zeekay@gmail.com"},"_id":"bebop@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b73518afc776f4a472b53f5c2e2703fd3a9bace7","tarball":"http://registry.npmjs.org/bebop/-/bebop-0.2.2.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.3.0":{"name":"bebop","description":"A tool for rapidly building web sites","version":"0.3.0","homepage":"http://github.com/zeekay/bebop","keywords":["autocomplete","autocompletion","cli","command line","vim","websocket"],"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"http://github.com/zeekay"},"files":["bin/bebop-client","lib/bebop.js","README.md"],"directories":{"lib":"lib","bin":"bin"},"main":"lib/bebop","bin":{"bebop-client":"bin/bebop-client"},"bugs":{"email":"zeekayy@gmail.com","url":"http://github.com/zeekay/bebop/issues"},"repository":{"type":"git","url":"git://github.com/zeekay/bebop.git"},"dependencies":{"ws":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"preferGlobal":true,"_npmUser":{"name":"zeekay","email":"zeekay@gmail.com"},"_id":"bebop@0.3.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.7.6","_defaultsLoaded":true,"dist":{"shasum":"b5c94445c854409943c467026f11c9d81f2d6e04","tarball":"http://registry.npmjs.org/bebop/-/bebop-0.3.0.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.3.2":{"name":"bebop","description":"A tool for rapidly building web sites","version":"0.3.2","homepage":"http://github.com/zeekay/bebop","keywords":["autocomplete","autocompletion","cli","command line","vim","websocket"],"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"http://github.com/zeekay"},"files":["bin/bebop-client","lib/bebop.js","README.md"],"directories":{"lib":"lib","bin":"bin"},"main":"lib/bebop","bin":{"bebop-client":"bin/bebop-client"},"bugs":{"email":"zeekayy@gmail.com","url":"http://github.com/zeekay/bebop/issues"},"repository":{"type":"git","url":"git://github.com/zeekay/bebop.git"},"dependencies":{"ws":">= 0.4.11"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"preferGlobal":true,"_npmUser":{"name":"zeekay","email":"zeekay@gmail.com"},"_id":"bebop@0.3.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3ef20d77da3472917dbb4fa250a7cdf8540fdf44","tarball":"http://registry.npmjs.org/bebop/-/bebop-0.3.2.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]}},"readme":"Bebop\n=====\nA tool for rapid web development which serves as static file server, websocket server for client-side reloading/bi-directional communcation and file watcher.\n\nUsage\n-----\nCheck `bebop --help` for usage.\n\nInstallation\n------------\nTo take advantage of the client-side reloading you need a WebSocket enabled browser and a bit of javascript. You can use the provided Django middleware:\n\n    INSTALLED_APPS = (\n        ...,\n        'bebop',\n    )\n    MIDDLEWARE_CLASSES = (\n        ...,\n        'bebop.middleware.ReloaderMiddleware',\n    )\n\n...or simply link to [bebop.js](https://raw.github.com/zeekay/bebop/master/bebop/bebop.js) in your project:\n\n    <script src=\"https://raw.github.com/zeekay/bebop/master/bebop/bebop.js\" type=\"text/javascript\"></script>\n\nVim\n---\nIntegration with vim is provided by [vim-bebop](http://github.com/zeekay/vim-bebop). You can do all sorts of fancy stuff like evaluate JavaScript, CoffeeScript, get completions, etc.\n","maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}],"time":{"modified":"2012-04-18T09:55:11.387Z","created":"2012-03-26T08:01:03.015Z","0.1.0":"2012-03-26T08:01:04.147Z","0.2.0":"2012-03-26T10:35:48.193Z","0.2.2":"2012-03-27T10:16:15.173Z","0.3.0":"2012-04-01T11:00:20.231Z","0.3.2":"2012-04-18T09:55:11.387Z"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"http://github.com/zeekay"},"repository":{"type":"git","url":"git://github.com/zeekay/bebop.git"},"_attachments":{"bebop-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-kr13fS5C5h5KJ0On+5J7sw==","length":4924,"stub":true},"bebop-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6jiq6Bm5BwdQMwSCs1DXPg==","length":4924,"stub":true},"bebop-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-59phnlRdf9urKtDKSTIO/Q==","length":4937,"stub":true},"bebop-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UsjabYz2CyJKIpbN2ETALA==","length":4707,"stub":true},"bebop-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NVxFXJmnQANk4BOqB2jSEw==","length":4698,"stub":true}}}},
{"id":"bedrockjs","key":"bedrockjs","value":{"rev":"7-a11a83b4ef3435a17ac1e82b91c5c5f5"},"doc":{"_id":"bedrockjs","_rev":"7-a11a83b4ef3435a17ac1e82b91c5c5f5","name":"bedrockjs","description":"core javascript functionality for storediq apps","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"bedrockjs","description":"core javascript functionality for storediq apps","contributors":[{"name":"Aaron Stacy","email":"astacy@storediq.com"},{"name":"Jordan McCoy"}],"version":"0.0.1","dependencies":{"csi":"0.0.x","siq-vendor-js":"0.0.x"},"component":{"name":"bedrock"},"_npmUser":{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"},"_id":"bedrockjs@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c509724125f38e69a3307663f2097cfc47869fea","tarball":"http://registry.npmjs.org/bedrockjs/-/bedrockjs-0.0.1.tgz"},"maintainers":[{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"}]},"0.0.3":{"name":"bedrockjs","description":"core javascript functionality for storediq apps","contributors":[{"name":"Aaron Stacy","email":"astacy@storediq.com"},{"name":"Jordan McCoy"}],"version":"0.0.3","dependencies":{"csi":"0.0.x","siq-vendor-js":"0.0.x"},"component":{"name":"bedrock"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"},"_id":"bedrockjs@0.0.3","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7d22f84bafd547608248c7ec09498fb893060798","tarball":"http://registry.npmjs.org/bedrockjs/-/bedrockjs-0.0.3.tgz"},"maintainers":[{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"}]},"0.0.4":{"name":"bedrockjs","description":"core javascript functionality for storediq apps","contributors":[{"name":"Aaron Stacy","email":"astacy@storediq.com"},{"name":"Jordan McCoy"}],"version":"0.0.4","dependencies":{"csi":"0.0.x","siq-vendor-js":"0.0.x"},"component":{"name":"bedrock"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"},"_id":"bedrockjs@0.0.4","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7c9f5f738f50277cc8ef4b327e33adf96ae77f78","tarball":"http://registry.npmjs.org/bedrockjs/-/bedrockjs-0.0.4.tgz"},"maintainers":[{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"}]}},"readme":"# `bedrock.js`\n\nfoundational files for storediq javascript\n","maintainers":[{"name":"aaronj1335","email":"aaron.r.stacy@gmail.com"}],"time":{"modified":"2012-06-19T13:48:40.789Z","created":"2012-05-14T16:50:54.060Z","0.0.1":"2012-05-14T16:50:54.804Z","0.0.3":"2012-06-04T13:03:12.685Z","0.0.4":"2012-06-19T13:48:40.789Z"},"_attachments":{"bedrockjs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-glwL0yznZ4+oxCyuK2AlUg==","length":3967,"stub":true},"bedrockjs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XTdwNMTjkxf0jD7ehM3WTQ==","length":2279,"stub":true},"bedrockjs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gmaAqEAeVSVkuZ4nLcZU4w==","length":2261,"stub":true}}}},
{"id":"bedtime","key":"bedtime","value":{"rev":"5-7c341b5b72adae97f738f3dbff745fe4"},"doc":{"_id":"bedtime","_rev":"5-7c341b5b72adae97f738f3dbff745fe4","name":"bedtime","description":"oEmbed consumer service over XMPP","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bedtime","version":"0.0.1","description":"oEmbed consumer service over XMPP","homepage":"http://github.com/buddycloud/bedtime","author":{"name":"Astro","email":"astro@spaceboyz.net","url":"http://spaceboyz.net/~astro/"},"repository":{"type":"git","url":"git://github.com/buddycloud/bedtime.git"},"bugs":{"email":"astro@spaceboyz.net","url":"https://github.com/buddycloud/bedtime/issues"},"keywords":["oembed","xmpp"],"scripts":{"install":"coffee -c -o bin src/*.coffee"},"bin":{"bedtime":"./bin/bedtime.js"},"dependencies":{"oembed":">=0.1.0","node-xmpp":">=0.3.1","coffee-script":">=1.2.0"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"bedtime@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7fb48398c85fde97d1638a7bf29e52685d39256f","tarball":"http://registry.npmjs.org/bedtime/-/bedtime-0.0.1.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}]},"0.0.2":{"name":"bedtime","version":"0.0.2","description":"oEmbed consumer service over XMPP","homepage":"http://github.com/buddycloud/bedtime","author":{"name":"Astro","email":"astro@spaceboyz.net","url":"http://spaceboyz.net/~astro/"},"repository":{"type":"git","url":"git://github.com/buddycloud/bedtime.git"},"bugs":{"email":"astro@spaceboyz.net","url":"https://github.com/buddycloud/bedtime/issues"},"keywords":["oembed","xmpp"],"scripts":{"install":"coffee -c -o bin src/*.coffee"},"bin":{"bedtime":"./bin/bedtime.js"},"dependencies":{"oembed":">=0.1.0","node-xmpp":">=0.3.1","coffee-script":">=1.2.0"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"bedtime@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"331189bf84fcc771718ad5d69f7e68224f0f247d","tarball":"http://registry.npmjs.org/bedtime/-/bedtime-0.0.2.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}]}},"readme":"bedtime\n=======\n\nExposes oEmbed consumer functionality over XMPP.\n\nInstallation\n------------\n\nnpm i bedtime\n\nUsage\n-----\n\n    vi config.json\n    node ./bin/bedtime.js config.json\n\nProtocol\n--------\n\n```xml\n<iq to=\"oembed.example.org\" type=\"get\" id=\"o\">\n<oembed xmlns=\"http://github.com/buddycloud/bedtime\"\n        url=\"http://www.youtube.com/watch?v=XZ5TajZYW6Y\"\n        maxwidth=\"1024\"/>\n</iq>\n```\n\n```xml\n<iq from='oembed.example.org' to='astro@spaceboyz.net/lobster/gajim' id='o' type='result'>\n  <oembed xmlns='http://github.com/buddycloud/bedtime'>\n    <provider_url>http://www.youtube.com/</provider_url>\n    <title>Rick Astley - Never Gonna Give You Up ☻(RickRoll&apos;HD)☺</title>\n    <html>&lt;iframe width=&quot;612&quot; height=&quot;344&quot; src=&quot;http://www.youtube.com/embed/XZ5TajZYW6Y?fs=1&amp;feature=oembed&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</html>\n    <author_name>TrailerForAll</author_name>\n    <height>344</height>\n    <thumbnail_width>480</thumbnail_width>\n    <width>612</width>\n    <version>1.0</version>\n    <author_url>http://www.youtube.com/user/TrailerForAll</author_url>\n    <provider_name>YouTube</provider_name>\n    <thumbnail_url>http://i1.ytimg.com/vi/XZ5TajZYW6Y/hqdefault.jpg</thumbnail_url>\n    <type>video</type>\n    <thumbnail_height>360</thumbnail_height>\n  </oembed>\n</iq>\n```\n","maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}],"time":{"modified":"2011-12-20T17:22:02.836Z","created":"2011-12-20T01:25:22.155Z","0.0.1":"2011-12-20T01:25:23.783Z","0.0.2":"2011-12-20T17:22:02.836Z"},"author":{"name":"Astro","email":"astro@spaceboyz.net","url":"http://spaceboyz.net/~astro/"},"repository":{"type":"git","url":"git://github.com/buddycloud/bedtime.git"},"_attachments":{"bedtime-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/RmOuiGhe3tcs86n/0bVeQ==","length":6729,"stub":true},"bedtime-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sCQCjzUDcZLc6gMNpI0Tlw==","length":2478,"stub":true}}}},
{"id":"beehive","key":"beehive","value":{"rev":"4-bf8ebf939410f61b3eacb546af6cdbad"},"doc":{"_id":"beehive","_rev":"4-bf8ebf939410f61b3eacb546af6cdbad","name":"beehive","description":"Beehavioral JavaScript made simple.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"description":"Beehavioral JavaScript made simple.","keywords":["behaviour"],"main":"package.js","name":"beehive","repository":{"type":"git","url":"git@github.com:beehivejs/beehive-core.git"},"version":"0.0.1","_npmUser":{"name":"attilagyorffy","email":"attila@attilagyorffy.com"},"_id":"beehive@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"f675d7d09ec58407ea3aabd359d77bfefc169aaa","tarball":"http://registry.npmjs.org/beehive/-/beehive-0.0.1.tgz"},"readme":"","maintainers":[{"name":"attilagyorffy","email":"attila@attilagyorffy.com"}]}},"readme":"","maintainers":[{"name":"attilagyorffy","email":"attila@attilagyorffy.com"},{"name":"layam","email":"will@tomlins.org.uk"}],"time":{"modified":"2012-01-27T17:24:44.857Z","created":"2012-01-27T17:17:58.357Z","0.0.1":"2012-01-27T17:17:59.797Z"},"repository":{"type":"git","url":"git@github.com:beehivejs/beehive-core.git"},"_attachments":{"beehive-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0MI9LK41dSjc7pDPIFzAJw==","length":277,"stub":true}}}},
{"id":"beeline","key":"beeline","value":{"rev":"25-22b147e47255fca78b661f2e7605aa2e"},"doc":{"_id":"beeline","_rev":"25-22b147e47255fca78b661f2e7605aa2e","name":"beeline","description":"A laughably simplistic router for node.js","dist-tags":{"latest":"0.1.11"},"versions":{"0.1.0":{"name":"beeline","version":"0.1.0","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_id":"beeline@0.1.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.3","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ab443e2c333673643de582746515228b09d5a54b","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.0.tgz"}},"0.1.1":{"name":"beeline","version":"0.1.1","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_id":"beeline@0.1.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.3","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"20a4bb348d60be54654608fbd0e94c5561c0fd2d","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.1.tgz"}},"0.1.2":{"name":"beeline","version":"0.1.2","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_id":"beeline@0.1.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"608a91134ba15df20c4fe0005e0fbeb3964a8d5c","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.2.tgz"}},"0.1.3":{"name":"beeline","version":"0.1.3","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"dependencies":{},"devDependencies":{},"_id":"beeline@0.1.3","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"5d0f6b582fd24085813e1b0fab847f4f69292e6a","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"beeline","version":"0.1.4","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"dependencies":{},"devDependencies":{},"_id":"beeline@0.1.4","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"6cd2888e0b1e26274906ffd93a7a5f15416e97e3","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.4.tgz"},"scripts":{}},"0.1.5":{"name":"beeline","version":"0.1.5","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmJsonOpts":{"file":"/Users/xavi/.npm/beeline/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beeline@0.1.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e1194b6c3864d6201e00ecc3caa134496f251c93","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.5.tgz"}},"0.1.6":{"name":"beeline","version":"0.1.6","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmJsonOpts":{"file":"/Users/xavi/.npm/beeline/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beeline@0.1.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"78eb598aa4c186a05a5161f1843708006075649c","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.6.tgz"}},"0.1.7":{"name":"beeline","version":"0.1.7","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmJsonOpts":{"file":"/Users/xavi/.npm/beeline/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beeline@0.1.7","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6c5c7d1fe92756a1831159309bb4aad4ecd9eeb0","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.7.tgz"}},"0.1.8":{"name":"beeline","version":"0.1.8","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmUser":{"name":"xavi","email":"xavi.rmz@gmail.com"},"_id":"beeline@0.1.8","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"7cd462a774502767f2744c45f6cca8e7cdb8f919","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.8.tgz"}},"0.1.9":{"name":"beeline","version":"0.1.9","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmUser":{"name":"xavi","email":"xavi.rmz@gmail.com"},"_id":"beeline@0.1.9","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"842ee80bef9b1712e52b814032a6fffab5ec86e0","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.9.tgz"},"readme":""},"0.1.10":{"name":"beeline","version":"0.1.10","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmUser":{"name":"xavi","email":"xavi.rmz@gmail.com"},"_id":"beeline@0.1.10","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6a111ba462bc644fe678ed8d7045b5f9a9707bf0","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.10.tgz"},"readme":""},"0.1.11":{"name":"beeline","version":"0.1.11","description":"A laughably simplistic router for node.js","keywords":["url","dispatch","router","request handler","middleware"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"engines":{"node":">= 0.3.1"},"_npmUser":{"name":"xavi","email":"xavi.rmz@gmail.com"},"_id":"beeline@0.1.11","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"1c1e44df973c94aa106dff5777400c0a4a858374","tarball":"http://registry.npmjs.org/beeline/-/beeline-0.1.11.tgz"},"readme":""}},"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"time":{"modified":"2012-07-22T09:17:41.866Z","created":"2011-04-06T03:01:07.359Z","0.1.0":"2011-04-06T03:01:07.523Z","0.1.1":"2011-04-17T02:11:57.488Z","0.1.2":"2011-05-03T12:55:13.665Z","0.1.3":"2011-06-30T23:54:54.822Z","0.1.4":"2011-07-01T00:28:40.482Z","0.1.5":"2011-09-27T03:58:40.480Z","0.1.6":"2011-09-27T04:16:43.958Z","0.1.7":"2011-10-02T03:22:31.519Z","0.1.8":"2011-12-01T05:22:48.084Z","0.1.9":"2012-02-13T02:05:59.284Z","0.1.10":"2012-04-18T06:26:42.044Z","0.1.11":"2012-07-22T09:17:41.866Z"},"repository":{"type":"git","url":"git://github.com/xavi-/beeline.git"},"_attachments":{"beeline-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-IwhfvvnY23CjgPm5Mos69g==","length":7179,"stub":true},"beeline-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-SF4nyP3G7Xau4xPi5sKB8g==","length":7177,"stub":true},"beeline-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-JW0kQIPoJJ92VNruIo9KMg==","length":6846,"stub":true},"beeline-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-9z+gINymttbnxS74pSm4HA==","length":10240,"stub":true},"beeline-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-5Qtw7Ipk8rjLHmIVGIALCA==","length":5596,"stub":true},"beeline-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-NKouVrqlG0DMnFHbTxHPLA==","length":5415,"stub":true},"beeline-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-icEuCMn+bx03O9A1qVkajA==","length":5384,"stub":true},"beeline-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-oKQktq+fXQQGgMqtUT8kNg==","length":5247,"stub":true},"beeline-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/vOU/YD7/1+BsEx2hHkSDA==","length":5220,"stub":true},"beeline-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BMaunmh3MR5INqzDPQLXMA==","length":5075,"stub":true},"beeline-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wroJzV+rGlccl7GZTedOYw==","length":5053,"stub":true},"beeline-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tqQwFbLt/K33fFw2q++HQg==","length":4626,"stub":true}}}},
{"id":"beep","key":"beep","value":{"rev":"4-72bab22fa1b339000e99e69e7749168a"},"doc":{"_id":"beep","_rev":"4-72bab22fa1b339000e99e69e7749168a","name":"beep","description":"A BEEP protocol implementation for node.js","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"beep","version":"0.0.0","author":{"name":"Brian White","email":"mscdex@mscdex.net"},"description":"A BEEP protocol implementation for node.js","main":"./lib/beep","engines":{"node":">=0.6.0"},"keywords":["beep","exchange","protocol","framing","tcp"],"licenses":[{"type":"MIT","url":"http://github.com/mscdex/beepjs/raw/master/LICENSE"}],"repository":{"type":"git","url":"http://github.com/mscdex/beepjs.git"},"_id":"beep@0.0.0","dist":{"shasum":"392100037cbb617e7efdd4ce0cefc4cf1265065b","tarball":"http://registry.npmjs.org/beep/-/beep-0.0.0.tgz"},"scripts":{},"readme":"","maintainers":[{"name":"mscdex","email":"mscdex@mscdex.net"}]}},"readme":"","maintainers":[{"name":"mscdex","email":"mscdex@mscdex.net"}],"time":{"modified":"2012-08-02T13:44:16.454Z","created":"2012-07-26T13:04:33.997Z","0.0.0":"2012-07-26T13:04:35.388Z"},"author":{"name":"Brian White","email":"mscdex@mscdex.net"},"repository":{"type":"git","url":"http://github.com/mscdex/beepjs.git"},"users":{"fgribreau":true},"_attachments":{"beep-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sklbwKHaQqQcIL0OnbfraQ==","length":2595,"stub":true}}}},
{"id":"bees","key":"bees","value":{"rev":"26-a9987ceff69aa66293d81c1e93b9093c"},"doc":{"_id":"bees","_rev":"26-a9987ceff69aa66293d81c1e93b9093c","name":"bees","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"bees","version":"0.0.1","devDependencies":{"vows":">= 0.0.0"},"scripts":{"test":"vows --spec --isolate test/test-*.js"},"bin":{"bees":"./bin/bees"},"_npmUser":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"_id":"bees@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5943c409381f4a5cf0fe2d23d1284feadd005351","tarball":"http://registry.npmjs.org/bees/-/bees-0.0.1.tgz"},"maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}],"directories":{}},"0.0.2":{"name":"bees","version":"0.0.2","author":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"description":"HTTP API Generator","devDependencies":{"vows":">= 0.0.0"},"scripts":{"test":"vows --spec --isolate test/test-*.js"},"bin":{"bees":"./bin/bees"},"repository":{"type":"git","url":"git://github.com/yawnt/bees.git"},"_npmUser":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"_id":"bees@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a1fac3e1f5b9313c5f5101514235e5498cfa775e","tarball":"http://registry.npmjs.org/bees/-/bees-0.0.2.tgz"},"maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}],"directories":{}},"0.0.3":{"name":"bees","version":"0.0.3","author":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"description":"HTTP API Generator","devDependencies":{"vows":">= 0.0.0"},"scripts":{"test":"vows --spec --isolate test/test-*.js"},"bin":{"bees":"./bin/bees"},"repository":{"type":"git","url":"git://github.com/yawnt/bees.git"},"_npmUser":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"_id":"bees@0.0.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7f254b98a94bc06bd136014e90f969299947ad7a","tarball":"http://registry.npmjs.org/bees/-/bees-0.0.3.tgz"},"maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}],"directories":{}},"0.0.4":{"name":"bees","version":"0.0.4","author":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"description":"HTTP API Generator","devDependencies":{"vows":">= 0.0.0"},"scripts":{"test":"vows --spec --isolate test/test-*.js"},"bin":{"bees":"./bin/bees"},"repository":{"type":"git","url":"git://github.com/yawnt/bees.git"},"_npmUser":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"_id":"bees@0.0.4","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"7b0927b8f4a04d264f9855be51d519ae3ed1dbc2","tarball":"http://registry.npmjs.org/bees/-/bees-0.0.4.tgz"},"maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}],"directories":{}},"0.0.5":{"name":"bees","version":"0.0.5","author":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"description":"Api documentation generator","devDependencies":{"mocha":">= 0.0.0","should":">= 0.0.0","assert":">= 0.0.0"},"scripts":{"test":"mocha -R spec -r should test/*-test.js"},"bin":{"bees":"./bin/bees"},"repository":{"type":"git","url":"https://github.com/yawnt/bees.git"},"readme":"bees (in Italian ```API``` means ```bees```)\n====\n\n\nLet the code write your docs D:\n\n## Installation:\n\n```\n$ npm install bees\n```\n\n## Example: \n\n__app.js__\n```javascript\nvar app = require('express').createServer();\n\n\n/**\n * GET /\n * \n * @return Main page\n*/\napp.get('/', function(req, res){\n    res.send('Hello World');\n});\n\n/**\n * GET /:id\n * \n * @param id id of the user\n * @return user infos\n*/\napp.get('/:id', function(req, res){\n    res.send('Hello World');\n});\n\n\napp.listen(3000);\n```\n\n```\n$ bees app.js\n[\n  {\n    \"method\":\"GET\",\n    \"path\":\"/\",\n    \"return\":\"Main page\"\n  },\n  {\n    \"method\":\"GET\",\n    \"path\":\"/:id\",\n    \"params\":{\n      \"id\":\"id of the user\"\n    },\n    \"return\":\"user infos\"\n  }\n]\n\n```\n\n## Plugin:\n\nYou can extend Bees and add new keywords with a tiny plugin system (see ```lib/plugins```)\n\n```javascript\nvar bees = require('bees');\nbees.use('plugin', function(cmd, json) {\n  json.plugin = cmd[1];\n});\nconsole.log(\n  bees.parse(\n    require('fs').readFileSync('./app.js','utf-8')\n  )\n);\n```\n\nNow you can use it\n\n```javascript\n/**\n * GET /:id\n * \n * @param id id of the user\n * @return user infos\n * @plugin hai lol\n*/\n```\n\n```\n$ node plugin.js\n[\n  {\n    method: 'GET',\n    path: '/:id',\n    params: { id: 'id of the user' },\n    return: 'user infos',\n    plugin: 'hai lol'\n  }\n]\n```\n\n## Reporters:\n\nReporters are a way to return formatted objects.\n\nIf we got this in eyes-reporter.js:\n\n```javascript\nvar inspector = require('eyes').inspector({stream: null});\n\nmodule.exports = function(doc) {\n  return inspector(doc);\n};\n```\n\nAnd we call bees just like this:\n\n```\nbees -R eyes-reporter <file>\n```\n\nWe will get:\n\n![eyes](http://i.imgur.com/F9p5M.png)\n\nCool eh?\n\n## To Do:\n\n- Generate HTML from JSON\n\n## Tests:\n\n```\n$ npm test\n```\n\nTests are written with Vows\n\n## License:\n\n__MIT__\n","_id":"bees@0.0.5","dist":{"shasum":"bcbc77ceb4f4cde4c725ead311c14e22a568d3a7","tarball":"http://registry.npmjs.org/bees/-/bees-0.0.5.tgz"},"maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}],"directories":{}},"0.0.6":{"name":"bees","version":"0.0.6","author":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"description":"Api documentation generator","devDependencies":{"mocha":">= 0.0.0","should":">= 0.0.0","assert":">= 0.0.0"},"dependencies":{"optimist":"*"},"scripts":{"test":"mocha -R spec -r should test/*-test.js"},"bin":{"bees":"./bin/bees"},"repository":{"type":"git","url":"https://github.com/yawnt/bees.git"},"readme":"bees (in Italian ```API``` means ```bees```)\n====\n\n\nLet the code write your docs D:\n\n## Installation:\n\n```\n$ npm install bees\n```\n\n## Example: \n\nSee ```test/file```\n\n## Plugin:\n\nYou can extend Bees and add new keywords with a tiny plugin system (see ```lib/plugins```)\n\n```javascript\nvar bees = require('bees');\nbees.use('plugin', function(cmd, json) {\n  json.plugin = cmd[1];\n});\nconsole.log(\n  bees.parse(\n    require('fs').readFileSync('./app.js','utf-8')\n  )\n);\n```\n\nNow you can use it\n\n```javascript\n/**\n * GET /:id\n * \n * @param id id of the user\n * @return user infos\n * @plugin hai lol\n*/\n```\n\n```\n$ node plugin.js\n[\n  {\n    method: 'GET',\n    path: '/:id',\n    params: { id: 'id of the user' },\n    return: 'user infos',\n    plugin: 'hai lol'\n  }\n]\n```\n\n## Reporters:\n\nReporters are a way to return formatted objects.\n\nIf we got this in eyes-reporter.js:\n\n```javascript\nvar inspector = require('eyes').inspector({stream: null});\n\nmodule.exports = function(doc) {\n  return inspector(doc);\n};\n```\n\nAnd we call bees just like this:\n\n```\nbees -R eyes-reporter <file>\n```\n\nWe will get:\n\n![eyes](http://i.imgur.com/F9p5M.png)\n\nCool eh?\n\n## To Do:\n\n- Generate HTML from JSON\n\n## Tests:\n\n```\n$ npm test\n```\n\nTests are written with Vows\n\n## License:\n\n__MIT__\n","_id":"bees@0.0.6","dist":{"shasum":"a9cf621bfedd74b65845e864df9b015798da0b4d","tarball":"http://registry.npmjs.org/bees/-/bees-0.0.6.tgz"},"maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}]}},"readme":"bees (in Italian ```API``` means ```bees```)\n====\n\n\nLet the code write your docs D:\n\n## Example: \n\n__app.js__\n```javascript\nvar app = require('express').createServer();\n\n\n/**\n * GET /\n * \n * @return Main page\n*/\napp.get('/', function(req, res){\n    res.send('Hello World');\n});\n\n/**\n * GET /:id\n * \n * @param id id of the user\n * @return user infos\n*/\napp.get('/:id', function(req, res){\n    res.send('Hello World');\n});\n\n\napp.listen(3000);\n```\n\n```\n$ bees app.js\n[\n  {\n    \"method\":\"GET\",\n    \"path\":\"/\",\n    \"params\":{},\n    \"return\":\"Main page\"\n  },\n  {\n    \"method\":\"GET\",\n    \"path\":\"/:id\",\n    \"params\":{\n      \"id\":\"id of the user\"\n    },\n    \"return\":\"user infos\"\n  }\n]\n\n```\n\n## To Do\n\n- Generate HTML from JSON\n\n## Tests:\n\n```\n$ npm test\n```\n\nTests are written with Vows\n","maintainers":[{"name":"yawnt","email":"yawn.localhost@gmail.com"}],"time":{"modified":"2012-08-02T13:44:09.389Z","created":"2012-06-10T14:09:47.345Z","0.0.1":"2012-06-10T14:09:49.672Z","0.0.2":"2012-06-10T14:27:47.114Z","0.0.3":"2012-06-10T14:33:13.233Z","0.0.4":"2012-06-10T18:23:59.082Z","0.0.5":"2012-07-15T13:42:15.660Z","0.0.6":"2012-07-27T09:52:29.785Z"},"description":"Api documentation generator","author":{"name":"yawnt","email":"yawn.localhost@gmail.com"},"repository":{"type":"git","url":"https://github.com/yawnt/bees.git"},"users":{"fgribreau":true},"_attachments":{"bees-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-edlxYh231fyzhvRRYQLUsA==","length":2726,"stub":true},"bees-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-wtfbGCK2MtjLKbB/7XF3pA==","length":2908,"stub":true},"bees-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-sqfhhJ5d3iTecIkJaRooEg==","length":2089,"stub":true},"bees-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+T1Zg93w5ehlCBvwFcM9Sg==","length":1744,"stub":true},"bees-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-iIL9Sm3wAfY9Sp/o33xAXQ==","length":1738,"stub":true},"bees-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0SeCSAhB7WaT0KWUsY70ew==","length":1609,"stub":true}}}},
{"id":"beet","key":"beet","value":{"rev":"198-07f6075f8ea97e4f4f5f40faafc65585"},"doc":{"_id":"beet","_rev":"198-07f6075f8ea97e4f4f5f40faafc65585","name":"beet","dist-tags":{"latest":"0.1.14"},"versions":{"0.0.1":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"latest","brazln":"latest","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1.tgz"},"directories":{}},"0.0.1-1":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"active","brazln":"active","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-1.tgz"},"directories":{}},"0.0.1-2":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-2","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-2.tgz"},"directories":{}},"0.0.1-4":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-4","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-4.tgz"},"directories":{}},"0.0.1-5":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-5","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-5.tgz"},"directories":{}},"0.0.1-6":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-6","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-6.tgz"},"directories":{}},"0.0.1-7":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-7","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-7","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-7.tgz"},"directories":{}},"0.0.1-8":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-8","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-8","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-8.tgz"},"directories":{}},"0.0.1-9":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-9","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-9","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-9.tgz"},"directories":{}},"0.0.1-10":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-10","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-10","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-10.tgz"},"directories":{}},"0.0.1-11":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-11","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-11","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-11.tgz"},"directories":{}},"0.0.1-12":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-12","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-12","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-12.tgz"},"directories":{}},"0.0.1-13":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-13","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-13","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-13.tgz"},"directories":{}},"0.0.1-14":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-14","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-14","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-14.tgz"},"directories":{}},"0.0.1-15":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-15","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-15","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-15.tgz"},"directories":{}},"0.0.1-16":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-16","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-16","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-16.tgz"},"directories":{}},"0.0.1-17":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-17","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-17","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-17.tgz"},"directories":{}},"0.0.1-18":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-18","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-18","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-18.tgz"},"directories":{}},"0.0.1-19":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-19","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-19","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-19.tgz"},"directories":{}},"0.0.1-20":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-20","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-20","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-20.tgz"},"directories":{}},"0.0.1-21":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-21","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-21","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-21.tgz"},"directories":{}},"0.0.1-22":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-22","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-22","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-22.tgz"},"directories":{}},"0.0.1-23":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-23","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-23","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-23.tgz"},"directories":{}},"0.0.1-24":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-24","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-24","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-24.tgz"},"directories":{}},"0.0.1-25":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-25","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-25","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-25.tgz"},"directories":{}},"0.0.1-26":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-26","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-26","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-26.tgz"},"directories":{}},"0.0.1-27":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-27","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-27","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-27.tgz"},"directories":{}},"0.0.1-28":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-28","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-28","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-28.tgz"},"directories":{}},"0.0.1-29":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.1-29","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","brazln":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.1-29","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.1-29.tgz"},"directories":{}},"0.0.2":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.2","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","beanpole":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load","uninstall":"./bin/beet unload"},"_id":"beet@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.2.tgz"},"directories":{}},"0.0.2-1":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.2-1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","beanpole":"*","express":"*","vine":"*","structr":"*","node-tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load"},"_id":"beet@0.0.2-1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.2-1.tgz"},"directories":{}},"0.0.2-2":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.2-2","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","beanpole":"*","express":"*","vine":"*","structr":"*","tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load"},"_id":"beet@0.0.2-2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.9","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.2-2.tgz"},"directories":{}},"0.0.3":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.3","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","beanpole":"*","express":"*","vine":"*","structr":"*","tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load"},"_id":"beet@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.3.tgz"},"directories":{}},"0.0.4":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.4","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","beanpole":"*","express":"*","vine":"*","structr":"*","tiny":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load"},"_id":"beet@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.4.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.5":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.5","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","dirty":"*","beanpole":"*","express":"*","vine":"*","structr":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load"},"_id":"beet@0.0.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.5.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.6":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.6","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"http://github.com/spiceapps/beet.git"},"main":"./app/index","dependencies":{"sk":"*","dirty":"*","beanpole":"*","express":"*","vine":"*","structr":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"scripts":{"install":"./bin/beet load"},"_id":"beet@0.0.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.10","dist":{"tarball":"http://registry.npmjs.org/beet/-/beet-0.0.6.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.0.7":{"name":"beet","descriptions":"Upstart processes and keep them running","version":"0.0.7","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./app/index.js","dependencies":{"sk":"*","dirty":"*","beanpole":"*","express":"*","vine":"*","structr":"*","websocket-client":"1.0.0","websocket-server":"1.4.04"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"edfa20962141d20657209c8099c62bc3c61e88ec","tarball":"http://registry.npmjs.org/beet/-/beet-0.0.7.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.0":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.0","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","express":"*","vine":"*","structr":"*","gumbo":"*","supervisord":"*","ini":"*","node-fs":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f69d64efd2020bd1d3fc90a026a132e8a9604b0a","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.1":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.1","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","express":"*","vine":"*","structr":"*","gumbo":"*","supervisord":"*","ini":"*","node-fs":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6468c45e09f40a409178db7e080a7f3e414accbd","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.2":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.2","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","express":"*","vine":"*","structr":"*","gumbo":"*","supervisord":"*","ini":"*","node-fs":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b260699456d780164a6c2a2423b846526b31f1a0","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.4":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.4","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","express":"*","vine":"*","structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","cashew":"*","underscore":"*","yaconfig":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"44312125b31f35695574557bf9c3a5ba167aeb7c","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.4.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.5":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.5","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","express":"*","vine":"*","structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","cashew":"*","underscore":"*","yaconfig":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"aa2975f31ec17f9904b8e255232829e045a6ad96","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.5.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.6":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.6","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"456b0d9312059ea074fc34a7e697b8d83cd25d51","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.6.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.7":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.7","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"scripts":{"install":"./bin/install -no"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cf71d5cc16b0ae81e3e6d74d5b8a9db372021d90","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.7.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.8":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.8","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4221d84fc7b0c3f1c250387ef2c02151f45d2907","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.8.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.9":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.9","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2d5bd6d2ff1f542b47910581feb3536298015294","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.9.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.10":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.10","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d52a48806bf841bd0fe8f8f83e56ad2d2a4e2560","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.10.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.11":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.11","author":{"name":"Craig Condon","email":"craig@spiceapps.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/spiceapps/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"os":["linux","darwin","freebsd"],"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/beet/0.1.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beet@0.1.11","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ef03ab64c7842b547cced68b2bdf87416d5dbaa0","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.11.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.12":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.12","author":{"name":"Craig Condon","email":"craig@crcn.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/crcn/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"*","structr":"*","supervisord":"*","ini":"*","node-fs":"*","celeri":"*","underscore":"*","yaconfig":"*"},"os":["linux","darwin","freebsd"],"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beet@0.1.12","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2fde8b7e7f0f8fc80974f9d90e5c0e69524102ed","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.12.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.13":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.13","author":{"name":"Craig Condon","email":"craig@crcn.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/crcn/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"0.0.8","structr":"0.1.0","supervisord":"0.0.3","ini":"1.0.1","node-fs":"0.1.0","celeri":"0.1.3","optimist":"0.2.8","underscore":"1.2.2","yaconfig":"0.0.2"},"os":["linux","darwin","freebsd"],"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beet@0.1.13","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"55665edd69a7ce2ef438a734ee117c72c49f03f4","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.13.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"directories":{}},"0.1.14":{"name":"beet","descriptions":"Supervisord library for node.js","version":"0.1.14","author":{"name":"Craig Condon","email":"craig@crcn.com"},"bin":{"beet-install":"./bin/install","beet":"./bin/beet"},"repository":{"type":"git","url":"git://github.com/crcn/beet.git"},"main":"./lib/index.js","dependencies":{"sk":"0.0.8","structr":"0.1.0","supervisord":"0.0.3","ini":"1.0.1","node-fs":"0.1.0","celeri":"0.2.0","optimist":"*","underscore":"1.2.2","yaconfig":"0.0.2"},"os":["linux","darwin","freebsd"],"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"beet@0.1.14","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9a5ecc4607c3adda57cf04a22564f8c1af457a40","tarball":"http://registry.npmjs.org/beet/-/beet-0.1.14.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-04-03T00:10:42.070Z","created":"2011-07-13T06:36:55.724Z","0.0.1":"2011-07-13T06:36:55.951Z","0.0.1-1":"2011-07-13T06:45:54.855Z","0.0.1-2":"2011-07-13T06:48:27.652Z","0.0.1-4":"2011-07-13T19:12:25.140Z","0.0.1-5":"2011-07-13T19:21:40.673Z","0.0.1-6":"2011-07-13T19:23:04.412Z","0.0.1-7":"2011-07-13T19:29:08.757Z","0.0.1-8":"2011-07-13T19:45:06.457Z","0.0.1-9":"2011-07-13T22:16:59.698Z","0.0.1-10":"2011-07-13T22:25:10.305Z","0.0.1-11":"2011-07-13T22:36:43.511Z","0.0.1-12":"2011-07-13T22:37:51.187Z","0.0.1-13":"2011-07-13T22:47:55.541Z","0.0.1-14":"2011-07-13T22:57:40.767Z","0.0.1-15":"2011-07-13T22:59:12.695Z","0.0.1-16":"2011-07-13T23:00:54.379Z","0.0.1-17":"2011-07-13T23:02:16.162Z","0.0.1-18":"2011-07-13T23:04:48.482Z","0.0.1-19":"2011-07-13T23:05:33.024Z","0.0.1-20":"2011-07-14T02:52:56.262Z","0.0.1-21":"2011-07-16T22:50:07.920Z","0.0.1-22":"2011-07-17T22:00:13.745Z","0.0.1-23":"2011-07-17T22:08:53.729Z","0.0.1-24":"2011-07-17T22:19:20.861Z","0.0.1-25":"2011-07-17T22:38:01.756Z","0.0.1-26":"2011-07-17T23:01:14.407Z","0.0.1-27":"2011-07-17T23:26:59.653Z","0.0.1-28":"2011-07-18T05:56:26.728Z","0.0.1-29":"2011-07-18T06:10:23.223Z","0.0.2":"2011-07-28T05:22:27.508Z","0.0.2-1":"2011-07-28T05:32:44.628Z","0.0.2-2":"2011-07-28T05:35:25.618Z","0.0.3":"2011-07-31T23:18:38.020Z","0.0.4":"2011-08-10T02:59:44.607Z","0.0.5":"2011-08-10T04:43:51.915Z","0.0.6":"2011-08-10T05:36:11.644Z","0.0.7":"2011-09-12T05:23:49.056Z","0.1.0":"2011-09-19T02:18:35.613Z","0.1.1":"2011-09-20T03:59:16.610Z","0.1.2":"2011-09-22T07:31:37.090Z","0.1.4":"2011-09-23T05:04:27.865Z","0.1.5":"2011-09-24T19:15:47.589Z","0.1.6":"2011-09-25T03:42:20.699Z","0.1.7":"2011-09-26T19:06:08.049Z","0.1.8":"2011-09-26T19:57:35.074Z","0.1.9":"2011-09-26T21:05:38.297Z","0.1.10":"2011-09-26T21:13:25.888Z","0.1.11":"2011-09-26T23:36:03.343Z","0.1.12":"2011-11-30T18:55:34.566Z","0.1.13":"2011-12-03T19:47:09.855Z","0.1.14":"2012-04-03T00:10:42.070Z"},"author":{"name":"Craig Condon","email":"craig@crcn.com"},"repository":{"type":"git","url":"git://github.com/crcn/beet.git"},"_attachments":{"beet-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":198,"digest":"md5-8DhInftzQRk/DYdi/Rw4AA==","length":20480,"stub":true},"beet-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":172,"digest":"md5-GLRKVy+9Bskw/qSqEYLjjA==","length":20480,"stub":true},"beet-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":162,"digest":"md5-d9cxPHnT/s1gelOMwK5F+g==","length":20480,"stub":true},"beet-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":124,"digest":"md5-Jg7cq1hO9SEPv/h5N2XcEA==","length":12357,"stub":true},"beet-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":122,"digest":"md5-Vgo77/S/ji5nm14yanB7Sw==","length":12306,"stub":true},"beet-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":120,"digest":"md5-rcJee1HYlhoKNcFEGVwdSQ==","length":12308,"stub":true},"beet-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":118,"digest":"md5-M08bIdKwgH5rG7qPOYJjkw==","length":12307,"stub":true},"beet-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-Ws4fReZyTAiHQMfnvrNJ9g==","length":11975,"stub":true},"beet-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-ncQzsDmGauMGPi2++dVqZg==","length":11952,"stub":true},"beet-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-t29Ikwue5aFMGr0bB9fB1w==","length":12031,"stub":true},"beet-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-m//yjVEP+KeLUVWAOEgxoQ==","length":11776,"stub":true},"beet-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-HTslVCy/Ka4nvaABkRhZzg==","length":11286,"stub":true},"beet-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-FuG8tGatoaDTZz3yRSMcVw==","length":11276,"stub":true},"beet-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-VDVMSoeEdDzeGj/5oiAx7w==","length":10163,"stub":true},"beet-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-tZuwm39G8DnN+2QvRV8dbw==","length":11588,"stub":true},"beet-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-SUc+h9ycZwcbZyLRWXAN6g==","length":14902,"stub":true},"beet-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-yID3fR9SS752CJzF3nf1Xw==","length":14918,"stub":true},"beet-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-KSwRInoWuVJh4qgThBKQHQ==","length":14572,"stub":true},"beet-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-vcx3o7LLpQkWXjcEIbMlJA==","length":14564,"stub":true},"beet-0.0.2-2.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-40gD0WYUSbYqWzEGZ+F5Hw==","length":14566,"stub":true},"beet-0.0.2-1.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-SciU6HxH+IdAuDxLqSBSTQ==","length":14570,"stub":true},"beet-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-TqQzofmJkrYSAstwe5hLmg==","length":14575,"stub":true},"beet-0.0.1-29.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-UzAfMQlRqI5VGuv7mramLQ==","length":13579,"stub":true},"beet-0.0.1-28.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-cr/bHiBbG3J95XtcIHnnhw==","length":13417,"stub":true},"beet-0.0.1-27.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-5RGZzv1T+BSFeX0Qy3kSmw==","length":13204,"stub":true},"beet-0.0.1-26.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-IUeSnSfjskW709+6S8cPAQ==","length":13186,"stub":true},"beet-0.0.1-25.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-knWot5aMppV7OjacmXsLig==","length":13177,"stub":true},"beet-0.0.1-24.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-a6IetKaVM+DBjA45n1G1BA==","length":13178,"stub":true},"beet-0.0.1-23.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-eqDcehstVfVHl+e5eTqpqw==","length":13139,"stub":true},"beet-0.0.1-22.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-RX5C/BdT8coYb0u76SfJog==","length":13137,"stub":true},"beet-0.0.1-21.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-I5xDqYzDqL9bdrEUZwKf2w==","length":12720,"stub":true},"beet-0.0.1-20.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-ZAHDeW7y44QpQ2bzeItieQ==","length":10240,"stub":true},"beet-0.0.1-19.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-QXUzm04aNexKiYQEmgeqqw==","length":9508,"stub":true},"beet-0.0.1-18.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-0QOmA9W5JnSK6y6H2nJlZA==","length":9513,"stub":true},"beet-0.0.1-17.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-x8aFtlbz348iTs9/LgQWJw==","length":9501,"stub":true},"beet-0.0.1-16.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-rRV7oMc/p2/xB571rlVbfw==","length":9500,"stub":true},"beet-0.0.1-15.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-/fiD8ctu1WeWpTLa7EBjcg==","length":9498,"stub":true},"beet-0.0.1-14.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-lA0xXoaJx/wCIuRSk7iHAA==","length":9488,"stub":true},"beet-0.0.1-13.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-mRTTSWMRoN8ZlMctLKkwqQ==","length":9498,"stub":true},"beet-0.0.1-12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-12gi2Bc7jhO+EVq4ehovww==","length":9473,"stub":true},"beet-0.0.1-11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-nvh2Rs/NLDnYNtXY/MB92g==","length":9470,"stub":true},"beet-0.0.1-10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-KTCJnL0Ppa3wPyNZW9Ld+A==","length":9466,"stub":true},"beet-0.0.1-9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-kfhMgbb5JpGz7Cu6NHfMhQ==","length":9464,"stub":true},"beet-0.0.1-8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-4VzUf4l6kboP7Y5xlwTUNQ==","length":9433,"stub":true},"beet-0.0.1-7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-KO8CrweB7FiFI3Prmj4OAQ==","length":9353,"stub":true},"beet-0.0.1-6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-4PfU/5dMfXEoF/KJir8DMw==","length":9420,"stub":true},"beet-0.0.1-5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-O0U04YnTPx5h7OaSF6wvGg==","length":9418,"stub":true},"beet-0.0.1-4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-IGPTrjnNxWef4uEwOLNmcg==","length":9357,"stub":true},"beet-0.0.1-2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-LIl0OQvEzx6fE0EBbEI5AQ==","length":7630,"stub":true},"beet-0.0.1-1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XZxnGBX4/eNXEMhZwjDJHA==","length":7635,"stub":true},"beet-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oe89JYT8Oo0Ibw2nPWMdHg==","length":7628,"stub":true}}}},
{"id":"begin","key":"begin","value":{"rev":"3-b32a5eb1b9475353b37f90813ed89dce"},"doc":{"_id":"begin","_rev":"3-b32a5eb1b9475353b37f90813ed89dce","name":"begin","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"begin","version":"0.1.0","author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"main":"./lib/begin","_id":"begin@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.8-1","_nodeVersion":"v0.4.1","dist":{"tarball":"http://registry.npmjs.org/begin/-/begin-0.1.0.tgz"}}},"maintainers":[{"name":"weaver","email":"ben@orangesoda.net"}],"time":{"modified":"2011-02-24T15:47:38.233Z","created":"2011-02-24T15:47:38.085Z","0.1.0":"2011-02-24T15:47:38.233Z"},"author":{"name":"Ben Weaver","email":"ben@orangesoda.net"},"_attachments":{"begin-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fBFlo6BwWCdx3s6V9FzCsw==","length":6174,"stub":true}}}},
{"id":"begin.js","key":"begin.js","value":{"rev":"8-10527cb78f05d7601b8443701c56f7ab"},"doc":{"_id":"begin.js","_rev":"8-10527cb78f05d7601b8443701c56f7ab","name":"begin.js","description":"Flow control library for Node.js and CoffeeScript","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.1":{"name":"begin.js","version":"0.1.1","description":"Flow control library for Node.js and CoffeeScript","main":"./lib/begin","_id":"begin.js@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bc0b32e9c7737a8ef077bc8116288a1ccabb080a","tarball":"http://registry.npmjs.org/begin.js/-/begin.js-0.1.1.tgz"},"deprecated":"no maintenance"},"0.1.2":{"name":"begin.js","version":"0.1.2","description":"Flow control library for Node.js and CoffeeScript","main":"./lib/begin","_id":"begin.js@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e08381a085e9de819f777f672b9e7e31b9ba190e","tarball":"http://registry.npmjs.org/begin.js/-/begin.js-0.1.2.tgz"},"deprecated":"no maintenance"},"0.1.3":{"name":"begin.js","version":"0.1.3","description":"Flow control library for Node.js and CoffeeScript","main":"./lib/begin","_id":"begin.js@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4e521ffe780cbff264fa0b1e41544d5ef29d5d31","tarball":"http://registry.npmjs.org/begin.js/-/begin.js-0.1.3.tgz"},"deprecated":"no maintenance"}},"maintainers":[{"name":"arumons","email":"takohati1@gmail.com"}],"time":{"modified":"2012-04-06T14:44:27.672Z","created":"2011-07-04T15:57:46.252Z","0.1.1":"2011-07-04T15:57:46.952Z","0.1.2":"2011-07-04T16:06:27.351Z","0.1.3":"2011-07-07T12:04:06.357Z"},"_attachments":{"begin.js-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-n+jtL5ikOIlYXrnHKuxBSw==","length":10040,"stub":true},"begin.js-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+EjxksqqPxiHIQUNLhlXDQ==","length":9934,"stub":true},"begin.js-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dzYhiwPfpuTk/uOn2amoXw==","length":15700,"stub":true}}}},
{"id":"behere","key":"behere","value":{"rev":"9-9b9b6fc04509a39b1dffc380edd78d25"},"doc":{"_id":"behere","_rev":"9-9b9b6fc04509a39b1dffc380edd78d25","name":"behere","description":"Node framework with plugin support for easy development... more like an aggregator.","dist-tags":{"latest":"0.2.2"},"versions":{"0.0.1":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"behere","description":"Behere Framework - Easy node programming","version":"0.0.1","repository":{"type":"git","url":"git://github.com/behere/behere.git"},"main":"./lib/behere.js","engines":{"node":"~0.6.7"},"dependencies":{"cluster":"0.x.x","underscore":"1.x.x","async":"0.x.x","moment":"1.x.x","connect":"2.x.x","commander":"0.5.1","mime":">= 1.2.4","qs":">= 0.4.0","mkdirp":"0.2.2","flatiron":"0.x.x","utile":"0.x.x"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"behere@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"03b4ff21cea62528ff4e546ec6dfe11aaf9af6be","tarball":"http://registry.npmjs.org/behere/-/behere-0.0.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]},"0.2.0":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"behere","description":"Behere Framework - Easy node programming","version":"0.2.0","repository":{"type":"git","url":"git://github.com/behere/behere.git"},"main":"./lib/behere.js","engines":{"node":"~0.6.7"},"dependencies":{"cluster":"0.x.x","underscore":"1.x.x","async":"0.x.x","moment":"1.x.x","connect":"2.x.x","commander":"0.5.1","mime":">= 1.2.4","qs":">= 0.4.0","mkdirp":"0.2.2","flatiron":"0.x.x","utile":"0.x.x"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"bin":{"behere":"./bin/behere"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"behere@0.2.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"6b067a71ad5e4be9eb2b370f5924461a53bc522b","tarball":"http://registry.npmjs.org/behere/-/behere-0.2.0.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]},"0.2.1":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"behere","description":"Node framework with plugin support for easy development... more like an aggregator.","version":"0.2.1","repository":{"type":"git","url":"git://github.com/behere/behere.git"},"main":"./lib/behere.js","scripts":{"prepublish":"npm prune","test":"make test"},"dependencies":{"bike":"*","express":"*","flatiron":"0.x.x","underscore":"1.x.x","underscore.string":"2.x.x","async":"0.x.x","moment":"1.x.x"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"behere":"./bin/behere"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"behere@0.2.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e256e1271aa124b2afcbc35f007abdba1ceedc28","tarball":"http://registry.npmjs.org/behere/-/behere-0.2.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]},"0.2.2":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"behere","description":"Node framework with plugin support for easy development... more like an aggregator.","version":"0.2.2","repository":{"type":"git","url":"git://github.com/behere/behere.git"},"main":"./lib/behere.js","scripts":{"prepublish":"npm prune","test":"make test"},"dependencies":{"bike":"*","express":"*","flatiron":"0.x.x","underscore":"1.x.x","underscore.string":"2.x.x","async":"0.x.x","moment":"1.x.x"},"devDependencies":{"wrench":"*","dox":"*","mocha":"*","should":"*"},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"behere":"./bin/behere"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"behere@0.2.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"98b1c45458e82620cc85a1a6374efd2a420eec91","tarball":"http://registry.npmjs.org/behere/-/behere-0.2.2.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]}},"readme":"\r\n  Easy programmy for [node](http://nodejs.org).\r\n\r\n## Installation\r\n\r\n    $ npm install behere\r\n\r\n## Quick Start\r\n\r\n ...\r\n\r\n## Features\r\n\r\n  * ...\r\n\r\n## Running Tests\r\n\r\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\r\n\r\n    $ npm install\r\n\r\nthen run the tests:\r\n\r\n    $ make test\r\n\r\n## Contributors\r\n\r\n```\r\nGabriele Di Stefano <gabriele.ds@gmail.com>\r\n```\r\n\r\n## License \r\n\r\n(The MIT License)\r\n\r\nCopyright (c) 2012 Gabriele Di Stefano &lt;gabriele.ds@gmail.com&gt;\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"time":{"modified":"2012-07-03T22:52:34.069Z","created":"2012-04-16T23:13:22.409Z","0.0.1":"2012-04-16T23:13:24.215Z","0.2.0":"2012-05-06T16:55:35.299Z","0.2.1":"2012-07-02T23:25:51.821Z","0.2.2":"2012-07-03T22:52:34.069Z"},"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"repository":{"type":"git","url":"git://github.com/behere/behere.git"},"_attachments":{"behere-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-DZe4xOudheHc4Egd035pRw==","length":28357,"stub":true},"behere-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yfA1xErQC62Qna1co/VH6w==","length":28351,"stub":true},"behere-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1PbbmFgWZWqpf1mN8WZgfg==","length":12158,"stub":true},"behere-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+ys3wLtsNhE9u6VpsFPB7g==","length":10252,"stub":true}}}},
{"id":"bejesus-api","key":"bejesus-api","value":{"rev":"11-6b42f8ffc370c494d01481b64536e91e"},"doc":{"_id":"bejesus-api","_rev":"11-6b42f8ffc370c494d01481b64536e91e","name":"bejesus-api","description":"A module to allow interaction with the http://bejes.us/ platform.","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"bejesus-api","description":"A module to allow interaction with the http://bejes.us/ platform.","version":"0.0.1","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"engines":{"node":"*"},"dependencies":{"request":"*"},"main":"./bejesus","_id":"bejesus-api@0.0.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"85d597197db7678440cd2ffc5313d1e619af4fb6","tarball":"http://registry.npmjs.org/bejesus-api/-/bejesus-api-0.0.1.tgz"}},"0.0.2":{"name":"bejesus-api","description":"A module to allow interaction with the http://bejes.us/ platform.","version":"0.0.2","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"engines":{"node":"*"},"dependencies":{"request":"*"},"main":"./bejesus","_id":"bejesus-api@0.0.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3b4ca3236187d129b89c6ad60fb8dbda64eb8d46","tarball":"http://registry.npmjs.org/bejesus-api/-/bejesus-api-0.0.2.tgz"}},"0.0.3":{"name":"bejesus-api","description":"A module to allow interaction with the http://bejes.us/ platform.","version":"0.0.3","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"engines":{"node":"*"},"dependencies":{"request":"*"},"main":"./bejesus","_id":"bejesus-api@0.0.3","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fec9ec198cb382b3bdb5664330e1d66228ce7b49","tarball":"http://registry.npmjs.org/bejesus-api/-/bejesus-api-0.0.3.tgz"}},"0.1.0":{"name":"bejesus-api","description":"A module to allow interaction with the http://bejes.us/ platform.","version":"0.1.0","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"engines":{"node":"*"},"dependencies":{"request":"*"},"main":"./bejesus","_id":"bejesus-api@0.1.0","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7aabb907249ebb661b36d9e735061e7911541d2b","tarball":"http://registry.npmjs.org/bejesus-api/-/bejesus-api-0.1.0.tgz"}},"0.1.1":{"name":"bejesus-api","description":"A module to allow interaction with the http://bejes.us/ platform.","version":"0.1.1","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"engines":{"node":"*"},"dependencies":{"request":"*"},"main":"./bejesus","_id":"bejesus-api@0.1.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"533dfe6441980cfd81e597f172f1501957461371","tarball":"http://registry.npmjs.org/bejesus-api/-/bejesus-api-0.1.1.tgz"}}},"maintainers":[{"name":"DanBUK","email":"dan@f-box.org"}],"time":{"modified":"2011-01-31T11:38:23.354Z","created":"2011-01-29T20:16:32.149Z","0.0.1":"2011-01-29T20:16:32.563Z","0.0.2":"2011-01-30T12:21:24.653Z","0.0.3":"2011-01-30T12:22:02.253Z","0.1.0":"2011-01-31T07:57:25.427Z","0.1.1":"2011-01-31T11:38:23.354Z"},"author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"repository":"git://github.com/DanBUK/bejesus-api.git","_attachments":{"bejesus-api-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Ctx296mggGO1LrjetjDpIA==","length":1504,"stub":true},"bejesus-api-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-EChsVKbfJylLP/6qn4fr9w==","length":1493,"stub":true},"bejesus-api-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EVtfpQBBR9EAQDW4cDz1qA==","length":1215,"stub":true},"bejesus-api-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wUJHG1tacdYTaDADuFid/g==","length":1216,"stub":true},"bejesus-api-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/8txyRf5uJTGvzAxfbj92w==","length":1196,"stub":true}}}},
{"id":"bejesus-cli","key":"bejesus-cli","value":{"rev":"31-5fbbfe5ec1f6a0a7a3fafdf69230434a"},"doc":{"_id":"bejesus-cli","_rev":"31-5fbbfe5ec1f6a0a7a3fafdf69230434a","name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","dist-tags":{"latest":"0.2.4"},"versions":{"0.0.1":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.0.1","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"bejesus-api":"0.0.1"},"_id":"bejesus-cli@0.0.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"80193f6815adbe82122f53e479b5af9dfc900855","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.0.1.tgz"}},"0.0.2":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.0.2","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"bejesus-api":"0.0.1"},"_id":"bejesus-cli@0.0.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"de66a9a18342c05a438f499069a917c5b42d29cf","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.0.2.tgz"}},"0.0.3":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.0.3","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"bejesus-api":"0.0.3"},"_id":"bejesus-cli@0.0.3","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"594cc8f1b617d55a858af8de094ee8bb05de61d2","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.0.3.tgz"}},"0.1.0":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.0","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"bejesus-api":"0.1.0"},"_id":"bejesus-cli@0.1.0","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"34fb8c71ba088234e94df3479f79278c7caecdbe","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.0.tgz"}},"0.1.1":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.1","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"bejesus-api":"0.1.1"},"_id":"bejesus-cli@0.1.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0b92065fab5dba4a40ea749d3a9c1d88469362bb","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.1.tgz"}},"0.1.2":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.2","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.0"},"_id":"bejesus-cli@0.1.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b63a533877ce935bd54b47b4e05133d0fa90e485","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.2.tgz"}},"0.1.3":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.3","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.1"},"_id":"bejesus-cli@0.1.3","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4e6e2f42722fd74e53e46e47db2d9ee57af3dfdf","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.3.tgz"}},"0.1.4":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.4","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.2"},"_id":"bejesus-cli@0.1.4","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2be53a1c1241e7a0c2f40272a6efa27df921a180","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.4.tgz"}},"0.1.5":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.5","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.3"},"_id":"bejesus-cli@0.1.5","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"53c2190181a9e623a28df00354e6a953f958e6c0","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.5.tgz"}},"0.1.6":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.6","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.4"},"_id":"bejesus-cli@0.1.6","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"140ea0e1dfb01683eefc5bd7f7364ef35a1fcf57","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.6.tgz"}},"0.1.7":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.1.7","homepage":"http://bejes.us/","repository":"git://github.com/DanBUK/bejesus-api.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/bejesus.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.4"},"_id":"bejesus-cli@0.1.7","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4e045a4f252c60dcb158e41ef5603ecfe9080199","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.1.7.tgz"}},"0.2.0":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.2.0","homepage":"http://bejes.us/","repository":"git://github.com/nodester/nodester-cli.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/nodester.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.4","colors":"0.3.0","iniparser":"1.0.1"},"_id":"bejesus-cli@0.2.0","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"lib":"./lib","bin":"./bin"},"modules":{"app.js":"lib/app.js","appdomain.js":"lib/appdomain.js","apps.js":"lib/apps.js","config.js":"lib/config.js","coupon.js":"lib/coupon.js","log.js":"lib/log.js","npm.js":"lib/npm.js","status.js":"lib/status.js","user.js":"lib/user.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c03666518c4e01313d6368898936d7b2ea0e6568","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.2.0.tgz"}},"0.2.1":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.2.1","homepage":"http://bejes.us/","repository":"git://github.com/nodester/nodester-cli.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/nodester.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.5","colors":"0.3.0","iniparser":"1.0.1"},"_id":"bejesus-cli@0.2.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.5","directories":{"lib":"./lib","bin":"./bin"},"modules":{"app.js":"lib/app.js","appdomain.js":"lib/appdomain.js","apps.js":"lib/apps.js","config.js":"lib/config.js","coupon.js":"lib/coupon.js","log.js":"lib/log.js","npm.js":"lib/npm.js","status.js":"lib/status.js","user.js":"lib/user.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"059a2a63354fa8c5e33c7be57d0861d5dc62ce3e","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.2.1.tgz"}},"0.2.3":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.2.3","homepage":"http://bejes.us/","repository":"git://github.com/nodester/nodester-cli.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/nodester.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.5","colors":"0.3.0","iniparser":"1.0.1"},"_id":"bejesus-cli@0.2.3","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"72cc581dde6e996721c53300adc6680ee97acb84","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.2.3.tgz"}},"0.2.4":{"name":"bejesus-cli","description":"A CLI tool to allow interaction with the http://bejes.us/ platform.","version":"0.2.4","homepage":"http://bejes.us/","repository":"git://github.com/nodester/nodester-cli.git","author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"bin":{"bejesus":"bin/nodester.js"},"engines":{"node":"*"},"dependencies":{"nodester-api":"0.1.5","colors":"0.3.0","iniparser":"1.0.1"},"_id":"bejesus-cli@0.2.4","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","directories":{"lib":"./lib","bin":"./bin"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"30d1a1f2aa60ada2cbeccd480e02837a19ef1a99","tarball":"http://registry.npmjs.org/bejesus-cli/-/bejesus-cli-0.2.4.tgz"}}},"maintainers":[{"name":"DanBUK","email":"dan@f-box.org"}],"time":{"modified":"2011-02-14T15:56:41.561Z","created":"2011-01-29T20:16:37.127Z","0.0.1":"2011-01-29T20:16:37.764Z","0.0.2":"2011-01-29T21:55:25.491Z","0.0.3":"2011-01-30T12:21:27.990Z","0.1.0":"2011-01-31T07:57:29.930Z","0.1.1":"2011-01-31T11:38:26.970Z","0.1.2":"2011-02-01T13:31:08.382Z","0.1.3":"2011-02-01T13:49:05.032Z","0.1.4":"2011-02-03T15:41:23.687Z","0.1.5":"2011-02-05T20:51:11.686Z","0.1.6":"2011-02-06T20:41:21.536Z","0.1.7":"2011-02-08T13:07:13.471Z","0.2.0":"2011-02-12T17:52:35.225Z","0.2.1":"2011-02-13T11:59:04.405Z","0.2.3":"2011-02-14T11:41:31.104Z","0.2.4":"2011-02-14T15:56:41.561Z"},"author":{"name":"Daniel Bartlett","email":"dan@f-box.org","url":"http://danb-uk.net/"},"repository":"git://github.com/nodester/nodester-cli.git","_attachments":{"bejesus-cli-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-0SJlyJK3485YIZ+98lloMA==","length":6784,"stub":true},"bejesus-cli-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-gYSzn0plWZTDISKuahrcMQ==","length":6775,"stub":true},"bejesus-cli-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-U4G+9vSl0JomSttqbAjm9Q==","length":6471,"stub":true},"bejesus-cli-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-IgK0jdxzyrbVtoYfUAPbAg==","length":6545,"stub":true},"bejesus-cli-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-zC07QyXHrkMy0MiAaDVGuQ==","length":4466,"stub":true},"bejesus-cli-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-wNsIsw5eWNLujfE2vrL5Tg==","length":4473,"stub":true},"bejesus-cli-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-FrAgNSYuiizJ0iA1iZud6w==","length":4453,"stub":true},"bejesus-cli-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-lJ9UaqwpASxXM0WXVLqixw==","length":4343,"stub":true},"bejesus-cli-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-z0FGKqetIQHQ0IYP7Oix9A==","length":4216,"stub":true},"bejesus-cli-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-LbMLmwDs9ZKKQQp5EsuqwQ==","length":4221,"stub":true},"bejesus-cli-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-RV20ffZ29z3Gfw1WdhNvRw==","length":3970,"stub":true},"bejesus-cli-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-rrhZLxqgrwwW5JsHx0THwg==","length":3962,"stub":true},"bejesus-cli-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-uGV8MY/9vXVDPrsKz1UiZA==","length":3236,"stub":true},"bejesus-cli-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-R+0UaOJ+9AEJYcleAzz6tA==","length":3212,"stub":true},"bejesus-cli-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YNZW5DVsKLRhpOI1ZREJJw==","length":3187,"stub":true}}}},
{"id":"belt","key":"belt","value":{"rev":"13-1853d95e51290377f2dede2a60133e73"},"doc":{"_id":"belt","_rev":"13-1853d95e51290377f2dede2a60133e73","name":"belt","description":"NodeJS Utility (belt) Functions","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"belt","description":"NodeJS Utility (belt) Functions","version":"0.0.1","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"keywords":["utility","helper","methods","mixin","clone"],"main":"./lib/belt","engines":{"node":">= 0.4.11 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.5.13","should":"0.3.2"},"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"belt@0.0.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"2bbc0d5eb4bbd6ada54139e9623c22487ec5f592","tarball":"http://registry.npmjs.org/belt/-/belt-0.0.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]},"0.0.2":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"belt","description":"NodeJS Utility (belt) Functions","version":"0.0.2","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"keywords":["utility","helper","methods","mixin","clone"],"main":"./lib/belt","engines":{"node":">= 0.4.11 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.5.13","should":"0.3.2"},"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"belt@0.0.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e7fec92cd79903b143f386c7985794b873d66f7b","tarball":"http://registry.npmjs.org/belt/-/belt-0.0.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]},"0.0.3":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"belt","description":"NodeJS Utility (belt) Functions","version":"0.0.3","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"keywords":["utility","helper","methods","mixin","clone"],"main":"./lib/belt","engines":{"node":">= 0.4.11 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.5.13","should":"0.3.2"},"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"belt@0.0.3","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"2f6ca5acda53e67ebdb25bde04e63be38a2564b2","tarball":"http://registry.npmjs.org/belt/-/belt-0.0.3.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]},"0.0.4":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"belt","description":"NodeJS Utility (belt) Functions","version":"0.0.4","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"keywords":["utility","helper","methods","mixin","clone"],"main":"./lib/belt","engines":{"node":">= 0.4.11 < 0.7.0"},"dependencies":{},"devDependencies":{"vows":"0.5.13","should":"0.3.2"},"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"belt@0.0.4","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"cdb76fef23a32617f74563cb3c0eb2ab40208cdd","tarball":"http://registry.npmjs.org/belt/-/belt-0.0.4.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]},"0.0.5":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"belt","description":"NodeJS Utility (belt) Functions","version":"0.0.5","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"keywords":["utility","helper","methods","mixin","clone"],"main":"./lib/belt","engines":{"node":">= 0.4.11 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.5.13"},"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"belt@0.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7ed0ecacc753113e08010848004e0735a85220c2","tarball":"http://registry.npmjs.org/belt/-/belt-0.0.5.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]},"0.0.6":{"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"name":"belt","description":"NodeJS Utility (belt) Functions","version":"0.0.6","repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"keywords":["utility","helper","methods","mixin","clone"],"main":"./lib/belt","engines":{"node":">= 0.4.11 < 0.8.0"},"dependencies":{},"devDependencies":{"vows":"0.5.13"},"scripts":{"test":"vows test/*.test.js --spec"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"belt@0.0.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7e579a8fbf8bb64a405e9920a54e76ff9a69540d","tarball":"http://registry.npmjs.org/belt/-/belt-0.0.6.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}]}},"readme":"\n\n# Belt - NodeJS Utility (belt) Functions\n\n### Installation\n\n```bash\n$ npm install belt\n```\n\n### Example Code\n\n```javascript\n\nvar belt = require('belt');\n\n/* EOF */\n```\n","maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"time":{"modified":"2011-12-23T23:15:59.765Z","created":"2011-12-01T14:56:31.440Z","0.0.1":"2011-12-01T14:56:32.784Z","0.0.2":"2011-12-01T15:10:00.927Z","0.0.3":"2011-12-01T15:25:01.482Z","0.0.4":"2011-12-02T14:48:21.157Z","0.0.5":"2011-12-23T21:58:44.713Z","0.0.6":"2011-12-23T23:15:59.765Z"},"author":{"name":"Edward Hotchkiss","email":"e@ingk.com"},"repository":{"type":"git","url":"git://github.com/edwardhotchkiss/belt.git"},"_attachments":{"belt-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-qolR9ePKuI4fAkbHHWDUUw==","length":10240,"stub":true},"belt-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ayw3ifdfNckv7ohR+bxyxA==","length":10240,"stub":true},"belt-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Yyaw2ro2Sp5oVS5D46fDXg==","length":10240,"stub":true},"belt-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-wKSI7aZZ7PoNkZnDteV+Lw==","length":10240,"stub":true},"belt-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BDK0OrJtW7DcBhfQMFYAAQ==","length":10240,"stub":true},"belt-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0JU4MGoX9ZIcg4C4Jicaew==","length":10240,"stub":true}}}},
{"id":"beluga","key":"beluga","value":{"rev":"3-d73dfb1d7cb213158b39f0df3d288f30"},"doc":{"_id":"beluga","_rev":"3-d73dfb1d7cb213158b39f0df3d288f30","name":"beluga","description":"CoffeeScript/JavaScript module generator with Jasmine","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"beluga","description":"CoffeeScript/JavaScript module generator with Jasmine","version":"0.0.2","repository":{"type":"git","url":"git@github.com:kapadia/beluga.git"},"author":{"name":"Amit Kapadia","email":"amit@zooniverse.org"},"bin":{"beluga":"./bin/beluga"},"engines":{"node":"*"},"dependencies":{"coffee-script":"~1.2.0","hem":"~0.1.8"},"_npmUser":{"name":"akapadia","email":"amit@zooniverse.org"},"_id":"beluga@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"533e21ca2306acf5161a864d64cdd2c754e8b48d","tarball":"http://registry.npmjs.org/beluga/-/beluga-0.0.2.tgz"},"maintainers":[{"name":"akapadia","email":"amit@zooniverse.org"}]}},"readme":"##Introduction\n\nEasily generate [CoffeeScript](http://jashkenas.github.com/coffee-script) module scaffold utilizing the the [Jasmine](http://pivotal.github.com/jasmine/) testing suite.\n\n##¿Por qué\n\nBecause I needed to run Jasmine tests from a local server since they included XHR calls.  Crazy cross domain restrictions ...\n\n##Usage\n\nFirst install [npm](http://npmjs.org/). If you don't already have [npm](http://npmjs.org/) or [NodeJS](http://nodejs.org/) you'll need to install them first.  These days npm comes bundled in the NodeJS installation.\n\nSoon this will be registered with npm, and you'll be able to run the following:\n\n    $ npm install -g beluga\n\nUntil then, clone this repo and run the following:\n\n    $ npm install -g .\n\nNow you can generate a CoffeeScript module structure:\n\n    $ beluga module my_module\n    \nwhich produces the following directory structure:\n\n    my_module/Cakefile\n    my_module/lib\n    my_module/lib/.gitkeep\n    my_module/package.json\n    my_module/README.md\n    my_module/slug.json\n    my_module/src\n    my_module/src/.gitkeep\n    my_module/test\n    my_module/test/public\n    my_module/test/public/index.html\n    my_module/test/public/lib\n    my_module/test/public/lib/jasmine.css\n    my_module/test/public/lib/jasmine.html.js\n    my_module/test/public/lib/jasmine.js\n    my_module/test/specs\n    my_module/test/specs/.gitkeep\n    my_module/src/my_module.coffee\n    my_module/test/specs/my_module.coffee\n\nNavigate to your module, and install it's npm dependencies:\n    \n    $ cd my_module\n    $ npm install .\n    \nThese will be exported locally in the `./npm_modules` folder. Now, install [Hem](http://github.com/maccman/hem), which will be in charge or bundling the module.\n\n    $ npm install -g hem\n    \nAnd to serve our module up:\n    \n    $ hem server\n    \nThis will boot up an server on port [9294](http://localhost:9294) and run the Jasmine test for your module.\n\nYou can generate additional classes with the following syntax:\n    \n    $ beluga class MyClass\n    \n###Acknowledgement\n\nHeavily, heavily borrowed from [Spine.app](https://github.com/maccman/spine.app)\n","maintainers":[{"name":"akapadia","email":"amit@zooniverse.org"}],"time":{"modified":"2012-05-22T04:38:09.752Z","created":"2012-05-22T04:38:09.158Z","0.0.2":"2012-05-22T04:38:09.752Z"},"author":{"name":"Amit Kapadia","email":"amit@zooniverse.org"},"repository":{"type":"git","url":"git@github.com:kapadia/beluga.git"},"_attachments":{"beluga-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-X0X8+mXBFSWlnnPeytTqCQ==","length":20989,"stub":true}}}},
{"id":"bem","key":"bem","value":{"rev":"133-a3c7078a1e83fda040df6b587f28130e"},"doc":{"_id":"bem","_rev":"133-a3c7078a1e83fda040df6b587f28130e","name":"bem","description":"BEM Tools","dist-tags":{"latest":"0.4.2","stable":"0.2.5","unstable":"0.5.13"},"versions":{"0.0.4":{"name":"bem","description":"BEM Tools","version":"0.0.4","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"contributors":[],"repository":{"type":"git","url":"http://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.4","_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"995dc4381cab282490c266ab95dbb60259376e1c","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.4.tgz"}},"0.0.5":{"name":"bem","description":"BEM Tools","version":"0.0.5","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.5","_engineSupported":true,"_npmVersion":"0.3.12","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"443f7a9ebece6b46ca3de8555768c22bde08d620","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.5.tgz"}},"0.0.6":{"name":"bem","description":"BEM Tools","version":"0.0.6","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.6","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"70899486cc99051cf8688379f87e5515a5b0553a","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.6.tgz"}},"0.0.7":{"name":"bem","description":"BEM Tools","version":"0.0.7","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.7","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c0a26a8e8da84bd8737b6b0b4ef8c19ff0d6dd03","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.7.tgz"}},"0.0.8":{"name":"bem","description":"BEM Tools","version":"0.0.8","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.8","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"001b0225290d7bafec2d2d34542ec496ab779e8c","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.8.tgz"}},"0.0.9":{"name":"bem","description":"BEM Tools","version":"0.0.9","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.9","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"987bc246508852b54cb2f201023008df883a2792","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.9.tgz"}},"0.0.10":{"name":"bem","description":"BEM Tools","version":"0.0.10","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_npmJsonOpts":{"file":"/Users/arikon/.npm/bem/0.0.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bem@0.0.10","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2f01bd3c79f830abb95ef6e5f7609f808b9bda43","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.10.tgz"},"scripts":{}},"0.0.11":{"name":"bem","description":"BEM Tools","version":"0.0.11","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_npmJsonOpts":{"file":"/Users/arikon/.npm/bem/0.0.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bem@0.0.11","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c0dffef81f8be8ab1a4aaadf313f6ce429202f3a","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.11.tgz"},"scripts":{}},"0.0.12":{"name":"bem","description":"BEM Tools","version":"0.0.12","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib","bin":"./bin"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"bem@0.0.12","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.11","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"604292db14a3383ce39abd21860b46f80afad218","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.12.tgz"}},"0.0.13":{"name":"bem","description":"BEM Tools","version":"0.0.13","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_npmJsonOpts":{"file":"/Users/arikon/.npm/bem/0.0.13/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bem@0.0.13","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6015b4e6dcf44f3413b17728655dd4a7db7ca90f","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.13.tgz"}},"0.0.14":{"name":"bem","description":"BEM Tools","version":"0.0.14","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_npmJsonOpts":{"file":"/Users/arikon/.npm/bem/0.0.14/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bem@0.0.14","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8471bb27b112df2569eb694a1481cb2d58275de9","tarball":"http://registry.npmjs.org/bem/-/bem-0.0.14.tgz"}},"0.1.0":{"name":"bem","description":"BEM Tools","version":"0.1.0","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","inherit":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.1.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2b6add22f37b787d3da500f783e45e25c3d7063e","tarball":"http://registry.npmjs.org/bem/-/bem-0.1.0.tgz"}},"0.1.1":{"name":"bem","description":"BEM Tools","version":"0.1.1","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[],"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","inherit":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.1.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a1f8d94868b6a8c4e452f8daca157af57aabfcd5","tarball":"http://registry.npmjs.org/bem/-/bem-0.1.1.tgz"}},"0.1.2":{"name":"bem","description":"BEM Tools","version":"0.1.2","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","inherit":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.1.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f31e27f20838e2425f028caf67dc6201190cbb7e","tarball":"http://registry.npmjs.org/bem/-/bem-0.1.2.tgz"}},"0.1.3":{"name":"bem","description":"BEM Tools","version":"0.1.3","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","inherit":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"00ebbafc46670bbc91a30fda6b384189b2a27762","tarball":"http://registry.npmjs.org/bem/-/bem-0.1.3.tgz"}},"0.1.4":{"name":"bem","description":"BEM Tools","version":"0.1.4","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","inherit":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},"_id":"bem@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"64daa8f30cf8cfdf825ab0bec932c3bc46eb3256","tarball":"http://registry.npmjs.org/bem/-/bem-0.1.4.tgz"}},"0.2.0":{"name":"bem","description":"BEM Tools","version":"0.2.0","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","qq":">= 0.3.3","q-wrap":">= 0.0.1","inherit":">= 1.0.0","extend":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f95e9d35abe5f5c2e012bf3d05287f84a065d508","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.0.tgz"}},"0.2.1":{"name":"bem","description":"BEM Tools","version":"0.2.1","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":">= 0.1.1","q":">= 0.7.1","qq":">= 0.3.3","q-wrap":">= 0.0.1","inherit":">= 1.0.0","extend":">= 1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"44983e2311c752d065d8b253c2b3a9dc364ae506","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.1.tgz"}},"0.2.2":{"name":"bem","description":"BEM Tools","version":"0.2.2","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.1","qq":"~0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","extend":"~1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2ad20fe681b428be0fe840b17e436a9e906451d7","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.2.tgz"}},"0.2.3":{"name":"bem","description":"BEM Tools","version":"0.2.3","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.1","qq":"~0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","extend":"~1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9b24fda704c1965176a99848e7a7bb601bdcaf5f","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.3.tgz"}},"0.2.4":{"name":"bem","description":"BEM Tools","version":"0.2.4","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.1","qq":"~0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","extend":"~1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.4","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"756e674cc9a61cf0a9ba9040b57be5573971508f","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.4.tgz"},"readme":"# Bem tools\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[xjst](https://github.com/veged/xjst) or [ometajs](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand ( ensure that you have bash-completion installed, first ). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that hold blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n"},"0.2.5":{"name":"bem","description":"BEM Tools","version":"0.2.5","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.5","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"a65d1006c53cda8014d25c1d59ca0f89dd23b656","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.5.tgz"},"readme":"# Bem tools\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[xjst](https://github.com/veged/xjst) or [ometajs](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand ( ensure that you have bash-completion installed, first ). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that hold blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n"},"0.2.6":{"name":"bem","description":"BEM Tools","version":"0.2.6","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.2.6","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"9510669f7416dcf46eb4994f46c7cee554c90eec","tarball":"http://registry.npmjs.org/bem/-/bem-0.2.6.tgz"},"readme":"# Bem tools\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[xjst](https://github.com/veged/xjst) or [ometajs](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand ( ensure that you have bash-completion installed, first ). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that hold blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n"},"0.3.0":{"name":"bem","description":"BEM Tools","version":"0.3.0","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","borschik":"~0.0.6"},"devDependencies":{"vows":"~0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.3.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"67f4bfe951a6af9d7e2ca600c677b55c7f8fff15","tarball":"http://registry.npmjs.org/bem/-/bem-0.3.0.tgz"},"readme":"# Bem tools\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[xjst](https://github.com/veged/xjst) or [ometajs](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand ( ensure that you have bash-completion installed, first ). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that hold blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the --project (-r) parameter. So if you have\npages/about/main.css file in the project folder it will be accessible with a browser using\nhttp://localhost:8080/pages/about/main.css URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the --port (-p) parameter.\n\nWhen the server gets a request for some *.html file it will look for appropriate BEMJOSN and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the *.html file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, index.bemhtml.js and index.bemjson.js are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n"},"0.3.1":{"name":"bem","description":"BEM Tools","version":"0.3.1","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","borschik":"0.0.6"},"devDependencies":{"vows":">= 0.5.11"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"scf","email":"scf2k@yandex.ru"},"_id":"bem@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d0b8a22d7d96942f971de7b2d9e3cc1c5da0469a","tarball":"http://registry.npmjs.org/bem/-/bem-0.3.1.tgz"}},"0.3.2":{"name":"bem","description":"BEM Tools","version":"0.3.2","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","borschik":"~0.0.7"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"scf","email":"scf2k@yandex.ru"},"_id":"bem@0.3.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1e283d9a5c4fdf68028a1287c28a24f714cd7c9d","tarball":"http://registry.npmjs.org/bem/-/bem-0.3.2.tgz"}},"0.4.0":{"name":"bem","description":"BEM Tools","version":"0.4.0","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","borschik":"~0.0.7"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"scf","email":"scf2k@yandex.ru"},"_id":"bem@0.4.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"64c15bb2917716539bcca029a8c40ea13404cac1","tarball":"http://registry.npmjs.org/bem/-/bem-0.4.0.tgz"}},"0.5.0":{"name":"bem","description":"BEM Tools","version":"0.5.0","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.8","apw":"~0.2.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"7dbbe30bf0070f1ae623f6a6a185210d049dbce4","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.0.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.1":{"name":"bem","description":"BEM Tools","version":"0.5.1","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.8","apw":"~0.2.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"184882bc3c31954d27e6553efc8d78b66856bf8b","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.1.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.2":{"name":"bem","description":"BEM Tools","version":"0.5.2","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.8","apw":"~0.2.0","winston":">= 0.5.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"52e414de7454c3b02537cc4240c5bfb358209b1e","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.2.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.3":{"name":"bem","description":"BEM Tools","version":"0.5.3","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.8","apw":"~0.2.0","winston":">= 0.5.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"718288264554ae56e3b8fbe5843be0902e7d4086","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.3.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.4":{"name":"bem","description":"BEM Tools","version":"0.5.4","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.8","apw":"~0.3.0","winston":">= 0.5.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"510f4790408134c0369993fd8726ff3740598e12","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.4.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.5":{"name":"bem","description":"BEM Tools","version":"0.5.5","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.8","apw":"~0.3.1","winston":">= 0.5.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.6.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7174d68e8d0ae922f00e21ece1a357a7a3072f54","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.5.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.6":{"name":"bem","description":"BEM Tools","version":"0.5.6","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.2","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","borschik":"~0.0.9","apw":"~0.3.1","winston":">= 0.5.0"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.6.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"78822f13dbc8b6d735a961d65780b2a5505eb625","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.6.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.4.1":{"name":"bem","description":"BEM Tools","version":"0.4.1","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","borschik":"~0.0.7"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.4.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7448f56ab9e3a716b5cf4de5a62cd54177bee277","tarball":"http://registry.npmjs.org/bem/-/bem-0.4.1.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJOSN and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.4.2":{"name":"bem","description":"BEM Tools","version":"0.4.2","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/bem.js","dependencies":{"coa":"~0.3.2","q":"~0.7.2","qq":"0.3.3","q-wrap":"~0.0.1","inherit":"~1.0.0","borschik":"~0.0.9"},"devDependencies":{"vows":"~0.6.2"},"scripts":{"test":"./node_modules/.bin/vows --spec"},"engines":{"node":">= 0.4.0 <0.7.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.4.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"9116376e0ecd90ff4a5f1e958399bde51e4c0bd7","tarball":"http://registry.npmjs.org/bem/-/bem-0.4.2.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\nbem-bl block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level -l bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a directory that holds block's implementation, some files with different\ntechnologies.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJOSN and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.7":{"name":"bem","description":"BEM Tools","version":"0.5.7","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.10","apw":"~0.3.2","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0"},"devDependencies":{"mocha":"~1.0.0","chai":"~1.0.3"},"scripts":{"test":"./node_modules/.bin/mocha"},"engines":{"node":">= 0.6.0"},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2139f60607f654f1b35e44e69b0a6c54234e9f14","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.7.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.8":{"name":"bem","description":"BEM Tools","version":"0.5.8","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.10","apw":"~0.3.2","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0"},"devDependencies":{"mocha":"~1.0.0","chai":"~1.0.3"},"scripts":{"test":"./node_modules/.bin/mocha"},"engines":{"node":">= 0.6.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.8","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"95175ba31949d10f96ef5c522fe8b4eb0d79889c","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.8.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.9":{"name":"bem","description":"BEM Tools","version":"0.5.9","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.2","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.10","apw":"~0.3.2","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0"},"devDependencies":{"mocha":"~1.0.0","chai":"~1.0.3"},"scripts":{"test":"./node_modules/.bin/mocha"},"engines":{"node":">= 0.6.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.9","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"12da3fd177a691841073507c0066bffbad278ded","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.9.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.10":{"name":"bem","description":"BEM Tools","version":"0.5.10","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"main":"./lib/index","dependencies":{"coa":"~0.3.5","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.13","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.10","apw":"~0.3.4","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0"},"devDependencies":{"mocha":"~1.0.0","chai":"~1.0.3"},"scripts":{"test":"./node_modules/.bin/mocha"},"engines":{"node":">= 0.6.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.10","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4d4eabfb62c37f1fb3b2d6c669f9d2fb39021159","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.10.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.4.x](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometajs).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `levelDir` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `levelDir` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `levelDir` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.11":{"name":"bem","description":"BEM Tools","version":"0.5.11","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"dependencies":{"coa":"~0.3.5","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.14","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.10","apw":"~0.3.5","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0","dom-js":"*"},"devDependencies":{"mocha-coverjs":"*","mocha":"~1.3.0","chai":"~1.0.3","coverjs":">= 0.0.7-alpha"},"scripts":{"test":"make test","test-cover":"make test-cover"},"engines":{"node":">= 0.6.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.11","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.20","_defaultsLoaded":true,"dist":{"shasum":"0f83946106b1021acd66a4b940dc84c88aa453dd","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.11.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.6+](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometa-js).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `level` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `level` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `level` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n## Contribute to development \n\n### Executing autotests \n\nTo verify that your changes do not break existing functionality we recommend to run autotests and check that all of them pass. You can do that by executing the following command in the root of the project:\n\n    mocha \n\n### Running autotests with test coverage report\n\nYou can check the level of the code coverage by tests using the command: \n\n    make test-cover\n\nThen open coverage.html file in a browser. Code lines which have not been executed during the tests run will be marked red.\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.12":{"name":"bem","description":"BEM Tools","version":"0.5.12","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"dependencies":{"coa":"~0.3.5","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.14","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.11","apw":"~0.3.5","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0","dom-js":"*"},"devDependencies":{"mocha-coverjs":"*","mocha":"~1.3.0","chai":"~1.0.3","coverjs":">= 0.0.7-alpha"},"scripts":{"test":"make test","test-cover":"make test-cover"},"engines":{"node":">= 0.6.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"bem@0.5.12","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.20","_defaultsLoaded":true,"dist":{"shasum":"1930bb0b6371792b7719bfdfffb4dbe66e8a562c","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.12.tgz"},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.6+](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometa-js).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/nodejs/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `level` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `level` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `level` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n## Contribute to development \n\n### Executing autotests \n\nTo verify that your changes do not break existing functionality we recommend to run autotests and check that all of them pass. You can do that by executing the following command in the root of the project:\n\n    mocha \n\n### Running autotests with test coverage report\n\nYou can check the level of the code coverage by tests using the command: \n\n    make test-cover\n\nThen open coverage.html file in a browser. Code lines which have not been executed during the tests run will be marked red.\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n"},"0.5.13":{"name":"bem","description":"BEM Tools","version":"0.5.13","homepage":"http://github.com/bem/bem-tools","author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"contributors":[{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},{"name":"Sergey Belov","email":"peimei@ya.ru","url":"http://github.com/arikon"},{"name":"Varvara Stepanova","email":"toivonen@toivonen.ru","url":"http://github.com/toivonen"},{"name":"Vladimir Alaev","email":"scf2k4@gmail.com","url":"http://github.com/scf2k"}],"bugs":{"url":"http://github.com/bem/bem-tools/issues"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"directories":{"lib":"./lib"},"bin":{"bem":"./bin/bem"},"dependencies":{"coa":"~0.3.5","q":"~0.8.5","qq":"~0.3.4","q-fs":"0.1","q-http":"~0.1.14","mime":"~1.2.5","underscore":"~1.3.1","inherit":"~1.0.0","xjst":"0.2.21","ometajs":"~2.1.10","borschik":"~0.0.11","apw":"~0.3.5","winston":">= 0.5.0","memorystream":">= 0.1.1","csso":"~1.2.14","uglify-js":"~1.3.0","dom-js":"*"},"devDependencies":{"mocha-coverjs":"*","mocha":"~1.3.0","chai":"~1.0.3","coverjs":">= 0.0.7-alpha"},"scripts":{"test":"make test","test-cover":"make test-cover"},"engines":{"node":">= 0.6.0"},"npm2debian":{"bash-completion":{"bem":{"script":"./bin/bem completion"}}},"licenses":[{"type":"AS IS"}],"preferGlobal":true,"publishConfig":{"tag":"unstable"},"optionalDependencies":{},"readme":"# BEM Tools [![Build Status](https://secure.travis-ci.org/bem/bem-tools.png?branch=nodejs)](http://travis-ci.org/bem/bem-tools)\nToolkit to work with files based on [BEM methodology](http://bem.github.com/bem-method/pages/beginning/beginning.en.html).\n\n## Installation\nYou need [NodeJS 0.6+](http://nodejs.org/) or later and [npm 1.x](http://npmjs.org/).\n\n * Install [bem-tools](https://github.com/bem/bem-tools)\n\n        sudo npm -g install bem\n\n * Use this command [bem-tools](https://github.com/bem/bem-tools) to install the development version\n\n        sudo npm -g install bem@unstable\n\n### bem-bl\n\nIf you are going to use `bem` with\n[bem-bl](https://github.com/bem/bem-bl) block library, you should also install\n[XJST](https://github.com/veged/xjst) and [OmetaJS](https://github.com/veged/ometa-js).\n\n    sudo npm -g install xjst ometajs\n\n## Usage\nGet the list of commands with `bem --help`.\nTo read about commands and subcommands use `bem COMMAND --help` or `bem COMMAND SUBCOMMAND --help`.\n\n### Shell completion\n\n#### bash\n\nTo make completions for bem-tools available in your bash, run following\ncommand (ensure that you have bash-completion installed, first). Run this\n\n    bem completion > /path/to/etc/bash_completion.d/bem\n\nand restart bash.\n\nIf you aren't using `bash-completion`, you can add `bem completion` to your `.bashrc`:\n\n    bem completion >> ~/.bashrc\n\n#### zsh\n\nIf you use `zsh`, you can add `bem completion` to your `.zshrc`:\n\n    bem completion >> ~/.zshrc\n\nthen restart.\n\n### Commands\n#### bem create\n\nYou can create following entities using `bem create`:\n\n * levels of defenition\n * blocks\n * elements\n * modifiers\n\n##### Level of defenition\n\nLevel of defenition is a directory that holds blocks and an utility directiry `.bem`.\n\nA `.bem` directory holds configuration of a current level:\n\n * naming convention\n * links to the technologies\n\nAn example of technologies' links (this is `blocks-desktop` level of\n`bem-bl` block library):\n\n    https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\n###### Create new level of defenition named `blocks` under current directory:\n\n    bem create level blocks\n\n###### Create a level for pages\n\nIn `bem-tools` terms pages are blocks as well and a directory which holds pages is a level of\ndefenition itself. To create such a directory run this:\n\n    bem create level pages\n\n###### Create a level based on an existing one\n\n`bem create level` allows to use an existing level as a prototype for a level it creates.\n\n    bem create level --level bem-bl/blocks-desktop blocks\n\n##### Block\n\nBlock is a bunch of files in different technologies that hold block's implementation.\n\n###### Create a new block\n\n    bem create block b-my-block\n\nBy default, a block has several techs: (`bemhtml`, `css`, `js`).\n\n###### Create a new block using concrete tech\n\nFlags -t (-T) are to create files of technologies you need:\n\n    bem create block -t deps.js b-my-block\n        // Creates a block implementation in deps.js technology, ecxept of default techs.\n\n    bem create block -T css b-my-block\n        // Creates only CSS technology for a block\n\n    bem create block -T bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js b-my-block\n        // -T flag is useful when you need to add a new tech to the block existed\n\nThe value of this flag may be either tech's name (e.g `css`) or a path to tech module.\n\nTech names may be listed in `.bem/level.js` file of a level.\nE.g., https://github.com/bem/bem-bl/blob/master/blocks-common/.bem/level.js\n\nYou can find the examples of tech modules in the repo:\n\n    https://github.com/bem/bem-tools/tree/nodejs/lib/techs\n\n###### Create element\n\nCreate element named `elem` for block `b-my-block`\n\n    bem create elem -b b-my-block elem\n\n###### Create modifier of block or element\n\nCreate modifier named `mod` for block `b-my-block`\n\n    bem create mod -b b-my-block mod\n\nCreate modifier named `mod` having value `val` for block `b-my-block`\n\n    bem create mod -b b-my-block mod -v val\n\nCreate modifier named `mod` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod\n\nCreate modifier named  `mod` having value `val` for element `elem` of block `b-my-block`\n\n    bem create mod -b b-my-block -e elem mod -v val\n\n###### Create any BEM entity using `bem create` command only\n\nYou can create any BEM entities or bunches of them using `bem create` command.\n\nCreate blocks named `b-block1` and `b-block2`\n\n    bem create -b b-block1 -b b-block2\n\nCreate elements named `elem1` and `elem2` for block `b-block`\n\n    bem create -b b-block -e elem1 -e elem2\n\nCreate modifier names `mod` of block `b-block`\n\n    bem create -b b-block -m mod\n\nCreate modifier named `mod` of block `b-block` having values `val1` and `val2`\n\n    bem create -b b-block -m mod -v val1 -v val2\n\nCreate modifier named `mod` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod\n\nCreate modifier named `mod` having values `val1` and `val2` for element `elem` of block `b-block`\n\n    bem create -b b-block -e elem -m mod -v val1 -v val2\n\n#### bem build\n\n`bem build` command builds page files in different techs, according to a page declaration.\n\n##### Create bemdecl.js file from page's bemjson\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemjson.js -t bemdecl.js \\\n        -o pages/index -n index\n\nYou can use either tech's name or a path to its module as a value of -t flag. This\nmodule says how to build a final file from a declaration.\n\nE.g., this is a module for `deps.js`: https://github.com/bem/bem-tools/blob/nodejs/lib/techs/deps.js.js\n\n##### Create deps.js file from bemdecl.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemdecl.js -t deps.js \\\n        -o pages/index -n index\n\n###### Create js and css files for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t css \\\n        -o pages/index -n index\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.deps.js -t js \\\n        -o pages/index -n index\n\n###### Create bemhtml.js template for a page from deps.js\n\n    bem build \\\n        -l bem-bl/blocks-common -l bem-bl/blocks-desktop \\\n        -l blocks -l pages/index/blocks \\\n        -d pages/index/index.bemhtml.js \\\n        -t bem-bl/blocks-desktop/i-bem/bem/techs/bemhtml.js \\\n        -o pages/index -n index\n\nThere is an example how pages are built using `bem build` in our test project that uses\n`bem-bl` block library: https://github.com/toivonen/bem-bl-test/blob/master/GNUmakefile\n\n#### bem decl\n\n`bem decl` is to work with declaration files. Thus,\n\n * to merge two or more decls into one\n * «subtract» decls\n\nAll subcommands of `bem decl` can take either bemdecl.js or deps.js as input declaration formats.\nas input declaration (via `-d` flag).\n\nOuput data (`-o` flag) is always in `deps.js` format.\n\n##### bem decl merge\n\n`bem decl merge` is to merge two or more decls into one. It is useful if you need, for example, to build\none file for several pages.\n\n###### Create a decl for all the pages\n\n    bem decl merge \\\n        -d pages/index/index.deps.js \\\n        -d pages/about/about.deps.js \\\n        -d pages/search/search.deps.js \\\n        -o pages/common/common.deps.js\n\n##### bem decl subtract\n\n`bem decl subtract` is to «subtract» all next decls from the first one.\nYou may use it to create a bundle that you request by application.\n\n###### Create a decl for a \"heavy\" block requested by application\n\n    bem decl subtract \\\n        -d bundles/heavy-block/heavy-block.deps.js \\\n        -d pages/common/common.deps.js \\\n        -o bundles/heavy-block/heavy-block.bundle.js\n\n#### bem server\n\n`bem server` starts a web server which serves static files, dynamic html generated form the BEMHTML and BEMJSON on the\nfly, and pipes js and css files through borschik.\n\nBy default document root is the current directory. You can change that with the `--project` (`-r`) parameter. So if you have\n`pages/about/main.css` file in the project folder it will be accessible with a browser using\n[http://localhost:8080/pages/about/main.css](http://localhost:8080/pages/about/main.css) URL.\n\nThe default TCP port the server is listening to is 8080. You can change it with the `--port` (`-p`) parameter.\n\nWhen the server gets a request for some `*.html` file it will look for appropriate BEMJSON and BEMHTML files, apply one\nto another and return the result if both files do exist. The contents of the `*.html` file will be returned otherwise.\n\nWhen requested URL corresponds to a directory server checks for index.html file in it and returns the content. If file is\nnot found, `index.bemhtml.js` and `index.bemjson.js` are checked for existance and the result of the template application is\nreturned. Otherwise the directory listing is returned.\n\n### Tech modules\n\n#### API\n\nLook for a documentation in source [lib/tech.js](https://github.com/bem/bem-tools/blob/master/lib/tech.js).\n\n#### Creating tech module\n\nThere are three ways to write a tech module: very simple, simple and advanced.\n\nWhatever manner you use you can get a tech object from `this`. Any base class is\navailable from `this.__base(...)`. Thanks to [inherit](https://github.com/dfilatov/node-inherit)\nmodule that organizes inheritance here.\n\n##### Very simple way\n\nYou only need to create regular CommonJS module and export some of its\nfunctions to redefine them. By default all functions from the base class are put\nin `Tech` module [lib/tech.js](https://github.com/bem/bem-tools/blob/master/lib/tech.js).\n\n##### Simple way\n\nBesides function, you can also export `baseTechPath` variable to define an\nabsolute path to a tech module you are extending. By default you are\nextending `Tech` class.\n\nFor example:\n\n```js\n\nexports.baseTechPath = require.resolve('bem/lib/techs/css');\n\n```\n\n##### Advanced way\n\nIf you need a total control, you can create a module that exports\nthe whole `Tech` class.\n\n```js\nvar INHERIT = require('inherit'),\n    BaseTech = require('bem/lib/tech').Tech;\n\nexports.Tech = INHERIT(BaseTech, {\n\n    create: function(prefix, vars, force) {\n        // do some creation work\n    },\n\n    build: function(prefixes, outputDir, outputName) {\n        // organize own build process\n    }\n\n});\n```\n\nWhen you need to base your tech on an existing one written in a simple way use\n`getTechClass()` function from `bem/lib/tech` module\nto get its class.\n\n```js\nvar INHERIT = require('inherit'),\n    getTechClass = require('bem/lib/tech').getTechClass,\n    BaseTech = getTechClass(require.resolve('path/to/tech/module'));\n\nexports.Tech = INHERIT(BaseTech, {\n\n    // your overrides go here\n\n});\n```\n\n##### Examples of tech modules\n\n * [bem-tools/lib/techs/](https://github.com/bem/bem-tools/tree/nodejs/lib/techs)\n * [bem-bl/blocks-common/i-bem/bem/techs/](https://github.com/bem/bem-bl/tree/master/blocks-common/i-bem/bem/techs)\n\n### API usage\n\nStarting from 0.2.0 version it is possible to use `bem-tools` from API.\n\n`bem` module exports the object of a command that has an `api` property.\nIt is to use in this way:\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    techs = ['css', 'js'],\n    blocks = ['b-block1', 'b-block2'];\n\nQ.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\nThe example above shows that you can use all the commands (including subcommands).\n\nA command accepts two args:\n\n * **Object** `opts` command options\n * **Object** `args` command arguments\n\nIt returns an object of `Q.promise` type.\n\n#### BEM.create\n\nCommands to create BEM entities.\n\n##### BEM.create.level()\n\nCreates a level of defenition.\n\n###### Options\n\n * **String** `outputDir` a directory of output (current directory by default)\n * **String** `level` a «prototype» of the level\n * **Boolean** `force` key to force level's creating if it already exists\n\n###### Arguments\n\n * **Array** `names` Namef of levels you are creating\n\n###### Example\n\n```js\nvar PATH = require('path'),\n    Q = require('q'),\n    BEM = require('bem').api,\n\n    outputDir = PATH.join(__dirname, 'levels'),\n    levels = ['blocks-common', 'blocks-desktop'];\n\nQ.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {\n    console.log('Create levels %s at %s', levels.join(', '), outputDir);\n});\n```\n\n##### BEM.create.block()\n\nCreates a block.\n\n###### Options\n\n * **String** `level` A directory of block's level. (Current directory by default)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use these techs only\n * **Array** `noTech` Exclude these techs\n * **Boolean** `force` Force files creating\n\n###### Arguments\n\n * **Array** `names` List of block names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml'],\n    blocks = ['b-header'];\n\nQ.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {\n    console.log('Create blocks: %s', blocks.join(', '));\n});\n```\n\n##### BEM.create.elem()\n\nCreating an element.\n\n###### Options\n\n * **String** `level` A directory of level. (Current directory by default)\n * **String** `blockName` A name of element's block (required)\n * **Array** `addTech` Add the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating element's files (to rewrite them)\n\n###### Arguments\n\n * **Array** `names` List of element names\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    addTechs = ['bemhtml', 'title.txt'],\n    block = 'b-header',\n    elems = ['logo'];\n\nQ.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {\n    console.log('Create elems %s of block %s', elems.join(', '), block);\n});\n```\n\n##### BEM.create.mod()\n\nCreating a modifier for a block or an element.\n\n###### Options\n\n * **String** `level` Level directory (current directory by default)\n * **String** `blockName` Block name of this modifier (required)\n * **String** `elemName` Element name\n * **Array** `modVal` Modifier vaue\n * **Array** `addTech` Ad the techs listed\n * **Array** `forceTech` Use only the techs listed\n * **Array** `noTech` Exclude the techs listed\n * **Boolean** `force` Force creating modifier files (rewrite)\n\n###### Arguments\n\n * **Array** `names` List of modifier\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    forceTechs = ['css'],\n    block = 'b-header',\n    elem = 'logo',\n    mods = ['lang'],\n    vals = ['ru', 'en'];\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {\n    console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));\n});\n\nQ.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {\n    console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));\n});\n```\n\n#### BEM.build()\n\nBuild files from blocks.\n\n###### Options\n\n * **String** `outputDir` An output directory (current directory by default)\n * **String** `outputName` A filename (its prefix) for output\n * **String** `declaration` A filename of input declaration (required)\n * **Array** `level` List of levels to use\n * **Array** `tech` List of techs to build\n\n###### Example\n\n```js\nvar Q = require('q'),\n    BEM = require('bem').api,\n\n    decl = 'page.deps.js',\n    outputDir = 'build',\n    outputName = 'page',\n    levels = ['blocks-common', 'blocks-desktop'],\n    techs = ['css', 'js'];\n\nQ.when(\n    BEM.build({\n        outputDir: outputDir,\n        outputName: outputName,\n        declaration: decl,\n        level: levels,\n        tech: techs\n    }),\n    function() {\n        console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',\n            techs.join(', '), levels.join(', '), outputDir, outputName);\n    }\n);\n```\n\n#### BEM.decl\n\nCommands to work with declarations.\n\n##### BEM.decl.merge()\n\nMerging two or more declarations into one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n##### BEM.decl.subtract()\n\nSubtracting the next declarations from the first one.\n\n###### Options\n\n * **String** `output` A file for output result. By default output is in STDOUT\n * **Array** `declaration` List of filenames for declarations (required)\n\n## Contribute to development \n\n### Executing autotests \n\nTo verify that your changes do not break existing functionality we recommend to run autotests and check that all of them pass. You can do that by executing the following command in the root of the project:\n\n    mocha \n\n### Running autotests with test coverage report\n\nYou can check the level of the code coverage by tests using the command: \n\n    make test-cover\n\nThen open coverage.html file in a browser. Code lines which have not been executed during the tests run will be marked red.\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->\n","_id":"bem@0.5.13","dist":{"shasum":"56a93515b75a6ba1cefc76c3092a9486416d9f1d","tarball":"http://registry.npmjs.org/bem/-/bem-0.5.13.tgz"}}},"maintainers":[{"name":"arikon","email":"peimei@ya.ru"},{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"scf","email":"scf2k@yandex.ru"},{"name":"afelix","email":"skryzhanovsky@gmail.com"}],"time":{"modified":"2012-08-11T07:07:41.246Z","created":"2011-02-17T17:51:34.553Z","0.0.4":"2011-02-17T17:51:35.024Z","0.0.5":"2011-03-23T15:46:18.479Z","0.0.6":"2011-04-06T07:29:55.859Z","0.0.7":"2011-06-29T11:30:12.224Z","0.0.8":"2011-06-30T18:12:27.535Z","0.0.9":"2011-07-19T13:45:53.919Z","0.0.10":"2011-08-01T14:19:18.022Z","0.0.11":"2011-08-01T16:02:59.893Z","0.0.12":"2011-09-06T21:51:48.278Z","0.0.13":"2011-09-14T09:28:28.420Z","0.0.14":"2011-09-24T20:11:15.748Z","0.1.0":"2011-10-30T19:16:29.577Z","0.1.1":"2011-10-30T20:35:16.561Z","0.1.2":"2011-10-31T17:23:55.765Z","0.1.3":"2011-11-23T16:12:51.626Z","0.1.4":"2011-11-25T14:52:26.413Z","0.2.0":"2011-12-09T15:02:36.606Z","0.2.1":"2011-12-19T21:18:27.526Z","0.2.2":"2011-12-21T20:19:26.094Z","0.2.3":"2012-01-17T19:22:56.228Z","0.2.4":"2012-01-27T15:28:07.742Z","0.2.5":"2012-02-10T15:14:18.408Z","0.2.6":"2012-02-15T13:50:30.225Z","0.3.0":"2012-02-24T09:31:52.033Z","0.3.1":"2012-02-27T15:01:10.103Z","0.3.2":"2012-03-05T12:06:38.078Z","0.4.0":"2012-04-13T14:04:30.533Z","0.5.0":"2012-05-05T07:43:16.145Z","0.5.1":"2012-05-05T08:24:41.084Z","0.5.2":"2012-05-15T13:02:50.624Z","0.5.3":"2012-05-15T17:27:07.564Z","0.5.4":"2012-05-16T08:36:12.009Z","0.5.5":"2012-05-17T19:45:54.383Z","0.5.6":"2012-05-18T16:24:43.331Z","0.4.1":"2012-05-23T19:48:59.560Z","0.4.2":"2012-05-31T13:00:49.568Z","0.5.7":"2012-06-08T17:03:00.774Z","0.5.8":"2012-06-08T22:10:47.153Z","0.5.9":"2012-06-09T12:42:53.474Z","0.5.10":"2012-06-13T17:36:31.241Z","0.5.11":"2012-08-02T11:43:24.054Z","0.5.12":"2012-08-07T11:22:29.205Z","0.5.13":"2012-08-11T07:07:03.965Z"},"author":{"name":"Sergey Berezhnoy","email":"veged@mail.ru","url":"http://github.com/veged"},"repository":{"type":"git","url":"git://github.com/bem/bem-tools.git"},"users":{"arikon":true,"fgribreau":true},"_attachments":{"bem-0.5.13.tgz":{"content_type":"application/octet-stream","revpos":131,"digest":"md5-6Bsv/kPuUZdMNlw8SOsW4w==","length":725182,"stub":true},"bem-0.5.12.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-LE2Ve/GH4xoNXQaVMoCueA==","length":725417,"stub":true},"bem-0.5.11.tgz":{"content_type":"application/octet-stream","revpos":122,"digest":"md5-gPRhFYRXwYXLsHki7DBhwg==","length":722754,"stub":true},"bem-0.5.10.tgz":{"content_type":"application/octet-stream","revpos":118,"digest":"md5-gvDOPSadWqUZca3bxmS+qA==","length":210864,"stub":true},"bem-0.5.9.tgz":{"content_type":"application/octet-stream","revpos":116,"digest":"md5-vcKVK6VIS3hp+tp/sVbY3w==","length":209412,"stub":true},"bem-0.5.8.tgz":{"content_type":"application/octet-stream","revpos":114,"digest":"md5-lKXUcAg/jODHhKO2TwoCqw==","length":209083,"stub":true},"bem-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":112,"digest":"md5-9jOU32pIYgkk1WS6vWhQnA==","length":207243,"stub":true},"bem-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":108,"digest":"md5-E5jr2dhz7Kgsu44KG3NHzQ==","length":48286,"stub":true},"bem-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":104,"digest":"md5-yU0ezYxxsPob7QI7M0YNEA==","length":48500,"stub":true},"bem-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":102,"digest":"md5-5O2Y9PVB2o8NxbiFcfumlA==","length":64352,"stub":true},"bem-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-8phpvKHr9IWDp4nfBPaQTQ==","length":63449,"stub":true},"bem-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":98,"digest":"md5-XFmA8fxJilIoBt18iVriTg==","length":62881,"stub":true},"bem-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":96,"digest":"md5-gH6qsjqdrZxPs0yU2kwkbA==","length":62886,"stub":true},"bem-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":94,"digest":"md5-hMyn8PEvzKobyHS+acLQUQ==","length":62776,"stub":true},"bem-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":92,"digest":"md5-cYeCFa3uQO7pvNbjzJHEFg==","length":60732,"stub":true},"bem-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":90,"digest":"md5-jUHtBRbhzZ1N5pWHxAeBIQ==","length":60733,"stub":true},"bem-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-lDIXISOFqmhQSi86BlivOA==","length":40960,"stub":true},"bem-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-jKYOL2cGHTQk6CvTj9DB9w==","length":61440,"stub":true},"bem-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":80,"digest":"md5-gKKWfjKKhcgxJOxExXnvpQ==","length":61440,"stub":true},"bem-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-I9IDSGdP06xoBXQxGiJixA==","length":43373,"stub":true},"bem-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-KMWRpMBrIw4vHKY711Bu2g==","length":39797,"stub":true},"bem-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-UVzEAP1t21owyVAc56rlhw==","length":39911,"stub":true},"bem-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":66,"digest":"md5-Akdjv79hf9qhWnxzejZVWA==","length":39850,"stub":true},"bem-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-QxuULS8Z0k02AP2ApQU5rQ==","length":30720,"stub":true},"bem-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-57eHxOttNB1BgNTvu6ZM4A==","length":30720,"stub":true},"bem-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-TxUdeAKnjIIM1Vuga4SWEA==","length":30720,"stub":true},"bem-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-znCOEBmpJ8LocJhFrtkLgA==","length":30720,"stub":true},"bem-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-pPxU29WOWkbo53A5ZKuxyw==","length":30720,"stub":true},"bem-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-sOyCvveNgvSScd52xzEQRg==","length":30720,"stub":true},"bem-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-P2jYOXLjhvm6G+na2D5mdA==","length":30720,"stub":true},"bem-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-3We4dyVt+gGxFYwFGwN6iA==","length":30720,"stub":true},"bem-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-1gEslvxGWZvmHdXu1mcaEA==","length":30720,"stub":true},"bem-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-LRILh6Civ7LRJ9gvSj500g==","length":26394,"stub":true},"bem-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-095W9WO+ZjXke6t7HGKYfw==","length":26178,"stub":true},"bem-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-0QnALwNIHGmnFe9KJZuEcQ==","length":26873,"stub":true},"bem-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-5z6YwyamC5BcSFMF4LgOrw==","length":26597,"stub":true},"bem-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-1+Z/LF41NDGtaE3LGZOeXg==","length":26400,"stub":true},"bem-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-XiRgEc42AhLGzGoEvvi7Ew==","length":24686,"stub":true},"bem-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-dwJZrMN0lpUL0QxMj6HBhQ==","length":26450,"stub":true},"bem-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-FW4OFK769vWZqV/R/G1Hrw==","length":26428,"stub":true},"bem-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-eLGctVHWwGjBtlw0ArvUtg==","length":22978,"stub":true},"bem-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UwtFYSD8I+D9z4zFIl6hOA==","length":22822,"stub":true},"bem-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-k4oPE3jqvBwMZPqEY1ONtw==","length":20476,"stub":true}}}},
{"id":"ben","key":"ben","value":{"rev":"3-debe52552a86f1e71895dd5d32add585"},"doc":{"_id":"ben","_rev":"3-debe52552a86f1e71895dd5d32add585","name":"ben","description":"simple timing benchmarks for synchronous and asynchronous code","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"ben","version":"0.0.0","description":"simple timing benchmarks for synchronous and asynchronous code","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"devDependencies":{"tap":"0.0.x"},"scripts":{"test":"tap test"},"repository":{"type":"git","url":"git://github.com/substack/node-ben.git"},"keywords":["benchmark","timing","time","stopwatch"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_id":"ben@0.0.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c6b5fade5ffb4ae09ea204170cf1234c2584e604","tarball":"http://registry.npmjs.org/ben/-/ben-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2011-08-21T08:21:59.627Z","created":"2011-08-21T08:21:58.494Z","0.0.0":"2011-08-21T08:21:59.627Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-ben.git"},"_attachments":{"ben-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-E91kE+FKWbDXT9DEluw7AQ==","length":1536,"stub":true}}}},
{"id":"bench","key":"bench","value":{"rev":"18-d4040c7f08186fc416aadf92e85fc9b3"},"doc":{"_id":"bench","_rev":"18-d4040c7f08186fc416aadf92e85fc9b3","name":"bench","description":"A little utility for doing side-by-side benchmarks in nodejs","dist-tags":{"latest":"0.3.4"},"versions":{"0.2.0":{"name":"bench","version":"0.2.0","description":"A little utility for doing side-by-side benchmarks in nodejs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"bin":{"node-bench":"./lib/cli-wrapper.js"},"main":"lib/bench","_id":"bench@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bench/-/bench-0.2.0.tgz"},"directories":{}},"0.3.0":{"name":"bench","version":"0.3.0","description":"A little utility for doing side-by-side benchmarks in nodejs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"bin":{"node-bench":"./lib/cli-wrapper.js"},"main":"lib/bench","_id":"bench@0.3.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bench/-/bench-0.3.0.tgz"},"directories":{}},"0.3.1":{"name":"bench","version":"0.3.1","description":"A little utility for doing side-by-side benchmarks in nodejs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"bin":{"node-bench":"./lib/cli-wrapper.js"},"main":"lib/bench","_id":"bench@0.3.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bench/-/bench-0.3.1.tgz"},"directories":{}},"0.3.2":{"name":"bench","version":"0.3.2","description":"A little utility for doing side-by-side benchmarks in nodejs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"bin":{"node-bench":"./lib/cli-wrapper.js"},"main":"lib/bench.js","_npmJsonOpts":{"file":"/Users/isaacs/.npm/bench/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bench@0.3.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ed515b24cff129b2b31739c79cf457c3cd6b0827","tarball":"http://registry.npmjs.org/bench/-/bench-0.3.2.tgz"},"scripts":{}},"0.3.3":{"name":"bench","version":"0.3.3","description":"A little utility for doing side-by-side benchmarks in nodejs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"bin":{"node-bench":"./lib/cli-wrapper.js"},"main":"lib/bench.js","_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"bench@0.3.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha","_nodeVersion":"v0.6.2-pre","_defaultsLoaded":true,"dist":{"shasum":"033b224b43b8d19104d724188c4e04ea7c61354d","tarball":"http://registry.npmjs.org/bench/-/bench-0.3.3.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}]},"0.3.4":{"name":"bench","version":"0.3.4","description":"A little utility for doing side-by-side benchmarks in nodejs","author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"bin":{"node-bench":"./lib/cli-wrapper.js"},"main":"lib/bench.js","_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"bench@0.3.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.7-pre","_defaultsLoaded":true,"dist":{"shasum":"a1d685db25b764a2cbe08412cdc7b53633d3ffcb","tarball":"http://registry.npmjs.org/bench/-/bench-0.3.4.tgz"},"readme":"# node bench\n\nA little utility for doing side-by-side benchmarks in\n[nodejs](http://nodejs.org).\n\nThis is not for benchmarking your HTTP servers.  Use\n[ab](http://httpd.apache.org/docs/2.0/programs/ab.html) for that.\n\n## Installation\n\n    npm install bench\n\n## Usage\n\nWrite your script like this:\n\n    exports.compare = {\n      \"function wrapper\" : function () {\n        var x = (function (a) {\n          return a;\n        })(\"foo\");\n      },\n      \"with(){} wrapper\" : function () {\n        var x;\n        with ({a : \"foo\"}) {\n          x = a;\n        }\n      }\n      \"no wrapper\" : function () {\n        var a = \"foo\";\n        var x = a;\n      }\n    };\n    require(\"bench\").runMain()\n\nThen, start it up with node.\n\n    $ node my-test-script.js\n\nIt'll output the scores in processes/ms, so a higher score is always better.\nThat is, the values are kHz, not Hz.\n\nYou can also export `time`, `count`, and `comparecount` to change the\nbehavior slightly.\n\nYour test script is just a plain old commonjs module, so it can include other\nthings, update require.paths, whatever setup you need to do.  Generally, it's\na good idea to do this stuff in the module itself, rather than in the\ncomparison functions, so that you can better isolate the units that you\nwant to test.\n\n## Fields\n\nExport the following fields from your benchmark script.\n\n`compare` - The hash of functions that will be compared.  The output will\nuse the object key as the title.  They're called without any arguments, in\nthe default scope.  It's assumed that you should know how to make this do\nwhatever you need it to.\n\n`time` - How long (in ms) to run the tests for.  A higher value will result\nin more accurate tests that take longer to run.  Default: `1000`\n\n`compareCount` - How many times to do the test runs.  This should be some\nfairly small number.  Tests are run multiple times in varying order to\naverage out the variation due to calling one function first, a primed\ncache, garbage collection, etc.  Higher value = more accurate, slower\ntests.  Default: `8`\n\n`countPerLap` - Especially when doing asynchronous benchmarking, you may\nwant to structure your functions so that they run a bunch of times before\ncontinuing.  In these cases, to make your scores reflect the actual number\nof processes per ms, indicate the number of runs per call in the\n\"countPerLap\" field.  Default: `1`\n\n`done` - A function that will be called with the results of the runs\nwhen they're complete.  By default, this calls a function that will\nanalyze the results a bit and write the data to `stdout`.\n\n## Asynchronous Benchmarking\n\nJust write your functions so that they take a single argument.  That\nargument is your callback.  Have fun with it.\n\nYour callback will be fired using `process.nextTick`.  This has a wee\nbit of overhead, so if you're testing something really fast, you should\nprobably construct it to run many times before calling the callback.\nCheck the `examples/nexttick-vs-settimeout.js` test for an example.\n\n# <span style=\"background:red; color:white\">WARNING!</span>\n\nStatistics are powerful tools, and in the wrong hands, can lead to a\nlot of mayhem.  Please use this tool for good, and not evil.\n","maintainers":[{"name":"isaacs","email":"i@izs.me"}]}},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me"},"time":{"modified":"2011-12-29T21:44:30.158Z","created":"2011-03-31T06:08:23.016Z","0.2.0":"2011-03-31T06:08:23.016Z","0.3.0":"2011-03-31T06:08:23.016Z","0.3.1":"2011-03-31T06:08:23.016Z","0.3.2":"2011-07-17T21:28:11.032Z","0.3.3":"2011-11-22T01:46:43.906Z","0.3.4":"2011-12-29T21:44:30.157Z"},"_attachments":{"bench-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-blNcK5eQCrUyoccFRFAulg==","length":45354,"stub":true},"bench-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-FmsUctbZXb5RAD149m4YLA==","length":42914,"stub":true},"bench-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-nW83mmIV0geWm7+ORKQgtw==","length":10494,"stub":true},"bench-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Oo+/BW4vG9XFp5jNNKxyEQ==","length":7794,"stub":true},"bench-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BXqxblRvOtUf2I5ExginfQ==","length":7724,"stub":true},"bench-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-PBrs+f8EQXhZ/0nzGe674A==","length":6214,"stub":true}}}},
{"id":"bencher","key":"bencher","value":{"rev":"3-08866a8fdcf180582b43690bbbf21087"},"doc":{"_id":"bencher","_rev":"3-08866a8fdcf180582b43690bbbf21087","name":"bencher","description":"Benchmarkin' library","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"bencher","version":"0.0.2","description":"Benchmarkin' library","homepage":"http://github.com/brianc/bencher","repository":{"type":"git","url":"git://github.com/brianc/bencher.git"},"author":{"name":"Brian Carlson","email":"brian.m.carlson@gmail.com"},"main":"./lib/index","scripts":{"test":"make test"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.2.2"},"_id":"bencher@0.0.2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.5","modules":{"index.js":"lib/index.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"77cad6f69318e4d6d311d896a95e93f868a061d3","tarball":"http://registry.npmjs.org/bencher/-/bencher-0.0.2.tgz"}}},"maintainers":[{"name":"brianc","email":"brian.m.carlson@gmail.com"}],"time":{"modified":"2011-01-27T03:16:08.578Z","created":"2011-01-27T03:16:08.337Z","0.0.2":"2011-01-27T03:16:08.578Z"},"author":{"name":"Brian Carlson","email":"brian.m.carlson@gmail.com"},"repository":{"type":"git","url":"git://github.com/brianc/bencher.git"},"_attachments":{"bencher-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-g2dOMoWuV059LmqKQV9xjg==","length":25948,"stub":true}}}},
{"id":"benchmark","key":"benchmark","value":{"rev":"227-0033d8c3ef4ac04429ddd2176aae0173"},"doc":{"_id":"benchmark","_rev":"227-0033d8c3ef4ac04429ddd2176aae0173","name":"benchmark","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.337":{"name":"benchmark","version":"0.1.337","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repositories":[{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js"}],"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.337","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"c5a1b5b19176fab26da33718c6895675007a164f","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.337.tgz"}},"0.1.338":{"name":"benchmark","version":"0.1.338","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repositories":[{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js"}],"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.338","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"33dcd8d61186db9ed2f027f80121342cf2a6730a","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.338.tgz"}},"0.1.339":{"name":"benchmark","version":"0.1.339","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repositories":[{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js"}],"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.339","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"67158d32f127bba29a93486c2267fd3c665108fd","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.339.tgz"}},"0.1.340":{"name":"benchmark","version":"0.1.340","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.340","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"f645f9e9a56c05187e3f929800cdfa53469de7fd","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.340.tgz"}},"0.1.341":{"name":"benchmark","version":"0.1.341","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.341","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.5-pre","dist":{"shasum":"fce337b212a78cd8ac590b86a008b0e4383b2d59","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.341.tgz"}},"0.1.342":{"name":"benchmark","version":"0.1.342","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.342","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"f6b947bcd1f5e16a0dbc203399d0653ee2616039","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.342.tgz"}},"0.1.343":{"name":"benchmark","version":"0.1.343","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.343","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.1","dist":{"shasum":"a0f6105e654be1300637bc0a39eb1d0aa2cbeb28","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.343.tgz"}},"0.1.344":{"name":"benchmark","version":"0.1.344","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.344","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.8-pre","dist":{"shasum":"7f9c51dc6d4079e769367304ac8f41d9daa6a59a","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.344.tgz"}},"0.1.345":{"name":"benchmark","version":"0.1.345","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.345","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.4.0","dist":{"shasum":"708509c3170f38e921700b6268727fc486e87661","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.345.tgz"}},"0.1.346":{"name":"benchmark","version":"0.1.346","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.346","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"de14ae9c4b698b71f0d4a51876a22f757eb51919","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.346.tgz"}},"0.1.347":{"name":"benchmark","version":"0.1.347","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.347","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.4.1","dist":{"shasum":"803f341f9e809898cea6c85b94b304734db390a7","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.347.tgz"}},"0.1.348":{"name":"benchmark","version":"0.1.348","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.348","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"83637ebaebb2927396b60a7a680a27d3af806f8c","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.348.tgz"}},"0.1.349":{"name":"benchmark","version":"0.1.349","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.1.349","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"65424d57539e5c10383cec36c70855242f2b16c3","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.1.349.tgz"}},"0.2.0":{"name":"benchmark","version":"0.2.0","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.2.0","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.4.1","dist":{"shasum":"b71abe69c45569cd8dfaeb0c224b7a618b7cde3d","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.2.0.tgz"}},"0.2.1":{"name":"benchmark","version":"0.2.1","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/mathiasbynens/Benchmark.js/issues"},"repository":{"type":"git","url":"https://github.com/mathiasbynens/Benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_id":"benchmark@0.2.1","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"a139296df09244956f0ef0a04a73040c1f430f24","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.2.1.tgz"}},"0.2.2":{"name":"benchmark","version":"0.2.2","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},{"name":"John-David Dalton","email":"john@fusejs.com","url":"http://allyoucanleet.com/"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/bestiejs/benchmark.js/issues"},"repository":{"type":"git","url":"git://github.com/bestiejs/benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"dependencies":{},"devDependencies":{},"_id":"benchmark@0.2.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"9c6bcf8d997c7102c050f075ee8e622e1d66b206","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.2.2.tgz"},"scripts":{}},"0.3.0":{"name":"benchmark","version":"0.3.0","description":"A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.","homepage":"http://benchmarkjs.com/","main":"benchmark","keywords":["benchmark","node","narwhal","performance","ringo","speed"],"licenses":[{"type":"MIT","url":"http://mths.be/mit"}],"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"maintainers":[{"name":"jdalton","email":"john@fusejs.com"},{"name":"mathias","email":"mathias@qiwi.be"}],"bugs":{"email":"bugs@benchmarkjs.com","url":"https://github.com/bestiejs/benchmark.js/issues"},"repository":{"type":"git","url":"git://github.com/bestiejs/benchmark.js.git"},"engines":["node","rhino"],"directories":{"doc":"docs","test":"tests"},"_npmUser":{"name":"jdalton","email":"john@fusejs.com"},"_id":"benchmark@0.3.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"08be6316908a32e610ab0ac5cc6aed5f4fcd6891","tarball":"http://registry.npmjs.org/benchmark/-/benchmark-0.3.0.tgz"}}},"maintainers":[{"name":"jdalton","email":"john@fusejs.com"},{"name":"mathias","email":"mathias@qiwi.be"}],"time":{"modified":"2012-08-14T10:49:03.410Z","created":"2010-12-28T19:42:44.681Z","0.1.337":"2010-12-28T19:42:45.114Z","0.1.4":"2010-12-28T19:43:36.607Z","0.1.1338":"2010-12-28T20:04:16.669Z","0.1.338":"2010-12-28T20:13:29.768Z","0.1.339":"2011-01-02T22:47:10.191Z","0.1.340":"2011-01-09T14:10:05.136Z","0.1.341":"2011-01-13T21:39:09.723Z","0.1.342":"2011-01-18T08:53:47.472Z","0.1.343":"2011-01-27T22:08:59.724Z","0.1.344":"2011-02-06T19:24:05.453Z","0.1.345":"2011-02-14T11:31:23.556Z","0.1.346":"2011-03-01T15:53:50.665Z","0.1.347":"2011-03-10T10:11:34.927Z","0.1.348":"2011-03-18T09:49:23.309Z","0.1.349":"2011-04-04T07:07:08.418Z","0.2.0":"2011-04-18T17:56:09.543Z","0.2.1":"2011-04-25T08:43:27.729Z","0.2.2":"2011-06-07T18:42:36.013Z","0.3.0":"2011-12-04T10:35:35.688Z"},"author":{"name":"Mathias Bynens","email":"mathias@benchmarkjs.com","url":"http://mathiasbynens.be/"},"repository":{"type":"git","url":"git://github.com/bestiejs/benchmark.js.git"},"users":{"sjonnet19":true},"_attachments":{"benchmark-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":225,"digest":"md5-CUi5LcWysku0q4jDgjzFNA==","length":1003520,"stub":true},"benchmark-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":219,"digest":"md5-qPKS6Xex4ct+TCklPKjphw==","length":22045,"stub":true},"benchmark-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":217,"digest":"md5-+bcp8ewaYFjNqKkRtVlC+Q==","length":32331,"stub":true},"benchmark-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":215,"digest":"md5-BtRVfv2b9YFICO1HBVwwhg==","length":31464,"stub":true},"benchmark-0.1.349.tgz":{"content_type":"application/octet-stream","revpos":205,"digest":"md5-GYoeLR4Do1dW/dRiGXjEwg==","length":32141,"stub":true},"benchmark-0.1.348.tgz":{"content_type":"application/octet-stream","revpos":203,"digest":"md5-JCK5Z99jSb5Kup/Fe/1SXw==","length":31766,"stub":true},"benchmark-0.1.347.tgz":{"content_type":"application/octet-stream","revpos":201,"digest":"md5-aEUnLLGCL9gEf8WdL6KEQg==","length":30881,"stub":true},"benchmark-0.1.346.tgz":{"content_type":"application/octet-stream","revpos":195,"digest":"md5-4qj8GbN8Dp34ak0fWEfdSg==","length":30979,"stub":true},"benchmark-0.1.345.tgz":{"content_type":"application/octet-stream","revpos":193,"digest":"md5-AOklFPeD+Ox2AByjHg4xiw==","length":30584,"stub":true},"benchmark-0.1.344.tgz":{"content_type":"application/octet-stream","revpos":191,"digest":"md5-J3vTspf/PYBr7wIe1XAk+w==","length":30461,"stub":true},"benchmark-0.1.343.tgz":{"content_type":"application/octet-stream","revpos":189,"digest":"md5-sPB5BMXl9Z8fEg8RnUmrsg==","length":29180,"stub":true},"benchmark-0.1.342.tgz":{"content_type":"application/octet-stream","revpos":183,"digest":"md5-0mMdUPcmRokYUDR8/T0wVQ==","length":28676,"stub":true},"benchmark-0.1.341.tgz":{"content_type":"application/octet-stream","revpos":165,"digest":"md5-tdtOMvy+pqadf//j4AagDQ==","length":31258,"stub":true},"benchmark-0.1.340.tgz":{"content_type":"application/octet-stream","revpos":163,"digest":"md5-9nYQWFV+8C3GpX468muwVg==","length":30151,"stub":true},"benchmark-0.1.339.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-hlbcK150TDAvAbCBNUczdA==","length":65972,"stub":true},"benchmark-0.1.338.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-7FsznzeAH0GSY/mrzrj48g==","length":62442,"stub":true},"benchmark-0.1.337.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jwX5IBTlI7RrQ8C9Zk/Gvw==","length":62603,"stub":true}}}},
{"id":"benchmark-pages","key":"benchmark-pages","value":{"rev":"3-aa83a8306a7b239014087c28efe40011"},"doc":{"_id":"benchmark-pages","_rev":"3-aa83a8306a7b239014087c28efe40011","name":"benchmark-pages","description":"Benchmarks the response time of your web pages under a different loads; allows comparing response times for different servers","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"penartur","url":"https://github.com/penartur/"},"name":"benchmark-pages","description":"Benchmarks the response time of your web pages under a different loads; allows comparing response times for different servers","version":"0.0.1","homepage":"https://github.com/penartur/node-benchmark-pages","keywords":["benchmark","benchmarking","performance","speed","timing","test"],"repository":{"type":"git","url":"git://github.com/penartur/node-benchmark-pages.git"},"main":"lib/benchmark.js","dependencies":{"request":">= 2.9.202","capisce":">= 0.4.3","cli-table":">= 0.0.1"},"devDependencies":{},"optionalDependencies":{"cli-table":">= 0.0.1"},"engines":{"node":">= 0.6.15"},"_npmUser":{"name":"penartur","email":"penartur@yandex.ru"},"_id":"benchmark-pages@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"102e29b2a59816eaac62ec363fc8f3fcc5d19e47","tarball":"http://registry.npmjs.org/benchmark-pages/-/benchmark-pages-0.0.1.tgz"},"maintainers":[{"name":"penartur","email":"penartur@yandex.ru"}]}},"readme":"node-benchmark-pages\r\n====================\r\n\r\nA library for benchmarking your web service.\r\n\r\nSuppose you want to measure the average response time of your service under a typical load scenario.\r\nThis library allows you to declare such a scenario (in terms of pages and their frequency) and then measure their average response time under a different loads (different simultaneous requests limits).\r\nVarious statistical methods are available for the raw measurements data; the library may also output the statistical data into the console in the convenient form if you like.\r\n\r\nAnother use case is when you have more than one version of the same service and want to compare their response time or maximum load.\r\n\r\n# Examples\r\n\r\nSee the [example](https://github.com/penartur/node-benchmark-pages/tree/master/example) directory.\r\n\r\n# Installation\r\n\r\n```bash\r\n$ npm install cacheio\r\n```\r\n\r\n# Notes\r\n\r\nIt makes little sense to measure the remote services, as the result will generally depend of your network connection and not of your service performance.\r\n\r\nAlso, the library assumes service responses are consistent.\r\nThat is, it assumes that, for any given engine and page, the response length will not change over the time.\r\nIf suddenly your service sent a response of a different length, the library assumes something went wrong, writes an error into your console, and does not use this data when computing statistics.\r\n\r\nCurrently, you're only limited to a single running benchmark per process.\r\nIt is related to a global `http.globalAgent.maxSockets` variable.\r\n\r\n# License\r\n\r\n(The MIT License)\r\n\r\nCopyright (C) 2012 penartur <https://github.com/penartur/>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n","maintainers":[{"name":"penartur","email":"penartur@yandex.ru"}],"time":{"modified":"2012-05-11T06:03:40.117Z","created":"2012-05-11T06:03:37.065Z","0.0.1":"2012-05-11T06:03:40.117Z"},"author":{"name":"penartur","url":"https://github.com/penartur/"},"repository":{"type":"git","url":"git://github.com/penartur/node-benchmark-pages.git"},"_attachments":{"benchmark-pages-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pNSB6Lk+8HEj9Z51oTVNdQ==","length":7598,"stub":true}}}},
{"id":"bencode","key":"bencode","value":{"rev":"11-901a8d1ec16e1f6d1cc7ce5385dc841d"},"doc":{"_id":"bencode","_rev":"11-901a8d1ec16e1f6d1cc7ce5385dc841d","name":"bencode","description":"Bencode de/encoder","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"bencode","description":"a bencode de/encoder","version":"0.0.1","author":{"name":"Mark Schmale"},"directories":{"/":"./"},"main":"./bencode","engines":{"node":">=0.1.94"},"_id":"bencode@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bencode/-/bencode-0.0.1.tgz"}},"0.1.0":{"name":"bencode","description":"a bencode de/encoder","version":"0.1.0","author":{"name":"Mark Schmale"},"directories":{"/":"./"},"main":"./bencode","engines":{"node":">=0.1.94"},"_id":"bencode@0.1.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bencode/-/bencode-0.1.0.tgz"}},"0.3.0":{"name":"bencode","version":"0.3.0","description":"Bencode de/encoder","keywords":["torrent","bittorrent","bencode","bdecode","bencoding"],"author":{"name":"Mark Schmale","email":"ma.schmale@googlemail.com","url":"http://masch.it/"},"main":"bencode.js","devDependencies":{"benchmark":""},"repository":{"type":"git","url":"git://github.com/themasch/node-bencode.git"},"bugs":{"url":"https://github.com/themasch/node-bencode/issues"},"contributors":[{"name":"Mark Schmale","email":"ma.schmale@googlemail.com"},{"name":"Jonas Hermsmeier","email":"jhermsmeier@gmail.com"}],"readme":"\n# node-bencode\n\nA node library for encoding and decoding bencoded data,  \naccording to the [BitTorrent specification](http://www.bittorrent.org/beps/bep_0003.html).\n\n## Index\n\n- [About BEncoding](#about-bencoding)\n- [Installation](#install-with-npm)\n- [Usage](#usage)\n- [API](#api)\n\n## About BEncoding\n\nfrom [Wikipedia](https://en.wikipedia.org/wiki/Bencoding):\n\nBencode (pronounced like B encode) is the encoding used by the peer-to-peer\nfile sharing system BitTorrent for storing and transmitting loosely structured data.\n\nIt supports four different types of values:\n- byte strings\n- integers\n- lists\n- dictionaries\n\nBencoding is most commonly used in torrent files.\nThese metadata files are simply bencoded dictionaries.\n\n## Install with [npm](http://npmjs.org)\n\n```\nnpm install bencode\n```\n\n## Usage\n\n```javascript\nvar bencode = require( 'bencode' )\n```\n\n### Encoding\n\n```javascript\n\nvar data = {\n  string: 'Hello World',\n  integer: 12345,\n  dict: {\n    key: 'This is a string within a dictionary'\n  },\n  list: [ 1, 2, 3, 4, 'string', 5, {} ]\n}\n\nvar result = bencode.encode( data )\n\n```\n\n#### Output\n\n```\nd6:string11:Hello World7:integeri12345e4:dictd3:key36:This is a string within a dictionarye4:litli1ei2ei3ei4e6:stringi5edeee\n```\n\n### Decoding\n\n```javascript\nvar data   = new Buffer( 'd6:string11:Hello World7:integeri12345e4:dictd3:key36:This is a string within a dictionarye4:litli1ei2ei3ei4e6:stringi5edeee' )\nvar result = bencode.decode( data )\n```\n\n#### Output\n\n```javascript\n{\n  string: <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>,\n  integer: 12345,\n  dict: {\n    key: <Buffer 54 68 69 73 20 69 73 20 61 20 73 74 72 69 6e 67 20 77 69 74 68 69 6e 20 61 20 64 69 63 74 69 6f 6e 61 72 79>\n  },\n  list: [ 1, 2, 3, 4, <Buffer 73 74 72 69 6e 67>, 5, {} ]\n}\n```\n\nAutomagically convert bytestrings to strings:\n\n```javascript\nvar result = bencode.decode( data, 'utf8' )\n```\n\n#### Output\n\n```javascript\n{\n  string: 'Hello World',\n  integer: 12345,\n  dict: {\n    key: 'This is a string within a dictionary'\n  },\n  list: [ 1, 2, 3, 4, 'string', 5, {} ]\n}\n```\n\n## API\n\n### bencode.encode( *data* )\n\n> `Buffer` | `Array` | `String` | `Object` | `Number` __data__\n\nReturns `String`\n\n### bencode.decode( *data*, *encoding* )\n\n> `Buffer` __data__  \n> `String` __encoding__\n\nIf `encoding` is set, bytestrings are\nautomatically converted to strings.\n\nReturns `Object` | `Array` | `Buffer` | `String` | `Number`\n","_id":"bencode@0.3.0","dist":{"shasum":"9270ac9a12b5d5ee008b9930472525b1aa9dca7a","tarball":"http://registry.npmjs.org/bencode/-/bencode-0.3.0.tgz"},"maintainers":[{"name":"masch","email":"ma.schmale@googlemail.com"}]}},"maintainers":[{"name":"masch","email":"ma.schmale@googlemail.com"}],"author":{"name":"Mark Schmale","email":"ma.schmale@googlemail.com","url":"http://masch.it/"},"repository":{"type":"git","url":"git://github.com/themasch/node-bencode.git"},"time":{"0.3.0":"2012-07-31T22:58:34.011Z","modified":"2012-08-02T13:43:39.674Z","created":"2012-07-31T22:58:34.011Z","0.0.1":"2012-07-31T22:58:34.011Z","0.1.0":"2012-07-31T22:58:34.011Z"},"users":{"fgribreau":true},"_attachments":{"bencode-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-qVY6o463ZZDjyr34eXqB8w==","length":32022,"stub":true},"bencode-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4n2HMbZUR03FNAsNxWH2+Q==","length":1677,"stub":true},"bencode-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a62Q0JSOLjeNxrCD50hNeg==","length":1078,"stub":true}}}},
{"id":"bencoding","key":"bencoding","value":{"rev":"3-4cacadc829a4936c94b63a6e82e42876"},"doc":{"_id":"bencoding","_rev":"3-4cacadc829a4936c94b63a6e82e42876","name":"bencoding","description":"encode/decode bencoded data","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bencoding","version":"0.0.1","description":"encode/decode bencoded data","keywords":["torrent","bittorrent","bencode","bdecode","bencoding","buffers"],"author":{"name":"Clark Fischer","email":"clark.fischer@gmail.com","url":"https://github.com/clarkf"},"main":"index","repository":{"type":"git","url":"git://github.com/clarkf/node-bencoding.git"},"homepage":"https://github.com/clarkf/node-bencoding","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"","expect.js":"","benchmark":"~0.3.0","dht-bencode":"","bncode":"","bencode":""},"engines":{"node":">= 0.4.7"},"_npmUser":{"name":"clarkf","email":"clark.fischer@gmail.com"},"_id":"bencoding@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"ff00fff2135e63ad99a8a8ee28db9aff6d79c0a7","tarball":"http://registry.npmjs.org/bencoding/-/bencoding-0.0.1.tgz"},"maintainers":[{"name":"clarkf","email":"clark.fischer@gmail.com"}]}},"readme":"# bencoding\n\nA node library for encoding and decoding data, according to [the\nBitTorrent specification](http://www.bittorrent.org/beps/bep_0003.html).\nThis library is slightly different, because it attempts to keep your\ndata as pristine as possible. Nothing (with the exception of integers)\nis converted to a string until you tell it to.\n\n## Why?\n\nThere are a bunch of bencoding/decoding libraries out there (see below),\nbut none of pass their results straight into plain javascript `Object`s\n(`{}`). When using a `Buffer` as a key in an `Object`, it automatically\ngets coerced into a `String`. If you have to use some complex data as a\nkey in a dictionary, it'll munge it when converting it to a `String`.\n\nTake for example a `scrape` request to a HTTP tracker. According to the\n[unofficial BT spec](http://wiki.theory.org/BitTorrentSpecification#Tracker_.27scrape.27_Convention),\nits result is in this format (written in JS-pseudocode for clarity):\n\n```javascript\n{\n    \"files\": {\n        \"[info hash]\": {\n            \"complete\":   5,\n            \"downloaded\": 50,\n            \"incomplete\": 10\n        }\n    }\n}\n```\n\nWhere `[info hash]` is the 20-byte `sha1` `info_hash`. When you coerce\nthis into a string, you get some wonky effects, such as the (20-byte)\n`String`'s `length` being 1. This is not all so helpful, unless you're\ncompletely willing disregard the `info_hash`.\n\n## How can we fix this?\n\n`bencoding` fixes this by creating a new structure: `BDict`. A `BDict`\nrepresents a bencoded dictionary without coercing any `Buffer`s into\n`String`s. It stores everything by index, so you have to fetch the keys\nand values numerically (see API).\n\n## Installation\n\nWith [npm](http://github.com/isaacs/npm):\n\n    npm install bencoding\n\n## Performance\n\nPerformance compared to:\n\n* Mark Schmale's [bencode](https://github.com/themasch/node-bencode/)\n* Tim Becker's [bncode](https://github.com/a2800276/bencode.js/)\n* Stefan Bühler's [dht-bencode](https://github.com/stbuehler/nodejs-dht-bencode)\n\nThis library seems to __decode__ faster than any of the other tested\nlibraries. It __encodes__ quickly – second only to Mark Schmale's \nlibrary. Results:\n\n> Encoding:\n>\n> * bencoding#encode x 24,961 ops/sec ±4.12% (57 runs sampled)\n> * bencode#encode x 2,637,008 ops/sec ±5.86% (58 runs sampled)\n> * bncode#encode x 15,012 ops/sec ±7.66% (46 runs sampled)\n> * dht-bencode#encode x 193,631 ops/sec ±10.35% (53 runs sampled)\n> * Fastest is bencode#encode \n> \n> Decoding:\n>\n> * bencoding#decode x 29,019 ops/sec ±4.41% (55 runs sampled)\n> * bencode#decode x 300 ops/sec ±6.28% (54 runs sampled)\n> * bncode#decode x 1,060 ops/sec ±7.65% (50 runs sampled)\n> * [dht-decode errors]\n> * Fastest is bencoding#decode\n\nYou can try this yourself by running either `node\nperformance/encoding.js` or `node performance/decoding.js`.\n\n## Usage\n\n### Decoding\n```javascript\nvar bencoding = require('bencoding'),\n    data = new Buffer('d3:inti1024768e3:str5:abcde4:listli1ei2ei3eee'),\n    result = bencoding.decode(data);\n\nconsole.log(result);\nconsole.log(result.toJSON());\n```\nOutput:\n\n```\n{ keys: [ <Buffer 69 6e 74>, <Buffer 73 74 72>, <Buffer 6c 69 73 74> ],\n    vals: [ 1024768, <Buffer 61 62 63 64 65>, [ 1, 2, 3 ] ],\n    length: 3 }\n{ int: 1024768, str: <Buffer 61 62 63 64 65>, list: [ 1, 2, 3 ] }\n```\n\n### Encoding\n```javascript\nvar bencoding = require('bencoding'),\n    object = {\n        'string': \"Hello World\",\n        'integer': 12345,\n        'dictionary': {\n            'key': \"This is a string within a dictionary\"\n        },\n        'list': [1, 2, 3, 4, 'string', 5, {}]\n    },\n    result = bencoding.encode(object);\n\nconsole.log(result.toString());\n```\nOutput:\n\n    d6:string11:Hello World7:integeri12345e10:dictionaryd3:key36:This is a string within a dictionarye4:listli1ei2ei3ei4e6:stringi5edeee\n\n## API\n\n### bencode.decode\nSignature: \n\n* {`Buffer`} `encoded` - The bencoded data, as a buffer.\n\nReturns {`Buffer`|`BDict`|`Array`|`Number`} `result` - decoded data\n\n### bencode.encode\nSignature:\n\n* {`Buffer`|`BDict`|`Array`|`String`|`Object`|`Number`} `data` - the\n    data to encode.\n\nReturns {`Buffer`} `result` - encoded data. \n\n### bencode.BDict\nThe BDict constructor. Accepts no arguments.\n\n#### BDict.add\nSignature:\n\n* `key` - the key\n* `value` - the value\n\nReturns: {`BDict`} `self` - for chaining\n\nAdds an item to `BDict` at `length`. `key` and `value` can be any object\nof any kind.\n\n#### BDict.remove\nSignature: \n\n* {`Number`} `index` - the index to remove\n\nReturns: {`BDict`} `self` - for chaining\n\nRemoves item at index `index` from `BDict`\n\n#### BDict.vget\nSignature:\n\n* {`Number`} `index` - the index to get the value of\n\nReturns: `value` - the value at index `index`.\n\n#### BDict.kget\nSignature:\n\n* {`Number`} `index` - the index to get the key of\n\nReturns: `value` - the key at index `index`.\n\n#### BDict.get\nSignature:\n\n* {`Number`} `index` - the index to get the key/value of\n\nReturns: {`Array`} `result` - an array in the format of [`key`, `value`]\n\n#### BDict.toJSON\n\nReturns: {`Object`} `result` - a usable representation of the `BDict`.\n\nIf you don't plan on having any complex data in keys, you can just call\ntoJSON to convert the BDict into a regular `Object`.\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Clark Fischer &lt;clark.fischer@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"clarkf","email":"clark.fischer@gmail.com"}],"time":{"modified":"2012-02-08T05:01:24.909Z","created":"2012-02-08T05:01:23.474Z","0.0.1":"2012-02-08T05:01:24.909Z"},"author":{"name":"Clark Fischer","email":"clark.fischer@gmail.com","url":"https://github.com/clarkf"},"repository":{"type":"git","url":"git://github.com/clarkf/node-bencoding.git"},"_attachments":{"bencoding-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LLzcgtYRJaop9xTKyfoqFg==","length":4789,"stub":true}}}},
{"id":"bend","key":"bend","value":{"rev":"3-17cdf34353e9fd27310300efe0304a9e"},"doc":{"_id":"bend","_rev":"3-17cdf34353e9fd27310300efe0304a9e","name":"bend","description":"A statically-typed programming language that compiles into JavaScript","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bend","preferGlobal":"true","version":"0.1.0","author":{"name":"Evan Wallace","url":"http://madebyevan.com/"},"description":"A statically-typed programming language that compiles into JavaScript","bin":{"bend":"./bin/bend"},"main":"./lib/compiler.node.js","repository":{"type":"git","url":"https://github.com/evanw/bend.git"},"keywords":["javascript","bend","language","compiler"],"bugs":"http://github.com/evanw/bend/issues","license":"MIT","readme":"# The Bend Programming Language\n\nBend is a statically-typed programming language for the web. It compiles down to readable JavaScript with no runtime library and easily integrates with other JavaScript code.\n\nAn example Bend program:\n\n    extern class console {\n      static void log(var[] data...)\n    }\n    int[] nums = { 1, 2, 3 }\n    for n in nums {\n      console.log('hello', n)\n    }\n\n# Live Demo\n\nPlease see [https://evanw.github.com/bend/](https://evanw.github.com/bend/) for a live demo and more information.\n\n# Installation\n\nBend can be installed through [npm](https://npmjs.org/):\n\n    npm install -g bend\n","_id":"bend@0.1.0","dist":{"shasum":"58babdc5473e786dbcd3c4eb23ac5ba8ebd2122b","tarball":"http://registry.npmjs.org/bend/-/bend-0.1.0.tgz"},"maintainers":[{"name":"evanw","email":"evan.exe@gmail.com"}]}},"readme":"# The Bend Programming Language\n\nBend is a statically-typed programming language for the web. It compiles down to readable JavaScript with no runtime library and easily integrates with other JavaScript code.\n\nAn example Bend program:\n\n    extern class console {\n      static void log(var[] data...)\n    }\n    int[] nums = { 1, 2, 3 }\n    for n in nums {\n      console.log('hello', n)\n    }\n\n# Live Demo\n\nPlease see [https://evanw.github.com/bend/](https://evanw.github.com/bend/) for a live demo and more information.\n\n# Installation\n\nBend can be installed through [npm](https://npmjs.org/):\n\n    npm install -g bend\n","maintainers":[{"name":"evanw","email":"evan.exe@gmail.com"}],"time":{"modified":"2012-08-03T08:33:52.978Z","created":"2012-08-03T08:33:52.278Z","0.1.0":"2012-08-03T08:33:52.978Z"},"author":{"name":"Evan Wallace","url":"http://madebyevan.com/"},"repository":{"type":"git","url":"https://github.com/evanw/bend.git"},"_attachments":{"bend-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4wjXH0BhYRBgvZkDxYh5ng==","length":34905,"stub":true}}}},
{"id":"benji","key":"benji","value":{"rev":"3-74b6a4b032c0146e1f0352519e39a322"},"doc":{"_id":"benji","_rev":"3-74b6a4b032c0146e1f0352519e39a322","name":"benji","description":"Simple asynchronous benchmarks","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"benji","description":"Simple asynchronous benchmarks","version":"0.0.1","homepage":"http://github.com/wearefractal/benji","repository":{"type":"git","url":"git://github.com/wearefractal/benji.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./index.js","dependencies":{"coffee-script":"*","async":"*"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"mocha --compilers coffee:coffee-script"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/benji/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"benji@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"0bc77cb06f4b6625c5533f1550d17565b95d818f","tarball":"http://registry.npmjs.org/benji/-/benji-0.0.1.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]}},"readme":"![status](https://secure.travis-ci.org/wearefractal/benji.png?branch=master)\n\n## Information\n\n<table>\n<tr> \n<td>Package</td><td>benji</td>\n</tr>\n<tr>\n<td>Description</td>\n<td>Simple asynchronous benchmarks</td>\n</tr>\n<tr>\n<td>Node Version</td>\n<td>>= 0.4</td>\n</tr>\n</table>\n\n## Usage\n\n```coffee-script\nbenji = require 'benji'\n\n# Synchronous task\nms = benji.sync 10, -> 2+2\n# ms is milliseconds averaged over 10 runs\n\n\n# Asynchronous task\ntask = (cb) -> cb 2+2\nbenji.async 10, task, (ms) ->\n  # ms is milliseconds averaged over 10 runs\n```\n\n## LICENSE\n\n(MIT License)\n\nCopyright (c) 2012 Fractal <contact@wearefractal.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"time":{"modified":"2012-04-26T08:33:59.123Z","created":"2012-04-26T08:33:57.640Z","0.0.1":"2012-04-26T08:33:59.123Z"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"repository":{"type":"git","url":"git://github.com/wearefractal/benji.git"},"_attachments":{"benji-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ALie1vErkUESfnJe3qRzUw==","length":1969,"stub":true}}}},
{"id":"berry","key":"berry","value":{"rev":"13-6dea9d69e44ef28713ac169dec356a4f"},"doc":{"_id":"berry","_rev":"13-6dea9d69e44ef28713ac169dec356a4f","name":"berry","description":"test framework","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"berry","description":"test framework","homepage":"https://github.com/truepattern/berry","version":"0.0.1","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"underscore":">= 1.3.3","mocha":">= 1.0.3","superagent":">= 0.4.1","should":">= 0.6.3","chai":">= 1.0.1"},"devDependencies":{},"keywords":["bdd","test","framework","server","rest"],"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"berry@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4d9a7fbbcfc5cd5eef3104fccdb8e6ec6081eea4","tarball":"http://registry.npmjs.org/berry/-/berry-0.0.1.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.2":{"name":"berry","description":"test framework","homepage":"https://github.com/truepattern/berry","version":"0.0.2","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"underscore":">= 1.3.3","mocha":">= 1.0.3","superagent":">= 0.4.1","should":">= 0.6.3","chai":">= 1.0.1"},"devDependencies":{},"keywords":["bdd","test","framework","server","rest"],"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"berry@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b10541b875597fe306b233a1b19f5033fbfdc395","tarball":"http://registry.npmjs.org/berry/-/berry-0.0.2.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.3":{"name":"berry","description":"test framework","homepage":"https://github.com/truepattern/berry","version":"0.0.3","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"underscore":">= 1.3.3","mocha":">= 1.0.3","superagent":">= 0.4.1","should":">= 0.6.3","chai":">= 1.0.1"},"devDependencies":{},"keywords":["bdd","test","framework","server","rest"],"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"berry@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f7730797a90a516efb0aa9d5d9749c0cb50c885b","tarball":"http://registry.npmjs.org/berry/-/berry-0.0.3.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.4":{"name":"berry","description":"test framework","homepage":"https://github.com/truepattern/berry","version":"0.0.4","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"underscore":">= 1.3.3","mocha":">= 1.0.3","superagent":">= 0.4.1","should":">= 0.6.3","chai":">= 1.0.1"},"devDependencies":{},"keywords":["bdd","test","framework","server","rest"],"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"berry@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3786a5c78ce176d71771222e44f11277677d04a9","tarball":"http://registry.npmjs.org/berry/-/berry-0.0.4.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.0.5":{"name":"berry","description":"test framework","homepage":"https://github.com/truepattern/berry","version":"0.0.5","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"underscore":">= 1.3.3","mocha":">= 1.0.3","superagent":">= 0.4.1","should":">= 0.6.3","chai":">= 1.0.1"},"devDependencies":{},"keywords":["bdd","test","framework","server","rest"],"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"berry@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"657e9497d92474a89cb65075096a41da29f8d8d3","tarball":"http://registry.npmjs.org/berry/-/berry-0.0.5.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]},"0.1.0":{"name":"berry","description":"test framework","homepage":"https://github.com/truepattern/berry","version":"0.1.0","author":{"name":"truepattern","email":"admin@truepattern.com"},"dependencies":{"underscore":">= 1.3.3","mocha":">= 1.0.3","superagent":">= 0.4.1","should":">= 0.6.3","chai":">= 1.0.1"},"devDependencies":{},"keywords":["bdd","test","framework","server","rest"],"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"main":"index","scripts":{"prepublish":"npm prune"},"engines":{"node":">= 0.5.0 < 0.7.0"},"_npmUser":{"name":"truepattern","email":"admin@truepattern.com"},"_id":"berry@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4d7598130bf587958386c81a876a99eb0f7500b4","tarball":"http://registry.npmjs.org/berry/-/berry-0.1.0.tgz"},"maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}]}},"readme":"# berry\nBDD Test Framework . Based on mocha, superagent, chai.\n\n# Features\n * helps in crud testing\n * please check in todo-server test directory for usage\n\n**ALPHA product, use at your risk, please refer to examples and todo-server**\n\n","maintainers":[{"name":"truepattern","email":"admin@truepattern.com"}],"time":{"modified":"2012-06-28T08:43:10.667Z","created":"2012-05-21T04:58:59.518Z","0.0.1":"2012-05-21T04:59:00.737Z","0.0.2":"2012-05-21T05:41:42.944Z","0.0.3":"2012-05-21T06:14:26.775Z","0.0.4":"2012-06-25T06:41:25.142Z","0.0.5":"2012-06-25T08:02:59.238Z","0.1.0":"2012-06-28T08:43:10.667Z"},"author":{"name":"truepattern","email":"admin@truepattern.com"},"repository":{"type":"git","url":"git://github.com/truepattern/berry.git"},"_attachments":{"berry-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-GQwqP4P4W/+fd61tsQP/3w==","length":2722,"stub":true},"berry-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-1pB4s0K83WgD3EGuaKEkDA==","length":2523,"stub":true},"berry-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-eqxybl8KbtHTnkXF+LG0QQ==","length":2509,"stub":true},"berry-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-N5PRSu5FkNeoQshLSmvdmw==","length":2363,"stub":true},"berry-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6khSbt+1fX0Dl3rRCguSkQ==","length":2377,"stub":true},"berry-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-42C98MpB/Xgh3LoLi868Ig==","length":2344,"stub":true}}}},
{"id":"beseda","key":"beseda","value":{"rev":"85-c89318b6889446db4c335da3dd0fca30"},"doc":{"_id":"beseda","_rev":"85-c89318b6889446db4c335da3dd0fca30","name":"beseda","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","dist-tags":{"latest":"0.2.5"},"versions":{"0.0.1":{"name":"beseda","version":"0.0.1","description":"Beseda is fast and well designed Pub/Sub server with server-side and crossbrowser client-side API for realtime messaging.","keywords":["pub/sub","socket.io","bayeux"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_id":"beseda@0.0.1","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c35f3d8ab5b913b2d6f6692034e7258ac67c7d93","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.1.tgz"},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.2":{"name":"beseda","version":"0.0.2","description":"Beseda is fast and well designed Pub/Sub server with server-side and crossbrowser client-side API for realtime messaging.","keywords":["pub/sub","socket.io","bayeux"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_id":"beseda@0.0.2","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5b63b726219bd8ee4359e328696cedde1d0d7493","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.2.tgz"},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.3":{"name":"beseda","version":"0.0.3","description":"Beseda is fast and well designed Pub/Sub server with server-side and crossbrowser client-side API for realtime messaging.","keywords":["pub/sub","socket.io","bayeux","comet"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_id":"beseda@0.0.3","_engineSupported":true,"_npmVersion":"0.3.17","_nodeVersion":"v0.4.3","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2047b78d6ce67b7dd1611270d5aa088a689d9124","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.3.tgz"},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.5":{"name":"beseda","version":"0.0.5","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0","cli":">=0.3.3"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"devDependencies":{},"_id":"beseda@0.0.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"37f45c2b3168c875b92213b491d5a24da211658b","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.5.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.6":{"name":"beseda","version":"0.0.6","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0","cli":">=0.3.3"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"devDependencies":{},"_id":"beseda@0.0.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0aa0bbc4dba3fc4d27a299619e7b7123e103ca2e","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.6.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.7":{"name":"beseda","version":"0.0.7","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"devDependencies":{},"_id":"beseda@0.0.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a424759276176519d9bcda2cf79ffb57688e781d","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.7.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.8":{"name":"beseda","version":"0.0.8","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"devDependencies":{},"_id":"beseda@0.0.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e764252da140bff5fcc6d60fb49ebeb8e5a81855","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.8.tgz"},"scripts":{},"directories":{},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]},"0.0.9":{"name":"beseda","version":"0.0.9","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis-node":">=0.4.0","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmJsonOpts":{"file":"/Users/ivanshumkov/.npm/beseda/0.0.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beseda@0.0.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"71070c38e7e8056311d3666fd038927709bb2a42","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.9.tgz"},"scripts":{},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.0.10":{"name":"beseda","version":"0.0.10","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.5","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmJsonOpts":{"file":"/Users/ivanshumkov/.npm/beseda/0.0.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beseda@0.0.10","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"298127c3a560ccbe2584e0b1d87de2d35a8c075a","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.0.10.tgz"},"scripts":{},"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.1.0":{"name":"beseda","version":"0.1.0","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.5","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmJsonOpts":{"file":"/home/max/.npm/beseda/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"beseda@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8b980ed1aafaaf725a815b0845c9cd87ccd438ce","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.1.0.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"directories":{}},"0.1.1":{"name":"beseda","version":"0.1.1","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.1.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"082e948a6e9074d342b8e6bf463b9d76a510a8fb","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.1.1.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.1.2":{"name":"beseda","version":"0.1.2","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.1.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0c4f1b42f24cb25e254345310396c151928ee77f","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.1.2.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.2.0":{"name":"beseda","version":"0.2.0","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6c02e88e27dee23279063c7d760721d8198483d6","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.2.0.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.2.1":{"name":"beseda","version":"0.2.1","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*","qs":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"77de5065b35b6d258ae006fc818488048abe94e1","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.2.1.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.2.2":{"name":"beseda","version":"0.2.2","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*","qs":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f886b835c4ec6cbe924c0fc70fe8954d1273bb4a","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.2.2.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.2.3":{"name":"beseda","version":"0.2.3","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*","qs":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"21b3e5e29eb0f875fd5f2596034b1fe5af0d494b","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.2.3.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.2.4":{"name":"beseda","version":"0.2.4","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*","qs":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.2.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"621309b11283adb6cf3a6cdeef68c950b3750f59","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.2.4.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"directories":{}},"0.2.5":{"name":"beseda","version":"0.2.5","description":"Beseda is fast, well designed and featured Pub/Sub server. Beseda offers multiple platform API to develop realtime web applications.","keywords":["pub/sub","commet","bayeux","realtime","push","WebSocket"],"homepage":"http://geometria-lab.net","author":{"name":"Geometria Lab"},"contributors":[{"name":"Ivan Shumkov","email":"ivan@shumkov.ru"},{"name":"Sergey Kononenko","email":"kononencheg@gmail.com"}],"main":"./server","bin":{"beseda-client":"./bin/client.js","beseda-server":"./bin/server.js","beseda-benchmarks":"./bin/benchmarks.js"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"dependencies":{"redis":">=0.6.6","cli":">=0.3.3","websocket-client":"*","qs":"*"},"engines":["node >=0.4.11"],"licenses":[{"type":"BSD","url":"http://www.opensource.org/licenses/bsd-license.php"}],"_npmUser":{"name":"shumkov","email":"ivan@shumkov.ru"},"_id":"beseda@0.2.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"da701ca5a49d78616ecf5daacc8a7af85792b707","tarball":"http://registry.npmjs.org/beseda/-/beseda-0.2.5.tgz"},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}]}},"maintainers":[{"name":"shumkov","email":"ivan@shumkov.ru"}],"time":{"modified":"2012-05-10T09:22:07.702Z","created":"2011-04-04T14:40:45.706Z","0.0.1":"2011-12-08T15:24:13.434Z","0.0.2":"2011-12-08T15:24:13.434Z","0.0.3":"2011-12-08T15:24:13.434Z","0.0.5":"2011-12-08T15:24:13.434Z","0.0.6":"2011-12-08T15:24:13.434Z","0.0.7":"2011-12-08T15:24:13.434Z","0.0.8":"2011-12-08T15:24:13.434Z","0.0.9":"2011-12-08T15:24:13.434Z","0.0.10":"2011-12-08T15:24:13.434Z","0.1.0":"2011-12-08T15:24:13.434Z","0.1.1":"2011-11-08T15:35:23.734Z","0.1.2":"2011-11-30T07:36:43.653Z","0.2.0":"2011-12-08T15:24:13.434Z","0.2.1":"2012-03-27T13:25:13.893Z","0.2.2":"2012-03-29T14:46:18.307Z","0.2.3":"2012-04-06T09:55:30.499Z","0.2.4":"2012-04-09T15:01:52.971Z","0.2.5":"2012-05-10T09:22:07.702Z"},"author":{"name":"Geometria Lab"},"repository":{"type":"git","url":"git://github.com/geometria-lab/Beseda.git"},"_attachments":{"beseda-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-ZZQ3ZT1V1m5YwI698Wr3wg==","length":4366740,"stub":true},"beseda-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-LeoF68GfPuBFdf+gGT1yqg==","length":4062597,"stub":true},"beseda-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-PfXHkSiZLEso0OGMlP7pXA==","length":4062598,"stub":true},"beseda-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-V3myroyArUK0zAvzNwjueA==","length":4061984,"stub":true},"beseda-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-H0xy5qa1+6bVvRwrxARIWQ==","length":4061882,"stub":true},"beseda-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-2M7ot2b0jpdn2FUve5R4RA==","length":4061894,"stub":true},"beseda-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-xXC1rjR/+pKinoC7Jt6QdQ==","length":4061550,"stub":true},"beseda-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-AFVDg/XIByWu8efHHXVCMw==","length":4059544,"stub":true},"beseda-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-cZ+hJaycNTQhSgXjDqEYcA==","length":4059801,"stub":true},"beseda-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-TtpedBGfkOIrIPg2uuv4vg==","length":3966902,"stub":true},"beseda-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-wn3G5FLXnndnpeJbX+W7XA==","length":3966834,"stub":true},"beseda-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-EALJcYWmBAJEd5PLTxrH+w==","length":3962744,"stub":true},"beseda-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-efrFHtDeRQya2i2jGp7kHw==","length":3962333,"stub":true},"beseda-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-oU2A+8NcWvWJtSshvYruUw==","length":4205330,"stub":true},"beseda-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-28uO1xirJOGjuiyqBs6A1A==","length":4205241,"stub":true},"beseda-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-N/O7Zs9fP89m3trzmeYhrg==","length":239776,"stub":true},"beseda-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pOIdQnv79VCW8f0PWLIpRA==","length":2546031,"stub":true},"beseda-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ha9CM3rvAq6qw6cFmal7Yw==","length":2495762,"stub":true}}}},
{"id":"besio","key":"besio","value":{"rev":"25-9deaad06b74264d4302b746fdbe10414"},"doc":{"_id":"besio","_rev":"25-9deaad06b74264d4302b746fdbe10414","name":"besio","description":"Node Binary Event Stream IO","dist-tags":{"latest":"0.1.8"},"versions":{"0.0.1":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.0.1","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","engines":{"node":"~0.6.9"},"dependencies":{"binson":"~0.0.1","winston":"~0.5.10"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"tellnes","email":"christian@tellnes.no"},"_id":"besio@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"8760282b5f2810b41dab18a92dfb5a53051b977c","tarball":"http://registry.npmjs.com/besio/-/besio-0.0.1.tgz"},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}],"directories":{}},"0.1.0":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.0","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","engines":{"node":"*"},"dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1"},"devDependencies":{},"optionalDependencies":{},"_id":"besio@0.1.0","dist":{"shasum":"9cdbaad7f84d869cd168ffef6c95b28343bbd1a9","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.0.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}],"directories":{}},"0.1.1":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.1","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","engines":{"node":"*"},"dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1"},"devDependencies":{},"optionalDependencies":{},"_id":"besio@0.1.1","dist":{"shasum":"86254836a10a9f944a9391580e3c4eac2ef2eca7","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.1.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}],"directories":{}},"0.1.2":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.2","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","_id":"besio@0.1.2","dist":{"shasum":"5c4a4b1a72df552546fe0103bd91390af5790fc2","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.2.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.3":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.3","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1","node-uuid":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","_id":"besio@0.1.3","dist":{"shasum":"9c3a733ac752f1d7528a06f973abc8276a1fdbc8","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.3.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.4":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.4","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1","node-uuid":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","_id":"besio@0.1.4","dist":{"shasum":"e2f0cc2fda4093b6f2af04084b63986415977db1","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.4.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.5":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.5","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1","node-uuid":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","_id":"besio@0.1.5","dist":{"shasum":"07a89f2902f7f4324c31d307546db7689566e244","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.5.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.6":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.6","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1","node-uuid":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","_id":"besio@0.1.6","dist":{"shasum":"4ff17a31f3bb93a6733cab56d758b81492abe3aa","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.6.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.7":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.7","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1","node-uuid":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","_id":"besio@0.1.7","dist":{"shasum":"bf2de03e895692e7a18a9112d08a7a65ad8b67b2","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.7.tgz"},"readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.1.8":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"besio","description":"Node Binary Event Stream IO","version":"0.1.8","repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"main":"lib/","dependencies":{"binson":"~0.0.2","debug":"~0.7.0","weak":"~0.2.1","node-uuid":"~1.3.3"},"devDependencies":{},"optionalDependencies":{},"directories":{"example":"examples"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"license":"MIT","readme":"# Besio\n\nBesio is a Node.js project that allows you to emit events and stream data over a TCP connection.\n\n## How to Install\n\n    npm install besio\n\n## How to use\n\nRequire:\n\n```js\nvar besio = require('besio');\n```\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.emit('hello', function(message) {\n    console.log('Client says: ' + message); // Client says: Hello World\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nclient.on('hello', function(cb) {\n  console.log('Hello from server');\n  cb('Hello World'); // Send message to server\n});\n```\n\n## Emit streams\n\nserver.js\n\n```js\nvar server = besio.createServer(function(client) {\n  client.on('stdin', function(stream) {\n    stream.pipe(process.stdout);\n  });\n  client.on('stdout', function(stream) {\n    process.stdin.resume();\n    process.stdin.pipe(stream);\n  });\n});\n\nserver.listen(4746, function() {\n  console.log('Server listening on port ' + this.address().port + ' and address ' + this.address().address);\n});\n```\n\nclient.js\n\n```js\nvar client = besio.connect(4746);\n\nprocess.stdin.resume();\n\nclient.emit('stdin', process.stdin);\nclient.emit('stdout', process.stdout);\n```\n","_id":"besio@0.1.8","dist":{"shasum":"f2e1ebaa6a4bb695abf32f38b7c61e8ee43876ff","tarball":"http://registry.npmjs.com/besio/-/besio-0.1.8.tgz"},"maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]}},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}],"time":{"modified":"2012-08-12T18:30:23.238Z","created":"2012-03-12T14:48:53.538Z","0.0.1":"2012-03-12T14:48:57.603Z","0.1.0":"2012-07-12T12:06:35.407Z","0.1.1":"2012-07-13T15:41:30.483Z","0.1.2":"2012-08-07T13:31:49.248Z","0.1.3":"2012-08-07T14:20:29.897Z","0.1.4":"2012-08-07T23:50:55.753Z","0.1.5":"2012-08-07T23:58:53.631Z","0.1.6":"2012-08-08T20:15:08.964Z","0.1.7":"2012-08-08T21:27:29.139Z","0.1.8":"2012-08-12T18:30:23.238Z"},"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"repository":{"type":"git","url":"git://github.com/tellnes/besio.git"},"_attachments":{"besio-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-IKjZNgEP7ov5zF/TJ+eHWg==","length":7644,"stub":true},"besio-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-EYOdsXIWQQSMRZ0IU++IaQ==","length":7605,"stub":true},"besio-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-HNzLhJaA+KFOJCKJRqWSWA==","length":7590,"stub":true},"besio-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-zlPQX7N9EHoZorrXKgzoRA==","length":7161,"stub":true},"besio-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-0Y02DfAnPGMbxGWm1iCubw==","length":7160,"stub":true},"besio-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-YCRQXqrxqssU5vbMfFZ7nQ==","length":7211,"stub":true},"besio-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-vpQ3VpyFVb5dqz/M1eeQ0w==","length":7138,"stub":true},"besio-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sdzCZlZhroyjik6ljoA6VQ==","length":7013,"stub":true},"besio-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7yj6PKwVrQtAeNXFUq3j+w==","length":7562,"stub":true},"besio-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9QDQ7aLmXBdnsqAV2/95yQ==","length":6057,"stub":true}}}},
{"id":"betfair-sports-api","key":"betfair-sports-api","value":{"rev":"55-0a81d2ce71c758f8ea7ef7b1b84280e4"},"doc":{"_id":"betfair-sports-api","_rev":"55-0a81d2ce71c758f8ea7ef7b1b84280e4","name":"betfair-sports-api","description":"Betfair Sports API for Node","dist-tags":{"latest":"0.4.4"},"versions":{"0.0.1":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.1","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"main":"index.js","dependencies":{"libxmljs":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4a0b596734d687672524ff23221ffd4cfd6f602f","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.1.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.2","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"main":"index.js","dependencies":{"libxmljs":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.2","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b4b2ed002b3432c874764a921bf010512dcd329f","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.2.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.0.3":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.3","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"main":"index.js","dependencies":{"libxmljs":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.3","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"02d474d04231fe1d00ed85d2dc2421bae25329f0","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.3.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.0.4":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.4","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"libxmljs":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.4","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"aaa662fefd771040a24ed0191ae854fa0f917453","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.4.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.0.5":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.5","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"libxmljs":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.5","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"96310518b38397175a9a05ef3aa597631058636b","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.5.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.0.6":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.6","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.6","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b9916de06c9d6f49267117f07b3dc4fcf709edb3","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.6.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.0.7":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.0.7","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.0.7","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9ae2402fe6c2587e4a0423a6a7a7e360a095b1ca","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.0.7.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.0":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.0","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e41c8971c75d3736418a38ccd61cf9893aa49e8a","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.0.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.1":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.1","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2a0f2fe059a5e41ffa59cf50e21de60718cb1866","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.1.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.2":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.2","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.2","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"771d2d6ea607720b51b568946154360df00013fa","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.2.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.3":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.3","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.3","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"1fc960c0593306cc3bd506be04ac53911d252558","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.3.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.4":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.4","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.4","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a7a1e216618cc09f4751ac59db27e0a8ce2b499e","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.4.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.5":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.5","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.5","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"8fe0bca565fd2538c87da86aa17053e993a3d7c3","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.5.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.6":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.6","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.6","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"1bd0cf1642c175c3299ff16d8c820571964d9f6c","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.6.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.7":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.7","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.7","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a88c3bfa1940bd9effe6a8fdbdfa33bd901a246f","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.7.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.8":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.8","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.8","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"aa736ffad8845b990dfe12f1993dabed8b1b850a","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.8.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.1.9":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.1.9","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.1.9","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"85d6af4fe23550e2f6a78ebefefe6bbde5944427","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.1.9.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.2.0":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.2.0","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.2.0","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f53ac863cb33b0c597bd77b3121162f5e6a52bfc","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.2.0.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.2.1":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.2.1","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.2.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"313bed595424d975c13cd6ddc06f103facb8d53d","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.2.1.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.2.2":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.2.2","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*","xml-writer":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.2.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b8992d0d9101c2e0a16ea4b7e4858f7bb9236bb8","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.2.2.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.2.3":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.2.3","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"dom-js":"*","async":"*","xml-writer":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.2.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"325ad9e97467e9b71216a7ba330de998ad11ce18","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.2.3.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.3.1":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.3.1","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"async":"*","xml-writer":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.3.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"3ede91780e5970a3a8bf52d329cc491935a8d0f2","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.3.1.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.4.1":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.4.1","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"async":"*","xml-writer":"*","easysax":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.4.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"28fbbf19138e5ea9bd169ba81f0cc1e8935d3a1a","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.4.1.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.4.3":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.4.3","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"async":"*","xml-writer":"*","easysax":"*","cookie":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.4.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"dd9b8e447951dfb91113d0adbbe905b2b693c54f","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.4.3.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]},"0.4.4":{"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"name":"betfair-sports-api","description":"Betfair Sports API for Node","version":"0.4.4","repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"keywords":["betfair"],"main":"index.js","dependencies":{"async":"*","xml-writer":"*","easysax":"*","cookie":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"BetfairTrader","email":"anton.zem@gmail.com"},"_id":"betfair-sports-api@0.4.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2a78fd210b4f7be99778b31e99312bf78f8f1da3","tarball":"http://registry.npmjs.org/betfair-sports-api/-/betfair-sports-api-0.4.4.tgz"},"maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}]}},"readme":"Betfair Sports API for Node.js\n===========================\n\n**Warning: Please do not use, it is unusable yet**\n\nInstallation\n------------\n\n    npm install betfair-sports-api\n    \n\nSynopsis\n--------\n\nAn example of using Betfair Sports API\n        \n    var betfairUser = \"user\";\n    var betfairPassword = \"password\";\n    \n    var betfairGlobalService = require(\"../lib/betfair_global_service.js\");\n    \n    var loginRequest = {\n        locationId : \"0\",\n        password : betfairPassword,\n        productId : \"82\",\n        username : betfairUser,\n        vendorSoftwareId : \"0\"\n    };\n    console.log(\"login Request:\");\n    console.log(loginRequest);\n    \n    var login = betfairGlobalService.login(loginRequest);\n    login.execute(function(resp) {\n        console.log(\"login Response:\");\n        console.log(resp);\n    });\n    \n\nAPI\n---\n\n### Session Management API ###\n\nSession Management API is used to open, close and get objects of BetfairSession class. \nThere may be multiple sessions at the same time to Betfair using different Betfair accounts. \n\n`openSession(login, password)` - starts a new session using provided login and password, returns sessionId\n\n`getSession(sessionId)` - returns the specified BetfairSession object\n\n`closeSession(sessionId)` - close session with given sessionId, sends logout\n\n'closeAllSessions()' - close all the sessions, sends logout \n\nExample:\n    var betfairSports = require(\"betfair-sports-api\");\n    \n    // open a session to Betfair API\n    var id = betfairSports.openSession(\"MyLogin\", \"MyPassword\");\n    var session = betfairSports.getSession(id);\n    \n### BetfairSession class ###\n\nnot yet written\n\n    \n\n\n\n\n","maintainers":[{"name":"BetfairTrader","email":"anton.zem@gmail.com"}],"time":{"modified":"2012-06-30T14:00:31.193Z","created":"2012-03-27T09:37:00.911Z","0.0.1":"2012-03-27T09:37:03.275Z","0.0.2":"2012-03-27T10:10:37.741Z","0.0.3":"2012-03-28T08:47:39.304Z","0.0.4":"2012-04-02T08:04:01.415Z","0.0.5":"2012-04-02T17:38:04.831Z","0.0.6":"2012-04-04T10:21:04.924Z","0.0.7":"2012-04-05T09:16:39.025Z","0.1.0":"2012-04-05T09:28:56.837Z","0.1.1":"2012-04-05T09:33:49.405Z","0.1.2":"2012-04-16T06:45:27.221Z","0.1.3":"2012-04-20T11:17:23.705Z","0.1.4":"2012-04-23T13:22:21.411Z","0.1.5":"2012-04-27T06:23:21.750Z","0.1.6":"2012-04-30T12:00:33.458Z","0.1.7":"2012-05-24T07:37:36.039Z","0.1.8":"2012-05-24T10:43:28.550Z","0.1.9":"2012-05-26T10:42:18.647Z","0.2.0":"2012-05-30T07:48:24.792Z","0.2.1":"2012-06-01T13:03:53.598Z","0.2.2":"2012-06-05T13:39:39.912Z","0.2.3":"2012-06-06T10:35:32.319Z","0.3.1":"2012-06-19T08:00:04.702Z","0.4.1":"2012-06-23T12:03:01.521Z","0.4.3":"2012-06-28T10:48:14.830Z","0.4.4":"2012-06-30T14:00:31.193Z"},"author":{"name":"Anton Zemlyanov","email":"anton.zem at google mail"},"repository":{"url":"https://github.com/BetfairTrader/betfair-sports-api"},"_attachments":{"betfair-sports-api-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-1STUZpduEzu7f4b0y+H20w==","length":26450,"stub":true},"betfair-sports-api-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-EjYYgSQ6XLbD1Y7fRJOVVA==","length":26677,"stub":true},"betfair-sports-api-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-VhjXscQJrZm9h0rl7qmm4A==","length":25927,"stub":true},"betfair-sports-api-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-R3sUdGkCF1mfkgJYWhC1Qw==","length":25767,"stub":true},"betfair-sports-api-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-1Fv0RQAeD7/+SZwfZmADyA==","length":18046,"stub":true},"betfair-sports-api-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-talR7vxsGm65AOa7Gwe+XA==","length":18051,"stub":true},"betfair-sports-api-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-uxo+PwmKh+/nNDCkINuHww==","length":18431,"stub":true},"betfair-sports-api-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-CyZqZy3JCkS9iz0Wt6pGfg==","length":18401,"stub":true},"betfair-sports-api-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-uPmVhj88weDmaZNeGM6I6A==","length":17850,"stub":true},"betfair-sports-api-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-KXFJaTj25f9keBEYed7JoA==","length":18060,"stub":true},"betfair-sports-api-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-aBCorT84n2zuYk3sW+sZdA==","length":17808,"stub":true},"betfair-sports-api-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-D+HVRiW6JZeMQ4aD8zlQoQ==","length":15608,"stub":true},"betfair-sports-api-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-sAZS9L5kQFkBX3DI+SND3w==","length":15829,"stub":true},"betfair-sports-api-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-fluArl4JaRpSdSJFRMniQA==","length":15470,"stub":true},"betfair-sports-api-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Htxic4ssOWuxsQjI2Jemvg==","length":15070,"stub":true},"betfair-sports-api-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-24BzTm57F1jFsKdflm2YIg==","length":15047,"stub":true},"betfair-sports-api-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-hgu1mJezaU6NGRiWoh0Eqw==","length":12298,"stub":true},"betfair-sports-api-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-r0M71b/97MUQzOHhqdxNzA==","length":12290,"stub":true},"betfair-sports-api-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-EqKLTaDfmjC3PCZBhwhjoA==","length":12266,"stub":true},"betfair-sports-api-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-xXcvgZX/sY60C2X/yFRbLA==","length":10966,"stub":true},"betfair-sports-api-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-gG4tiYhbpmS4bxPPx2d9xw==","length":9803,"stub":true},"betfair-sports-api-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-J5XqFGudLoHE06aC+09ctQ==","length":10095,"stub":true},"betfair-sports-api-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IU7A1zJt70z1t5tKL2owFw==","length":6487,"stub":true},"betfair-sports-api-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-vILZty1OS3nk1gBoSxijYw==","length":5262,"stub":true},"betfair-sports-api-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VMLOLMNBuZ5eIZU6O+YvSw==","length":5256,"stub":true}}}},
{"id":"better-assert","key":"better-assert","value":{"rev":"4-35aa28ecc675842286eec8cea5dace61"},"doc":{"_id":"better-assert","_rev":"4-35aa28ecc675842286eec8cea5dace61","name":"better-assert","description":"Better assertions for node, reporting the expr, filename, lineno etc","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"better-assert","version":"0.0.1","description":"Better assertions for node, reporting the expr, filename, lineno etc","keywords":["assert","stack","trace","debug"],"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"dependencies":{"callsite":"*"},"main":"index","engines":{"node":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"better-assert@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"ee66ff8dcad3511e0bbb0b3eccb858e64373a236","tarball":"http://registry.npmjs.org/better-assert/-/better-assert-0.0.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"\n# better-assert\n\n  Better in-application assertions for node, reporting the expr, filename, lineno etc using [callsite](https://github.com/visionmedia/callsite).\n\n## Installation\n\n    $ npm install better-assert\n\n## Example\n\n By default assertions are disabled, so the calls to `assert()` will simply be ignored. Use the __ASSERT__ env var to enable:\n\n```js\nvar assert = require('better-assert');\n\nvar user = { authenticated: false };\nassert(user.authenticated);\n\nuser.authenticated = true;\nassert(user.authenticated);\n\nuser.authenticated = 0;\nassert(user.authenticated);\n```\n\noutputting:\n\n![assertions](http://f.cl.ly/items/1F1W0H0h2T0L233L352o/Screenshot.png)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-06T12:41:16.247Z","created":"2011-11-30T03:06:15.220Z","0.0.1":"2011-11-30T03:06:16.614Z"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca"},"users":{"sjonnet19":true},"_attachments":{"better-assert-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-U7Aih3rHEw5lDzr9jBcjbw==","length":10240,"stub":true}}}},
{"id":"better-buffer","key":"better-buffer","value":{"rev":"5-725cc365cfcafd9b8baa644402c79c68"},"doc":{"_id":"better-buffer","_rev":"5-725cc365cfcafd9b8baa644402c79c68","name":"better-buffer","description":"Buffer subclass with some smack-your-head-obvious methods (push, pop, growToAccommodate, clone, dataLength, etc.)","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"bryn austin bellomy","email":"bryn@signals.io","url":"http://signals.io"},"name":"better-buffer","description":"Buffer subclass with some smack-your-head-obvious methods (push, pop, growToAccommodate, clone, dataLength, etc.)","version":"0.0.1","homepage":"http://github.com/brynbellomy/node-better-buffer","repository":{"url":"git://github.com/brynbellomy/node-better-buffer.git"},"main":"lib/index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bryn","email":"bryn.bellomy@gmail.com"},"_id":"better-buffer@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"9c6aa1be935c1b09caf315cf786a78822aaee718","tarball":"http://registry.npmjs.org/better-buffer/-/better-buffer-0.0.1.tgz"},"maintainers":[{"name":"bryn","email":"bryn.bellomy@gmail.com"}]},"0.0.2":{"author":{"name":"bryn austin bellomy","email":"bryn@signals.io","url":"http://signals.io"},"name":"better-buffer","description":"Buffer subclass with some smack-your-head-obvious methods (push, pop, growToAccommodate, clone, dataLength, etc.)","version":"0.0.2","homepage":"http://github.com/brynbellomy/node-better-buffer","repository":{"url":"git://github.com/brynbellomy/node-better-buffer.git"},"main":"lib/index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bryn","email":"bryn.bellomy@gmail.com"},"_id":"better-buffer@0.0.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"550873a29c46bbf729964b9f045590dd2545c3cb","tarball":"http://registry.npmjs.org/better-buffer/-/better-buffer-0.0.2.tgz"},"maintainers":[{"name":"bryn","email":"bryn.bellomy@gmail.com"}]}},"readme":"# // better-buffer\n\npart of me wanted to call this module `node-miyagi`.\n\nplease god let someone get the joke.  preferably a girl.  preferably gorgeous.\n\n# why\n\nIt blows my mind that these methods don't exist on the core node.js `Buffer`\nobject.  srsly guise?\n\n# what\n\n## BetterBuffer(initialSize, growSize = 512)\n\nConstructor is compatible with existing `Buffer` constructor, but also adds an\noptional `growSize` parameter.  The only time that a `BetterBuffer` will grow\nis when you call the `growToAccommodate()` method -- there's no auto-growing on\n`BetterBuffer::pushBack()` or `Buffer::copy()` -- at least not yet.\n\n## BetterBuffer::growToAccommodate (dataLengthToAccommodate)\n\nEnsures that the buffer is at least big enough to store `dataLengthToAccommodate`\noctets.  The buffer will grow in intervals defind by its `growSize` member, so\nyou may sometimes end up with a buffer that's slightly larger than necessary.\n\n## BetterBuffer::pushBack (sourceBuffer)\n\nQueue-like functionality for buffers. Appends `sourceBuffer` to the buffer at\nthe end of that buffer's actual data, as indicated by its `dataLength` member. So\nfor example, if you have:\n\n```javascript\nvar myBuffer = new BetterBuffer(10, 5);\n// myBuffer.length == 10\n// myBuffer.dataLength == 0\n```\n\n...and you append, say, `secondBuffer`, the `length` of which is `6`:\n\n```javascript\nmyBuffer.pushBack(secondBuffer);\n// myBuffer.length == 10\n// myBuffer.dataLength == 6\n```\n\n`myBuffer.dataLength` is now 6.  Now let's append `thirdBuffer`, the length of\nwhich is `2`:\n\n```javascript\nmyBuffer.pushBack(thirdBuffer);\n// myBuffer.length == 10\n// myBuffer.dataLength == 8\n```\n\n`myBuffer.dataLength` is now 8, and `thirdBuffer` was written into `myBuffer`\nstarting at position 6.\n\nIn combination with `BetterBuffer::popFront()`, this makes it much easier to\ncreate queue- or stream-like behavior using simple buffer objects.\n\nThe buffer's `dataLength` property is incremented accordingly.\n\n## BetterBuffer::popFront (num)\n\nJust a simple `pop` function, like you'd find on a stack or queue.  Hacks off the\nfirst `num` octets in the buffer, shifts everything in the buffer forward by the\nsame distance, and returns the popped octets in a new `BetterBuffer` object.\n\nThe buffer's `dataLength` property is decremented accordingly.\n\n## BetterBuffer::cloneDataIntoNewBuffer ()\n\nCreates a new `BetterBuffer` containing an exact copy of the contents of the\nbuffer.  __NOTE:__ the returned buffer's size is equal to the source buffer's\n`dataLength` property, not its `length` property.\n\nFor example, let's say you have a buffer `myBuffer` of size `256`, and you've only\n`pushBack`ed one buffer of size `100` into it.  This means that `myBuffer.length`\nis `256`, but `myBuffer.dataLength` is `100`. So when you call\n`cloneDataIntoNewBuffer`, it will return a buffer of size `100`, not `256`.\n\n# tl;dr (for the hyperactive and/or distractible)\n\n```javascript\nvar myBuf = new BetterBuffer(10, 5);\nmyBuf.fill(0x00);\n// myBuf.length == 10\n// myBuf.dataLength == 0\n// myBuf = <Buffer 00 00 00 00 00 00 00 00 00 00>\n\nvar smallerBuffer = new BetterBuffer(8);\nsmallerBuffer.fill(0xff); \n// smallerBuffer.length == 8\n// smallerBuffer.dataLength == 0\n// smallerBuffer = <Buffer ff ff ff ff ff ff ff ff>\n\n// now we explicitly set smallerBuffer.dataLength -- it's not necessary, but\n// it makes things clearer conceptually\nsmallerBuffer.dataLength = smallerBuffer.length;\n\n// what happens when we call growToAccommodate to ensure we have enough room?\nmyBuf.growToAccommodate(smallerBuffer.dataLength);\n// smallerBuffer is smaller than myBuf, so myBuf.length is still 10\n\n// go ahead and eat the smaller buffer\nmyBuf.pushBack(smallerBuffer); \n// myBuf = <Buffer ff ff ff ff ff ff ff ff 00 00>\n// myBuf.length == 10\n// myBuf.dataLength == 8\n\nvar anotherBuffer = new BetterBuffer(8);\nanotherBuffer.fill(0xaa);\n// anotherBuffer.length == 8\n// anotherBuffer.dataLength == 0\n// anotherBuffer = <Buffer aa aa aa aa aa aa aa aa>\n\n// again, we explicitly set anotherBuffer.dataLength for the sake of code readability\nanotherBuffer.dataLength = anotherBuffer.length;\n\n// let's try calling growToAccommodate again and see if anything happens this time\nmyBuf.growToAccommodate(myBuf.dataLength + anotherBuffer.dataLength);\n// now, myBuf.length == 20 because:\n//     myBuf.dataLength == 8\n//     anotherBuffer.dataLength == 8\n// and myBuf.growSize == 5 (myBuf's initial size was 10, and 10 + 5 + 5 == 20)\n\n// now we can pushBack() safely\nmyBuf.pushBack(anotherBuffer);\n// myBuf = <Buffer ff ff ff ff ff ff ff ff aa aa aa aa aa aa aa aa 00 00 00 00>\n// myBuf.length == 20\n// myBuf.dataLength == 16\n\n// and just for good measure let's tack on a shitty example of popFront()\nvar justAPiece = myBuf.popFront(5);\n// justAPiece = <Buffer ff ff ff ff ff>\n// myBuf = <Buffer ff ff ff aa aa aa aa aa aa aa aa 00 00 00 00>\n```\n\n# Authors and contributors\nbryn austin bellomy < [bryn@signals.io](mailto:bryn@signals.io) >\n\n# License (MIT license)\nCopyright (c) 2012 bryn austin bellomy, [signalenvelope / signals.io »](http://signals.io)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"bryn","email":"bryn.bellomy@gmail.com"}],"time":{"modified":"2012-05-13T21:13:02.524Z","created":"2012-05-13T15:59:25.145Z","0.0.1":"2012-05-13T15:59:25.674Z","0.0.2":"2012-05-13T21:13:02.524Z"},"author":{"name":"bryn austin bellomy","email":"bryn@signals.io","url":"http://signals.io"},"repository":{"url":"git://github.com/brynbellomy/node-better-buffer.git"},"_attachments":{"better-buffer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-FG04VK1PeatdO6xNIvXGnw==","length":16383,"stub":true},"better-buffer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+lE8Ay+oHBlrergyqL/Qpw==","length":3875,"stub":true}}}},
{"id":"better-inspect","key":"better-inspect","value":{"rev":"3-d8682392b19d178e16cff0e55aa02676"},"doc":{"_id":"better-inspect","_rev":"3-d8682392b19d178e16cff0e55aa02676","name":"better-inspect","description":"Better output for node util.inspect","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"better-inspect","version":"0.0.1","description":"Better output for node util.inspect","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git://github.com/langpavel/node-better-inspect.git"},"keywords":["inspect"],"author":{"name":"Pavel Lang","email":"langpavel@phpskelet.org"},"license":"BSD","readme":"node-better-inspect\n===================\n\nBetter output for node's util.inspect","_id":"better-inspect@0.0.1","dist":{"shasum":"d381c74e6a94e68d7f1fec631141bfca7a6dfe5f","tarball":"http://registry.npmjs.org/better-inspect/-/better-inspect-0.0.1.tgz"},"maintainers":[{"name":"langpavel","email":"langpavel@phpskelet.org"}]}},"readme":"node-better-inspect\n===================\n\nBetter output for node's util.inspect","maintainers":[{"name":"langpavel","email":"langpavel@phpskelet.org"}],"time":{"modified":"2012-08-11T18:21:01.278Z","created":"2012-08-11T18:20:58.961Z","0.0.1":"2012-08-11T18:21:01.278Z"},"author":{"name":"Pavel Lang","email":"langpavel@phpskelet.org"},"repository":{"type":"git","url":"git://github.com/langpavel/node-better-inspect.git"},"_attachments":{"better-inspect-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qkiKfxRpxbJNalFHZLxf5A==","length":3952,"stub":true}}}},
{"id":"better-metrics","key":"better-metrics","value":{"rev":"11-40a11895522a671a254ea09ee77650a8"},"doc":{"_id":"better-metrics","_rev":"11-40a11895522a671a254ea09ee77650a8","name":"better-metrics","description":"This is an alternative port of Coda Hale's metrics library.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"better-metrics","description":"This is an alternative port of Coda Hale's metrics library.","version":"0.0.1","homepage":"https://github.com/felixge/node-better-metrics","repository":{"url":"git://github.com/felixge/node-better-metrics.git"},"main":"./index","scripts":{"test":"make test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"far":"0.0.7"},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"better-metrics@0.0.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"4e1aa7dbbf0e17731b7fb693cdc004607e0df81b","tarball":"http://registry.npmjs.org/better-metrics/-/better-metrics-0.0.1.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]},"0.0.2":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"better-metrics","description":"This is an alternative port of Coda Hale's metrics library.","version":"0.0.2","homepage":"https://github.com/felixge/node-better-metrics","repository":{"url":"git://github.com/felixge/node-better-metrics.git"},"main":"./index","scripts":{"test":"make test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"far":"0.0.7"},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"better-metrics@0.0.2","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"2e2de6669acbd23a4d5950f0844ef424ca7ac55b","tarball":"http://registry.npmjs.org/better-metrics/-/better-metrics-0.0.2.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]},"0.0.3":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"better-metrics","description":"This is an alternative port of Coda Hale's metrics library.","version":"0.0.3","homepage":"https://github.com/felixge/node-better-metrics","repository":{"url":"git://github.com/felixge/node-better-metrics.git"},"main":"./index","scripts":{"test":"make test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"far":"0.0.7"},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"better-metrics@0.0.3","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"2f9fc8bdd318c62bc393e3f78ccd8bde00db1009","tarball":"http://registry.npmjs.org/better-metrics/-/better-metrics-0.0.3.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]},"0.0.4":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"better-metrics","description":"This is an alternative port of Coda Hale's metrics library.","version":"0.0.4","homepage":"https://github.com/felixge/node-better-metrics","repository":{"url":"git://github.com/felixge/node-better-metrics.git"},"main":"./index","scripts":{"test":"make test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"far":"0.0.7"},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"better-metrics@0.0.4","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"31a09a436223a9d5522d3aded1f7b454106515f0","tarball":"http://registry.npmjs.org/better-metrics/-/better-metrics-0.0.4.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]},"0.0.5":{"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"name":"better-metrics","description":"This is an alternative port of Coda Hale's metrics library.","version":"0.0.5","homepage":"https://github.com/felixge/node-better-metrics","repository":{"url":"git://github.com/felixge/node-better-metrics.git"},"main":"./index","scripts":{"test":"make test"},"engines":{"node":"*"},"dependencies":{},"devDependencies":{"far":"0.0.7"},"_npmUser":{"name":"felixge","email":"felix@debuggable.com"},"_id":"better-metrics@0.0.5","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"05f72ed7c4da35a9a4bda9785bb404ac6a280466","tarball":"http://registry.npmjs.org/better-metrics/-/better-metrics-0.0.5.tgz"},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}]}},"maintainers":[{"name":"felixge","email":"felix@debuggable.com"}],"time":{"modified":"2011-11-07T23:07:19.884Z","created":"2011-11-07T16:09:56.314Z","0.0.1":"2011-11-07T16:09:58.041Z","0.0.2":"2011-11-07T17:03:21.070Z","0.0.3":"2011-11-07T21:04:46.742Z","0.0.4":"2011-11-07T22:04:59.136Z","0.0.5":"2011-11-07T23:07:19.884Z"},"author":{"name":"Felix Geisendörfer","email":"felix@debuggable.com","url":"http://debuggable.com/"},"repository":{"url":"git://github.com/felixge/node-better-metrics.git"},"_attachments":{"better-metrics-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-umVtkGYfkvzWHVxDeSZbNQ==","length":71680,"stub":true},"better-metrics-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-sq0WafYsmdSMYaoHVfcBbw==","length":71680,"stub":true},"better-metrics-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-JgqQDl0zpuSMQHOPIZ4Suw==","length":61440,"stub":true},"better-metrics-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0b+R9eHnvgbUsKhaFaKF9Q==","length":51200,"stub":true},"better-metrics-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OkeYySjxKB0uL+Dtm8HtbQ==","length":51200,"stub":true}}}},
{"id":"between","key":"between","value":{"rev":"3-fe01dcb9bcb8d96c52c8d370af4a331f"},"doc":{"_id":"between","_rev":"3-fe01dcb9bcb8d96c52c8d370af4a331f","name":"between","description":"generate arbitary strings that sort between two strings","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"between","version":"0.0.0","description":"generate arbitary strings that sort between two strings","homepage":"http://github.com/dominictarr/between","repository":{"type":"git","url":"git://github.com/dominictarr/between.git"},"dependencies":{},"devDependencies":{"assertions":"2","asynct":"1.1"},"scripts":{"test":"asynct test/index.js"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"between@0.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"51dd17de03af7baa43991d5ccfdc7415d00f1d98","tarball":"http://registry.npmjs.org/between/-/between-0.0.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-05-15T00:50:59.392Z","created":"2012-05-15T00:50:55.680Z","0.0.0":"2012-05-15T00:50:59.392Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/between.git"},"_attachments":{"between-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jTsKub7He+xAdixAyRGTSg==","length":1611,"stub":true}}}},
{"id":"bezos","key":"bezos","value":{"rev":"7-a5b4dd3b50ef75788e9b1e28a30741b9"},"doc":{"_id":"bezos","_rev":"7-a5b4dd3b50ef75788e9b1e28a30741b9","name":"bezos","description":"Signs requests to various Amazon APIs","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"bezos","description":"A utility that timestamps and signs requests to various Amazon APIs","version":"0.0.1","homepage":"http://github.com/hakanensari/bezos","author":{"name":"Hakan Ensari","email":"hakan.ensari@papercavalier.com"},"main":"./lib/bezos","directories":{"lib":"./lib/bezos"},"bugs":{"url":"http://github.com/hakanensari/bezos/issues"},"repository":{"type":"git","url":"git://github.com/hakanensari/bezos.git"},"dependencies":{},"devDependencies":{"coffee-script":"*","mocha":"*","should":"*"},"scripts":{"test":"node_modules/mocha/bin/mocha test/*.coffee"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"https://raw.github.com/hakanensari/bezos/master/LICENSE"}],"tags":["Amazon","API"],"_npmUser":{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"},"_id":"bezos@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9b603764b3349639e8bd48f5978aa192c59e1582","tarball":"http://registry.npmjs.org/bezos/-/bezos-0.0.1.tgz"},"maintainers":[{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"}]},"0.0.2":{"name":"bezos","description":"Bezos signs requests to various Amazon APIs","version":"0.0.2","homepage":"https://github.com/hakanensari/bezos","author":{"name":"Hakan Ensari","email":"hakan.ensari@papercavalier.com"},"main":"./lib/bezos","directories":{"lib":"./lib/bezos"},"bugs":{"url":"https://github.com/hakanensari/bezos/issues"},"repository":{"type":"git","url":"git://github.com/hakanensari/bezos.git"},"dependencies":{},"devDependencies":{"coffee-script":"*","mocha":"*","should":"*"},"scripts":{"test":"node_modules/mocha/bin/mocha test/*.coffee"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"https://raw.github.com/hakanensari/bezos/master/LICENSE"}],"tags":["Amazon","API"],"_npmUser":{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"},"_id":"bezos@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"92c35e87b9e96bebcb00546f2ebf74c36977833d","tarball":"http://registry.npmjs.org/bezos/-/bezos-0.0.2.tgz"},"maintainers":[{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"}]},"0.0.3":{"name":"bezos","description":"Signs requests to various Amazon APIs","version":"0.0.3","homepage":"https://github.com/hakanensari/bezos","author":{"name":"Hakan Ensari","email":"hakan.ensari@papercavalier.com"},"main":"./lib/bezos","directories":{"lib":"./lib/bezos"},"bugs":{"url":"https://github.com/hakanensari/bezos/issues"},"repository":{"type":"git","url":"git://github.com/hakanensari/bezos.git"},"devDependencies":{"coffee-script":"*","mocha":"*","should":"*"},"scripts":{"test":"node_modules/mocha/bin/mocha test/*.coffee"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"https://raw.github.com/hakanensari/bezos/master/LICENSE"}],"tags":["Amazon","API"],"_npmUser":{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"},"_id":"bezos@0.0.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a3e8fd2fc5865d38cb60a6b1bd16393142aca962","tarball":"http://registry.npmjs.org/bezos/-/bezos-0.0.3.tgz"},"maintainers":[{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"}]}},"readme":"# Bezos\n\n[![Build Status] [status]] [travis]\n\n![bezos] [bezos]\n\n## Description\n\nBezos timestamps and signs requests to various Amazon APIs.\n\n## Installation\n\n```bash\nnpm install bezos\n```\n\n## Usage\n\n```coffee\nBezos = require 'bezos'\n\nbezos = new Bezos 'secret'\nbezos.sign url # optionally takes a HTTP method\n\n[status]: https://secure.travis-ci.org/hakanensari/bezos.png\n[travis]: http://travis-ci.org/hakanensari/bezos\n[bezos]: http://f.cl.ly/items/0v1h130h3Q181s3W312e/bezos.png\n","maintainers":[{"name":"hakanensari","email":"hakan.ensari@papercavalier.com"}],"time":{"modified":"2012-02-21T00:22:44.343Z","created":"2012-02-18T17:13:17.433Z","0.0.1":"2012-02-18T17:13:20.099Z","0.0.2":"2012-02-18T18:02:32.866Z","0.0.3":"2012-02-21T00:22:44.343Z"},"author":{"name":"Hakan Ensari","email":"hakan.ensari@papercavalier.com"},"repository":{"type":"git","url":"git://github.com/hakanensari/bezos.git"},"_attachments":{"bezos-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-dd4jtO0UwnvcFBeQqj9slw==","length":2823,"stub":true},"bezos-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-X6eNJKkmkE5DBax7urm3gA==","length":2834,"stub":true},"bezos-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xBOtYVAiW2MQfjXAWNWkeQ==","length":2905,"stub":true}}}},
{"id":"bf","key":"bf","value":{"rev":"14-d81312e1bf4f7202b801b4343199aa55"},"doc":{"_id":"bf","_rev":"14-d81312e1bf4f7202b801b4343199aa55","name":"bf","description":"Interpret brainfuck in node.js.","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"bf","version":"0.0.1","description":"Compile brainfuck into javascript.","modules":{"index":"./bf.js"},"repository":{"type":"git","url":"http://github.com/jesusabdullah/bf.js.git"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"dependencies":{"prompt":">= 0.0.2"},"engine":["node >=0.1.100"],"_id":"bf@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bf/-/bf-0.0.1.tgz"}},"0.0.2":{"name":"bf","version":"0.0.2","description":"Compile brainfuck into javascript.","main":"./bf.js","repository":{"type":"git","url":"git://github.com/jesusabdullah/bf.js.git"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"dependencies":{"prompt":">= 0.0.2"},"engine":["node >=0.1.100"],"_id":"bf@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"24e1fb0c8bae862c97674843f3a7a94a5b33a2aa","tarball":"http://registry.npmjs.org/bf/-/bf-0.0.2.tgz"}},"0.1.0":{"name":"bf","version":"0.1.0","description":"Interpret brainfuck in node.js.","main":"./bf.js","repository":{"type":"git","url":"git://github.com/jesusabdullah/bf.js.git"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"dependencies":{"prompt":"=0.1.x"},"engine":["node>=0.4"],"_npmJsonOpts":{"file":"/home/josh/.npm/bf/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bf@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"60bf3aa2d82c73a14bd54b6fabca133d763ca7bc","tarball":"http://registry.npmjs.org/bf/-/bf-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"bf","version":"0.1.1","description":"Interpret brainfuck in node.js.","main":"./bf.js","repository":{"type":"git","url":"git://github.com/jesusabdullah/bf.js.git"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"dependencies":{"prompt":"=0.1.x"},"engine":["node>=0.4"],"_npmJsonOpts":{"file":"/home/josh/.npm/bf/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bf@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c38294d1d0bdaac2725350212a18d46a122d154f","tarball":"http://registry.npmjs.org/bf/-/bf-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"bf","version":"0.1.2","description":"Interpret brainfuck in node.js.","main":"./bf.js","repository":{"type":"git","url":"git://github.com/jesusabdullah/bf.js.git"},"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"dependencies":{"prompt":"=0.1.x"},"engine":["node>=0.4"],"_npmJsonOpts":{"file":"/home/josh/.npm/bf/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bf@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"6486c90139cf248bc690aff344e89633d2f649ba","tarball":"http://registry.npmjs.org/bf/-/bf-0.1.2.tgz"},"scripts":{}}},"maintainers":[{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"author":{"name":"Joshua Holbrook","email":"josh.holbrook@gmail.com","url":"http://jesusabdullah.github.com"},"repository":{"type":"git","url":"git://github.com/jesusabdullah/bf.js.git"},"time":{"modified":"2011-07-08T02:56:32.018Z","created":"2011-04-03T00:18:52.857Z","0.0.1":"2011-04-03T00:18:52.857Z","0.0.2":"2011-04-03T00:18:52.857Z","0.1.0":"2011-07-03T19:42:39.057Z","0.1.1":"2011-07-06T03:47:40.526Z","0.1.2":"2011-07-08T02:56:32.018Z"},"_attachments":{"bf-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-2WAe19Lf2IEXS+XkzvwhVQ==","length":2159,"stub":true},"bf-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-RGlGWeHp/13yxTOxQxjCnA==","length":2078,"stub":true},"bf-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-wCmOwZ45XOKeB4TiJyJeFA==","length":2073,"stub":true},"bf-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-pYduwVYv9QeqJDui5gQVew==","length":2957,"stub":true},"bf-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7zRqI4x8T+NIMuhAIvhv8g==","length":3106,"stub":true}}}},
{"id":"bidar","key":"bidar","value":{"rev":"43-65656d2e7f9dcc5d2394c542d6b176a3"},"doc":{"_id":"bidar","_rev":"43-65656d2e7f9dcc5d2394c542d6b176a3","name":"bidar","dist-tags":{"latest":"0.4.4"},"versions":{"0.1.0":{"name":"bidar","version":"0.1.0","main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f675048de99af2db40f26f1bd277e10517d3ffc7","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.0.tgz"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}]},"0.1.1":{"name":"bidar","version":"0.1.1","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9a2987131d3c331a8035912ca454cf512d19445f","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.1.tgz"}},"0.1.2":{"name":"bidar","version":"0.1.2","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d48399d230ead07cd5430b210fc49d4ab0f7baf2","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.2.tgz"}},"0.1.3":{"name":"bidar","version":"0.1.3","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"300982c2f9b833c07d7ccece4150da7e3ce900ee","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.3.tgz"}},"0.1.5":{"name":"bidar","version":"0.1.5","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"8bb4edb6bd25a7de74a31e0d49a5e8d312557921","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.5.tgz"}},"0.1.6":{"name":"bidar","version":"0.1.6","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"02f09130295563b9b6a24eb87f1d958fa35ff514","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.6.tgz"}},"0.1.7":{"name":"bidar","version":"0.1.7","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.7","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"24332eac955002728b825e3e96a39afcad61f535","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.7.tgz"}},"0.1.8":{"name":"bidar","version":"0.1.8","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.8","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"5d2a56b6ca92b4a88f7cdc3c3710b5c05ffa9055","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.8.tgz"}},"0.1.9":{"name":"bidar","version":"0.1.9","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.1.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"90142908866443559c5b64c6e925d2c3806c3335","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.1.9.tgz"}},"0.2.0":{"name":"bidar","version":"0.2.0","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.2.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"491be177d5c990b444d5e9cc733d1a3c84ea628c","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.2.0.tgz"}},"0.2.1":{"name":"bidar","version":"0.2.1","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.2.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"870df1aedfb4327eae91a1a6a38e40718e7ce7b6","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.2.1.tgz"}},"0.2.2":{"name":"bidar","version":"0.2.2","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f963d908afcf62bbba06d9635ea3841e805dc7c4","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.2.2.tgz"}},"0.3.0":{"name":"bidar","version":"0.3.0","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.3.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b876532d2b5a64240fab9a761043237e3d75c1a7","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.3.0.tgz"}},"0.3.1":{"name":"bidar","version":"0.3.1","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.3.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"156c3015fa2946a6e71adf6385135d17a583c14c","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.3.1.tgz"}},"0.3.2":{"name":"bidar","version":"0.3.2","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.3.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"772d178e3f896df130dcf58fdeaf9e8cee6fa817","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.3.2.tgz"}},"0.3.3":{"name":"bidar","version":"0.3.3","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.3.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"043ac1b0260640c741f4fb6b499c81baf5c9c5c5","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.3.3.tgz"}},"0.4.0":{"name":"bidar","version":"0.4.0","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5","typ":"~0.5.1"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.4.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"5cca7c34656fa2adddf25d2ce0ef2eedb497af9b","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.4.0.tgz"}},"0.4.1":{"name":"bidar","version":"0.4.1","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5","typ":"~0.6.0"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.4.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6e077a21c3ca9c602e7f0e5e97f9a781ec20a782","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.4.1.tgz"}},"0.4.2":{"name":"bidar","version":"0.4.2","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5","typ":"~0.6.1"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.4.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"dbf35712fbbfcd2eb4c56e100095de7ec4cc1ee1","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.4.2.tgz"}},"0.4.3":{"name":"bidar","version":"0.4.3","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5","typ":"~0.6.1"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.4.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b3316434833ab1f8697afff452aaff6dee229ca8","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.4.3.tgz"}},"0.4.4":{"name":"bidar","version":"0.4.4","keywords":["object","serialization","data","graph"],"description":"Binary Data Representation (serialization format)","homepage":"https://github.com/Obvious/bidar","repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"main":"lib/bidar.js","engine":{"node":">=0.6.0"},"dependencies":{"oid":"~0.4.5","typ":"~0.6.1"},"scripts":{"test":"node test/test.js"},"_npmUser":{"name":"danfuzz","email":"danfuzz@milk.com"},"_id":"bidar@0.4.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4c788f743c4946959ce17ef2769c0d463165a7b4","tarball":"http://registry.npmjs.org/bidar/-/bidar-0.4.4.tgz"}}},"readme":"Bidar: Binary Data Representation.\n==================================\n\nOh no! Not another BSON?!?!\n\nActually, yes.\n\nThe fact of the proliferation of serialized data formats, and of\nbinary JSON-like formats in particular, is a fiat demonstration\nthat there isn't actually a solid consensus for a single unified and\nuniversal format. As such, I (Danfuzz) think it's a reasonable and\nprudent idea to continue the exploration of the design of these\nthings.\n\nTo be clear, I am not about to claim that the format defined here is\nthe One True Serialized JavaScript-Like Object Format. What I *will*\nclaim, though, is that this one is at a significantly different spot\nin the coordinate-space of possible serialization formats compared to\nthe other ones that showed up on my radar. As such, this one may turn\nout to be useful to folks in cases where the other existing solutions\ndon't seem to be particularly apropos.\n\nHere are the properties being aimed for here:\n\n* reasonably space-efficient\n\n* single-representation (non-equal binary forms implies\n  non-isomorphic / non-equal object forms)\n\n* without gratuitous quoting (e.g., look what happens when you put a\n  JSON-encoded string inside another JSON-encoded string; avoid\n  that!)\n\n* supports a buffer (binary blob) type\n\n* embraces as much of the JavaScript data model as is reasonably\n  possible. For example, this format differentiates `null` and\n  `undefined`. Why? Because you can tell the difference between them\n  in the purely-local case, and you shouldn't necessarily have to\n  change your code if you decide to interpose a serialization (e.g., a\n  machine boundary). I have no love of `undefined` myself and wish I\n  could do away with it, but I'm not about to try to do so wishfully.\n\n* supports \"holes\" where non-pure-data elements may be filled in.\n  More specifically, supports clients that want to be able to set\n  up function/callback-like things for over-the-wire communication.\n\n* supports non-tree graphs of objects. This includes both circular\n  structures and arbitrary acyclic graphs. Non-cycles might be\n  tempting to convert to trees on serialization, but that would have\n  poor interplay with the idea of \"holes\" (above). That is, once you\n  have \"holes,\" object identity starts to matter a lot more.\n\nNon-Goals:\n\n* partially streamable. If you want to incrementally stream a (notionally)\n  single structure, that can be done by defining a layer above this one.\n\n* random-access. If you need an index into a structure, then (as with the\n  previous item) it can be built as an additional layer.\n\nA few references:\n\n* [ASN.1](http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One)\n* [BSON](http://bsonspec.org/)\n* [BJSON](http://bjson.org/)\n* [JSON](http://www.json.org/) *(a classic)*\n* [MessagePack](http://msgpack.org/)\n* [Protocol Buffers](http://code.google.com/p/protobuf/)\n* [Smile](http://wiki.fasterxml.com/SmileFormatSpec)\n* [Thrift](http://thrift.apache.org/)\n* [Universal Binary JSON](http://ubjson.org/)\n\n\nExample\n-------\n\nOne of the major reasons for the development of this module was to\nhave the ability to sensibly manage and manipulate non-data \"holes\" in\nwhat is otherwise a graph of data objects, particularly so that two\nsides of a communication link can succeed in communicating about at\nleast some \"non-data-y things\" despite not being able to actually\nshare an address space.\n\nIn this example, imagine that the two sides (serializing and parsing)\ndo a bit more than the trivial transformations here. Hopefully, this\nis enough to give a flavor of things.\n\n(You can find this example in the `example` directory.)\n\n```javascript\nvar bidar = require(\"../\");\n\nfunction muffins() {\n    return \"muffins\";\n}\n\nfunction are() {\n    return \"are\";\n}\n\nfunction tasty() {\n    return \"tasty\";\n}\n\nfunction holeFilter(hole) {\n    return \"[\" + hole() + \"]\";\n}\n\nfunction holeReverser(hole) {\n    return \"<\" + hole + \">\";\n}\n\nvar message = [ muffins, are, \"very\", tasty ];\n\n// The \"sending\" side.\nvar serialized = bidar.serialize(message, holeFilter);\n\n// The \"receiving\" side.\nvar parsed = bidar.parse(serialized, holeReverser);\nconsole.log(parsed);\n```\n\nHere is a transcript of running it:\n\n```shell\n$ node example/transform.js\n[ '<[muffins]>', '<[are]>', 'very', '<[tasty]>' ]\n```\n\n\nFormat Details\n--------------\n\nThe format will be more fully described once it has baked a bit and\nseems stable. In the mean time, refer to the source. (It's got comments.)\n\n\nUsage\n-----\n\nThis library provides just a few top-level functions.\n\n### serialize(root, [holeFilter])\n\nSerialize an object graph, rooted at the given object, into binary form.\nReturns a buffer of the result. The hole filter, if provided is used as\na transformation on \"holes\" encoutered in the object graph.\n\nA \"hole\" is any object that is not representable as pure data. This\nincludes functions and (non-array, non-buffer) objects whose prototype\nis not the default object prototype.\n\nThe hole filter is called with a single argument -- the original\n\"hole\" object encountered in the graph -- and is expected to return a\nserializable pure data object in response. That object is marked as\na \"hole replacement\" in the serialized output.\n\n### function parse(buf, [holeFiller])\n\nParse a serialized form into an object graph, returning the root of the\ngraph as originally serialized. The `holeFiller`, if specified, is a\nfunction which is consulted to transform \"hole replacements\" (see the\ndescription of `serialize()` for more details) back into directly-usable\nobjects.\n\nThe entire contents of the given buffer are expeceted to be consulted\nin the process of parsing. If there is extra data at the end of the\nbuffer that is not needed, then this function throws an exception.\n\nThis will also throw an exception if there is insufficient data to\ncomplete the operation.\n\nAnd finally, this will throw an exception if given a serialized form\nthat has holes, if `holeFiller` was not specified.\n\n### parsePartial(buf, [startIndex], [holeFiller])\n\nThis is like `parse()`, except that only a portion of the input buffer\nis expected to be used. The `startIndex` (defaults to `0`) is the\nindex into the buffer at which to begin parsing. The optional `holeFilter`\nis the same as with `parse()`.\n\nThe return value of this call is a map of two values: `root` is bound\nto the root of the parsed object graph. `bytesConsumed` is bound to the\nnumber of bytes that were read from the buffer during the parse operation.\n\n### type\n\nThis is a sub-module that contains convenient utilities for type\ndetermination and related assertions. The author does not particularly\nrecommend the use of this module. It may drastically change over time,\nor may simply disappear.\n\n\nBuilding and Installing\n-----------------------\n\n```shell\nnpm install bidar\n```\n\nOr grab the source and\n\n```shell\nnode-waf configure build\n```\n\n\nTesting\n-------\n\n```shell\nnpm test\n```\n\nOr\n\n```shell\nnode ./test/test.js\n```\n\n\nTo Do\n-----\n\nKnown Deficiencies:\n\n* If there are extra properties on Buffer objects, they get silently\n  ignored. E.g.: On serialization, `foo` will get dropped with this\n  definition of `x`: `x = new Buffer(10); x.foo = \"bar\";`\n\n* Regex objects are currently considered holes. They should perhaps be\n  handled specially (as Buffer objects currently are).\n\n* Date objects are currently considered holes. They should perhaps be\n  handled specially (as Buffer objects currently are).\n\n\nContributing\n------------\n\nQuestions, comments, bug reports, and pull requests are all welcome.\nSubmit them at [the project on GitHub](https://github.com/Obvious/bidar/).\n\nBug reports that include steps-to-reproduce (including code) are the\nbest. Even better, make them in the form of pull requests that update\nthe test suite. Thanks!\n\n\nAuthor\n------\n\n[Dan Bornstein](https://github.com/danfuzz)\n([personal website](http://www.milk.com/)), supported by\n[The Obvious Corporation](http://obvious.com/).\n\n\nLicense\n-------\n\nCopyright 2012 [The Obvious Corporation](http://obvious.com/).\n\nLicensed under the Apache License, Version 2.0. \nSee the top-level file `LICENSE.txt` and\n(http://www.apache.org/licenses/LICENSE-2.0).\n","maintainers":[{"name":"danfuzz","email":"danfuzz@milk.com"}],"time":{"modified":"2012-07-02T18:42:06.388Z","created":"2012-03-28T16:50:32.830Z","0.1.0":"2012-03-28T16:50:33.928Z","0.1.1":"2012-03-28T17:03:05.253Z","0.1.2":"2012-03-29T01:09:16.459Z","0.1.3":"2012-03-29T01:16:41.440Z","0.1.5":"2012-03-29T01:24:36.653Z","0.1.6":"2012-03-30T00:18:00.865Z","0.1.7":"2012-04-02T16:50:08.331Z","0.1.8":"2012-04-02T23:50:47.593Z","0.1.9":"2012-04-05T03:41:02.243Z","0.2.0":"2012-04-08T20:15:49.831Z","0.2.1":"2012-04-09T19:29:48.563Z","0.2.2":"2012-04-09T22:01:35.500Z","0.3.0":"2012-04-09T22:57:46.186Z","0.3.1":"2012-04-10T06:41:58.589Z","0.3.2":"2012-05-03T18:30:58.462Z","0.3.3":"2012-05-26T21:29:39.715Z","0.4.0":"2012-06-25T23:57:54.415Z","0.4.1":"2012-06-29T19:40:50.620Z","0.4.2":"2012-07-02T18:08:21.434Z","0.4.3":"2012-07-02T18:34:38.553Z","0.4.4":"2012-07-02T18:42:06.388Z"},"description":"Binary Data Representation (serialization format)","author":{"name":"Dan Bornstein","email":"danfuzz@milk.com","url":"http://www.milk.com/"},"repository":{"type":"git","url":"git://github.com/Obvious/bidar.git"},"_attachments":{"bidar-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-2JDrmV7bPHGFxnYMwpm5dA==","length":22019,"stub":true},"bidar-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-buxvvaR8DUBAGyZGesmZdA==","length":22407,"stub":true},"bidar-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ZieUBjUsF+hVAdmoZ9DmEA==","length":22423,"stub":true},"bidar-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-FR2pay5kA0mLCKL/3F1ENg==","length":22439,"stub":true},"bidar-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-2ZhnFGimjhB7s1sFGJq4MQ==","length":24592,"stub":true},"bidar-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-H+WMhIwVE90p6vtBk+fOTQ==","length":24690,"stub":true},"bidar-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-v1xVzTfqVt54lfs5LeoDvQ==","length":24098,"stub":true},"bidar-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-lNvIN9AXFF1p3Udhx8LieA==","length":24012,"stub":true},"bidar-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-B2wumo79sK3k5MhqERKLMw==","length":24473,"stub":true},"bidar-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-R4Qk0++0A/evqppEq+yQoA==","length":23778,"stub":true},"bidar-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-YzQKh3efHdoH9jfNoIEB0Q==","length":22938,"stub":true},"bidar-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-ZwaIidhfkM94ZMIKnfegeQ==","length":22806,"stub":true},"bidar-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-YHpxkAQGWRXisZmiDKeRMQ==","length":21596,"stub":true},"bidar-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-QCqMHLII2cklrn0v//cz4g==","length":18538,"stub":true},"bidar-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-9YftNluHXiQkNTCdFHBVDg==","length":18149,"stub":true},"bidar-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-z7n59/TDvnUHtyY4m1b6qA==","length":17946,"stub":true},"bidar-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Ww47A+VzLsZhHkFUxxE8yQ==","length":17362,"stub":true},"bidar-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-/x0s57Yb0yn21FNT8xEZfg==","length":17353,"stub":true},"bidar-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-xOi+NypJ5j5emA2cN637eA==","length":17358,"stub":true},"bidar-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JX5UBvvSMOmOaxUpyRCSaQ==","length":16917,"stub":true},"bidar-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AbIbwTo2SUFm/cCkG4k+tg==","length":16740,"stub":true}}}},
{"id":"big-brother","key":"big-brother","value":{"rev":"3-a10d714adad89e5b7fac91d586115bd0"},"doc":{"_id":"big-brother","_rev":"3-a10d714adad89e5b7fac91d586115bd0","name":"big-brother","description":"Big Brother is watching your files","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"name":"big-brother","description":"Big Brother is watching your files","version":"0.0.0","repository":{"type":"git","url":"git://github.com/elliotlai/big-brother.git"},"engines":{"node":"> 0.6"},"dependencies":{"banana":"~ 0.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"elliot","email":"ellliotlai@mgmail.com"},"_id":"big-brother@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"17ee32ef095fb8494630e333e6a1d124de1cb3dd","tarball":"http://registry.npmjs.org/big-brother/-/big-brother-0.0.0.tgz"},"readme":"","maintainers":[{"name":"elliot","email":"ellliotlai@mgmail.com"}]}},"readme":"","maintainers":[{"name":"elliot","email":"ellliotlai@mgmail.com"}],"time":{"modified":"2012-02-06T13:41:43.051Z","created":"2012-02-06T13:41:38.341Z","0.0.0":"2012-02-06T13:41:43.051Z"},"author":{"name":"Elliot Lai","email":"ellliotlai@gmail.com"},"repository":{"type":"git","url":"git://github.com/elliotlai/big-brother.git"},"_attachments":{"big-brother-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6xF39X4Wgj4fHnYR4+ayZA==","length":454,"stub":true}}}},
{"id":"big-xml","key":"big-xml","value":{"rev":"5-de34378089cfc3c6a94145d6bafe37c6"},"doc":{"_id":"big-xml","_rev":"5-de34378089cfc3c6a94145d6bafe37c6","name":"big-xml","description":"Lightweight XML parser for really big files (uses node-expat)","dist-tags":{"latest":"0.6.0"},"versions":{"0.5.0":{"author":{"name":"John Hewson"},"name":"big-xml","description":"Lightweight XML parser for really big files (uses node-expat)","version":"0.5.0","homepage":"https://github.com/jahewson/node-big-xml","repository":{"type":"git","url":"git://github.com/jahewson/node-big-xml.git"},"engines":{"node":">=0.6.2"},"licenses":{"type":"MIT"},"dependencies":{"node-expat":">=1.4.4"},"devDependencies":{},"main":"./lib","_npmUser":{"name":"jahewson","email":"johnahewson@yahoo.co.uk"},"_id":"big-xml@0.5.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6ef5fbc95f73038338fe9621702485f47bccd167","tarball":"http://registry.npmjs.org/big-xml/-/big-xml-0.5.0.tgz"},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}]},"0.6.0":{"author":{"name":"John Hewson"},"name":"big-xml","description":"Lightweight XML parser for really big files (uses node-expat)","version":"0.6.0","homepage":"https://github.com/jahewson/node-big-xml","repository":{"type":"git","url":"git://github.com/jahewson/node-big-xml.git"},"engines":{"node":">=0.6.2"},"licenses":{"type":"MIT"},"dependencies":{"node-expat":">=1.4.4"},"devDependencies":{},"main":"./lib","_npmUser":{"name":"jahewson","email":"johnahewson@yahoo.co.uk"},"_id":"big-xml@0.6.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"73609eb81e1236ec9ee8cceecbaff5693ec5160e","tarball":"http://registry.npmjs.org/big-xml/-/big-xml-0.6.0.tgz"},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}]}},"readme":"# big-xml -- Lightweight XML parser for really big files\n\nA record-by-record XML reader, for [node.js](http://nodejs.org/), based on [node-expat](https://github.com/astro/node-expat).\n\nDesigned for big XML files (1GB+), and low memory usage.\n\n## Install\n\n    npm install big-xml\n\nor from source:\n\n    git clone git://github.com/jahewson/node-big-xml.git\n    cd node-big-xml\n    npm link\n\n#Example\n\nXML files are streamed, and parsed one record at a time, which keeps memory usage low.\n\nYou must specify which XML elements should be considered as the root of a record, using a regex. In this\nexample the elements Foo and Bar will be emitted as records.\n\n```javascript\nvar bigXml = require('big-xml');\n    \nvar reader = bigXml.createReader('data.xml.gz', /^(Foo|Bar)$/, { gzip: true });\n\nreader.on('record', function(record, tag) {\n  console.log(record);\n});\n```\n\nThe output would take the form:\n\n```javascript\n{ tag: 'Foo',\n  attrs: { Name: 'John', Status: 'Student' },\n  children: [\n    { tag: 'Color', text: 'blue'} \n  ]\n}\n```","maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}],"time":{"modified":"2012-04-03T22:23:31.826Z","created":"2012-04-02T12:23:59.718Z","0.5.0":"2012-04-02T12:24:01.544Z","0.6.0":"2012-04-03T22:23:31.826Z"},"author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-big-xml.git"},"_attachments":{"big-xml-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vFCu9q00bEfTExsZYTDuqg==","length":10240,"stub":true},"big-xml-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zvcK2I88oH/hnz6RofFsOw==","length":10240,"stub":true}}}},
{"id":"bigdecimal","key":"bigdecimal","value":{"rev":"7-0eba826cbf8be4aad028cfa21bee2c63"},"doc":{"_id":"bigdecimal","_rev":"7-0eba826cbf8be4aad028cfa21bee2c63","name":"bigdecimal","description":"Arbitrary-precision BigInteger and BigDecimal real numbers: Apache Harmony's implementation","dist-tags":{"latest":"0.6.1"},"versions":{"0.6.0":{"name":"bigdecimal","version":"0.6.0","author":{"name":"Jason Smith","email":"jhs@iriscouch.com","url":"http://www.iriscouch.com/"},"description":"BigInteger and BigDecimal types: arbitrary precision real numbers via Apache Harmony","tags":["big","bignum","bigint","integer","arithmetic","precision","bigintegers","decimal","float"],"homepage":"https://github.com/iriscouch/bigdecimal.js","repository":{"type":"git","url":"git://github.com/iriscouch/bigdecimal.js.git"},"engines":["node"],"dependencies":{},"devDependencies":{},"main":"lib/bigdecimal.js","bin":{"bigdecimal.js":"./repl.js"},"_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"bigdecimal@0.6.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"727ae0acad58f3368487968a353092180e95ebce","tarball":"http://registry.npmjs.org/bigdecimal/-/bigdecimal-0.6.0.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}]},"0.6.1":{"name":"bigdecimal","version":"0.6.1","author":{"name":"Jason Smith","email":"jhs@iriscouch.com","url":"http://www.iriscouch.com/"},"description":"Arbitrary-precision BigInteger and BigDecimal real numbers: Apache Harmony's implementation","tags":["big","bignum","bigint","integer","arithmetic","precision","bigintegers","decimal","float"],"homepage":"https://github.com/iriscouch/bigdecimal.js","repository":{"type":"git","url":"git://github.com/iriscouch/bigdecimal.js.git"},"engines":["node"],"dependencies":{},"devDependencies":{"couchapp":"0.8.1"},"main":"lib/bigdecimal.js","bin":{"bigdecimal.js":"./repl.js"},"_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"bigdecimal@0.6.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"18588d4b4f226b77310ed04574858c036a54485b","tarball":"http://registry.npmjs.org/bigdecimal/-/bigdecimal-0.6.1.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}]}},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}],"time":{"modified":"2011-11-06T12:49:16.169Z","created":"2011-11-06T06:05:24.536Z","0.6.0":"2011-11-06T06:05:30.292Z","0.6.1":"2011-11-06T12:49:16.169Z"},"author":{"name":"Jason Smith","email":"jhs@iriscouch.com","url":"http://www.iriscouch.com/"},"repository":{"type":"git","url":"git://github.com/iriscouch/bigdecimal.js.git"},"_attachments":{"bigdecimal-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WPzohxzObswX5MKnU+iEdg==","length":40646,"stub":true},"bigdecimal-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PQFtTGJxohGVekrZGPxFgw==","length":40960,"stub":true}}}},
{"id":"bigga","key":"bigga","value":{"rev":"4-fb39fd5eec0f10ce506f0dac1fdb7328"},"doc":{"_id":"bigga","_rev":"4-fb39fd5eec0f10ce506f0dac1fdb7328","name":"bigga","description":"Just because making strings longer doesn't help.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.5":{"name":"bigga","description":"Just because making strings longer doesn't help.","keywords":["util"],"author":{"name":"Rob Wells","email":"robert@fragglebob.me"},"repository":{"type":"git","url":"git://github.com/fragglebob/bigga.git"},"main":"bigga.js","version":"0.0.5","_npmUser":{"name":"rokkoka","email":"robert@fragglebob.me"},"_id":"bigga@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"16282c3a52fe70440f497f671ae2accb6678f741","tarball":"http://registry.npmjs.org/bigga/-/bigga-0.0.5.tgz"},"maintainers":[{"name":"rokkoka","email":"robert@fragglebob.me"}]}},"readme":"     _     _                   \n    | |__ (_) __ _  __ _  __ _ \n    | '_ \\| |/ _` |/ _` |/ _` |\n    | |_) | | (_| | (_| | (_| |\n    |_.__/|_|\\__, |\\__, |\\__,_|\n             |___/ |___/  \n\nMakes things take up more space. You can turn anything in to a string of numbers and letters.\n\nNot sure where you would ever use this. but you know just in case.\n\nWorks in your browser and in your node.js.\n\n## Usage\n\nBrowser\n\n    <script type=\"text/javascript\" src=\"bigga.js\"></script>\nNode\n\n    var bigga = require('bigga');\n\n### Encode\n\n    var big = bigga.encode(data, radix);\n\nOr\n\n    var big = bigga(data, radix);\n\n### Decode\n\nWorks out what radix you used.\n\n    var data = bigga.encode(big);\n\n### Even Bigger Mode\n\nReturns true for on and false for off;\n\n    bigga.evenBigga();\n\n## Why?\n\nWhy not?","maintainers":[{"name":"rokkoka","email":"robert@fragglebob.me"}],"time":{"modified":"2012-08-02T13:44:17.303Z","created":"2012-07-26T11:13:50.641Z","0.0.5":"2012-07-26T11:13:52.270Z"},"author":{"name":"Rob Wells","email":"robert@fragglebob.me"},"repository":{"type":"git","url":"git://github.com/fragglebob/bigga.git"},"users":{"fgribreau":true},"_attachments":{"bigga-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kjejwmPfkkOe0jcwcmp7+w==","length":1531,"stub":true}}}},
{"id":"biggerboat","key":"biggerboat","value":{"rev":"5-0da8b38455f7b40eb1e47d8a72f3d8c7"},"doc":{"_id":"biggerboat","_rev":"5-0da8b38455f7b40eb1e47d8a72f3d8c7","name":"biggerboat","description":"You're going to need a bigger boat","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Itay Neeman","email":"itay@neeman.net"},"name":"biggerboat","description":"You're going to need a bigger boat","version":"0.0.1","bin":{"biggerboat":"cli.js"},"repository":{"type":"git","url":"git://github.com/itay/biggerboat.git"},"main":"main.js","engines":{"node":">=0.4.9"},"license":"MIT","dependencies":{},"devDependencies":{},"_npmUser":{"name":"itay","email":"itay@neeman.net"},"_id":"biggerboat@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"4b412edfa084ad199eada98960ec98cd564383c3","tarball":"http://registry.npmjs.org/biggerboat/-/biggerboat-0.0.1.tgz"},"maintainers":[{"name":"itay","email":"itay@neeman.net"}]},"0.0.2":{"author":{"name":"Itay Neeman","email":"itay@neeman.net"},"name":"biggerboat","description":"You're going to need a bigger boat","version":"0.0.2","bin":{"biggerboat":"cli.js"},"repository":{"type":"git","url":"git://github.com/itay/biggerboat.git"},"main":"main.js","engines":{"node":">=0.4.9"},"license":"MIT","dependencies":{},"devDependencies":{},"_npmUser":{"name":"itay","email":"itay@neeman.net"},"_id":"biggerboat@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"2f49f8962df61d80dc77fb2db4e1a8fd32a47325","tarball":"http://registry.npmjs.org/biggerboat/-/biggerboat-0.0.2.tgz"},"maintainers":[{"name":"itay","email":"itay@neeman.net"}]}},"readme":"biggerboat\n==========\n\nYou're going to need a bigger boat:\n\nInstall:\n```\nnpm install -g biggerboat\n```\n\nAnd run:\n```\nbiggerboat\n```","maintainers":[{"name":"itay","email":"itay@neeman.net"}],"time":{"modified":"2012-07-17T20:58:04.548Z","created":"2012-07-17T20:51:58.821Z","0.0.1":"2012-07-17T20:51:59.929Z","0.0.2":"2012-07-17T20:58:04.548Z"},"author":{"name":"Itay Neeman","email":"itay@neeman.net"},"repository":{"type":"git","url":"git://github.com/itay/biggerboat.git"},"_attachments":{"biggerboat-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-BrZYhJKccXO3a7VMGrEu2g==","length":1566,"stub":true},"biggerboat-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1xh7Gx70SamgvA4QKQ5hEg==","length":1537,"stub":true}}}},
{"id":"biggie-router","key":"biggie-router","value":{"rev":"42-56a546a78d5abd4402183b3d300d563e"},"doc":{"_id":"biggie-router","_rev":"42-56a546a78d5abd4402183b3d300d563e","name":"biggie-router","description":"The router as part of the biggie framework.","dist-tags":{"latest":"0.3.4"},"versions":{"0.1.0":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.0","author":{"name":"Tim Smart"},"licenses":{"type":"MIT","url":""},"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.0.tgz"}},"0.1.1":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.1","author":{"name":"Tim Smart"},"licenses":{"type":"MIT","url":""},"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.1.tgz"}},"0.1.10":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.10","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"dependencies":{"vows":">=0.4.1"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.10","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.10.tgz"}},"0.1.12":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.12","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"dependencies":{"vows":">=0.4.1"},"engine":["node >=0.2.0"],"main":"./lib/biggie-router","_id":"biggie-router@0.1.12","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.12.tgz"}},"0.1.2":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.2","author":{"name":"Tim Smart"},"licenses":{"type":"MIT","url":""},"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.2.tgz"}},"0.1.3":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.3","author":{"name":"Tim Smart"},"licenses":{"type":"MIT","url":""},"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.3.tgz"}},"0.1.4":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.4","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.4.tgz"}},"0.1.5":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.5","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.5.tgz"}},"0.1.6":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.6","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.6.tgz"}},"0.1.7":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.7","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.7","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.7.tgz"}},"0.1.8":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.8","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"dependencies":{"vows":">=0.4.1"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.8","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.8.tgz"}},"0.1.9":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.9","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"dependencies":{"vows":">=0.4.1"},"engine":["node >=0.1.90"],"directories":{"lib":"./lib/biggie-router"},"_id":"biggie-router@0.1.9","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/biggie-router/-/biggie-router-0.1.9.tgz"}},"0.1.13":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.13","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"http://github.com/biggie/biggie-router.git"},"engine":["node >=0.3.0"],"main":"./lib/biggie-router","_id":"biggie-router@0.1.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.13-3","_nodeVersion":"v0.3.5-pre","dist":{"shasum":"7054424e928b712d9f201c4bdcd08018da4b30d7","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.1.13.tgz"}},"0.1.14":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.1.14","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT","url":""}],"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"engine":["node >=0.3.0"],"main":"./lib/biggie-router","_id":"biggie-router@0.1.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.0-7","_nodeVersion":"v0.4.2","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7b5436f4b17e534a45fe631e991774392e739e91","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.1.14.tgz"}},"0.3.0":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.3.0","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"engine":["node >=0.3.0"],"main":"./","dependencies":{},"devDependencies":{},"_id":"biggie-router@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"43fc9422777e74a64c18dfb1e2646f4ac68b9793","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.3.0.tgz"}},"0.3.1":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.3.1","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"engine":["node >=0.4.0"],"main":"./","dependencies":{},"devDependencies":{},"_id":"biggie-router@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"85722957228b62260d632b28e8be7ba786d32924","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.3.1.tgz"}},"0.3.2":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.3.2","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"engine":["node >=0.4.0"],"main":"./","dependencies":{},"devDependencies":{},"_id":"biggie-router@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"682ec26d1c2c2fbf65516f6d93ad912ce86a384c","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.3.2.tgz"}},"0.3.3":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.3.3","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"engine":["node >=0.4.0"],"main":"./","dependencies":{},"devDependencies":{},"_id":"biggie-router@0.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0ae373fc654ff096e637d0829e26dca19c51d478","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.3.3.tgz"}},"0.3.4":{"name":"biggie-router","description":"The router as part of the biggie framework.","version":"0.3.4","author":{"name":"Tim Smart"},"licenses":[{"type":"MIT"}],"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"engine":["node >=0.4.0"],"main":"./","dependencies":{},"devDependencies":{},"_id":"biggie-router@0.3.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"267212cee4e61b1c327782ed09ccc657f9a69e11","tarball":"http://registry.npmjs.org/biggie-router/-/biggie-router-0.3.4.tgz"}}},"maintainers":[{"name":"Tim-Smart","email":"tim@fostle.com"}],"author":{"name":"Tim Smart"},"repository":{"type":"git","url":"git://github.com/biggie/biggie-router.git"},"time":{"modified":"2011-05-28T00:49:41.373Z","created":"2011-01-22T04:22:30.434Z","0.1.0":"2011-01-22T04:22:30.434Z","0.1.1":"2011-01-22T04:22:30.434Z","0.1.10":"2011-01-22T04:22:30.434Z","0.1.12":"2011-01-22T04:22:30.434Z","0.1.2":"2011-01-22T04:22:30.434Z","0.1.3":"2011-01-22T04:22:30.434Z","0.1.4":"2011-01-22T04:22:30.434Z","0.1.5":"2011-01-22T04:22:30.434Z","0.1.6":"2011-01-22T04:22:30.434Z","0.1.7":"2011-01-22T04:22:30.434Z","0.1.8":"2011-01-22T04:22:30.434Z","0.1.9":"2011-01-22T04:22:30.434Z","0.1.13":"2011-01-22T04:22:30.434Z","0.1.14":"2011-03-10T20:49:43.155Z","0.3.0":"2011-05-12T20:07:51.859Z","0.3.1":"2011-05-27T21:49:48.838Z","0.3.2":"2011-05-27T22:14:49.015Z","0.3.3":"2011-05-28T00:45:33.372Z","0.3.4":"2011-05-28T00:49:41.373Z"},"_attachments":{"biggie-router-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-UIdWhEmZG5DAEqu5JtApdQ==","length":7077,"stub":true},"biggie-router-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-8teyk6zS5Ox45NoM3kvJ1Q==","length":7055,"stub":true},"biggie-router-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-jIwTBxyrQy12JNCLr3uMbA==","length":7046,"stub":true},"biggie-router-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-AnvOwn7yNxcbUAPF2fLrAw==","length":7755,"stub":true},"biggie-router-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-Ot3A3GWvx6SOAwvOZ6HWNQ==","length":10818,"stub":true},"biggie-router-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-foS2pdGJmxNhHoJkur6JZQ==","length":11950,"stub":true},"biggie-router-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-28m6w72V7tbWjCLH7PaQvw==","length":12010,"stub":true},"biggie-router-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Zk0mvTxKstR09/nvuK6jsg==","length":10300,"stub":true},"biggie-router-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-78iEFaKI5ABb0MdA2C7gGg==","length":8996,"stub":true},"biggie-router-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-YxQJXToVVVWHfjGdGhoPrw==","length":7746,"stub":true},"biggie-router-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-1YBVbDYoHLqKG68K63/8JA==","length":7750,"stub":true},"biggie-router-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-b761bF8H/DtUKrLW33KGCQ==","length":7633,"stub":true},"biggie-router-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-UbEeVjLxAWt7YNQn4+793w==","length":7569,"stub":true},"biggie-router-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-QKcNbgD1Jq9moF7523w6ew==","length":7556,"stub":true},"biggie-router-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-FbuBF0A38+7k4L7SU6MtwQ==","length":6685,"stub":true},"biggie-router-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-3yTHChTG7fw40zTY0Pb1Rw==","length":11999,"stub":true},"biggie-router-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SH6vwdaDWant6SVuYlK/uw==","length":10369,"stub":true},"biggie-router-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3rpSqNwShfTH3n1sj5V44A==","length":4076,"stub":true},"biggie-router-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UbRPBwTSLdP2nUT+3nfdzg==","length":3995,"stub":true}}}},
{"id":"bigint","key":"bigint","value":{"rev":"65-c6dcdc6fab61a178b5da42efdd93ef34"},"doc":{"_id":"bigint","_rev":"65-c6dcdc6fab61a178b5da42efdd93ef34","name":"bigint","description":"Arbitrary-precision integer arithmetic using libgmp","dist-tags":{"latest":"0.3.9"},"versions":{"0.0.1":{"name":"bigint","version":"0.0.1","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0"},"scripts":{"test":"expresso","preinstall":"node-waf clean configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2cb1e03203214566c9a513f5775da6dff94ac392","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.1.tgz"}},"0.0.2":{"name":"bigint","version":"0.0.2","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bd47ff80ab7e47cfa203af358e1d86293da83f8d","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.2.tgz"}},"0.0.5":{"name":"bigint","version":"0.0.5","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e0676881aa2eb25dc741124da3b6c28dbe1cbf1a","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.5.tgz"}},"0.0.6":{"name":"bigint","version":"0.0.6","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d0000be1b60d0ef3bdd7d725e1e4c9a53611c5fa","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.6.tgz"}},"0.0.7":{"name":"bigint","version":"0.0.7","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f0785d997a856090d7b9be956885dc00596a81c9","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.7.tgz"}},"0.0.8":{"name":"bigint","version":"0.0.8","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3847feea8375b6aaf619ee85cdf631b2c6882d69","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.8.tgz"}},"0.0.9":{"name":"bigint","version":"0.0.9","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"bigint@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a0028cc1ddec18288bbb628f150cd10c8aacd0f0","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.9.tgz"}},"0.0.10":{"name":"bigint","version":"0.0.10","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.0.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"85b84f3d81187f6ee674b013e724c90f18a45c90","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.10.tgz"}},"0.0.11":{"name":"bigint","version":"0.0.11","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.0.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2d98a331503fa2178085bdfe54eaf6d750d1c570","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.11.tgz"}},"0.0.12":{"name":"bigint","version":"0.0.12","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.0.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6ccdf177007c5410acf1fd8ade51c2c67054a327","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.0.12.tgz"}},"0.1.0":{"name":"bigint","version":"0.1.0","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"node-ffi":">=0.2.0"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9065a359c39d66ae783ddf1d4f7ac36d211a2b27","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.1.0.tgz"}},"0.2.0":{"name":"bigint","version":"0.2.0","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"366b7dad2d85aa01bd6316e71bc8604bedb68aaa","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.2.0.tgz"}},"0.2.1":{"name":"bigint","version":"0.2.1","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"10b61aa42045ccad04e7681e32f89eaac9f59e47","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.2.1.tgz"}},"0.2.2":{"name":"bigint","version":"0.2.2","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5bb0f1cd0b86f27f8b77b07eeaaec779e3d329e5","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.2.2.tgz"}},"0.3.0":{"name":"bigint","version":"0.3.0","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8295a980f1064f0221253df13cf62dcc5b9b7b00","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.0.tgz"}},"0.3.1":{"name":"bigint","version":"0.3.1","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0e68b62ee7cce3d9192dbb2c19666f6712e1b152","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.1.tgz"}},"0.3.2":{"name":"bigint","version":"0.3.2","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"dependencies":{},"_id":"bigint@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc7","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"9e323f2b3329422c38ad0eea0159b59e85ddf91e","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.2.tgz"},"directories":{}},"0.3.3":{"name":"bigint","version":"0.3.3","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"dependencies":{},"_id":"bigint@0.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc8","_nodeVersion":"v0.4.2","_defaultsLoaded":true,"dist":{"shasum":"d2a59570da4d0dd7213540f9886ffa8c6cb6efe1","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.3.tgz","bin":{"0.4-sunos-5.11":{"shasum":"408f8246ed8c5f42edeec1eb3941810ef397e16a","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.3-0.4-sunos-5.11.tgz"}}},"directories":{}},"0.3.4":{"name":"bigint","version":"0.3.4","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.3.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"58de903d678cba603ab8919c6d657f4475059ac6","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}]},"0.3.5":{"name":"bigint","version":"0.3.5","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7"},"scripts":{"install":"node-waf configure build"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"bigint@0.3.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"297059f4b227b2a653f8ec75bb041b422c6b94e7","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}]},"0.3.6":{"name":"bigint","version":"0.3.6","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"scripts":{"install":"node-waf configure build","test":"expresso"},"_id":"bigint@0.3.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"34ca8ca6334c378f33960b59f24f91710daf7707","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.6.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}]},"0.3.7":{"name":"bigint","version":"0.3.7","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"scripts":{"install":"node-waf configure build","test":"expresso"},"_npmJsonOpts":{"file":"/home/substack/.npm/bigint/0.3.7/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bigint@0.3.7","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"392be9f97cde8ac4ede4f6cc1f0b607bb01479e1","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.7.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}]},"0.3.8":{"name":"bigint","version":"0.3.8","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"scripts":{"install":"node-waf configure build","test":"expresso"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bigint@0.3.8","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c1c9d902c24db37eccdbfdf5a163a9b0347c662b","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.8.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}]},"0.3.9":{"name":"bigint","version":"0.3.9","description":"Arbitrary-precision integer arithmetic using libgmp","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"devDependencies":{"tap":"~0.2.5","put":"~0.0.6"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"scripts":{"install":"node-waf configure build","test":"tap test/*.js"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bigint@0.3.9","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0e32f5f685001a74b45d4fd9dd2e6fcbac335422","tarball":"http://registry.npmjs.org/bigint/-/bigint-0.3.9.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"},{"name":"draggor","email":"draggor@gmail.com"}],"time":{"modified":"2012-08-06T15:26:43.180Z","created":"2011-02-14T06:12:21.707Z","0.0.1":"2011-02-14T06:12:22.258Z","0.0.2":"2011-02-15T01:19:38.287Z","0.0.5":"2011-02-20T05:00:01.922Z","0.0.6":"2011-02-20T10:17:24.078Z","0.0.7":"2011-02-21T07:53:07.899Z","0.0.8":"2011-02-22T13:25:25.105Z","0.0.9":"2011-02-27T11:35:53.440Z","0.0.10":"2011-03-01T11:17:30.925Z","0.0.11":"2011-03-04T03:46:08.034Z","0.0.12":"2011-03-06T11:25:42.412Z","0.1.0":"2011-03-08T01:47:35.910Z","0.2.0":"2011-03-13T23:17:24.579Z","0.2.1":"2011-03-15T23:47:24.928Z","0.2.2":"2011-03-21T10:19:03.831Z","0.3.0":"2011-03-23T23:05:55.266Z","0.3.1":"2011-04-01T09:50:48.767Z","0.3.2":"2011-04-13T10:19:55.492Z","0.3.3":"2011-04-14T00:31:54.231Z","0.3.4":"2011-08-08T00:05:33.550Z","0.3.5":"2011-08-20T23:54:03.707Z","0.3.6":"2011-09-02T01:52:10.562Z","0.3.7":"2011-10-09T21:53:59.704Z","0.3.8":"2011-12-30T20:14:10.948Z","0.3.9":"2012-05-18T21:45:57.239Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-bigint.git"},"users":{"sjonnet19":true},"_attachments":{"bigint-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-2M4zBN76U6FhUSMLOj6o0w==","length":14222,"stub":true},"bigint-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-wO9ysXyhhYvmWRhT9xQ93w==","length":13523,"stub":true},"bigint-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-VSpFF4A5tdQ341hMBrC+Eg==","length":13536,"stub":true},"bigint-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-nsCtrqAOwRU1e4o3Wk61BA==","length":13457,"stub":true},"bigint-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-wLmHLrRyfFu7tdMyAv2O2w==","length":13332,"stub":true},"bigint-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-3O3kNOTSVdtI02J4cPJjIw==","length":13325,"stub":true},"bigint-0.3.3-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-v8EOvNAw/27dK8feOCWHPA==","length":149951,"stub":true},"bigint-0.3.3-0.4-linux-2.6.32-trunk-686.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-mD2s2fZJlihtcTSL1Te0oQ==","length":13118,"stub":true},"bigint-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-wADOcwxaVsuZKh8PbqPbWA==","length":13187,"stub":true},"bigint-0.3.2-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-Fncwx26+12g09uR0pDT6mA==","length":149805,"stub":true},"bigint-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-lRizYQcdhaxuydBGBUbpDQ==","length":12865,"stub":true},"bigint-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-gGSXGiXYL41+ydPVCQdIGg==","length":15120,"stub":true},"bigint-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-hrn/exPt2tIpuro0N58VjA==","length":14994,"stub":true},"bigint-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-ISc6Rkq0Pn/qPC3fKjuabw==","length":13537,"stub":true},"bigint-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-xuUTD+ehKYdKct3AYSWJeQ==","length":14123,"stub":true},"bigint-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Q98tVXxWc/lER+x71stWeg==","length":11949,"stub":true},"bigint-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-fZcs758DahjIAiKFwZHMGg==","length":12543,"stub":true},"bigint-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-GjBwhp8z8hgWYDJ5Hmwn4A==","length":12239,"stub":true},"bigint-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-8ly8EDEDsF/vncw7JUsOXg==","length":12233,"stub":true},"bigint-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-zj7QkySWkvjZYo/Cd46TFg==","length":13214,"stub":true},"bigint-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-0bFglEvvb7j0MuaRqg4A9Q==","length":35491,"stub":true},"bigint-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/Eoq6R8P6eOhiwHuNGPZgw==","length":34922,"stub":true},"bigint-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZOvOYSTOI5A3SC1K/JaUGQ==","length":34845,"stub":true},"bigint-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-o5npZpZNjAXhYdlBvu4+RQ==","length":45944,"stub":true},"bigint-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oggB5gUFNME+S1BQoNH6NQ==","length":33060,"stub":true},"bigint-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Nofj4YhU5bdWbCCuaMG3Eg==","length":30013,"stub":true},"bigint-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/Tzg9a/0Gl55Me48P409qw==","length":28952,"stub":true}}}},
{"id":"bignum","key":"bignum","value":{"rev":"12-cbee7cd5baff1607491800888b449f76"},"doc":{"_id":"bignum","_rev":"12-cbee7cd5baff1607491800888b449f76","name":"bignum","description":"Arbitrary-precision integer arithmetic using OpenSSL","dist-tags":{"latest":"0.5.1"},"versions":{"0.4.0":{"name":"bignum","version":"0.4.0","description":"Arbitrary-precision integer arithmetic using OpenSSL","main":"./index.js","repository":{"type":"git","url":"git://github.com/justmoon/node-bignum.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"scripts":{"install":"node-waf configure build","test":"expresso"},"contributors":[{"name":"James Halliday","email":"mail@substack.net"}],"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bignum@0.4.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"f7f240dba8f2b757d533de8475a04c5bf198358f","tarball":"http://registry.npmjs.org/bignum/-/bignum-0.4.0.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.4.1":{"name":"bignum","version":"0.4.1","description":"Arbitrary-precision integer arithmetic using OpenSSL","main":"./index.js","repository":{"type":"git","url":"git://github.com/justmoon/node-bignum.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"scripts":{"install":"node-waf configure build","test":"expresso"},"contributors":[{"name":"James Halliday","email":"mail@substack.net"}],"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bignum@0.4.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"4394523e9e3bcffa30e0c3257525b0e4bae95da6","tarball":"http://registry.npmjs.org/bignum/-/bignum-0.4.1.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.5.0":{"name":"bignum","version":"0.5.0","description":"Arbitrary-precision integer arithmetic using OpenSSL","main":"./index.js","repository":{"type":"git","url":"http://github.com/justmoon/node-bignum.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.8.0"},"scripts":{"install":"node-gyp configure build","test":"expresso"},"contributors":[{"name":"James Halliday","email":"mail@substack.net"}],"readme":"bignum\n======\n\nArbitrary precision integral arithmetic for Node.js using\nOpenSSL.\n\nThis library is based on\n[node-bigint](https://github.com/substack/node-bigint) by\n[substack](https://github.com/substack), but instead of using libgmp,\nit uses the builtin bignum functionality from OpenSSL. The advantage\nis that OpenSSL is already a soft dependency of Node.js and therefore\noften already installed on systems with Node.js.\n\ndifferences\n===========\n\nWhen switching from node-bigint to node-bignum, please be aware of\nthese differences:\n\n- Bignum rounds towards zero for integer divisions, e.g. `10 / -3 = -3`, whereas bigint\n  rounds towards negative infinity, e.g. `10 / -3 = -4`.\n- Boolean operations (and, or, xor) are not supported.\n\nexample\n=======\n\nsimple.js\n---------\n\n    var bignum = require('bignum');\n    \n    var b = bignum('782910138827292261791972728324982')\n        .sub('182373273283402171237474774728373')\n        .div(8)\n    ;\n    console.log(b);\n\n***\n    $ node simple.js\n    <Bignum 75067108192986261319312244199576>\n\nperfect.js\n----------\n\nGenerate the perfect numbers:\n\n    // If 2**n-1 is prime, then (2**n-1) * 2**(n-1) is perfect.\n    var bignum = require('bignum');\n\n    for (var n = 0; n < 100; n++) {\n        var p = bignum.pow(2, n).sub(1);\n        if (p.probPrime(50)) {\n            var perfect = p.mul(bignum.pow(2, n - 1));\n            console.log(perfect.toString());\n        }\n    }\n\n***\n\n    6\n    28\n    496\n    8128\n    33550336\n    8589869056\n    137438691328\n    2305843008139952128\n    2658455991569831744654692615953842176\n    191561942608236107294793378084303638130997321548169216\n\nmethods[0]\n==========\n\nbignum(n, base=10)\n------------------\n\nCreate a new `bignum` from `n` and a base. `n` can be a string, integer, or\nanother `bignum`.\n\nIf you pass in a string you can set the base that string is encoded in.\n\n.toString(base=10)\n------------------\n\nPrint out the `bignum` instance in the requested base as a string.\n\nbignum.fromBuffer(buf, opts)\n----------------------\n\nCreate a new `bignum` from a `Buffer`.\n\nThe default options are:\n    {\n        order : 'forward', // low-to-high indexed word ordering\n        endian : 'big',\n        size : 1, // number of bytes in each word\n    }\n\nNote that endian doesn't matter when size = 1.\n\nmethods[1]\n==========\n\nFor all of the instance methods below you can write either\n\n    bignum.method(x, y, z)\n\nor if x is a `bignum` instance``\n\n    x.method(y, z)\n\n.toNumber()\n-----------\n\nTurn a `bignum` into a `Number`. If the `bignum` is too big you'll lose\nprecision or you'll get ±`Infinity`.\n\n.toBuffer(opts)\n-------------\n\nReturn a new `Buffer` with the data from the `bignum`.\n\nThe default options are:\n    {\n        order : 'forward', // low-to-high indexed word ordering\n        endian : 'big',\n        size : 1, // number of bytes in each word\n    }\n\nNote that endian doesn't matter when size = 1.\n\n.add(n)\n-------\n\nReturn a new `bignum` containing the instance value plus `n`.\n\n.sub(n)\n-------\n\nReturn a new `bignum` containing the instance value minus `n`.\n\n.mul(n)\n-------\n\nReturn a new `bignum` containing the instance value multiplied by `n`.\n\n.div(n)\n-------\n\nReturn a new `bignum` containing the instance value integrally divided by `n`.\n\n.abs()\n------\n\nReturn a new `bignum` with the absolute value of the instance.\n\n.neg()\n------\n\nReturn a new `bignum` with the negative of the instance value.\n\n.cmp(n)\n-------\n\nCompare the instance value to `n`. Return a positive integer if `> n`, a\nnegative integer if `< n`, and 0 if `== n`.\n\n.gt(n)\n------\n\nReturn a boolean: whether the instance value is greater than n (`> n`).\n\n.ge(n)\n------\n\nReturn a boolean: whether the instance value is greater than or equal to n\n(`>= n`).\n\n.eq(n)\n------\n\nReturn a boolean: whether the instance value is equal to n (`== n`).\n\n.lt(n)\n------\n\nReturn a boolean: whether the instance value is less than n (`< n`).\n\n.le(n)\n------\n\nReturn a boolean: whether the instance value is less than or equal to n\n(`<= n`).\n\n.and(n)\n-------\n\nReturn a new `bignum` with the instance value bitwise AND (&)-ed with `n`.\n\n.or(n)\n------\n\nReturn a new `bignum` with the instance value bitwise inclusive-OR (|)-ed with\n`n`.\n\n.xor(n)\n-------\n\nReturn a new `bignum` with the instance value bitwise exclusive-OR (^)-ed with\n`n`.\n\n.mod(n)\n-------\n\nReturn a new `bignum` with the instance value modulo `n`.\n\n`m`.\n.pow(n)\n-------\n\nReturn a new `bignum` with the instance value raised to the `n`th power.\n\n.powm(n, m)\n-----------\n\nReturn a new `bignum` with the instance value raised to the `n`th power modulo\n`m`.\n\n.invertm(m)\n-----------\n\nCompute the multiplicative inverse modulo `m`.\n\n.rand()\n-------\n.rand(upperBound)\n-----------------\n\nIf `upperBound` is supplied, return a random `bignum` between the instance value\nand `upperBound - 1`, inclusive.\n\nOtherwise, return a random `bignum` between 0 and the instance value - 1,\ninclusive.\n\n.probPrime()\n------------\n\nReturn whether the bignum is:\n\n* certainly prime (true)\n* probably prime ('maybe')\n* certainly composite (false)\n\nusing [mpz_probab_prime](http://gmplib.org/manual/Number-Theoretic-Functions.html).\n\n.nextPrime()\n------------\n\nReturn the next prime greater than `this` using\n[mpz_nextprime](http://gmplib.org/manual/Number-Theoretic-Functions.html).\n\n.sqrt()\n-------\n\nReturn a new `bignum` that is the square root.  This truncates.\n\n.root(n)\n-------\n\nReturn a new `bignum` that is the `nth` root.  This truncates.\n\n.shiftLeft(n)\n-------\n\nReturn a new `bignum` that is the `2^n` multiple. Equivalent of the <<\noperator.\n\n.shiftRight(n)\n-------\n\nReturn a new `bignum` of the value integer divided by\n`2^n`. Equivalent of the >> operator.\n\ninstall\n=======\n\nYou'll need the libssl (OpenSSL) source to compile this package. If\nyou compiled Node.js using the official instructions, you'll already\nhave it. Otherwise install it using the instructions below.\n\nUnder Debian-based systems,\n\n    sudo aptitude install libssl3-dev\n\nOn a Mac with [Homebrew](https://github.com/mxcl/homebrew/),\n\n    brew install openssl\n\nAnd then install with [npm](http://npmjs.org):\n\n    npm install bignum\n","_id":"bignum@0.5.0","dist":{"shasum":"abb24b706c59b692cd49cacf59a3827c9f8a950c","tarball":"http://registry.npmjs.org/bignum/-/bignum-0.5.0.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.5.1":{"name":"bignum","version":"0.5.1","description":"Arbitrary-precision integer arithmetic using OpenSSL","main":"./index.js","repository":{"type":"git","url":"http://github.com/justmoon/node-bignum.git"},"keywords":["gmp","libgmp","big","bignum","bigint","integer","arithmetic","precision"],"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"devDependencies":{"expresso":">=0.6.0","binary":">=0.1.7","put":">=0.0.5"},"license":"MIT/X11","engine":{"node":">=0.8.0"},"scripts":{"install":"node-gyp configure build","test":"expresso"},"contributors":[{"name":"James Halliday","email":"mail@substack.net"}],"readme":"bignum\n======\n\nArbitrary precision integral arithmetic for Node.js using\nOpenSSL.\n\nThis library is based on\n[node-bigint](https://github.com/substack/node-bigint) by\n[substack](https://github.com/substack), but instead of using libgmp,\nit uses the builtin bignum functionality from OpenSSL. The advantage\nis that OpenSSL is already a soft dependency of Node.js and therefore\noften already installed on systems with Node.js.\n\ndifferences\n===========\n\nWhen switching from node-bigint to node-bignum, please be aware of\nthese differences:\n\n- Bignum rounds towards zero for integer divisions, e.g. `10 / -3 = -3`, whereas bigint\n  rounds towards negative infinity, e.g. `10 / -3 = -4`.\n- Boolean operations (and, or, xor) are not supported.\n\nexample\n=======\n\nsimple.js\n---------\n\n    var bignum = require('bignum');\n    \n    var b = bignum('782910138827292261791972728324982')\n        .sub('182373273283402171237474774728373')\n        .div(8)\n    ;\n    console.log(b);\n\n***\n    $ node simple.js\n    <Bignum 75067108192986261319312244199576>\n\nperfect.js\n----------\n\nGenerate the perfect numbers:\n\n    // If 2**n-1 is prime, then (2**n-1) * 2**(n-1) is perfect.\n    var bignum = require('bignum');\n\n    for (var n = 0; n < 100; n++) {\n        var p = bignum.pow(2, n).sub(1);\n        if (p.probPrime(50)) {\n            var perfect = p.mul(bignum.pow(2, n - 1));\n            console.log(perfect.toString());\n        }\n    }\n\n***\n\n    6\n    28\n    496\n    8128\n    33550336\n    8589869056\n    137438691328\n    2305843008139952128\n    2658455991569831744654692615953842176\n    191561942608236107294793378084303638130997321548169216\n\nmethods[0]\n==========\n\nbignum(n, base=10)\n------------------\n\nCreate a new `bignum` from `n` and a base. `n` can be a string, integer, or\nanother `bignum`.\n\nIf you pass in a string you can set the base that string is encoded in.\n\n.toString(base=10)\n------------------\n\nPrint out the `bignum` instance in the requested base as a string.\n\nbignum.fromBuffer(buf, opts)\n----------------------\n\nCreate a new `bignum` from a `Buffer`.\n\nThe default options are:\n    {\n        order : 'forward', // low-to-high indexed word ordering\n        endian : 'big',\n        size : 1, // number of bytes in each word\n    }\n\nNote that endian doesn't matter when size = 1.\n\nmethods[1]\n==========\n\nFor all of the instance methods below you can write either\n\n    bignum.method(x, y, z)\n\nor if x is a `bignum` instance``\n\n    x.method(y, z)\n\n.toNumber()\n-----------\n\nTurn a `bignum` into a `Number`. If the `bignum` is too big you'll lose\nprecision or you'll get ±`Infinity`.\n\n.toBuffer(opts)\n-------------\n\nReturn a new `Buffer` with the data from the `bignum`.\n\nThe default options are:\n    {\n        order : 'forward', // low-to-high indexed word ordering\n        endian : 'big',\n        size : 1, // number of bytes in each word\n    }\n\nNote that endian doesn't matter when size = 1.\n\n.add(n)\n-------\n\nReturn a new `bignum` containing the instance value plus `n`.\n\n.sub(n)\n-------\n\nReturn a new `bignum` containing the instance value minus `n`.\n\n.mul(n)\n-------\n\nReturn a new `bignum` containing the instance value multiplied by `n`.\n\n.div(n)\n-------\n\nReturn a new `bignum` containing the instance value integrally divided by `n`.\n\n.abs()\n------\n\nReturn a new `bignum` with the absolute value of the instance.\n\n.neg()\n------\n\nReturn a new `bignum` with the negative of the instance value.\n\n.cmp(n)\n-------\n\nCompare the instance value to `n`. Return a positive integer if `> n`, a\nnegative integer if `< n`, and 0 if `== n`.\n\n.gt(n)\n------\n\nReturn a boolean: whether the instance value is greater than n (`> n`).\n\n.ge(n)\n------\n\nReturn a boolean: whether the instance value is greater than or equal to n\n(`>= n`).\n\n.eq(n)\n------\n\nReturn a boolean: whether the instance value is equal to n (`== n`).\n\n.lt(n)\n------\n\nReturn a boolean: whether the instance value is less than n (`< n`).\n\n.le(n)\n------\n\nReturn a boolean: whether the instance value is less than or equal to n\n(`<= n`).\n\n.and(n)\n-------\n\nReturn a new `bignum` with the instance value bitwise AND (&)-ed with `n`.\n\n.or(n)\n------\n\nReturn a new `bignum` with the instance value bitwise inclusive-OR (|)-ed with\n`n`.\n\n.xor(n)\n-------\n\nReturn a new `bignum` with the instance value bitwise exclusive-OR (^)-ed with\n`n`.\n\n.mod(n)\n-------\n\nReturn a new `bignum` with the instance value modulo `n`.\n\n`m`.\n.pow(n)\n-------\n\nReturn a new `bignum` with the instance value raised to the `n`th power.\n\n.powm(n, m)\n-----------\n\nReturn a new `bignum` with the instance value raised to the `n`th power modulo\n`m`.\n\n.invertm(m)\n-----------\n\nCompute the multiplicative inverse modulo `m`.\n\n.rand()\n-------\n.rand(upperBound)\n-----------------\n\nIf `upperBound` is supplied, return a random `bignum` between the instance value\nand `upperBound - 1`, inclusive.\n\nOtherwise, return a random `bignum` between 0 and the instance value - 1,\ninclusive.\n\n.probPrime()\n------------\n\nReturn whether the bignum is:\n\n* certainly prime (true)\n* probably prime ('maybe')\n* certainly composite (false)\n\nusing [mpz_probab_prime](http://gmplib.org/manual/Number-Theoretic-Functions.html).\n\n.nextPrime()\n------------\n\nReturn the next prime greater than `this` using\n[mpz_nextprime](http://gmplib.org/manual/Number-Theoretic-Functions.html).\n\n.sqrt()\n-------\n\nReturn a new `bignum` that is the square root.  This truncates.\n\n.root(n)\n-------\n\nReturn a new `bignum` that is the `nth` root.  This truncates.\n\n.shiftLeft(n)\n-------\n\nReturn a new `bignum` that is the `2^n` multiple. Equivalent of the <<\noperator.\n\n.shiftRight(n)\n-------\n\nReturn a new `bignum` of the value integer divided by\n`2^n`. Equivalent of the >> operator.\n\ninstall\n=======\n\nYou'll need the libssl (OpenSSL) source to compile this package. If\nyou compiled Node.js using the official instructions, you'll already\nhave it. Otherwise install it using the instructions below.\n\nUnder Debian-based systems,\n\n    sudo aptitude install libssl3-dev\n\nOn a Mac with [Homebrew](https://github.com/mxcl/homebrew/),\n\n    brew install openssl\n\nAnd then install with [npm](http://npmjs.org):\n\n    npm install bignum\n","_id":"bignum@0.5.1","dist":{"shasum":"19f5bcc77249366cfdad1d023ac57673b0a2c966","tarball":"http://registry.npmjs.org/bignum/-/bignum-0.5.1.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]}},"readme":null,"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"time":{"modified":"2012-08-11T23:34:58.560Z","created":"2011-11-28T23:58:36.433Z","0.4.0":"2011-11-28T23:58:39.319Z","0.4.1":"2011-12-18T09:50:50.475Z","0.5.0":"2012-08-10T00:38:13.564Z","0.5.1":"2012-08-11T23:34:58.560Z"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"http://github.com/justmoon/node-bignum.git"},"users":{"substack":true,"pid":true,"sjonnet19":true},"_attachments":{"bignum-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-0FMLP97AkVG6sneK/0O7qA==","length":14092,"stub":true},"bignum-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-w0ybD+OeSdiuEYOOc19DVw==","length":13969,"stub":true},"bignum-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-75KlOjX7UfXm+Xj95u2CTQ==","length":14227,"stub":true},"bignum-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-G38e00ozCFo1pQj71qVRcA==","length":14264,"stub":true}}}},
{"id":"bignumber","key":"bignumber","value":{"rev":"3-6e372428992a767e0a991ec3f39b8343"},"doc":{"_id":"bignumber","_rev":"3-6e372428992a767e0a991ec3f39b8343","name":"bignumber","description":"A pure javascript implementation of BigIntegers and RSA crypto.","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"name":"bignumber","description":"A pure javascript implementation of BigIntegers and RSA crypto.","engines":{"node":">=0.4.0"},"version":"1.1.0","keywords":["bigintegers","rsa","pkcs"],"homepage":"http://www-cs-students.stanford.edu/~tjw/jsbn/","author":{"name":"Tom Wu","email":"tjw@cs.stanford.edu","url":"http://www-cs-students.stanford.edu/~tjw/"},"main":"./lib/rsa","repository":{"type":"git","url":"git://github.com/eschnou/node-rsa.git"},"_id":"bignumber@1.1.0","_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.4.2","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e6ab0a743da5f3ea018e5c17597d121f7868c159","tarball":"http://registry.npmjs.org/bignumber/-/bignumber-1.1.0.tgz"}}},"maintainers":[{"name":"eschnou","email":"laurent@eschenauer.be"}],"time":{"modified":"2011-03-15T20:40:23.404Z","created":"2011-03-15T20:40:22.903Z","1.1.0":"2011-03-15T20:40:23.404Z"},"author":{"name":"Tom Wu","email":"tjw@cs.stanford.edu","url":"http://www-cs-students.stanford.edu/~tjw/"},"repository":{"type":"git","url":"git://github.com/eschnou/node-rsa.git"},"_attachments":{"bignumber-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ctwSKubQg/EeX6DBwcJuwA==","length":30218,"stub":true}}}},
{"id":"bike","key":"bike","value":{"rev":"21-c0d349f6080fda5e2c22a34ea678eb90"},"doc":{"_id":"bike","_rev":"21-c0d349f6080fda5e2c22a34ea678eb90","name":"bike","description":"Class system to organize namespaces, define, create, extend, mixin, super inheritance and more.","dist-tags":{"latest":"0.5.4"},"versions":{"0.5.1":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"bike","description":"Class System - define, create, extend, mixin, super()...","version":"0.5.1","repository":{"type":"git","url":"git://github.com/behere/bike.git"},"main":"./lib/bike.js","engines":{"node":"*"},"dependencies":{"uberproto":"*","underscore":"*"},"devDependencies":{"uglify-js":"*","wrench":"*","dox":"*","mocha":"*","should":"*","browserbuild":"*"},"optionalDependencies":{},"bin":{"help":"./bin/bike"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"bike@0.5.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"327cc9427dbb721766f6cd62564e35ce62398e37","tarball":"http://registry.npmjs.org/bike/-/bike-0.5.1.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"directories":{}},"0.5.2":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"bike","description":"Class System - define, create, extend, mixin, super()...","version":"0.5.2","repository":{"type":"git","url":"git://github.com/behere/bike.git"},"main":"./lib/bike.js","engines":{"node":"*"},"dependencies":{"uberproto":"*","underscore":"*"},"devDependencies":{"uglify-js":"*","wrench":"*","dox":"*","mocha":"*","should":"*","browserbuild":"*"},"optionalDependencies":{},"bin":{"help":"./bin/bike"},"scripts":{"prepublish":"npm prune","test":"make test"},"_id":"bike@0.5.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e90983800e3c2fd2b952423e7b57073742be4904","tarball":"http://registry.npmjs.org/bike/-/bike-0.5.2.tgz"},"_from":"bike@0.5.1","_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"directories":{}},"0.5.3":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"bike","description":"Class system to organize namespaces, define, create, extend, mixin, super inheritance and more.","version":"0.5.3","repository":{"type":"git","url":"git://github.com/behere/bike.git"},"main":"./lib/bike.js","engines":{"node":"*"},"dependencies":{"underscore":"*"},"devDependencies":{"uglify-js":"*","wrench":"*","dox":"*","mocha":"*","should":"*","browserbuild":"*"},"optionalDependencies":{},"bin":{"bike":"./bin/bike"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"bike@0.5.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f4492a21b5511f1a5e49415eeb449c514aa3f658","tarball":"http://registry.npmjs.org/bike/-/bike-0.5.3.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"directories":{}},"0.5.4":{"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"name":"bike","description":"Class system to organize namespaces, define, create, extend, mixin, super inheritance and more.","version":"0.5.4","repository":{"type":"git","url":"git://github.com/behere/bike.git"},"main":"./lib/bike.js","engines":{"node":"*"},"dependencies":{"underscore":"*"},"devDependencies":{"uglify-js":"*","wrench":"*","dox":"*","mocha":"*","should":"*","browserbuild":"*"},"optionalDependencies":{},"bin":{"bike":"./bin/bike"},"scripts":{"prepublish":"npm prune","test":"make test"},"_npmUser":{"name":"behere","email":"gabriele.ds@gmail.com"},"_id":"bike@0.5.4","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"74f3875dfc0444b89dcbbcfb9d811c94f485b0ed","tarball":"http://registry.npmjs.org/bike/-/bike-0.5.4.tgz"},"maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}]}},"readme":"> ![Stage](https://github.com/behere/behere.github.com/raw/master/assets/stage/production.png)  \n[![Build Status](https://secure.travis-ci.org/behere/bike.png)](http://travis-ci.org/behere/bike)\n\n> version 0.5.1 (stable) - [History](https://github.com/behere/bike/blob/master/HISTORY.md)\n\n# Bike\n  \n  Organize your classes through namespaces, extend or mix them.\n  \n  This module can be used `standalone` or inside [behere framework](http://github.com/behere/behere) as `behere.bike`.\n\n## Installation\n\nInstall this using `npm` as follows for standalone use\n\n    $ npm install bike\n\n## Quick Start\n\n### Define a class\n\nThis will *register* a class.\n\n```javascript\nvar Bike = require('bike');\n\nBike.define('animal', {\n  move: function(){\n    return 'i move'\n  }\n});\n\nBike.create('animal').move();\n// => 'i move'\n```\n\nbehere use: `behere.define()`\n\n### Create a class\n\n```javascript\nvar animal = Bike.create('animal');\n\nanimal.move();\n// => 'i move'\n```\n\nbehere use: `behere.create()`\n\n### Extend a class\n\nExtending a class will allow to inherit all the properties and methods from the extended object.\nTo call the parent method use the `this._super()` syntax.\n\n```javascript\nBike.define('cat', {\n  extend: 'animal',\n  move: function(){\n    return this._super() + ', run and jump'\n  }\n});\n\nvar cat = Bike.create('cat');\n\ncat.move();\n// => 'i move, run and jump'\n```\n\n### Use namespaces\n\nThe namespace will bike you organize classes in a tree structure.\n\n```javascript\nBike.define('animal', {\n  /* ... */\n});\n\nBike.define('animal.cat', {\n  extend: 'animal'\n  /* ... */\n});\n\nBike.define('animal.cat.Sophie', {\n  extend: 'animal.cat'\n  /* ... */\n});\n\n// And more..\n\nBike.define('animal.dog', {\n  extend: 'animal'\n  /* ... */\n});\n\nBike.define('Monkey', {  // Monkey is the name of my dog :-)\n  extend: 'animal.dog'\n  /* ... */\n});\n```\n\n### Load missing libraries\n\nIn most of the cases your code will need to `require` libraries.\nWith *Bike* what you need to do it so define namespaces and its system location.\n\n```javascript\nBike.namespace('foo', '/my/path/to/it');\n\nBike.create('foo.animal');\n// => this will create a class defined in '/my/path/to/it/animal.js'\n```\n\nWorks the same extending or mixing:\n\n```javascript\nBike.define('Sophie', {\n  extend: 'foo.animal.cat'\n});\n// => This will extend the class defined in '/my/path/to/it/animal/cat.js'\n```\n\n## Features\n\n  * ...\n\n## Running Tests\n\nInstall dev dependencies and make tests:\n\n    $ npm install -d\n    $ make test\n\n## Contributors\n\n```\nGabriele Di Stefano <gabriele.ds@gmail.com>\n```\n\n![Behere Logo](https://github.com/behere/behere.github.com/raw/master/assets/behere_logo.png)\n\n## License \n\n[The MIT License](https://github.com/behere/bike/blob/master/LICENSE)","maintainers":[{"name":"behere","email":"gabriele.ds@gmail.com"}],"time":{"modified":"2012-07-19T22:25:42.236Z","created":"2012-06-14T08:50:38.478Z","0.5.1":"2012-06-14T08:50:41.045Z","0.5.2":"2012-06-29T20:34:53.181Z","0.5.3":"2012-07-02T23:10:53.430Z","0.5.4":"2012-07-19T22:25:42.236Z"},"author":{"name":"Gabriele Di Stefano","email":"gabriele.ds@gmail.com"},"repository":{"type":"git","url":"git://github.com/behere/bike.git"},"_attachments":{"bike-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-pYAR51hPVluj1qeGUScQxg==","length":22236,"stub":true},"bike-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-rLTxILpiqZzDyMaLj99BmA==","length":21817,"stub":true},"bike-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ddRno8Ge2WjYgBFiDpz6gw==","length":21729,"stub":true},"bike-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qtHVkcvdZmOCStfXfbl2Xw==","length":21580,"stub":true}}}},
{"id":"binary","key":"binary","value":{"rev":"52-dc6ac2ec4cf8d93063ff854158ad2a0b"},"doc":{"_id":"binary","_rev":"52-dc6ac2ec4cf8d93063ff854158ad2a0b","name":"binary","description":"Unpack multibyte binary values from buffers","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"binary","version":"0.0.1","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack"],"dependencies":{"chainsaw":">0.0.3"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11","_nodeVersion":"v0.2.5","dist":{"shasum":"e454d1a7edd9705445701ebf68173c406a68baaf","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.1.tgz"}},"0.0.2":{"name":"binary","version":"0.0.2","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"dependencies":{"chainsaw":">0.0.3"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11","_nodeVersion":"v0.2.5","dist":{"shasum":"9c33615778707a639ae403e0c6e7eab8bdd87df9","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.2.tgz"}},"0.0.3":{"name":"binary","version":"0.0.3","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"dependencies":{"chainsaw":">0.0.3"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11","_nodeVersion":"v0.2.5","dist":{"shasum":"c8de1c97195dfd700f0004b2a34bfc7f4fcace4f","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.3.tgz"}},"0.0.4":{"name":"binary","version":"0.0.4","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"dependencies":{"chainsaw":">0.0.3"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11","_nodeVersion":"v0.2.5","dist":{"shasum":"d3c1ba4c034138e8460bd8caaf18f9de832e008f","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.4.tgz"}},"0.0.5":{"name":"binary","version":"0.0.5","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"dependencies":{"chainsaw":">0.0.3"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11","_nodeVersion":"v0.2.5","dist":{"shasum":"4e4bd856c01cb9868d13788df82cd074e23b3eba","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.5.tgz"}},"0.0.6":{"name":"binary","version":"0.0.6","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">0.0.3"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.11","_nodeVersion":"v0.2.5","dist":{"shasum":"0e4722f47a1c465df30db903f1c1f7f260aacddb","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.6.tgz"}},"0.0.8":{"name":"binary","version":"0.0.8","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.0.8","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.2.5","dist":{"shasum":"c20c0e11461832c4670ffd4bdd5845fe2657cb5f","tarball":"http://registry.npmjs.org/binary/-/binary-0.0.8.tgz"}},"0.1.0":{"name":"binary","version":"0.1.0","description":"Unpack multibyte binary values from buffers","modules":{"index":"./index.js"},"repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.2.5","dist":{"shasum":"9475582879155e487495f65730ef304c7e42898d","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.0.tgz"}},"0.1.1":{"name":"binary","version":"0.1.1","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js","buf.js":"lib/buf.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"87540ddcf5980a57ffe239f1a6a1c8ba4760d888","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.1.tgz"}},"0.1.2":{"name":"binary","version":"0.1.2","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">0.0.1"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"885375360a6201deb19235e0e2a41ab45b12e3e0","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.2.tgz"}},"0.1.3":{"name":"binary","version":"0.1.3","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c78a1bf04ae080ae33bf7e9e183b3a62bed5512a","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.3.tgz"}},"0.1.4":{"name":"binary","version":"0.1.4","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"6b87b443713896994dcb61d53f6a013c0000cd17","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.4.tgz"}},"0.1.5":{"name":"binary","version":"0.1.5","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"eabe5b8dbd226c2dca7347b81a7eb09394d8cbd0","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.5.tgz"}},"0.1.6":{"name":"binary","version":"0.1.6","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"abbb544559c6088acec3ba87293e8f7839e6e47c","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.6.tgz"}},"0.1.7":{"name":"binary","version":"0.1.7","description":"Unpack multibyte binary values from buffers","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">=0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{"lib":"./lib"},"modules":{"vars.js":"lib/vars.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"aaf245f4be796b20b9693a6edfcf2d7e673f3d15","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.7.tgz"}},"0.1.8":{"name":"binary","version":"0.1.8","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">=0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4a636ec485f31975b81bc316deb4f9cc19e1c433","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.8.tgz"}},"0.1.9":{"name":"binary","version":"0.1.9","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.4","put":">=0.0.1","buffers":">=0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"binary@0.1.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0f08aaa3966a1749d16bebd6c6832947ec220a8c","tarball":"http://registry.npmjs.org/binary/-/binary-0.1.9.tgz"}},"0.2.0":{"name":"binary","version":"0.2.0","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.7","put":">=0.0.1","buffers":">=0.0.1"},"devDependencies":{"seq":">=0.1.7","expresso":">=0.6.0"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.2.0"},"_id":"binary@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"a2028693e9e189105411b4f037ef9bbcc89bc87d","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.0.tgz"}},"0.2.1":{"name":"binary","version":"0.2.1","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.7 <0.1","put":">=0.0.5 <0.1","buffers":">=0.0.4 <0.1"},"devDependencies":{"seq":">=0.2.5 <0.3","expresso":"=0.7.x"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"binary@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"564fda5f6e2e2ed37e805705a044aadda212faa4","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.1.tgz"}},"0.2.2":{"name":"binary","version":"0.2.2","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.7 <0.1","put":">=0.0.5 <0.1","buffers":"0.1.x"},"devDependencies":{"seq":">=0.2.5 <0.3","expresso":"=0.7.x"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"binary@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"2216624e8dd362072ffdc953d817dfb26c5a8f95","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.2.tgz"}},"0.2.3":{"name":"binary","version":"0.2.3","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":">=0.0.7 <0.1","put":">=0.0.5 <0.1","buffers":"0.1.x"},"devDependencies":{"seq":">=0.2.5 <0.3","expresso":"=0.7.x"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"binary@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4f86b535ecb72ffdd63e4fc16570a0037e7e2b80","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.3.tgz"}},"0.2.4":{"name":"binary","version":"0.2.4","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":"0.1.x","put":">=0.0.5 <0.1","buffers":"0.1.x"},"devDependencies":{"seq":">=0.2.5 <0.3","expresso":"=0.7.x"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"binary@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6eec03e2e8f847d5c7de09ba8e75e4d882738676","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.4.tgz"}},"0.2.5":{"name":"binary","version":"0.2.5","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":"0.1.x","put":">=0.0.5 <0.1","buffers":"0.1.x"},"devDependencies":{"seq":">=0.2.5 <0.3","expresso":"=0.7.x"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"binary@0.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1d273188ff0fbc9a09facbfbf83a7bbc574f57b5","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.5.tgz"}},"0.2.6":{"name":"binary","version":"0.2.6","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":"0.1.x","put":">=0.0.5 <0.1","buffers":"0.1.x"},"devDependencies":{"seq":">=0.2.5 <0.3","expresso":"=0.7.x"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/home/substack/.npm/binary/0.2.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binary@0.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"58d17cbd01ff30afe2879435157c43f3c356d0b2","tarball":"http://registry.npmjs.org/binary/-/binary-0.2.6.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.0":{"name":"binary","version":"0.3.0","description":"Unpack multibyte binary values from buffers","main":"./index.js","repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"keywords":["binary","decode","endian","unpack","signed","unsigned"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"dependencies":{"chainsaw":"~0.1.0","buffers":"~0.1.1"},"devDependencies":{"seq":"~0.2.5","tap":"~0.2.4"},"scripts":{"test":"tap test/*.js"},"license":"MIT","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"binary@0.3.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9f60553bc5ce8c3386f3b553cff47462adecaa79","tarball":"http://registry.npmjs.org/binary/-/binary-0.3.0.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"repository":{"type":"git","url":"git://github.com/substack/node-binary.git"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"time":{"modified":"2012-08-06T14:30:47.755Z","created":"2011-01-31T10:07:37.593Z","0.0.1":"2011-01-31T10:07:37.593Z","0.0.2":"2011-01-31T10:07:37.593Z","0.0.3":"2011-01-31T10:07:37.593Z","0.0.4":"2011-01-31T10:07:37.593Z","0.0.5":"2011-01-31T10:07:37.593Z","0.0.6":"2011-01-31T10:07:37.593Z","0.0.8":"2011-01-31T10:07:37.593Z","0.1.0":"2011-01-31T10:07:37.593Z","0.1.1":"2011-01-31T10:07:37.593Z","0.1.2":"2011-02-06T14:00:20.323Z","0.1.3":"2011-02-07T12:02:01.365Z","0.1.4":"2011-02-07T12:34:04.452Z","0.1.5":"2011-02-11T08:11:23.341Z","0.1.6":"2011-02-12T00:17:32.993Z","0.1.7":"2011-02-14T02:22:17.859Z","0.1.8":"2011-03-16T01:58:39.187Z","0.1.9":"2011-03-27T06:05:11.251Z","0.2.0":"2011-04-28T06:53:58.316Z","0.2.1":"2011-05-12T07:12:23.280Z","0.2.2":"2011-06-30T01:26:15.164Z","0.2.3":"2011-07-11T10:29:23.670Z","0.2.4":"2011-07-17T08:45:40.978Z","0.2.5":"2011-07-22T23:51:18.679Z","0.2.6":"2011-10-14T23:06:48.230Z","0.3.0":"2012-05-11T12:39:11.639Z"},"users":{"sjonnet19":true},"_attachments":{"binary-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-O/q+/qLklsxB0dhmn6hsbQ==","length":9762,"stub":true},"binary-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-zozMG2IdtiABoOWVE4Bg2Q==","length":8536,"stub":true},"binary-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-C0VkTANaz8d0OyGaiz3wXg==","length":8440,"stub":true},"binary-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-YUB9Qg9lq5JzIA2q07wzMA==","length":8441,"stub":true},"binary-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-CEdTVbbzJcyzha4HbZrxog==","length":8489,"stub":true},"binary-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-CurkRX7OR0Og35zHFjGlow==","length":8434,"stub":true},"binary-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-PYcgNrNjcK4ZgtInDeuarg==","length":8411,"stub":true},"binary-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-1EU3DxNqqXLE3IG9rttxtw==","length":8036,"stub":true},"binary-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-VzxMqdG4xApekTWx8IsHpA==","length":7509,"stub":true},"binary-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-JT37k/bU6fenxc53FCdfjw==","length":7492,"stub":true},"binary-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-IuHep4+pyqW8UguBXNefAg==","length":7375,"stub":true},"binary-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-eLMUUB/8kx94MwdCYNlh1g==","length":7374,"stub":true},"binary-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-4VphH2vfB/iszJwtj9wWSw==","length":7352,"stub":true},"binary-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-6LVAUuviQy6lmATusK3Scg==","length":7319,"stub":true},"binary-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-BtGhSO8aB/FANhrOpShzwA==","length":6974,"stub":true},"binary-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-9OTAl2AdFldLKStFrS5jXQ==","length":6574,"stub":true},"binary-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-3Y1hh19wjJkjXN/Mx6k2Pw==","length":6649,"stub":true},"binary-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-t49xmrzw+hSNMeXU7lMj1g==","length":6406,"stub":true},"binary-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-LUUSC+oj5wHbjCQ2QSXNQw==","length":6344,"stub":true},"binary-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wtubz/ybdO0Y1HwtD7IdOA==","length":5727,"stub":true},"binary-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-UTM16aVTZCqkP2vUT+rrpg==","length":5644,"stub":true},"binary-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Rjyj5qLEGNxjadI1kN1XHw==","length":5232,"stub":true},"binary-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2DkR8uBplq9kxcthStXUyA==","length":4886,"stub":true},"binary-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RB4ibmdpjJ9Ccaemh/rk3A==","length":4445,"stub":true},"binary-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8JhaR1c6veQG/Gb2SblRTA==","length":3671,"stub":true}}}},
{"id":"binarySearch","key":"binarySearch","value":{"rev":"15-93a3d2f9c2690457023b5ae5f3d00446"},"doc":{"_id":"binarySearch","_rev":"15-93a3d2f9c2690457023b5ae5f3d00446","name":"binarySearch","description":"An addon to node.js that provides a binary search function that runs in native C++.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"binarySearch","version":"0.0.1","description":"An addon to node.js that provides a binary search function that runs in native C++.","author":{"name":"Brian Noguchi","url":"github.com/bnoguchi"},"main":"./lib/binarySearch","repository":{"type":"git","url":"http://github.com/bnoguchi/node-binary-search"},"engines":{"node":">=0.1.100"},"scripts":{"install":"cd src && node-waf configure build","test":"test/test.js"},"licenses":[{"type":"MIT","url":"http://github.com/bnoguchi/node-binary-search/LICENSE-MIT"}],"_id":"binarySearch@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/binarySearch/-/binarySearch-0.0.1.tgz"}},"0.0.2":{"name":"binarySearch","version":"0.0.2","description":"An addon to node.js that provides a binary search function that runs in native C++.","author":{"name":"Brian Noguchi","url":"github.com/bnoguchi"},"main":"./lib/binarySearch","repository":{"type":"git","url":"http://github.com/bnoguchi/node-binary-search"},"engines":{"node":">=0.1.100"},"scripts":{"install":"cd src && node-waf configure build","test":"test/test.js"},"licenses":[{"type":"MIT","url":"http://github.com/bnoguchi/node-binary-search/LICENSE-MIT"}],"_id":"binarySearch@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/binarySearch/-/binarySearch-0.0.2.tgz"}},"0.0.3":{"name":"binarySearch","version":"0.0.3","description":"An addon to node.js that provides a binary search function that runs in native C++.","author":{"name":"Brian Noguchi","url":"github.com/bnoguchi"},"main":"./lib/binarySearch","repository":{"type":"git","url":"http://github.com/bnoguchi/node-binary-search"},"engines":{"node":">=0.1.100"},"scripts":{"install":"cd src && node-waf configure build","test":"test/test.js"},"licenses":[{"type":"MIT","url":"http://github.com/bnoguchi/node-binary-search/LICENSE-MIT"}],"_id":"binarySearch@0.0.3","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/binarySearch/-/binarySearch-0.0.3.tgz","bin":{"0.4-sunos-5.11":{"shasum":"1ed1175a47218e846002b819b0d138f1bfc1fed8","tarball":"http://registry.npmjs.org/binarySearch/-/binarySearch-0.0.3-0.4-sunos-5.11.tgz"}}},"directories":{}}},"maintainers":[{"name":"bnoguchi","email":"brian.noguchi@gmail.com"}],"author":{"name":"Brian Noguchi","url":"github.com/bnoguchi"},"repository":{"type":"git","url":"http://github.com/bnoguchi/node-binary-search"},"time":{"modified":"2011-04-15T21:03:40.478Z","created":"2011-03-31T05:27:22.088Z","0.0.1":"2011-03-31T05:27:22.088Z","0.0.2":"2011-03-31T05:27:22.088Z","0.0.3":"2011-03-31T05:27:22.088Z"},"_attachments":{"binarySearch-0.0.3-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-zmW6/l2MURypQyYo6KtatA==","length":38929,"stub":true},"binarySearch-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gKqL1InjUNBFnl4m0WIlNw==","length":3825,"stub":true},"binarySearch-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+ScqosBK/8hgbTPtb9vOiQ==","length":2458,"stub":true},"binarySearch-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VBt/CtL+sGkOQnLiRJWpBw==","length":2341,"stub":true}}}},
{"id":"binarybeast","key":"binarybeast","value":{"rev":"9-dd0fd58585624779bb13ce644fc9daa8"},"doc":{"_id":"binarybeast","_rev":"9-dd0fd58585624779bb13ce644fc9daa8","name":"binarybeast","description":"BinaryBeast API Modules","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"author":{"name":"Brandon Simmons","email":"contact@binarybeast.com","url":"http://binarybeast.com/"},"name":"binarybeast","description":"BinaryBeast API Modules","version":"0.1.0","homepage":"http://binarybeast.com/api/info","repository":{"type":"git","url":"git://github.com/BinaryBeast/BinaryBeast_API_Node.js.git"},"main":"index.js","engines":{"node":"~0.6.2"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"binarybeast","email":"contact@binarybeast.com"},"_id":"binarybeast@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"9cc7a00be6b35e9adad9190bfe0ef5edcabf09c6","tarball":"http://registry.npmjs.org/binarybeast/-/binarybeast-0.1.0.tgz"},"maintainers":[{"name":"binarybeast","email":"contact@binarybeast.com"}]},"0.1.1":{"author":{"name":"Brandon Simmons","email":"contact@binarybeast.com","url":"http://binarybeast.com/"},"name":"binarybeast","description":"BinaryBeast API Modules","version":"0.1.1","homepage":"http://binarybeast.com/api/info","repository":{"type":"git","url":"git://github.com/BinaryBeast/BinaryBeast_API_Node.js.git"},"main":"index.js","engines":{"node":"v0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"binarybeast","email":"contact@binarybeast.com"},"_id":"binarybeast@0.1.1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d49748a6dbe64e058488b62169493d60fa2fd791","tarball":"http://registry.npmjs.org/binarybeast/-/binarybeast-0.1.1.tgz"},"maintainers":[{"name":"binarybeast","email":"contact@binarybeast.com"}]},"0.1.2":{"author":{"name":"Brandon Simmons","email":"contact@binarybeast.com","url":"http://binarybeast.com/"},"name":"binarybeast","description":"BinaryBeast API Modules","version":"0.1.2","homepage":"http://binarybeast.com/api/info","repository":{"type":"git","url":"git://github.com/BinaryBeast/BinaryBeast_API_Node.js.git"},"main":"index.js","engines":{"node":"v0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"binarybeast","email":"contact@binarybeast.com"},"_id":"binarybeast@0.1.2","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"3a9f39a468d82034904b90aafb9f51e616a6c201","tarball":"http://registry.npmjs.org/binarybeast/-/binarybeast-0.1.2.tgz"},"maintainers":[{"name":"binarybeast","email":"contact@binarybeast.com"}]},"0.1.3":{"author":{"name":"Brandon Simmons","email":"contact@binarybeast.com","url":"http://binarybeast.com/"},"name":"binarybeast","description":"BinaryBeast API Modules","version":"0.1.3","homepage":"http://binarybeast.com/api/info","repository":{"type":"git","url":"git://github.com/BinaryBeast/BinaryBeast_API_Node.js.git"},"main":"index.js","engines":{"node":"v0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"binarybeast","email":"contact@binarybeast.com"},"_id":"binarybeast@0.1.3","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"3ec043a8863a03d2e559576110436133fa5f5544","tarball":"http://registry.npmjs.org/binarybeast/-/binarybeast-0.1.3.tgz"},"maintainers":[{"name":"binarybeast","email":"contact@binarybeast.com"}]}},"readme":null,"maintainers":[{"name":"binarybeast","email":"contact@binarybeast.com"}],"time":{"modified":"2012-02-17T11:39:43.252Z","created":"2012-02-12T00:25:55.435Z","0.1.0":"2012-02-12T00:25:56.822Z","0.1.1":"2012-02-12T00:31:22.170Z","0.1.2":"2012-02-13T03:09:28.420Z","0.1.3":"2012-02-17T11:39:43.252Z"},"author":{"name":"Brandon Simmons","email":"contact@binarybeast.com","url":"http://binarybeast.com/"},"repository":{"type":"git","url":"git://github.com/BinaryBeast/BinaryBeast_API_Node.js.git"},"_attachments":{"binarybeast-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-tNdYcKfRlOMdD3nqRRrqCQ==","length":7809,"stub":true},"binarybeast-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nbWPFHSR52Dh7NnrF0WBVQ==","length":7179,"stub":true},"binarybeast-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-gA1NCAE0GBiD+PrVg/QpFg==","length":7168,"stub":true},"binarybeast-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-B1B5mMGned34zT9V6y2+cg==","length":7168,"stub":true}}}},
{"id":"binaryjs","key":"binaryjs","value":{"rev":"44-1e3fb67059d174131d53ced92108cc6b"},"doc":{"_id":"binaryjs","_rev":"44-1e3fb67059d174131d53ced92108cc6b","name":"binaryjs","description":"Binary realtime streaming made easy","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.0":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.0.0","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","engines":{"node":">0.6.0"},"dependencies":{"streamws":"~0.0.0","binarypack":"~0.0.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.0.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"370a1b0dc7556a7ec01b142cf67dec95c2e0476a","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.0.0.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.0.1":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.0.1","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","engines":{"node":">0.6.0"},"dependencies":{"streamws":"~0.0.0","binarypack":"~0.0.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"3fb47269dfe638e3c32407aa5be0c3eccda22c11","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.0.1.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.0.2","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","engines":{"node":">0.6.0"},"dependencies":{"streamws":"~0.0.0","binarypack":"~0.0.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"95d9ed1ce23415c899c9b91e00c15fdff38f7c51","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.0.2.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.0.3","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","engines":{"node":">=0.6.0"},"dependencies":{"streamws":">=0.0.0","binarypack":">=0.0.0","streamers":">=0.1.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"87bcae460e29c1c09394bdebf2383144d2ed9d1b","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.0.3.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.0.4","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","engines":{"node":">=0.6.0"},"dependencies":{"streamws":">=0.0.0","binarypack":">=0.0.0","streamers":">=0.1.0"},"readme":"BinaryJS\n========\n\nWe're under heavy development! \n\nFor docs and more info\nhttp://binaryjs.com\n\nNode binary websocket streaming made easy","_id":"binaryjs@0.0.4","dist":{"shasum":"0a8bd0e52d1dab20f3ac819e8ee3cbb72ed59de0","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.0.4.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.1.0","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","scripts":{"test":"make test"},"engines":{"node":">=0.6.0"},"dependencies":{"streamws":">=0.0.0","binarypack":">=0.0.0","streamers":">=0.1.0"},"devDependencies":{"mocha":"~1.3.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"91d5b349b3c5097c2df716b6e043b6a4bccd990a","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.1.0.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.1.1","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","scripts":{"test":"make test"},"engines":{"node":">=0.6.0"},"dependencies":{"streamws":">=0.0.0","binarypack":">=0.0.0","streamers":">=0.1.0"},"devDependencies":{"mocha":"~1.3.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"7bcfca95d3456b96f662ec4c6504cd60adf41325","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.1.1.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.1.2","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","scripts":{"test":"make test"},"engines":{"node":">=0.6.0"},"dependencies":{"streamws":">=0.0.0","binarypack":">=0.0.0","streamers":">=0.1.0"},"devDependencies":{"mocha":"~1.3.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"d903c58392635f2c12ed7358d1ed4463c536602d","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.1.2.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"name":"binaryjs","description":"Binary realtime streaming made easy","version":"0.1.3","homepage":"http://binaryjs.com","repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"main":"lib/server.js","scripts":{"test":"make test"},"engines":{"node":">=0.6.0"},"dependencies":{"streamws":">=0.0.0","binarypack":">=0.0.0","streamers":">=0.1.0"},"devDependencies":{"mocha":"~1.3.0"},"_npmUser":{"name":"ericz","email":"really.ez@gmail.com"},"_id":"binaryjs@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"2c77ea1fed038f353aa6aa326a8595acf9b68138","tarball":"http://registry.npmjs.org/binaryjs/-/binaryjs-0.1.3.tgz"},"maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}]}},"readme":"binaryjs\n========\n\nNode binary websocket streaming made easy","maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"time":{"modified":"2012-08-10T21:25:06.148Z","created":"2012-07-13T22:04:52.957Z","0.0.0":"2012-07-13T22:04:55.641Z","0.0.1":"2012-07-15T21:27:00.565Z","0.0.2":"2012-07-15T23:10:26.575Z","0.0.3":"2012-07-18T19:53:02.078Z","0.0.4":"2012-07-19T04:42:56.272Z","0.1.0":"2012-07-25T20:25:14.933Z","0.1.1":"2012-07-25T20:34:46.811Z","0.1.2":"2012-07-27T00:21:49.730Z","0.1.3":"2012-08-10T21:25:06.148Z"},"author":{"name":"Eric Zhang","url":"http://ericzhang.com"},"repository":{"type":"git","url":"git://github.com/binaryjs/binaryjs.git"},"users":{"fgribreau":true},"_attachments":{"binaryjs-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-UaslIHIehPGkyFs2I1QdaQ==","length":136689,"stub":true},"binaryjs-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-OO2kAFgqcPRrHs7rs4IYww==","length":134145,"stub":true},"binaryjs-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-bzNr+YzTqKHPws8gV4TZnA==","length":134099,"stub":true},"binaryjs-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-y8vqPSfo06WZugPiiV+WIw==","length":134112,"stub":true},"binaryjs-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-IjjtZ11py3tGoALZy+z7Eg==","length":134615484,"stub":true},"binaryjs-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hVIWGuOOJe41HDVrQk9eBA==","length":128070,"stub":true},"binaryjs-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EXYy23Bo4kRENbem0E7MaA==","length":122639,"stub":true},"binaryjs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zpYXS48kjfzOJwq6B/qjNg==","length":121435,"stub":true},"binaryjs-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-084V5oJcIjSe2bR13a6e6g==","length":121705,"stub":true}}}},
{"id":"binarypack","key":"binarypack","value":{"rev":"7-133a9bb218152423386f27c6aa7ff864"},"doc":{"_id":"binarypack","_rev":"7-133a9bb218152423386f27c6aa7ff864","name":"binarypack","description":"BinaryPack is a JSON-like binary serialization format","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"name":"binarypack","description":"BinaryPack is a JSON-like binary serialization format","version":"0.0.0","homepage":"https://github.com/binaryjs/node-binarypack","author":{"name":"Eric Zhang"},"repository":{"type":"git","url":"https://github.com/binaryjs/node-binarypack"},"main":"./lib/binarypack","engines":{"node":">=0.6.0"},"dependencies":{"buffercursor":">=0.0.3"},"_id":"binarypack@0.0.0","dist":{"shasum":"8dfcb507c54e89d1f5c6bc0e582dc40d917cda52","tarball":"http://registry.npmjs.org/binarypack/-/binarypack-0.0.0.tgz"},"readme":"","maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}]},"0.0.1":{"name":"binarypack","description":"BinaryPack is a JSON-like binary serialization format","version":"0.0.1","homepage":"https://github.com/binaryjs/node-binarypack","author":{"name":"Eric Zhang"},"repository":{"type":"git","url":"https://github.com/binaryjs/node-binarypack"},"main":"./lib/binarypack","engines":{"node":">=0.6.0"},"dependencies":{"buffercursor":">=0.0.3"},"_id":"binarypack@0.0.1","dist":{"shasum":"1231517a660f26c1953610704aa16bf4a24a2ce4","tarball":"http://registry.npmjs.org/binarypack/-/binarypack-0.0.1.tgz"},"readme":"","maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}]},"0.0.2":{"name":"binarypack","description":"BinaryPack is a JSON-like binary serialization format","version":"0.0.2","homepage":"https://github.com/binaryjs/node-binarypack","author":{"name":"Eric Zhang"},"repository":{"type":"git","url":"https://github.com/binaryjs/node-binarypack"},"main":"./lib/binarypack","engines":{"node":">=0.6.0"},"dependencies":{"buffercursor":">=0.0.3"},"_id":"binarypack@0.0.2","dist":{"shasum":"0231e99e135d45d8cc6063db4facc94dbba99f29","tarball":"http://registry.npmjs.org/binarypack/-/binarypack-0.0.2.tgz"},"readme":"","maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}]}},"readme":"","maintainers":[{"name":"ericz","email":"really.ez@gmail.com"}],"time":{"modified":"2012-07-19T04:40:58.347Z","created":"2012-07-13T22:00:53.795Z","0.0.0":"2012-07-13T22:00:56.598Z","0.0.1":"2012-07-18T18:20:18.834Z","0.0.2":"2012-07-19T04:40:58.347Z"},"author":{"name":"Eric Zhang"},"repository":{"type":"git","url":"https://github.com/binaryjs/node-binarypack"},"_attachments":{"binarypack-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3lywpkSoPf7u6LQUTLDdLQ==","length":2707,"stub":true},"binarypack-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WWWk+UqBuvsjv8KAU0aOUQ==","length":2712,"stub":true},"binarypack-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JWQImkhlx1z3fHJcaTTTFg==","length":2705,"stub":true}}}},
{"id":"binaryparser","key":"binaryparser","value":{"rev":"3-cf09bd7851e5208d19b5bb049285ed84"},"doc":{"_id":"binaryparser","_rev":"3-cf09bd7851e5208d19b5bb049285ed84","name":"binaryparser","description":"Library for parsing binary data","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"binaryparser","version":"0.2.0","description":"Library for parsing binary data","keywords":["binary","parser","bits"],"author":{"name":"Florin Braghis","email":"florin@libertv.ro"},"repository":{"type":"git","url":"git://github.com/codeboost/binaryparser.git"},"dependencies":{},"main":"index","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"codeboost","email":"florin@libertv.ro"},"_id":"binaryparser@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e38bcc17962df698ce04c44be1b8c40d2203dfe6","tarball":"http://registry.npmjs.org/binaryparser/-/binaryparser-0.2.0.tgz"},"maintainers":[{"name":"codeboost","email":"florin@libertv.ro"}]}},"readme":"BinaryParser\r\n============\r\n\r\nBinaryParser is a node.js module which facilitates parsing of binary data received from the network or from a local file.\r\nBinaryParser lets you define the data format using javascript object notation and allows for parsing of complex binary streams.\r\nCallbacks are called whenever a binary field has been received and the data format can be changed on-the-fly. \r\n\r\n1. Include the binary parser\r\n\r\n\tconst bp = require ('binaryparser').BinaryParser;\r\n\r\n2. Create an instance of the parser:\r\n\r\n\tvar parser = new bp.BinaryParser();\r\n\r\n\r\n3. Feed the buffers from the network to the binary parser\r\n\r\n\tsocket.on(\"data\", function(data){\r\n\t\tparser.addBuffer(data);\r\n\t});\t\r\n\r\n\r\n4. Define a data format and process the parsed data:\r\n\r\n\tparser.setFormat({\r\n\t\tfileSize: bp.dword(function(size){\r\n\t\t\tutil.puts(\"File size is \" + size);\r\n\t\t}),\r\n\t\r\n\t\tfileData: bp.bits('fileSize', function(data){\r\n\t\t\tutil.puts(\"File data received: \" + data.length + \" bytes\");\r\n\t\t})\r\n\t});\r\n\r\nDocumentation\r\n=============\r\n\r\nData types\r\n----------\r\n\r\nThe following data types are supported:\r\n\r\n\tchar8: 8 bits unsigned\r\n\tushort: 16 bits unsigned\r\n\tdword: 32 bits unsigned\r\n\tbits(size): a buffer of size bytes.\r\n\r\nData types are functions inside the BinaryParser namespace and take a callback as parameter:\r\n\r\n\tmyField: bp.dword([callback])\r\n\r\nWhere callback is the function called when the field has been parsed.\r\n\r\nThe bp.bits type is defined as:\r\n\r\n\tmyBits: bp.bits(size, callback)\r\n\r\nThe size parameter can be a number or a string which references a previous field in current format:\r\n\r\n\tfile = {\r\n\t\tdataSize: bp.dword(),\r\n\t\tdata: bp.bits('dataSize', function(bits){});\r\n\t}\r\n\r\n\tparser.setFormat(file);\r\n\r\n\r\n\r\nProcessing order\r\n----------------\r\n\r\nFields are parsed in the order they are defined in the format. If nested formats are present, parsing is resumed at the next field after the nested format has been consumed.\r\nonFinished callback is called for the current format.\r\n\r\nContext\r\n-------\r\n\r\nEvery field callback has the context (this) set to the current format, so fields in current format can be accessed with this.fieldName.\r\n\r\n\tparser.setFormat({\r\n\t\tchunkType: bp.dword(function(value){\r\n\t\t\tutil.puts(value);\r\n\t\t\t//same as\r\n\t\t\tutil.puts(this.chunkType);\r\n\t\t})\r\n\t});\r\n\r\nNested formats\r\n--------------\r\n\r\nYou can nest multiple formats and you can call setFormat inside a field callback. After the new format was processed, the next field from the parent \r\nformat will be the active field.\r\n\r\n\tparser.setFormat({\r\n\t\r\n\t\theader: bp.dword(),\r\n\r\n\t\tpacket: {\r\n\t\t\t__repeat: 'forever',\r\n\t\t\ttype: bp.char8(function(type){\r\n\t\t\t\tif (type === 0){\r\n\t\t\t\t\tparser.setFormat({\r\n\t\t\t\t\t\tchecksum: bp.dword(function(checksum){\r\n\t\t\t\t\t\t\tutil.puts('checksum is ' + this.checksum);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tsize: bp.ushort(),\r\n\t\t\tdata: bp.bits('size'),\r\n\t\t\tonFinished: function(){\r\n\t\t\t\t//this refers to current format\r\n\t\t\t\tutil.puts('packet type is ' + this.type);\r\n\t\t\t\tutil.puts('packet size is ' + this.size);\r\n\t\t\t\tutil.puts('packet data is ' + this.data.toString());\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\nSpecial fields\r\n--------------\r\n\r\nSome field names are reserved and have a special meaning. These are:\r\n\r\nformatName: string\r\n\r\nOptional name for the format. Useful for debugging.\r\n\r\n__repeat: 'forever' or number or reference.\r\nif __repeat is a number, the format will be parsed the specified number of times.\r\nif __repeat is 'forever', the parser will always repeat this format.\r\nif a different string is passed, it specifies a field name which is evaluated when the data is received.\r\n\r\nExamples:\r\n\r\n\t//read 4 bytes from the stream and print the values\r\n\tparser.setFormat({\r\n\t\t__repeat: 4,\r\n\t\tvalue: char8(function(val){\r\n\t\t\tutil.puts('The byte value is ' + val);\r\n\t\t});\r\n\t});\r\n\r\n\t//receive files clustered in groups: \r\n\t//group1: [nFiles][ file1, file2, file_nFiles], group2: [nFiles][file1, file2, file...], ..., groupn: [nFiles][....],....\r\n\r\n\tparser.setFormat({\r\n\t\t__repeat: 'forever',\r\n\t\tnFiles: bp.char8(),\r\n\t\tfiles: {\r\n\t\t\t__repeat: 'nFiles',\t//determined automatically \r\n\t\t\tsize: bp.dword(),\r\n\t\t\tdata: bp.bits('size'),\r\n\t\t\tonFinished: function(){\r\n\t\t\t\tutil.puts('File received. ' + this.size + ' bytes');\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n\r\n\r\nonFinished: callback\r\nThis callback is called whenever the current format has been processed.\r\n\r\n\r\n\r\nMethods\r\n\r\nparser.setByteOrder(order) \r\n\r\norder: \"le\" or \"be\"\r\nMeaning the data has 'little endian' or 'big endian' byte order. Default is 'le'.\r\n\r\n\r\nparser.addBuffer(buffer)\r\n\r\nFeed a data buffer to the parser. The parser will process the data, call the callbacks on the formats specified and stop when it runs out of data or the format is finished.\r\nUsually used in a data io callback:\r\nsocket.on(\"data\"), function(data){\r\n\tparser.addBuffer(data);\r\n});\r\n\r\n\r\nparser.endStream()\r\n\r\nTells the parser that no more buffers will arrive. Parser will process remaining bytes and when it runs out of data, processing is stopped and onFinished() callback is called \r\non current format.\r\n\r\n\r\nDebugging\r\n---------\r\n\r\n\tconst bp = require('binaryparser');\r\n\tbp.setDebug(true)\r\n\r\nEnables logging of the parser's state. Useful when debugging the data stream.\r\n\r\n\r\nxxx. Acknowledgements\r\n\r\nBinaryParser uses Bufferlist module Copyright 2010 James Halliday (mail@substack.net).\r\nPartly inspired by http://substack.net/posts/cb328d\r\nUses  OO - Class - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed) whish is based on http://ejohn.org/blog/simple-javascript-inheritance/\r\n\r\n\r\n\r\n","maintainers":[{"name":"codeboost","email":"florin@libertv.ro"}],"time":{"modified":"2012-01-20T14:14:43.122Z","created":"2012-01-20T14:14:41.361Z","0.2.0":"2012-01-20T14:14:43.122Z"},"author":{"name":"Florin Braghis","email":"florin@libertv.ro"},"repository":{"type":"git","url":"git://github.com/codeboost/binaryparser.git"},"_attachments":{"binaryparser-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WMUtD6nW4IlHXeVXGvcd8A==","length":14872,"stub":true}}}},
{"id":"bind","key":"bind","value":{"rev":"17-1117997f2da51346ef18ac5f76536175"},"doc":{"_id":"bind","_rev":"17-1117997f2da51346ef18ac5f76536175","name":"bind","description":"A simple templating engine that smiles back","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"bind","version":"0.1.0","description":"A simple templating engine that smiles back","keywords":["template","engine","bind"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index","repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"_id":"bind@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"05beb8afaca2fee49ad3b55545331767b971d813","tarball":"http://registry.npmjs.org/bind/-/bind-0.1.0.tgz"}},"0.1.1":{"name":"bind","version":"0.1.1","description":"A simple templating engine that smiles back","keywords":["template","engine","bind"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"dependencies":{},"devDependencies":{},"_id":"bind@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c02357c2969c5688e7d2025fa4040c0548585958","tarball":"http://registry.npmjs.org/bind/-/bind-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"bind","version":"0.1.2","description":"A simple templating engine that smiles back","keywords":["template","engine","bind"],"maintainers":[{"name":"Xavi","email":"xavi.rmz@gmail.com","url":"http://xavi.co"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"dependencies":{},"devDependencies":{},"_id":"bind@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"13f7a02f230fbf0c7cf8f56eee3bb307ad266f02","tarball":"http://registry.npmjs.org/bind/-/bind-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"bind","version":"0.1.3","description":"A simple templating engine that smiles back","keywords":["template","engine","bind"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"dependencies":{},"devDependencies":{},"_id":"bind@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f270401057c8f64ba168905bcc1b08ea971efba8","tarball":"http://registry.npmjs.org/bind/-/bind-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"bind","version":"0.1.4","description":"A simple templating engine that smiles back","keywords":["template","engine","bind"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"_npmJsonOpts":{"file":"/Users/xavi/.npm/bind/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bind@0.1.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d40b667ab4940b56a1549e66054f3b2e1595e21e","tarball":"http://registry.npmjs.org/bind/-/bind-0.1.4.tgz"}},"0.1.5":{"name":"bind","version":"0.1.5","description":"A simple templating engine that smiles back","keywords":["template","engine","bind"],"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"main":"./index.js","repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"_npmUser":{"name":"xavi","email":"xavi.rmz@gmail.com"},"_id":"bind@0.1.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a8f9353f3aae56e8db0534a6a754b2118bfcba69","tarball":"http://registry.npmjs.org/bind/-/bind-0.1.5.tgz"}}},"maintainers":[{"name":"xavi","email":"xavi.rmz@gmail.com"}],"time":{"modified":"2012-08-14T09:55:37.940Z","created":"2011-02-05T22:58:46.070Z","0.1.0":"2011-02-05T22:58:46.376Z","0.1.1":"2011-05-05T02:25:33.019Z","0.1.2":"2011-06-12T23:31:21.221Z","0.1.3":"2011-08-14T06:49:04.253Z","0.1.4":"2011-10-04T15:27:10.671Z","0.1.5":"2011-11-15T13:10:09.787Z"},"repository":{"type":"git","url":"git://github.com/xavi-/bind-js.git"},"users":{"yazgazan":true,"sjonnet19":true},"_attachments":{"bind-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/BBOJjjS9j3guJjK4h5ghg==","length":20480,"stub":true},"bind-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-joKlQyA/+VEPdXDxwNkZyA==","length":10516,"stub":true},"bind-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-5Ql/5WCyQJjl9b8qOGwBKg==","length":10433,"stub":true},"bind-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pvkYxZ0S4nkTQo2uLi/5lQ==","length":9031,"stub":true},"bind-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IL5ADKZTqtKou3lqy1Mbeg==","length":8124,"stub":true},"bind-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hHlYanFcnUXucycoWLM6DA==","length":8314,"stub":true}}}},
{"id":"bindAll","key":"bindAll","value":{"rev":"3-76e127a3627c49179167017b8f44b226"},"doc":{"_id":"bindAll","_rev":"3-76e127a3627c49179167017b8f44b226","name":"bindAll","description":"bind all the functions to an object","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bindAll","version":"1.0.0","description":"bind all the functions to an object","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/bindAll.git"},"main":"index","scripts":{"test":"make test"},"homepage":"https://github.com/Raynos/bindAll","contributors":[{"name":"Jake Verbaten"}],"bugs":{"email":"raynos2@gmail.com","url":"https://github.com/Raynos/bindAll/issues"},"licenses":[{"type":"MIT","url":"http://github.com/raynos/bindAll/raw/master/LICENSE"}],"engines":{"node":">=0.4"},"dependencies":{"xtend":"1.0.2"},"_npmUser":{"name":"raynos","email":"raynos2@gmail.com"},"_id":"bindAll@1.0.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"7cb7cb5166411ea6da4365fdf1b5d6c5551fa0c1","tarball":"http://registry.npmjs.org/bindAll/-/bindAll-1.0.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"readme":"# bindAll\n\nbind all the functions to an object\n\n## Example\n\n    var o = bindAll({\n            foo: function () {\n                this.bar()\n            }\n        }, {\n            bar: function () {\n                assert(this === o)\n            }\n        }),\n        assert = require(\"assert\")\n    \n    var f = o.foo\n    f()","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2012-05-23T14:31:56.091Z","created":"2012-05-23T14:31:54.513Z","1.0.0":"2012-05-23T14:31:56.091Z"},"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/bindAll.git"},"_attachments":{"bindAll-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DbPrq60QTMQ9+EUHiAQC0g==","length":1573,"stub":true}}}},
{"id":"bindable","key":"bindable","value":{"rev":"3-48501bc01447059f6c5a7e9005419522"},"doc":{"_id":"bindable","_rev":"3-48501bc01447059f6c5a7e9005419522","name":"bindable","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Craig Condon"},"name":"bindable","version":"0.0.0","repository":{"type":"git","url":"git://github.com/crcn/bindable.js.git"},"main":"./lib/index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bindable@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2e930f82dfde63c358e4f73119e138bb1d735cc9","tarball":"http://registry.npmjs.org/bindable/-/bindable-0.0.0.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"\n\n### Collection Example\n\n```javascript\nvar bindable = require(\"bindable\");\nvar target = bindable.collection([\"hello\", \"world\"]);\n\ntarget.bindTo({\n\tadd: function(item, index) {\n\n\t},\n\tremove: function(item, index) {\n\n\t}\n});\n\n\n//emit remove twice, and add twice\ntarget.splice(0, 2, \"blah, \"blah\");\n````\n\n### Object Example\n\n```javascript\nvar bindable = require(\"bindable\");\nvar target = bindable.object({\n\tname: \"craig\"\n});\n\ntarget.bindTo({\n\tname: function(value) {\n\t\tconsole.log(value); //\"john\"\n\t}\n});\n\n\ntarget.name(\"john\");\n\n//or\ntarget.set(\"name\", \"john\");\n\n````","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-06-06T20:00:11.710Z","created":"2012-06-06T20:00:10.401Z","0.0.0":"2012-06-06T20:00:11.710Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bindable.js.git"},"_attachments":{"bindable-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bRia62lR0GG26r93evvGMQ==","length":10240,"stub":true}}}},
{"id":"bindata","key":"bindata","value":{"rev":"9-83c366f492a6afc9d5374e4de2df65f7"},"doc":{"_id":"bindata","_rev":"9-83c366f492a6afc9d5374e4de2df65f7","name":"bindata","description":"A structured and understandable way to read/write binary data in Javascript. Inspired by Ruby BinData.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bindata","version":"0.0.1","description":"A structured and understandable way to read/write binary data in Javascript. Inspired by Ruby BinData.","keywords":["bindata","binary","file","read","write","parse"],"homepage":"http://meltingice.github.com/bindata.js/","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net/"},"main":"./lib/bindata.js","repository":{"type":"git","url":"git://github.com/meltingice/bindata.js.git"},"devDependencies":{"jsmin":"1.0.1","coffee-script":"> 1.1.0","coffeescript-growl":"git://github.com/jawj/coffeescript-growl.git"},"bugs":{"url":"https://github.com/meltingice/bindata.js/issues"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"bindata@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c4b7658f5dd2acce060c536b9c5af0ab6b79c385","tarball":"http://registry.npmjs.org/bindata/-/bindata-0.0.1.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}],"directories":{}},"0.0.2":{"name":"bindata","version":"0.0.2","description":"A structured and understandable way to read/write binary data in Javascript. Inspired by Ruby BinData.","keywords":["bindata","binary","file","read","write","parse"],"homepage":"http://meltingice.github.com/bindata.js/","author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net/"},"main":"./lib/bindata.js","repository":{"type":"git","url":"git://github.com/meltingice/bindata.js.git"},"devDependencies":{"jsmin":"1.0.1","coffee-script":"> 1.1.0","coffeescript-growl":"git://github.com/jawj/coffeescript-growl.git"},"bugs":{"url":"https://github.com/meltingice/bindata.js/issues"},"_npmUser":{"name":"meltingice","email":"meltingice8917@gmail.com"},"_id":"bindata@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"1f4f98479e8ea57ef13871239a20036c2070f933","tarball":"http://registry.npmjs.org/bindata/-/bindata-0.0.2.tgz"},"maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}]}},"readme":"# BinData.js\n\nBinData.js is a simple and structured way to read and write binary data. Instead of having to remember a whole table of obscure character codes, you can write and encapsulate chunks of binary data together with ease.\n\nBinData.js aims to be a very close port of [Ruby's BinData library](http://bindata.rubyforge.org/).\n\n## Examples\n\n**Data record definition**\n\n``` coffeescript\nclass Rectangle extends BinData.Record\n  endian: \"little\"\n  define: ->\n    @uint16 \"len\"\n    @string \"name\", length: 4\n    @uint32 \"width\"\n    @uint32 \"height\"\n```\n\n**Reading a data record**\n\n``` coffeescript\nfile = BinData.File.open(\"/path/to/file\")\nr = new Rectangle(file)\nr.read()\n\nconsole.log \"Rectangle #{r.name} is #{r.width} x #{r.height}\"\n```","maintainers":[{"name":"meltingice","email":"meltingice8917@gmail.com"}],"time":{"modified":"2012-04-05T05:45:15.048Z","created":"2012-04-05T03:25:07.842Z","0.0.1":"2012-04-05T03:25:08.586Z","0.0.2":"2012-04-05T05:45:15.048Z"},"author":{"name":"Ryan LeFevre","email":"meltingice8917@gmail.com","url":"http://meltingice.net/"},"repository":{"type":"git","url":"git://github.com/meltingice/bindata.js.git"},"_attachments":{"bindata-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-swGcLo7NDjzLPHFe9w4icw==","length":23215,"stub":true},"bindata-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7CNKTqyHTnI8a11ftsgZgg==","length":22619,"stub":true}}}},
{"id":"binder","key":"binder","value":{"rev":"13-b1a0cd7f5d40331c7cffb5fec2a412ce"},"doc":{"_id":"binder","_rev":"13-b1a0cd7f5d40331c7cffb5fec2a412ce","name":"binder","description":"Creates objects and binds abilities together with verbs","dist-tags":{"latest":"0.3.1"},"versions":{"0.0.1":{"name":"binder","version":"0.0.1","description":"Creates objects and binds abilities together with verbs","homepage":"http://github.com/rodnaph/binder","_npmJsonOpts":{"file":"/Users/rod/.npm/binder/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binder@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8aa659cad0692fd7a0a5c689e299f506bba131c8","tarball":"http://registry.npmjs.org/binder/-/binder-0.0.1.tgz"},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}]},"0.0.2":{"name":"binder","version":"0.0.2","description":"Creates objects and binds abilities together with verbs","homepage":"http://github.com/rodnaph/binder","_npmJsonOpts":{"file":"/Users/rod/.npm/binder/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binder@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"1b10c941fe9a37884cd99e6dafe7dd26d7418857","tarball":"http://registry.npmjs.org/binder/-/binder-0.0.2.tgz"},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}]},"0.1.0":{"name":"binder","version":"0.1.0","description":"Creates objects and binds abilities together with verbs","homepage":"http://github.com/rodnaph/binder","_npmJsonOpts":{"file":"/Users/rod/.npm/binder/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binder@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"50322a8b98c8346870970de5ee902ecea7d2144b","tarball":"http://registry.npmjs.org/binder/-/binder-0.1.0.tgz"},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}]},"0.2.0":{"name":"binder","version":"0.2.0","description":"Creates objects and binds abilities together with verbs","homepage":"http://github.com/rodnaph/binder","_npmJsonOpts":{"file":"/Users/rod/.npm/binder/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binder@0.2.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"57940987d081412e7f46d6f4e92ffe3d0e430d5f","tarball":"http://registry.npmjs.org/binder/-/binder-0.2.0.tgz"},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}]},"0.3.0":{"name":"binder","version":"0.3.0","description":"Creates objects and binds abilities together with verbs","homepage":"http://github.com/rodnaph/binder","_npmJsonOpts":{"file":"/Users/rod/.npm/binder/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binder@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"abf8d18038e00ad11bf49b33d6b82dbe8f112831","tarball":"http://registry.npmjs.org/binder/-/binder-0.3.0.tgz"},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}]},"0.3.1":{"name":"binder","version":"0.3.1","description":"Creates objects and binds abilities together with verbs","homepage":"http://github.com/rodnaph/binder","_npmJsonOpts":{"file":"/Users/rod/.npm/binder/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"binder@0.3.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8396f08f016451781cc7e4d6f42896930aaff9f9","tarball":"http://registry.npmjs.org/binder/-/binder-0.3.1.tgz"},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}]}},"maintainers":[{"name":"rodnaph","email":"rod@pu-gh.com"}],"time":{"modified":"2011-10-15T17:22:36.562Z","created":"2011-09-24T00:03:55.428Z","0.0.1":"2011-09-24T00:03:57.218Z","0.0.2":"2011-09-24T10:52:09.236Z","0.1.0":"2011-09-24T15:38:17.297Z","0.2.0":"2011-09-29T20:09:38.050Z","0.3.0":"2011-10-15T13:09:53.241Z","0.3.1":"2011-10-15T17:22:36.562Z"},"_attachments":{"binder-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-6p54yfR46un0Ad0Dsz8I9g==","length":3434,"stub":true},"binder-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jG37PxglXgG7Q46lcDot7g==","length":3436,"stub":true},"binder-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-9/Xt6M1JZZVbL+hFeRIoFA==","length":3011,"stub":true},"binder-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-xcinwH5kE8co08f0RuTlFA==","length":2132,"stub":true},"binder-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xo/28Iw7AVbaJnLo8ZGluQ==","length":1871,"stub":true},"binder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hjANEtqFB+3nhV1mYkZ48g==","length":1481,"stub":true}}}},
{"id":"bindify","key":"bindify","value":{"rev":"5-ee5cb43de4131fae547fe503ebe6c171"},"doc":{"_id":"bindify","_rev":"5-ee5cb43de4131fae547fe503ebe6c171","name":"bindify","description":"Parameter binding for your functions","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"author":{"name":"Yorick","url":"http://yorick.no-ip.org/blog/"},"name":"bindify","description":"Parameter binding for your functions","version":"0.0.2","homepage":"http://github.com/yorickvP/bindify","repository":{"type":"git","url":"git://github.com/yorickvP/bindify.git"},"main":"bindify.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"yorick","email":"yorickvanpelt@gmail.com"},"_id":"bindify@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a2184d3eccbe38be6073f3041eab89617f1069d8","tarball":"http://registry.npmjs.org/bindify/-/bindify-0.0.2.tgz"},"maintainers":[{"name":"yorick","email":"yorickvanpelt@gmail.com"}]},"0.0.3":{"author":{"name":"Yorick","url":"http://yorick.no-ip.org/blog/"},"name":"bindify","description":"Parameter binding for your functions","version":"0.0.3","homepage":"http://github.com/yorickvP/bindify","repository":{"type":"git","url":"git://github.com/yorickvP/bindify.git"},"main":"bindify.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"yorick","email":"yorickvanpelt@gmail.com"},"_id":"bindify@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"24aaa016a974b5285a4bf31e785489b55da0625f","tarball":"http://registry.npmjs.org/bindify/-/bindify-0.0.3.tgz"},"readme":"","maintainers":[{"name":"yorick","email":"yorickvanpelt@gmail.com"}]}},"readme":null,"maintainers":[{"name":"yorick","email":"yorickvanpelt@gmail.com"}],"time":{"modified":"2011-12-27T02:57:59.881Z","created":"2011-12-18T15:51:07.779Z","0.0.2":"2011-12-18T15:51:09.931Z","0.0.3":"2011-12-27T02:57:59.881Z"},"author":{"name":"Yorick","url":"http://yorick.no-ip.org/blog/"},"repository":{"type":"git","url":"git://github.com/yorickvP/bindify.git"},"_attachments":{"bindify-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/PKMyeUtB69rbS+8JVEftA==","length":3134,"stub":true},"bindify-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3THtjWv1y45gHkeMpsJhKA==","length":3205,"stub":true}}}},
{"id":"bindings","key":"bindings","value":{"rev":"29-7393feb30a9f339062304a3d971b11df"},"doc":{"_id":"bindings","_rev":"29-7393feb30a9f339062304a3d971b11df","name":"bindings","description":"Helper module for loading your native module's .node file","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.0.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":">= 0.6.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"47d7d976e541539cb997c2728d0dc3fef461b976","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.0.1.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.1.0":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.1.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":">= 0.6.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"34c516b389c2ed39c06bd1d8212bc43f400f8d56","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.1.0.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.1.1":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.1.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":">= 0.6.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"212a9c27336e9d2122405ad0b19fc37f1779eedd","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.1.1.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.2.0":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.2.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":">= 0.6.0"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.2","_defaultsLoaded":true,"dist":{"shasum":"50425eebdcbd39cc8257b11e33d1c2babc3feb7b","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.2.0.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.2.1":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.2.1","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":"*"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.2.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.7.2","_defaultsLoaded":true,"dist":{"shasum":"cc314e1b6bb575b980df3d107f82f96a60e3e607","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.2.1.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.2.2":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.2.2","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":"*"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.2.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.7.3","_defaultsLoaded":true,"dist":{"shasum":"3e646cd70134d7beb688c18942016c3ed7b0a720","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.2.2.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.2.3":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.2.3","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":"*"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.2.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"658de98121f38da6bcd699e8c8877e7136f7dca5","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.2.3.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.2.4":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.2.4","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":"*"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.2.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0b147402a7198e7d7e644d13412676d73eb5a3fe","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.2.4.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.3.0":{"name":"bindings","description":"Helper module for loading your native module's bindings in a cross-platform way","keywords":["native","addon","bindings","gyp"],"version":"0.3.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":"*"},"_npmUser":{"name":"TooTallNate","email":"nathan@tootallnate.net"},"_id":"bindings@0.3.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2d01b7061ca312c6600c9b512404fd3ef99c06f3","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.3.0.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"}],"directories":{}},"0.4.0":{"name":"bindings","description":"node-bindings ============= ### Helper module for loading your native module's bindings in a cross-platform way.","keywords":["native","addon","bindings","gyp"],"version":"0.4.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","engines":{"node":"*"},"readme":"node-bindings\n=============\n### Helper module for loading your native module's bindings in a cross-platform way.\n\nThis is a helper module for authors of Node.js native addon modules. In node >=\n0.7.0, it is encouraged to statically precompile your native addons for your\nvarious supported platforms and architectures, rather than depend on your users\nto do that. This adds two new burdens on the developer that we now need to\nconsider while writing our module:\n\n 1. You now have to compile the bindings yourself, before publishing the module.\n 2. You now have to figure out which version of the bindings to load at runtime.\n\n`node-bindings` attempts to solve probelm `#2`.\n\nThis module solves the organizational problem of how to store these bindings\nfiles with a simple directory convention:\n\n```\n<module_root>/compiled/<node_version>/<platform>/<arch>/bindings.node\n```\n\nSo for example, on a 32-bit Windows platform, running node `v0.6.9`, the\n`bindings.node` file should be placed in:\n\n```\n<module_root>/compiled/0.6/win32/ia32/bindings.node\n```\n\nOn 64-bit Mac OS X, running node `v0.7.1`, then the bindings file should be\nplaced in:\n\n```\n<module_root>/compiled/0.7/darwin/x64/bindings.node\n```\n\nFor reference, the calculations for the various parts that makes up the require\npath are:\n\n * `<module_root>` - The directory where `package.json` is found is the root.\n * `<platform>` - `process.platform`\n * `<arch>` - `process.arch`\n * `<node_version>` - `parseFloat(process.versions.node)`\n\nThe default \"compiled\" directory is `compiled` and the default name of every\n\"bindings\" file is `bindings.node`. This is configurable if you'd like.\n\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install bindings\n```\n\n\nExample\n-------\n\n`require()`ing the proper bindings file for the current node version, platform\nand architecture is as simple as:\n\n``` js\nvar bindings = require('bindings')()\n\n// Use your bindings defined in your C files\nbindings.your_c_function()\n```\n\nYou can specify the name of the bindings file if you desire:\n\n``` js\nvar bindings = require('bindings')('my_bindings')\n```\n\nOr you can pass in an options Object for full configuration:\n\n\n``` js\nvar bindings = require('bindings')({\n    bindings: 'my_bindings'\n  , compiled: 'builddir'\n})\n```\n\nNice Error Output\n-----------------\n\n```\nError: Could not load the bindings file. Tried:\n -> /Users/nrajlich/node-ffi/out/Debug/ffi_bindings.node\n -> /Users/nrajlich/node-ffi/Debug/ffi_bindings.node\n -> /Users/nrajlich/node-ffi/out/Release/ffi_bindings.node\n -> /Users/nrajlich/node-ffi/Release/ffi_bindings.node\n -> /Users/nrajlich/node-ffi/compiled/0.6/darwin/x64/ffi_bindings.node\n -> /Users/nrajlich/node-ffi/build/Release/ffi_bindings.node\n -> /Users/nrajlich/node-ffi/build/default/ffi_bindings.node\n    at bindings (/Users/nrajlich/node-ffi/node_modules/bindings/bindings.js:80:13)\n    at Object.<anonymous> (/Users/nrajlich/node-ffi/lib/ffi.js:3:34)\n    at Module._compile (module.js:441:26)\n    at Object..js (module.js:459:10)\n    at Module.load (module.js:348:31)\n    at Function._load (module.js:308:12)\n    ...\n```\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"bindings@0.4.0","dist":{"shasum":"3ec1bc8aebe77c908b63908c15bd1613c865057c","tarball":"http://registry.npmjs.org/bindings/-/bindings-0.4.0.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"directories":{}},"1.0.0":{"name":"bindings","description":"Helper module for loading your native module's .node file","keywords":["native","addon","bindings","gyp","waf","c","c++"],"version":"1.0.0","author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"main":"./bindings.js","readme":"node-bindings\n=============\n### Helper module for loading your native module's .node file\n\nThis is a helper module for authors of Node.js native addon modules.\nIt is basically the \"swiss army knife\" of `require()`ing your native module's\n`.node` file.\n\nThroughout the course of Node's native addon history, addons have ended up being\ncompiled in a variety of different places, depending on which build tool and which\nversion of node was used. To make matters worse, now the _gyp_ build tool can\nproduce either a _Release_ or _Debug_ build, each being built into different\nlocations.\n\nThis module checks _all_ the possible locations that a native addon would be built\nat, and returns the first one that loads successfully.\n\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install bindings\n```\n\nOr add it to the `\"dependencies\"` section of your _package.json_ file.\n\n\nExample\n-------\n\n`require()`ing the proper bindings file for the current node version, platform\nand architecture is as simple as:\n\n``` js\nvar bindings = require('bindings')('binding.node')\n\n// Use your bindings defined in your C files\nbindings.your_c_function()\n```\n\n\nNice Error Output\n-----------------\n\nWhen the `.node` file could not be loaded, `node-bindings` throws an Error with\na nice error message telling you exactly what was tried. You can also check the\n`err.tries` Array property.\n\n```\nError: Could not load the bindings file. Tried:\n → /Users/nrajlich/ref/build/binding.node\n → /Users/nrajlich/ref/build/Debug/binding.node\n → /Users/nrajlich/ref/build/Release/binding.node\n → /Users/nrajlich/ref/out/Debug/binding.node\n → /Users/nrajlich/ref/Debug/binding.node\n → /Users/nrajlich/ref/out/Release/binding.node\n → /Users/nrajlich/ref/Release/binding.node\n → /Users/nrajlich/ref/build/default/binding.node\n → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node\n    at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13)\n    at Object.<anonymous> (/Users/nrajlich/ref/lib/ref.js:5:47)\n    at Module._compile (module.js:449:26)\n    at Object.Module._extensions..js (module.js:467:10)\n    at Module.load (module.js:356:32)\n    at Function.Module._load (module.js:312:12)\n    ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"bindings@1.0.0","dist":{"shasum":"c3ccde60e9de6807c6f1aa4ef4843af29191c828","tarball":"http://registry.npmjs.org/bindings/-/bindings-1.0.0.tgz"},"maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}]}},"readme":"node-bindings\n=============\n### Helper module for loading your native module's bindings in a cross-platform way.\n\nThis is a helper module for authors of native addon node.js modules. In node >=\n0.7.0, it is encouraged to statically precompile your native addons for your\nvarious supported platforms and architectures, rather than depend on your users\nto do that. This adds an additional burden on the developer since we now have to\ncompile the bindings ourselves, before publishing the module. We also have to\nfigure out which version of the bindings to load at runtime, and that's where\n`node-bindings` comes into play.\n\nThis module solves the organizational problem of how to store these bindings files\nwith a simple directory convention:\n\n```\n<module root>/compiled/<platform>/<arch>/<node_version>/bindings.node\n```\n\nSo for example, on a 32-bit Windows platform, running node `v0.6.9`, the\n`bindings.node` file should be placed in:\n\n```\n<module root>/compiled/win32/ia32/0.6/bindings.node\n```\n\nOn 64-bit Mac OS X, running node `v0.7.1-pre`, then the bindings file should be\nplaced in:\n\n```\n<module root>/compiled/darwin/x64/0.7/bindings.node\n```\n\nFor reference, the calculations for the various parts that makes up the require\npath are:\n\n * `<module_root>` - The directory where `package.json` is found is the root.\n * `<platform>` - `process.platform`\n * `<arch>` - `process.arch`\n * `<node_version>` - `parseFloat(process.versions.node)`\n\n The default \"compiled\" directory is `compiled` and the default name of every\n bindings file is `bindings.node`. This is configurable if you'd like.\n\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install bindings\n```\n\n\nExample\n-------\n\n`require()`ing the proper bindings file for the given platform and architecture\nand node version is as simple as:\n\n``` js\nvar bindings = require('bindings')()\n\n// Use your bindings defined in your C files\nbindings.your_c_function()\n```\n\nYou can specify the name of the bindings file if you desire:\n\n``` js\nvar bindings = require('bindings')('my_bindings.node')\n```\n\nOr you can pass in an options Object for full configuration:\n\n\n``` js\nvar bindings = require('bindings')({\n    bindings: 'my_bindings.node'\n  , compiled: 'builddir'\n})\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"TooTallNate","email":"nathan@tootallnate.net"},{"name":"tootallnate","email":"nathan@tootallnate.net"}],"time":{"modified":"2012-08-02T13:34:18.044Z","created":"2012-01-28T22:29:53.409Z","0.0.1":"2012-01-28T22:29:54.674Z","0.1.0":"2012-01-30T05:21:01.149Z","0.1.1":"2012-02-04T00:12:39.290Z","0.2.0":"2012-02-07T01:33:09.621Z","0.2.1":"2012-02-07T02:38:46.274Z","0.2.2":"2012-02-12T01:46:40.563Z","0.2.3":"2012-02-14T17:28:06.105Z","0.2.4":"2012-02-15T18:40:22.228Z","0.3.0":"2012-02-28T19:39:05.034Z","0.4.0":"2012-06-25T18:40:06.605Z","1.0.0":"2012-07-18T18:49:12.866Z"},"author":{"name":"Nathan Rajlich","email":"nathan@tootallnate.net","url":"http://tootallnate.net"},"repository":{"type":"git","url":"git://github.com/TooTallNate/node-bindings.git"},"users":{"fgribreau":true},"_attachments":{"bindings-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-UpIWdPDTqfafBY+Z+hKEfQ==","length":3456,"stub":true},"bindings-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-8Gmfsy3mw3KSkezttNiOjw==","length":3841,"stub":true},"bindings-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-zK75RwHvjEltt4nMjHTNFw==","length":3786,"stub":true},"bindings-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-qvc5Xjqwz/ZhL73jLxhpqQ==","length":3728,"stub":true},"bindings-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-BwiAjL0fbm35sforJ8wySg==","length":3724,"stub":true},"bindings-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-YLat8MqXj5E80Qo/OQ+OXg==","length":3740,"stub":true},"bindings-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-WE1+zNHYHRaMqok0fiM6iA==","length":3596,"stub":true},"bindings-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Cz2YojjE4o/zkrd427kDzQ==","length":3556,"stub":true},"bindings-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OVU/JtvzBMMBZp6ZNDRmcg==","length":3623,"stub":true},"bindings-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-fEn2YAIm6jjYC7j0Zq5RUA==","length":3317,"stub":true},"bindings-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pvXH9P5+vqVKVOTMuwJDdw==","length":3239,"stub":true}}}},
{"id":"binfix","key":"binfix","value":{"rev":"3-daa767cf2e06e68ecad59cbc83192d3e"},"doc":{"_id":"binfix","_rev":"3-daa767cf2e06e68ecad59cbc83192d3e","name":"binfix","description":"Format big numbers","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"binfix","description":"Format big numbers","version":"0.0.1","repository":{"type":"git","url":"git://github.com/mcandre/node-binfix.git"},"author":{"name":"Andrew Pennebaker","email":"andrew.pennebaker@gmail.com","url":"http://www.yellosoft.us/"},"main":"binfix","directories":{"lib":"."},"engines":{"node":"*"},"dependencies":{},"_npmUser":{"name":"mcandre","email":"andrew.pennebaker@gmail.com"},"_id":"binfix@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"abd36da56c3603030822613a9bed5fc5bbc18414","tarball":"http://registry.npmjs.org/binfix/-/binfix-0.0.1.tgz"},"maintainers":[{"name":"mcandre","email":"andrew.pennebaker@gmail.com"}]}},"readme":"# binfix - Format big numbers\n\n## EXAMPLE\n\n\t> var binfix = require(\"binfix\");\n\t> binfix.format(2000);\n\t'2K'\n\t> binfix.format(1234567890);\n\t'1B'\n\t> binfix.format(10);\n\t'10'","maintainers":[{"name":"mcandre","email":"andrew.pennebaker@gmail.com"}],"time":{"modified":"2012-01-22T12:18:20.294Z","created":"2012-01-22T12:18:20.126Z","0.0.1":"2012-01-22T12:18:20.294Z"},"author":{"name":"Andrew Pennebaker","email":"andrew.pennebaker@gmail.com","url":"http://www.yellosoft.us/"},"repository":{"type":"git","url":"git://github.com/mcandre/node-binfix.git"},"_attachments":{"binfix-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i+4Tinix+0avmJzr8gkAnw==","length":10240,"stub":true}}}},
{"id":"bing","key":"bing","value":{"rev":"15-8378cad10c04a69f66d5538f7f045e5f"},"doc":{"_id":"bing","_rev":"15-8378cad10c04a69f66d5538f7f045e5f","name":"bing","description":"A library for making requests to Bing web services.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Justin Walgran","email":"justin@walgran.com"},"name":"bing","description":"A library for making requests to Bing web services.","tags":["search","transit"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/jwalgran/bing.git"},"engines":{"node":">= 0.3.6"},"dependencies":{"request":"2.1.1"},"bugs":{"url":"http://github.com/jwalgran/bing/issues"},"main":"./bing","devDependencies":{},"_id":"bing@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fe28d17c944c268951f0394cf98dcda3eaa0ebfc","tarball":"http://registry.npmjs.org/bing/-/bing-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"jwalgran","email":"justin@walgran.com"}],"directories":{}},"0.0.2":{"author":{"name":"Justin Walgran","email":"justin@walgran.com"},"name":"bing","description":"A library for making requests to Bing web services.","tags":["search","transit"],"version":"0.0.2","repository":{"type":"git","url":"git://github.com/jwalgran/bing.git"},"engines":{"node":">= 0.3.6"},"dependencies":{"request":"2.1.1"},"bugs":{"url":"http://github.com/jwalgran/bing/issues"},"main":"./bing","devDependencies":{},"_id":"bing@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"425b104ff3a6c37eb035924d08e0077c220ec42f","tarball":"http://registry.npmjs.org/bing/-/bing-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"jwalgran","email":"justin@walgran.com"}],"directories":{}},"0.0.3":{"author":{"name":"Justin Walgran","email":"justin@walgran.com"},"name":"bing","description":"A library for making requests to Bing web services.","tags":["search","transit"],"version":"0.0.3","repository":{"type":"git","url":"git://github.com/jwalgran/bing.git"},"engines":{"node":">= 0.3.6"},"dependencies":{"request":"2.1.1"},"bugs":{"url":"http://github.com/jwalgran/bing/issues"},"main":"./bing","licenses":[{"type":"MIT","url":"http://github.com/jwalgran/bing/raw/master/LICENSE"}],"_npmUser":{"name":"jwalgran","email":"justin@walgran.com"},"_id":"bing@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0f84ff233d4d76d3bbe95404d15a11af40c47531","tarball":"http://registry.npmjs.org/bing/-/bing-0.0.3.tgz"},"maintainers":[{"name":"jwalgran","email":"justin@walgran.com"}]},"0.0.4":{"author":{"name":"Justin Walgran","email":"justin@walgran.com"},"name":"bing","description":"A library for making requests to Bing web services.","tags":["search","transit"],"version":"0.0.4","repository":{"type":"git","url":"git://github.com/jwalgran/bing.git"},"engines":{"node":">= 0.3.6"},"dependencies":{"request":"2.1.1"},"bugs":{"url":"http://github.com/jwalgran/bing/issues"},"main":"./bing","licenses":[{"type":"MIT","url":"http://github.com/jwalgran/bing/raw/master/LICENSE"}],"_npmUser":{"name":"jwalgran","email":"justin@walgran.com"},"_id":"bing@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ce3a7bd252009953ea4126ff2c3bec5790f4729b","tarball":"http://registry.npmjs.org/bing/-/bing-0.0.4.tgz"},"maintainers":[{"name":"jwalgran","email":"justin@walgran.com"}]},"0.0.5":{"author":{"name":"Justin Walgran","email":"justin@walgran.com"},"name":"bing","description":"A library for making requests to Bing web services.","tags":["search","transit"],"version":"0.0.5","repository":{"type":"git","url":"git://github.com/jwalgran/bing.git"},"engines":{"node":">= 0.3.6"},"dependencies":{"request":"2.1.1"},"bugs":{"url":"http://github.com/jwalgran/bing/issues"},"main":"./bing","licenses":[{"type":"MIT","url":"http://github.com/jwalgran/bing/raw/master/LICENSE"}],"_npmUser":{"name":"jwalgran","email":"justin@walgran.com"},"_id":"bing@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"22c3d9da03f51105523a93b0c33cd1c501487cfe","tarball":"http://registry.npmjs.org/bing/-/bing-0.0.5.tgz"},"maintainers":[{"name":"jwalgran","email":"justin@walgran.com"}]}},"maintainers":[{"name":"jwalgran","email":"justin@walgran.com"}],"time":{"modified":"2011-10-31T01:37:24.497Z","created":"2011-10-16T17:44:03.821Z","0.0.1":"2011-10-16T17:44:03.987Z","0.0.2":"2011-10-16T23:35:35.038Z","0.0.3":"2011-10-30T02:28:29.720Z","0.0.4":"2011-10-30T02:58:35.227Z","0.0.5":"2011-10-31T01:37:24.497Z"},"author":{"name":"Justin Walgran","email":"justin@walgran.com"},"repository":{"type":"git","url":"git://github.com/jwalgran/bing.git"},"_attachments":{"bing-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-SX8h4n2DdyYdwd4fKf07dw==","length":10240,"stub":true},"bing-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-T0PCCvmvVFIoIBJszakpvg==","length":10240,"stub":true},"bing-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6x/KTJm/Msklt6VM301nUA==","length":10240,"stub":true},"bing-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OZry1l84/FApowdrEsqNTw==","length":2317,"stub":true},"bing-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6e7TIL0n86R8UQjwvqKLJw==","length":2312,"stub":true}}}},
{"id":"bing-api","key":"bing-api","value":{"rev":"3-c11084b93e8cbe272b25548b3bcec669"},"doc":{"_id":"bing-api","_rev":"3-c11084b93e8cbe272b25548b3bcec669","name":"bing-api","description":"A library for the Bing Search APIs","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Sujal Shah","email":"sujal@variolabs.com"},"name":"bing-api","description":"A library for the Bing Search APIs","tags":["search","bing"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/VarioLabs/bing-api.js.git"},"engines":{"node":">= 0.4.1"},"dependencies":{"underscore":">=1.2.0","request":">=2.1.0","querystring":">=0.0.1"},"bugs":{"url":"http://github.com/VarioLabs/bing-api.js/issues"},"main":"./index.js","scripts":{"test":"node ./test/search-client-test.js"},"licenses":[{"type":"MIT","url":"http://github.com/VarioLabs/bing-api.js/raw/master/LICENSE"}],"_npmUser":{"name":"sujal","email":"sujal@variolabs.com"},"_id":"bing-api@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bf3ccde1098926de7d6ea3f826796e30f12ceb6b","tarball":"http://registry.npmjs.org/bing-api/-/bing-api-0.0.1.tgz"},"maintainers":[{"name":"sujal","email":"sujal@variolabs.com"}]}},"maintainers":[{"name":"sujal","email":"sujal@variolabs.com"}],"time":{"modified":"2011-11-04T20:59:13.539Z","created":"2011-11-04T20:59:13.202Z","0.0.1":"2011-11-04T20:59:13.539Z"},"author":{"name":"Sujal Shah","email":"sujal@variolabs.com"},"repository":{"type":"git","url":"git://github.com/VarioLabs/bing-api.js.git"},"_attachments":{"bing-api-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LwYfTE8ZJtOmtPKQBuJ7lQ==","length":10240,"stub":true}}}},
{"id":"bingo","key":"bingo","value":{"rev":"9-da6dd8ca9d966cd4e451c162ee862ceb"},"doc":{"_id":"bingo","_rev":"9-da6dd8ca9d966cd4e451c162ee862ceb","name":"bingo","description":"Test function calls.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"bingo","description":"Test function calls.","version":"0.1.0","homepage":"https://github.com/rumpl/bingo","author":{"name":"Djorje Lukic","email":"lukic.djordje@gmail.com"},"repository":{"type":"git","url":"git://github.com/rumpl/bingo.git"},"bugs":{"url":"https://github.com/rumpl/bingo/issues"},"licenses":[{"type":"MIT","url":"https://github.com/rumpl/bingo/blob/master/LICENSE-MIT"}],"main":"lib/bingo","engines":{"node":"~0.6.15"},"scripts":{"test":"grunt test"},"dependencies":{},"devDependencies":{"grunt":"~0.3.9"},"keywords":[],"_npmUser":{"name":"rumpl","email":"lukic.djordje@gmail.com"},"_id":"bingo@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ef00c81efd123e53f6ce6443a44c32bfe0bb4c60","tarball":"http://registry.npmjs.org/bingo/-/bingo-0.1.0.tgz"},"maintainers":[{"name":"rumpl","email":"lukic.djordje@gmail.com"}],"directories":{}},"0.2.0":{"name":"bingo","description":"Test function calls.","version":"0.2.0","keywords":[],"homepage":"https://github.com/rumpl/bingo","author":{"name":"Djorje Lukic","email":"lukic.djordje@gmail.com"},"repository":{"type":"git","url":"git://github.com/rumpl/bingo.git"},"bugs":{"url":"https://github.com/rumpl/bingo/issues"},"licenses":[{"type":"MIT","url":"https://github.com/rumpl/bingo/blob/master/LICENSE-MIT"}],"main":"lib/bingo","engines":{"node":"~0.6.15"},"scripts":{"test":"grunt test"},"dependencies":{},"devDependencies":{"grunt":"~0.3.9"},"_npmUser":{"name":"rumpl","email":"lukic.djordje@gmail.com"},"_id":"bingo@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8bfa06d1c0b0fc9be4b6ad82c5f75a9b020336f7","tarball":"http://registry.npmjs.org/bingo/-/bingo-0.2.0.tgz"},"maintainers":[{"name":"rumpl","email":"lukic.djordje@gmail.com"}]}},"readme":"# bingo\n\nTest function calls.\n\n## Getting Started\nThis module is not on npm yet but you can download it here on github.\n\n## Examples\n\n```javascript\n// Require the module.\nvar bingo = require('bingo');\n\n// Bingo that object.\nvar someObject = bingo(someObject);\n\n// Get info about the function.\nconsole.log(someObject.someFunction.didExecute() === false); // true\nconsole.log(someObject.someFunction.timesExecuted()); // 0\n\n// Call some function.\nsomeObject.someFunction();\n\n// Get info about the execution of the function.\nconsole.log(someObject.someFunction.didExecute() === true); // true\nconsole.log(someObject.someFunction.timesExecuted()); // 1\n```\n\n## Contributing\nYes yes, please, contribute. What else do you want to know about an execution of a function ?\n\nLint and test your code using [grunt](https://github.com/cowboy/grunt).\n\n## Release History\n - 0.1.0 (2012-09-14) First version\n\n## License\n\nCopyright (c) 2012 Djorje Lukic\n\nLicensed under the [MIT license](http://rumpl.mit-license.org/).\n","maintainers":[{"name":"rumpl","email":"lukic.djordje@gmail.com"}],"time":{"modified":"2012-06-14T13:45:28.594Z","created":"2012-06-14T13:09:44.034Z","0.1.0":"2012-06-14T13:09:45.838Z","0.2.0":"2012-06-14T13:45:28.594Z"},"author":{"name":"Djorje Lukic","email":"lukic.djordje@gmail.com"},"repository":{"type":"git","url":"git://github.com/rumpl/bingo.git"},"_attachments":{"bingo-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-mrbfOe8cWyQ9uoP5JVD2kw==","length":2618,"stub":true},"bingo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-UFOhhS1zsZagpfdeTnheiA==","length":2500,"stub":true}}}},
{"id":"binpack","key":"binpack","value":{"rev":"30-f6184888a4337fd694e6aa85f8ad8415"},"doc":{"_id":"binpack","_rev":"30-f6184888a4337fd694e6aa85f8ad8415","name":"binpack","description":"Minimalist numeric binary packing utilities for node.js","dist-tags":{"latest":"0.0.14"},"versions":{"0.0.1":{"name":"binpack","version":"0.0.1","main":"binpack","description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}],"repositories":[{"type":"git","url":"http://github.com/ghostfact/node-binpack.git"}],"devDependencies":{"vows":"","coffee-script":""},"directories":{"src":"src"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_npmJsonOpts":{"file":"/Users/russruss/.npm/binpack/0.0.1/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"binpack@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"84048be877ea01f87fa284b3acd65126a72a3fe3","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.1.tgz"}},"0.0.2":{"name":"binpack","version":"0.0.2","main":"binpack","description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}],"repositories":[{"type":"git","url":"http://github.com/ghostfact/node-binpack.git"}],"devDependencies":{"vows":"","coffee-script":""},"directories":{"src":"src"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build"},"_npmJsonOpts":{"file":"/Users/russruss/.npm/binpack/0.0.2/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"binpack@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ed224c50b18d9ca872fac6c603988a82a2e9bdd6","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.2.tgz"}},"0.0.3":{"name":"binpack","version":"0.0.3","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"","coffee-script":""},"directories":{"src":"src"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-waf configure build","test":"vows tests/*"},"_npmJsonOpts":{"file":"/Users/russruss/.npm/binpack/0.0.3/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"binpack@0.0.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"d5190fe7d8ad8fafafb73a4d97e6da3ec26d49cc","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.3.tgz"},"maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.4":{"name":"binpack","version":"0.0.4","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"install":"node-waf configure build","test":"vows tests/*"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"25a4c370f313356f44db0cf46c7892533b62f230","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.4.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.5":{"name":"binpack","version":"0.0.5","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"install":"node-waf configure build","test":"vows tests/*"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b4ec1fe77309f021f5005d4d24a830be782ad378","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.5.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.6":{"name":"binpack","version":"0.0.6","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"install":"node-waf configure build","test":"vows tests/*"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"262d8823166e401cbe1a401be3e78eea81dbb218","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.6.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.7":{"name":"binpack","version":"0.0.7","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"install":"node-waf configure build","test":"vows tests/*"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.7","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c38140b9fe7f3b5b08d6d3dd7980e10f58c09d98","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.7.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.8":{"name":"binpack","version":"0.0.8","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"*","coffee-script":"*","node-gyp":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"install":"node-gyp configure build","test":"vows tests/*"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.8","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"181ad689fc432d1962a686d24c6c731ea2bc0431","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.8.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.9":{"name":"binpack","version":"0.0.9","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0","npm":">=1.1.17"},"scripts":{"install":"node-gyp configure build","test":"vows tests/*"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.9","dependencies":{},"optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"2184e0686f197fa3f106317d658ef27829b7c1d2","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.9.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.10":{"name":"binpack","version":"0.0.10","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"dependencies":{"bindings":"*"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"test":"vows tests/*","install":"node-gyp rebuild"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"72f9e7e93ff0e5b67ca6f8f01f98124133bc82df","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.10.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.11":{"name":"binpack","version":"0.0.11","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"dependencies":{"bindings":"*"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"test":"vows tests/*","install":"node-gyp rebuild"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"8edc5523afc0a2f50957a56280bae93e0d56ce3d","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.11.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.12":{"name":"binpack","version":"0.0.12","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/ghostfact/node-binpack.git"},"dependencies":{"bindings":"*"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"test":"vows tests/*","install":"node-gyp rebuild"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c2917159644a15299895a82c829e99a787806b71","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.12.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.13":{"name":"binpack","version":"0.0.13","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/russellmcc/node-binpack.git"},"dependencies":{"bindings":"*"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"test":"vows tests/*","install":"node-gyp rebuild"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.13","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"460754a74fdbb7234b85c04689c1f36e13487051","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.13.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]},"0.0.14":{"name":"binpack","version":"0.0.14","main":"binpack","author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"description":"Minimalist numeric binary packing utilities for node.js","keywords":["binary","pack","unpack"],"repository":{"type":"git","url":"git://github.com/russellmcc/node-binpack.git"},"dependencies":{"bindings":"*"},"devDependencies":{"vows":"*","coffee-script":"*"},"directories":{"src":"src"},"engines":{"node":">=0.6.0"},"scripts":{"test":"vows tests/*","install":"node-gyp rebuild"},"_npmUser":{"name":"ghostfact","email":"russell.mcclellan@gmail.com"},"_id":"binpack@0.0.14","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"67df5855393d3756abb3398973e29f09aa8bd390","tarball":"http://registry.npmjs.org/binpack/-/binpack-0.0.14.tgz"},"readme":"# binpack\n\n_Minimalist numeric binary packing utilities for node.js_\n\n## What's all this?\n\nThis is an intentionally simple binary packing/unpacking package for node.js for programmers who prefer to write most of their parsing code in javascript.  This exposes some common binary formats for numbers.\n\nsee the included COPYING file for licensing.\n\nthe core of the module is the set of `pack`/`unpack` pair functions.  The meaning should be clear from the name - for example, `packInt32` packs a given javascript number into a 32-bit int inside a 4-byte node.js Buffer, while `unpackFloat32` unpacks a 4-byte node.js Buffer containing a native floating point number into a javascript number.\n\nThe following types are available for both pack and unpack:\n\n    Float32 \n    Float64 \n    Int8\n    Int16 \n    Int32\n    Int64\n    UInt8 \n    UInt16\n    UInt32\n    UInt64\n    \nEach `pack*` function takes a javascript number and outputs a node.js Buffer.\n\nEach `unpack*` function takes a node.js Buffer and outputs a javascript number.\n\nBoth types of functions take an optional second argument.  If this argument is `\"big\"`, the output is put in big endian format.  If the argument is `\"little\"`, the output is put in little endian format.  If the argument is anything else or non-existent, we default to your machine's native encoding.\n\n## How is this different than the `binary` module on npm?\n\nIt contains floating point values, and it has packing functions","maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}]}},"maintainers":[{"name":"ghostfact","email":"russell.mcclellan@gmail.com"}],"time":{"modified":"2012-08-02T13:43:29.740Z","created":"2011-09-06T05:06:30.321Z","0.0.1":"2011-09-06T05:06:30.696Z","0.0.2":"2011-09-06T13:30:07.611Z","0.0.3":"2011-09-06T13:47:32.161Z","0.0.4":"2012-03-09T20:05:55.726Z","0.0.5":"2012-03-09T20:09:27.737Z","0.0.6":"2012-03-09T20:23:27.375Z","0.0.7":"2012-03-11T23:16:45.181Z","0.0.8":"2012-07-12T16:38:47.225Z","0.0.9":"2012-07-12T16:45:10.332Z","0.0.10":"2012-07-12T17:05:44.055Z","0.0.11":"2012-07-12T17:09:31.606Z","0.0.12":"2012-07-12T17:12:45.806Z","0.0.13":"2012-07-29T16:45:22.075Z","0.0.14":"2012-08-02T01:55:15.673Z"},"author":{"name":"Russell McClellan","email":"russell.mcclellan@gmail.com","url":"http://www.ghostfact.com"},"repository":{"type":"git","url":"git://github.com/russellmcc/node-binpack.git"},"users":{"fgribreau":true},"_attachments":{"binpack-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-5GCvJkQgEZnkCRT0SPmYcw==","length":3918,"stub":true},"binpack-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Y91l7kXLCK3aqBoOACSErg==","length":3915,"stub":true},"binpack-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-NPereySsztBSgtuGtN/7YA==","length":3917,"stub":true},"binpack-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-7qC3d9lyK1gtCVHTfkVbiA==","length":3919,"stub":true},"binpack-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-+2MXBGzScqVPnfvTUXqQuA==","length":3992,"stub":true},"binpack-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-7BW/9HF4H9E0sNt3CMnFvw==","length":3969,"stub":true},"binpack-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-XY1PK2gkanIqeCeEo8Za/g==","length":3959,"stub":true},"binpack-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-mTFJG/IAg2X4Kk7qQvNAWA==","length":3936,"stub":true},"binpack-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-1c9bQtmQl8Ju+fTryHasSQ==","length":4682,"stub":true},"binpack-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ke6TIzJWVuzVbB+wXpjLjg==","length":4652,"stub":true},"binpack-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-K4jGFMtk3zrx+SRIneaZRw==","length":4669,"stub":true},"binpack-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/Qn7jR9S76S6ROOPslfzWQ==","length":3868,"stub":true},"binpack-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/rGlyzzLRvQ4NjLb6MmT6Q==","length":3775,"stub":true},"binpack-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QQX8hfjnlIaI5JdsIuTNPw==","length":3763,"stub":true}}}},
{"id":"binpacking","key":"binpacking","value":{"rev":"3-0ac1aa0b19352819e9265eb1b456be4b"},"doc":{"_id":"binpacking","_rev":"3-0ac1aa0b19352819e9265eb1b456be4b","name":"binpacking","description":"binary tree based bin packing algorithm","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"binpacking","version":"0.0.1","author":{"name":"Jake Gordon"},"description":"binary tree based bin packing algorithm","contributors":[{"name":"Markus","email":"nixmrak@gmail.com"}],"main":"./js/index.js","repository":{"type":"git","url":"git://github.com/jsmarkus/node-bin-packing.git"},"keywords":["bin packing","2d","geometry","css-sprites"],"license":"MIT","engine":{"node":">=0.4"},"_npmUser":{"name":"jsmarkus","email":"nixmrak@gmail.com"},"_id":"binpacking@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e82e43e8eb17064681e43f9c8dbc731e317d1892","tarball":"http://registry.npmjs.org/binpacking/-/binpacking-0.0.1.tgz"},"maintainers":[{"name":"jsmarkus","email":"nixmrak@gmail.com"}]}},"readme":"Binary Tree Algorithm for 2D Bin Packing\n========================================\n\nThis project is a javascript experiment to write a binary tree based\nbin packing algorithm that is suitable for generating\n[CSS sprites](https://github.com/jakesgordon/sprite-factory).\n\n * You can play with the [demo here](http://codeincomplete.com/posts/2011/5/7/bin_packing/example/)\n * You can find a [description here](http://codeincomplete.com/posts/2011/5/7/bin_packing/)\n\n\nNodeJS demo\n============\n\n > Note: the node demo is quick and dirty. Npm support, test suite coming soon...\n\nClone this repository:\n\n    git clone https://github.com/jsmarkus/node-bin-packing\n\nSee usage example: https://github.com/jsmarkus/node-bin-packing/blob/master/node-test.js\n\nRun the demo:\n\n    node node-test.js\n\nDemo\n====\n\nClone this repository\n\n    git clone https://github.com/jsmarkus/node-bin-packing\n\nView the index.html file in your favorite browser for examples of algorithm in use with lots of configurable options.\n\nUsage\n=====\n\nIf you want to use this in your own javascript projects, you need something like this:\n\n    <script src='packer.growing.js'></script>\n    <script>\n      var packer = new Packer(1000, 1000);   // or:  new GrowingPacker();\n      var blocks = [\n        { w: 100, h: 100 },\n        { w: 100, h: 100 },\n        { w:  80, h:  80 },\n        { w:  80, h:  80 },\n        etc\n        etc\n      ];\n\n      blocks.sort(function(a,b) { return (b.h < a.h); }); // sort inputs for best results\n      packer.fit(blocks);\n  \n      for(var n = 0 ; n < blocks.length ; n++) {\n        var block = blocks[n];\n        if (block.fit) {\n          DrawRectangle(block.fit.x, block.fit.y, block.w, block.h);\n        }\n      }\n    </script>\n\nSee source code comments for more details.\n\nLicense\n=======\n\nSee [LICENSE](https://github.com/jakesgordon/bin-packing/blob/master/LICENSE) file.\n\nContact\n=======\n\nIf you have any ideas, feedback, requests or bug reports, you can reach me at\n[jake@codeincomplete.com](mailto:jake@codeincomplete.com), or via\nmy website: [Code inComplete](http://codeincomplete.com/posts/2011/5/7/bin_packing/)\n\n","maintainers":[{"name":"jsmarkus","email":"nixmrak@gmail.com"}],"time":{"modified":"2012-02-27T10:03:31.959Z","created":"2012-02-27T10:03:30.009Z","0.0.1":"2012-02-27T10:03:31.959Z"},"author":{"name":"Jake Gordon"},"repository":{"type":"git","url":"git://github.com/jsmarkus/node-bin-packing.git"},"_attachments":{"binpacking-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-O2vy36uAWeAury2UHQzdlw==","length":39880,"stub":true}}}},
{"id":"binson","key":"binson","value":{"rev":"5-ad1940ba585a4c2833199bd1d2cdf28f"},"doc":{"_id":"binson","_rev":"5-ad1940ba585a4c2833199bd1d2cdf28f","name":"binson","description":"Binary JavaScript Object Notation","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"binson","description":"Binary JavaScript Object Notation","version":"0.0.1","repository":{"url":""},"main":"./","scripts":{"test":"make test"},"engines":{"node":"0.6.x"},"dependencies":{},"devDependencies":{"mocha":"~0.14.1","should":"~0.6.0"},"optionalDependencies":{},"_npmUser":{"name":"tellnes","email":"christian@tellnes.no"},"_id":"binson@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"510afcea613587b89b37f116c23c39fbbc90b108","tarball":"http://registry.npmjs.org/binson/-/binson-0.0.1.tgz"},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]},"0.0.2":{"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"name":"binson","description":"Binary JavaScript Object Notation","version":"0.0.2","repository":{"url":""},"main":"./","scripts":{"test":"make test"},"engines":{"node":"0.6.x"},"dependencies":{},"devDependencies":{"mocha":"~0.14.1","should":"~0.6.0"},"optionalDependencies":{},"_id":"binson@0.0.2","dist":{"shasum":"7acb4196603daa5757829c8cc0b755eafe080e4e","tarball":"http://registry.npmjs.org/binson/-/binson-0.0.2.tgz"},"readme":"# Binson\n\n[![Build Status](https://secure.travis-ci.org/tellnes/node-binson.png)](http://travis-ci.org/tellnes/node-binson)\n","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}]}},"readme":"","maintainers":[{"name":"tellnes","email":"christian@tellnes.no"}],"time":{"modified":"2012-07-12T12:02:52.062Z","created":"2012-03-12T14:43:00.458Z","0.0.1":"2012-03-12T14:43:04.190Z","0.0.2":"2012-07-12T12:02:52.062Z"},"author":{"name":"Christian Tellnes","email":"christian@tellnes.no"},"repository":{"url":""},"_attachments":{"binson-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vMupTdE/qTDGlIz8USuERQ==","length":6603,"stub":true},"binson-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a4a4+a9XgqPHVGOJF0NZrw==","length":6315,"stub":true}}}},
{"id":"binstruct","key":"binstruct","value":{"rev":"9-1c31381221c322fc5958c5e0a17e639e"},"doc":{"_id":"binstruct","_rev":"9-1c31381221c322fc5958c5e0a17e639e","name":"binstruct","description":"Read/write binary data structures to/from buffers.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"binstruct","version":"0.1.0","description":"Read/write binary data structures to/from buffers.","keywords":["binary","bin","buffers","struct","unpack","pack","serialization"],"main":"binstruct","repository":{"type":"git","url":"git://github.com/dobesv/node-binstruct.git"},"files":["binstruct.js","AUTHORS","package.json","Readme.md"],"_npmUser":{"name":"dobesv","email":"dobesv@gmail.com"},"_id":"binstruct@0.1.0","contributors":[{"name":"Dobes Vandermeer","email":"dobesv@gmail.com","url":"http://dobesv.com"}],"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"2cb8cd81332689c0023f804b7e403ef77e3fce7f","tarball":"http://registry.npmjs.org/binstruct/-/binstruct-0.1.0.tgz"},"maintainers":[{"name":"dobesv","email":"dobesv@gmail.com"}]},"0.1.1":{"name":"binstruct","version":"0.1.1","description":"Read/write binary data structures to/from buffers.","keywords":["binary","bin","buffers","struct","unpack","pack","serialization"],"main":"binstruct","repository":{"type":"git","url":"git://github.com/dobesv/node-binstruct.git"},"files":["binstruct.js","AUTHORS","package.json","Readme.md"],"_npmUser":{"name":"dobesv","email":"dobesv@gmail.com"},"_id":"binstruct@0.1.1","contributors":[{"name":"Dobes Vandermeer","email":"dobesv@gmail.com","url":"http://dobesv.com"}],"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"7816b381d9700172fed7d7bdf5899d892248d544","tarball":"http://registry.npmjs.org/binstruct/-/binstruct-0.1.1.tgz"},"maintainers":[{"name":"dobesv","email":"dobesv@gmail.com"}]},"0.1.2":{"name":"binstruct","version":"0.1.2","description":"Read/write binary data structures to/from buffers.","keywords":["binary","bin","buffers","struct","unpack","pack","serialization"],"main":"binstruct","repository":{"type":"git","url":"git://github.com/dobesv/node-binstruct.git"},"files":["binstruct.js","AUTHORS","package.json","Readme.md"],"_npmUser":{"name":"dobesv","email":"dobesv@gmail.com"},"_id":"binstruct@0.1.2","contributors":[{"name":"Dobes Vandermeer","email":"dobesv@gmail.com","url":"http://dobesv.com"}],"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"687de65947f4ddf65c463ec7af6b09b6009c784e","tarball":"http://registry.npmjs.org/binstruct/-/binstruct-0.1.2.tgz"},"maintainers":[{"name":"dobesv","email":"dobesv@gmail.com"}]},"0.2.0":{"name":"binstruct","version":"0.2.0","description":"Read/write binary data structures to/from buffers.","keywords":["binary","bin","buffers","struct","unpack","pack","serialization"],"main":"binstruct","repository":{"type":"git","url":"git://github.com/dobesv/node-binstruct.git"},"files":["binstruct.js","AUTHORS","package.json","Readme.md"],"engines":{"node":">=0.6.0"},"_npmUser":{"name":"dobesv","email":"dobesv@gmail.com"},"_id":"binstruct@0.2.0","contributors":[{"name":"Dobes Vandermeer","email":"dobesv@gmail.com","url":"http://dobesv.com"}],"dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"e44062b39000edb4d5795dc7c9753342690a16fa","tarball":"http://registry.npmjs.org/binstruct/-/binstruct-0.2.0.tgz"},"maintainers":[{"name":"dobesv","email":"dobesv@gmail.com"}]}},"readme":"\n## Binary Structure Helper\n\nThis module helps you work with binary structures in Buffers.\nYou first define the layout of your binary data and then use\nthat definition to convert objects to/from their binary\nrepresentation or you can wrap a buffer with an object where\ngetters/setters for fields update and read the buffer in place.\n\n## Features\n\n - Use the same definition for reading and writing objects\n - Wrap a buffer to use getters/setters to operate directly on\n   Buffer contents\n - Also able to read/write to/from objects\n - \"Fluid API\" structure definition is easy on the eyes\n - Customizable 64-bit integer support\n - Easy big-endian and little-endian support\n - No external dependencies or native extensions required (works in Windows!)\n\n## Requirements\n\nThis module requires node 0.6 or better, as it uses the binary type\nread/write methods on Buffer introduced with node 0.6.\n\n## Numeric Types\n\nAdding numeric fields to the structure definition requires calling\na method with the appropriate type name.\n\nIf a string is passed, it is used as the name of the field, otherwise\nthe field is basically skipped (padding).\n\n - int8, int16, int32, int64: Signed integers\n - byte, uint16, uint32, uint64: Unsigned integers\n - float: 32-bit IEEE floating point number\n - double: 64-bit IEEE floating point number\n\n### Endian-ness / Byte Order\n\nWhen defining a structure, the default is to use \"big endian\"\nbyte order when reading/writing numbers.  You can change the\ndefault by specifying options to the constructor.  For example:\n\n    var littleEndianStruct = require('binstruct')\n        .def({littleEndian:true})\n        .float('littleEndianFloat')\n        .double('littleEndianDouble')\n        .int32('littleEndianInteger');\n\nYou can also specify littleEndian by adding \"le\" to the type names\nas you declare the structure.  For example:\n\n    var littleEndianStruct = require('binstruct')\n        .def()\n        .floatle('littleEndianFloat')\n        .doublele('littleEndianDouble')\n        .int32le('littleEndianInteger');\n\nThis could conceivably allow you to have a mix of little and big endian\nnumbers in the same structure although in practice I doubt that would\never happen.  Rather this may turn out be a shorter syntax when there\nare relatively few fields - adding 'le' a few times could be less\npainful than {littleEndian:true}.\n\n### 64-bit Integers Support\n\nJavascript doesn't normally support 64-bit numbers - all numbers are\nrepresented as a 64-bit floating point value.  This can only represent a\n53-bit signed integer, or a 52-bit unsigned integer correctly.\n\nWhen reading 64-bit integers you can choose whether to convert to a\nJavascript number or to store the number as a buffer.  If converting\nto a number, you can choose whether an overflow should throw an error\nor just set the field to Infinity or -Infinity.  If storing as a\nbuffer you can choose whether it should be a \"slice\" of the original\nbuffer or a copy.\n\n - strict: Convert to js number, throw Error on overflow.  This is the default mode.\n - lossy: Convert to js number, use Infinity/-Infinity on overflow\n - copy: Copy the literal bytes into a Buffer for the field value\n - slice: Field value is a \"slice\" containing the original bytes\n\nTo specify a mode, pass an options object to the initial call to\ndef() or as a parameter to a field definition with a property\n'int64mode' mode set to a value from binstruct.int64modes.  Examples:\n\n    var binstruct = require('binstruct');\n    binstruct.def({int64mode:binstruct.int64modes.lossy});\n    binstruct.def().uint64('a', {int64mode:binstruct.int64modes.copy});\n    binstruct.def().int64('b', {int64mode:binstruct.int64modes.slice});\n\n## Buffer Wrapping\n\nThe library may create a \"wrapper\" around a buffer which allows you\nto read and write the binary fields from the buffer on the fly using\nproperty getters and setters on the wrapper.  This allows for a\npleasant looking syntax for editing fields, and may save some time\nif relatively few fields are actually used by the application.\n\nNote, however, that this access isn't generally very fast, so it is\nbest to minimize the number of property reads and writes you do.\n\nTo create a wrapper call wrap() on your structure definition and\npass a buffer and an optional offset into that buffer at which to\nread the structure.\n\n    var binstruct = require('binstruct');\n    var buf = new Buffer('ab');\n    var twoBytes = binstruct.def()\n        .byte('a')\n        .byte('b')\n        .wrap(buf);\n    console.log(twoBytes.a, twoBytes.b); // 'a', 'b'\n    twoBytes.a = 'x';\n    twoBytes.b = 'y';\n    console.log(buf.toString('utf8')); // 'xy'\n\n## Pack/Unpack Buffers To/From Objects\n\nThe library allows you to 'pack' an object into a Buffer and 'unpack'\nan object from a Buffer.\n\nThe 'unpack' operation goes through all the fields defined and populates\nthem into a new object and returns it.  Unlike with a wrapper, changes to\nthat object will not affect the underlying buffer.\n\nThe 'pack' operation goes through all the fields defined and encodes the\nvalues for those fields from the provided object into the target buffer.\n\n\n","maintainers":[{"name":"dobesv","email":"dobesv@gmail.com"}],"time":{"modified":"2011-12-20T04:53:38.041Z","created":"2011-12-20T02:58:46.007Z","0.1.0":"2011-12-20T02:58:49.740Z","0.1.1":"2011-12-20T03:22:45.022Z","0.1.2":"2011-12-20T04:50:31.539Z","0.2.0":"2011-12-20T04:53:38.041Z"},"repository":{"type":"git","url":"git://github.com/dobesv/node-binstruct.git"},"_attachments":{"binstruct-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-m0xpCFkpjSksJlSB8m4G7A==","length":10240,"stub":true},"binstruct-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0c1ZCWUChJrqp34w3HkDCQ==","length":10240,"stub":true},"binstruct-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-r2Ywwlo3HyXVUtashxMQfQ==","length":10240,"stub":true},"binstruct-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hTxH76hHj2w/yWr1pvVwAQ==","length":10240,"stub":true}}}},
{"id":"bintrees","key":"bintrees","value":{"rev":"30-dd6b892f918572cb9d59f4d79667b0de"},"doc":{"_id":"bintrees","_rev":"30-dd6b892f918572cb9d59f4d79667b0de","name":"bintrees","description":"Binary Search Trees","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.1","homepage":"bitfloor.com","repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./lib/index.js","scripts":{"test":"expresso ./test/test_*.js"},"engines":{"node":"~v0.4.8"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1"},"_npmJsonOpts":{"file":"/home/vadim/.npm/bintrees/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bintrees@0.0.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"675c4259dec843f60368387d83680e1025b01159","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.1.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]},"0.0.2":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.2","homepage":"bitfloor.com","repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./lib/index.js","scripts":{"test":"expresso ./test/test_*.js"},"engines":{"node":"~v0.4.8"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1"},"_npmJsonOpts":{"file":"/home/vadim/.npm/bintrees/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bintrees@0.0.2","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"6cd433cef272827071e746b99fcad23e010caa41","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.2.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]},"0.0.3":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.3","homepage":"bitfloor.com","repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./lib/index.js","scripts":{"test":"expresso ./test/test_*.js"},"engines":{"node":"~v0.4.8"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1"},"_npmJsonOpts":{"file":"/home/vadim/.npm/bintrees/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bintrees@0.0.3","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"be22dbe52fbe0ddb062125c788843dc8676ce134","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.3.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]},"0.0.4":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.4","homepage":"bitfloor.com","repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./lib/index.js","scripts":{"test":"expresso ./test/test_*.js"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1"},"_npmJsonOpts":{"file":"/home/vadim/.npm/bintrees/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bintrees@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"11fdd9b308851fe9c76958c5db30649b9f179366","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.4.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]},"0.0.5":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.5","homepage":"bitfloor.com","repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./index.js","scripts":{"test":"./node_modules/.bin/expresso ./test/test_*.js"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1"},"_npmUser":{"name":"vadimg","email":"dimva13@gmail.com"},"_id":"bintrees@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.5","_defaultsLoaded":true,"dist":{"shasum":"44818823e9c1c2e647f5e577f4683d32bf5bc6c0","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.5.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]},"0.0.6":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.6","homepage":"bitfloor.com","repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./index.js","scripts":{"test":"./node_modules/.bin/expresso ./test/test_*.js; ./node_modules/.bin/nodelint lib/*.js --config ./nodelint_config.js"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1","nodelint":">=0.5.1"},"_npmUser":{"name":"vadimg","email":"dimva13@gmail.com"},"_id":"bintrees@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.5","_defaultsLoaded":true,"dist":{"shasum":"ecf4719982738bb3c377247592ce66e5bed64437","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.6.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]},"0.0.7":{"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"name":"bintrees","description":"Binary Search Trees","version":"0.0.7","homepage":"bitfloor.com","keywords":["binary tree","red black tree","red-black tree","redblack tree"],"repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"directories":{"lib":"lib"},"main":"./index.js","scripts":{"test":"./node_modules/.bin/expresso ./test/test_*.js; ./node_modules/.bin/jshint lib/*.js"},"dependencies":{},"devDependencies":{"underscore":">=1.1.7","expresso":">=0.8.1","jshint":">=0.5.2"},"_npmUser":{"name":"vadimg","email":"dimva13@gmail.com"},"_id":"bintrees@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.5","_defaultsLoaded":true,"dist":{"shasum":"c4949ab2d33412c284d5536d2484ebe79ee0751d","tarball":"http://registry.npmjs.org/bintrees/-/bintrees-0.0.7.tgz"},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}]}},"maintainers":[{"name":"vadimg","email":"dimva13@gmail.com"}],"time":{"modified":"2011-10-28T22:25:01.394Z","created":"2011-08-03T05:41:59.829Z","0.0.1":"2011-08-03T05:42:00.218Z","0.0.2":"2011-08-03T06:06:46.616Z","0.0.3":"2011-08-03T06:13:16.355Z","0.0.4":"2011-08-03T19:07:09.965Z","0.0.5":"2011-10-28T20:11:04.278Z","0.0.6":"2011-10-28T21:34:36.180Z","0.0.7":"2011-10-28T22:25:01.394Z"},"author":{"name":"Vadim Graboys","email":"dimva13@gmail.com"},"repository":{"type":"git","url":"git://github.com/vadimg/js_bintrees.git"},"_attachments":{"bintrees-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-VLbXFerUUt9FCMb62d6Low==","length":1084428,"stub":true},"bintrees-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-MzNv4ytdBreeQ7ahtInGqg==","length":1086052,"stub":true},"bintrees-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-8T169MCSFL3TU7RwwfuLtQ==","length":1084683,"stub":true},"bintrees-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-L7H/5fAJVvbH/hmK44AO4Q==","length":1083666,"stub":true},"bintrees-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-yydtc1kl6wFA7/0TMYeqGQ==","length":1083690,"stub":true},"bintrees-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HQt5e1Xis4FMwagg5FB2NQ==","length":1083689,"stub":true},"bintrees-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bo0DBH4zWd6P7UDP6CCqoA==","length":1083646,"stub":true}}}},
{"id":"bio","key":"bio","value":{"rev":"3-16ccd1554eb512fe4c549478190ee450"},"doc":{"_id":"bio","_rev":"3-16ccd1554eb512fe4c549478190ee450","name":"bio","description":"JavaScript library for bioinformatics","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"name":"bio","description":"JavaScript library for bioinformatics","version":"0.0.0","main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"onirame","email":"enrico.marino@email.com"},"_id":"bio@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"b054dac08e373a2ee1cfe574aed8fed4dd7ac848","tarball":"http://registry.npmjs.org/bio/-/bio-0.0.0.tgz"},"maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}]}},"readme":"# bio\n\nJavaScript library for bioinformatics\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2011 Enrico Marino &lt;enrico.marino@email.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"onirame","email":"enrico.marino@email.com"}],"time":{"modified":"2012-02-26T19:59:06.961Z","created":"2012-02-26T19:59:04.658Z","0.0.0":"2012-02-26T19:59:06.961Z"},"author":{"name":"Enrico Marino","email":"enrico.marino@email.com","url":"http://onirame.no.de"},"_attachments":{"bio-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Pmos6vK/glsPB1+dw0/JKw==","length":10240,"stub":true}}}},
{"id":"biotix","key":"biotix","value":{"rev":"3-5a772ce4da156d6e9750175fc331b535"},"doc":{"_id":"biotix","_rev":"3-5a772ce4da156d6e9750175fc331b535","name":"biotix","description":"A JavaScript class system","dist-tags":{"latest":"0.1.0a"},"versions":{"0.1.0a":{"name":"biotix","version":"0.1.0a","description":"A JavaScript class system","author":{"name":"Björn Schulz"},"main":"biotix.js","repository":{"type":"git","url":"git://github.com/fac3/biotix.git"},"_npmUser":{"name":"fac3","email":"bjoern@fac3.org"},"_id":"biotix@0.1.0a","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"6a2188c9b851b104354205c7ca320e05d8bcc8bd","tarball":"http://registry.npmjs.org/biotix/-/biotix-0.1.0a.tgz"},"maintainers":[{"name":"fac3","email":"bjoern@fac3.org"}]}},"readme":"# Biotix\n\nClasses for Javascript.\n\n## What is Biotix\n\nBiotix is a simple class system for JavaScript.\n\n## What do I need?\n\nA modern web browser or Node.js.\n\n## How can I install it? (Node.js)\n\nJust type:\n\n\t$ npm install biotix","maintainers":[{"name":"fac3","email":"bjoern@fac3.org"}],"time":{"modified":"2011-12-07T18:48:16.571Z","created":"2011-12-07T18:48:15.759Z","0.1.0a":"2011-12-07T18:48:16.571Z"},"author":{"name":"Björn Schulz"},"repository":{"type":"git","url":"git://github.com/fac3/biotix.git"},"_attachments":{"biotix-0.1.0a.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2ChEuw32YyV02GRqkZeK/g==","length":10240,"stub":true}}}},
{"id":"bird","key":"bird","value":{"rev":"11-e92ef4ec7892f31bcd498cd0fa583041"},"doc":{"_id":"bird","_rev":"11-e92ef4ec7892f31bcd498cd0fa583041","name":"bird","description":"Dead Simple Twitter API Wrapper","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"bird","version":"0.1.0","author":{"name":"Aaron Ackerman","email":"theron17@gmail.com"},"description":"Dead Simple Twitter API Wrapper","contributors":[{"name":"Aaron Ackerman","email":"theron17@gmail.com"}],"main":"./bird","repository":{"type":"git","url":"git://github.com/theron17/bird.git"},"keywords":["twitter","api"],"dependencies":{"oauth":">=0.9.6"},"noAnalyze":true,"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"theron","email":"theron17@gmail.com"},"_id":"bird@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"69e41fcaa97cf354e799143e0ff390b23ab1d62c","tarball":"http://registry.npmjs.org/bird/-/bird-0.1.0.tgz"},"maintainers":[{"name":"theron","email":"theron17@gmail.com"}]},"0.2.0":{"name":"bird","version":"0.2.0","author":{"name":"Aaron Ackerman","email":"theron17@gmail.com"},"description":"Dead Simple Twitter API Wrapper","contributors":[{"name":"Aaron Ackerman","email":"theron17@gmail.com"}],"main":"./bird","repository":{"type":"git","url":"git://github.com/theron17/bird.git"},"keywords":["twitter","api"],"dependencies":{"oauth":">=0.9.6"},"noAnalyze":true,"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"theron","email":"theron17@gmail.com"},"_id":"bird@0.2.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8af997de7d0ea6f648e824f405bcdc2199b33f29","tarball":"http://registry.npmjs.org/bird/-/bird-0.2.0.tgz"},"maintainers":[{"name":"theron","email":"theron17@gmail.com"}]},"0.2.1":{"name":"bird","version":"0.2.1","author":{"name":"Aaron Ackerman","email":"theron17@gmail.com"},"description":"Dead Simple Twitter API Wrapper","contributors":[{"name":"Aaron Ackerman","email":"theron17@gmail.com"}],"main":"./bird","repository":{"type":"git","url":"git://github.com/theron17/bird.git"},"keywords":["twitter","api"],"dependencies":{"oauth":">=0.9.6"},"noAnalyze":true,"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"theron","email":"theron17@gmail.com"},"_id":"bird@0.2.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0a4ed9f42c4b096d5e769f62bfaa5a0a1db7db0d","tarball":"http://registry.npmjs.org/bird/-/bird-0.2.1.tgz"},"maintainers":[{"name":"theron","email":"theron17@gmail.com"}]},"0.2.2":{"name":"bird","version":"0.2.2","author":{"name":"Aaron Ackerman","email":"theron17@gmail.com"},"description":"Dead Simple Twitter API Wrapper","contributors":[{"name":"Aaron Ackerman","email":"theron17@gmail.com"}],"main":"./bird","repository":{"type":"git","url":"git://github.com/theron17/bird.git"},"keywords":["twitter","api"],"dependencies":{"oauth":">=0.9.6"},"noAnalyze":true,"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"theron","email":"theron17@gmail.com"},"_id":"bird@0.2.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ce9f93d26cc2ac2674d2635f6e041ccfc249a1c5","tarball":"http://registry.npmjs.org/bird/-/bird-0.2.2.tgz"},"maintainers":[{"name":"theron","email":"theron17@gmail.com"}]},"0.3.0":{"name":"bird","version":"0.3.0","author":{"name":"Aaron Ackerman","email":"theron17@gmail.com"},"description":"Dead Simple Twitter API Wrapper","contributors":[{"name":"Aaron Ackerman","email":"theron17@gmail.com"}],"main":"./bird","repository":{"type":"git","url":"git://github.com/theron17/bird.git"},"keywords":["twitter","api"],"dependencies":{"request":"~2.9.202"},"noAnalyze":true,"license":"MIT","engine":{"node":">=0.6"},"_npmUser":{"name":"theron","email":"theron17@gmail.com"},"_id":"bird@0.3.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8b97c138b8ef3d94317964f7eecafac744d1d848","tarball":"http://registry.npmjs.org/bird/-/bird-0.3.0.tgz"},"maintainers":[{"name":"theron","email":"theron17@gmail.com"}]}},"readme":"## Bird.js\n\n### Dead simple wrapper for the Twitter API\n\nLike there needed to be another one, right? Well sometimes you just have to write it yourself.\n\n```javascript\nvar express = require('express');\nvar Bird = require('bird')({\n  oauth_token : 'my-twitter-consumer-token',\n  oauth_token_secret : 'my-twitter-consumer-token-secret',\n  callback: 'http://mytwitterapp.com/callback'\n});\n\nvar app = express.createServer();\n\napp.use(express.bodyParser());\napp.use(express.cookieParser());\napp.use(express.session({secret: \"just-the-letter-a\"}));\n\napp.get('/', function(req, res){\n  if (req.session.signedIn) {\n    res.send(\"Hi \" + req.session.screen_name + \" it's nice to see you signed in\");\n  } else {\n    res.send('<a href=\"/login\">login</a>');\n  }\n});\n\napp.get('/login', function(req, res){\n    Bird.login(req, function(err, oauth_token, oauth_token_secret, results){\n      if (err) {\n        //handle the error here if twitter returns an error\n        res.send(err);\n      } else {\n        //set \n        req.session.oauth_token = oauth_token;\n        req.session.oauth_token_secret = oauth_token_secret;\n        res.redirect(\"https://twitter.com/oauth/authorize?oauth_token=\"+req.session.oauth_token);\n      }\n    });\n});\n\napp.get('/callback', function(req, res){\n    Bird.auth_callback(req, function(err, access_token, access_token_secret, data){\n      if (err) {\n        //handle the error here if twitter returns an error\n        res.send(err);\n      } else {\n        req.session.screen_name = data.screen_name;\n        req.session.access_token = access_token;\n        req.session.access_token_secret = access_token_secret;\n        req.session.signedIn = 1;\n        \n        res.redirect('/');\n      }\n    });\n});\n\napp.get('/home_timeline', function(req, res){\n    var options = req.query || {};\n    options.include_entities = true;\n    Bird.home_timeline(req, options, function(err, data, response){\n      if (err) {\n        //handle the error here if twitter returns an error\n        res.send(err);\n      } else {\n        res.send(data);  \n      }\n    });\n});\n```\n\n","maintainers":[{"name":"theron","email":"theron17@gmail.com"}],"time":{"modified":"2012-06-12T02:10:06.829Z","created":"2012-03-23T01:02:15.442Z","0.1.0":"2012-03-23T01:02:16.178Z","0.2.0":"2012-04-08T14:49:46.003Z","0.2.1":"2012-04-18T01:39:42.499Z","0.2.2":"2012-04-18T01:43:38.522Z","0.3.0":"2012-06-12T02:10:06.829Z"},"author":{"name":"Aaron Ackerman","email":"theron17@gmail.com"},"repository":{"type":"git","url":"git://github.com/theron17/bird.git"},"_attachments":{"bird-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Vv3qN0bbIRr+kFMDjcLjMA==","length":3006,"stub":true},"bird-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-jzcWL9Qg7B+rCM81sjs5rQ==","length":2645,"stub":true},"bird-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SJ0iPcVbbGSaicwbaAPgow==","length":2648,"stub":true},"bird-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-be7v7Nw3OVb8czwhk31taQ==","length":1951,"stub":true},"bird-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EB4X+sPRJZEe9GGyg2/Jdw==","length":2570,"stub":true}}}},
{"id":"birdeater","key":"birdeater","value":{"rev":"7-3dbcbfdaa16cdfb2d27191c8451279dd"},"doc":{"_id":"birdeater","_rev":"7-3dbcbfdaa16cdfb2d27191c8451279dd","name":"birdeater","description":"A command-line tool for backing up a user's public Tweets in JSON format.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"birdeater","directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/index.js","bin":{"birdeater":"./bin/birdeater.js"},"version":"0.0.1","author":{"name":"Ben Coe","email":"bencoe@gmail.com"},"engines":["node"],"description":"A command-line tool for backing up a user's public Tweets in JSON format.","keywords":["crawler","twitter","public-timeline"],"repository":{"type":"git","url":"git://github.com/bcoe/npm-tweets.git"},"dependencies":{"request":">=2.9.203","jquery":">=1.7.3","sexy-args":">=1.1.5","optimist":"0.3.4"},"_npmUser":{"name":"bcoe","email":"bencoe@gmail.com"},"_id":"birdeater@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2f4b7c59455468c4132f9d070a899ac5afb230c8","tarball":"http://registry.npmjs.org/birdeater/-/birdeater-0.0.1.tgz"},"maintainers":[{"name":"bcoe","email":"bencoe@gmail.com"}]},"0.0.2":{"name":"birdeater","directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/index.js","bin":{"birdeater":"./bin/birdeater.js"},"version":"0.0.2","author":{"name":"Ben Coe","email":"bencoe@gmail.com"},"engines":["node"],"description":"A command-line tool for backing up a user's public Tweets in JSON format.","keywords":["crawler","twitter","public-timeline"],"repository":{"type":"git","url":"git://github.com/bcoe/npm-tweets.git"},"dependencies":{"request":">=2.9.203","jquery":">=1.6.3","sexy-args":">=1.1.5","optimist":"0.3.4"},"_npmUser":{"name":"bcoe","email":"bencoe@gmail.com"},"_id":"birdeater@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"9e84538b61517b6e704595e658539fe8e1944d40","tarball":"http://registry.npmjs.org/birdeater/-/birdeater-0.0.2.tgz"},"maintainers":[{"name":"bcoe","email":"bencoe@gmail.com"}]},"0.0.3":{"name":"birdeater","directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/index.js","bin":{"birdeater":"./bin/birdeater.js"},"version":"0.0.3","author":{"name":"Ben Coe","email":"bencoe@gmail.com"},"engines":["node"],"description":"A command-line tool for backing up a user's public Tweets in JSON format.","keywords":["crawler","twitter","public-timeline"],"repository":{"type":"git","url":"git://github.com/bcoe/npm-tweets.git"},"dependencies":{"request":">=2.9.203","jquery":">=1.6.3","sexy-args":">=1.1.5","optimist":"0.3.4"},"_npmUser":{"name":"bcoe","email":"bencoe@gmail.com"},"_id":"birdeater@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"fea5c16d818eb44dcf5d58fcdc3dccfba4f06d84","tarball":"http://registry.npmjs.org/birdeater/-/birdeater-0.0.3.tgz"},"maintainers":[{"name":"bcoe","email":"bencoe@gmail.com"}]}},"readme":"Birdeater\n---------\n\nBirdeater is a command-line tool for backing up a user's public Tweets in JSON format.\n\nUsage\n-----\n\n```bash\nbirdeater --user=shitmydadsays\n```\n\nWhy Birdeater is Cool\n---------------------","maintainers":[{"name":"bcoe","email":"bencoe@gmail.com"}],"time":{"modified":"2012-08-06T02:38:51.266Z","created":"2012-08-05T21:34:48.913Z","0.0.1":"2012-08-05T21:34:50.317Z","0.0.2":"2012-08-05T21:41:06.338Z","0.0.3":"2012-08-06T02:38:51.266Z"},"author":{"name":"Ben Coe","email":"bencoe@gmail.com"},"repository":{"type":"git","url":"git://github.com/bcoe/npm-tweets.git"},"_attachments":{"birdeater-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-snOrMXEloKM0Ml7vBNsJLQ==","length":93067,"stub":true},"birdeater-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-02N419DJOm/D1Q06SHMJeQ==","length":13613,"stub":true},"birdeater-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Hx6zOcF7Hf15zl4sVpaLtw==","length":13615,"stub":true}}}},
{"id":"biscuit","key":"biscuit","value":{"rev":"3-acc647de0922bd8bf4e7d06cb8e71115"},"doc":{"_id":"biscuit","_rev":"3-acc647de0922bd8bf4e7d06cb8e71115","name":"biscuit","description":"Real world library builder","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"biscuit","version":"0.0.2","description":"Real world library builder","author":{"name":"Gabriel de Oliveira Barbosa","email":"manobi.oliveira@gmail.com"},"dependencies":{"hogan.js":"x.x.x","colors":"x.x.x","jshint":"x.x.x","uglify-js":"1.2.5"},"main":"./index","_npmUser":{"name":"manobi","email":"manobi.oliveira@gmail.com"},"_id":"biscuit@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"bfd2af51696c5dc2fd05b51ab64c08856dcd66e0","tarball":"http://registry.npmjs.org/biscuit/-/biscuit-0.0.2.tgz"},"maintainers":[{"name":"manobi","email":"manobi.oliveira@gmail.com"}]}},"readme":"\n# biscuit\n\n  Real world javascipt library builder\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Gabriel de Oliveira Barbosa &lt;manobi.oliveira@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"manobi","email":"manobi.oliveira@gmail.com"}],"time":{"modified":"2012-02-21T18:08:54.273Z","created":"2012-02-21T18:08:50.937Z","0.0.2":"2012-02-21T18:08:54.273Z"},"author":{"name":"Gabriel de Oliveira Barbosa","email":"manobi.oliveira@gmail.com"},"_attachments":{"biscuit-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NNt6TBhelGaxU3/uVwBi5Q==","length":10240,"stub":true}}}},
{"id":"bisection","key":"bisection","value":{"rev":"5-f785ea3bbd8fcc7cd9381d20417b87bb"},"doc":{"_id":"bisection","_rev":"5-f785ea3bbd8fcc7cd9381d20417b87bb","name":"bisection","description":"A JavaScript port of the bisection algorithm that is used in Python","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bisection","version":"0.0.1","author":{"name":"Arnout Kazemier"},"description":"A JavaScript port of the bisection algorithm that is used in Python","main":"index","keywords":["algorithm","bisection","python"],"directories":{"lib":"./lib"},"maintainers":[{"name":"Arnout Kazemier","email":"info@3rd-Eden.com","url":"http://www.3rd-Eden.com"}],"licenses":[{"type":"MIT","url":"http://github.com/3rd-Eden/node-bisection/blob/master/LICENSE"}],"repositories":[{"type":"git","url":"http://github.com/3rd-Eden/node-bisection.git"}],"_id":"bisection@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"e16bd3ade7c76d6b7adc43c0664aa7ec639e86a9","tarball":"http://registry.npmjs.org/bisection/-/bisection-0.0.1.tgz"}},"0.0.2":{"name":"bisection","version":"0.0.2","author":{"name":"Arnout Kazemier"},"description":"A JavaScript port of the bisection algorithm that is used in Python","main":"index","keywords":["algorithm","bisection","python"],"directories":{"lib":"./lib"},"maintainers":[{"name":"Arnout Kazemier","email":"info@3rd-Eden.com","url":"http://www.3rd-Eden.com"}],"licenses":[{"type":"MIT","url":"http://github.com/3rd-Eden/node-bisection/blob/master/LICENSE"}],"repositories":[{"type":"git","url":"http://github.com/3rd-Eden/node-bisection.git"}],"_id":"bisection@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"83ceeae0a0613f702cf2bbc840c4d1a2055ecc4c","tarball":"http://registry.npmjs.org/bisection/-/bisection-0.0.2.tgz"}}},"maintainers":[{"name":"V1","email":"info@3rd-Eden.com"}],"time":{"modified":"2011-04-22T17:26:30.246Z","created":"2011-04-21T19:21:37.882Z","0.0.1":"2011-04-21T19:21:38.279Z","0.0.2":"2011-04-22T17:26:30.246Z"},"author":{"name":"Arnout Kazemier"},"_attachments":{"bisection-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CdXq3uKh0b+sQEvDOUk71g==","length":3665,"stub":true},"bisection-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5MdQFmfS4UAs60JE4JRr0g==","length":1813,"stub":true}}}},
{"id":"bison","key":"bison","value":{"rev":"12-e663b2ef96650b3b5a0cc36524e1b94a"},"doc":{"_id":"bison","_rev":"12-e663b2ef96650b3b5a0cc36524e1b94a","name":"bison","description":"Size optimized binary encoding for JavaScript.","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.1":{"name":"bison","version":"1.1.1","description":"Size optimized binary encoding for JavaScript.","homepage":"https://github.com/BonsaiDen/BiSON.js","author":{"name":"Ivo Wetzel","email":"ivo.wetzel@googlemail.com"},"keywords":["encoder","binary"],"engines":{"node":">=0.1.9"},"main":"bison","repository":{"type":"git","url":"http://github.com/BonsaiDen/BiSON.js.git"},"licenses":[{"type":"MIT","url":"http://github.com/BonsaiDen/BiSON.js/raw/master/LICENSE"}],"_id":"bison@1.1.1","_engineSupported":true,"_npmVersion":"0.2.14","_nodeVersion":"v0.4.0","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0596d1447ba4de1fb1bfce51b5582ea16865f007","tarball":"http://registry.npmjs.org/bison/-/bison-1.1.1.tgz"}}},"maintainers":[{"name":"Ivo Wetzel","email":"ivo.wetzel@googlemail.com"}],"author":{"name":"Ivo Wetzel","email":"ivo.wetzel@googlemail.com"},"repository":{"type":"git","url":"http://github.com/BonsaiDen/BiSON.js.git"},"time":{"modified":"2011-03-02T11:43:03.350Z","created":"2011-01-06T13:14:47.901Z","1.0.0":"2011-01-06T13:14:47.901Z","1.1.0":"2011-01-06T13:14:47.901Z","1.1.1":"2011-03-02T11:42:16.965Z"},"_attachments":{"bison-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-jmfqmmvDZ4Y0tM+9AC3Nnw==","length":4249,"stub":true}}}},
{"id":"bit","key":"bit","value":{"rev":"4-9baa9d5618a457adcd0ee6cf3f912b43"},"doc":{"_id":"bit","_rev":"4-9baa9d5618a457adcd0ee6cf3f912b43","name":"bit","description":"A multi-repository git tool","dist-tags":{"0.0.1":"0.0.1","latest":"0.0.1"},"versions":{"0.0.1":{"name":"bit","description":"A multi-repository git tool","version":"0.0.1","author":{"name":"Jason Dooley","email":"jd@sevif.me"},"contributors":[{"name":"Jason Dooley","email":"jd@sevif.me"}],"dependencies":{},"publishConfig":{"tag":"0.0.1"},"keywords":["git","multi-repository","tool"],"repository":{"type":"git","url":"git://github.com/sevifives/bit.git"},"main":"index","bin":{"bit":"./bin/bit"},"engines":{"node":">= 0.5.0"},"_npmUser":{"name":"sevifives","email":"jd@sevif.me"},"_id":"bit@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"50ed53ad305270c0a410ce429becc7c4e6ed31bc","tarball":"http://registry.npmjs.org/bit/-/bit-0.0.1.tgz"},"maintainers":[{"name":"sevifives","email":"jd@sevif.me"}]}},"readme":"bit\n===\n\nA multi-repository tool for git written in Javascript for NodeJS/NPM\n\nTo install:\n\nnpm install -g bit\n\n\nTo use in your git repo:\n\n- bit init\n\n- bit add repo_name ~/real/path/to/repo_name\n\n- bit status \n-> # root git status\n-> # repo_name git status\n\n- bit on repo_name status\n-> # repo_name git status\n\n\n\nCopyright (C) 2012 Jason Dooley\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"sevifives","email":"jd@sevif.me"}],"time":{"modified":"2012-08-11T17:20:53.852Z","created":"2012-05-01T22:09:32.050Z","0.0.1":"2012-05-01T22:09:34.057Z"},"author":{"name":"Jason Dooley","email":"jd@sevif.me"},"repository":{"type":"git","url":"git://github.com/sevifives/bit.git"},"_attachments":{"bit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7Gx6f8/adgK07uhJjFSuqw==","length":2432,"stub":true}}}},
{"id":"bit-array","key":"bit-array","value":{"rev":"7-b583530d2be4456aaa0958093e43c00d"},"doc":{"_id":"bit-array","_rev":"7-b583530d2be4456aaa0958093e43c00d","name":"bit-array","description":"JavaScript implementation of bit arrays","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.2":{"name":"bit-array","description":"JavaScript implementation of bit arrays","version":"0.1.2","author":{"name":"Bram Stein","email":"b.l.stein@gmail.com","url":"http://www.bramstein.com"},"repository":{"type":"git","url":"git://github.com/bramstein/bit-array.git"},"keywords":["bit array","bit-array","bit vector","bitset","bitmap","bitstring"],"main":"./lib/bit-array.js","directories":{"lib":"./lib"},"_npmUser":{"name":"bramstein","email":"b.l.stein@gmail.com"},"_id":"bit-array@0.1.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e4cf6f00c44dadc68280b1e2a36cbc73b9cea659","tarball":"http://registry.npmjs.org/bit-array/-/bit-array-0.1.2.tgz"},"readme":"","maintainers":[{"name":"bramstein","email":"b.l.stein@gmail.com"}]},"0.1.3":{"name":"bit-array","description":"JavaScript implementation of bit arrays","version":"0.1.3","author":{"name":"Bram Stein","email":"b.l.stein@gmail.com","url":"http://www.bramstein.com"},"repository":{"type":"git","url":"git://github.com/bramstein/bit-array.git"},"keywords":["bit array","bit-array","bit vector","bitset","bitmap","bitstring"],"main":"./lib/bit-array.js","directories":{"lib":"./lib"},"devDependencies":{"test":"0.4.x"},"scripts":{"test":"node tests/bit-array.test.js"},"_npmUser":{"name":"bramstein","email":"b.l.stein@gmail.com"},"_id":"bit-array@0.1.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"16a0bbc4114e6f5f3ff55b367f8938680fde56e8","tarball":"http://registry.npmjs.org/bit-array/-/bit-array-0.1.3.tgz"},"readme":"## JavaScript Bit Array Library\n\nThis library contains a JavaScript implementation of bit arrays. The library supports:\n\n* getting, setting and toggling of individual bits\n* iterating over each bit\n* counting the number of \"on\" bits\n* bitwise operations with other bit arrays such as OR, AND and XOR.\n* serialization to and from JSON\n* Browser, Node.js and Ender.js compatible\n\nThe bit array also grows automatically depending on your usage and is sparse. The following example shows how to set and get individual bits within the array:\n\n    a = new BitArray();\n    a.set(0, true);\n    a.set(31, true);\n    a.toString(); // \"10000000000000000000000000000001\"\n    a.get(1); // false\n    a.get(31); // true\n\nNote that the array internally uses 32 bit integers and thus grows by 32 bits if necessary (Actually, JavaScript's number type is 64 bit, but only 32 bits can be addressed using bitwise operations.)\n\n    a.set(32, true);\n    a.toString(); // \"1000000000000000000000000000000110000000000000000000000000000000\"\n\nEven though bit arrays are not that useful in JavaScript, there is one place where they excel; encoding large boolean sets for transfer between the browser and server. A JSON representation of a bit array is much smaller than an actual boolean array.\n\n## API\n\nThe BitArray module has two constructors:\n\n<dl>\n    <dt>BitArray()</dt>\n    <dd>Creates a new empty bit array.</dd>\n\n    <dt>BitArray([integer, ...])</dt>\n    <dd>Creates a new bit array using the array of integers as internal representation.</dd>\n</dl>\n\nThe following instance methods are supported:\n\n<dl>\n    <dt>size()</dt>\n    <dd>Returns the total number of bits in the BitArray.</dd>\n\n    <dt>set(index, boolean)</dt>\n    <dd>Sets the bit at index to a value (boolean.)</dd>\n    \n    <dt>get(index)</dt>\n    <dd>Returns the value of the bit at index (boolean.)</dd>\n\n    <dt>toggle(index)</dt>\n    <dd>Toggles the bit at index. If the bit is on, it is turned off. Likewise, if the bit is off it is turned on.</dd>\n    \n    <dt>reset()</dt>\n    <dd>Resets the BitArray so that it is empty and can be re-used.</dd>\n\n    <dt>copy()</dt>\n    <dd>Returns a copy of this BitArray.</dd>\n    \n    <dt>equals(other)</dt>\n    <dd>Returns true if this BitArray equals another. Two BitArrays are considered equal if both have the same length and bit pattern.</dd>\n    \n    <dt>toJSON()</dt>\n    <dd>Returns the JSON representation of this BitArray.</dd>\n    \n    <dt>toString()</dt>\n    <dd>Returns a string representation of the BitArray with bits in logical order.</dd>\n    \n    <dt>valueOf()</dt>\n    <dd>Returns the internal representation of the BitArray.</dd>\n    \n    <dt>toArray()</dt>\n    <dd>Convert the BitArray to an Array of boolean values.</dd>\n    \n    <dt>count()</dt>\n    <dd>Returns the total number of bits set to 1 in this BitArray.</dd>\n    \n    <dt>forEach(fn, scope)</dt>\n    <dd>Iterate over each value in the BitArray.</dd>\n\n    <dt>not()</dt>\n    <dd>Inverts this BitArray.</dd>\n    \n    <dt>or(other)</dt>\n    <dd>Bitwise OR on the values of this BitArray using BitArray `other`.</dd>\n    \n    <dt>and(other)</dt>\n    <dd>Bitwise AND on the values of this BitArray using BitArray `other`.</dd>\n    \n    <dt>xor(other)</dt>\n    <dd>Bitwise XOR on the values of this BitArray using BitArray `other`.</dd>\n</dl>\n\n## Installation\n\nYou can install the bit array module using npm:\n\n    > npm install bit-array\n\nAlternatively you could just include [bit-array.js](lib/bit-array.js) in your project.\n\n## License\n\nLicensed under the revised BSD License. Copyright 2010 Bram Stein. All rights reserved.\n\nPorts\n-----\nhttps://github.com/foglcz/bit-array - PHP port by Pavel Ptacek\n","maintainers":[{"name":"bramstein","email":"b.l.stein@gmail.com"}]},"0.1.5":{"name":"bit-array","description":"JavaScript implementation of bit arrays","version":"0.1.5","author":{"name":"Bram Stein","email":"b.l.stein@gmail.com","url":"http://www.bramstein.com"},"repository":{"type":"git","url":"git://github.com/bramstein/bit-array.git"},"keywords":["bit array","bit-array","bit vector","bitset","bitmap","bitstring"],"main":"./lib/bit-array.js","directories":{"lib":"./lib"},"devDependencies":{"test":"0.4.x"},"scripts":{"test":"node tests/bit-array.test.js"},"_npmUser":{"name":"bramstein","email":"b.l.stein@gmail.com"},"_id":"bit-array@0.1.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"371af80f9c57606c8db1e950bb5fb9cc283c9616","tarball":"http://registry.npmjs.org/bit-array/-/bit-array-0.1.5.tgz"},"readme":"## JavaScript Bit Array Library\n\nThis library contains a JavaScript implementation of bit arrays. The library supports:\n\n* getting, setting and toggling of individual bits\n* iterating over each bit\n* counting the number of \"on\" bits\n* bitwise operations with other bit arrays such as OR, AND and XOR.\n* serialization to and from JSON\n* Browser, Node.js and Ender.js compatible\n\nThe bit array also grows automatically depending on your usage and is sparse. The following example shows how to set and get individual bits within the array:\n\n    a = new BitArray();\n    a.set(0, true);\n    a.set(31, true);\n    a.toString(); // \"10000000000000000000000000000001\"\n    a.get(1); // false\n    a.get(31); // true\n\nNote that the array internally uses 32 bit integers and thus grows by 32 bits if necessary (Actually, JavaScript's number type is 64 bit, but only 32 bits can be addressed using bitwise operations.)\n\n    a.set(32, true);\n    a.toString(); // \"1000000000000000000000000000000110000000000000000000000000000000\"\n\nEven though bit arrays are not that useful in JavaScript, there is one place where they excel; encoding large boolean sets for transfer between the browser and server. A JSON representation of a bit array is much smaller than an actual boolean array.\n\n## API\n\nThe BitArray module has two constructors:\n\n<dl>\n    <dt>BitArray()</dt>\n    <dd>Creates a new empty bit array.</dd>\n    \n    <dt>BitArray(string)</dt>\n    <dd>Creates a new bit array using the hex values in the string</dd>\n\n    <dt>BitArray([integer, ...])</dt>\n    <dd>Creates a new bit array using the array of integers as internal representation.</dd>\n</dl>\n\nThe following instance methods are supported:\n\n<dl>\n    <dt>size()</dt>\n    <dd>Returns the total number of bits in the BitArray.</dd>\n\n    <dt>set(index, boolean)</dt>\n    <dd>Sets the bit at index to a value (boolean.)</dd>\n    \n    <dt>get(index)</dt>\n    <dd>Returns the value of the bit at index (boolean.)</dd>\n\n    <dt>toggle(index)</dt>\n    <dd>Toggles the bit at index. If the bit is on, it is turned off. Likewise, if the bit is off it is turned on.</dd>\n    \n    <dt>reset()</dt>\n    <dd>Resets the BitArray so that it is empty and can be re-used.</dd>\n\n    <dt>copy()</dt>\n    <dd>Returns a copy of this BitArray.</dd>\n    \n    <dt>equals(other)</dt>\n    <dd>Returns true if this BitArray equals another. Two BitArrays are considered equal if both have the same length and bit pattern.</dd>\n    \n    <dt>toJSON()</dt>\n    <dd>Returns the JSON representation of this BitArray.</dd>\n    \n    <dt>toString()</dt>\n    <dd>Returns a string representation of the BitArray with bits in logical order.</dd>\n    \n    <dt>toHexString()</dt>\n    <dd>Returns a hex representation of the BitArray.</dd>\n    \n    <dt>valueOf()</dt>\n    <dd>Returns the internal representation of the BitArray.</dd>\n    \n    <dt>toArray()</dt>\n    <dd>Convert the BitArray to an Array of boolean values.</dd>\n    \n    <dt>count()</dt>\n    <dd>Returns the total number of bits set to 1 in this BitArray.</dd>\n    \n    <dt>forEach(fn, scope)</dt>\n    <dd>Iterate over each value in the BitArray.</dd>\n\n    <dt>not()</dt>\n    <dd>Inverts this BitArray.</dd>\n    \n    <dt>or(other)</dt>\n    <dd>Bitwise OR on the values of this BitArray using BitArray `other`.</dd>\n    \n    <dt>and(other)</dt>\n    <dd>Bitwise AND on the values of this BitArray using BitArray `other`.</dd>\n    \n    <dt>xor(other)</dt>\n    <dd>Bitwise XOR on the values of this BitArray using BitArray `other`.</dd>\n</dl>\n\n## Installation\n\nYou can install the bit array module using npm:\n\n    > npm install bit-array\n\nAlternatively you could just include [bit-array.js](lib/bit-array.js) in your project.\n\n## License\n\nLicensed under the revised BSD License. Copyright 2010 Bram Stein. All rights reserved.\n\nPorts\n-----\nhttps://github.com/foglcz/bit-array - PHP port by Pavel Ptacek\n","maintainers":[{"name":"bramstein","email":"b.l.stein@gmail.com"}]}},"readme":"","maintainers":[{"name":"bramstein","email":"b.l.stein@gmail.com"}],"time":{"modified":"2012-07-02T19:39:58.228Z","created":"2012-02-05T16:58:01.585Z","0.1.2":"2012-02-05T16:58:03.218Z","0.1.3":"2012-05-27T11:33:16.301Z","0.1.5":"2012-07-02T19:39:58.228Z"},"author":{"name":"Bram Stein","email":"b.l.stein@gmail.com","url":"http://www.bramstein.com"},"repository":{"type":"git","url":"git://github.com/bramstein/bit-array.git"},"_attachments":{"bit-array-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-hyIy7nFGyFR27BXoUShI8A==","length":4481,"stub":true},"bit-array-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xj3TFN0F8xy9NCawhRoOYQ==","length":4474,"stub":true},"bit-array-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AqvEYw8Xrdtyx7nc4XZQVg==","length":3688,"stub":true}}}},
{"id":"bitbucket","key":"bitbucket","value":{"rev":"3-266de5ac66cd24faed1d2ca6e78cae84"},"doc":{"_id":"bitbucket","_rev":"3-266de5ac66cd24faed1d2ca6e78cae84","name":"bitbucket","description":"Wrapper for the BitBucket API","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bitbucket","version":"0.0.1","description":"Wrapper for the BitBucket API","author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"homepage":"http://github.com/ajaxorg/node-bitbucket.git","main":"./bitbucket","repository":{"type":"git","url":"git://github.com/ajaxorg/node-bitbucket.git"},"engine":["node >=0.4.0"],"dependencies":{"asyncjs":">=0.0.5","oauth":">=0.9.0"},"licenses":[{"type":"The MIT License","url":"http://www.opensource.org/licenses/mit-license.php"}],"_npmUser":{"name":"fjakobs","email":"fabian.jakobs@web.de"},"_id":"bitbucket@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1a5ba6be0d2ef5eb7c0bed84da4191f2a812258f","tarball":"http://registry.npmjs.org/bitbucket/-/bitbucket-0.0.1.tgz"},"readme":"","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}]}},"readme":"","maintainers":[{"name":"fjakobs","email":"fabian.jakobs@web.de"}],"time":{"modified":"2012-03-07T17:12:09.316Z","created":"2012-03-07T17:12:06.187Z","0.0.1":"2012-03-07T17:12:09.316Z"},"author":{"name":"Fabian Jakobs","email":"fabian.jakobs@web.de"},"repository":{"type":"git","url":"git://github.com/ajaxorg/node-bitbucket.git"},"_attachments":{"bitbucket-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-A0w1niUm+UTgk8mneKKvYg==","length":8942,"stub":true}}}},
{"id":"bitch","key":"bitch","value":{"rev":"3-7c0d5f853b4fbfd5c371b6338bc186dd"},"doc":{"_id":"bitch","_rev":"3-7c0d5f853b4fbfd5c371b6338bc186dd","name":"bitch","description":"Fork for humans","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com"},"name":"bitch","description":"Fork for humans","version":"0.0.1","repository":{"url":"https://github.com/stagas/bitch"},"main":"./bitch.js","scripts":{"test":"node test"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"stagas","email":"gstagas@gmail.com"},"_id":"bitch@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ebe71d943b113983d2d44f102883a367102f3bee","tarball":"http://registry.npmjs.org/bitch/-/bitch-0.0.1.tgz"},"maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}]}},"readme":"# bitch\n\nFork for humans\n\n## Installing\n\n`npm install bitch`\n\n## How to use\n\n```javascript\nvar bitch = require('bitch')\n\nvar fn = bitch(function () { // init block\n  var secret = 'prepare your bitch'\n  var crypto = require('crypto')\n\n  // this is actual bitch\n  return function (a, b, c, callback) {\n    callback(null, 'whatever')\n  }\n})\n\nfn(1, 'foo', 3, function (err, result) {\n  console.log(result) // 'whatever'\n  fn.die() // kill the bitch\n})\n\n```\n\n## Licence\n\nMIT/X11\n","maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}],"time":{"modified":"2012-06-06T11:31:41.612Z","created":"2012-06-06T11:31:38.376Z","0.0.1":"2012-06-06T11:31:41.612Z"},"author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com"},"repository":{"url":"https://github.com/stagas/bitch"},"_attachments":{"bitch-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OD5fxECZi9RX4zqHppL8Xg==","length":1643,"stub":true}}}},
{"id":"bitcoder","key":"bitcoder","value":{"rev":"8-19c957d6b845f4d7ad531951c971e03d"},"doc":{"_id":"bitcoder","_rev":"8-19c957d6b845f4d7ad531951c971e03d","name":"bitcoder","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bitcoder","main":"./bitcoder","version":"0.0.1","scripts":{"install":"node-waf configure build"},"_id":"bitcoder@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.17","_nodeVersion":"v0.3.8","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a076eb79f9d9d1e59efbaf4c1c1b21a4bed09f26","tarball":"http://registry.npmjs.org/bitcoder/-/bitcoder-0.0.1.tgz","bin":{"0.4-sunos-5.11":{"shasum":"fb046b51e86b7e3aad3463485e67bf040b1a0101","tarball":"http://registry.npmjs.org/bitcoder/-/bitcoder-0.0.1-0.4-sunos-5.11.tgz"}}}}},"maintainers":[{"name":"agnoster","email":"agnoster@gmail.com"}],"time":{"modified":"2011-04-15T21:03:45.283Z","created":"2011-02-10T09:22:41.420Z","0.0.1":"2011-02-10T09:22:41.828Z"},"_attachments":{"bitcoder-0.0.1-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-4IdLLxWBN5vrUZd7gkhIbg==","length":84386,"stub":true},"bitcoder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yi3utysYH7pGcKecOAQIxg==","length":2430,"stub":true}}}},
{"id":"bitcoin","key":"bitcoin","value":{"rev":"34-0a3362bf3f88e99a8fcbde157a8e89b3"},"doc":{"_id":"bitcoin","_rev":"34-0a3362bf3f88e99a8fcbde157a8e89b3","name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","dist-tags":{"latest":"1.3.0"},"versions":{"0.0.1":{"name":"bitcoin","description":"Bitcoin client API library and related utilities","version":"0.0.1","contributors":[{"name":"Bill Casarin","email":"jb@jb55.com"}],"dependencies":{"underscore":">= 1.0.3"},"directories":{"lib":"./lib/bitcoin"},"engines":{"node":">= 0.2.3"},"_id":"bitcoin@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.3.2","dist":{"shasum":"9b660e9fcf205c0ad4af023be0381e99a54663fb","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-0.0.1.tgz"}},"0.0.2":{"name":"bitcoin","description":"Bitcoin client API library and related utilities","version":"0.0.2","contributors":[{"name":"Bill Casarin","email":"jb@jb55.com"}],"dependencies":{"underscore":">= 1.0.3","vows":">= 0.4.0"},"directories":{"lib":"./lib/bitcoin"},"engines":{"node":">= 0.2.3"},"devDependencies":{},"_id":"bitcoin@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"702848cec93ba9dc71185ba8b3711319ef510c0c","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-0.0.2.tgz"},"scripts":{}},"0.0.3":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"0.0.3","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{},"_id":"bitcoin@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"2c04858ec71996cc17f28455518fc59ccaa5b2f0","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-0.0.3.tgz"},"scripts":{}},"1.0.0":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.0.0","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{},"_id":"bitcoin@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"2e8933331ec0fa19220b80f234ea43f87a97b1f3","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.0.0.tgz"},"scripts":{}},"1.0.1":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.0.1","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{},"_id":"bitcoin@1.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c7199865bf7fb54442385b73911f7de6dbf197e4","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.0.1.tgz"},"scripts":{}},"1.1.0":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.0","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{},"_id":"bitcoin@1.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"482415c42e153cf8596cfd437e1b24ab18d11e9d","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.0.tgz"},"scripts":{},"maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.1.1":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.1","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"*"},"engines":{"node":"*"},"_npmJsonOpts":{"file":"/home/jb55/.npm/bitcoin/1.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bitcoin@1.1.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.3","_defaultsLoaded":true,"dist":{"shasum":"54b87f48b304e9c39c79bc44848bf9c8b52afba2","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.1.tgz"},"maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.1.2":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.2","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"*"},"engines":{"node":"*"},"scripts":{"test":"node test/api.js"},"_npmJsonOpts":{"file":"/home/jb55/.npm/bitcoin/1.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bitcoin@1.1.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fd952dbaf379f0cbc55befb08f289f47f684dc52","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.2.tgz"},"maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.1.3":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.3","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":">= 1.0.3"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"*"},"engines":{"node":"*"},"scripts":{"test":"node test/api.js"},"_npmUser":{"name":"jb55","email":"jb@jb55.com"},"_id":"bitcoin@1.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"aac04c11cba735deb14743152ffc4107dbd591ed","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.3.tgz"},"maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.1.4":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.4","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">=0.2.6"},"scripts":{"test":"node test/api.js"},"optionalDependencies":{},"_npmUser":{"name":"jb55","email":"bill@casarin.ca"},"_id":"bitcoin@1.1.4","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"19f23e7974da8fa2af2f9eaad61335a634882037","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.4.tgz"},"readme":"# node-bitcoin\n\nnode-bitcoin is a simple wrapper for the Bitcoin client's JSON-RPC API.\n\nThe API is equivalent to the API document [here](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list).\nThe methods are exposed as lower camelcase methods on the `bitcoin.Client`\nobject.\n\nYou can choose to ignore the helper methods and call the api directly like so:\n\n```js\nclient.cmd('getbalance', '*', 6, function(err, balance){\n  if (err) return console.log(err);\n  console.log('Balance:', balance);\n});\n```\n\n## Install\n\n`npm install bitcoin`\n\n## Setup\n\n1. Traverse to `~/.bitcoin` or `~/Library/Application Support/Bitcoin` and add a\nfile called `bitcoin.conf` if it doesn't already exist.\n\n2. Add these lines to the file:\n\n    rpcuser=username\n\n    rpcpassword=password\n\nYou will use these to login to the server.\n\n3. Start your Bitcoin client with the `-server` argument or run `bitcoind`\n\n4. You should now be able to communicate with Bitcoin JSON-RPC API using the\nnode-bitcoin library, try it out!\n\n## Examples\n\n### Create client\n```js\nvar bitcoin = require('bitcoin');\nvar client = new bitcoin.Client('localhost', 8332, 'username', 'password');\n```\n\n### Create client with single object\n```js\nvar client = new bitcoin.Client({\n  host: 'localhost',\n  port: 8332,\n  username: 'username',\n  password: 'password'\n});\n```\n\n### Get balance across all accounts with minimum confirmations of 6\n\n```js\n\nclient.getBalance('*', 6, function(err, balance) {\n  if (err) return console.log(err);\n  console.log('Balance:', balance);\n});\n```\n","maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.1.5":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.5","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">=0.2.6"},"scripts":{"test":"node test/api.js"},"optionalDependencies":{},"_npmUser":{"name":"jb55","email":"bill@casarin.ca"},"_id":"bitcoin@1.1.5","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"0ea2a2096b1b0e66dbd9df53fb64f044dd7de5d2","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.5.tgz"},"readme":"# node-bitcoin\n\nnode-bitcoin is a simple wrapper for the Bitcoin client's JSON-RPC API.\n\nThe API is equivalent to the API document [here](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list).\nThe methods are exposed as lower camelcase methods on the `bitcoin.Client`\nobject.\n\nYou can choose to ignore the helper methods and call the api directly like so:\n\n```js\nclient.cmd('getbalance', '*', 6, function(err, balance){\n  if (err) return console.log(err);\n  console.log('Balance:', balance);\n});\n```\n\n## Install\n\n`npm install bitcoin`\n\n## Setup\n\n1. Traverse to `~/.bitcoin` or `~/Library/Application Support/Bitcoin` and add a\nfile called `bitcoin.conf` if it doesn't already exist.\n\n2. Add these lines to the file:\n\n    rpcuser=username\n\n    rpcpassword=password\n\nYou will use these to login to the server.\n\n3. Start your Bitcoin client with the `-server` argument or run `bitcoind`\n\n4. You should now be able to communicate with Bitcoin JSON-RPC API using the\nnode-bitcoin library, try it out!\n\n## Examples\n\n### Create client\n```js\nvar bitcoin = require('bitcoin');\nvar client = new bitcoin.Client('localhost', 8332, 'username', 'password');\n```\n\n### Create client with single object\n```js\nvar client = new bitcoin.Client({\n  host: 'localhost',\n  port: 8332,\n  username: 'username',\n  password: 'password'\n});\n```\n\n### Get balance across all accounts with minimum confirmations of 6\n\n```js\n\nclient.getBalance('*', 6, function(err, balance) {\n  if (err) return console.log(err);\n  console.log('Balance:', balance);\n});\n```\n","maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.1.6":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.1.6","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">=0.2.6"},"scripts":{"test":"node test/api.js"},"optionalDependencies":{},"_npmUser":{"name":"jb55","email":"bill@casarin.ca"},"_id":"bitcoin@1.1.6","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"30b35cd30e39b011b030941f0f2e983521931105","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.1.6.tgz"},"readme":"# node-bitcoin\n\nnode-bitcoin is a simple wrapper for the Bitcoin client's JSON-RPC API.\n\nThe API is equivalent to the API document [here](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_Calls_list).\nThe methods are exposed as lower camelcase methods on the `bitcoin.Client`\nobject, or you may call the API directly using the `cmd` method.\n\n## Install\n\n`npm install bitcoin`\n\n## Setup\n\n1. Traverse to `~/.bitcoin` or `~/Library/Application Support/Bitcoin` and add a\nfile called `bitcoin.conf` if it doesn't already exist.\n\n2. Add these lines to the file:\n\n    rpcuser=username\n\n    rpcpassword=password\n\nYou will use these to login to the server.\n\n3. Start your Bitcoin client with the `-server` argument or run `bitcoind`\n\n4. You should now be able to communicate with Bitcoin JSON-RPC API using the\nnode-bitcoin library, try it out!\n\n## Examples\n\n### Create client\n```js\nvar bitcoin = require('bitcoin');\nvar client = new bitcoin.Client('localhost', 8332, 'username', 'password');\n```\n\n### Create client with single object\n```js\nvar client = new bitcoin.Client({\n  host: 'localhost',\n  port: 8332,\n  user: 'username',\n  pass: 'password'\n});\n```\n\n### Get balance across all accounts with minimum confirmations of 6\n\n```js\nclient.getBalance('*', 6, function(err, balance) {\n  if (err) return console.log(err);\n  console.log('Balance:', balance);\n});\n```\n### Getting the balance directly using `cmd`\n\n```js\nclient.cmd('getbalance', '*', 6, function(err, balance){\n  if (err) return console.log(err);\n  console.log('Balance:', balance);\n});\n```\n","maintainers":[{"name":"jb55","email":"jb@jb55.com"}]},"1.2.0":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.2.0","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">=0.2.6"},"scripts":{"test":"make test"},"optionalDependencies":{},"_npmUser":{"name":"freewil","email":"sean@eternalrise.com"},"_id":"bitcoin@1.2.0","_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"071237f62f6286594150feac3cd88d49b1998845","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.2.0.tgz"},"readme":"","maintainers":[{"name":"jb55","email":"jb@jb55.com"},{"name":"freewil","email":"sean@eternalrise.com"}]},"1.2.1":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.2.1","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">=0.2.6"},"scripts":{"test":"make test"},"optionalDependencies":{},"_npmUser":{"name":"freewil","email":"sean@eternalrise.com"},"_id":"bitcoin@1.2.1","_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c9b64045fd0cd1cb2fe500d3ecb59b91ce402eba","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.2.1.tgz"},"readme":"","maintainers":[{"name":"jb55","email":"jb@jb55.com"},{"name":"freewil","email":"sean@eternalrise.com"}]},"1.2.2":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.2.2","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">=0.2.6"},"scripts":{"test":"make test"},"optionalDependencies":{},"_npmUser":{"name":"freewil","email":"sean@eternalrise.com"},"_id":"bitcoin@1.2.2","_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e48999d48d21d7e11344f25fd063f1cdc8641cc8","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.2.2.tgz"},"readme":"","maintainers":[{"name":"jb55","email":"jb@jb55.com"},{"name":"freewil","email":"sean@eternalrise.com"}]},"1.3.0":{"name":"bitcoin","description":"Communicate with bitcoind via JSON-RPC","version":"1.3.0","main":"./lib/bitcoin","keywords":["bitcoin","rpc"],"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"contributors":[{"name":"Sean Lavine","email":"sean@eternalrise.com"}],"dependencies":{"underscore":"1.3.x"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"devDependencies":{"vows":"0.6.x"},"engines":{"node":">= 0.6.0 < 0.9.0"},"scripts":{"test":"make test"},"optionalDependencies":{},"_id":"bitcoin@1.3.0","dist":{"shasum":"fbddef42a9c3b7b0a555cdb5015336a28ab0a7ae","tarball":"http://registry.npmjs.org/bitcoin/-/bitcoin-1.3.0.tgz"},"readme":"","maintainers":[{"name":"jb55","email":"jb@jb55.com"},{"name":"freewil","email":"sean@eternalrise.com"}]}},"maintainers":[{"name":"jb55","email":"jb@jb55.com"},{"name":"freewil","email":"sean@eternalrise.com"}],"time":{"modified":"2012-07-03T19:23:23.453Z","created":"2010-12-19T15:24:38.730Z","0.0.1":"2010-12-19T15:24:39.015Z","0.0.2":"2011-05-06T04:05:59.749Z","0.0.3":"2011-05-13T13:46:52.118Z","1.0.0":"2011-05-17T21:59:58.513Z","1.0.1":"2011-05-18T02:07:19.114Z","1.1.0":"2011-08-28T14:34:43.176Z","1.1.1":"2011-10-08T04:40:11.318Z","1.1.2":"2011-10-09T13:59:30.878Z","1.1.3":"2011-11-20T02:50:52.789Z","1.1.4":"2012-02-23T13:10:31.687Z","1.1.5":"2012-02-27T13:37:01.035Z","1.1.6":"2012-04-11T21:23:06.473Z","1.2.0":"2012-04-26T01:08:07.716Z","1.2.1":"2012-04-26T05:13:51.450Z","1.2.2":"2012-04-27T00:57:42.420Z","1.3.0":"2012-07-03T19:23:23.453Z"},"author":{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"},"repository":{"type":"git","url":"git://github.com/jb55/node-bitcoin.git"},"_attachments":{"bitcoin-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-iCVI3IO5Er2X5rhE3SZzNw==","length":111119,"stub":true},"bitcoin-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-pcKSfkSBmqtLHyheonfA2Q==","length":7726,"stub":true},"bitcoin-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-fRwxngKfC6ME8yZSfSW2ow==","length":7557,"stub":true},"bitcoin-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-+b2x3eATGSKu8cVJ281jVA==","length":7536,"stub":true},"bitcoin-1.1.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-geincWfm77b+Xivwyat+dA==","length":5928,"stub":true},"bitcoin-1.1.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-emPai2o0IH3qikVZ4ygg7g==","length":5685,"stub":true},"bitcoin-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-XmQKMNlzeM0Yxdovvat+Qw==","length":5408,"stub":true},"bitcoin-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-bjHqFeRmJgumaxbQEoyjBA==","length":5034,"stub":true},"bitcoin-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-t+Hby1+2UJJA5Y2SyMefWg==","length":4860,"stub":true},"bitcoin-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-5E3lPD7tMRyCzgKumBXA0w==","length":4543,"stub":true},"bitcoin-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-gNXDnsaLSopCXVcUpTRe9A==","length":4498,"stub":true},"bitcoin-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-QF6TJYQzJUkdllchor3HJw==","length":4405,"stub":true},"bitcoin-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-3y0KoTY5ryAjRfHnPbANZQ==","length":4405,"stub":true},"bitcoin-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-75XsI+/0Rx7cmR8ChsUObg==","length":4250,"stub":true},"bitcoin-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rqRSpBprd+RwR+2vJ1CRoQ==","length":4234,"stub":true},"bitcoin-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-O1zUrWo6o8KPLYPEWm1Iag==","length":3794,"stub":true}}}},
{"id":"bitcoin-address","key":"bitcoin-address","value":{"rev":"3-b07d0b3f041f8df5842dee03b535b3ff"},"doc":{"_id":"bitcoin-address","_rev":"3-b07d0b3f041f8df5842dee03b535b3ff","name":"bitcoin-address","description":"bitcoin address verification and other related functions","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"bitcoin-address","description":"bitcoin address verification and other related functions","version":"0.0.1","homepage":"https://github.com/shtylman/bitcoin-address","repository":{"type":"git","url":"git://github.com/shtylman/bitcoin-address.git"},"scripts":{"test":"mocha"},"dependencies":{"int":"0.1.0"},"devDependencies":{"mocha":"1.1.x"},"main":"index","optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"bitcoin-address@0.0.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.20-pre","_defaultsLoaded":true,"dist":{"shasum":"17dbf40f827f3c302362dcd6c5e846f31e7f0c09","tarball":"http://registry.npmjs.org/bitcoin-address/-/bitcoin-address-0.0.1.tgz"},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]}},"readme":"# address [![Build Status](https://secure.travis-ci.org/shtylman/bitcoin-address.png)](http://travis-ci.org/shtylman/bitcoin-address) #\n\nProvides utility functions for working with bitcoin addresses\n\n## install ##\n\n```\nnpm install bitcoin-address\n```\n\n## API ##\n\n### validate (address [, type]) ###\n\n> returns true if the address (string) is a valid bitcoin address\n> optionally, you can specify 'prod' or 'testnet' for the type to limit validation that that subset of addresses\n","maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}],"time":{"modified":"2012-06-15T14:37:37.936Z","created":"2012-06-15T14:37:37.357Z","0.0.1":"2012-06-15T14:37:37.936Z"},"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"repository":{"type":"git","url":"git://github.com/shtylman/bitcoin-address.git"},"_attachments":{"bitcoin-address-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bZ41EVn6/fiK89iiIAEVGQ==","length":2241,"stub":true}}}},
{"id":"bitcoin-explorer","key":"bitcoin-explorer","value":{"rev":"5-8a9c505b3c1d1f0dca56ac06d7158763"},"doc":{"_id":"bitcoin-explorer","_rev":"5-8a9c505b3c1d1f0dca56ac06d7158763","name":"bitcoin-explorer","description":"A block explorer clone built using BitcoinJS","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.0":{"name":"bitcoin-explorer","version":"0.2.0","description":"A block explorer clone built using BitcoinJS","main":"./lib/bitcoin","keywords":["bitcoin","realtime","block","transaction","explorer","monitoring","viewer"],"scripts":{"start":"node app.js"},"dependencies":{"bitcoinjs":">=0.2.1","ejs":">=0.4.3","lru-cache":">=1.0.4","winston":">=0.3.4","express":">=2.4.4","step":">=0.0.4","jsonrpc2":">=0.0.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-explorer.git"},"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bitcoin-explorer@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e663e10c2c1adfaf57b8864c958ea57ac627dedf","tarball":"http://registry.npmjs.org/bitcoin-explorer/-/bitcoin-explorer-0.2.0.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.2.1":{"name":"bitcoin-explorer","version":"0.2.1","description":"A block explorer clone built using BitcoinJS","main":"./lib/bitcoin","keywords":["bitcoin","realtime","block","transaction","explorer","monitoring","viewer"],"scripts":{"start":"node app.js"},"dependencies":{"bitcoinjs":">=0.2.1","ejs":">=0.4.3","lru-cache":">=1.0.4","winston":">=0.3.4","express":">=2.4.4","step":">=0.0.4","jsonrpc2":">=0.1.0"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-explorer.git"},"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bitcoin-explorer@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"32ba8a48bbac4c53027c95e59b43c2894ce2b26f","tarball":"http://registry.npmjs.org/bitcoin-explorer/-/bitcoin-explorer-0.2.1.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]}},"readme":"# node-bitcoin-explorer\n\nThis is mostly intended as a demo application for\n[node-bitcoin-p2p](https://github.com/justmoon/node-bitcoin-p2p/). It\nreplicates most of the functionality of the popular [Block\nExplorer](http://blockexplorer.com/) website.\n\n# Installation\n\nBefore you install `node-bitcoin-explorer`, make sure you have\n[node-bitcoin-p2p](https://github.com/bitcoinjs/node-bitcoin-p2p)\ninstalled.\n\n``` sh\n# Get node-bitcoin-explorer\ngit clone git://github.com/justmoon/node-bitcoin-explorer.git --recursive\n\n# Go to folder\ncd node-bitcoin-explorer\n\n# Link to global bitcoinjs installation\nnpm link bitcoinjs\n\n# Install dependencies\nnpm install\n```\n\n# Usage\n\nTo start the server\n\n    node app.js\n\nThe application will be visible on http://localhost:3000/\n","maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"time":{"modified":"2011-12-30T11:16:42.070Z","created":"2011-12-22T21:35:42.388Z","0.2.0":"2011-12-22T21:35:44.657Z","0.2.1":"2011-12-30T11:16:42.070Z"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-explorer.git"},"_attachments":{"bitcoin-explorer-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8zYNqKNq8tLs1xPiUoXqyg==","length":42439,"stub":true},"bitcoin-explorer-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wZnNV36QdOzfYqvwamRDVQ==","length":42449,"stub":true}}}},
{"id":"bitcoin-impl","key":"bitcoin-impl","value":{"rev":"8-99068f1d259e3c75209a6bd08e3e06a2"},"doc":{"_id":"bitcoin-impl","_rev":"8-99068f1d259e3c75209a6bd08e3e06a2","name":"bitcoin-impl","description":"A library of JavaScript/C++ Bitcoin components. (And eventually, a full client made from them.)","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bitcoin-impl","version":"0.0.1","description":"A library of JavaScript/C++ Bitcoin components. (And eventually, a full client made from them.)","url":"https://github.com/andrewschaaf/node-bitcoin-impl","main":"build-coffee/main","scripts":{"install":"node-waf configure build"},"dependencies":{},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-bitcoin-impl.git"},"_id":"bitcoin-impl@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.3.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"369da43a277f50b1e5d28ce102f2c7a87519c558","tarball":"http://registry.npmjs.org/bitcoin-impl/-/bitcoin-impl-0.0.1.tgz","bin":{"0.4-sunos-5.11":{"shasum":"f391b6e28e41e7d5fb8d93cd1b92f478eaf0ebf3","tarball":"http://registry.npmjs.org/bitcoin-impl/-/bitcoin-impl-0.0.1-0.4-sunos-5.11.tgz"}}}}},"maintainers":[{"name":"andrewschaaf","email":"andrew@andrewschaaf.com"}],"time":{"modified":"2011-04-15T21:03:49.840Z","created":"2011-02-06T21:57:50.356Z","0.0.1":"2011-02-06T21:57:50.638Z"},"author":{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},"repository":{"type":"git","url":"git://github.com/andrewschaaf/node-bitcoin-impl.git"},"_attachments":{"bitcoin-impl-0.0.1-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-gF0ysHmyj4kNiwBbw8TGTg==","length":4024,"stub":true},"bitcoin-impl-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-j0NYzWNSvPGncoBrVQfz3w==","length":35637,"stub":true}}}},
{"id":"bitcoin-p2p","key":"bitcoin-p2p","value":{"rev":"43-be4541bc105bb4fa4e6b215ce725755d"},"doc":{"_id":"bitcoin-p2p","_rev":"43-be4541bc105bb4fa4e6b215ce725755d","name":"bitcoin-p2p","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"name":"bitcoin-p2p","version":"0.0.1","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"scripts":{"install":"node-waf configure build"},"dependencies":{"binary":">=0.1.9","buffertools":">=1.0.2","bigint":">=0.3.1","winston":">=0.2.6","irc":">=0.1.2"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"}],"repository":{"type":"git","url":"https://justmoon@github.com/justmoon/node-bitcoin-p2p.git"},"_id":"bitcoin-p2p@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"cb19da3f9a0e7757b2cfdbd65dcd516d5e8e4178","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.1.tgz","bin":{"0.4-sunos-5.11":{"shasum":"d27b9ec33b65488cf5895672ea8bf17fea05b1c2","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.1-0.4-sunos-5.11.tgz"}}},"directories":{}},"0.0.3":{"name":"bitcoin-p2p","version":"0.0.3","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"scripts":{"install":"node-waf configure build"},"dependencies":{"buffertools":">=1.0.3","binary":">=0.1.9","bigint":">=0.3.1","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"}],"repository":{"type":"git","url":"git://github.com/justmoon/node-bitcoin-p2p.git"},"devDependencies":{},"_id":"bitcoin-p2p@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d66e7f7bf134394022f3708984431ed03456b360","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.3.tgz"},"directories":{}},"0.0.5":{"name":"bitcoin-p2p","version":"0.0.5","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"scripts":{"install":"node-waf configure build"},"dependencies":{"buffertools":">=1.0.3","binary":">=0.1.9","bigint":">=0.3.1","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":"*"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"devDependencies":{},"_id":"bitcoin-p2p@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.9-pre","_defaultsLoaded":true,"dist":{"shasum":"ef77912fc4c11b02d57fe288a87e03c4a9916c4a","bin":{"0.4-ares1.7.4-ev4.4-openssl0.9.8o-v83.1.8.16-linux-2.6.38-8-generic":{"shasum":"ada9e2a2b2726e0791dd86c97c835d2e169febd9","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.5-0.4-ares1.7.4-ev4.4-openssl0.9.8o-v83.1.8.16-linux-2.6.38-8-generic.tgz"}},"tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.5.tgz"},"directories":{}},"0.0.6":{"name":"bitcoin-p2p","version":"0.0.6","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.1.9","bigint":">=0.3.1","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.5","yanop":">=0.1.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_id":"bitcoin-p2p@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"e944c0372ddca65af690b4921efe91b0ad61d44f","bin":{"0.4-ares1.7.4-ev4.4-openssl0.9.8o-v83.1.8.25-linux-2.6.38-8-generic":{"shasum":"bc5d27b0421fcdc8c1a9748e85f9e651d2e1d508","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.6-0.4-ares1.7.4-ev4.4-openssl0.9.8o-v83.1.8.25-linux-2.6.38-8-generic.tgz"}},"tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.6.tgz"},"directories":{}},"0.0.7":{"name":"bitcoin-p2p","version":"0.0.7","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.1.9","bigint":">=0.3.1","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.5","yanop":">=0.1.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoin-p2p/0.0.7/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bitcoin-p2p@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b67e7218f951fbc633c8d2bca327a9046f15e7d7","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.7.tgz"},"directories":{}},"0.0.8":{"name":"bitcoin-p2p","version":"0.0.8","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bigint":">=0.3.1","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","bitcoinjs-mongoose":">=1.8.0","progress-bar":">=0.1.1","colors":">=0.5.0"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoin-p2p/0.0.8/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bitcoin-p2p@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"19f1e0ded5aaa3cf3cd77717c6c8dfda6f5d120e","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.8.tgz"},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"directories":{}},"0.0.9":{"name":"bitcoin-p2p","version":"0.0.9","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bigint":">=0.3.1","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","bitcoinjs-mongoose":">=1.8.0","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoin-p2p/0.0.9/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bitcoin-p2p@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"7c286fc847e100b58d3a3cd11491bd6ded397a2c","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.0.9.tgz"},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"directories":{}},"0.1.0":{"name":"bitcoin-p2p","version":"0.1.0","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bigint":">=0.3.5","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","mongoose":">=2.1.3","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoin-p2p/0.1.0/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bitcoin-p2p@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"916e07d4922dfc02a13da1f298290298668c5fe6","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.1.0.tgz"},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.1.1":{"name":"bitcoin-p2p","version":"0.1.1","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bigint":">=0.3.5","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","mongoose":">=2.1.3","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoin-p2p/0.1.1/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"bitcoin-p2p@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6c977ded8204e1145cc67342eeee8fd99541efe8","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.1.1.tgz"},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.1.2":{"name":"bitcoin-p2p","version":"0.1.2","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bigint":">=0.3.5","step":">=0.0.4","winston":">=0.2.6","irc":">=0.1.2","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","mongoose":">=2.1.3","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bitcoin-p2p@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2c48fc02d90b9e4e31f961262ae63eddace6dac4","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.1.2.tgz"},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.1.3":{"name":"bitcoin-p2p","version":"0.1.3","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bigint":">=0.3.5","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","mongoose":">=2.1.3","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bitcoin-p2p@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"401c199faae1de357de6bbe1664ea57ab1139b28","tarball":"http://registry.npmjs.org/bitcoin-p2p/-/bitcoin-p2p-0.1.3.tgz"},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]}},"maintainers":[{"name":"justmoon","email":"justmoon@members.fsf.org"},{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"time":{"modified":"2011-10-29T04:43:29.442Z","created":"2011-04-06T00:14:02.388Z","0.0.1":"2011-04-06T00:14:02.858Z","0.0.3":"2011-05-07T06:54:13.847Z","0.0.5":"2011-07-03T03:21:50.272Z","0.0.6":"2011-07-06T04:45:16.367Z","0.0.7":"2011-07-07T20:45:18.440Z","0.0.8":"2011-08-07T21:58:51.977Z","0.0.9":"2011-08-17T23:52:11.249Z","0.1.0":"2011-09-18T17:23:39.964Z","0.1.1":"2011-10-05T04:37:42.416Z","0.1.2":"2011-10-21T11:34:52.687Z","0.1.3":"2011-10-29T04:43:29.442Z"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_attachments":{"bitcoin-p2p-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-NPlHPDLyLpB+ZjgpSas4KQ==","length":78422,"stub":true},"bitcoin-p2p-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-KZn+2QuigklAw7bsHkfI5g==","length":78071,"stub":true},"bitcoin-p2p-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-xVpvMww/Fyj/AwBJ4QYvhg==","length":78178,"stub":true},"bitcoin-p2p-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ofF6A6KJCyyV5+aBmKbm9w==","length":77805,"stub":true},"bitcoin-p2p-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-2QZZSarMsE/mNTBHDisV/g==","length":76427,"stub":true},"bitcoin-p2p-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-Rf0EDWCBPDSYEjakQnICUQ==","length":159586,"stub":true},"bitcoin-p2p-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-//CKx5sNfKpteQIEegyfvA==","length":458676,"stub":true},"bitcoin-p2p-0.0.6-0.4-ares1.7.4-ev4.4-openssl0.9.8o-v83.1.8.25-linux-2.6.38-8-generic.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Qqc1cWp2aKhIcX7jMQSLZQ==","length":391371,"stub":true},"bitcoin-p2p-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-UelkOkKckUZKqbOenZ4urg==","length":390728,"stub":true},"bitcoin-p2p-0.0.5-0.4-ares1.7.4-ev4.4-openssl0.9.8o-v83.1.8.16-linux-2.6.38-8-generic.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-9QdTKsAgijUfmm0f+s5qMQ==","length":388790,"stub":true},"bitcoin-p2p-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-f5ZJ8TS1yTGiMbWXzNDyIQ==","length":388652,"stub":true},"bitcoin-p2p-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-JwzBrgzL2sKPJiQHvN3hTw==","length":358173,"stub":true},"bitcoin-p2p-0.0.1-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-dHU/GeKeCgcXEyqrBR6rvA==","length":345205,"stub":true},"bitcoin-p2p-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-57mjW5br8VAV14VptyMNjw==","length":916644,"stub":true}}}},
{"id":"bitcoinjs","key":"bitcoinjs","value":{"rev":"23-2d48084e3506c64c1134329c69ee677b"},"doc":{"_id":"bitcoinjs","_rev":"23-2d48084e3506c64c1134329c69ee677b","name":"bitcoinjs","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","dist-tags":{"latest":"0.2.6"},"versions":{"0.2.0":{"name":"bitcoinjs","version":"0.2.0","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.6","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.4.0","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bitcoinjs@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"83918515cf7f06fe994f86e3b5c51312c15a3965","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.0.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"directories":{}},"0.2.1":{"name":"bitcoinjs","version":"0.2.1","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","webworker":"*","jsonrpc2":">=0.0.6","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.6","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.4.0","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"},"_id":"bitcoinjs@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"3d491fd2fb5b9f488ecf93877d1f2cce08e77b6a","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.1.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"directories":{}},"0.2.2":{"name":"bitcoinjs","version":"0.2.2","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","jsonrpc2":">=0.1.0","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.7-3-1","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.4.0","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"justmoon@members.fsf.org"},"_id":"bitcoinjs@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"26a2866346734f97d8a209f0f8942fdbcabc0c2f","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.2.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.2.3":{"name":"bitcoinjs","version":"0.2.3","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","jsonrpc2":">=0.1.0","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.7-3-1","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.5.2","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"justmoon@members.fsf.org"},"_id":"bitcoinjs@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"ae6d67816242cda5de239154724b2ad0861ce7c0","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.3.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.2.4":{"name":"bitcoinjs","version":"0.2.4","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","jsonrpc2":">=0.1.0","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.7-3-1","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.5.5","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"justmoon@members.fsf.org"},"_id":"bitcoinjs@0.2.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"fa21e27bb7c329ff5350c1819ee029a719038725","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.4.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.2.5":{"name":"bitcoinjs","version":"0.2.5","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5 <0.3","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","jsonrpc2":">=0.1.0","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.7-3-1","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.5.5","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/node-bitcoin-p2p.git"},"_npmUser":{"name":"bitcoinjs","email":"justmoon@members.fsf.org"},"_id":"bitcoinjs@0.2.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4b78bcd615da93ab53571c4c7251287c7695e9ed","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.5.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]},"0.2.6":{"name":"bitcoinjs","version":"0.2.6","description":"Implementation of Bitcoin's peer-to-peer layer for Node.js","main":"./lib/bitcoin","keywords":["peer-to-peer","bitcoin","client"],"bin":{"bitcoinjs":"./bin/bitcoinjs"},"scripts":{"install":"node-waf configure build"},"engines":{"node":">=0.8.2"},"man":["./man/bitcoinjs.1","./man/run.1","./man/db-reset.1","./man/db-drop.1","./man/test.1"],"dependencies":{"buffertools":">=1.0.3","binary":">=0.2.5 <0.3","bignum":">=0.4.0","step":">=0.0.4","winston":">=0.2.6","irc":">=0.2.1","jsonrpc2":">=0.1.0","yanop":">=0.1.1","forever":">=0.6.1","mongodb":">=0.9.7-3-1","progress-bar":">=0.1.1","colors":">=0.5.0","lru-cache":">=1.0.4","pkginfo":">=0.2.0","buffers":">=0.1.1","leveldb":">=0.5.5","mkdirp":">=0.2.1"},"devDependencies":{"vows":">=0.5.8","ronn":">=0.3.6"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"contributors":[{"name":"Andrew Schaaf","email":"andrew@andrewschaaf.com"},{"name":"Mike Hearn","email":"hearn@google.com"},{"name":"Robert Kieffer","email":"robert@broofa.com"},{"name":"Bill Casarin","email":"bill@casarin.ca","url":"jb55.com"}],"repository":{"type":"git","url":"git://github.com/bitcoinjs/bitcoinjs-server.git"},"_npmUser":{"name":"bitcoinjs","email":"justmoon@members.fsf.org"},"_id":"bitcoinjs@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"06296b293e66b765d2592ab3b2f6f3b24e8b9698","tarball":"http://registry.npmjs.org/bitcoinjs/-/bitcoinjs-0.2.6.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]}},"readme":"# node-bitcoin-p2p\n\nThis is an implementation of a Bitcoin node in Node.js. It is intended\nas a powerful alternative to the standard bitcoind that ships with the\noriginal client.\n\n# Differences to original client\n\nThe original client contains the node, wallet, GUI and miner. This\nlibrary contains a highly optimized version of the node, i.e. the P2P\npart of Bitcoin. Its main intended use is as a server component to\ngive lighter clients access to the data in the block chain (in\nreal-time.)\n\nBut it can also be used for writing other software that\nrequires real-time data from the block chain or wants to run queries\nagainst it.\n\n\n# Installation\n\n## Prerequisites\n\n* [OpenSSL](http://www.openssl.org/) (lib and headers)\n* [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config)\n* [Node.js](https://github.com/joyent/node) 0.6.5+\n\nNode.js should be compiled manually based on the latest stable\nrelease.\n\n### MongoDB\n\nIf you wish to use a MongoDB database (most users will want to just\nuse the built-in database), you need to setup a MongoDB server. This\ncan be done using any method.\n\n\n## Installation\n\nOnce you have all prerequisites, this one-liner will install the\nlatest version straight from NPM:\n\n``` sh\n# Install BitcoinJS Server globally\nsudo npm install bitcoinjs -g\n```\n\nPlease refer to the wiki for detailed [installation\ninstructions](https://github.com/bitcoinjs/node-bitcoin-p2p/wiki/Installation).\n\nIf you run into problems, please take a look at the \"Troubleshooting\"\nsection below or go to\n[Issues](https://github.com/bitcoinjs/node-bitcoin-p2p/issues) to open\na new ticket.\n\n# Usage\n\nFor your first experience with the BitcoinJS daemon, try running it\nright from the terminal.\n\n``` sh\nbitcoinjs run --testnet --bchdbg\n```\n\nYou can find out more about the various functions of the command line\nutility via the help feature:\n\n``` sh\nbitcoinjs help\n```\n\n\n## Uninstall\n\n``` sh\n# Remove the database\nbitcoinjs db-drop\n\n# Uninstall the software\nsudo npm uninstall bitcoin-p2p -g\n```\n\n\n## Logging\n\n`node-bitcoin-p2p` logs using the winston library. Currently, it\ndefaults to logging anything on the `debug` log level and higher. Here\nare the available log levels:\n\n- `netdbg` - Networking events (sending/receiving messages)\n- `bchdbg` - Block chain events (adding blocks)\n- `rpcdbg` - JSON-RPC API events (requests/responses)\n- `scrdbg` - Script interpreter events (custom scripts, errors)\n- `debug` - Other verbose logging\n- `info` - General information and status messages\n- `warn` - Something rare happened (e.g. strange pubKeyScript)\n- `error` - Something bad happened\n\nThe XXXdbg levels can be enabled individually by editing\nlib/logger.js or via the command line, e.g. `bitcoinjs run --bchdbg`.\n\n\n## Advanced usage\n\n`node-bitcoin-p2p` is not only a daemon, but also a Node.js\nmodule/library. In most cases it's best to use the daemon via RPC. But\nsometimes you need the extra control that comes with directly linking\nto the code.\n\nFor details on developing with `node-bitcoin-p2p` as a library, take a\nlook at the Developer Guide on the\n[wiki](https://github.com/bitcoinjs/node-bitcoin-p2p/wiki).\n\n\n# Upgrading\n\nWhen upgrading node-bitcoin-p2p it is a good idea to reset its\ndatabase:\n\n``` sh\nbitcoinjs db-drop\n```\n\nThis won't be necessary once node-bitcoin-p2p is more stable, but for\nnow new versions often break database compatibility, so it's easiest\nto just reset it.\n\n\n# Tests\n\nTo run the test suite, please install [Vows](http://vowsjs.org) and\nrun the following command:\n\n``` sh\nvows test/* --spec\n```\n\n# Status\n\nThe library is currently alpha quality. Here are some things it\ncurrently lacks:\n\n- Respond to getblocks requests\n- Manage knowledge about other peers\n- DoS protections from Bitcoin 0.4+\n\nOn top of that, it could use a lot more documentation, test\ncases and general bug fixing across the board.\n\nYou can find more information on the Issues tab on Github.\n\n# Troubleshooting\n\n## Native module missing\n\nIf you see this error:\n\n    Error: Cannot find module '../build-cc/default/native'\n\nThis happens when the native components of node-bitcoin-p2p are not\ncompiled yet.\n\nGo to the node-bitcoin-p2p folder and run:\n\n``` sh\nnode-waf configure build\n```\n\n# Credits\n\nnode-bitcoin-p2p - Node.js Bitcoin client<br>\nCopyright (c) 2011 Stefan Thomas <justmoon@members.fsf.org>.\n\nSome native extensions are<br>\nCopyright (c) 2011 Andrew Schaaf <andrew@andrewschaaf.com>\n\nParts of this software are based on [BitcoinJ](http://code.google.com/p/bitcoinj/)<br>\nCopyright (c) 2011 Google Inc.\n","maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"time":{"modified":"2012-07-17T15:18:16.060Z","created":"2011-12-18T10:02:23.975Z","0.2.0":"2011-12-18T10:02:25.827Z","0.2.1":"2011-12-22T11:42:50.620Z","0.2.2":"2012-02-04T19:00:32.878Z","0.2.3":"2012-02-08T22:37:28.485Z","0.2.4":"2012-02-14T23:10:38.505Z","0.2.5":"2012-06-24T09:42:26.021Z","0.2.6":"2012-07-17T15:18:16.060Z"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/bitcoinjs-server.git"},"_attachments":{"bitcoinjs-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1vcXi0QaR6O2JgS5ZcOJgA==","length":120695,"stub":true},"bitcoinjs-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-Lfesgme+xx62qrbJtVmsAA==","length":115398,"stub":true},"bitcoinjs-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-fhoJvh3fexGRXSaQMF4bNw==","length":113131,"stub":true},"bitcoinjs-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-SaTsrcupTn1K0mFgqNhEgw==","length":112742,"stub":true},"bitcoinjs-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-51tOETgjEX38tOcarE+VUQ==","length":112674,"stub":true},"bitcoinjs-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2xqu4RHDiC88Mvg1cJ5yjA==","length":100905,"stub":true},"bitcoinjs-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SqsD8t4xJl9QneBt1Z8kbw==","length":100360,"stub":true}}}},
{"id":"bitcoinjs-lib","key":"bitcoinjs-lib","value":{"rev":"3-229ee453d458f7407f6cbcdff2583052"},"doc":{"_id":"bitcoinjs-lib","_rev":"3-229ee453d458f7407f6cbcdff2583052","name":"bitcoinjs-lib","description":"Client-side Bitcoin JavaScript library","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bitcoinjs-lib","version":"0.1.0","description":"Client-side Bitcoin JavaScript library","keywords":["bitcoin","browser","client","library"],"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/bitcoinjs-lib.git"},"devDependencies":{"pkginfo":">=0.2.1","jake-uglify":">=1.0.0"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoinjs-lib/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bitcoinjs-lib@0.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"b4888a434cec8fc4bfb6747cd859dcf0a17440e8","tarball":"http://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]}},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"time":{"modified":"2011-09-27T12:52:08.282Z","created":"2011-09-27T12:52:06.529Z","0.1.0":"2011-09-27T12:52:08.282Z"},"author":{"name":"Stefan Thomas","email":"justmoon@members.fsf.org","url":"http://www.justmoon.net"},"repository":{"type":"git","url":"git://github.com/bitcoinjs/bitcoinjs-lib.git"},"_attachments":{"bitcoinjs-lib-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tOeOQtGYUKQkap0SDYf8Gw==","length":57581,"stub":true}}}},
{"id":"bitcoinjs-mongoose","key":"bitcoinjs-mongoose","value":{"rev":"3-57e239b31e218693f8cf3cf1cf098437"},"doc":{"_id":"bitcoinjs-mongoose","_rev":"3-57e239b31e218693f8cf3cf1cf098437","name":"bitcoinjs-mongoose","description":"Mongoose MongoDB ORM (temporary BitcoinJS fork)","dist-tags":{"latest":"1.8.0"},"versions":{"1.8.0":{"name":"bitcoinjs-mongoose","description":"Mongoose MongoDB ORM (temporary BitcoinJS fork)","version":"1.8.0","author":{"name":"Guillermo Rauch","email":"guillermo@learnboost.com"},"keywords":["mongodb","mongoose","orm","data","datastore","nosql"],"dependencies":{"hooks":"0.1.9","mongodb":"0.9.6-7","colors":"0.5.0"},"devDependencies":{"should":"0.2.1"},"directories":{"lib":"./lib/mongoose"},"scripts":{"test":"make test"},"main":"./index.js","engines":{"node":">= 0.2.0"},"repository":{"type":"git","url":"git://github.com/LearnBoost/mongoose.git"},"_npmJsonOpts":{"file":"/home/moon/.npm/bitcoinjs-mongoose/1.8.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bitcoinjs-mongoose@1.8.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8051c18f3c7609651ef5eb7f0d533d0caa995936","tarball":"http://registry.npmjs.org/bitcoinjs-mongoose/-/bitcoinjs-mongoose-1.8.0.tgz"},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}]}},"maintainers":[{"name":"bitcoinjs","email":"bitcoinjs@justmoon.net"}],"time":{"modified":"2011-08-06T18:03:32.643Z","created":"2011-08-06T18:03:31.883Z","1.8.0":"2011-08-06T18:03:32.643Z"},"author":{"name":"Guillermo Rauch","email":"guillermo@learnboost.com"},"repository":{"type":"git","url":"git://github.com/LearnBoost/mongoose.git"},"_attachments":{"bitcoinjs-mongoose-1.8.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-I1nVr1/kfKrh1IOach9QIQ==","length":239531,"stub":true}}}},
{"id":"bitly","key":"bitly","value":{"rev":"15-ced4b4a23b5e571bc016afb7400991bb"},"doc":{"_id":"bitly","_rev":"15-ced4b4a23b5e571bc016afb7400991bb","name":"bitly","description":"node-bitly - Bitly API for nodejs ====================","dist-tags":{"latest":"1.2.4"},"versions":{"1.1.1":{"name":"bitly","description":"A Bit.ly API library for Node.JS","tags":["url","bitly","shortner","util"],"version":"1.1.1","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"main":"./bitly","repository":{"type":"git","url":"git://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tanepiper","email":"piper.tane@gmail.com"},"_id":"bitly@1.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"f504c59438211e92dc84870f720c7cd11ffaadf3","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.1.1.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]},"1.1.2":{"name":"bitly","description":"A Bit.ly API library for Node.JS","tags":["url","bitly","shortner","util"],"version":"1.1.2","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"main":"./bitly","repository":{"type":"git","url":"git://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"tanepiper","email":"piper.tane@gmail.com"},"_id":"bitly@1.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c42b5fef17f9d18667923d93412dae52d74509c1","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.1.2.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]},"1.2.0":{"name":"bitly","description":"A Bit.ly API library for Node.JS","tags":["url","bitly","shortner","util"],"version":"1.2.0","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"main":"./bitly","repository":{"type":"git","url":"git://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"_npmUser":{"name":"tanepiper","email":"piper.tane@gmail.com"},"_id":"bitly@1.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"40f09f4d4c3beabd74f8927d6261b510505a3805","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.2.0.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]},"1.2.1":{"name":"bitly","description":"A Bit.ly API library for Node.JS","tags":["url","bitly","shortner","util"],"version":"1.2.1","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"main":"./bitly","repository":{"type":"git","url":"git://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"_npmUser":{"name":"tanepiper","email":"piper.tane@gmail.com"},"_id":"bitly@1.2.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"e01daf7a74487e154b06b444804c99005d4ec330","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.2.1.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]},"1.2.2":{"name":"bitly","description":"A Bit.ly API library for Node.JS","tags":["url","bitly","shortner","util"],"version":"1.2.2","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"main":"./bitly","repository":{"type":"git","url":"git://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"_npmUser":{"name":"tanepiper","email":"piper.tane@gmail.com"},"_id":"bitly@1.2.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"7df2d1309c16a248f4785987492413d94f0dd3d7","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.2.2.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]},"1.2.3":{"name":"bitly","description":"A Bit.ly API library for Node.JS","tags":["url","bitly","shortner","util"],"version":"1.2.3","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"main":"./bitly","repository":{"type":"git","url":"git://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"_npmUser":{"name":"tanepiper","email":"piper.tane@gmail.com"},"_id":"bitly@1.2.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"311e64015033e0d8bf9806f1385476ff830734a1","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.2.3.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]},"1.2.4":{"name":"bitly","description":"node-bitly - Bitly API for nodejs ====================","tags":["url","bitly","shortner","util"],"version":"1.2.4","author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"contributors":[{"name":"Tane Piper","email":"piper.tane@gmail.com"},{"name":"François de Metz","email":"francois@2metz.fr"},{"name":"zephrax"}],"repository":{"type":"git","url":"http://github.com/tanepiper/node-bitly.git"},"engines":{"node":">= 0.4.0"},"scripts":{"test":"node_modules/.bin/nodeunit test"},"devDependencies":{"nodeunit":">=0.6.2"},"readme":"node-bitly - Bitly API for nodejs\n====================\n\n[![Build Status](https://secure.travis-ci.org/tanepiper/node-bitly.png)](http://travis-ci.org/tanepiper/node-bitly)\n\nThis module provides calls to the [Bitly](http://bitly.com) API for [Nodejs](http://nodejs.org).\nFor more information on the API request and responses visit the [Bitly API docs](http://code.google.com/p/bitly-api/wiki/ApiDocumentation)\n\nInstallation\n------------\nTo install via NPM type the following: `npm install bitly`\n\nYou can also install via git by cloning: `git clone https://github.com/tanepiper/node-bitly.git /path/to/bitly`\n\nUsage\n-----\n    var Bitly = require('bitly');\n    var bitly = new Bitly('<YOUR USERNAME>', '<YOUR API KEY>');\n    bitly.shorten('https://github.com/tanepiper/node-bitly', function(err, response) {\n      if (err) throw err;\n\n      // See http://code.google.com/p/bitly-api/wiki/ApiDocumentation for format of returned object\n      var short_url = response.data.url\n\n      // Do something with data\n    });\n\nTests\n-----\nTo run tests type `npm test`\n\nBit.ly Features\n---------------\nCurrently this module does NOT support the OAuth features of the Bitly API.  As such\nthis module is limited to the following API methods:\n\n* shorten\n* expand\n* validate\n* clicks / clicks_by_minute / clicks_by_day\n* referrers\n* countries\n* bitly_pro_domain\n* lookup\n* info","_id":"bitly@1.2.4","dist":{"shasum":"5121c23ea9b7cdae3282be2a5f8735033ed1b2ad","tarball":"http://registry.npmjs.org/bitly/-/bitly-1.2.4.tgz"},"maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}]}},"readme":"node-bitly - bit.ly API for nodejs\n====================\n\nThis module makes the [bit.ly](http://bitly.com) API accessible via NodeJS\n\nInstallation\n------------\n\nTo install via NPM type the following:\n\n    `npm install bitly`\n\nYou can also install via git by cloning:\n\n    'git clone git://github.com/tanepiper/node-bitly.git /path/to/node_modules/bitly'\n\n\nUsage\n-----\n\n    var Bitly = require('bitly');\n    var bitly = new Bitly('<YOUR USERNAME>', '<YOUR API KEY>');\n    bitly.shorten('https://github.com/tanepiper/node-bitly', function(err, response) {\n      if (err) throw err;\n\n      // See http://code.google.com/p/bitly-api/wiki/ApiDocumentation for format of returned object\n      var short_url = response.data.url\n\n      // Do something with data\n    });\n\n\nBit.ly Features\n---------------\n* Shorten Url.\n* Expand single/multiple Urls\n* Expand single/multiple hashes\n* Expand mixed urls/hashes\n* Get Clicks for URLs\n* Get Info about URLs\n* Lookup URLs\n* Check for pro domain\n* Check for authenticated account\n","maintainers":[{"name":"tanepiper","email":"piper.tane@gmail.com"}],"time":{"modified":"2012-07-06T21:43:19.758Z","created":"2011-11-16T00:20:33.033Z","1.1.1":"2011-11-16T00:20:35.498Z","1.1.2":"2011-11-21T22:22:27.304Z","1.2.0":"2011-11-22T15:37:07.390Z","1.2.1":"2011-11-22T16:41:43.021Z","1.2.2":"2011-11-22T16:45:28.055Z","1.2.3":"2012-02-13T16:47:31.182Z","1.2.4":"2012-07-06T21:43:19.758Z"},"author":{"name":"Tane Piper","email":"piper.tane@gmail.com"},"repository":{"type":"git","url":"http://github.com/tanepiper/node-bitly.git"},"_attachments":{"bitly-1.2.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-htx7mkrsQA9QZCWZ+47UDg==","length":4437,"stub":true},"bitly-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zkl8IKKvwHSVr9ZUhQaFNQ==","length":4448,"stub":true},"bitly-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-LAInzbpVp7IP0e4VULfBEg==","length":10240,"stub":true},"bitly-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Cf7ZzYgGVh+Z2o7jTld1kA==","length":10240,"stub":true},"bitly-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sD0zirST+Rh0lIUogFK+TA==","length":10240,"stub":true},"bitly-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HBbBBzrosCzWkpEj/cQKOg==","length":10240,"stub":true},"bitly-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-B0jXl3P7pwb2nR09H2T9IQ==","length":10240,"stub":true}}}},
{"id":"bitly.node","key":"bitly.node","value":{"rev":"3-15329b7a77633e0dae2c720e592420fb"},"doc":{"_id":"bitly.node","_rev":"3-15329b7a77633e0dae2c720e592420fb","name":"bitly.node","description":"Bitly API Client","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bitly.node","description":"Bitly API Client","author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"version":"0.1.0","repository":{"type":"git","url":"git://github.com/mattinsler/bitly.node.git"},"main":"index","engines":{"node":"*"},"dependencies":{"rest.node":"0.1.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/mattinsler/.npm/bitly.node/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bitly.node@0.1.0","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"64d6e333a54a5abb2bd889696579407ba59c4fbe","tarball":"http://registry.npmjs.org/bitly.node/-/bitly.node-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}]}},"maintainers":[{"name":"mattinsler","email":"matt.insler@gmail.com"}],"time":{"modified":"2011-09-07T03:37:01.574Z","created":"2011-09-07T03:36:57.085Z","0.1.0":"2011-09-07T03:37:01.574Z"},"author":{"name":"Matt Insler","email":"matt.insler@gmail.com","url":"www.mattinsler.com"},"repository":{"type":"git","url":"git://github.com/mattinsler/bitly.node.git"},"_attachments":{"bitly.node-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EzBWpQHPbtkk9TNJd6LrpA==","length":781,"stub":true}}}},
{"id":"bitmap","key":"bitmap","value":{"rev":"5-ace820fc666aa5aa5a7d8e1c9ac6b924"},"doc":{"_id":"bitmap","_rev":"5-ace820fc666aa5aa5a7d8e1c9ac6b924","name":"bitmap","description":"A collection of bitmap / bitset structures and algorithms","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"bitmap","description":"A collection of bitmap / bitset structures and algorithms","version":"0.1.0","author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"main":"index","bugs":{"email":"cohara87@gmail.com"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"bitmap@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"3659d4285a58a62f621aa1caea9d1373a3a86809","tarball":"http://registry.npmjs.org/bitmap/-/bitmap-0.1.0.tgz"},"readme":"","maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]},"0.1.1":{"name":"bitmap","description":"A collection of bitmap / bitset structures and algorithms","version":"0.1.1","author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"main":"index","bugs":{"email":"cohara87@gmail.com"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT"}],"_npmUser":{"name":"cohara87","email":"cohara87@gmail.com"},"_id":"bitmap@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"60cc982ac65a00d2fb651183b5eb4223573cc2a8","tarball":"http://registry.npmjs.org/bitmap/-/bitmap-0.1.1.tgz"},"readme":"","maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}]}},"readme":"","maintainers":[{"name":"cohara87","email":"cohara87@gmail.com"}],"time":{"modified":"2012-01-23T20:34:22.870Z","created":"2012-01-23T10:54:46.146Z","0.1.0":"2012-01-23T10:54:50.685Z","0.1.1":"2012-01-23T20:34:22.870Z"},"author":{"name":"Chris O'Hara","email":"cohara87@gmail.com"},"_attachments":{"bitmap-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OTc2wp9ABK/ANUtUqQ5Xpw==","length":2669,"stub":true},"bitmap-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xRU7hetrQXAjhYq4JOFwxg==","length":2234,"stub":true}}}},
{"id":"bitme-rest-client","key":"bitme-rest-client","value":{"rev":"9-0344c1907afa90085dd368ea1a1b5d78"},"doc":{"_id":"bitme-rest-client","_rev":"9-0344c1907afa90085dd368ea1a1b5d78","name":"bitme-rest-client","description":"Communicate with BitMe REST API","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"author":{"name":"Sean Lavine","email":"sean@bitme.com"},"name":"bitme-rest-client","description":"Communicate with BitMe REST API","version":"0.0.1","main":"lib/index","scripts":{"prepublish":"make build"},"dependencies":{"request":"~2.9.202"},"devDependencies":{"coffee-script":"~1.3.3"},"optionalDependencies":{},"engines":{"node":">=0.6.0 <0.9.0"},"_npmUser":{"name":"freewil","email":"sean@eternalrise.com"},"_id":"bitme-rest-client@0.0.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2e69af72cd71745798095564d6df70cb8f06a6a7","tarball":"http://registry.npmjs.org/bitme-rest-client/-/bitme-rest-client-0.0.1.tgz"},"maintainers":[{"name":"freewil","email":"sean@eternalrise.com"}]},"0.0.2":{"author":{"name":"Sean Lavine","email":"sean@eternalrise.com"},"name":"bitme-rest-client","description":"Communicate with BitMe REST API","version":"0.0.2","main":"lib/index","scripts":{"prepublish":"make build"},"dependencies":{"request":"~2.9.202"},"devDependencies":{"coffee-script":"~1.3.3"},"optionalDependencies":{},"engines":{"node":">=0.6.0 <0.9.0"},"repository":{"type":"git","url":"git://github.com/bitme/node-rest-client.git"},"_npmUser":{"name":"freewil","email":"sean@eternalrise.com"},"_id":"bitme-rest-client@0.0.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e56c1ee4fe79f864927f98e236645ae964571c7f","tarball":"http://registry.npmjs.org/bitme-rest-client/-/bitme-rest-client-0.0.2.tgz"},"maintainers":[{"name":"freewil","email":"sean@eternalrise.com"}]},"0.0.3":{"author":{"name":"Sean Lavine","email":"sean@eternalrise.com"},"name":"bitme-rest-client","description":"Communicate with BitMe REST API","version":"0.0.3","keywords":["bitme","bitcoin"],"main":"lib/index","scripts":{"prepublish":"make build"},"dependencies":{"request":"~2.9.202"},"devDependencies":{"coffee-script":"~1.3.3"},"optionalDependencies":{},"engines":{"node":">=0.6.0 <0.9.0"},"repository":{"type":"git","url":"git://github.com/bitme/node-rest-client.git"},"readme":"# bitme-rest-client\n\nCommunicate with [BitMe REST API](https://test.bitme.com/docs/rest).\n\n## Install\n\n```\n$ npm install bitme-rest-client\n```\n\n## Verify API Credentials\n\n```js\nvar BitMe = require('bitme-rest-client');\nvar bitme = new BitMe('mykey', 'mysecret');\n\nbitme.verifyCredentials(function(err, res) {\n  if (err) return console.error(err);\n  console.log('credentials are valid!');\n});\n```\n\n## Orderbook\n\n```js\n// orderbook does not require authentication\nvar bitme = new BitMe();\nbitme.orderbook('BTCUSD', function(err, res) {\n  if (err) return console.error(err);\n  console.log(res);\n});\n```\n\n## Testing\n\nYou may use the [testnet](https://test.bitme.com) API for development/testing \npurposes.\n\n```js\nvar bitme = new BitMe('testnetkey', 'testnetsecret', true);\n```\n","_id":"bitme-rest-client@0.0.3","dist":{"shasum":"0d33b03f09806e06018ff86ed1172111ea3d0ea9","tarball":"http://registry.npmjs.org/bitme-rest-client/-/bitme-rest-client-0.0.3.tgz"},"maintainers":[{"name":"freewil","email":"sean@eternalrise.com"}]},"0.0.4":{"author":{"name":"Sean Lavine","email":"sean@eternalrise.com"},"name":"bitme-rest-client","description":"Communicate with BitMe REST API","version":"0.0.4","keywords":["bitme","bitcoin"],"main":"lib/index","scripts":{"prepublish":"make build"},"dependencies":{"request":"~2.9.202"},"devDependencies":{"coffee-script":"~1.3.3"},"optionalDependencies":{},"engines":{"node":">=0.6.0 <0.9.0"},"repository":{"type":"git","url":"git://github.com/bitme/node-rest-client.git"},"readme":"# bitme-rest-client\n\nCommunicate with [BitMe REST API](http://bitme.github.com/rest/).\n\n## Install\n\n```\n$ npm install bitme-rest-client\n```\n\n## Verify API Credentials\n\n```js\nvar BitMe = require('bitme-rest-client');\nvar bitme = new BitMe('mykey', 'mysecret');\n\nbitme.verifyCredentials(function(err, res) {\n  if (err) return console.error(err);\n  console.log('credentials are valid!');\n});\n```\n\n## Orderbook\n\n```js\n// orderbook does not require authentication\nvar bitme = new BitMe();\nbitme.orderbook('BTCUSD', function(err, res) {\n  if (err) return console.error(err);\n  console.log(res);\n});\n```\n\n## Testing\n\nYou may use the [testnet](https://test.bitme.com) API for development/testing \npurposes.\n\n```js\nvar bitme = new BitMe('testnetkey', 'testnetsecret', true);\n```\n","_id":"bitme-rest-client@0.0.4","dist":{"shasum":"9ec76be0f6d3e9d20bf02a0e087117bd8b33ae6f","tarball":"http://registry.npmjs.org/bitme-rest-client/-/bitme-rest-client-0.0.4.tgz"},"maintainers":[{"name":"freewil","email":"sean@eternalrise.com"}]}},"readme":"# bitme-rest-client\n\nCommunicate with [BitMe REST API](https://test.bitme.com/docs/rest).\n\n## Verify API Credentials\n\n```js\nvar BitMe = require('bitme-rest-client');\nvar bitme = new BitMe('mykey', 'mysecret');\n\nbitme.verifyCredentials(function(err, res) {\n  if (err) return console.error(err);\n  console.log('credentials are valid!');\n});\n```\n\n## Orderbook\n\n```js\n// orderbook does not require authentication\nvar bitme = new BitMe();\nbitme.orderbook('BTCUSD', function(err, res) {\n  if (err) return console.error(err);\n  console.log(res);\n});\n```\n\n## Testing\n\nYou may use the [testnet](https://test.bitme.com) API for development/testing \npurposes.\n\n```js\nvar bitme = new BitMe('testnetkey', 'testnetsecret', true);\n```\n","maintainers":[{"name":"freewil","email":"sean@eternalrise.com"}],"time":{"modified":"2012-08-09T06:12:26.077Z","created":"2012-06-28T17:05:37.355Z","0.0.1":"2012-06-28T17:05:38.781Z","0.0.2":"2012-06-29T01:44:14.655Z","0.0.3":"2012-07-05T02:56:25.613Z","0.0.4":"2012-08-09T06:12:26.077Z"},"author":{"name":"Sean Lavine","email":"sean@eternalrise.com"},"repository":{"type":"git","url":"git://github.com/bitme/node-rest-client.git"},"_attachments":{"bitme-rest-client-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-jXATVLWKB4Z0BojJ/vpX6w==","length":3403,"stub":true},"bitme-rest-client-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fgKEHvKyTMh1HNN/HA9uIw==","length":3367,"stub":true},"bitme-rest-client-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5mKwRscJU7v5SIzOt9tYyA==","length":2905,"stub":true},"bitme-rest-client-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xZPR3v2GGnkU+vosjBOkWA==","length":2851,"stub":true}}}},
{"id":"bitreader","key":"bitreader","value":{"rev":"5-86ac02db67102c7e789c14a0f0802844"},"doc":{"_id":"bitreader","_rev":"5-86ac02db67102c7e789c14a0f0802844","name":"bitreader","description":"Generic, space efficient parser with sugar for digesting strings, ints, etc.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitreader","description":"A generic parser with sugar for digesting strings, ints, etc.","version":"0.0.0","homepage":"https://github.com/brianloveswords/bitreader","repository":{"type":"git","url":"git://github.com/brianloveswords/bitreader.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/"},"dependencies":{},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brianloveswords","email":"brian@nyhacker.org"},"_id":"bitreader@0.0.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"1a9f70418b69723eacbd16af1c3cb70cba78cf17","tarball":"http://registry.npmjs.org/bitreader/-/bitreader-0.0.0.tgz"},"readme":"","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]},"0.0.1":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitreader","description":"Generic, space efficient parser with sugar for digesting strings, ints, etc.","version":"0.0.1","homepage":"https://github.com/brianloveswords/bitreader","repository":{"type":"git","url":"git://github.com/brianloveswords/bitreader.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/*.test.js"},"dependencies":{},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# bitreader [![Build Status](https://secure.travis-ci.org/brianloveswords/bitreader.png?branch=master)](http://travis-ci.org/brianloveswords/bitreader)\n\nGeneric, space efficient (uses `Buffer#slice` as much as possilbe)\nparser with sugar for digesting strings, ints, etc. Inherits from\nstream, implements `write` and `end`, and emits `data` events for easy\npiping.\n\n## Install\n\n```bash\n$ npm install bitreader\n```\n\n## Example\nAdapted from [streampng](/brianloveswords/streampng)\n\n```js\nfunction SuggestedPalette() { this.intialize.apply(this, arguments) }\nSuggestedPalette.prototype.initialize = function initialize(data) {\n  var colourSize, chunkSize;\n  var parser = BitReader(data);\n\n  this.type = 'sPLT'\n  this.paletteName = parser.eatString();\n  this.sampleDepth = parser.eatUInt(1);\n  this.palette = [];\n\n  colourSize = (this.sampleDepth === 16) ? 2 : 1;\n  chunkSize = (colourSize === 2) ? 10 : 6\n\n  this.palette = parser.eatRest({ chunkSize: chunkSize }).map(function (entry) {\n    var p = BitReader(entry);\n    return {\n      red: p.eatUInt(colourSize),\n      green: p.eatUInt(colourSize),\n      blue: p.eatUInt(colourSize),\n      alpha: p.eatUInt(colourSize),\n      frequency: p.eatUInt(2)\n    }\n  }.bind(this));\n};\n```\n\n## API\n\nSee [the API page on the wiki](https://github.com/brianloveswords/bitreader/wiki/API)\n\n## Tests\nUses [tap](/isaacs/node-tap) for testing. Tested against node 0.6.19 and node 0.8.2.\n\n```bash\n$ npm test\n```\n\n## License\n\n[http://wtfpl.org/](http://wtfpl.org/)\n","_id":"bitreader@0.0.1","dist":{"shasum":"e96fb1c10a7769acaeff7f39315a178cf3c01a76","tarball":"http://registry.npmjs.org/bitreader/-/bitreader-0.0.1.tgz"},"maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]}},"readme":"","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}],"time":{"modified":"2012-07-16T15:24:43.316Z","created":"2012-07-15T17:08:53.788Z","0.0.0":"2012-07-15T17:08:54.205Z","0.0.1":"2012-07-16T15:24:43.316Z"},"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"repository":{"type":"git","url":"git://github.com/brianloveswords/bitreader.git"},"_attachments":{"bitreader-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lnZ8LBjggK5i70qziKs5JQ==","length":5482,"stub":true},"bitreader-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-A0ozF0EAQTrtaI4mpDxk0Q==","length":2955,"stub":true}}}},
{"id":"bitset","key":"bitset","value":{"rev":"7-fb7187697395b4c8ecc4d1b2e8fdd11f"},"doc":{"_id":"bitset","_rev":"7-fb7187697395b4c8ecc4d1b2e8fdd11f","name":"bitset","description":"BitSet implementation for JavaScript","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"author":{"name":"Tom de Grunt","email":"tom@degrunt.nl"},"name":"bitset","description":"BitSet implementation for JavaScript","keywords":["bit","bitset","metrics"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/tdegrunt/bitset.git"},"main":"./lib/bitset.js","engines":{"node":"~0.6.2"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tdegrunt","email":"tom@degrunt.nl"},"_id":"bitset@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"22b881ecdc61f0515b49f44e048fbd7c140b9684","tarball":"http://registry.npmjs.org/bitset/-/bitset-0.1.0.tgz"},"maintainers":[{"name":"tdegrunt","email":"tom@degrunt.nl"}]},"0.2.0":{"author":{"name":"Tom de Grunt","email":"tom@degrunt.nl"},"name":"bitset","description":"BitSet implementation for JavaScript","keywords":["bit","bitset","metrics"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/tdegrunt/bitset.git"},"main":"./lib/bitset.js","engines":{"node":"~0.6.2"},"scripts":{"test":"cake test"},"dependencies":{},"devDependencies":{"should":"0.3","mocha":"0.1","coffee-script":"1.1"},"_npmUser":{"name":"tdegrunt","email":"tom@degrunt.nl"},"_id":"bitset@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f2279dc5126733650ce40aa97fa278cbb7757d31","tarball":"http://registry.npmjs.org/bitset/-/bitset-0.2.0.tgz"},"maintainers":[{"name":"tdegrunt","email":"tom@degrunt.nl"}]},"0.3.0":{"author":{"name":"Tom de Grunt","email":"tom@degrunt.nl"},"name":"bitset","description":"BitSet implementation for JavaScript","keywords":["bit","bitset","metrics"],"version":"0.3.0","repository":{"type":"git","url":"git://github.com/tdegrunt/bitset.git"},"main":"./lib/bitset.js","engines":{"node":"~0.6.2"},"scripts":{"test":"cake test"},"directories":{"lib":"./lib"},"files":["README.md","./lib","./src","./support","./test"],"dependencies":{},"devDependencies":{"should":"0.3","mocha":"0.1","coffee-script":"1.1"},"_npmUser":{"name":"tdegrunt","email":"tom@degrunt.nl"},"_id":"bitset@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"5981901816a56553dd5c02587c0ff69e96712278","tarball":"http://registry.npmjs.org/bitset/-/bitset-0.3.0.tgz"},"maintainers":[{"name":"tdegrunt","email":"tom@degrunt.nl"}]}},"readme":"BitSet\n======\nThis module implements an array of bits, that grows as needed. It can be used from both JavaScript as well as CoffeeScript.\n\n    var bs = new BitSet(31);\n\n    _(12).times(function(n){ \n      bs.set(n);\n    });\n\n    console.dir(bs);\n\nMind you: The example uses [underscore.js](http://documentcloud.github.com/underscore/)\n \nUsage\n-----\nThis is very useful for realtime metrics with for example Redis.\n\nInstallation\n------------\nnpm install bitset\n\nPerformance\n-----------\nIt performs pretty well, you can try the performance.js in the support folder. This is the output with a 31 bit word size and 10.000.000 bits:\n\n    set 10000000 bits: 418ms\n    cardinality 10000000\n    cardinality: 150ms\n\nTests\n-----\nTesting is done via the excellent [mocha](http://visionmedia.github.com/mocha) (cake test)","maintainers":[{"name":"tdegrunt","email":"tom@degrunt.nl"}],"time":{"modified":"2011-12-04T11:36:49.582Z","created":"2011-12-01T20:45:44.108Z","0.1.0":"2011-12-01T20:45:45.550Z","0.2.0":"2011-12-03T23:41:48.159Z","0.3.0":"2011-12-04T11:36:49.582Z"},"author":{"name":"Tom de Grunt","email":"tom@degrunt.nl"},"repository":{"type":"git","url":"git://github.com/tdegrunt/bitset.git"},"_attachments":{"bitset-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ezPp8j0XVe+y9Ghj1rKFEA==","length":10240,"stub":true},"bitset-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-z+AYF3kbZ0RdSgF2EfvL8w==","length":10240,"stub":true},"bitset-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-AZb5AOvkFvsI+Qos08jz3Q==","length":10240,"stub":true}}}},
{"id":"bitstream","key":"bitstream","value":{"rev":"3-22b920946f15c5dde2c774650c138cd3"},"doc":{"_id":"bitstream","_rev":"3-22b920946f15c5dde2c774650c138cd3","name":"bitstream","description":"Stream bits without aligning them to byte boundaries","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bitstream","version":"0.0.1","description":"Stream bits without aligning them to byte boundaries","author":{"name":"Konstantin Käfer","email":"github@kkaefer.com"},"main":"./bitstream","devDependencies":{"mocha":"~1.0.3"},"scripts":{"test":"mocha -R spec"},"_npmUser":{"name":"kkaefer","email":"kkaefer@gmail.com"},"_id":"bitstream@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fdfbbc2fadd211835630331781ff8797f059478b","tarball":"http://registry.npmjs.org/bitstream/-/bitstream-0.0.1.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"}]}},"readme":"# Bitstream\n\nStream bits without aligning them to a byte boundary.\n\n# Usage\n\n```js\nvar bs = new Bitstream;\nbs.pipe(target);\n\n// Adds 1111111 (seven) bits (the first seven on 0xFF);\nbs.addBits(new Buffer([ 0xFF ]), 7);\n\n// Adds 10010 (five) bits\nbs.addBits(new Buffer([ 0xD2 ]), 4);\n\n// Adds 11111111 (8) bits (directly after the eleven previous bits)\nbs.addByte(255);\n\n// Aligns the stream to an 4 byte boundary (inserting zeros).\nbs.align(4);\n\n// Flush cached input (except for the last partial byte, if any)\nbs.flush();\n\n// Finish stream (flushes implicitly)\nbs.end();\n\n// Final output of the stream: 01111111 11111001 00001111 00000000\n```\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"}],"time":{"modified":"2012-06-01T09:28:18.751Z","created":"2012-06-01T09:28:17.131Z","0.0.1":"2012-06-01T09:28:18.751Z"},"author":{"name":"Konstantin Käfer","email":"github@kkaefer.com"},"_attachments":{"bitstream-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Tyq2tKjU6JmFN91eNbItRA==","length":2814,"stub":true}}}},
{"id":"bitstring","key":"bitstring","value":{"rev":"3-200695b942bff0e5dd5035b29c01f9b7"},"doc":{"_id":"bitstring","_rev":"3-200695b942bff0e5dd5035b29c01f9b7","name":"bitstring","description":"Read/write packed binary strings bit-by-bit","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bitstring","version":"1.0.0","description":"Read/write packed binary strings bit-by-bit","homepage":"https://github.com/dsc/bitstring.js","keywords":["bitstring","binary","buffer","util","server","client","browser"],"author":{"name":"David Schoonover","email":"dsc@less.ly","url":"http://less.ly"},"main":"./bitstring","devDependencies":{"coco":">= 0.7.0"},"repository":{"type":"git","url":"git://github.com/dsc/bitstring.js.git"},"bugs":{"url":"https://github.com/dsc/bitstring.js/issues"},"engine":{"node":">=0.6.x"},"license":"MIT","readme":"# BitString.js\n\nA class to read and write packed binary strings, bit-by-bit.\n\n```js\nvar BitString = require('bitstring');\n\nvar bits = new BitString();\nbits.writebits(4)\n    .writebits(255)\n    .writebits(1,4)\n    .writebits(8)\n\nbits.number()       == 10478336\nbits.hex()          == '9fe30'\nbits.bin()          == '10011111111000110'\nbits.bytearray() // == [ 159, 227, 0 ]\n```\n\n\n## Usage\n\nOn the server, install it:\n\n```sh\nnpm install bitstring\n```\n\nAnd then just require it:\n\n```js\nvar BitString = require('bitstring');\n```\n\nIn the browser, you have a number of options. You can download this package and include `bitstring.js` somewhere, which will add itself as a global, `window.BitString`. Alternatively, if you're using something like [require.js][require_js] to wrap your modules, BitString will check for the `module` variable and properly set itself as `module.exports`.\n\n\n## API\n\n### BitString( source='', buf=[] )\n\nCreate a new BitString buffer. Optionally takes source data as a String, and/or an Array to use as the byte-buffer.\n\n#### .size() -> Number\n\nThe size in bytes of the BitString.\n\n\n#### .bitsize() -> Number\n\nThe size in bits of the BitString.\n\n\n#### .writebits(n, [size]) -> this\n\nWrites the bits `n` to the stream (bits must be supplied as a number). Supplying `n=0` will write one bit. Supplying the optional parameter `size` treats the bits as a field with the given length.\n\n\n#### .flush() -> this\n\nFlushes any pending bits to the stream.\n\n\n#### .truncate() -> this\n\nTruncates the stream to zero bits.\n\n\n#### .seek(n, mode=SEEK_ABSOLUTE) -> this\n\nFlushes the bit-buffer and moves to the given byte-offset. Mode Constants:\n\n```js\nBitString.SEEK_ABSOLUTE = 0\nBitString.SEEK_RELATIVE = 1\nBitString.SEEK_FROM_EOF = 2\n```\n\n\n#### .tell() -> Number\n\nReturns the current position of the cursor as a *byte* offset from the start of the stream.\n\n#### .readbits(n) -> String\n\nReads the next `n` bits from the stream.\n\n\n#### .peek(n) -> String\n\nReads the next `n` bits without moving the cursor.\n\n\n#### .hasMore() -> Boolean\n\nTrue if there is more data to read.\n\n\n#### .each(fn, cxt=this) -> this\n\nIterates over the bytes in the BitString.\n\n\n#### .map(fn, cxt=this) -> Array\n\nAs `Array.map`, but over the bytes in the BitString.\n\n\n#### .reduce(fn, acc, cxt=this)\n\nAs `Array.reduce`, but over the bytes in the BitString.\n\n\n#### .bytearray() -> Array\n\nReturns the stream as an Array of bytes.\n\n\n#### .bin(byte_sep='') -> String\n\nDumps the stream as a binary string. Unlike `.number()`, `.bin()` will not cause int overflow.\n\n\n#### .hex() -> String\n\nReturns the stream as a hex string.\n\n\n#### .number() -> Number\n\nReturns the buffer as a number. Use this with obvious caution.\n\n\n#### .dump() -> String\n\nDumps the stream as a string of UTF8 characters; does not flush or change cursor position.\n\n\n#### .repr(dump_buf=true) -> String\n\nString representation of the data-structure; if `dump_buf` is true, the contents of the stream will be included, but it will not flush or change cursor position.\n\n\n#### .toString() -> String\n\nDumps the stream as a string; flushes the bit-buffer but leaves cursor position unchanged.\n\n\n\n## License\n\nMIT: http://dsc.mit-license.org/\n","_id":"bitstring@1.0.0","dist":{"shasum":"87ec1c676c5c88c9d0fff5d142f12126bd38daa7","tarball":"http://registry.npmjs.org/bitstring/-/bitstring-1.0.0.tgz"},"maintainers":[{"name":"dsc","email":"dsc@less.ly"}]}},"readme":"# BitString.js\n\nA class to read and write packed binary strings, bit-by-bit.\n\n```js\nvar BitString = require('bitstring');\n\nvar bits = new BitString();\nbits.writebits(4)\n    .writebits(255)\n    .writebits(1,4)\n    .writebits(8)\n\nbits.number()       == 10478336\nbits.hex()          == '9fe30'\nbits.bin()          == '10011111111000110'\nbits.bytearray() // == [ 159, 227, 0 ]\n```\n\n\n## Usage\n\nOn the server, install it:\n\n```sh\nnpm install bitstring\n```\n\nAnd then just require it:\n\n```js\nvar BitString = require('bitstring');\n```\n\nIn the browser, you have a number of options. You can download this package and include `bitstring.js` somewhere, which will add itself as a global, `window.BitString`. Alternatively, if you're using something like [require.js][require_js] to wrap your modules, BitString will check for the `module` variable and properly set itself as `module.exports`.\n\n\n## API\n\n### BitString( source='', buf=[] )\n\nCreate a new BitString buffer. Optionally takes source data as a String, and/or an Array to use as the byte-buffer.\n\n#### .size() -> Number\n\nThe size in bytes of the BitString.\n\n\n#### .bitsize() -> Number\n\nThe size in bits of the BitString.\n\n\n#### .writebits(n, [size]) -> this\n\nWrites the bits `n` to the stream (bits must be supplied as a number). Supplying `n=0` will write one bit. Supplying the optional parameter `size` treats the bits as a field with the given length.\n\n\n#### .flush() -> this\n\nFlushes any pending bits to the stream.\n\n\n#### .truncate() -> this\n\nTruncates the stream to zero bits.\n\n\n#### .seek(n, mode=SEEK_ABSOLUTE) -> this\n\nFlushes the bit-buffer and moves to the given byte-offset. Mode Constants:\n\n```js\nBitString.SEEK_ABSOLUTE = 0\nBitString.SEEK_RELATIVE = 1\nBitString.SEEK_FROM_EOF = 2\n```\n\n\n#### .tell() -> Number\n\nReturns the current position of the cursor as a *byte* offset from the start of the stream.\n\n#### .readbits(n) -> String\n\nReads the next `n` bits from the stream.\n\n\n#### .peek(n) -> String\n\nReads the next `n` bits without moving the cursor.\n\n\n#### .hasMore() -> Boolean\n\nTrue if there is more data to read.\n\n\n#### .each(fn, cxt=this) -> this\n\nIterates over the bytes in the BitString.\n\n\n#### .map(fn, cxt=this) -> Array\n\nAs `Array.map`, but over the bytes in the BitString.\n\n\n#### .reduce(fn, acc, cxt=this)\n\nAs `Array.reduce`, but over the bytes in the BitString.\n\n\n#### .bytearray() -> Array\n\nReturns the stream as an Array of bytes.\n\n\n#### .bin(byte_sep='') -> String\n\nDumps the stream as a binary string. Unlike `.number()`, `.bin()` will not cause int overflow.\n\n\n#### .hex() -> String\n\nReturns the stream as a hex string.\n\n\n#### .number() -> Number\n\nReturns the buffer as a number. Use this with obvious caution.\n\n\n#### .dump() -> String\n\nDumps the stream as a string of UTF8 characters; does not flush or change cursor position.\n\n\n#### .repr(dump_buf=true) -> String\n\nString representation of the data-structure; if `dump_buf` is true, the contents of the stream will be included, but it will not flush or change cursor position.\n\n\n#### .toString() -> String\n\nDumps the stream as a string; flushes the bit-buffer but leaves cursor position unchanged.\n\n\n\n## License\n\nMIT: http://dsc.mit-license.org/\n","maintainers":[{"name":"dsc","email":"dsc@less.ly"}],"time":{"modified":"2012-07-17T20:44:19.769Z","created":"2012-07-17T20:44:18.411Z","1.0.0":"2012-07-17T20:44:19.769Z"},"author":{"name":"David Schoonover","email":"dsc@less.ly","url":"http://less.ly"},"repository":{"type":"git","url":"git://github.com/dsc/bitstring.js.git"},"_attachments":{"bitstring-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HY++G1pgCO9v8fFaARFqIQ==","length":5223,"stub":true}}}},
{"id":"bitsyntax","key":"bitsyntax","value":{"rev":"3-073dbfa1fcd124a01dba2d45c3f396d2"},"doc":{"_id":"bitsyntax","_rev":"3-073dbfa1fcd124a01dba2d45c3f396d2","name":"bitsyntax","description":"Pattern-matching on byte buffers","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Michael Bridgen","email":"mikeb@squaremobius.net"},"name":"bitsyntax","description":"Pattern-matching on byte buffers","version":"0.0.1","repository":{"type":"git","url":"git://github.com/squaremo/bitsyntax-js.git"},"main":"./index","scripts":{"test":"make test"},"engines":{"node":">0.4"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"squaremo","email":"mikeb@squaremobius.net"},"_id":"bitsyntax@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"b335c995172856953a73cfacbde01b2f01ae958f","tarball":"http://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.1.tgz"},"maintainers":[{"name":"squaremo","email":"mikeb@squaremobius.net"}]}},"readme":"# Byte-wise matching for Node.JS\n\nGives a compact syntax for parsing binary data, derived from [Erlang's\nbit syntax](http://www.erlang.org/doc/programming_examples/bit_syntax.html#id64858).\n\n    var bitsyntax = require('bitsyntax');\n    var pattern = bitsyntax.compile('len:8/integer, string:len/binary');\n    var bound = pattern(new Buffer([4, 0x41, 0x42, 0x43, 0x44]));\n    bound.string\n    // => <Buffer 41 42 43 44>\n\nA typical use of this is parsing byte streams from sockets. For\nexample, size-prefixed frames:\n\n    var framePattern = bitsyntax.compile('len:32/integer, frame:len/binary, rest/binary');\n    socket.on('data', function process(data) {\n      var m;\n      if (m = framePattern(data)) {\n        emit('frame', m.frame);\n        process(m.rest);\n      }\n      else {\n        stashForNextData(data);\n      }\n    });\n\n## API\n\n### `compile`\n\nCompiles a pattern given as a string to a function that will return\neither a map of bindings, or `false`, given a buffer and optionally an\nenvironment. The environment contains values for the bound variables\nin the pattern (if there are any).\n\n    var p = bitsyntax.compile('header:headerSize/binary, rest/binary');\n    var b = p(new Buffer([1, 2, 3, 4, 5]), {headerSize: 3});\n    b.header\n    // => <Buffer 01 02 03>\n\n### `parse` and `match`\n\nIn combination, equivalent to compile; may be useful if you want to\nexamine the internal structure of patterns.\n\n    var p = bitsyntax.parse('header:headerSize/binary, rest/binary');\n    var b = bitsyntax.match(p, new Buffer([1, 2, 3, 4, 5]),\n                              {headerSize: 3});\n    b.header\n    // => <Buffer 01 02 03>\n\n## Patterns\n\nPatterns are sequences of segments, each matching a value. Segments\nhave the general form\n\n     value:size/type_specifier_list\n\nThe size and type specifier list may be omitted, giving three extra\nvariations:\n\n    value\n    value:size\n    value/type_specifier_list\n\nThe type specifier list is a list of keywords separated by\nhyphens. Type specifiers are described below.\n\nPatterns are generally supplied as strings, with a comma-separated\nseries of segments.\n\n### Variable or value\n\nThe first part of a segment gives a variable name or a literal\nvalue. If a variable name is given, the value matched by the segment\nwill be bound to that variable name for the rest of the pattern. If a\nliteral value is given, the matched value must equal that value.\n\nThe special variable name `_` discards the value matched; i.e., it\nsimply skips over the appropriate number of bits in the input.\n\n### Size and unit\n\nThe size of a segment is given following the value or variable,\nseparated with a colon:\n\n    foo:32\n\nThe unit is given in the list of specifiers as `'unit' and\nan integer from 0..256, separated by a colon:\n\n    foo:4/integer-unit:8\n\nThe size is the number of units in the value; the unit is given as a\nnumber of bits. Unit can be of use, for example, when you want to\nmatch integers of a number of bytes rather than a number of bits.\n\nFor integers and floats, the default unit is 1 bit; to keep things\naligned on byte boundaries, `unit * size` must currently be a multiple\nof 8. For binaries the default unit is 8, and the unit must be a\nmultiple of 8.\n\nIf the size is omitted and the type is integer, the size defaults to\n8. If the size is omitted and the type is binary, the segment will\nmatch all remaining bytes in the input; such a segment may only be\nused at the end of a pattern.\n\nThe size may also be given as an integer variable matched earlier in\nthe pattern, as in the example given at the top.\n\n### Type name specifier\n\nOne of `integer`, `binary`, `float`. If not given, the default is\n`integer`.\n\nAn integer is a big- or little-endian, signed or unsigned\ninteger. Integers up to 32 bits are supported. Signed integers are\ntwo's complement format. In JavaScript, only integers between -(2^53)\nand 2^53 can be represented, and bitwise operators are only defined on\n32-bit signed integers.\n\nA binary is simply a byte buffer; usually this will result in a slice\nof the input buffer being returned, so beware mutation.\n\nA float is a 32- or 64-bit IEEE754 floating-point value (this is the\nstandard JavaScript uses, as do Java and Erlang).\n\n### Endianness specifier\n\nIntegers may be big- or little-endian; this refers to which 'end' of\nthe bytes making up the integer are most significant. In network\nprotocols integers are usually big-endian, meaning the first\n(left-most) byte is the most significant, but this is not always the\ncase.\n\nA specifier of `big` means the integer will be parsed as big-endian,\nand `little` means the integer will be parsed as little-endian. The\ndefault is big-endian.\n\n### Signedness specifier\n\nInteger segments may include a specifier of `signed` or `unsigned`. A\nsigned integer is parsed as two's complement format. The default is\nunsigned.\n\n## Examples\n\nIn the following the matched bytes are given in array notation for\nconvenience. Bear in mind that `match()` actually takes a buffer for\nthe bytes to match against. The phrase \"returns X as Y\" or \"binds X as\nY\" means the return value is an object with value X mapped to the key\nY.\n\n    54\n\nMatches the single byte `54`.\n\n    54:32\n\nMatches the bytes [0,0,0,54].\n\n    54:32/little\n\nMatches the bytes [54,0,0,0].\n\n    54:4/unit:8\n\nMatches the bytes [0,0,0,54].\n\n    int:32/signed\n\nMatches a binary of four bytes, and returns a signed 32-bit integer as\n`int`.\n\n    len:16, str:len/binary\n\nMatches a binary of `2 + len` bytes, and returns an unsigned 16-bit\ninteger as `len` and a buffer of length `len` as `str`.\n\n    len:16, _:len/binary, rest/binary\n\nMatches a binary of at least `2 + len` bytes, binds an unsigned 16-bit\ninteger as `len`, ignores the next `len` bytes, and binds the\nremaining (possibly zero-length) binary as `rest`.\n","maintainers":[{"name":"squaremo","email":"mikeb@squaremobius.net"}],"time":{"modified":"2012-02-27T13:53:46.222Z","created":"2012-02-27T13:53:44.782Z","0.0.1":"2012-02-27T13:53:46.222Z"},"author":{"name":"Michael Bridgen","email":"mikeb@squaremobius.net"},"repository":{"type":"git","url":"git://github.com/squaremo/bitsyntax-js.git"},"_attachments":{"bitsyntax-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-K9aei5IW43QR0z7xL/5mWQ==","length":8559,"stub":true}}}},
{"id":"bittorrent","key":"bittorrent","value":{"rev":"3-9afdfc691c57a73ba1c4bb7d745b8e32"},"doc":{"_id":"bittorrent","_rev":"3-9afdfc691c57a73ba1c4bb7d745b8e32","name":"bittorrent","description":"BitTorrent peer implementation","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bittorrent","version":"0.0.1","description":"BitTorrent peer implementation","author":{"name":"Conrad Pankoff","email":"deoxxa@fknsrs.biz","url":"http://www.fknsrs.biz/"},"license":"BSD","main":"./bittorrent.js","repository":{"type":"git","url":"git://github.com/deoxxa/bittorrent.js.git"},"dependencies":{"binary":"~0.3.0"},"devDependencies":{"vows":"~0.6.3"},"readme":"bittorrent.js\n=============\n\nBitTorrent in JavaScript. What more is there to say?\n\nOverview\n--------\n\nThis library enables one to implement a BitTorrent application easily by hooking\ninto the client logic at any level.\n\n**NOTE**: This library is *far* from finished! Only some very basic features are\nin place right now.\n\nInstallation\n------------\n\nHere's a link to the [npm](https://npmjs.org/package/bittorrent) page. \n\n> npm install bittorrent\n\nUsage\n-----\n\nTake a look at [demo.js](demo.js) for now.\n\nLicense\n-------\n\n3-clause BSD. A copy is included with the source.\n\nContact\n-------\n\n* GitHub ([http://github.com/deoxxa](deoxxa))\n* Twitter ([http://twitter.com/deoxxa](@deoxxa))\n* Email ([mailto:deoxxa@fknsrs.biz](deoxxa@fknsrs.biz))\n","_id":"bittorrent@0.0.1","dist":{"shasum":"0612ddfe2ee9c87af48164f91dafd0a0c871ac1e","tarball":"http://registry.npmjs.org/bittorrent/-/bittorrent-0.0.1.tgz"},"maintainers":[{"name":"deoxxa","email":"deoxxa@fknsrs.biz"}]}},"readme":"bittorrent.js\n=============\n\nBitTorrent in JavaScript. What more is there to say?\n\nOverview\n--------\n\nThis library enables one to implement a BitTorrent application easily by hooking\ninto the client logic at any level.\n\n**NOTE**: This library is *far* from finished! Only some very basic features are\nin place right now.\n\nInstallation\n------------\n\nHere's a link to the [npm](https://npmjs.org/package/bittorrent) page. \n\n> npm install bittorrent\n\nUsage\n-----\n\nTake a look at [demo.js](demo.js) for now.\n\nLicense\n-------\n\n3-clause BSD. A copy is included with the source.\n\nContact\n-------\n\n* GitHub ([http://github.com/deoxxa](deoxxa))\n* Twitter ([http://twitter.com/deoxxa](@deoxxa))\n* Email ([mailto:deoxxa@fknsrs.biz](deoxxa@fknsrs.biz))\n","maintainers":[{"name":"deoxxa","email":"deoxxa@fknsrs.biz"}],"time":{"modified":"2012-08-10T13:36:56.362Z","created":"2012-08-10T13:36:31.750Z","0.0.1":"2012-08-10T13:36:56.362Z"},"author":{"name":"Conrad Pankoff","email":"deoxxa@fknsrs.biz","url":"http://www.fknsrs.biz/"},"repository":{"type":"git","url":"git://github.com/deoxxa/bittorrent.js.git"},"_attachments":{"bittorrent-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-K3TYHJc6Az55lFbSYYvnwQ==","length":9658,"stub":true}}}},
{"id":"bitwriter","key":"bitwriter","value":{"rev":"11-54d2dea5fffedb3f282d2d93b89277b4"},"doc":{"_id":"bitwriter","_rev":"11-54d2dea5fffedb3f282d2d93b89277b4","name":"bitwriter","description":"A better interface for writing bytes to Buffers","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.0":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitwriter","description":"A better interface for writing bytes to Buffers","version":"0.0.0","homepage":"https://github.com/brianloveswords/bitwriter","repository":{"type":"git","url":"git://github.com/brianloveswords/bitwriter.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/"},"dependencies":{"errs":"git://github.com/brianloveswords/errs.git#d1756bbf93706ab6a56334e59f7b3e39b31730bb"},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brianloveswords","email":"brian@nyhacker.org"},"_id":"bitwriter@0.0.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"4ae525c789e37e5e2bc73dd69ee5aca8b6fc15b1","tarball":"http://registry.npmjs.org/bitwriter/-/bitwriter-0.0.0.tgz"},"readme":"","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]},"0.0.1":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitwriter","description":"A better interface for writing bytes to Buffers","version":"0.0.1","homepage":"https://github.com/brianloveswords/bitwriter","repository":{"type":"git","url":"git://github.com/brianloveswords/bitwriter.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/"},"dependencies":{"errs":"git://github.com/brianloveswords/errs.git#d1756bbf93706ab6a56334e59f7b3e39b31730bb"},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brianloveswords","email":"brian@nyhacker.org"},"_id":"bitwriter@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"d75b39102ad68e1987f793fb15e49f11097bd7e6","tarball":"http://registry.npmjs.org/bitwriter/-/bitwriter-0.0.1.tgz"},"readme":"# bitwriter\n\nA better interface for writing bytes to a buffer. \n\n# API\n`BitWriter` Inherits from `Buffer`, so you get all of the buffer methods\n(`fill`, `slice`, `copy`, etc) as well.\n\n## BitWriter(*length, [endianness='BE']*)\n\nThe constructor takes one mandatory and one optional argument.\n\n```js\nvar buf = BitWriter(4); \nbuf.inspect(); // <BitWriter 00 00 00 00>\n\n// or if you need a little endian writer\nbuf = BitWriter(4, 'LE');\n```\n\n## BitWriter#write(*data, [opts]*)\n**@returns** `this`<br>\n**@see** `BitWriter#writeInteger`<br>\n**@see** `BitWriter#writeString`<br>\n**@see** `BitWriter#writeRaw`\n***\n\nMake some assumptions and does its best to figure out what type of data you're\nwriting and how large that data is, then delegates to one of the write methods below.\n\n## BitWriter#out()\n**@returns** `{Buffer}`<br>\n\nReturns reference to internal buffer.\n\n\n## BitWriter#writeRaw(*arraylike, [opts]*)\n**@returns** `this`<br>\n**@throws** `TypeError`<br>\n**@throws** `RangeError`<br>\n**@see** `BitWriter#write8`<br>\n**@see** `Buffer#copy`\n***\nTakes an array-like object and iterates through it, writing raw bytes to\nthe buffer.\n\nArrays are type-checked to be byte arrays and range-checked for values between [0, 255]. \n\nDelegates to `Buffer#copy` if given a buffer, which skips type checks\nand is generally way more efficient.\n\n```js\nvar buf = BitWriter(8);\nbuf.write([0xff, 0xdd, 0xaa, 0xbb]); // <BitWriter ff dd aa bb 00 00 00 00>\nbuf.write(Buffer('helo')); // <BitWriter ff dd aa bb 68 65 6c 6f>\n```\n\nIf `opts.safe` is `true`, will skip type checks which is a bit more efficient\nsince it will only iterate over the array once, but can be dangerous\nwith unknown data.\n \nThrows `TypeError` if the array contains any non-numeric values.\n\nThrows `RangeError` if any values are outside the eight bit range.\n\n\n## BitWriter#writeString(*string, [opts]*)\n**@returns** `this`<br>\n**@throws** `OverflowError`\n***\n\nWrites a string to the buffer. By default, a single `0x00` will be added\nafter the string if there is room left in the buffer.\n\n```js\nvar buf = BitWriter(7);\nbuf.write('hey'); // <BitWriter 68 65 79 00 00 00 00>\nbuf.write('sup'); // <BitWriter 68 65 79 00 73 75 70>\n```\n\nIf you don't want to write a null byte, you can pass an `{ null: false }`\n```js\nvar buf = BitWriter(6);\nbuf.write('hey', { null: false }); // <BitWriter 68 65 79 00 00 00 >\nbuf.write('sup'); // <BitWriter 68 65 79 73 75 70>\n```\n\nIf you have a specific amount of bytes you need to fit a string into,\nyou can use `{ size: <int> }`. This will either truncate the string to\nfit, or pad the right side with `0x00`.\n\n```js\nvar buf = BitWriter(4);\nbuf.write('hey this string is way too long!', { size: 4 });\nbuf.inspect(); // <BitWriter 68 65 79 20>\n```\n\nThrows `OverflowError` if there are less than `string.length` bytes left\nin the buffer.\n\n\n## BitWriter#writeInteger(*integer, [opts]*)\n**@returns** `this`<br>\n**@throws** `RangeError`<br>\n**@throws** `OverflowError`<br>\n**@throws** `DispatchError`\n*** \nWrites an integer to the buffer, testing against the maximum and minimum\nvalues 8, 16 and 32 bit numbers, both signed and unsigned, to figure out\nhow best to store your bytes.\n\n**Unsigned integers**\n```js\nvar buf = BitWriter(8);\nbuf.write(128); //<BitWriter 80 00 00 00 00 00 00 00>\n```\n\n**Signed integers**\n```js\nbuf.write(-1); // <BitWriter 80 ff 00 00 00 00 00 00>\n```\n\n**16 bits**\n```js\nbuf.write(61453); // <BitWriter 80 ff f0 0d 00 00 00 00>\n```\n\n**32 bits**\n```js\nbuf.write(262254561); // <BitWriter 80 ff f0 0d 0f a1 af e1>\n```\nIf you have a number that fits in 8 bytes but you need to store it in a larger\nsize, you can specify that:\n\n```js\nvar buf = BitWriter(4);\nbuf.write(-128, { size: 32 }); // <BitWriter ff ff ff 80>\n```\n\nThrows `RangeError` an invalid `size` option is given. Valid sizes can\nbe found in the constant `BitWriter.INT_SIZES` (currently\n`[8, 16, 32]`).\n\nThrows `RangeError` if the value is less than the minimum value of a\n32 bit signed integer or the maximum value of a 32 bit unsigned\ninteger. These values can be found in `BitWriter.MAX_VALUE` and\n`BitWriter.MIN_VALUE`\n\nThrows `OverflowError` when attempting to write more bytes than are\navailable in the buffer.\n\nThrows `DispatchError` if it can't figure out what to do with a value.\n\n\n## BitWriter#write8(*integer*)\nConvenience for `BitWriter#write(integer, { size: 8 })`\n\n## BitWriter#write16(*integer*)\nConvenience for `BitWriter#write(integer, { size: 16 })`\n\n## BitWriter#write32(*integer*)\nConvenience for `BitWriter#write(integer, { size: 32 })`\n\n## BitWriter[*length-1*], BitWriter[*length-1*] = [-128, 255]\n**@returns** `{Integer[0,255] | Undefined}`<br>\n**@throws** `RangeError`\n*** \n \nExactly like array accessing a `Buffer` with one difference: this will\nthrow `RangeError` if the value is less than -128 or greater than 255\n\nAccessing a position < 0 or > `length - 1` will return undefined.\n\n\n## BitWriter#reset()\n**@returns** `this`.\n***\n \nResets the internal cursor to position 0 and fills the buffer with `0x00`.\n\n\n\n## BitWriter#position()\n**@returns** `{Integer}`\n*** \n \n Returns the position of the internal cursor\n\n\n## BitWriter#position(*integer*)\n**@returns** `this` <br>\n**@throws** `RangeError`<br>\n**@throws** `TypeError`\n*** \n \nSets the position of the internal cursor. Value be between [0, length-1]\n\nThrows `RangeError` if position is out of bounds.\n\nThrows `TypeError` if input is not a number.\n\n## BitWriter#move(*integer*)\n**@returns** `this` <br>\n**@see** `BitWriter#position`\n\nMove the cursor a relative amount from where it is. Uses `BitWriter#position` internally.\n\n```js\nvar buf = BitWriter(4);\nbuf.write(0x3d);\nbuf.position(); // 1\nbuf.move(-1);\nbuf.position(); // 0\nbuf.move(+3)\nbuf.position(); // 3\n\nbuf.move(+10); // throw RangeError\n```\n\n## BitWriter#attach(*object, [key]*)\n**@returns** `object` <br>\n***\n\nThis attachs hard `this`-bound versions of the `write*` methods  to another object.\n\n```js\nvar meta = BitWriter(16).attach({\n  name: 'SomeThing',\n  widgets: [],\n}, 'data');\n\nmeta.write('widget co');\nmeta.write32(0xff);\nmeta.data.inspect(); // <BitWriter 77 69 64 67 65 74 20 63 6f 00 00 00 ff 00 00 00>\n```\n","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]},"0.0.2":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitwriter","description":"A better interface for writing bytes to Buffers","version":"0.0.2","homepage":"https://github.com/brianloveswords/bitwriter","repository":{"type":"git","url":"git://github.com/brianloveswords/bitwriter.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/*.test.js"},"dependencies":{"errs":"git://github.com/brianloveswords/errs.git#d1756bbf93706ab6a56334e59f7b3e39b31730bb"},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brianloveswords","email":"brian@nyhacker.org"},"_id":"bitwriter@0.0.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"c87d357bf80618f55e6825e806ea3c6164ed3958","tarball":"http://registry.npmjs.org/bitwriter/-/bitwriter-0.0.2.tgz"},"readme":"# bitwriter [![Build Status](https://secure.travis-ci.org/brianloveswords/bitwriter.png?branch=master)](http://travis-ci.org/brianloveswords/bitwriter)\n\nA better interface for writing bytes to a buffer with a priority on safety.\n\n## Install\n\n```bash\n$ npm install bitwriter\n```\n\n## Tests\n\n```bash\n$ npm test\n```\n\n## Usage\n\n```js\nvar BitWriter = require('bitwriter');\n```\n\n# API\n`BitWriter` Inherits from `Buffer`, so you get all of the buffer methods\n(`fill`, `slice`, `copy`, etc) as well. You can also use `Buffer.concat`\nwith instances.\n\n## BitWriter(*length, [endianness='BE']*)\n\nThe constructor takes one mandatory and one optional argument.\n\n```js\nvar buf = BitWriter(4); \nbuf.inspect(); // <BitWriter 00 00 00 00>\n\n// or if you need a little endian writer\nbuf = BitWriter(4, 'LE');\n```\n\n## BitWriter#write(*data, [opts]*)\n**@returns** `this`<br>\n**@see** `BitWriter#writeInteger`<br>\n**@see** `BitWriter#writeString`<br>\n**@see** `BitWriter#writeRaw`\n***\n\nMake some assumptions and does its best to figure out what type of data you're\nwriting and how large that data is, then delegates to one of the write methods below.\n\n## BitWriter#out()\n**@returns** `{Buffer}`<br>\n\nReturns reference to internal buffer.\n\n\n## BitWriter#writeRaw(*arraylike, [opts]*)\n**@returns** `this`<br>\n**@throws** `TypeError`<br>\n**@throws** `RangeError`<br>\n**@see** `BitWriter#write8`<br>\n**@see** `Buffer#copy`\n***\nTakes an array-like object and iterates through it, writing raw bytes to\nthe buffer.\n\nArrays are type-checked to be byte arrays and range-checked for values between [0, 255]. \n\nDelegates to `Buffer#copy` if given a buffer, which skips type checks\nand is generally way more efficient.\n\n```js\nvar buf = BitWriter(8);\nbuf.write([0xff, 0xdd, 0xaa, 0xbb]); // <BitWriter ff dd aa bb 00 00 00 00>\nbuf.write(Buffer('helo')); // <BitWriter ff dd aa bb 68 65 6c 6f>\n```\n\nIf `opts.safe` is `true`, will skip type checks which is a bit more efficient\nsince it will only iterate over the array once, but can be dangerous\nwith unknown data.\n \nThrows `TypeError` if the array contains any non-numeric values.\n\nThrows `RangeError` if any values are outside the eight bit range.\n\n\n## BitWriter#writeString(*string, [opts]*)\n**@returns** `this`<br>\n**@throws** `OverflowError`\n***\n\nWrites a string to the buffer. By default, a single `0x00` will be added\nafter the string if there is room left in the buffer.\n\n```js\nvar buf = BitWriter(7);\nbuf.write('hey'); // <BitWriter 68 65 79 00 00 00 00>\nbuf.write('sup'); // <BitWriter 68 65 79 00 73 75 70>\n```\n\nIf you don't want to write a null byte, you can pass an `{ null: false }`\n```js\nvar buf = BitWriter(6);\nbuf.write('hey', { null: false }); // <BitWriter 68 65 79 00 00 00 >\nbuf.write('sup'); // <BitWriter 68 65 79 73 75 70>\n```\n\nIf you have a specific amount of bytes you need to fit a string into,\nyou can use `{ size: <int> }`. This will either truncate the string to\nfit, or pad the right side with `0x00`.\n\n```js\nvar buf = BitWriter(4);\nbuf.write('hey this string is way too long!', { size: 4 });\nbuf.inspect(); // <BitWriter 68 65 79 20>\n```\n\nThrows `OverflowError` if there are less than `string.length` bytes left\nin the buffer.\n\n\n## BitWriter#writeInteger(*integer, [opts]*)\n**@returns** `this`<br>\n**@throws** `RangeError`<br>\n**@throws** `OverflowError`<br>\n**@throws** `DispatchError`\n*** \nWrites an integer to the buffer, testing against the maximum and minimum\nvalues 8, 16 and 32 bit numbers, both signed and unsigned, to figure out\nhow best to store your bytes.\n\n**Unsigned integers**\n```js\nvar buf = BitWriter(8);\nbuf.write(128); //<BitWriter 80 00 00 00 00 00 00 00>\n```\n\n**Signed integers**\n```js\nbuf.write(-1); // <BitWriter 80 ff 00 00 00 00 00 00>\n```\n\n**16 bits**\n```js\nbuf.write(61453); // <BitWriter 80 ff f0 0d 00 00 00 00>\n```\n\n**32 bits**\n```js\nbuf.write(262254561); // <BitWriter 80 ff f0 0d 0f a1 af e1>\n```\nIf you have a number that fits in 8 bytes but you need to store it in a larger\nsize, you can specify that:\n\n```js\nvar buf = BitWriter(4);\nbuf.write(-128, { size: 32 }); // <BitWriter ff ff ff 80>\n```\n\nThrows `RangeError` an invalid `size` option is given. Valid sizes can\nbe found in the constant `BitWriter.INT_SIZES` (currently\n`[8, 16, 32]`).\n\nThrows `RangeError` if the value is less than the minimum value of a\n32 bit signed integer or the maximum value of a 32 bit unsigned\ninteger. These values can be found in `BitWriter.MAX_VALUE` and\n`BitWriter.MIN_VALUE`\n\nThrows `OverflowError` when attempting to write more bytes than are\navailable in the buffer.\n\nThrows `DispatchError` if it can't figure out what to do with a value.\n\n\n## BitWriter#write8(*integer*)\nConvenience for `BitWriter#write(integer, { size: 8 })`\n\n## BitWriter#write16(*integer*)\nConvenience for `BitWriter#write(integer, { size: 16 })`\n\n## BitWriter#write32(*integer*)\nConvenience for `BitWriter#write(integer, { size: 32 })`\n\n## BitWriter[*length-1*], BitWriter[*length-1*] = [-128, 255]\n**@returns** `{Integer[0,255] | Undefined}`<br>\n**@throws** `RangeError`\n*** \n \nExactly like array accessing a `Buffer` with one difference: this will\nthrow `RangeError` if the value is less than -128 or greater than 255\n\nAccessing a position < 0 or > `length - 1` will return undefined.\n\n\n## BitWriter#reset()\n**@returns** `this`.\n***\n \nResets the internal cursor to position 0 and fills the buffer with `0x00`.\n\n\n\n## BitWriter#position()\n**@returns** `{Integer}`\n*** \n \n Returns the position of the internal cursor\n\n\n## BitWriter#position(*integer*)\n**@returns** `this` <br>\n**@throws** `RangeError`<br>\n**@throws** `TypeError`\n*** \n \nSets the position of the internal cursor. Value be between [0, length-1]\n\nThrows `RangeError` if position is out of bounds.\n\nThrows `TypeError` if input is not a number.\n\n## BitWriter#move(*integer*)\n**@returns** `this` <br>\n**@see** `BitWriter#position`\n\nMove the cursor a relative amount from where it is. Uses `BitWriter#position` internally.\n\n```js\nvar buf = BitWriter(4);\nbuf.write(0x3d);\nbuf.position(); // 1\nbuf.move(-1);\nbuf.position(); // 0\nbuf.move(+3)\nbuf.position(); // 3\n\nbuf.move(+10); // throw RangeError\n```\n\n## BitWriter#attach(*object, [key]*)\n**@returns** `object` <br>\n***\n\nThis attachs hard `this`-bound versions of the `write*` methods  to another object.\n\n```js\nvar meta = BitWriter(16).attach({\n  name: 'SomeThing',\n  widgets: [],\n}, 'data');\n\nmeta.write('widget co');\nmeta.write32(0xff);\nmeta.data.inspect(); // <BitWriter 77 69 64 67 65 74 20 63 6f 00 00 00 ff 00 00 00>\n```\n","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]},"0.0.3":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitwriter","description":"A better interface for writing bytes to Buffers","version":"0.0.3","homepage":"https://github.com/brianloveswords/bitwriter","repository":{"type":"git","url":"git://github.com/brianloveswords/bitwriter.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/*.test.js"},"dependencies":{"errs":"git://github.com/brianloveswords/errs.git#d1756bbf93706ab6a56334e59f7b3e39b31730bb"},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# bitwriter [![Build Status](https://secure.travis-ci.org/brianloveswords/bitwriter.png?branch=master)](http://travis-ci.org/brianloveswords/bitwriter)\n\nA better interface for writing bytes to a buffer with a priority on safety.\n\n## Install\n\n```bash\n$ npm install bitwriter\n```\n\n## Tests\n\n```bash\n$ npm test\n```\n\n## Usage\n\n```js\nvar BitWriter = require('bitwriter');\n```\n\n# API\n`BitWriter` Inherits from `Buffer`, so you get all of the buffer methods\n(`fill`, `slice`, `copy`, etc) as well. You can also use `Buffer.concat`\nwith instances.\n\n## BitWriter(*length, [endianness='BE']*)\n\n```js\nvar buf = BitWriter(4); \nbuf.inspect(); // <BitWriter 00 00 00 00>\n\n// or if you need a little endian writer\nbuf = BitWriter(4, 'LE');\n```\n## BitWriter(*array, [endianness='BE']*)\n**@see** `BitWriter#writeInt`<br>\n***\n\nYou can also specify an array of integers or objects representing\nintegers. Uses `BitWriter#writeInt` internally.\n\n```js\nvar buf = BitWriter([ 1, 2, 64738, 23 ]);\nbuf.out(); // <Buffer 01 02 fc e2 17>\n  \nvar obuf = BitWriter([ 1, 2, 64738, { value: 23, width: 16 } ]);\nobuf.out(); // <Buffer 01 02 fc e2 00 17>\n```\n\n## BitWriter#write(*data, [opts]*)\n**@returns** `this`<br>\n**@see** `BitWriter#writeInt`<br>\n**@see** `BitWriter#writeString`<br>\n**@see** `BitWriter#writeRaw`\n***\n\nMake some assumptions and does its best to figure out what type of data you're\nwriting and how large that data is, then delegates to one of the write methods below.\n\n## BitWriter#out()\n**@returns** `{Buffer}`<br>\n\nReturns reference to internal buffer.\n\n\n## BitWriter#writeRaw(*arraylike, [opts]*)\n**@returns** `this`<br>\n**@throws** `TypeError`<br>\n**@throws** `RangeError`<br>\n**@see** `BitWriter#write8`<br>\n**@see** `Buffer#copy`\n***\nTakes an array-like object and iterates through it, writing raw bytes to\nthe buffer.\n\nArrays are type-checked to be byte arrays and range-checked for values between [0, 255]. \n\nDelegates to `Buffer#copy` if given a buffer, which skips type checks\nand is generally way more efficient.\n\n```js\nvar buf = BitWriter(8);\nbuf.write([0xff, 0xdd, 0xaa, 0xbb]); // <BitWriter ff dd aa bb 00 00 00 00>\nbuf.write(Buffer('helo')); // <BitWriter ff dd aa bb 68 65 6c 6f>\n```\n\nIf `opts.safe` is `true`, will skip type checks which is a bit more efficient\nsince it will only iterate over the array once, but can be dangerous\nwith unknown data.\n \nThrows `TypeError` if the array contains any non-numeric values.\n\nThrows `RangeError` if any values are outside the eight bit range.\n\n\n## BitWriter#writeString(*string, [opts]*)\n**@returns** `this`<br>\n**@throws** `OverflowError`\n***\n\nWrites a string to the buffer. By default, a single `0x00` will be added\nafter the string if there is room left in the buffer.\n\n```js\nvar buf = BitWriter(7);\nbuf.write('hey'); // <BitWriter 68 65 79 00 00 00 00>\nbuf.write('sup'); // <BitWriter 68 65 79 00 73 75 70>\n```\n\nIf you don't want to write a null byte, you can pass an `{ null: false }`\n```js\nvar buf = BitWriter(6);\nbuf.write('hey', { null: false }); // <BitWriter 68 65 79 00 00 00 >\nbuf.write('sup'); // <BitWriter 68 65 79 73 75 70>\n```\n\nIf you have a specific amount of bytes you need to fit a string into,\nyou can use `{ size: <int> }`. This will either truncate the string to\nfit, or pad the right side with `0x00`.\n\n```js\nvar buf = BitWriter(4);\nbuf.write('hey this string is way too long!', { size: 4 });\nbuf.inspect(); // <BitWriter 68 65 79 20>\n```\n\nThrows `OverflowError` if there are less than `string.length` bytes left\nin the buffer.\n\n\n## BitWriter#writeInt(*integer, [opts]*)\n## BitWriter#writeInt(*opts*)\n**@returns** `this`<br>\n**@throws** `RangeError`<br>\n**@throws** `OverflowError`<br>\n**@throws** `DispatchError`\n*** \n### Options\n- `size`: specify integer size\n- `width`: alias for size\n\nWrites an integer to the buffer, testing against the maximum and minimum\nvalues 8, 16 and 32 bit numbers, both signed and unsigned, to figure out\nhow best to store your bytes.\n\nIf a single object is passed, tries to find the integer value from `opts.value`.\n\n**Unsigned integers**\n```js\nvar buf = BitWriter(8);\nbuf.write(128); //<BitWriter 80 00 00 00 00 00 00 00>\n```\n\n**Signed integers**\n```js\nbuf.write(-1); // <BitWriter 80 ff 00 00 00 00 00 00>\n```\n\n**16 bits**\n```js\nbuf.write(61453); // <BitWriter 80 ff f0 0d 00 00 00 00>\n```\n\n**32 bits**\n```js\nbuf.write(262254561); // <BitWriter 80 ff f0 0d 0f a1 af e1>\n```\nIf you have a number that fits in 8 bytes but you need to store it in a larger\nsize, you can specify that:\n\n```js\nvar buf = BitWriter(4);\nbuf.write(-128, { size: 32 }); // <BitWriter ff ff ff 80>\n```\n\nReturns `this` so you can chain a bunch of writes:\n\n```js\nvar output = BitWriter(4);\noutput\n  .write(0x01)\n  .write(0x02)\n  .write(0x03)\n  .write(0x04); // <BitWriter 01 02 03 04>\n```\n\nThrows `RangeError` an invalid `size` option is given. Valid sizes can\nbe found in the constant `BitWriter.INT_SIZES` (currently\n`[8, 16, 32]`).\n\nThrows `RangeError` if the value is less than the minimum value of a\n32 bit signed integer or the maximum value of a 32 bit unsigned\ninteger. These values can be found in `BitWriter.MAX_VALUE` and\n`BitWriter.MIN_VALUE`\n\nThrows `OverflowError` when attempting to write more bytes than are\navailable in the buffer.\n\nThrows `DispatchError` if it can't figure out what to do with a value.\n\n\n## BitWriter#write8(*integer*)\nConvenience for `BitWriter#write(integer, { size: 8 })`\n\n## BitWriter#write16(*integer*)\nConvenience for `BitWriter#write(integer, { size: 16 })`\n\n## BitWriter#write32(*integer*)\nConvenience for `BitWriter#write(integer, { size: 32 })`\n\n## BitWriter[*length-1*], BitWriter[*length-1*] = [-128, 255]\n**@returns** `{Integer[0,255] | Undefined}`<br>\n**@throws** `RangeError`\n*** \n \nExactly like array accessing a `Buffer` with one difference: this will\nthrow `RangeError` if the value is less than -128 or greater than 255\n\nAccessing a position < 0 or > `length - 1` will return undefined.\n\n\n## BitWriter#reset()\n**@returns** `this`.\n***\n \nResets the internal cursor to position 0 and fills the buffer with `0x00`.\n\n\n\n## BitWriter#position()\n**@returns** `{Integer}`\n*** \n \n Returns the position of the internal cursor\n\n\n## BitWriter#position(*integer*)\n**@returns** `this` <br>\n**@throws** `RangeError`<br>\n**@throws** `TypeError`\n*** \n \nSets the position of the internal cursor. Value be between [0, length-1]\n\nThrows `RangeError` if position is out of bounds.\n\nThrows `TypeError` if input is not a number.\n\n## BitWriter#move(*integer*)\n**@returns** `this` <br>\n**@see** `BitWriter#position`\n\nMove the cursor a relative amount from where it is. Uses `BitWriter#position` internally.\n\n```js\nvar buf = BitWriter(4);\nbuf.write(0x3d);\nbuf.position(); // 1\nbuf.move(-1);\nbuf.position(); // 0\nbuf.move(+3)\nbuf.position(); // 3\n\nbuf.move(+10); // throw RangeError\n```\n\n## BitWriter#attach(*object, [key]*)\n**@returns** `object` <br>\n***\n\nThis attachs hard `this`-bound versions of the `write*` methods  to another object.\n\n```js\nvar meta = BitWriter(16).attach({\n  name: 'SomeThing',\n  widgets: [],\n}, 'data');\n\nmeta.write('widget co');\nmeta.write32(0xff);\nmeta.data.inspect(); // <BitWriter 77 69 64 67 65 74 20 63 6f 00 00 00 ff 00 00 00>\n```\n","_id":"bitwriter@0.0.3","dist":{"shasum":"7d761d3efd39c08b7ffc2069522ee71569084718","tarball":"http://registry.npmjs.org/bitwriter/-/bitwriter-0.0.3.tgz"},"maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]},"0.0.4":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"bitwriter","description":"A better interface for writing bytes to Buffers","version":"0.0.4","homepage":"https://github.com/brianloveswords/bitwriter","repository":{"type":"git","url":"git://github.com/brianloveswords/bitwriter.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap test/*.test.js"},"dependencies":{"errs":"git://github.com/brianloveswords/errs.git#d1756bbf93706ab6a56334e59f7b3e39b31730bb"},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"readme":"# bitwriter [![Build Status](https://secure.travis-ci.org/brianloveswords/bitwriter.png?branch=master)](http://travis-ci.org/brianloveswords/bitwriter)\n\nA better interface for writing bytes to a buffer with a priority on safety.\n\n## Install\n\n```bash\n$ npm install bitwriter\n```\n\n## Tests\n\n```bash\n$ npm test\n```\n\n## Usage\n\n```js\nvar BitWriter = require('bitwriter');\n```\n\n# API\n`BitWriter` Inherits from `Buffer`, so you get all of the buffer methods\n(`fill`, `slice`, `copy`, etc) as well. You can also use `Buffer.concat`\nwith instances.\n\n## BitWriter(*length, [endianness='BE']*)\n\n```js\nvar buf = BitWriter(4); \nbuf.inspect(); // <BitWriter 00 00 00 00>\n\n// or if you need a little endian writer\nbuf = BitWriter(4, 'LE');\n```\n## BitWriter(*array, [endianness='BE']*)\n**@see** `BitWriter#writeInt`<br>\n***\n\nYou can also specify an array of integers or objects representing\nintegers. Uses `BitWriter#writeInt` internally.\n\n```js\nvar buf = BitWriter([ 1, 2, 64738, 23 ]);\nbuf.out(); // <Buffer 01 02 fc e2 17>\n  \nvar obuf = BitWriter([ 1, 2, 64738, { value: 23, width: 16 } ]);\nobuf.out(); // <Buffer 01 02 fc e2 00 17>\n```\n\n## BitWriter#write(*data, [opts]*)\n**@returns** `this`<br>\n**@see** `BitWriter#writeInt`<br>\n**@see** `BitWriter#writeString`<br>\n**@see** `BitWriter#writeRaw`\n***\n\nMake some assumptions and does its best to figure out what type of data you're\nwriting and how large that data is, then delegates to one of the write methods below.\n\n## BitWriter#out()\n**@returns** `{Buffer}`<br>\n\nReturns reference to internal buffer.\n\n\n## BitWriter#writeRaw(*arraylike, [opts]*)\n**@returns** `this`<br>\n**@throws** `TypeError`<br>\n**@throws** `RangeError`<br>\n**@see** `BitWriter#write8`<br>\n**@see** `Buffer#copy`\n***\nTakes an array-like object and iterates through it, writing raw bytes to\nthe buffer.\n\nArrays are type-checked to be byte arrays and range-checked for values between [0, 255]. \n\nDelegates to `Buffer#copy` if given a buffer, which skips type checks\nand is generally way more efficient.\n\n```js\nvar buf = BitWriter(8);\nbuf.write([0xff, 0xdd, 0xaa, 0xbb]); // <BitWriter ff dd aa bb 00 00 00 00>\nbuf.write(Buffer('helo')); // <BitWriter ff dd aa bb 68 65 6c 6f>\n```\n\nIf `opts.safe` is `true`, will skip type checks which is a bit more efficient\nsince it will only iterate over the array once, but can be dangerous\nwith unknown data.\n \nThrows `TypeError` if the array contains any non-numeric values.\n\nThrows `RangeError` if any values are outside the eight bit range.\n\n\n## BitWriter#writeString(*string, [opts]*)\n**@returns** `this`<br>\n**@throws** `OverflowError`\n***\n\nWrites a string to the buffer. By default, a single `0x00` will be added\nafter the string if there is room left in the buffer.\n\n```js\nvar buf = BitWriter(7);\nbuf.write('hey'); // <BitWriter 68 65 79 00 00 00 00>\nbuf.write('sup'); // <BitWriter 68 65 79 00 73 75 70>\n```\n\nIf you don't want to write a null byte, you can pass an `{ null: false }`\n```js\nvar buf = BitWriter(6);\nbuf.write('hey', { null: false }); // <BitWriter 68 65 79 00 00 00 >\nbuf.write('sup'); // <BitWriter 68 65 79 73 75 70>\n```\n\nIf you have a specific amount of bytes you need to fit a string into,\nyou can use `{ size: <int> }`. This will either truncate the string to\nfit, or pad the right side with `0x00`.\n\n```js\nvar buf = BitWriter(4);\nbuf.write('hey this string is way too long!', { size: 4 });\nbuf.inspect(); // <BitWriter 68 65 79 20>\n```\n\nThrows `OverflowError` if there are less than `string.length` bytes left\nin the buffer.\n\n\n## BitWriter#writeInt(*integer, [opts]*)\n## BitWriter#writeInt(*opts*)\n**@returns** `this`<br>\n**@throws** `RangeError`<br>\n**@throws** `TypeError`<br>\n**@throws** `OverflowError`<br>\n**@throws** `DispatchError`<br>\n*** \n### Options\n- `size`: specify integer size\n- `width`: alias for size\n\nWrites an integer to the buffer, testing against the maximum and minimum\nvalues 8, 16 and 32 bit numbers, both signed and unsigned, to figure out\nhow best to store your bytes.\n\nIf a single object is passed, tries to find the integer value from `opts.value`.\n\n**Unsigned integers**\n```js\nvar buf = BitWriter(8);\nbuf.write(128); //<BitWriter 80 00 00 00 00 00 00 00>\n```\n\n**Signed integers**\n```js\nbuf.write(-1); // <BitWriter 80 ff 00 00 00 00 00 00>\n```\n\n**16 bits**\n```js\nbuf.write(61453); // <BitWriter 80 ff f0 0d 00 00 00 00>\n```\n\n**32 bits**\n```js\nbuf.write(262254561); // <BitWriter 80 ff f0 0d 0f a1 af e1>\n```\nIf you have a number that fits in 8 bytes but you need to store it in a larger\nsize, you can specify that:\n\n```js\nvar buf = BitWriter(4);\nbuf.write(-128, { size: 32 }); // <BitWriter ff ff ff 80>\n```\n\nReturns `this` so you can chain a bunch of writes:\n\n```js\nvar output = BitWriter(4);\noutput\n  .write(0x01)\n  .write(0x02)\n  .write(0x03)\n  .write(0x04); // <BitWriter 01 02 03 04>\n```\n\nThrows `TypeError` if it gets a string that is not completely composed\nof digits.\n\nThrows `RangeError` an invalid `size` option is given. Valid sizes can\nbe found in the constant `BitWriter.INT_SIZES` (currently\n`[8, 16, 32]`).\n\nThrows `RangeError` if the value is less than the minimum value of a\n32 bit signed integer or the maximum value of a 32 bit unsigned\ninteger. These values can be found in `BitWriter.MAX_VALUE` and\n`BitWriter.MIN_VALUE`\n\nThrows `OverflowError` when attempting to write more bytes than are\navailable in the buffer.\n\nThrows `DispatchError` if it can't figure out what to do with a value.\n\n\n## BitWriter#write8(*integer*)\nConvenience for `BitWriter#write(integer, { size: 8 })`\n\n## BitWriter#write16(*integer*)\nConvenience for `BitWriter#write(integer, { size: 16 })`\n\n## BitWriter#write32(*integer*)\nConvenience for `BitWriter#write(integer, { size: 32 })`\n\n## BitWriter[*length-1*], BitWriter[*length-1*] = [-128, 255]\n**@returns** `{Integer[0,255] | Undefined}`<br>\n**@throws** `RangeError`\n*** \n \nExactly like array accessing a `Buffer` with one difference: this will\nthrow `RangeError` if the value is less than -128 or greater than 255\n\nAccessing a position < 0 or > `length - 1` will return undefined.\n\n\n## BitWriter#reset()\n**@returns** `this`.\n***\n \nResets the internal cursor to position 0 and fills the buffer with `0x00`.\n\n\n\n## BitWriter#position()\n**@returns** `{Integer}`\n*** \n \n Returns the position of the internal cursor\n\n\n## BitWriter#position(*integer*)\n**@returns** `this` <br>\n**@throws** `RangeError`<br>\n**@throws** `TypeError`\n*** \n \nSets the position of the internal cursor. Value be between [0, length-1]\n\nThrows `RangeError` if position is out of bounds.\n\nThrows `TypeError` if input is not a number.\n\n## BitWriter#move(*integer*)\n**@returns** `this` <br>\n**@see** `BitWriter#position`\n\nMove the cursor a relative amount from where it is. Uses `BitWriter#position` internally.\n\n```js\nvar buf = BitWriter(4);\nbuf.write(0x3d);\nbuf.position(); // 1\nbuf.move(-1);\nbuf.position(); // 0\nbuf.move(+3)\nbuf.position(); // 3\n\nbuf.move(+10); // throw RangeError\n```\n\n## BitWriter#attach(*object, [key]*)\n**@returns** `object` <br>\n***\n\nThis attachs hard `this`-bound versions of the `write*` methods  to another object.\n\n```js\nvar meta = BitWriter(16).attach({\n  name: 'SomeThing',\n  widgets: [],\n}, 'data');\n\nmeta.write('widget co');\nmeta.write32(0xff);\nmeta.data.inspect(); // <BitWriter 77 69 64 67 65 74 20 63 6f 00 00 00 ff 00 00 00>\n```\n","_id":"bitwriter@0.0.4","dist":{"shasum":"0fc6a8ae0ff8fbff1a164d3210c8ee70a8d255a9","tarball":"http://registry.npmjs.org/bitwriter/-/bitwriter-0.0.4.tgz"},"maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]}},"readme":"","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}],"time":{"modified":"2012-07-19T20:55:12.463Z","created":"2012-07-14T18:22:50.660Z","0.0.0":"2012-07-14T18:22:51.107Z","0.0.1":"2012-07-14T22:40:49.616Z","0.0.2":"2012-07-16T02:16:37.478Z","0.0.3":"2012-07-16T18:04:32.132Z","0.0.4":"2012-07-19T20:55:12.463Z"},"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"repository":{"type":"git","url":"git://github.com/brianloveswords/bitwriter.git"},"_attachments":{"bitwriter-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-OYteuUnDPF6D7AXM6a8mNA==","length":8775,"stub":true},"bitwriter-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-N6h5sYwRUsRQVv2LcAeftw==","length":8618,"stub":true},"bitwriter-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-17sB1LDY0YQnKJk7kBFNGQ==","length":7945,"stub":true},"bitwriter-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IC0p2zb4ED3oM+u6RgaaZA==","length":7449,"stub":true},"bitwriter-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GxCoMcIJDGs9nXWVl0uUlQ==","length":3953,"stub":true}}}},
{"id":"bity","key":"bity","value":{"rev":"3-2aa9377622ee021859f34c76bd3927d2"},"doc":{"_id":"bity","_rev":"3-2aa9377622ee021859f34c76bd3927d2","name":"bity","description":"A site like MilkandCookies in Node.js","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Jaxon Brooks","url":"http://jaxonbrooks.com"},"name":"bity","description":"A site like MilkandCookies in Node.js","version":"0.0.0","homepage":"http://inimate.com/bity/","contributors":[{"name":"Jaxon Brooks","email":"npmjs_org@milkandcookies.com"}],"repository":{"type":"git","url":"git://github.com/inimate/bity.git"},"dependencies":{"express":"*","socket.io":"*","redis":"*","connect-redis":"*","coffeekup":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"Jaxon Brooks","email":"npmjs_org@milkandcookies.com"},"_id":"bity@0.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"58fce4c718aaad0d8180c1024ecff9d3fe20922d","tarball":"http://registry.npmjs.org/bity/-/bity-0.0.0.tgz"},"maintainers":[{"name":"Jaxon Brooks","email":"npmjs_org@milkandcookies.com"}]}},"readme":"Bity\n====\n\nNode.js based replacement of current <a href=\"http://milkandcookies.com\">MilkandCookies.com</a> codebase.\n\nThis project is at version 0.0.0. It is not yet functional. Details to follow.","maintainers":[{"name":"Jaxon Brooks","email":"npmjs_org@milkandcookies.com"}],"time":{"modified":"2012-06-03T23:22:20.040Z","created":"2012-06-03T23:22:18.881Z","0.0.0":"2012-06-03T23:22:20.040Z"},"author":{"name":"Jaxon Brooks","url":"http://jaxonbrooks.com"},"repository":{"type":"git","url":"git://github.com/inimate/bity.git"},"_attachments":{"bity-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RkNi2Vw5rmoI+dkuCYuulA==","length":1563,"stub":true}}}},
{"id":"biwascheme","key":"biwascheme","value":{"rev":"7-6d8523dc5af37b46841b68da0136d179"},"doc":{"_id":"biwascheme","_rev":"7-6d8523dc5af37b46841b68da0136d179","name":"biwascheme","description":"A practical Scheme interpreter written in JavaScript","dist-tags":{"latest":"0.6.1"},"versions":{"0.5.7":{"name":"biwascheme","description":"A practical Scheme interpreter written in JavaScript","version":"0.5.7","author":{"name":"Yutaka HARA","email":"yutaka.hara.gmail.com","url":"http://twitter.com/yhara_en"},"homepage":"http://www.biwascheme.org/","keywords":["scheme","lisp","interpreter","repl","biwa"],"repository":{"type":"git","url":"git://github.com/yhara/biwascheme.git"},"main":"./lib/biwascheme.js","dependencies":{"optparse":"1.0.1"},"bin":{"biwas":"./bin/biwas"},"_npmJsonOpts":{"file":"/Users/yhara/.npm/biwascheme/0.5.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"biwascheme@0.5.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c2555a799be6c91f8d9cf492b4462e3b0fcaeba1","tarball":"http://registry.npmjs.org/biwascheme/-/biwascheme-0.5.7.tgz"},"scripts":{},"maintainers":[{"name":"yhara","email":"yutaka.hara+npm@gmail.com"}]},"0.6.0":{"name":"biwascheme","description":"A practical Scheme interpreter written in JavaScript","version":"0.6.0","author":{"name":"Yutaka HARA","email":"yutaka.hara.gmail.com","url":"http://twitter.com/yhara_en"},"homepage":"http://www.biwascheme.org/","keywords":["scheme","lisp","interpreter","repl","biwa"],"repository":{"type":"git","url":"git://github.com/biwascheme/biwascheme.git"},"main":"./lib/biwascheme.js","dependencies":{"optparse":"1.0.1","underscore":"1.1.7","underscore.string":"1.1.5"},"bin":{"biwas":"./bin/biwas"},"_npmUser":{"name":"yhara","email":"yutaka.hara+npm@gmail.com"},"_id":"biwascheme@0.6.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e48be8714d2ac6deaec1152c051fa03edbd0fdc5","tarball":"http://registry.npmjs.org/biwascheme/-/biwascheme-0.6.0.tgz"},"maintainers":[{"name":"yhara","email":"yutaka.hara+npm@gmail.com"}]},"0.6.1":{"name":"biwascheme","description":"A practical Scheme interpreter written in JavaScript","version":"0.6.1","author":{"name":"Yutaka HARA","email":"yutaka.hara.gmail.com","url":"http://twitter.com/yhara_en"},"homepage":"http://www.biwascheme.org/","keywords":["scheme","lisp","interpreter","repl","biwa"],"repository":{"type":"git","url":"git://github.com/biwascheme/biwascheme.git"},"main":"./lib/biwascheme.js","dependencies":{"optparse":"1.0.3","underscore":"1.1.7","underscore.string":"1.1.5"},"bin":{"biwas":"./bin/biwas"},"_npmUser":{"name":"yhara","email":"yutaka.hara+npm@gmail.com"},"_id":"biwascheme@0.6.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"85d3855c3f60d081bacf1210fd982f81099ccc99","tarball":"http://registry.npmjs.org/biwascheme/-/biwascheme-0.6.1.tgz"},"maintainers":[{"name":"yhara","email":"yutaka.hara+npm@gmail.com"}]}},"maintainers":[{"name":"yhara","email":"yutaka.hara+npm@gmail.com"}],"time":{"modified":"2011-11-30T17:15:49.018Z","created":"2011-08-06T02:14:40.398Z","0.5.7":"2011-08-06T02:14:42.337Z","0.6.0":"2011-11-22T14:36:43.115Z","0.6.1":"2011-11-30T17:15:49.018Z"},"author":{"name":"Yutaka HARA","email":"yutaka.hara.gmail.com","url":"http://twitter.com/yhara_en"},"repository":{"type":"git","url":"git://github.com/biwascheme/biwascheme.git"},"_attachments":{"biwascheme-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EMbXl2koams82PVEvUmrNg==","length":51200,"stub":true},"biwascheme-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-k6EVwMBYUHOeYFNgoX+sYw==","length":51200,"stub":true},"biwascheme-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L6yWXyBIfk7DAaZ0o/CbfA==","length":49033,"stub":true}}}},
{"id":"black","key":"black","value":{"rev":"3-e07ae2273357da5894f4b7cdf1b20560"},"doc":{"_id":"black","_rev":"3-e07ae2273357da5894f4b7cdf1b20560","name":"black","description":"Provides functionality missing from JS core in pure and functional style.","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"black","version":"0.3.0","homepage":"http://killdream.github.com/Black","author":{"name":"Quildreen Motta","url":"http://killdream.github.com/"},"description":"Provides functionality missing from JS core in pure and functional style.","repository":{"type":"git","url":"git://github.com/killdream/Black.git"},"main":"./src/black.js","dependencies":{},"devDependencies":{},"_id":"black@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"e1a24a3cabb9e609a8e42414496e10067bec6724","tarball":"http://registry.npmjs.org/black/-/black-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}]}},"maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}],"time":{"modified":"2011-08-14T02:08:44.263Z","created":"2011-08-14T02:08:43.286Z","0.3.0":"2011-08-14T02:08:44.263Z"},"author":{"name":"Quildreen Motta","url":"http://killdream.github.com/"},"repository":{"type":"git","url":"git://github.com/killdream/Black.git"},"_attachments":{"black-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-j/afIrpErjX3ob35Z187mw==","length":86090,"stub":true}}}},
{"id":"black_coffee","key":"black_coffee","value":{"rev":"3-c5c764cf550ad3c831a085509f64cdfb"},"doc":{"_id":"black_coffee","_rev":"3-c5c764cf550ad3c831a085509f64cdfb","name":"black_coffee","description":"","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"black_coffee","description":"","version":"0.1.0","author":{"name":"Ganesh Gunasegaran","email":"me@itsgg.com"},"repository":{"type":"git","url":"git@github.com:sagework/BlackCoffee.git"},"dependencies":{"coffee-script":"1.1.1"},"devDependencies":{"coffee-script":"1.1.1"},"keywords":["coffeescript","extension"],"main":"./lib/black_coffee","engines":{"node":">= 0.4"},"contributors":[],"_npmJsonOpts":{"file":"/Users/gg/.npm/black_coffee/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"black_coffee@0.1.0","_engineSupported":true,"_npmVersion":"1.0.17","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fe8613e30976a6412c3966043c05f37cc82abf80","tarball":"http://registry.npmjs.org/black_coffee/-/black_coffee-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"itsgg","email":"me@itsgg.com"}]}},"maintainers":[{"name":"itsgg","email":"me@itsgg.com"}],"time":{"modified":"2011-08-29T10:14:37.134Z","created":"2011-08-29T10:14:35.870Z","0.1.0":"2011-08-29T10:14:37.134Z"},"author":{"name":"Ganesh Gunasegaran","email":"me@itsgg.com"},"repository":{"type":"git","url":"git@github.com:sagework/BlackCoffee.git"},"_attachments":{"black_coffee-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-po0t4JR5hVwAycEU/Jj8lA==","length":1621,"stub":true}}}},
{"id":"blackout","key":"blackout","value":{"rev":"3-3facf6c1f056a2b882b491f4a2121720"},"doc":{"_id":"blackout","_rev":"3-3facf6c1f056a2b882b491f4a2121720","name":"blackout","description":"blackout express middleware","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com"},"name":"blackout","description":"blackout express middleware","version":"0.1.0","repository":{"type":"git","url":"git://github.com/stagas/blackout.git"},"main":"blackout.js","engines":{"node":"~0.6.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"stagas","email":"gstagas@gmail.com"},"_id":"blackout@0.1.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"f4d80b143db0489d4e3ea67c63be8f0d52e71151","tarball":"http://registry.npmjs.org/blackout/-/blackout-0.1.0.tgz"},"maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}]}},"readme":"# blackout express middleware\n\n`npm install blackout`\n\n```javascript\nvar express = require('express');\nvar blackout = require('blackout');\n\nvar app = express.createServer();\n\n//\n// usage:\n// blackout(message, style)\n//\napp.use(blackout());\n\napp.listen(8080, 'localhost');\n```\n\n### public domain\n","maintainers":[{"name":"stagas","email":"gstagas@gmail.com"}],"time":{"modified":"2012-01-17T21:01:27.387Z","created":"2012-01-17T21:01:24.552Z","0.1.0":"2012-01-17T21:01:27.387Z"},"author":{"name":"George Stagas","email":"gstagas@gmail.com","url":"http://stagas.com"},"repository":{"type":"git","url":"git://github.com/stagas/blackout.git"},"_attachments":{"blackout-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GJkAliAQSLjbrUgzSmGKWg==","length":10240,"stub":true}}}},
{"id":"blacksmith","key":"blacksmith","value":{"rev":"25-dc39f56d92f746b53c86b2cf0ea470e0"},"doc":{"_id":"blacksmith","_rev":"25-dc39f56d92f746b53c86b2cf0ea470e0","name":"blacksmith","description":"A static site generator built with Node.js, JSDOM, and Weld.","dist-tags":{"latest":"0.0.12"},"versions":{"0.0.7":{"name":"blacksmith","description":"The node documentation project","version":"0.0.7","scripts":{"start":"bin/server"},"bin":{"blacksmith":"bin/blacksmith"},"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"dependencies":{"blacksmith-sites":"0.0.1","async":"0.1.x","marked":"git+https://github.com/chjj/marked.git#gfm","traverse":"0.4.x","mkdirp":"0.0.x","http-server":"0.2.4","jsdom":"0.2.x","weld":"0.2.1","findit":"0.1.x","flatiron":"0.1.5-1","nconf":"0.4.3","ncp":"0.2.x","colors":"*","optimist":"0.2.x","wordwrap":"0.0.x","rss":"0.0.x","hashish":"0.0.x","prompt":"0.1.x","winston":"0.5.x","cliff":"0.1.x","utile":"0.0.10","alists":"*"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"blacksmith@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"87820ecb5645c9655916ff791dd8d31be44934db","tarball":"http://registry.npmjs.org/blacksmith/-/blacksmith-0.0.7.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}],"directories":{}},"0.0.8":{"name":"blacksmith","description":"The node documentation project","version":"0.0.8","scripts":{"start":"bin/server"},"bin":{"blacksmith":"bin/blacksmith"},"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"dependencies":{"blacksmith-sites":"0.0.x","async":"0.1.x","marked":"git+https://github.com/chjj/marked.git#gfm","traverse":"0.4.x","mkdirp":"0.0.x","http-server":"0.2.4","jsdom":"0.2.x","weld":"0.2.1","findit":"0.1.x","flatiron":"0.1.5-1","nconf":"0.4.3","ncp":"0.2.x","colors":"*","optimist":"0.2.x","wordwrap":"0.0.x","rss":"0.0.x","hashish":"0.0.x","prompt":"0.1.x","winston":"0.5.x","cliff":"0.1.x","utile":"0.0.10","alists":"*"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"blacksmith@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c12f669c52a7f8c9f65663494c1737eeff4c8938","tarball":"http://registry.npmjs.org/blacksmith/-/blacksmith-0.0.8.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}],"directories":{}},"0.0.9":{"name":"blacksmith","description":"The node documentation project","version":"0.0.9","scripts":{"start":"bin/server"},"bin":{"blacksmith":"bin/blacksmith"},"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"dependencies":{"blacksmith-sites":"0.0.x","async":"0.1.x","marked":"0.1.x","traverse":"0.4.x","mkdirp":"0.0.x","http-server":"0.2.4","jsdom":"0.2.x","weld":"0.2.1","findit":"0.1.x","flatiron":"0.1.5-1","nconf":"0.4.3","ncp":"0.2.x","colors":"*","optimist":"0.2.x","wordwrap":"0.0.x","rss":"0.0.x","hashish":"0.0.x","prompt":"0.1.x","winston":"0.5.x","cliff":"0.1.x","utile":"0.0.10","alists":"*"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"blacksmith@0.0.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9c13283ddb9effb73c112932ada7cea3c0620e3e","tarball":"http://registry.npmjs.org/blacksmith/-/blacksmith-0.0.9.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}],"directories":{}},"0.0.10":{"name":"blacksmith","description":"A static site generator built with Node.js, JSDOM, and Weld.","version":"0.0.10","scripts":{"start":"bin/server"},"bin":{"blacksmith":"bin/blacksmith"},"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"dependencies":{"blacksmith-sites":"0.0.x","async":"0.1.x","marked":"0.1.x","traverse":"0.4.x","mkdirp":"0.0.x","http-server":"0.2.4","jsdom":"0.2.x","weld":"0.2.1","findit":"0.1.x","flatiron":"0.1.5-1","nconf":"0.4.3","ncp":"0.2.x","colors":"*","optimist":"0.2.x","wordwrap":"0.0.x","rss":"0.0.x","hashish":"0.0.x","prompt":"0.1.x","winston":"0.5.x","cliff":"0.1.x","utile":"0.0.10","alists":"*"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"blacksmith@0.0.10","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2e1c6aa73e9827e793c99a13a3daea6e6ef533be","tarball":"http://registry.npmjs.org/blacksmith/-/blacksmith-0.0.10.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}]},"0.0.11":{"name":"blacksmith","description":"A static site generator built with Node.js, JSDOM, and Weld.","version":"0.0.11","scripts":{"start":"bin/server"},"bin":{"blacksmith":"bin/blacksmith"},"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"dependencies":{"blacksmith-sites":"0.0.x","async":"0.1.x","marked":"0.1.x","traverse":"0.4.x","mkdirp":"0.0.x","http-server":"0.2.4","jsdom":"0.2.x","weld":"0.2.1","findit":"0.1.x","flatiron":"0.1.5-1","nconf":"0.4.3","ncp":"0.2.x","colors":"*","optimist":"0.2.x","wordwrap":"0.0.x","rss":"0.0.x","hashish":"0.0.x","prompt":"0.1.x","winston":"0.5.x","cliff":"0.1.x","utile":"0.0.10","alists":"*"},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"blacksmith@0.0.11","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b71dbdb238be47dd6d146a2116b568dc137b1841","tarball":"http://registry.npmjs.org/blacksmith/-/blacksmith-0.0.11.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}]},"0.0.12":{"name":"blacksmith","description":"A static site generator built with Node.js, JSDOM, and Weld.","version":"0.0.12","scripts":{"start":"bin/server"},"bin":{"blacksmith":"bin/blacksmith"},"author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},{"name":"marak","email":"marak.squires@gmail.com"}],"dependencies":{"blacksmith-sites":"0.0.x","async":"0.1.x","marked":"0.1.x","traverse":"0.4.x","mkdirp":"0.0.x","http-server":"0.5.x","jsdom":"0.2.x","weld":"0.2.1","findit":"0.1.x","flatiron":"0.1.5-1","nconf":"0.4.3","ncp":"0.2.x","colors":"*","optimist":"0.2.x","wordwrap":"0.0.x","rss":"0.0.x","hashish":"0.0.x","prompt":"0.1.x","winston":"0.5.x","cliff":"0.1.x","utile":"0.0.10","alists":"*"},"readme":"# blacksmith\n\n*A static site generator built with Node.js, JSDOM, and Weld.*\n\n## <http://blacksmith.nodejitsu.com>\n\nBlacksmith is a static site generator designed for simplicity and ease of use. Blacksmith will generate your content in seconds as a stand-alone static site ( comprised of HTML / CSS ) that can be hosted anywhere with no dependencies. Articles are edited as Markdown files, and themes are just plain HTML and CSS files (no inane microtemplates or strange markup languages).\n\nStatic sites are generated using Weld and JSDOM. Blacksmith also ships with a built in Node.js static file server, so Blacksmith can host itself, if you'd like. \n\n\n## Features\n\n * Easy to use\n * Can be hosted anywhere, since it generates static HTML/CSS\n * Write and Edit articles on the file system using markdown\n * JSDOM / Weld based\n * Easily create custom themes using plain HTML and CSS ( no micro-templating ! )\n * Ships with a robust node.js static server suitable for production\n\n## Installing Blacksmith\n\n    npm install blacksmith -g\n\n## Usage\n\nNow that you have blacksmith, you can use the cli tool to get started!\n\n### Create a new site\n\n    blacksmith init\n\n### Create a new page\n\n    cd myBlog/pages\n    blacksmith post\n\n### Generate a static site\n\n*This command will generate a new version of your blog using source files from the `./pages` folder and put the generated content into `./public/`.*\n\n    # In your site's root\n    blacksmith generate\n    \n### Serving your static site\n\nYou can serve what's in `./public` on any static HTTP server and it's good to go!\n\nAlternately, blacksmith comes with a simple http server:\n\n    blacksmith preview\n\nand can be deployed to Nodejitsu as-is:\n\n    jitsu deploy\n\n# Want to learn more?\n\nThe documentation for blacksmith is hosted as a blacksmith site. [Check it out!](http://blacksmith.jit.su)\n\n#### Author: Nodejitsu Inc.\n","_id":"blacksmith@0.0.12","dist":{"shasum":"7bffd4845c53489e52ff3cfc973be8b419c79501","tarball":"http://registry.npmjs.org/blacksmith/-/blacksmith-0.0.12.tgz"}}},"readme":"# blacksmith\n\n*A static site generator built with Node.js, JSDOM, and Weld.*\n\n## <http://blacksmith.nodejitsu.com>\n\nBlacksmith is a static site generator designed for simplicity and ease of use. Blacksmith will generate your content in seconds as a stand-alone static site ( comprised of HTML / CSS ) that can be hosted anywhere with no dependencies. Articles are edited as Markdown files, and themes are just plain HTML and CSS files (no inane microtemplates or strange markup languages).\n\nStatic sites are generated using Weld and JSDOM. Blacksmith also ships with a built in Node.js static file server, so Blacksmith can host itself, if you'd like. \n\n\n## Features\n\n * Easy to use\n * Can be hosted anywhere, since it generates static HTML/CSS\n * Write and Edit articles on the file system using markdown\n * JSDOM / Weld based\n * Easily create custom themes using plain HTML and CSS ( no micro-templating ! )\n * Ships with a robust node.js static server suitable for production\n\n## Installing Blacksmith\n\n    npm install blacksmith -g\n\n## Usage\n\nNow that you have blacksmith, you can use the cli tool to get started!\n\n### Create a new site\n\n    blacksmith init\n\n### Create a new page\n\n    cd myBlog/pages\n    blacksmith post\n\n### Generate a static site\n\n*This command will generate a new version of your blog using source files from the `./pages` folder and put the generated content into `./public/`.*\n\n    # In your site's root\n    blacksmith generate\n    \n### Serving your static site\n\nYou can serve what's in `./public` on any static HTTP server and it's good to go!\n\nAlternately, blacksmith comes with a simple http server:\n\n    blacksmith preview\n\nand can be deployed to Nodejitsu as-is:\n\n    jitsu deploy\n\n# Want to learn more?\n\nThe documentation for blacksmith is hosted as a blacksmith site. [Check it out!](http://blacksmith.jit.su)\n\n#### Author: Nodejitsu Inc.\n","maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2012-08-13T13:37:05.702Z","created":"2012-01-14T13:48:53.559Z","0.0.7":"2012-01-14T13:48:55.616Z","0.0.8":"2012-01-14T13:58:47.770Z","0.0.9":"2012-01-31T20:42:17.288Z","0.0.10":"2012-02-02T20:44:53.354Z","0.0.11":"2012-02-08T21:23:15.723Z","0.0.12":"2012-08-13T13:37:05.702Z"},"author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"users":{"blakmatrix":true},"_attachments":{"blacksmith-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-y2rSv61cDfusk9S2Md6wcQ==","length":143725,"stub":true},"blacksmith-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-2Sx0Hs/ucRT/D5yOKSzFKg==","length":150034,"stub":true},"blacksmith-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-lUwkIRgi8EzmoD2Ewwul3A==","length":150786,"stub":true},"blacksmith-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-eXy2aCntRetlWI8ZqEQ7yA==","length":150908,"stub":true},"blacksmith-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WAt50rQrpX2Z7o9/XFifXA==","length":145465,"stub":true},"blacksmith-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xaZfxFAuMg9O2/8Ot7H5iQ==","length":145462,"stub":true}}}},
{"id":"blacksmith-apprentice","key":"blacksmith-apprentice","value":{"rev":"3-79d652cb1d43dd18adfcbbdef60b1e3c"},"doc":{"_id":"blacksmith-apprentice","_rev":"3-79d652cb1d43dd18adfcbbdef60b1e3c","name":"blacksmith-apprentice","description":"blacksmith migration tool for blogs","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"blacksmith-apprentice","version":"0.0.1","author":{"name":"Luke Arduini","email":"luke.arduini@me.com"},"repository":{"type":"git","url":"git://github.com/st-luke/blacksmith-apprentice.git"},"description":"blacksmith migration tool for blogs","dependencies":{"mysql":"0.9.x","mkdirp":"0.3.x"},"license":"MIT","engines":{"node":">=0.6.x"},"_npmUser":{"name":"luk","email":"luke.arduini@me.com"},"_id":"blacksmith-apprentice@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4eef602490495f9d6846689493fa73e58b43cef5","tarball":"http://registry.npmjs.org/blacksmith-apprentice/-/blacksmith-apprentice-0.0.1.tgz"},"maintainers":[{"name":"luk","email":"luke.arduini@me.com"}]}},"readme":"#blacksmith-apprentice\n\nMigrate your posts from your current blog and into a [blacksmith](https://github.com/flatiron/blacksmith)-compatible format.\n\nApprentice currently supports the following blogs:\n\n- wordpress\n- habari\n\nBut adding support for [your current blog software] is as trivial as writing a MySQL query. Check out blogs.json for an idea of how to structure an apprentice-compatible query.\n\n##Usage\n\n1. Run `npm install blacksmith-apprentice`.\n2. Edit `config.json` to include your database details and its current blog engine.\n3. run `node apprentice.js`. Apprentice will create an output directory containing the blacksmith-formatted posts. These can be put in your blacksmith site's `pages` directory.\n4. These pages will be converted to HTML with your other posts next time you run `blacksmith generate`.\n\n**Notes**\n\n- Wordpress uses a `<!--more-->` tag to represent where the preview and rest of content are separated. Apprentice will change this to the blacksmith/wheat version, which is `##` in Markdown.\n- Apprentice does not transcode from HTML to Markdown, so if you use any HTML markup in your posts in [your current blog software], it will be unchanged. This shouldn't cause an issue for the Markdown -> HTML conversion that happens during `blacksmith generate`.\n","maintainers":[{"name":"luk","email":"luke.arduini@me.com"}],"time":{"modified":"2012-02-02T01:46:45.123Z","created":"2012-02-02T01:46:43.724Z","0.0.1":"2012-02-02T01:46:45.123Z"},"author":{"name":"Luke Arduini","email":"luke.arduini@me.com"},"repository":{"type":"git","url":"git://github.com/st-luke/blacksmith-apprentice.git"},"_attachments":{"blacksmith-apprentice-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-00fsnD1I1i2FKbGJo4mUQg==","length":2101,"stub":true}}}},
{"id":"blacksmith-sites","key":"blacksmith-sites","value":{"rev":"8-5218bed64045627b648df401aec00dc8"},"doc":{"_id":"blacksmith-sites","_rev":"8-5218bed64045627b648df401aec00dc8","name":"blacksmith-sites","description":"A collection of starter blacksmith sites","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"name":"blacksmith-sites","description":"A collection of starter blacksmith sites","version":"0.0.2","repository":{"type":"git","url":"git://github.com/flatiron/blacksmith-sites.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"alists":"0.0.x"},"devDependencies":{},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"blacksmith-sites@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"fdccc23c13ec3c997d179428a641df112ed177b6","tarball":"http://registry.npmjs.org/blacksmith-sites/-/blacksmith-sites-0.0.2.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]},"0.0.3":{"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"name":"blacksmith-sites","description":"A collection of starter blacksmith sites","version":"0.0.3","repository":{"type":"git","url":"git://github.com/flatiron/blacksmith-sites.git"},"main":"./index","engines":{"node":"*"},"dependencies":{"alists":"0.0.x"},"devDependencies":{},"_npmUser":{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},"_id":"blacksmith-sites@0.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"282bfbf40eb23e2f35dd2db9b7e11e9e21476e62","tarball":"http://registry.npmjs.org/blacksmith-sites/-/blacksmith-sites-0.0.3.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"}]}},"readme":"# Blacksmith-sites\n\n## Example:\n\n    > var sites = require(\"./index\")\n    > sites\n    [Function]\n    > sites(console.log)\n    > null { doc: '/home/josh/dev/blacksmith-sites/sites/doc',\n      blog: '/home/josh/dev/blacksmith-sites/sites/blog' }\n\n## Install:\n\n  git clone git@github.com:flatiron/blacksmith-sites.git\n\n## API:\n\n### sites(cb):\n\nCallback has signature (err, result) where 'result' is paths and keys.\n\n## License:\n\nMIT/X11.\n","maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"jesusabdullah","email":"josh.holbrook@gmail.com"},{"name":"marak","email":"marak.squires@gmail.com"}],"time":{"modified":"2012-03-24T04:35:42.255Z","created":"2012-01-14T13:52:29.919Z","0.0.2":"2012-01-14T13:52:31.630Z","0.0.3":"2012-02-08T22:46:33.208Z"},"author":{"name":"Nodejitsu","email":"info@nodejitsu.com"},"repository":{"type":"git","url":"git://github.com/flatiron/blacksmith-sites.git"},"_attachments":{"blacksmith-sites-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qkEbr8PY5NR6iTeU0bwiKQ==","length":1377504,"stub":true},"blacksmith-sites-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bjNdbk3K0nLi3pkIAlBueQ==","length":834869,"stub":true}}}},
{"id":"blade","key":"blade","value":{"rev":"224-b7b6ed37a699cb0a96a43587984a220e"},"doc":{"_id":"blade","_rev":"224-b7b6ed37a699cb0a96a43587984a220e","name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","dist-tags":{"latest":"2.6.0"},"versions":{"0.0.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.0.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.0.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"4d46de81dd8249a0d3e8a9b15f347155bf6fb795","tarball":"http://registry.npmjs.org/blade/-/blade-0.0.0.tgz"},"readme":"","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.5.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.5.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.5.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d7bb81f97eea885e8adcca2f8beb3319b63e36d1","tarball":"http://registry.npmjs.org/blade/-/blade-0.5.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nBlade was implemented entirely in less than 4 days.\nSo, there is still stuff to do:\n\n- Better error handling and error reporting\n- Finish client-side runtime\n- Better test suite\n- Change tag ending based on doctype\n- Executable to compile and/or render templates via command line\n- Text string interpolation\n- More text filters?\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYes... the `class` attribute is handled with extra special care. Pass an array or string. Yes,\nclasses (delimited by \".\") from before will be merged with the value of the attribute.\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv div div is annoying... so we can omit this if we specify an id or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nAlso, tags without matching ending tags like `<img>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever... defaults to HTML 5, of course.\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nvar doctypes = exports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.  Block comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\t!=functions.textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\n- var text = functions.textbox(\"firstName\", \"Blake\");\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nLimitation: Don't use a local variable with the name `functions`... for obvious reasons.\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this Object instead of `blade.Compiler.inlineTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, fn)` where `err` contains\n\tany parse or compile errors and `fn` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\nYou can call `tmpl.toString()`, just like you can on any other JavaScript function.\nThis might be useful for client-side templates, for example.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.5.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.5.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.5.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"b09321ebdf4475e6013e81af27b2591c07b3d209","tarball":"http://registry.npmjs.org/blade/-/blade-0.5.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do:\n\n- Better error handling and error reporting\n- Finish client-side runtime\n- Better test suite\n- Change tag ending based on doctype\n- Executable to compile and/or render templates via command line\n- Text string interpolation\n- More text filters?\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYes... the `class` attribute is handled with extra special care. Pass an array or string. Yes,\nclasses (delimited by \".\") from before will be merged with the value of the attribute.\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv div div is annoying... so we can omit this if we specify an id or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nAlso, tags without matching ending tags like `<img>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever... defaults to HTML 5, of course.\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nvar doctypes = exports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.  Block comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\t!=functions.textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\n- var text = functions.textbox(\"firstName\", \"Blake\");\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nLimitation: Don't use a local variable with the name `functions`... for obvious reasons.\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this Object instead of `blade.Compiler.inlineTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, fn)` where `err` contains\n\tany parse or compile errors and `fn` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\nYou can call `tmpl.toString()`, just like you can on any other JavaScript function.\nThis might be useful for client-side templates, for example.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.5.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.5.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.5.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3223e82d73f6ccfa8c17a524ddc3abe259792227","tarball":"http://registry.npmjs.org/blade/-/blade-0.5.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do:\n\n- Better error handling and error reporting\n- Finish client-side runtime\n- Better test suite\n- Change tag ending based on doctype\n- Executable to compile and/or render templates via command line\n- Text string interpolation\n- More text filters?\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYes... the `class` attribute is handled with extra special care. Pass an array or string. Yes,\nclasses (delimited by \".\") from before will be merged with the value of the attribute.\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv div div is annoying... so we can omit this if we specify an id or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nAlso, tags without matching ending tags like `<img>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever... defaults to HTML 5, of course.\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nvar doctypes = exports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.  Block comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\t!=functions.textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\n- var text = functions.textbox(\"firstName\", \"Blake\");\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nLimitation: Don't use a local variable with the name `functions`... for obvious reasons.\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this Object instead of `blade.Compiler.inlineTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, fn)` where `err` contains\n\tany parse or compile errors and `fn` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\nYou can call `tmpl.toString()`, just like you can on any other JavaScript function.\nThis might be useful for client-side templates, for example.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.6.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.6.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.6.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f1906733d2a63c7356db42918a9b29d916a13f37","tarball":"http://registry.npmjs.org/blade/-/blade-0.6.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do:\n\n- Better error handling and error reporting\n- Finish client-side runtime\n- Better test suite\n- Change tag ending based on doctype\n- Executable to compile and/or render templates via command line\n- Text string interpolation\n- More text filters?\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYes... the `class` attribute is handled with extra special care. Pass an array or string. Yes,\nclasses (delimited by \".\") from before will be merged with the value of the attribute.\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv div div is annoying... so we can omit this if we specify an id or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nAlso, tags without matching ending tags like `<img>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever... defaults to HTML 5, of course.\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nvar doctypes = exports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.  Block comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\t!=functions.textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\n- var text = functions.textbox(\"firstName\", \"Blake\");\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nLimitation: Don't use a local variable with the name `functions`... for obvious reasons.\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this Object instead of `blade.Compiler.inlineTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, fn)` where `err` contains\n\tany parse or compile errors and `fn` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\nYou can call `tmpl.toString()`, just like you can on any other JavaScript function.\nThis might be useful for client-side templates, for example.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.6.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.6.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.6.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f3a72677489fa0f717fb6e3aea0156e6171c1ffb","tarball":"http://registry.npmjs.org/blade/-/blade-0.6.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do:\n\n- Better error handling and error reporting\n- Finish client-side runtime\n- Better test suite\n- Change tag ending based on doctype\n- Executable to compile and/or render templates via command line\n- Text string interpolation\n- More text filters?\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYes... the `class` attribute is handled with extra special care. Pass an array or string. Yes,\nclasses (delimited by \".\") from before will be merged with the value of the attribute.\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv div div is annoying... so we can omit this if we specify an id or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nAlso, tags without matching ending tags like `<img>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever... defaults to HTML 5, of course.\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nvar doctypes = exports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.  Block comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\t!=functions.textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\n- var text = functions.textbox(\"firstName\", \"Blake\");\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nLimitation: Don't use a local variable with the name `functions`... for obvious reasons.\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this Object instead of `blade.Compiler.inlineTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, fn)` where `err` contains\n\tany parse or compile errors and `fn` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\nYou can call `tmpl.toString()`, just like you can on any other JavaScript function.\nThis might be useful for client-side templates, for example.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.7.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.7.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.7.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d1c7ae8a857ee26b705e41c9daf8b17ae80d4370","tarball":"http://registry.npmjs.org/blade/-/blade-0.7.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do. Check the [issues and milestones section]\n(https://github.com/bminer/node-blade/issues) for more details.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nJade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n\t- if(y)\n\t\tp=y\n- var y = 23;\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.8.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.8.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.8.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"eafee2dd9d173a5a9194beef43cbff5ec033138e","tarball":"http://registry.npmjs.org/blade/-/blade-0.8.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do. Check the [issues and milestones section]\n(https://github.com/bminer/node-blade/issues) for more details.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nCompiler + Runtime: `wget https://raw.github.com/bminer/node-blade/master/dist/blade.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.9.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.9.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.9.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3053b0827a9c8606706e56fadaa6913bf743eb4e","tarball":"http://registry.npmjs.org/blade/-/blade-0.9.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do. Check the [issues and milestones section]\n(https://github.com/bminer/node-blade/issues) for more details.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.9.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.9.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.9.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"0b4787bc06061be9d3cc4d0595a0fbf7d377a667","tarball":"http://registry.npmjs.org/blade/-/blade-0.9.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do. Check the [issues and milestones section]\n(https://github.com/bminer/node-blade/issues) for more details.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.9.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.9.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.9.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9d8e7cb501cd690cfa2eb1da5372f378167943b1","tarball":"http://registry.npmjs.org/blade/-/blade-0.9.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Todo](#todo)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nTodo\n----\n\nMost of Blade was implemented in less than 4 days.\nSo, there is still stuff to do. Check the [issues and milestones section]\n(https://github.com/bminer/node-blade/issues) for more details.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `runtime`\n- `cb`\n- `buf`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n- `blade`\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated!\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.10.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.10.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.10.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"f4000ff7cee96deab07eff4bf27990123d11a8e3","tarball":"http://registry.npmjs.org/blade/-/blade-0.10.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace a block with a parameterized block. The \"replace\"\ncommand will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. You don't need to \"render\" the block to use \"append\", \"prepend\", and\n\"replace\".\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(src=\"text/javascript\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script src=\"text/javascript\"></script>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may render, append to, prepend to, and replace undefined blocks; however,\nthis, of course, has no effect. No error messages occur if you do this because\na compiled view can also be included, and the parent view may have the block\ndefined.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to false)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.10.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.10.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.10.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"a511acecbe5aae871e4613516cb24410ad4dbc37","tarball":"http://registry.npmjs.org/blade/-/blade-0.10.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.10.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.10.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{"uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.10.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"079b7c32d27b9cfe17b9995bd2b6fe6e9a0de071","tarball":"http://registry.npmjs.org/blade/-/blade-0.10.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\t- `locals` are the local variables to be passed to the view template\n\t- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\t- `template` - a function that also renders the template but accepts 3 parameters:\n\t\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\t\truntime environment, if you choose to do so.\n\t- `filename` - the filename of the compiled template (if provided)\n\t- `toString()` - a function that converts the view template function into a string\n\t\tof JavaScript code. If you need a client-side template for example, you can\n\t\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\t\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.10.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.10.3","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{"uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.10.3","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"56357cb3f67d490ba8bba319669cbc7d388b250b","tarball":"http://registry.npmjs.org/blade/-/blade-0.10.3.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly.\n\nAnd, you can add custom filters at runtime using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(baseDir, filename, compileOptions, cb)\n\n- `baseDir` - just put an empty string here. This argument is ignored.\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - just put an empty Object here. This argument is ignored for now.\n- `cb` - your callback of the form `cb(err, tmpl)`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"\", \"homepage.blade\", {}, function(err, tmpl) {\n\ttmpl({}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.11.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.11.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{"uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.11.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"41f3500a160f87a404c0506c4bab440b4b10c168","tarball":"http://registry.npmjs.org/blade/-/blade-0.11.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(baseDir, filename, compileOptions, cb)\n\n- `baseDir` - just put an empty string here. This argument is ignored.\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - just put an empty Object here. This argument is ignored for now.\n- `cb` - your callback of the form `cb(err, tmpl)`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"\", \"homepage.blade\", {}, function(err, tmpl) {\n\ttmpl({}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.11.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.11.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{"uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.11.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3c1a19b2b01483ee094e1263d5a8b793fe25c49f","tarball":"http://registry.npmjs.org/blade/-/blade-0.11.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(baseDir, filename, compileOptions, cb)\n\n- `baseDir` - just put an empty string here. This argument is ignored.\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - just put an empty Object here. This argument is ignored for now.\n- `cb` - your callback of the form `cb(err, tmpl)`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"\", \"homepage.blade\", {}, function(err, tmpl) {\n\ttmpl({}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.11.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.11.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{"uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.11.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"fcfd7020aed5e3faecc63245ee1d7baa9701c530","tarball":"http://registry.npmjs.org/blade/-/blade-0.11.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.11.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","version":"0.11.3","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","dependencies":{"uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.11.3","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"44b4938839e259c1f7ef4364c3d38b9ba86c1179","tarball":"http://registry.npmjs.org/blade/-/blade-0.11.3.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.12.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"0.12.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.12.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"f91fea93a97c97d9d1f2dcc71ed2b4e5869cb6c1","tarball":"http://registry.npmjs.org/blade/-/blade-0.12.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nI haven't done much benchmarking, but from preliminary tests, the compiler is a bit\nslow.  That's probably okay because Express automatically caches compiled views.\nMost importantly, the runtime is pretty darn fast. On my computer, I can render a\nreasonably complex template with file includes in less than 1ms. This test was\nperformed on Google Chrome v18 on Windows 7 on a two-year-old laptop (i7 processor).\nI got around 12,000 renders per second. I would greatly appreciate any metrics other\nusers could provide; I will post them here and give you credit. :)\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.12.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"0.12.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.12.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"29b87e044ee548fa29c2af7fb74626341d2ba781","tarball":"http://registry.npmjs.org/blade/-/blade-0.12.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nI haven't done much benchmarking, but from preliminary tests, the compiler is a bit\nslow.  That's probably okay because Express automatically caches compiled views.\nMost importantly, the runtime is pretty darn fast. On my computer, I can render a\nreasonably complex template with file includes in less than 1ms. This test was\nperformed on Google Chrome v18 on Windows 7 on a two-year-old laptop (i7 processor).\nI got around 12,000 renders per second. I would greatly appreciate any metrics other\nusers could provide; I will post them here and give you credit. :)\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.12.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"0.12.3","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.12.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"be833cf31784aafa0df82dae902b24d141aa106c","tarball":"http://registry.npmjs.org/blade/-/blade-0.12.3.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nI haven't done much benchmarking, but from preliminary tests, the compiler is a bit\nslow.  That's probably okay because Express automatically caches compiled views.\nMost importantly, the runtime is pretty darn fast. On my computer, I can render a\nreasonably complex template with file includes in less than 1ms. This test was\nperformed on Google Chrome v18 on Windows 7 on a two-year-old laptop (i7 processor).\nI got around 12,000 renders per second. I would greatly appreciate any metrics other\nusers could provide; I will post them here and give you credit. :)\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.12.4":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"0.12.4","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.12.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"612a194d9f4bc606e05a5d1c140d70731a69475b","tarball":"http://registry.npmjs.org/blade/-/blade-0.12.4.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in **beta**. There are some [known issues]\n(https://github.com/bminer/node-blade/issues), and I would not recommend Blade\nfor production environments. That being said, I am using Blade for a few\nprojects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nI haven't done much benchmarking, but from preliminary tests, the compiler is a bit\nslow.  That's probably okay because Express automatically caches compiled views.\nMost importantly, the runtime is pretty darn fast. On my computer, I can render a\nreasonably complex template with file includes in less than 1ms. This test was\nperformed on Google Chrome v18 on Windows 7 on a two-year-old laptop (i7 processor).\nI got around 12,000 renders per second. I would greatly appreciate any metrics other\nusers could provide; I will post them here and give you credit. :)\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"0.12.5":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"0.12.5","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@0.12.5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"6758760f0c1ee12f27d9289fbd13d7e1c8d4feaf","tarball":"http://registry.npmjs.org/blade/-/blade-0.12.5.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nI haven't done much benchmarking, but from preliminary tests, the compiler is a bit\nslow.  That's probably okay because Express automatically caches compiled views.\nMost importantly, the runtime is pretty darn fast. On my computer, I can render a\nreasonably complex template with file includes in less than 1ms. This test was\nperformed on Google Chrome v18 on Windows 7 on a two-year-old laptop (i7 processor).\nI got around 12,000 renders per second. I would greatly appreciate any metrics other\nusers could provide; I will post them here and give you credit. :)\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.0.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.0.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"376d2eb19f8ba40aeae951aee84d2ea7cf56a9e8","tarball":"http://registry.npmjs.org/blade/-/blade-1.0.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1.) Write up your template in Blade (which is a Jade-like language)\n2.) Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3.) Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\"),__.push(\"<html\"),__.push(\">\"),__.push(\"<head\"),__.push(\">\"),__.push(\"<title\"),__.push(\">\"),__.push(__.r.escape(\"Blade\")),__.push(\"</title>\"),__.push(\"</head>\"),__.push(\"<body\"),__.push(\">\"),__.push(\"<div\"),__.push(' id=\"nav\"'),__.push(\">\"),__.push(\"<ul\"),__.push(\">\");for(var i in nav)__.push(\"<li\"),__.push(\">\"),__.push(\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\"),__.push(__.r.escape(i)),__.push(\"</a>\"),__.push(\"</li>\");__.push(\"</ul>\"),__.push(\"</div>\"),__.push(\"<div\"),__.push(' id=\"content\"'),__.push(' class=\"center\"'),__.push(\">\"),__.push(\"<h1\"),__.push(\">\"),__.push(__.r.escape(\"Blade is cool\")),__.push(\"</h1>\"),__.push(\"</div>\"),__.push(\"</body>\"),__.push(\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/home',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nI haven't done much benchmarking, but from preliminary tests, the compiler is a bit\nslow.  That's probably okay because Express automatically caches compiled views.\nMost importantly, the runtime is pretty darn fast. On my computer, I can render a\nreasonably complex template with file includes in less than 1ms. This test was\nperformed on Google Chrome v18 on Windows 7 on a two-year-old laptop (i7 processor).\nI got around 12,000 renders per second. I would greatly appreciate any metrics other\nusers could provide; I will post them here and give you credit. :)\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.0.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.0.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4e7021f913a350b9663de4ec41c221c84c48ff6b","tarball":"http://registry.npmjs.org/blade/-/blade-1.0.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\"),__.push(\"<html\"),__.push(\">\"),__.push(\"<head\"),__.push(\">\"),__.push(\"<title\"),__.push(\">\"),__.push(__.r.escape(\"Blade\")),__.push(\"</title>\"),__.push(\"</head>\"),__.push(\"<body\"),__.push(\">\"),__.push(\"<div\"),__.push(' id=\"nav\"'),__.push(\">\"),__.push(\"<ul\"),__.push(\">\");for(var i in nav)__.push(\"<li\"),__.push(\">\"),__.push(\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\"),__.push(__.r.escape(i)),__.push(\"</a>\"),__.push(\"</li>\");__.push(\"</ul>\"),__.push(\"</div>\"),__.push(\"<div\"),__.push(' id=\"content\"'),__.push(' class=\"center\"'),__.push(\">\"),__.push(\"<h1\"),__.push(\">\"),__.push(__.r.escape(\"Blade is cool\")),__.push(\"</h1>\"),__.push(\"</div>\"),__.push(\"</body>\"),__.push(\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.1.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.1.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"d2af4d6bacc9fb1e37e845b37c637683e8a0fdb6","tarball":"http://registry.npmjs.org/blade/-/blade-1.1.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default\n- Want unescaped text? Precede with a `!`\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the value with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to specify a code block.  Use equals (`=`) to specify code output.  A few examples, please?\n\nCode blocks:\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nCode that outputs (i.e. in a text block or at the end of a tag).\nIt's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t!= some_var_containing_html\n```\n\nExtra \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nmeans JavaScript code!\n\n```\np\n\t|= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler will generate an error\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block (see below).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[Meteor.ui.chunk function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [Meteor.ui.listChunk]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n### Meteor Support\n\nBlade also provides a Meteor smart package under the `meteor` directory. The easiest thing\nto do right now is to symlink that directory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember, that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.1.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.1.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"637279727e05ce075a0ff832dfc09d7fccc9dbf7","tarball":"http://registry.npmjs.org/blade/-/blade-1.1.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below), you cannot call \"render\" on\nthat block anymore.\n\nAt this time, you cannot replace any defined block with a parameterized block.\nThe \"replace\" command will not accept parameters.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock regular_block(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender regular_block(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nParameterized blocks are really cool because \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters. A render call always \"appends\"\nto the block, and you can render as many times as you wish.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4ee805a56f86697b5bbed1c3886e0c3eead2b9f2","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"be1cc9b3d7f18cb870a0ab6f2b67fcb81c823536","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ee89abcc7d631c3abd1e0076327bc1949f3c39da","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.3","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"b9154d0bc97cd09233100f4daf3fe914aaed0e2f","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.3.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.4":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.4","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"bc3a64d0c0893b440ea6fe0b5c86d55c358b53f7","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.4.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nfor Browsers:\n\nRuntime only: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\nRuntime is about 3-4 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to false)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.5":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.5","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.5","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"37d545e05b23a67368734a78c9661507c018ba6f","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.5.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using includes\n\t\tor the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debug info to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [Uglify-JS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tdirectly to the view, so it should also contain your view's local variables.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.6":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.6","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.6","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2ea758e1885fa141dcb80e2cdeb8edb8ea26c4f5","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.6.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.2.7":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.2.7","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.2.7","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2ab64c757710012d0c4f3165086cd0b5f6413ac2","tarball":"http://registry.npmjs.org/blade/-/blade-1.2.7.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ac68bfcd58900f1bfc6d76d97735c52257be5215","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"ln -s ../lib/runtime.js ./meteor/runtime.js"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c5431fcb12219361adb767306d710f37851e8e1e","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"ln -s ../lib/runtime.js ./meteor/runtime.js"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b10b041602dae14ab402d6d6f77dcfed7ec299bc","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3.1\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.3","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"ln -s ../lib/runtime.js ./meteor/runtime.js"},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"3a0c560c44f148f2eefb05c7930d6c14fade549b","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.3.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3.1\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.4":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.4","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"ln -s ../lib/runtime.js ./meteor/runtime.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.4","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c26e3a4deb8067d5e995b0a69218466ce7debfa7","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.4.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3.1\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **Blocks in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just Functions, not mixins or partials.** In Blade, there are no \"mixins\" or partial\n\ttemplates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n\tCan you define functions within other functions? Yep.\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n## <img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> Jade vs. Blade <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade is in the **release candidate** stage. There are very few\n(if any) [known issues](https://github.com/bminer/node-blade/issues), and I think\nthat Blade is almost ready for production environments. I am using Blade for\na few projects, and it will be receiving more and more test coverage.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `npm install blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace in the vanilla JavaScript code, though. Blade uses whitespace to\nseparate each attribute.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/blade/meteor /path/to/meteor/packages/blade`\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nThe Blade compiler is a bit slow.  That's probably okay because Express automatically\ncaches compiled views.  Most importantly, the runtime is pretty darn fast. On my\ncomputer, I can render a reasonably complex template with file includes in less than\n1ms. This test was performed on Google Chrome v18 on Windows 7 on a two-year-old\nlaptop (i7 processor). I got around 12,000 renders per second.\n\nBlade Performance Summary on a \"decent\" computer:\n\n- Minified template render time: ~10,000 - 15,000 renders per second (pretty darn good)\n- Minified template compile time (no caching): ~350 - 450 small templates per second.\n\tThis is around 4,000 lines of Blade per second... like I said, quite slow.\n- Minified template compile time (with caching) ~100,000+ templates per second (yay caching!)\n\nOutput of benchmark.js on EC2 m1.medium instance (Ubuntu 12.04, Node 0.6.17, Blade 1.0.1):\n\n```\nBlade performance:\n------------------\nBlade test suite statistics:\n        Files: 22\n        Total number of lines: 250\n\nParse the entire test suite 40 times: 1416ms\nCompile (cache off, minify on) the entire test suite 40 times: 2260ms\nRender (cache off, minify on) the entire test suite 40 times: 2571ms\nCompile and cache the entire test suite 1 times: 47ms\nCompile (cache on, minify on) the entire test suite 1000 times: 197ms\nRender (cache on, minify on) the entire test suite 1000 times: 1495ms\n```\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.7":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.7","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"./postinstall.sh"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.7","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6469f166eab83f4964f917a57247b8c919b069f5","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.7.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/) 0.3.6. See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.8":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.8","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"./postinstall.sh"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.8","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d8d6fd69cd61be61128aaa0b3ba726f2bfc4b408","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.8.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.3.9":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.3.9","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"./postinstall.sh"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.3.9","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"c5c5964dfe4c6cbd0237410877170f41b7b317a1","tarball":"http://registry.npmjs.org/blade/-/blade-1.3.9.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `inlineTags` - use this array instead of `blade.Compiler.inlineTags`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.4.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.4.0","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"./postinstall.sh"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.4.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4e3bca2dc1f7cf9e90700d3be88f5539f15b7407","tarball":"http://registry.npmjs.org/blade/-/blade-1.4.0.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.4.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.4.1","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"./postinstall.sh"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.4.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"563e127d1371c79640045e6cf800e11b2d64393e","tarball":"http://registry.npmjs.org/blade/-/blade-1.4.1.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"Versions prior to 1.4.2 are no longer supported"},"1.4.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"1.4.2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"blade@1.4.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"22034ffa329068c820d5110d02703708417f5d55","tarball":"http://registry.npmjs.org/blade/-/blade-1.4.2.tgz"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **In Blade, file includes happen dynamically at run-time, instead of at compile-time.**\n\tThis means that files compiled in Blade are generally smaller than Jade\n\tfiles when you are using file includes. In addition, if you re-use the same\n\tincluded file among multiple parent views, the included file does not need to\n\tbe re-compiled. This can significantly decrease the size of client-side templates,\n\tand reduce the overall bandwidth required to transfer the templates over the\n\tInternet.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit template\n\tinheritance and static file includes and then added features like blocks and\n\tparameterized blocks. You might find our idea of a block to be similar to Jade's,\n\tbut just wait until you realize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, closures (not necessarily recommended), or whatever you want!\n- **Load function output into a variable.** Blade has a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template.\n\tThen, you can pass the rendered HTML content to another function, for example.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nBlade does more than Jade, and it does less than Jade. Your Jade templates\nwill probably need some modifications before they will work with Blade.\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Here is the list of built-in doctypes:\n\n```javascript\nexports.doctypes = {\n  '5': '<!DOCTYPE html>',\n  'xml': '<?xml version=\"1.0\" encoding=\"utf-8\" ?>',\n  'default': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'transitional': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',\n  'strict': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">',\n  'frameset': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">',\n  '1.1': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">',\n  'basic': '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">',\n  'mobile': '<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">'\n};\n```\n\nYes, you can modify the list of built-in doctypes through the API. Why would you, though?\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/ie-really-sux.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/ie-really-sux.js\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will dynamically (at runtime) insert \"file.blade\" right into the current view, as if it\nwas a single file.\n\nThe include statement can also be followed by the name of a JavaScript variable containing\nthe filename to be included.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nDue to various complications, you may *NOT* place an `include` inside of a `function`,\n`block`, or `chunk`. This limitation is a bummer, and if you don't like it, you should\ncomplain by opening an issue.\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their contents are injected right\ninto the AST. You can also capture the HTML they render by outputting to a variable,\nas described above. Chunks, on the other hand, always return HTML, and they cannot\nbe called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAlso, Blade allows you to manually call `Meteor.ui.chunk` and `Meteor.ui.listChunk` as you\nsee fit.\n\nThe following example uses chunks and the special `__.chunk` reference. Remember that\nunnamed chunks are simply named `last`.\n\n```\nchunk\n    h1= Session.get(\"counter\")\n!=Meteor.ui.chunk(__.chunk.last);\n```\n\nOr, how about calling `Meteor.ui.listChunk`?\n\n```\nchunk else\n\t.empty! No records were found\nchunk(post)\n\t- var x = Session.equals(\"selected\", post._id) ? \"selected\" : \"\";\n\tdiv(class=x)= post.name\n!= Meteor.ui.listChunk(Posts.find({tags: \"frontpage\"}),\n\t__.chunk.last, __.chunk.else, {\n\t\tevents: {\n\t\t\t'click': function (event) {\n\t\t\t\tSession.set(\"selected\", this._id);\n\t\t\t}\n\t\t}\n\t});\n```\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nAsynchronously compiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously. This option, while documented, is not recommended.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to asynchronously compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page. Then, you have to rely on the middleware\n\t\tto do things like [weak and strong caching]\n\t\t(https://developers.google.com/speed/docs/best-practices/caching).\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.0.0beta":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.0.0beta","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"publishOptions":{"tag":"beta"},"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3 or higher\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `clientNamespace` - the variable where downloaded client-side templates\n\t\tare stored (defaults to \"blade.templates\"). `blade.templates` is\n\t\tnot defined by the Blade runtime, so be sure to define it yourself.\n\t- `clientCache` - turns on client-side caching of views (defaults to\n\t\t`process.env.NODE_ENV == \"production\"`). Caching works until the user\n\t\tnavigates to another page.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the blade-runtime.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, [compileOptions,] cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `compileOptions` - arguments to be passed to the compiler (these are ignored\n\tfor now).\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.templates` or whatever you put as the\n`clientNamespace` when you setup the Blade middleware. In addition, if\n`clientCache` is set in the Blade middleware, then your templates will be stored\nat `blade.cachedViews`.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.templates = {};\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.0.0beta","dist":{"shasum":"329bb8f485190bf97af9f7989a9bab8479db4540","tarball":"http://registry.npmjs.org/blade/-/blade-2.0.0beta.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.0.0beta2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.0.0beta2","homepage":"https://github.com/bminer/node-blade","repository":{"url":"https://github.com/bminer/node-blade"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Migrating to Blade 1.3 or higher\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.0.0beta2","dist":{"shasum":"9632ebb7e8e554fb34520bb5ca45f6b99c58fb54","tarball":"http://registry.npmjs.org/blade/-/blade-2.0.0beta2.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.0.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.0.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 Beta is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nIt's not quite ready for primetime yet, but you can feel free to install and test it.\n\n`sudo npm -g install blade@beta`\n\n### Migrating to Blade 1.3 or higher\n\nThe latest version of Blade makes several changes to the Meteor smart package. You may need\nto reorganize your Meteor project to migrate to the new version. See the [Meteor wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor) for more information.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n\nProject Status\n--------------\n\nI'd say that Blade 1.3 and above is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.0.0","dist":{"shasum":"ca2074aa672467781bec4b86f5031ce5396cf407","tarball":"http://registry.npmjs.org/blade/-/blade-2.0.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.1.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.1.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.1.0","dist":{"shasum":"589e1bd094fa747ae659ec7ea138aafb0f086ffd","tarball":"http://registry.npmjs.org/blade/-/blade-2.1.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.2.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.2.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.2.0","dist":{"shasum":"27b2fe7ca506fa8f4319963f80d8f9ac1a0f9e2f","tarball":"http://registry.npmjs.org/blade/-/blade-2.2.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.2.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.2.1","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.2.1","dist":{"shasum":"0817c77edad93db5b9256e6cfab9f80e59f9a6b3","tarball":"http://registry.npmjs.org/blade/-/blade-2.2.1.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.2.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.2.2","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.2.2","dist":{"shasum":"ac194b1635d4398e8ce6705e3662e3d3219ca466","tarball":"http://registry.npmjs.org/blade/-/blade-2.2.2.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.2.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.2.3","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.2.3","dist":{"shasum":"570db9b5aa1f3aa7c43f6ad774b7bc2285729b03","tarball":"http://registry.npmjs.org/blade/-/blade-2.2.3.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.2.4":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.2.4","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [Meteor Support](#meteor-support)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 4-5 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\n## Meteor Support\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.2.4","dist":{"shasum":"3e9261e9630a0d0258b6f78954a0630298f155ef","tarball":"http://registry.npmjs.org/blade/-/blade-2.2.4.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.0","dist":{"shasum":"f9d673ed579b9031eae7f101a5e16dee77b4c119","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.1","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.1","dist":{"shasum":"701a4a1c855acafc8eb53d90e077e957dd5d4e40","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.1.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.2":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.2","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.2","dist":{"shasum":"cf845ef3e1199a105de3a3d3c2235a3a9d56eecf","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.2.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.3":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.3","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.3","dist":{"shasum":"381ca673765209882545d43413bf9f282ab4e929","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.3.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.4":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.4","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.4","dist":{"shasum":"6a15196c3c14d575b2e967578600ebc4e46a0c06","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.4.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.5":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.5","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.5","dist":{"shasum":"823ad3ada240ad62e57af7ca88cf80a7df89cace","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.5.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.6":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.6","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.6","dist":{"shasum":"b1330112fc61582ec641a03044754736461e6a9c","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.6.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.3.7":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.3.7","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\n** Extra Runtime **\n\nAdds some additional functions to the Blade runtime that help support the Live UI plugin.\nThe Extra Runtime may be merged with the Live UI plugin at a later date.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.3.7","dist":{"shasum":"3142a6dfbb35b2927891168a6b23366710f3cd85","tarball":"http://registry.npmjs.org/blade/-/blade-2.3.7.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.4.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.4.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n** Live UI **\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n** definePropertyIE8 **\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.4.0","dist":{"shasum":"9250eb08302c7b812cf98b16cf74ce37ef8b8229","tarball":"http://registry.npmjs.org/blade/-/blade-2.4.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.4.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.4.1","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh; ./dist/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/dist/blade-runtime.min.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n**Live UI**\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n**definePropertyIE8**\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.4.1","dist":{"shasum":"9fcee3f258e06b80a9a6feea07ce71f0530eec95","tarball":"http://registry.npmjs.org/blade/-/blade-2.4.1.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.5.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.5.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/lib/runtime.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\nBoolean attributes are allowed, as well. If the attribute value is boolean `true`, then\nthe attribute is set; if the attribute value is boolean `false`, then the attribute is\nignored entirely.  For example:\n\n`input(type=\"text\" checked=true)` renders as: `<input type=\"text\" checked=\"checked\"/>`.\n\nOr... you can write it [HTML 5 style](http://dev.w3.org/html5/html-author/#empty-attr) like this:\n\n`input(type=\"text\" checked)` which renders as: `<input type=\"text\" checked=\"checked\"/>`.\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n**Live UI**\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n**definePropertyIE8**\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.5.0","dist":{"shasum":"0c61bc945de26dd0f0c328aa333abee243ccf031","tarball":"http://registry.npmjs.org/blade/-/blade-2.5.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.5.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.5.1","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/lib/runtime.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\nBoolean attributes are allowed, as well. If the attribute value is boolean `true`, then\nthe attribute is set; if the attribute value is boolean `false`, then the attribute is\nignored entirely.  For example:\n\n`input(type=\"text\" checked=true)` renders as: `<input type=\"text\" checked=\"checked\"/>`.\n\nOr... you can write it [HTML 5 style](http://dev.w3.org/html5/html-author/#empty-attr) like this:\n\n`input(type=\"text\" checked)` which renders as: `<input type=\"text\" checked=\"checked\"/>`.\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n**Live UI**\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n**definePropertyIE8**\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.5.1","dist":{"shasum":"a9d15f32f972c4d3b4ee549b4e8370da7689e02e","tarball":"http://registry.npmjs.org/blade/-/blade-2.5.1.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{}},"2.6.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"blade","description":"Blade - HTML Template Compiler, inspired by Jade & Haml","keywords":["html","compile","compiler","render","view","template","engine","jade","haml"],"version":"2.6.0","homepage":"https://github.com/bminer/node-blade","repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"main":"lib/blade.js","bin":{"blade":"./bin/blade"},"dependencies":{"commander":">=0.6","uglify-js":">=1.2"},"devDependencies":{"pegjs":">=0.7","uglify-js":">=1.2"},"optionalDependencies":{"uglify-js":">=1.2"},"engines":{"node":">=0.6"},"scripts":{"pretest":"./lib/parser/build.sh","test":"node ./test/test.js","prepublish":"./lib/parser/build.sh","postinstall":"node ./postinstall.js"},"contributors":[{"name":"Michel Löhr","url":"https://github.com/mlohr"}],"readme":"Blade - HTML Template Compiler\n==============================\n\nBlade is a HTML Template Compiler, inspired by Jade &amp; Haml, implemented in\nJavaScript, so it will run on your microwave oven.\n\nIt works like this...\n\n1. Write up your template in Blade (which is a Jade-like language)\n2. Use the Blade compiler to generate a Blade template (which is a JavaScript function)\n3. Pass variables into your generated template to produce HTML or XML\n\n[View a simple example](#simple-example)\n\nNever write HTML again. Please.\n\n<img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\"\nalt=\"Blade\" width=\"150\" height=\"169\"/>\n\n\"Blade's blood is the key\" :P Sorry... I had to...\n\n### Version 2.0 is out!\n\nVersion 2.0 features the ability to include files within functions, blocks, and chunks.\nSee the [changelog](https://github.com/bminer/node-blade/blob/master/CHANGES.log)\nfor more details.\n\nTable of Contents\n-----------------\n\n- [Why use Blade instead of Jade?](#why-use-blade-instead-of-jade)\n- [Features](#features)\n- [Project Status](#project-status)\n- [Installation](#installation)\n- [Language Syntax](#syntax)\n\t- [The Basics](#syntax)\n\t- [Functions](#functions)\n\t- [Dynamic File Includes](#dynamic-file-includes)\n\t- [Blocks](#blocks)\n- [API](#api)\n- [Browser Usage](#browser-usage)\n- [A Simple Example](#simple-example)\n- [Plugins](#plugins)\n- [Meteor Support](#meteor-support)\n- [Implementation Details](#implementation-details)\n- [Benchmarks](#benchmarks)\n- [License](#license)\n\nWhy use Blade instead of Jade?\n-----------------------\n\nHere are the reasons Blade *might* be considered \"better\" than Jade:\n\n- Jade is an ornamental stone. Blade is a badass vampire hunter.\n- **Client-side templates** can be served to the browser, no problem.\n\tSee [Browser Usage](#browser-usage) and [Blade Middleware]\n\t(#blademiddlewaresourcepath-options) for more info.\n- **Meteor support** - Blade works well with [Meteor](http://meteor.com/). See the\n\t[documentation below](#meteor-support).\n- **Compatibility** - The language syntax of Blade is very similar to Jade's. Jade is\n\tan awesome templating language, and if you are already familiar with it, getting\n\tstarted with Blade should take you very little time.\n- **Smarter file includes**\n\tFiles compiled in Blade can be much smaller than Jade files when you are using file\n\tincludes because file includes happen at runtime instead of at compile-time. If you\n\tre-use the same included file among multiple views, the included file does not need to\n\tbe reloaded.\n- **[Blocks](#blocks) in Blade are awesome.** We removed features from Jade like explicit\n\ttemplate inheritance and then added features like blocks and parameterized blocks.\n\tYou might find our idea of a block to be similar to Jade's, but just wait until you\n\trealize how much more flexible they are!\n- **Just [Functions](#functions), not mixins or partials.** In Blade, there are no \"mixins\"\n\tor partial templates. There are only functions, and they work just like regular JavaScript\n\tfunctions that you've come to know and love. You can put your functions into separate\n\tfiles and include them into other templates, you can take advantage of the `arguments`\n\tArray-like Object, or whatever you want!\n- **Other cool features** For example, Blade provides a built-in syntax for taking\n\tcontent rendered by a function and loading it into a variable within your view template,\n\tallowing you to pass rendered HTML content to another function. This is just one of\n\tthe many new features you can utilize when you make the switch to Blade.\n\n```\n\t\t\tJade\t\t\tvs.\t\t\t\tBlade\n```\n<img src=\"http://www.pbs.org/wgbh/nova/diamond/images/gp08jade.jpg\" alt=\"Jade\" width=\"226\" height=\"169\"/> &nbsp;&nbsp; <img src=\"http://www.empireonline.com/images/features/100greatestcharacters/photos/47.jpg\" alt=\"Blade\" width=\"150\" height=\"169\"/>\n\nOK... it's admittedly not as funny as I thought it would be. But, I tried.\n\nFeatures\n--------\n\n- Write extremely readable short-hand HTML\n- Insert escaped and unescaped text and vanilla JavaScript code\n- Code and text are escaped by default for security/convenience\n- Functions (like Jade mixins)\n- Dynamic file includes\n- Regular blocks and Parameterized blocks (aids in supporting template inheritance)\n- True client-side template support with caching, etc.\n- Supports Express.JS\n- HTML Comments and block comments\n- Text filters\n- Nice error reporting to help you debug your broken templates\n- Command-line tool to compile/render templates (try `blade --help`)\n- Meteor smart package\n- Write DOM event handlers right into your views\n- Cool plugins (including [Live UI](https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin))\n\nProject Status\n--------------\n\nI'd say that Blade is **stable**. There are very few (if any)\n[known issues](https://github.com/bminer/node-blade/issues), and I think that Blade\nis ready for production environments. I use Blade for many of my projects.\n\nIf you find a bug, please [report it here]\n(https://github.com/bminer/node-blade/issues). If you include the Blade code\nthat failed along with the expected HTML output, that is always splendid.\n\nBy all means, please feel free to submit pull requests for new features,\nnew tests, or whatever! For big changes, say ~100 lines of code, you\nmight want to contact me first or submit an issue before getting started.\n\nInstallation\n------------\n\nfor Node (via npm): `sudo npm install -g blade`\n\nRuntime for Browsers: `wget https://raw.github.com/bminer/node-blade/master/lib/runtime.js`\n\nMinified runtime is about 5-6 KB, uncompressed.\n\nSyntax\n------\n\n### Tags\n\nLike Jade, a tag is simply a word. For example, the string `html` will render to `<html></html>`.\n\nYou can have 'id's:\n\n```\ndiv#awesome\n```\n\nwhich renders as `<div id=\"awesome\"></div>`.\n\nAny number of classes work, separated by a dot (`.`)\n\n```\ndiv.task-details.container\n```\n\nwhich renders as `<div class=\"task-details container\"></div>`.\n\nTag attributes?  Yep, they work pretty much like Jade, too.\nPut attributes in parenthesis, separate attributes with a comma, space, newline, or whatever.\n\n`a(href=\"/homepage\", onclick=\"return false;\")` renders as:\n\n```html\n<a href=\"/homepage\" onclick=\"return false;\"></a>\n```\n\nYou can also have line feeds or weird whitespace between attributes, just like in Jade.\nWhatever. This works, for example:\n\n```\ninput(\n\t\ttype=\"text\"\n\t\tname=\"email\"\n\t\tvalue=\"Your email here\"\n\t)\n```\n\nYou can also put substitute an attribute value with vanilla JS code like this:\n`input(type=\"text\" name=\"contact-\"+name value=value)`.  For example, if you passed the object\n`{name: \"fred\", value: \"testing\"}` to your view, the above would render to:\n`<input type=\"text\" name=\"contact-fred\" value=\"testing\"/>`\n\nYou cannot put whitespace, commas, newlines, or parentheses in the vanilla JavaScript code,\nthough. Blade uses these characters to separate each attribute or to end the tag definition.\n\nAnd, yes... the `class` attribute is handled with extra special care. Pass an array or string.\nClasses (delimited by \".\") from before will be merged with the value of the `class` attribute.\n\nFor example:\n\n`div#foo.bar.dummy(class=\"another dude\")` renders as: `<div id=\"foo\" class=\"bar dummy another dude\"></div>`\n\nBoolean attributes are allowed, as well. If the attribute value is boolean `true`, then\nthe attribute is set; if the attribute value is boolean `false`, then the attribute is\nignored entirely.  For example:\n\n`input(type=\"text\" checked=true)` renders as: `<input type=\"text\" checked=\"checked\"/>`.\n\nOr... you can write it [HTML 5 style](http://dev.w3.org/html5/html-author/#empty-attr) like this:\n\n`input(type=\"text\" checked)` which renders as: `<input type=\"text\" checked=\"checked\"/>`.\n\ndiv, div, div can get annoying... so, we can omit the tag specifier if we specify an\nid or some classes:\n\n```\n#foo\n.bar\n#this.is.cool\n```\n\nrenders as:\n\n```html\n<div id=\"foo\"></div><div class=\"bar\"></div><div id=\"this\" class=\"is cool\"></div>\n```\n\nBlade just assumes anything without a tag name specifier is a `<div>` tag.\n\nAlso, tags without matching ending tags like `<img/>` render properly.\n\n### Indenting\n\nIt works. You can indent with any number of spaces or with a single tab character. The\nonly rule is to be consistent within a given file.\nJade gives you a lot of weird indent flexibility. Blade, by design, does not.\n\n```\nhtml\n\thead\n\tbody\n\t\t#content\n```\n\nrenders as:\n\n```html\n<html><head></head><body><div id=\"content\"></div></body></html>\n```\n\nYou can start a tag name with a bashslash to escape Blade keywords.\nNormally, `include test` would include a file, but `\\include test` renders as:\n\n```xml\n<include>test</include>\n```\n\nThis allows you to be flexible with tag names, so you are not restricted to rendering\nHTML, for example. You can render any XML document with Blade.\n\n### Text\n\nIt works, too. Simply place content after the tag like this:\n\n```\np This text is \"escaped\" by default. Kinda neat.\n```\n\nrenders as:\n\n```html\n<p>This text is &quot;escaped&quot; by default. Kinda neat.</p>\n```\n\nWant unescaped text?  Large blocks of text? Done.\nStart a line of text with a `|`.\n\n```\np! This will be <strong>unescaped</strong> text.\n\t|\n\t\tHow about a block? (this is \"escaped\", btw)\n\t\tYep. It just works!\n\t\tNeato.\n```\n\nrenders as:\n\n```html\n<p>This will be <strong>unescaped</strong> text.\nHow about a block? (this is &quot;escaped&quot;, btw)\nYep. It just works!\nNeato.</p>\n```\n\nRules are:\n\n- Text is escaped by default.\n- Want unescaped text? Precede with a `!`\n- Precede with a `=` to evaluate and output some JavaScript.\n- Large text block? Use `|` and indent properly.\n- Unescaped text block? Use `|!` or even just `!` works.\n- JavaScript code block? Use `|=` or even just `=` works.\n- Unescaped JavaScript code block? Yep. Use `|!=` or `!=`.\n- Newlines in text blocks are preserved.\n\nVariable interpolation is supported for text blocks.  Use `#{var_name}` notation, and\nanything between the curly braces is treated as vanilla JavaScript code.\n\nFor example, you can write:\n\n(caution: indents are **required** on line 4 even though it is blank)\n\n```\np\n\t|\n\t\tI am just testing #{whatever + \", alright?\"}\n\t\t\n\t\tRelax...\n```\n\ninstead of writing the equivalent, but arguably less awesome...\n\n```\np\n\t|=\n\t\t\"I am just testing \" + whatever + \", alright?\" +\n\t\t\"\\n\\n\" +\n\t\t\"Relax...\"\n```\n\nAssuming a local variable `whatever` is passed to the template with value \"Blade\",\nboth of the examples above will render to this:\n\n```html\n<p>I am just testing Blade, alright?\n\nRelax...</p>\n```\n\t\t\n\n### Text filters\n\nNeed `<br/>` tags inserted? Use a built-in filter, perhaps?\n\n```\np\n\t:nl2br\n\t\tHow about some text with some breaks?\n\t\t\n\t\tYep! It works!\n```\n\nrenders as:\n\n```html\n<p>How about some text with some breaks?<br/><br/>Yep! It works!</p>\n```\n\nBuilt-in text filters include:\n\n- :nl2br - Escapes the content and converts newline characters to `<br/>`\n- :cdata - Surrounds text like this: `<![CDATA[` ...text goes here... `]]>`\n\tText should not contain `]]>`.\n- :markdown (must have [markdown-js](https://github.com/evilstreak/markdown-js) installed)\n- :md (alias for :markdown)\n- :javascript - Generates a `<script>` tag for your JavaScript code. If `minify` compiler\n\toption is set and UglifyJS is installed, your code is uglified automatically.\n- :js (alias for :javascript)\n- :coffeescript - Generates a `<script>` tag for the generated JavaScript.\n\t(must have [coffee-script](https://github.com/jashkenas/coffee-script) installed)\n- :cs (alias for :coffeescript)\n- :stylus - Generates a `<style>` tag for the generated CSS. If `minify` compiler\n\toption is set, your CSS is compressed automatically.\n\t(must have [stylus](https://github.com/LearnBoost/stylus) installed)\n- :less - Generates a `<style>` tag for the generated CSS.\n\t(must have [less](https://github.com/cloudhead/less.js) installed)\n- :sass - Generates a `<style>` tag for the generated CSS.\n\t(must have [sass](https://github.com/visionmedia/sass.js) installed)\n\nFilters are essentially functions that accept a text string and return HTML. They\ncannot modify the AST directly. Also, you cannot inject JavaScript code into\nfilters.\n\nYou can add custom filters at compile-time using the API.\n\nVariable interpolation is supported for certain text filters, as well.  If a text\nfilter returns text in `#{var_name}` notation, then anything between the curly braces\nis replaced with vanilla JavaScript code. To avoid this behavior, text filters can\neither escape the `#{stuff}` with a backslash, or it can set its `interpolation`\nproperty to `false`.\n\n### Code\n\nUse dash (`-`) to indicate that JavaScript code follows, which will not output into\nthe template.  As before, use equals (`=`) to specify code output.  A few examples, please?\n\nUsing dash (`-`):\n\n```\n#taskStatus\n\t- if(task.completed)\n\t\tp You are done. Do more! >:O\n\t- else\n\t\tp Get to work, slave!\n```\n\nWhen inserting lines of code with `-`, curly braces or semicolons are inserted, as\nappropriate.  In the example above, we have an `if` statement followed by an indented\nparagraph tag.  In this case, Blade wraps the indented content with curly braces.\nIf there is no indented content beneath the line of code, then a semicolon is appended\ninstead.\n\nCode that outputs (i.e. a code block or at the end of a tag).\nAs mentioned before, it's just like a text block, except with an `=`.\n\n```\n#taskStatus= task.completed ? \"Yay!\" : \"Awww... it's ok.\"\np\n\t| The task was due on\n\t|= task.dueDate\n```\n\nWhen using code that outputs, the default is to escape all text. To turn off escaping, just\nprepend a \"!\", as before:\n\n```\np\n\t|!= some_var_containing_html\n```\n\nMissing \"|\" characters are okay, too.  Just don't forget that stuff after the \"=\"\nneeds to be valid JavaScript code!\n\n```\np\n\t= \"escape me\" + \" away & away\"\n```\n\nrenders `<p>escape me away &amp; away</p>`\n\n#### Variable names to avoid\n\nBlade, like other template engines, defines local variables within every single view. You\nshould avoid using these names in your view templates whenever possible:\n\n- `locals`\n- `cb`\n- `__` (that's two underscores)\n- Any of the compiler options (i.e. `debug`, `minify`, etc.)\n\n### Doctypes\n\nDon't forget a doctype!  Actually, you can, whatever...\n\nAdd a doctype using the `doctype` keyword or `!!!` like this:\n\n`!!! 5` means use HTML 5 doctype.\n\nUse the list of built-in doctypes or pass your own like this:\n\n```\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"\nhtml\n```\n\nwhich renders as `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\"><html></html>`\n\nPut the doctype at the top of your Blade files, please. Please refer to [doctypes.js]\n(https://github.com/bminer/node-blade/blob/master/lib/doctypes.js) for the list of built-in\ndoctypes.\n\nYou can modify the list of built-in doctypes through the API, if you insist.\n\n### Comments\n\nUse `//` for a line comment.  Use `//-` if you don't want the comment to be rendered.\nBlock comments work, too.\n\n```\n//Comment example 1\n//-Comment example 2\n//\n\t#wow\n\tp Block comments work, too\n```\n\nrenders as:\n\n```html\n<!--Comment example 1--><!--<div id=\"wow\"></div><p>Block comments work, too</p>-->\n```\n\nConditional comments work like this:\n\n```\nhead\n\t//if lt IE 8\n\t\tscript(src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye.js\")\n```\n\nrenders as:\n\n```html\n<head><!--[if lt IE 8]><script src=\"/dear-microsoft-plz-stop-making-browsers-kthxbye\"></script><![endif]--></head>\n```\n\nTo comment out entire sections of Blade code, you can use non-rendering block comments\nwith a text block.\n\n```\n//-\n\t|\n\t\tanything can go here... Blade code, JavaScript code, whatever...\n\t\tjust make sure that the indenting is right.\n```\n\nor... even better... just use C-style block comments.  Begin with `/*` to generate\na non-rendering block comment, or begin with `/**` to generate a regular comment.\nEnd the comment with `*/`.  These comments are not parsed like `//` comments.\n\n```\n/* h1 Testing */\n/**\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n*/\n```\n\nrenders as:\n\n```html\n<!--\n#header\n\th3 Notice that this chunk of Blade code is not parsed\n-->\n```\n\n### Event Handlers\n\nYou can write event handlers right into your Blade templates.  Here's an\nexample:\n\n```\nform(method=\"post\" action=\"/login\")\n\tinput(type=\"text\" name=\"username\")\n\t\t{change}\n\t\t\t//javascript code goes here\n\t\t\t//this refers to this DOM element\n\t\t\t//e refers to the browser's event Object\n\t\t\tvalidate(this.value);\n\tinput(type=\"password\" name=\"password\")\n\t\t{change}\n\t\t\tcheckPasswordStrength(this.value);\n```\n\nThe above code will automatically register the 'onchange' event handler with\nthe corresponding `input` tags.\n\nAs shown in the example, your event handler may reference `this` (the DOM\nelement that triggered the event) or `e` (the browser's event Object). Be\naware that every browser's event Object might be slightly different,\nespecially in legacy browsers. In addition, if you are rendering the template\nin the browser (i.e. using client-side templates), your event handler will\nhave access to the view's locals.\n\n### Functions\n\nFunctions are reusable mini-templates. They are similar to 'mixins' in Jade.\n\nDefining a function:\n\n```\nfunction textbox(name, value)\n\tinput(type=\"text\", name=name, value=value)\n```\n\nCalling a function and inserting into template structure:\n\n```\nform\n\tcall textbox(\"firstName\", \"Blake\")\n```\n\nOr... maybe just putting the generated HTML into a variable?\n\n```\ncall textbox(\"firstName\", \"Blake\") > text\n//alternative syntax: call text = textbox(\"firstName\", \"Blake\")\nform\n\t!=text\n```\n\nBoth examples would render:\n\n```html\n<form><input type=\"text\" name=\"firstName\" value=\"Blake\"/></form>\n```\n\nYou can also append content rendered by a function to a variable:\n`call textbox(\"firstName\", \"Blake\") >> text`\n\tor... alternatively...\n`call text += textbox(\"firstName\", \"Blake\")`\n\nNote: when you define a block (see below) within a function, and you output the rendered\ncontent to a variable, the block will be destroyed immediately after the function call.\n\nYes, you can use `arguments` within your function, just like a \"real\" JavaScript function.\nIn fact, functions are \"real\" JavaScript functions, so even closures work! Although, remember\nthat functions have access to the variables in scope at the time the function was defined, not\nthe variables in scope when the function is called.\n\nExample:\n\n```\n- var x = 12;\nfunction test(foo)\n\th1=foo\n\t- if(x)\n\t\tp=x\n#example\n\tcall test(\"Header\")\n```\n\nwould render: `<div id=\"example\"><h1>Header</h1><p>12</p></div>`\n\n#### Adding classes or an id to rendered function content\n\nYes, you can add a class name or id to the first element rendered by a function:\n\n```\nfunction dialog(msg)\n\t.dialog\n\t\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n```\n\nwhich would render as `<div id=\"foobar\" class=\"dialog foo bar\">Blade is awesome</div>`.\n\nAlthough, if you try it with something like this, you get an error because the first\nchild rendered by the function is not a tag.\n\n```\nfunction dialog(msg)\n\t= msg\ncall dialog(\"Blade is awesome\")#foobar.foo.bar\n//compiler might generate an error, or it might just ignore the id and classes\n```\n\n### Dynamic file includes\n\n`include \"file.blade\"`\n\nThis will insert \"file.blade\" right into the current view at runtime, as if the contents\nof the included file were copied right into the current view.\n\nIf you don't know the name of the file to be included until runtime, that's no problem.\nThe include statement can also be followed by the name of a JavaScript variable\ncontaining the filename to be included.  These are called *dynamic filename includes*.\n\n```\n- var filename = \"file.blade\"\ninclude filename\n```\n\n**CAUTION:** When using *dynamic filename includes* in the browser, be sure that you\nhave properly loaded all views that might be included into the browser's cache before\nexecuting the view containing the *dynamic filename include*. See the [implementation\ndetails](#fileIncludeDetails) for a more detailed explanation.\n\nIf you do not specifiy a file extension, `.blade` will be appended to your string\ninternally.\n\nYou may also place an `include` inside of a `function`, `block`, or `chunk`.\n\nFinally, you can specify which local variables should be passed to the included view\ntemplate by using the `exposing` keyword.  By default, Blade will pass the parent's\nlocal variables to the included template; however, when using the `exposing` keyword,\nyou can specify exactly which variables are to be exposed to the included template.\n\nFor example:\n\n```\n- header = \"Header: 1, 2, 3\"\n- text = \"This is some text: 1, 2, 3\"\n- for(var i = 0; i < 10; i++)\n\tinclude \"foobar\" exposing i, text\n```\n\nIn the example above, variables `i` and `text` are exposed to \"foobar.blade\";\nthe `header` variable will not be accessible from \"foobar.blade\".\n\n### Blocks\n\nBlocks allow you to mark places in your template with code that may or may not be\nrendered later.\n\nYou can do a lot with blocks, including template inheritance, etc. They behave quite\ndifferently from Jade.\n\nThere are two types of blocks: regular blocks and parameterized blocks.\n\n#### Regular blocks\n\nRegular blocks are defined using the \"block\" keyword followed by a block name. Then,\nyou optionally put indented block content below. Like this:\n\n```\nblock regular_block\n\th1 Hello\n\tp This is a test\n```\n\nAssuming nothing else happens to the block, it will be rendered as\n`<h1>Hello</h1><p>This is a test</p>` as expected. Empty blocks are also permitted.\nA simple, empty block looks like this: `block block_name`\n\nOf course, the purpose of declaring/defining a block is to possibly modify it later.\nYou can modify a block using three different commands:\n\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nExample:\n\n```\nappend regular_block\n\tp This is also a test\n```\n\n#### Replacing a block\n\nReplacing a block is somewhat confusing, so I will explain further. If you replace\na block, you are not changing the location of the defined block; you are only\nreplacing the content of the block at its pre-defined location. If you want to change\nthe location of a block, simply re-define a new block ([see below]\n(#what-happens-if-i-define-the-same-block-more-than-once)).\n\nIn addition, when you replace a block, all previously appended and prepended content is\nlost. The behavior is usually desired, but it can sometimes be a source of confusion.\n\nIf you replace a parameterized block (described below) with a regular block, you cannot\ncall \"render\" on that block.\n\nYou can replace a regular block with a parameterized block (described below). This will\nalso clear the contents of the block, as expected.\n\n#### Parameterized blocks\n\nThe other type of block is called a parameterized block, and it looks like this:\n\n```\nblock param_block_yo(headerText, text)\n\th1= headerText\n\tp= text\n```\n\nParameterized blocks do not render automatically because they require parameters.\nTherefore, assuming nothing else happens to the block, the block will not be rendered\nat all.\n\nTo render a block, use the \"render\" keyword like this:\n\n```\nrender param_block_yo(\"Some header text\", 'Some \"paragraph\" text')\n```\n\nNow, assuming nothing else happens to the block, the block will be rendered as:\n\n```html\n<h1>Some header text</h1><p>Some &quot;paragraph&quot; text</p>\n```\n\nYou can `render` as many times as you wish, and by default, the rendered content will\nbe appended to the block. You can also prepend the rendered content to the block or\nreplace the contents of the block with rendered content. Here are the variations:\n\n- `render param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render append param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\t(same as above)\n- `render prepend param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n- `render replace param_block_yo(\"Some header text\", 'Some \"paragraph\" text')`\n\nParameterized blocks are really cool because regular \"append\", \"prepend\", and \"replace\"\nall work, too. Just remember that order matters.\n\nAnother example:\n\n```\nhead\n\tblock header(pageTitle)\n\t\ttitle= pageTitle\nbody\n\th1 Hello\n\trender header(\"Page Title\")\n\tappend header\n\t\tscript(type=\"text/javascript\")\n\trender header(\"Page Title\")\n\tprepend header\n\t\tmeta\n```\n\nWill output:\n\n```html\n<head>\n\t<meta/>\n\t<title>Page Title</title>\n\t<script type=\"text/javascript\"></script>\n\t<title>Page Title</title>\n</head>\n<body>\n\t<h1>Hello</h1>\n</body>\n```\n\n#### What happens if I define the same block more than once?\n\nYou can re-define a block that has already been defined with another \"block\"\nstatement. This completely destroys the previously defined block.\nPreviously executed \"append\", \"prepend\", \"replace\", and \"render\" blocks do not affect the\nre-defined block.\n\nIn summary...\n\n- Use the `block` keyword to mark where the block will go (block definition).\n- Use the `render` keyword to render the matching \"parameterized\" block.\n\tDo not use this on a regular block.\n- Use the `append` keyword to append to the matching block.\n- Use the `prepend` keyword to prepend to the matching block.\n- Use the `replace` keyword to replace the matching block.\n\nYou may not render, append to, prepend to, or replace undefined blocks. If you do so,\nan error message will occur.\n\nWhen you define a block within a function, and you output the function's rendered\ncontent to a variable, the defined block will be destroyed immediately after\nthe function call.\n\n### Template Inheritance\n\nThere is no `extends` keyword.  Just use blocks and includes:\n\nlayout.blade:\n\n```\nhtml\n\thead\n\t\tblock title(pageTitle)\n\t\t\ttitle=pageTitle\n\tbody\n\t\tblock body\n```\n\nhomepage.blade:\n\n```\ninclude \"layout.blade\"\nrender title(\"Homepage\")\nreplace block body\n\th1 Hello, World\n```\n\nIf you render layout.blade, you get: `<html><head></head><body></body></html>`, but if you\nrender homepage.blade, you get:\n\n```html\n<html>\n\t<head>\n\t\t<title>Homepage</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello, World</h1>\n\t</body>\n</html>\n```\n\n### Chunks\n\nChunks are simply functions that return HTML. They behave a bit differently than\nconventional Blade functions.\n\nFunctions are called with `call` statements, and their rendered content is injected\nright into a template. You can also capture the HTML they render by outputting to a\nvariable, as described above. Chunks, on the other hand, always return HTML, and they\ncannot be called using `call` statements. The only way to render a chunk is to call it\nvia your code (see example below).\n\nOne reason you might define a chunk is to pass it to\n[Meteor's](http://meteor.com/) \n[`Meteor.ui.chunk` function](http://docs.meteor.com/#meteor_ui_chunk); however,\nchunks can be used for other purposes, as well.\nYou can also use chunks to work with [`Meteor.ui.listChunk`]\n(http://docs.meteor.com/#meteor_ui_listchunk).\n\nExample:\n\n```\nchunk header(text)\n\th1= text\n\n!= __.chunk.header(\"Hello\")\n```\n\nThe above example defines a named chunk `header` with one parameter. Then, the chunk\nis called by calling the `__.chunk.header` function. When defining a chunk, parameters\nare optional, and if you omit the name, the chunk is simply named `last`.\n\nAnother example:\n\n```\nchunk\n\th1 Hello!\ndiv\n\t!= __.chunk.last()\n```\n\nrenders as `<div><h1>Hello!</h1></div>`\n\nIf you override the `templateNamespace` compiler option, you will need to replace all\ninstances of the double underscore (`__`) variable with the `templateNamespace` variable.\n\nAPI\n---\n\n`var blade = require('blade');`\n\n### blade.compile(string, [options,] cb)\n\nCompiles a Blade template from a string.\n\n- `string` is a string of Blade\n- `options` include:\n\t- `filename` - the filename being compiled (required when using [includes]\n\t\t(#dynamic-file-includes) or the `cache` option)\n\t- `cache` - if true, the compiled template will be cached (defaults to false)\n\t- `debug` - outputs debugging information to the console (defaults to false)\n\t- `minify` - if true, Blade generates a minified template without debugging\n\t\tinformation (defaults to true if `cache` option is set; false, otherwise)\n\t\tIf [UglifyJS](https://github.com/mishoo/UglifyJS) is installed, Blade\n\t\tmay automatically compress or prettify the template depending on whether\n\t\t`minify` is true or false.\n\t- `includeSource` - if true, Blade inserts the Blade source file directly into\n\t\tthe compiled template, which can further improve error reporting, although\n\t\tthe size of the template is increased significantly. (defaults to true if\n\t\tand only if `process.env.NODE_ENV` is \"development\" and minify is false;\n\t\tdefaults to false, otherwise)\n\t- `doctypes` - use this Object instead of `blade.Compiler.doctypes`\n\t- `selfClosingTags` - use this array instead of `blade.Compiler.selfClosingTags`\n\t- `filters` - use this Object instead of `blade.Compiler.filters`\n\t- `templateNamespace` - the name of the reserved variable in the view\n\t\t(defaults to two underscores: __). Other reserved names are\n\t\t[listed here](#variable-names-to-avoid)\n\t- `basedir` - the base directory where Blade templates are located. This option is\n\t\tprimarily used by the Blade middleware to allow the Blade runtime to properly\n\t\tload file includes.\n- `cb` is a function of the form: `cb(err, tmpl)` where `err` contains\n\tany parse or compile errors and `tmpl` is the compiled template.\n\tIf an error occurs, `err` may contain the following properties:\n\t- `message` - The error message\n\t- `expected` - If the error is a 'SyntaxError', this is an array of expected tokens\n\t- `found` - If the error is a 'SyntaxError', this is the token that was found\n\t- `filename` - The filename where the error occurred\n\t- `offset` - The offset in the string where the error occurred\n\t- `line` - The line # where the error occurred\n\t- `column` - The column # where the error occurred\n\nNote: if there is a problem with the Blade compiler, or more likely, if there\nis a syntax error with the JavaScript code in your template, Node.js will not\nprovide any line number or other information about the error. At the time of this\nwriting, this is a limitation of the Google V8 engine.\n\nYou can render a compiled template by calling the function: `tmpl(locals, cb)`\n\n- `locals` are the local variables to be passed to the view template\n- `cb` is a function of the form `function(err, html)` where `err` contains\n\t\tany runtime errors and `html` contains the rendered HTML.\n\nIn addition, a compiled template has these properties and methods:\n\n- `template` - a function that also renders the template but accepts 3 parameters:\n\t`tmpl.template(locals, runtime, cb)`. This simply allows you to use a custom\n\truntime environment, if you choose to do so.\n- `filename` - the filename of the compiled template (if provided)\n- `dependencies` - an array of files that might be included by this template at\n\truntime\n- `unknownDependencies` - if true, this template uses *dynamic filename includes*\n\tand may include any file at any time.\n- `toString()` - a function that converts the view template function into a string\n\tof JavaScript code. If you need a client-side template for example, you can\n\tuse this function. [UglifyJS](https://github.com/mishoo/UglifyJS) is now used\n\tif you have it installed.\n\n### blade.compileFile(filename, [options,] cb)\n\nAsynchronously compile a Blade template from a filename on the filesystem.\n\n- `filename` is the filename\n- `options` - same as `blade.compile` above, except `filename` option is always\n\toverwritten\twith the `filename` specified. There is also a `synchronous`\n\toption that will tell Blade to read and compile the file synchronously\n\tinstead of asynchronously.\n- `cb` - same as `blade.compile` above\n\n### blade.renderFile(filename, options, cb)\n\nConvenience function to compile a template and render it.\n\n- `filename` is the filename\n- `options` - same as `blade.compileFile` above. This object is also passed\n\tto the view, so it should also contain your view's local variables.\n\tA few [reserved local variables](#variable-names-to-avoid) are removed\n\tbefore passing the locals to the view.\n- `cb` - a function of the form `function(err, html)`\n\n### blade.middleware(sourcePath, options)\n\nExpress middleware for serving compiled client-side templates to the browser.\nFor example, if you visit the URL \"/views/homepage.blade\" on your server, you\ncan compile the view stored at `sourcePath + \"/homepage.blade\"`\n\n- `sourcePath` - the path on the server where your views are stored\n- `options` include:\n\t- `mount` - the URL path where you can request compiled views (defaults to\n\t\t\"/views/\")\n\t- `runtimeMount` - the URL path where the minified Blade runtime is served\n\t\tto the browser (defaults to \"/blade/blade.js\"). Use `null` to disable\n\t\tthis functionality.\n\t- `pluginsMount` - the URL path where Blade plugins will be served to the\n\t\tbrowser (defaults to \"/blade/plugins/\"). Use `null` to disable this\n\t\tfunctionality.\n\t- `compileOptions` - options passed to `blade.compile()`. Defaults to:\n\n```javascript\n{\n\t'cache': process.env.NODE_ENV == \"production\",\n\t'minify': process.env.NODE_ENV == \"production\",\n\t'includeSource': process.env.NODE_ENV == \"development\"\n};\n````\n\n### blade.Compiler\n\nThe compiler itself. It has some useful methods and properties.\n\n### blade.Compiler.parse(string)\n\nJust generates the parse tree for the string. For debugging purposes only.\n\nExample using the API:\n\n```javascript\nvar blade = require('blade');\nblade.compile(\"string of blade\", options, function(err, tmpl) {\n\ttmpl(locals, function(err, html) {\n\t\tconsole.log(html);\n\t});\n});\n```\n\nHere is a sample Express application that uses Blade for server-side and client-side\ntemplates:\n\n```javascript\nvar express = require('express'),\n\tblade = require('blade');\nvar app = express.createServer();\napp.use(blade.middleware(__dirname + '/views') );\napp.use(express.static(__dirname + \"/public\") );\napp.set('views', __dirname + '/views');\napp.set('view engine', 'blade');\napp.get('/', function(req, res, next) {\n\tres.render('homepage');\n});\napp.listen(8000);\n```\n\nBrowser Usage\n-------------\n\nThe Blade compiler doesn't work on browsers yet, but the runtime should work\non every browser. That means that you can compile your templates on the server\nand serve them up to any browser. Blade provides a built-in Express middleware\nto do just that (see above).\n\nOnce you have the middleware setup, you can now serve your compiled Blade views\nto the client. Simply include the /blade/blade.js file in your `<script>`\ntags, and then call `blade.runtime.loadTemplate`.\n\n### blade.runtime.loadTemplate(filename, cb)\n\n- `filename` - the filename of the view you wish to retrieve, relative to the\n\t`sourcePath` you setup in the Blade middleware.\n- `cb` - your callback of the form `cb(err, tmpl)` where `tmpl` is your compiled\n\tBlade template. Call the template like this:\n\t`tmpl(locals, function(err, html) {...});`\n\nYour template will be stored in `blade.cachedViews` and will be cached until the\nuser reloads the page or navigates to another page.\n\nYes, included files work, too. Like magic.\n\nExample client-side JavaScript:\n\n```javascript\nblade.runtime.loadTemplate(\"homepage.blade\", function(err, tmpl) {\n\ttmpl({'users': ['John', 'Joe']}, function(err, html) {\n\t\tconsole.log(html); //YAY! We have rendered HTML\n\t});\n});\n```\n\nAs a side note, you can override the `blade.runtime.loadTemplate` function with\nyour own implementation.\n\nSimple Example\n--------------\n\nThe following Blade document ...\n\n```blade\n!!! 5\nhtml\n\thead\n\t\ttitle Blade\n\tbody\n\t\t#nav\n\t\t\tul\n\t\t\t\t- for(var i in nav)\n\t\t\t\t\tli\n\t\t\t\t\t\ta(href=nav[i])= i\n\t\t#content.center\n\t\t\th1 Blade is cool\n```\n\n... compiles to this JavaScript function ...\n\n```javascript\nfunction tmpl(locals,cb,__){var __=__||[];__.r=__.r||blade.runtime,__.blocks=__.blocks||{},__.func=__.func||{},__.locals=locals||{};with(__.locals){__.push(\"<!DOCTYPE html>\",\"<html\",\">\",\"<head\",\">\",\"<title\",\">\",__.r.escape(\"Blade\"),\"</title>\",\"</head>\",\"<body\",\">\",\"<div\",' id=\"nav\"',\">\",\"<ul\",\">\");for(var i in nav)__.push(\"<li\",\">\",\"<a\"),__.r.attrs({href:{val:nav[i],escape:!0}},__,this),__.push(\">\",__.r.escape(i),\"</a>\",\"</li>\");__.push(\"</ul>\",\"</div>\",\"<div\",' id=\"content\"',' class=\"center\"',\">\",\"<h1\",\">\",__.r.escape(\"Blade is cool\"),\"</h1>\",\"</div>\",\"</body>\",\"</html>\"),__.inc||__.r.done(__)}cb(null,__.join(\"\"),__)}\n```\n\n... now you call the function like this...\n\n```javascript\ntmpl({\n\t'nav': {\n\t\t'Home': '/',\n\t\t'About Us': '/about',\n\t\t'Contact': '/contact'\n\t}\n}, function(err, html) {\n\tif(err) throw err;\n\tconsole.log(html);\n});\n```\n\n... and you get this:\n\n```html\n<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<title>Blade</title>\n\t</head>\n\t<body>\n\t\t<div id=\"nav\">\n\t\t\t<ul>\n\t\t\t\t<li><a href=\"/\">Home</a></li>\n\t\t\t\t<li><a href=\"/about\">About Us</a></li>\n\t\t\t\t<li><a href=\"/contact\">Contact</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"content\" class=\"center\">\n\t\t\t<h1>Blade is cool</h1>\n\t\t</div>\n\t</body>\n</html>\n```\n\nPlugins\n-------\n\n**Live UI**\n\nBlade provides a Live UI plugin that allows Blade to support live binding. Live binding\nprovides automatic two-way synchronization between your models and views on a given web\npage.  That is, when data in your Model is updated, the rendered Blade views on the\nclient's browser are automatically updated with the new content, and similarly, when a\nBlade view is rendered in the browser, the Blade [event handlers](#event-handlers) can\nupdate data in the model.\n\nComplete documentation for the Live UI plugin (including several examples) can be found\non the [Live UI Plugin wiki page]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nEventually, the Live UI plugin might live in a separate repository and work for any\ntemplating language.\n\n**definePropertyIE8**\n\nThis plugin is a prerequisite for the Live UI plugin if you plan on using Live UI in\nInternet Explorer 8.\n\nMeteor Support\n--------------\n\nBlade also provides a [Meteor smart package](http://docs.meteor.com/#smartpackages)\nunder the `meteor` directory. At the time of this writing, Blade is not a part of the\nMeteor core smart package list. The easiest thing to do right now is to symlink that\ndirectory into your Meteor packages directory like this:\n\n`ln -s /path/to/.../blade/meteor /path/to/.../meteor/packages/blade`\n\nOf course, the actual path where Blade and Meteor are installed on your system may vary.\nYou need to replace the above command with the correct paths, as appropriate.\n\nThen, execute `meteor add blade` in your Meteor project directory.\n\n**More documentation and examples for Meteor + Blade can be found [on this wiki page]\n(https://github.com/bminer/node-blade/wiki/Using-Blade-with-Meteor)**\n\nImplementation Details\n----------------------\n\n**PEG.js**\n\nThe Blade parser is built using [PEG.js](https://github.com/dmajda/pegjs).\nThanks to the PEG.js team for making this project much easier than I had\nanticipated! To modify the parser, simply change `./lib/parser/blade-grammer.pegjs`,\nand the new parser will be automatically built the next time you run tests.\n\n**Running tests**\n\nTo install all devDependencies, just do: `npm link` or install manually.\nTo run tests, ensure devDependencies are installed, then run: `npm test`\n\n**Compiler-runtime relationship**\n\nAlso, I'd like to mention here that the Blade compiler and Blade runtime are rather\nclosely coupled. Unfortunately, that means that templates compiled with an older\nBlade compiler might not be compatible with a newer runtime and vice versa.\nTo avoid issues, be sure that your Blade templates were compiled with the compiler of\nthe same version as the runtime on which they will run. If you think this is too\ninconvenient, please feel free to complain, but I probably will ignore you. :)\n\n<span id=\"fileIncludeDetails\"></span>\n**File Includes**\n\nIncluded Blade templates MUST be loaded synchronously, and if this is not possible, an\nerror will be thrown.  Obviously, when rendering views on the server, this is not a\nproblem since Node provides synchronous file system calls; however, on the client, it is\nonly possible to include a file synchronously when the file is already in the browser's\ncache.  When the name of the file to be included is known at compile-time (i.e. you are\nnot using a *dynamic filename include*), the compiler will notify the Blade middleware\nof a particular view's dependencies.  This allows the client-side template loader to\nalso load and cache any dependent views in advance, preventing any issues from occurring.\nNevertheless, when *dynamic filename includes* are used, the compiler has no way of\ndetermining which views will be included at runtime, and if a dynamically included view\nis not loaded into the browser's cache when the include statement is reached, the\nincluded view must be be loaded asynchronously and, as such, an error will be thrown.\n\nLoading and compiling files synchronously may temporarily reduce your application's\nresponsiveness, but because compiled views are often cached, this is not really much\nof an issue.\n\n**Event Handlers**\n\nEvent handlers in Blade work by injecting the event handler function as an HTML comment\ndirectly before the bound element.  Then, the appropriate event attribute (i.e.\nonclick, onchange, etc.) on the element is set to call `blade.runtime.trigger`.  The\n`trigger` function basically grabs the HTML comment, passes the contents through eval(),\nand binds the event handler directly to the element.  This means that the event handlers\nwork on templates rendered on the browser or on the server. Everything gets wired up the\nfirst time that the event occurs on the browser.\n\nThe Blade runtime also keeps track of any event handlers bound to a specific element\nby assigning each element an 'id' attribute, if necessary.  When the view has\nfinished rendering, the Blade runtime will pass a bunch of information (chunks, blocks,\nfunctions, or event handlers that were defined, etc.) to the 3rd (undocumented) argument\nof the render callback function.  If you are rendering Blade templates on the browser,\nyou can access the list of event handlers and bind the defined event handler directly\nto the element by looking up the element by its 'id' instead of letting the `trigger`\nfunction do its magic.  The advantage of binding direclty to the defined event handler is\nthat (thanks to closures) you can still reference the locals that were passed to your\nview and modify them, as needed... directly from your event handler. This allows your view\ncode to automatically synchronize with your model, providing one-way view-to-model\nsynchronization capabilties. Very cool!  For examples of this and for more information,\ncheck out the [Live UI plugin]\n(https://github.com/bminer/node-blade/wiki/Live-UI-Blade-Plugin).\n\nBenchmarks\n----------\n\nSee the [Benchmark wiki page](https://github.com/bminer/node-blade/wiki/Benchmarks)\nfor more information.\n\nLicense\n-------\n\nSee the [LICENSE.txt file](https://raw.github.com/bminer/node-blade/master/LICENSE.txt).\n","_id":"blade@2.6.0","dist":{"shasum":"b23e2cfda125b39e0f0df1b79eadb9d9b9d4bc32","tarball":"http://registry.npmjs.org/blade/-/blade-2.6.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}]}},"readme":"","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"time":{"modified":"2012-08-07T14:22:09.461Z","created":"2012-05-04T03:33:05.387Z","0.0.0":"2012-05-04T03:33:05.607Z","0.5.0":"2012-05-06T07:40:31.718Z","0.5.1":"2012-05-06T07:55:46.590Z","0.5.2":"2012-05-08T13:50:47.407Z","0.6.0":"2012-05-08T15:13:53.261Z","0.6.1":"2012-05-08T16:03:04.346Z","0.7.0":"2012-05-08T21:04:14.058Z","0.8.0":"2012-05-09T03:05:01.125Z","0.9.0":"2012-05-09T04:42:36.568Z","0.9.1":"2012-05-09T06:36:20.385Z","0.9.2":"2012-05-09T13:33:06.516Z","0.10.0":"2012-05-10T20:07:50.763Z","0.10.1":"2012-05-10T21:15:44.532Z","0.10.2":"2012-05-10T21:20:47.733Z","0.10.3":"2012-05-11T01:28:12.912Z","0.11.0":"2012-05-14T17:26:28.651Z","0.11.1":"2012-05-14T18:44:15.626Z","0.11.2":"2012-05-14T19:14:19.816Z","0.11.3":"2012-05-14T19:33:59.157Z","0.12.0":"2012-05-16T20:21:31.446Z","0.12.2":"2012-05-17T04:54:05.422Z","0.12.3":"2012-05-17T06:14:22.775Z","0.12.4":"2012-05-17T06:33:53.619Z","0.12.5":"2012-05-17T08:26:20.268Z","1.0.0":"2012-05-18T14:38:03.909Z","1.0.1":"2012-05-18T20:09:07.333Z","1.1.0":"2012-05-21T01:53:40.377Z","1.1.1":"2012-05-25T21:55:44.198Z","1.2.0":"2012-05-26T03:16:00.563Z","1.2.1":"2012-05-29T07:36:25.807Z","1.2.2":"2012-05-29T18:01:14.691Z","1.2.3":"2012-05-29T19:05:00.364Z","1.2.4":"2012-05-30T14:30:41.724Z","1.2.5":"2012-05-30T15:54:08.829Z","1.2.6":"2012-05-30T19:51:44.697Z","1.2.7":"2012-05-31T00:41:45.227Z","1.3.0":"2012-06-03T03:04:22.185Z","1.3.1":"2012-06-03T03:29:08.951Z","1.3.2":"2012-06-03T04:00:35.910Z","1.3.3":"2012-06-03T04:10:02.214Z","1.3.4":"2012-06-07T12:43:03.401Z","1.3.5":"2012-06-12T13:07:15.712Z","1.3.6":"2012-06-12T13:18:12.623Z","1.3.7":"2012-06-12T13:38:34.272Z","1.3.8":"2012-06-12T15:17:39.570Z","1.3.9":"2012-06-12T20:25:30.359Z","1.4.0":"2012-06-13T20:00:11.915Z","1.4.1":"2012-06-22T17:28:23.800Z","1.4.2":"2012-06-25T17:12:34.155Z","2.0.0beta":"2012-06-28T04:39:43.912Z","2.0.0beta2":"2012-06-28T05:00:13.475Z","2.0.0beta3":"2012-06-28T13:08:47.478Z","2.0.0":"2012-07-05T19:24:31.952Z","2.1.0":"2012-07-06T16:54:10.061Z","2.2.0":"2012-07-06T19:10:02.086Z","2.2.1":"2012-07-06T19:30:19.691Z","2.2.2":"2012-07-06T19:39:54.049Z","2.2.3":"2012-07-06T20:34:13.600Z","2.2.4":"2012-07-06T23:00:47.411Z","2.3.0":"2012-07-10T20:18:45.439Z","2.3.1":"2012-07-10T20:24:09.116Z","2.3.2":"2012-07-10T20:37:33.944Z","2.3.3":"2012-07-12T04:55:21.534Z","2.3.4":"2012-07-12T05:25:34.415Z","2.3.5":"2012-07-12T06:42:42.835Z","2.3.6":"2012-07-12T20:25:31.517Z","2.3.7":"2012-07-16T14:18:10.183Z","2.4.0":"2012-07-17T06:13:09.866Z","2.4.1":"2012-07-17T21:07:16.865Z","2.5.0":"2012-07-18T02:24:39.406Z","2.5.1":"2012-07-18T03:41:42.880Z","2.6.0alpha":"2012-07-19T03:11:04.260Z","2.6.0":"2012-07-19T03:33:09.195Z"},"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"repository":{"type":"git","url":"https://github.com/bminer/node-blade.git"},"users":{},"_attachments":{"blade-2.6.0.tgz":{"content_type":"application/octet-stream","revpos":222,"digest":"md5-W+YsG8DYlVa4R03O1G+NzA==","length":65516,"stub":true},"blade-2.5.1.tgz":{"content_type":"application/octet-stream","revpos":215,"digest":"md5-J/ai/sKHf2Ti6iNLwCzaIA==","length":65106,"stub":true},"blade-2.5.0.tgz":{"content_type":"application/octet-stream","revpos":213,"digest":"md5-Uz/k2mUTTlxUapG5Hh/+pA==","length":65109,"stub":true},"blade-2.4.1.tgz":{"content_type":"application/octet-stream","revpos":206,"digest":"md5-2nPDApjHAkg2zMQmW+jxQQ==","length":66901,"stub":true},"blade-2.4.0.tgz":{"content_type":"application/octet-stream","revpos":198,"digest":"md5-i5dR7RnbrBGhiOA3Q0yEOA==","length":66253,"stub":true},"blade-2.3.7.tgz":{"content_type":"application/octet-stream","revpos":196,"digest":"md5-x5uf6R00O8TXpU3xpIBv6g==","length":66328,"stub":true},"blade-2.3.6.tgz":{"content_type":"application/octet-stream","revpos":194,"digest":"md5-aDXf64XKfD+ppgf47IreqA==","length":65314,"stub":true},"blade-2.3.5.tgz":{"content_type":"application/octet-stream","revpos":186,"digest":"md5-9jCvuMaeNEsclT4BMK3l9g==","length":64680,"stub":true},"blade-2.3.4.tgz":{"content_type":"application/octet-stream","revpos":168,"digest":"md5-3wzetOMXs0ZKxOryUsVbIg==","length":64595,"stub":true},"blade-2.3.3.tgz":{"content_type":"application/octet-stream","revpos":166,"digest":"md5-ihHjjhOXOTICChN91cS+hg==","length":64533,"stub":true},"blade-2.3.2.tgz":{"content_type":"application/octet-stream","revpos":164,"digest":"md5-+A86BouTHrn65tbOB0Eihg==","length":63988,"stub":true},"blade-2.3.1.tgz":{"content_type":"application/octet-stream","revpos":162,"digest":"md5-ZCnAmqRg3yZU/oUf/0hMoQ==","length":63987,"stub":true},"blade-2.3.0.tgz":{"content_type":"application/octet-stream","revpos":160,"digest":"md5-nhPHPX/1k8xcoA6FFvhqdg==","length":63979,"stub":true},"blade-2.2.4.tgz":{"content_type":"application/octet-stream","revpos":156,"digest":"md5-fI0X8evR3sTQGl+gLxqwUg==","length":62943,"stub":true},"blade-2.2.3.tgz":{"content_type":"application/octet-stream","revpos":152,"digest":"md5-Lako8Ycoe1Er4ggnLreLLA==","length":62940,"stub":true},"blade-2.2.2.tgz":{"content_type":"application/octet-stream","revpos":148,"digest":"md5-AhMV1K77pbdgjew+MulZtw==","length":62934,"stub":true},"blade-2.2.1.tgz":{"content_type":"application/octet-stream","revpos":144,"digest":"md5-JN5JUvLD7NNT0AawPO6f/w==","length":62905,"stub":true},"blade-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":140,"digest":"md5-WNzQgwSySy0hXTZLdCYxeA==","length":63175,"stub":true},"blade-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":136,"digest":"md5-zp8Rjhi6QnJjUKOd/uiRvQ==","length":60082,"stub":true},"blade-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":126,"digest":"md5-Ig/xas/zeJE1B9WglsCXKA==","length":58188,"stub":true},"blade-2.0.0beta2.tgz":{"content_type":"application/octet-stream","revpos":117,"digest":"md5-w+Tlhk+Qz6Bw9DkBBs0Xhw==","length":58115,"stub":true},"blade-2.0.0beta.tgz":{"content_type":"application/octet-stream","revpos":113,"digest":"md5-9xqjg/fFN0cqM5XPHZNXtA==","length":58371,"stub":true},"blade-1.4.2.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-jxspwUW3C7N4KbkX5pb6rA==","length":55748,"stub":true},"blade-1.4.1.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-r5sG0r4TOarBPA9PCCT5YQ==","length":55622,"stub":true},"blade-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":103,"digest":"md5-UHFf9uH4M7wxzZCy2MGetw==","length":55483,"stub":true},"blade-1.3.9.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-wXzSDgeyHLy6zEr+mZlHMA==","length":53064,"stub":true},"blade-1.3.8.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-YBCfTuW7+XdQjHATO9FRAg==","length":53033,"stub":true},"blade-1.3.7.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-d+xUbs0dbD00xBOvu+1j2A==","length":52856,"stub":true},"blade-1.3.4.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-b2youPOykP+Tfhg3uE+Z+Q==","length":51991,"stub":true},"blade-1.3.3.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-y/7O6wSzCMNFrSfJFXBgBw==","length":51874,"stub":true},"blade-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-HJk9+IoZfgnH9sDvH4EIuQ==","length":51869,"stub":true},"blade-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-ANNpGbirhohAfkHHdnlFvg==","length":51722,"stub":true},"blade-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-ZoCLMZp0iUCXyGsYin9Cig==","length":51703,"stub":true},"blade-1.2.7.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-jjojXMRPPfEz90noBJ2Ntw==","length":51431,"stub":true},"blade-1.2.6.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-qg0rBdibq1QwdOdoqB+lgw==","length":51224,"stub":true},"blade-1.2.5.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-j6g/J4R+gUsmdkLSc3GqzQ==","length":51403,"stub":true},"blade-1.2.4.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-7RpUbyL6KYB9Ks100jEadQ==","length":51384,"stub":true},"blade-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-DysOCuPqfUKDaVFKNfOo8A==","length":51182,"stub":true},"blade-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-sMWkmmGUv9oWiulTmbzC0w==","length":51162,"stub":true},"blade-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-W93UWtNhlr8o/gKhtX+tmg==","length":51102,"stub":true},"blade-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-qMxHmeYfqT9BDr1bEEkRuA==","length":51073,"stub":true},"blade-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-Cv+N4WkX0EwSdYoRuW7wmg==","length":50552,"stub":true},"blade-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-5K5P3/RuCDcqdDYdP+0uvQ==","length":50089,"stub":true},"blade-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-2l4Cm4sCnRXisNiZHOY1GQ==","length":46411,"stub":true},"blade-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-j8TqiY5Bzn5Bm/YuieO6Lw==","length":45387,"stub":true},"blade-0.12.5.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-lub8EjEAmyiaL+IXXZOZRA==","length":44346,"stub":true},"blade-0.12.4.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-N6jT23vURscvpTO+xmnPaw==","length":44040,"stub":true},"blade-0.12.3.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-QZZM/ICtarst5HL+M9WIrg==","length":43846,"stub":true},"blade-0.12.2.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-Hg3PJjwV2OmpamgFjGPvMA==","length":42895,"stub":true},"blade-0.12.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-5dAGHVs8pWmMuRmsVPVUEA==","length":42026,"stub":true},"blade-0.11.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-y3NKzCjop+6co9ueOLev+Q==","length":40677,"stub":true},"blade-0.11.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ciKhrrRgdEKKy/uNaAT2tA==","length":40678,"stub":true},"blade-0.11.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-UI3Vg3EIKiPDPglPW2vDdQ==","length":40433,"stub":true},"blade-0.11.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-SjiG36SD4O+8pxTUKangOQ==","length":39483,"stub":true},"blade-0.10.3.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-64rdoUxsfIVtx9PEXlrFqA==","length":38960,"stub":true},"blade-0.10.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-t7c/OE0KXBvEa1CiN7WNmw==","length":37781,"stub":true},"blade-0.10.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-fTJUykaH4YrbjczWBBhaSw==","length":37742,"stub":true},"blade-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-HDhoIKGrmb+iClYj+QUYmQ==","length":37214,"stub":true},"blade-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1narhgZgRKAlm14vhpIbnw==","length":34914,"stub":true},"blade-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-WjRaz3PGPllBeaeMRLE5HQ==","length":33970,"stub":true},"blade-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-mwCnwUkKpdhGOd1DdGrnbg==","length":32787,"stub":true},"blade-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-MqqxceivluJsCNFY088OkA==","length":30807,"stub":true},"blade-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-j3M0l0/os+lwVAZ4yPMJ0w==","length":30269,"stub":true},"blade-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wOsiMFZHBPYNR5TOuHm1XQ==","length":27322,"stub":true},"blade-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-h3qE9KHPh2tKBCg450lFhg==","length":26697,"stub":true},"blade-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6+j7CSEVI4suZHJlqAWPrw==","length":26622,"stub":true},"blade-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4VC7xLsGhC5Ic26Dfz0X4A==","length":26629,"stub":true},"blade-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HrRp0pnjPynzABP9JEw7tg==","length":26532,"stub":true},"blade-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-u7LELYbIAsEcR5h0nD9uaA==","length":353,"stub":true}}}},
{"id":"bladestorm","key":"bladestorm","value":{"rev":"3-0ac8d33ef3b7f0ae8b67f081eb3b4b29"},"doc":{"_id":"bladestorm","_rev":"3-0ac8d33ef3b7f0ae8b67f081eb3b4b29","name":"bladestorm","description":"A lightweight web framework for node","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"cfddream","email":"cfddream@gmail.com"},"name":"bladestorm","description":"A lightweight web framework for node","version":"0.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"cfddream","email":"cfddream@gmail.com"},"_id":"bladestorm@0.0.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"45cd2982d4c0d973559486f9f39881a1a6967035","tarball":"http://registry.npmjs.org/bladestorm/-/bladestorm-0.0.0.tgz"},"readme":"","maintainers":[{"name":"cfddream","email":"cfddream@gmail.com"}]}},"readme":"","maintainers":[{"name":"cfddream","email":"cfddream@gmail.com"}],"time":{"modified":"2012-06-02T18:47:01.431Z","created":"2012-06-02T18:46:58.631Z","0.0.0":"2012-06-02T18:47:01.431Z"},"author":{"name":"cfddream","email":"cfddream@gmail.com"},"_attachments":{"bladestorm-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZWWkJEjDmY26D3blkTVhtw==","length":260,"stub":true}}}},
{"id":"blake","key":"blake","value":{"rev":"17-f478163bc41972043f283ae97c3f8ad4"},"doc":{"_id":"blake","_rev":"17-f478163bc41972043f283ae97c3f8ad4","name":"blake","description":"generate sites","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.1":{"author":{"name":"Michael Nisi","email":"mail@michaelnisi.com","url":"michaelnisi.com"},"name":"blake","description":"Blake helps to generate static sites.","version":"0.2.1","homepage":"https://github.com/michaelnisi/blake","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"main":"./blake.js","bin":{"blake":"./bin/blake.js"},"scripts":{"test":"vows test/* -spec"},"dependencies":{"step":"0.0.5"},"_npmUser":{"name":"michaelnisi","email":"mn@michaelnisi.com"},"_id":"blake@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d92de102672f148ec36ae415365ca6e01a72fa15","tarball":"http://registry.npmjs.org/blake/-/blake-0.2.1.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]},"0.2.3":{"author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"michaelnisi.com"},"name":"blake","description":"Blake is a view agnostic, blog aware static site generator.","version":"0.2.3","homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"main":"./blake.js","bin":{"blake":"./bin/blake.js"},"scripts":{"test":"vows test/* -spec"},"dependencies":{"step":"0.0.5"},"_npmUser":{"name":"michaelnisi","email":"mn@michaelnisi.com"},"_id":"blake@0.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"64ca0436865f2c8624faf2d733d20165eed07bc2","tarball":"http://registry.npmjs.org/blake/-/blake-0.2.3.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]},"0.2.4":{"author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com"},"name":"blake","description":"Blog aware and view agnostic infrastructure to generate static websites.","keywords":["static","web","site","blog","generator","infrastructure"],"version":"0.2.4","maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}],"homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"main":"./lib/blake.js","bin":{"blake":"./bin/blake.js"},"man":["./man/blake.1"],"scripts":{"test":"vows test/* --spec"},"engines":{"node":">=0.6"},"dependencies":{"mkdirp":">=0.3.0","fstream":">=0.1.14"},"devDependencies":{"vows":">=0.6.1"},"license":"MIT","_npmUser":{"name":"michaelnisi","email":"michael.nisi@gmail.com"},"_id":"blake@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"3c4d936df6b6aa6bec07fc7e58e9b95f8afd88f8","tarball":"http://registry.npmjs.org/blake/-/blake-0.2.4.tgz"}},"0.2.5":{"name":"blake","description":"generate sites","version":"0.2.5","homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"keywords":["blog","static","site","generator","infrastructure"],"main":"./lib/blake.js","bin":{"blake":"./bin/cli.js"},"man":["./man/blake.1"],"directories":{"lib":"./lib","example":"example","test":"test","man":"./man"},"scripts":{"test":"tap test/*.js"},"dependencies":{"mkdirp":"~0.3.0","fstream":"~0.1.14"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"http://michaelnisi.com"},"_npmUser":{"name":"michaelnisi","email":"michael.nisi@gmail.com"},"_id":"blake@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"63d5504bc6c17295081dc043800ef8ffcfea272d","tarball":"http://registry.npmjs.org/blake/-/blake-0.2.5.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]},"0.2.6":{"name":"blake","description":"generate sites","version":"0.2.6","homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"keywords":["blog","static","site","generator","infrastructure"],"main":"./lib/blake.js","bin":{"blake":"./bin/cli.js"},"man":["./man/blake.1"],"directories":{"lib":"./lib","example":"example","test":"test","man":"./man"},"scripts":{"test":"tap test/*.js"},"dependencies":{"mkdirp":"~0.3.0","fstream":"~0.1.14"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"http://michaelnisi.com"},"_npmUser":{"name":"michaelnisi","email":"michael.nisi@gmail.com"},"_id":"blake@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"eb7e44763dddcf8eaf6b2747b30f7278c597d398","tarball":"http://registry.npmjs.org/blake/-/blake-0.2.6.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]},"0.2.7":{"name":"blake","description":"generate sites","version":"0.2.7","homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"keywords":["blog","static","site","generator","infrastructure"],"main":"./lib/blake.js","bin":{"blake":"./bin/cli.js"},"man":["./man/blake.1"],"directories":{"lib":"./lib","example":"example","test":"test","man":"./man"},"scripts":{"test":"tap test/*.js"},"dependencies":{"mkdirp":"~0.3.0","fstream":"~0.1.14"},"devDependencies":{"tap":"0.1.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"http://michaelnisi.com"},"_npmUser":{"name":"michaelnisi","email":"michael.nisi@gmail.com"},"_id":"blake@0.2.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"09e0eeecd9a6ff23d3ebccd697604dd758c1ecd4","tarball":"http://registry.npmjs.org/blake/-/blake-0.2.7.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]},"0.3.0":{"name":"blake","description":"generate sites","version":"0.3.0","homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"keywords":["blog","static","site","generator","infrastructure"],"main":"./lib/blake.js","bin":{"blake":"./bin/cli.js"},"man":["./man/blake.1"],"directories":{"lib":"./lib","example":"example","test":"test","man":"./man"},"scripts":{"test":"tap test/*.js"},"dependencies":{"mkdirp":">=0.3.0","fstream":">=0.1.14","event-stream":">=2.1.5","through":">=0.0.3"},"devDependencies":{"tap":"0.1.x","rimraf":">=2.0.2"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"http://michaelnisi.com"},"readme":"# blake - generate sites\n\n## SYNOPSIS\n\n    blake source_directory target_directory  \n    blake source_directory target_directory source_file ...\n\n## DESCRIPTION   \n\nIn the first synopsis form, blake writes all files generated from input data in the `source_directory` to the `target_directory`. In the second synopsis form, just the file generated from the `source_file` is written to the `target_directory`. You can also generate from multiple source files. \n\nBlake is a [Node.js](http://nodejs.org) module that provides a simple, blog aware, and view agnostic infrastructure to generate static websites. For unrestricted choice of input formats and template languages, blake confines itself to IO and template routing; it delegates the actual file generation to user-written view modules. Blake runs asynchronously; it can be used from command-line or as library.\n\n[![Build Status](https://secure.travis-ci.org/michaelnisi/blake.png)](http://travis-ci.org/michaelnisi/blake)\n\n## LIBRARY USAGE\n\nGenerate all files:\n\n    var blake = require('blake')\n\n    blake('source', 'target', function(err) {\n      // Site generated\n    })\n\nGenerate a specific file:\n\n    var blake = require('blake')\n\n    blake('source', 'target', 'source/about.md', function(err) {\n      // About page generated\n    })\n\nGenerate multiple specific files:\n\n    var blake = require('blake')\n      , source  = 'path/to/input'\n      , target = 'path/to/output'\n      , home = path.resolve(input, 'home.md')\n      , archive = path.resolve(input, 'archive.md')\n\n    blake(source, target, home, archive , function(err) {\n      // Home and archive page generated\n    })\n\n## OVERVIEW\n\nAt startup blake requires a configuration module, which has to export paths and a map of user-written functions that implement the actual generation of output artifacts. According to the configuration module blake reads all input data files. At the top of each input file blake expects a JSON header. From the header and the content of the input file blake constructs a source object, with which it applies the `bake` function of the according view module. This is done for all input files in parallel. The static resources are copied to the output directory as they are.\n\n## CONFIGURATION\n\nConsider the following example of a configuration module:\n\n    // This module covers configuration.\n\n    // Export path conventions for input data.\n    exports.paths = {\n      data: 'data', // required\n      templates: 'templates', // required\n      resources: 'resources', // optional\n      posts: 'data/posts' // optional\n    };\n\n    // Export map with bake functions by template names.\n    exports.bakeFunctions = {\n      'rss.jade': require('./rss.js').bake,\n      'article.jade': require('./article.js').bake,\n      'home.jade': require('./home.js').bake,\n      'about.jade': require('./about.js').bake,\n      'archive.jade': require('./archive.js').bake\n    };\n\nThe `paths` object defines input paths, where the two required directories are `data` and `templates`. From `data` blake loads general input data; from `templates` templates. The two optional directories are `resources` and `posts`. The content of `resources` is copied to output as it is. The `posts` directory hosts blog posts.\n\nThe `bakeFunctions` object is a map of user-written functions which implement the actual generation of output artifacts. Theses functions are mapped by template name. \n\n## INPUT\n\nAt the top of each input file blake expects a JSON string that is interpreted as header and provides parameters for generating. Besides it can contain additional user defined data—a raw version of the header is passed to the `bake` methods of the views. The input data for a blog entry could look like the following: \n\n    {\n      \"title\": \"Example\",\n      \"description\": \"An example article\",\n      \"template\": \"article.jade\",\n      \"date\": \"2012-03-21\"\n    }\n\n    The content of the example article.\n\nThe end of the header is marked by an empty line. Everything that follows is interpreted as content and is passed to the views untouched.\n\n## HEADER\n\nJSON at the top of an input file:\n\n    {\n      \"title\": \"Example\",\n      \"description\": \"An example article\",\n      \"template\": \"article.jade\",\n      \"date\": \"2012-03-21\",\n      \"path\": \"2012/03\",\n      \"name\": \"example\"\n    }\n\n* `title` is the title of the page (optional)\n* `description` is the description of the page or rather the post (optional)\n* `template`is the filename of template to use (required)\n* `date` is the publish date, if not provided it's set to `NOW` (optional)\n* `path` is the output path, if not provided the path of the input file is used (optional)\n* `name` is used as filename of the output file, if not provided the filename of the input file is used (optional)\n\nThe header is extendable with arbritrary fields, which can be interpreted by the views. The source object, passed to the views, provides a reference to the header object.\n\nIf you decide to mirror input file path and name in your output, you can omit path and name. In that case a typical header of a blog post might look like the following.\n\n    {\n      \"title\": \"Example\",\n      \"description\": \"An example article\",\n      \"template\": \"article.jade\",\n      \"date\": \"2012-03-21\",\n    }\n\nAn input file can consist of just the header; for example an RSS feed:\n\n    {\n      \"title\": \"Blog\",\n      \"description\": \"Just my blog.\",\n      \"link\": \"http://my.blog\",\n      \"template\": \"rss.jade\",\n      \"name\": \"rss.xml\"\n    }\n\n## VIEWS\n\nViews must export a `bake` function with this signature:\n\n    bake (src, callback)\n\nIn this function you implement the transformation from input to output and pass the result to the callback.\n\nThe `src` object for a exemplary blog post exposes the following (for brevity `body` and `template` appear shortened):\n\n    header: { title: 'Closure',\n              description: 'A function together with a referencing environment',\n              template: 'article.jade',\n              date: Tue, 18 Oct 2011 00:00:00 GMT,\n              name: 'closures.html',\n              path: '/2011/10' },\n    body: '…',\n    paths: { outputPathName: '../website',\n             pathToResources: 'resources',\n             pathToData: 'data',\n             templatesPathName: 'templates',\n             posts: 'data/posts',\n             config: 'views/config.js' },\n    filename: 'data/posts/2011/10/closures.md',\n    date: Tue, 18 Oct 2011 00:00:00 GMT,\n    templatePath: 'templates/article.jade',\n    path: '../website/2011/10',\n    name: 'closures.html',\n    link: '/2011/10/closures',\n    dateString: 'Tue Oct 18 2011',\n    template: '…'\n\nTo see a simple example:\n   \n    git clone git://github.com/michaelnisi/blake.git \n    cd blake/example\n    node generate.js\n\nTo evaluate a more elaborated example, you could generate my personal [site](http://michaelnisi.com), which requires [Jade](http://jade-lang.com/) and [Markdown](http://daringfireball.net/projects/markdown/):\n\n    npm install -g blake\n    npm install blake jade markdown\n    git clone git@github.com:michaelnisi/michaelnisi.git \n    blake michaelnisi /tmp/michaelnisi-site\n\nYou might want to read the [documentation](http://michaelnisi.github.com/michaelnisi/article.html) of the views for this site, which are written in [CoffeeScript](http://coffeescript.org/); not to put you off, just to give it a shot—I found the use case rather fitting.\n\n## DEPLOYMENT\n\nOf course you can build your site locally and upload it to your webserver manually, but I recommend to run Blake on a server, and use [post-receive hooks](http://help.github.com/post-receive-hooks/) to automatically generate your site on the server everytime you push to your input data repository.\n\n## INSTALLATION\n\nInstall via [npm](http://npmjs.org/):\n\n    npm install -g blake\n\nIf you not want to use command-line blake, install without global flag:\n\n    npm install blake\n\nTo install from source:\n\n    git clone git://github.com/michaelnisi/blake.git \n    cd blake\n    npm link\n\n## SEE ALSO\n\n* [Website](http://michaelnisi.github.com/blake/)\n* [Documentation](http://michaelnisi.github.com/blake/blake.html)\n\n## LICENSE\n\n[MIT License](https://raw.github.com/michaelnisi/blake/master/LICENSE)\n","_id":"blake@0.3.0","dist":{"shasum":"30bdffd4658c0fc3b43e99344e698093c0ee9d1d","tarball":"http://registry.npmjs.org/blake/-/blake-0.3.0.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]},"0.3.1":{"name":"blake","description":"generate sites","version":"0.3.1","homepage":"http://michaelnisi.github.com/blake/","repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"keywords":["blog","static","site","generator","infrastructure"],"main":"./lib/blake.js","bin":{"blake":"./bin/cli.js"},"man":["./man/blake.1"],"directories":{"lib":"./lib","example":"example","test":"test","man":"./man"},"scripts":{"test":"tap test/*.js"},"dependencies":{"mkdirp":">=0.3.0","fstream":">=0.1.14","event-stream":">=2.1.5"},"devDependencies":{"tap":"0.1.x","rimraf":">=2.0.2"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"http://michaelnisi.com"},"readme":"# blake - generate sites\n\n## SYNOPSIS\n\n    blake source_directory target_directory  \n    blake source_directory target_directory source_file ...\n\n## DESCRIPTION   \n\nIn the first synopsis form, blake writes all files generated from input data in the `source_directory` to the `target_directory`. In the second synopsis form, just the file generated from the `source_file` is written to the `target_directory`. You can also generate from multiple source files. \n\nBlake is a [Node.js](http://nodejs.org) module that provides a simple, blog aware, and view agnostic infrastructure to generate static websites. For unrestricted choice of input formats and template languages, blake confines itself to IO and template routing; it delegates the actual file generation to user-written generator functions. Blake is non-blocking; it can be used from command-line or as library.\n\n[![Build Status](https://secure.travis-ci.org/michaelnisi/blake.png)](http://travis-ci.org/michaelnisi/blake)\n\n## LIBRARY USAGE\n\nGenerate all files:\n\n    var blake = require('blake')\n\n    blake('source', 'target', function(err) {\n      // Site generated\n    })\n\nGenerate a specific file:\n\n    var blake = require('blake')\n\n    blake('source', 'target', 'source/about.md', function(err) {\n      // About page generated\n    })\n\nGenerate multiple specific files:\n\n    var blake = require('blake')\n      , source  = 'path/to/input'\n      , target = 'path/to/output'\n      , home = path.resolve(input, 'home.md')\n      , archive = path.resolve(input, 'archive.md')\n\n    blake(source, target, home, archive , function(err) {\n      // Home and archive page generated\n    })\n\n## OVERVIEW\n\nBlake requires a configuration module (config.js), which it expects to load from the root of the source directory; config has to export a paths object, and a map of generator functions. If no files are explicitly specifified, blake copies the static resoures to the target directory, and each data source is piped to a stream that generates and writes the arfifact to the target directory.  \n\n## CONFIGURATION\n\nConsider the following configuration module:\n\n    exports.paths = {\n      data: 'data' // required\n    , templates: 'templates' // required\n    , resources: 'resources' // optional\n    , posts: 'data/posts' // optional\n    }\n\n    exports.views = {\n      'rss.jade': require('./rss.js').bake\n    , 'article.jade': require('./article.js').bake\n    , 'home.jade': require('./home.js').bake\n    , 'about.jade': require('./about.js').bake\n    , 'archive.jade': require('./archive.js').bake\n    }\n\nThe `paths` object defines input paths, where the two required directories are `data` and `templates`. From `data` blake loads general input data; from `templates` templates. The two optional directories are `resources` and `posts`. The content of `resources` is copied to output as it is. The `posts` directory hosts blog posts.\n\nThe `views` object is a map of user-written functions which implement the actual generation of output artifacts. Theses functions are mapped by template name. \n\n## INPUT\n\nAt the top of each input file blake expects a JSON string that is interpreted as header and provides parameters for generating. Besides it can contain additional user defined data—a raw version of the header is passed to the `bake` methods of the views. The input data for a blog entry could look like the following: \n\n    {\n      \"title\": \"Example\",\n      \"description\": \"An example article\",\n      \"template\": \"article.jade\",\n      \"date\": \"2012-03-21\"\n    }\n\n    The content of the example article.\n\nThe end of the header is marked by an empty line. Everything that follows is interpreted as content and is passed to the views untouched.\n\n## HEADER\n\nJSON at the top of an input file:\n\n    {\n      \"title\": \"Example\",\n      \"description\": \"An example article\",\n      \"template\": \"article.jade\",\n      \"date\": \"2012-03-21\",\n      \"path\": \"2012/03\",\n      \"name\": \"example\"\n    }\n\n* `title` is the title of the page (optional)\n* `description` is the description of the page or rather the post (optional)\n* `template`is the filename of template to use (required)\n* `date` is the publish date, if not provided it's set to `NOW` (optional)\n* `path` is the output path, if not provided the path of the input file is used (optional)\n* `name` is used as filename of the output file, if not provided the filename of the input file is used (optional)\n\nThe header is extendable with arbritrary fields, which can be interpreted by the views. The source object, passed to the views, provides a reference to the header object.\n\nIf you decide to mirror input file path and name in your output, you can omit path and name. In that case a typical header of a blog post might look like the following.\n\n    {\n      \"title\": \"Example\",\n      \"description\": \"An example article\",\n      \"template\": \"article.jade\",\n      \"date\": \"2012-03-21\",\n    }\n\nAn input file can consist of just the header; for example an RSS feed:\n\n    {\n      \"title\": \"Blog\",\n      \"description\": \"Just my blog.\",\n      \"link\": \"http://my.blog\",\n      \"template\": \"rss.jade\",\n      \"name\": \"rss.xml\"\n    }\n\n## VIEWS\n\nViews must export a `bake` function with this signature:\n\n    bake (item, callback)\n\nIn this function you implement the transformation from input to output and pass the result to the callback.\n\nThe `src` object for a exemplary blog post exposes the following (for brevity `body` and `template` appear shortened):\n\n    { header: \n      { title: 'Static Websites',\n        description: '...',\n        template: 'article.jade',\n        data: Thu May 17 2012 02:00:00 GMT +0200 (CEST),\n        path: '2012/05',\n        name: 'static-websites.html' }\n      body: '...', \n      paths: \n      { target: '/tmp/michaelnisi-site',\n        resources: '/Users/michael/workspace/michaelnisi/resources',\n        data: '/Users/michael/workspace/michaelnisi/data',\n        templates: '/Users/michael/workspace/michaelnisi/templates',\n      posts: '/Users/michael/workspace/michaelnisi/data/posts' },\n      title: 'Static Websites',\n      name: 'static-websites.html',\n      date: Thu May 17 2012 02:00:00 GMT+0200 (CEST),\n      templatePath: '/Users/michael/workspace/michaelnisi/templates/article.jade',\n      path: '/tmp/michaelnisi-site/2012/05/static-websites.html',\n      link: '2012/05/static-websites',\n      dateString: 'Thu May 17 2012',\n      bake: [Function],\n      template: <Buffer 0a 20 20 20 20 64 69 76 ...> }\n\nTo see a simple example:\n   \n    git clone git://github.com/michaelnisi/blake.git \n    cd blake/example\n    node generate.js\n\nTo evaluate a more elaborated example, you could generate my personal [site](http://michaelnisi.com), which requires [Jade](http://jade-lang.com/) and [Markdown](http://daringfireball.net/projects/markdown/):\n\n    npm install -g blake\n    npm install blake jade markdown\n    git clone git@github.com:michaelnisi/michaelnisi.git \n    blake michaelnisi /tmp/michaelnisi-site\n    node /tmp/michaelnisi-site/conf/dev.js\n\n## DEPLOYMENT\n\nOf course you can build your site locally and upload it to your webserver manually, but I recommend to run Blake on a server, and use [post-receive hooks](http://help.github.com/post-receive-hooks/) to automatically generate your site on the server everytime you push to your input data repository.\n\n## INSTALLATION\n\nInstall via [npm](http://npmjs.org/):\n\n    npm install -g blake\n\nIf you not want to use command-line blake, install without global flag:\n\n    npm install blake\n\nTo install from source:\n\n    git clone git://github.com/michaelnisi/blake.git \n    cd blake\n    npm link\n\n## SEE ALSO\n\n* [Website](http://michaelnisi.github.com/blake/)\n* [Documentation](http://michaelnisi.github.com/blake/blake.html)\n\n## LICENSE\n\n[MIT License](https://raw.github.com/michaelnisi/blake/master/LICENSE)\n","_id":"blake@0.3.1","dist":{"shasum":"074b54402e988764bd07f2e6c9af35b5165fe3e7","tarball":"http://registry.npmjs.org/blake/-/blake-0.3.1.tgz"},"maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}]}},"readme":"# Blake\n\nBlake is a blog aware, markup and template language agnostic static site generator.\n","maintainers":[{"name":"michaelnisi","email":"mn@michaelnisi.com"}],"time":{"modified":"2012-07-19T17:49:11.945Z","created":"2012-02-17T15:16:01.129Z","0.2.1":"2012-02-17T15:16:02.656Z","0.2.3":"2012-03-06T19:32:18.710Z","0.2.4":"2012-04-08T18:24:43.386Z","0.2.5":"2012-05-28T19:33:31.718Z","0.2.6":"2012-05-31T10:17:43.712Z","0.2.7":"2012-05-31T15:13:10.379Z","0.3.0":"2012-07-11T17:30:49.462Z","0.3.1":"2012-07-19T17:49:11.945Z"},"author":{"name":"Michael Nisi","email":"michael.nisi@gmail.com","url":"http://michaelnisi.com"},"repository":{"type":"git","url":"git://github.com/michaelnisi/blake.git"},"_attachments":{"blake-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ckr5eAGx1LQ8bqhiulHyGg==","length":26898,"stub":true},"blake-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-MHdq9nYRtWUAHVg9bHBTng==","length":26650,"stub":true},"blake-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-PdwQfaRirKvEeRu6i/EXBw==","length":23532,"stub":true},"blake-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-h7AsaKqbokWuBw9QIn/bPA==","length":29097,"stub":true},"blake-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-KbFzWTvg+f68a/iOg5u2+g==","length":29138,"stub":true},"blake-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ioWIUP7QYf+w0xrF5uqAbg==","length":22165,"stub":true},"blake-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Kbt3wjmDLETXmcKaaSsGFg==","length":174080,"stub":true},"blake-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8GR9LZ+Z2r6tFdrD/bAlLQ==","length":20480,"stub":true}}}},
{"id":"blam","key":"blam","value":{"rev":"11-d4e5050e706f080e054a8ed41d658cfc"},"doc":{"_id":"blam","_rev":"11-d4e5050e706f080e054a8ed41d658cfc","name":"blam","description":"Simple, inline, functional html templating.","dist-tags":{"latest":"0.5.4"},"versions":{"0.4.2":{"author":{"name":"Matt McCray","email":"matt@elucidata.net","url":"http://www.elucidata.net"},"name":"blam","description":"Simple, inline, functional html templating.","version":"0.4.2","homepage":"http://darthapo.github.com/blam.js/","repository":{"type":"git","url":"git://github.com/darthapo/blam.js.git"},"main":"blam.js","engines":{"node":"~0.6"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"elucidata","email":"matt@elucidata.net"},"_id":"blam@0.4.2","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"76e6fffc3926d141c10c697fe5798dff1ad5b436","tarball":"http://registry.npmjs.org/blam/-/blam-0.4.2.tgz"},"maintainers":[{"name":"elucidata","email":"matt@elucidata.net"}]},"0.5.1":{"author":{"name":"Matt McCray","email":"matt@elucidata.net","url":"http://www.elucidata.net"},"name":"blam","description":"Simple, inline, functional html templating.","version":"0.5.1","homepage":"http://darthapo.github.com/blam.js/","repository":{"type":"git","url":"git://github.com/darthapo/blam.js.git"},"main":"blam.js","engines":{"node":"~0.6"},"dependencies":{},"devDependencies":{"chai":"~1.0.4"},"optionalDependencies":{},"_npmUser":{"name":"elucidata","email":"matt@elucidata.net"},"_id":"blam@0.5.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"53dd5c9e9757d0d2a3971ba46a834028581ce783","tarball":"http://registry.npmjs.org/blam/-/blam-0.5.1.tgz"},"maintainers":[{"name":"elucidata","email":"matt@elucidata.net"}]},"0.5.2":{"author":{"name":"Matt McCray","email":"matt@elucidata.net","url":"http://www.elucidata.net"},"name":"blam","description":"Simple, inline, functional html templating.","version":"0.5.2","homepage":"http://darthapo.github.com/blam.js/","repository":{"type":"git","url":"git://github.com/darthapo/blam.js.git"},"main":"blam.js","engines":{"node":"~0.6"},"dependencies":{},"devDependencies":{"chai":"~1.0.4"},"optionalDependencies":{},"_npmUser":{"name":"elucidata","email":"matt@elucidata.net"},"_id":"blam@0.5.2","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"bf8331db60ea9f7438b17035a4440591cb0e0172","tarball":"http://registry.npmjs.org/blam/-/blam-0.5.2.tgz"},"maintainers":[{"name":"elucidata","email":"matt@elucidata.net"}]},"0.5.3":{"author":{"name":"Matt McCray","email":"matt@elucidata.net","url":"http://www.elucidata.net"},"name":"blam","description":"Simple, inline, functional html templating.","version":"0.5.3","homepage":"http://darthapo.github.com/blam.js/","repository":{"type":"git","url":"git://github.com/darthapo/blam.js.git"},"main":"blam.js","engines":{"node":"~0.6"},"dependencies":{},"devDependencies":{"chai":"~1.0.4"},"optionalDependencies":{},"_npmUser":{"name":"elucidata","email":"matt@elucidata.net"},"_id":"blam@0.5.3","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"2b5a951b94d5d2c19503552039221da7f6e2afb6","tarball":"http://registry.npmjs.org/blam/-/blam-0.5.3.tgz"},"maintainers":[{"name":"elucidata","email":"matt@elucidata.net"}]},"0.5.4":{"author":{"name":"Matt McCray","email":"matt@elucidata.net","url":"http://www.elucidata.net"},"name":"blam","description":"Simple, inline, functional html templating.","version":"0.5.4","homepage":"http://darthapo.github.com/blam.js/","repository":{"type":"git","url":"git://github.com/darthapo/blam.js.git"},"main":"blam.js","engines":{"node":"~0.6"},"dependencies":{},"devDependencies":{"chai":"~1.0.4"},"optionalDependencies":{},"_npmUser":{"name":"elucidata","email":"matt@elucidata.net"},"_id":"blam@0.5.4","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"98494cbaf1984a41a9d9d7762cbca5b99a171df2","tarball":"http://registry.npmjs.org/blam/-/blam-0.5.4.tgz"},"maintainers":[{"name":"elucidata","email":"matt@elucidata.net"}]}},"readme":"blam.js\n=======\n\n**Simple, Tiny, Fast** (enough)\n\nExample usage (in CoffeeScript):\n\n```coffeescript\nblam(->\n  html(\n    head(\n      title( \"Hello\" )\n      script( src:\"/my-script.js\" )\n      link(\n        rel:\"stylesheet\"\n        type:\"text/css\"\n        href:\"/my-styles.css\"\n      )\n    )\n    body(\n      article( id:\"main\",\n        section.content(\n          p(\"Loading...\")\n        )\n        aside.sidebar( \"Nav here\" )\n      )\n    )\n  )\n)\n```\n\nYou can use it in JavaScript too (but it's much prettier in CoffeeScript):\n\n```javascript\nblam(function(){\n  return html(\n    head(\n      title( \"Hello\" ), \n      script({ src: \"/my-script.js\" }),\n      link({ rel: \"stylesheet\", type: \"text/css\", href: \"/my-styles.css\" })), \n      body(\n        article({ id: \"main\" }, \n          section.content(\n            p(\"Loading...\")\n          ), \n        aside.sidebar( \"Nav here\")\n      )\n    )\n  )\n});\n```\n\n## New \"Fancy\" Mode\n\nUsing the fancy mode, now enabled by default, during the compilation phase it adds support for assigning classnames via a dot syntax like slim or haml. Example:\n\n```coffeescript\nhtml= blam ->\n  div.container(\n    div.header( \n      id:'my-header'\n      h1(\"Header\")\n    )\n    div.content(\n      \"Content\"\n    )\n    div.footer.hidden (\n      \"Multiple classes too\"\n    )\n  )\n```\n\nWill generate:\n\n```html\n<div class=\"container\"><div class=\"header\" id=\"my-header\"><h1>Header</h1></div><div class=\"content\">Content</div><div class=\"footer hidden\">Multiple classes too</div></div>\n```\n\nNote: The lack of extra whitespace/indentation is intentional, blam generates html for the browser to read, humans not so much.\n\n\n## Notes\n\nClocks in at ~1K minified and gzipped.\n\nSupports adding custom tags:\n\n```coffeescript\nblam.define 'jqmpage', (args...)->\n  div 'data-role':'page',\n    div 'data-role':'header', args...\n```\n\nPasses initial arguments on to markup block:\n\n```coffeescript\nblam name:'Matt', (user)->\n  div( id:'user-block',\n    p(\"Hello \", user.name)\n  )\n```\n\nCan be \"compiled\" into an executable function (good for often repeated bits of code):\n\n```coffeescript\ntemplate= blam.compile (user)->\n  div( id:'user-block',\n    p(\"Hello \", user.name)\n  )\n\nhtml+= template(user) for user in all_users\n```\n\nFor array elements you can use the `each` tag:\n\n```coffeescript\ntemplate= blam.compile (users)->\n  div( id:'user-block',\n    each(users, (user)->\n      p(\"Hello \", user.name)\n    )\n  )\n\nhtml+= template(all_users)\n```\n\n\n## BackBone Example\n\n```coffeescript\nclass TweetListView extends Backbone.View\n  className: 'tweet-list'\n\n  initialize: ->\n    # bind to @collection changes to add/remove TweetViews\n    \n  render: ->\n    @collection.each (tweet)-> \n      tweetView= new TweetView( model:tweet )\n      @el.append tweetView.render().el\n\n\nclass TweetView extends Backbone.View\n  className: 'tweet'\n  \n  events:\n    \"click .reply\": \"doReply\"\n  \n  doReply: (e)=>\n    alert \"Do reply code here...\"\n    \n  render: ->\n    @el.attr 'id', @model.get(id)\n    @el.append blam(@model, (model)->\n      div.body(\n        div.actions(\n          button.reply( \"Reply...\" )\n          button.retweet( \"Retweet...\" )\n        )\n        model.get('body')\n      )\n    )\n```\n\n## Todo\n\n- Would like to support all the modern browsers and possibly as far back as IE8? (run tests!!!)\n\n- Need to test AMD support.\n\n- Extract and expose tag building helpers.\n\n- Dasherize attributes? (dataRole:\"page\" would expand to 'data-role=\"page\"')\n\n\n## Aren't `eval` and `with` Evil?\n\nNo! They're just misunderstood. This is exactly why they are useful as a language feature. They allow excellent DSL generation.\n\nThat said, it *is* a good rule of thumb that if you don't know when is best to use them; don't.\n","maintainers":[{"name":"elucidata","email":"matt@elucidata.net"}],"time":{"modified":"2012-06-25T00:44:07.575Z","created":"2012-06-22T20:36:21.284Z","0.4.2":"2012-06-22T20:36:22.684Z","0.5.1":"2012-06-23T23:04:09.357Z","0.5.2":"2012-06-24T03:28:07.978Z","0.5.3":"2012-06-24T18:49:13.180Z","0.5.4":"2012-06-25T00:44:07.575Z"},"author":{"name":"Matt McCray","email":"matt@elucidata.net","url":"http://www.elucidata.net"},"repository":{"type":"git","url":"git://github.com/darthapo/blam.js.git"},"_attachments":{"blam-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZLZsCDl+2MXjZuj4fxgxXg==","length":77650,"stub":true},"blam-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-QW30vjBzVmHPukyNpkHX3Q==","length":76382,"stub":true},"blam-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Zbuy2kg4D0LBWnyWAkaedQ==","length":76490,"stub":true},"blam-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0AirWN7xQubvWe9ImD2kPA==","length":76015,"stub":true},"blam-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-47yBmmTaz4C5IA4GQmEOrg==","length":73645,"stub":true}}}},
{"id":"blarg","key":"blarg","value":{"rev":"11-32c450e536c87669a22348236841da51"},"doc":{"_id":"blarg","_rev":"11-32c450e536c87669a22348236841da51","name":"blarg","description":"A markdown-based blog toolkit","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.0":{"name":"blarg","version":"0.0.0","description":"A markdown-based blog server","author":{"name":"Henry Smith","email":"henry@henrysmith.org","url":"http://blog.henrysmith.org"},"keywords":["blog server","markdown blog","flat file blog"],"bugs":{"email":"henry@henrysmith.org","url":"https://github.com/henry-smith/blarg/issues"},"repository":{"type":"git","url":"git://github.com/henry-smith/blarg.git"},"scripts":{"start":"node src/blarg.js start","stop":"node src/blarg.js stop"},"dependencies":{"async":"0.1.16","cluster":"0.7.7","daemon":"0.4.1","dateformat":"1.0.x","express":"2.5.8","glob":"3.0.1","jsdom":"0.2.10","markdown":"0.3.1"},"_npmUser":{"name":"henry","email":"henry@henrysmith.org"},"_id":"blarg@0.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"ebd4397d35708eaa01ca748ddb1fa7047e6ec7fd","tarball":"http://registry.npmjs.org/blarg/-/blarg-0.0.0.tgz"},"maintainers":[{"name":"henry","email":"henry@henrysmith.org"}],"directories":{}},"0.1.3":{"name":"blarg","version":"0.1.3","description":"A markdown-based blog toolkit","author":{"name":"Henry Smith","email":"henry@henrysmith.org"},"keywords":["markdown blog"],"bugs":{"email":"henry@henrysmith.org","url":"https://github.com/henry-smith/blarg/issues"},"repository":{"type":"git","url":"git://github.com/henry-smith/blarg.git"},"dependencies":{"async":"0.1.16","glob":"3.0.1","jsdom":"0.2.10","markdown":"0.3.1"},"_npmUser":{"name":"henry","email":"henry@henrysmith.org"},"_id":"blarg@0.1.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0a71c1813b31f7f1670bd1aff18b7df84ef949a7","tarball":"http://registry.npmjs.org/blarg/-/blarg-0.1.3.tgz"},"maintainers":[{"name":"henry","email":"henry@henrysmith.org"}]},"0.1.4":{"name":"blarg","version":"0.1.4","description":"A markdown-based blog toolkit","author":{"name":"Henry Smith","email":"henry@henrysmith.org"},"keywords":["markdown blog"],"bugs":{"email":"henry@henrysmith.org","url":"https://github.com/henry-smith/blarg/issues"},"repository":{"type":"git","url":"git://github.com/henry-smith/blarg.git"},"dependencies":{"async":"0.1.16","glob":"3.0.1","jsdom":"0.2.10","markdown":"0.3.1","mkdirp":"0.3.0"},"_npmUser":{"name":"henry","email":"henry@henrysmith.org"},"_id":"blarg@0.1.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d00463eed0e67c1f5a8ab4618ae988ead75cd483","tarball":"http://registry.npmjs.org/blarg/-/blarg-0.1.4.tgz"},"maintainers":[{"name":"henry","email":"henry@henrysmith.org"}]}},"readme":"\nblarg\n-----\n\nBlarg is the Node.js software powering my blog at [blog.henrysmith.org](http://blog.henrysmith.org)\n\n","maintainers":[{"name":"henry","email":"henry@henrysmith.org"}],"time":{"modified":"2012-03-21T21:52:29.471Z","created":"2012-02-17T19:16:01.242Z","0.0.0":"2012-02-17T19:16:03.680Z","0.0.2":"2012-02-18T15:38:21.794Z","0.1.3":"2012-03-20T21:27:33.794Z","0.1.4":"2012-03-21T21:52:29.471Z"},"author":{"name":"Henry Smith","email":"henry@henrysmith.org"},"repository":{"type":"git","url":"git://github.com/henry-smith/blarg.git"},"_attachments":{"blarg-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-G73iQ5/+2JoJ7IDEikIyAg==","length":3204,"stub":true},"blarg-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-37YaBGjV3jBNGDHnGdFP+w==","length":1591,"stub":true},"blarg-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QUEqnIi7fi25x06LjujCSA==","length":110147,"stub":true}}}},
{"id":"bleach","key":"bleach","value":{"rev":"17-ce05bddfeaa9cda7813ed16bfd087868"},"doc":{"_id":"bleach","_rev":"17-ce05bddfeaa9cda7813ed16bfd087868","name":"bleach","description":"A minimalistic HTML sanitizer","dist-tags":{"latest":"0.2.1"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.0.0","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bleach/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.0.0","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"4c8c1e8e2dfcfaca2e12dcd60254bb9f640f5270","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.1.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.1.0","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bleach/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.1.0","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"76d81043b40854578ac25852eaf88be57cdc7073","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.1.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.1.1":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.1.1","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bleach/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.1.1","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"801e2f86dbf79bfa002d77a9e1ded8e7c8a19ff1","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.1.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.1.2":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.1.2","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bleach/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.1.2","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"fdaa7bb60e8355fd355d7b218f9797e26884e351","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.1.2.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.1.3":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.1.3","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/ecto/.npm/bleach/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.1.3","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"dist":{"shasum":"95237b599db766cf6a42370f90cc23d898a5ef39","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.1.3.tgz"},"scripts":{},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.1.4":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.1.4","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bleach/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.1.4","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"26daecab9ee61a445abd74f70d6594f885c130f8","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.1.4.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.2.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.2.0","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bleach/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bleach@0.2.0","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8bddf4f413286370c330c92b5c76f11da32fb538","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.2.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.2.1":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bleach","description":"A minimalistic HTML sanitizer","version":"0.2.1","homepage":"https://github.com/ecto/bleach/issues","repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"main":"index.js","engines":{"node":"*"},"dependencies":{"ent":"0.0.x"},"devDependencies":{"vows":"0.5.x"},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bleach@0.2.1","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"693a4375849fb9debc29f2bca03e0eb8564e8946","tarball":"http://registry.npmjs.org/bleach/-/bleach-0.2.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2011-11-17T02:35:34.242Z","created":"2011-09-22T21:09:37.565Z","0.0.0":"2011-09-22T21:09:37.931Z","0.1.0":"2011-09-22T21:59:10.190Z","0.1.1":"2011-09-27T00:32:45.340Z","0.1.2":"2011-09-29T23:46:49.353Z","0.1.3":"2011-10-16T20:16:33.043Z","0.1.4":"2011-10-17T19:37:42.487Z","0.2.0":"2011-10-17T21:53:48.400Z","0.2.1":"2011-11-17T02:35:34.242Z"},"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/bleach.git"},"_attachments":{"bleach-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-5awBX94xPiwwCaN9zMCRqA==","length":10240,"stub":true},"bleach-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-o3lhMMSqChbFa5bDh7VIwg==","length":4170,"stub":true},"bleach-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-OIac962toaeHhC+ymPwjww==","length":3639,"stub":true},"bleach-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-5UVeEH11HBLikzWX9vO/Wg==","length":3539,"stub":true},"bleach-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-m+hQ0U4PYS2OtnrMpEprYA==","length":3524,"stub":true},"bleach-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-aAd6iNJrJngMoARn05qTdg==","length":3511,"stub":true},"bleach-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0+zJgRvDii9GcF8FO4T3WA==","length":1506,"stub":true},"bleach-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tQ/oA5xfp1t1kwzqXdao2Q==","length":998,"stub":true}}}},
{"id":"bleach.js","key":"bleach.js","value":{"rev":"3-f3ce3cbfe37c16380bd4457655f090bc"},"doc":{"_id":"bleach.js","_rev":"3-f3ce3cbfe37c16380bd4457655f090bc","name":"bleach.js","description":"A tree-walking HTML sanitizer, modeled after the python `bleach` library.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bleach.js","version":"0.0.1","description":"A tree-walking HTML sanitizer, modeled after the python `bleach` library.","main":"index.js","directories":{"example":"examples","test":"test"},"dependencies":{"jsdom":"~0.2.10","should":"~0.5.1","underscore":"~1.3.1"},"devDependencies":{"mocha":"~0.11.0"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git://github.com/brianloveswords/bleach.js.git"},"keywords":["sanitizer"],"author":{"name":"Brian J. Brennan"},"contributors":[{"name":"Andrew Sutherland"}],"license":"MIT","readme":"bleach.js is an INCOMPLETE port of Bleach (https://github.com/jsocol/bleach), the whitelist\nbased HTML sanitizer.  It runs on node.js using jsdom, in the browser as a\nsingle file that contributes \"Bleach\" to the global environment, or as an AMD\n(Asynchronous Module Definition, https://github.com/amdjs/amdjs-api/wiki/AMD).\n\n\n\n## Tests ##\n\nTo test, use mocha: http://visionmedia.github.com/mocha/\n\nRun \"npm install -g mocha\", then you can invoke \"mocha\" in the root dir\nto run the tests.\n\nCurrently, all tests are ported from Bleach proper.  There are some cases where\njsdom does not do the right thing according to the tests, and as a result, 3\ntests fail:\n\n- \"bleach cleaning normalish html should strip out attributes\" fails because\n  jsdom (as configured), wants to output XHTML tags for \"br\".\n\n- \"bleach cleaning normalish html should convert bare entities to escaped entities\"\n  fails because \" < entity\" gets fully corrected into a pair of start and end\n  tags.  This is not what the browser does, and so we're blaming jsdom.\n\n- \"bleach cleaning normalish html should handle wildcard attributes\" fails for\n  same XHTML reason on an img tag.\n\nTODO: Figure out how to get jsdom to do what we want here and/or file bugs\nand/or create patches to fix jsdom and/or switch to another node library or\nwhat not.\n","_id":"bleach.js@0.0.1","dist":{"shasum":"a8905993051d9ecfd2f9e7e2a3fce293f93b915d","tarball":"http://registry.npmjs.org/bleach.js/-/bleach.js-0.0.1.tgz"},"maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]}},"readme":"bleach.js is an INCOMPLETE port of Bleach (https://github.com/jsocol/bleach), the whitelist\nbased HTML sanitizer.  It runs on node.js using jsdom, in the browser as a\nsingle file that contributes \"Bleach\" to the global environment, or as an AMD\n(Asynchronous Module Definition, https://github.com/amdjs/amdjs-api/wiki/AMD).\n\n\n\n## Tests ##\n\nTo test, use mocha: http://visionmedia.github.com/mocha/\n\nRun \"npm install -g mocha\", then you can invoke \"mocha\" in the root dir\nto run the tests.\n\nCurrently, all tests are ported from Bleach proper.  There are some cases where\njsdom does not do the right thing according to the tests, and as a result, 3\ntests fail:\n\n- \"bleach cleaning normalish html should strip out attributes\" fails because\n  jsdom (as configured), wants to output XHTML tags for \"br\".\n\n- \"bleach cleaning normalish html should convert bare entities to escaped entities\"\n  fails because \" < entity\" gets fully corrected into a pair of start and end\n  tags.  This is not what the browser does, and so we're blaming jsdom.\n\n- \"bleach cleaning normalish html should handle wildcard attributes\" fails for\n  same XHTML reason on an img tag.\n\nTODO: Figure out how to get jsdom to do what we want here and/or file bugs\nand/or create patches to fix jsdom and/or switch to another node library or\nwhat not.\n","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}],"time":{"modified":"2012-08-10T18:14:43.791Z","created":"2012-08-10T18:14:43.430Z","0.0.1":"2012-08-10T18:14:43.791Z"},"author":{"name":"Brian J. Brennan"},"repository":{"type":"git","url":"git://github.com/brianloveswords/bleach.js.git"},"_attachments":{"bleach.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-51u+3vp9IqR2cWVMcS5B9w==","length":6816,"stub":true}}}},
{"id":"blend","key":"blend","value":{"rev":"23-8b29c85e1f246ae4060d06114c2462b0"},"doc":{"_id":"blend","_rev":"23-8b29c85e1f246ae4060d06114c2462b0","name":"blend","description":"High speed image blending","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"blend","description":"High speed image blending","version":"0.0.1","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">=0.4.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"dependencies":{},"_id":"blend@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b4d79e0ddf8855707b3829359b14b4f115ad9382","bin":{"0.4-ares1.7.4-ev4.4-openssl0.9.8l-v83.1.8.14-darwin-10.7.0":{"shasum":"e0a918e9d723bce913b6c2fdada804a470312b3c","tarball":"http://registry.npmjs.org/blend/-/blend-0.0.1-0.4-ares1.7.4-ev4.4-openssl0.9.8l-v83.1.8.14-darwin-10.7.0.tgz"}},"tarball":"http://registry.npmjs.org/blend/-/blend-0.0.1.tgz"}},"0.0.2":{"name":"blend","description":"High speed image blending","version":"0.0.2","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">=0.4.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/blend/0.0.2/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"blend@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"73f5bf0078df9b7cf96500a0487249c7cc486b17","tarball":"http://registry.npmjs.org/blend/-/blend-0.0.2.tgz"}},"0.0.3":{"name":"blend","description":"High speed image blending","version":"0.0.3","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">=0.4.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/blend/0.0.3/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"blend@0.0.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"6154f0c13d7dcae7d94334779abd590c9eecab25","tarball":"http://registry.npmjs.org/blend/-/blend-0.0.3.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}]},"0.0.4":{"name":"blend","description":"High speed image blending","version":"0.0.4","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">=0.4.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"_npmJsonOpts":{"file":"/Users/diggersf/.npm/blend/0.0.4/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"blend@0.0.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"414a536e6f8422a420391a1fb414f4691447f56d","tarball":"http://registry.npmjs.org/blend/-/blend-0.0.4.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}]},"0.0.5":{"name":"blend","description":"High speed image blending","version":"0.0.5","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">=0.4.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/blend/0.0.5/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"blend@0.0.5","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4fbdaab2421ce5a64b32bb8d1635651064c52193","tarball":"http://registry.npmjs.org/blend/-/blend-0.0.5.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}]},"0.0.6":{"name":"blend","description":"High speed image blending","version":"0.0.6","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">=0.4.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso","preinstall":"node-waf clean || true; node-waf configure build"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/blend/0.0.6/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"blend@0.0.6","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8a4ab161345e2cb781df1ef0729603a70bc8ee3a","tarball":"http://registry.npmjs.org/blend/-/blend-0.0.6.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}]},"0.2.0":{"name":"blend","description":"High speed image blending","version":"0.2.0","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">= 0.4"},"licenses":[{"type":"BSD"}],"devDependencies":{"mocha":"0.11.x"},"scripts":{"test":"mocha -R spec","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"_npmUser":{"name":"kkaefer","email":"kkaefer@gmail.com"},"_id":"blend@0.2.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c88abe2bb350a25995c9d13f4a7135df65e50771","tarball":"http://registry.npmjs.org/blend/-/blend-0.2.0.tgz"},"readme":"# node-blend\n\nThis module alpha-composites images of the same size and returns the compressed image.\n\n# Usage\n\n```javascript\nvar blend = require('blend');\nvar image1; // Contains a compressed PNG image as a buffer.\nvar image2;\nblend([ image1, image2 ], function(err, result) {\n    // result contains the blended result image compressed as PNG.\n});\n\nblend([ image1, image2 ], {\n    format: 'jpeg',\n    quality: 90\n}, function(err, result) {\n    // result contains the blended result image compressed as JPEG.\n});\n```\n\n# Installation\n\nTo compile, this module requires `libjpeg` and `libpng`.\n\nBoth /usr and /usr/local with be searched for these dependencies by default.\n\nOn Ubuntu, type `sudo apt-get install libjpeg8-dev libpng12-dev` to install them.\n\nMac OS X ships with png at /usr/X11, which will also be searched.\n\nIf you have jpeg or png installed in a custom location you can do:\n\n    ./configure --with-jpeg=/opt/jpeg --with-png=/opt/png\n\n# Development\n\nTo run tests for this module, run `npm install --dev` to install the testing framework, then\n`npm test`. Tests require [Imagemagick](http://www.imagemagick.org/script/index.php) for its `compare` utility.\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}]},"0.3.0":{"name":"blend","description":"High speed image blending","version":"0.3.0","homepage":"http://github.com/developmentseed/node-blend","author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"engines":{"node":">= 0.4 && < 0.9.0"},"licenses":[{"type":"BSD"}],"devDependencies":{"mocha":"0.11.x"},"scripts":{"test":"mocha -R spec","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"_npmUser":{"name":"willwhite","email":"will@mapbox.com"},"_id":"blend@0.3.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d735d5aee1494f8bbf0f4f5aca3014594956a89c","tarball":"http://registry.npmjs.org/blend/-/blend-0.3.0.tgz"},"readme":"# node-blend\n\nThis module alpha-composites images of the same size and returns the compressed image.\n\n# Usage\n\n```javascript\nvar blend = require('blend');\nvar image1; // Contains a compressed PNG image as a buffer.\nvar image2;\nblend([ image1, image2 ], function(err, result) {\n    // result contains the blended result image compressed as PNG.\n});\n\nblend([ image1, image2 ], {\n    format: 'jpeg',\n    quality: 90\n}, function(err, result) {\n    // result contains the blended result image compressed as JPEG.\n});\n```\n\n# Installation\n\nTo compile, this module requires `libjpeg` and `libpng`.\n\nBoth /usr and /usr/local with be searched for these dependencies by default.\n\nOn Ubuntu, type `sudo apt-get install libjpeg8-dev libpng12-dev` to install them.\n\nMac OS X ships with png at /usr/X11, which will also be searched.\n\nIf you have jpeg or png installed in a custom location you can do:\n\n    ./configure --with-jpeg=/opt/jpeg --with-png=/opt/png\n\n# Development\n\nTo run tests for this module, run `npm install --dev` to install the testing framework, then\n`npm test`. Tests require [Imagemagick](http://www.imagemagick.org/script/index.php) for its `compare` utility.\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"}],"time":{"modified":"2012-08-02T13:44:07.017Z","created":"2011-06-02T18:39:47.450Z","0.0.1":"2011-06-02T18:39:47.676Z","0.0.2":"2011-07-20T19:44:28.594Z","0.0.3":"2011-08-04T13:32:03.631Z","0.0.4":"2011-09-18T15:05:48.078Z","0.0.5":"2011-09-19T18:29:29.591Z","0.0.6":"2011-09-26T22:07:26.974Z","0.2.0":"2012-03-08T15:54:46.454Z","0.3.0":"2012-07-27T20:59:56.921Z"},"author":{"name":"Konstantin Käfer","email":"kkaefer@gmail.com"},"repository":{"type":"git","url":"git://github.com/developmentseed/node-blend.git"},"users":{"fgribreau":true},"_attachments":{"blend-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-xx3eN4l3RYeMgKcyEXCoQw==","length":1791612,"stub":true},"blend-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-kgcU+HEzXKZ3Nz/d3Llp8w==","length":1789680,"stub":true},"blend-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-cXU9V/Z4X7BgwYvIRxoztw==","length":1258186,"stub":true},"blend-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-7B2/xHKlS07XBSfIX/NQ1g==","length":1258186,"stub":true},"blend-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-jhohcIxoTycFEvlRkrUv0Q==","length":1257963,"stub":true},"blend-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-2hYGq4GPsS8+NJGFahbCNA==","length":1256345,"stub":true},"blend-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-6pMhE3Ot7lF3MFwff7lYHg==","length":1210552,"stub":true},"blend-0.0.1-0.4-ares1.7.4-ev4.4-openssl0.9.8l-v83.1.8.14-darwin-10.7.0.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-PKDve2iwKpLvDkYklgzyyg==","length":464775,"stub":true},"blend-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tFXlhlm6H+sx9gbz5F6tGg==","length":329044,"stub":true}}}},
{"id":"bless","key":"bless","value":{"rev":"41-2b31391cb80510c3a2b5db7ef449b217"},"doc":{"_id":"bless","_rev":"41-2b31391cb80510c3a2b5db7ef449b217","name":"bless","description":"CSS Post-Processor","dist-tags":{"latest":"3.0.1"},"versions":{"1.0.0":{"name":"bless","description":"Save your CSS","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.0.0","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.0.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d76409fc1160fe19dcacbc663eb52cd2056d9e7c","tarball":"http://registry.npmjs.org/bless/-/bless-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.0.1":{"name":"bless","description":"Save your CSS","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.0.1","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"189186e0bf0cfcffc72c636665001252acb255a8","tarball":"http://registry.npmjs.org/bless/-/bless-1.0.1.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.0.2":{"name":"bless","description":"Save your CSS","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.0.2","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"201d6a1d1d8b95adffd48376bd6418a3cf6d1c36","tarball":"http://registry.npmjs.org/bless/-/bless-1.0.2.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.0.3":{"name":"bless","description":"Save your CSS","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.0.3","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.0.3","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"526c1227d154fe9f6b6e48c01a152d90202c863c","tarball":"http://registry.npmjs.org/bless/-/bless-1.0.3.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.0.4":{"name":"bless","description":"Save Your CSS","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.0.4","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f0cd75e31eabe6f3c9ad7b50e51c8c1f877c0ecc","tarball":"http://registry.npmjs.org/bless/-/bless-1.0.4.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.0.5":{"name":"bless","description":"Save Your CSS","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.0.5","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.0.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d3ebee6bde498313f5fec4a49329116541d0f92d","tarball":"http://registry.npmjs.org/bless/-/bless-1.0.5.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.1.0":{"name":"bless","description":"CSS Post-processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.1.0","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2779f7976584035fe0b6ac8e299230da946da0d4","tarball":"http://registry.npmjs.org/bless/-/bless-1.1.0.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.1.1":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.1.1","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"52a679924066908c5c26b05f8ae9faa5aef8d07b","tarball":"http://registry.npmjs.org/bless/-/bless-1.1.1.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"1.1.2":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"1.1.2","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/1.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@1.1.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d1d2307a0d7fd12473266341ba172ebb43228fcf","tarball":"http://registry.npmjs.org/bless/-/bless-1.1.2.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.0.0":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.0.0","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.0.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"63196bf174ec174e4cc04ee71ad7a82c73801f22","tarball":"http://registry.npmjs.org/bless/-/bless-2.0.0.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.0.1":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.0.1","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5efe0c6ecfb57125a3cf6939b3d380bc5a834386","tarball":"http://registry.npmjs.org/bless/-/bless-2.0.1.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.0.2":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.0.2","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.0.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2da0ace41ec889964c7ddaf79b0ef19c327031bf","tarball":"http://registry.npmjs.org/bless/-/bless-2.0.2.tgz"},"scripts":{},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.1.0":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.1.0","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"42336c6cf95a6fface0cfa78ccf13f3687914878","tarball":"http://registry.npmjs.org/bless/-/bless-2.1.0.tgz"},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.2.0":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.2.0","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.2.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"aeb6e5137b562ecb4fc2cefb85bbfda814344343","tarball":"http://registry.npmjs.org/bless/-/bless-2.2.0.tgz"},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.2.1":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.2.1","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.2.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6f627acddeeafadebb705e6853ae26a8505ffb0c","tarball":"http://registry.npmjs.org/bless/-/bless-2.2.1.tgz"},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"2.2.2":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"2.2.2","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/Paul/.npm/bless/2.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bless@2.2.2","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5f393391a69d627807b8f8f6a0a64f1f689811ca","tarball":"http://registry.npmjs.org/bless/-/bless-2.2.2.tgz"},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"3.0.0":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"3.0.0","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.6.0"},"_npmUser":{"name":"paulyoung","email":"paulyoungonline@gmail.com"},"_id":"bless@3.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ddb8bb351061a188c4d18468be03c2dadf33bd4f","tarball":"http://registry.npmjs.org/bless/-/bless-3.0.0.tgz"},"readme":"bless.js\n=======\n\n<http://blesscss.com>\n\nabout\n-----\n\nFor more information, visit <http://blesscss.com>.\n\nlicense\n-------\n\nSee `LICENSE` file.\n\n> Copyright (c) 2011 Paul Young\n","maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]},"3.0.1":{"name":"bless","description":"CSS Post-Processor","url":"http://blesscss.com","keywords":["css","parser","bless","less","sass","stylus"],"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"contributors":[],"version":"3.0.1","bin":{"blessc":"./bin/blessc"},"main":"./lib/bless/index","directories":{"test":"./test"},"engines":{"node":">=0.6.0"},"devDependencies":{"vows":"~0.6.2"},"_npmUser":{"name":"paulyoung","email":"paulyoungonline@gmail.com"},"_id":"bless@3.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"259a906c8e292527d07b229b5ccbe2045f16832f","tarball":"http://registry.npmjs.org/bless/-/bless-3.0.1.tgz"},"readme":"bless.js\n=======\n\n<http://blesscss.com>\n\nabout\n-----\n\nFor more information, visit <http://blesscss.com>.\n\nlicense\n-------\n\nSee `LICENSE` file.\n\n> Copyright (c) 2011 Paul Young\n","maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}]}},"maintainers":[{"name":"paulyoung","email":"paulyoungonline@gmail.com"}],"time":{"modified":"2012-07-02T02:22:51.991Z","created":"2011-08-22T11:45:37.102Z","1.0.0":"2011-08-22T11:45:51.591Z","1.0.1":"2011-08-22T12:13:42.969Z","1.0.2":"2011-08-22T14:08:28.327Z","1.0.3":"2011-08-22T14:14:46.182Z","1.0.4":"2011-08-22T16:54:41.327Z","1.0.5":"2011-08-23T12:45:42.819Z","1.1.0":"2011-08-27T01:25:03.032Z","1.1.1":"2011-08-27T06:47:31.889Z","1.1.2":"2011-08-30T10:51:24.871Z","2.0.0":"2011-09-05T23:24:47.480Z","2.0.1":"2011-09-08T09:12:53.374Z","2.0.2":"2011-09-08T21:52:29.746Z","2.1.0":"2012-01-30T04:07:05.773Z","2.2.0":"2012-02-06T20:45:32.749Z","2.2.1":"2012-02-06T23:39:03.619Z","2.2.2":"2012-02-23T22:43:22.477Z","3.0.0":"2012-05-21T01:29:50.765Z","3.0.1":"2012-07-02T02:22:51.991Z"},"author":{"name":"Paul Young","email":"paulyoungonline+bless@gmail.com"},"_attachments":{"bless-3.0.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-uklpuIhQJ8FcCA/L5XOjAA==","length":9898,"stub":true},"bless-3.0.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-tU40BsFqZqZezsAVX9CkYg==","length":9831,"stub":true},"bless-2.2.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-rH7AoA7Hgmr6iZuAHVtDNg==","length":9252,"stub":true},"bless-2.2.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Q0bgZMLC/mKkgDN41wXODA==","length":9161,"stub":true},"bless-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-MT5zE768FezmNLCkH1QMJQ==","length":62147,"stub":true},"bless-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-ems0lCYTrA6/ZQ1rjIlP2g==","length":8864,"stub":true},"bless-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-zTBQrbeJzlwF8+Ss2rZcuQ==","length":8009,"stub":true},"bless-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-x/++P4ESkFUqYC5s6GJLPg==","length":8018,"stub":true},"bless-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-O9o8ah7Tbe87Lc7UKFxE+w==","length":7845,"stub":true},"bless-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-5ufuGvvRMoSfMxUeQ6pivQ==","length":6067,"stub":true},"bless-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-AFIypCAEcOXzZqqeSiS4NA==","length":6052,"stub":true},"bless-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-5MbvU6PjxshtA6koSdnCqg==","length":6070,"stub":true},"bless-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-bw8xaJVNAiml/7inweOhdg==","length":5957,"stub":true},"bless-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-XhOtHtfmVvy5ik0BH651Ag==","length":5943,"stub":true},"bless-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-SlGWDuQTorboHTRDDbL9LQ==","length":5936,"stub":true},"bless-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6ZSwliAKudR/BhzI4RSsEA==","length":5939,"stub":true},"bless-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jfL/Cch38lVTGh1sFvqtlg==","length":4978,"stub":true},"bless-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vOm7ULgegCMOvMKaj8iZhw==","length":5938,"stub":true}}}},
{"id":"blindparser","key":"blindparser","value":{"rev":"29-436d38d127f5f22e1a134e36221f358b"},"doc":{"_id":"blindparser","_rev":"29-436d38d127f5f22e1a134e36221f358b","name":"blindparser","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","dist-tags":{"latest":"0.0.14"},"versions":{"0.0.1":{"name":"blindparser","version":"0.0.1","description":"blind-parser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","jquery":">=1.6.3"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9451dfdbd4dadc0bdf92ffa54bce91683c69be3c","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.1.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.2":{"name":"blindparser","version":"0.0.2","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","jquery":">=1.6.3"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2f625fb8f79dedc85575fad3ccce36fb5d94d051","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.2.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.3":{"name":"blindparser","version":"0.0.3","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"4e4b5d14508b23c9b32e2bc6bebc448b147d346c","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.3.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.4":{"name":"blindparser","version":"0.0.4","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"275942962a1aad8141e4c06afe481730fd872967","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.4.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.5":{"name":"blindparser","version":"0.0.5","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c96be1d0c5e8872a444debacbef47939887b1639","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.5.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.6":{"name":"blindparser","version":"0.0.6","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"082657baec36b4ec46e7fb9899d0d89f40d2e7c3","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.6.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.7":{"name":"blindparser","version":"0.0.7","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7475a8166871f71f2769a500b06170d959abc240","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.7.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.8":{"name":"blindparser","version":"0.0.8","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3-pre","_defaultsLoaded":true,"dist":{"shasum":"1e67254c32b742a2e61cff0dc7d1715d59409a21","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.8.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.9":{"name":"blindparser","version":"0.0.9","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.12-pre","_defaultsLoaded":true,"dist":{"shasum":"a0e65f4a74b23e382a94d7c67f4e4addf9be8345","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.9.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.10":{"name":"blindparser","version":"0.0.10","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.10","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.12-pre","_defaultsLoaded":true,"dist":{"shasum":"d1f39bbc5c116926f08c9efc4e96ea2d6bea3f5d","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.10.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.11":{"name":"blindparser","version":"0.0.11","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.11","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.12-pre","_defaultsLoaded":true,"dist":{"shasum":"47612c9e23a5d237012955d149e3485362438989","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.11.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.12":{"name":"blindparser","version":"0.0.12","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":">=2.2.9","underscore":"*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.12","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.12-pre","_defaultsLoaded":true,"dist":{"shasum":"f581170233bf051eb4e0bac3d8a812e335f85d69","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.12.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.13":{"name":"blindparser","version":"0.0.13","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/SyndromeSoftware/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":"2.9.3","underscore":"*"},"devDependencies":{"vows":"*"},"scripts":{"test":"node_modules/.bin/vows --spec test/*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.13","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.12-pre","_defaultsLoaded":true,"dist":{"shasum":"fb93de90daeb2bb9516bc0ebf24c4223f722f763","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.13.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]},"0.0.14":{"name":"blindparser","version":"0.0.14","description":"blindparser is an all purpose RSS/ATOM feed parser that parses feeds into a common format so that you do not have to care if they are RSS or ATOM feeds.","keywords":["rss","atom","feed","parser"],"repository":{"type":"git","url":"git://github.com/dropdownmenu/node-blindparser.git"},"dependencies":{"xml2js":">= 0.1.13","request":"2.9.3","underscore":"*"},"devDependencies":{"vows":"*"},"scripts":{"test":"node_modules/.bin/vows --spec test/*"},"main":"./lib/feed.js","_npmUser":{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"},"_id":"blindparser@0.0.14","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.12-pre","_defaultsLoaded":true,"dist":{"shasum":"07eb86a1e0d8cf8e09eccf9c073a3fde7b40b407","tarball":"http://registry.npmjs.org/blindparser/-/blindparser-0.0.14.tgz"},"maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}]}},"readme":"node-blindparser\n----------------\n\nblindparser is a RSS/ATOM feed parser that returns the requested feed urls in a json object that is formatted so that you will not have to worry (much) about the format of the requested feed.\n\nMotivation\n----------\n\nRSS and ATOM feeds are both trying to deliver similar content, but and different enough with their structure to be aggravating. The purpose of blindparser is to allow for the important parts of the feeds (article titles, links, etc) to be returned in a standard format, but to also return the rest of the feed in a reasonable way.\n\nInstalling\n----------\n\nLike all node.js modules, just use npm!\n\n```\nnpm install blindparser\n```\n\nUsage\n-----\n\nUsing blind parser is easy, just call:\n\n```\nvar parser = require('blindparser');\nvar options = {};\n//rss feeds\nparser.parseURL('http://rss.cnn.com/rss/cnn_topstories.rss', options, function(err, out){\n\tconsole.log(out);\n});\n//atom feeds\nparser.parseURL('http://www.blogger.com/feeds/10861780/posts/default', options, function(err, out){\n\tconsole.log(out);\n});\n```\n\nOutput\n------\n\nThe point of `blindparser` is to try and hide the format of the originally requested feed. Thus RSS and ATOM feeds are returned in a common format. Similar fields (pubDate vs update) will be mapped to the same field in the output.\n\nThe 'minimal' output format is:\n\n```\n{\n\ttype:\"rss\" or \"atom\"\n\tmetadata:{\n\t\ttitle: Title of the feed\n\t\tdesc: description or subtitle\n\t\turl: url of the feed\n\t\tupdate: pubDate or update time of the feed\n\t},\n\titems:[\n\t\t{\n\t\t\ttitle: Title of article\n\t\t\tdesc:\tDescription or content of article\n\t\t\tlink: Link to article\n\t\t\tdate: Time article was published\n\t\t}...\n\t]\n```\n\nTODO\n-----\n\n* Tests (lots of tests)\n* Add error handeling for bad urls / poorly formatted xml & feeds\n\n\nChangelog\n---------\n\n* 0.0.1 - Initial Commit\n\n\n","maintainers":[{"name":"syndromesoftware","email":"timmcgowan@syndromesoftware.com"}],"time":{"modified":"2012-05-30T02:59:34.904Z","created":"2012-01-05T06:10:56.605Z","0.0.1":"2012-01-05T06:10:57.381Z","0.0.2":"2012-01-06T19:52:49.819Z","0.0.3":"2012-01-20T22:52:58.080Z","0.0.4":"2012-01-20T23:01:26.021Z","0.0.5":"2012-02-03T17:56:07.269Z","0.0.6":"2012-02-03T20:22:02.654Z","0.0.7":"2012-02-23T00:08:51.843Z","0.0.8":"2012-03-02T18:09:55.956Z","0.0.9":"2012-04-04T15:37:04.862Z","0.0.10":"2012-04-04T15:50:38.879Z","0.0.11":"2012-04-04T16:01:06.826Z","0.0.12":"2012-04-10T22:35:00.308Z","0.0.13":"2012-05-25T19:02:10.927Z","0.0.14":"2012-05-30T02:59:34.904Z"},"repository":{"type":"git","url":"git://github.com/dropdownmenu/node-blindparser.git"},"_attachments":{"blindparser-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-mgyV5aDgH4qKrdTkxuAANA==","length":4350,"stub":true},"blindparser-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-t8KPqW30V9h3Lz5uuIJccA==","length":4338,"stub":true},"blindparser-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-4cKm6/oKOLNj6lqxDCgz5Q==","length":4007,"stub":true},"blindparser-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1JA8PD60dGvIDgocaiOSmw==","length":3916,"stub":true},"blindparser-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-p+89eEI6jwZ3Vbtf7VPlYQ==","length":3926,"stub":true},"blindparser-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-7+IibZK0FRXJNQJKcD7/MQ==","length":3921,"stub":true},"blindparser-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-m+t4AttfNsuicTePCz4HAg==","length":3840,"stub":true},"blindparser-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Dn7k7VUQazUbQPhrjnMVZQ==","length":10240,"stub":true},"blindparser-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-pUOBDZSEOmYk3g8T1lUfXQ==","length":8579,"stub":true},"blindparser-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-AT6FgjfU5dXPrw6RJqES6Q==","length":10240,"stub":true},"blindparser-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-WRYHoWj9V6NcaThtAr0Hzg==","length":3778,"stub":true},"blindparser-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2pmjmjU6DrENTJyBzcU1eA==","length":3792,"stub":true},"blindparser-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WRZcDPSlS+zD7c6h7PFKmQ==","length":10240,"stub":true},"blindparser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7XiaRSxuDrtTHTjezm2Jow==","length":10240,"stub":true}}}},
{"id":"bling","key":"bling","value":{"rev":"50-0730993b54d8dc01422681b9f8108c86"},"doc":{"_id":"bling","_rev":"50-0730993b54d8dc01422681b9f8108c86","name":"bling","description":"The kitchen sink library.","dist-tags":{"latest":"0.0.26"},"versions":{"0.0.1":{"name":"bling","main":"./dist/bling.js","version":"0.0.1","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.1","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"3b0c97e2e1a49f6095ea630038f37be7fbebdd6c","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.1.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.2":{"name":"bling","main":"./dist/bling.js","version":"0.0.2","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.2","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"963770827fa82190ef6821ff8626cc8121a813a6","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.2.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.3":{"name":"bling","main":"./dist/bling.js","version":"0.0.3","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.3","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"2216c8a11558c1e1d64231bc2a24cb7d9e1e21b2","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.3.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.4":{"name":"bling","main":"./dist/bling.js","version":"0.0.4","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.4","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"5777b8279a56adb1d23270c5e1d3816c006d41c3","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.4.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.5":{"name":"bling","main":"./dist/bling.js","version":"0.0.5","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.5","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"081a2fb81fe755cf71733e3bfd56ed071d362848","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.5.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.6":{"name":"bling","main":"./dist/bling.js","version":"0.0.6","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.6","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"f753808951de8153956a375a9e548907854b8bfa","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.6.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.7":{"name":"bling","main":"./dist/bling.js","version":"0.0.7","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.7","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"25bee084c9812ede7d834985d4dc1c101e416956","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.7.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.8":{"name":"bling","main":"./dist/bling.js","version":"0.0.8","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","_id":"bling@0.0.8","description":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.","dist":{"shasum":"2889d53da55793ed0019fdfb99e4cb7d58e2b31e","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.8.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.9":{"name":"bling","main":"./dist/bling.js","version":"0.0.9","devDependencies":{"coffee-script":"*","jldom":"*"},"readme":"# About\n-------\n\nBlingJS is inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('childNodes.1.className')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    $ npm install bling\n    $ node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.9","description":"-------","dist":{"shasum":"62feb6fc9d03da4e2772524bf4237183df9b06a4","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.9.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.10":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"A kitchen sink in CoffeeScript.","version":"0.0.10","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.10","dist":{"shasum":"f2ac413428c2c1630b7b435c3e588cef2ad08f07","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.10.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.11":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"A kitchen sink in CoffeeScript.","version":"0.0.11","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.11","dist":{"shasum":"c30ba6fbf08d1bff82de0ca17294e996ecc5e760","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.11.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.12":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"A kitchen sink in CoffeeScript.","version":"0.0.12","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.12","dist":{"shasum":"27df1273cd1657a4a89adb69812129b42c6afab4","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.12.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.14":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"A kitchen sink in CoffeeScript.","version":"0.0.14","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.14","dist":{"shasum":"601e952b989c90d579d0d90454e4d0656c1fa9a8","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.14.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.15":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"A kitchen sink in CoffeeScript.","version":"0.0.15","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.15","dist":{"shasum":"d1a718087c938498335bf431409b409fd1930db7","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.15.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.16":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"A kitchen sink in CoffeeScript.","version":"0.0.16","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.16","dist":{"shasum":"ae54438b43d4d00d44a31a9aad303d5ec9cb780a","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.16.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.17":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.17","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.17","dist":{"shasum":"9f0c9a1a6e5b4a637210e8eacae46ca9a8433f61","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.17.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.18":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.18","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.18","dist":{"shasum":"fbfc3755d252444284e6613811638b6048ab6ebd","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.18.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.19":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.19","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.19","dist":{"shasum":"6c545b8a2bb7666d05ff47525ee2ff3c8e9d4762","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.19.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.20":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.20","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.20","dist":{"shasum":"5d4f7b05ba7aad94e109f5057e8618e1b4a4ea1f","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.20.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.21":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.21","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.21","dist":{"shasum":"a933eb258a16c9eef3977a8a281e8f99390ed8a7","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.21.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.23":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.23","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.23","dist":{"shasum":"c185c733d24b3760d49d9712aa01393604599422","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.23.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.24":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.24","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.24","dist":{"shasum":"2cef7d70fab2083d91a0bb26880236074b1e2680","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.24.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.25":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.25","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.25","dist":{"shasum":"433474efa9e5946b39f41590e09a4836fd8617ed","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.25.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]},"0.0.26":{"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"name":"bling","description":"The kitchen sink library.","version":"0.0.26","homepage":"http://blingjs.com","main":"./dist/bling.js","repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"scripts":{"test":"coffee tests/bling.coffee"},"devDependencies":{"coffee-script":"latest","jldom":"latest","docco":"latest"},"readme":"# About\n-------\n\nBlingJS is a kitchen sink, inspired by jQuery, but more consistent.\nIn particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the set.\n* in Bling, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin.\n\nEverything is a plugin; since plugins can not only extend the prototype (by returning an object full of extensions),\nbut can also inject code into the Bling constructor (by using $.pipe), there is very little needed outside.\n\nThe core plugin also provides some cool new things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is short-hand for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `$(nodes).select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `$(nodes).select('childNodes.1.className')`.\n\nThe `.zap()` operation is for doing bulk assignment.\n> `.html(\"new html\")` is short-hand for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\nand map functions over selected properties.\n\n    $(\"li\").zap('className', [\"odd\", \"even\"])\n    $(\"li\").zap('childNodes.1.style.top', -> $.px @+10 )\n\nThis example moves every list-item's 2nd-child up by 10 pixels, and allows you to continue chaining\non the list-items (not the moved children in this case).\n\n# Installation\n--------------\n    % npm install bling\n    % node\n    > require(\"bling\")\n    > $([1,2,3,4]).scale(2.5).sum()\n    25\n\n","_id":"bling@0.0.26","dist":{"shasum":"4dbff96bc32608b0101886dc1d67e11dcb1a0735","tarball":"http://registry.npmjs.org/bling/-/bling-0.0.26.tgz"},"maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}]}},"readme":"BlingJS is meant to be as useful as jQuery, but more consistent.  In particular, it is more consistent about doing set-based operations.\n\n* All operations return sets wherever possible.\n* As much as possible is a plugin, even core operations.\n\nSo, while it supports all the same basic operations as jQuery, they behave\nslightly different.\n\nFor instance, the `.html()` operation.\n* in jQuery, returns the innerHTML of the _first_ DOM node in the input\n* here, you get a set of html strings, one from _each_ node.\n\nThis **set philosophy** means that set operations are useful:\n* `.intersect()`\n* `.union()`\n\nThese kinds of set operations are part of the \"core\" plugin, and there also some\nnew things, like the `.select()` and `.zap()` operations.\n\nThe `.select()` operation will collect a single property from every item in\na set.\n> `.html()` is a shortcut for `.select('innerHTML')`.\n\n* You can extract nested values, e.g. `.select('style.color')`.\n* Arbitrary nesting depth, and arrays, e.g. `.select('foo.bar.0.baz')`.\n\nThe `.zap()` operation is a way to do assignment and stay in a loosely\nfunctional context.\n> `.html(\"new html\")` is a shortcut for `.zap('innerHTML', \"new html\")`.\n\nMore than just simple assignment, it can also 'stripe' values across a set;\na common thing to want to accomplish across list items.\n> `$(\"li\").zap('className', [\"odd\", \"even\"])`.\n\nIt can map a function across nested properties of your set items:\n> `$(\"li\").zap('style.top', -> $.px @+10 )`\nThis example moves every list-item up 10 pixels, and allows you to continue chaining\non the list-items.\n\nhttp://blingjs.com\n","maintainers":[{"name":"jldailey","email":"jesse.dailey@gmail.com"}],"time":{"modified":"2012-08-14T20:38:27.009Z","created":"2012-07-06T14:55:56.997Z","0.0.1":"2012-07-06T14:55:57.825Z","0.0.2":"2012-07-06T15:00:09.346Z","0.0.3":"2012-07-10T13:06:44.401Z","0.0.4":"2012-07-10T13:10:22.905Z","0.0.5":"2012-07-10T18:33:58.122Z","0.0.6":"2012-07-10T19:39:36.388Z","0.0.7":"2012-07-11T14:49:45.072Z","0.0.8":"2012-07-13T15:26:23.511Z","0.0.9":"2012-07-13T19:28:55.098Z","0.0.10":"2012-07-23T16:23:14.550Z","0.0.11":"2012-07-26T01:31:06.412Z","0.0.12":"2012-07-26T19:40:33.481Z","0.0.14":"2012-07-28T23:07:52.753Z","0.0.15":"2012-07-30T17:23:54.823Z","0.0.16":"2012-08-01T02:17:52.395Z","0.0.17":"2012-08-04T05:06:59.236Z","0.0.18":"2012-08-04T05:26:57.690Z","0.0.19":"2012-08-04T05:31:27.223Z","0.0.20":"2012-08-08T15:25:42.359Z","0.0.21":"2012-08-12T14:13:24.420Z","0.0.23":"2012-08-13T21:52:11.262Z","0.0.24":"2012-08-14T20:06:12.787Z","0.0.25":"2012-08-14T20:09:57.351Z","0.0.26":"2012-08-14T20:38:27.009Z"},"author":{"name":"Jesse Dailey","email":"jesse.dailey@gmail.com"},"repository":{"type":"git","url":"git://github.com/jldailey/BlingJS.git"},"users":{"fgribreau":true},"_attachments":{"bling-0.0.26.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-NVPpbzL56JCgA67kkyrPDg==","length":150827,"stub":true},"bling-0.0.25.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-1aAeTmaETbEKlDNJTqfIEA==","length":150839,"stub":true},"bling-0.0.24.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-/WIrmU+0npe3vPoOoSEFEQ==","length":150760,"stub":true},"bling-0.0.23.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-X2uo8tsTvEK7diP9WGwWvg==","length":173630,"stub":true},"bling-0.0.21.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-1yyMmh4w0J3xpGYHAVyT5Q==","length":146016,"stub":true},"bling-0.0.20.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-gE/+TENIOFqPElKsWbRwtw==","length":145493,"stub":true},"bling-0.0.19.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-CRrG0J83ZwCZnzH5V++mPQ==","length":145203,"stub":true},"bling-0.0.18.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-IZycuvTAe4np7TsVHvilFg==","length":145129,"stub":true},"bling-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-t3v0U1CMff+jGOzp3J3OnA==","length":145045,"stub":true},"bling-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-fonCtb6yIOtUt2AU++vriQ==","length":145199,"stub":true},"bling-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Uz5YmVPVUDi7lJT1XhRJGQ==","length":145068,"stub":true},"bling-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-AdbSvxFFpoShVpwPusSysA==","length":144407,"stub":true},"bling-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-3pM6xnZCYLu2Hv0LsdhDUw==","length":144179,"stub":true},"bling-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-DHDzT0Zzrrb0eDUFZ/pDKQ==","length":144164,"stub":true},"bling-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-8DqWyYwJ6PG61P4ZODQkQA==","length":143880,"stub":true},"bling-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-82fSxZWAmCI7cknnWw5OAw==","length":141985,"stub":true},"bling-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ZDGa9fB6j7FiA81AhqlpOg==","length":141652,"stub":true},"bling-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-OYalrzrOpVOHP93rifJdxA==","length":141300,"stub":true},"bling-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-oRR5uWiMaD+6N0PQECp8FQ==","length":141116,"stub":true},"bling-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-/jytd59sBtTWnZHNEhJSiQ==","length":141107,"stub":true},"bling-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-89V4b7UuO4CpNZX0bnYRwQ==","length":116705,"stub":true},"bling-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ujSQ8yvlZ1raUZA5Q4cS5Q==","length":117936,"stub":true},"bling-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iTRmM7YKf467k6ggIPqwLA==","length":181716,"stub":true},"bling-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-35M1FmKwGezrmZHQX0TyDg==","length":39541,"stub":true}}}},
{"id":"blinker","key":"blinker","value":{"rev":"5-7dfcd23ae7266b4e6590deaf0e62ad94"},"doc":{"_id":"blinker","_rev":"5-7dfcd23ae7266b4e6590deaf0e62ad94","name":"blinker","description":"Framework for real-time web-service development in node.js","dist-tags":{"latest":"0.3.7"},"versions":{"0.3.6":{"name":"blinker","version":"0.3.6","author":{"name":"Denis Rechkunov","email":"denis.rechkunov@gmail.com"},"description":"Framework for real-time web-service development in node.js","homepage":"https://github.com/DenisRechkunov/blinker","keywords":["real time","web service","web socket","mvc","web server"],"bugs":{"email":"denis.rechkunov@gmail.com","url":"https://github.com/DenisRechkunov/blinker/issues"},"repository":{"type":"git","url":"git://github.com/DenisRechkunov/blinker.git"},"main":"./index","dependencies":{"socket.io":">=0.8.7"},"engines":{"node":">=0.6.8"},"_npmUser":{"name":"bit4ix","email":"denis.rechkunov@gmail.com"},"_id":"blinker@0.3.6","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"05e5414fcad510ec8a202e3498d53a2a671ee8b3","tarball":"http://registry.npmjs.org/blinker/-/blinker-0.3.6.tgz"},"maintainers":[{"name":"bit4ix","email":"denis.rechkunov@gmail.com"}]},"0.3.7":{"name":"blinker","version":"0.3.7","author":{"name":"Denis Rechkunov","email":"denis.rechkunov@gmail.com"},"description":"Framework for real-time web-service development in node.js","homepage":"https://github.com/DenisRechkunov/blinker","keywords":["real time","web service","web socket","mvc","web server"],"bugs":{"email":"denis.rechkunov@gmail.com","url":"https://github.com/DenisRechkunov/blinker/issues"},"repository":{"type":"git","url":"git://github.com/DenisRechkunov/blinker.git"},"main":"./index","dependencies":{"socket.io":">=0.8.7"},"engines":{"node":">=0.6.8"},"_npmUser":{"name":"bit4ix","email":"denis.rechkunov@gmail.com"},"_id":"blinker@0.3.7","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"f843c53cebbc144a6c2235cf37d79703d9bf8971","tarball":"http://registry.npmjs.org/blinker/-/blinker-0.3.7.tgz"},"maintainers":[{"name":"bit4ix","email":"denis.rechkunov@gmail.com"}]}},"readme":"#Blinker - Framework for real time web-service development in node.js\r\n\r\n##Install\r\n\r\nTo install package in your node.js project just use [npm](http://npmjs.org/)\r\n\r\n    npm install blinker\r\n\r\n\r\n##How to use it\r\n\r\nTo start blinker server please use \"examples\" folder as a template for your project and read its README.\r\nThere you can find some examples for using blinker client-side bind API and MVC pattern.\r\n\r\nAll config definitions are described in docs folder. \r\nRemember, the real config file must be in JSON format (without any comments).\r\n\r\n##Project development\r\n\r\nTo be a contributor of this project, please read [Google JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml) and follow the guide instructions before commit or pull request. To document new code please use [JsDoc toolkit](http://code.google.com/p/jsdoc-toolkit/) and its [tag reference](http://code.google.com/p/jsdoc-toolkit/wiki/TagReference).\r\n\r\nDenis Rechkunov <denis.rechkunov@gmail.com>\r\n","maintainers":[{"name":"bit4ix","email":"denis.rechkunov@gmail.com"}],"time":{"modified":"2012-01-24T08:46:05.246Z","created":"2012-01-22T17:25:35.802Z","0.3.6":"2012-01-22T17:25:39.115Z","0.3.7":"2012-01-24T08:46:05.246Z"},"author":{"name":"Denis Rechkunov","email":"denis.rechkunov@gmail.com"},"repository":{"type":"git","url":"git://github.com/DenisRechkunov/blinker.git"},"_attachments":{"blinker-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HsGbdfsWpgkTiwxEM45GFw==","length":74927,"stub":true},"blinker-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/z3Y6QE8Q4dR2/geas06cQ==","length":74014,"stub":true}}}},
{"id":"bliss","key":"bliss","value":{"rev":"39-12df943df0ab110e06e0794b33709027"},"doc":{"_id":"bliss","_rev":"39-12df943df0ab110e06e0794b33709027","name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","dist-tags":{"latest":"1.0.1"},"versions":{"0.1.5":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.5","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"87b96852e35f5701cb9b96c411f0f41053b2177a","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.5.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}],"directories":{}},"0.1.6":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.6","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"2cdcbe6d3a39860616d792c069cb4f9563af34e7","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.6.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"0.1.7":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.7","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b6bd41a159f3147521a012fc4aaebf9c83288f84","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.7.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"0.1.8":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.8","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"18dd13f39dd27feaf3b6bec0b0251e56ef992e9f","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.8.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"0.1.9":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.9","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"browser":"coffee -c -j lib/browser.js src/browser-head src/validation src/tags src/tokenizer src/writer src/bliss src/browser-tail","clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile && npm run-script browser"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"devDependencies":{"coffee-script":">=1.2.0"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.9","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5c4324a8d49221bc0b132f64a3d1278b04e7714c","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.9.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"0.1.10":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.10","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"browser":"coffee -c -j lib/browser.js src/browser-head src/validation src/tags src/tokenizer src/writer src/bliss src/browser-tail","clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile && npm run-script browser"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"devDependencies":{"coffee-script":">=1.2.0"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.10","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0fed56ae218369240f293cfd91dea90102d12dad","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.10.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"0.1.11":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"0.1.11","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"browser":"coffee -c -j lib/browser.js src/browser-head src/validation src/tags src/tokenizer src/writer src/bliss src/browser-tail","clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile && npm run-script browser"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"devDependencies":{"coffee-script":">=1.2.0"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@0.1.11","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"48921459e2614331a1afbaee61bb81826e642592","tarball":"http://registry.npmjs.org/bliss/-/bliss-0.1.11.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"1.0.0":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"1.0.0","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"browser":"coffee -c -j lib/browser.js src/browser-head src/validation src/tags src/tokenizer src/writer src/bliss src/browser-tail","clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile && npm run-script browser"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"devDependencies":{"coffee-script":">=1.2.0"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@1.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a2843bfb098af9cd476fb63346e39c81918e047b","tarball":"http://registry.npmjs.org/bliss/-/bliss-1.0.0.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]},"1.0.1":{"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"name":"bliss","description":"Embedded JavaScript templates based on .NET Razor and Play! Framework templates.","version":"1.0.1","repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"main":"lib/bliss.js","bin":{"bliss-compile":"./bin/bliss-compile","bliss-render":"./bin/bliss-render"},"scripts":{"browser":"coffee -c -j lib/browser.js src/browser-head src/validation src/tags src/tokenizer src/writer src/bliss src/browser-tail","clean":"rm -rf lib","compile":"coffee -b -c -o lib src","build":"npm run-script clean && npm run-script compile && npm run-script browser"},"engines":{"node":">= 0.5.0 < 0.7.0"},"dependencies":{"html-minifier":">=0.4.5","uglify-js":">=1.2.3"},"devDependencies":{"coffee-script":">=1.2.0"},"license":"MIT","_npmUser":{"name":"cstivers78","email":"chris@stivers.us"},"_id":"bliss@1.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"cc71ce3d47b6e76785d423b80da2b30ea335e514","tarball":"http://registry.npmjs.org/bliss/-/bliss-1.0.1.tgz"},"maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}]}},"readme":"# bliss\n\nA template engine for Node.js, inspired by Microsoft Razor and Play! Framework template engines.\n\nI became hooked on using Play! framework's Scala templates, which was inspired by Razor templates. I liked it so much, that I found I really wanted to use something similar on Node.js. \n\n\n## Details\n\nSee [wiki](https://github.com/cstivers78/bliss/wiki) for details on use and syntax.\n\nSee [issues](https://github.com/cstivers78/bliss/issues) for details on bugs and features.\n","maintainers":[{"name":"cstivers78","email":"chris@stivers.us"}],"time":{"modified":"2012-06-07T02:05:50.238Z","created":"2012-01-13T12:19:23.360Z","0.1.0":"2012-01-13T12:19:27.522Z","0.1.1":"2012-01-13T13:13:27.622Z","0.1.2":"2012-01-13T13:18:26.971Z","0.1.3":"2012-01-13T13:33:35.079Z","0.1.4":"2012-01-13T14:03:47.027Z","0.1.5":"2012-01-13T14:15:21.418Z","0.1.6":"2012-01-13T15:10:15.694Z","0.1.7":"2012-01-13T15:18:40.615Z","0.1.8":"2012-01-18T08:17:54.598Z","0.1.9":"2012-01-25T10:39:21.529Z","0.1.10":"2012-02-04T03:54:19.264Z","0.1.11":"2012-03-26T05:50:21.103Z","1.0.0":"2012-05-22T01:17:22.924Z","1.0.1":"2012-06-07T02:05:50.238Z"},"author":{"name":"Chris Stivers","email":"chris@stivers.us"},"repository":{"type":"git","url":"git://github.com/cstivers78/bliss.git"},"_attachments":{"bliss-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-CiLpxXvEulXvVLX+Q3jZ+g==","length":20480,"stub":true},"bliss-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-vSq9FxOx21aVIun53mD0Yw==","length":20480,"stub":true},"bliss-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-sfXJ/eW/Sj8UMnxGj6nkBA==","length":20480,"stub":true},"bliss-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-7+iiZNLJfO1MG1gmrSDpeQ==","length":20480,"stub":true},"bliss-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-t8MjNZzYXAdsDs84elyyFQ==","length":20480,"stub":true},"bliss-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-+nRvy/QRmWd8WVOSl2Ox2w==","length":20480,"stub":true},"bliss-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-39k0z7suK0gTZvnjNIYZ1g==","length":20480,"stub":true},"bliss-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-y/3hleQuZ1F3+rmUiHt5zg==","length":20480,"stub":true},"bliss-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-LzuDxnf67njR7ry2PyLNBQ==","length":20480,"stub":true}}}},
{"id":"blitline","key":"blitline","value":{"rev":"27-d9f17df0665301428a12f45b8dc853db"},"doc":{"_id":"blitline","_rev":"27-d9f17df0665301428a12f45b8dc853db","name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","dist-tags":{"latest":"1.1.6"},"versions":{"1.1.0":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.0","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"main":"main.js","engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"9ede796e7db4e1916f23b73ce7548313684794ca","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.0.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}],"directories":{}},"1.1.1":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.1","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"main":"main.js","engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"7a9ca07c28b77ef79800c87e6c370190cb4ef898","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.1.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}]},"1.1.2":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.2","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"engines":{"node":"~0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"676f4cc8910435d4e209e1c89b59a2cc98df9c17","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.2.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}]},"1.1.3":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.3","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"engines":{"node":"~0.4.9"},"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"7ab28a36850f9aef61f46d9b88164c92a7e993cc","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.3.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}]},"1.1.4":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.4","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"engines":{"node":"~0.4.9"},"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"41eed645550a32339aab51b951f00050052dfe5e","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.4.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}]},"1.1.5":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.5","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"engines":{"node":"~0.4.9"},"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"e5d0330ad914a8fb83a037bc53334e9d870bb0aa","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.5.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}]},"1.1.6":{"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"name":"blitline","description":"Thin wrapper around the Blitline service. No rocket science here, just a helper wrapper with some primitive validation","version":"1.1.6","repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"main":"index.js","dependencies":{},"devDependencies":{},"_npmUser":{"name":"blitline_developer","email":"developer@blitline.com"},"_id":"blitline@1.1.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"629956866af6f6db186a3f59b05d313cf26921af","tarball":"http://registry.npmjs.org/blitline/-/blitline-1.1.6.tgz"},"maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}]}},"readme":"# Blitline\n\nA NodeJS wrapper around using the Blitline service\n\n\n","maintainers":[{"name":"blitline_developer","email":"developer@blitline.com"}],"time":{"modified":"2012-05-08T17:19:27.052Z","created":"2011-12-18T05:48:28.965Z","1.1.0":"2011-12-18T05:48:30.271Z","1.1.1":"2011-12-19T05:13:16.278Z","1.1.2":"2011-12-20T01:01:52.130Z","1.1.3":"2011-12-20T01:06:06.318Z","1.1.4":"2011-12-20T01:21:16.837Z","1.1.5":"2011-12-20T01:25:41.869Z","1.1.6":"2012-05-08T17:19:27.052Z"},"author":{"name":"Blitline Developer","email":"developer@blitline.com"},"repository":{"type":"git","url":"git://github.com/blitline-dev/blitline_node.git"},"_attachments":{"blitline-1.1.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-xc1g6LdiTWvNzBZ39ojCgA==","length":4466,"stub":true},"blitline-1.1.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-ayg5IGeAsNhJ7/j0xLZIyQ==","length":3754,"stub":true},"blitline-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Txq8FkHMZ0I6Yb2W50fccw==","length":3779,"stub":true},"blitline-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-rNF8Iy0sd/81w4z5/fJXEg==","length":3788,"stub":true},"blitline-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-6bOKA/0pMkmNak9zrWwZng==","length":3740,"stub":true},"blitline-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-wwp/cwLZXYVJwCpcv3KGgw==","length":3724,"stub":true},"blitline-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OnTEHdeODK6WMRY7ly10ew==","length":3186,"stub":true}}}},
{"id":"blitz","key":"blitz","value":{"rev":"17-90aeded73bc7b70ade26f37b25785896"},"doc":{"_id":"blitz","_rev":"17-90aeded73bc7b70ade26f37b25785896","name":"blitz","description":"Blitz node.js client API","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.1.0","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_id":"blitz@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"644aa2c8378c2bddda7d2fa4e9baf35ffd25d6c1","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.1.0.tgz"}},"0.1.1":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.1.1","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_id":"blitz@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"95635531e28677c90059b4e4aa5d08e31d66f7c4","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.1.1.tgz"}},"0.1.2":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.1.2","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_id":"blitz@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"a32ab4f8064cc93f4bf5bbdd0fe085f20e899abd","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.1.2.tgz"},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}]},"0.1.3":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.1.3","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_npmUser":{"name":"ghermeto","email":"gui.hermeto@gmail.com"},"_id":"blitz@0.1.3","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"20106ef876594e58a655670ee28dc7d48c8b440b","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.1.3.tgz"},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}]},"0.2.0":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.2.0","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_npmUser":{"name":"ghermeto","email":"gui.hermeto@gmail.com"},"_id":"blitz@0.2.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"37c4abe3364ab8ecc7cb1736a2899620c8bad540","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.2.0.tgz"},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}]},"0.3.0":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.3.0","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_npmUser":{"name":"ghermeto","email":"gui.hermeto@gmail.com"},"_id":"blitz@0.3.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"6c33c0e00a69940571ed5f7bb634800e64bd12c9","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.3.0.tgz"},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}]},"0.3.1":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.3.1","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_npmUser":{"name":"ghermeto","email":"gui.hermeto@gmail.com"},"_id":"blitz@0.3.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"5e6ef84609eeccbedded65c2c49e08e09de5811b","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.3.1.tgz"},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}]},"0.3.2":{"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"name":"blitz","description":"Blitz node.js client API","version":"0.3.2","homepage":"http://blitz.io","repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"main":"./lib/blitz.js","scripts":{"test":"jasmine-node spec"},"engines":{"node":">=v0.4.8"},"dependencies":{},"devDependencies":{"jasmine-node":"~1.0.6"},"_npmUser":{"name":"ghermeto","email":"gui.hermeto@gmail.com"},"_id":"blitz@0.3.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"52b935eec58896ed4a45d0c03dde24b61a5bee44","tarball":"http://registry.npmjs.org/blitz/-/blitz-0.3.2.tgz"},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}]}},"maintainers":[{"name":"ghermeto","email":"gui.hermeto@gmail.com"}],"time":{"modified":"2012-02-06T15:42:38.087Z","created":"2011-07-22T03:59:24.199Z","0.1.0":"2011-07-22T03:59:25.229Z","0.1.1":"2011-07-22T16:48:12.108Z","0.1.2":"2011-10-25T21:16:11.773Z","0.1.3":"2011-10-26T19:36:05.805Z","0.2.0":"2011-10-28T17:27:28.246Z","0.3.0":"2012-01-30T18:58:50.895Z","0.3.1":"2012-01-30T21:14:12.776Z","0.3.2":"2012-02-06T15:42:38.087Z"},"author":{"name":"Guilherme Hermeto","email":"gui.hermeto@gmail.com"},"repository":{"type":"git","url":"git://github.com/ghermeto/blitz-node.git"},"_attachments":{"blitz-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-mZwSu2cq1jg1x5C8UbpW9g==","length":11551,"stub":true},"blitz-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-bAE+TQ5K7CGZ4WZz5PRwhw==","length":11646,"stub":true},"blitz-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-RXyLtloV/8NGXStUURA7zQ==","length":11257,"stub":true},"blitz-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-njbvA4+xCWgAJixZtnt7fg==","length":7666,"stub":true},"blitz-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-X/KYKWGYR6jWQEzy1c0ZhA==","length":7129,"stub":true},"blitz-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-T9hdHL79pB8YH/3bADMnaw==","length":7025,"stub":true},"blitz-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jo6jGB5iiTCyE1thyNcWLQ==","length":6277,"stub":true},"blitz-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bwwlprYHYxLTDYA8XcQ4Nw==","length":6344,"stub":true}}}},
{"id":"blitzLib","key":"blitzLib","value":{"rev":"3-c05fb431c933a672b164776d6ef6089f"},"doc":{"_id":"blitzLib","_rev":"3-c05fb431c933a672b164776d6ef6089f","name":"blitzLib","description":"A JavaScript utility to make even faster  application","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"blitzLib","description":"A JavaScript utility to make even faster  application","homepage":"http://zjhiphop.github.com/blitz/","version":"0.1.0","author":{"name":"Jade Zhang","email":"zjhiphop@gmail.com","url":"http://zjhiphop.wordpress.com"},"dependencies":{"jquery":">=1.4.2"},"repositories":[{"type":"git","url":"git@github.com:zjhiphop/blitz.git"}],"_npmJsonOpts":{"file":"/home/jade/.npm/blitzLib/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blitzLib@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"067239c6ab5ad849d206764fac6a51087eb31291","tarball":"http://registry.npmjs.org/blitzLib/-/blitzLib-0.1.0.tgz"},"maintainers":[{"name":"zjhiphop","email":"zjhiphop@gmail.com"}]}},"maintainers":[{"name":"zjhiphop","email":"zjhiphop@gmail.com"}],"time":{"modified":"2011-10-10T13:06:30.700Z","created":"2011-10-10T13:06:27.276Z","0.1.0":"2011-10-10T13:06:30.700Z"},"author":{"name":"Jade Zhang","email":"zjhiphop@gmail.com","url":"http://zjhiphop.wordpress.com"},"_attachments":{"blitzLib-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-IvyNmGrw0yJ0cawZFaqnVA==","length":18305736,"stub":true}}}},
{"id":"blo","key":"blo","value":{"rev":"7-8f2a5d3c2fb42516f8972ee35d9455d5"},"doc":{"_id":"blo","_rev":"7-8f2a5d3c2fb42516f8972ee35d9455d5","name":"blo","description":"HTML blog system","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"blo","description":"HTML blog system","tags":["node","blog"],"version":"0.1.0","author":{"name":"Pierre Bertet","email":"bonjour@pierrebertet.net"},"repository":{"type":"git","url":"git://github.com/bpierre/blo.git"},"bugs":{"name":"http://github.com/bpierre/blo/issues"},"engines":["node >= 0.4.0"],"main":"lib/blo.js","dependencies":{"connect":">= 1.4.0 < 2.0.0","dust":">= 0.3.0","jsdom":">= 0.2.0","step":">= 0.0.4"},"devDependencies":{},"_id":"blo@0.1.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"7cd306c266a63c9e4be22a5cb3b612debf9352ba","tarball":"http://registry.npmjs.org/blo/-/blo-0.1.0.tgz"},"scripts":{}},"0.2.0":{"name":"blo","description":"HTML blog system","tags":["node","blog"],"version":"0.2.0","author":{"name":"Pierre Bertet","email":"bonjour@pierrebertet.net","url":"http://pierrebertet.net"},"repository":{"type":"git","url":"git://github.com/bpierre/blo.git"},"bugs":{"name":"http://github.com/bpierre/blo/issues"},"engines":{"node":">= 0.4.1 < 0.5.0"},"main":"lib/blo.js","dependencies":{"connect":">= 1.4.0 < 2.0.0","dust":">= 0.3.0 < 1.0.0","jsdom":">= 0.2.0 < 1.0.0","step":">= 0.0.4 < 1.0.0"},"bin":{"blo":"./bin/blo"},"devDependencies":{},"_id":"blo@0.2.0","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"2c8b6a6d6411009b96bd6fe2dd2272f6ecbc9bca","tarball":"http://registry.npmjs.org/blo/-/blo-0.2.0.tgz"},"scripts":{}},"0.2.1":{"name":"blo","description":"HTML blog system","tags":["node","blog"],"version":"0.2.1","author":{"name":"Pierre Bertet","email":"bonjour@pierrebertet.net","url":"http://pierrebertet.net"},"contributors":[{"name":"Pierre Bertet","email":"bonjour@pierrebertet.net"},{"name":"Raphaël Bastide","email":"bonjour@raphaelbastide.com"}],"repository":{"type":"git","url":"git://github.com/bpierre/blo.git"},"bugs":{"name":"http://github.com/bpierre/blo/issues"},"engines":{"node":">= 0.4.1 < 0.5.0"},"main":"lib/blo.js","dependencies":{"connect":">= 1.6.0 < 2.0.0","dust":">= 0.3.0 < 1.0.0","jsdom":">= 0.2.1 < 1.0.0","step":">= 0.0.4 < 1.0.0"},"devDependencies":{},"bin":{"blo":"./bin/blo"},"_npmJsonOpts":{"file":"/Users/pierre/.npm/blo/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blo@0.2.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"da390f6d92bded07845672b30b1d698b7b2df325","tarball":"http://registry.npmjs.org/blo/-/blo-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"bpierre","email":"bonjour@pierrebertet.net"}]}},"maintainers":[{"name":"bpierre","email":"bonjour@pierrebertet.net"}],"time":{"modified":"2011-10-12T11:26:35.393Z","created":"2011-05-22T21:52:30.882Z","0.1.0":"2011-05-22T21:52:31.556Z","0.2.0":"2011-06-07T23:57:06.377Z","0.2.1":"2011-10-12T11:26:35.393Z"},"author":{"name":"Pierre Bertet","email":"bonjour@pierrebertet.net","url":"http://pierrebertet.net"},"repository":{"type":"git","url":"git://github.com/bpierre/blo.git"},"_attachments":{"blo-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-GCs6BaiezS2aam03xbkXWg==","length":49747,"stub":true},"blo-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-18XaSVWO6GEs02yLgU0Zdw==","length":11461,"stub":true},"blo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-t1zdjigdz+flegWwHV7Geg==","length":4576,"stub":true}}}},
{"id":"block-stream","key":"block-stream","value":{"rev":"18-ae018a36f037ea21c17ff614091e17fe"},"doc":{"_id":"block-stream","_rev":"18-ae018a36f037ea21c17ff614091e17fe","name":"block-stream","description":"a stream of blocks","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.3":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"block-stream","description":"a stream of blocks","version":"0.0.3","repository":{"type":"git","url":"git://github.com/isaacs/block-stream.git"},"engines":{"node":"0.4 || ~0.5.8 || 0.6"},"main":"block-stream.js","dependencies":{"inherits":"~1.0.0"},"devDependencies":{"tap":"0.0.10"},"scripts":{"test":"tap test/"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"block-stream@0.0.3","_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.10-pre","_defaultsLoaded":true,"dist":{"shasum":"893c06ceb920d631d99a65e39bb351cb930a0b5a","tarball":"http://registry.npmjs.org/block-stream/-/block-stream-0.0.3.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"directories":{}},"0.0.4":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"block-stream","description":"a stream of blocks","version":"0.0.4","repository":{"type":"git","url":"git://github.com/isaacs/block-stream.git"},"engines":{"node":"0.4 || ~0.5.8 || 0.6"},"main":"block-stream.js","dependencies":{"inherits":"~1.0.0"},"devDependencies":{"tap":"0.x"},"scripts":{"test":"tap test/"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"block-stream@0.0.4","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1-pre","_defaultsLoaded":true,"dist":{"shasum":"0d5f6d926fa01ab5ad0a2a9294d3b8bbb867f0b5","tarball":"http://registry.npmjs.org/block-stream/-/block-stream-0.0.4.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}]},"0.0.5":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"block-stream","description":"a stream of blocks","version":"0.0.5","repository":{"type":"git","url":"git://github.com/isaacs/block-stream.git"},"engines":{"node":"0.4 || ~0.5.8 || 0.6 || 0.7"},"main":"block-stream.js","dependencies":{"inherits":"~1.0.0"},"devDependencies":{"tap":"0.x"},"scripts":{"test":"tap test/"},"_npmUser":{"name":"isaacs","email":"i@izs.me"},"_id":"block-stream@0.0.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.9-pre","_defaultsLoaded":true,"dist":{"shasum":"950d0218197ed1e135d222e928b05de105bd53f2","tarball":"http://registry.npmjs.org/block-stream/-/block-stream-0.0.5.tgz"},"readme":"# block-stream\n\nA stream of blocks.\n\nWrite data into it, and it'll output data in buffer blocks the size you\nspecify, padding with zeroes if necessary.\n\n```javascript\nvar block = new BlockStream(512)\nfs.createReadStream(\"some-file\").pipe(block)\nblock.pipe(fs.createWriteStream(\"block-file\"))\n```\n\nWhen `.end()` or `.flush()` is called, it'll pad the block with zeroes.\n","maintainers":[{"name":"isaacs","email":"i@izs.me"}]},"0.0.6":{"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"name":"block-stream","description":"a stream of blocks","version":"0.0.6","repository":{"type":"git","url":"git://github.com/isaacs/block-stream.git"},"engines":{"node":"0.4 || >=0.5.8"},"main":"block-stream.js","dependencies":{"inherits":"~1.0.0"},"devDependencies":{"tap":"0.x"},"scripts":{"test":"tap test/"},"license":"BSD","readme":"# block-stream\n\nA stream of blocks.\n\nWrite data into it, and it'll output data in buffer blocks the size you\nspecify, padding with zeroes if necessary.\n\n```javascript\nvar block = new BlockStream(512)\nfs.createReadStream(\"some-file\").pipe(block)\nblock.pipe(fs.createWriteStream(\"block-file\"))\n```\n\nWhen `.end()` or `.flush()` is called, it'll pad the block with zeroes.\n","_id":"block-stream@0.0.6","dist":{"shasum":"f7027aea2ecc357153fa3bad6caeaf25f391aa4f","tarball":"http://registry.npmjs.org/block-stream/-/block-stream-0.0.6.tgz"},"maintainers":[{"name":"isaacs","email":"i@izs.me"}]}},"maintainers":[{"name":"isaacs","email":"i@izs.me"}],"time":{"modified":"2012-06-20T21:24:22.596Z","created":"2011-10-07T03:55:22.363Z","0.0.1":"2011-10-07T03:55:23.677Z","0.0.2":"2011-10-17T19:34:11.192Z","0.0.3":"2011-10-17T23:48:59.483Z","0.0.4":"2011-11-08T01:33:32.957Z","0.0.5":"2012-02-08T20:53:26.245Z","0.0.6":"2012-06-20T21:24:22.596Z"},"author":{"name":"Isaac Z. Schlueter","email":"i@izs.me","url":"http://blog.izs.me/"},"repository":{"type":"git","url":"git://github.com/isaacs/block-stream.git"},"users":{"isaacs":true},"_attachments":{"block-stream-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-XtiphhemnU1pFW1QZBNr8Q==","length":5585,"stub":true},"block-stream-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-9wrstUZspRLGfFo6jnQJbg==","length":4832,"stub":true},"block-stream-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-QrHVrk+PRk5XFygAXhMNwg==","length":10240,"stub":true},"block-stream-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-BBjFrPwpW1y/S6aCaqKkvA==","length":10240,"stub":true}}}},
{"id":"blocks","key":"blocks","value":{"rev":"3-ac427000fd2ae12ea32a7a48339067a0"},"doc":{"_id":"blocks","_rev":"3-ac427000fd2ae12ea32a7a48339067a0","name":"blocks","description":"Builds modules like lego blocks.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"blocks","description":"Builds modules like lego blocks.","version":"0.0.0","license":"MIT","main":"./lib/index.js","bin":{},"keywords":["blocks","block","layout"],"homepage":"https://github.com/jiggliemon/blocks","author":{"name":"Chase Wilson","email":"@jiggliemon","url":"http://agroism.com"},"bugs":{"url":"https://github.com/jiggliemon/blocks/issues"},"repository":{"type":"git","url":"git://github.com/jiggliemon/blocks.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jiggliemon","email":"chase@agroism.com"},"_id":"blocks@0.0.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"67b209d46824ef634be6f7dab06a6252360efc4e","tarball":"http://registry.npmjs.org/blocks/-/blocks-0.0.0.tgz"},"maintainers":[{"name":"jiggliemon","email":"chase@agroism.com"}]}},"readme":"# Blocks.js\n\n``` js\nvar  Layout = require('blocks/layout')\n    ,Block = require('blocks/block')\n\n// define a route for when to show the root block\nnew Layout('/', new Block('root', {\n   template: '\\\n    <header children=\"header\"></header>\\\n    <section children=\"body\"></section>\\\n    <footer children=\"footer\"></footer>\\\n  '\n\n  // define the blocks children\n  ,children: {\n     header: new Block({\n     \ttemplate: 'path/to/header/template.tmpl'\n     \t,children:{\n     \t  someModule: ['module/identifier', {\n     \t    'setting':\"value\"\n     \t  }]\n     \t  ,otherModule: new OtherModule({\n     \t    'setting':\"value\"\n     \t  })\n     \t}\n     })\n    ,body: new Block({\n    \ttemplate: 'path/to/body/template.tmpl'\n    \t,children: {\n    \t  main: new MainBody()\n    \t}\n    })\n    ,footer: new Block({\n    \ttemplate: 'path/to/footer/template.tmpl'\n    })\n  }\n\n// define where the block should be places in the document\n}, document.getElementById('container'));  \n```\n","maintainers":[{"name":"jiggliemon","email":"chase@agroism.com"}],"time":{"modified":"2012-04-29T04:59:54.925Z","created":"2012-04-29T04:59:53.235Z","0.0.0":"2012-04-29T04:59:54.925Z"},"author":{"name":"Chase Wilson","email":"@jiggliemon","url":"http://agroism.com"},"repository":{"type":"git","url":"git://github.com/jiggliemon/blocks.git"},"_attachments":{"blocks-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FR2IbIiLCSW99HpLYY/tGA==","length":9067,"stub":true}}}},
{"id":"blode","key":"blode","value":{"rev":"3-46a8e94adeb5778704a9321f7bf246e2"},"doc":{"_id":"blode","_rev":"3-46a8e94adeb5778704a9321f7bf246e2","name":"blode","description":"A simple static site/blog generator like jekyll.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.2":{"name":"blode","version":"0.1.2","description":"A simple static site/blog generator like jekyll.","author":{"name":"Islon Scherer","email":"islonscherer@gmail.com"},"dependencies":{"node-markdown":">= 0.1.0","commander":">= 0.5.2","dot":">= 0.1.7","rss":">= 0.0.3"},"engines":{"node":">= 0.6.0"},"keywords":["blog","jekyll","static","web","site","markdown"],"bin":{"blode":"blode.js"},"homepage":"https://github.com/stackoverflow/blode","bugs":{"url":"https://github.com/stackoverflow/blode/issues"},"_npmUser":{"name":"islon","email":"islonscherer@gmail.com"},"_id":"blode@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"81d8b2abe58337c699245826d2b94242a3d223df","tarball":"http://registry.npmjs.org/blode/-/blode-0.1.2.tgz"},"maintainers":[{"name":"islon","email":"islonscherer@gmail.com"}]}},"readme":"# Blode\n\nA simple static site/blog generator like jekyll but simpler, made in node.js\n\n## Install\n\n> $npm install blode -g\n\n## Structure\n\n    .\n    |-- config.json\n    |-- static\n    |-- layouts\n    |   |-- main.html\n    |-- pages\n    |   |-- no-layout-page.md\n    |   |   main\n    |   |   |-- page-using-main-layout.md\n    |-- output\n\n### config.json\n\nMain site configuration.\n\n### static\n\nAll static files like html, images, documents, etc. They'll be copied to the output folder.\n\n### layouts\n\nLayout files represented as [doT](http://olado.github.com/doT/) html files (allowed extensions: .htm, .html).\nSomewhere in your layout you must define a variable called blode.body.\n<br/>\nE.g:\n\n    <body>\n    -- header --\n    {{=blode.body}}\n    -- footer --\n    </body>\nAll files should be utf-8 encoded.\n\n### pages\n\nThe dynamic content. They should be markdown files (extension .md).\nIf you put a page inside a subfolder called X then X is the name of the layout (without extension) to use for this page.\nAll files should be utf-8 encoded.\n\n### output\n\nThe folder where the generated content will be placed.\n\n## Usage\n\nYou can use `-v` or `--verbose` to execute the commands in verbose mode.\n\n> blode -h\n\nShow the help.\n\n> blode -n /my/new/site\n\nCreates a new site skeleton at `/my/new/site` or at the current working dir if none is specified.\n\n> blode -g\n\nGenerates the site at current dir (must be a valid blode directory).\n\n> blode -s 3000\n\nStarts a web server at port 3000 (default: 4000) to test the site (must be a valid blode directory).","maintainers":[{"name":"islon","email":"islonscherer@gmail.com"}],"time":{"modified":"2012-02-01T01:15:11.228Z","created":"2012-02-01T01:15:07.921Z","0.1.2":"2012-02-01T01:15:11.228Z"},"author":{"name":"Islon Scherer","email":"islonscherer@gmail.com"},"_attachments":{"blode-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1vJ6k2ZYARxytIl8EPDHlA==","length":3740,"stub":true}}}},
{"id":"blog","key":"blog","value":{"rev":"13-80fc7b11d73e23ca7e518d271d1836ee"},"doc":{"_id":"blog","_rev":"13-80fc7b11d73e23ca7e518d271d1836ee","name":"blog","description":"My blog","dist-tags":{"latest":"0.0.3-1"},"versions":{"0.0.0":{"name":"blog","author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"description":"My blog","keywords":["nserver","blog"],"version":"0.0.0","repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"bugs":{"url":"http://github.com/thomblake/blog/issues"},"directories":{"lib":"./lib"},"_npmJsonOpts":{"file":"/home/thomblake/.npm/blog/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blog@0.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"1c71850d424f7d3cbfa00a3b74e52f57cbc4f283","tarball":"http://registry.npmjs.org/blog/-/blog-0.0.0.tgz"},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}]},"0.0.1":{"name":"blog","author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"description":"My blog","keywords":["nserver","blog"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"bugs":{"url":"http://github.com/thomblake/blog/issues"},"directories":{"lib":"./lib"},"_npmJsonOpts":{"file":"/home/thomblake/.npm/blog/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blog@0.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"55e1920f16a5d9235c0188b03dc58713420e1ec1","tarball":"http://registry.npmjs.org/blog/-/blog-0.0.1.tgz"},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}]},"0.0.2":{"name":"blog","author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"description":"My blog","keywords":["nserver","blog"],"version":"0.0.2","repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"bugs":{"url":"http://github.com/thomblake/blog/issues"},"directories":{"lib":"./lib"},"dependencies":{"yajet":"*","nserver-util":"*"},"_npmJsonOpts":{"file":"/home/thomblake/.npm/blog/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blog@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2689e9fc72f72d80935c03c081791e58f9aa1429","tarball":"http://registry.npmjs.org/blog/-/blog-0.0.2.tgz"},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}]},"0.0.2-1":{"name":"blog","author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"description":"My blog","keywords":["nserver","blog"],"version":"0.0.2-1","repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"bugs":{"url":"http://github.com/thomblake/blog/issues"},"directories":{"lib":"./lib"},"dependencies":{"yajet":"*","nserver-util":"*"},"_npmJsonOpts":{"file":"/home/thomblake/.npm/blog/0.0.2-1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blog@0.0.2-1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"452f167d56f456237519e1c2a1be67e95910d667","tarball":"http://registry.npmjs.org/blog/-/blog-0.0.2-1.tgz"},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}]},"0.0.3":{"name":"blog","author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"description":"My blog","keywords":["nserver","blog"],"version":"0.0.3","repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"bugs":{"url":"http://github.com/thomblake/blog/issues"},"directories":{"lib":"./lib"},"dependencies":{"yajet":"*","nserver-util":"*","github-flavored-markdown":"*"},"_npmJsonOpts":{"file":"/home/thomblake/.npm/blog/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blog@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5a55d987246e4bfa6247f3e20948d977ab316510","tarball":"http://registry.npmjs.org/blog/-/blog-0.0.3.tgz"},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}]},"0.0.3-1":{"name":"blog","author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"description":"My blog","keywords":["nserver","blog"],"version":"0.0.3-1","repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"bugs":{"url":"http://github.com/thomblake/blog/issues"},"directories":{"lib":"./lib"},"dependencies":{"yajet":"*","nserver-util":"*","github-flavored-markdown":"*"},"_npmJsonOpts":{"file":"/home/thomblake/.npm/blog/0.0.3-1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blog@0.0.3-1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2800e1a453e263512caea42872f283b51645f522","tarball":"http://registry.npmjs.org/blog/-/blog-0.0.3-1.tgz"},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}]}},"maintainers":[{"name":"thomblake","email":"thethomblake@gmail.com"}],"time":{"modified":"2011-09-15T18:40:30.846Z","created":"2011-09-12T21:02:15.472Z","0.0.0":"2011-09-12T21:02:15.949Z","0.0.1":"2011-09-12T22:22:37.296Z","0.0.2":"2011-09-12T22:24:32.552Z","0.0.2-1":"2011-09-13T17:05:44.185Z","0.0.3":"2011-09-15T18:12:23.651Z","0.0.3-1":"2011-09-15T18:40:30.846Z"},"author":{"name":"Thom Blake","email":"thethomblake@gmail.com","url":"http://thomblake.com"},"repository":{"type":"git","url":"git://github.com/thomblake/blog.git"},"_attachments":{"blog-0.0.3-1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-olo4LOOweK2KRt3FCW+llw==","length":2591,"stub":true},"blog-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jv+EkIU4+hyCgh39K2pjCA==","length":2417,"stub":true},"blog-0.0.2-1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RPnGbBmaYKmxzwtViNz8wQ==","length":2115,"stub":true},"blog-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2Vy3IPxARkIJq9v5iE4kVg==","length":2112,"stub":true},"blog-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hfoh2dw/PTW7Ek6gL4QuIQ==","length":2087,"stub":true},"blog-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Bbq4CWiEE71XTYyeOepTvg==","length":1739,"stub":true}}}},
{"id":"blogit","key":"blogit","value":{"rev":"9-b5c926ca3156724c350f672202aa3a75"},"doc":{"_id":"blogit","_rev":"9-b5c926ca3156724c350f672202aa3a75","name":"blogit","description":"Minimalist Node.js blog engine using Markdown and Git for storage.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.2":{"name":"blogit","description":"Node.js git based blog engine.","keywords":["blog","git"],"author":{"name":"Daniel D. Shaw","email":"dshaw@dshaw.com","url":"http://dshaw.com"},"repository":{"type":"git","url":"git://github.com/dshaw/blogit.git"},"bugs":{"url":"http://github.com/dshaw/blogit/issues"},"version":"0.0.2","main":"./blog","scripts":{"test":"NODE_ENV=test ./node_modules/.bin/mocha"},"dependencies":{"templar":"0.0.5","marked":"~0.2.5","optimist":"~0.3.4","ejs":"~0.7.1","lodash":"~0.2.2"},"devDependencies":{"mocha":"~1.1.0","request":"~2.9.202"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dshaw","email":"dshaw@dshaw.com"},"_id":"blogit@0.0.2","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.7.9","_defaultsLoaded":true,"dist":{"shasum":"51b8f213e1e089fdecafefdba1e5fda8b96c3c9e","tarball":"http://registry.npmjs.org/blogit/-/blogit-0.0.2.tgz"},"maintainers":[{"name":"dshaw","email":"dshaw@dshaw.com"}]},"0.0.3":{"name":"blogit","version":"0.0.3","description":"Node.js git based blog engine.","keywords":["blog","blogging","git","md","markdown"],"author":{"name":"Daniel D. Shaw","email":"dshaw@dshaw.com","url":"http://dshaw.com"},"repository":{"type":"git","url":"git://github.com/dshaw/blogit.git"},"bugs":{"url":"http://github.com/dshaw/blogit/issues"},"license":"MIT","main":"./blog","scripts":{"test":"NODE_ENV=test ./node_modules/.bin/mocha"},"dependencies":{"templar":"0.0.5","marked":"~0.2.5","optimist":"~0.3.4","ejs":"~0.7.1","async":"~0.1.22"},"devDependencies":{"mocha":"~1.1.0","request":"~2.9.202"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dshaw","email":"dshaw@dshaw.com"},"_id":"blogit@0.0.3","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.7.9","_defaultsLoaded":true,"dist":{"shasum":"aeb1a82a711f27e5070d842095850ed010e9ef6c","tarball":"http://registry.npmjs.org/blogit/-/blogit-0.0.3.tgz"},"maintainers":[{"name":"dshaw","email":"dshaw@dshaw.com"}]},"0.0.4":{"name":"blogit","version":"0.0.4","description":"Minimalist Node.js blog engine using Markdown and Git for storage.","keywords":["blog","blogging","git","md","markdown"],"author":{"name":"Daniel D. Shaw","email":"dshaw@dshaw.com","url":"http://dshaw.com"},"repository":{"type":"git","url":"git://github.com/dshaw/blogit.git"},"bugs":{"url":"http://github.com/dshaw/blogit/issues"},"license":"MIT","main":"./blog","scripts":{"test":"NODE_ENV=test ./node_modules/.bin/mocha"},"dependencies":{"templar":"0.0.5","marked":"~0.2.5","optimist":"~0.3.4","ejs":"~0.7.1","async":"~0.1.22","mapleTree":"~0.1.8"},"devDependencies":{"mocha":"~1.1.0","request":"~2.9.202"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dshaw","email":"dshaw@dshaw.com"},"_id":"blogit@0.0.4","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.7.9","_defaultsLoaded":true,"dist":{"shasum":"2e1d7edc3da960da3f49f5833640b860a135d089","tarball":"http://registry.npmjs.org/blogit/-/blogit-0.0.4.tgz"},"maintainers":[{"name":"dshaw","email":"dshaw@dshaw.com"}]},"0.0.5":{"name":"blogit","version":"0.0.5","description":"Minimalist Node.js blog engine using Markdown and Git for storage.","keywords":["blog","blogging","git","md","markdown"],"author":{"name":"Daniel D. Shaw","email":"dshaw@dshaw.com","url":"http://dshaw.com"},"repository":{"type":"git","url":"git://github.com/dshaw/blogit.git"},"bugs":{"url":"http://github.com/dshaw/blogit/issues"},"license":"MIT","main":"./blog","scripts":{"test":"NODE_ENV=test ./node_modules/.bin/mocha"},"dependencies":{"templar":"0.0.5","marked":"~0.2.5","optimist":"~0.3.4","ejs":"~0.7.1","async":"~0.1.22","mapleTree":"~0.1.8"},"devDependencies":{"mocha":"~1.1.0","request":"~2.9.202"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"dshaw","email":"dshaw@dshaw.com"},"_id":"blogit@0.0.5","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"e2f720a11f0095eec8ccbb0a9d32ddaad48f494e","tarball":"http://registry.npmjs.org/blogit/-/blogit-0.0.5.tgz"},"maintainers":[{"name":"dshaw","email":"dshaw@dshaw.com"}]}},"readme":"blogit\n======\n\nMinimalist Node.js blog engine using Markdown and git for storage.\n\n## Objectives\n\n- Create a minimalist framework for blogging using Node.js and Markdown.\n- Use Handlebars/Mustache XOR EJS.\n- Provide simple hooks for author Twitter links and sharing web intents.\n","maintainers":[{"name":"dshaw","email":"dshaw@dshaw.com"}],"time":{"modified":"2012-06-07T00:55:10.168Z","created":"2012-06-04T22:12:46.525Z","0.0.2":"2012-06-04T22:12:47.593Z","0.0.3":"2012-06-05T03:54:45.685Z","0.0.4":"2012-06-05T10:10:41.452Z","0.0.5":"2012-06-07T00:55:10.168Z"},"author":{"name":"Daniel D. Shaw","email":"dshaw@dshaw.com","url":"http://dshaw.com"},"repository":{"type":"git","url":"git://github.com/dshaw/blogit.git"},"_attachments":{"blogit-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-00vorQhykcDB1AeiRNk9MQ==","length":6528,"stub":true},"blogit-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sTVy5HDjbxC7zqxaXSd4Tg==","length":6505,"stub":true},"blogit-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7oJ+Lzc8OE98+7BE/dA9pQ==","length":6371,"stub":true},"blogit-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-wkU2xtcjr6iajVV/LWM2EA==","length":5851,"stub":true}}}},
{"id":"blogman","key":"blogman","value":{"rev":"3-032e372662a92117359c4281e6b7124f"},"doc":{"_id":"blogman","_rev":"3-032e372662a92117359c4281e6b7124f","name":"blogman","description":"An easy-to-use blog engine for developers.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"blogman","description":"An easy-to-use blog engine for developers.","version":"0.1.0","homepage":"http://github.com/krlito/blogman-node.git","author":{"name":"Carlos Campo","email":"carlos@campo.com.co"},"repository":{"type":"git","url":"git://github.com/krlito/blogman-node.git"},"directories":{"lib":"./lib"},"dependencies":{"filemonitor":"","async":"","showdown":""},"_npmUser":{"name":"krlito","email":"carlos@campo.com.co"},"_id":"blogman@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1daa8241e17f0ad604156c402efff426bb1fa55a","tarball":"http://registry.npmjs.org/blogman/-/blogman-0.1.0.tgz"},"maintainers":[{"name":"krlito","email":"carlos@campo.com.co"}]}},"readme":"#Blogman\n\nBlogman is an easy-to-use blog engine made for node.js platform. You only need to write your \narticles/posts in markdown, put them in the posts folder and blogman will process them to be shown \non your website.\n\nThis module is intended to be used in personal developers blogs. A working example can be seen in \n[my blog][carlos-blog]. This blog engine is in alpha state because it still does not have all the \ndesired features. Anyway, it is fully operational as it is right now.\n\n\n##Requirements\n\nBlogman depens on [filemonitor-node], which depends on [inotify-tools]. To install inotify-tools \non a Linux (Debian/Ubuntu) system:\n\n    sudo apt-get install inotify-tools\n\nFor installing on other linux flavors, go [here][getting-inotify-tools].\n\n\n##Installation\n\nOnce [inotify-tools] is installed. On your project directory:\n\n    npm install blogman\n\n\n##Usage\n\nBlogman has two operation modes as described in the following sub-sections.\n\n\n### Express integration mode\n\nFor using blogman with [express], you just configure it passing the express application object.\nAlso, you can pass an optional settings object as it is shown in the next example. Any setting not\nset in the settings object will take a default value. Default values are the same shown in the\nexample, e.g. default `encoding` value is \"utf8\".\n\n```javascript\n    var express = require('express'),\n      blogman = require('blogman'),\n      app = express.createServer();\n\n    //... some express configuration code\n\n    //Routes\n\n    blogman.configure(app, {\n      route: \"/blog\",\n      blogdir: \"./blog/\",\n      encoding: \"utf8\",\n      postsPerPage: 5\n    });\n    //app.get...\n    //Other routes\n```\n\nIf you want to use default setting values, you could just invoke `blogman.configure(app);`.\nIn the example, full method arguments were used for demostration purposes.\n\n\n#### So what blogman does is...\n\nAssuming you use default settings as in the previous example. Postman will capture two routes:\n- GET http://yoursite/blog(/:page)?\n- GET http://youtsite/blog/post/:id\n\nThe first route is for showing your post list in a paginated way. The number of posts shown \nper page is defined by property `postsPerPage`. The second route will be used for accessing \nan specific article. For rendering these pages, blogman will use `blog` and `blogpost` \nviews in your express project. These two views MUST exist.\n\nBlogman will look for markdown files in the `./blog/posts/` folder. These files will be read \nusing the defined encoding. They will be parsed and processed so they can be shown when they are\nrequested.\n\nA blogman example markdown file format is:\n\n    title: My First Post\n    author: John Doe\n    date: 01 May 2011 16:30:00 -0500\n\n    This is my first post for blogman blog engine.\n    \n    Here there is another paragraph.\n\nAs you can see, blogman markdown files should have a special header with metadata for the post. \nIt is recommended to use at least these three properties (`title`, `author` and `date`). Anyway, \nyou could set any property you desire in the header like `keywords` or `location`. Header goes \nfrom the beginning of the file until the first blank line is found.\n\nNotes:\n- `date` is a very important property because posts are ordered using this criteria. Be careful \nto use a valid javascript date string format as in the example. \n- There is an `id` property which uniquely identifies a post. It is set to be the filename\nwithout `.markdown` extension. Do NOT declare this property inside the file.\n- Each time an article file is put in the `./blog/posts` folder, it will be added to the \nwebsite without doing anything else.\n\n\n#### To render...\n\nAs stated previously, renderization is done using views `blog` and `blogpost` of the express \nproject. `blog` is used when a list of posts is to be rendered and `blogpost` is used when only \none post is going to be shown. In the latter case, the view will receive an object called `post`\nwith all the properties in the header of the post. `post` also have a `content` property with \nthe HTML of the post content. If using jade, a view could be like this:\n\n```jade\n    .blog-post\n     .blog-post-title\n       h2= post.title\n       p by <b>#{post.author}</b> on #{post.date}\n     .blog-post-content\n       != post.content\n```\n\nFor the `blog` view (list of posts) case, you will receive a `posts` array. Then, you could do:\n\n```jade\n    .content-title\n      h1 Blog Articles\n    .blog-list\n      each post in posts\n        .blog-li\n          .blog-li-title\n            h2\n              a(href='/blog/post/#{post.id}')= post.title\n            small= post.date\n          .blog-li-preview\n            != post.preview\n          a.btn.btn-primary(href='/blog/post/#{post.id}') Read more...\n    .pagination.pagination-centered\n      ul\n        - for(var i=1; i <= posts.pageCount; i++)\n          if i!==posts.page\n            li\n              a(href='/blog/#{i}')= i\n          else\n            li.active\n              a= i\n```\n\nIn this example, you can see `posts` array has a `page` property to indicate the current page. \nAlso, each element of the array has a `preview` which is an HTML fragment of the full post content.\n\n\n### Post/Article manager mode\n\nIn this mode, you can configure Blogman passing `null` instead of an application object. In this\ncase Blogman interface exposes methods `post(:id, callback(err, post))` and\n`posts(:page, callback(err, posts)` which will respectively return one and many posts objects so\nyou can use them as you like. This objects are the same that would be passed to the views in the\n*express integration mode*.\n\n```javascript\n    var blogman = require('blogman');\n    blogman.configure(null);\n    \n    blogman.post('welcome', function(err, postData) {\n      if(err) { return; };\n      console.log(postData.title);\n      console.log(postData.content);\n    });\n```\n\n##ToDo\nAs stated previously, Blogman in in alpha stage. Features planned to be added soon are:\n- Automatic syntax highlighting.\n- Support for comments. \n- Support for RSS.\n- Better layouts/views management support.\n\n[carlos-blog]: http://campo.com.co/blog\n[filemonitor-node]: http://github.com/krlito/filemonitor-node\n[inotifywait]: http://github.com/rvoicilas/inotify-tools/wiki\n[inotify-tools]: http://github.com/rvoicilas/inotify-tools/wiki\n[express]: http://github.com/visionmedia/express/ \n","maintainers":[{"name":"krlito","email":"carlos@campo.com.co"}],"time":{"modified":"2012-05-08T22:39:26.518Z","created":"2012-05-08T22:39:24.981Z","0.1.0":"2012-05-08T22:39:26.518Z"},"author":{"name":"Carlos Campo","email":"carlos@campo.com.co"},"repository":{"type":"git","url":"git://github.com/krlito/blogman-node.git"},"_attachments":{"blogman-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BLfRbp3OncbSld/EgP7yFA==","length":7266,"stub":true}}}},
{"id":"blogmate","key":"blogmate","value":{"rev":"27-71b11fba3972a89c01c369784de28b74"},"doc":{"_id":"blogmate","_rev":"27-71b11fba3972a89c01c369784de28b74","name":"blogmate","description":"Smart blog engine for node.js.","dist-tags":{"latest":"0.2.8"},"versions":{"0.1.0":{"name":"blogmate","description":"Blog engine for node.js.","version":"0.1.0","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"38969df9567a4addb78df9d40cc03126684bffe2","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.1.0.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.1.2":{"name":"blogmate","description":"Blog engine for node.js.","version":"0.1.2","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6c12f6c7283fb19271266018fcecb6f0b657151c","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.1.2.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.1.3":{"name":"blogmate","description":"Blog engine for node.js.","version":"0.1.3","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fb647e15b80e3350db5aa765e40c3be681f4749b","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.1.3.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.1.4":{"name":"blogmate","description":"Blog engine for node.js.","version":"0.1.4","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.1.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3352e0e5a0c6e3f1c7f7ebe7797c22a6c62b29f9","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.1.4.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.1.5":{"name":"blogmate","description":"Blog engine for node.js.","version":"0.1.5","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.1.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7dd1a3a128bf32f8136f024d14db1338d6e7cc7f","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.1.5.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.0":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.0","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2","findit":">=0.1.1"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ee4a41447c226ad7943fc56411c913a080375e03","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.0.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.1":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.1","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2","findit":">=0.1.1","highlight":">=0.2.0"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7598e8f8d8d30a373bdcd8618131d9fba221065a","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.1.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.2":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.2","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2","findit":">=0.1.1","highlight":">=0.2.0"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8dbdc86f90fb8c4740fb5f33b70cfac0fc106ce2","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.2.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.3":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.3","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","eco":">=1.0.0","sugar":">=0.9.5","mongoose":">=2.1.2","findit":">=0.1.1"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"22667138a8fe2e19d9eeffdc475953723a4a0e22","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.3.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.5":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.5","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","sugar":">=0.9.5","mongoose":">=2.1.2","eco-plus":">=0.1.0"},"_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8a7320fadcf9b4bc7f7740ed5193b2e31015977e","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.5.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.6":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.6","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","sugar":">=0.9.5","mongoose":">=2.1.2","eco-plus":">=0.1.0","findit":">=0.1.1","github-flavored-markdown":">=1.0.0","yaml":"=0.2.1"},"directories":{"lib":"lib"},"main":"./lib/blogmate.coffee","_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7cb25be45294447e12de7bf237009f314ac107cf","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.6.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.7":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.7","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","sugar":">=0.9.5","mongoose":">=2.1.2","eco-plus":">=0.1.1","findit":">=0.1.1","github-flavored-markdown":">=1.0.0","yaml":"=0.2.1"},"directories":{"lib":"lib"},"main":"./lib/blogmate.coffee","_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6c244294d9c814be0e733ba7c4f5aadfb3f1af36","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.7.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]},"0.2.8":{"name":"blogmate","description":"Smart blog engine for node.js.","version":"0.2.8","author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"contributors":[{"name":"Alex Kravets","email":"santyor@gmail.com"}],"dependencies":{"coffee-script":">=1.0.1","express":">=2.3.9","connect-form":">=0.2.1","sugar":">=0.9.5","mongoose":">=2.1.2","eco-plus":">=0.1.1","findit":">=0.1.1","github-flavored-markdown":">=1.0.0","yaml":"=0.2.1"},"directories":{"lib":"lib"},"main":"./lib/blogmate.coffee","_npmJsonOpts":{"file":"/Users/alex/.npm/blogmate/0.2.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"blogmate@0.2.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"bbdd9bf4b14c7ba7c07c542ecc96b62c016fd728","tarball":"http://registry.npmjs.org/blogmate/-/blogmate-0.2.8.tgz"},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}]}},"maintainers":[{"name":"alexkravets","email":"santyor@gmail.com"}],"time":{"modified":"2011-10-01T22:37:08.625Z","created":"2011-09-17T16:30:04.495Z","0.1.0":"2011-09-17T16:30:06.059Z","0.1.2":"2011-09-17T21:04:36.482Z","0.1.3":"2011-09-19T08:56:01.614Z","0.1.4":"2011-09-19T08:58:31.600Z","0.1.5":"2011-09-20T09:20:03.861Z","0.2.0":"2011-09-23T17:23:48.507Z","0.2.1":"2011-09-23T21:13:56.617Z","0.2.2":"2011-09-24T09:21:37.673Z","0.2.3":"2011-09-24T14:50:30.716Z","0.2.5":"2011-09-25T17:58:38.462Z","0.2.6":"2011-09-29T20:26:46.188Z","0.2.7":"2011-09-29T20:33:20.905Z","0.2.8":"2011-10-01T22:37:08.625Z"},"author":{"name":"Alex Kravets","email":"santyor@gmail.com"},"_attachments":{"blogmate-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-N6DNGQFKGaJv4D8/bbA7Pg==","length":2554,"stub":true},"blogmate-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-WLQcqkLsYTjLo/M/eBtgjQ==","length":2542,"stub":true},"blogmate-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-RPUxxG0IoNsy9OoHvcjJSg==","length":2544,"stub":true},"blogmate-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-fZRfrxNib8gcadQ5QBBj6g==","length":4091,"stub":true},"blogmate-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Pv9P+CUbF701dliYimYGvA==","length":5850,"stub":true},"blogmate-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-2B7+tnHuvZBqhTLnOZD5Ng==","length":7099,"stub":true},"blogmate-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-qB/cA/joQJkm7YhzrPLdKw==","length":97647,"stub":true},"blogmate-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wbmtQO1wxJCdpo/fDVknDQ==","length":96984,"stub":true},"blogmate-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-bAyi1gAKZb1m+OSFQ/LwXQ==","length":7943,"stub":true},"blogmate-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-82F3/JF9+mxLZpc7Fz6S9g==","length":7888,"stub":true},"blogmate-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WCTN5ki9+nSkbsvhO6P4Zw==","length":7892,"stub":true},"blogmate-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zNdlx38uZ9ukJJ0HADLoZw==","length":7893,"stub":true},"blogmate-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+yXY5zHqHE2iTESCa8Xk5g==","length":7879,"stub":true}}}},
{"id":"blogsiple","key":"blogsiple","value":{"rev":"5-235489aa4d96873be7ec180eaafc00cb"},"doc":{"_id":"blogsiple","_rev":"5-235489aa4d96873be7ec180eaafc00cb","name":"blogsiple","description":"Simple CMS for NodeXT and Create","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"blogsiple","description":"Simple CMS for NodeXT and Create","keywords":["cms"],"author":{"name":"Henri Bergius"},"version":"0.0.1","licenses":[{"type":"MIT","url":"https://github.com/bergie/blogsiple/raw/master/LICENSE"}],"engine":{"node":">=0.4"},"dependencies":{"express":">=2.5.4","express-resource":">=0.2.4","resource-juggling":">=0.0.1","nodext":">=0.0.7","nodext-create":">=0.0.5","coffee-script":">=1.2.0","jugglingdb":">=0.0.7","less":">=1.3.0","jade":">=0.20.0","connect-conneg":">=0.1.1","request":"2.9.x","xml2js":"0.1.x","redis":">=0.7.1"},"repository":{"type":"git","url":"git://github.com/bergie/blogsiple.git"},"_npmUser":{"name":"bergie","email":"henri.bergius@iki.fi"},"_id":"blogsiple@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"07bdf29067664c494907deaf24fca99f32159e12","tarball":"http://registry.npmjs.org/blogsiple/-/blogsiple-0.0.1.tgz"},"maintainers":[{"name":"bergie","email":"henri.bergius@iki.fi"}]},"0.0.3":{"name":"blogsiple","description":"Simple CMS for NodeXT and Create","keywords":["cms"],"author":{"name":"Henri Bergius"},"version":"0.0.3","licenses":[{"type":"MIT","url":"https://github.com/bergie/blogsiple/raw/master/LICENSE"}],"engine":{"node":">=0.4"},"dependencies":{"express":">=2.5.4","express-resource":">=0.2.4","resource-juggling":">=0.0.1","nodext":">=0.0.9","nodext-create":">=0.0.5","coffee-script":">=1.2.0","jugglingdb":">=0.0.7","less":">=1.3.0","jade":">=0.20.0","connect-conneg":">=0.1.1","request":"2.9.x","xml2js":"0.1.x","redis":">=0.7.1"},"repository":{"type":"git","url":"git://github.com/bergie/blogsiple.git"},"bin":{"blogsiple":"./bin/blogsiple","blogsiple_import_rss":"./bin/blogsiple_import_rss"},"_npmUser":{"name":"bergie","email":"henri.bergius@iki.fi"},"_id":"blogsiple@0.0.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"171477631806224c2a8c1b9b92b73c2a056b8794","tarball":"http://registry.npmjs.org/blogsiple/-/blogsiple-0.0.3.tgz"},"maintainers":[{"name":"bergie","email":"henri.bergius@iki.fi"}]}},"readme":"Blogsiple - simple blog system example\n==========================\n\nBlogsiple is the official Node.js testbed for [Create](http://createjs.org/) CMS UI integration. It has been built using the [NodeXT](https://github.com/bergie/nodext) framework.\n\n## Installation\n\n    $ npm install\n\nYou also need a JugglingDB database provider. By default we use Redis:\n\n    $ npm install redis\n\n## Running\n\n    $ ./node_modules/nodext/bin/nodext configuration/redis_8001.json\n\n## Importing blog entries\n\nYou can populate the Blogsiple database with blog posts from any RSS feed. Do this with:\n\n    $ ./bin/import_rss configuration/redis_8001.json http://bergie.iki.fi/blog/rss.xml\n\n## TODO\n\n* Authentication with [PassportJS](http://passportjs.org/)\n* Access controls into JugglingDB\n* Atom format\n\n## License and contributing\n\nFor now Blogsiple is intended to serve only as an example and CreateJS development testbed. But even so, contributions are welcome.\n\nBlogsiple code is available under the MIT license.\n","maintainers":[{"name":"bergie","email":"henri.bergius@iki.fi"}],"time":{"modified":"2012-03-30T13:47:07.455Z","created":"2012-03-30T12:13:15.452Z","0.0.1":"2012-03-30T12:13:17.107Z","0.0.3":"2012-03-30T13:47:07.455Z"},"author":{"name":"Henri Bergius"},"repository":{"type":"git","url":"git://github.com/bergie/blogsiple.git"},"_attachments":{"blogsiple-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TLsTemG6N370/6lChiPwBA==","length":197837,"stub":true},"blogsiple-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2HJKyfIaguNh/7DV+jMe3Q==","length":222111,"stub":true}}}},
{"id":"bloodhound","key":"bloodhound","value":{"rev":"3-051a93e7a066a5e309584eef5ad8f5f3"},"doc":{"_id":"bloodhound","_rev":"3-051a93e7a066a5e309584eef5ad8f5f3","name":"bloodhound","description":"Just find the calls to require(). All of them.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"name":"bloodhound","description":"Just find the calls to require(). All of them.","version":"1.0.0","homepage":"https://github.com/thejh/node-bloodhound","repository":{"type":"git","url":"git://github.com/thejh/node-bloodhound.git"},"engines":{"node":"~0.6.4"},"dependencies":{"astjourney":"*"},"devDependencies":{"tap":"*"},"scripts":{"test":"tap test/*.js"},"_npmUser":{"name":"thejh","email":"jannhorn@gmail.com"},"_id":"bloodhound@1.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"190a3caa488e537a05a38300dac250972bb8604c","tarball":"http://registry.npmjs.org/bloodhound/-/bloodhound-1.0.0.tgz"},"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}]}},"readme":null,"maintainers":[{"name":"thejh","email":"jannhorn@gmail.com"}],"time":{"modified":"2011-12-14T22:26:55.494Z","created":"2011-12-14T22:26:53.756Z","1.0.0":"2011-12-14T22:26:55.494Z"},"author":{"name":"Jann Horn","email":"jannhorn@googlemail.com"},"repository":{"type":"git","url":"git://github.com/thejh/node-bloodhound.git"},"_attachments":{"bloodhound-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2OGS0VFsOomx+XsPbLlhbQ==","length":2430,"stub":true}}}},
{"id":"bloodmoney","key":"bloodmoney","value":{"rev":"3-859b0235de3a29bf241323a31f9aa730"},"doc":{"_id":"bloodmoney","_rev":"3-859b0235de3a29bf241323a31f9aa730","name":"bloodmoney","description":"A simple cache banking system using redis","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"David DeRemer","email":"david@grandelabs.com"},"name":"bloodmoney","description":"A simple cache banking system using redis","keywords":["redis","cache","bank","data","expire"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/deremer/Bloodmoney.git"},"main":"index.js","engines":{"node":">=0.4.0 <0.5.0"},"dependencies":{"redis":"0.6.x"},"devDependencies":{},"_id":"bloodmoney@0.0.1","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ed395c36298c69790acc069100b5b52d87631f9b","tarball":"http://registry.npmjs.org/bloodmoney/-/bloodmoney-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"deremer","email":"david@grandelabs.com"}]}},"maintainers":[{"name":"deremer","email":"david@grandelabs.com"}],"time":{"modified":"2011-08-01T16:23:27.206Z","created":"2011-08-01T16:23:26.694Z","0.0.1":"2011-08-01T16:23:27.206Z"},"author":{"name":"David DeRemer","email":"david@grandelabs.com"},"repository":{"type":"git","url":"git://github.com/deremer/Bloodmoney.git"},"_attachments":{"bloodmoney-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7Q3l+/gzjb8DBQK/njN16A==","length":3853,"stub":true}}}},
{"id":"bloom","key":"bloom","value":{"rev":"15-c609882b29d61a771d7dbf17f43016ad"},"doc":{"_id":"bloom","_rev":"15-c609882b29d61a771d7dbf17f43016ad","name":"bloom","description":"Bloom Filters for node","dist-tags":{"latest":"0.5.3"},"versions":{"0.5.2":{"name":"bloom","description":"Bloom Filters for node","version":"0.5.2","repository":{"type":"git","url":"git://github.com/deanmao/bloom.git"},"author":{"name":"Dean Mao","email":"deanmao@gmail.com"},"scripts":{"preinstall":"make makelibs","preuninstall":"make clean"},"engines":{"node":">=0.4.0"},"_id":"bloom@0.5.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bfc97e88244a789d8b076e8558f7d1d930076856","tarball":"http://registry.npmjs.org/bloom/-/bloom-0.5.2.tgz"}},"0.5.3":{"name":"bloom","description":"Bloom Filters for node","version":"0.5.3","repository":{"type":"git","url":"git://github.com/deanmao/bloom.git"},"author":{"name":"Dean Mao","email":"deanmao@gmail.com"},"scripts":{"preinstall":"make makelibs","preuninstall":"make clean"},"engines":{"node":">=0.4.0"},"_id":"bloom@0.5.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b33b7741fcb056276ccafb2b17918d20b087a5d5","tarball":"http://registry.npmjs.org/bloom/-/bloom-0.5.3.tgz","bin":{"0.4-sunos-5.11":{"shasum":"ee26d22a11d61cacc95e3e83e4e8a8e80e6f3dd2","tarball":"http://registry.npmjs.org/bloom/-/bloom-0.5.3-0.4-sunos-5.11.tgz"}}}}},"maintainers":[{"name":"deanmao","email":"deanmao@gmail.com"}],"time":{"modified":"2011-04-15T21:04:19.050Z","created":"2011-04-05T08:27:16.505Z","0.5.0":"2011-04-05T08:27:16.788Z","0.5.1":"2011-04-05T08:38:57.769Z","0.5.2":"2011-04-05T08:50:08.155Z","0.5.3":"2011-04-14T23:34:16.910Z"},"author":{"name":"Dean Mao","email":"deanmao@gmail.com"},"repository":{"type":"git","url":"git://github.com/deanmao/bloom.git"},"_attachments":{"bloom-0.5.3-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-gSNXwp2T2Jud9+6mOc/ZFg==","length":80278,"stub":true},"bloom-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-NwXFcVnDAmHlKslON5kV2A==","length":6388,"stub":true},"bloom-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ht91Zb+B2fLuIrc89IMqTQ==","length":6115,"stub":true}}}},
{"id":"bloom-redis","key":"bloom-redis","value":{"rev":"3-cd76f933c45b355b0c65209b22894678"},"doc":{"_id":"bloom-redis","_rev":"3-cd76f933c45b355b0c65209b22894678","name":"bloom-redis","description":"a simple redis-backed bloom-filter","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bloom-redis","version":"0.0.1","description":"a simple redis-backed bloom-filter","keywords":["bloom","filter","redis","bloom-filter"],"author":{"name":"Calvin French-Owen","email":"calvin@segment.io"},"repository":{"type":"git","url":"git@github.com:segmentio/bloom-redis.git"},"main":"index","engines":{"node":">= 0.4.x < 0.8.0"},"scripts":{"test":"find test -type f | xargs mocha -R spec -t 5000"},"dependencies":{"redis":"*"},"devDependencies":{"should":"*","mocha":"*","underscore":"*"},"_npmUser":{"name":"calvinfo","email":"calvin@segment.io"},"_id":"bloom-redis@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8fe8137bbbb484bfa4589ec327eb8dc5b291d62d","tarball":"http://registry.npmjs.org/bloom-redis/-/bloom-redis-0.0.1.tgz"},"maintainers":[{"name":"calvinfo","email":"calvin@segment.io"}]}},"readme":"Bloom-Redis\n===========\n\nA bloom filter for node backed by redis.\n\nInstallation\n------------\n\nTo install, use npm and run `npm install bloom-redis`.\n\n\nUsage\n-----\n\n#### Creating a filter\n\nLike mongoose, bloom-redis allows you to specify a single redis client for your filters to connect to. Alternatively, you can give a client to each filter instance.\n\nTo use a single redis client, use the `bloom.connect` call as shown below:\n\n\n    var redis = require('redis'),\n        bloom = require('bloom-redis');\n\n    var client = redis.createClient();\n    bloom.connect(client);\n\n    filter = new bloom.BloomFilter({ key : 'mykey' });\n\n\nYou may also pass in the client to the filter explicitly\n\n    filter = new bloom.BloomFilter({ client : otherClient,\n                                     key    : 'otherKey' });\n\n\nFilters take the following options:\n\n* **client** - redis client instance from call to `connect` or explicit pass\n* **size** - size of the bloom filter in bits.\n* **numHashes** - number of hash functions to use\n* **key** - redis key to store at\n\n\n#### Adding an element to the filter\n\n    filter.add(string, [callback]);\n\n#### Checking for membership\n\n    filter.contains(string, callback);\n\n#### Clearing a filter\n\n    filter.clear([callback]);\n\n\nAdditional Info\n===============\n\nCurrently `md5` is used as the hash function and is seeded with different values. It has good collision resistancy against a random dataset. However, it generates far more bits than we actually need, and may not be as fast as other hash functions.\n\nFor more info on Bloom filters, you can read these excellent resources:\n\n* [Ilya Grigorik's Bloom Filters in Ruby](http://www.igvita.com/2008/12/27/scalable-datasets-bloom-filters-in-ruby/)\n* [Wikipedia](http://en.wikipedia.org/wiki/Bloom_filter)\n\n\n\n\n","maintainers":[{"name":"calvinfo","email":"calvin@segment.io"}],"time":{"modified":"2012-02-24T16:19:47.133Z","created":"2012-02-24T16:19:46.520Z","0.0.1":"2012-02-24T16:19:47.133Z"},"author":{"name":"Calvin French-Owen","email":"calvin@segment.io"},"repository":{"type":"git","url":"git@github.com:segmentio/bloom-redis.git"},"_attachments":{"bloom-redis-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Xog+vXqZy0QAv25EmhBsOQ==","length":3455,"stub":true}}}},
{"id":"bloom-sql","key":"bloom-sql","value":{"rev":"5-1772f5c1681cfe66c58543ca81bdc6de"},"doc":{"_id":"bloom-sql","_rev":"5-1772f5c1681cfe66c58543ca81bdc6de","name":"bloom-sql","description":"Chained functions for building SQL strings for node-postgres.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bloom-sql","version":"0.0.1","description":"Chained functions for building SQL strings for node-postgres.","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha"},"repository":{"type":"git","url":"git@github.com:bloomtime/bloom-sql-js.git"},"keywords":["sql","pg","postgres"],"author":{"name":"Tom Carden"},"license":"MIT","devDependencies":{"mocha":"~1.3.0","should":"~0.6.3"},"readme":"# What are you?\n\nI am an __overly simple__ library to make it a bit easier to build simple SQL statements for [node-postgres](https://github.com/brianc/node-postgres/) (affectionaly known as `pg`). I generate the `{ text: '...', values: [] }` objects that you typically pass to `client.query(...)`.\n\nIt gets tedious matching up `$1, $2` etc. and building the right kind of values array. My functions help you do this and get the place-holder numbers right, even for `UPDATE/SET/WHERE` and for `WHERE IN` clauses which require a flattened array of arguments.\n\nI have some tests written in Mocha. Of course I could use more!\n\n_No really_. __Overly simple__. \n\n# Like what?\n\n```\nvar SQL = require('bloom-sql'),\n    INSERT = SQL.INSERT,\n    SELECT = SQL.SELECT,\n    UPDATE = SQL.UPDATE,\n    DELETE = SQL.DELETE;\n```\n\nSelecting stuff:\n\n```\n> SELECT().FROM('foo').WHERE({ a: [1,2,3], b: 4 });\n{ text: 'SELECT * FROM foo WHERE a IN ($1, $2, $3) AND b = $4',\n  values: [ 1, 2, 3, 4 ] }\n```\n\nDeleting stuff:\n\n```\n> DELETE('foo').WHERE({ a: 1, b: 2 });\n{ text: 'DELETE FROM foo WHERE a = $1 AND b = $2',\n  values: [ 1, 2 ] }\n```\n\nInserting stuff:\n\n```\n> INSERT('foo').VALUES({ a: null, b: null, c: null });\n{ text: 'INSERT INTO foo(a, b, c) VALUES($1, $2, $3)',\n  values: [ null, null, null ] }\n```\n\nUpdating stuff:\n\n```\n> UPDATE('foo').SET({ a: 1, b: 2, c: 3 }).WHERE({ d: 4, e: 5 }).RETURNING('*');\n{ text: 'UPDATE foo SET a = $1, b = $2, c = $3 WHERE d = $4 AND e = $5 RETURNING *',\n  values: [ 1, 2, 3, 4, 5 ] }\n```\n\n__This code does not talk to the database.__ Connect to `pg` as normal as pass one of the resulting query objects to the db to run it:\n\n```\nvar pg = require('pg'),\n    SELECT = require('bloom-sql').SELECT;\n\nvar db = new pg.Client('YOUR_DB_URL');\ndb.connect();\n\nvar query = SELECT('*').FROM('users').WHERE({id:1}).LIMIT(1);\ndb.query(query, function(err,results){\n  // ensure !err\n  // check results.rowCount === 1 \n  // do stuff with results.rows[0]\n});\n```\n\n# TODO\n\n * complex conjunctions `(a = 1 AND b = 2) OR (c = 3 AND d = 4)`\n * comparisons in where clauses `(a > 1 AND b < 2)`\n * any hint of `JOIN`, sub-select, etc.\n * the other 90% of SQL?\n\n# Installation\n\n`npm install bloom-sql --save`\n\n(`--save` automatically updates your `package.json` file, tell your friends)\n\n\n# License\n\n(The MIT License)\n\nCopyright (c) 2011-2012 Bloom Studio, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"bloom-sql@0.0.1","dist":{"shasum":"03e03086829eb407108f522bb2bd5eb881de9d6b","tarball":"http://registry.npmjs.org/bloom-sql/-/bloom-sql-0.0.1.tgz"},"maintainers":[{"name":"randometc","email":"tom@tom-carden.co.uk"}]},"0.0.2":{"name":"bloom-sql","version":"0.0.2","description":"Chained functions for building SQL strings for node-postgres.","main":"index.js","scripts":{"test":"./node_modules/mocha/bin/mocha"},"repository":{"type":"git","url":"git@github.com:bloomtime/bloom-sql-js.git"},"keywords":["sql","pg","postgres"],"author":{"name":"Tom Carden"},"license":"MIT","devDependencies":{"mocha":"~1.3.0","should":"~0.6.3"},"readme":"# What are you?\n\nI am an __overly simple__ library to make it a bit easier to build simple SQL statements for [node-postgres](https://github.com/brianc/node-postgres/) (affectionaly known as `pg`). I generate the `{ text: '...', values: [] }` objects that you typically pass to `client.query(...)`.\n\nIt gets tedious matching up `$1, $2` etc. and building the right kind of values array. My functions help you do this and get the place-holder numbers right, even for `UPDATE/SET/WHERE` and for `WHERE IN` clauses and Postgres `ARRAY[]` values which require a flattened array of arguments.\n\nI have some tests written in Mocha. Of course I could use more!\n\n_No really_. __Overly simple__. \n\n# Like what?\n\n```\nvar SQL = require('bloom-sql'),\n    INSERT = SQL.INSERT,\n    SELECT = SQL.SELECT,\n    UPDATE = SQL.UPDATE,\n    DELETE = SQL.DELETE;\n```\n\nSelecting stuff:\n\n```\n> SELECT().FROM('foo').WHERE({ a: [1,2,3], b: 4 });\n{ text: 'SELECT * FROM foo WHERE a IN ($1, $2, $3) AND b = $4',\n  values: [ 1, 2, 3, 4 ] }\n```\n\nDeleting stuff:\n\n```\n> DELETE('foo').WHERE({ a: 1, b: 2 });\n{ text: 'DELETE FROM foo WHERE a = $1 AND b = $2',\n  values: [ 1, 2 ] }\n```\n\nInserting stuff:\n\n```\n> INSERT('foo').VALUES({ a: null, b: null, c: null });\n{ text: 'INSERT INTO foo(a, b, c) VALUES($1, $2, $3)',\n  values: [ null, null, null ] }\n```\n\nUpdating stuff:\n\n```\n> UPDATE('foo').SET({ a: 1, b: 2, c: 3 }).WHERE({ d: 4, e: 5 }).RETURNING('*');\n{ text: 'UPDATE foo SET a = $1, b = $2, c = $3 WHERE d = $4 AND e = $5 RETURNING *',\n  values: [ 1, 2, 3, 4, 5 ] }\n```\n\n__This code does not talk to the database.__ Connect to `pg` as normal as pass one of the resulting query objects to the db to run it:\n\n```\nvar pg = require('pg'),\n    SELECT = require('bloom-sql').SELECT;\n\nvar db = new pg.Client('YOUR_DB_URL');\ndb.connect();\n\nvar query = SELECT('*').FROM('users').WHERE({id:1}).LIMIT(1);\ndb.query(query, function(err,results){\n  // ensure !err\n  // check results.rowCount === 1 \n  // do stuff with results.rows[0]\n});\n```\n\n# TODO\n\n * complex conjunctions `(a = 1 AND b = 2) OR (c = 3 AND d = 4)`\n * comparisons in where clauses `(a > 1 AND b < 2)`\n * any hint of `JOIN`, sub-select, etc.\n * the other 90% of SQL?\n * it would be nice to support Postgres `ARRAY` operators in `WHERE` clauses, but this probably requires a different way of doing `IN` queries. Right now:\n   * in `UPDATE` and `INSERT`, a JS Array `[1,2,3]` will be converted into a Postgres `ARRAY[$1,$2,$3]` and the values flattened appropriately for the prepared statement\n   * in `WHERE` clauses, a JS Array `[1,2,3]` will be converted into a SQL `IN ($1,$2,$3)` and  the values flattened appropriately for the prepared statement\n\n# Installation\n\n`npm install bloom-sql --save`\n\n(`--save` automatically updates your `package.json` file, tell your friends)\n\n\n# License\n\n(The MIT License)\n\nCopyright (c) 2011-2012 Bloom Studio, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"bloom-sql@0.0.2","dist":{"shasum":"c77ee83a6f85e805629a547241cc3d127a4a168a","tarball":"http://registry.npmjs.org/bloom-sql/-/bloom-sql-0.0.2.tgz"},"maintainers":[{"name":"randometc","email":"tom@tom-carden.co.uk"}]}},"readme":"# What are you?\n\nI am an __overly simple__ library to make it a bit easier to build simple SQL statements for [node-postgres](https://github.com/brianc/node-postgres/) (affectionaly known as `pg`). I generate the `{ text: '...', values: [] }` objects that you typically pass to `client.query(...)`.\n\nIt gets tedious matching up `$1, $2` etc. and building the right kind of values array. My functions help you do this and get the place-holder numbers right, even for `UPDATE/SET/WHERE` and for `WHERE IN` clauses which require a flattened array of arguments.\n\nI have some tests written in Mocha. Of course I could use more!\n\n_No really_. __Overly simple__. \n\n# Like what?\n\n```\nvar SQL = require('bloom-sql'),\n    INSERT = SQL.INSERT,\n    SELECT = SQL.SELECT,\n    UPDATE = SQL.UPDATE,\n    DELETE = SQL.DELETE;\n```\n\nSelecting stuff:\n\n```\n> SELECT().FROM('foo').WHERE({ a: [1,2,3], b: 4 });\n{ text: 'SELECT * FROM foo WHERE a IN ($1, $2, $3) AND b = $4',\n  values: [ 1, 2, 3, 4 ] }\n```\n\nDeleting stuff:\n\n```\n> DELETE('foo').WHERE({ a: 1, b: 2 });\n{ text: 'DELETE FROM foo WHERE a = $1 AND b = $2',\n  values: [ 1, 2 ] }\n```\n\nInserting stuff:\n\n```\n> INSERT('foo').VALUES({ a: null, b: null, c: null });\n{ text: 'INSERT INTO foo(a, b, c) VALUES($1, $2, $3)',\n  values: [ null, null, null ] }\n```\n\nUpdating stuff:\n\n```\n> UPDATE('foo').SET({ a: 1, b: 2, c: 3 }).WHERE({ d: 4, e: 5 }).RETURNING('*');\n{ text: 'UPDATE foo SET a = $1, b = $2, c = $3 WHERE d = $4 AND e = $5 RETURNING *',\n  values: [ 1, 2, 3, 4, 5 ] }\n```\n\n__This code does not talk to the database.__ Connect to `pg` as normal as pass one of the resulting query objects to the db to run it:\n\n```\nvar pg = require('pg'),\n    SELECT = require('bloom-sql').SELECT;\n\nvar db = new pg.Client('YOUR_DB_URL');\ndb.connect();\n\nvar query = SELECT('*').FROM('users').WHERE({id:1}).LIMIT(1);\ndb.query(query, function(err,results){\n  // ensure !err\n  // check results.rowCount === 1 \n  // do stuff with results.rows[0]\n});\n```\n\n# TODO\n\n * complex conjunctions `(a = 1 AND b = 2) OR (c = 3 AND d = 4)`\n * comparisons in where clauses `(a > 1 AND b < 2)`\n * any hint of `JOIN`, sub-select, etc.\n * the other 90% of SQL?\n\n# Installation\n\n`npm install bloom-sql --save`\n\n(`--save` automatically updates your `package.json` file, tell your friends)\n\n\n# License\n\n(The MIT License)\n\nCopyright (c) 2011-2012 Bloom Studio, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","maintainers":[{"name":"randometc","email":"tom@tom-carden.co.uk"}],"time":{"modified":"2012-07-17T01:16:04.929Z","created":"2012-07-12T23:27:14.165Z","0.0.1":"2012-07-12T23:27:16.919Z","0.0.2":"2012-07-17T01:16:04.929Z"},"author":{"name":"Tom Carden"},"repository":{"type":"git","url":"git@github.com:bloomtime/bloom-sql-js.git"},"_attachments":{"bloom-sql-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jyHZfl3MKDaDgw0Nd+HzTg==","length":5139,"stub":true},"bloom-sql-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qYo3ME03XRFs3AIU0ec0Aw==","length":4655,"stub":true}}}},
{"id":"bloomfilter","key":"bloomfilter","value":{"rev":"19-42f44c76c5d5d07e4b5c031e2b30b691"},"doc":{"_id":"bloomfilter","_rev":"19-42f44c76c5d5d07e4b5c031e2b30b691","name":"bloomfilter","description":"Fast bloom filter in JavaScript.","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.4":{"name":"bloomfilter","version":"0.0.4","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"git://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","dependencies":{"vows":"0.6.0"},"_npmUser":{"name":"jasondavies","email":"jason@jasondavies.com"},"_id":"bloomfilter@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"cbf4921ae32d057dfb19480ed867f4548f6a1de7","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.4.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}],"directories":{}},"0.0.5":{"name":"bloomfilter","version":"0.0.5","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"git://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","devDependencies":{"vows":"0.6.0"},"scripts":{"test":"./node_modules/vows/bin/vows"},"_npmUser":{"name":"jasondavies","email":"jason@jasondavies.com"},"_id":"bloomfilter@0.0.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"4f28cd9c9647c9fbeb5a25450ab5fbb598cd05a9","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.5.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}]},"0.0.6":{"name":"bloomfilter","version":"0.0.6","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"git://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","devDependencies":{"vows":"0.6.0"},"scripts":{"test":"./node_modules/vows/bin/vows"},"_npmUser":{"name":"jasondavies","email":"jason@jasondavies.com"},"_id":"bloomfilter@0.0.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"76b53e33e82913380d747150dcb2035462607247","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.6.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}]},"0.0.7":{"name":"bloomfilter","version":"0.0.7","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"git://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","devDependencies":{"vows":"0.6.0"},"scripts":{"test":"./node_modules/vows/bin/vows"},"_npmUser":{"name":"jasondavies","email":"jason@jasondavies.com"},"_id":"bloomfilter@0.0.7","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"bb8e389649922600791378b852d09b2ed1928497","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.7.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}]},"0.0.8":{"name":"bloomfilter","version":"0.0.8","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"git://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","devDependencies":{"vows":"0.6.0"},"scripts":{"test":"./node_modules/vows/bin/vows"},"_npmUser":{"name":"jasondavies","email":"jason@jasondavies.com"},"_id":"bloomfilter@0.0.8","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"7786fce6f792eac6ce1569725b1e9b0bc5a6d255","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.8.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}]},"0.0.9":{"name":"bloomfilter","version":"0.0.9","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"git://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","devDependencies":{"vows":"0.6.0"},"scripts":{"test":"./node_modules/vows/bin/vows"},"_npmUser":{"name":"jasondavies","email":"jason@jasondavies.com"},"_id":"bloomfilter@0.0.9","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"e679429860425866549fb6cc9fdeda0707a323e3","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.9.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}]},"0.0.10":{"name":"bloomfilter","version":"0.0.10","description":"Fast bloom filter in JavaScript.","keywords":["bloom filter","probabilistic data structure"],"homepage":"https://github.com/jasondavies/bloomfilter.js","author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"http://github.com/jasondavies/bloomfilter.js.git"},"main":"bloomfilter.js","devDependencies":{"vows":"0.6.0"},"scripts":{"test":"./node_modules/vows/bin/vows"},"readme":"Bloom Filter\n============\n\nThis JavaScript bloom filter implementation uses the non-cryptographic\n[Fowler–Noll–Vo hash function][1] for speed.\n\nUsage\n-----\n\n    var bloom = new BloomFilter(\n      32 * 256, // number of bits to allocate.\n      16        // number of hash functions.\n    );\n\n    // Add some elements to the filter.\n    bloom.add(\"foo\");\n    bloom.add(\"bar\");\n\n    // Test if an item is in our filter.\n    // Returns true if an item is probably in the set,\n    // or false if an item is definitely not in the set.\n    bloom.test(\"foo\");\n    bloom.test(\"bar\");\n    bloom.test(\"blah\");\n\nImplementation\n--------------\n\nAlthough the bloom filter requires *k* hash functions, we can simulate this\nusing only *two* hash functions.  In fact, we cheat and get the second hash\nfunction almost for free by iterating once more on the first hash using the FNV\nhash algorithm.\n\nThanks to Will Fitzgerald for his [help and inspiration][2] with the hashing\noptimisation.\n\n[1]: http://isthe.com/chongo/tech/comp/fnv/\n[2]: http://willwhim.wordpress.com/2011/09/03/producing-n-hash-functions-by-hashing-only-once/\n","_id":"bloomfilter@0.0.10","dist":{"shasum":"2e4cdf81fadaddfd287e5e3371256e32c2027be0","tarball":"http://registry.npmjs.org/bloomfilter/-/bloomfilter-0.0.10.tgz"},"maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}]}},"readme":"Bloom Filter\n============\n\nThis JavaScript bloom filter implementation uses the non-cryptographic\n[Fowler–Noll–Vo hash function][1] for speed.\n\nAlthough the bloom filter requires *n* hash functions, we can simulate this\nusing only *two* hash functions.  In fact, we cheat and get the second hash\nfunction almost for free by iterating once more on the first hash using the FNV\nhash algorithm.\n\nThanks to Will Fitzgerald for his [help and inspiration][2] with the hashing\noptimisation.\n\n[1]: http://isthe.com/chongo/tech/comp/fnv/\n[2]: http://willwhim.wordpress.com/2011/09/03/producing-n-hash-functions-by-hashing-only-once/\n","maintainers":[{"name":"jasondavies","email":"jason@jasondavies.com"}],"time":{"modified":"2012-07-09T14:02:25.165Z","created":"2011-12-07T11:54:53.297Z","0.0.4":"2011-12-07T11:54:54.895Z","0.0.5":"2011-12-07T12:07:38.952Z","0.0.6":"2011-12-07T21:57:13.197Z","0.0.7":"2011-12-07T23:11:08.032Z","0.0.8":"2011-12-08T18:44:29.724Z","0.0.9":"2011-12-08T21:31:24.313Z","0.0.10":"2012-07-09T14:02:25.165Z"},"author":{"name":"Jason Davies","url":"http://www.jasondavies.com/"},"repository":{"type":"git","url":"http://github.com/jasondavies/bloomfilter.js.git"},"_attachments":{"bloomfilter-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-05eTSpN5rRRbN22VZoIwRw==","length":2698,"stub":true},"bloomfilter-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-OkxLGvgAfXYrHS9Fe5ajLw==","length":2721,"stub":true},"bloomfilter-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-WCLcOJfUGkNQutMhTL1gpA==","length":2724,"stub":true},"bloomfilter-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-LpOGSt7WL/wMB5pJgwg2LQ==","length":2665,"stub":true},"bloomfilter-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-3anKS8eQREKEaWDU1bTIAQ==","length":2450,"stub":true},"bloomfilter-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-37fKlFKubUMdwtwfcUDDpA==","length":2453,"stub":true},"bloomfilter-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vU+AnQjUESC2rhy0ZCC82w==","length":2419,"stub":true}}}},
{"id":"bloomfilters","key":"bloomfilters","value":{"rev":"21-a374fd7fd91df4b16384f7c25fcf5a15"},"doc":{"_id":"bloomfilters","_rev":"21-a374fd7fd91df4b16384f7c25fcf5a15","name":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","dist-tags":{"latest":"0.0.11"},"versions":{"0.0.2":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.2","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"aa2ad24415bec937e3de96296c87d3246daacda2","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.2.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.3":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.3","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"59a50cc434f0396267f21cc2d93a56e10c570cc1","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.3.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.4":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.4","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"52f827a5085ea3c351113131c22881b4680571fc","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.4.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.5":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.5","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"29019e36fe7cbab406c3564362a01a67e1a06f38","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.5.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.6":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.6","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d7c509aa7b8bc60878e830d4bad77d0bda0d0856","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.6.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.7":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.7","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"960ca99344d50e5515714bfda406b3cad545c798","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.7.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.8":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.8","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d5e9386317e2d7e9867f2bc5a5757cd5f72812e3","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.8.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.9":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.9","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"276adc4a82517f9acb1f72e40d7d0382d9b2ceeb","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.9.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.10":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./js/BloomFilter.js","version":"0.0.10","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"3e01d5579010924f250a0bc45fea1b4ff624e7e8","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.10.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]},"0.0.11":{"name":"bloomfilters","id":"bloomfilters","description":"A set of bloom filter implementations for coffee/javascipt.","keywords":["hash","bloom","bitmap"],"homepage":"https://github.com/dsummersl/bloomfilters","bugs":{"email":"dsummersl@yahoo.com","url":"https://github.com/dsummersl/bloomfilters"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"main":"./index.js","version":"0.0.11","dependencies":{"jasmine-node":"~1.0.12","coffee-script":"~1.1.3","stitch":"~0.3.2","connect":"~1.8.2","crypto":"~0.0.3"},"_npmUser":{"name":"dsummersl","email":"dsummersl@yahoo.com"},"_id":"bloomfilters@0.0.11","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"6620701c8c66690c96fd313eb2228be1c3daff89","tarball":"http://registry.npmjs.org/bloomfilters/-/bloomfilters-0.0.11.tgz"},"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}]}},"readme":null,"maintainers":[{"name":"dsummersl","email":"dsummersl@yahoo.com"}],"time":{"modified":"2012-01-10T23:31:24.143Z","created":"2011-12-05T18:35:00.656Z","0.0.2":"2011-12-05T18:35:01.102Z","0.0.3":"2011-12-05T19:53:11.360Z","0.0.4":"2011-12-06T02:55:27.267Z","0.0.5":"2011-12-07T03:18:25.373Z","0.0.6":"2012-01-08T14:46:57.997Z","0.0.7":"2012-01-08T23:42:28.971Z","0.0.8":"2012-01-08T23:49:17.499Z","0.0.9":"2012-01-09T03:14:14.126Z","0.0.10":"2012-01-09T03:18:06.150Z","0.0.11":"2012-01-10T23:31:24.143Z"},"author":{"name":"Dane Summers","email":"dsummersl@yahoo.com"},"repository":{"type":"git","url":"git://github.com/dsummersl/bloomfilters.git"},"_attachments":{"bloomfilters-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-MOP99KRPbWMNHyTuyra0GA==","length":30720,"stub":true},"bloomfilters-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-s8bdPHYME1UI4eOGKz1vcw==","length":30720,"stub":true},"bloomfilters-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-ourI+ZxxKewmMzsjT82Scg==","length":30720,"stub":true},"bloomfilters-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-gecsmy7UYQb87XQ+0MmmMA==","length":30720,"stub":true},"bloomfilters-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-C/2eXQMcsUe8zBTAwhjqrw==","length":30720,"stub":true},"bloomfilters-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IoejEKpt57M5wZxcG/D4Nw==","length":30720,"stub":true},"bloomfilters-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-MS6AcwnXo9arQmGd/tHcnw==","length":20480,"stub":true},"bloomfilters-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-uSIAsUx8Jrh5K76tRzQW7A==","length":20480,"stub":true},"bloomfilters-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OsL5GKZCXqCgWs3OIZuUEA==","length":20480,"stub":true},"bloomfilters-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PFCo7mHM/jzsGzvc9ETgxQ==","length":20480,"stub":true}}}},
{"id":"blossom","key":"blossom","value":{"rev":"21-3e41734f8288ee45c12486146a6e1f69"},"doc":{"_id":"blossom","_rev":"21-3e41734f8288ee45c12486146a6e1f69","name":"blossom","description":"Modern, Cross-Platform Application Framework","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{},"main":"./node/buildfile","version":"0.1.0","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"040e3a0d0859e863af44c781d883cc728419b21c","tarball":"http://registry.npmjs.org/blossom/-/blossom-0.1.0.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"0.5.0":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"0.5.0","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@0.5.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"bc52779e87f24c571f4fa854068961902359edaf","tarball":"http://registry.npmjs.org/blossom/-/blossom-0.5.0.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"0.5.1":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"0.5.1","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@0.5.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ff014947a056535d679ef0b3eed1f153b3d4288c","tarball":"http://registry.npmjs.org/blossom/-/blossom-0.5.1.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"0.5.2":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"0.5.2","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@0.5.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c212351dfb929a8a6f2da902a29a30cd647aa5dd","tarball":"http://registry.npmjs.org/blossom/-/blossom-0.5.2.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"1.0.0-beta.1":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"1.0.0-beta.1","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@1.0.0-beta.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"585679241e9cdec6c1e0d6f81acf5d0d4801dc97","tarball":"http://registry.npmjs.org/blossom/-/blossom-1.0.0-beta.1.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"1.0.0-beta.1.1":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0","coffee-script":"1.2.x"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"1.0.0-beta.1.1","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@1.0.0-beta.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"8ccf70ec9fb1cda9b9160c08ecf356876751f165","tarball":"http://registry.npmjs.org/blossom/-/blossom-1.0.0-beta.1.1.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"1.0.0-beta.1.2":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0","coffee-script":"1.2.x"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"1.0.0-beta.1.2","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@1.0.0-beta.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"1992515e5eada8ba10b640c9b2a902ff9a6711ee","tarball":"http://registry.npmjs.org/blossom/-/blossom-1.0.0-beta.1.2.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"1.0.0-beta-49-g29469ce":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0","coffee-script":"1.2.x"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"1.0.0-beta-49-g29469ce","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@1.0.0-beta-49-g29469ce","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0f3bb8582aa1d7fd58953d23ffe86a8a898e29f9","tarball":"http://registry.npmjs.org/blossom/-/blossom-1.0.0-beta-49-g29469ce.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"1.0.0-beta-71-g846c6de":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0","coffee-script":"1.2.x","uglify-js":"1.2.x"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"1.0.0-beta-71-g846c6de","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@1.0.0-beta-71-g846c6de","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"7b58e4e2033edcc0a1fc49fdc76ba932ba95ebf8","tarball":"http://registry.npmjs.org/blossom/-/blossom-1.0.0-beta-71-g846c6de.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]},"1.0.0":{"name":"blossom","description":"Modern, Cross-Platform Application Framework","repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"url":"http://fohr.com/","keywords":["blossom","sproutcore"],"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"contributors":[],"dependencies":{"xmlhttprequest":"1.3.0","coffee-script":"1.2.x","uglify-js":"1.2.x"},"devDependencies":{"vows":"0.6.x"},"main":"./node/buildfile","version":"1.0.0","scripts":{},"engines":{"node":"0.6.x"},"_npmUser":{"name":"erichocean","email":"erich.ocean@me.com"},"_id":"blossom@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"961fbc05505d59dd6aeb85a3b4aa125116e75cd9","tarball":"http://registry.npmjs.org/blossom/-/blossom-1.0.0.tgz"},"maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}]}},"readme":"Blossom - Modern, Cross-Platform Application Framework\n======================================================\n\n**Note: This is a developer preview. Not all functionality is present. The \ncode is being released now to get feedback from the SproutCore community.**\n\n_The beta release of Blossom with all features enabled is scheduled for March 1, 2012._\n\nBlossom extends the reach of traditional SproutCore applications beyond the\nweb browser by re-architecting the view layer to be HTML and CSS-independent.\n\nBlossom also extends the kinds of apps that can be written in JavaScript by \nimplementing an easy-to-use, high-performance animation subsystem that \nleverages hardware acceleration on the GPU whenever possible. The API is \nroughly based on Apple's Core Animation framework, and provides similar \ncapabilities -- even in modern web browsers.\n\nSince SproutCore's HTML and CSS dependencies were removed, Blossom can \nsupport native runtimes on the desktop (Windows, Mac OS X, and Linux) and on \nmobile devices (iOS, Android, and Windows Phone) and tablets (iOS, Android) \n-- and that's in addition to modern web browsers, all with the same API.\n\nBlossom's native runtimes are not \"WebView\" wrappers like PhoneGap or \nCappuccino's poorly named \"NativeHost\". A \"WebView\" wrapper simulates a web \nbrowser inside of a native, double-clickable app, so the performance is just \nas poor on mobile devices and tablets as a web app running in a mobile \nbrowser is today. (In many cases, it's substantially worse.)\n\nBlossom is different: instead of simulating a web browser, Blossom's native\nruntime has high-performance, platform-native implementations of the various \nBlossom and SproutCore classes, such as SC.Request (for networking), SC.Layer \n(for animation), as well as the various JavaScript runtime objects such as \nCanvasRenderingContext2D, Float32Array and ArrayBuffer that are exposed to\nBlossom developers. This is similar to Node.js, another JavaScript \nruntime based around Google v8 that also does not support HTML or CSS.\n\nOne of Blossom's key innovations is its drawing model, which is modeled after \nMac OS X's \"Quartz 2D\" API. This PDF-compatible drawing model is used for all \nof Blossom's native views. Most importantly, drawing is GPU-accelerated even \non mobile devices, and views draw identically on every host, including \nmodern web browsers. This feature alone eliminates one of SproutCore's \nlong-standing problem areas: quickly creating custom views that render fast.\n\nBlossom is a *modern* application framework especially well-suited to apps \nrunning full screen on tablets and mobile devices, with rich animation and \neffects. In addition, modern operating systems including Mac OS X 10.7 and \nWindows 8 have moved strongly towards full-screen, single-window, immersive \napplications with heavy use of animation. This app model is also compatible \nwith Blossom's capabilities when running in a modern web browser, making a \nBlossom app feel at home in all of these environments.\n\nBlossom's developer tools run on Node.js, and Blossom is licensed under the \nGPLv3 for non-commercial use; commercial licenses will be available soon from \nFohr under terms similar to what Sencha offers for Ext.js.\n\nGetting Involved\n----------------\n\n* Why Blossom exists: http://bit.ly/future-of-sproutcore\n* IRC Channel: #blossom on Freenode\n\nWatch this repository on GitHub to follow development, or fork it and submit \na pull request to help contribute to it's evolution.\n\nBlossom was conceived and written by Erich Ocean at Fohr <eocean@fohr.com>,\nand is based on the SproutCore version 1.4.5 release.\n","maintainers":[{"name":"erichocean","email":"erich.ocean@me.com"}],"time":{"modified":"2012-05-28T20:18:17.793Z","created":"2012-01-23T21:43:24.532Z","0.1.0":"2012-01-23T21:43:25.804Z","0.5.0":"2012-02-09T04:03:48.660Z","0.5.1":"2012-02-09T12:43:40.034Z","0.5.2":"2012-02-10T03:14:48.443Z","1.0.0-beta.1":"2012-03-02T04:05:37.644Z","1.0.0-beta.1.1":"2012-03-03T16:17:24.234Z","1.0.0-beta.1.2":"2012-03-05T15:49:28.709Z","1.0.0-beta-49-g29469ce":"2012-03-05T16:07:52.914Z","1.0.0-beta-71-g846c6de":"2012-03-08T17:51:50.777Z","1.0.0":"2012-05-28T20:18:17.793Z"},"author":{"name":"Erich Ocean","email":"eocean@fohr.com"},"repository":{"type":"git","url":"git://github.com/fohr/blossom.git"},"_attachments":{"blossom-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-/GeBwlq3NcEJnnot1pKYAw==","length":5364207,"stub":true},"blossom-1.0.0-beta-71-g846c6de.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-jRaz5ox1ZD0bawGq+QvJag==","length":5877015,"stub":true},"blossom-1.0.0-beta-49-g29469ce.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-MzPpoN7hYnn3tiJa0WIIMw==","length":6277749,"stub":true},"blossom-1.0.0-beta.1.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-tU0LhXyEROhTom3e0tZwPw==","length":6277852,"stub":true},"blossom-1.0.0-beta.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-7pJHQFCs8tns52L23uP13g==","length":6270377,"stub":true},"blossom-1.0.0-beta.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ivLMaFlZvzZzJbNnEepP3A==","length":6270806,"stub":true},"blossom-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hOEBL7f8S1cArhD64+Y/9A==","length":6159455,"stub":true},"blossom-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/POFkIegE89cg3oWVil/Ug==","length":6159588,"stub":true},"blossom-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Arpt+ZbplP99AR2rczT8aA==","length":6159638,"stub":true},"blossom-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bdvBSfTorzxtI+bAB6rPOg==","length":5823295,"stub":true}}}},
{"id":"blow","key":"blow","value":{"rev":"17-b63d25c9a55f1bfdc8445b93670fa692"},"doc":{"_id":"blow","_rev":"17-b63d25c9a55f1bfdc8445b93670fa692","name":"blow","description":"Simple browser wrapper on test framework: mocha","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.1":{"name":"blow","description":"Simple browser boilerplate for the test framework: mocha","version":"0.1.1","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"devDependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.3.x","tako":"0.3.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"_npmUser":{"name":"andreasmadsen","email":"amwebdk@gmail.com"},"_id":"blow@0.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1-pre","_defaultsLoaded":true,"dist":{"shasum":"fbba7424298d57f6b7ead032c071f6ef22db2195","tarball":"http://registry.npmjs.org/blow/-/blow-0.1.1.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.1.2":{"name":"blow","description":"Simple browser boilerplate for the test framework: mocha","version":"0.1.2","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.3.x","tako":"0.3.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"_npmUser":{"name":"andreasmadsen","email":"amwebdk@gmail.com"},"_id":"blow@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1-pre","_defaultsLoaded":true,"dist":{"shasum":"32a4190f4c3218548852ee66467597f952e7c6e9","tarball":"http://registry.npmjs.org/blow/-/blow-0.1.2.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.1.3":{"name":"blow","description":"Simple browser boilerplate for the test framework: mocha","version":"0.1.3","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"bin":{"blow":"./bin/blow"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.3.x","tako":"0.3.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"_npmUser":{"name":"andreasmadsen","email":"amwebdk@gmail.com"},"_id":"blow@0.1.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1-pre","_defaultsLoaded":true,"dist":{"shasum":"10c89c5b1c45cb25bed400e0ea788ebbf9c812c6","tarball":"http://registry.npmjs.org/blow/-/blow-0.1.3.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.1.4":{"name":"blow","description":"Simple browser boilerplate for the test framework: mocha","version":"0.1.4","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"bin":{"blow":"./bin/blow"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.3.x","tako":"0.3.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"_npmUser":{"name":"andreasmadsen","email":"amwebdk@gmail.com"},"_id":"blow@0.1.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1-pre","_defaultsLoaded":true,"dist":{"shasum":"6ba19a174f0e96afdcf977e267372e5cc7e19a72","tarball":"http://registry.npmjs.org/blow/-/blow-0.1.4.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.1.5":{"name":"blow","description":"Simple browser boilerplate for the test framework: mocha","version":"0.1.5","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"bin":{"blow":"./bin/blow"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.4.x","tako":"0.3.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"_npmUser":{"name":"andreasmadsen","email":"amwebdk@gmail.com"},"_id":"blow@0.1.5","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.20-pre","_defaultsLoaded":true,"dist":{"shasum":"94d1771a1cbe493f85395ed29a034a2d8e640325","tarball":"http://registry.npmjs.org/blow/-/blow-0.1.5.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.2.0":{"name":"blow","description":"Simple browser wrapper on test framework: mocha","version":"0.2.0","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"bin":{"blow":"./bin/blow"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.4.x","tako":"0.3.x","filed":"0.0.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"_npmUser":{"name":"andreasmadsen","email":"amwebdk@gmail.com"},"_id":"blow@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.20-pre","_defaultsLoaded":true,"dist":{"shasum":"4125f0a063d9e66f101558ea400e703832579c99","tarball":"http://registry.npmjs.org/blow/-/blow-0.2.0.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.3.0":{"name":"blow","description":"Simple browser wrapper on test framework: mocha","version":"0.3.0","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"bin":{"blow":"./bin/blow"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.4.x","tako":"0.3.x","filed":"0.0.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"readme":"#blow\n\n> Very simple binding between mocha and your browser.\n\n##Install\n\n```shell\nnpm install -g blow\n```\n\n##Use\n\nThe blow server is started with `blow`.\n\nYou can the input in your testcases with `blow test/*` or whatever you directory\nname may be.\n\nThere are a few options there too.\n\n#### port\n\nBy default the port is random, however you can set it with:\n\n* `--port=number`\n* `-p=number`\n\n#### address\n\nBy default the address is `0.0.0.0` but you can set it with\n\n* `--address=ip/name`\n* `-a=ip/name`\n\n#### style\n\nBy default the mocha teststyle is `bdd`, but you can set it with\n\n* `--style=mochaStyleName`\n* `-s=mochaStyleName`\n\n#### index\n\nBy default the template file is the following:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title></title>\n</head>\n<body>\n  <div id=\"mocha\"></div>\n</body>\n</html>\n```\n\nHowever you may wich to include the some script files, to do that simply\nuse the following pattern:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <script src=\"../somefile.js\"></script>\n</head>\n<body>\n</body>\n</html>\n```\n\nBlow will then transform the template file, to it points the correct file, relative\nto your template file.\n\nTo set the template file, simply use:\n\n* `--index=test/index.html`\n* `-i=test/index.html`\n\n##License\n\n**The software is license under \"MIT\"**\n\n> Copyright (c) 2012 Andreas Madsen\n>\n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> of this software and associated documentation files (the \"Software\"), to deal\n> in the Software without restriction, including without limitation the rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n> The above copyright notice and this permission notice shall be included in\n> all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n","_id":"blow@0.3.0","dist":{"shasum":"9b0cf064cbf435479bb9b0531b1b9e9c2a88fe50","tarball":"http://registry.npmjs.org/blow/-/blow-0.3.0.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]},"0.4.0":{"name":"blow","description":"Simple browser wrapper on test framework: mocha","version":"0.4.0","author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"bin":{"blow":"./bin/blow"},"main":"./blow.js","repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"keywords":["test","testsuite","test framework","browser"],"dependencies":{"mocha":"1.3.x","chai":"1.1.x","domstream":"0.4.x","tako":"0.3.x","filed":"0.0.x"},"license":"MIT","engines":{"node":"0.6 || 0.8","npm":"1"},"readme":"#blow\n\n> Very simple binding between mocha and your browser.\n\n##Install\n\n```shell\nnpm install -g blow\n```\n\n##Use\n\nThe blow server is started with `blow`.\n\nYou can the input in your testcases with `blow test/*` or whatever you directory\nname may be.\n\nThere are a few options there too.\n\n#### port\n\nBy default the port is random, however you can set it with:\n\n* `--port=number`\n* `-p=number`\n\n#### address\n\nBy default the address is `0.0.0.0` but you can set it with\n\n* `--address=ip/name`\n* `-a=ip/name`\n\n#### style\n\nBy default the mocha teststyle is `bdd`, but you can set it with\n\n* `--style=mochaStyleName`\n* `-s=mochaStyleName`\n\n#### index\n\nBy default the template file is the following:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title></title>\n</head>\n<body>\n  <div id=\"mocha\"></div>\n</body>\n</html>\n```\n\nHowever you may wich to include the some script files, to do that simply\nuse the following pattern:\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <script src=\"../somefile.js\"></script>\n</head>\n<body>\n</body>\n</html>\n```\n\nBlow will then transform the template file, to it points the correct file, relative\nto your template file.\n\nTo set the template file, simply use:\n\n* `--index=test/index.html`\n* `-i=test/index.html`\n\n##License\n\n**The software is license under \"MIT\"**\n\n> Copyright (c) 2012 Andreas Madsen\n>\n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> of this software and associated documentation files (the \"Software\"), to deal\n> in the Software without restriction, including without limitation the rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n> The above copyright notice and this permission notice shall be included in\n> all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n","_id":"blow@0.4.0","dist":{"shasum":"a1ec1246a8c567b37ff857532c6f107497ad8a38","tarball":"http://registry.npmjs.org/blow/-/blow-0.4.0.tgz"},"maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}]}},"readme":"#blow\n\n> binding between mocha and your browser.\n\n##License\n\n**The software is license under \"MIT\"**\n\n> Copyright (c) 2012 Andreas Madsen\n>\n> Permission is hereby granted, free of charge, to any person obtaining a copy\n> of this software and associated documentation files (the \"Software\"), to deal\n> in the Software without restriction, including without limitation the rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n> The above copyright notice and this permission notice shall be included in\n> all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n","maintainers":[{"name":"andreasmadsen","email":"amwebdk@gmail.com"}],"time":{"modified":"2012-07-18T19:16:16.253Z","created":"2012-07-10T20:48:30.750Z","0.1.1":"2012-07-10T20:48:32.562Z","0.1.2":"2012-07-11T11:46:56.635Z","0.1.3":"2012-07-11T11:50:05.478Z","0.1.4":"2012-07-11T12:00:54.484Z","0.1.5":"2012-07-12T09:33:07.826Z","0.2.0":"2012-07-12T10:09:28.141Z","0.3.0":"2012-07-15T18:48:38.403Z","0.4.0":"2012-07-18T19:16:16.253Z"},"author":{"name":"Andreas Madsen","email":"amwebdk@gmail.com"},"repository":{"type":"git","url":"git://github.com/AndreasMadsen/blow.git"},"_attachments":{"blow-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-SVq4UtabD7pXvy39fByJhw==","length":3963,"stub":true},"blow-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-CY2ThRKvgRNG88sFMDAMkw==","length":3833,"stub":true},"blow-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+3Z9c5AxNWKL++PSKn5xEw==","length":3286,"stub":true},"blow-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-/HPwXoKIg58VdLE/eew7Rg==","length":3078,"stub":true},"blow-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-jXqyjwGWHUM0Cy9ZVU5AJQ==","length":2802,"stub":true},"blow-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mUcSwjDuRcwK5m4+k/VEsQ==","length":2774,"stub":true},"blow-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-07odKoiMqfh/cVORMl53RA==","length":2760,"stub":true},"blow-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-17Vp7mgq7COiUwv9DYA3Vg==","length":2760,"stub":true}}}},
{"id":"blpapi","key":"blpapi","value":{"rev":"3-57896d6877e5ae58082673d1fab71b38"},"doc":{"_id":"blpapi","_rev":"3-57896d6877e5ae58082673d1fab71b38","name":"blpapi","description":"Bloomberg Open API (BLPAPI) binding for node.js","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"blpapi","version":"0.1.0","main":"./blpapi.js","description":"Bloomberg Open API (BLPAPI) binding for node.js","os":["linux","win32"],"cpu":["x64","ia32"],"scripts":{"install":"node-gyp configure build"},"repository":{"type":"git","url":"git://github.com/bloomberg/node-blpapi.git"},"bugs":{"email":"open-tech@bloomberg.net","url":"https://github.com/bloomberg/node-blpapi/issues"},"maintainers":[{"name":"apaprocki","email":"andrew@ishiboo.com"}],"keywords":["finance","stocks","stock","quotes","tick","realtime","market"],"license":"MIT","engines":{"node":">=0.6"},"_npmUser":{"name":"apaprocki","email":"andrew@ishiboo.com"},"_id":"blpapi@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7c2883f4c2feb83a6a53eaea5e8eefbdbca4e9c7","tarball":"http://registry.npmjs.org/blpapi/-/blpapi-0.1.0.tgz"},"readme":""}},"readme":"","maintainers":[{"name":"apaprocki","email":"andrew@ishiboo.com"}],"time":{"modified":"2012-07-12T04:42:58.859Z","created":"2012-07-12T04:42:58.441Z","0.1.0":"2012-07-12T04:42:58.859Z"},"repository":{"type":"git","url":"git://github.com/bloomberg/node-blpapi.git"},"_attachments":{"blpapi-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fW7rUXQ0mkO3eLiDohuoSw==","length":5285596,"stub":true}}}},
{"id":"blue","key":"blue","value":{"rev":"6-e84221f7286dffbfda6f8abc6306064c"},"doc":{"_id":"blue","_rev":"6-e84221f7286dffbfda6f8abc6306064c","name":"blue","description":"JSP-like and streamed template engine","dist-tags":{"latest":"0.1.0beta"},"versions":{"0.1.0beta":{"name":"blue","version":"0.1.0beta","description":"JSP-like and streamed template engine","keywords":["template","jsp","stream","streamed"],"url":"http://github.com/Floby/node-blue","author":{"name":"Florent Jaby","email":"florent.jaby@gmail.com","url":"http://github.com/Floby"},"main":"./lib/blue","repository":{"type":"git","url":"http://github.com/Floby/node-blue.git"},"engines":{"node":">= 0.2.2"},"_id":"blue@0.1.0beta","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/blue/-/blue-0.1.0beta.tgz"},"mtime":"2010-11-09T23:16:49Z","ctime":"2010-11-09T23:16:49Z"}},"maintainers":[{"name":"floby","email":"florent.jaby@gmail.com"}],"mtime":"2010-11-09T23:16:49Z","ctime":"2010-11-09T23:16:49Z","author":{"name":"Florent Jaby","email":"florent.jaby@gmail.com","url":"http://github.com/Floby"},"repository":{"type":"git","url":"http://github.com/Floby/node-blue.git"},"_attachments":{"blue-0.1.0beta.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/+yk4TeJOcUc3a3pZoTdgg==","length":6999,"stub":true}}}},
{"id":"blueimp-bootstrap-image-gallery","key":"blueimp-bootstrap-image-gallery","value":{"rev":"35-76e839adcbb33ef9ac0e4163ea301ec2"},"doc":{"_id":"blueimp-bootstrap-image-gallery","_rev":"35-76e839adcbb33ef9ac0e4163ea301ec2","name":"blueimp-bootstrap-image-gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","dist-tags":{"latest":"2.8.0"},"versions":{"1.0.0":{"name":"blueimp-bootstrap-image-gallery","version":"1.0.0","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","bootstrap-modal":">=1.4"},"files":["bootstrap-image-gallery.js","bootstrap-image-gallery.css","loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@1.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"25db4a487ae9b0cfae6fdaa29da14f1901459a2f","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-1.0.0.tgz"},"scripts":{},"directories":{}},"1.0.1":{"name":"blueimp-bootstrap-image-gallery","version":"1.0.1","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","bootstrap-modal":">=1.4"},"files":["bootstrap-image-gallery.js","bootstrap-image-gallery.css","loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@1.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cc8820774f1a9deee58c42e99963ba1936433add","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-1.0.1.tgz"},"scripts":{},"directories":{}},"1.0.3":{"name":"blueimp-bootstrap-image-gallery","version":"1.0.3","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","bootstrap-modal":">=1.4"},"files":["bootstrap-image-gallery.js","bootstrap-image-gallery.css","loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@1.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"abd18185f314f87f95b332d197b645ddfb6d0505","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-1.0.3.tgz"},"scripts":{},"directories":{}},"2.0.0":{"name":"blueimp-bootstrap-image-gallery","version":"2.0.0","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.7","blueimp-load-image":">=1.1.4","bootstrap-modal":">=2.0"},"files":["bootstrap-image-gallery.js","bootstrap-image-gallery.css","loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@2.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"475b1dd1f1033f690da37bc51c429a6d2ba5ca22","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-2.0.0.tgz"},"scripts":{},"directories":{}},"2.1.0":{"name":"blueimp-bootstrap-image-gallery","version":"2.1.0","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.7","blueimp-load-image":">=1.1.4","bootstrap-modal":">=2.0"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@2.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4819292701539e639457825a731d1b7b8b713e61","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-2.1.0.tgz"},"scripts":{},"directories":{}},"2.2.0":{"name":"blueimp-bootstrap-image-gallery","version":"2.2.0","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.7","blueimp-load-image":">=1.1.4","bootstrap":">=2.0"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@2.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4c8ac2d80a5dbaacc3fd71e155090ace1f345eb1","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-2.2.0.tgz"},"scripts":{},"directories":{}},"2.8.0":{"name":"blueimp-bootstrap-image-gallery","version":"2.8.0","title":"Bootstrap Image Gallery","description":"Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's Bootstrap toolkit, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","modal","dialog","bootstrap","mouse","keyboard","navigation","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/Bootstrap-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.7","blueimp-load-image":">=1.1.4","bootstrap":">=2.0"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-bootstrap-image-gallery@2.8.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"578883e84f6ebe1917dc1383ac80fbfe395673e3","tarball":"http://registry.npmjs.org/blueimp-bootstrap-image-gallery/-/blueimp-bootstrap-image-gallery-2.8.0.tgz"},"readme":"# Bootstrap Image Gallery\n\n## Demo\n[Bootstrap Image Gallery Demo](http://blueimp.github.com/Bootstrap-Image-Gallery/)\n\n## Description\nBootstrap Image Gallery is an extension to the [Modal](http://twitter.github.com/bootstrap/javascript.html#modal) dialog of Twitter's [Bootstrap](http://twitter.github.com/bootstrap/) toolkit, to ease navigation between a set of gallery images.  \nIt features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.\n\n## Usage\n\n### Preparation\nAdd the following HTML snippet to the head section of your webpage:\n\n```html\n<link rel=\"stylesheet\" href=\"http://blueimp.github.com/cdn/css/bootstrap.min.css\">\n<!--[if lt IE 7]><link rel=\"stylesheet\" href=\"http://blueimp.github.com/cdn/css/bootstrap-ie6.min.css\"><![endif]-->\n<link rel=\"stylesheet\" href=\"css/bootstrap-image-gallery.min.css\">\n```\n\nAdd the following HTML snippet to the body of your webpage:\n\n```html\n<!-- modal-gallery is the modal dialog used for the image gallery -->\n<div id=\"modal-gallery\" class=\"modal modal-gallery hide fade\">\n    <div class=\"modal-header\">\n        <a class=\"close\" data-dismiss=\"modal\">&times;</a>\n        <h3 class=\"modal-title\"></h3>\n    </div>\n    <div class=\"modal-body\"><div class=\"modal-image\"></div></div>\n    <div class=\"modal-footer\">\n        <a class=\"btn btn-primary modal-next\">Next <i class=\"icon-arrow-right icon-white\"></i></a>\n        <a class=\"btn btn-info modal-prev\"><i class=\"icon-arrow-left icon-white\"></i> Previous</a>\n        <a class=\"btn btn-success modal-play modal-slideshow\" data-slideshow=\"5000\"><i class=\"icon-play icon-white\"></i> Slideshow</a>\n        <a class=\"btn modal-download\" target=\"_blank\"><i class=\"icon-download\"></i> Download</a>\n    </div>\n</div>\n```\n\nInclude the following scripts:\n\n```html\n<script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js\"></script>\n<script src=\"http://blueimp.github.com/cdn/js/bootstrap.min.js\"></script>\n<script src=\"http://blueimp.github.com/JavaScript-Load-Image/load-image.min.js\"></script>\n<script src=\"js/bootstrap-image-gallery.min.js\"></script>\n```\n\n### Initialization\nInitialize the Image Gallery widget by adding the following **data-attributes** to a container element containing a set of links to image files with the attribute **rel=\"gallery\"**:\n\n```html\n<div id=\"gallery\" data-toggle=\"modal-gallery\" data-target=\"#modal-gallery\">\n    <a href=\"banana.jpg\" title=\"Banana\" rel=\"gallery\">Banana</a>\n    <a href=\"apple.jpg\" title=\"Apple\" rel=\"gallery\">Apple</a>\n    <a href=\"orange.jpg\" title=\"Orange\" rel=\"gallery\">Orange</a>\n</div>\n```\n\nNo additional JavaScript snippets are required. Note that you can also add links to the container element at a later stage.\n\nIt is also possible to use different elements than links for the gallery functionality, by storing the url to the images as **data-href** attribute and setting **data-selector** on the gallery container:\n\n```html\n<div id=\"gallery\" data-toggle=\"modal-gallery\" data-target=\"#modal-gallery\" data-selector=\"div.gallery-item\">\n    <div class=\"gallery-item\" data-href=\"banana.jpg\" title=\"Banana\">Banana</div>\n    <div class=\"gallery-item\" data-href=\"apple.jpg\" title=\"Apple\">Apple</div>\n    <div class=\"gallery-item\" data-href=\"orange.jpg\" title=\"Orange\">Orange</div>\n</div>\n```\n\n## API\n\n### Options\nThe Image Gallery follows the guideline of the Bootstrap JavaScript collection. Options can be passed along as **data-attributes**, either set on the gallery container or on the modal dialog. The following example sets the slideshow timer to 5 seconds:\n\n```html\n<div id=\"gallery\" data-toggle=\"modal-gallery\" data-target=\"#modal-gallery\"\n    data-slideshow=\"5000\">\n    ...\n</div>\n```\n\nMore Options are documented at the start of the Image Gallery source file.\n\n### Events\nIn addition to the modal events provided by [Bootstrap Modal](http://twitter.github.com/bootstrap/javascript.html#modals), the Image Gallery provides four additional events:\n\n* **beforeLoad**:  \nTriggered when the next (or previous) image in the gallery is about to be loaded.\n* **load**:  \nTriggered when the next (or previous) image in the gallery has been loaded.\n* **display**:  \nTriggered when the next (or previous) image in the gallery is about to be displayed.\n* **displayed**:  \nTriggered when the next (or previous) image in the gallery has been displayed.\n\nInside of the event callbacks, it is possible to access the list of (filtered) element nodes, the current index and (except for the *beforeLoad* event) also the loaded image:\n\n```js\n$('#modal-gallery').on('load', function () {\n    var modalData = $(this).data('modal');\n    // modalData.$links is the list of (filtered) element nodes as jQuery object\n    // modalData.img is the img (or canvas) element for the loaded image\n    // modalData.options.index is the index of the current link\n});\n```\n\n### Fullscreen mode\nFullscreen mode is enabled by adding the CSS class \"modal-fullscreen\" to the modal element:\n\n```js\n$('#modal-gallery').addClass('modal-fullscreen');\n```\n\nTo automatically stretch images smaller then the window size, also add the class \"modal-fullscreen-stretch\":\n\n```js\n$('#modal-gallery').addClass('modal-fullscreen modal-fullscreen-stretch');\n```\n\nPlease refer to the demo source code on how to enable real fullscreen mode on supported browsers.\n\n### Deinitialize the click event listener\nTo deinitialize the Modal Gallery event listener, the following code snippet can be used:\n\n```js\n$(document.body).off('.modal-gallery.data-api')\n```\nPlease also have a look at the [Bootstrap JS Guidelines](https://github.com/twitter/bootstrap/blob/master/js).\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.7+\n* [Bootstrap Modal](http://twitter.github.com/bootstrap/javascript.html#modal) v. 2.0+\n* [JavaScript Load Image](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n"}},"readme":null,"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:14:43.704Z","created":"2011-12-15T12:25:52.605Z","1.0.0":"2011-12-15T12:25:56.147Z","1.0.1":"2011-12-16T08:34:14.287Z","1.0.3":"2012-01-12T04:40:30.344Z","2.0.0":"2012-02-06T14:41:50.824Z","2.1.0":"2012-02-15T03:34:11.342Z","2.2.0":"2012-02-15T06:48:12.192Z","2.8.0":"2012-07-17T12:14:43.704Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Image-Gallery.git"},"_attachments":{"blueimp-bootstrap-image-gallery-2.8.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-+1SijjT7st/cvYyZyRL6sA==","length":14499,"stub":true},"blueimp-bootstrap-image-gallery-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Q5v/500GGzRGSF34kmeoZQ==","length":20480,"stub":true},"blueimp-bootstrap-image-gallery-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-rf8JKkAv3wfpE1tvfvN7gg==","length":20480,"stub":true},"blueimp-bootstrap-image-gallery-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-1Hw4wMuEb66ayJ+CuYwLjg==","length":10240,"stub":true},"blueimp-bootstrap-image-gallery-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-vZLwVQqsZ898iWNTYSeVaA==","length":10240,"stub":true},"blueimp-bootstrap-image-gallery-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-g14ukuppINzm6y7FYKrCYQ==","length":10240,"stub":true},"blueimp-bootstrap-image-gallery-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pGTYg7KjumJ9WhZUzwHMkg==","length":10240,"stub":true}}}},
{"id":"blueimp-canvas-to-blob","key":"blueimp-canvas-to-blob","value":{"rev":"13-56923f829abef42be44b8fb21134db63"},"doc":{"_id":"blueimp-canvas-to-blob","_rev":"13-56923f829abef42be44b8fb21134db63","name":"blueimp-canvas-to-blob","description":"JavaScript Canvas to Blob is a function to convert canvas elements into Blob objects.","dist-tags":{"latest":"2.0.1"},"versions":{"1.0.0":{"name":"blueimp-canvas-to-blob","version":"1.0.0","title":"JavaScript Canvas to Blob","description":"JavaScript Canvas to Blob is a function to convert canvas elements into Blob objects.","keywords":["javascript","canvas","blob","convert","conversion"],"homepage":"https://github.com/blueimp/JavaScript-Canvas-to-Blob","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Canvas-to-Blob.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Canvas-to-Blob/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"files":["canvas-to-blob.js"],"main":"canvas-to-blob.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-canvas-to-blob@1.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2b202a55cfd180b39c5c52695eb498ee7061a292","tarball":"http://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-1.0.0.tgz"},"scripts":{},"directories":{}},"1.0.1":{"name":"blueimp-canvas-to-blob","version":"1.0.1","title":"JavaScript Canvas to Blob","description":"JavaScript Canvas to Blob is a function to convert canvas elements into Blob objects.","keywords":["javascript","canvas","blob","convert","conversion"],"homepage":"https://github.com/blueimp/JavaScript-Canvas-to-Blob","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Canvas-to-Blob.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Canvas-to-Blob/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"canvas-to-blob.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-canvas-to-blob@1.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"22663a8af73fb67776542e64a8cb48c0d56dc314","tarball":"http://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-1.0.1.tgz"},"scripts":{}},"2.0.0":{"name":"blueimp-canvas-to-blob","version":"2.0.0","title":"JavaScript Canvas to Blob","description":"JavaScript Canvas to Blob is a function to convert canvas elements into Blob objects.","keywords":["javascript","canvas","blob","convert","conversion"],"homepage":"https://github.com/blueimp/JavaScript-Canvas-to-Blob","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Canvas-to-Blob.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Canvas-to-Blob/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"canvas-to-blob.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-canvas-to-blob@2.0.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"892ccab6e8cea7514346c4fcf1871a029a038b82","tarball":"http://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-2.0.0.tgz"},"readme":"# JavaScript Canvas to Blob\n\n## Usage\nInclude the (minified) JavaScript Canvas to Blob script in your HTML markup:\n\n```html\n<script src=\"canvas-to-blob.min.js\"></script>\n```\n\nThe JavaScript Canvas to Blob script is a polyfill for the standard HTML [canvas.toBlob](http://www.w3.org/TR/html5/the-canvas-element.html#dom-canvas-toblob) method:\n\n```js\nvar canvas = document.createElement('canvas'); \n/* ... your canvas manipulations ... */\nif (canvas.toBlob) {\n    canvas.toBlob(\n        function (blob) {\n            // Do something with the blob object,\n            // e.g. creating a multipart form for file uploads:\n            var formData = new FormData();\n            formData.append('file', blob, fileName);\n            /* ... */\n        },\n        'image/jpeg'\n    );\n}\n```\n\n## Requirements\nThe JavaScript Canvas to Blob function has zero dependencies.\n\nHowever, Canvas to Blob is a very suitable complement to the [JavaScript Load Image](https://github.com/blueimp/JavaScript-Load-Image) function.\n\n## API\nIn addition to the **canvas.toBlob** polyfill, the JavaScript Canvas to Blob script provides one additional function called **dataURLtoBlob**, which is added to the global window object if no AMD loader is used to load the script:\n\n```js\n// 80x60px GIF image (color black, base64 data):\nvar b64Data = 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' +\n        'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' +\n        'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7',\n    imageUrl = 'data:image/gif;base64,' + b64Data,\n    blob = window.dataURLtoBlob && window.dataURLtoBlob(imageUrl);\n```\n\n## License\nThe JavaScript Canvas to Blob script is released under the [MIT license](http://www.opensource.org/licenses/MIT).\n"},"2.0.1":{"name":"blueimp-canvas-to-blob","version":"2.0.1","title":"JavaScript Canvas to Blob","description":"JavaScript Canvas to Blob is a function to convert canvas elements into Blob objects.","keywords":["javascript","canvas","blob","convert","conversion"],"homepage":"https://github.com/blueimp/JavaScript-Canvas-to-Blob","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Canvas-to-Blob.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Canvas-to-Blob/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"canvas-to-blob.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-canvas-to-blob@2.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"207cd8080b605ba34197226d520fa8a5e8da8743","tarball":"http://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-2.0.1.tgz"},"readme":"# JavaScript Canvas to Blob\n\n## Usage\nInclude the (minified) JavaScript Canvas to Blob script in your HTML markup:\n\n```html\n<script src=\"canvas-to-blob.min.js\"></script>\n```\n\nThe JavaScript Canvas to Blob script is a polyfill for the standard HTML [canvas.toBlob](http://www.w3.org/TR/html5/the-canvas-element.html#dom-canvas-toblob) method:\n\n```js\nvar canvas = document.createElement('canvas'); \n/* ... your canvas manipulations ... */\nif (canvas.toBlob) {\n    canvas.toBlob(\n        function (blob) {\n            // Do something with the blob object,\n            // e.g. creating a multipart form for file uploads:\n            var formData = new FormData();\n            formData.append('file', blob, fileName);\n            /* ... */\n        },\n        'image/jpeg'\n    );\n}\n```\n\n## Requirements\nThe JavaScript Canvas to Blob function has zero dependencies.\n\nHowever, Canvas to Blob is a very suitable complement to the [JavaScript Load Image](https://github.com/blueimp/JavaScript-Load-Image) function.\n\n## API\nIn addition to the **canvas.toBlob** polyfill, the JavaScript Canvas to Blob script provides one additional function called **dataURLtoBlob**, which is added to the global window object if no AMD loader is used to load the script:\n\n```js\n// 80x60px GIF image (color black, base64 data):\nvar b64Data = 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' +\n        'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' +\n        'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7',\n    imageUrl = 'data:image/gif;base64,' + b64Data,\n    blob = window.dataURLtoBlob && window.dataURLtoBlob(imageUrl);\n```\n\n## License\nThe JavaScript Canvas to Blob script is released under the [MIT license](http://www.opensource.org/licenses/MIT).\n"}},"readme":null,"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:12:16.424Z","created":"2012-02-11T01:42:57.293Z","1.0.0":"2012-02-11T01:43:00.525Z","1.0.1":"2012-02-15T03:28:53.848Z","2.0.0":"2012-07-09T09:59:41.583Z","2.0.1":"2012-07-17T12:12:16.424Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Canvas-to-Blob.git"},"_attachments":{"blueimp-canvas-to-blob-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-379e4kmV2KE8u6qtz4ttGw==","length":3394,"stub":true},"blueimp-canvas-to-blob-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6qg9018RekL4pTmVq7augg==","length":3322,"stub":true},"blueimp-canvas-to-blob-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-L8Evwnxl22/awidqYDCYbw==","length":10240,"stub":true},"blueimp-canvas-to-blob-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-jKCJAhvt4jav6Vcle95XHg==","length":10240,"stub":true}}}},
{"id":"blueimp-file-upload","key":"blueimp-file-upload","value":{"rev":"45-d281cd1c2f592cf735a3b6c38aa86ba1"},"doc":{"_id":"blueimp-file-upload","_rev":"45-d281cd1c2f592cf735a3b6c38aa86ba1","name":"blueimp-file-upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","dist-tags":{"latest":"6.9.1"},"versions":{"6.0.0":{"name":"blueimp-file-upload","version":"6.0.0","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunked","resume","gae","go","python","php"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","blueimp-tmpl":">=1.0.2"},"files":["jquery.iframe-transport.js","jquery.fileupload.js","jquery.fileupload-ui.js","jquery.fileupload-ui.css","progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ab341948a0453605e10f8a9c0f2a5d49dc931144","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.0.0.tgz"},"scripts":{},"directories":{}},"6.0.1":{"name":"blueimp-file-upload","version":"6.0.1","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunked","resume","gae","go","python","php"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","blueimp-tmpl":">=1.0.2"},"files":["jquery.iframe-transport.js","jquery.fileupload.js","jquery.fileupload-ui.js","jquery.fileupload-ui.css","progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6b94ad50f9c7863d03983fa00559ca52e73ead85","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.0.1.tgz"},"scripts":{},"directories":{}},"6.0.2":{"name":"blueimp-file-upload","version":"6.0.2","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunked","resume","gae","go","python","php"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","blueimp-tmpl":">=1.0.2"},"files":["jquery.iframe-transport.js","jquery.fileupload.js","jquery.fileupload-ui.js","jquery.fileupload-ui.css","progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1e9c3f4b433e7a3b7d6460e19a0228ad008c8820","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.0.2.tgz"},"scripts":{},"directories":{}},"6.0.3":{"name":"blueimp-file-upload","version":"6.0.3","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunked","resume","gae","go","python","php"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","blueimp-tmpl":">=1.0.2"},"files":["jquery.iframe-transport.js","jquery.fileupload.js","jquery.fileupload-ui.js","jquery.fileupload-ui.css","progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"47cda23955d7447d4dcfaec13fc52f762305fa76","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.0.3.tgz"},"scripts":{},"directories":{}},"6.1.0":{"name":"blueimp-file-upload","version":"6.1.0","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunked","resume","gae","go","python","php"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.3","blueimp-tmpl":">=1.0.2"},"files":["jquery.iframe-transport.js","jquery.fileupload.js","jquery.fileupload-ui.js","jquery.fileupload-ui.css","progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ebf8ba95d91250002740b932a7b6f6f8e8086056","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.1.0.tgz"},"scripts":{},"directories":{}},"6.2.0":{"name":"blueimp-file-upload","version":"6.2.0","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunked","resume","gae","go","python","php"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.4","blueimp-tmpl":">=1.0.2"},"files":["jquery.iframe-transport.js","jquery.fileupload.js","jquery.fileupload-ui.js","jquery.fileupload-ui.css","progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"591b0060ca3606b7c2023405f065b2f88c3e3c03","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.2.0.tgz"},"scripts":{},"directories":{}},"6.3.0":{"name":"blueimp-file-upload","version":"6.3.0","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bar and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-load-image":">=1.1.4","blueimp-tmpl":">=1.0.2"},"files":["js/jquery.iframe-transport.js","js/jquery.fileupload.js","js/jquery.fileupload-ui.js","css/jquery.fileupload-ui.css","img/progressbar.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"89d3c4c94d7a25e8b9d98455490ffae13f794e81","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.3.0.tgz"},"scripts":{},"directories":{}},"6.4.0":{"name":"blueimp-file-upload","version":"6.4.0","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=1.0.2","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"files":["js/jquery.iframe-transport.js","js/jquery.fileupload.js","js/jquery.fileupload-ip.js","js/jquery.fileupload-ui.js","css/jquery.fileupload-ui.css","img/progressbar.gif","img/loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.4.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e47941d3f539ab49fe11b0d93b1fafaf00f93c03","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.4.0.tgz"},"scripts":{},"directories":{}},"6.4.1":{"name":"blueimp-file-upload","version":"6.4.1","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=1.0.2","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"files":["js/jquery.iframe-transport.js","js/jquery.fileupload.js","js/jquery.fileupload-ip.js","js/jquery.fileupload-ui.js","css/jquery.fileupload-ui.css","img/progressbar.gif","img/loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.4.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"512a8d298491bd48358e34b96467008b9e2bd70b","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.4.1.tgz"},"scripts":{},"directories":{}},"6.5.0":{"name":"blueimp-file-upload","version":"6.5.0","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=1.0.2","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.5.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4ea648146cbeeaaacf139216747f207f0ad300de","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.5.0.tgz"},"scripts":{},"directories":{}},"6.5.1":{"name":"blueimp-file-upload","version":"6.5.1","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.5.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d6f18b3e6247e77b2d80503e041e13120aa68311","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.5.1.tgz"},"scripts":{},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI widget factory](http://wiki.jqueryui.com/w/page/12138135/Widget%20factory) v. 1.8.16+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 1.0.2+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 1.0.1+ (optional)\n* [Bootstrap CSS Toolkit](https://github.com/twitter/bootstrap/) v. 2.0+ (optional)\n\nThe jQuery UI widget factory is a requirement for the basic File Upload plugin, but very lightweight without any other dependencies.  \nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with Twitter's [Bootstrap](https://github.com/twitter/bootstrap/) Toolkit. This enables a CSS based, responsive layout and fancy transition effects on modern browsers. The demo also includes the [Bootstrap Image Gallery Plugin](https://github.com/blueimp/Bootstrap-Image-Gallery). Both of these components are optional and not required.\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+ and Safari 5.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","directories":{}},"6.5.2":{"name":"blueimp-file-upload","version":"6.5.2","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.5.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"41fdd7cf5751b60abb828f883c87cad106fdbf75","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.5.2.tgz"},"scripts":{},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI widget factory](http://wiki.jqueryui.com/w/page/12138135/Widget%20factory) v. 1.8.16+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 1.0.2+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 1.0.1+ (optional)\n* [Bootstrap CSS Toolkit](https://github.com/twitter/bootstrap/) v. 2.0+ (optional)\n\nThe jQuery UI widget factory is a requirement for the basic File Upload plugin, but very lightweight without any other dependencies.  \nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with Twitter's [Bootstrap](https://github.com/twitter/bootstrap/) Toolkit. This enables a CSS based, responsive layout and fancy transition effects on modern browsers. The demo also includes the [Bootstrap Image Gallery Plugin](https://github.com/blueimp/Bootstrap-Image-Gallery). Both of these components are optional and not required.\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+ and Safari 5.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","directories":{}},"6.5.3":{"name":"blueimp-file-upload","version":"6.5.3","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.5.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8467e5a2d634898eba5f8df6fe090195b1cfd0b3","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.5.3.tgz"},"scripts":{},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI widget factory](http://wiki.jqueryui.com/w/page/12138135/Widget%20factory) v. 1.8.16+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 1.0.2+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 1.0.1+ (optional)\n* [Bootstrap CSS Toolkit](https://github.com/twitter/bootstrap/) v. 2.0+ (optional)\n\nThe jQuery UI widget factory is a requirement for the basic File Upload plugin, but very lightweight without any other dependencies.  \nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with Twitter's [Bootstrap](https://github.com/twitter/bootstrap/) Toolkit. This enables a CSS based, responsive layout and fancy transition effects on modern browsers. The demo also includes the [Bootstrap Image Gallery Plugin](https://github.com/blueimp/Bootstrap-Image-Gallery). Both of these components are optional and not required.\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+ and Safari 5.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","directories":{}},"6.9.1":{"name":"blueimp-file-upload","version":"6.9.1","title":"jQuery File Upload","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","bootstrap"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.6","blueimp-canvas-to-blob":">=2.0.0"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload@6.9.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"399f7d18040d83837da2c5b5a658355c3734c29f","tarball":"http://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-6.9.1.tgz"},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI widget factory](http://wiki.jqueryui.com/w/page/12138135/Widget%20factory) v. 1.8+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.1.0+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.6+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.0.0+ (optional)\n* [Bootstrap CSS Toolkit](https://github.com/twitter/bootstrap/) v. 2.0+ (optional)\n\nThe jQuery UI widget factory is a requirement for the basic File Upload plugin, but very lightweight without any other dependencies.  \nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with Twitter's [Bootstrap](https://github.com/twitter/bootstrap/) Toolkit. This enables a CSS based, responsive layout and fancy transition effects on modern browsers. The demo also includes the [Bootstrap Image Gallery Plugin](https://github.com/blueimp/Bootstrap-Image-Gallery). Both of these components are optional and not required.\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+, Safari 5.0+ and Opera 12.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n"}},"readme":null,"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:15:33.216Z","created":"2011-12-15T12:26:29.589Z","6.0.0":"2011-12-15T12:26:33.211Z","6.0.1":"2011-12-15T18:58:04.259Z","6.0.2":"2011-12-16T08:35:01.507Z","6.0.3":"2012-01-12T05:36:43.607Z","6.1.0":"2012-01-16T03:03:11.960Z","6.2.0":"2012-02-06T14:09:54.025Z","6.3.0":"2012-02-10T06:49:12.709Z","6.4.0":"2012-02-13T06:42:38.068Z","6.4.1":"2012-02-13T10:41:02.832Z","6.5.0":"2012-02-15T07:51:09.570Z","6.5.1":"2012-02-18T19:08:20.565Z","6.5.2":"2012-02-25T07:53:46.126Z","6.5.3":"2012-02-28T05:18:04.997Z","6.9.1":"2012-07-17T12:15:33.216Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"_attachments":{"blueimp-file-upload-6.9.1.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-K6UiiwhMV0JQWRvcRVfPNQ==","length":56440,"stub":true},"blueimp-file-upload-6.5.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ljvPotjoRexurQdrEt08SA==","length":53371,"stub":true},"blueimp-file-upload-6.5.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-lyoKQeWSkz0WTx3/udlhsg==","length":53230,"stub":true},"blueimp-file-upload-6.5.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-rP0eZP2WgFnwNRncCejUBQ==","length":53255,"stub":true},"blueimp-file-upload-6.5.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-cZ36jjIQDTVZCnnYyeK+SA==","length":51200,"stub":true},"blueimp-file-upload-6.4.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-h7eeZBR9Qb4SQXU5/yFXsA==","length":51200,"stub":true},"blueimp-file-upload-6.4.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-1VFhdc4vJtuAaC0tUzVhxg==","length":51200,"stub":true},"blueimp-file-upload-6.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-2wGlO28cVKbZ9W3pBO9+TA==","length":40960,"stub":true},"blueimp-file-upload-6.2.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-G2dTm6jQ1A4fuYkSoLCBlw==","length":40960,"stub":true},"blueimp-file-upload-6.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-I7GpS4bb3depfzzJcKDOMg==","length":40960,"stub":true},"blueimp-file-upload-6.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ihoKcg6SaUdXCqwmjUYWIg==","length":40960,"stub":true},"blueimp-file-upload-6.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2lHbxvq9TnpJ3iXFXCjpSg==","length":40960,"stub":true},"blueimp-file-upload-6.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-lBYDxjBRsUw940XB2ik3Yw==","length":40960,"stub":true},"blueimp-file-upload-6.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fzpzIV7zkEyKAaQFqtziEg==","length":40960,"stub":true}}}},
{"id":"blueimp-file-upload-jquery-ui","key":"blueimp-file-upload-jquery-ui","value":{"rev":"15-529634a1ed38e1a9c7f891d075e5fca9"},"doc":{"_id":"blueimp-file-upload-jquery-ui","_rev":"15-529634a1ed38e1a9c7f891d075e5fca9","name":"blueimp-file-upload-jquery-ui","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","dist-tags":{"latest":"6.9.1"},"versions":{"6.4.0":{"name":"blueimp-file-upload-jquery-ui","version":"6.4.0","title":"jQuery File Upload - jQuery UI version","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","ui"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery-ui":">=1.8","blueimp-tmpl":">=1.0.2","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"files":["js/jquery.iframe-transport.js","js/jquery.fileupload.js","js/jquery.fileupload-ip.js","js/jquery.fileupload-ui.js","js/jquery.fileupload-jui.js","css/jquery.fileupload-ui.css","img/progressbar.gif","img/loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-jquery-ui@6.4.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f444839fd587abc666e6b87c20c3a83e8bf076ba","tarball":"http://registry.npmjs.org/blueimp-file-upload-jquery-ui/-/blueimp-file-upload-jquery-ui-6.4.0.tgz"},"scripts":{},"directories":{}},"6.5.1":{"name":"blueimp-file-upload-jquery-ui","version":"6.5.1","title":"jQuery File Upload - jQuery UI version","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","ui"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-jquery-ui@6.5.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9da1aba0737413935f107eb95d596f11fb180d0b","tarball":"http://registry.npmjs.org/blueimp-file-upload-jquery-ui/-/blueimp-file-upload-jquery-ui-6.5.1.tgz"},"scripts":{},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI](http://jqueryui.com/) v. 1.8+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 1.0.2+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 1.0.1+ (optional)\n\nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with [jQuery UI](http://jqueryui.com/). The demo also includes the [jQuery Image Gallery Plugin](https://github.com/blueimp/jQuery-Image-Gallery).\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+ and Safari 5.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","directories":{}},"6.5.2":{"name":"blueimp-file-upload-jquery-ui","version":"6.5.2","title":"jQuery File Upload - jQuery UI version","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","ui"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-jquery-ui@6.5.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"67d917c9417f7217b27b2b2925c582f86cc024c5","tarball":"http://registry.npmjs.org/blueimp-file-upload-jquery-ui/-/blueimp-file-upload-jquery-ui-6.5.2.tgz"},"scripts":{},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI](http://jqueryui.com/) v. 1.8+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 1.0.2+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 1.0.1+ (optional)\n\nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with [jQuery UI](http://jqueryui.com/). The demo also includes the [jQuery Image Gallery Plugin](https://github.com/blueimp/jQuery-Image-Gallery).\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+ and Safari 5.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","directories":{}},"6.5.3":{"name":"blueimp-file-upload-jquery-ui","version":"6.5.3","title":"jQuery File Upload - jQuery UI version","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","ui"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.4","blueimp-canvas-to-blob":">=1.0.1"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-jquery-ui@6.5.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b6a2e90620e7324fb341a0476595f268269e94c4","tarball":"http://registry.npmjs.org/blueimp-file-upload-jquery-ui/-/blueimp-file-upload-jquery-ui-6.5.3.tgz"},"scripts":{},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI](http://jqueryui.com/) v. 1.8+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 1.0.2+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.4+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 1.0.1+ (optional)\n\nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with [jQuery UI](http://jqueryui.com/). The demo also includes the [jQuery Image Gallery Plugin](https://github.com/blueimp/jQuery-Image-Gallery).\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+ and Safari 5.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","directories":{}},"6.9.1":{"name":"blueimp-file-upload-jquery-ui","version":"6.9.1","title":"jQuery File Upload - jQuery UI version","description":"File Upload widget with multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.","keywords":["jquery","file","upload","widget","multiple","selection","drag","drop","progress","preview","cross-domain","cross-site","chunk","resume","gae","go","python","php","ui"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui":">=1.8","blueimp-tmpl":">=2.1.0","blueimp-load-image":">=1.1.6","blueimp-canvas-to-blob":">=2.0.0"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-jquery-ui@6.9.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"155c4735936898589b244336ee920d1ffa39eaf0","tarball":"http://registry.npmjs.org/blueimp-file-upload-jquery-ui/-/blueimp-file-upload-jquery-ui-6.9.1.tgz"},"readme":"# jQuery File Upload Plugin\n\n## Demo\n[Demo File Upload](http://blueimp.github.com/jQuery-File-Upload/)\n\n## Setup instructions\n* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)\n* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)\n\n## Features\n* **Multiple file upload:**  \n  Allows to select multiple files at once and upload them simultaneously.\n* **Drag & Drop support:**  \n  Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.\n* **Upload progress bar:**  \n  Shows a progress bar indicating the upload progress for individual files and for all uploads combined.\n* **Cancelable uploads:**  \n  Individual file uploads can be canceled to stop the upload progress.\n* **Resumable uploads:**  \n  Aborted uploads can be resumed with browsers supporting the Blob API.\n* **Chunked uploads:**  \n  Large files can be uploaded in smaller chunks with browsers supporting the Blob API.\n* **Client-side image resizing:**  \n  Images can be automatically resized on client-side with browsers supporting the required JS APIs.\n* **Preview images:**  \n  A preview of image files can be displayed before uploading with browsers supporting the required JS APIs.\n* **No browser plugins (e.g. Adobe Flash) required:**  \n  The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.\n* **Graceful fallback for legacy browsers:**  \n  Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.\n* **HTML file upload form fallback:**  \n  Shows a standard HTML file upload form if JavaScript is disabled.\n* **Cross-site file uploads:**  \n  Supports uploading files to a different domain with Cross-site XMLHttpRequests.\n* **Multiple plugin instances:**  \n  Allows to use multiple plugin instances on the same webpage.\n* **Customizable and extensible:**  \n  Provides an API to set individual options and define callBack methods for various upload events.\n* **Multipart and file contents stream uploads:**  \n  Files can be uploaded as standard \"multipart/form-data\" or file contents stream (HTTP PUT file upload).\n* **Compatible with any server-side application platform:**  \n  Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.6+\n* [jQuery UI](http://jqueryui.com/) v. 1.8+\n* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/jquery.iframe-transport.js) (included)\n* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.1.0+ (optional)\n* [JavaScript Load Image function](https://github.com/blueimp/JavaScript-Load-Image) v. 1.1.6+ (optional)\n* [JavaScript Canvas to Blob function](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.0.0+ (optional)\n\nThe jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).  \nThe UI version of the File Upload plugin also requires the JavaScript Templates engine as well as the JavaScript Load Image and JavaScript Canvas to Blob functions (for the image previews and resizing functionality). These dependencies are marked as optional, as the basic File Upload plugin can be used without them and the UI version of the plugin can be extended to override these dependencies with alternative solutions.\n\nThe User Interface is built with [jQuery UI](http://jqueryui.com/). The demo also includes the [jQuery Image Gallery Plugin](https://github.com/blueimp/jQuery-Image-Gallery).\n\nThe repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables Cross-domain AJAX requests (GET and POST only) in Microsoft Internet Explorer >= 8. However, the XDomainRequest object doesn't support file uploads and the plugin is only used by the [Demo](http://blueimp.github.com/jQuery-File-Upload/) for Cross-domain requests to delete uploaded files from the demo file upload service.\n\n[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.\n\n## Browser Support (tested versions)\n* Google Chrome - 7.0+\n* Apple Safari - 4.0+\n* Mozilla Firefox - 3.0+\n* Opera - 10.0+\n* Microsoft Internet Explorer 6.0+\n\nDrag & Drop is only supported on Google Chrome, Firefox 4.0+, Safari 5.0+ and Opera 12.0+.  \nMicrosoft Internet Explorer has no support for multiple file selection or upload progress.  \n[Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n"}},"readme":null,"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:16:01.142Z","created":"2012-02-13T06:41:58.745Z","6.4.0":"2012-02-13T06:42:01.915Z","6.5.1":"2012-02-18T19:08:57.409Z","6.5.2":"2012-02-25T07:54:52.362Z","6.5.3":"2012-02-28T05:18:25.931Z","6.9.1":"2012-07-17T12:16:01.142Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"_attachments":{"blueimp-file-upload-jquery-ui-6.9.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-eMw7HVCLt0mYFUwMtGrTWQ==","length":57394,"stub":true},"blueimp-file-upload-jquery-ui-6.5.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OeWQvl83oNJ9xy5SRznC1A==","length":54214,"stub":true},"blueimp-file-upload-jquery-ui-6.5.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-GqEyRut0++9Ihbxt9PuCQQ==","length":54061,"stub":true},"blueimp-file-upload-jquery-ui-6.5.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yHoTAPq0ecba6ERe9ztI7w==","length":54089,"stub":true},"blueimp-file-upload-jquery-ui-6.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VeP9NQ5hogw5MSPRwSQZng==","length":51200,"stub":true}}}},
{"id":"blueimp-file-upload-node","key":"blueimp-file-upload-node","value":{"rev":"7-b1c5a8fa5614279a10352aa99af14894"},"doc":{"_id":"blueimp-file-upload-node","_rev":"7-b1c5a8fa5614279a10352aa99af14894","name":"blueimp-file-upload-node","description":"Node.js implementation example of a file upload handler for jQuery File Upload.","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"blueimp-file-upload-node","version":"1.0.0","title":"jQuery File Upload Node.js example","description":"Node.js implementation example of a file upload handler for jQuery File Upload.","keywords":["file","upload","cross-domain","cross-site","node"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"formidable":">=1.0.8","node-static":">=0.5.9","imagemagick":">=0.1.2"},"main":"server.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-node@1.0.0","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d9a8a61bc3120e43046fc2742fac01907897e0bc","tarball":"http://registry.npmjs.org/blueimp-file-upload-node/-/blueimp-file-upload-node-1.0.0.tgz"},"readme":""},"1.0.1":{"name":"blueimp-file-upload-node","version":"1.0.1","title":"jQuery File Upload Node.js example","description":"Node.js implementation example of a file upload handler for jQuery File Upload.","keywords":["file","upload","cross-domain","cross-site","node"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"formidable":">=1.0.8","node-static":">=0.5.9","imagemagick":">=0.1.2"},"main":"server.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-node@1.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"96e3a26d66c3d35dba1f6392589d8c236cdd102b","tarball":"http://registry.npmjs.org/blueimp-file-upload-node/-/blueimp-file-upload-node-1.0.1.tgz"},"readme":""},"1.0.2":{"name":"blueimp-file-upload-node","version":"1.0.2","title":"jQuery File Upload Node.js example","description":"Node.js implementation example of a file upload handler for jQuery File Upload.","keywords":["file","upload","cross-domain","cross-site","node"],"homepage":"https://github.com/blueimp/jQuery-File-Upload","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-File-Upload/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"formidable":">=1.0.8","node-static":">=0.5.9","imagemagick":">=0.1.2"},"main":"server.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-file-upload-node@1.0.2","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"61ff19b8b01ea8483bb20ddb1a2b5628303068f2","tarball":"http://registry.npmjs.org/blueimp-file-upload-node/-/blueimp-file-upload-node-1.0.2.tgz"},"readme":""}},"readme":"","maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-09T09:48:42.669Z","created":"2012-02-18T18:10:44.274Z","1.0.0":"2012-02-18T18:10:47.507Z","1.0.1":"2012-04-11T15:16:27.392Z","1.0.2":"2012-07-09T09:48:42.669Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-File-Upload.git"},"_attachments":{"blueimp-file-upload-node-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Q1dNEBleFhsdqZ9FhHpw5g==","length":3567,"stub":true},"blueimp-file-upload-node-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1PvRQMa8ulAt36nD+j6p4A==","length":3608,"stub":true},"blueimp-file-upload-node-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vV0ImSdKr7dm2bzJ4cWAIg==","length":3527,"stub":true}}}},
{"id":"blueimp-image-gallery","key":"blueimp-image-gallery","value":{"rev":"11-3487e950bac3ce790dc04c62ccbd7cb8"},"doc":{"_id":"blueimp-image-gallery","_rev":"11-3487e950bac3ce790dc04c62ccbd7cb8","name":"blueimp-image-gallery","description":"jQuery Image Gallery is an extension to the Dialog component of jQuery UI, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","dist-tags":{"latest":"2.3.0"},"versions":{"2.1.1":{"name":"blueimp-image-gallery","version":"2.1.1","title":"jQuery Image Gallery","description":"Image Gallery with Lightbox dialog, transition effects, fullscreen mode and slideshow functionality for jQuery UI.","keywords":["image","gallery","lightbox","dialog","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/jQuery-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","jquery.ui.dialog":">=1.8"},"files":["jquery.image-gallery.js","jquery.image-gallery.css","loading.gif"],"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-image-gallery@2.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"dbded1a07e8f7d8311f60428f34fc8ff70acf871","tarball":"http://registry.npmjs.org/blueimp-image-gallery/-/blueimp-image-gallery-2.1.1.tgz"},"scripts":{},"directories":{}},"2.2.0":{"name":"blueimp-image-gallery","version":"2.2.0","title":"jQuery Image Gallery","description":"jQuery Image Gallery is an extension to the Dialog component of jQuery UI, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","lightbox","dialog","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/jQuery-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery.ui.widget":">=1.8","jquery.ui.dialog":">=1.8","blueimp-load-image":">=1.1.4"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-image-gallery@2.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"79e3f1cd35eca5b46604cb0b4e999913f9cbbec8","tarball":"http://registry.npmjs.org/blueimp-image-gallery/-/blueimp-image-gallery-2.2.0.tgz"},"scripts":{}},"2.3.0":{"name":"blueimp-image-gallery","version":"2.3.0","title":"jQuery Image Gallery","description":"jQuery Image Gallery is an extension to the Dialog component of jQuery UI, to ease navigation between a set of gallery images. It features mouse and keyboard navigation, transition effects, fullscreen mode and slideshow functionality.","keywords":["image","gallery","lightbox","dialog","transition","effects","fullscreen","slideshow"],"homepage":"https://github.com/blueimp/jQuery-Image-Gallery","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-Image-Gallery.git"},"bugs":{"name":"https://github.com/blueimp/jQuery-Image-Gallery/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.6","jquery-ui":">=1.8","blueimp-load-image":">=1.1.4"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-image-gallery@2.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"00b23e81ba42225f426facd4dda6b074c2a6c928","tarball":"http://registry.npmjs.org/blueimp-image-gallery/-/blueimp-image-gallery-2.3.0.tgz"},"scripts":{}}},"readme":null,"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-02-15T06:48:28.106Z","created":"2011-12-15T12:26:10.391Z","2.1.1":"2011-12-15T12:26:13.763Z","2.2.0":"2012-02-15T03:32:59.978Z","2.3.0":"2012-02-15T06:48:28.106Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/jQuery-Image-Gallery.git"},"_attachments":{"blueimp-image-gallery-2.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-CGO8lsDbsyjHIfZEZUXGcQ==","length":20480,"stub":true},"blueimp-image-gallery-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lWoFO81csR4QbR6OS2yZQA==","length":20480,"stub":true},"blueimp-image-gallery-2.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XKjSCWy/Tf+6Bz8Z+vzHkw==","length":10240,"stub":true}}}},
{"id":"blueimp-load-image","key":"blueimp-load-image","value":{"rev":"31-bcb5e02c6cb084165f183242ee2fe084"},"doc":{"_id":"blueimp-load-image","_rev":"31-bcb5e02c6cb084165f183242ee2fe084","name":"blueimp-load-image","description":"JavaScript Load Image is a function to load images provided as File or Blob objects or via URL. It returns an optionally scaled HTML img or canvas element.","dist-tags":{"latest":"1.2.1"},"versions":{"1.1.3":{"name":"blueimp-load-image","version":"1.1.3","title":"JavaScript Load Image","description":"JavaScript Load Image is a function to load images provided as File or Blob objects or via URL. It returns an optionally scaled HTML img or canvas element.","keywords":["javascript","load","loading","image","file","blob","url","scale","scaling","img","canvas"],"homepage":"https://github.com/blueimp/JavaScript-Load-Image","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Load-Image.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Load-Image/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"files":["load-image.js"],"main":"load-image.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-load-image@1.1.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b55d723c878a07aa2ac5e70675979551034d8e64","tarball":"http://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-1.1.3.tgz"},"scripts":{},"directories":{}},"1.1.4":{"name":"blueimp-load-image","version":"1.1.4","title":"JavaScript Load Image","description":"JavaScript Load Image is a function to load images provided as File or Blob objects or via URL. It returns an optionally scaled HTML img or canvas element.","keywords":["javascript","load","loading","image","file","blob","url","scale","scaling","img","canvas"],"homepage":"https://github.com/blueimp/JavaScript-Load-Image","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Load-Image.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Load-Image/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"load-image.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-load-image@1.1.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f731b1e7177e32b2bae2edd413baf8a6c4c9432c","tarball":"http://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-1.1.4.tgz"},"scripts":{}},"1.1.7":{"name":"blueimp-load-image","version":"1.1.7","title":"JavaScript Load Image","description":"JavaScript Load Image is a function to load images provided as File or Blob objects or via URL. It returns an optionally scaled HTML img or canvas element.","keywords":["javascript","load","loading","image","file","blob","url","scale","scaling","img","canvas"],"homepage":"https://github.com/blueimp/JavaScript-Load-Image","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Load-Image.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Load-Image/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"load-image.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-load-image@1.1.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"27d1ccfbecb51eb4193d1be7a9cc55d5d99f110d","tarball":"http://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-1.1.7.tgz"},"readme":"# JavaScript Load Image\n\n## Demo\n[JavaScript Load Image Demo](http://blueimp.github.com/JavaScript-Load-Image/)\n\n## Usage\nInclude the (minified) JavaScript Load Image script in your HTML markup:\n\n```html\n<script src=\"load-image.min.js\"></script>\n```\n\nIn your application code, use the **loadImage()** function like this:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n};\n```\n\n## Requirements\nThe JavaScript Load Image function has zero dependencies.\n\nHowever, JavaScript Load Image is a very suitable complement to the [Canvas to Blob](https://github.com/blueimp/JavaScript-Canvas-to-Blob) function.\n\n## API\nThe **loadImage()** function accepts a [File](https://developer.mozilla.org/en/DOM/File) or [Blob](https://developer.mozilla.org/en/DOM/Blob) object or a simple image URL (e.g. \"http://example.org/image.png\") as first argument.\n\nIf a [File](https://developer.mozilla.org/en/DOM/File) or [Blob](https://developer.mozilla.org/en/DOM/Blob) is passed as parameter, it returns a HTML **img** element if the browser supports the [URL](https://developer.mozilla.org/en/DOM/window.URL) API or a [FileReader](https://developer.mozilla.org/en/DOM/FileReader) object if supported, or **false**.  \nIt always returns a HTML **img** element when passing an image URL:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    var loadingImage = window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n    if (!loadingImage) {\n        // Alternative code ...\n    }\n};\n```\n\nThe **img** element or [FileReader](https://developer.mozilla.org/en/DOM/FileReader) object returned by the **loadImage()** function allows to abort the loading process by setting the **onload** and **onerror** event handlers to null:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    var loadingImage = window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n    loadingImage.onload = loadingImage.onerror = null;\n};\n```\n\nThe second argument must be a **callback** function, which is called when the image has been loaded or an error occurred while loading the image. The callback function is passed one argument, which is either a HTML **img** element, a [canvas](https://developer.mozilla.org/en/HTML/Canvas) element, or an [Event](https://developer.mozilla.org/en/DOM/event) object of type \"**error**\":\n\n```js\nvar imageUrl = \"http://example.org/image.png\";\nwindow.loadImage(\n    imageUrl,\n    function (img) {\n        if(img.type === \"error\") {\n            console.log(\"Error loading image \" + imageUrl);\n        } else {\n            document.body.appendChild(img);\n        }\n    },\n    {maxWidth: 600}\n);\n```\n\nThe optional third argument is a map of options:\n\n* **maxWidth**: Defines the maximum width of the img/canvas element.\n* **maxHeight**: Defines the maximum height of the img/canvas element.\n* **minWidth**: Defines the minimum width of the img/canvas element.\n* **minHeight**: Defines the minimum height of the img/canvas element.\n* **canvas**: Defines if the returned element should be a [canvas](https://developer.mozilla.org/en/HTML/Canvas) element.\n\nThey can be used the following way:\n\n```js\nwindow.loadImage(\n    fileOrBlobOrUrl,\n    function (img) {\n        document.body.appendChild(img);\n    },\n    {\n        maxWidth: 600,\n        maxHeight: 300,\n        minWidth: 100,\n        minHeight: 50,\n        canvas: true\n    }\n);\n```\n\nAll options are optional. By default, the image is returned as HTML **img** element without any image size restrictions.\n\n## License\nThe JavaScript Load Image script is released under the [MIT license](http://www.opensource.org/licenses/MIT).\n"},"1.2.0":{"name":"blueimp-load-image","version":"1.2.0","title":"JavaScript Load Image","description":"JavaScript Load Image is a function to load images provided as File or Blob objects or via URL. It returns an optionally scaled HTML img or canvas element.","keywords":["javascript","load","loading","image","file","blob","url","scale","scaling","img","canvas"],"homepage":"https://github.com/blueimp/JavaScript-Load-Image","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Load-Image.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Load-Image/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"load-image.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-load-image@1.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"396452b050b8500a9cfb44ea26f16422b20c8639","tarball":"http://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-1.2.0.tgz"},"readme":"# JavaScript Load Image\n\n## Demo\n[JavaScript Load Image Demo](http://blueimp.github.com/JavaScript-Load-Image/)\n\n## Usage\nInclude the (minified) JavaScript Load Image script in your HTML markup:\n\n```html\n<script src=\"load-image.min.js\"></script>\n```\n\nIn your application code, use the **loadImage()** function like this:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n};\n```\n\n## Requirements\nThe JavaScript Load Image function has zero dependencies.\n\nHowever, JavaScript Load Image is a very suitable complement to the [Canvas to Blob](https://github.com/blueimp/JavaScript-Canvas-to-Blob) function.\n\n## API\nThe **loadImage()** function accepts a [File](https://developer.mozilla.org/en/DOM/File) or [Blob](https://developer.mozilla.org/en/DOM/Blob) object or a simple image URL (e.g. \"http://example.org/image.png\") as first argument.\n\nIf a [File](https://developer.mozilla.org/en/DOM/File) or [Blob](https://developer.mozilla.org/en/DOM/Blob) is passed as parameter, it returns a HTML **img** element if the browser supports the [URL](https://developer.mozilla.org/en/DOM/window.URL) API or a [FileReader](https://developer.mozilla.org/en/DOM/FileReader) object if supported, or **false**.  \nIt always returns a HTML **img** element when passing an image URL:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    var loadingImage = window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n    if (!loadingImage) {\n        // Alternative code ...\n    }\n};\n```\n\nThe **img** element or [FileReader](https://developer.mozilla.org/en/DOM/FileReader) object returned by the **loadImage()** function allows to abort the loading process by setting the **onload** and **onerror** event handlers to null:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    var loadingImage = window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n    loadingImage.onload = loadingImage.onerror = null;\n};\n```\n\nThe second argument must be a **callback** function, which is called when the image has been loaded or an error occurred while loading the image. The callback function is passed one argument, which is either a HTML **img** element, a [canvas](https://developer.mozilla.org/en/HTML/Canvas) element, or an [Event](https://developer.mozilla.org/en/DOM/event) object of type \"**error**\":\n\n```js\nvar imageUrl = \"http://example.org/image.png\";\nwindow.loadImage(\n    imageUrl,\n    function (img) {\n        if(img.type === \"error\") {\n            console.log(\"Error loading image \" + imageUrl);\n        } else {\n            document.body.appendChild(img);\n        }\n    },\n    {maxWidth: 600}\n);\n```\n\nThe optional third argument is a map of options:\n\n* **maxWidth**: Defines the maximum width of the img/canvas element.\n* **maxHeight**: Defines the maximum height of the img/canvas element.\n* **minWidth**: Defines the minimum width of the img/canvas element.\n* **minHeight**: Defines the minimum height of the img/canvas element.\n* **canvas**: Defines if the returned element should be a [canvas](https://developer.mozilla.org/en/HTML/Canvas) element.\n* **noRevoke**: By default, the [created object URL](https://developer.mozilla.org/en/DOM/window.URL.createObjectURL) is revoked after the image has been loaded, except when this option is set to *true*.\n\nThey can be used the following way:\n\n```js\nwindow.loadImage(\n    fileOrBlobOrUrl,\n    function (img) {\n        document.body.appendChild(img);\n    },\n    {\n        maxWidth: 600,\n        maxHeight: 300,\n        minWidth: 100,\n        minHeight: 50,\n        canvas: true,\n        noRevoke: true\n    }\n);\n```\n\nAll settings are optional. By default, the image is returned as HTML **img** element without any image size restrictions.\n\n## License\nThe JavaScript Load Image script is released under the [MIT license](http://www.opensource.org/licenses/MIT).\n"},"1.2.1":{"name":"blueimp-load-image","version":"1.2.1","title":"JavaScript Load Image","description":"JavaScript Load Image is a function to load images provided as File or Blob objects or via URL. It returns an optionally scaled HTML img or canvas element.","keywords":["javascript","load","loading","image","file","blob","url","scale","scaling","img","canvas"],"homepage":"https://github.com/blueimp/JavaScript-Load-Image","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Load-Image.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Load-Image/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"main":"load-image.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-load-image@1.2.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"a6edd8e680755d6654f7367c857ff6fc9646555b","tarball":"http://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-1.2.1.tgz"},"readme":"# JavaScript Load Image\n\n## Demo\n[JavaScript Load Image Demo](http://blueimp.github.com/JavaScript-Load-Image/)\n\n## Usage\nInclude the (minified) JavaScript Load Image script in your HTML markup:\n\n```html\n<script src=\"load-image.min.js\"></script>\n```\n\nIn your application code, use the **loadImage()** function like this:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n};\n```\n\n## Requirements\nThe JavaScript Load Image function has zero dependencies.\n\nHowever, JavaScript Load Image is a very suitable complement to the [Canvas to Blob](https://github.com/blueimp/JavaScript-Canvas-to-Blob) function.\n\n## API\nThe **loadImage()** function accepts a [File](https://developer.mozilla.org/en/DOM/File) or [Blob](https://developer.mozilla.org/en/DOM/Blob) object or a simple image URL (e.g. \"http://example.org/image.png\") as first argument.\n\nIf a [File](https://developer.mozilla.org/en/DOM/File) or [Blob](https://developer.mozilla.org/en/DOM/Blob) is passed as parameter, it returns a HTML **img** element if the browser supports the [URL](https://developer.mozilla.org/en/DOM/window.URL) API or a [FileReader](https://developer.mozilla.org/en/DOM/FileReader) object if supported, or **false**.  \nIt always returns a HTML **img** element when passing an image URL:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    var loadingImage = window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n    if (!loadingImage) {\n        // Alternative code ...\n    }\n};\n```\n\nThe **img** element or [FileReader](https://developer.mozilla.org/en/DOM/FileReader) object returned by the **loadImage()** function allows to abort the loading process by setting the **onload** and **onerror** event handlers to null:\n\n```js\ndocument.getElementById('file-input').onchange = function (e) {\n    var loadingImage = window.loadImage(\n        e.target.files[0],\n        function (img) {\n            document.body.appendChild(img);\n        },\n        {maxWidth: 600}\n    );\n    loadingImage.onload = loadingImage.onerror = null;\n};\n```\n\nThe second argument must be a **callback** function, which is called when the image has been loaded or an error occurred while loading the image. The callback function is passed one argument, which is either a HTML **img** element, a [canvas](https://developer.mozilla.org/en/HTML/Canvas) element, or an [Event](https://developer.mozilla.org/en/DOM/event) object of type \"**error**\":\n\n```js\nvar imageUrl = \"http://example.org/image.png\";\nwindow.loadImage(\n    imageUrl,\n    function (img) {\n        if(img.type === \"error\") {\n            console.log(\"Error loading image \" + imageUrl);\n        } else {\n            document.body.appendChild(img);\n        }\n    },\n    {maxWidth: 600}\n);\n```\n\nThe optional third argument is a map of options:\n\n* **maxWidth**: Defines the maximum width of the img/canvas element.\n* **maxHeight**: Defines the maximum height of the img/canvas element.\n* **minWidth**: Defines the minimum width of the img/canvas element.\n* **minHeight**: Defines the minimum height of the img/canvas element.\n* **canvas**: Defines if the returned element should be a [canvas](https://developer.mozilla.org/en/HTML/Canvas) element.\n* **noRevoke**: By default, the [created object URL](https://developer.mozilla.org/en/DOM/window.URL.createObjectURL) is revoked after the image has been loaded, except when this option is set to *true*.\n\nThey can be used the following way:\n\n```js\nwindow.loadImage(\n    fileOrBlobOrUrl,\n    function (img) {\n        document.body.appendChild(img);\n    },\n    {\n        maxWidth: 600,\n        maxHeight: 300,\n        minWidth: 100,\n        minHeight: 50,\n        canvas: true,\n        noRevoke: true\n    }\n);\n```\n\nAll settings are optional. By default, the image is returned as HTML **img** element without any image size restrictions.\n\n## License\nThe JavaScript Load Image script is released under the [MIT license](http://www.opensource.org/licenses/MIT).\n"}},"readme":null,"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:12:38.115Z","created":"2012-01-12T05:09:13.242Z","1.1.3":"2012-01-12T05:09:16.485Z","1.1.4":"2012-02-15T03:28:05.606Z","1.1.7":"2012-07-09T10:03:03.673Z","1.2.0":"2012-07-11T11:52:46.338Z","1.2.1":"2012-07-17T12:12:38.115Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Load-Image.git"},"_attachments":{"blueimp-load-image-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-KV/Ki8dUt/D9VZvjBEjjhQ==","length":5955,"stub":true},"blueimp-load-image-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-VCQtSJutRC42o/FcnYLmQA==","length":5834,"stub":true},"blueimp-load-image-1.1.7.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-W84KVfQv06nZNGUji7C3GA==","length":5729,"stub":true},"blueimp-load-image-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-EhcTplHG4exjKHLBgwoOmQ==","length":10240,"stub":true},"blueimp-load-image-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yv+UufDQaszobRZX7LnReQ==","length":10240,"stub":true}}}},
{"id":"blueimp-md5","key":"blueimp-md5","value":{"rev":"3-52a7a9ee045dfc020afe8f0ca5983730"},"doc":{"_id":"blueimp-md5","_rev":"3-52a7a9ee045dfc020afe8f0ca5983730","name":"blueimp-md5","description":"JavaScript MD5 implementation.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"blueimp-md5","version":"1.0.0","title":"JavaScript MD5","description":"JavaScript MD5 implementation.","keywords":["javascript","md5"],"homepage":"https://github.com/blueimp/JavaScript-MD5","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"contributors":[{"name":"Paul Johnston","url":"http://pajhome.org.uk/crypt/md5"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-MD5.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-MD5/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"devDependencies":{"mocha":"latest","expect.js":"latest"},"scripts":{"test":"mocha --reporter spec"},"main":"md5.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-md5@1.0.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"466c262bc4b6bd1590f28f3a054a70c0e11b757a","tarball":"http://registry.npmjs.org/blueimp-md5/-/blueimp-md5-1.0.0.tgz"}}},"readme":"# JavaScript MD5\n\n## Demo\n[JavaScript MD5 Demo](http://blueimp.github.com/JavaScript-MD5/)\n\n## Usage\n\n### Client-side\nInclude the (minified) JavaScript [MD5](http://en.wikipedia.org/wiki/MD5) script in your HTML markup:\n\n```html\n<script src=\"md5.min.js\"></script>\n```\n\nIn your application code, calculate the ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [MD5](http://en.wikipedia.org/wiki/MD5) hash of a string by calling the **md5** method with the string as argument:\n\n```js\nvar hash = md5(\"value\"); // \"2063c1608d6e0baf80249c42e2be5804\"\n```\n\n### Server-side\n\nThe following is an example how to use the JavaScript MD5 module on the server-side with [node.js](http://nodejs.org/).\n\nCreate a new directory and add the **md5.js** file. Or alternatively, install the **blueimp-md5** package with [npm](http://npmjs.org/):\n\n```sh\nnpm install blueimp-md5\n```\n\nAdd a file **server.js** with the following content:\n\n```js\nrequire(\"http\").createServer(function (req, res) {\n    // The md5 module exports the md5() function:\n    var md5 = require(\"./md5\").md5,\n    // Use the following version if you installed the package with npm:\n    // var md5 = require(\"blueimp-md5\").md5,\n        url  = require(\"url\"),\n        query = url.parse(req.url).query;\n    res.writeHead(200, {\"Content-Type\": \"text/plain\"});\n    // Calculate and print the MD5 hash of the url query:\n    res.end(md5(query));\n}).listen(8080, \"localhost\");\nconsole.log(\"Server running at http://localhost:8080/\");\n```\n\nRun the application with the following command:\n\n```sh\nnode server.js\n```\n\n## Requirements\nThe JavaScript MD5 script has zero dependencies.\n\n## API\n\nCalculate the ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [MD5](http://en.wikipedia.org/wiki/MD5) hash of a given string value:\n\n```js\nvar hash = md5(\"value\"); // \"2063c1608d6e0baf80249c42e2be5804\"\n```\n\nCalculate the ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [HMAC](http://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and key:\n\n```js\nvar hash = md5(\"value\", \"key\"); // \"01433efd5f16327ea4b31144572c67f6\"\n```\n    \nCalculate the raw [MD5](http://en.wikipedia.org/wiki/MD5) hash of a given string value:\n\n```js\nvar hash = md5(\"value\", null, true);\n```\n\nCalculate the raw [HMAC](http://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and key:\n\n```js\nvar hash = md5(\"value\", \"key\", true);\n```\n\n## License\nThe JavaScript MD5 script is released under the [MIT license](http://www.opensource.org/licenses/MIT).\n","maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:13:10.035Z","created":"2012-07-17T12:13:08.252Z","1.0.0":"2012-07-17T12:13:10.035Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-MD5.git"},"_attachments":{"blueimp-md5-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oyoIbkBkgQkJUb1Ko/h48w==","length":7249,"stub":true}}}},
{"id":"blueimp-tmpl","key":"blueimp-tmpl","value":{"rev":"39-fe58d0fe2ff1739ffbc277a6841030f2"},"doc":{"_id":"blueimp-tmpl","_rev":"39-fe58d0fe2ff1739ffbc277a6841030f2","name":"blueimp-tmpl","description":"< 1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"blueimp-tmpl","description":"< 1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.","homepage":"https://github.com/blueimp/JavaScript-Templates","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Templates.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Templates/issues"},"scripts":{"test":"node ./test/test.js"},"main":"tmpl","version":"1.0.0","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-tmpl@1.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"73999a41663ac4d9468d1f5a7e9818672bb1d691","tarball":"http://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-1.0.0.tgz"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"directories":{}},"1.0.1":{"name":"blueimp-tmpl","description":"< 1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.","homepage":"https://github.com/blueimp/JavaScript-Templates","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Templates.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Templates/issues"},"scripts":{"test":"node ./test/test.js"},"main":"tmpl","version":"1.0.1","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-tmpl@1.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cbe9109af15f95a3c42f4399a4ea5ee3614f5952","tarball":"http://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-1.0.1.tgz"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"directories":{}},"1.0.2":{"name":"blueimp-tmpl","version":"1.0.2","title":"JavaScript Templates","description":"< 1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.","keywords":["javascript","templates","templating"],"homepage":"https://github.com/blueimp/JavaScript-Templates","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Templates.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Templates/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"devDependencies":{"mocha":"latest","expect.js":"latest"},"scripts":{"test":"mocha --reporter spec"},"files":["tmpl.js"],"main":"tmpl.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-tmpl@1.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"76a72d01102cf9420766eda1c61fa0881a7cbb65","tarball":"http://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-1.0.2.tgz"},"directories":{}},"2.0.0":{"name":"blueimp-tmpl","version":"2.0.0","title":"JavaScript Templates","description":"< 1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.","keywords":["javascript","templates","templating"],"homepage":"https://github.com/blueimp/JavaScript-Templates","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Templates.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Templates/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"devDependencies":{"mocha":"latest","expect.js":"latest","uglify-js":"latest"},"scripts":{"test":"mocha --reporter spec"},"bin":{"tmpl.js":"./compile.js"},"main":"tmpl.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-tmpl@2.0.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c0e2a96baf257ead808d2af13d597536fa8ec97b","tarball":"http://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-2.0.0.tgz"},"directories":{}},"2.1.0":{"name":"blueimp-tmpl","version":"2.1.0","title":"JavaScript Templates","description":"< 1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.","keywords":["javascript","templates","templating"],"homepage":"https://github.com/blueimp/JavaScript-Templates","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Templates.git"},"bugs":{"name":"https://github.com/blueimp/JavaScript-Templates/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"devDependencies":{"mocha":"latest","expect.js":"latest","uglify-js":"latest"},"scripts":{"test":"mocha --reporter spec"},"bin":{"tmpl.js":"./compile.js"},"main":"tmpl.js","_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"blueimp-tmpl@2.1.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"3e9a59a4cc4711ca9a56229f70bcf6fe6c5a007a","tarball":"http://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-2.1.0.tgz"}}},"readme":"# JavaScript Templates\n\n## Demo\n[JavaScript Templates Demo](http://blueimp.github.com/JavaScript-Templates/)\n\n## Usage\n\n### Client-side\nInclude the (minified) JavaScript Templates script in your HTML markup:\n\n```html\n<script src=\"tmpl.min.js\"></script>\n```\n\nAdd a script section with type **\"text/html\"** and your template definition as content:\n\n```html\n<script type=\"text/html\" id=\"tmpl-demo\">\n<h3>{%=o.title%}</h3>\n<p>Released under the\n<a href=\"{%=o.license.url%}\">{%=o.license.name%}</a>.</p>\n<h4>Features</h4>\n<ul>\n{% for (var i=0; i<o.features.length; i++) { %}\n    <li>{%=o.features[i]%}</li>\n{% } %}\n</ul>\n</script>\n```\n\n**\"o\"** (the lowercase letter) is a reference to the data parameter of the template function (see the API section on how to modify this identifier).\n\nIn your application code, create a JavaScript object to use as data for the template:\n\n```js\nvar data = {\n    \"title\": \"JavaScript Templates\",\n    \"license\": {\n        \"name\": \"MIT license\",\n        \"url\": \"http://creativecommons.org/licenses/MIT/\"\n    },\n    \"features\": [\n        \"lightweight & fast\",\n        \"powerful\",\n        \"zero dependencies\"\n    ]\n};\n```\n\nIn a real application, this data could be the result of retrieving a [JSON](http://json.org/) resource.\n\nRender the result by calling the **tmpl()** method with the id of the template and the data object as arguments:\n\n```js\ndocument.getElementById(\"result\").innerHTML = tmpl(\"tmpl-demo\", data);\n```\n\n### Server-side\n\nThe following is an example how to use the JavaScript Templates engine on the server-side with [node.js](http://nodejs.org/).\n\nCreate a new directory and add the **tmpl.js** file. Or alternatively, install the **blueimp-tmpl** package with [npm](http://npmjs.org/):\n\n```sh\nnpm install blueimp-tmpl\n```\n\nAdd a file **template.html** with the following content:\n\n```html\n<!DOCTYPE HTML>\n<title>{%=o.title%}</title>\n<h3><a href=\"{%=o.url%}\">{%=o.title%}</a></h3>\n<h4>Features</h4>\n<ul>\n{% for (var i=0; i<o.features.length; i++) { %}\n    <li>{%=o.features[i]%}</li>\n{% } %}\n</ul>\n```\n\nAdd a file **server.js** with the following content:\n\n```js\nrequire(\"http\").createServer(function (req, res) {\n    var fs = require(\"fs\"),\n        // The tmpl module exports the tmpl() function:\n        tmpl = require(\"./tmpl\").tmpl,\n        // Use the following version if you installed the package with npm:\n        // tmpl = require(\"blueimp-tmpl\").tmpl,\n        // Sample data:\n        data = {\n            \"title\": \"JavaScript Templates\",\n            \"url\": \"https://github.com/blueimp/JavaScript-Templates\",\n            \"features\": [\n                \"lightweight & fast\",\n                \"powerful\",\n                \"zero dependencies\"\n            ]\n        };\n    // Override the template loading method:\n    tmpl.load = function (id) {\n        var filename = id + \".html\";\n        console.log(\"Loading \" + filename);\n        return fs.readFileSync(filename, \"utf8\");\n    };\n    res.writeHead(200, {\"Content-Type\": \"text/html\"});\n    // Render the content:\n    res.end(tmpl(\"template\", data));\n}).listen(8080, \"localhost\");\nconsole.log(\"Server running at http://localhost:8080/\");\n```\n\nRun the application with the following command:\n\n```sh\nnode server.js\n```\n\n## Requirements\nThe JavaScript Templates script has zero dependencies.\n\n## API\n\n### tmpl() function\nThe **tmpl()** function is added to the global **window** object and can be called as global function:\n\n```js\nvar result = tmpl(\"tmpl-demo\", data);\n```\n\nThe **tmpl()** function can be called with the id of a template, or with a template string:\n\n```js\nvar result = tmpl(\"<h3>{%=o.title%}</h3>\", data);\n```\n\nIf called without second argument, **tmpl()** returns a reusable template function:\n\n```js\nvar func = tmpl(\"<h3>{%=o.title%}</h3>\");\ndocument.getElementById(\"result\").innerHTML = func(data);\n```\n\n### Templates cache\nTemplates loaded by id are cached in the map **tmpl.cache**, which can be modified:\n\n```js\nvar func = tmpl(\"tmpl-demo\");\nvar cached = typeof tmpl.cache[\"tmpl-demo\"] === \"function\"; // true\n\ntmpl.cache[\"tmpl-demo\"] = tmpl(\"<h3>{%=o.title%}</h3>\");\nvar result = tmpl(\"tmpl-demo\", {title: \"JS\"}); // Renders \"<h3>JS</h3>\"\n```\n\n### Output encoding\nThe method **tmpl.encode** is used to escape HTML special characters in template output:\n\n```js\nvar output = tmpl.encode(\"<>&\\\"\\x00\"); // Renders \"&lt;&gt;&amp;&quot;\"\n```\n\n**tmpl.encode** makes use of the regular expression **tmpl.encReg** and the encoding map **tmpl.encMap** to match and replace special characters, which can be modified to change the behavior of the output encoding:\n\n```js\n// Add single quotes to the encoding rules:\ntmpl.encReg = /[<>&\"'\\x00]/g;\ntmpl.encMap[\"'\"] = \"&#39;\";\n\nvar output = tmpl.encode(\"<>&\\\"'\\x00\"); // Renders \"&lt;&gt;&amp;&quot;&#39;\"\n```\n\n### Local helper variables\nThe local variables available inside the templates are the following:\n\n* **o**: The data object given as parameter to the template function (see the next section on how to modify the parameter name).\n* **_s**: The string for the rendered result content.\n* **_t**: A reference to the **tmpl** function object.\n* **_e**: A reference to the **tmpl.encode** method.\n* **print**: Function to add content to the rendered result string.\n* **include**: Function to include the return value of a different template in the result.\n\nTo introduce additional local helper variables, the string **tmpl.helper** can be extended. The following adds a convenience function for *console.log* and a streaming function, that streams the template rendering result back to the callback argument (note the comma at the beginning of each variable declaration):\n\n```js\ntmpl.helper += \",log=function(){console.log.apply(console, arguments)}\" +\n    \",st='',stream=function(cb){var l=st.length;st=_s;cb( _s.slice(l));}\";\n```\n\nThose new helper functions could be used to stream the template contents to the console output:\n\n```html\n<script type=\"text/html\" id=\"tmpl-demo\">\n<h3>{%=o.title%}</h3>\n{% stream(log); %}\n<p>Released under the\n<a href=\"{%=o.license.url%}\">{%=o.license.name%}</a>.</p>\n{% stream(log); %}\n<h4>Features</h4>\n<ul>\n{% stream(log); %}\n{% for (var i=0; i<o.features.length; i++) { %}\n    <li>{%=o.features[i]%}</li>\n    {% stream(log); %}\n{% } %}\n</ul>\n{% stream(log); %}\n</script>\n```\n\n### Template function argument\nThe generated template functions accept one argument, which is the data object given to the **tmpl(id, data)** function. This argument is available inside the template definitions as parameter **o** (the lowercase letter).\n\nThe argument name can be modified by overriding **tmpl.arg**:\n\n```js\ntmpl.arg = \"p\";\n\n// Renders \"<h3>JavaScript Templates</h3>\":\nvar result = tmpl(\"<h3>{%=p.title%}</h3>\", {title: \"JavaScript Templates\"});\n```\n\n### Template parsing\nThe template contents are matched and replaced using the regular expression **tmpl.regexp** and the replacement function **tmpl.func**. The replacement function operates based on the [parenthesized submatch strings](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter).\n\nTo use different tags for the template syntax, override **tmpl.regexp** with a modified regular expression, by exchanging all occurrences of \"**\\\\{%**\" and \"**%\\\\}**\", e.g. with \"**\\\\[%**\" and \"**%\\\\]**\":\n\n```js\ntmpl.regexp = /(\\s+)|('|\\\\)(?![^%]*%\\])|(?:\\[%(=|!)(.+?)%\\])|(\\[%)|(%\\])/g;\n```\n\n## Templates syntax\n\n### Interpolation\nPrint variable with HTML special characters escaped:\n\n```html\n<h3>{%=o.title%}</h3>\n```\n\nPrint variable without escaping:\n\n```html\n<h3>{%!o.user_id%}</h3>\n```\n\nPrint output of function calls:\n\n```html\n<a href=\"{%=encodeURI(o.url)%}\">Website</a>\n```\n\nUse dot notation to print nested properties:\n\n```html\n<strong>{%=o.author.name%}</strong>\n```\n\n### Evaluation\nUse **print(str)** to add escaped content to the output:\n\n```html\n<span>Year: {% var d=new Date(); print(d.getFullYear()); %}</span>\n```\n\nUse **print(str, true)** to add unescaped content to the output:\n\n```html\n<span>{% print(\"Fast &amp; powerful\", true); %}</span>\n```\n\nUse **include(str, obj)** to include content from a different template:\n\n```html\n<div>\n{% include('tmpl-link', {name: \"Website\", url: \"http://example.org\"}); %}\n</div>\n```\n\nIf else condition:\n\n```html\n{% if (o.author.url) { %}\n    <a href=\"{%=encodeURI(o.author.url)%}\">{%=o.author.name%}</a>\n{% } else { %}\n    <em>No author url.</em>\n{% } %}\n```\n\nFor loop:\n\n```html\n<ul>\n{% for (var i=0; i<o.features.length; i++) { %}\n    <li>{%=o.features[i]%}</li>\n{% } %}\n</ul>\n```\n\n## License\nThe JavaScript Templates script is released under the [MIT license](http://creativecommons.org/licenses/MIT/).\n","maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:13:42.212Z","created":"2011-12-10T21:07:29.229Z","1.0.0":"2011-12-10T21:07:32.435Z","1.0.1":"2011-12-12T08:30:13.836Z","1.0.2":"2012-02-08T01:30:38.922Z","2.0.0":"2012-02-15T03:25:52.714Z","2.1.0":"2012-07-17T12:13:42.212Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/JavaScript-Templates.git"},"_attachments":{"blueimp-tmpl-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ILNKvBp3y3Anr6clpwmfSg==","length":9295,"stub":true},"blueimp-tmpl-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-00AE2GdKCQzUih2i4YPBlQ==","length":10240,"stub":true},"blueimp-tmpl-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-czBQmCq1ZE56uJigAoMpgg==","length":10240,"stub":true},"blueimp-tmpl-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UtIzrTudyh4OMTD0C8Gw+w==","length":10240,"stub":true},"blueimp-tmpl-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PkfoXDOLvOJYdGsCQZqc+Q==","length":10240,"stub":true}}}},
{"id":"bluemold","key":"bluemold","value":{"rev":"19-6461b329d7106dd91d392f1a309da383"},"doc":{"_id":"bluemold","_rev":"19-6461b329d7106dd91d392f1a309da383","name":"bluemold","description":"Template engine based on jQuery template syntax","dist-tags":{"latest":"0.6.3"},"versions":{"0.0.1":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.0.1","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":"~v0.4.9"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/johnweir/.npm/bluemold/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bluemold@0.0.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"4cc3f21191ecca32bb3b4b0f9f461974152bedde","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.0.1.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.3.0":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.3.0","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs","start":"node server.js"},"engines":{"node":"~v0.4.9"},"dependencies":{"underscore":"1.1.4"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.1"},"_npmJsonOpts":{"file":"/Users/johnweir/.npm/bluemold/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"bluemold@0.3.0","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c36544c4c799fdbb2d966e7518944600e51cbf2c","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.3.0.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.4.0":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.4.0","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs","start":"node server.js"},"engines":{"node":"~v0.4.9"},"dependencies":{"underscore":"1.1.4"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.1"},"_npmJsonOpts":{"file":"/Users/johnweir/.npm/bluemold/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"bluemold@0.4.0","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"8aa604205a5aeeee3b10629e3d88d7d7fc46a210","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.4.0.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.5.0":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.5.0","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":"~v0.4.9"},"dependencies":{"underscore":"1.1.4"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.1"},"_npmJsonOpts":{"file":"/Users/johnweir/.npm/bluemold/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bluemold@0.5.0","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c661fd167074b713462ffdde4a9f3acb1794f156","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.5.0.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.5.2":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.5.2","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":"~v0.4.9"},"dependencies":{"underscore":"1.1.7"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.1"},"_npmJsonOpts":{"file":"/Users/johnweir/.npm/bluemold/0.5.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bluemold@0.5.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"cc0913188621b17a2dc26ac6d3f2fc5febe811cf","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.5.2.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.5.4":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.5.4","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":">=0.4.9"},"dependencies":{"underscore":"1.1.7"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.1"},"_npmUser":{"name":"famedriver","email":"john@famedriver.com"},"_id":"bluemold@0.5.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"28ed0129678255cddf68e88c7c626eb0bb86c466","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.5.4.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.5.5":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.5.5","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":">=0.6.0"},"dependencies":{"underscore":">=1.2.0"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.2"},"_npmUser":{"name":"famedriver","email":"john@famedriver.com"},"_id":"bluemold@0.5.5","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"1d934ef6872ffcfaffcc098d57b17c8842598bb0","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.5.5.tgz"},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.6.1":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.6.1","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":">=0.6.0"},"dependencies":{"underscore":">=1.2.0"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.2"},"_npmUser":{"name":"famedriver","email":"john@famedriver.com"},"_id":"bluemold@0.6.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"ceb9e832977da9d91c579c32f66264f25929f247","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.6.1.tgz"},"readme":"# Bluemold Template Engine\n\nBluemold is a Javascript template engine based on jQuery Template syntax.\n\nIt is designed to run serverside (Node.js) and output HTML or any text based format.\n\nBluemold is the template engine used for the portfolios at http://famedriver.com\n\n## Install\n    npm install bluemold\n\n### Simple example\n    var Bluemold = require('bluemold'),\n        template = \"Hello ${world}. {{each words}}${$value} {{/each}}\",\n        data     = {world: \"Earth\", words:[\"Where\", \"will\", \"we\", \"go?\"]};\n\n    Bluemold( template, data)\n    // 'Hello Earth. Where will we go? '\n\n### Javascript helper functions\n    var data = {a:\"Hello\", f: function(s){ return s.toUpperCase()}}\n    Bluemold(\"${f(a)} WORLD\", data)\n\n    // 'HELLO WORLD'\n\n### Global sandbox\nBy default the sandbox only includes the user data and the Underscore library as \\_. To include additional functions or data set them with the `sandbox` method.\n\n    Bluemold.sandbox({http: function(){return 'an http function'}})\n    Bluemold(\"${http()}\")\n    // 'an http function'\n\n\nSee the [specs](\"https://github.com/jweir/Bluemold/tree/master/spec\") for more examples\n\n### Running as a process\nBluemold can be run via a child process.  This allows timeouts to be set on rendering and avoids infinite loops or other problems.\n\n    var send = require('bluemold').send;\n    send([\"this data is ${data}\", {data:true}, \"template\"], 1000 /*timeout*/, function(string){....});\n\n## Documentation\nThe supported tags are\n\n* {{each}}{{/each}}\n* {{if}}{{/if}}\n* {{else}}\n* {{html}}\n* ${} & {{=}}\n* {{tmpl}}\n\n{{wrap}} is not supported.\n\nSee the [jQuery Template page](http://api.jquery.com/category/plugins/templates/).\n\nUnlike jQeury templates, HTML is not escaped but default.\n\n## TODO\n\nProper error messages with line numbers.\n\n## Development & helping out\n\nI would love contributors, fork away! But please use 2 soft space indents and write specs for any new features.\n\nBesure to have `pegjs` and `jasmine-node` installed.   \n\n     npm install pegjs\n     npm install jasmine-node\n\n     scripts/build # regenerate the parser\n     scripts/spec  # run the tests \n\n## Bugs\n\nPlease reports bugs [here](https://github.com/jweir/Bluemold/issues)\n\n## Other jQuery Template projects\n\n[Node JQTP](https://github.com/kof/node-jqtpl) is another jQuery Template engine for Node.\n","maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]},"0.6.3":{"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"name":"bluemold","description":"Template engine based on jQuery template syntax","version":"0.6.3","homepage":"https://github.com/jweir/Bluemold","repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"main":"lib/index","scripts":{"test":"script/specs"},"engines":{"node":">=0.6.0"},"dependencies":{"underscore":">=1.2.0"},"devDependencies":{"jasmine-node":">=1.0.0","pegjs":">=0.6.2"},"_npmUser":{"name":"famedriver","email":"john@famedriver.com"},"_id":"bluemold@0.6.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"72a04353a12969ba7419f220f04e0a1b86ee25a6","tarball":"http://registry.npmjs.org/bluemold/-/bluemold-0.6.3.tgz"},"readme":"# Bluemold Template Engine\n\nBluemold is a Javascript template engine based on jQuery Template syntax.\n\nIt is designed to run serverside (Node.js) and output HTML or any text based format.\n\nBluemold is the template engine used for the portfolios at http://famedriver.com\n\n## Install\n    npm install bluemold\n\n### Simple example\n    var Bluemold = require('bluemold'),\n        template = \"Hello ${world}. {{each words}}${$value} {{/each}}\",\n        data     = {world: \"Earth\", words:[\"Where\", \"will\", \"we\", \"go?\"]};\n\n    Bluemold( template, data)\n    // 'Hello Earth. Where will we go? '\n\n### Javascript helper functions\n    var data = {a:\"Hello\", f: function(s){ return s.toUpperCase()}}\n    Bluemold(\"${f(a)} WORLD\", data)\n\n    // 'HELLO WORLD'\n\n### Global sandbox\nBy default the sandbox only includes the user data and the Underscore library as \\_. To include additional functions or data set them with the `sandbox` method.\n\n    Bluemold.sandbox({http: function(){return 'an http function'}})\n    Bluemold(\"${http()}\")\n    // 'an http function'\n\n\nSee the [specs](\"https://github.com/jweir/Bluemold/tree/master/spec\") for more examples\n\n### Running as a process\nBluemold can be run via a child process.  This allows timeouts to be set on rendering and avoids infinite loops or other problems.\n\n    var send = require('bluemold').send;\n    send([\"this data is ${data}\", {data:true}, \"template\"], 1000 /*timeout*/, function(string){....});\n\n## Documentation\nThe supported tags are\n\n* {{each}}{{/each}}\n* {{if}}{{/if}}\n* {{else}}\n* {{html}}\n* ${} & {{=}}\n* {{tmpl}}\n\n{{wrap}} is not supported.\n\nSee the [jQuery Template page](http://api.jquery.com/category/plugins/templates/).\n\nUnlike jQeury templates, HTML is not escaped but default.\n\n## TODO\n\nProper error messages with line numbers.\n\n## Development & helping out\n\nI would love contributors, fork away! But please use 2 soft space indents and write specs for any new features.\n\nBesure to have `pegjs` and `jasmine-node` installed.   \n\n     npm install pegjs\n     npm install jasmine-node\n\n     scripts/build # regenerate the parser\n     scripts/spec  # run the tests \n\n## Bugs\n\nPlease reports bugs [here](https://github.com/jweir/Bluemold/issues)\n\n## Other jQuery Template projects\n\n[Node JQTP](https://github.com/kof/node-jqtpl) is another jQuery Template engine for Node.\n","maintainers":[{"name":"famedriver","email":"john@famedriver.com"}]}},"maintainers":[{"name":"famedriver","email":"john@famedriver.com"}],"time":{"modified":"2012-05-23T20:07:27.430Z","created":"2011-08-18T19:49:41.905Z","0.0.1":"2011-08-18T19:49:43.542Z","0.3.0":"2011-08-21T03:58:47.963Z","0.4.0":"2011-08-21T03:59:51.917Z","0.5.0":"2011-09-01T17:55:13.273Z","0.5.2":"2011-09-11T23:54:10.383Z","0.5.4":"2011-11-18T21:28:06.060Z","0.5.5":"2012-02-17T22:50:31.669Z","0.6.1":"2012-05-23T19:53:00.575Z","0.6.3":"2012-05-23T20:07:27.430Z"},"author":{"name":"John Weir","email":"john@famedriver.com","url":"http://famedriver.com"},"repository":{"type":"git","url":"git://github.com/jweir/Bluemold.git"},"_attachments":{"bluemold-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-+KJtXTNfQGcoPrHPE771hw==","length":19572,"stub":true},"bluemold-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-SJ42HXc6KQ3iQjjBLAmLQQ==","length":19562,"stub":true},"bluemold-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-pR1TYJHelYLTTROjvC85xg==","length":20480,"stub":true},"bluemold-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/7qzT8sOcRJfSmg64qX/WQ==","length":20480,"stub":true},"bluemold-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-20NWmTh2HjktTsclqn3qTQ==","length":20157,"stub":true},"bluemold-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-r/kbrypNyjVDYGvabvbueg==","length":20125,"stub":true},"bluemold-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-cNqQ4qk86BBkg16jbiz3oA==","length":20030,"stub":true},"bluemold-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-EzFFM9QiF3WqeRV/WnNk3A==","length":20030,"stub":true},"bluemold-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RqGFIK+4zu3zMijaFH0XFQ==","length":255685,"stub":true}}}},
{"id":"blueprint","key":"blueprint","value":{"rev":"77-81d76ba27fc89f7144acadbd5fe17280"},"doc":{"_id":"blueprint","_rev":"77-81d76ba27fc89f7144acadbd5fe17280","name":"blueprint","description":"Blueprint for an App. Middleware, & MVC routing over Node.js & Mongoose","dist-tags":{"latest":"0.0.7"},"versions":{"0.1.4":{"name":"blueprint","description":"Blueprint for an App. Middleware, & MVC routing over Node.js & Mongoose","version":"0.1.4","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","nodemailer":"0.2.3","nconf":"0.4.4"},"devDependencies":{"vows":"0.5.11","should":"0.3.1","request":"2.1.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.1.4","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d5651b12c6fc82c35631dc96efc11f8f6e8ae70b","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.1.4.tgz"},"directories":{}},"0.1.6":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.1.6","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","nodemailer":"0.2.3"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.1.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3f0689b6bb3583c524a04145c43681e4fab48bfa","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.1.6.tgz"},"directories":{}},"0.1.8":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.1.8","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","nodemailer":"0.2.3"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.1.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6e7888d7dad0e51b306e298f9e49bbc12dd4c8f2","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.1.8.tgz"},"directories":{}},"0.1.8-2":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.1.8-2","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","nodemailer":"0.2.3","ejs":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.1.8-2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c78aba010353e9f3d5a296c234bdf3d825047736","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.1.8-2.tgz"},"directories":{}},"0.1.8-4":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.1.8-4","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.1.8-4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e3141a4d7a599e496feb01b08e47e2a5439e3d6f","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.1.8-4.tgz"},"directories":{}},"0.1.9":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.1.9","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.1.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3692ca63c3cd688178083d9126e1fc87f1ce188f","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.1.9.tgz"},"directories":{}},"0.2.0":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.0","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e150881656bcca09d5e096c6e8032a2da3b6b49d","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.0.tgz"},"directories":{}},"0.2.1":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.1","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","colors":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a9e7f73ed54254d500759c2267d71b2a96c5e1a2","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.1.tgz"},"directories":{}},"0.2.2":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.2","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","colors":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"13afd11681bee0a522b34e22ef22b10ed1102a63","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.2.tgz"},"directories":{}},"0.2.3":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.3","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","colors":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/docs/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"705f8d85f189de7eec667e82ca9acee38f213324","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.3.tgz"},"directories":{}},"0.2.5":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.5","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","colors":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d89124091570accac0a4ec77ef23dffb9621c818","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.5.tgz"},"directories":{}},"0.2.6":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.6","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","colors":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"95edd04491206c3a28bee7774618221f68eb480e","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.6.tgz"},"directories":{}},"0.2.7":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.7","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","colors":""},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.7","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9215daf2fff0713912629fc7ffef633d3dbb881f","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.7.tgz"},"directories":{}},"0.2.8":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.8","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.8","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cb6911cdf0d98cb3629e51bb50086249f56790b3","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.8.tgz"},"directories":{}},"0.2.9":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.9","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"618d72e6db69aad28c6c222fea76ffa854a8640a","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.9.tgz"},"directories":{}},"0.2.9-1":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.2.9-1","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.2.9-1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"46ed42280e5301983de3e5046b2d3c87a92bf89c","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.2.9-1.tgz"},"directories":{}},"0.3.0":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.0","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b342b677291617db2a484b379e4426d232987724","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.0.tgz"},"directories":{}},"0.3.1":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.1","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"29c6ecbdc66762daea03a73fa16802c0ac342221","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.1.tgz"},"directories":{}},"0.3.2":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.2","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.12"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"05f62fc5c47106da60be1327f24521df64af4826","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.2.tgz"},"directories":{}},"0.3.2-1":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.2-1","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.12"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.2-1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2afc92a978dfd72d26a0d4b2c8f09c59ed71f50f","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.2-1.tgz"},"directories":{}},"0.3.3":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.3","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9764296613470f971ee764271acb48a9d19c3e01","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.3.tgz"},"directories":{}},"0.3.4":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.4","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2","colors":"0.5.1"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9b255680d518609d273542c67b85138e075d2139","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.4.tgz"},"directories":{}},"0.3.7":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.7","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.7","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c33cd5d4b360f8fb40de8bd46ee61c4496574b86","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.7.tgz"},"directories":{}},"0.3.8":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.8","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.8","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"218b8bdae407379cb181d8e40620f4f8874eade1","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.8.tgz"},"directories":{}},"0.3.9":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.3.9","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.3.9","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7a87847c4a46a505a2e52a25db57762ca9af2a90","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.3.9.tgz"},"directories":{}},"0.4.0":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.4.0","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.4.0","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c5eb6806365be1bee6de32d32d77a621e3464127","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.4.0.tgz"},"directories":{}},"0.4.1":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.4.1","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.4.1","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"03f9a5120624f8cb445b67d827cead57afcaee82","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.4.1.tgz"},"directories":{}},"0.4.2":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.4.2","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.4.2","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a71eed182832e8f1e7678ec7c63c19c44624cdd4","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.4.2.tgz"},"directories":{}},"0.4.3":{"name":"blueprint","description":"Blueprint for a Startup. Middleware, & MVC routing over Node.js & Mongoose","version":"0.4.3","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"mongoose":"2.3.12","wrench":"1.3.2","ejs":"0.4.3","mime":"1.2.4","qs":"0.3.2"},"devDependencies":{"vows":"0.5.13","should":"0.3.2","request":""},"scripts":{"test":"vows test/*.test.js --spec"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE"}],"main":"./lib/blueprint.js","engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.4.3","_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1b540dec9cd81b1216b6d208bc6d5efa3f6cf971","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.4.3.tgz"},"directories":{}},"0.0.7":{"name":"blueprint","description":"Blueprint for an App. Middleware, & MVC routing over Node.js & Mongoose","version":"0.0.7","author":{"name":"Ingk Labs","email":"admin@ingk.com"},"maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"dependencies":{"connect":"1.8.2","mongoose":"2.4.1","connect-mongoose":"0.0.2","colors":"0.5.1","express":"2.5.1","wrench":"1.3.2","nodemailer":"0.2.3","ejs":"0.5.0","nconf":"0.5.0"},"devDependencies":{"vows":"0.6.0","should":"0.3.2","request":"2.2.9"},"licenses":[{"type":"MIT","url":"http://github.com/ingklabs/blueprint/LICENSE.md"}],"main":"./lib/blueprint.js","bin":{"blueprint":"./bin/blueprint.js"},"engines":{"node":">= 0.4.11"},"_npmUser":{"name":"edwardhotchkiss","email":"e@ingk.com"},"_id":"blueprint@0.0.7","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3f91162e6c4d82d0cdf56d88970f807b9f73e4f1","tarball":"http://registry.npmjs.org/blueprint/-/blueprint-0.0.7.tgz"}}},"readme":"\nblueprint\n=========\n\n### HUGE NOTE\n \n  * This module is stable and production ready in 0.1.0. This is the latest\n  module available via npm. Until then, only clone/fork the project if you are\n  interested in developing on it, as it will not be stable. :P\n  \n### Setup & Usage\n\n```bash\n$ [sudo] npm install -g blueprint\n$ blueprint yournewapp\n$ cd yournewapp\n$ npm install\n$ node app.js\n```","maintainers":[{"name":"edwardhotchkiss","email":"e@ingk.com"}],"time":{"modified":"2011-12-05T00:39:42.203Z","created":"2011-11-16T15:15:24.474Z","0.1.4":"2011-11-16T15:15:24.814Z","0.1.6":"2011-11-18T13:30:03.155Z","0.1.8":"2011-11-18T13:41:04.351Z","0.1.8-2":"2011-11-18T13:57:00.599Z","0.1.8-4":"2011-11-18T14:06:12.003Z","0.1.9":"2011-11-18T14:12:23.380Z","0.2.0":"2011-11-18T14:17:33.124Z","0.2.1":"2011-11-18T17:37:46.164Z","0.2.2":"2011-11-18T17:45:32.434Z","0.2.3":"2011-11-18T17:52:43.080Z","0.2.5":"2011-11-18T20:10:40.480Z","0.2.6":"2011-11-18T20:30:58.808Z","0.2.7":"2011-11-18T22:02:13.696Z","0.2.8":"2011-11-18T22:09:38.191Z","0.2.9":"2011-11-19T00:22:06.310Z","0.2.9-1":"2011-11-19T00:36:57.183Z","0.3.0":"2011-11-19T20:47:42.023Z","0.3.1":"2011-11-21T08:36:07.182Z","0.0.7":"2011-12-05T00:39:42.203Z","0.3.2":"2011-11-21T22:09:59.443Z","0.3.2-1":"2011-11-23T15:06:44.460Z","0.3.3":"2011-11-23T15:13:05.904Z","0.3.4":"2011-11-23T15:18:31.900Z","0.3.7":"2011-11-24T00:34:14.855Z","0.3.8":"2011-11-24T01:01:35.771Z","0.3.9":"2011-11-24T01:06:14.659Z","0.4.0":"2011-11-24T01:18:52.932Z","0.4.1":"2011-11-24T01:25:16.564Z","0.4.2":"2011-11-24T02:32:07.755Z","0.4.3":"2011-11-24T15:03:53.867Z"},"author":{"name":"Ingk Labs","email":"admin@ingk.com"},"repository":{"type":"git","url":"git://github.com/ingklabs/blueprint.git"},"_attachments":{"blueprint-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-UIc2AKXzAstONh5rci/grQ==","length":5559,"stub":true},"blueprint-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-igfzWR8y3/W27eeevjva9w==","length":10240,"stub":true},"blueprint-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-Ms/wp5rGJV6hREHnjNM3oA==","length":10240,"stub":true},"blueprint-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-Y0Aflc+DHXgiswWJKQ5G+w==","length":10240,"stub":true},"blueprint-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-XIm45uqkgu+AxJ4CdDfE8Q==","length":10240,"stub":true},"blueprint-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-bcS682Ow2OVZCUJBmjmKrQ==","length":10240,"stub":true},"blueprint-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-jq5AQ8VHhdF881tq1hSpoQ==","length":10240,"stub":true},"blueprint-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-swAc/ShoOIk0LQexARgJKA==","length":10240,"stub":true},"blueprint-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-m4memQzSrDiRXxumoKPiFw==","length":10240,"stub":true},"blueprint-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-H0QAf2Cjee+1/PiBrlZ+4Q==","length":10240,"stub":true},"blueprint-0.3.2-1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-rltSYXtqjZAWWKmVWFe26Q==","length":10240,"stub":true},"blueprint-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-UnfVKKWsQQgBCP+SanNt9w==","length":10240,"stub":true},"blueprint-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-eNs7zetKJXi0X43B+2DxZg==","length":61440,"stub":true},"blueprint-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-9nCzzY4AWV1lgU60Lc2mwQ==","length":61440,"stub":true},"blueprint-0.2.9-1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-x163/YYr2AbGFR0oDH3/sg==","length":61440,"stub":true},"blueprint-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-dVn+5RYiRWYu+uMMj0Qc4Q==","length":61440,"stub":true},"blueprint-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-3bwERyF40aPNuvua7FLSFQ==","length":61440,"stub":true},"blueprint-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-W657OZuqq9OmbdfmscQmEQ==","length":61440,"stub":true},"blueprint-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-IMdiR4ivUkNLq+6SCAxVXg==","length":61440,"stub":true},"blueprint-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-u+lJ8mQIatkikaC+g9Pnag==","length":61440,"stub":true},"blueprint-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-0f3B6W9vQzAw5PNcc4A8yA==","length":61440,"stub":true},"blueprint-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-P8hygUSL9+GMbE1XvUQLmA==","length":61440,"stub":true},"blueprint-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-GXw87Zpaejuml0YsZA99Fw==","length":61440,"stub":true},"blueprint-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-vT+mypOKn+aI1gW1yABGBg==","length":61440,"stub":true},"blueprint-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-iQT+YakY+JgIvQXtr1r3VA==","length":61440,"stub":true},"blueprint-0.1.8-4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+2dhfKQzeGMFnzjYvY2mRA==","length":61440,"stub":true},"blueprint-0.1.8-2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-7DFrvLuwIlZsBCBed1Xdzg==","length":61440,"stub":true},"blueprint-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZdFAKaoTKGyse2hw6qYwBA==","length":61440,"stub":true},"blueprint-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-y2YvuGDx6zc70JnldUY1Ag==","length":61440,"stub":true},"blueprint-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SonDYksk2odrwAyQg5mAQA==","length":61440,"stub":true}}}},
{"id":"blueprints","key":"blueprints","value":{"rev":"3-acd8f1596671232c2e29d6df3478abb1"},"doc":{"_id":"blueprints","_rev":"3-acd8f1596671232c2e29d6df3478abb1","name":"blueprints","description":"","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"blueprints","author":{"name":"Tom Booth","email":"tombooth@gmail.com","url":"http://thomasbooth.co.uk"},"description":"","version":"0.0.1","main":"./src/main.js","bin":{"blueprints":"./bin/blueprints"},"engines":{"node":"0.6.x"},"dependencies":{"cli":"0.4.x","htmlparser":"1.x.x","uglify-js":"1.x.x","seq":"x.x.x"},"devDependencies":{"jsdom":"0.2.x","nodeunit":"0.7.x"},"_npmUser":{"name":"tombooth","email":"tombooth@gmail.com"},"_id":"blueprints@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"119d4ed75946ec413502684a2bc172671c9f329a","tarball":"http://registry.npmjs.org/blueprints/-/blueprints-0.0.1.tgz"},"maintainers":[{"name":"tombooth","email":"tombooth@gmail.com"}]}},"readme":"\nblueprints is a JavaScript template library for generating DOM elements. It takes a directory and converts\nit into a namespaced template library.\n\n\nInstallation\n---------------------\n```\nnpm install blueprints\n```\n\nUsage\n---------------------\nCreate a template file with a .html extension (can be changed through options object see below) for\nthis example we will name this file list.html. Place this file in a root directory and then compile\nit using one of the methods below.\n\nroot_dir/list.html\n\n```\n<div class=\"## if (something) { ##a-class## } ##\">\n   ## for (var i = 0, l = xs.length; i < l; i++) { ##\n   <span>##= xs[i].name##</span>\n   ## } ##\n</div>\n```\nWhen you include your compiled template library in your javascript web app you will be able to access\nit using the window.blueprints function passing in the id of the template and data to be used in the\ntemplate.\n\n```javascript\nvar element = window.blueprints('list', { \n   something: true, \n   xs: [ { name:'foo' }, { name:'bar' } ] \n});\n```\n\nHere is a slightly more compiles template directory and the ids that correspond to the different files.\n\n```\nroot_dir/list.html                       list\nroot_dir/reports/table.html              reports:table\nroot_dir/reports/structure.html          reports:structure\nroot_dir/reports/daily/breakdown.html    reports:daily:breakdown\n```\n\nCompilation\n---------------------\n\nThrough a terminal:\n\n```\n$ blueprints {directory}\n\nwill out the template file to stdout\n\n$ blueprints {directory} -o {file}\n\nwill out the template file to the specified file\n\n$ blueprints -m {directory}\n\nwill minify the template file before outputting it\n```\n\nAs a module:\n\n```javascript\nvar blueprints = require('blueprints');\n\nnew blueprints(path, { minify: true }).out(writeable_stream);\n```\n\n\n\n","maintainers":[{"name":"tombooth","email":"tombooth@gmail.com"}],"time":{"modified":"2012-03-24T23:10:44.090Z","created":"2012-03-24T23:10:42.647Z","0.0.1":"2012-03-24T23:10:44.090Z"},"author":{"name":"Tom Booth","email":"tombooth@gmail.com","url":"http://thomasbooth.co.uk"},"_attachments":{"blueprints-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WIFgQuf885Z1SNYJrbb/qA==","length":50044,"stub":true}}}},
{"id":"bluesky","key":"bluesky","value":{"rev":"21-854cd0ba05ff39d5c32100ec9a4a79c5"},"doc":{"_id":"bluesky","_rev":"21-854cd0ba05ff39d5c32100ec9a4a79c5","name":"bluesky","description":"A node.js library for accessing Azure services","dist-tags":{"latest":"0.6.3"},"versions":{"0.3.0":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","dependencies":{"request":"2.2.x","dateformat":"1.0.x","sax":"0.3.x","memorystream":"0.0.x"},"devDependencies":{"nodeunit":"0.5.x"},"engine":"node >= 0.4.1","version":"0.3.0","files":["index.js","lib","package.json","README.md","test"],"main":"index","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1-pre","_defaultsLoaded":true,"dist":{"shasum":"03d48b76eafe6de5ea9a6a681058ac96a4b16a06","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.3.0.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.4.0":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"request":"2.x.x","dateformat":"1.x.x","sax":"0.x.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x"},"devDependencies":{"nodeunit":"0.x.x","memorystream":"0.0.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.4.0","files":["index.js","lib","package.json","README.md","test"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"2b14d379fd61ca60cc3e3285ce16547f46558759","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.4.0.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.5.0alpha":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":"http://github.com/WindowsAzure/azure-sdk-for-node/tarball/dev"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.5.0alpha","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.5.0alpha","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"777bd18d4c4f3ca936e838ab0416bfc5466d7b44","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.5.0alpha.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.5.0":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.5.0","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.5.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"a3d7ef8d3adbf498c6ffb9a16eb06db2d58cc22b","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.5.0.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.5.1":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.5.1","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.5.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"777558e5f234f6d9ee739df9faaf10066798e115","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.5.1.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.5.2":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.5.2","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.5.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"a7d6b112aafa1acd55207a4600ffb72473354b36","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.5.2.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.6.0":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.6.0","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.6.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"52f202b23c3dfb622e29f17a2e225a40c5545804","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.6.0.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.6.1":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.6.1","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.6.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"1a6cb661b66ea129c5ffce7a471fd022bfd6cd69","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.6.1.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.6.2":{"name":"bluesky","description":"A node.js library for accessing Azure REST-based services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"git://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.6.2","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","_npmUser":{"name":"pofallon","email":"paul@ofallonfamily.com"},"_id":"bluesky@0.6.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"878e76be1eb8343f77ad5c442a2302e02b2a3201","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.6.2.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]},"0.6.3":{"name":"bluesky","description":"A node.js library for accessing Azure services","keywords":["azure","cloud","paas"],"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"homepage":"https://github.com/pofallon/node-bluesky","repository":{"type":"git","url":"https://github.com/pofallon/node-bluesky.git"},"scripts":{"test":"nodeunit test"},"dependencies":{"memorystream":"0.0.x","mime":"1.x.x","node-uuid":"1.x.x","underscore":"1.x.x","azure":">=0.5.3"},"devDependencies":{"nodeunit":"0.x.x","loremipstream":"0.0.x"},"engine":"node >= 0.6.0","version":"0.6.3","files":["index.js","lib","package.json","README.md","test","longtest"],"main":"index","license":"MIT","readme":"# node-bluesky\r\nA lightweight, simplified node.js library for accessing Windows Azure storage\r\n\r\n## Usage\r\n\r\n```javascript\r\nvar s = require('bluesky').storage({account: 'account', key: 'key'});\r\n\r\n// queues, with events\r\nvar q = s.queue('happenings');\r\nq.on('message', function(msg, done) {\r\n  console.log(msg);\r\n  done();\r\n});\r\nq.poll(10000);\r\n\r\n// blobs, as streams\r\nvar c1 = s.container('new');\r\nvar c2 = s.container('old');\r\nc1.get('readme.txt').pipe(c2.put('archive.txt'));\r\n\r\n// and tables, oh my! \r\nvar t = s.table('folks');\r\nt.filter({'isPremium': true}).rows().on('data', function(err, row) {\r\n  console.log(row.user + ', ' + row.visits + ', ' + row.isPremium);\r\n});\r\n\r\n```\r\n\r\nSee the [tests](node-bluesky/tree/master/test) for additional examples, and the [wiki](node-bluesky/wiki) for API documentation and a Road Map.\r\n\r\n## Install\r\n\r\n<pre>\r\n  npm install bluesky\r\n</pre>\r\n\r\n## Platform Support\r\n\r\nThe library can used with both Windows and non-Windows versions of node.js\r\n\r\n## Dependencies\r\n\r\nThis library depends on:\r\n\r\n* [bentomas/node-mime](/bentomas/node-mime)\r\n* [broofa/node-uuid](/broofa/node-uuid)\r\n* [documentcloud/underscore](/documentcloud/underscore)\r\n* [JSBizon/memorystream](/JSBizon/memorystream)\r\n* [WindowsAzure/azure-sdk-for-node](/WindowsAzure/azure-sdk-for-node)\r\n\r\n... and for unit tests:\r\n\r\n* [caolan/nodeunit](/caolan/nodeunit)\r\n* [pofallon/loremipstream](/pofallon/loremipstream)\r\n\r\n## Special Thanks\r\n\r\n…to Cerebrata for [Cloud Storage Studio](http://www.cerebrata.com/products/cloudstoragestudio/) - an indispensible tool (along with [fiddler2](http://www.fiddler2.com/fiddler2/)) in the node-bluesky debugging process!\r\n","_id":"bluesky@0.6.3","dist":{"shasum":"a86ce73611da1a91e5bbfd1f81f510889c726018","tarball":"http://registry.npmjs.org/bluesky/-/bluesky-0.6.3.tgz"},"maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}]}},"readme":"# node-bluesky\nA node.js library for accessing the Windows Azure REST API's.\n\n## Usage\n\n```javascript\nvar s = require('bluesky').storage({account: 'account', key: 'key'});\n\n// queues, with events\nvar q = s.queue('happenings');\nq.on('message', function(m) {\n  console.log(m.body);\n});\nq.poll(10000);\n\n// blobs, as streams\nvar c1 = s.container('new');\nvar c2 = s.container('old');\nc1.get('readme.txt').pipe(c2.put('archive.txt'));\n\n// and tables, oh my! \nvar t = s.table('folks');\nt.filter({'user': 'joe', 'visits': 1, 'isPremium': true}).forEach(function(err, row) {\n  console.log(row.user + ', ' + row.visits + ', ' + row.isPremium);\n});\n\n// * Note that blob support is only preliminary and still needs work\n```\n\nSee the [tests](node-bluesky/tree/master/test) for additional examples, and the [wiki](node-bluesky/wiki) for API documentation and a Road Map.\n\n## Install\n\n<pre>\n  npm install bluesky\n</pre>\n\n## Platform Support\n\nThe library can used with both Windows and non-Windows versions of node.js\n\n## Dependencies\n\nThis library depends on:\n\n* [mikeal/request](https://github.com/mikeal/request)\n* [felixge/node-dateformat](https://github.com/felixge/node-dateformat)\n* [isaacs/sax-js](https://github.com/isaacs/sax-js)\n* [JSBizon/memorystream](https://github.com/JSBizon/memorystream)\n* [caolan/nodeunit](https://github.com/caolan/nodeunit) (for unit tests)\n\n## Special Thanks\n\n…to Cerebrata for [Cloud Storage Studio](http://www.cerebrata.com/products/cloudstoragestudio/) - an indispensible tool (along with [fiddler2](http://www.fiddler2.com/fiddler2/)) in the node-bluesky debugging process!\n\n## TODO\n\n* Finish table, add blob and queue API's\n* Management API's\n* AppFabric API's\n","maintainers":[{"name":"pofallon","email":"paul@ofallonfamily.com"}],"time":{"modified":"2012-08-13T23:48:04.281Z","created":"2011-11-17T03:39:22.539Z","0.3.0":"2011-11-17T03:39:23.174Z","0.4.0":"2012-01-20T03:55:17.926Z","0.5.0alpha":"2012-04-17T02:43:48.961Z","0.5.0":"2012-04-29T17:47:52.705Z","0.5.1":"2012-04-29T20:21:45.685Z","0.5.2":"2012-07-04T21:32:46.140Z","0.6.0":"2012-07-13T00:02:27.880Z","0.6.1":"2012-07-15T14:21:40.232Z","0.6.2":"2012-07-17T16:43:50.987Z","0.6.3":"2012-08-13T23:48:04.281Z"},"author":{"name":"Paul O'Fallon","email":"paul@ofallonfamily.com"},"repository":{"type":"git","url":"https://github.com/pofallon/node-bluesky.git"},"_attachments":{"bluesky-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-noAUw7L///GBStpubmY4ag==","length":10805,"stub":true},"bluesky-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-LU+JvmylqUgv4JYfDWgcFw==","length":10816,"stub":true},"bluesky-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-adxTuRo2sdhGIT3zUjMZ3g==","length":10831,"stub":true},"bluesky-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-iFQjK5HQFBg1uzuNzIUoCg==","length":10779,"stub":true},"bluesky-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-gqOKDV27GaQDS36+tUUS3A==","length":10642,"stub":true},"bluesky-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Zenq5DSpwdQP+PjARgLKYg==","length":10575,"stub":true},"bluesky-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-tI6W0EaFOYuXUM+8bLte0A==","length":10362,"stub":true},"bluesky-0.5.0alpha.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RsF2xcT3Y2nZ7bMtbwU2yA==","length":10424,"stub":true},"bluesky-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1sQcSZhO6FmzmHXzNsatEw==","length":12051,"stub":true},"bluesky-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eBnqAqn8qyFxZTkHDls1mg==","length":10240,"stub":true}}}},
{"id":"bm-generator","key":"bm-generator","value":{"rev":"3-65612ac2c2741340bde1ff242fd8433e"},"doc":{"_id":"bm-generator","_rev":"3-65612ac2c2741340bde1ff242fd8433e","name":"bm-generator","description":"Generate bookmarklet project","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"author":{"name":"Temnov Kirill, @selead"},"name":"bm-generator","description":"Generate bookmarklet project","version":"0.2.0","repository":{"type":"git","url":"git://github.com/selead/bm-generator.git"},"bin":{"bm-generator":"./bin/bm-generator"},"main":"index.coffee","engines":{"node":"0.6.x"},"dependencies":{"optimist":"*"},"_npmUser":{"name":"selead","email":"allselead@gmail.com"},"_id":"bm-generator@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1f43a5482198f5d2d36cdfb9751ee35b75e6d259","tarball":"http://registry.npmjs.org/bm-generator/-/bm-generator-0.2.0.tgz"},"maintainers":[{"name":"selead","email":"allselead@gmail.com"}]}},"readme":"# Bookmarklet project generator\n\nQuick way to create bookmarklet from command line.\n\n## Install via `npm`\n\nAdd `-g` for enable package shell command.\n\n    ```bash\n    npm install bm-genarator -g\n    ```\n    \n## Usage\n\n### Create project\n\n  Go to target folder and type\n  \n    ```bash\n    bm-generator myproject -u http://example.com/js/bm.js\n    ```\n\n  Set `-u` option to actual bookmarklet position\n  \n  File `bm.js.copy` will contain bookmarklet content that must be inserted \n  into browser's bookmarklets.\n\n  Add options to extend functionality:\n  \n  -  `-z` - include zepto.js framework\n  -  `-g` - enable git for project\n  -  `-S` - path to Amazon S3 bucket and folder, where bookmarklet will putted.\n            You'll need `s3cmd` for use this option.\n  \n### Use project\n  \n  Update bookmarklet.coffee and run\n  \n    ```bash\n    ./generator\n    ```\n    \n  This create bookmarklet file in `./out/bm.js`. Copy it to destignation.\n  If `-S` option was set on creating project, bm.js will be pushed to Amazon S3.\n  \n## Licence\n\n(The MIT License)\n\nCopyright (c) 2012 Temnov Kirill <allselead@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"selead","email":"allselead@gmail.com"}],"time":{"modified":"2012-06-19T03:30:28.776Z","created":"2012-06-19T03:30:26.996Z","0.2.0":"2012-06-19T03:30:28.776Z"},"author":{"name":"Temnov Kirill, @selead"},"repository":{"type":"git","url":"git://github.com/selead/bm-generator.git"},"_attachments":{"bm-generator-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-u4kJBhMYOQiLJanJc1zIlQ==","length":10240,"stub":true}}}},
{"id":"bmi","key":"bmi","value":{"rev":"9-5a9195f0a323393f73a1570b4e241100"},"doc":{"_id":"bmi","_rev":"9-5a9195f0a323393f73a1570b4e241100","name":"bmi","description":"Body Mass Index","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"author":{"name":"Narciso","email":"narciso.guillen@tangosource.com"},"name":"bmi","description":"Body Mass Index","version":"0.0.1","repository":{"url":""},"main":"bmi","engines":{"node":"~0.6.5"},"dependencies":{},"devDependencies":{},"scripts":{"test":"make test"},"_npmUser":{"name":"narciso","email":"narciso.guillen@tangosource.com"},"_id":"bmi@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c4a7a37217820396e91216ee1aad621fb02f3c8f","tarball":"http://registry.npmjs.org/bmi/-/bmi-0.0.1.tgz"},"maintainers":[{"name":"narciso","email":"narciso.guillen@tangosource.com"}]},"0.1.0":{"author":{"name":"Narciso","email":"narciso.guillen@tangosource.com"},"name":"bmi","description":"Body Mass Index","version":"0.1.0","repository":{"url":"git://github.com/tangosource/bmi_node.git"},"main":"bmi","engines":{"node":"~0.6.5"},"dependencies":{},"devDependencies":{"unitnode":"~0.6.4"},"scripts":{"test":"make test"},"_npmUser":{"name":"narciso","email":"narciso.guillen@tangosource.com"},"_id":"bmi@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4bb0d6a2ae47a4831ed5e4b33049310e9afd5cea","tarball":"http://registry.npmjs.org/bmi/-/bmi-0.1.0.tgz"},"maintainers":[{"name":"narciso","email":"narciso.guillen@tangosource.com"}]},"0.1.1":{"author":{"name":"Narciso","email":"narciso.guillen@tangosource.com"},"name":"bmi","url":"https://github.com/tangosource/bmi_node","description":"Body Mass Index","version":"0.1.1","repository":{"type":"git","url":"git://github.com/tangosource/bmi_node.git"},"main":"bmi","engines":{"node":"~0.6.5"},"dependencies":{},"devDependencies":{"unitnode":"~0.6.4"},"scripts":{"test":"make test"},"_npmUser":{"name":"narciso","email":"narciso.guillen@tangosource.com"},"_id":"bmi@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"355a917042065a424b46097680a6fefb51eb5dbc","tarball":"http://registry.npmjs.org/bmi/-/bmi-0.1.1.tgz"},"maintainers":[{"name":"narciso","email":"narciso.guillen@tangosource.com"}]},"0.2.0":{"author":{"name":"Narciso","email":"narciso.guillen@tangosource.com"},"name":"bmi","description":"Body Mass Index","version":"0.2.0","repository":{"url":""},"main":"bmi","engines":{"node":"~0.6.5"},"dependencies":{},"devDependencies":{},"scripts":{"test":"make test"},"_npmUser":{"name":"narciso","email":"narciso.guillen@tangosource.com"},"_id":"bmi@0.2.0","optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.21","_nodeVersion":"v0.7.9-pre","_defaultsLoaded":true,"dist":{"shasum":"0739fd1c893403cf4bf61ddcce9de19af08f9ff0","tarball":"http://registry.npmjs.org/bmi/-/bmi-0.2.0.tgz"},"maintainers":[{"name":"narciso","email":"narciso.guillen@tangosource.com"}]}},"readme":"Body Mass Index\n===============\n\nImperial BMI Formula\n--------------------\nIn order to determinate BMI:\n\n* Weight :kilogrmas.\n* Height :meters.\n\n### Public Methods\n\n- weight();\n- height();\n- bmi();\n- prime();\n- prcnt();\n- cases();\n\nExample:\n\n>bmi.weight(80,'k'); \n>bmi.height(1.7,'m');\n>bmi.bmi();\n>bmi.prime();\n>bmi.prcnt();\n>bmi.cases();\n\nResults:\n\n80                          // 80 kilograms\n1.7                         // 1.7 meters\n27.68166089965398           // your body mass index\n1.1072664359861593          // bmi'\n10.726643598615926          // you are 10% OVER your ideal weight\n'Overweight'                // you have 'Overweight'\n\n\nMetric Imperial BMI Formula\n---------------------------\n\nIn order to determinate BMI:\n\n* Weight :kilogrmas.\n* Height :meters.\n\n### Public Methods\n\n- weight();\n- height();\n- bmi();\n- prime();\n- prcnt();\n- cases();\n\nExample:\n\n>bmi.weight(120,'p'); \n>bmi.height(63,'i');\n>bmi.bmi();\n>bmi.prime();\n>bmi.prcnt();\n>bmi.cases();\n\nResults:\n\n54.4310844              // 54.43 kilograms\n1.6001999999999998      // 1.600 meters\n21.256827804660904      // your body mass index\n0.8502731121864362      // bmi'\n-14.97268878135638      // you are 14% UNDER your ideal weight\n'Normal'                // you are 'Normal'\n","maintainers":[{"name":"narciso","email":"narciso.guillen@tangosource.com"}],"time":{"modified":"2012-06-09T17:15:12.323Z","created":"2011-12-07T02:20:50.183Z","0.0.1":"2011-12-07T02:20:52.112Z","0.1.0":"2011-12-07T18:33:56.897Z","0.1.1":"2011-12-07T18:43:14.770Z","0.2.0":"2012-06-09T17:15:12.323Z"},"author":{"name":"Narciso","email":"narciso.guillen@tangosource.com"},"repository":{"url":""},"_attachments":{"bmi-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fvKNjj2Kw1nPwvSmDs90wA==","length":1437,"stub":true},"bmi-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Ged1Ouni53H9cfBsmr4ucg==","length":10240,"stub":true},"bmi-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kz1CnBAPwKdTvUedQNKzDg==","length":10240,"stub":true},"bmi-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-00fQ6GbxmRtoo961bl2j2A==","length":10240,"stub":true}}}},
{"id":"bn-lang","key":"bn-lang","value":{"rev":"3-266f186334f69448a940081589e82b04"},"doc":{"_id":"bn-lang","_rev":"3-266f186334f69448a940081589e82b04","name":"bn-lang","description":"JavaScript extensions and additions for browsers and node.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bn-lang","description":"JavaScript extensions and additions for browsers and node.js","url":"http://github.com/ulueware/bd-lang","keywords":["JavaScript","extensions","additions","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{},"lib":".","main":"bn-lang.js","version":"1.0.0","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"_id":"bn-lang@1.0.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f30ba946213053b2e68ce9ba9a96a2c2378e2c6e","tarball":"http://registry.npmjs.org/bn-lang/-/bn-lang-1.0.0.tgz"}}},"maintainers":[{"name":"ulueware","email":"mathew.sheets@ulueware.com"}],"time":{"modified":"2011-02-22T16:25:03.431Z","created":"2011-02-22T16:25:03.221Z","1.0.0":"2011-02-22T16:25:03.431Z"},"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"_attachments":{"bn-lang-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yFIeqZTBj3aDna9J8b70LA==","length":56157,"stub":true}}}},
{"id":"bn-lang-util","key":"bn-lang-util","value":{"rev":"3-0bc44f1d7d3746120dd835bfb685e229"},"doc":{"_id":"bn-lang-util","_rev":"3-0bc44f1d7d3746120dd835bfb685e229","name":"bn-lang-util","description":"JavaScript utilities for browsers and node.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bn-lang-util","description":"JavaScript utilities for browsers and node.js","url":"http://github.com/ulueware/bn-lang-util","keywords":["JavaScript","utilities","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{"bn-lang":">=1.0.0"},"lib":".","main":"bn-lang-util.js","version":"1.0.0","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"_id":"bn-lang-util@1.0.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3e364afcd6293068822bd76e90493e979d1cfada","tarball":"http://registry.npmjs.org/bn-lang-util/-/bn-lang-util-1.0.0.tgz"}}},"maintainers":[{"name":"ulueware","email":"mathew.sheets@ulueware.com"}],"time":{"modified":"2011-02-22T16:31:58.247Z","created":"2011-02-22T16:31:57.874Z","1.0.0":"2011-02-22T16:31:58.247Z"},"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"_attachments":{"bn-lang-util-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oS+t1waZDyiTwY45SsFEdA==","length":63779,"stub":true}}}},
{"id":"bn-log","key":"bn-log","value":{"rev":"5-db81a8a978071efd24b45e350e8b8954"},"doc":{"_id":"bn-log","_rev":"5-db81a8a978071efd24b45e350e8b8954","name":"bn-log","description":"JavaScript logging framework (much like log4j || log4net) for browsers and node.js","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"bn-log","description":"JavaScript logging framework (much like log4j || log4net) for browsers and node.js","url":"http://github.com/ulueware/bn-log","keywords":["JavaScript","logging","browsers","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{"bn-lang":">=1.0.0","bn-lang-util":">=1.0.0"},"lib":".","main":"bn-log.js","version":"1.0.0","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"_id":"bn-log@1.0.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e79157db6f2ed01f93f1164e9fa7cb13516a0da6","tarball":"http://registry.npmjs.org/bn-log/-/bn-log-1.0.0.tgz"}},"1.0.1":{"name":"bn-log","description":"JavaScript logging framework (much like log4j || log4net) for browsers and node.js","url":"http://github.com/ulueware/bn-log","keywords":["JavaScript","logging","browsers","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{"bn-lang":">=1.0.0","bn-lang-util":">=1.0.0"},"lib":".","main":"bn-log.js","version":"1.0.1","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"devDependencies":{},"_id":"bn-log@1.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b70a59ed71e1203d8d43c934ce60b11026074a67","tarball":"http://registry.npmjs.org/bn-log/-/bn-log-1.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"ulueware","email":"mathew.sheets@ulueware.com"}],"time":{"modified":"2011-07-08T18:18:14.237Z","created":"2011-02-22T19:08:47.717Z","1.0.0":"2011-02-22T19:08:47.876Z","1.0.1":"2011-07-08T18:18:14.237Z"},"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"_attachments":{"bn-log-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-u67jUm+AD3qCsqQkECxibw==","length":56779,"stub":true},"bn-log-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L5kai2dkTGFSpfBwi3vdVw==","length":60498,"stub":true}}}},
{"id":"bn-template","key":"bn-template","value":{"rev":"3-604e77465ab1dc7e17f3b325089651ec"},"doc":{"_id":"bn-template","_rev":"3-604e77465ab1dc7e17f3b325089651ec","name":"bn-template","description":"JavaScript templating for browsers and node.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bn-template","description":"JavaScript templating for browsers and node.js","url":"http://github.com/ulueware/bn-template","keywords":["JavaScript","template","view","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{},"lib":".","main":"bn-template.js","version":"1.0.0","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"_id":"bn-template@1.0.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1522ec3c7f0b464d4719eec7e98dd015a58d7db2","tarball":"http://registry.npmjs.org/bn-template/-/bn-template-1.0.0.tgz"}}},"maintainers":[{"name":"ulueware","email":"mathew.sheets@ulueware.com"}],"time":{"modified":"2011-03-02T21:42:46.910Z","created":"2011-03-02T21:42:46.385Z","1.0.0":"2011-03-02T21:42:46.910Z"},"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"_attachments":{"bn-template-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+cCq6bQPI12ZBsmAqYOPDQ==","length":55867,"stub":true}}}},
{"id":"bn-time","key":"bn-time","value":{"rev":"3-9c33587e783a98e1ccea409cacd5bbfb"},"doc":{"_id":"bn-time","_rev":"3-9c33587e783a98e1ccea409cacd5bbfb","name":"bn-time","description":"JavaScript scheduler/timer for browsers and node.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bn-time","description":"JavaScript scheduler/timer for browsers and node.js","url":"http://github.com/ulueware/bn-time","keywords":["JavaScript","scheduler","timer","task","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{"bn-lang":">=1.0.0"},"lib":".","main":"bn-time.js","version":"1.0.0","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"_id":"bn-time@1.0.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e6b76ef3a769688f39c8c5cb9ffdfe94a35f4766","tarball":"http://registry.npmjs.org/bn-time/-/bn-time-1.0.0.tgz"}}},"maintainers":[{"name":"ulueware","email":"mathew.sheets@ulueware.com"}],"time":{"modified":"2011-02-22T18:36:26.526Z","created":"2011-02-22T18:36:25.821Z","1.0.0":"2011-02-22T18:36:26.526Z"},"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"_attachments":{"bn-time-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Wo+/2TJ8PthN3TzE+OtUIw==","length":51164,"stub":true}}}},
{"id":"bn-unit","key":"bn-unit","value":{"rev":"3-5f35e3fd446241f682231bedcf846c0a"},"doc":{"_id":"bn-unit","_rev":"3-5f35e3fd446241f682231bedcf846c0a","name":"bn-unit","description":"JavaScript unit test framework (much like JUnit || NUnit) for browsers and node.js","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bn-unit","description":"JavaScript unit test framework (much like JUnit || NUnit) for browsers and node.js","url":"http://github.com/ulueware/bn-unit","keywords":["JavaScript","unit testing","browsers","node.js"],"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"contributors":[],"licenses":["MIT"],"dependencies":{},"lib":".","main":"bn-unit.js","version":"1.0.0","directories":{"src":"./src","test":"./test"},"engines":{"node":">= 0.4.0"},"_id":"bn-unit@1.0.0","_engineSupported":true,"_npmVersion":"0.3.0-8","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b1a79e66bbc6b52202044f47917d115c1c0800be","tarball":"http://registry.npmjs.org/bn-unit/-/bn-unit-1.0.0.tgz"}}},"maintainers":[{"name":"ulueware","email":"mathew.sheets@ulueware.com"}],"time":{"modified":"2011-02-22T16:05:02.621Z","created":"2011-02-22T16:05:02.462Z","1.0.0":"2011-02-22T16:05:02.621Z"},"author":{"name":"ulueware","email":"mathew.sheets@ulueware.com"},"_attachments":{"bn-unit-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-41qsJGa6H6vHZJKH/8cbRw==","length":12584,"stub":true}}}},
{"id":"bncode","key":"bncode","value":{"rev":"13-87e3f51f6eab9e6edaece45521970454"},"doc":{"_id":"bncode","_rev":"13-87e3f51f6eab9e6edaece45521970454","name":"bncode","description":"bittorrent bencoding and decoding.","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.3":{"name":"bncode","version":"0.1.3","description":"bittorrent bencoding and decoding.","author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"main":"./bencode.js","repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_id":"bncode@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.9","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"88cad47ea593e8310288d5998d52b0c480de7cc7","tarball":"http://registry.npmjs.org/bncode/-/bncode-0.1.3.tgz"}},"0.1.4":{"name":"bncode","version":"0.1.4","description":"bittorrent bencoding and decoding.","author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"main":"./bencode.js","repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_id":"bncode@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"60e27699f3af26940d6d546f16d1a4284e164b7a","tarball":"http://registry.npmjs.org/bncode/-/bncode-0.1.4.tgz"},"maintainers":[{"name":"a2800276","email":"tim.becker@kuriositaet.de"}]},"0.1.5":{"name":"bncode","version":"0.1.5","description":"bittorrent bencoding and decoding.","author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"main":"./bencode.js","repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_id":"bncode@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"22fbf35b9a505ebc4d5876dda7c5625f10a8f3ff","tarball":"http://registry.npmjs.org/bncode/-/bncode-0.1.5.tgz"},"maintainers":[{"name":"a2800276","email":"tim.becker@kuriositaet.de"}]},"0.2.0":{"name":"bncode","version":"0.2.0","description":"bittorrent bencoding and decoding.","author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"main":"./bencode.js","repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_npmUser":{"name":"a2800276","email":"tim.becker@kuriositaet.de"},"_id":"bncode@0.2.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.9-pre","_defaultsLoaded":true,"dist":{"shasum":"6fe267e884495e3bf4770adfa91f1a874ae9af1e","tarball":"http://registry.npmjs.org/bncode/-/bncode-0.2.0.tgz"},"maintainers":[{"name":"a2800276","email":"tim.becker@kuriositaet.de"}]},"0.2.1":{"name":"bncode","version":"0.2.1","description":"bittorrent bencoding and decoding.","author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"main":"./bencode.js","repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_npmUser":{"name":"a2800276","email":"tim.becker@kuriositaet.de"},"_id":"bncode@0.2.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e99b5e5e4f2088459815d71527f2429574f21e4e","tarball":"http://registry.npmjs.org/bncode/-/bncode-0.2.1.tgz"},"readme":"# bencoding for JS (node.js)\n\n\nThis is a small library to encode and decode bencoded (bittorrent) stuff. \nBencoding is specified [here](http://www.bittorrent.org/beps/bep_0003.html).\n\n\n## Get & Install\n\ngithub repository is [here](https://github.com/a2800276/bencode.js)\n\nInstallable via npm (npm package name is **bncode**, note spelling!):\n\n    npm install bncode\n\n\n## Encoding\n\nEncoding works as follows:\n\n    var benc  = require(\"bencode\"),\n        exmp = {}\n \n    exmp.bla = \"blup\"\n    exmp.foo = \"bar\"\n    exmp.one = 1\n    exmp.woah = {}\n    exmp.woah.arr = []\n    exmp.woah.arr.push(1)\n    exmp.woah.arr.push(2)\n    exmp.woah.arr.push(3)\n    exmp.str = new Buffer(\"Buffers work too\")\n \n    var bencBuffer = benc.encode(exmp)\n \n    // d3:bla4:blup3:foo3:bar3:onei1e4:woahd3:arr \\\n    // li1ei2ei3eee3:str16:Buffers work tooe\n\n\n\n## Decoding\n\nDecoding will work progressively, e.g. if you're receiving partial\nbencoded strings on the network:\n\n    var benc = require(\"bencode\"),\n        buf  = null\n \n    decoder = new bencode.decoder()\n    while (buf = receiveData()) {\n      decoder.decode(buf)\n    }\n    \n    log(decoder.result())\n\n\nOr \"all in one\"\n\n    var benc = require(\"bencode\"),\n        buf  = getBuffer(),\n        dec  = benc.decode(buf)\n \n    log(dec.bla)\n\n\nThere are some subtleties concerning bencoded strings. These are\ndecoded as Buffer objects because they are just strings of raw bytes\nand as such would wreak havoc with multi byte strings in javascript.\n\nThe exception to this is strings appearing as keys in bencoded\ndicts. These are decoded as Javascript Strings, as they should always\nbe strings of (ascii) characters and if they weren't decoded as JS\nStrings, dict's couldn't be mapped to Javascript objects.\n\n\n## Mapping bencoding to Javascript\n\n    \n     +----------------------------------------------------+\n     |                |                                   |\n     |  Bencoded      |    Javascript                     |\n     |====================================================|\n     |  Strings       |    node Buffers, unless they are  |\n     |                |    Dictionary keys, in which case |\n     |                |    they become Javascript Strings |\n     |----------------+-----------------------------------|\n     |  Integers      |    Number                         |\n     |----------------+-----------------------------------|\n     |  Lists         |    Array                          |\n     |----------------+-----------------------------------|\n     |  Dictionaries  |    Object                         |\n     |                |                                   |\n     +----------------------------------------------------+\n\n\n## Mapping Javascript to bencoding\n\nThe code makes a best effort to encode Javascript to bencoding. If you stick to basic \ntypes (Arrays, Objects with String keys and basic values, Strings, Buffers and Numbers) \nyou should encounter suprises. Expect surprises (mainly not being able to round-trip \nencode/decode) if you encode fancy data-types.\n\n\n## Author\n\nbencode.js was written by Tim Becker (tim.becker@kuriositaet.de) I can be reached via \nemail or (preferably) submit a bug to the github repository.\n\n\n## Thanks\n\nRoly Fentanes (fent) for bug reports.\n\n\n## License\n\nMIT, see `LICENSE`\n","maintainers":[{"name":"a2800276","email":"tim.becker@kuriositaet.de"}]},"0.2.2":{"name":"bncode","version":"0.2.2","description":"bittorrent bencoding and decoding.","author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"main":"./bencode.js","repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_npmUser":{"name":"a2800276","email":"tim.becker@kuriositaet.de"},"_id":"bncode@0.2.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e6a60f35e4fa5b79eeffcaf56d4cd5b59c766f26","tarball":"http://registry.npmjs.org/bncode/-/bncode-0.2.2.tgz"},"readme":"# bencoding for JS (node.js)\n\n\nThis is a small library to encode and decode bencoded (bittorrent) stuff. \nBencoding is specified [here](http://www.bittorrent.org/beps/bep_0003.html).\n\n\n## Get & Install\n\ngithub repository is [here](https://github.com/a2800276/bencode.js)\n\nInstallable via npm (npm package name is **bncode**, note spelling!):\n\n    npm install bncode\n\n\n## Encoding\n\nEncoding works as follows:\n\n    var benc  = require(\"bencode\"),\n        exmp = {}\n \n    exmp.bla = \"blup\"\n    exmp.foo = \"bar\"\n    exmp.one = 1\n    exmp.woah = {}\n    exmp.woah.arr = []\n    exmp.woah.arr.push(1)\n    exmp.woah.arr.push(2)\n    exmp.woah.arr.push(3)\n    exmp.str = new Buffer(\"Buffers work too\")\n \n    var bencBuffer = benc.encode(exmp)\n \n    // d3:bla4:blup3:foo3:bar3:onei1e4:woahd3:arr \\\n    // li1ei2ei3eee3:str16:Buffers work tooe\n\n\n\n## Decoding\n\nDecoding will work progressively, e.g. if you're receiving partial\nbencoded strings on the network:\n\n    var benc = require(\"bencode\"),\n        buf  = null\n \n    decoder = new bencode.decoder()\n    while (buf = receiveData()) {\n      decoder.decode(buf)\n    }\n    \n    log(decoder.result())\n\n\nOr \"all in one\"\n\n    var benc = require(\"bencode\"),\n        buf  = getBuffer(),\n        dec  = benc.decode(buf)\n \n    log(dec.bla)\n\n\nThere are some subtleties concerning bencoded strings. These are\ndecoded as Buffer objects because they are just strings of raw bytes\nand as such would wreak havoc with multi byte strings in javascript.\n\nThe exception to this is strings appearing as keys in bencoded\ndicts. These are decoded as Javascript Strings, as they should always\nbe strings of (ascii) characters and if they weren't decoded as JS\nStrings, dict's couldn't be mapped to Javascript objects.\n\n\n## Mapping bencoding to Javascript\n\n    \n     +----------------------------------------------------+\n     |                |                                   |\n     |  Bencoded      |    Javascript                     |\n     |====================================================|\n     |  Strings       |    node Buffers, unless they are  |\n     |                |    Dictionary keys, in which case |\n     |                |    they become Javascript Strings |\n     |----------------+-----------------------------------|\n     |  Integers      |    Number                         |\n     |----------------+-----------------------------------|\n     |  Lists         |    Array                          |\n     |----------------+-----------------------------------|\n     |  Dictionaries  |    Object                         |\n     |                |                                   |\n     +----------------------------------------------------+\n\n\n## Mapping Javascript to bencoding\n\nThe code makes a best effort to encode Javascript to bencoding. If you stick to basic \ntypes (Arrays, Objects with String keys and basic values, Strings, Buffers and Numbers) \nyou should encounter suprises. Expect surprises (mainly not being able to round-trip \nencode/decode) if you encode fancy data-types.\n\n\n## Author\n\nbencode.js was written by Tim Becker (tim.becker@kuriositaet.de) I can be reached via \nemail or (preferably) submit a bug to the github repository.\n\n\n## Thanks\n\nRoly Fentanes (fent) for bug reports.\n\n\n## License\n\nMIT, see `LICENSE`\n","maintainers":[{"name":"a2800276","email":"tim.becker@kuriositaet.de"}]}},"maintainers":[{"name":"a2800276","email":"tim.becker@kuriositaet.de"}],"time":{"modified":"2012-01-20T14:22:17.991Z","created":"2011-02-26T19:51:05.660Z","0.1.3":"2011-02-26T19:51:06.019Z","0.1.4":"2011-08-26T20:34:57.077Z","0.1.5":"2011-08-26T21:42:43.217Z","0.2.0":"2011-10-16T12:43:49.534Z","0.2.1":"2011-12-23T13:48:33.541Z","0.2.2":"2012-01-20T14:22:17.991Z"},"author":{"name":"Tim Becker","email":"tim.becker@kuriositaet.de"},"repository":{"type":"git","url":"git://github.com/a2800276/bencode.js.git"},"_attachments":{"bncode-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-cMzWukP3hU70TZTL17oGnQ==","length":24850,"stub":true},"bncode-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-gh9QAqh3C1tPzOeCfjpE8A==","length":24822,"stub":true},"bncode-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-quT+93u+JgRVB0xczfokcg==","length":71680,"stub":true},"bncode-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-saGgJQRaSBnznvrn/xsY+g==","length":27950,"stub":true},"bncode-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GCj3Cre6XJIBU/h0BqSjpA==","length":7544,"stub":true},"bncode-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-cw2fEnuZQ8uR0tTF/QNyIw==","length":23869,"stub":true}}}},
{"id":"bndlr","key":"bndlr","value":{"rev":"33-0e72a1d729559fddd3a992152d2530c8"},"doc":{"_id":"bndlr","_rev":"33-0e72a1d729559fddd3a992152d2530c8","name":"bndlr","description":"CDN & Dev friendly static content bundler","dist-tags":{"latest":"1.1.3"},"versions":{"0.1.0":{"name":"bndlr","version":"0.1.0","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"d7fdb83f5d5ea25741920f9fc86db05f883e0591","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.0.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.1":{"name":"bndlr","version":"0.1.1","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4af9f84a329a6aea091a0826c0e569a7e0197793","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.1.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.2":{"name":"bndlr","version":"0.1.2","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"82dd4c577ae1b444ce7313650c0f24f8655a8dbd","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.2.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.3":{"name":"bndlr","version":"0.1.3","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4740b2217de4752bd2d5715729169bcd42cf7e38","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.3.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.4":{"name":"bndlr","version":"0.1.4","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e8a199293aa11df35b3859b3558c57fff51d5055","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.4.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.5":{"name":"bndlr","version":"0.1.5","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3354da0536bf25fda122f15b8e721f896bee0fb8","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.5.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.6":{"name":"bndlr","version":"0.1.6","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"453fb329c42d5c1a5e638d8231a10ca4167084b1","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.6.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.7":{"name":"bndlr","version":"0.1.7","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.7","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"cba5e3643ad988ae06061aaf3dcdf024d8734b00","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.7.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.8":{"name":"bndlr","version":"0.1.8","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.4.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.8","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"49b136b2cd27883437280021cf7fc677fa42c3ec","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.8.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"0.1.9":{"name":"bndlr","version":"0.1.9","description":"CDN & Dev freindly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.8.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@0.1.9","dependencies":{},"optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"04d8db9f4fe60c7fc1a4fb8b8c6fc447846bbcdc","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-0.1.9.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"1.0.0":{"name":"bndlr","version":"1.0.0","description":"CDN & Dev friendly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@1.0.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"b23dde839baf0546221ae82f8e1b081ba7b86253","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-1.0.0.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"1.0.1":{"name":"bndlr","version":"1.0.1","description":"CDN & Dev friendly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@1.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"cbd3bb010809b3ea0619cb4d8a928f493bee6b2e","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-1.0.1.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"1.1.0":{"name":"bndlr","version":"1.1.0","description":"CDN & Dev friendly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@1.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"d7a9e978eb54134fca449ae6e65eb10103c482b1","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-1.1.0.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"1.1.1":{"name":"bndlr","version":"1.1.1","description":"CDN & Dev friendly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"_npmUser":{"name":"theozco","email":"wjwicks@gmail.com"},"_id":"bndlr@1.1.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"88a026a9a3180cf603005b7ecfcfdce04a05d300","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-1.1.1.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"1.1.2":{"name":"bndlr","version":"1.1.2","description":"CDN & Dev friendly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"readme":"This is a static content bundler.\n\nObviously I do not have this README done yet.\n\n...until I do, you can check out these example projects I put together:\n\n### [bndlr-basic](https://github.com/williamwicks/bndlr-basic)\n### [bndlr-advanced](https://github.com/williamwicks/bndlr-advanced)\n","_id":"bndlr@1.1.2","dist":{"shasum":"df3678126d8c652a8978f4418587d774d4e0aa54","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-1.1.2.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]},"1.1.3":{"name":"bndlr","version":"1.1.3","description":"CDN & Dev friendly static content bundler","keywords":["bundle","js","css","middleware","bundler","cdn"],"homepage":"http://github.com/williamwicks/bndlr","repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"devDependencies":{"uglify-js":"1.2.x","clean-css":"0.3.x"},"main":"index","engines":{"node":">=0.6.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"readme":"This is a static content bundler.\n\nObviously I do not have this README done yet.\n\n...until I do, you can check out these example projects I put together:\n\n### [bndlr-basic](https://github.com/williamwicks/bndlr-basic)\n### [bndlr-advanced](https://github.com/williamwicks/bndlr-advanced)\n","_id":"bndlr@1.1.3","dist":{"shasum":"43c6cbd488398b0be78b76326cefa4a4f05ab8f4","tarball":"http://registry.npmjs.org/bndlr/-/bndlr-1.1.3.tgz"},"maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}]}},"readme":"This is a static content bundler.","maintainers":[{"name":"theozco","email":"wjwicks@gmail.com"}],"time":{"modified":"2012-08-14T05:35:43.106Z","created":"2012-02-27T22:40:10.826Z","0.1.0":"2012-02-27T22:40:12.191Z","0.1.1":"2012-03-01T17:59:26.696Z","0.1.2":"2012-03-15T06:09:54.592Z","0.1.3":"2012-03-15T22:10:35.875Z","0.1.4":"2012-03-20T20:03:31.787Z","0.1.5":"2012-03-20T21:45:35.735Z","0.1.6":"2012-03-21T20:38:24.882Z","0.1.7":"2012-04-05T17:33:24.603Z","0.1.8":"2012-05-10T02:00:49.750Z","0.1.9":"2012-06-25T18:14:59.250Z","1.0.0":"2012-06-26T16:18:30.885Z","1.0.1":"2012-06-27T22:31:04.807Z","1.1.0":"2012-07-03T04:09:13.161Z","1.1.1":"2012-07-07T00:27:18.243Z","1.1.2":"2012-07-21T21:22:03.356Z","1.1.3":"2012-08-14T05:35:43.106Z"},"author":{"name":"William Wicks","email":"wjwicks@gmail.com"},"repository":{"type":"git","url":"git@github.com:williamwicks/bndlr.git"},"_attachments":{"bndlr-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-ZbYKV2nmgW2VujbAfZ77yQ==","length":11594,"stub":true},"bndlr-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-sTWbpA0Svtu6d2PS8K81qw==","length":11569,"stub":true},"bndlr-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-79dkGe7SAyTidqYaEsQIOA==","length":11503,"stub":true},"bndlr-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-Dsf1UnVaNCCHIbrJY8QnBA==","length":11508,"stub":true},"bndlr-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-pijfa216RnvgxZDx/twBVA==","length":11423,"stub":true},"bndlr-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-8ahCadEMX+utE2mX6vjZHA==","length":11419,"stub":true},"bndlr-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-xwSu3W6jvL35XgS+aigLiQ==","length":11409,"stub":true},"bndlr-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-EOfdmM7UdBwScXfEUKOHdA==","length":11134,"stub":true},"bndlr-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-j/E1BnK/t1AqU23TyfeYRg==","length":11155,"stub":true},"bndlr-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-iSoh5TM749GZ5XoDDcUlEQ==","length":10929,"stub":true},"bndlr-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-AbZ1JVaKYt/vsux7p+0mxQ==","length":10696,"stub":true},"bndlr-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9knZ/W+N5AJuUtR3K341Wg==","length":11239,"stub":true},"bndlr-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-rDZXUzvXOaFBa50RYSY1gQ==","length":9373,"stub":true},"bndlr-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WJ6GwNsAOq6A5nIpXm6bcQ==","length":9427,"stub":true},"bndlr-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-fCBn5YDm6v3whuBEmH4RWw==","length":7984,"stub":true},"bndlr-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5h5kPS3oLODIxTIiqdG2Iw==","length":10240,"stub":true}}}},
{"id":"bnet","key":"bnet","value":{"rev":"9-db07f9421ce523a90c229915e89bfc49"},"doc":{"_id":"bnet","_rev":"9-db07f9421ce523a90c229915e89bfc49","name":"bnet","description":"\"A Node JS wrapper for the Battle.net API\"","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"author":{"name":"Bryan Mikaelian","email":"bryan.mikaelian@gmail.com"},"name":"bnet","description":"\"A Node JS wrapper for the Battle.net API\"","version":"1.0.0","homepage":"https://github.com/bryanmikaelian/battlenet","repository":{"type":"git","url":"git://github.com/bryanmikaelian/battlenet.git"},"main":"./lib/battlenet.js","dependencies":{"scoped-http-client":"0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"},"_id":"bnet@1.0.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5d599e2416621452be6b9bc8e380e7e981184cad","tarball":"http://registry.npmjs.org/bnet/-/bnet-1.0.0.tgz"},"maintainers":[{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"}]},"1.1.0":{"author":{"name":"Bryan Mikaelian","email":"bryan.mikaelian@gmail.com"},"name":"bnet","description":"\"A Node JS wrapper for the Battle.net API\"","version":"1.1.0","homepage":"https://github.com/bryanmikaelian/battlenet","repository":{"type":"git","url":"git://github.com/bryanmikaelian/battlenet.git"},"main":"./lib/battlenet.js","dependencies":{"scoped-http-client":"0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmJsonOpts":{"file":"/Users/bmikaelian/.npm/bnet/1.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bnet@1.1.0","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"30d407e0de19d344eb2872f0dd45a3db23a23b9d","tarball":"http://registry.npmjs.org/bnet/-/bnet-1.1.0.tgz"},"maintainers":[{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"}]},"1.1.1":{"author":{"name":"Bryan Mikaelian","email":"bryan.mikaelian@gmail.com"},"name":"bnet","description":"\"A Node JS wrapper for the Battle.net API\"","version":"1.1.1","homepage":"https://github.com/bryanmikaelian/battlenet","repository":{"type":"git","url":"git://github.com/bryanmikaelian/battlenet.git"},"main":"./lib/battlenet.js","dependencies":{"scoped-http-client":"0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmJsonOpts":{"file":"/Users/bmikaelian/.npm/bnet/1.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bnet@1.1.1","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5283741171ee3d382d612cfb20c93ed845d2c337","tarball":"http://registry.npmjs.org/bnet/-/bnet-1.1.1.tgz"},"maintainers":[{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"}]},"1.2.0":{"author":{"name":"Bryan Mikaelian","email":"bryan.mikaelian@gmail.com"},"name":"bnet","description":"\"A Node JS wrapper for the Battle.net API\"","version":"1.2.0","homepage":"https://github.com/bryanmikaelian/battlenet","repository":{"type":"git","url":"git://github.com/bryanmikaelian/battlenet.git"},"main":"./lib/battlenet.js","dependencies":{"scoped-http-client":"0.9.6"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"},"_id":"bnet@1.2.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"7b264f0003196c2b8cc957ca5884f4f8263aad6f","tarball":"http://registry.npmjs.org/bnet/-/bnet-1.2.0.tgz"},"maintainers":[{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"}]}},"readme":"battlenet\n=========\n\nA wrapper for the Battle.net API written in Node JS\n\nInstall\n=========\n```\nnpm install bnet\n```\n\n\n Usage\n=========\nEach resource allows you to pass in an object with various parameters.\nFor example, here is how you could get a character's profile along with\nthe guild and stats query string parameters:\n\n\n```javascript\nvar char = {\n  region: \"us\",\n  name: \"Uther\",\n  realm: \"Medivh\",\n  fields: [\"guild\", \"stats\"] \n};\n\nbnet.character(char, function(c) {\n  console.log(\"Hello there \" + c.name);  // returns \"Hello there Uther\"\n});\n\n```\n\nAll requests are returned in JSON format, allowing you to easily work\nwith the data collections.\n\n\nMore examples\n=========\n\nSee the examples directory.\n","maintainers":[{"name":"bryanmikaelian","email":"bryan.mikaelian@gmail.com"}],"time":{"modified":"2012-05-07T18:38:17.394Z","created":"2012-04-28T22:49:13.211Z","1.0.0":"2012-04-28T22:49:14.196Z","1.1.0":"2012-05-02T21:44:56.578Z","1.1.1":"2012-05-02T21:46:35.836Z","1.2.0":"2012-05-07T18:38:17.394Z"},"author":{"name":"Bryan Mikaelian","email":"bryan.mikaelian@gmail.com"},"repository":{"type":"git","url":"git://github.com/bryanmikaelian/battlenet.git"},"_attachments":{"bnet-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NOEtIk7sYOjhZ/zi0k/Irg==","length":2761,"stub":true},"bnet-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6sdSaLIRcRuS6/SQKxyQhg==","length":3138,"stub":true},"bnet-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-peWgP1Sa46xpZAFb685Yyg==","length":3135,"stub":true},"bnet-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eUxy9eTi2xrWwx95m+dF7w==","length":2377,"stub":true}}}},
{"id":"bnf","key":"bnf","value":{"rev":"7-13036c5fd614501e88c52b46d9ff6698"},"doc":{"_id":"bnf","_rev":"7-13036c5fd614501e88c52b46d9ff6698","name":"bnf","description":"BNF Compiler, parser, and interpreter framework.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.8beta":{"name":"bnf","description":"BNF Compiler, parser, and interpreter framework.","url":"http://github.com/navstev0/nodebnf","keywords":["parser","interpreter","compiler","bnf","lexical"],"author":{"name":"Steven Adams","email":"steven@consultstevo.com"},"repository":{"type":"git","url":"git://github.com/navstev0/nodebnf.git"},"licenses":["OSL-3.0"],"dependencies":{},"lib":"lib","main":"./lib/compiler.js","version":"0.0.8beta","directories":{"lib":"./lib","examples":"./examples"},"engines":{"node":">= 0.4.11"},"_npmJsonOpts":{"file":"/home/nav-admin/.npm/bnf/0.0.8beta/package/package.json","serverjs":false,"wscript":false,"contributors":false},"_id":"bnf@0.0.8beta","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c955fd7d072b9f687eff1e5ca917e3f18d97f8ec","tarball":"http://registry.npmjs.org/bnf/-/bnf-0.0.8beta.tgz"},"scripts":{},"maintainers":[{"name":"navstev0","email":"steven@consultstevo.com"}]},"0.0.9":{"name":"bnf","description":"BNF Compiler, parser, and interpreter framework.","url":"http://github.com/navstev0/nodebnf","keywords":["parser","interpreter","compiler","bnf","lexical"],"author":{"name":"Steven Adams","email":"steven@consultstevo.com"},"repository":{"type":"git","url":"git://github.com/navstev0/nodebnf.git"},"licenses":["OSL-3.0"],"dependencies":{},"lib":"lib","main":"./lib/compiler.js","version":"0.0.9","directories":{"lib":"./lib","examples":"./examples"},"engines":{"node":">= 0.4.11"},"_npmJsonOpts":{"file":"/home/nav-admin/.npm/bnf/0.0.9/package/package.json","wscript":false,"serverjs":false,"contributors":false},"_id":"bnf@0.0.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"880255d33f0cf86e8b93d1da4d5a33315d6b5c2c","tarball":"http://registry.npmjs.org/bnf/-/bnf-0.0.9.tgz"},"scripts":{},"maintainers":[{"name":"navstev0","email":"steven@consultstevo.com"}]},"0.1.0":{"name":"bnf","description":"BNF Compiler, parser, and interpreter framework.","url":"http://github.com/navstev0/nodebnf","keywords":["parser","interpreter","compiler","bnf","lexical"],"author":{"name":"Steven Adams","email":"steven@consultstevo.com"},"repository":{"type":"git","url":"git://github.com/navstev0/nodebnf.git"},"licenses":["OSL-3.0"],"dependencies":{},"lib":"lib","main":"./lib/compiler.js","version":"0.1.0","directories":{"lib":"./lib","examples":"./examples"},"engines":{"node":">= 0.4.11"},"_npmJsonOpts":{"file":"/home/nav-admin/.npm/bnf/0.1.0/package/package.json","serverjs":false,"wscript":false,"contributors":false},"_id":"bnf@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c8ab124e793df6422628581c6f02472700c37142","tarball":"http://registry.npmjs.org/bnf/-/bnf-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"navstev0","email":"steven@consultstevo.com"}]}},"maintainers":[{"name":"navstev0","email":"steven@consultstevo.com"}],"time":{"modified":"2011-10-04T16:34:39.236Z","created":"2011-09-14T23:00:07.971Z","0.0.8beta":"2011-09-14T23:00:09.724Z","0.0.9":"2011-09-20T17:56:54.144Z","0.1.0":"2011-10-04T16:34:39.236Z"},"author":{"name":"Steven Adams","email":"steven@consultstevo.com"},"repository":{"type":"git","url":"git://github.com/navstev0/nodebnf.git"},"_attachments":{"bnf-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9JomCOdcR1aJG+4eYpuMcw==","length":12905,"stub":true},"bnf-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TNI7ZxdXS2cHlwgycg1nPg==","length":11098,"stub":true},"bnf-0.0.8beta.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-W5kvQiJWp1a8053VUAsD/g==","length":10424,"stub":true}}}},
{"id":"bob","key":"bob","value":{"rev":"50-32f13425ad738fbf563b99d519bb2d8c"},"doc":{"_id":"bob","_rev":"50-32f13425ad738fbf563b99d519bb2d8c","name":"bob","description":"Convention-based build tool for Node.js projects.","dist-tags":{"latest":"0.4.7"},"versions":{"0.1.0":{"name":"bob","description":"A simplistic build script for Node.js libraries, also a deploy and startup script for Express apps.","keywords":["build","deploy","make","cake"],"version":"0.1.0","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin"},"dependencies":{"coffee-script":"1.1.1"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/cliffano/.npm/bob/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bob@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"21cabe0d0eef0c235c418cfac27a52c66a174909","tarball":"http://registry.npmjs.org/bob/-/bob-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.0":{"name":"bob","description":"A minimalistic build script for Node.js projects.","keywords":["build","deploy","make"],"version":"0.2.0","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{},"devDependencies":{"vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/cliffano/.npm/bob/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bob@0.2.0","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"18cec357d7331026f35d35d436031a7560f308f9","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.0.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.1":{"name":"bob","description":"A minimalistic build script for Node.js projects.","keywords":["build","deploy","make"],"version":"0.2.1","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{},"devDependencies":{"vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/w85132/.npm/bob/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bob@0.2.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"be4c7c78c326dee17215fd0935761fbf4dc556b9","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.1.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.2":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","deploy","make"],"version":"0.2.2","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{},"devDependencies":{"vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/w85132/.npm/bob/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bob@0.2.2","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"de1a53e195c63531c419d5e8602653c06a865b8b","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.2.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.3":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","deploy","make"],"version":"0.2.3","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"underscore":"1.1.7"},"devDependencies":{"vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/home/w85132/.npm/bob/0.2.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bob@0.2.3","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"41dca633fde5896b35ebb672ed148636e1a68353","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.3.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.5":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","hint","checkstyle","test","deploy","make"],"version":"0.2.5","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"underscore":"1.1.7"},"devDependencies":{"vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmJsonOpts":{"file":"/Users/cliffano/.npm/bob/0.2.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bob@0.2.5","_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"12884dee472a95ea68591fbc0f5b973beae5c1b4","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.5.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.6":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","hint","checkstyle","test","deploy","make"],"version":"0.2.6","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"jquery":"1.6.3","nomnom":"1.0.0","underscore":"1.1.7"},"devDependencies":{"sandboxed-module":"0.1.1","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.2.6","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"ef49e41858bccf26a3c1c22858f4712e02356ea5","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.6.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.7":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","hint","checkstyle","test","deploy","make"],"version":"0.2.7","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"jquery":"1.6.3","nomnom":"1.0.0","underscore":"1.1.7"},"devDependencies":{"sandboxed-module":"0.1.1","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.2.7","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d181cf93f43658a5e129a729cd67f282c4542044","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.7.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.8":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","hint","checkstyle","test","coverage","deploy","make"],"version":"0.2.8","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"jquery":"1.6.3","nomnom":"1.0.0","underscore":"1.1.7"},"devDependencies":{"sandboxed-module":"0.1.1","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.2.8","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a79356e56fd931686a70a55f39e851faa9243bcf","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.8.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.9":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","nodelint","jshint","jscheckstyle","vows","runforcover","deploy","make"],"version":"0.2.9","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"dateformat":"1.0.2-1.2.3","jquery":"1.6.3","nomnom":"1.0.0","underscore":"1.1.7"},"devDependencies":{"sandboxed-module":"0.1.1","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.2.9","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"79e8bc5801289aafeed27834792b22e9673fa18f","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.9.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.2.10":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","nodelint","jshint","jscheckstyle","vows","runforcover","deploy","make"],"version":"0.2.10","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib"},"dependencies":{"dateformat":"1.0.2-1.2.3","jquery":"1.6.3","nomnom":"1.0.0","underscore":"1.1.7"},"devDependencies":{"sandboxed-module":"0.1.1","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.2.10","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"63d9adcd3cb9dbcb5fec8036d6e63f3b8ed6b85e","tarball":"http://registry.npmjs.org/bob/-/bob-0.2.10.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.3.0":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.3.0","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"scripts":{"test":"vows --spec `find test -name \"*.js\"`"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","jquery":"1.6.3","jscheckstyle":"0.0.4","jshint":"0.5.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","vows":"http://nodeload.github.com/cliffano/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.2","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9f03f2fdb152cd62d48a3912d6708516994809e0","tarball":"http://registry.npmjs.org/bob/-/bob-0.3.0.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.3.1":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.3.1","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"scripts":{"test":"vows --spec `find test -name \"*.js\"`"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jquery":"1.6.3","jscheckstyle":"0.0.4","jshint":"0.5.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","vows":"http://nodeload.github.com/cliffano/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.2","vows":"0.5.9"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0769eba75aea8e23f4c66ca8a193ac46c655aa75","tarball":"http://registry.npmjs.org/bob/-/bob-0.3.1.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.3.2":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.3.2","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"scripts":{"test":"vows --spec `find test -name \"*.js\"`"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jquery":"1.6.3","jscheckstyle":"0.0.4","jshint":"0.5.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","vows":"http://nodeload.github.com/cloudhead/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.2"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"391ff65af0a50a3a5de60615a3f986998fc958ab","tarball":"http://registry.npmjs.org/bob/-/bob-0.3.2.tgz"},"readme":"Bob\n---\n\nA minimalistic build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nUsage\n-----\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment (by default it uses NODE_ENV=development):\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode (generate XML reports):\n\n    BOB_MODE=robot bob style lint test\n\nProject Convention\n------------------\n\n* package.json - project descriptor\n* lib/ - .js library files\n* test/ - .js test files\n* build/ - reserved and generated by Bob to store buildtime reports/artifacts\n* run/ - reserved and generated by Bob to store runtime logs/pids\n* (optional, only relevant when your project is an app) {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n    \nTargets\n-------\n\n* clean - Delete build/ and run/ directories, along with any nohup.* and *.log files\n* style - Run `jscheckstyle` against all .js files under lib/ directory, configurable via {bob.style.files}\n* lint - Run `jshint` or `nodelint` against all .js files under lib/ and test/ directories, configurable via {bob.lint.files}\n* test - Run `vows` against all .js files under test/ directory, configurable via {bob.test.files}. Run `npm test` if scripts.test exists in package.json \n* coverage - Run `vows` against all .js files under test/ directory with coverage flag, configurable via {bob.coverage.files}\n* package - Create a .tar.gz package at build/artifact/ directory, along with md5 and sha1 checksums.\n* package-meta - Add a meta file to build/artifact, along with md5 and sha1 checksums.\n* versionup - Upgrade build version number in package.json\n* versionup-minor - Upgrade minor version number in package.json\n* versionup-major - Upgrade major version number in package.json\n* template - Replace variables in template files with values from package.json. E.g. bob.template config in Config example above, will replace ${version} and ${name} in conf/artifact-meta.json with '0.0.1' and 'myproject'\n* stop - Stop the app. Run `npm stop` if scripts.stop exists in package.json\n* start - Start the app. Run `npm start` if scripts.start exists in package.json\n* restart - Restart the app. Run `npm restart` if scripts.restart exists in package.json\n* status - Display app status\n* nuke - Kill all processes with command containing the word 'node'\n* send - Send the artifacts to {bob.deploy.user}@{bob.deploy.host}:{bob.deploy.port} at {bob.deploy.dir}, remember to configure the private key for the specified user\n* deploy - Send, then unpack the main .tar.gz artifact\n* deploy-r - Deploy the package and then remotely restart the app\n\nConfig\n------\n\nBob reads package.json file.\nNOTE:\n\n* each property under \"bob\" is *optional*\n* bob property value with ${name} or ${version} will be populated with name and version values accordingly\n\nExample:\n\n    {\n        \"name\": \"myproject\",\n        \"version\": \"0.0.1\",\n        \"bob\": {\n            \"src\": {\n                \"dir\": \"mysrc/\"\n            },\n            \"style\": {\n                \"files\": \"foo.js bar/\",\n                \"opts\": \"--checkstyle\"\n            },\n            \"lint\": {\n                \"files\": \"foo.js bar/\",\n                \"opts\": \"--jslint-reporter --config path/to/hintconfig.js\"\n            },\n            \"lintstrict\": {\n                \"files\": \"foo.js bar/\",\n                \"opts\": \"--reporter path/to/lintreporter.js --config path/to/lintconfig.js\"\n            },\n            \"test\": {\n                \"files\": \"bar/*.js\",\n                \"opts\": \"--dot-matrix\"\n            },\n            \"coverage\": {\n                \"files\": \"bar/*.js\",\n                \"opts\": \"--cover-html\"\n            },\n            \"packagemeta\": {\n                \"dir\": \"conf\",\n                \"file\": \"artifact-meta.json\"\n            },\n            \"template\": {\n                \"conf/artifact-meta.json\": [\"version\", \"name\"]\n            },\n            \"deploy\": {\n                \"user\": \"myuser\",\n                \"key\": \"/local/path/to/mykey\"\n                \"host\": \"myremotehost\",\n                \"port\": 22,\n                \"dir\": \"/remote/path/to/${name}/${version}\"\n            }\n        }\n    }\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.3.3":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.3.3","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"scripts":{"test":"npm install -g bob; bob clean lint test coverage;"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.4","jshint":"0.5.7","ndoc":"1.0.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","valentine":"1.4.7","vows":"http://nodeload.github.com/cloudhead/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.3.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e4a533715d33f2455908991f43b25fad0693dbfc","tarball":"http://registry.npmjs.org/bob/-/bob-0.3.3.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.3.4":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.3.4","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"scripts":{"test":"npm install -g bob; bob clean lint test coverage;"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.4","jshint":"0.5.7","ndoc":"1.0.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","valentine":"1.4.7","vows":"http://nodeload.github.com/cloudhead/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.3.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"11b8e6ed3b12f50b8a9e4b25f9d48b8b779fcd22","tarball":"http://registry.npmjs.org/bob/-/bob-0.3.4.tgz"},"readme":"Bob [![http://travis-ci.org/cliffano/bob](https://secure.travis-ci.org/cliffano/bob.png?branch=master)](http://travis-ci.org/cliffano/bob)\n---\n\nConvention-based build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nProject Convention\n------------------\n\nMandatory:\n\n* package.json - project descriptor file\n* lib/ - directory containing JavaScript library files\n* test/ - directory containing JavaScript test files\n\nOptional (only relevant when project is an app):\n\n* {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n* run/ - directory containing any runtime information like pid or log files\n\nReserved and generated by Bob:\n\n* build/ - directory containing build reports and artifacts\n\nUsage\n-----\n\nBob can be run from the project root directory (same level as package.json file).\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment:\n(if unspecified, NODE_ENV defaults to 'development')\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode and generate XML reports:\n(if unspecified, BOB_MODE defaults to 'human')\n\n    BOB_MODE=robot bob lint test\n    \nTargets\n-------\n\n<table>\n  <tr>\n    <td>dep</td>\n    <td>Install all dependencies specified in package.json file by executing <code>npm install .</code> .</td>\n  </tr>\n  <tr>\n    <td>tools</td>\n    <td>Install all Bob dependencies having binary executablein the global scope.</td>\n  </tr>\n  <tr>\n    <td>clean</td>\n    <td>Delete build/ and run/ directories, along with any nohup.* and *.log files.</td>\n  </tr>\n  <tr>\n    <td>lint</td>\n    <td>Run <a href=http://github.com/jshint/node-jshint\">jshint/node-jshint</a> or <a href=http://github.com/tav/nodelint\">tav/nodelint</a> against all .js files in lib/ and test/ directories.</td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>Run <a href=http://github.com/nomiddlename/jscheckstyle\">nomiddlename/jscheckstyle</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>test</td>\n    <td>Run <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ directory.</td>\n  </tr>\n  <tr>\n    <td>coverage <code>(experimental)</code></td>\n    <td>Run <a href=http://github.com/visionmedia/node-jscoverage\">visionmedia/node-jscoverage</a> via <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ and lib/ directories.</td>\n  </tr>\n  <tr>\n    <td>doc</td>\n    <td>Run <a href=http://github.com/nodeca/ndoc\">nodeca/ndoc</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>versionup</td>\n    <td>Upgrade patch version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-minor</td>\n    <td>Upgrade minor version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-major</td>\n    <td>Upgrade major version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>template <code>(experimental)</code></td>\n    <td>Populate variables in template files with values from package.json file.</td>\n  </tr>\n  <tr>\n    <td>stop</td>\n    <td>Stop the app by executing <code>node {name}.js stop</code> .</td>\n  </tr>\n  <tr>\n    <td>start</td>\n    <td>Start the app by executing <code>node {name}.js start</code> .</td>\n  </tr>\n  <tr>\n    <td>restart</td>\n    <td>Restart the app by executing <code>node {name}.js restart</code> .</td>\n  </tr>\n  <tr>\n    <td>status</td>\n    <td>Display app status by executing <code>node {name}.js status</code> .</td>\n  </tr>\n  <tr>\n    <td>nuke</td>\n    <td>Kill all processes with command containing the word 'node' .</td>\n  </tr>\n  <tr>\n    <td>package</td>\n    <td>Create a .tar.gz package file at build/artifact/ directory, along with md5 and sha1 checksums of the package file.</td>\n  </tr>\n  <tr>\n    <td>package-meta <code>(experimental)</code></td>\n    <td>Create a meta file to build/artifact, along with md5 and sha1 checksums of the meta file.</td>\n  </tr>\n  <tr>\n    <td>deploy <code>(experimental)</code></td>\n    <td>Upload the .tar.gz package file to a remote location, either via SCP or FTP.</td>\n  </tr>\n  <tr>\n    <td>deploy-unpack <code>(experimental)</code></td>\n    <td>Deploy, then remotely unpack the .tar.gz package file via SSH.</td>\n  </tr>\n  <tr>\n    <td>deploy-restart <code>(experimental)</code></td>\n    <td>Deploy, unpack, then remotely execute <code>node {name.js} restart</code> .</td>\n  </tr>\n</table>\n\nContinuous Integration\n----------------------\n\n###Travis CI\n\nAdd this scripts.test to project's package.json file:\n\n    {\n      \"scripts\": {\n        \"test\": \"npm install -g bob; bob clean lint test coverage;\"\n      }\n    }\n\n###Jenkins CI\n\nInstall Bob on the server, then configure a job with shell script build step:\n\n    bob clean lint test coverage;\n\nConfig\n------\n\nTODO\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.0":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.0","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.4","jshint":"0.5.7","ndoc":"1.0.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","valentine":"1.4.7","vows":"http://nodeload.github.com/cloudhead/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c14f05d20363b80fd1a373aec7e7850cc2bbaec5","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.0.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.1":{"name":"bob","description":"A minimalistic build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.1","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.4","jshint":"0.5.7","ndoc":"1.0.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","valentine":"1.4.7","vows":"http://nodeload.github.com/cloudhead/vows/tarball/master"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"b067f6092f70e541715125ff001953b8af10a1d6","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.1.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.2":{"name":"bob","description":"Convention-based build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.2","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.4","jshint":"0.5.7","ndoc":"1.0.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","valentine":"1.4.7","vows":"0.6.2"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f229a7ece175456cd4884391ef6189de20d30ce3","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.2.tgz"},"readme":"Bob [![http://travis-ci.org/cliffano/bob](https://secure.travis-ci.org/cliffano/bob.png?branch=master)](http://travis-ci.org/cliffano/bob)\n---\n\nConvention-based build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nProject Convention\n------------------\n\nMandatory:\n\n* package.json - project descriptor file\n* lib/ - directory containing JavaScript library files\n* test/ - directory containing JavaScript test files\n\nOptional (only relevant when project is an app):\n\n* {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n* run/ - directory containing any runtime information like pid or log files\n\nReserved and generated by Bob:\n\n* build/ - directory containing build reports and artifacts\n\nUsage\n-----\n\nBob can be run from the project root directory (same level as package.json file).\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment:\n(if unspecified, NODE_ENV defaults to 'development')\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode and generate XML reports:\n(if unspecified, BOB_MODE defaults to 'human')\n\n    BOB_MODE=robot bob lint test\n    \nTargets\n-------\n\n<table>\n  <tr>\n    <td>dep</td>\n    <td>Install all dependencies specified in package.json file by executing <code>npm install .</code> .</td>\n  </tr>\n  <tr>\n    <td>tools</td>\n    <td>Install all Bob CLI dependencies in global scope.</td>\n  </tr>\n  <tr>\n    <td>clean</td>\n    <td>Delete build/ and run/ directories, along with any nohup.* and *.log files.</td>\n  </tr>\n  <tr>\n    <td>lint</td>\n    <td>Run <a href=http://github.com/jshint/node-jshint\">jshint/node-jshint</a> or <a href=http://github.com/tav/nodelint\">tav/nodelint</a> against all .js files in lib/ and test/ directories.</td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>Run <a href=http://github.com/nomiddlename/jscheckstyle\">nomiddlename/jscheckstyle</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>test</td>\n    <td>Run <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ directory. If <code>{scripts.test}</code> is available, then <code>npm test</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>coverage <code>(experimental)</code></td>\n    <td>Run <a href=http://github.com/visionmedia/node-jscoverage\">visionmedia/node-jscoverage</a> via <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ and lib/ directories.</td>\n  </tr>\n  <tr>\n    <td>doc</td>\n    <td>Run <a href=http://github.com/nodeca/ndoc\">nodeca/ndoc</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>versionup</td>\n    <td>Upgrade patch version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-minor</td>\n    <td>Upgrade minor version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-major</td>\n    <td>Upgrade major version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>template <code>(experimental)</code></td>\n    <td>Populate variables in template files with values from package.json file.</td>\n  </tr>\n  <tr>\n    <td>stop</td>\n    <td>Stop the app by executing <code>node {name}.js stop</code> . If <code>{scripts.stop}</code> is configured, then <code>npm stop</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>start</td>\n    <td>Start the app by executing <code>node {name}.js start</code> . If <code>{scripts.start}</code> is configured, then <code>npm start</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>restart</td>\n    <td>Restart the app by executing <code>node {name}.js restart</code>  . If <code>{scripts.restart}</code> is configured, then <code>npm restart</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>status</td>\n    <td>Display app status by executing <code>node {name}.js status</code> .</td>\n  </tr>\n  <tr>\n    <td>nuke</td>\n    <td>Kill all processes with command containing the word 'node' .</td>\n  </tr>\n  <tr>\n    <td>package</td>\n    <td>Create a .tar.gz package file at build/artifact/ directory, along with md5 and sha1 checksums of the package file.</td>\n  </tr>\n  <tr>\n    <td>package-meta <code>(experimental)</code></td>\n    <td>Create a meta file to build/artifact, along with md5 and sha1 checksums of the meta file.</td>\n  </tr>\n  <tr>\n    <td>deploy <code>(experimental)</code></td>\n    <td>Upload the .tar.gz package file to a remote location, either via SCP or FTP.</td>\n  </tr>\n  <tr>\n    <td>ssh-unpack <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, then remotely unpack the .tar.gz package file.</td>\n  </tr>\n  <tr>\n    <td>ssh-restart <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, unpack, then remotely execute <code>node {name.js} restart</code> .</td>\n  </tr>\n  <tr>\n    <td>ssh-mkdir <code>(experimental)</code></td>\n    <td>(SSH only) Remotely create the directory to deploy the package file to.</td>\n  </tr>\n</table>\n\nConfig\n------\n\nEven though it's recommended to follow the project convention further above, it is possible to customise Bob's build target parameters.\n\nCreate a .bob.json file on the project's root directory (same level as package.json), containing a JSON object with this format:\n\n    {\n      \"x\": {\n        \"y\": \"z\"\n      }\n    }\n\nx.y properties will be used as BOB_X_Y in Bob's Makefile.\n\nCheck out the [Makefile](https://github.com/cliffano/bob/blob/master/conf/Makefile) for a full list of parameters. NOTE: only the parameters prefixed with BOB_ are customisable.\n\nContinuous Integration\n----------------------\n\n###Travis CI\n\nConfigure the project's .travis.yml file:\n\n    before_install: \"npm install -g bob\"\n    script: \"bob clean lint test coverage\"\n\n###Jenkins CI\n\nInstall Bob on the server, then configure a job with shell script build step:\n\n    bob clean lint test coverage;\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.3":{"name":"bob","description":"Convention-based build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.3","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.4","jshint":"0.5.7","mocha":"1.0.3","ndoc":"1.0.7","nodelint":"0.5.2","nomnom":"1.5.1","underscore":"1.2.2","valentine":"1.4.7","vows":"0.6.2"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.7.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4586cc59ec358eae0d0cd5b3faeb32421e01f2df","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.3.tgz"},"readme":"Bob [![http://travis-ci.org/cliffano/bob](https://secure.travis-ci.org/cliffano/bob.png?branch=master)](http://travis-ci.org/cliffano/bob)\n---\n\nConvention-based build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nProject Convention\n------------------\n\nMandatory:\n\n* package.json - project descriptor file\n* lib/ - directory containing JavaScript library files\n* test/ - directory containing JavaScript test files\n\nOptional (only relevant when project is an app):\n\n* {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n* run/ - directory containing any runtime information like pid or log files\n\nReserved and generated by Bob:\n\n* build/ - directory containing build reports and artifacts\n\nUsage\n-----\n\nBob can be run from the project root directory (same level as package.json file).\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment:\n(if unspecified, NODE_ENV defaults to 'development')\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode and generate XML reports:\n(if unspecified, BOB_MODE defaults to 'human')\n\n    BOB_MODE=robot bob lint test\n    \nTargets\n-------\n\n<table>\n  <tr>\n    <td>dep</td>\n    <td>Install all dependencies specified in package.json file by executing <code>npm install .</code> .</td>\n  </tr>\n  <tr>\n    <td>tools</td>\n    <td>Install all Bob CLI dependencies in global scope.</td>\n  </tr>\n  <tr>\n    <td>clean</td>\n    <td>Delete build/ and run/ directories, along with any nohup.* and *.log files.</td>\n  </tr>\n  <tr>\n    <td>lint</td>\n    <td>Run <a href=http://github.com/jshint/node-jshint\">jshint/node-jshint</a> or <a href=http://github.com/tav/nodelint\">tav/nodelint</a> against all .js files in lib/ and test/ directories.</td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>Run <a href=http://github.com/nomiddlename/jscheckstyle\">nomiddlename/jscheckstyle</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>test</td>\n    <td>Run <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ directory. If <code>{scripts.test}</code> is available, then <code>npm test</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>coverage <code>(experimental)</code></td>\n    <td>Run <a href=http://github.com/visionmedia/node-jscoverage\">visionmedia/node-jscoverage</a> via <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ and lib/ directories.</td>\n  </tr>\n  <tr>\n    <td>doc</td>\n    <td>Run <a href=http://github.com/nodeca/ndoc\">nodeca/ndoc</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>versionup</td>\n    <td>Upgrade patch version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-minor</td>\n    <td>Upgrade minor version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-major</td>\n    <td>Upgrade major version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>template <code>(experimental)</code></td>\n    <td>Populate variables in template files with values from package.json file.</td>\n  </tr>\n  <tr>\n    <td>stop</td>\n    <td>Stop the app by executing <code>node {name}.js stop</code> . If <code>{scripts.stop}</code> is configured, then <code>npm stop</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>start</td>\n    <td>Start the app by executing <code>node {name}.js start</code> . If <code>{scripts.start}</code> is configured, then <code>npm start</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>restart</td>\n    <td>Restart the app by executing <code>node {name}.js restart</code>  . If <code>{scripts.restart}</code> is configured, then <code>npm restart</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>status</td>\n    <td>Display app status by executing <code>node {name}.js status</code> .</td>\n  </tr>\n  <tr>\n    <td>nuke</td>\n    <td>Kill all processes with command containing the word 'node' .</td>\n  </tr>\n  <tr>\n    <td>package</td>\n    <td>Create a .tar.gz package file at build/artifact/ directory, along with md5 and sha1 checksums of the package file.</td>\n  </tr>\n  <tr>\n    <td>package-meta <code>(experimental)</code></td>\n    <td>Create a meta file to build/artifact, along with md5 and sha1 checksums of the meta file.</td>\n  </tr>\n  <tr>\n    <td>deploy <code>(experimental)</code></td>\n    <td>Upload the .tar.gz package file to a remote location, either via SCP or FTP.</td>\n  </tr>\n  <tr>\n    <td>ssh-unpack <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, then remotely unpack the .tar.gz package file.</td>\n  </tr>\n  <tr>\n    <td>ssh-restart <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, unpack, then remotely execute <code>node {name.js} restart</code> .</td>\n  </tr>\n  <tr>\n    <td>ssh-mkdir <code>(experimental)</code></td>\n    <td>(SSH only) Remotely create the directory to deploy the package file to.</td>\n  </tr>\n</table>\n\nConfig\n------\n\nEven though it's recommended to follow the project convention further above, it is possible to customise Bob's build target parameters.\n\nCreate a .bob.json file on the project's root directory (same level as package.json), containing a JSON object with this format:\n\n    {\n      \"x\": {\n        \"y\": \"z\"\n      }\n    }\n\nx.y properties will be used as BOB_X_Y in Bob's Makefile.\n\nCheck out the [Makefile](https://github.com/cliffano/bob/blob/master/conf/Makefile) for a full list of parameters. NOTE: only the parameters prefixed with BOB_ are customisable.\n\nContinuous Integration\n----------------------\n\n###Travis CI\n\nConfigure the project's .travis.yml file:\n\n    before_install: \"npm install -g bob\"\n    script: \"bob clean lint test coverage\"\n\n###Jenkins CI\n\nInstall Bob on the server, then configure a job with shell script build step:\n\n    bob clean lint test coverage;\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.4":{"name":"bob","description":"Convention-based build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.4","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.5","jshint":"0.7.1","mocha":"1.2.1","ndoc":"1.0.7","nodelint":"0.6.1","nomnom":"1.5.2","underscore":"1.3.3","valentine":"1.5.5","vows":"0.6.2"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"75b0eb642ef042b27b13acc73e23273ad211286b","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.4.tgz"},"readme":"Bob [![http://travis-ci.org/cliffano/bob](https://secure.travis-ci.org/cliffano/bob.png?branch=master)](http://travis-ci.org/cliffano/bob)\n---\n\nConvention-based build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nProject Convention\n------------------\n\nMandatory:\n\n* package.json - project descriptor file\n* lib/ - directory containing JavaScript library files\n* test/ - directory containing JavaScript test files\n\nOptional (only relevant when project is an app):\n\n* {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n* run/ - directory containing any runtime information like pid or log files\n\nReserved and generated by Bob:\n\n* build/ - directory containing build reports and artifacts\n\nUsage\n-----\n\nBob can be run from the project root directory (same level as package.json file).\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment:\n(if unspecified, NODE_ENV defaults to 'development')\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode and generate XML reports:\n(if unspecified, BOB_MODE defaults to 'human')\n\n    BOB_MODE=robot bob lint test\n    \nTargets\n-------\n\n<table>\n  <tr>\n    <td>dep</td>\n    <td>Install all dependencies specified in package.json file by executing <code>npm install .</code> .</td>\n  </tr>\n  <tr>\n    <td>tools</td>\n    <td>Install all Bob CLI dependencies in global scope.</td>\n  </tr>\n  <tr>\n    <td>clean</td>\n    <td>Delete build/ and run/ directories, along with any nohup.* and *.log files.</td>\n  </tr>\n  <tr>\n    <td>lint</td>\n    <td>Run <a href=http://github.com/jshint/node-jshint\">jshint/node-jshint</a> or <a href=http://github.com/tav/nodelint\">tav/nodelint</a> against all .js files in lib/ and test/ directories.</td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>Run <a href=http://github.com/nomiddlename/jscheckstyle\">nomiddlename/jscheckstyle</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>test</td>\n    <td>Run <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ directory. If <code>{scripts.test}</code> is available, then <code>npm test</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>coverage <code>(experimental)</code></td>\n    <td>Run <a href=http://github.com/visionmedia/node-jscoverage\">visionmedia/node-jscoverage</a> via <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ and lib/ directories.</td>\n  </tr>\n  <tr>\n    <td>doc</td>\n    <td>Run <a href=http://github.com/nodeca/ndoc\">nodeca/ndoc</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>versionup</td>\n    <td>Upgrade patch version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-minor</td>\n    <td>Upgrade minor version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-major</td>\n    <td>Upgrade major version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>template <code>(experimental)</code></td>\n    <td>Populate variables in template files with values from package.json file.</td>\n  </tr>\n  <tr>\n    <td>stop</td>\n    <td>Stop the app by executing <code>node {name}.js stop</code> . If <code>{scripts.stop}</code> is configured, then <code>npm stop</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>start</td>\n    <td>Start the app by executing <code>node {name}.js start</code> . If <code>{scripts.start}</code> is configured, then <code>npm start</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>restart</td>\n    <td>Restart the app by executing <code>node {name}.js restart</code>  . If <code>{scripts.restart}</code> is configured, then <code>npm restart</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>status</td>\n    <td>Display app status by executing <code>node {name}.js status</code> .</td>\n  </tr>\n  <tr>\n    <td>nuke</td>\n    <td>Kill all processes with command containing the word 'node' .</td>\n  </tr>\n  <tr>\n    <td>package</td>\n    <td>Create a .tar.gz package file at build/artifact/ directory, along with md5 and sha1 checksums of the package file.</td>\n  </tr>\n  <tr>\n    <td>package-meta <code>(experimental)</code></td>\n    <td>Create a meta file to build/artifact, along with md5 and sha1 checksums of the meta file.</td>\n  </tr>\n  <tr>\n    <td>deploy <code>(experimental)</code></td>\n    <td>Upload the .tar.gz package file to a remote location, either via SCP or FTP.</td>\n  </tr>\n  <tr>\n    <td>ssh-unpack <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, then remotely unpack the .tar.gz package file.</td>\n  </tr>\n  <tr>\n    <td>ssh-restart <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, unpack, then remotely execute <code>node {name.js} restart</code> .</td>\n  </tr>\n  <tr>\n    <td>ssh-mkdir <code>(experimental)</code></td>\n    <td>(SSH only) Remotely create the directory to deploy the package file to.</td>\n  </tr>\n</table>\n\nConfig\n------\n\nEven though it's recommended to follow the project convention further above, it is possible to customise Bob's build target parameters.\n\nCreate a .bob.json file on the project's root directory (same level as package.json), containing a JSON object with this format:\n\n    {\n      \"x\": {\n        \"y\": \"z\"\n      }\n    }\n\nx.y properties will be used as BOB_X_Y in Bob's Makefile.\n\nCheck out the [Makefile](https://github.com/cliffano/bob/blob/master/conf/Makefile) for a full list of parameters. NOTE: only the parameters prefixed with BOB_ are customisable.\n\nContinuous Integration\n----------------------\n\n###Travis CI\n\nConfigure the project's .travis.yml file:\n\n    before_install: \"npm install -g bob\"\n    script: \"bob clean lint test coverage\"\n\n###Jenkins CI\n\nInstall Bob on the server, then configure a job with shell script build step:\n\n    bob clean lint test coverage;\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.5":{"name":"bob","description":"Convention-based build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.5","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"http://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.5","jshint":"0.7.1","mocha":"1.2.1","nodelint":"0.6.1","nomnom":"1.5.2","underscore":"1.3.3","valentine":"1.5.5","vows":"0.6.2"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"readme":"Bob [![http://travis-ci.org/cliffano/bob](https://secure.travis-ci.org/cliffano/bob.png?branch=master)](http://travis-ci.org/cliffano/bob)\n---\n\nConvention-based build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nProject Convention\n------------------\n\nMandatory:\n\n* package.json - project descriptor file\n* lib/ - directory containing JavaScript library files\n* test/ - directory containing JavaScript test files\n\nOptional (only relevant when project is an app):\n\n* {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n* run/ - directory containing any runtime information like pid or log files\n\nReserved and generated by Bob:\n\n* build/ - directory containing build reports and artifacts\n\nUsage\n-----\n\nBob can be run from the project root directory (same level as package.json file).\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment:\n(if unspecified, NODE_ENV defaults to 'development')\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode and generate XML reports:\n(if unspecified, BOB_MODE defaults to 'human')\n\n    BOB_MODE=robot bob lint test\n    \nTargets\n-------\n\n<table>\n  <tr>\n    <td>dep</td>\n    <td>Install all dependencies specified in package.json file by executing <code>npm install .</code> .</td>\n  </tr>\n  <tr>\n    <td>tools</td>\n    <td>Install all Bob CLI dependencies in global scope.</td>\n  </tr>\n  <tr>\n    <td>clean</td>\n    <td>Delete build/ and run/ directories, along with any nohup.* and *.log files.</td>\n  </tr>\n  <tr>\n    <td>lint</td>\n    <td>Run <a href=http://github.com/jshint/node-jshint\">jshint/node-jshint</a> or <a href=http://github.com/tav/nodelint\">tav/nodelint</a> against all .js files in lib/ and test/ directories.</td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>Run <a href=http://github.com/nomiddlename/jscheckstyle\">nomiddlename/jscheckstyle</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>test</td>\n    <td>Run <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ directory. If <code>{scripts.test}</code> is available, then <code>npm test</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>coverage <code>(experimental)</code></td>\n    <td>Run <a href=http://github.com/visionmedia/node-jscoverage\">visionmedia/node-jscoverage</a> via <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ and lib/ directories.</td>\n  </tr>\n  <tr>\n    <td>versionup</td>\n    <td>Upgrade patch version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-minor</td>\n    <td>Upgrade minor version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-major</td>\n    <td>Upgrade major version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>template <code>(experimental)</code></td>\n    <td>Populate variables in template files with values from package.json file.</td>\n  </tr>\n  <tr>\n    <td>stop</td>\n    <td>Stop the app by executing <code>node {name}.js stop</code> . If <code>{scripts.stop}</code> is configured, then <code>npm stop</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>start</td>\n    <td>Start the app by executing <code>node {name}.js start</code> . If <code>{scripts.start}</code> is configured, then <code>npm start</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>restart</td>\n    <td>Restart the app by executing <code>node {name}.js restart</code>  . If <code>{scripts.restart}</code> is configured, then <code>npm restart</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>status</td>\n    <td>Display app status by executing <code>node {name}.js status</code> .</td>\n  </tr>\n  <tr>\n    <td>nuke</td>\n    <td>Kill all processes with command containing the word 'node' .</td>\n  </tr>\n  <tr>\n    <td>package</td>\n    <td>Create a .tar.gz package file at build/artifact/ directory, along with md5 and sha1 checksums of the package file.</td>\n  </tr>\n  <tr>\n    <td>package-meta <code>(experimental)</code></td>\n    <td>Create a meta file to build/artifact, along with md5 and sha1 checksums of the meta file.</td>\n  </tr>\n  <tr>\n    <td>deploy <code>(experimental)</code></td>\n    <td>Upload the .tar.gz package file to a remote location, either via SCP or FTP.</td>\n  </tr>\n  <tr>\n    <td>ssh-unpack <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, then remotely unpack the .tar.gz package file.</td>\n  </tr>\n  <tr>\n    <td>ssh-restart <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, unpack, then remotely execute <code>node {name.js} restart</code> .</td>\n  </tr>\n  <tr>\n    <td>ssh-mkdir <code>(experimental)</code></td>\n    <td>(SSH only) Remotely create the directory to deploy the package file to.</td>\n  </tr>\n</table>\n\nConfig\n------\n\nEven though it's recommended to follow the project convention further above, it is possible to customise Bob's build target parameters.\n\nCreate a .bob.json file on the project's root directory (same level as package.json), containing a JSON object with this format:\n\n    {\n      \"x\": {\n        \"y\": \"z\"\n      }\n    }\n\nx.y properties will be used as BOB_X_Y in Bob's Makefile.\n\nCheck out the [Makefile](https://github.com/cliffano/bob/blob/master/conf/Makefile) for a full list of parameters. NOTE: only the parameters prefixed with BOB_ are customisable.\n\nContinuous Integration\n----------------------\n\n###Travis CI\n\nConfigure the project's .travis.yml file:\n\n    before_install: \"npm install -g bob\"\n    script: \"bob clean lint test coverage\"\n\n###Jenkins CI\n\nInstall Bob on the server, then configure a job with shell script build step:\n\n    bob clean lint test coverage;\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.\n","_id":"bob@0.4.5","dist":{"shasum":"7a8844de6fb449282daed6710005e01752579dcf","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.5.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.6":{"name":"bob","description":"Convention-based build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.6","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.6","jshint":"0.7.1","mocha":"1.2.1","nodelint":"0.6.1","nomnom":"1.5.2","underscore":"1.3.3","valentine":"1.5.5","vows":"0.6.2"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"85bc6e171dd2c6059824016dcb760072bc3b26f1","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.6.tgz"},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]},"0.4.7":{"name":"bob","description":"Convention-based build tool for Node.js projects.","keywords":["build","lint","checkstyle","test","coverage","deploy","make"],"version":"0.4.7","homepage":"http://github.com/cliffano/bob","author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"bin":{"bob":"./bin/bob","charlotte":"./bin/charlotte"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"bugs":{"url":"http://github.com/cliffano/bob/issues"},"directories":{"bin":"./bin","lib":"./lib","test":"./test"},"dependencies":{"dateformat":"1.0.2-1.2.3","expresso":"0.9.2","jscheckstyle":"0.0.6","jshint":"0.7.1","mocha":"1.2.1","nodelint":"0.6.1","nomnom":"1.5.2","underscore":"1.3.3","valentine":"1.5.5","vows":"0.6.2"},"devDependencies":{"sandboxed-module":"0.1.3"},"engines":{"node":">= 0.4.0 < 0.9.0"},"licenses":[{"type":"MIT","url":"http://github.com/cliffano/bob/raw/master/LICENSE"}],"_npmUser":{"name":"cliffano","email":"cliffano@gmail.com"},"_id":"bob@0.4.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e3506893e761dd5ba9c63f3315aaebb96647f806","tarball":"http://registry.npmjs.org/bob/-/bob-0.4.7.tgz"},"readme":"Bob [![http://travis-ci.org/cliffano/bob](https://secure.travis-ci.org/cliffano/bob.png?branch=master)](http://travis-ci.org/cliffano/bob)\n---\n\nConvention-based build tool for Node.js projects.\n\nInstallation\n------------\n\n    npm install -g bob\n\nProject Convention\n------------------\n\nMandatory:\n\n* package.json - project descriptor file\n* lib/ - directory containing JavaScript library files\n* test/ - directory containing JavaScript test files\n\nOptional (only relevant when project is an app):\n\n* {name}.js - main app file, must support `node {name}.js start|stop|restart|status`\n* run/ - directory containing any runtime information like pid or log files\n\nReserved and generated by Bob:\n\n* build/ - directory containing build reports and artifacts\n\nUsage\n-----\n\nBob can be run from the project root directory (same level as package.json file).\n\nInstall project dependencies (per Node.js project):\n\n    bob dep\n    \nRun Bob from project directory:\n\n    bob target1 target2 target3 ...\n\nRun Bob with specific environment:\n(if unspecified, NODE_ENV defaults to 'development')\n\n    NODE_ENV=production bob start\n\nRun Bob in robot mode and generate XML reports:\n(if unspecified, BOB_MODE defaults to 'human')\n\n    BOB_MODE=robot bob lint test\n    \nTargets\n-------\n\n<table>\n  <tr>\n    <td>dep</td>\n    <td>Install all dependencies specified in package.json file by executing <code>npm install .</code> .</td>\n  </tr>\n  <tr>\n    <td>tools</td>\n    <td>Install all Bob CLI dependencies in global scope.</td>\n  </tr>\n  <tr>\n    <td>clean</td>\n    <td>Delete build/ and run/ directories, along with any nohup.* and *.log files.</td>\n  </tr>\n  <tr>\n    <td>lint</td>\n    <td>Run <a href=http://github.com/jshint/node-jshint\">jshint/node-jshint</a> or <a href=http://github.com/tav/nodelint\">tav/nodelint</a> against all .js files in lib/ and test/ directories.</td>\n  </tr>\n  <tr>\n    <td>style</td>\n    <td>Run <a href=http://github.com/nomiddlename/jscheckstyle\">nomiddlename/jscheckstyle</a> against all .js files in lib/ directory.</td>\n  </tr>\n  <tr>\n    <td>test</td>\n    <td>Run <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ directory. If <code>{scripts.test}</code> is available, then <code>npm test</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>coverage <code>(experimental)</code></td>\n    <td>Run <a href=http://github.com/visionmedia/node-jscoverage\">visionmedia/node-jscoverage</a> via <a href=http://github.com/cloudhead/vows\">cloudhead/vows</a> against all .js files in test/ and lib/ directories.</td>\n  </tr>\n  <tr>\n    <td>versionup</td>\n    <td>Upgrade patch version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-minor</td>\n    <td>Upgrade minor version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>versionup-major</td>\n    <td>Upgrade major version number in package.json file.</td>\n  </tr>\n  <tr>\n    <td>template <code>(experimental)</code></td>\n    <td>Populate variables in template files with values from package.json file.</td>\n  </tr>\n  <tr>\n    <td>stop</td>\n    <td>Stop the app by executing <code>node {name}.js stop</code> . If <code>{scripts.stop}</code> is configured, then <code>npm stop</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>start</td>\n    <td>Start the app by executing <code>node {name}.js start</code> . If <code>{scripts.start}</code> is configured, then <code>npm start</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>restart</td>\n    <td>Restart the app by executing <code>node {name}.js restart</code>  . If <code>{scripts.restart}</code> is configured, then <code>npm restart</code> will be executed instead.</td>\n  </tr>\n  <tr>\n    <td>status</td>\n    <td>Display app status by executing <code>node {name}.js status</code> .</td>\n  </tr>\n  <tr>\n    <td>nuke</td>\n    <td>Kill all processes with command containing the word 'node' .</td>\n  </tr>\n  <tr>\n    <td>package</td>\n    <td>Create a .tar.gz package file at build/artifact/ directory, along with md5 and sha1 checksums of the package file.</td>\n  </tr>\n  <tr>\n    <td>package-meta <code>(experimental)</code></td>\n    <td>Create a meta file to build/artifact, along with md5 and sha1 checksums of the meta file.</td>\n  </tr>\n  <tr>\n    <td>deploy <code>(experimental)</code></td>\n    <td>Upload the .tar.gz package file to a remote location, either via SCP or FTP.</td>\n  </tr>\n  <tr>\n    <td>ssh-unpack <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, then remotely unpack the .tar.gz package file.</td>\n  </tr>\n  <tr>\n    <td>ssh-restart <code>(experimental)</code></td>\n    <td>(SSH only) Deploy, unpack, then remotely execute <code>node {name.js} restart</code> .</td>\n  </tr>\n  <tr>\n    <td>ssh-mkdir <code>(experimental)</code></td>\n    <td>(SSH only) Remotely create the directory to deploy the package file to.</td>\n  </tr>\n</table>\n\nConfig\n------\n\nEven though it's recommended to follow the project convention further above, it is possible to customise Bob's build target parameters.\n\nCreate a .bob.json file on the project's root directory (same level as package.json), containing a JSON object with this format:\n\n    {\n      \"x\": {\n        \"y\": \"z\"\n      }\n    }\n\nx.y properties will be used as BOB_X_Y in Bob's Makefile.\n\nCheck out the [Makefile](https://github.com/cliffano/bob/blob/master/conf/Makefile) for a full list of parameters. NOTE: only the parameters prefixed with BOB_ are customisable.\n\nContinuous Integration\n----------------------\n\n###Travis CI\n\nConfigure the project's .travis.yml file:\n\n    before_install: \"npm install -g bob\"\n    script: \"bob clean lint test coverage\"\n\n###Jenkins CI\n\nInstall Bob on the server, then configure a job with shell script build step:\n\n    bob clean lint test coverage;\n\nColophon\n--------\n\nFollow [@cliffano](http://twitter.com/cliffano) on Twitter.\n","maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}]}},"maintainers":[{"name":"cliffano","email":"cliffano@gmail.com"}],"time":{"modified":"2012-08-02T13:44:19.504Z","created":"2011-08-18T14:16:03.858Z","0.1.0":"2011-08-18T14:16:06.267Z","0.2.0":"2011-09-19T13:23:50.874Z","0.2.1":"2011-09-20T05:40:16.197Z","0.2.2":"2011-09-23T00:36:46.002Z","0.2.3":"2011-09-26T06:16:42.511Z","0.2.5":"2011-10-12T11:24:58.263Z","0.2.6":"2011-10-19T04:21:06.120Z","0.2.7":"2011-10-20T04:16:11.284Z","0.2.8":"2011-10-21T14:42:10.773Z","0.2.9":"2011-10-27T12:09:44.968Z","0.2.10":"2011-11-22T22:24:12.889Z","0.3.0":"2012-01-30T12:54:55.941Z","0.3.1":"2012-02-01T06:16:22.687Z","0.3.2":"2012-02-08T10:49:20.964Z","0.3.3":"2012-02-24T02:55:45.603Z","0.3.4":"2012-02-25T05:44:16.281Z","0.4.0":"2012-02-26T22:24:13.571Z","0.4.1":"2012-02-27T03:28:05.327Z","0.4.2":"2012-03-25T04:36:47.959Z","0.4.3":"2012-05-10T12:18:47.437Z","0.4.4":"2012-06-26T01:57:09.511Z","0.4.5":"2012-06-26T02:58:14.437Z","0.4.6":"2012-07-25T05:41:18.704Z","0.4.7":"2012-07-26T02:23:45.196Z"},"author":{"name":"Cliffano Subagio","email":"blah@cliffano.com","url":"http://blog.cliffano.com"},"repository":{"type":"git","url":"git://github.com/cliffano/bob.git"},"users":{"fgribreau":true},"_attachments":{"bob-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-0s9Oh7IpR1sa/Wg32JfjIA==","length":13140,"stub":true},"bob-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-nwn9uyXvjsLkAaTYBE+9YQ==","length":12906,"stub":true},"bob-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-DWNp3s99focme3iSyf5oKA==","length":12780,"stub":true},"bob-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-PXupftQ2oTiM/WRiFIVTpw==","length":13059,"stub":true},"bob-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-9dJU5/6A6PoXQMM1CLfuQQ==","length":13035,"stub":true},"bob-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-73yBKDr8ZLx0XVcIIxBbeQ==","length":13004,"stub":true},"bob-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-5nnPcFNIKELZJ/+Q28181Q==","length":10616,"stub":true},"bob-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-5uEISDEErMbb7Hg7Cr+ieA==","length":10601,"stub":true},"bob-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-ZS04og1v84WGPAqKc0AoXw==","length":10364,"stub":true},"bob-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-QYXbGqHk2TaMApwPUOEVyw==","length":9691,"stub":true},"bob-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-sXfdIOSptleGW37WAZ0yvg==","length":8618,"stub":true},"bob-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-KSE5vquJZy0Me2JnPYVoFA==","length":8343,"stub":true},"bob-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-dkvbCHI4tAcUz4NfgaRN2A==","length":10240,"stub":true},"bob-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-LOXQ1GJJZdkQqV4FFTNI7w==","length":9026,"stub":true},"bob-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-ALqU/JgL8Y+kkmRLW+xSCA==","length":10240,"stub":true},"bob-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-HL3Pd+0vvlsxp37TJkRgUA==","length":10240,"stub":true},"bob-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-jNgjYx8AlsNgEG3zbPWB5w==","length":8269,"stub":true},"bob-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-nL+xxjJMtE12q0Lev5t6JQ==","length":8158,"stub":true},"bob-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-B6SIPuH6slQFX1rnnVCTzg==","length":6146,"stub":true},"bob-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-e0Gt9OycIHvsBROJpidoKw==","length":5431,"stub":true},"bob-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OsyTCe2XcdWVc4mymZnHZw==","length":5410,"stub":true},"bob-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QlHuqxaUEFSOsfYpIEDlRQ==","length":5286,"stub":true},"bob-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2POjyIfsGTQ+pnH0bVsTYQ==","length":4771,"stub":true},"bob-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gUZyR5oTIc54auHMbFmsKw==","length":3868,"stub":true}}}},
{"id":"bobamo","key":"bobamo","value":{"rev":"9-1efa982c1d4f836181fcf08b343817f1"},"doc":{"_id":"bobamo","_rev":"9-1efa982c1d4f836181fcf08b343817f1","name":"bobamo","description":"A scaffoldless crud thing using bootstrap, passport, mongoose, backbone and jquery","dist-tags":{"latest":"0.6.0"},"versions":{"0.3.5":{"name":"bobamo","description":"A scaffoldless crud thing using bootstrap, passport, mongoose, backbone and jquery","version":"0.3.5","private":false,"dependencies":{"jqtpl":">= 0.0.1","mongoose":"latest","mers":">= 0.3.8","underscore":"latest","less":"latest"},"devDependencies":{"mocha":"latest","should":"latest","csv":"latest"},"scripts":{"test":"mocha tests/*-mocha.js","example":"node example/app.js"},"_npmUser":{"name":"speajus","email":"speajus@gmail.com"},"_id":"bobamo@0.3.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"91b79173c6b85a8fb7e2fac1a3a3d6d83f1bc6a7","tarball":"http://registry.npmjs.org/bobamo/-/bobamo-0.3.5.tgz"},"maintainers":[{"name":"speajus","email":"speajus@gmail.com"}]},"0.3.7":{"name":"bobamo","description":"A scaffoldless crud thing using bootstrap, passport, mongoose, backbone and jquery","version":"0.3.7","private":false,"dependencies":{"jqtpl":">= 0.0.1","mongoose":"latest","mers":">= 0.3.8","underscore":"latest","less":"latest"},"devDependencies":{"mocha":"latest","should":"latest","csv":"latest"},"scripts":{"test":"mocha tests/*-mocha.js","example":"node example/app.js"},"_npmUser":{"name":"speajus","email":"speajus@gmail.com"},"_id":"bobamo@0.3.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1111597c4d9e30e7c79f3b4290ba3c4957eb8439","tarball":"http://registry.npmjs.org/bobamo/-/bobamo-0.3.7.tgz"},"maintainers":[{"name":"speajus","email":"speajus@gmail.com"}]},"0.5.1":{"name":"bobamo","description":"A scaffoldless crud thing using bootstrap, passport, mongoose, backbone and jquery","version":"0.5.1","private":false,"dependencies":{"jqtpl":">= 0.0.1","mongoose":"latest","mers":">= 0.3.8","underscore":"latest","less":"latest","connect":"latest"},"devDependencies":{"mocha":"latest","should":"latest","csv":"latest"},"scripts":{"test":"mocha tests/*-mocha.js","example":"node example/app.js"},"_npmUser":{"name":"speajus","email":"speajus@gmail.com"},"_id":"bobamo@0.5.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"662d90678853f854e343be2c6e4d8503c99d3b8a","tarball":"http://registry.npmjs.org/bobamo/-/bobamo-0.5.1.tgz"},"maintainers":[{"name":"speajus","email":"speajus@gmail.com"}]},"0.6.0":{"name":"bobamo","description":"A scaffoldless crud thing using bootstrap, passport, mongoose, backbone and jquery","version":"0.6.0","private":false,"dependencies":{"jqtpl":">= 0.0.1","mongoose":"latest","mers":">= 0.3.8","underscore":"latest","less":"latest","connect":"latest"},"devDependencies":{"mocha":"latest","should":"latest","csv":"latest"},"scripts":{"test":"mocha tests/*-mocha.js","example":"node example/app.js"},"_npmUser":{"name":"speajus","email":"speajus@gmail.com"},"_id":"bobamo@0.6.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a08fd6e91141ca65b56bb375bf4f8ebaa8bccda3","tarball":"http://registry.npmjs.org/bobamo/-/bobamo-0.6.0.tgz"},"maintainers":[{"name":"speajus","email":"speajus@gmail.com"}]}},"readme":"#Bobamo\n### changed the name to avoid stepping on someones toes.\nIts basically a crud infrastructure for [mongoose](http://mongoosejs.com), [backbone](http://documentcloud.github.com/backbone/), [mers](https://github.com/jspears/mers),\n[backbone forms](https://github.com/powmedia/backbone-forms) and [twitter bootstrap](http://twitter.github.com/bootstrap/). The idea\nis you define your model and a little extra and it generates the crud on demand.    It doesn't leave you in the\nbox though, you can easily change any part of the generated stuff by making it static and putting in the public\ndirectory.   This allows for easy customization.   You can at your own risk modify the scaffolding generated in views/generator\n\n##Express\nRecently Bobamo has been refactored as a express plugin.  This gives an easy installation method, (npm) and\nrelatively easy configuration.\n\nJust add bobamo to your package.json, npm install then configure app.js to use bobamo\n\n```javascript\n\n app.use(bobamo.express({uri:'mongodb://localhost/bobamo_development'}, express))\n\n```\nNote passing express in, please bear with me as I figure out how to get rid of that, but to make it work its needed.\nYou can also specify a context to host both the rest and javascript from\n\n```javascript\n\n app.use('your-api', bobamo.express({uri:'mongodb://localhost/bobamo_development'}, express))\n\n```\n\nYou can find examples of this under examples/simple and examples/login-example.\n\nA running example of the simple app is [here](http://bobamo-speajus.rhcloud.com/bobamo/index.html)\n\n\n## Subclass\nBecause everything is scoped within requirejs, subclassing is pretty easy. Say you wanted to do something to the\nuser view create a javascript file \n  \n  public/js/views/user/list.js\n  \n```\n  require(['Backbone','jquery', 'js/super/views/user/list'], function(Backbone, $, ListView){\n    var NewListView = ListView.extend({\n      render:function(obj){\n       //do something special\n      }\n    });\n   return NewListView; // do not forget to return it.\n  \n  });\n```\n\nThat's it.   Because the file is in the same spot, require will load it instead of the original, and the original file\nis now uder the js/super/ designation.   \n\n## Override\nBobamo uses express.static to first look for a static version of the file.  If it finds it, it returns it.  This allows\nfor easy modification of existing code.  Just put it in the corresponding public/ directory and it will be returned\ninstead of the scaffolding.\n\n\n## Why?\nWhat makes Bobamo different, than railwayjs, rails, grails, roo...\n\n* No scaffolding commands.  Because the infrastructure is built at runtime, through intraspection of the Mongoose Model,\nno scaffolding required.\n* Extendable, as features get added to Bobamo you can benefit from them without loosing what you have.   See the subclassing\n  up top.  It should make it easier to use the parts you want and skip the parts you don't.\n* Single language.  No more writing server side in Ruby/PHP/Java and client side in javascript, its all javascript so\n  less context switches, easier to share code between client/server.\n* Client oriented, AKA SOFEA (Server Oreinted Front End Architecture), Server does not do any view work, so maintaining\nstate is dramatically easier.  All data access is done through JSON/REST calls.  This allows for easy extensibility.\n* Dynamic - Only the code needed by the client is sent to the client. This is accomplished via RequireJS.   At some point it\n  should be possible to compile it into one big javascript, but for now, this is how it works.\n* Looks Nice - Thanks to the Twitter Bootstap code it is relatively pretty.\n\n## Features\n\n* Bookmarkable - All views are bookmarkable, for your browsers convience.  In addition forward/back buttons should work.\n* Pagination - Pagination is implemented in list views.\n* Sortable - Fields are sortable.\n* Easy - Well easy is in the eye of the beholder.\n* Wizard Support - If the fields are grouped as described below you get a wizard interface.   Nice if you like wizards.\n\n\n\n\n## Configuration\nEach Mongoose schema can be annotated with a display object, in addition each field in the schema can be annotated.\n\n\nA Schema can have the following annotations\n\n* title (The name of the schema, if empty it will be titlecased object name)\n* plural (The plural name of the schema, if empty an attempt a generating a plural name will happen.\n* fields (an array of fields that are editable. see [backbone forms](https://github.com/powmedia/backbone-forms) for more\n information.\n\nA Field can have the following annotations\n\n* title (The label for the field, if empty an attempt to change it to title case happens)\n* validate (Currently on Regex and Required are supported)\n* type [see backbone forms](https://github.com/powmedia/backbone-forms), 'Text','Password', 'Radio', 'MultiSelect', 'Number','Date','DateTime'\n* dataType [see backbone forms](https://github.com/powmedia/backbone-forms) 'String', 'Number', 'Array','Object','Date'\n* ro - read only\n* display - 'none' do send to client, 'hidden', hidden field, visible (default).\n* wizards - To create a wizard just define the fields in the model that should be in each step like this\n\n```javascript\nvar EmployeeSchema = new Schema({\n    name:{type:String}\n    ... other properteis\n\n}, {\n\ndisplay:{\n        fieldsets:[\n            {legend:'Identity',  help:'Enter your identity information here.', fields:['firstName','lastName','title', 'department']},\n            {legend:'Contact', fields:['officePhone', 'cellPhone','email','twitterId']},\n            {legend:'Profile', fields:['picture','blogUrl', 'manager','reports']}\n        ]\n    }\n});\n\n```\n\nSoon you should be able to edit these via an admin UI.\nMany-To-One support is coming.\nOne-To-Many support exists.\n\n\n\n\n```javascript\nvar UserSchema = new Schema({\n    username:{type:String, required:true, unique:true, index:true},\n    first_name:{type:String},\n    last_name:{type:String},\n    twitter:{type:String,required:true, validate: /^@[a-zA-Z0-9]*$/i },\n    email:{type:String},\n    _password:{type:String},\n    groups:[\n        { type:Schema.ObjectId, ref:'group', index:true}\n    ],\n\n    created_at:{type:Date, display:{display:'none'}},\n    created_by:{type:Schema.ObjectId, ref:'user'},\n    modified_at:{type:Date}\n}, {safe:true, strict:true, display:{title:'User', plural:'Users', fields:['username','first_name','last_name']});\n```\n","maintainers":[{"name":"speajus","email":"speajus@gmail.com"}],"time":{"modified":"2012-06-16T01:04:05.444Z","created":"2012-03-29T02:40:32.638Z","0.3.5":"2012-03-29T02:40:32.849Z","0.3.7":"2012-03-30T02:49:54.435Z","0.5.1":"2012-05-12T23:55:20.805Z","0.6.0":"2012-06-16T01:04:05.444Z"},"_attachments":{"bobamo-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-DO7wj56EQBQr1hpgqXoLpQ==","length":30927296,"stub":true},"bobamo-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-HMUNm3mPVlpc3Q1hXGPgGA==","length":2269391,"stub":true},"bobamo-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0WpVlD+vzuCDFeTQV8JhWQ==","length":2240354,"stub":true},"bobamo-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XWpsRSMwJEaZ9/8GGGHLEQ==","length":2236257,"stub":true}}}},
{"id":"bobby","key":"bobby","value":{"rev":"3-1f62dd9d258f7c0bb0fccdc6505208f1"},"doc":{"_id":"bobby","_rev":"3-1f62dd9d258f7c0bb0fccdc6505208f1","name":"bobby","description":"Build your JavaScript projects","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Stefan Fochler"},"name":"bobby","description":"Build your JavaScript projects","version":"1.0.0","repository":{"type":"git","url":"git://github.com/istefo/bobby.git"},"preferGlobal":true,"bugs":{"url":"http://github.com/istefo/bobby/issues"},"main":"bin/bobby.js","bin":{"bobby":"./bin/bobby.js"},"engines":{"node":"~0.6.x"},"dependencies":{"optimist":"~0.3.4","winston":"~0.6.1","uglify-js":"~1.3.1"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"iStefo","email":"istefo@me.com"},"_id":"bobby@1.0.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d3a29a59fa90c376a9d098131efa8523f5a91fa9","tarball":"http://registry.npmjs.org/bobby/-/bobby-1.0.0.tgz"},"maintainers":[{"name":"iStefo","email":"istefo@me.com"}]}},"readme":"# bobby (the little builder)\nBuild your JavaScript projects the way you allways wanted!\n\n*bobby* is a **JavaScript preprocessor** introducing `@require('file.js')` calls to easily give your projects a clean structure.\n\nIt recoursively parses your files starting at `file1 [file2...]` and include dependencies at the right place, but only once for the whole project. Simply put `@require('path/lib.js')` (CSS style @import will also work) where you want the file to be. Can't be easier.\n\n## Usage\nHere's the helpscreen of *bobby*: \n\n\tUsage: bobby [-cvs] [-b path] [-o out] file1 [file2...]\n\n\tOptions:\n\t  -c, --compress  Compress output with UglifyJS                  [boolean]\n\t  -o, --output    Output file. Defaults to stdout              \n\t  -b, --base      Base directory of scripts relative to current\n\t  -v, --verbose   Be more verbose and log every step             [boolean]\n\t  -s, --strict    Exit when a requested file can't be found      [boolean]\n\nThe easiest way to combine all the files of your projects in the right order works like this:\n\n`bobby main.js > result.js`\n\n## Tips\n*bobby* is now available over npm. Simpy `npm install -g bobby` to get it running.\n\nAlternatively, check out this repository and install via `npm install -g .`.\n\n*bobby* becomes really powerfull when combined with tools like [LiveReload](http://livereload.com) or any other filesystem watcher. This way, *bobby* can build your project on the fly before you had even switched to your comandline (if you hadn't used vim, but of course you do...)\n\n## Options, explained\n### -c, --compress\nCompresses (mangles names and minifies) your scripts through UglifyJS\n\n### -o, --output\nSpecify a path here that shall be used as ouput. When not given, result will be piped to `stdout` and logs will be written to `bobby.log`. If a output file is given, your terminal will show the most important steps, warnings and errors.\n\n### -b, --base\nSpecify a directory realtive to current that will be used as base for your *required* scripts (not the start-files and not the output file!)\n\n### -v, --verbose\nBe more (really) verbose about requiring files\n\n### -s, --strict\nWhen *bobby* can't find a specified file, it still will continue (if possible). With this option, execution will be aborted when a file can't be read.\n\n## Acknowledgements \n### Sponsor\n#### Boinx Software\nwhere I'm proud to work at with all the amazing people. They make [cool software for OS X and iOS](http://boinx.com) and payed me for the hours I worked at *Bobby*.\n\n### Libraries\n#### optimist\nfor [comandline option parsing](https://github.com/substack/node-optimist)\n\n#### winston\na library for [asynchronous logging to different transports](https://github.com/flatiron/winston)\n\n#### UglifyJS\nfor [fast and efficient minifycation](https://github.com/mishoo/UglifyJS)","maintainers":[{"name":"iStefo","email":"istefo@me.com"}],"time":{"modified":"2012-06-24T19:33:54.394Z","created":"2012-06-24T19:33:52.361Z","1.0.0":"2012-06-24T19:33:54.394Z"},"author":{"name":"Stefan Fochler"},"repository":{"type":"git","url":"git://github.com/istefo/bobby.git"},"_attachments":{"bobby-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Qwks6Ees7heoMOJRfcGpaQ==","length":3762,"stub":true}}}},
{"id":"bobsled","key":"bobsled","value":{"rev":"11-4fe8425d8bb49a534aa5e55d25030b09"},"doc":{"_id":"bobsled","_rev":"11-4fe8425d8bb49a534aa5e55d25030b09","name":"bobsled","description":"a fast, simple app framework prone to violent crashes","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"bobsled","description":"a fast, simple app framework prone to violent crashes","version":"0.0.1","author":{"name":"Ken Woodruff","email":"ken.woodruff@gmail.com"},"repository":{"type":"git","url":"git://github.com/femto113/node-bobsled.git"},"main":"bobsled.js","license":"MIT","dependencies":{"dot":">= 0.1.7","getpw":">= 0.0.1"},"engines":{"node":">= 0.4.7"},"_npmUser":{"name":"femto113","email":"ken.woodruff@gmail.com"},"_id":"bobsled@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"abce66bfed363c779d077953534ea080f6231f69","tarball":"http://registry.npmjs.org/bobsled/-/bobsled-0.0.1.tgz"},"maintainers":[{"name":"femto113","email":"ken.woodruff@gmail.com"}]},"0.0.3":{"name":"bobsled","description":"a fast, simple app framework prone to violent crashes","version":"0.0.3","author":{"name":"Ken Woodruff","email":"ken.woodruff@gmail.com"},"repository":{"type":"git","url":"git://github.com/femto113/node-bobsled.git"},"main":"bobsled.js","scripts":{"test":"node test.js"},"license":"MIT","dependencies":{"dot":">= 0.1.7","getpw":">= 0.0.2"},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"femto113","email":"ken.woodruff@gmail.com"},"_id":"bobsled@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3bc4096b6107e6684bc35b47369c6434645e3742","tarball":"http://registry.npmjs.org/bobsled/-/bobsled-0.0.3.tgz"},"maintainers":[{"name":"femto113","email":"ken.woodruff@gmail.com"}]},"0.1.0":{"name":"bobsled","description":"a fast, simple app framework prone to violent crashes","version":"0.1.0","author":{"name":"Ken Woodruff","email":"ken.woodruff@gmail.com"},"repository":{"type":"git","url":"git://github.com/femto113/node-bobsled.git"},"main":"bobsled.js","scripts":{"test":"node test/test.js"},"license":"MIT","engines":{"node":">= 0.4.7"},"_npmUser":{"name":"femto113","email":"ken.woodruff@gmail.com"},"_id":"bobsled@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e0d078208b954cd6ad15282ffb7f13823a7bbea1","tarball":"http://registry.npmjs.org/bobsled/-/bobsled-0.1.0.tgz"},"maintainers":[{"name":"femto113","email":"ken.woodruff@gmail.com"}]},"0.1.1":{"name":"bobsled","description":"a fast, simple app framework prone to violent crashes","version":"0.1.1","author":{"name":"Ken Woodruff","email":"ken.woodruff@gmail.com"},"repository":{"type":"git","url":"git://github.com/femto113/node-bobsled.git"},"main":"bobsled.js","scripts":{"test":"node test/test.js"},"license":"MIT","engines":{"node":">= 0.4.7"},"_npmUser":{"name":"femto113","email":"ken.woodruff@gmail.com"},"_id":"bobsled@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"41d96d028a7800680619048041cb77d41872f5fb","tarball":"http://registry.npmjs.org/bobsled/-/bobsled-0.1.1.tgz"},"maintainers":[{"name":"femto113","email":"ken.woodruff@gmail.com"}]},"0.1.2":{"name":"bobsled","description":"a fast, simple app framework prone to violent crashes","version":"0.1.2","author":{"name":"Ken Woodruff","email":"ken.woodruff@gmail.com"},"repository":{"type":"git","url":"git://github.com/femto113/node-bobsled.git"},"main":"bobsled.js","scripts":{"test":"node test/test.js"},"license":"MIT","engines":{"node":">= 0.4.7"},"_npmUser":{"name":"femto113","email":"ken.woodruff@gmail.com"},"_id":"bobsled@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5d907601ae3b9bf0253c3c93cd39884ae1042a1b","tarball":"http://registry.npmjs.org/bobsled/-/bobsled-0.1.2.tgz"},"maintainers":[{"name":"femto113","email":"ken.woodruff@gmail.com"}]}},"readme":"# bobsled\n\nLike every other Rails dev teaching themselves node I decided my first project would\nbe to write my own app framework.  Since it took me a day longer to discover\n[express](http://expressjs.com/) than it should have I actually got it working\nand then unwisely built some other stuff on on top of it, so now I'm releasing it\na poor attempt to justify abusing NPM as my personal code repository/dependency manager.\nYou're welcome to use it for any purpose you see fit, but I really can't recommend that\nyou do, it's not stable, well-tested, well-thought-out, nor, well, well-anything.\nAbout the only redeemable features of bobsled are that it has very few dependencies\nand it uses the the awesomely fast [doT.js](http://olado.github.com/doT/) template library,\nbut even that it perverts with ASP style delimiters (<% %>) instead of mustache.\n\n## Install\n\n    npm install bobsled\n\nor\n\n    git clone http://github.com/femto113/node-bobsled.git\n    cd node-bobsled\n    npm link\n\n## Example\n\n    var Bobsled = require(\"./bobsled\").Bobsled;\n\n    var bobsled = new Bobsled();\n    bobsled.routes.GET[\"/helloworld\"] = {\n      \"*\": function (pathinfo, request, response) {\n            response.writeHead(200, {\"content-type\": \"text/plain\"});\n            response.end(\"helloworld\");\n          }\n    };\n    bobsled.start();\n","maintainers":[{"name":"femto113","email":"ken.woodruff@gmail.com"}],"time":{"modified":"2012-05-22T22:32:39.135Z","created":"2012-04-24T19:33:08.133Z","0.0.1":"2012-04-24T19:33:09.594Z","0.0.3":"2012-05-09T21:30:37.766Z","0.1.0":"2012-05-21T22:30:13.560Z","0.1.1":"2012-05-22T20:00:43.075Z","0.1.2":"2012-05-22T22:32:39.135Z"},"author":{"name":"Ken Woodruff","email":"ken.woodruff@gmail.com"},"repository":{"type":"git","url":"git://github.com/femto113/node-bobsled.git"},"_attachments":{"bobsled-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uY/M0Kj4DkDkZUj0B7JxKA==","length":6813,"stub":true},"bobsled-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ynNjSMyEIw97fO3UMcKyJA==","length":6754,"stub":true},"bobsled-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BShtfFk0lAVpVdCdo1/Tqg==","length":6667,"stub":true},"bobsled-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WWi6MWlUodPuxJB3upT0+A==","length":5131,"stub":true},"bobsled-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-65Ta5/so4S20WXPzgdAR3Q==","length":4513,"stub":true}}}},
{"id":"bogart","key":"bogart","value":{"rev":"101-3b45a5348214e250cedc20d7e4cb6eb1"},"doc":{"_id":"bogart","_rev":"101-3b45a5348214e250cedc20d7e4cb6eb1","name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","dist-tags":{"latest":"0.3.38"},"versions":{"0.0.3":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.0.3","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"_id":"bogart@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bogart/-/bogart-0.0.3.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.0":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.1.0","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"jar:http://github.com/kriszyp/jsgi-node/zipball/master!/lib/jsgi-node","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"_id":"bogart@0.1.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bogart/-/bogart-0.1.0.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.1":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.1.1","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.1","jsgi":"v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"patr":">= 0.2.1"},"_id":"bogart@0.1.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bogart/-/bogart-0.1.1.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.2":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.1.2","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.1","jsgi":"v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"patr":">= 0.2.1","haml":">=0.2.5"},"_id":"bogart@0.1.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bogart/-/bogart-0.1.2.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.3":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.1.3","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.1","jsgi":"v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"patr":">= 0.2.1","haml":">=0.2.5"},"_id":"bogart@0.1.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/bogart/-/bogart-0.1.3.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.5":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.1.5","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":">=v0.2.1","jsgi":"v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"patr":">= 0.2.1","haml":">=0.2.5"},"scripts":{"test":"node test/all-tests.js"},"_id":"bogart@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c7d6ecb361a9f02afeae8b8e8f26158beb2fe5aa","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.1.5.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.6":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.1.6","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":">=v0.2.1","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"patr":">= 0.2.1","haml":">=0.2.5"},"scripts":{"test":"node test/all-tests.js"},"_id":"bogart@0.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a5a3a9318486cb3bbb5c72cece0ed20288d2a26f","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.1.6.tgz"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.2.0":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.2.0","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":">=v0.2.1","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"patr":">= 0.2.1","haml":">=0.2.5"},"scripts":{"test":"node test/all-tests.js"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"cef235a9551d7bd257faecafe86e3cfc846b9b3a","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.2.0.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.0":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.0","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":">=v0.2.1","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"bd7316ee42afa547a4a8f79bdf9affe342cbf120","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.0.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.2":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.2","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"51961c04ee8a490d6d48ac8fb6a476d8af83a223","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.2.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.3":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.3","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"65ff0d3d60d70fc66c1c7fe319b2c925809ab83d","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.3.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.4":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.4","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"cdaed4a3cfc1877da3045fe34738cd4d64d37fa8","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.4.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.7":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.7","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":"1.0.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"62ea9c06a8c36ea43096de02bf55f263062d0ea8","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.7.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.8":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.8","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"mappings":{"promised-io":"http://github.com/kriszyp/promised-io/zipball/v0.2.1","jsgi":"http://github.com/kriszyp/jsgi-node/zipball/v0.2.2","patr":"jar:http://github.com/kriszyp/patr/zipball/master!/lib/","haml":"jar:http://github.com/visionmedia/haml.js/zipball/master!/lib/haml.js","pintura":"http://github.com/kriszyp/pintura/zipball/v0.2.1"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fa8ebe3efc3c7a7fbd719ec16f17e6a06c4da478","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.8.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.11":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.11","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c14da3127be37c6215528778484c30489881efd2","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.11.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.12":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.12","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.12/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"68397821b14789b1185ac953b7348de4b019bfd7","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.12.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.13":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.13","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart/0.3.13/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart@0.3.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d50add59f162539568bf57a2d945438fc4e8f392","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.13.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"}},"0.3.14":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.14","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"266b6732488282481688d93084a2a4f97601e2ff","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.14.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.15":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.15","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","parted":"=0.0.7"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.15","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c7095090a8ff7a96f7e9ff20ee73ffd9e6a41764","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.15.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.16":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.16","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","parted":"=0.0.7","q":"=0.7.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"315d7d825c7574ff7b558063b260ba9b7e3f61d0","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.16.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.18":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.18","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.7","q":"=0.7.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.18","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"1f569ab38aeb5b4224f20ec62c860bbf3827db9a","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.18.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.19":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.19","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.19","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"663a2f594732ca69e1ea2084fbbea9c08f2003e2","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.19.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.20":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.20","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.20","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d7b2c3143052a44d1b8c31c7aca2d9a53f5dac54","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.20.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.21":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.21","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.21","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ed555688ada0296d2e194012159bf93d0a9526cd","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.21.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.22":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.22","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.22","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"adace73610872b38819ddf7bbcd7598914a886d4","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.22.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.23":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.23","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","node-proxy":"=0.5.2","oauth":"=0.9.5"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.23","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ca729b66234ff432c7dca3d8b83ae60ed4ae8bcb","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.23.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.24":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.24","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","node-proxy":"=0.5.2","oauth":"=0.9.5"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.24","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9a7d98c9f8176be2f17293e6a842452e58329630","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.24.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.25":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.25","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.25","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"57da7d2f236f2904a4faa448377b4a7033b7c44b","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.25.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.26":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.26","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.26","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9f20ca970dc91d0e22f6a8f515b8c0787ef43cad","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.26.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.27":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.27","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart","directories":{"lib":"./lib"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","deflate":">=1.0.3","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.27","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f8e7286a43eaceb291eb926969edd2efa30d5e4b","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.27.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.28":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.28","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5","request":"=2.2.9"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.28","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"08c4c9fefd63c129763d45eafb0f0a51584f197e","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.28.tgz"},"readme":"# Bogart\n\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\n\n## Getting Started\n\nBogart can be installed via [npm](https://github.com/isaacs/npm).\n\n    npm install bogart\n\nAlternatively, clone the git repository.\n\n    git clone git://github.com/nrstott/bogart.git\n\n## Hello World in Bogart\n\nMake a directory: `mkdir hello-world`\n\nCreate the following file:\n\n### app.js\n\n    var bogart = require('bogart');\n\n    var router = bogart.router();\n    router.get('/', function(req) { \n      return \"hello world\"; \n    });\n\n    router.get('/:name', function(req) {\n      return 'hello '+req.params.name;\n    });\n    \n    var app = bogart.app();\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\n    app.use(router); // Our router\n\n    app.start();\n\nStart your app: `node app.js`\n\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\n\n## Changing the port\n\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\n\n## Routing\n\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\nURL matching pattern and a handler function.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.html('Hello World');\n    });\n\nRoutes are tested for matches in the order in which they are defined.\n\n### Route Patterns\n\nRoute patterns are matched against URLs.  They may include named parameters that will\nbe accessible via the `params` object of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req) {\n      var greeting = 'Hello '+req.params.name;\n      return bogart.html(greeting);\n    });\n\nIt is also possible to access named parameters via arguments passed to the handler function.\nNamed parameters will be passed in the order they are speicifed in the route pattern.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req, name) {\n      return bogart.html('Hello '+name);\n    });\n\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\nwill not match beyond a path separator (\"/\").\n\n    var router = bogart.router();\n    router.get('/hello/*', function(req, name) {\n        return bogart.html('Hello '+req.params.splat[0]);\n    });\n\n### Regex Routes\n\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\nURLs are to be matched.\n\n    var router = bogart.router();\n    router.get(/\\/posts?/, function(req) {\n      // Matches 'post' or 'posts'\n      return bogart.html('Regex Route');\n    });\n\nParameters are via regular expression groups in regular expression routes.  The parameter values\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get(/hello-(.*)/, function(req) {\n      var name = req.params.splat[0];\n      return bogart.html('Hello '+name);\n    });\n\n## Bogart Application\n\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\nwith `app.use`. To start the application, use the `start` method.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\n    var router = bogart.router();\n    // NOTE: Here you would normally add some routes.\n\n    app.use(router);\n    app.start();\n\n## Response Helpers\n\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\nparameter of an options object that allows the caller to override defaults. The options object \nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\n\n### Respond with JSON\n\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.json({ framework: 'Bogart' });\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': 'application/json' },\n      body: [ '{ \"framework\": \"Bogart\" }' ]\n    }\n\n### Redirect\n\nHelper to create a HTTP 302 Temporary Redirect response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.redirect('/some/other/url');\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 302,\n      headers: { 'Location': '/some/other/url' },\n      body: []\n    }\n\n### Error\n\nHelper to create a HTTP 500 Internal Server Error response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.error('<html>...</html>');\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 500,\n      headers: { 'Content-Type': 'text/html' },\n      body: [ '<html>...</html>' ]\n    }\n\n### Not Modified\n\nHelper to create a HTTP 304 Not Modified response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.notModified();\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 304,\n      headers: {},\n      body: []\n    }\n\n### File (Streaming!)\n\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\nContent-Type of the response is determined by the mime type of the file.\n\nSample Route:\n\n    var path = require('path');\n\n    var router = bogart.router();\n    router.get('/download/*', function(req) {\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\n\n      return bogart.file(filePath);\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': '<mimetype of the file>' },\n      body: fileStream // <-- A file stream\n    }\n\n### Proxy (Streaming!)\n\nHelper to create a response that proxies the response from a URL.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/google', function(req) {\n      return bogart.proxy('http://www.google.com');\n    });\n\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\n\n## Imperative Response Builder\n\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\nrecommended as a goto style of programming in Bogart, there are times when buiding a \nresponse imperatively makes for cleaner, better code. This is true especially\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      var res = bogart.response();\n\n      doSomethingAsync(function(err, messageStr) {\n        res.setHeader('Content-Type', 'text/plain');\n\n        if (err) {\n          res.status(500);\n          res.send('Error');\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\n        }\n\n        res.status(200);\n        res.send(messageStr);\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\n      });\n\n      return res;\n    });\n\n## Using Session\n\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\n\nA `session` function will be available on the request object passed to your route handlers. This\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\nA call to session with one argument is a get to the value of the key referenced by the argument.\n\n    req.session('name'); // => value associated with 'name'\n\nA call to session with two arguments is a set.\n\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\n\n### Contrived Example\n\nA set of two routes that use session:\n\n    router.get('/:name', function(req) {\n      req.session('name', req.params.name);\n      return bogart.redirect('/');\n    });\n\n    router.get('/', function(req) {\n      return bogart.html('Hello ' +req.session('name'));\n    });\n\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \nbe displayed by the root route '/', after the redirect.\n\n## Running the Examples\n\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\n\n### Hello World\n\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\n\n    > cd examples\n    > node hello-world.js\n\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\n\n### Mustache Template with Layout\n\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\nto hold other templates to avoid duplication of content.\n\n    > cd examples/mustache-layout\n    > node app.js\n\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \n\n### Jade\n\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\n\n## Middleware\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\nnormal usage.\n\n#### Batteries\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\nwant to use them.\n\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\nto `batteries`:\n\n    error -> validateResponse -> directory -> parted -> methodOverride \n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\n\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\nthe request is routed to the `directory` middleware to serve a static file.\n\n#### Binary Split\nChoose between two JSGI appliances based upon the request.\n\n#### Serve Static Files\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\n\n    > cd examples/static-server\n    > node app.js\n    \nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\nYou should see the image.\n\n#### Error\nTranslates rejected promises to a JSGI error response.\n\n#### Flash\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\n\n#### MethodOverride\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\n\n#### ParseJson\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### ParseForm\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### Parted\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\nParted is a streaming multipart, json, and urlencoded parser.\n\n#### Session\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\n\n## Design Philosophy\n\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\n* Be verbose when it does not increase typing for the API user.\n  A good example of this would be in naming of function parameters. The parameter\n  name does not affect the user of the API, so making it more verbose makes for\n  better self-documenting code.\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\n  be attached to in a specific scope and will only call a success and/or error callback\n  one time.\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\n* Prefer composition to inheritance.\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\n  Also, Bogart is expected to be cross-platform in the future.\n\n## Promises\n\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\n\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\n\n### Terminology\n\n* Listener: A function listening for the resolution or rejection of a Promise.\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\n* Callback: A function executed upon successful resolution of a Promise.\n* Errback: A function executed when a Promise is rejected\n* Progressback: A function executed to provide intermediate results of a Promise.\n\n### How Promises Work\n\nPromises may only be resolved one time. In the future, when success listeners are added to a \npromise that has already been resolved, the success listener will be invoked with the\npreviously resolved value. Each success listener or error listener is invoked one time and\none time only.\n\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \nnot just use an EventEmitter. Promises have a different contract. The fact that promises\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\n\n    function helloWorld() {\n\n      // Retrieve the q promise utility\n      var q = require('bogart').q;\n\n      // Create a deferred, a wrapper around a Promise.\n      var deferred = q.defer();\n\n      // Do something async\n      setTimeout(function() {\n        // Resolve the promise, this will cause success listeners to be invoked.\n        deferred.resolve('hello world');\n      }, 100);\n\n      // Return the promise that the deferred wraps to the client.\n      return deferred.promise;\n    }\n\n    // Consuming the helloWorld function\n    var p = helloWorld();\n    p.then(function(msg) {\n      // This function will be invoked on success\n      console.log(msg);\n    }, function(err) {\n      // This function will be invoked on error.\n      console.log(err);\n    });\n\n### The `then` Method\n\n`promise.then(callback, errback, progress)`\n\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\n\n### The `when` Function\n\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\n\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\n\n    // The following two lines are equivalent with the exception that the `when` can \n    // handle values that are not promises.\n    q.when(p, function() { console.log('Success'); });\n    p.then(function() { console.log('Success'); });\n\n### Bubbling\n\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\n\n    function bubble(p) {\n      return p.then(function() {\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\n        return makePromise();\n      });\n    }\n\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\n\n    p.then(function(url) {\n      return request(url).then(function() {\n        throw 'error';\n      });\n    }, function(err) {\n      // Will handle the error that occurs in the callback of `request.then`.\n      console.log(err);\n    });\n\n### Working with Node.JS Callbacks\n\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\n\n    var fs = require('fs'); // Node File System Module\n    var bogart = require('bogart'); // Include Bogart\n\n    // A promise-based version of fs.readFile.\n    var readFile = bogart.promisify(fs.readFile);\n\n    readFile('test.txt').then(function(data) {\n      console.log(data);\n    });\n\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\n\n### Promises are 'A Good Thing'\n\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\n`bogart.promisify` so working wtih callback based APIs is still simple.\n\n## JSGI\n\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\nRuby's Rack and Python's WSGI.\n\n### Entities\n\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\n\n### Bogart Relationship to JSGI\n\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\n\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\n\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\n\n## Supporting Modules\n\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\n\n## Contributors\n\n* [Nathan Stott](https://github.com/nrstott)\n* [Nick Fitzgerald](https://github.com/fitzgen)\n* [Martin Murphy](https://github.com/soitgoes)\n* [Davis Clark](https://github.com/jdc0589)\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\n* [Lewis Patterson](https://github.com/lpatters)\n\n## License\n\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.29":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.29","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5","request":"=2.2.9"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.29","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"aaef8049000ca86cb30792fe89ad1ad2a65636d6","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.29.tgz"},"readme":"# Bogart\n\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\n\n## Getting Started\n\nBogart can be installed via [npm](https://github.com/isaacs/npm).\n\n    npm install bogart\n\nAlternatively, clone the git repository.\n\n    git clone git://github.com/nrstott/bogart.git\n\n## Hello World in Bogart\n\nMake a directory: `mkdir hello-world`\n\nCreate the following file:\n\n### app.js\n\n    var bogart = require('bogart');\n\n    var router = bogart.router();\n    router.get('/', function(req) { \n      return \"hello world\"; \n    });\n\n    router.get('/:name', function(req) {\n      return 'hello '+req.params.name;\n    });\n    \n    var app = bogart.app();\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\n    app.use(router); // Our router\n\n    app.start();\n\nStart your app: `node app.js`\n\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\n\n## Changing the port\n\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\n\n## Routing\n\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\nURL matching pattern and a handler function.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.html('Hello World');\n    });\n\nRoutes are tested for matches in the order in which they are defined.\n\n### Route Patterns\n\nRoute patterns are matched against URLs.  They may include named parameters that will\nbe accessible via the `params` object of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req) {\n      var greeting = 'Hello '+req.params.name;\n      return bogart.html(greeting);\n    });\n\nIt is also possible to access named parameters via arguments passed to the handler function.\nNamed parameters will be passed in the order they are speicifed in the route pattern.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req, name) {\n      return bogart.html('Hello '+name);\n    });\n\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\nwill not match beyond a path separator (\"/\").\n\n    var router = bogart.router();\n    router.get('/hello/*', function(req, name) {\n        return bogart.html('Hello '+req.params.splat[0]);\n    });\n\n### Regex Routes\n\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\nURLs are to be matched.\n\n    var router = bogart.router();\n    router.get(/\\/posts?/, function(req) {\n      // Matches 'post' or 'posts'\n      return bogart.html('Regex Route');\n    });\n\nParameters are via regular expression groups in regular expression routes.  The parameter values\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get(/hello-(.*)/, function(req) {\n      var name = req.params.splat[0];\n      return bogart.html('Hello '+name);\n    });\n\n## Bogart Application\n\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\nwith `app.use`. To start the application, use the `start` method.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\n    var router = bogart.router();\n    // NOTE: Here you would normally add some routes.\n\n    app.use(router);\n    app.start();\n\n## Response Helpers\n\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\nparameter of an options object that allows the caller to override defaults. The options object \nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\n\n### Respond with JSON\n\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.json({ framework: 'Bogart' });\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': 'application/json' },\n      body: [ '{ \"framework\": \"Bogart\" }' ]\n    }\n\n### Redirect\n\nHelper to create a HTTP 302 Temporary Redirect response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.redirect('/some/other/url');\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 302,\n      headers: { 'Location': '/some/other/url' },\n      body: []\n    }\n\n### Error\n\nHelper to create a HTTP 500 Internal Server Error response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.error('<html>...</html>');\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 500,\n      headers: { 'Content-Type': 'text/html' },\n      body: [ '<html>...</html>' ]\n    }\n\n### Not Modified\n\nHelper to create a HTTP 304 Not Modified response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.notModified();\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 304,\n      headers: {},\n      body: []\n    }\n\n### File (Streaming!)\n\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\nContent-Type of the response is determined by the mime type of the file.\n\nSample Route:\n\n    var path = require('path');\n\n    var router = bogart.router();\n    router.get('/download/*', function(req) {\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\n\n      return bogart.file(filePath);\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': '<mimetype of the file>' },\n      body: fileStream // <-- A file stream\n    }\n\n### Proxy (Streaming!)\n\nHelper to create a response that proxies the response from a URL.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/google', function(req) {\n      return bogart.proxy('http://www.google.com');\n    });\n\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\n\n## Imperative Response Builder\n\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\nrecommended as a goto style of programming in Bogart, there are times when buiding a \nresponse imperatively makes for cleaner, better code. This is true especially\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      var res = bogart.response();\n\n      doSomethingAsync(function(err, messageStr) {\n        res.setHeader('Content-Type', 'text/plain');\n\n        if (err) {\n          res.status(500);\n          res.send('Error');\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\n        }\n\n        res.status(200);\n        res.send(messageStr);\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\n      });\n\n      return res;\n    });\n\n## Using Session\n\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\n\nA `session` function will be available on the request object passed to your route handlers. This\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\nA call to session with one argument is a get to the value of the key referenced by the argument.\n\n    req.session('name'); // => value associated with 'name'\n\nA call to session with two arguments is a set.\n\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\n\n### Contrived Example\n\nA set of two routes that use session:\n\n    router.get('/:name', function(req) {\n      req.session('name', req.params.name);\n      return bogart.redirect('/');\n    });\n\n    router.get('/', function(req) {\n      return bogart.html('Hello ' +req.session('name'));\n    });\n\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \nbe displayed by the root route '/', after the redirect.\n\n## Running the Examples\n\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\n\n### Hello World\n\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\n\n    > cd examples\n    > node hello-world.js\n\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\n\n### Mustache Template with Layout\n\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\nto hold other templates to avoid duplication of content.\n\n    > cd examples/mustache-layout\n    > node app.js\n\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \n\n### Jade\n\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\n\n## Middleware\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\nnormal usage.\n\n#### Batteries\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\nwant to use them.\n\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\nto `batteries`:\n\n    error -> validateResponse -> directory -> parted -> methodOverride \n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\n\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\nthe request is routed to the `directory` middleware to serve a static file.\n\n#### Binary Split\nChoose between two JSGI appliances based upon the request.\n\n#### Serve Static Files\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\n\n    > cd examples/static-server\n    > node app.js\n    \nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\nYou should see the image.\n\n#### Error\nTranslates rejected promises to a JSGI error response.\n\n#### Flash\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\n\n#### MethodOverride\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\n\n#### ParseJson\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### ParseForm\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### Parted\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\nParted is a streaming multipart, json, and urlencoded parser.\n\n#### Session\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\n\n## Design Philosophy\n\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\n* Be verbose when it does not increase typing for the API user.\n  A good example of this would be in naming of function parameters. The parameter\n  name does not affect the user of the API, so making it more verbose makes for\n  better self-documenting code.\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\n  be attached to in a specific scope and will only call a success and/or error callback\n  one time.\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\n* Prefer composition to inheritance.\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\n  Also, Bogart is expected to be cross-platform in the future.\n\n## Promises\n\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\n\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\n\n### Terminology\n\n* Listener: A function listening for the resolution or rejection of a Promise.\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\n* Callback: A function executed upon successful resolution of a Promise.\n* Errback: A function executed when a Promise is rejected\n* Progressback: A function executed to provide intermediate results of a Promise.\n\n### How Promises Work\n\nPromises may only be resolved one time. In the future, when success listeners are added to a \npromise that has already been resolved, the success listener will be invoked with the\npreviously resolved value. Each success listener or error listener is invoked one time and\none time only.\n\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \nnot just use an EventEmitter. Promises have a different contract. The fact that promises\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\n\n    function helloWorld() {\n\n      // Retrieve the q promise utility\n      var q = require('bogart').q;\n\n      // Create a deferred, a wrapper around a Promise.\n      var deferred = q.defer();\n\n      // Do something async\n      setTimeout(function() {\n        // Resolve the promise, this will cause success listeners to be invoked.\n        deferred.resolve('hello world');\n      }, 100);\n\n      // Return the promise that the deferred wraps to the client.\n      return deferred.promise;\n    }\n\n    // Consuming the helloWorld function\n    var p = helloWorld();\n    p.then(function(msg) {\n      // This function will be invoked on success\n      console.log(msg);\n    }, function(err) {\n      // This function will be invoked on error.\n      console.log(err);\n    });\n\n### The `then` Method\n\n`promise.then(callback, errback, progress)`\n\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\n\n### The `when` Function\n\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\n\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\n\n    // The following two lines are equivalent with the exception that the `when` can \n    // handle values that are not promises.\n    q.when(p, function() { console.log('Success'); });\n    p.then(function() { console.log('Success'); });\n\n### Bubbling\n\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\n\n    function bubble(p) {\n      return p.then(function() {\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\n        return makePromise();\n      });\n    }\n\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\n\n    p.then(function(url) {\n      return request(url).then(function() {\n        throw 'error';\n      });\n    }, function(err) {\n      // Will handle the error that occurs in the callback of `request.then`.\n      console.log(err);\n    });\n\n### Working with Node.JS Callbacks\n\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\n\n    var fs = require('fs'); // Node File System Module\n    var bogart = require('bogart'); // Include Bogart\n\n    // A promise-based version of fs.readFile.\n    var readFile = bogart.promisify(fs.readFile);\n\n    readFile('test.txt').then(function(data) {\n      console.log(data);\n    });\n\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\n\n### Promises are 'A Good Thing'\n\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\n`bogart.promisify` so working wtih callback based APIs is still simple.\n\n## JSGI\n\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\nRuby's Rack and Python's WSGI.\n\n### Entities\n\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\n\n### Bogart Relationship to JSGI\n\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\n\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\n\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\n\n## Supporting Modules\n\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\n\n## Contributors\n\n* [Nathan Stott](https://github.com/nrstott)\n* [Nick Fitzgerald](https://github.com/fitzgen)\n* [Martin Murphy](https://github.com/soitgoes)\n* [Davis Clark](https://github.com/jdc0589)\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\n* [Lewis Patterson](https://github.com/lpatters)\n\n## License\n\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.30":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.30","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5","request":"=2.2.9"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.30","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3e7e1dd91af8b5421d43be26910e120d0eee2605","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.30.tgz"},"readme":"# Bogart\n\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\n\n## Getting Started\n\nBogart can be installed via [npm](https://github.com/isaacs/npm).\n\n    npm install bogart\n\nAlternatively, clone the git repository.\n\n    git clone git://github.com/nrstott/bogart.git\n\n## Hello World in Bogart\n\nMake a directory: `mkdir hello-world`\n\nCreate the following file:\n\n### app.js\n\n    var bogart = require('bogart');\n\n    var router = bogart.router();\n    router.get('/', function(req) { \n      return \"hello world\"; \n    });\n\n    router.get('/:name', function(req) {\n      return 'hello '+req.params.name;\n    });\n    \n    var app = bogart.app();\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\n    app.use(router); // Our router\n\n    app.start();\n\nStart your app: `node app.js`\n\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\n\n## Changing the port\n\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\n\n## Routing\n\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\nURL matching pattern and a handler function.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.html('Hello World');\n    });\n\nRoutes are tested for matches in the order in which they are defined.\n\n### Route Patterns\n\nRoute patterns are matched against URLs.  They may include named parameters that will\nbe accessible via the `params` object of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req) {\n      var greeting = 'Hello '+req.params.name;\n      return bogart.html(greeting);\n    });\n\nIt is also possible to access named parameters via arguments passed to the handler function.\nNamed parameters will be passed in the order they are speicifed in the route pattern.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req, name) {\n      return bogart.html('Hello '+name);\n    });\n\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\nwill not match beyond a path separator (\"/\").\n\n    var router = bogart.router();\n    router.get('/hello/*', function(req, name) {\n        return bogart.html('Hello '+req.params.splat[0]);\n    });\n\n### Regex Routes\n\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\nURLs are to be matched.\n\n    var router = bogart.router();\n    router.get(/\\/posts?/, function(req) {\n      // Matches 'post' or 'posts'\n      return bogart.html('Regex Route');\n    });\n\nParameters are via regular expression groups in regular expression routes.  The parameter values\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get(/hello-(.*)/, function(req) {\n      var name = req.params.splat[0];\n      return bogart.html('Hello '+name);\n    });\n\n## Bogart Application\n\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\nwith `app.use`. To start the application, use the `start` method.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\n    var router = bogart.router();\n    // NOTE: Here you would normally add some routes.\n\n    app.use(router);\n    app.start();\n\n## Response Helpers\n\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\nparameter of an options object that allows the caller to override defaults. The options object \nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\n\n### Respond with JSON\n\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.json({ framework: 'Bogart' });\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': 'application/json' },\n      body: [ '{ \"framework\": \"Bogart\" }' ]\n    }\n\n### Redirect\n\nHelper to create a HTTP 302 Temporary Redirect response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.redirect('/some/other/url');\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 302,\n      headers: { 'Location': '/some/other/url' },\n      body: []\n    }\n\n### Error\n\nHelper to create a HTTP 500 Internal Server Error response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.error('<html>...</html>');\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 500,\n      headers: { 'Content-Type': 'text/html' },\n      body: [ '<html>...</html>' ]\n    }\n\n### Not Modified\n\nHelper to create a HTTP 304 Not Modified response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.notModified();\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 304,\n      headers: {},\n      body: []\n    }\n\n### File (Streaming!)\n\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\nContent-Type of the response is determined by the mime type of the file.\n\nSample Route:\n\n    var path = require('path');\n\n    var router = bogart.router();\n    router.get('/download/*', function(req) {\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\n\n      return bogart.file(filePath);\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': '<mimetype of the file>' },\n      body: fileStream // <-- A file stream\n    }\n\n### Proxy (Streaming!)\n\nHelper to create a response that proxies the response from a URL.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/google', function(req) {\n      return bogart.proxy('http://www.google.com');\n    });\n\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\n\n## Imperative Response Builder\n\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\nrecommended as a goto style of programming in Bogart, there are times when buiding a \nresponse imperatively makes for cleaner, better code. This is true especially\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      var res = bogart.response();\n\n      doSomethingAsync(function(err, messageStr) {\n        res.setHeader('Content-Type', 'text/plain');\n\n        if (err) {\n          res.status(500);\n          res.send('Error');\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\n        }\n\n        res.status(200);\n        res.send(messageStr);\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\n      });\n\n      return res;\n    });\n\n## Using Session\n\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\n\nA `session` function will be available on the request object passed to your route handlers. This\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\nA call to session with one argument is a get to the value of the key referenced by the argument.\n\n    req.session('name'); // => value associated with 'name'\n\nA call to session with two arguments is a set.\n\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\n\n### Contrived Example\n\nA set of two routes that use session:\n\n    router.get('/:name', function(req) {\n      req.session('name', req.params.name);\n      return bogart.redirect('/');\n    });\n\n    router.get('/', function(req) {\n      return bogart.html('Hello ' +req.session('name'));\n    });\n\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \nbe displayed by the root route '/', after the redirect.\n\n## Running the Examples\n\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\n\n### Hello World\n\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\n\n    > cd examples\n    > node hello-world.js\n\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\n\n### Mustache Template with Layout\n\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\nto hold other templates to avoid duplication of content.\n\n    > cd examples/mustache-layout\n    > node app.js\n\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \n\n### Jade\n\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\n\n## Middleware\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\nnormal usage.\n\n#### Batteries\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\nwant to use them.\n\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\nto `batteries`:\n\n    error -> validateResponse -> directory -> parted -> methodOverride \n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\n\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\nthe request is routed to the `directory` middleware to serve a static file.\n\n#### Binary Split\nChoose between two JSGI appliances based upon the request.\n\n#### Serve Static Files\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\n\n    > cd examples/static-server\n    > node app.js\n    \nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\nYou should see the image.\n\n#### Error\nTranslates rejected promises to a JSGI error response.\n\n#### Flash\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\n\n#### MethodOverride\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\n\n#### ParseJson\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### ParseForm\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### Parted\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\nParted is a streaming multipart, json, and urlencoded parser.\n\n#### Session\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\n\n## Design Philosophy\n\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\n* Be verbose when it does not increase typing for the API user.\n  A good example of this would be in naming of function parameters. The parameter\n  name does not affect the user of the API, so making it more verbose makes for\n  better self-documenting code.\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\n  be attached to in a specific scope and will only call a success and/or error callback\n  one time.\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\n* Prefer composition to inheritance.\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\n  Also, Bogart is expected to be cross-platform in the future.\n\n## Promises\n\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\n\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\n\n### Terminology\n\n* Listener: A function listening for the resolution or rejection of a Promise.\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\n* Callback: A function executed upon successful resolution of a Promise.\n* Errback: A function executed when a Promise is rejected\n* Progressback: A function executed to provide intermediate results of a Promise.\n\n### How Promises Work\n\nPromises may only be resolved one time. In the future, when success listeners are added to a \npromise that has already been resolved, the success listener will be invoked with the\npreviously resolved value. Each success listener or error listener is invoked one time and\none time only.\n\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \nnot just use an EventEmitter. Promises have a different contract. The fact that promises\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\n\n    function helloWorld() {\n\n      // Retrieve the q promise utility\n      var q = require('bogart').q;\n\n      // Create a deferred, a wrapper around a Promise.\n      var deferred = q.defer();\n\n      // Do something async\n      setTimeout(function() {\n        // Resolve the promise, this will cause success listeners to be invoked.\n        deferred.resolve('hello world');\n      }, 100);\n\n      // Return the promise that the deferred wraps to the client.\n      return deferred.promise;\n    }\n\n    // Consuming the helloWorld function\n    var p = helloWorld();\n    p.then(function(msg) {\n      // This function will be invoked on success\n      console.log(msg);\n    }, function(err) {\n      // This function will be invoked on error.\n      console.log(err);\n    });\n\n### The `then` Method\n\n`promise.then(callback, errback, progress)`\n\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\n\n### The `when` Function\n\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\n\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\n\n    // The following two lines are equivalent with the exception that the `when` can \n    // handle values that are not promises.\n    q.when(p, function() { console.log('Success'); });\n    p.then(function() { console.log('Success'); });\n\n### Bubbling\n\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\n\n    function bubble(p) {\n      return p.then(function() {\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\n        return makePromise();\n      });\n    }\n\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\n\n    p.then(function(url) {\n      return request(url).then(function() {\n        throw 'error';\n      });\n    }, function(err) {\n      // Will handle the error that occurs in the callback of `request.then`.\n      console.log(err);\n    });\n\n### Working with Node.JS Callbacks\n\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\n\n    var fs = require('fs'); // Node File System Module\n    var bogart = require('bogart'); // Include Bogart\n\n    // A promise-based version of fs.readFile.\n    var readFile = bogart.promisify(fs.readFile);\n\n    readFile('test.txt').then(function(data) {\n      console.log(data);\n    });\n\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\n\n### Promises are 'A Good Thing'\n\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\n`bogart.promisify` so working wtih callback based APIs is still simple.\n\n## JSGI\n\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\nRuby's Rack and Python's WSGI.\n\n### Entities\n\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\n\n### Bogart Relationship to JSGI\n\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\n\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\n\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\n\n## Supporting Modules\n\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\n\n## Contributors\n\n* [Nathan Stott](https://github.com/nrstott)\n* [Nick Fitzgerald](https://github.com/fitzgen)\n* [Martin Murphy](https://github.com/soitgoes)\n* [Davis Clark](https://github.com/jdc0589)\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\n* [Lewis Patterson](https://github.com/lpatters)\n\n## License\n\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.32":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.32","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5","request":"=2.2.9"},"devDependencies":{"expresso":">= 0.8.1","haml":">=0.4.2","jade":">=0.15.4"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.32","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"db7ca96e2c908ba1cbfea7b8b3c34cabb9faf46a","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.32.tgz"},"readme":"# Bogart\n\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\n\n## Getting Started\n\nBogart can be installed via [npm](https://github.com/isaacs/npm).\n\n    npm install bogart\n\nAlternatively, clone the git repository.\n\n    git clone git://github.com/nrstott/bogart.git\n\n## Hello World in Bogart\n\nMake a directory: `mkdir hello-world`\n\nCreate the following file:\n\n### app.js\n\n    var bogart = require('bogart');\n\n    var router = bogart.router();\n    router.get('/', function(req) { \n      return \"hello world\"; \n    });\n\n    router.get('/:name', function(req) {\n      return 'hello '+req.params.name;\n    });\n    \n    var app = bogart.app();\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\n    app.use(router); // Our router\n\n    app.start();\n\nStart your app: `node app.js`\n\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\n\n## Changing the port\n\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\n\n## Routing\n\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\nURL matching pattern and a handler function.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.html('Hello World');\n    });\n\nRoutes are tested for matches in the order in which they are defined.\n\n### Route Patterns\n\nRoute patterns are matched against URLs.  They may include named parameters that will\nbe accessible via the `params` object of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req) {\n      var greeting = 'Hello '+req.params.name;\n      return bogart.html(greeting);\n    });\n\nIt is also possible to access named parameters via arguments passed to the handler function.\nNamed parameters will be passed in the order they are speicifed in the route pattern.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req, name) {\n      return bogart.html('Hello '+name);\n    });\n\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\nwill not match beyond a path separator (\"/\").\n\n    var router = bogart.router();\n    router.get('/hello/*', function(req, name) {\n        return bogart.html('Hello '+req.params.splat[0]);\n    });\n\n### Regex Routes\n\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\nURLs are to be matched.\n\n    var router = bogart.router();\n    router.get(/\\/posts?/, function(req) {\n      // Matches 'post' or 'posts'\n      return bogart.html('Regex Route');\n    });\n\nParameters are via regular expression groups in regular expression routes.  The parameter values\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get(/hello-(.*)/, function(req) {\n      var name = req.params.splat[0];\n      return bogart.html('Hello '+name);\n    });\n\n## Bogart Application\n\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\nwith `app.use`. To start the application, use the `start` method.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\n    var router = bogart.router();\n    // NOTE: Here you would normally add some routes.\n\n    app.use(router);\n    app.start();\n\n## Response Helpers\n\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\nparameter of an options object that allows the caller to override defaults. The options object \nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\n\n### Respond with JSON\n\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.json({ framework: 'Bogart' });\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': 'application/json' },\n      body: [ '{ \"framework\": \"Bogart\" }' ]\n    }\n\n### Redirect\n\nHelper to create a HTTP 302 Temporary Redirect response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.redirect('/some/other/url');\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 302,\n      headers: { 'Location': '/some/other/url' },\n      body: []\n    }\n\n### Error\n\nHelper to create a HTTP 500 Internal Server Error response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.error('<html>...</html>');\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 500,\n      headers: { 'Content-Type': 'text/html' },\n      body: [ '<html>...</html>' ]\n    }\n\n### Not Modified\n\nHelper to create a HTTP 304 Not Modified response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.notModified();\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 304,\n      headers: {},\n      body: []\n    }\n\n### File (Streaming!)\n\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\nContent-Type of the response is determined by the mime type of the file.\n\nSample Route:\n\n    var path = require('path');\n\n    var router = bogart.router();\n    router.get('/download/*', function(req) {\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\n\n      return bogart.file(filePath);\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': '<mimetype of the file>' },\n      body: fileStream // <-- A file stream\n    }\n\n### Proxy (Streaming!)\n\nHelper to create a response that proxies the response from a URL.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/google', function(req) {\n      return bogart.proxy('http://www.google.com');\n    });\n\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\n\n## Imperative Response Builder\n\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\nrecommended as a goto style of programming in Bogart, there are times when buiding a \nresponse imperatively makes for cleaner, better code. This is true especially\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      var res = bogart.response();\n\n      doSomethingAsync(function(err, messageStr) {\n        res.setHeader('Content-Type', 'text/plain');\n\n        if (err) {\n          res.status(500);\n          res.send('Error');\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\n        }\n\n        res.status(200);\n        res.send(messageStr);\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\n      });\n\n      return res;\n    });\n\n## Using Session\n\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\n\nA `session` function will be available on the request object passed to your route handlers. This\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\nA call to session with one argument is a get to the value of the key referenced by the argument.\n\n    req.session('name'); // => value associated with 'name'\n\nA call to session with two arguments is a set.\n\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\n\n### Contrived Example\n\nA set of two routes that use session:\n\n    router.get('/:name', function(req) {\n      req.session('name', req.params.name);\n      return bogart.redirect('/');\n    });\n\n    router.get('/', function(req) {\n      return bogart.html('Hello ' +req.session('name'));\n    });\n\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \nbe displayed by the root route '/', after the redirect.\n\n## Running the Examples\n\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\n\n### Hello World\n\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\n\n    > cd examples\n    > node hello-world.js\n\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\n\n### Mustache Template with Layout\n\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\nto hold other templates to avoid duplication of content.\n\n    > cd examples/mustache-layout\n    > node app.js\n\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \n\n### Jade\n\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\n\n## Middleware\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\nnormal usage.\n\n#### Batteries\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\nwant to use them.\n\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\nto `batteries`:\n\n    error -> validateResponse -> directory -> parted -> methodOverride \n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\n\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\nthe request is routed to the `directory` middleware to serve a static file.\n\n#### Binary Split\nChoose between two JSGI appliances based upon the request.\n\n#### Serve Static Files\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\n\n    > cd examples/static-server\n    > node app.js\n    \nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\nYou should see the image.\n\n#### Error\nTranslates rejected promises to a JSGI error response.\n\n#### Flash\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\n\n#### MethodOverride\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\n\n#### ParseJson\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### ParseForm\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### Parted\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\nParted is a streaming multipart, json, and urlencoded parser.\n\n#### Session\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\n\n## Design Philosophy\n\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\n* Be verbose when it does not increase typing for the API user.\n  A good example of this would be in naming of function parameters. The parameter\n  name does not affect the user of the API, so making it more verbose makes for\n  better self-documenting code.\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\n  be attached to in a specific scope and will only call a success and/or error callback\n  one time.\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\n* Prefer composition to inheritance.\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\n  Also, Bogart is expected to be cross-platform in the future.\n\n## Promises\n\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\n\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\n\n### Terminology\n\n* Listener: A function listening for the resolution or rejection of a Promise.\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\n* Callback: A function executed upon successful resolution of a Promise.\n* Errback: A function executed when a Promise is rejected\n* Progressback: A function executed to provide intermediate results of a Promise.\n\n### How Promises Work\n\nPromises may only be resolved one time. In the future, when success listeners are added to a \npromise that has already been resolved, the success listener will be invoked with the\npreviously resolved value. Each success listener or error listener is invoked one time and\none time only.\n\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \nnot just use an EventEmitter. Promises have a different contract. The fact that promises\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\n\n    function helloWorld() {\n\n      // Retrieve the q promise utility\n      var q = require('bogart').q;\n\n      // Create a deferred, a wrapper around a Promise.\n      var deferred = q.defer();\n\n      // Do something async\n      setTimeout(function() {\n        // Resolve the promise, this will cause success listeners to be invoked.\n        deferred.resolve('hello world');\n      }, 100);\n\n      // Return the promise that the deferred wraps to the client.\n      return deferred.promise;\n    }\n\n    // Consuming the helloWorld function\n    var p = helloWorld();\n    p.then(function(msg) {\n      // This function will be invoked on success\n      console.log(msg);\n    }, function(err) {\n      // This function will be invoked on error.\n      console.log(err);\n    });\n\n### The `then` Method\n\n`promise.then(callback, errback, progress)`\n\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\n\n### The `when` Function\n\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\n\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\n\n    // The following two lines are equivalent with the exception that the `when` can \n    // handle values that are not promises.\n    q.when(p, function() { console.log('Success'); });\n    p.then(function() { console.log('Success'); });\n\n### Bubbling\n\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\n\n    function bubble(p) {\n      return p.then(function() {\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\n        return makePromise();\n      });\n    }\n\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\n\n    p.then(function(url) {\n      return request(url).then(function() {\n        throw 'error';\n      });\n    }, function(err) {\n      // Will handle the error that occurs in the callback of `request.then`.\n      console.log(err);\n    });\n\n### Working with Node.JS Callbacks\n\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\n\n    var fs = require('fs'); // Node File System Module\n    var bogart = require('bogart'); // Include Bogart\n\n    // A promise-based version of fs.readFile.\n    var readFile = bogart.promisify(fs.readFile);\n\n    readFile('test.txt').then(function(data) {\n      console.log(data);\n    });\n\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\n\n### Promises are 'A Good Thing'\n\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\n`bogart.promisify` so working wtih callback based APIs is still simple.\n\n## JSGI\n\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\nRuby's Rack and Python's WSGI.\n\n### Entities\n\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\n\n### Bogart Relationship to JSGI\n\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\n\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\n\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\n\n## Supporting Modules\n\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\n\n## Contributors\n\n* [Nathan Stott](https://github.com/nrstott)\n* [Nick Fitzgerald](https://github.com/fitzgen)\n* [Martin Murphy](https://github.com/soitgoes)\n* [Davis Clark](https://github.com/jdc0589)\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\n* [Lewis Patterson](https://github.com/lpatters)\n\n## License\n\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.33":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.33","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"bin":{"bogart":"./bin/bogart"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","q":"=0.7.2","oauth":"=0.9.5","request":"=2.2.9","commander":"*","mkdirp":"*"},"devDependencies":{"haml":">=0.4.2","jade":">=0.15.4","tap":"*"},"scripts":{"test":"tap ./test/middleware.test.js ./test/response-builder.test.js ./test/response-helpers.test.js ./test/router.test.js ./test/stream.test.js ./test/util.test.js ./test/view.test.js"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.33","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7d21529d2a347dcf0e15c09ac4414d5163dfe347","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.33.tgz"},"readme":"# Bogart\r\n\r\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\r\n\r\n## Getting Started\r\n\r\nBogart can be installed via [npm](https://github.com/isaacs/npm).\r\n\r\n    npm install bogart\r\n\r\nAlternatively, clone the git repository.\r\n\r\n    git clone git://github.com/nrstott/bogart.git\r\n\r\n## Hello World in Bogart\r\n\r\nMake a directory: `mkdir hello-world`\r\n\r\nCreate the following file:\r\n\r\n### app.js\r\n\r\n    var bogart = require('bogart');\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) { \r\n      return \"hello world\"; \r\n    });\r\n\r\n    router.get('/:name', function(req) {\r\n      return 'hello '+req.params.name;\r\n    });\r\n    \r\n    var app = bogart.app();\r\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\r\n    app.use(router); // Our router\r\n\r\n    app.start();\r\n\r\nStart your app: `node app.js`\r\n\r\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\r\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\r\n\r\n## Changing the port\r\n\r\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\r\n\r\n## Routing\r\n\r\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\r\nURL matching pattern and a handler function.\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.html('Hello World');\r\n    });\r\n\r\nRoutes are tested for matches in the order in which they are defined.\r\n\r\n### Route Patterns\r\n\r\nRoute patterns are matched against URLs.  They may include named parameters that will\r\nbe accessible via the `params` object of the `req` object passed to the route handler.\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/:name', function(req) {\r\n      var greeting = 'Hello '+req.params.name;\r\n      return bogart.html(greeting);\r\n    });\r\n\r\nIt is also possible to access named parameters via arguments passed to the handler function.\r\nNamed parameters will be passed in the order they are speicifed in the route pattern.\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/:name', function(req, name) {\r\n      return bogart.html('Hello '+name);\r\n    });\r\n\r\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\r\nwill not match beyond a path separator (\"/\").\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/*', function(req, name) {\r\n        return bogart.html('Hello '+req.params.splat[0]);\r\n    });\r\n\r\n### Regex Routes\r\n\r\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\r\nURLs are to be matched.\r\n\r\n    var router = bogart.router();\r\n    router.get(/\\/posts?/, function(req) {\r\n      // Matches 'post' or 'posts'\r\n      return bogart.html('Regex Route');\r\n    });\r\n\r\nParameters are via regular expression groups in regular expression routes.  The parameter values\r\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\r\n\r\n    var router = bogart.router();\r\n    router.get(/hello-(.*)/, function(req) {\r\n      var name = req.params.splat[0];\r\n      return bogart.html('Hello '+name);\r\n    });\r\n\r\n## Bogart Application\r\n\r\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \r\n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\r\n\r\n    var app = bogart.app();\r\n    app.use(bogart.batteries);\r\n\r\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\r\nwith `app.use`. To start the application, use the `start` method.\r\n\r\n    var app = bogart.app();\r\n    app.use(bogart.batteries);\r\n\r\n    var router = bogart.router();\r\n    // NOTE: Here you would normally add some routes.\r\n\r\n    app.use(router);\r\n    app.start();\r\n\r\n## Response Helpers\r\n\r\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\r\nparameter of an options object that allows the caller to override defaults. The options object \r\nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\r\n\r\n### Respond with JSON\r\n\r\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.json({ framework: 'Bogart' });\r\n    });\r\n\r\nThis route yields the following JSGI Response:\r\n\r\n    {\r\n      status: 200,\r\n      headers: { 'Content-Type': 'application/json' },\r\n      body: [ '{ \"framework\": \"Bogart\" }' ]\r\n    }\r\n\r\n### Redirect\r\n\r\nHelper to create a HTTP 302 Temporary Redirect response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.redirect('/some/other/url');\r\n    });\r\n\r\nThis route yields the following JSGI Response:\r\n\r\n    {\r\n      status: 302,\r\n      headers: { 'Location': '/some/other/url' },\r\n      body: []\r\n    }\r\n\r\n### Error\r\n\r\nHelper to create a HTTP 500 Internal Server Error response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.error('<html>...</html>');\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 500,\r\n      headers: { 'Content-Type': 'text/html' },\r\n      body: [ '<html>...</html>' ]\r\n    }\r\n\r\n### Not Modified\r\n\r\nHelper to create a HTTP 304 Not Modified response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.notModified();\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 304,\r\n      headers: {},\r\n      body: []\r\n    }\r\n\r\n### File (Streaming!)\r\n\r\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\r\nContent-Type of the response is determined by the mime type of the file.\r\n\r\nSample Route:\r\n\r\n    var path = require('path');\r\n\r\n    var router = bogart.router();\r\n    router.get('/download/*', function(req) {\r\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\r\n\r\n      return bogart.file(filePath);\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 200,\r\n      headers: { 'Content-Type': '<mimetype of the file>' },\r\n      body: fileStream // <-- A file stream\r\n    }\r\n\r\n### Proxy (Streaming!)\r\n\r\nHelper to create a response that proxies the response from a URL.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/google', function(req) {\r\n      return bogart.proxy('http://www.google.com');\r\n    });\r\n\r\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\r\n\r\n## Imperative Response Builder\r\n\r\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\r\nrecommended as a goto style of programming in Bogart, there are times when buiding a \r\nresponse imperatively makes for cleaner, better code. This is true especially\r\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      var res = bogart.response();\r\n\r\n      doSomethingAsync(function(err, messageStr) {\r\n        res.setHeader('Content-Type', 'text/plain');\r\n\r\n        if (err) {\r\n          res.status(500);\r\n          res.send('Error');\r\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\r\n        }\r\n\r\n        res.status(200);\r\n        res.send(messageStr);\r\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\r\n      });\r\n\r\n      return res;\r\n    });\r\n\r\n## Using Session\r\n\r\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\r\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\r\n\r\nA `session` function will be available on the request object passed to your route handlers. This\r\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\r\nA call to session with one argument is a get to the value of the key referenced by the argument.\r\n\r\n    req.session('name'); // => value associated with 'name'\r\n\r\nA call to session with two arguments is a set.\r\n\r\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\r\n\r\n### Contrived Example\r\n\r\nA set of two routes that use session:\r\n\r\n    router.get('/:name', function(req) {\r\n      req.session('name', req.params.name);\r\n      return bogart.redirect('/');\r\n    });\r\n\r\n    router.get('/', function(req) {\r\n      return bogart.html('Hello ' +req.session('name'));\r\n    });\r\n\r\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \r\nbe displayed by the root route '/', after the redirect.\r\n\r\n## Running the Examples\r\n\r\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\r\n\r\n### Hello World\r\n\r\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\r\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\r\n\r\n    > cd examples\r\n    > node hello-world.js\r\n\r\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\r\n\r\n### Mustache Template with Layout\r\n\r\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\r\nto hold other templates to avoid duplication of content.\r\n\r\n    > cd examples/mustache-layout\r\n    > node app.js\r\n\r\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \r\n\r\n### Jade\r\n\r\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \r\nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\r\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\r\n\r\n## Middleware\r\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\r\nnormal usage.\r\n\r\n#### Batteries\r\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\r\nwant to use them.\r\n\r\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\r\nto `batteries`:\r\n\r\n    error -> validateResponse -> directory -> parted -> methodOverride \r\n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\r\n\r\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\r\nthe request is routed to the `directory` middleware to serve a static file.\r\n\r\n#### Binary Split\r\nChoose between two JSGI appliances based upon the request.\r\n\r\n#### Serve Static Files\r\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\r\n\r\n    > cd examples/static-server\r\n    > node app.js\r\n    \r\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\r\nYou should see the image.\r\n\r\n#### Error\r\nTranslates rejected promises to a JSGI error response.\r\n\r\n#### Flash\r\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\r\n\r\n#### MethodOverride\r\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\r\n\r\n#### ParseJson\r\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\r\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\r\n\r\n#### ParseForm\r\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\r\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\r\n\r\n#### Parted\r\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\r\nParted is a streaming multipart, json, and urlencoded parser.\r\n\r\n#### Session\r\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\r\n\r\n## Design Philosophy\r\n\r\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\r\n* Be verbose when it does not increase typing for the API user.\r\n  A good example of this would be in naming of function parameters. The parameter\r\n  name does not affect the user of the API, so making it more verbose makes for\r\n  better self-documenting code.\r\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\r\n  be attached to in a specific scope and will only call a success and/or error callback\r\n  one time.\r\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\r\n* Prefer composition to inheritance.\r\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\r\n  Also, Bogart is expected to be cross-platform in the future.\r\n\r\n## Promises\r\n\r\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\r\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\r\n\r\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\r\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\r\n\r\n### Terminology\r\n\r\n* Listener: A function listening for the resolution or rejection of a Promise.\r\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\r\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\r\n* Callback: A function executed upon successful resolution of a Promise.\r\n* Errback: A function executed when a Promise is rejected\r\n* Progressback: A function executed to provide intermediate results of a Promise.\r\n\r\n### How Promises Work\r\n\r\nPromises may only be resolved one time. In the future, when success listeners are added to a \r\npromise that has already been resolved, the success listener will be invoked with the\r\npreviously resolved value. Each success listener or error listener is invoked one time and\r\none time only.\r\n\r\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \r\nnot just use an EventEmitter. Promises have a different contract. The fact that promises\r\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\r\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\r\n\r\n    function helloWorld() {\r\n\r\n      // Retrieve the q promise utility\r\n      var q = require('bogart').q;\r\n\r\n      // Create a deferred, a wrapper around a Promise.\r\n      var deferred = q.defer();\r\n\r\n      // Do something async\r\n      setTimeout(function() {\r\n        // Resolve the promise, this will cause success listeners to be invoked.\r\n        deferred.resolve('hello world');\r\n      }, 100);\r\n\r\n      // Return the promise that the deferred wraps to the client.\r\n      return deferred.promise;\r\n    }\r\n\r\n    // Consuming the helloWorld function\r\n    var p = helloWorld();\r\n    p.then(function(msg) {\r\n      // This function will be invoked on success\r\n      console.log(msg);\r\n    }, function(err) {\r\n      // This function will be invoked on error.\r\n      console.log(err);\r\n    });\r\n\r\n### The `then` Method\r\n\r\n`promise.then(callback, errback, progress)`\r\n\r\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\r\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \r\nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \r\nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\r\n\r\n### The `when` Function\r\n\r\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\r\n\r\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \r\nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\r\n\r\n    // The following two lines are equivalent with the exception that the `when` can \r\n    // handle values that are not promises.\r\n    q.when(p, function() { console.log('Success'); });\r\n    p.then(function() { console.log('Success'); });\r\n\r\n### Bubbling\r\n\r\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\r\n\r\n    function bubble(p) {\r\n      return p.then(function() {\r\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\r\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\r\n        return makePromise();\r\n      });\r\n    }\r\n\r\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\r\n\r\n    p.then(function(url) {\r\n      return request(url).then(function() {\r\n        throw 'error';\r\n      });\r\n    }, function(err) {\r\n      // Will handle the error that occurs in the callback of `request.then`.\r\n      console.log(err);\r\n    });\r\n\r\n### Working with Node.JS Callbacks\r\n\r\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\r\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\r\n\r\n    var fs = require('fs'); // Node File System Module\r\n    var bogart = require('bogart'); // Include Bogart\r\n\r\n    // A promise-based version of fs.readFile.\r\n    var readFile = bogart.promisify(fs.readFile);\r\n\r\n    readFile('test.txt').then(function(data) {\r\n      console.log(data);\r\n    });\r\n\r\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \r\nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \r\nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\r\n\r\n### Promises are 'A Good Thing'\r\n\r\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\r\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\r\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\r\n`bogart.promisify` so working wtih callback based APIs is still simple.\r\n\r\n## JSGI\r\n\r\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\r\nRuby's Rack and Python's WSGI.\r\n\r\n### Entities\r\n\r\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\r\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\r\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\r\n\r\n### Bogart Relationship to JSGI\r\n\r\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\r\n\r\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\r\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\r\n\r\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\r\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\r\n\r\n## Supporting Modules\r\n\r\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\r\n\r\n## Contributors\r\n\r\n* [Nathan Stott](https://github.com/nrstott)\r\n* [Nick Fitzgerald](https://github.com/fitzgen)\r\n* [Martin Murphy](https://github.com/soitgoes)\r\n* [Davis Clark](https://github.com/jdc0589)\r\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\r\n* [Lewis Patterson](https://github.com/lpatters)\r\n\r\n## License\r\n\r\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to\r\ndeal in the Software without restriction, including without limitation the\r\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r\nsell copies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.34":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.34","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"bin":{"bogart":"./bin/bogart"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","oauth":"=0.9.5","request":"=2.2.9","commander":"*","mkdirp":"*"},"devDependencies":{"haml":">=0.4.2","jade":">=0.15.4","tap":"*"},"scripts":{"test":"tap ./test/middleware.test.js ./test/response-builder.test.js ./test/response-helpers.test.js ./test/router.test.js ./test/stream.test.js ./test/util.test.js ./test/view.test.js"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.34","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"985afc5aaa016d56571d95133bba64eeca11ace0","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.34.tgz"},"readme":"# Bogart\r\n\r\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\r\n\r\n## Getting Started\r\n\r\nBogart can be installed via [npm](https://github.com/isaacs/npm).\r\n\r\n    npm install bogart\r\n\r\nAlternatively, clone the git repository.\r\n\r\n    git clone git://github.com/nrstott/bogart.git\r\n\r\n## Hello World in Bogart\r\n\r\nMake a directory: `mkdir hello-world`\r\n\r\nCreate the following file:\r\n\r\n### app.js\r\n\r\n    var bogart = require('bogart');\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) { \r\n      return \"hello world\"; \r\n    });\r\n\r\n    router.get('/:name', function(req) {\r\n      return 'hello '+req.params.name;\r\n    });\r\n    \r\n    var app = bogart.app();\r\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\r\n    app.use(router); // Our router\r\n\r\n    app.start();\r\n\r\nStart your app: `node app.js`\r\n\r\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\r\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\r\n\r\n## Changing the port\r\n\r\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\r\n\r\n## Routing\r\n\r\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\r\nURL matching pattern and a handler function.\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.html('Hello World');\r\n    });\r\n\r\nRoutes are tested for matches in the order in which they are defined.\r\n\r\n### Route Patterns\r\n\r\nRoute patterns are matched against URLs.  They may include named parameters that will\r\nbe accessible via the `params` object of the `req` object passed to the route handler.\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/:name', function(req) {\r\n      var greeting = 'Hello '+req.params.name;\r\n      return bogart.html(greeting);\r\n    });\r\n\r\nIt is also possible to access named parameters via arguments passed to the handler function.\r\nNamed parameters will be passed in the order they are speicifed in the route pattern.\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/:name', function(req, name) {\r\n      return bogart.html('Hello '+name);\r\n    });\r\n\r\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\r\nwill not match beyond a path separator (\"/\").\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/*', function(req, name) {\r\n        return bogart.html('Hello '+req.params.splat[0]);\r\n    });\r\n\r\n### Regex Routes\r\n\r\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\r\nURLs are to be matched.\r\n\r\n    var router = bogart.router();\r\n    router.get(/\\/posts?/, function(req) {\r\n      // Matches 'post' or 'posts'\r\n      return bogart.html('Regex Route');\r\n    });\r\n\r\nParameters are via regular expression groups in regular expression routes.  The parameter values\r\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\r\n\r\n    var router = bogart.router();\r\n    router.get(/hello-(.*)/, function(req) {\r\n      var name = req.params.splat[0];\r\n      return bogart.html('Hello '+name);\r\n    });\r\n\r\n## Bogart Application\r\n\r\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \r\n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\r\n\r\n    var app = bogart.app();\r\n    app.use(bogart.batteries);\r\n\r\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\r\nwith `app.use`. To start the application, use the `start` method.\r\n\r\n    var app = bogart.app();\r\n    app.use(bogart.batteries);\r\n\r\n    var router = bogart.router();\r\n    // NOTE: Here you would normally add some routes.\r\n\r\n    app.use(router);\r\n    app.start();\r\n\r\n## Response Helpers\r\n\r\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\r\nparameter of an options object that allows the caller to override defaults. The options object \r\nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\r\n\r\n### Respond with JSON\r\n\r\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.json({ framework: 'Bogart' });\r\n    });\r\n\r\nThis route yields the following JSGI Response:\r\n\r\n    {\r\n      status: 200,\r\n      headers: { 'Content-Type': 'application/json' },\r\n      body: [ '{ \"framework\": \"Bogart\" }' ]\r\n    }\r\n\r\n### Redirect\r\n\r\nHelper to create a HTTP 302 Temporary Redirect response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.redirect('/some/other/url');\r\n    });\r\n\r\nThis route yields the following JSGI Response:\r\n\r\n    {\r\n      status: 302,\r\n      headers: { 'Location': '/some/other/url' },\r\n      body: []\r\n    }\r\n\r\n### Error\r\n\r\nHelper to create a HTTP 500 Internal Server Error response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.error('<html>...</html>');\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 500,\r\n      headers: { 'Content-Type': 'text/html' },\r\n      body: [ '<html>...</html>' ]\r\n    }\r\n\r\n### Not Modified\r\n\r\nHelper to create a HTTP 304 Not Modified response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.notModified();\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 304,\r\n      headers: {},\r\n      body: []\r\n    }\r\n\r\n### File (Streaming!)\r\n\r\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\r\nContent-Type of the response is determined by the mime type of the file.\r\n\r\nSample Route:\r\n\r\n    var path = require('path');\r\n\r\n    var router = bogart.router();\r\n    router.get('/download/*', function(req) {\r\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\r\n\r\n      return bogart.file(filePath);\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 200,\r\n      headers: { 'Content-Type': '<mimetype of the file>' },\r\n      body: fileStream // <-- A file stream\r\n    }\r\n\r\n### Proxy (Streaming!)\r\n\r\nHelper to create a response that proxies the response from a URL.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/google', function(req) {\r\n      return bogart.proxy('http://www.google.com');\r\n    });\r\n\r\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\r\n\r\n## Imperative Response Builder\r\n\r\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\r\nrecommended as a goto style of programming in Bogart, there are times when buiding a \r\nresponse imperatively makes for cleaner, better code. This is true especially\r\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      var res = bogart.response();\r\n\r\n      doSomethingAsync(function(err, messageStr) {\r\n        res.setHeader('Content-Type', 'text/plain');\r\n\r\n        if (err) {\r\n          res.status(500);\r\n          res.send('Error');\r\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\r\n        }\r\n\r\n        res.status(200);\r\n        res.send(messageStr);\r\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\r\n      });\r\n\r\n      return res;\r\n    });\r\n\r\n## Using Session\r\n\r\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\r\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\r\n\r\nA `session` function will be available on the request object passed to your route handlers. This\r\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\r\nA call to session with one argument is a get to the value of the key referenced by the argument.\r\n\r\n    req.session('name'); // => value associated with 'name'\r\n\r\nA call to session with two arguments is a set.\r\n\r\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\r\n\r\n### Contrived Example\r\n\r\nA set of two routes that use session:\r\n\r\n    router.get('/:name', function(req) {\r\n      req.session('name', req.params.name);\r\n      return bogart.redirect('/');\r\n    });\r\n\r\n    router.get('/', function(req) {\r\n      return bogart.html('Hello ' +req.session('name'));\r\n    });\r\n\r\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \r\nbe displayed by the root route '/', after the redirect.\r\n\r\n## Running the Examples\r\n\r\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\r\n\r\n### Hello World\r\n\r\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\r\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\r\n\r\n    > cd examples\r\n    > node hello-world.js\r\n\r\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\r\n\r\n### Mustache Template with Layout\r\n\r\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\r\nto hold other templates to avoid duplication of content.\r\n\r\n    > cd examples/mustache-layout\r\n    > node app.js\r\n\r\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \r\n\r\n### Jade\r\n\r\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \r\nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\r\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\r\n\r\n## Middleware\r\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\r\nnormal usage.\r\n\r\n#### Batteries\r\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\r\nwant to use them.\r\n\r\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\r\nto `batteries`:\r\n\r\n    error -> validateResponse -> directory -> parted -> methodOverride \r\n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\r\n\r\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\r\nthe request is routed to the `directory` middleware to serve a static file.\r\n\r\n#### Binary Split\r\nChoose between two JSGI appliances based upon the request.\r\n\r\n#### Serve Static Files\r\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\r\n\r\n    > cd examples/static-server\r\n    > node app.js\r\n    \r\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\r\nYou should see the image.\r\n\r\n#### Error\r\nTranslates rejected promises to a JSGI error response.\r\n\r\n#### Flash\r\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\r\n\r\n#### MethodOverride\r\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\r\n\r\n#### ParseJson\r\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\r\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\r\n\r\n#### ParseForm\r\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\r\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\r\n\r\n#### Parted\r\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\r\nParted is a streaming multipart, json, and urlencoded parser.\r\n\r\n#### Session\r\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\r\n\r\n## Design Philosophy\r\n\r\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\r\n* Be verbose when it does not increase typing for the API user.\r\n  A good example of this would be in naming of function parameters. The parameter\r\n  name does not affect the user of the API, so making it more verbose makes for\r\n  better self-documenting code.\r\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\r\n  be attached to in a specific scope and will only call a success and/or error callback\r\n  one time.\r\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\r\n* Prefer composition to inheritance.\r\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\r\n  Also, Bogart is expected to be cross-platform in the future.\r\n\r\n## Promises\r\n\r\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\r\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\r\n\r\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\r\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\r\n\r\n### Terminology\r\n\r\n* Listener: A function listening for the resolution or rejection of a Promise.\r\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\r\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\r\n* Callback: A function executed upon successful resolution of a Promise.\r\n* Errback: A function executed when a Promise is rejected\r\n* Progressback: A function executed to provide intermediate results of a Promise.\r\n\r\n### How Promises Work\r\n\r\nPromises may only be resolved one time. In the future, when success listeners are added to a \r\npromise that has already been resolved, the success listener will be invoked with the\r\npreviously resolved value. Each success listener or error listener is invoked one time and\r\none time only.\r\n\r\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \r\nnot just use an EventEmitter. Promises have a different contract. The fact that promises\r\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\r\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\r\n\r\n    function helloWorld() {\r\n\r\n      // Retrieve the q promise utility\r\n      var q = require('bogart').q;\r\n\r\n      // Create a deferred, a wrapper around a Promise.\r\n      var deferred = q.defer();\r\n\r\n      // Do something async\r\n      setTimeout(function() {\r\n        // Resolve the promise, this will cause success listeners to be invoked.\r\n        deferred.resolve('hello world');\r\n      }, 100);\r\n\r\n      // Return the promise that the deferred wraps to the client.\r\n      return deferred.promise;\r\n    }\r\n\r\n    // Consuming the helloWorld function\r\n    var p = helloWorld();\r\n    p.then(function(msg) {\r\n      // This function will be invoked on success\r\n      console.log(msg);\r\n    }, function(err) {\r\n      // This function will be invoked on error.\r\n      console.log(err);\r\n    });\r\n\r\n### The `then` Method\r\n\r\n`promise.then(callback, errback, progress)`\r\n\r\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\r\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \r\nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \r\nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\r\n\r\n### The `when` Function\r\n\r\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\r\n\r\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \r\nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\r\n\r\n    // The following two lines are equivalent with the exception that the `when` can \r\n    // handle values that are not promises.\r\n    q.when(p, function() { console.log('Success'); });\r\n    p.then(function() { console.log('Success'); });\r\n\r\n### Bubbling\r\n\r\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\r\n\r\n    function bubble(p) {\r\n      return p.then(function() {\r\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\r\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\r\n        return makePromise();\r\n      });\r\n    }\r\n\r\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\r\n\r\n    p.then(function(url) {\r\n      return request(url).then(function() {\r\n        throw 'error';\r\n      });\r\n    }, function(err) {\r\n      // Will handle the error that occurs in the callback of `request.then`.\r\n      console.log(err);\r\n    });\r\n\r\n### Working with Node.JS Callbacks\r\n\r\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\r\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\r\n\r\n    var fs = require('fs'); // Node File System Module\r\n    var bogart = require('bogart'); // Include Bogart\r\n\r\n    // A promise-based version of fs.readFile.\r\n    var readFile = bogart.promisify(fs.readFile);\r\n\r\n    readFile('test.txt').then(function(data) {\r\n      console.log(data);\r\n    });\r\n\r\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \r\nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \r\nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\r\n\r\n### Promises are 'A Good Thing'\r\n\r\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\r\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\r\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\r\n`bogart.promisify` so working wtih callback based APIs is still simple.\r\n\r\n## JSGI\r\n\r\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\r\nRuby's Rack and Python's WSGI.\r\n\r\n### Entities\r\n\r\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\r\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\r\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\r\n\r\n### Bogart Relationship to JSGI\r\n\r\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\r\n\r\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\r\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\r\n\r\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\r\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\r\n\r\n## Supporting Modules\r\n\r\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\r\n\r\n## Contributors\r\n\r\n* [Nathan Stott](https://github.com/nrstott)\r\n* [Nick Fitzgerald](https://github.com/fitzgen)\r\n* [Martin Murphy](https://github.com/soitgoes)\r\n* [Davis Clark](https://github.com/jdc0589)\r\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\r\n* [Lewis Patterson](https://github.com/lpatters)\r\n\r\n## License\r\n\r\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to\r\ndeal in the Software without restriction, including without limitation the\r\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r\nsell copies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.35":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.35","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","oauth":"=0.9.5","request":"=2.2.9","commander":"*","mkdirp":"*"},"devDependencies":{"haml":">=0.4.2","jade":">=0.15.4","tap":"*"},"scripts":{"test":"tap ./test/middleware.test.js ./test/response-builder.test.js ./test/response-helpers.test.js ./test/router.test.js ./test/stream.test.js ./test/util.test.js ./test/view.test.js"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.35","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"fef58bce7744da01c75b3c16ffaebf39a1bbe183","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.35.tgz"},"readme":"# Bogart\r\n\r\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\r\n\r\n## Getting Started\r\n\r\nBogart can be installed via [npm](https://github.com/isaacs/npm).\r\n\r\n    npm install bogart\r\n\r\nAlternatively, clone the git repository.\r\n\r\n    git clone git://github.com/nrstott/bogart.git\r\n\r\n## Hello World in Bogart\r\n\r\nMake a directory: `mkdir hello-world`\r\n\r\nCreate the following file:\r\n\r\n### app.js\r\n\r\n    var bogart = require('bogart');\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) { \r\n      return \"hello world\"; \r\n    });\r\n\r\n    router.get('/:name', function(req) {\r\n      return 'hello '+req.params.name;\r\n    });\r\n    \r\n    var app = bogart.app();\r\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\r\n    app.use(router); // Our router\r\n\r\n    app.start();\r\n\r\nStart your app: `node app.js`\r\n\r\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\r\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\r\n\r\n## Changing the port\r\n\r\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\r\n\r\n## Routing\r\n\r\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\r\nURL matching pattern and a handler function.\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.html('Hello World');\r\n    });\r\n\r\nRoutes are tested for matches in the order in which they are defined.\r\n\r\n### Route Patterns\r\n\r\nRoute patterns are matched against URLs.  They may include named parameters that will\r\nbe accessible via the `params` object of the `req` object passed to the route handler.\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/:name', function(req) {\r\n      var greeting = 'Hello '+req.params.name;\r\n      return bogart.html(greeting);\r\n    });\r\n\r\nIt is also possible to access named parameters via arguments passed to the handler function.\r\nNamed parameters will be passed in the order they are speicifed in the route pattern.\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/:name', function(req, name) {\r\n      return bogart.html('Hello '+name);\r\n    });\r\n\r\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\r\nwill not match beyond a path separator (\"/\").\r\n\r\n    var router = bogart.router();\r\n    router.get('/hello/*', function(req, name) {\r\n        return bogart.html('Hello '+req.params.splat[0]);\r\n    });\r\n\r\n### Regex Routes\r\n\r\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\r\nURLs are to be matched.\r\n\r\n    var router = bogart.router();\r\n    router.get(/\\/posts?/, function(req) {\r\n      // Matches 'post' or 'posts'\r\n      return bogart.html('Regex Route');\r\n    });\r\n\r\nParameters are via regular expression groups in regular expression routes.  The parameter values\r\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\r\n\r\n    var router = bogart.router();\r\n    router.get(/hello-(.*)/, function(req) {\r\n      var name = req.params.splat[0];\r\n      return bogart.html('Hello '+name);\r\n    });\r\n\r\n## Bogart Application\r\n\r\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \r\n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\r\n\r\n    var app = bogart.app();\r\n    app.use(bogart.batteries);\r\n\r\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\r\nwith `app.use`. To start the application, use the `start` method.\r\n\r\n    var app = bogart.app();\r\n    app.use(bogart.batteries);\r\n\r\n    var router = bogart.router();\r\n    // NOTE: Here you would normally add some routes.\r\n\r\n    app.use(router);\r\n    app.start();\r\n\r\n## Response Helpers\r\n\r\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\r\nparameter of an options object that allows the caller to override defaults. The options object \r\nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\r\n\r\n### Respond with JSON\r\n\r\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.json({ framework: 'Bogart' });\r\n    });\r\n\r\nThis route yields the following JSGI Response:\r\n\r\n    {\r\n      status: 200,\r\n      headers: { 'Content-Type': 'application/json' },\r\n      body: [ '{ \"framework\": \"Bogart\" }' ]\r\n    }\r\n\r\n### Redirect\r\n\r\nHelper to create a HTTP 302 Temporary Redirect response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.redirect('/some/other/url');\r\n    });\r\n\r\nThis route yields the following JSGI Response:\r\n\r\n    {\r\n      status: 302,\r\n      headers: { 'Location': '/some/other/url' },\r\n      body: []\r\n    }\r\n\r\n### Error\r\n\r\nHelper to create a HTTP 500 Internal Server Error response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.error('<html>...</html>');\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 500,\r\n      headers: { 'Content-Type': 'text/html' },\r\n      body: [ '<html>...</html>' ]\r\n    }\r\n\r\n### Not Modified\r\n\r\nHelper to create a HTTP 304 Not Modified response.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      return bogart.notModified();\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 304,\r\n      headers: {},\r\n      body: []\r\n    }\r\n\r\n### File (Streaming!)\r\n\r\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\r\nContent-Type of the response is determined by the mime type of the file.\r\n\r\nSample Route:\r\n\r\n    var path = require('path');\r\n\r\n    var router = bogart.router();\r\n    router.get('/download/*', function(req) {\r\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\r\n\r\n      return bogart.file(filePath);\r\n    });\r\n\r\nThis route yeilds the following JSGI Response:\r\n\r\n    {\r\n      status: 200,\r\n      headers: { 'Content-Type': '<mimetype of the file>' },\r\n      body: fileStream // <-- A file stream\r\n    }\r\n\r\n### Proxy (Streaming!)\r\n\r\nHelper to create a response that proxies the response from a URL.\r\n\r\nSample Route:\r\n\r\n    var router = bogart.router();\r\n    router.get('/google', function(req) {\r\n      return bogart.proxy('http://www.google.com');\r\n    });\r\n\r\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\r\n\r\n## Imperative Response Builder\r\n\r\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\r\nrecommended as a goto style of programming in Bogart, there are times when buiding a \r\nresponse imperatively makes for cleaner, better code. This is true especially\r\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\r\n\r\n    var router = bogart.router();\r\n    router.get('/', function(req) {\r\n      var res = bogart.response();\r\n\r\n      doSomethingAsync(function(err, messageStr) {\r\n        res.setHeader('Content-Type', 'text/plain');\r\n\r\n        if (err) {\r\n          res.status(500);\r\n          res.send('Error');\r\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\r\n        }\r\n\r\n        res.status(200);\r\n        res.send(messageStr);\r\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\r\n      });\r\n\r\n      return res;\r\n    });\r\n\r\n## Using Session\r\n\r\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\r\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\r\n\r\nA `session` function will be available on the request object passed to your route handlers. This\r\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\r\nA call to session with one argument is a get to the value of the key referenced by the argument.\r\n\r\n    req.session('name'); // => value associated with 'name'\r\n\r\nA call to session with two arguments is a set.\r\n\r\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\r\n\r\n### Contrived Example\r\n\r\nA set of two routes that use session:\r\n\r\n    router.get('/:name', function(req) {\r\n      req.session('name', req.params.name);\r\n      return bogart.redirect('/');\r\n    });\r\n\r\n    router.get('/', function(req) {\r\n      return bogart.html('Hello ' +req.session('name'));\r\n    });\r\n\r\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \r\nbe displayed by the root route '/', after the redirect.\r\n\r\n## Running the Examples\r\n\r\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\r\n\r\n### Hello World\r\n\r\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\r\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\r\n\r\n    > cd examples\r\n    > node hello-world.js\r\n\r\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\r\n\r\n### Mustache Template with Layout\r\n\r\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\r\nto hold other templates to avoid duplication of content.\r\n\r\n    > cd examples/mustache-layout\r\n    > node app.js\r\n\r\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \r\n\r\n### Jade\r\n\r\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \r\nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\r\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\r\n\r\n## Middleware\r\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\r\nnormal usage.\r\n\r\n#### Batteries\r\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\r\nwant to use them.\r\n\r\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\r\nto `batteries`:\r\n\r\n    error -> validateResponse -> directory -> parted -> methodOverride \r\n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\r\n\r\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\r\nthe request is routed to the `directory` middleware to serve a static file.\r\n\r\n#### Binary Split\r\nChoose between two JSGI appliances based upon the request.\r\n\r\n#### Serve Static Files\r\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\r\n\r\n    > cd examples/static-server\r\n    > node app.js\r\n    \r\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\r\nYou should see the image.\r\n\r\n#### Error\r\nTranslates rejected promises to a JSGI error response.\r\n\r\n#### Flash\r\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\r\n\r\n#### MethodOverride\r\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\r\n\r\n#### ParseJson\r\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\r\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\r\n\r\n#### ParseForm\r\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\r\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\r\n\r\n#### Parted\r\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\r\nParted is a streaming multipart, json, and urlencoded parser.\r\n\r\n#### Session\r\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\r\n\r\n## Design Philosophy\r\n\r\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\r\n* Be verbose when it does not increase typing for the API user.\r\n  A good example of this would be in naming of function parameters. The parameter\r\n  name does not affect the user of the API, so making it more verbose makes for\r\n  better self-documenting code.\r\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\r\n  be attached to in a specific scope and will only call a success and/or error callback\r\n  one time.\r\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\r\n* Prefer composition to inheritance.\r\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\r\n  Also, Bogart is expected to be cross-platform in the future.\r\n\r\n## Promises\r\n\r\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\r\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\r\n\r\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\r\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\r\n\r\n### Terminology\r\n\r\n* Listener: A function listening for the resolution or rejection of a Promise.\r\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\r\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\r\n* Callback: A function executed upon successful resolution of a Promise.\r\n* Errback: A function executed when a Promise is rejected\r\n* Progressback: A function executed to provide intermediate results of a Promise.\r\n\r\n### How Promises Work\r\n\r\nPromises may only be resolved one time. In the future, when success listeners are added to a \r\npromise that has already been resolved, the success listener will be invoked with the\r\npreviously resolved value. Each success listener or error listener is invoked one time and\r\none time only.\r\n\r\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \r\nnot just use an EventEmitter. Promises have a different contract. The fact that promises\r\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\r\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\r\n\r\n    function helloWorld() {\r\n\r\n      // Retrieve the q promise utility\r\n      var q = require('bogart').q;\r\n\r\n      // Create a deferred, a wrapper around a Promise.\r\n      var deferred = q.defer();\r\n\r\n      // Do something async\r\n      setTimeout(function() {\r\n        // Resolve the promise, this will cause success listeners to be invoked.\r\n        deferred.resolve('hello world');\r\n      }, 100);\r\n\r\n      // Return the promise that the deferred wraps to the client.\r\n      return deferred.promise;\r\n    }\r\n\r\n    // Consuming the helloWorld function\r\n    var p = helloWorld();\r\n    p.then(function(msg) {\r\n      // This function will be invoked on success\r\n      console.log(msg);\r\n    }, function(err) {\r\n      // This function will be invoked on error.\r\n      console.log(err);\r\n    });\r\n\r\n### The `then` Method\r\n\r\n`promise.then(callback, errback, progress)`\r\n\r\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\r\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \r\nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \r\nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\r\n\r\n### The `when` Function\r\n\r\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\r\n\r\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \r\nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\r\n\r\n    // The following two lines are equivalent with the exception that the `when` can \r\n    // handle values that are not promises.\r\n    q.when(p, function() { console.log('Success'); });\r\n    p.then(function() { console.log('Success'); });\r\n\r\n### Bubbling\r\n\r\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\r\n\r\n    function bubble(p) {\r\n      return p.then(function() {\r\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\r\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\r\n        return makePromise();\r\n      });\r\n    }\r\n\r\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\r\n\r\n    p.then(function(url) {\r\n      return request(url).then(function() {\r\n        throw 'error';\r\n      });\r\n    }, function(err) {\r\n      // Will handle the error that occurs in the callback of `request.then`.\r\n      console.log(err);\r\n    });\r\n\r\n### Working with Node.JS Callbacks\r\n\r\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\r\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\r\n\r\n    var fs = require('fs'); // Node File System Module\r\n    var bogart = require('bogart'); // Include Bogart\r\n\r\n    // A promise-based version of fs.readFile.\r\n    var readFile = bogart.promisify(fs.readFile);\r\n\r\n    readFile('test.txt').then(function(data) {\r\n      console.log(data);\r\n    });\r\n\r\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \r\nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \r\nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\r\n\r\n### Promises are 'A Good Thing'\r\n\r\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\r\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\r\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\r\n`bogart.promisify` so working wtih callback based APIs is still simple.\r\n\r\n## JSGI\r\n\r\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\r\nRuby's Rack and Python's WSGI.\r\n\r\n### Entities\r\n\r\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\r\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\r\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\r\n\r\n### Bogart Relationship to JSGI\r\n\r\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\r\n\r\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\r\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\r\n\r\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\r\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\r\n\r\n## Supporting Modules\r\n\r\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\r\n\r\n## Contributors\r\n\r\n* [Nathan Stott](https://github.com/nrstott)\r\n* [Nick Fitzgerald](https://github.com/fitzgen)\r\n* [Martin Murphy](https://github.com/soitgoes)\r\n* [Davis Clark](https://github.com/jdc0589)\r\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\r\n* [Lewis Patterson](https://github.com/lpatters)\r\n\r\n## License\r\n\r\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to\r\ndeal in the Software without restriction, including without limitation the\r\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r\nsell copies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.36":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.36","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","oauth":"=0.9.5","request":"=2.2.9","commander":"*","mkdirp":"*"},"devDependencies":{"haml":">=0.4.2","jade":">=0.15.4","tap":"*"},"scripts":{"test":"tap ./test/middleware.test.js ./test/response-builder.test.js ./test/response-helpers.test.js ./test/router.test.js ./test/stream.test.js ./test/util.test.js ./test/view.test.js"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.36","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a2b35f7db0b046ab4afde014623f1919a676086e","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.36.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.3.38":{"name":"bogart","description":"Fast JSGI web framework taking inspiration from Sinatra","version":"0.3.38","keywords":["bogart","framework","sinatra","REST"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nathan.stott@whiteboard-it.com","homepage":"https://github.com/nrstott/bogart","main":"./lib/bogart","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart/issues"},"dependencies":{"promised-io":"v0.2.3","jsgi":">=v0.2.2","mustache":"0.3.1-dev","underscore":">=0.0.0","node-uuid":">=1.2.0","parted":"=0.0.8","oauth":"=0.9.5","request":"=2.2.9","commander":"*","mkdirp":"*"},"devDependencies":{"haml":">=0.4.2","jade":">=0.15.4","tap":"*"},"scripts":{"test":"tap ./test/middleware.test.js ./test/response-builder.test.js ./test/response-helpers.test.js ./test/router.test.js ./test/stream.test.js ./test/util.test.js ./test/view.test.js"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart@0.3.38","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"6e1240d871c07e1d4e19392d9d4cd07025e077eb","tarball":"http://registry.npmjs.org/bogart/-/bogart-0.3.38.tgz"},"readme":"# Bogart\n\nA blazing fast rapid application development web framework using JSGI for [node](http://nodejs.org/).\n\n## Getting Started\n\nBogart can be installed via [npm](https://github.com/isaacs/npm).\n\n    npm install bogart\n\nAlternatively, clone the git repository.\n\n    git clone git://github.com/nrstott/bogart.git\n\n## Hello World in Bogart\n\nMake a directory: `mkdir hello-world`\n\nCreate the following file:\n\n### app.js\n\n    var bogart = require('bogart');\n\n    var router = bogart.router();\n    router.get('/', function(req) { \n      return \"hello world\"; \n    });\n\n    router.get('/:name', function(req) {\n      return 'hello '+req.params.name;\n    });\n    \n    var app = bogart.app();\n    app.use(bogart.batteries); // A batteries included JSGI stack including streaming request body parsing, session, flash, and much more.\n    app.use(router); // Our router\n\n    app.start();\n\nStart your app: `node app.js`\n\nVisit it in a web browser at [http://localhost:8080](http://localhost:8080).\nVisit the route that says hello to you by name at [http://localhost:8080/bob](http://localhost:8080/bob)\n\n## Changing the port\n\nIf you can't run on 8080, change the `app.start` call e.g. `app.start(9090, '127.0.0.1')`\n\n## Routing\n\nRouting in Bogart is simple and intuitive.  A route is a HTTP method paried with a\nURL matching pattern and a handler function.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.html('Hello World');\n    });\n\nRoutes are tested for matches in the order in which they are defined.\n\n### Route Patterns\n\nRoute patterns are matched against URLs.  They may include named parameters that will\nbe accessible via the `params` object of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req) {\n      var greeting = 'Hello '+req.params.name;\n      return bogart.html(greeting);\n    });\n\nIt is also possible to access named parameters via arguments passed to the handler function.\nNamed parameters will be passed in the order they are speicifed in the route pattern.\n\n    var router = bogart.router();\n    router.get('/hello/:name', function(req, name) {\n      return bogart.html('Hello '+name);\n    });\n\nRoute patterns support wildcards. Wildcards will match anything whereas regular named parameters\nwill not match beyond a path separator (\"/\").\n\n    var router = bogart.router();\n    router.get('/hello/*', function(req, name) {\n        return bogart.html('Hello '+req.params.splat[0]);\n    });\n\n### Regex Routes\n\nWhen a route pattern is not powerful enough, regular expressions may be used to specify which\nURLs are to be matched.\n\n    var router = bogart.router();\n    router.get(/\\/posts?/, function(req) {\n      // Matches 'post' or 'posts'\n      return bogart.html('Regex Route');\n    });\n\nParameters are via regular expression groups in regular expression routes.  The parameter values\nare put in an `Array` in `req.params.splat` of the `req` object passed to the route handler.\n\n    var router = bogart.router();\n    router.get(/hello-(.*)/, function(req) {\n      var name = req.params.splat[0];\n      return bogart.html('Hello '+name);\n    });\n\n## Bogart Application\n\n`bogart.app` makes it easy to setup a middleware chain and start coding. Combined with \n`bogart.batteries` (See Below), you can setup a full-stack JSGI application in two lines of code.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\nAfter adding `bogart.batteries`, you will normally want to add a Router. This is also done\nwith `app.use`. To start the application, use the `start` method.\n\n    var app = bogart.app();\n    app.use(bogart.batteries);\n\n    var router = bogart.router();\n    // NOTE: Here you would normally add some routes.\n\n    app.use(router);\n    app.start();\n\n## Response Helpers\n\nBogart includes helpers for creating JSGI Responses. The helpers, by convention, take a final\nparameter of an options object that allows the caller to override defaults. The options object \nis merged with the default JSGI Response values of the helper before the JSGI Response is returned.\n\n### Respond with JSON\n\nHelper to create a HTTP 200 Success response with a Content-Type of application/json.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.json({ framework: 'Bogart' });\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': 'application/json' },\n      body: [ '{ \"framework\": \"Bogart\" }' ]\n    }\n\n### Redirect\n\nHelper to create a HTTP 302 Temporary Redirect response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.redirect('/some/other/url');\n    });\n\nThis route yields the following JSGI Response:\n\n    {\n      status: 302,\n      headers: { 'Location': '/some/other/url' },\n      body: []\n    }\n\n### Error\n\nHelper to create a HTTP 500 Internal Server Error response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.error('<html>...</html>');\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 500,\n      headers: { 'Content-Type': 'text/html' },\n      body: [ '<html>...</html>' ]\n    }\n\n### Not Modified\n\nHelper to create a HTTP 304 Not Modified response.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      return bogart.notModified();\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 304,\n      headers: {},\n      body: []\n    }\n\n### File (Streaming!)\n\nHelper to create a HTTP 200 Success response with a body streamed from the contents of a file. The\nContent-Type of the response is determined by the mime type of the file.\n\nSample Route:\n\n    var path = require('path');\n\n    var router = bogart.router();\n    router.get('/download/*', function(req) {\n      var filePath = path.join(__dirname, 'public', req.params.splat[0]);\n\n      return bogart.file(filePath);\n    });\n\nThis route yeilds the following JSGI Response:\n\n    {\n      status: 200,\n      headers: { 'Content-Type': '<mimetype of the file>' },\n      body: fileStream // <-- A file stream\n    }\n\n### Proxy (Streaming!)\n\nHelper to create a response that proxies the response from a URL.\n\nSample Route:\n\n    var router = bogart.router();\n    router.get('/google', function(req) {\n      return bogart.proxy('http://www.google.com');\n    });\n\nThis route yeilds a JSGI Response that matches the response from the proxied URL.\n\n## Imperative Response Builder\n\nBogart includes the ResponseBuidler helper to provide an imperative interface. While not\nrecommended as a goto style of programming in Bogart, there are times when buiding a \nresponse imperatively makes for cleaner, better code. This is true especially\nwhen working with callback based functions that cannot be wrapped by `bogart.promisify`.\n\n    var router = bogart.router();\n    router.get('/', function(req) {\n      \n      // Get a ResponseBuilder\n      var res = bogart.res();\n\n      doSomethingAsync(function(err, messageStr) {\n        res.setHeader('Content-Type', 'text/plain');\n\n        if (err) {\n          res.status(500);\n          res.send('Error');\n          return res.end(); // We use return to break out of the function, do not want to continue executing after res.end()\n        }\n\n        res.status(200);\n        res.send(messageStr);\n        res.end(); // End the Response.  This is analagous to resolving a promise for a JSGI Response.\n      });\n\n      return res;\n    });\n\n## Using Session\n\nThe session middleware can be included individually with `app.use(bogart.middleware.session)` or\nby using batteries `app.use(bogart.batteries)` which includes a default stack of JSGI middleware.\n\nA `session` function will be available on the request object passed to your route handlers. This\nfunction follows the jQuery style of arity determining if it is getting or setting a key/value pair.\nA call to session with one argument is a get to the value of the key referenced by the argument.\n\n    req.session('name'); // => value associated with 'name'\n\nA call to session with two arguments is a set.\n\n    req.session('name', 'Nathan'); // sets the value of 'name' to 'Nathan'\n\n### Contrived Example\n\nA set of two routes that use session:\n\n    router.get('/:name', function(req) {\n      req.session('name', req.params.name);\n      return bogart.redirect('/');\n    });\n\n    router.get('/', function(req) {\n      return bogart.html('Hello ' +req.session('name'));\n    });\n\nVisiting '/:name' ('/Nathan', '/Bob', etc...) will set a session key that will \nbe displayed by the root route '/', after the redirect.\n\n## Running the Examples\n\nIn the 'examples' directory of the cloned source, there are several examples of bogart applications.\n\n### Hello World\n\nThe hello world example demonstrates a basic bogart applications.  The application has a route, '/:name', that takes a name\nas a parameter in the request URL.  The application responds with 'hello <name>'.  It also has a route, '/', that responds with `hello world`.\n\n    > cd examples\n    > node hello-world.js\n\nVisit the application in your web browser at [http://localhost:8080/Jim](http://localhost:8080/Jim)\n\n### Mustache Template with Layout\n\nThis example demonstrates usage of the mustache templating engine and a mustache layout.  A layout is a page designed\nto hold other templates to avoid duplication of content.\n\n    > cd examples/mustache-layout\n    > node app.js\n\nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080)    \n\n### Jade\n\nIf you would like to use Jade instead of Mustache, please `npm install bogart-jade`. Then in \nyour application add `require('bogart-jade')` and the Jade ViewEngine will be available via\n`bogart.viewEngine('jade')`. See [the github repository](https://github.com/nrstott/bogart-jade) for more information.\n\n## Middleware\nBogart comes with a variety of JSGI middleware appliances. The `batteries` appliance includes a recommended JSGI application chain for\nnormal usage.\n\n#### Batteries\nFrameworks are better when they come batteries included. Bogart ships with the batteries, it's just up to you to put them in if you\nwant to use them.\n\nThe batteries middleware creates the following JSGI chain where `nextApp` is the JSGI appliance passed as the first parameter\nto `batteries`:\n\n    error -> validateResponse -> directory -> parted -> methodOverride \n          -> session -> flash -> bodyAdapter -> stringReturnAdapter -> nextApp\n\nThe binary middleware is configured to check the path of the request and if it corresponds to a potential directory in the 'public' directory,\nthe request is routed to the `directory` middleware to serve a static file.\n\n#### Binary Split\nChoose between two JSGI appliances based upon the request.\n\n#### Serve Static Files\nThe static example demonstrates using bogarts *Directory* middleware to serve an image.\n\n    > cd examples/static-server\n    > node app.js\n    \nVisit the application in a web browser at [http://localhost:8080/](http://localhost:8080).\nYou should see the image.\n\n#### Error\nTranslates rejected promises to a JSGI error response.\n\n#### Flash\nProvides Ruby-esque 'flash' variables, good only for the next request cycle. Flash session tracking and flash data is stored via encrypted cookies by default. These providers can be overriden with the Flash middleware options. An example flash data provider implementation with a Redis backend is available here: [https://github.com/jdc0589/bogart-flash-redis](https://github.com/jdc0589/bogart-flash-redis)\n\n#### MethodOverride\nChecks for the _method parameter or X-HTTP-METHOD-OVERRIDE header to override the HTTP method.\n\n#### ParseJson\nParses the body of any request with an \"application/json\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### ParseForm\nParses the body of any request with an \"application/x-www-form-urlencoded\" content-type. The value of request body is reassigned with the parsed value.\nUse the Parted middleware instead unless you have a specific reason not to as it contains a superset of this functionality and also performs streaming parsing.\n\n#### Parted\nA JSGI wrapper around the excellent [Parted](https://github.com/chjj/parted) middleware for Connect.\nParted is a streaming multipart, json, and urlencoded parser.\n\n#### Session\nStandard flash middleware for bogart. Session id and data are stored in encrypted cookies by default, however this can be overridden with custom storage providers. A redis backed session data store is available here: [https://github.com/jdc0589/bogart-session-redis](https://github.com/jdc0589/bogart-session-redis)\n\n## Design Philosophy\n\n* Public APIs should be terse. Prefer `bogart.app()` to `new bogart.Application()`.\n* Be verbose when it does not increase typing for the API user.\n  A good example of this would be in naming of function parameters. The parameter\n  name does not affect the user of the API, so making it more verbose makes for\n  better self-documenting code.\n* Use [promises](http://wiki.commonjs.org/wiki/Promises) when the contract fits. Never use an EventEmitter that should only\n  be attached to in a specific scope and will only call a success and/or error callback\n  one time.\n* Use [EventEmitter](http://nodejs.org/docs/latest/api/events.html#events.EventEmitter) for signals that can fire any number of times.\n* Prefer composition to inheritance.\n* Avoid manipulating prototypes of Node.JS constructors. Manipulating prototypes makes for harder to understand code.\n  Also, Bogart is expected to be cross-platform in the future.\n\n## Promises\n\nPromises provide a well-defined interface for interacting with an object that represents the result of an action that is performed\nasynchronously. Why does Bogart use Promises instead of Callbacks for an interface? Because it's prettier and easier to reason about!\n\nIn all seriousness, I don't want to get into large arguments about the merits of Promises. Node.JS uses callbacks for its API; however,\nuser-land applications and frameworks are free to employ higher-level abstractions and Bogart uses Promises.\n\n### Terminology\n\n* Listener: A function listening for the resolution or rejection of a Promise.\n* Resolve: A successful Promise is 'resolved' which invokes the success listeners that are waiting and remembers the value that was resolved for future success listeners that are attached.\n* Reject: When an error condition is encountered, a Promise is 'rejected' which invokes the error listeners that are waiting and remembers the value that was rejected for future error listeners that are attached.\n* Callback: A function executed upon successful resolution of a Promise.\n* Errback: A function executed when a Promise is rejected\n* Progressback: A function executed to provide intermediate results of a Promise.\n\n### How Promises Work\n\nPromises may only be resolved one time. In the future, when success listeners are added to a \npromise that has already been resolved, the success listener will be invoked with the\npreviously resolved value. Each success listener or error listener is invoked one time and\none time only.\n\nPromises are not EventEmitters. Many times when describing promises, other coder's ask why \nnot just use an EventEmitter. Promises have a different contract. The fact that promises\nare resolved or rejected only one time is powerful. EventEmitters have their place; however,\nthey do not take the place of Promises and Promises do not take the place of EventEmitters.\n\n    function helloWorld() {\n\n      // Retrieve the q promise utility\n      var q = require('bogart').q;\n\n      // Create a deferred, a wrapper around a Promise.\n      var deferred = q.defer();\n\n      // Do something async\n      setTimeout(function() {\n        // Resolve the promise, this will cause success listeners to be invoked.\n        deferred.resolve('hello world');\n      }, 100);\n\n      // Return the promise that the deferred wraps to the client.\n      return deferred.promise;\n    }\n\n    // Consuming the helloWorld function\n    var p = helloWorld();\n    p.then(function(msg) {\n      // This function will be invoked on success\n      console.log(msg);\n    }, function(err) {\n      // This function will be invoked on error.\n      console.log(err);\n    });\n\n### The `then` Method\n\n`promise.then(callback, errback, progress)`\n\nA promise will have a `then` method which takes up to three parameters. The three parameters are all optional.\nThe first parameter, `callback`, is executed if the Promise is successfully resolved. The second parameter, `errback`, is \nexecuted if the Promise is rejected. The third parameter, `progress`, is used to provide intermediate feedback on the \nasynchronous operation. This parameter is rarely used. Most promises do not report progress.\n\n### The `when` Function\n\n`bogart.q.when(promiseOrValue, callback, errback, progress)`\n\nThe `when` function in the `bogart.q` namespace is helpful when you do not know if what you have is a value or a promise for a \nvalue. The callback will be executed for success for a resoled promise or for the value passed if it is a value and not a promise.\n\n    // The following two lines are equivalent with the exception that the `when` can \n    // handle values that are not promises.\n    q.when(p, function() { console.log('Success'); });\n    p.then(function() { console.log('Success'); });\n\n### Bubbling\n\nPromises can be 'bubbled'. The return value of a callback becomes the value of an external promise. The same is true of errbacks.\n\n    function bubble(p) {\n      return p.then(function() {\n        // Assume makePromise is a function that returns a promise for an asyncronous operation.\n        // The value of makePromise when resolved becomes the resolution of the `bubble` function as well.\n        return makePromise();\n      });\n    }\n\nBubbling errbacks is paralell to having a try/catch at a higher level handle errors at a lower level.\n\n    p.then(function(url) {\n      return request(url).then(function() {\n        throw 'error';\n      });\n    }, function(err) {\n      // Will handle the error that occurs in the callback of `request.then`.\n      console.log(err);\n    });\n\n### Working with Node.JS Callbacks\n\nNode.JS uses a style of callback with the following signuare: `function(err, result)`. Bogart includes a utility function,\n`bogart.promisify`, to adapt these Node.JS-style functions to return a Promise.\n\n    var fs = require('fs'); // Node File System Module\n    var bogart = require('bogart'); // Include Bogart\n\n    // A promise-based version of fs.readFile.\n    var readFile = bogart.promisify(fs.readFile);\n\n    readFile('test.txt').then(function(data) {\n      console.log(data);\n    });\n\n*NOTE*: A Node.JS-style function which calls its callback multiple times is not compatible with promises. \nA Promise may be resolved only once. Node.JS style functions that call their callback multiple times are  \nuncommon. The vast majority of Node.JS style functions can be safely translated using `bogart.promisify`.\n\n### Promises are 'A Good Thing'\n\nThere are a lot of critiques of Promises. These usually come from programmers who have not used a proper Promise library.\nTurst me, promises are 'A Good Thing'. Your code will be more composable, readable, and maintainable if you choose to use\nPromises instead of Callbacks for your API. It is also quite easy to transalate Node.JS style callbacks into promises using\n`bogart.promisify` so working wtih callback based APIs is still simple.\n\n## JSGI\n\nJSGI stands for JavaScript Gateway Interface. It is an interface between web applications and web servers. It is similar to\nRuby's Rack and Python's WSGI.\n\n### Entities\n\n* Application: A JavaScript Function that takes one argument, the Request as a JavaScript Object, and returns its Response as a JavaScript Object containing three required attributes: status, headers, and body.\n* Middleware: JSGI Applications that can call other JSGI Applications. Middleware can be orgonized into a call chain to provide useful services or perform useful business logic.\n* Request: A JavaScript Object that contains the state of the HTTP request.  JSGI Applications and Middleware are free to modify the request object.\n\n### Bogart Relationship to JSGI\n\nBogart makes it easy to create JSGI Applications and Middleware. Bogart is a high-level wrapper around JSGI.\n\nValid JSGI responses are always valid returns from Bogart. Bogart, via its helpful Middleware, also allows you to return\nNode.JS Streams, Node.JS Buffers, and JavaScript Strings as responses that will be translated into valid JSGI responses.\n\nBogart also provides helper functions to make creating JSGI responses easier. Prime examples of this are `bogart.file` which\nreturns a JSGI response that serves a file and `bogart.proxy` which returns a response that proxies another URL.\n\n## Supporting Modules\n\n* [Jade View Engine](https://github.com/nrstott/bogart-jade): `npm install bogart-jade`\n\n## Contributors\n\n* [Nathan Stott](https://github.com/nrstott)\n* [Nick Fitzgerald](https://github.com/fitzgen)\n* [Martin Murphy](https://github.com/soitgoes)\n* [Davis Clark](https://github.com/jdc0589)\n* [Aaron Shafovaloff](https://github.com/aaronshaf)\n* [Lewis Patterson](https://github.com/lpatters)\n\n## License\n\nCopyright (c) 2009 Nathan Stott <[nathan.whiteboard-it.com](http://nathan.whiteboard-it.com/)\\>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]}},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"time":{"modified":"2012-01-17T15:33:02.792Z","created":"2011-05-19T17:35:39.194Z","0.0.3":"2011-12-08T20:18:10.234Z","0.1.0":"2011-12-08T20:18:10.234Z","0.1.1":"2011-12-08T20:18:10.234Z","0.1.2":"2011-12-08T20:18:10.234Z","0.1.3":"2011-12-08T20:18:10.234Z","0.1.5":"2011-12-08T20:18:10.234Z","0.1.6":"2011-12-08T20:18:10.234Z","0.2.0":"2011-12-08T20:18:10.234Z","0.3.0":"2011-12-08T20:18:10.234Z","0.3.2":"2011-12-08T20:18:10.234Z","0.3.3":"2011-12-08T20:18:10.234Z","0.3.4":"2011-12-08T20:18:10.234Z","0.3.5":"2011-09-28T16:58:05.895Z","0.3.7":"2011-12-08T20:18:10.234Z","0.3.8":"2011-12-08T20:18:10.234Z","0.3.11":"2011-12-08T20:18:10.234Z","0.3.12":"2011-12-08T20:18:10.234Z","0.3.13":"2011-12-08T20:18:10.234Z","0.3.14":"2011-10-27T14:32:44.246Z","0.3.15":"2011-11-01T16:15:49.635Z","0.3.16":"2011-11-02T15:19:43.271Z","0.3.18":"2011-11-14T15:38:53.759Z","0.3.19":"2011-11-14T17:14:24.365Z","0.3.20":"2011-11-15T16:06:53.077Z","0.3.21":"2011-11-16T16:49:47.030Z","0.3.22":"2011-11-16T21:37:07.295Z","0.3.23":"2011-12-02T21:05:05.333Z","0.3.24":"2011-12-02T22:29:47.202Z","0.3.25":"2011-12-08T20:18:10.234Z","0.3.26":"2011-12-15T16:46:04.520Z","0.3.27":"2011-12-15T22:51:09.699Z","0.3.28":"2011-12-20T21:50:14.135Z","0.3.29":"2011-12-20T21:57:48.092Z","0.3.30":"2011-12-20T22:01:17.958Z","0.3.32":"2011-12-23T19:03:17.314Z","0.3.33":"2011-12-30T09:22:13.396Z","0.3.34":"2011-12-30T09:34:03.995Z","0.3.35":"2011-12-30T09:38:10.321Z","0.3.36":"2011-12-30T15:45:47.503Z","0.3.38":"2012-01-17T15:33:02.792Z"},"users":{"nathan":true,"davisclark":true},"repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"_attachments":{"bogart-0.3.38.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-UCmVGQhgBO7g+U76FHzR9A==","length":96712,"stub":true},"bogart-0.3.36.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-CRgG+K8TWqG0WF6a7IcQoQ==","length":83873,"stub":true},"bogart-0.3.35.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-CUJWJ+5xoDKZhiy7WJ2Jcg==","length":141028,"stub":true},"bogart-0.3.34.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-DIM+YFmUNwkib9GWBFMOkg==","length":141022,"stub":true},"bogart-0.3.33.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-GR62zEdotZmCZj32knDbbQ==","length":141024,"stub":true},"bogart-0.3.32.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-cbaCMRhbxWOj/oYw+EKVVg==","length":108087,"stub":true},"bogart-0.3.30.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-FKFPnPeur3WWFWugmgev+w==","length":107950,"stub":true},"bogart-0.3.29.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-AyvVP8FSxqiwnmtiKJg+Gg==","length":107931,"stub":true},"bogart-0.3.28.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-CHuY04qr6XzZ4m0Z4saSsg==","length":107899,"stub":true},"bogart-0.3.27.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-dKE5tA49mHB3TB04qJlnPQ==","length":105210,"stub":true},"bogart-0.3.26.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-sG9e3/+cvcocIGJDv2fnyA==","length":105164,"stub":true},"bogart-0.3.25.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-W4u+Dja5+GPqcRlNNuPuew==","length":99351,"stub":true},"bogart-0.3.24.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-81jgNrRmjwo25WEl+4qoeQ==","length":90358,"stub":true},"bogart-0.3.23.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-l3/X3LcgslcArgfS8ymxFA==","length":90310,"stub":true},"bogart-0.3.22.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-Z4WKzJCUKoRmIQySCfpGtA==","length":86149,"stub":true},"bogart-0.3.21.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-kSUN+CsY/0fdwVTQS89PjA==","length":86008,"stub":true},"bogart-0.3.20.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-sLdbsbgZejY00MfLqoJxuQ==","length":85979,"stub":true},"bogart-0.3.19.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-YgKll8NYSBlGgptMpqmn9w==","length":83784,"stub":true},"bogart-0.3.18.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-PWgHqqCyJI+2k68h0o8E3Q==","length":83667,"stub":true},"bogart-0.3.16.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-hF6ew2q0NHAPAANGH4kPZQ==","length":80149,"stub":true},"bogart-0.3.15.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-cCcaI0pZMoA4tqoifG7CIQ==","length":79792,"stub":true},"bogart-0.3.14.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-TASou5/ffB3MjGUyU1QyFw==","length":78782,"stub":true},"bogart-0.3.13.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-pP2ECKWwok3KyRUDNm3zuA==","length":78688,"stub":true},"bogart-0.3.12.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-k4XQl97kqZ+eKdUDj9CWOg==","length":78418,"stub":true},"bogart-0.3.11.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-uwhjw4iSU6L6A6NrfxhvAQ==","length":78391,"stub":true},"bogart-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-Cpuejadutj6o1uE0nkCPUA==","length":57282,"stub":true},"bogart-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-ucrT3k3qwuc1jtsC6Sze8Q==","length":57234,"stub":true},"bogart-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-UN3c2o+QR38VqbIdTssDmg==","length":85026,"stub":true},"bogart-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-SCBRAGL6HcXwuHhRgNyk/g==","length":50341,"stub":true},"bogart-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-w0nifM2PNnWb7LvhRqSR6g==","length":50348,"stub":true},"bogart-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-q3Tn96qrgXFFZFEM3l4dlg==","length":49321,"stub":true},"bogart-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-tLYqrpMJqpzTKyLUfF3inQ==","length":48353,"stub":true},"bogart-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-GoINgoU5YKRDx/CNepE3eA==","length":47317,"stub":true},"bogart-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-t0aU7Db5ElXT9AjED6kNNg==","length":47301,"stub":true},"bogart-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-jV27tCAOObdWlFT6aTWldg==","length":601989,"stub":true},"bogart-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-tYEvoA6i+aIQAmNZ5HcA5g==","length":601370,"stub":true},"bogart-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-WJamEsJDWS5ShhZkTNRTIw==","length":601359,"stub":true},"bogart-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ToRpMEqdr/yUeqXRb7blDw==","length":601329,"stub":true},"bogart-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eTQcUjXpfPVziySo8TKgVA==","length":6175,"stub":true}}}},
{"id":"bogart-handlebars","key":"bogart-handlebars","value":{"rev":"9-496585d3f259438cc200a4cda3734874"},"doc":{"_id":"bogart-handlebars","_rev":"9-496585d3f259438cc200a4cda3734874","name":"bogart-handlebars","description":"Handlebars template engine plugin for Bogart","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"bogart-handlebars","description":"Handlebars template engine plugin for Bogart","version":"0.1.0","keywords":["bogart","handlebars","template"],"author":{"name":"Davis Clark"},"email":"jdc0589@gmail.com","main":"./lib/bogart-handlebars","directories":{"lib":"./lib"},"dependencies":{"handlebars":"*","bogart":">= 0.3.37","q":"latest"},"devDependencies":{"tap":"latest"},"_npmUser":{"name":"jdc0589","email":"jdc0589@gmail.com"},"_id":"bogart-handlebars@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b80c915f6bfd4d9d02e9d5382ea51b4a0089dd93","tarball":"http://registry.npmjs.org/bogart-handlebars/-/bogart-handlebars-0.1.0.tgz"},"maintainers":[{"name":"jdc0589","email":"jdc0589@gmail.com"}]},"0.1.1":{"name":"bogart-handlebars","description":"Handlebars template engine plugin for Bogart","version":"0.1.1","keywords":["bogart","handlebars","template"],"author":{"name":"Davis Clark"},"email":"jdc0589@gmail.com","homepage":"https://github.com/jdc0589/bogart-handlebars","repository":{"type":"git","url":"git://github.com/nrstott/bogart.git"},"main":"./lib/bogart-handlebars","directories":{"lib":"./lib"},"dependencies":{"handlebars":"*","bogart":">= 0.3.37","q":"latest"},"devDependencies":{"tap":"latest"},"_npmUser":{"name":"jdc0589","email":"jdc0589@gmail.com"},"_id":"bogart-handlebars@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c88cd6a80b9b2cc77a3a51c4c3172a46409b9304","tarball":"http://registry.npmjs.org/bogart-handlebars/-/bogart-handlebars-0.1.1.tgz"},"maintainers":[{"name":"jdc0589","email":"jdc0589@gmail.com"}]},"0.1.2":{"name":"bogart-handlebars","description":"Handlebars template engine plugin for Bogart","version":"0.1.2","keywords":["bogart","handlebars","template"],"author":{"name":"Davis Clark"},"email":"jdc0589@gmail.com","homepage":"https://github.com/jdc0589/bogart-handlebars","repository":{"type":"git","url":"git://github.com/jdc0589/bogart-handlebars.git"},"main":"./lib/bogart-handlebars","directories":{"lib":"./lib"},"dependencies":{"handlebars":"*","bogart":">= 0.3.37","q":"latest"},"devDependencies":{"tap":"latest"},"_npmUser":{"name":"jdc0589","email":"jdc0589@gmail.com"},"_id":"bogart-handlebars@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"df5a5075bb283fa07f707629d51f52f664dd2e7d","tarball":"http://registry.npmjs.org/bogart-handlebars/-/bogart-handlebars-0.1.2.tgz"},"maintainers":[{"name":"jdc0589","email":"jdc0589@gmail.com"}]},"0.1.3":{"name":"bogart-handlebars","description":"Handlebars template engine plugin for Bogart","version":"0.1.3","keywords":["bogart","handlebars","template"],"author":{"name":"Davis Clark"},"email":"jdc0589@gmail.com","homepage":"https://github.com/jdc0589/bogart-handlebars","repository":{"type":"git","url":"git://github.com/jdc0589/bogart-handlebars.git"},"main":"./lib/bogart-handlebars","directories":{"lib":"./lib"},"dependencies":{"handlebars":"latest","bogart":">= 0.3.37","q":">=0.8.1"},"devDependencies":{"tap":"latest"},"_npmUser":{"name":"jdc0589","email":"jdc0589@gmail.com"},"_id":"bogart-handlebars@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"78823c208ef3ca018d7a5d416769fb0a2c4f9971","tarball":"http://registry.npmjs.org/bogart-handlebars/-/bogart-handlebars-0.1.3.tgz"},"maintainers":[{"name":"jdc0589","email":"jdc0589@gmail.com"}]}},"readme":"bogart-handlebars is a handlebars adapter for the bogart view engine.\n\n## A note on partials and helpers\nI strongly suggest you register partials and helpers globally with Handlebars rather than passing them in to the call to viewEngine.respond. Handlebars has a bug where if you pass ANY partials or helpers in to a compiled template function, your access to partials/helpers registered globally is COMPLETELY BLOCKED. So, either register all partials/helpers globally and never pass them to viewEngine.respond, or dont register them globally and pass them every time.\n\n","maintainers":[{"name":"jdc0589","email":"jdc0589@gmail.com"}],"time":{"modified":"2012-01-15T19:38:10.199Z","created":"2012-01-14T22:29:06.322Z","0.1.0":"2012-01-14T22:29:07.994Z","0.1.1":"2012-01-14T22:31:28.360Z","0.1.2":"2012-01-14T22:32:18.193Z","0.1.3":"2012-01-15T19:38:10.199Z"},"author":{"name":"Davis Clark"},"repository":{"type":"git","url":"git://github.com/jdc0589/bogart-handlebars.git"},"_attachments":{"bogart-handlebars-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-EJ4HzaOhlrR0h0uIQOIlpQ==","length":2714,"stub":true},"bogart-handlebars-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4CgtWNgRknURMHPpwLf9ZA==","length":2708,"stub":true},"bogart-handlebars-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SFr2lYSOm3oMAnt7ChOy6A==","length":2713,"stub":true},"bogart-handlebars-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+w1SS7+8PC9bad2wKJl6fA==","length":2656,"stub":true}}}},
{"id":"bogart-jade","key":"bogart-jade","value":{"rev":"5-8d9f90d15b12a2b85cd55027b5de4743"},"doc":{"_id":"bogart-jade","_rev":"5-8d9f90d15b12a2b85cd55027b5de4743","name":"bogart-jade","description":"Jade template engine plugin for Bogart","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"bogart-jade","description":"Jade template engine plugin for Bogart","version":"0.1.0","keywords":["bogart","jade"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart-jade","directories":{"lib":"./lib"},"dependencies":{"promised-io":"v0.2.3","jade":">=0.15.4","bogart":">= 0.3.9"},"devDependencies":{"expresso":">= 0.8.1"},"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/home/nathan/.npm/bogart-jade/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bogart-jade@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"94af79e6da4b71921904f01c0992942facce0809","tarball":"http://registry.npmjs.org/bogart-jade/-/bogart-jade-0.1.0.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.1":{"name":"bogart-jade","description":"Jade template engine plugin for Bogart","version":"0.1.1","keywords":["bogart","jade"],"author":{"name":"Nathan Stott"},"email":"nathan.stott@whiteboard-it.com","main":"./lib/bogart-jade","directories":{"lib":"./lib"},"dependencies":{"promised-io":"v0.2.3","jade":">=0.15.4","bogart":">= 0.3.24"},"devDependencies":{"expresso":">= 0.8.1"},"scripts":{"test":"expresso"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart-jade@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b649e1c41995a3b9f514ac7fb48ec0a06d56db5a","tarball":"http://registry.npmjs.org/bogart-jade/-/bogart-jade-0.1.1.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]}},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"time":{"modified":"2011-12-09T17:51:40.262Z","created":"2011-09-30T16:08:21.482Z","0.1.0":"2011-09-30T16:08:22.881Z","0.1.1":"2011-12-09T17:51:40.262Z"},"author":{"name":"Nathan Stott"},"_attachments":{"bogart-jade-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GC8zpH4kJqFf3v4x9ArZqg==","length":1394,"stub":true},"bogart-jade-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9MfAoXv08vqmRwNK0SVXGQ==","length":910,"stub":true}}}},
{"id":"bogart-server","key":"bogart-server","value":{"rev":"11-188611bedce7ebae6712e93267d6070a"},"doc":{"_id":"bogart-server","_rev":"11-188611bedce7ebae6712e93267d6070a","name":"bogart-server","description":"JSGI Server for Node.JS","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"bogart-server","description":"JSGI Server for Node.JS","version":"0.1.0","keywords":["bogart","jsgi","cgi"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nrstott@gmail.com","homepage":"https://github.com/nrstott/bogart-server","repository":{"type":"git","url":"git://github.com/nrstott/bogart-server.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart-server/issues"},"dependencies":{"commander":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart-server@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b92e46868fdbc3fa7ee816848f30778672606d01","tarball":"http://registry.npmjs.org/bogart-server/-/bogart-server-0.1.0.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.1":{"name":"bogart-server","description":"JSGI Server for Node.JS","version":"0.1.1","keywords":["bogart","jsgi","cgi"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nrstott@gmail.com","homepage":"https://github.com/nrstott/bogart-server","repository":{"type":"git","url":"git://github.com/nrstott/bogart-server.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart-server/issues"},"dependencies":{"commander":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart-server@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0f06d4a2b8dd54a591c08153c4cd87f3b7296492","tarball":"http://registry.npmjs.org/bogart-server/-/bogart-server-0.1.1.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.2":{"name":"bogart-server","description":"JSGI Server for Node.JS","version":"0.1.2","keywords":["bogart","jsgi","cgi"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nrstott@gmail.com","homepage":"https://github.com/nrstott/bogart-server","repository":{"type":"git","url":"git://github.com/nrstott/bogart-server.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart-server/issues"},"dependencies":{"commander":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart-server@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4fe0658043d16c556853ac3ab20806d56349839a","tarball":"http://registry.npmjs.org/bogart-server/-/bogart-server-0.1.2.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.3":{"name":"bogart-server","description":"JSGI Server for Node.JS","version":"0.1.3","keywords":["bogart","jsgi","cgi"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nrstott@gmail.com","homepage":"https://github.com/nrstott/bogart-server","repository":{"type":"git","url":"git://github.com/nrstott/bogart-server.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart-server/issues"},"dependencies":{"commander":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart-server@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0230c884bf87bf88ce44b5d77964ac0d3438ea24","tarball":"http://registry.npmjs.org/bogart-server/-/bogart-server-0.1.3.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]},"0.1.4":{"name":"bogart-server","description":"JSGI Server for Node.JS","version":"0.1.4","keywords":["bogart","jsgi","cgi"],"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"email":"nrstott@gmail.com","homepage":"https://github.com/nrstott/bogart-server","repository":{"type":"git","url":"git://github.com/nrstott/bogart-server.git"},"bugs":{"email":"nrstott@gmail.com","url":"https://github.com/nrstott/bogart-server/issues"},"dependencies":{"commander":"*"},"devDependencies":{"tap":"*"},"_npmUser":{"name":"nathan","email":"nrstott@gmail.com"},"_id":"bogart-server@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b3a659cc9af6905c65a641dbe6fa68d62729700f","tarball":"http://registry.npmjs.org/bogart-server/-/bogart-server-0.1.4.tgz"},"maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}]}},"readme":"# Bogart Server\n\nBogart Server is an implementation of JSGI B for Node.JS.\n\n## Quick Start\n\n    mkdir myapp\n    cd myapp\n    npm install bogart-server\n\nCreate a file called `app.js` with the following contents:\n\n    var createServer = require('bogart-server');\n\n    createServer(function(req) {\n      return {\n        status: 200,\n        headers: { 'content-type': 'text/plain' },\n        body: [ 'Hello World' ]\n      }\n    }).listen(8080);\n\nRun the application with Node.JS:\n\n    node app.js\n\nVisit it in the browser: [http://127.0.0.1:8080](http://127.0.0.1:8080);\n\n## Create Server\n\nThe `createServer` method accepts one parameter, a JSGI Middleware Function.\n\nThe signature of a JSGI Middleware Function is `function(req, next)`.\n","maintainers":[{"name":"nathan","email":"nrstott@gmail.com"}],"time":{"modified":"2012-01-10T17:41:35.511Z","created":"2012-01-06T20:26:30.132Z","0.1.0":"2012-01-06T20:26:31.714Z","0.1.1":"2012-01-06T23:18:09.255Z","0.1.2":"2012-01-09T23:33:50.085Z","0.1.3":"2012-01-10T00:25:40.645Z","0.1.4":"2012-01-10T17:41:35.511Z"},"author":{"name":"Nathan Stott","email":"nrstott@gmail.com"},"repository":{"type":"git","url":"git://github.com/nrstott/bogart-server.git"},"_attachments":{"bogart-server-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uHUHn1o0Lk/aIJn7Cy3oSg==","length":2454,"stub":true},"bogart-server-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-lBXHw1yl0q9tSCfDCP0q9w==","length":2332,"stub":true},"bogart-server-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7xYmbVw+MyUpc8SQoAx0+Q==","length":2273,"stub":true},"bogart-server-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rGYb19vftXH6GX02+qHgmA==","length":2270,"stub":true},"bogart-server-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-img2f72nIUm345ljeGt6Nw==","length":2338,"stub":true}}}},
{"id":"bogart-session-redis","key":"bogart-session-redis","value":{"rev":"4-89874d81813c296e5ccddcc9df98d1df"},"doc":{"_id":"bogart-session-redis","_rev":"4-89874d81813c296e5ccddcc9df98d1df","name":"bogart-session-redis","description":"redis providers for the bogart session middleware","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bogart-session-redis","description":"redis providers for the bogart session middleware","version":"0.0.1","homepage":"https://github.com/jdc0589/bogart-session-redis","keywords":["bogart","session","redis","jsgi"],"author":{"name":"Davis Clark","email":"jdc0589@gmail.com"},"email":"jdc0589@gmail.com","repository":{"type":"git","url":"git://github.com/jdc0589/bogart-session-redis.git"},"bugs":{"url":"https://github.com/jdc0589/bogart-session-redis/issues"},"main":"./lib/index.js","directories":{"lib":"./lib"},"dependencies":{"hiredis":"=0.1.12","redis":"=0.6.7","q":"=0.7.2"},"devDependencies":{"bogart":">=0.3.2"},"_npmUser":{"name":"davisclark","email":"jdc0589@gmail.com"},"_id":"bogart-session-redis@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"adf709eed04d93dc347cc42bd90ad815d87eac59","tarball":"http://registry.npmjs.org/bogart-session-redis/-/bogart-session-redis-0.0.1.tgz"},"maintainers":[{"name":"davisclark","email":"jdc0589@gmail.com"}]}},"readme":"Redis provider(s) for the Bogart \"Session\" JSGI middleware.\r\n\r\n## Example:\r\n```javascript\r\nvar bogart = require('bogart'),\r\n    DataProvider = require(\"bogart-session-redis\").DataProvider;\r\n\r\nvar config = function(show, create, update, destroy) {\r\n  show('/', function(req) {\r\n    req.session(\"foo\", \"bar\");\r\n\r\n    var session = \"Session: <br /><ul>\";\r\n    req.session.keys().forEach(function(key) {\r\n      session += \"<li>\"+key+\": \"+req.session(key)+\"</li>\";\r\n    });\r\n    session += \"</ul>\";\r\n\r\n    return bogart.html(session);\r\n  });\r\n};\r\n\r\nvar dataProviderConfig = {\r\n  lifetime: 600,\r\n  redis: {\r\n    port: 6379,\r\n    host: \"localhost\"\r\n  }\r\n};\r\n\r\nvar sessionConfig = {\r\n  options: {\r\n    idProvider: {\r\n      encryptionKey: \"330e2e6e-0a94-11e1-9db7-935b9f6cc277\"\r\n    }\r\n  },\r\n  dataProvider: new DataProvider(dataProviderConfig)\r\n};\r\n\r\nvar app = bogart.middleware.Session(sessionConfig, bogart.router(config));\r\nbogart.start(app, {port:1337});\r\n```","maintainers":[{"name":"davisclark","email":"jdc0589@gmail.com"}],"time":{"modified":"2011-11-16T16:34:07.344Z","created":"2011-11-16T16:32:27.677Z","0.0.1":"2011-11-16T16:32:29.315Z"},"author":{"name":"Davis Clark","email":"jdc0589@gmail.com"},"repository":{"type":"git","url":"git://github.com/jdc0589/bogart-session-redis.git"},"users":{"davisclark":true},"_attachments":{"bogart-session-redis-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-x9fM6pJwulkmnXnlPCJZ0w==","length":1874,"stub":true}}}},
{"id":"bogus.js","key":"bogus.js","value":{"rev":"5-c1867f9d33b2386cc8eb59b3cfc3b45e"},"doc":{"_id":"bogus.js","_rev":"5-c1867f9d33b2386cc8eb59b3cfc3b45e","name":"bogus.js","description":"Access Backbone templates from Hogan","dist-tags":{"latest":"2.0.0"},"versions":{"0.0.0":{"name":"bogus.js","description":"Access Backbone templates from Hogan","version":"0.0.0","author":{"name":"Stéphan Kochen","email":"stephan@angrybytes.com"},"keywords":["mustache","template","hogan","backbone"],"licenses":{"type":"Apache-2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"},"repository":{"type":"git","url":"git://github.com/AngryBytes/bogus.js.git"},"dependencies":{"hogan.js":"1.0.5-dev"},"devDependencies":{"tap":"0.2"},"main":"bogus.js","scripts":{"test":"tap test.js"},"_npmUser":{"name":"stephank","email":"stephan@kochen.nl"},"_id":"bogus.js@0.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"31b7ca8fbce0e2118a7548c9fdc151a33031383c","tarball":"http://registry.npmjs.org/bogus.js/-/bogus.js-0.0.0.tgz"},"maintainers":[{"name":"stephank","email":"stephan@kochen.nl"}]},"2.0.0":{"name":"bogus.js","description":"Access Backbone templates from Hogan","version":"2.0.0","author":{"name":"Stéphan Kochen","email":"stephan@angrybytes.com"},"keywords":["mustache","template","hogan","backbone"],"licenses":{"type":"Apache-2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"},"repository":{"type":"git","url":"git://github.com/Two-Screen/bogus.js.git"},"dependencies":{"underscore":"1","hogan.js":"2.0.0"},"devDependencies":{"tap":"0.2","backbone":">=0.5"},"main":"bogus.js","scripts":{"test":"tap test.js"},"_npmUser":{"name":"stephank","email":"stephan@kochen.nl"},"_id":"bogus.js@2.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"bfa58198d3fff2d3179dc2f743971a39fe6ec893","tarball":"http://registry.npmjs.org/bogus.js/-/bogus.js-2.0.0.tgz"},"maintainers":[{"name":"stephank","email":"stephan@kochen.nl"}]}},"readme":"## Bogus.js = Hogan.js + Backbone.js [![Build Status](https://secure.travis-ci.org/AngryBytes/bogus.js.png)](http://travis-ci.org/AngryBytes/bogus.js)\n\nBogus.js extends [Hogan.js] with support for [Backbone.js] models. This means\nthat mustache `{{tags}}` will look for Backbone.Model attributes, and mustache\n`{{#sections}}` will iterate over Backbone.Collections.\n\n [Hogan.js]: http://twitter.github.com/hogan.js/\n [Backbone.js]: http://documentcloud.github.com/backbone/\n\n### From the browser\n\nBogus.js is tied to a specific version of Hogan.js, currently 1.0.5. You will\nprobably want one of the following builds:\n\n * [hogan-1.0.5.js]: Complete build.\n * [hogan-1.0.5.min.js]: Complete build, minified.\n * [template-1.0.5.js]: Just Hogan.Template.\n * [template-1.0.5.min.js]: Just Hogan.Template, minified.\n\nMake sure Hogan.js and Bogus.js are included in your page in order:\n\n    <script src=\"hogan.js\"></script>\n    <script src=\"bogus.js\"></script>\n\n(Of course, you also want Backbone and dependencies, but Bogus.js won't\nactually fail without them.)\n\n [hogan-1.0.5.js]: https://raw.github.com/twitter/hogan.js/gh-pages/builds/1.0.5/hogan-1.0.5.js\n [hogan-1.0.5.min.js]: https://raw.github.com/twitter/hogan.js/gh-pages/builds/1.0.5/hogan-1.0.5.min.js\n [template-1.0.5.js]: https://raw.github.com/twitter/hogan.js/gh-pages/builds/1.0.5/template-1.0.5.js\n [template-1.0.5.min.js]: https://raw.github.com/twitter/hogan.js/gh-pages/builds/1.0.5/template-1.0.5.min.js\n\n### From Node.js\n\nInstall using NPM:\n\n    $ npm install bogus.js\n\nThen simply:\n\n    var Bogus = require('bogus.js');\n\n### Usage\n\nThe `Bogus` namespace contains all the methods you'd normally find in the\n`Hogan` namespace. This means you can simply:\n\n    var data = new Backbone.Model({\n      screenName: \"ko_si_nus\",\n    });\n\n    var template = Bogus.compile(\"Follow @{{screenName}}.\");\n    var output = template.render(data);\n\n    // prints \"Follow @ko_si_nus.\"\n    console.log(output);\n","maintainers":[{"name":"stephank","email":"stephan@kochen.nl"}],"time":{"modified":"2012-03-21T13:02:57.531Z","created":"2012-02-06T12:46:23.700Z","0.0.0":"2012-02-06T12:46:25.203Z","2.0.0":"2012-03-21T13:02:57.531Z"},"author":{"name":"Stéphan Kochen","email":"stephan@angrybytes.com"},"repository":{"type":"git","url":"git://github.com/Two-Screen/bogus.js.git"},"_attachments":{"bogus.js-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2PTY8VKXiWfPx6uIUOdX3A==","length":12171,"stub":true},"bogus.js-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-T+D6ugCY0tT1gEMRc8RYDQ==","length":11599,"stub":true}}}},
{"id":"boil","key":"boil","value":{"rev":"3-7ab0fc3b831c591fd15711c27a6f5de0"},"doc":{"_id":"boil","_rev":"3-7ab0fc3b831c591fd15711c27a6f5de0","name":"boil","description":"Quick Access to HTML5 Boilerplate","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"boil","version":"0.0.1","description":"Quick Access to HTML5 Boilerplate","keywords":[],"author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"dependencies":{},"repository":{"type":"git","url":"git://github.com/sbioko/boil.git"},"bin":{"boil":"./bin/boil"},"engines":{"node":"0.4.x"},"_id":"boil@0.0.1","_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.5.0-pre","dist":{"shasum":"ac83cbe9a8fde852f0db2349be16309ff1db7ee4","tarball":"http://registry.npmjs.org/boil/-/boil-0.0.1.tgz"}}},"maintainers":[{"name":"sbioko","email":"sbioko@gmail.com"}],"time":{"modified":"2011-03-23T08:28:02.773Z","created":"2011-03-23T08:28:02.343Z","0.0.1":"2011-03-23T08:28:02.773Z"},"author":{"name":"Vadim Demedes","email":"sbioko@gmail.com"},"repository":{"type":"git","url":"git://github.com/sbioko/boil.git"},"_attachments":{"boil-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Qp9vOZEttCHE0oH359npDg==","length":1819,"stub":true}}}},
{"id":"boiler","key":"boiler","value":{"rev":"30-66870e3f2e5caa59b131dc0630a95750"},"doc":{"_id":"boiler","_rev":"30-66870e3f2e5caa59b131dc0630a95750","name":"boiler","description":"Bundle Node.js libraries for the browser","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.1":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.0.1","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"_id":"boiler@0.0.1","dist":{"shasum":"f97612dd199e8bb6203a2904cc8f91e1885c4bfb","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.0.1.tgz"},"readme":"","maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.0.2":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.0.2","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\r\nBundle Node.js compatible modules to one browser compatible file.\r\n\r\n    boiler my-javascript-app.js > application.js\r\n","_id":"boiler@0.0.2","dist":{"shasum":"e1edce1bfb5a4e4db44ce9640f3a14e95ffc5681","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.0.2.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.0.3":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.0.3","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\r\nBundle Node.js compatible modules to one browser compatible file.\r\n\r\n    boiler app.js > bundle.js\r\n\r\n## Examples\r\n\r\nInstall Backbone with NPM and use in browser:\r\n\r\n    npm install backbone\r\n\r\n```javascript\r\nvar Backbone = require('backbone');\r\n```\r\n\r\nUnderscore will be downloaded by NPM and bundled as a dependecy to Backbone.\r\n\r\nInclude a non-global jquery instance:\r\n\r\n```javascript\r\nvar $ = require('./jquery', {\r\n  // Export and remove jquery from the global scope\r\n  exports: '$.noConflict()'\r\n});\r\n\r\nrequire('./jquery.plugin', {\r\n  // Give the jquery plugin a non-global reference to jquery.\r\n  injects: {\r\n    '$': './jquery'\r\n  }\r\n});\r\n\r\n// Use plugin\r\n$.plugin();\r\n```\r\n","_id":"boiler@0.0.3","dist":{"shasum":"107378d27b2a0c9a053359360d9a949025d9f364","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.0.3.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.1.0":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.1.0","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\nBundle Node.js compatible modules to one browser compatible file.\n\n    boiler app.js > bundle.js\n\n## Examples\n\nInstall Backbone with NPM and use in browser:\n\n    npm install backbone\n\n```javascript\nvar Backbone = require('backbone');\n```\n\nUnderscore will be downloaded by NPM and bundled as a dependecy to Backbone.\n\nInclude a non-global jquery instance:\n\n```javascript\nvar $ = require('./jquery', {\n  // Export and remove jquery from the global scope\n  exports: '$.noConflict()'\n});\n\nrequire('./jquery.plugin', {\n  // Give the jquery plugin a non-global reference to jquery.\n  injects: {\n    '$': './jquery'\n  }\n});\n\n// Use plugin\n$.plugin();\n```\n","_id":"boiler@0.1.0","dist":{"shasum":"bf2e3f399c33621b2fb3a2b04fd7d018774f6abe","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.1.0.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.1.1":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.1.1","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\nBundle Node.js compatible modules to one browser compatible file.\n\n    boiler app.js > bundle.js\n\n## Examples\n\nInstall Backbone with NPM and use in browser:\n\n    npm install backbone\n\n```javascript\nvar Backbone = require('backbone');\n```\n\nUnderscore will be downloaded by NPM and bundled as a dependecy to Backbone.\n\nInclude a non-global jquery instance:\n\n```javascript\nvar $ = require('./jquery', {\n  // Export and remove jquery from the global scope\n  exports: '$.noConflict()'\n});\n\nrequire('./jquery.plugin', {\n  // Give the jquery plugin a non-global reference to jquery.\n  injects: {\n    '$': './jquery'\n  }\n});\n\n// Use plugin\n$.plugin();\n```\n","_id":"boiler@0.1.1","dist":{"shasum":"ecd2baddd94d5dd67fc14158ea64e3c36d6322c0","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.1.1.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.1.2":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.1.2","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS","browser"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\nBundle Node.js compatible modules to one browser compatible file.\n\n    boiler app.js > bundle.js\n\n## Examples\n\nInstall Backbone with NPM and use in browser:\n\n    npm install backbone\n\n```javascript\nvar Backbone = require('backbone');\n```\n\nUnderscore will be downloaded by NPM and bundled as a dependecy to Backbone.\n\nInclude a non-global jquery instance:\n\n```javascript\nvar $ = require('./jquery', {\n  // Export and remove jquery from the global scope\n  exports: '$.noConflict()'\n});\n\nrequire('./jquery.plugin', {\n  // Give the jquery plugin a non-global reference to jquery.\n  injects: {\n    '$': './jquery'\n  }\n});\n\n// Use plugin\n$.plugin();\n```\n","_id":"boiler@0.1.2","dist":{"shasum":"39f5cece0f0c261ce9b2a10fa188711d539b0b2d","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.1.2.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.1.3":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.1.3","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS","browser"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\nBundle Node.js compatible modules to one browser compatible file.\n\n    $ boiler app.js > bundle.js\n\n## Examples\n\nInstall Backbone with NPM and use in browser:\n\n    npm install backbone\n\n```javascript\nvar Backbone = require('backbone');\n```\n\nUnderscore will be downloaded by NPM and bundled as a dependecy to Backbone.\n\nInclude a non-global jquery instance:\n\n```javascript\n// app.js\nvar $ = require('./jquery', {\n  // Export and remove jquery from the global scope\n  exports: '$.noConflict()'\n});\n\nrequire('./jquery.plugin', {\n  // Give the jquery plugin a non-global reference to jquery.\n  injects: {\n    '$': './jquery'\n  }\n});\n```\n\nTo use your boiled module in the browser, include it in a script tag and access\nthe exported function through ```boiler.main```.\n\n```javascript\n// app.js\nmodule.exports = {\n  init: function () {\n    $('body').html('Hello World!');\n  }\n}\n```\n\n```html\n<script src=\"bundle.js\"></script>\n<script>\n  boiler.main.init();\n</script>\n````\n\nTo use browser javascripts as Node.js modules you can require them with boiler:\n\n*Warning: example doesn't work without injecting a fake window object, but can\nbee done in theory*\n\n```javascript\n// my-node-program.js\nvar boiler = require('boiler'),\n    L = boiler(require, './leaflet', 'window.L');\n\nconsole.log(new L.Point(3, 4));\n```\n\n    $ node my-node-program.js","_id":"boiler@0.1.3","dist":{"shasum":"876d66d77a8df01ec3c5d3f62f34e8a1e422ff8b","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.1.3.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"directories":{}},"0.1.4":{"name":"boiler","description":"Bundle Node.js libraries for the browser","version":"0.1.4","homepage":"https://github.com/icetan/boiler","author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"keywords":["js","bundling","require","CommonJS","browser"],"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"main":"./boiler.js","bin":{"boiler":"./bin/boiler"},"readme":"# Boiler\nBundle Node.js compatible modules to one browser compatible file.\n\n    $ boiler app.js > bundle.js\n\n## Examples\n\nInstall Backbone with NPM and use in browser:\n\n    npm install backbone\n\n```javascript\nvar Backbone = require('backbone');\n```\n\nUnderscore will be downloaded by NPM and bundled as a dependecy to Backbone.\n\nInclude a non-global jquery instance:\n\n```javascript\n// app.js\nvar $ = require('./jquery', {\n  // Export and remove jquery from the global scope\n  exports: '$.noConflict()'\n});\n\nrequire('./jquery.plugin', {\n  // Give the jquery plugin a non-global reference to jquery.\n  injects: {\n    '$': './jquery'\n  }\n});\n```\n\nTo use your boiled module in the browser, include it in a script tag and access\nthe exported function through ```boiler.main```.\n\n```javascript\n// app.js\nmodule.exports = {\n  init: function () {\n    $('body').html('Hello World!');\n  }\n}\n```\n\n```html\n<script src=\"bundle.js\"></script>\n<script>\n  boiler.main.init();\n</script>\n````\n\nTo use browser javascripts as Node.js modules you can require them with boiler:\n\n*Warning: example doesn't work without injecting a fake window object, but can\nbe done in theory*\n\n```javascript\n// my-node-program.js\nvar boiler = require('boiler'),\n    L = boiler(require, './leaflet', 'window.L');\n\nconsole.log(new L.Point(3, 4));\n```\n\n    $ node my-node-program.js","_id":"boiler@0.1.4","dist":{"shasum":"e7a430eb533ade034663c5ddfb6b335bc3e301e0","tarball":"http://registry.npmjs.org/boiler/-/boiler-0.1.4.tgz"},"maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}]}},"readme":"","maintainers":[{"name":"icetan","email":"c.freden@gmail.com"}],"time":{"modified":"2012-08-02T13:44:17.197Z","created":"2012-07-06T08:56:49.570Z","0.0.1":"2012-07-06T08:56:52.392Z","0.0.2":"2012-07-06T10:02:21.367Z","0.0.3":"2012-07-06T19:00:45.420Z","0.1.0":"2012-07-09T07:03:18.753Z","0.1.1":"2012-07-09T12:53:33.169Z","0.1.2":"2012-07-24T10:05:26.900Z","0.1.3":"2012-07-25T14:57:50.616Z","0.1.4":"2012-07-26T11:36:23.912Z"},"author":{"name":"Christopher Fredén","email":"c.freden@gmail.com"},"repository":{"type":"git","url":"https://github.com/icetan/boiler.git"},"users":{"fgribreau":true},"_attachments":{"boiler-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-sZRWA9c8a85Qo4Zwyb73+w==","length":5924,"stub":true},"boiler-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-FMabztWrLnSPzdYKw3sg6Q==","length":5808,"stub":true},"boiler-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-woq1K6NFPQFaVesWWEnSAA==","length":5639,"stub":true},"boiler-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Xa2WxIqsr5qDcD6TSnEVOA==","length":5374,"stub":true},"boiler-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-iB4sepcnDhoO4Ccsbm+kTQ==","length":5291,"stub":true},"boiler-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tFUXvWGhEkUPEaUF7ZC6WQ==","length":3999,"stub":true},"boiler-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IhBfjQYnk80bLn/fBfl54Q==","length":2987,"stub":true},"boiler-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Oht5mKpkuhygmbAKioiKew==","length":2864,"stub":true}}}},
{"id":"boilerplate","key":"boilerplate","value":{"rev":"3-ecc5bf2d9cb130b561a9bc437f49de5f"},"doc":{"_id":"boilerplate","_rev":"3-ecc5bf2d9cb130b561a9bc437f49de5f","name":"boilerplate","description":"boilerplate application in node.js","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum"},"name":"boilerplate","description":"boilerplate application in node.js","version":"0.0.0","homepage":"http://github.com/tblobaum/node-boilerplate","repository":{"url":""},"engines":{"node":"~0.6.x"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"tblobaum","email":"tblobaum@gmail.com"},"_id":"boilerplate@0.0.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"3efaf78e253dcd76d8b3c485a124c32eb0d0666b","tarball":"http://registry.npmjs.org/boilerplate/-/boilerplate-0.0.0.tgz"},"maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}]}},"readme":"","maintainers":[{"name":"tblobaum","email":"tblobaum@gmail.com"}],"time":{"modified":"2011-12-24T05:48:46.831Z","created":"2011-12-24T05:48:45.481Z","0.0.0":"2011-12-24T05:48:46.831Z"},"author":{"name":"Thomas Blobaum","email":"tblobaum@gmail.com","url":"https://github.com/tblobaum"},"repository":{"url":""},"_attachments":{"boilerplate-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JcHNq0n5hu2FDayuFdgAYQ==","length":400,"stub":true}}}},
{"id":"bokeh","key":"bokeh","value":{"rev":"34-5ed2c73c9d3f5683dc35577bdd8ead9b"},"doc":{"_id":"bokeh","_rev":"34-5ed2c73c9d3f5683dc35577bdd8ead9b","name":"bokeh","description":"A blazing-fast task queue built on Node.js and ZeroMQ.","dist-tags":{"latest":"0.4.2"},"versions":{"0.1.0":{"name":"bokeh","description":"A scalable background processing server.","version":"0.1.0","main":"./lib/index.js","directories":{"lib":"./lib"},"engines":{"node":"~0.6.8"},"dependencies":{"node-uuid":"~1.3.0","riak-js":"~0.4.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","should":"~0.5.0"},"optionalDependencies":{},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/gamedo/bokeh","repository":{"type":"git","url":"git://github.com/gamedo/bokeh.git"},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.1.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"67b52eb9087f8ba1a0ce511a7c5ab101a03bbade","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.1.0.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.1.1":{"name":"bokeh","description":"A scalable background processing server.","version":"0.1.1","main":"./lib/index.js","directories":{"lib":"./lib"},"engines":{"node":"~0.6.8"},"dependencies":{"async":"~0.1.0","node-uuid":"~1.3.0","riak-js":"~0.4.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","should":"~0.5.0"},"optionalDependencies":{},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/gamedo/bokeh","repository":{"type":"git","url":"git://github.com/gamedo/bokeh.git"},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.1.1","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"a3aa1b81857de249487f1e741a994ee5c0c5e971","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.1.1.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.1.2":{"name":"bokeh","description":"A scalable background processing server.","version":"0.1.2","main":"./lib/index.js","directories":{"lib":"./lib"},"engines":{"node":"~0.6.8"},"dependencies":{"async":"~0.1.0","node-uuid":"~1.3.0","riak-js":"~0.4.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","should":"~0.5.0"},"optionalDependencies":{},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/gamedo/bokeh","repository":{"type":"git","url":"git://github.com/gamedo/bokeh.git"},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.1.2","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"438e8aad09e23e97c9e53862403cc354ec17b6ff","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.1.2.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.1.3":{"name":"bokeh","description":"A scalable background processing server.","version":"0.1.3","main":"./lib/index.js","directories":{"lib":"./lib"},"engines":{"node":"~0.6.8"},"dependencies":{"async":"~0.1.0","node-uuid":"~1.3.0","riak-js":"~0.4.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","should":"~0.5.0"},"optionalDependencies":{},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/gamedo/bokeh","repository":{"type":"git","url":"git://github.com/gamedo/bokeh.git"},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.1.3","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b12deb32a0d9bf2b6462f7a2662c6fbf941b5503","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.1.3.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.1.4":{"name":"bokeh","description":"A scalable background processing server.","version":"0.1.4","main":"./lib/index.js","directories":{"lib":"./lib"},"engines":{"node":"~0.6.8"},"dependencies":{"async":"~0.1.0","node-uuid":"~1.3.0","riak-js":"~0.4.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","should":"~0.5.0"},"optionalDependencies":{},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/gamedo/bokeh","repository":{"type":"git","url":"git://github.com/gamedo/bokeh.git"},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.1.4","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"cc0d503a3123c4da721836f5004bb74e659dbb0b","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.1.4.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.2.0":{"name":"bokeh","description":"A scalable background processing server.","version":"0.2.0","main":"./lib/index.js","directories":{"lib":"./lib"},"engines":{"node":"~0.6.0"},"dependencies":{"async":"~0.1.0","node-uuid":"~1.3.0","riak-js":"~0.4.0","underscore":"~1.3.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","nodeunit":"~0.7.0","should":"~0.6.0"},"optionalDependencies":{},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/gamedo/bokeh","repository":{"type":"git","url":"git://github.com/gamedo/bokeh.git"},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.2.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"8e5dd57144e7f7bf3d12af7de3c17b5482f1a4e3","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.2.0.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.2.1":{"name":"bokeh","version":"0.2.1","description":"A scalable background processing server.","author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/nullobject/bokeh","repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"engines":{"node":"~0.6.0"},"directories":{"lib":"./lib"},"main":"./lib/index.js","dependencies":{"async":"~0.1.0","node-uuid":"~1.3.0","riak-js":"~0.4.0","underscore":"~1.3.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","glob":"~3.1.0","mocha":"~0.14.0","should":"~0.6.0"},"optionalDependencies":{},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.2.1","_engineSupported":true,"_npmVersion":"1.1.10","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a5372e52deb428660913e0cd36f1a6295b59fd13","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.2.1.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.3.0":{"name":"bokeh","version":"0.3.0","description":"A blazing-fast task queue built on Node.js and ZeroMQ.","author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/nullobject/bokeh","repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"engines":{"node":"~0.6.0"},"directories":{"lib":"./lib"},"main":"./lib/index.js","dependencies":{"async":"~0.1.0","log":"~1.3.0","node-uuid":"~1.3.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","glob":"~3.1.0","mocha":"~0.14.0","redis":"~0.7.0","riak-js":"~0.4.0","should":"~0.6.0"},"optionalDependencies":{},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.3.0","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9206b665a34b96a0abb2eebc57ef6ac91d4e3ce6","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.3.0.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.3.1":{"name":"bokeh","version":"0.3.1","description":"A blazing-fast task queue built on Node.js and ZeroMQ.","author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/nullobject/bokeh","repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"engines":{"node":"~0.6.0"},"directories":{"lib":"./lib"},"main":"./lib/index.js","dependencies":{"async":"~0.1.0","log":"~1.3.0","node-uuid":"~1.3.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","glob":"~3.1.0","mocha":"~0.14.0","redis":"~0.7.0","riak-js":"~0.4.0","should":"~0.6.0"},"optionalDependencies":{},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.3.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a2d3a0c276c85a8a9469606df2bf6580b1feaf02","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.3.1.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.4.0":{"name":"bokeh","version":"0.4.0","description":"A blazing-fast task queue built on Node.js and ZeroMQ.","author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/nullobject/bokeh","repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"engines":{"node":"~0.6.0"},"directories":{"lib":"./lib"},"main":"./lib/index.js","dependencies":{"async":"~0.1.0","log":"~1.3.0","node-uuid":"~1.3.0","zmq":"~2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","glob":"~3.1.0","mocha":"~0.14.0","redis":"~0.7.0","riak-js":"~0.4.0","should":"~0.6.0"},"optionalDependencies":{},"_npmUser":{"name":"nullobject","email":"josh.bassett@gmail.com"},"_id":"bokeh@0.4.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"ff59a09873d0995c1a74c93352475e304f602ba7","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.4.0.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.4.1":{"name":"bokeh","version":"0.4.1","description":"A blazing-fast task queue built on Node.js and ZeroMQ.","author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/nullobject/bokeh","repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"engines":{"node":">=0.6.0"},"directories":{"doc":"doc","example":"example","test":"test"},"main":"./lib/index.js","dependencies":{"async":"0.1.x","log":"1.3.x","node-uuid":"1.3.x","zmq":"2.1.x"},"devDependencies":{"coffee-script":"1.3.x","glob":"3.1.x","mocha":"1.3.x","redis":"0.7.x","riak-js":"0.4.x","should":"0.6.x"},"scripts":{"test":"mocha"},"keywords":["zeromq","message","queue"],"license":"BSD","readme":"# Bokeh\n\nbokeh (pronounced boh-kay) is a simple, scalable and blazing-fast task queue built on [Node.js](http://nodejs.org) and [ZeroMQ](http://zeromq.org). It allows you to offload tasks from your main application process and distribute them among a pool of workers. Workers can be running on the same host as your application, or scaled out onto multiple machines for greater processing power.\n\nWhen you want a worker to run a task, just submit it to the broker using the client API. A task is simply any class in your application which responds to the `run` method.\n\nBokeh consists of three components:\n\n1. The client library which your application uses to submit tasks to the broker.\n2. The broker process which manages the pool of workers.\n3. The worker processes which are responsible for running tasks.\n\n![](bokeh/raw/master/doc/bokeh.png)\n\n## Installation\n\n### ZeroMQ\n\nThe only prerequisite is that you have ZeroMQ installed.\n\n**OS X**\n\nInstall ZeroMQ using brew:\n\n    $ brew install zeromq\n\n**Ubuntu 10.04 LTS**\n\nInstall ZeroMQ using [Chris Lea's PPA](https://launchpad.net/~chris-lea/+archive/zeromq):\n\n    $ sudo add-apt-repository ppa:chris-lea/zeromq\n    $ sudo apt-get update\n    $ sudo apt-get install libzmq-dbg libzmq-dev libzmq1\n\n### Bokeh\n\nInstall Bokeh using npm:\n\n    $ npm install bokeh\n\n## Overview\n\n### Task\n\nA task is a class which responds to the `run` method. A task is dealt to a worker and executed.\n\nOnce the task has been completed, you must call the callback with any data you want to pass back to your application.\n\n    class Reverse\n      run: (data, callback) -> callback null, data.split(\"\").reverse().join(\"\")\n\n### Client\n\nThe client is used by your application to submit tasks to the broker and monitor their progress.\n\n    bokeh = require \"bokeh\"\n    handle = bokeh.getClient().submitTask \"Reverse\", \"hello world\"\n    handle.on \"complete\", (data) -> console.log \"Task %s completed: %s\", handle.id, data\n    handle.on \"error\", (error) -> console.error \"Task %s failed: %s\", handle.id, error\n\n### Broker\n\nThe broker is responsible for routing messages from clients, persisting them to the data store and dealing them to workers.\n\n    bokeh = require \"bokeh\"\n    broker = new bokeh.Broker\n\nBokeh supports pluggable data stores for persisting tasks, currently in-memory, [Redis](http://redis.io/) and [Riak](http://basho.com/products/riak-overview/) are supported.\n\n### Worker\n\nA worker is a process which receives tasks from a broker and executes them. You must register all your task classes with the worker.\n\n    bokeh = require \"bokeh\"\n    worker = new bokeh.Worker\n    worker.registerTask \"Reverse\", require(\"./tasks/reverse\")\n\n## Example\n\nCheck out the [example application](bokeh/tree/master/example).\n\n## License\n\nBokeh is released under the [MIT license](bokeh/blob/master/LICENSE).\n","_id":"bokeh@0.4.1","dist":{"shasum":"0a0254bd153d160b598a5c785c5694837cd2b912","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.4.1.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]},"0.4.2":{"name":"bokeh","version":"0.4.2","description":"A blazing-fast task queue built on Node.js and ZeroMQ.","author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"homepage":"https://github.com/nullobject/bokeh","repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"engines":{"node":">=0.6.0"},"directories":{"doc":"doc","example":"example","test":"test"},"main":"./lib/index.js","dependencies":{"async":"0.1.x","log":"1.3.x","node-uuid":"1.3.x","zmq":"2.0.x"},"devDependencies":{"coffee-script":"1.3.x","glob":"3.1.x","mocha":"1.3.x","redis":"0.7.x","riak-js":"0.4.x","should":"0.6.x"},"scripts":{"test":"mocha"},"keywords":["zeromq","message","queue"],"license":"BSD","readme":"# Bokeh\n\nbokeh (pronounced boh-kay) is a simple, scalable and blazing-fast task queue built on [Node.js](http://nodejs.org) and [ZeroMQ](http://zeromq.org). It allows you to offload tasks from your main application process and distribute them among a pool of workers. Workers can be running on the same host as your application, or scaled out onto multiple machines for greater processing power.\n\nWhen you want a worker to run a task, just submit it to the broker using the client API. A task is simply any class in your application which responds to the `run` method.\n\nBokeh consists of three components:\n\n1. The client library which your application uses to submit tasks to the broker.\n2. The broker process which manages the pool of workers.\n3. The worker processes which are responsible for running tasks.\n\n![](bokeh/raw/master/doc/bokeh.png)\n\n## Installation\n\n### ZeroMQ\n\nThe only prerequisite is that you have ZeroMQ installed.\n\n**OS X**\n\nInstall ZeroMQ using brew:\n\n    $ brew install zeromq\n\n**Ubuntu 10.04 LTS**\n\nInstall ZeroMQ using [Chris Lea's PPA](https://launchpad.net/~chris-lea/+archive/zeromq):\n\n    $ sudo add-apt-repository ppa:chris-lea/zeromq\n    $ sudo apt-get update\n    $ sudo apt-get install libzmq-dbg libzmq-dev libzmq1\n\n### Bokeh\n\nInstall Bokeh using npm:\n\n    $ npm install bokeh\n\n## Overview\n\n### Task\n\nA task is a class which responds to the `run` method. A task is dealt to a worker and executed.\n\nOnce the task has been completed, you must call the callback with any data you want to pass back to your application.\n\n    class Reverse\n      run: (data, callback) -> callback null, data.split(\"\").reverse().join(\"\")\n\n### Client\n\nThe client is used by your application to submit tasks to the broker and monitor their progress.\n\n    bokeh = require \"bokeh\"\n    handle = bokeh.getClient().submitTask \"Reverse\", \"hello world\"\n    handle.on \"complete\", (data) -> console.log \"Task %s completed: %s\", handle.id, data\n    handle.on \"error\", (error) -> console.error \"Task %s failed: %s\", handle.id, error\n\n### Broker\n\nThe broker is responsible for routing messages from clients, persisting them to the data store and dealing them to workers.\n\n    bokeh = require \"bokeh\"\n    broker = new bokeh.Broker\n\nBokeh supports pluggable data stores for persisting tasks, currently in-memory, [Redis](http://redis.io/) and [Riak](http://basho.com/products/riak-overview/) are supported.\n\n### Worker\n\nA worker is a process which receives tasks from a broker and executes them. You must register all your task classes with the worker.\n\n    bokeh = require \"bokeh\"\n    worker = new bokeh.Worker\n    worker.registerTask \"Reverse\", require(\"./tasks/reverse\")\n\n## Example\n\nCheck out the [example application](bokeh/tree/master/example).\n\n## License\n\nBokeh is released under the [MIT license](bokeh/blob/master/LICENSE).\n","_id":"bokeh@0.4.2","dist":{"shasum":"6020c9b8b20857d6c4592a8e12c64ce33791342d","tarball":"http://registry.npmjs.org/bokeh/-/bokeh-0.4.2.tgz"},"maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}]}},"readme":"# Bokeh\n\nA scalable background processing server based on ZeroMQ.\n\n## Installation\n\nYou must have ZeroMQ installed:\n\n    brew install zeromq\n\nInstall through npm:\n\n    npm install bokeh\n","maintainers":[{"name":"nullobject","email":"josh.bassett@gmail.com"}],"time":{"modified":"2012-08-02T13:44:33.339Z","created":"2012-02-18T00:56:38.997Z","0.1.0":"2012-02-18T00:56:42.930Z","0.1.1":"2012-02-18T08:50:42.453Z","0.1.2":"2012-02-19T07:09:33.932Z","0.1.3":"2012-02-29T08:42:17.105Z","0.1.4":"2012-03-01T02:44:34.669Z","0.2.0":"2012-03-02T20:14:05.867Z","0.2.1":"2012-03-22T04:15:08.997Z","0.3.0":"2012-03-24T23:14:20.685Z","0.3.1":"2012-03-25T03:32:05.925Z","0.4.0":"2012-04-06T22:44:32.033Z","0.4.1":"2012-07-09T09:07:38.658Z","0.4.2":"2012-07-24T08:18:01.328Z"},"author":{"name":"Josh Bassett","email":"josh.bassett@gmail.com"},"repository":{"type":"git","url":"git://github.com/nullobject/bokeh.git"},"users":{"fgribreau":true},"_attachments":{"bokeh-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-56y/IZUWULvAkqPvRf/8tg==","length":298741,"stub":true},"bokeh-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-3RCVcKwHawPG3cLXQaLQ+w==","length":298736,"stub":true},"bokeh-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-P8Tr6rQqC6YgZ2Sh0cYr7Q==","length":155222,"stub":true},"bokeh-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-+uSISDfXI0zySewPFl7e7w==","length":5622,"stub":true},"bokeh-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-E5JO1cEWPgZKXjF3DvHCRw==","length":5623,"stub":true},"bokeh-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-RrEIgBYLNngR0pB82zZYNQ==","length":4222,"stub":true},"bokeh-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-0Dpmsxe+an3zF4PO/TISQQ==","length":3233,"stub":true},"bokeh-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-dz5B7Nobu7T5fJYqyersjA==","length":3196,"stub":true},"bokeh-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-N524u0sAl90Ue0MWBlRJVg==","length":3192,"stub":true},"bokeh-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-8lfJUBwX5ur31R6MgpMi5A==","length":2931,"stub":true},"bokeh-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-v0BiuBNCZ+Pw0R8UzeiOJw==","length":2918,"stub":true},"bokeh-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Tc6vFs4KstS9MdOc7YqJAQ==","length":2922,"stub":true}}}},
{"id":"boleto","key":"boleto","value":{"rev":"3-9604baa008fc5a46c4bfbc22eb0ab6f3"},"doc":{"_id":"boleto","_rev":"3-9604baa008fc5a46c4bfbc22eb0ab6f3","name":"boleto","description":"Gerador de boletos para o sitema Node.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Cranic Tecnologia e Informática LTDA","email":"contato@cranic.com.br","url":"https://github.com/cranic"},"contributors":[{"name":"Alan Hoffmeister","email":"contato@cranic.com.br"},{"name":"Vinicius Trampusch","email":"vinicius.trampusch@gmail.com","url":"https://github.com/ViniciusTrampusch"}],"name":"boleto","description":"Gerador de boletos para o sitema Node.js","version":"0.0.1","homepage":"https://github.com/cranic/node-boleto","repository":{"type":"git","url":"git://github.com/cranic/node-boleto.git"},"engines":{"node":">=0.8.x"},"readme":"Aguarde\r\n===========\r\n\r\nEste projeto está em desenvolvimento, comente nos issues para receber uma notificação de quando o projeto estará disponível.\r\n\r\n","_id":"boleto@0.0.1","dist":{"shasum":"f81dc38699a73292608d4e029c32e8c198dc3003","tarball":"http://registry.npmjs.org/boleto/-/boleto-0.0.1.tgz"},"maintainers":[{"name":"cranic","email":"contato@cranic.com.br"}]}},"readme":"Aguarde\r\n===========\r\n\r\nEste projeto está em desenvolvimento, comente nos issues para receber uma notificação de quando o projeto estará disponível.\r\n\r\n","maintainers":[{"name":"cranic","email":"contato@cranic.com.br"}],"time":{"modified":"2012-08-04T03:17:32.310Z","created":"2012-08-04T03:17:28.864Z","0.0.1":"2012-08-04T03:17:32.310Z"},"author":{"name":"Cranic Tecnologia e Informática LTDA","email":"contato@cranic.com.br","url":"https://github.com/cranic"},"repository":{"type":"git","url":"git://github.com/cranic/node-boleto.git"},"_attachments":{"boleto-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GAxXY4KFjFGr0/1w8/ldHQ==","length":1255,"stub":true}}}},
{"id":"bolt","key":"bolt","value":{"rev":"55-01a4cec5ac509b9a6c8f21263d5e4fdb"},"doc":{"_id":"bolt","_rev":"55-01a4cec5ac509b9a6c8f21263d5e4fdb","name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","dist-tags":{"latest":"0.3.3"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.0.0","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bolt/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bolt@0.0.0","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"fe3a5cbe2beb5ef4faf725d543b96f9f0de6c323","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.1.0","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bolt/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bolt@0.1.0","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d3755454a7bca267c19fd40c605089a085fd1d2e","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.1.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.1.1","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bolt/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bolt@0.1.1","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"925abc26d985e7aa669936688b4d88c9892f269e","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.1.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.1.2","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/TRON/.npm/bolt/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bolt@0.1.2","_engineSupported":true,"_npmVersion":"1.0.28","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"1953bd64a08a62d9929681b44e5514c20c83643b","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.1.2.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.1.3","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"knife":"0.0.x"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.1.3","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"9e5d10ff7f460665dffe904f8da8bae4fb2b43dd","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.1.3.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.1.4":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.1.4","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"knife":"0.0.x"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.1.4","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"381422d1026c4a501ade8dd5b07d4f0c539d863b","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.1.4.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.2.0","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.2.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"e592893c7b5f422c12af40179f3ae62c56834e08","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.2.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.2.2":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.2.2","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"*","colors":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.2.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"bd67515b9fb68e794324a9775b11ee3d63a986e2","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.2.2.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.2.3":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.2.3","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"*","colors":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.2.3","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c9c58a173874b77bcb1777fe6e4b93b6bb61fd39","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.2.3.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.3.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.3.0","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"*","colors":"*","eventemitter2":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c6e78e2e500d4d91fc39668d17bc75ad0a212488","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.3.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.3.1":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.3.1","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"0.7.1","colors":"*","eventemitter2":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f8cfbe5fcca51be80425a3e9aaa27d414be7fa42","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.3.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.3.2":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.3.2","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"0.7.1","colors":"*","eventemitter2":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.3.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8276adca0e3e4d666d857351b75ddcc7b3709156","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.3.2.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.3.3":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt","description":"Send messages to any nodejs process, anywhere on the Internet.","version":"0.3.3","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"main":"index.js","engines":{"node":">= 0.4.1"},"dependencies":{"redis":"0.7.1","colors":"*","eventemitter2":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt@0.3.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"03c9ee5fca148c8e586fea7e0842cc97ee6e4eeb","tarball":"http://registry.npmjs.org/bolt/-/bolt-0.3.3.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2012-03-22T19:25:34.046Z","created":"2011-09-22T03:20:27.968Z","0.0.0":"2011-09-22T03:20:28.420Z","0.1.0":"2011-09-25T06:15:14.124Z","0.1.1":"2011-10-19T15:59:41.534Z","0.1.2":"2011-10-19T21:11:13.418Z","0.1.3":"2011-10-28T19:51:50.350Z","0.1.4":"2011-10-30T00:51:26.400Z","0.2.0":"2011-11-06T00:41:10.909Z","0.2.1":"2011-11-06T01:52:44.101Z","0.2.2":"2011-11-06T02:02:37.113Z","0.2.3":"2011-11-16T22:29:40.793Z","0.3.0":"2012-01-06T03:34:16.840Z","0.3.1":"2012-01-10T20:47:47.355Z","0.3.2":"2012-02-10T18:03:01.081Z","0.3.3":"2012-03-22T19:25:34.046Z"},"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/bolt.git"},"_attachments":{"bolt-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-lJErmFT4MtYpppRvvfGbBA==","length":10240,"stub":true},"bolt-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-whvOVyUp/Tj9RpV0YjTGdA==","length":10240,"stub":true},"bolt-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-HF4eu+5+16FwkG5Jjer5vQ==","length":10240,"stub":true},"bolt-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-ZO6PlofoebD1BOj9uQisgQ==","length":10240,"stub":true},"bolt-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-fAEibthiKysWJ/9oDiQvTg==","length":10240,"stub":true},"bolt-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-W7UNuOWI5S20pSFtT86Xjg==","length":10240,"stub":true},"bolt-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-0omKZ3Jun970I9iNXWcpeg==","length":10240,"stub":true},"bolt-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-E52fap0fTJ7x0CH5z4ngOw==","length":10240,"stub":true},"bolt-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-o/mYWDnJ0o49YPyl8h88EQ==","length":10240,"stub":true},"bolt-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-45o2/2u8+qa8KtvFr9Tw1w==","length":3259,"stub":true},"bolt-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-domcWWJQXAOVZcr0y8Ox5g==","length":3171,"stub":true},"bolt-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ebBUVNCN05NDAVEZcBCtLQ==","length":3057,"stub":true},"bolt-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-A9uy9n6xVDnkTPDa6qfpmg==","length":1825,"stub":true}}}},
{"id":"bolt-logger","key":"bolt-logger","value":{"rev":"17-805804bb79694db6ed9e5ae5fcda67dc"},"doc":{"_id":"bolt-logger","_rev":"17-805804bb79694db6ed9e5ae5fcda67dc","name":"bolt-logger","description":"simple logging for bolt","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"bolt-logger","description":"simple logging for bolt","version":"0.0.0","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt-logger.git"},"engines":{"node":"*"},"bin":{"bolt-logger":"bin/bolt-logger.js"},"dependencies":{"optimist":"*","bolt":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt-logger@0.0.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"5468603f054ffc812af720c4158b9d17abdf54b0","tarball":"http://registry.npmjs.org/bolt-logger/-/bolt-logger-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.0.1":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"bolt-logger","description":"simple logging for bolt","version":"0.0.1","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt-logger.git"},"engines":{"node":"*"},"bin":{"bolt-logger":"bin/bolt-logger.js"},"dependencies":{"optimist":"*","bolt":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt-logger@0.0.1","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"ed546c9d1a120ceadc9cd6acf0de468a08f9c371","tarball":"http://registry.npmjs.org/bolt-logger/-/bolt-logger-0.0.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"bolt-logger","description":"simple logging for bolt","version":"0.0.2","homepage":"http://bolt.io/","repository":{"type":"git","url":"git://github.com/ecto/bolt-logger.git"},"engines":{"node":"*"},"bin":{"bolt-logger":"bin/bolt-logger.js"},"dependencies":{"optimist":"*","bolt":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt-logger@0.0.2","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e7af943ab525b96246d621b60cd95b399524e070","tarball":"http://registry.npmjs.org/bolt-logger/-/bolt-logger-0.0.2.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2011-11-29T19:21:39.285Z","created":"2011-11-22T01:05:29.622Z","0.0.0":"2011-11-22T01:05:34.780Z","0.0.1":"2011-11-22T01:59:21.151Z","0.0.2":"2011-11-29T19:21:39.285Z"},"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/bolt-logger.git"},"_attachments":{"bolt-logger-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-kYhgp6zQWM5ABDp0MQ4D8Q==","length":10240,"stub":true},"bolt-logger-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-v4w/MsCzpblbLG33AmLgCQ==","length":10240,"stub":true},"bolt-logger-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Pv5ZJszEr82s0r/5YY6VsA==","length":10240,"stub":true}}}},
{"id":"bolt-monitor","key":"bolt-monitor","value":{"rev":"3-a94de95dbc480f919631f1aaeeda0f8a"},"doc":{"_id":"bolt-monitor","_rev":"3-a94de95dbc480f919631f1aaeeda0f8a","name":"bolt-monitor","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"name":"bolt-monitor","version":"0.0.0","homepage":"http://bolt.io/","preferGlobal":true,"repository":{"type":"git","url":"git://github.com/ecto/bolt-monitor.git"},"scripts":{"test":"vows --spec test/*"},"engines":{"node":"*"},"bin":{"bolt-monitor":"./bin/bolt-monitor"},"dependencies":{"nomnom":"1.0.x","colors":"0.x.x","forever":"0.7.x","express":"*","ejs":"0.4.x","jeans":"0.1.x","socket.io":"0.8.7","redis":"*"},"devDependencies":{"vows":"0.5.x"},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bolt-monitor@0.0.0","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2b7ba0e4d2c854d0c6016bbbf947baee0822dbf0","tarball":"http://registry.npmjs.org/bolt-monitor/-/bolt-monitor-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2011-11-07T19:24:00.734Z","created":"2011-11-07T19:23:59.971Z","0.0.0":"2011-11-07T19:24:00.734Z"},"author":{"name":"Cam Pedersen","email":"cam@onswipe.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/bolt-monitor.git"},"_attachments":{"bolt-monitor-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4Gh0wXuCvf9GoyyM2J3oCg==","length":10240,"stub":true}}}},
{"id":"bomb","key":"bomb","value":{"rev":"5-5f2e7ffd54e1d42d3e4f3d9f967a34f4"},"doc":{"_id":"bomb","_rev":"5-5f2e7ffd54e1d42d3e4f3d9f967a34f4","name":"bomb","description":"fork bomb a victim's computer","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"bomb","description":"fork bomb a victim's computer","version":"0.0.0","repository":{"type":"git","url":"git://github.com/ecto/bomb.git"},"main":"bomb.js","engines":{"node":"*"},"bin":{"bomb":"bomb.js"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bomb@0.0.0","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"422897e87d5cbbf61139c0fb6d79cc5b1085f788","tarball":"http://registry.npmjs.org/bomb/-/bomb-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]},"0.0.1":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"bomb","description":"fork bomb a victim's computer","version":"0.0.1","repository":{"type":"git","url":"git://github.com/ecto/bomb.git"},"main":"bomb.js","engines":{"node":"*"},"bin":{"bomb":"bomb.js"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"bomb@0.0.1","_engineSupported":true,"_npmVersion":"1.0.102","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"03088ba08090704cafeaff8d68095bf138bf1891","tarball":"http://registry.npmjs.org/bomb/-/bomb-0.0.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2011-11-02T22:20:16.486Z","created":"2011-11-02T21:56:09.034Z","0.0.0":"2011-11-02T21:56:09.683Z","0.0.1":"2011-11-02T22:20:16.486Z"},"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/bomb.git"},"_attachments":{"bomb-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sZl2E4IBFBUYHLb7W1zJ9Q==","length":10240,"stub":true},"bomb-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-E8Je7MiHHu+EKCJD38xFmg==","length":10240,"stub":true}}}},
{"id":"bond","key":"bond","value":{"rev":"13-4c1c6652f2b759902f494ef88cb7f308"},"doc":{"_id":"bond","_rev":"13-4c1c6652f2b759902f494ef88cb7f308","name":"bond","description":"A minimal Promises A implementation","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"name":"bond","description":"A minimal Promises A implementation","version":"0.1.0","repository":{"url":"http://github.com/pete-otaqui/bond.git"},"main":"src/bond.js","engines":{"node":"~0.6.10"},"devDependencies":{},"optionalDependencies":{},"scripts":{},"_npmUser":{"name":"pete-otaqui","email":"pete@otaqui.com"},"_id":"bond@0.1.0","dependencies":{},"_engineSupported":false,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"19079b099d223a129df509f91564015892047370","tarball":"http://registry.npmjs.org/bond/-/bond-0.1.0.tgz"},"maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}]},"0.1.1":{"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"name":"bond","description":"A minimal Promises A implementation","version":"0.1.1","repository":{"url":"http://github.com/pete-otaqui/bond.git"},"main":"src/bond.js","engines":{"node":"~0.6"},"devDependencies":{},"optionalDependencies":{},"scripts":{},"_npmUser":{"name":"pete-otaqui","email":"pete@otaqui.com"},"_id":"bond@0.1.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"6bf4eeae481d447b5506f70ad2bc18df6713b58b","tarball":"http://registry.npmjs.org/bond/-/bond-0.1.1.tgz"},"maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}]},"0.1.2":{"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"name":"bond","description":"A minimal Promises A implementation","version":"0.1.2","repository":{"url":"http://github.com/pete-otaqui/bond.git"},"main":"src/bond.js","engines":{"node":"~0.6"},"devDependencies":{},"optionalDependencies":{},"scripts":{},"_npmUser":{"name":"pete-otaqui","email":"pete@otaqui.com"},"_id":"bond@0.1.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c749dd412ab9610fba391ab037f4dbcd15ad5f99","tarball":"http://registry.npmjs.org/bond/-/bond-0.1.2.tgz"},"maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}]},"0.1.3":{"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"name":"bond","description":"A minimal Promises A implementation","version":"0.1.3","repository":{"url":"http://github.com/pete-otaqui/bond.git"},"main":"src/bond.js","engines":{"node":"~0.6"},"devDependencies":{},"optionalDependencies":{},"scripts":{},"_npmUser":{"name":"pete-otaqui","email":"pete@otaqui.com"},"_id":"bond@0.1.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9206565d785f10ffe94ace151799a7a198916758","tarball":"http://registry.npmjs.org/bond/-/bond-0.1.3.tgz"},"maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}]},"0.1.4":{"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"name":"bond","description":"A minimal Promises A implementation","version":"0.1.4","repository":{"url":"http://github.com/pete-otaqui/bond.git"},"main":"src/bond.js","engines":{"node":"~0.6"},"devDependencies":{},"optionalDependencies":{},"scripts":{},"_npmUser":{"name":"pete-otaqui","email":"pete@otaqui.com"},"_id":"bond@0.1.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4c4df9635e9adbebfaa3092437bbb61a331ae756","tarball":"http://registry.npmjs.org/bond/-/bond-0.1.4.tgz"},"maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}]},"0.1.5":{"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"name":"bond","description":"A minimal Promises A implementation","version":"0.1.5","repository":{"type":"git","url":"git://github.com/pete-otaqui/bond.git"},"main":"src/bond.js","engines":{"node":"~0.6"},"devDependencies":{},"optionalDependencies":{},"scripts":{},"_npmUser":{"name":"pete-otaqui","email":"pete@otaqui.com"},"_id":"bond@0.1.5","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"81005d9c7208d46c3355d2c219d7de68e3c39b22","tarball":"http://registry.npmjs.org/bond/-/bond-0.1.5.tgz"},"maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}]}},"readme":"Bond - A Simple CommonJS Promises Implementation\n================================================\n\nBond is a simple implementation of the [Promises/A](http://wiki.commonjs.org/wiki/Promises/A \"CommonJS Promises/A Proposal\") specification.\n\nIt allows authors to write promise-compatible methods; which in turn allow users to add multiple functions to call on \"success\" or \"failure\" of the original call.\n\nExample\n-------\n    \n    \n    // This is a promise-compatible method that\n    // waits for 10 milliseconds and then keep\n    // or break the promise depending on the\n    // 'pass' argument.\n    var wait10millis = function(pass) {\n        var dfd = bond.deferred();\n        setTimeout(function() {\n            if ( pass ) {\n                dfd.resolve();\n            } else {\n                dfd.reject();\n            }\n        }, 10);\n        // promise methods must return a promise\n        return dfd.promise();\n    };\n    \n    \n    // USAGE EXAMPLES:\n    \n    // single \"then()\" (or 'success')\n    wait10millis(true).then(function() {\n        alert('yay');\n    });\n    \n    // single \"then()\", single \"fail()\":\n    wait10millis( (Math.rand()>0.5) )\n        .then(function() { alert('yay'); })\n        .fail(function() { alert('boo'); });\n    \n    // keep the promise to add more methods later\n    var promise = wait10millis( (Math.rand()>0.5) );\n    // NB - this will all happen long after the 10 millis\n    setTimeout(function() {\n        promise.then(function() { alert('hi'); });\n        promise.then(function() { alert('ho'); });\n        promise.fail(function() { alert('no'); });\n        promise.fail(function() { alert('go'); });\n    }, 100);","maintainers":[{"name":"pete-otaqui","email":"pete@otaqui.com"}],"time":{"modified":"2012-04-24T15:35:54.197Z","created":"2012-03-22T11:14:37.603Z","0.1.0":"2012-03-22T11:14:38.798Z","0.1.1":"2012-03-23T22:33:12.047Z","0.1.2":"2012-03-24T06:02:59.603Z","0.1.3":"2012-03-24T06:08:35.442Z","0.1.4":"2012-03-24T06:23:16.912Z","0.1.5":"2012-04-24T15:35:54.197Z"},"author":{"name":"Pete Otaqui","email":"pete@otaqui.com","url":"http://otaqui.com/"},"repository":{"type":"git","url":"git://github.com/pete-otaqui/bond.git"},"_attachments":{"bond-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-1Rz9g6g3rPGUHr6PI5HpMg==","length":3878,"stub":true},"bond-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KnVQZwYNyrZkJ00Zzut3Kw==","length":4039,"stub":true},"bond-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ebzSb6H0rT4ltQKx2Lc5bQ==","length":4035,"stub":true},"bond-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-B+6J2VNTtQlfXDJSMRqk3g==","length":4032,"stub":true},"bond-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-W38cbGPsvxLmIivDLTP4hw==","length":3915,"stub":true},"bond-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gLjJQFBoI0nqNCGB7CNCeQ==","length":3798,"stub":true}}}},
{"id":"boneidle","key":"boneidle","value":{"rev":"27-fef800a3efcad820cc9d8fa1186574d6"},"doc":{"_id":"boneidle","_rev":"27-fef800a3efcad820cc9d8fa1186574d6","name":"boneidle","description":"Functional library with callbacks","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"name":"boneidle","description":"Functions with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.1","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{"nodeunit":""},"scripts":{"test":"nodeunit test/"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"b26aba4ec4f774f61bb34a0fcf5c23badce673c4","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.1.tgz"},"readme":"","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.2":{"name":"boneidle","description":"Functions with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.2","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{"nodeunit":""},"scripts":{"test":"nodeunit test/"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8de1afd0ba99a2cd2cf5947fb50ba4ed31e4f58a","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.2.tgz"},"readme":"","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.3":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.3","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{"nodeunit":""},"scripts":{"test":"nodeunit test/"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"149fc6f490430b3c752e2f2c28a1e5c07ebb21c1","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.3.tgz"},"readme":"","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.4":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.4","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{"nodeunit":""},"scripts":{"test":"nodeunit test/"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9f7ddeaab1dc7f2da7fc6d25497b796f80ee622c","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.4.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif ()\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.5":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.5","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{"nodeunit":"","uglify-js":""},"scripts":{"test":"nodeunit test/","preinstall":"uglifyjs lib/boneidle.js > lib/boneidle.min.js"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"331c1a491d0239667b9750cae89f8bbfd02a9744","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.5.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.6":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.6","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{"nodeunit":"","uglify-js":""},"scripts":{"test":"nodeunit test/","preinstall":"uglifyjs lib/boneidle.js > lib/boneidle.min.js"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7a9fd129484cf1962fde43815d39414cb2c095df","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.6.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.7":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.7","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","postinstall":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"cd8980009bcaa61d5ce56143da4155f2e6aefa3a","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.7.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.8":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.8","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","prepublish":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c6372bb11a1272234ae85b29fc35be40c4da2dec","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.8.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.0.9":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.0.9","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","prepublish":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"861061d9423bceab9b2c4398a4693aaf0a449503","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.0.9.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.option.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.option.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.either.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.either.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.1.0":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.1.0","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","prepublish":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_npmUser":{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"},"_id":"boneidle@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"1bebbbf0ba4ff4dc10d50f5065df0b365d045ff1","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.1.0.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.option.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.option.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.either.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.either.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.1.1":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.1.1","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","prepublish":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_id":"boneidle@0.1.1","dist":{"shasum":"5d4065d145f27d11a7188ede67d9c3e57c8252e3","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.1.1.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.option.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.option.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.either.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.either.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.1.2":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.1.2","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","prepublish":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_id":"boneidle@0.1.2","dist":{"shasum":"d5f8a937e2601d3b5c7e3865d7c973d4c9ccc0d2","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.1.2.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.option.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.option.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.either.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.either.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]},"0.1.3":{"name":"boneidle","description":"Functional library with callbacks","homepage":"https://github.com/jozefdransfield/BoneIdle","author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"version":"0.1.3","repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"main":"./lib/boneidle.js","dependencies":{},"devDependencies":{"nodeunit":"","uglify-js":"","stitch":""},"scripts":{"test":"nodeunit test/**","prepublish":"node pkg.js && uglifyjs release/boneidle.js > release/boneidle.min.js"},"_id":"boneidle@0.1.3","dist":{"shasum":"2557813f706dbe44c73087d94d3547c8bbd7ab73","tarball":"http://registry.npmjs.org/boneidle/-/boneidle-0.1.3.tgz"},"readme":"Bone Idle\n=========\n\n### Lazy Functional Library For Node.js\n\n#### Option\n###### None\n\tvar none = b_.option.none();\n\tassertEquals(none.isEmpty(), true);\n\tassertEquals(none.getOrNull(), null);\n\tassertEquals(none.getOr(anotherValue), anotherValue);\n###### Some \n\tvar some = b_.option.some(value);\n\tassertEquals(b.isEmpty(), false);\n\tassertEquals(some.get(), value);\n\tassertEquals(some.getOrNull(), value);\n\tassertEquals(none.getOr(anotherValue), value);\n\t\n##### Either\n###### Left \n\t var left = b_.either.left(value);\n\t assertEquals(left.isLeft(), true);\n\t assertEquals(left.isRight(), false);\n\t assertEquals(left.value()), value);\n###### Right \n\t var right = b_.either.right(value);\n\t assertEquals(right.isLeft(), false);\n\t assertEquals(right.isRight(), true);\n\t assertEquals(right.value()), value)\n\n\n\n####  Callback Chaining\n\n\tisNotNull(str, function(ok) {\n\t\tif (ok) {\n\t\t\thasLengthGreaterThan2(str, function(ok) {\n\t\t\t\tif (ok) {\n\t\t\t\t\tres.send(\"All good\")\n\t\t\t\t} else {\n\t\t\t\t\tres.send(\"Bad Input\");\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t});\n\nBecomes \n\t\n\tb_.chain(isNotNull).and(hasLengthGreaterThan2).call(\"some param\", function(either) {\n\t\tif (either.isRight) {\n\t\t\tres.send(\"All Good\");\n\t\t} else {\n\t\t\tres.send(\"Bad Input\");\n\t\t}\n\t})\n\n","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}]}},"readme":"","maintainers":[{"name":"jozef.dransfield","email":"Jozef.Dransfield@me.com"}],"time":{"modified":"2012-08-08T20:34:24.712Z","created":"2012-04-21T00:23:31.742Z","0.0.1":"2012-04-21T00:23:33.753Z","0.0.2":"2012-04-23T19:27:56.866Z","0.0.3":"2012-04-23T20:32:05.386Z","0.0.4":"2012-05-02T21:38:58.216Z","0.0.5":"2012-06-03T00:47:04.433Z","0.0.6":"2012-06-03T01:20:19.920Z","0.0.7":"2012-06-06T22:27:37.358Z","0.0.8":"2012-06-06T22:34:08.960Z","0.0.9":"2012-06-17T18:34:58.515Z","0.1.0":"2012-06-17T23:18:25.618Z","0.1.1":"2012-07-16T19:36:03.589Z","0.1.2":"2012-07-16T19:54:16.992Z","0.1.3":"2012-08-08T20:34:24.712Z"},"author":{"name":"Jozef Dransfield","email":"Jozef.Dransfield@me.com"},"repository":{"type":"git","url":"git@github.com:jozefdransfield/BoneIdle.git"},"_attachments":{"boneidle-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ydnHXVvTZN6MuUYRwC/Ntw==","length":10650,"stub":true},"boneidle-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-STT6CMFHo8fISmxhsYmq1g==","length":9782,"stub":true},"boneidle-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-kyUWRRKNKLCg7wXXY0rRmg==","length":9628,"stub":true},"boneidle-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-GS8xthg2ikamSGd9dgL5cw==","length":9576,"stub":true},"boneidle-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-pT2FDQ5uA/4nPHltZmKTQQ==","length":9567,"stub":true},"boneidle-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-sKSwtU8+4lzIxVk32mFpdg==","length":9419,"stub":true},"boneidle-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-s2VbjK9vmGqdpVORgFQzHw==","length":9421,"stub":true},"boneidle-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-HPILmxvne0bBTnjh5XyczA==","length":6336,"stub":true},"boneidle-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Ufv+yS6gCCJSrtdsYgvf3g==","length":6272,"stub":true},"boneidle-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TRJzRWK40cDamCZ9KGxn8A==","length":4320,"stub":true},"boneidle-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gXntSUIMxOY7tPCQbeJjWQ==","length":3226,"stub":true},"boneidle-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jYKplr0Dxt1hSqv5klTjYQ==","length":3033,"stub":true},"boneidle-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3Q24hTjFQncoUvh/TIm+pg==","length":2269,"stub":true}}}},
{"id":"bones","key":"bones","value":{"rev":"112-b28df3fde72911dc5fed6e96b73454c0"},"doc":{"_id":"bones","_rev":"112-b28df3fde72911dc5fed6e96b73454c0","name":"bones","dist-tags":{"latest":"1.3.27"},"versions":{"1.0.0":{"name":"bones","version":"1.0.0","dependencies":{"underscore":"= 1.1.5","express":"= 2.2.2","backbone":"= 0.3.3","jquery":"= 1.5.1","optimist":"= 0.1.8","mirror":"https://github.com/developmentseed/mirror/tarball/node-0.4"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"681aaaf08344e98f4cc9a9441abbc6522c8d8b18","tarball":"http://registry.npmjs.org/bones/-/bones-1.0.0.tgz"},"directories":{}},"1.1.0":{"name":"bones","version":"1.1.0","main":"./bones.js","dependencies":{"underscore":">= 1.1.6 < 1.2.0","express":">= 2.2.2 < 2.3.0","backbone":">= 0.3.3 < 0.4.0","jquery":">= 1.5.1 < 1.6.0","optimist":">= 0.1.9 < 0.2.0","mirror":">= 0.1.0 < 0.2.0"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"b141b75f6da1f5317fe294e2d79fe5c5dc342564","tarball":"http://registry.npmjs.org/bones/-/bones-1.1.0.tgz"},"directories":{}},"1.2.0":{"name":"bones","version":"1.2.0","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.x","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.1.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"de64061a27b9e2deb9457b6175a160fe6cb8f386","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.0.tgz"},"directories":{}},"1.2.1":{"name":"bones","version":"1.2.1","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.x","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.1.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"2b7548f2437f4ea41e1134f5f363e8756dba262e","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.1.tgz"},"directories":{}},"1.2.2":{"name":"bones","version":"1.2.2","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.x","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"8eedbb404dda95e28203979698168c5649da9ed8","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.2.tgz"},"directories":{}},"1.2.3":{"name":"bones","version":"1.2.3","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.x","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"14a664abdc88b94c825347eb943ed8db2754cc0c","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.3.tgz"},"directories":{}},"1.2.4":{"name":"bones","version":"1.2.4","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.x","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"b044ce2bde5e1bb2ab4b0a10f32b1acb78c4e468","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.4.tgz"},"directories":{}},"1.2.5":{"name":"bones","version":"1.2.5","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"d71c4c0d7281b3c309c2efd3a646d0aae74e28a0","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.5.tgz"},"directories":{}},"1.2.6":{"name":"bones","version":"1.2.6","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones@1.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"18d5e444d3df8c8ebe6c34e82ece55a9ed89ccfc","tarball":"http://registry.npmjs.org/bones/-/bones-1.2.6.tgz"},"directories":{}},"1.3.0":{"name":"bones","version":"1.3.0","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"devDependencies":{},"_id":"bones@1.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"0d079bb3fea43b164da669467a68b6f79cdb278b","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.0.tgz"},"directories":{}},"1.3.1":{"name":"bones","version":"1.3.1","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.2.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"devDependencies":{},"_id":"bones@1.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"8abc48bdc06319cd985a9410db8cacd095973927","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.1.tgz"},"directories":{}},"1.3.2":{"name":"bones","version":"1.3.2","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"devDependencies":{},"_id":"bones@1.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"78d7d249dfb3d2a482700c00961ff4920268447d","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.2.tgz"},"directories":{}},"1.3.3":{"name":"bones","version":"1.3.3","main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"devDependencies":{},"_id":"bones@1.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"515218a4f0ea26d82d43b535174373f27eec00d1","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.3.tgz"},"directories":{}},"1.3.4":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.4","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"_id":"bones@1.3.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"247f610bf4cc1a607cecfcb0ad8dbec2d6494412","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.4.tgz"},"directories":{}},"1.3.5":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.5","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"_id":"bones@1.3.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"054fe65fa71d1658ab48a5ef6976bf83e1153dfb","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.5.tgz"},"directories":{}},"1.3.6":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.6","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso","coverage":"./test/coverage.sh"},"_id":"bones@1.3.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"57cbb5d2580b7bc0badc2b6721929fcab0f5aa3e","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.6.tgz"},"directories":{}},"1.3.7":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.7","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f511c2a5ce3b4a171556c54fa13c6cae4f022fd9","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.7.tgz"},"directories":{}},"1.3.8":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.8","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.2.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"186c7b252b90f361f13618624806d3926c59158c","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.8.tgz"},"directories":{}},"1.3.9":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.9","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"3e22dec0fb977f745b8c80811a2949192a8a22e0","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.9.tgz"},"directories":{}},"1.3.10":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.10","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/home/devseed/.npm/bones/1.3.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"30f3255127f9518e4a0ea6d162490ea475c262b5","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.10.tgz"},"directories":{}},"1.3.11":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.11","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.11/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.11","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ac2e94336ae8d66e0f21ee9d074d1cc59862b171","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.11.tgz"},"directories":{}},"1.3.12":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.12","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.12/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.12","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"71a1ea44161a4ffaf75aefb3bdc588370ba36e16","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.12.tgz"},"directories":{}},"2.0.0alpha1":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.0.0alpha1","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.x","backbone":"0.5.1","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/2.0.0alpha1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@2.0.0alpha1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"4eea8dbc7c7446f40c50b636739f71de7787610b","tarball":"http://registry.npmjs.org/bones/-/bones-2.0.0alpha1.tgz"},"directories":{}},"1.3.13":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.13","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.x","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.13/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.13","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"48867884d7a8d5cec9b587d08f9ebfe0b9fdbd8c","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.13.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"directories":{}},"2.0.0alpha2":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.0.0alpha2","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.5.1","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/diggersf/.npm/bones/2.0.0alpha2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@2.0.0alpha2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"140970bf60325ae60bd8e6783b834aea4ccfd8f2","tarball":"http://registry.npmjs.org/bones/-/bones-2.0.0alpha2.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"directories":{}},"1.3.14":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.14","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/diggersf/.npm/bones/1.3.14/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.14","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"e9dd561c2e4dae8613d0fa0f275e5cd24d86b613","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.14.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"directories":{}},"1.3.15":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.15","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/home/devseed/.npm/bones/1.3.15/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.15","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"61b528251573c3efb71076300d80cc7d8a9dedd3","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.15.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"directories":{}},"1.3.16":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.16","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.5","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/dmitri/.npm/bones/1.3.16/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.16","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"df2bb624952ba85f16776a3d9c1bb27e4340b270","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.16.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"2.0.0alpha3":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.0.0alpha3","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.5.1","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/ab/.npm/bones/2.0.0alpha3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@2.0.0alpha3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"5f60a3dbc3d27b83f3e035fec4212af5feabc41c","tarball":"http://registry.npmjs.org/bones/-/bones-2.0.0alpha3.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"2.0.0":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.0.0","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.5.1","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/ab/.npm/bones/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@2.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"afb24a5fb8cbf99f305979a24efc1799041ed0b3","tarball":"http://registry.npmjs.org/bones/-/bones-2.0.0.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.17":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.17","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.5","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.17/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.17","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b0ad1b8c3943f66fb1945fd5f7de4d6c10e118aa","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.17.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.18":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.18","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.6","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/home/devseed/.npm/bones/1.3.18/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.18","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d24ee2195fde54e5468d9442899f63591ae2dd8b","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.18.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.19":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.19","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.7","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/kkaefer/.npm/bones/1.3.19/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@1.3.19","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e4a6d826a1ef19ac739d834dcda51ea2428c57a2","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.19.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.20":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.20","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.7","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmUser":{"name":"kkaefer","email":"kkaefer@gmail.com"},"_id":"bones@1.3.20","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"40f33830f6877aed16a5b725187917ad236c26ac","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.20.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.21":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.21","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.7","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmUser":{"name":"willwhite","email":"will@developmentseed.org"},"_id":"bones@1.3.21","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"40e33a7b2bb6e4860a0396278bb650fe623b9abf","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.21.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.22":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.22","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.7","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmUser":{"name":"yhahn","email":"young@developmentseed.org"},"_id":"bones@1.3.22","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"379d30ed37590ec2e30e45e081a7ddff09adcfad","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.22.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"2.0.0alpha4":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.0.0alpha4","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.5.1","jquery":"1.6.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmJsonOpts":{"file":"/Users/adrian/.npm/bones/2.0.0alpha4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones@2.0.0alpha4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"df4187b72cf89e72a3505a5b4a81b96128f34509","tarball":"http://registry.npmjs.org/bones/-/bones-2.0.0alpha4.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.23":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.23","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.7","backbone":"0.3.3","jquery":"1.5.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmUser":{"name":"willwhite","email":"will@developmentseed.org"},"_id":"bones@1.3.23","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4d19c5c5a780c6e5ae5eba35d97589f95b4c010c","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.23.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"2.0.1":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.0.1","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.4.4","backbone":"0.5.1","jquery":"1.6.x","optimist":"0.1.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmUser":{"name":"tmcw","email":"macwright@gmail.com"},"_id":"bones@2.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"48796eb2ecf65bcdb96a19fb41c4733d40368706","tarball":"http://registry.npmjs.org/bones/-/bones-2.0.1.tgz"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information\non [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started)\nand on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Example Application\n\n* The [simple app example](https://github.com/developmentseed/bones/tree/master/examples/simple) is\n  a good quickstart to making a bones application.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"2.1.0alpha0":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.1.0alpha0","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"2.5.4","backbone":"0.5.1","jquery":"1.6.x","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"_npmUser":{"name":"tmcw","email":"macwright@gmail.com"},"_id":"bones@2.1.0alpha0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"f9cf86ea4f66457ab712f4bce98b3fa0becefb7d","tarball":"http://registry.npmjs.org/bones/-/bones-2.1.0alpha0.tgz"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information\non [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started)\nand on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Example Application\n\n* The [simple app example](https://github.com/developmentseed/bones/tree/master/examples/simple) is\n  a good quickstart to making a bones application.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.24":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.24","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"~2.5.4","backbone":"0.3.3","jquery":"~1.6.3","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"engines":{"node":"0.4 || 0.6"},"_npmUser":{"name":"springmeyer","email":"dane@dbsgeo.com"},"_id":"bones@1.3.24","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d78ca3e396f232668b32a9211d67bf9ba927ccb1","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.24.tgz"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone controller routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information on [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started) and on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.25":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.25","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"~2.5.4","backbone":"0.3.3","jquery":"~1.6.3","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"engines":{"node":"0.4 || 0.6"},"_npmUser":{"name":"willwhite","email":"will@developmentseed.org"},"_id":"bones@1.3.25","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"867a20b4df05fdeee17280a39d8ad451795578f1","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.25.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"directories":{}},"1.3.26":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.26","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"~2.5.4","backbone":"0.3.3","jquery":"~1.6.3","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"engines":{"node":"0.4 || 0.6"},"_npmUser":{"name":"springmeyer","email":"dane@dbsgeo.com"},"_id":"bones@1.3.26","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4feda39dfb413607a73ebd37edf32f58a3ae2236","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.26.tgz"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone controller routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information on [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started) and on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}]},"2.2.0":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.2.0","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"~2.5.4","backbone":"0.5.3","jquery":"~1.6.3","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"engines":{"node":"0.4 || 0.6"},"_npmUser":{"name":"willwhite","email":"will@mapbox.com"},"_id":"bones@2.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"dd7c15ed3f9d4d9e237cf61b3813134e636a2f28","tarball":"http://registry.npmjs.org/bones/-/bones-2.2.0.tgz"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information\non [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started)\nand on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Example Application\n\n* The [simple app example](https://github.com/developmentseed/bones/tree/master/examples/simple) is\n  a good quickstart to making a bones application.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}]},"2.3.0":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"2.3.0","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"~2.5.4","backbone":"0.5.3","jquery":"~1.6.3","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"mocha -R spec","coverage":"./test/coverage.sh"},"engines":{"node":"0.4 || 0.6 || 0.8"},"_npmUser":{"name":"willwhite","email":"will@mapbox.com"},"_id":"bones@2.3.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"49be8ec8174d111857f77484d55cc4244425323c","tarball":"http://registry.npmjs.org/bones/-/bones-2.3.0.tgz"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information\non [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started)\nand on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Example Application\n\n* The [simple app example](https://github.com/developmentseed/bones/tree/master/examples/simple) is\n  a good quickstart to making a bones application.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\nCode coverages tests require [jscoverage](https://github.com/visionmedia/node-jscoverage). To generate a report run `npm run-script coverage`.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}]},"1.3.27":{"name":"bones","description":"Framework for using backbone.js on the client and server.","version":"1.3.27","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"main":"./bones.js","dependencies":{"underscore":"1.1.x","express":"~2.5.4","backbone":"0.3.3","jquery":"~1.6.3","optimist":"0.3.x","mirror":"0.3.x"},"scripts":{"test":"expresso -I ..","coverage":"./test/coverage.sh"},"engines":{"node":"0.4 || 0.6 || 0.8"},"readme":"# Bones\n\nBones provides conventions for [Backbone](http://documentcloud.github.com/backbone/) applications. It allows most code to be shared on the server and the client. Bones exposes your Backbone controller routes as regular paths on the server so they can be accessed by non-JavaScript agents, while capable clients can enjoy the normal client-side Backbone experience.\n\n## Getting started\n\nThe [wiki](https://github.com/developmentseed/bones/wiki) contains more information on [**Getting Started**](https://github.com/developmentseed/bones/wiki/Getting-Started) and on the [concepts](https://github.com/developmentseed/bones/wiki/Plugin-Architecture) in Bones.\n\n## Testing\n\nTo run the test suite, type `npm test`. **Note**: bones has to be in a folder named `node_modules` for tests to work correctly.\n\n## License\n\nBones is [BSD licensed](https://github.com/developmentseed/bones/raw/master/LICENSE).\n\n","_id":"bones@1.3.27","dist":{"shasum":"38048e864caf81194f180529bff0b067309ec91a","tarball":"http://registry.npmjs.org/bones/-/bones-1.3.27.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"},{"name":"dmitrig01","email":"dmitrig01@gmail.com"}],"time":{"modified":"2012-08-02T13:43:42.355Z","created":"2011-05-03T20:45:13.824Z","1.0.0":"2011-05-03T20:45:14.077Z","1.1.0":"2011-05-03T20:56:28.983Z","1.2.0":"2011-05-10T18:07:37.391Z","1.2.1":"2011-05-11T14:31:40.139Z","1.2.2":"2011-05-11T19:08:57.069Z","1.2.3":"2011-05-12T18:18:41.280Z","1.2.4":"2011-05-13T05:56:51.665Z","1.2.5":"2011-05-16T15:34:06.047Z","1.2.6":"2011-05-17T20:13:45.257Z","1.3.0":"2011-05-18T22:50:28.527Z","1.3.1":"2011-05-31T04:15:35.757Z","1.3.2":"2011-06-02T18:33:11.639Z","1.3.3":"2011-06-02T21:18:10.801Z","1.3.4":"2011-06-09T03:27:48.948Z","1.3.5":"2011-06-13T14:42:01.014Z","1.3.6":"2011-06-13T22:43:59.930Z","1.3.7":"2011-06-28T15:36:43.048Z","1.3.8":"2011-06-29T16:54:04.518Z","1.3.9":"2011-07-01T17:12:54.184Z","1.3.10":"2011-07-07T15:06:28.352Z","1.3.11":"2011-07-11T13:07:21.684Z","1.3.12":"2011-07-27T14:36:07.698Z","2.0.0alpha1":"2011-07-28T20:07:17.510Z","1.3.13":"2011-08-01T19:20:04.596Z","2.0.0alpha2":"2011-08-19T20:25:30.973Z","1.3.14":"2011-08-19T20:32:43.098Z","1.3.15":"2011-08-22T16:43:01.003Z","1.3.16":"2011-08-23T15:16:28.032Z","2.0.0alpha3":"2011-09-13T15:21:48.165Z","2.0.0":"2011-09-13T15:30:37.593Z","1.3.17":"2011-09-19T20:27:27.923Z","1.3.18":"2011-09-30T14:36:28.260Z","1.3.19":"2011-10-05T22:48:44.427Z","1.3.20":"2011-10-26T21:45:09.672Z","1.3.21":"2011-11-29T17:30:38.753Z","1.3.22":"2011-12-15T21:11:11.163Z","2.0.0alpha4":"2012-01-25T21:47:27.303Z","1.3.23":"2012-02-10T20:23:31.766Z","2.0.1":"2012-02-10T22:28:31.116Z","2.1.0alpha0":"2012-02-10T22:31:30.637Z","1.3.24":"2012-03-09T01:23:05.388Z","1.3.25":"2012-03-23T03:03:09.729Z","1.3.26":"2012-04-17T00:19:43.216Z","2.2.0":"2012-07-19T22:18:00.215Z","2.3.0":"2012-07-27T20:41:51.956Z","1.3.27":"2012-07-31T18:40:47.086Z"},"description":"Framework for using backbone.js on the client and server.","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"users":{"fgribreau":true},"_attachments":{"bones-1.3.27.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-HovuB4ne9JeR+BzMofxYMw==","length":52106,"stub":true},"bones-2.3.0.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-3ZBgDTZD4UajpkDL9c4xBg==","length":60440,"stub":true},"bones-2.2.0.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-irwNGdPJoPrORbzq9hzj6w==","length":58598,"stub":true},"bones-1.3.26.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-6jfR4l4nrMm1fkhL7SX0Tw==","length":52122,"stub":true},"bones-1.3.25.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-lJg/ZzuHyCO6u3pf72Hw+Q==","length":61440,"stub":true},"bones-1.3.24.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-4RdMiHkvNORhr5UUahwBag==","length":52572,"stub":true},"bones-2.1.0alpha0.tgz":{"content_type":"application/octet-stream","revpos":92,"digest":"md5-c9i78oSbl8waCYmWrab0lw==","length":58781,"stub":true},"bones-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":90,"digest":"md5-POUeLjDv510X1jOG8aIfJw==","length":58785,"stub":true},"bones-1.3.23.tgz":{"content_type":"application/octet-stream","revpos":88,"digest":"md5-oZzxTBAo+TJQss6bLaj++w==","length":61440,"stub":true},"bones-2.0.0alpha4.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-4/b/c8ygLNeBFj6Flal/Sg==","length":58002,"stub":true},"bones-1.3.22.tgz":{"content_type":"application/octet-stream","revpos":84,"digest":"md5-TxLhRytsGmM1mjuwlH9v9Q==","length":51772,"stub":true},"bones-1.3.21.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-OLSvLA8MGpfZh21yNHP7Sw==","length":61440,"stub":true},"bones-1.3.20.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-+wQaXKEu2mWrvkerXMYtnA==","length":61440,"stub":true},"bones-1.3.19.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-NGrFSru4JsJLnfiPglK0Hg==","length":51791,"stub":true},"bones-1.3.18.tgz":{"content_type":"application/octet-stream","revpos":72,"digest":"md5-tCqALWky/q4I+ssOweB86w==","length":51645,"stub":true},"bones-1.3.17.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-XSI3XKB16KdYBVfYIIE+Xg==","length":51484,"stub":true},"bones-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":68,"digest":"md5-u/Kjz5mwwJRRy4qqEzYkiA==","length":50817,"stub":true},"bones-2.0.0alpha3.tgz":{"content_type":"application/octet-stream","revpos":66,"digest":"md5-cyun+mbkRXgl/NYsZwULmQ==","length":50815,"stub":true},"bones-1.3.16.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-vLwN7IiOUTWtyTBEL6hSMQ==","length":51366,"stub":true},"bones-1.3.15.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-E7bGE/B5sY4vnHbFlyUvJg==","length":51467,"stub":true},"bones-1.3.14.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-25Yo+RYscM0E4ddaxCJW1g==","length":51253,"stub":true},"bones-2.0.0alpha2.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-2R2FUJO3k6wticjtZyeMaw==","length":50722,"stub":true},"bones-1.3.13.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-IZQR1JSdbSisFkM+/IE8Vg==","length":51331,"stub":true},"bones-2.0.0alpha1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-SJ7PGqKPwF5R/4BlYhDX4Q==","length":50640,"stub":true},"bones-1.3.12.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-JXtYdHt+FtU++gKe/lH3ww==","length":51091,"stub":true},"bones-1.3.11.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-hhQL2oBhdpw996sWQqP+Ug==","length":50943,"stub":true},"bones-1.3.10.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-MzZo8MyWlHLLUdWKYn5bPw==","length":51023,"stub":true},"bones-1.3.9.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-0uweE14YZjZbHM+jnstpgQ==","length":50957,"stub":true},"bones-1.3.8.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-oVp1Nv5eps9jDm35793j2Q==","length":51128,"stub":true},"bones-1.3.7.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-M4oT9wG+81QDAdG7+w0x6g==","length":50832,"stub":true},"bones-1.3.6.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-7wdG5SVV64kAI4AYKP9LIg==","length":50794,"stub":true},"bones-1.3.5.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-hfGiPr3lXRKMzvpTxW9gng==","length":50747,"stub":true},"bones-1.3.4.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-6DM1JtpXFU4wzpDcB2lq3A==","length":83653,"stub":true},"bones-1.3.3.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-CFoPcKl1R5uhRLLaJdgWpA==","length":83514,"stub":true},"bones-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-b78Gz2la7l3/Jo3BdlbqBQ==","length":83693,"stub":true},"bones-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-qmKEI6COupZpXy5/4Kkb4w==","length":83484,"stub":true},"bones-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-c7CaYyIo9C1Di1BuIEuolQ==","length":83394,"stub":true},"bones-1.2.6.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-4s34+pbSJGZPEWtNNcIiQA==","length":83635,"stub":true},"bones-1.2.5.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-gtXPg0i6VVU9i/cFKuGSDw==","length":78381,"stub":true},"bones-1.2.4.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-Xx64f1fVWWCi4pryBuZU1Q==","length":78223,"stub":true},"bones-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-ILvdIbvGNyBL/qYxKYKZlQ==","length":78114,"stub":true},"bones-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-cWJNeqNDkZY0GVSyOVMieA==","length":78059,"stub":true},"bones-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-nh8MbIzwmP7NDpHtkJlWLA==","length":77732,"stub":true},"bones-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-aZvLWPVuxsXKSnzvhPaSOQ==","length":77056,"stub":true},"bones-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-PfG2qur+HOU2qr9hDGHE9A==","length":76968,"stub":true},"bones-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Hb6A82B26YVAfSOrYtQnPQ==","length":76906,"stub":true}}}},
{"id":"bones-admin","key":"bones-admin","value":{"rev":"11-2cdfe738d66aacff8569712a279c041d"},"doc":{"_id":"bones-admin","_rev":"11-2cdfe738d66aacff8569712a279c041d","name":"bones-admin","dist-tags":{"latest":"2.0.0"},"versions":{"1.2.0":{"name":"bones-admin","version":"1.2.0","scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{},"_id":"bones-admin@1.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"13a5c73276e90cfa079c0adae21456a1a10614b8","tarball":"http://registry.npmjs.org/bones-admin/-/bones-admin-1.2.0.tgz"}},"2.0.0":{"name":"bones-admin","version":"2.0.0","scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/Users/ab/.npm/bones-admin/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-admin@2.0.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"81d0166060f0c60c7937d9de4993f6879762d59b","tarball":"http://registry.npmjs.org/bones-admin/-/bones-admin-2.0.0.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"time":{"modified":"2011-09-13T15:38:49.025Z","created":"2011-05-10T18:11:16.462Z","1.2.0":"2011-05-10T18:11:16.658Z","2.0.0":"2011-09-13T15:38:49.025Z"},"_attachments":{"bones-admin-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-iE46C3KYZlyiC0l/86R2IA==","length":9682,"stub":true},"bones-admin-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sIv87UQRzJaShXZxjPsNsg==","length":9600,"stub":true}}}},
{"id":"bones-auth","key":"bones-auth","value":{"rev":"45-eda811169392e3876a00008a0cd04782"},"doc":{"_id":"bones-auth","_rev":"45-eda811169392e3876a00008a0cd04782","name":"bones-auth","dist-tags":{"latest":"2.1.0"},"versions":{"1.2.0":{"name":"bones-auth","version":"1.2.0","scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{},"_id":"bones-auth@1.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"e3be8b2767ecf523fea0b0873cfd66d867fb0994","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.2.0.tgz"}},"1.2.1":{"name":"bones-auth","version":"1.2.1","scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{},"_id":"bones-auth@1.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"fcc1841f37ca5daf589fc635b9bf8ade8c9422b3","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.2.1.tgz"}},"1.2.3":{"name":"bones-auth","version":"1.2.3","scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{},"_id":"bones-auth@1.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"f1aaf2d0ac693963d21c2e3b9a93746cde709b5d","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.2.3.tgz"}},"1.2.4":{"name":"bones-auth","version":"1.2.4","scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{},"_id":"bones-auth@1.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"78e1a2bf1b65b02c6b48a642774224ef468f527e","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.2.4.tgz"}},"1.2.5":{"name":"bones-auth","version":"1.2.5","scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{},"_id":"bones-auth@1.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"b9a7a0c3cd1115f388d285fde40129675640c415","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.2.5.tgz"}},"1.3.0":{"name":"bones-auth","version":"1.3.0","scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"devDependencies":{"backbone-stash":"0.0.x"},"_id":"bones-auth@1.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"2d576463ca1c8945234b14c1f08cb0648156811b","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.0.tgz"}},"1.3.1":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.1","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_id":"bones-auth@1.3.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"e94af662f35bc87adcf9411c37eccc99a1b739a0","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.1.tgz"}},"1.3.2":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.2","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_id":"bones-auth@1.3.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"789c4e9fea7a53c881d98d1e7cff70e1f4399841","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.2.tgz"}},"1.3.3":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.3","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_id":"bones-auth@1.3.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"6b9a289fff1719afa6106e2d0ccff8f90e063843","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.3.tgz"}},"1.3.4":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.4","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmJsonOpts":{"file":"/home/devseed/.npm/bones-auth/1.3.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-auth@1.3.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"08ea93406cc14eb18c0c87e0fe447024328f8722","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.4.tgz"}},"1.3.5":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.5","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmJsonOpts":{"file":"/Users/adrian/.npm/bones-auth/1.3.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-auth@1.3.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"12df53cb5453018a11ed0307febab47cd42edb0a","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.5.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"1.3.6":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.6","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmJsonOpts":{"file":"/Users/diggersf/.npm/bones-auth/1.3.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-auth@1.3.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7abe6894602698ec456830d2f5aa0574c1cbbcb3","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.6.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"2.0.0alpha1":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"2.0.0alpha1","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmJsonOpts":{"file":"/Users/ab/.npm/bones-auth/2.0.0alpha1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-auth@2.0.0alpha1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a6ed7879272398563834e187927a883b70322058","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-2.0.0alpha1.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"2.0.0":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"2.0.0","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmJsonOpts":{"file":"/Users/ab/.npm/bones-auth/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-auth@2.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c14030fc3dc1589c55da2fce90f46b74bea2b92f","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-2.0.0.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"1.3.7":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.7","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmJsonOpts":{"file":"/Users/diggersf/.npm/bones-auth/1.3.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-auth@1.3.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"0180c16ca07a822abd54d9e549126bf0407440a8","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.7.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"1.3.8":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.8","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmUser":{"name":"kkaefer","email":"kkaefer@gmail.com"},"_id":"bones-auth@1.3.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"922eba328c449f7d9bb5eba16840d3ec75c7ef63","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.8.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"1.3.9":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.9","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmUser":{"name":"yhahn","email":"young@developmentseed.org"},"_id":"bones-auth@1.3.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"16fe071abb434d0d65a40afd947195601438e27b","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.9.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"1.3.10":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"1.3.10","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"expresso"},"dependencies":{"email":"0.2.3"},"_npmUser":{"name":"adrianrossouw","email":"adrian@developmentseed.org"},"_id":"bones-auth@1.3.10","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e6bde4319cbf53854fd10dfcc63612a99ab1c585","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-1.3.10.tgz"},"readme":"Bones Auth\n----------\nProvides base `Auth` and `AuthList` (model, collection) base\nclasses and `authenticate` Connect middleware for implementing basic\nsession-based user login with Backbone.js, Bones and Express.\n\nA basic `User` model that extends `Auth` is provided as an example and\nstarting point. Integration with `bones-admin` through administrative views\nis also available.\n\n### Tested with\n\n- developmentseed bones 0.0.2\n- documentcloud backbone 0.3.3\n- visionmedia express 1.0.7\n\n### Running tests\n\n- Use [kkaefer's expresso branch](https://github.com/kkaefer/expresso/tree/stop_listening_servers)\n- Run `npm test`\n\n### Components\n\n- `bones-auth.js`: client side javascript. Contains the mvc classes for any\n  client-side `backbone.js` code to reference.\n- `bones-auth`: common js module for use with node.js. Includes server-side\n  specific overrides to mvc classes as well as other server-side code.\n\n### Usage\n\n#### `Auth`\n\nAbstract model class. Extend it with your own model to create a model which can\nbe \"authenticated\". See the `User` model for an example.\n\n#### `AuthList`\n\nAbstract collection class. Extend it for use with collections that contain\nmodel classes inheriting from `Auth`.\n\n#### `authenticate` middleware\n\nRequire `authenticate` connect middleware and add it as a middleware for\nauthenticating models. Automatically adds and manages the Connect session\nmiddleware -- session cookies will only be sent and active when authenticating\nand/or an authenticated session already exists. Allows for sane proxy caching.\n\n    var express = require('express'),\n        server = express.createServer(),\n        secret = 'MySecretKey';\n\n    // Express middleware.\n    server.use(express.bodyDecoder());\n    server.use(express.cookieDecoder());\n\n    // Pass secret key to Bones for CSRF protection.\n    require('bones').Bones(server, { secret: secret });\n\n    // Require bones-auth to use authenticate middleware.\n    // Handles authentication requests to `/api/Authenticate`.\n    var authenticate = require('bones-auth').authenticate;\n    server.use(authenticate({ secret: secret });\n\n#### Authors\n\n- [Will White](http://github.com/willwhite)\n- [Young Hahn](http://github.com/yhahn)\n\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"2.1.0":{"name":"bones-auth","description":"User model with password based authentication for Bones.","version":"2.1.0","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"scripts":{"test":"./node_modules/.bin/mocha -R spec --ignore-leaks"},"dependencies":{"email":"0.2.3"},"devDependencies":{"mocha":"1.3.x"},"_npmUser":{"name":"willwhite","email":"will@mapbox.com"},"_id":"bones-auth@2.1.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4db0fb990c9d527d5b40d9a8e6339024538acaf7","tarball":"http://registry.npmjs.org/bones-auth/-/bones-auth-2.1.0.tgz"},"readme":"Bones Auth\n----------\nProvides base `Auth` and `AuthList` (model, collection) base\nclasses and `authenticate` Connect middleware for implementing basic\nsession-based user login with Backbone.js, Bones and Express.\n\nA basic `User` model that extends `Auth` is provided as an example and\nstarting point. Integration with `bones-admin` through administrative views\nis also available.\n\n### Tested with\n\n- developmentseed bones 0.0.2\n- documentcloud backbone 0.3.3\n- visionmedia express 1.0.7\n\n### Running tests\n\n- Use [kkaefer's expresso branch](https://github.com/kkaefer/expresso/tree/stop_listening_servers)\n- Run `npm test`\n\n### Components\n\n- `bones-auth.js`: client side javascript. Contains the mvc classes for any\n  client-side `backbone.js` code to reference.\n- `bones-auth`: common js module for use with node.js. Includes server-side\n  specific overrides to mvc classes as well as other server-side code.\n\n### Usage\n\n#### `Auth`\n\nAbstract model class. Extend it with your own model to create a model which can\nbe \"authenticated\". See the `User` model for an example.\n\n#### `AuthList`\n\nAbstract collection class. Extend it for use with collections that contain\nmodel classes inheriting from `Auth`.\n\n#### `authenticate` middleware\n\nRequire `authenticate` connect middleware and add it as a middleware for\nauthenticating models. Automatically adds and manages the Connect session\nmiddleware -- session cookies will only be sent and active when authenticating\nand/or an authenticated session already exists. Allows for sane proxy caching.\n\n    var express = require('express'),\n        server = express.createServer(),\n        secret = 'MySecretKey';\n\n    // Express middleware.\n    server.use(express.bodyDecoder());\n    server.use(express.cookieDecoder());\n\n    // Pass secret key to Bones for CSRF protection.\n    require('bones').Bones(server, { secret: secret });\n\n    // Require bones-auth to use authenticate middleware.\n    // Handles authentication requests to `/api/Authenticate`.\n    var authenticate = require('bones-auth').authenticate;\n    server.use(authenticate({ secret: secret });\n\n#### Authors\n\n- [Will White](http://github.com/willwhite)\n- [Young Hahn](http://github.com/yhahn)\n\n","maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"ianshward","email":"ian@developmentseed.org"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"time":{"modified":"2012-07-20T19:47:09.688Z","created":"2011-05-10T18:12:05.772Z","1.2.0":"2011-05-10T18:12:06.037Z","1.2.1":"2011-05-10T19:42:55.733Z","1.2.3":"2011-05-12T22:51:52.568Z","1.2.4":"2011-05-13T00:04:40.400Z","1.2.5":"2011-05-13T14:44:06.365Z","1.3.0":"2011-05-20T19:33:52.092Z","1.3.1":"2011-06-09T03:52:27.117Z","1.3.2":"2011-06-09T05:53:27.389Z","1.3.3":"2011-06-24T16:49:12.974Z","1.3.4":"2011-07-07T14:35:40.705Z","1.3.5":"2011-08-17T15:46:34.719Z","1.3.6":"2011-09-01T04:10:56.133Z","2.0.0alpha1":"2011-09-13T15:44:10.583Z","2.0.0":"2011-09-13T16:07:15.098Z","1.3.7":"2011-10-05T17:10:28.119Z","1.3.8":"2011-10-26T21:45:52.108Z","1.3.9":"2011-11-09T16:51:47.445Z","1.3.10":"2012-02-24T01:30:59.282Z","2.1.0":"2012-07-20T19:47:09.688Z"},"description":"User model with password based authentication for Bones.","author":{"name":"Development Seed","email":"info@developmentseed.org","url":"http://developmentseed.org/"},"_attachments":{"bones-auth-2.1.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-Dh32XSbyNoDNzEh9GVtatQ==","length":17895,"stub":true},"bones-auth-1.3.10.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-NxeMZDA/TJv0QbFF7BXMLQ==","length":14117,"stub":true},"bones-auth-1.3.9.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-NYtt3E2xhJZn9NBkObc6/g==","length":13893,"stub":true},"bones-auth-1.3.8.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-eEltKSpWQMuao+PLzEVvuQ==","length":20480,"stub":true},"bones-auth-1.3.7.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-Mn7Gn3qFg5syYDB5IGAyGg==","length":13386,"stub":true},"bones-auth-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-CcRFC/h6nWOPEjEwgud62g==","length":13443,"stub":true},"bones-auth-2.0.0alpha1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-1SIPNY1GN+cWLEhzYv58kQ==","length":13447,"stub":true},"bones-auth-1.3.6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-m0/HwI/oDkTe06dUExoNkQ==","length":13377,"stub":true},"bones-auth-1.3.5.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-G6N/Eyh0CpX0x3CHGoWlXw==","length":13260,"stub":true},"bones-auth-1.3.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-aiuLzUF0kFO4gB9KRRizMg==","length":13272,"stub":true},"bones-auth-1.3.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1w1TXHAqyejBcJDUYIxysw==","length":12664,"stub":true},"bones-auth-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-jQTVLAa/lL9ofTrU/ZDXgw==","length":12692,"stub":true},"bones-auth-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-ARzN9IqXDfL9AG3Qag16rg==","length":12681,"stub":true},"bones-auth-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-8k7vONXG46imcz/UsUBHuQ==","length":12387,"stub":true},"bones-auth-1.2.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-lT6YThY+t4CRX1mjTTMxJQ==","length":8519,"stub":true},"bones-auth-1.2.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-nbIn0BYyJjZvJ92pVNHu8w==","length":8624,"stub":true},"bones-auth-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-thh83MUknJw67uM/FW/eyg==","length":8444,"stub":true},"bones-auth-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8HaWtib5b5tMss0axL84+Q==","length":8266,"stub":true},"bones-auth-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VIPd3d/WMqUTfpUB554nvg==","length":8363,"stub":true}}}},
{"id":"bones-document","key":"bones-document","value":{"rev":"13-95971fed1f47005c282e0fa60498e31c"},"doc":{"_id":"bones-document","_rev":"13-95971fed1f47005c282e0fa60498e31c","name":"bones-document","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.2":{"name":"bones-document","version":"1.0.2","dependencies":{"JSV":"https://github.com/garycourt/JSV/tarball/e05e2595cb9e11251e5231a1f384043443532bd6","showdown":"https://github.com/coreyti/showdown/tarball/3c52317851e07772ceef1593686e9cf018ae6563"},"bundleDependencies":["bones","expresso"],"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones-document@1.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"7f6ff3f3be37b080309655bf29975a4d08f303cb","tarball":"http://registry.npmjs.org/bones-document/-/bones-document-1.0.2.tgz"}},"1.2.0":{"name":"bones-document","version":"1.2.0","dependencies":{"JSV":"https://github.com/garycourt/JSV/tarball/e05e2595cb9e11251e5231a1f384043443532bd6","showdown":"https://github.com/coreyti/showdown/tarball/3c52317851e07772ceef1593686e9cf018ae6563"},"bundleDependencies":["bones","expresso"],"scripts":{"test":"expresso"},"devDependencies":{},"_id":"bones-document@1.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"649aff550077576bca853452c74ef0b464e498f6","tarball":"http://registry.npmjs.org/bones-document/-/bones-document-1.2.0.tgz"}},"2.0.0":{"name":"bones-document","version":"2.0.0","dependencies":{"JSV":"https://github.com/garycourt/JSV/tarball/e05e2595cb9e11251e5231a1f384043443532bd6","showdown":"https://github.com/coreyti/showdown/tarball/3c52317851e07772ceef1593686e9cf018ae6563"},"bundleDependencies":["bones","expresso"],"scripts":{"test":"expresso"},"_npmJsonOpts":{"file":"/Users/ab/.npm/bones-document/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-document@2.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f9ec606ff52c736ac4ca4ecb373ab03688442175","tarball":"http://registry.npmjs.org/bones-document/-/bones-document-2.0.0.tgz"},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]}},"maintainers":[{"name":"kkaefer","email":"kkaefer@gmail.com"},{"name":"yhahn","email":"young@developmentseed.org"},{"name":"tmcw","email":"macwright@gmail.com"},{"name":"willwhite","email":"will@developmentseed.org"},{"name":"springmeyer","email":"dane@dbsgeo.com"},{"name":"lxbarth","email":"alex@developmentseed.org"},{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"time":{"modified":"2011-09-13T15:50:08.890Z","created":"2011-05-11T16:13:37.173Z","1.0.2":"2011-05-11T16:13:37.408Z","1.2.0":"2011-05-17T21:05:33.430Z","2.0.0":"2011-09-13T15:50:08.890Z"},"_attachments":{"bones-document-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-We5MKMQGPchgIjvUMbmNwA==","length":7677,"stub":true},"bones-document-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MIyb1rQNZgF85Zf59/BTPA==","length":6518,"stub":true},"bones-document-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L2jD7HmRgSILSb4jfHvk3A==","length":6259,"stub":true}}}},
{"id":"bones-form","key":"bones-form","value":{"rev":"5-37c94755984177431336d403f7da97bf"},"doc":{"_id":"bones-form","_rev":"5-37c94755984177431336d403f7da97bf","name":"bones-form","description":"Form library for bones.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bones-form","description":"Form library for bones.","homepage":"https://github.com/Wiredcraft/bones-form/wiki","engins":{"node":">= 0.4.7"},"author":{"name":"Jackey chen","email":"jziwenchen@gmail.com","url":"https://github.com/jackey"},"version":"0.0.1","main":"./index.js","dependencies":{"connect":"1.8.x"},"scripts":{"test":"expresso test/test.js"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/Jackey/.npm/bones-form/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-form@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d9b6346edd5b255f00acae48fb5c729a0c7b6b14","tarball":"http://registry.npmjs.org/bones-form/-/bones-form-0.0.1.tgz"},"maintainers":[{"name":"jackey","email":"jziwenchen@gmail.com"}]},"0.0.2":{"name":"bones-form","version":"0.0.2","main":"./index.js","dependencies":{"connect":"1.8.x"},"scripts":{"test":"expresso test/test.js"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/Jackey/.npm/bones-form/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-form@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"a71d84176410ec2f00a05ba55bac9af214631cfa","tarball":"http://registry.npmjs.org/bones-form/-/bones-form-0.0.2.tgz"},"maintainers":[{"name":"jackey","email":"jziwenchen@gmail.com"}]}},"maintainers":[{"name":"jackey","email":"jziwenchen@gmail.com"}],"time":{"modified":"2012-03-05T09:19:57.393Z","created":"2012-02-22T05:58:09.774Z","0.0.1":"2012-02-22T05:58:26.366Z","0.0.2":"2012-03-05T09:19:57.393Z"},"author":{"name":"Jackey chen","email":"jziwenchen@gmail.com","url":"https://github.com/jackey"},"_attachments":{"bones-form-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MidMhsOZHPrt+zoRhxf6Bw==","length":53219,"stub":true},"bones-form-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9DoSnlCpd34Nvh2c1M8egw==","length":52565,"stub":true}}}},
{"id":"bones-passport","key":"bones-passport","value":{"rev":"5-ebbe7f1e48e57335f2d1108d4ccfe1ce"},"doc":{"_id":"bones-passport","_rev":"5-ebbe7f1e48e57335f2d1108d4ccfe1ce","name":"bones-passport","description":"Integrate the passport authentication framework into Bones.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Developmentseed","email":"info@developmentseed.org","url":"http://developmentseed.org"},"name":"bones-passport","description":"Integrate the passport authentication framework into Bones.","version":"0.0.1","engines":{"node":"~0.4.12"},"dependencies":{"express":"=2.4.4","passport":"0.1.3","passport-dummy":"0.0.1","passport-oauth":"0.1.1","passport-local":"0.1.0","passport-twitter":"0.1.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/adrian/.npm/bones-passport/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-passport@0.0.1","_engineSupported":false,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"afec12ae29a0799f1cae88c704c3c8f637f9d5d3","tarball":"http://registry.npmjs.org/bones-passport/-/bones-passport-0.0.1.tgz"},"maintainers":[{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]},"0.0.2":{"author":{"name":"Developmentseed","email":"info@developmentseed.org","url":"http://developmentseed.org"},"name":"bones-passport","description":"Integrate the passport authentication framework into Bones.","version":"0.0.2","dependencies":{"express":"=2.4.4","passport":"0.1.3","passport-dummy":"0.0.1","passport-oauth":"0.1.1","passport-local":"0.1.0","passport-twitter":"0.1.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/adrian/.npm/bones-passport/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bones-passport@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"98351e1daa1fcfceacfdac916dc0bedbbd0c8f72","tarball":"http://registry.npmjs.org/bones-passport/-/bones-passport-0.0.2.tgz"},"maintainers":[{"name":"adrianrossouw","email":"adrian@developmentseed.org"}]}},"maintainers":[{"name":"adrianrossouw","email":"adrian@developmentseed.org"}],"time":{"modified":"2012-01-27T15:22:10.929Z","created":"2012-01-27T15:18:30.153Z","0.0.1":"2012-01-27T15:18:34.880Z","0.0.2":"2012-01-27T15:22:10.929Z"},"author":{"name":"Developmentseed","email":"info@developmentseed.org","url":"http://developmentseed.org"},"_attachments":{"bones-passport-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2EARmPT2s1eO7rABiNwXJw==","length":2707,"stub":true},"bones-passport-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pE/r+m0vrCDAi4OIqiubuw==","length":2723,"stub":true}}}},
{"id":"bonescript","key":"bonescript","value":{"rev":"3-c86f4b4e8b4597c662ce822a881ee7fd"},"doc":{"_id":"bonescript","_rev":"3-c86f4b4e8b4597c662ce822a881ee7fd","name":"bonescript","description":"Physical computing library for embedded Linux","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Jason Kridner","email":"jkridner@beagleboard.org","url":"http://blog.hangerhead.com"},"name":"bonescript","description":"Physical computing library for embedded Linux","keywords":["embedded","linux","beagleboard","beaglebone","physical","gpio","arduino"],"version":"0.0.1","homepage":"http://beagleboard.org/bonescript","repository":{"type":"git","url":"git://github.com/jadonk/bonescript/node_modules/bonescript"},"main":"index","engines":{"node":">= 0.6.5"},"dependencies":{"socket.io":"0.8.7"},"devDependencies":{},"_npmUser":{"name":"jkridner","email":"jkridner@beagleboard.org"},"_id":"bonescript@0.0.1","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build","start":"node server.js"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c05a999cbe27a75974e874ab35d008dda0906f06","tarball":"http://registry.npmjs.org/bonescript/-/bonescript-0.0.1.tgz"},"readme":"","maintainers":[{"name":"jkridner","email":"jkridner@beagleboard.org"}]}},"readme":"","maintainers":[{"name":"jkridner","email":"jkridner@beagleboard.org"}],"time":{"modified":"2012-05-30T00:45:17.320Z","created":"2012-05-30T00:45:17.138Z","0.0.1":"2012-05-30T00:45:17.320Z"},"author":{"name":"Jason Kridner","email":"jkridner@beagleboard.org","url":"http://blog.hangerhead.com"},"repository":{"type":"git","url":"git://github.com/jadonk/bonescript/node_modules/bonescript"},"_attachments":{"bonescript-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OdQNVBGosC2B6cODSOBHww==","length":50087,"stub":true}}}},
{"id":"bongo","key":"bongo","value":{"rev":"3-3ebeb57dd0877ee12839169ee0128c38"},"doc":{"_id":"bongo","_rev":"3-3ebeb57dd0877ee12839169ee0128c38","name":"bongo","description":"Unfancy models for MongoDB","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Christopher Thorn","email":"chris@koding.com","url":"http://koding.com"},"name":"bongo","description":"Unfancy models for MongoDB","version":"0.0.0","homepage":"http://bongojs.com","repository":{"type":"git","url":"git@kodingen.beanstalkapp.com:/bongo.git"},"main":"lib/index.js","engines":{"node":">=0.4"},"dependencies":{"bongo-client":"*","dnode":"0.9.x","coffee-script":"1.1.x","eventemitter2":"0.4.x","hat":"0.0.x","mongodb":"*","mongoskin":"0.1.x","traverse":"0.4.x","validator":"*"},"devDependencies":{},"_npmUser":{"name":"chris.thorn","email":"chris@koding.com"},"_id":"bongo@0.0.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a5715128c04e0c0ab02e0a043b34d8adba2aa867","tarball":"http://registry.npmjs.org/bongo/-/bongo-0.0.0.tgz"},"maintainers":[{"name":"chris.thorn","email":"chris@koding.com"}]}},"readme":null,"maintainers":[{"name":"chris.thorn","email":"chris@koding.com"}],"time":{"modified":"2011-11-24T00:59:42.211Z","created":"2011-11-24T00:59:40.987Z","0.0.0":"2011-11-24T00:59:42.211Z"},"author":{"name":"Christopher Thorn","email":"chris@koding.com","url":"http://koding.com"},"repository":{"type":"git","url":"git@kodingen.beanstalkapp.com:/bongo.git"},"_attachments":{"bongo-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zb2Vab/UYlPytzmvdBjrpQ==","length":30720,"stub":true}}}},
{"id":"bongo-client","key":"bongo-client","value":{"rev":"3-7376dc7453593ee993a8c52a176a5a79"},"doc":{"_id":"bongo-client","_rev":"3-7376dc7453593ee993a8c52a176a5a79","name":"bongo-client","description":"Use shared bongo API in the browser, or another node process.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Christopher Thorn","email":"chris@koding.com","url":"http://koding.com"},"name":"bongo-client","description":"Use shared bongo API in the browser, or another node process.","version":"0.0.0","homepage":"http://bongojs.com","repository":{"type":"git","url":"git@kodingen.beanstalkapp.com:/bongo.git"},"main":"bongo.js","engines":{"node":">=0.4"},"dependencies":{"traverse":"0.4.x","dnode":"0.9.x","hat":"0.0.x"},"devDependencies":{"coffee-script":"1.1.x"},"_npmUser":{"name":"chris.thorn","email":"chris@koding.com"},"_id":"bongo-client@0.0.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f201eec3393e3018fcce82e4b0090f49e5a96b25","tarball":"http://registry.npmjs.org/bongo-client/-/bongo-client-0.0.0.tgz"},"maintainers":[{"name":"chris.thorn","email":"chris@koding.com"}]}},"readme":null,"maintainers":[{"name":"chris.thorn","email":"chris@koding.com"}],"time":{"modified":"2011-11-24T00:58:57.109Z","created":"2011-11-24T00:58:55.708Z","0.0.0":"2011-11-24T00:58:57.109Z"},"author":{"name":"Christopher Thorn","email":"chris@koding.com","url":"http://koding.com"},"repository":{"type":"git","url":"git@kodingen.beanstalkapp.com:/bongo.git"},"_attachments":{"bongo-client-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mzS3Bo5eolxGisksT5PP7w==","length":51200,"stub":true}}}},
{"id":"bonk","key":"bonk","value":{"rev":"5-cac452f89eaebdc7a2f9b3a86073fa73"},"doc":{"_id":"bonk","_rev":"5-cac452f89eaebdc7a2f9b3a86073fa73","name":"bonk","description":"Packages js/coffeescript/jade assets into a single js file.","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.1":{"name":"bonk","description":"Packages js/coffeescript/jade assets into a single js file.","version":"1.0.1","keywords":["build","assets","bundle"],"dependencies":{"coffee-script":"1.3.3","jade":"0.26.1"},"main":"./lib/bonk.js","readme":"bonk\n====\nBundle your assets to a single js file\n\nUsage\n-----\nBelow is an example of all the available features. It will bundle the contents of src/, expose lib/some/file.js as the module 'mymodule', add lib/jquery to the output without wrapping it in the commonjs wrapper.\n\n\tvar fs = require('fs');\n\tvar Bonk = require('./lib/bonk').Bonk;\n\tvar output = new Bonk().bundle(['src/', {name: 'mymodule', file: 'lib/some/file.js'}, {file: 'lib/jquery.js', bare: true}]);\n\tfs.writeFileSync('app.js', output.js);\n\t\n","_id":"bonk@1.0.1","dist":{"shasum":"087f6a3169ace947c2c633717bf31523b80889da","tarball":"http://registry.npmjs.org/bonk/-/bonk-1.0.1.tgz"},"maintainers":[{"name":"kaptajnen","email":"spam@decko.dk"}]},"1.0.2":{"name":"bonk","description":"Packages js/coffeescript/jade assets into a single js file.","version":"1.0.2","keywords":["build","assets","bundle"],"dependencies":{"coffee-script":"1.3.3","jade":"0.26.1"},"main":"./lib/bonk.js","_npmUser":{"name":"kaptajnen","email":"spam@decko.dk"},"_id":"bonk@1.0.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"1b1f86acbfac322e6650330f659f8b4ca36db548","tarball":"http://registry.npmjs.org/bonk/-/bonk-1.0.2.tgz"},"maintainers":[{"name":"kaptajnen","email":"spam@decko.dk"}]}},"readme":"bonk\n====\nBundle your assets to a single js file\n\nUsage\n-----\nBelow is an example of all the available features. It will bundle the contents of src/, expose lib/some/file.js as the module 'mymodule', add lib/jquery to the output without wrapping it in the commonjs wrapper.\n\n\tvar fs = require('fs');\n\tvar Bonk = require('./lib/bonk').Bonk;\n\tvar output = new Bonk().bundle(['src/', {name: 'mymodule', file: 'lib/some/file.js'}, {file: 'lib/jquery.js', bare: true}]);\n\tfs.writeFileSync('app.js', output.js);\n\t\n","maintainers":[{"name":"kaptajnen","email":"spam@decko.dk"}],"time":{"modified":"2012-08-13T06:43:51.843Z","created":"2012-06-27T11:42:10.295Z","1.0.1":"2012-06-27T11:42:14.807Z","1.0.2":"2012-08-13T06:43:51.843Z"},"_attachments":{"bonk-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HnY8hjZk5dGcXCV18pJ1Rg==","length":71482,"stub":true},"bonk-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KHrvZT5uR4GnNbJwRNiM1w==","length":71482,"stub":true}}}},
{"id":"bonsai","key":"bonsai","value":{"rev":"83-1fbe70c9bdcfefdc85e2b106102018d2"},"doc":{"_id":"bonsai","_rev":"83-1fbe70c9bdcfefdc85e2b106102018d2","name":"bonsai","description":"aapplication server for node.js","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"bonsai","description":"aapplication server for node.js","version":"0.0.1","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bonsai.git"},"directories":{"lib":"./lib"},"dependencies":{"bean.database.mongo":"*","sk":"*","structr":"*","beet":"*","beanpole":"*","gumbo":"*","node-fs":"*","vine":"*","gittyup":"*","celeri":"*","mongoose":"*","yaconfig":"*","underscore":"*","request":"*","cashew":"*"},"bin":{"bonsai":"./bin/bonsai"},"_npmJsonOpts":{"file":"/Users/craigcondon/.npm/bonsai/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonsai@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"25dda85a85171f9fcc3e92e048f2983246376a75","tarball":"http://registry.npmjs.org/bonsai/-/bonsai-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.2":{"name":"bonsai","description":"aapplication server for node.js","version":"0.0.2","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/spiceapps/bonsai.git"},"directories":{"lib":"./lib"},"dependencies":{"bean.database.mongo":"*","bean.http":"*","sk":"*","structr":"*","beet":"*","beanpole":"*","gumbo":"*","node-fs":"*","vine":"*","gittyup":"*","celeri":"*","yaconfig":"*","underscore":"*","request":"*","cashew":"*","daisy":"*"},"bin":{"bonsai":"./bin/bonsai"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bonsai@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1c55f3eb0b2d2cc2d8f61e312d034f8475129857","tarball":"http://registry.npmjs.org/bonsai/-/bonsai-0.0.2.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]},"0.0.3":{"name":"bonsai","description":"aapplication server for node.js","version":"0.0.3","author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bonsai.git"},"directories":{"lib":"./lib"},"dependencies":{"bean.http":"*","haba":"<0.2.0","sk":"*","structr":"*","beet":"*","beanpole":"*","gumbo":"*","node-fs":"*","vine":"*","gittyup":"*","celeri":"*","yaconfig":"*","underscore":"*","request":"*","cashew":"*","dnode":"0.9.2","optimist":"*"},"bin":{"bonsai":"./bin/bonsai"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bonsai@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1272e466ad976b1d09311184d80f1b5d575c05e0","tarball":"http://registry.npmjs.org/bonsai/-/bonsai-0.0.3.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-26T04:10:20.030Z","created":"2011-09-22T18:02:42.948Z","0.0.1":"2011-09-22T18:02:43.680Z","0.0.2":"2011-09-26T18:46:55.554Z","0.0.3":"2012-02-26T04:10:20.030Z"},"author":{"name":"Craig Condon"},"repository":{"type":"git","url":"git://github.com/crcn/bonsai.git"},"_attachments":{"bonsai-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-fXBzJ+W5rfJXfgbABWXlOQ==","length":143360,"stub":true},"bonsai-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Io2/3k+CNq+ydKHjGWaIeQ==","length":10240,"stub":true},"bonsai-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pPgHkUkVu8Wb2cRwOI6CNg==","length":8748,"stub":true}}}},
{"id":"bonzo","key":"bonzo","value":{"rev":"200-56f9dc2b8254215c2139a9b20272c733"},"doc":{"_id":"bonzo","_rev":"200-56f9dc2b8254215c2139a9b20272c733","name":"bonzo","description":"Library agnostic, extensible DOM utility","dist-tags":{"latest":"1.2.1"},"versions":{"0.0.1":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz, @ded","Jacob Thornton, @fat"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a221e27c6edccea48e2a8b3d5a83af2b75bac879","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.1.tgz"}},"0.0.2":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bf901e2391bf571ae086714bc7be737b37cddfd4","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.2.tgz"}},"0.0.3":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.3","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"246fd0db23acbd857e0dce24739990b5a7d83b72","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.3.tgz"}},"0.0.4":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.4","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"29d0c58433fa4eef2a0756f1cc0424ac55530edc","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.4.tgz"}},"0.0.5":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.5","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e086f16be077768e6810131f66f3738c8312e6a2","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.5.tgz"}},"0.0.7":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.7","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5c9bf54849ec1e3fdc23ca9360966b61551429fe","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.7.tgz"}},"0.0.8":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.8","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"538940a457d4f1304f95de0763cde4cd58c5262c","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.8.tgz"}},"0.0.9":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.9","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"58a2881f75753219b6410df06bd6755d7aa86f97","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.9.tgz"}},"0.0.10":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.10","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c2a94b73a6ef9d71744a67f210e8a2b7255f2f4d","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.10.tgz"}},"0.0.11":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.11","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.0.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"49923c2da2e3ebb43cfbe4b4022e29d2269b36a5","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.11.tgz"}},"0.0.12":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.12","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.0.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"a34a6abf0bceb4e4b10b080ce7e59dbab2dcd200","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.12.tgz"}},"0.0.13":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.13","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.0.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"d822b69cfe1046d148eac1f72e4127dec2a19b11","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.13.tgz"}},"0.0.14":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.14","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.0.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"76b8179cd68d853521968050eb3649a509d1f101","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.14.tgz"}},"0.0.15":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.15","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.0.15","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"62dc205eb98b622e9b204da8940c402ce1b9d86c","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.15.tgz"}},"0.0.16":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.16","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.0.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"f7bac026e02b8361d3e595b07da9a5ba709d65a8","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.16.tgz"}},"0.0.17":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.0.17","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.0.17","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"aff97799b8e05673d9b1987d366ff23581149fc8","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.0.17.tgz"}},"0.1.0":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.0","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"da08cf29e23d6f1bca9e700e9fb4c25b732f2ced","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.0.tgz"}},"0.1.1":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"ba15d0b365cbdb4c7eeb9ed3f926e56179ac6f52","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.1.tgz"}},"0.1.2":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1c2d9c25528d37e3ae2351bfb882fbe805a539e3","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.2.tgz"}},"0.1.3":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.3","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9a988c50b2e2daa18e3a7195902c0b263c598122","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.3.tgz"}},"0.1.4":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.4","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f2253fa77181901ff8f64640142bf06bad827315","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.4.tgz"}},"0.1.5":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.5","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"fd028d071aa1293dc6435c49309513b4fa279e15","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.5.tgz"}},"0.1.6":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.6","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7517f6dd78edf7d9598ddab32a28dac8b3574402","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.6.tgz"}},"0.1.7":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.7","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b3e6e6a45d2dd18b717cf93fec483fa55e357451","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.7.tgz"}},"0.1.8":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.8","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9935caf5bc703e4ed5375ead35bb24ab90536d73","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.8.tgz"}},"0.1.9":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.9","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ada9f168b5c16945b4064ec7d03698c9a96a63d7","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.9.tgz"}},"0.1.10":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.10","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"006d2cb504b5d31def284aa7978fb0b792553fb1","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.10.tgz"}},"0.1.11":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.11","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e0901882799e7babb7908e4c403d7c17d947bb1f","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.11.tgz"}},"0.1.12":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.12","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2a76fb1b0acf1a13fd472969d847ad87018bab88","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.12.tgz"}},"0.1.13":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.13","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bed8569295d1d648358aab4c54938b57e53d013a","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.13.tgz"}},"0.1.14":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.14","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a04fa40dc415f45f1c4aba03a50f1d6780079a43","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.14.tgz"}},"0.1.15":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.15","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.15","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"49629771f4c987b43faefc58bb5e0367c3b6a8a3","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.15.tgz"}},"0.1.16":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.16","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.16","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"883e65dfe0e0362685b7038a6f5b5f2ce3ab96e5","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.16.tgz"}},"0.1.17":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.17","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.17","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9a029161dd6f6fbb8de73cd46df14f70006fd1f2","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.17.tgz"}},"0.1.18":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.1.18","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.1.18","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ccb59730ffc2aaca0e89240ae13240348bbf346c","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.1.18.tgz"}},"0.2.0":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.2.0","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b0742ee239e71e9c2e6d5c3a2d376e4143493f65","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.2.0.tgz"}},"0.2.1":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.2.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"810a497e2a55c582269477ed48201fc7c65c68f2","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.2.1.tgz"}},"0.2.2":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.2.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"5a113212ccfa538c42837d3348fa4003305e5b2d","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.2.2.tgz"}},"0.3.0":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.3.0","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"acefee6684218f07bd53b4541abc504d172211eb","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.3.0.tgz"}},"0.3.1":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.3.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","_id":"bonzo@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2e01d06e80a6249e0d1a42440165b51dab838e45","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.3.1.tgz"}},"0.3.2":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.3.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"81a328af48ca0ba26085563001da15f21bbad47a","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.3.2.tgz"}},"0.3.3":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.3.3","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"b9195eb7a84b0cfb034e6c4e44ed42c84b3937f3","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.3.3.tgz"}},"0.4.0":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.4.0","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"3f73cb5b7f889da9d095ad0abf0eca6d0624893a","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.4.0.tgz"}},"0.4.1":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.4.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"d51c200e0839cbef5566be851c621f0f3abc8132","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.4.1.tgz"}},"0.4.2":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.4.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"45ebfbebffee6ee93dbb80fd46cbfc8ab6c0fd75","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.4.2.tgz"}},"0.4.3":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.4.3","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e2ee92fa4554d1f21148d35a17b414bdb1be94ee","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.4.3.tgz"},"scripts":{}},"0.4.4":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.4.4","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"01e91f2f3c68a7c53292b1e4541a32faa2826bbf","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.4.4.tgz"},"scripts":{}},"0.4.5":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.4.5","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.4.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d865c1f9d5c7250c569c967f6c9f324fd5d2dc64","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.4.5.tgz"},"scripts":{}},"0.5.0":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.5.0","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1cfbb8358a92472ea31b3a787ada68d9c5f4ccbe","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.0.tgz"},"scripts":{}},"0.5.1":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.5.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5e8ad6cb1c2c1a44b05f4df2b2bf7f9499b2ef61","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.1.tgz"},"scripts":{}},"0.5.2":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.5.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c838673f841420f7d2cff601f2825e483d20bf43","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.2.tgz"},"scripts":{}},"0.5.3":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.5.3","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"611cab270e8e67e40fb6677043b17fa2dabb10de","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.3.tgz"},"scripts":{}},"0.5.4":{"name":"bonzo","description":"simple, hassle-free, library agnostic, extensible DOM utility","version":"0.5.4","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7f72cb5ce92ef9bd237d50343981ba29a915124d","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.4.tgz"},"scripts":{}},"0.5.5":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.5.5","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"2e5697a0ce0f46f6181e2fa4d2fc4c7375384320","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.5.tgz"},"scripts":{}},"0.5.6":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.5.6","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e5f1da53b43279fe6f1a2de7cd3ee1355a5dd103","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.6.tgz"},"scripts":{}},"0.5.7":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.5.7","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e3817e729561840fd907f8a357dafe1d622bb69f","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.7.tgz"},"scripts":{}},"0.5.8":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.5.8","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c20f4660fd1fe7029f5d74045d63054cbac49f83","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.8.tgz"},"scripts":{}},"0.5.9":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.5.9","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.5.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ed65c44a62a10c0c09cb36d7cc66c75e5f88262f","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.5.9.tgz"},"scripts":{}},"0.6.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.0","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0fd2000fbb66e74c3d07942c42cea582818cf85a","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.0.tgz"},"scripts":{}},"0.6.1":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.1","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","dependencies":{},"devDependencies":{},"_id":"bonzo@0.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"102391c6b8b438733c74d80606c124c0f492d96b","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.1.tgz"},"scripts":{}},"0.6.2":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.2","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bonzo/0.6.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ad3ee66124f4d11d7370559e006baec57ee9fa69","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.2.tgz"},"scripts":{}},"0.6.3":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.3","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bonzo/0.6.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.14","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6e5e1a0b780e88a6a194c324677ae13562a07cad","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.3.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.4":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.4","homepage":"https://github.com/ded/bonzo","authors":["Dustin Diaz <@ded>","Jacob Thornton <@fat>"],"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/jacob/.npm/bonzo/0.6.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"60bdc9dc29e5d3e8e164185fe045a085373787e9","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.4.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.5":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.5","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bonzo/0.6.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.5","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"92ccf8e875c3b5294fc3f086ecee5f7d2f2e9bb1","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.5.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.6":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.6","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustin/.npm/bonzo/0.6.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.6","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"546979adeb2ba600a1941733dc917499c99cbfcf","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.6.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.7":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.7","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustin/.npm/bonzo/0.6.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"53199b9d4e636e7d8f98b82a4905672dcd1fa3f1","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.7.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.8":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.8","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bonzo/0.6.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8c7042032bb52744de28fb2125b45aad99f3bb76","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.8.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.9":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.9","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","_npmJsonOpts":{"file":"/Users/dustin/.npm/bonzo/0.6.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.9","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f59fe8804bc14e92f921c169399bdfd7d786e63f","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.9.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.6.10":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.6.10","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","devDependencies":{"qwery":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/dustin/.npm/bonzo/0.6.10/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.6.10","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"952c0b585201b4484e5ad069ae7adc1be8673f71","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.6.10.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.0","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/dustin/.npm/bonzo/0.7.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4d762a259ff368dae72e3043c358ff649db8f041","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.0.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.1":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.1","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bonzo/0.7.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"dad87fff6f2262f146cfbac8b1696e3c7dd1501c","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.1.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.2":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.2","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/dustindiaz/.npm/bonzo/0.7.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"55966a70b7f298a8505a64fcea9c2b53d2fc216c","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.2.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.3":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.3","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/diaz/.npm/bonzo/0.7.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"a2817973c740bf4f15bb15ed3195576042aa6a06","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.3.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.4":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.4","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/jacob/.npm/bonzo/0.7.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5ec20a6006027fe53480d6c7e95030c7ba28c9fe","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.4.tgz"},"scripts":{},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.5":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.5","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/diaz/.npm/bonzo/0.7.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4327a937cd33c71c1f306816f47509426ca1c9a9","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.5.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.6":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.6","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmJsonOpts":{"file":"/Users/diaz/.npm/bonzo/0.7.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bonzo@0.7.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d04a43c6b76c6a714d077a27d230a61efc0090ab","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.6.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.7":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.7","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.7.7","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"39af85ed94546712851b8105363ff7ab82220a55","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.7.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.8":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.8","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.7.8","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"061bcdefa7ba62d1fac476dafc1f64299c4aae40","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.8.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.7.9":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.7.9","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.7.9","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"acc32763c64e3c81c69ab7c050acb1dcba5c110c","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.7.9.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.8.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.8.0","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.8.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"cad439daa49a4454903cf7b2366bee22fa3d7080","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.8.0.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.8.1":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.8.1","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.8.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"491748f1c7876a61e0241b3a25e3a9a70e8eb3f3","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.8.1.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.8.2":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.8.2","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.8.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"3a67fbb795ec0482169fdf5732911ccdee2ed889","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.8.2.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"0.9.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"0.9.0","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@0.9.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"fdc645e3184ee986c22be3ffd11a7a623a3332e6","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-0.9.0.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('div')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ cd bonzo\n    $ npm install --dev\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.0","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9c5c7cfa39879f348d51bea310aa20b34ded170f","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.0.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ cd bonzo\n    $ npm install --d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.1":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.1","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"be24a97c1d7f7098bd8eb3e6b86c0539454e7d4b","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.1.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.2":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.2","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"68c9d409aaa0e1a2fa12ddcf5f07bad013527033","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.2.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.3":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.3","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"04cc3a7a0fdb4ea7bde43cee91952656f58e9f38","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.3.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.4":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.4","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"04bfded11fb28a35bacee22bafe637b9ac8f56cc","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.4.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.5":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.5","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e10aad9d75c8d80ab9e95a13b5418934bc2b5098","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.5.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.6":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.6","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"15698fe1c26288216619a3decc96334faf246681","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.6.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.7":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.7","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.7","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"12ea57020f2e9e70119c3f6974b2e4eb42853f86","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.7.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.8":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.8","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.8","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"de581e33e79b883112c9f3bf907af93d9762ede7","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.8.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.0.9":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.0.9","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.0.9","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"2aeb2d3031c465830f9e1affed4170ff02359d63","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.0.9.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.1.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.1.0","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"git://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bonzo@1.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"a676b571b9dd8481ddae64181ce62d37e8094bda","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.1.0.tgz"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"}]},"1.2.0":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.2.0","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","email":"rod@vagg.org","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"https://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","_id":"bonzo@1.2.0","dist":{"shasum":"37e71648c10f6256dd5e895aac67e5290c0cae55","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.2.0.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}]},"1.2.0-1":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.2.0-1","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","email":"rod@vagg.org","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"https://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","_id":"bonzo@1.2.0-1","dist":{"shasum":"5e497719350d5ee80bf941bbf9a401a399edd8cd","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.2.0-1.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}]},"1.2.1":{"name":"bonzo","description":"Library agnostic, extensible DOM utility","version":"1.2.1","homepage":"https://github.com/ded/bonzo","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"contributors":[{"name":"Rod Vagg","email":"rod@vagg.org","url":"https://github.com/rvagg"}],"keywords":["ender","dom","nodes","jquery","iteration","css"],"main":"./bonzo.js","ender":"./src/ender.js","repository":{"type":"git","url":"https://github.com/ded/bonzo.git"},"devDependencies":{"qwery":"*","bowser":"*","sink-test":"*","smoosh":"*"},"readme":"Bonzo\n-----\na library agnostic extensible DOM utility. Nothing else.\nBonzo is designed to live in any host library, or simply as a stand-alone tool for the majority of your DOM-related tasks.\n\n<h3>It looks like this</h3>\n\n``` js\nbonzo(elements)\n  .hide()\n  .addClass('foo')\n  .append('<p>the happs</p>')\n  .css({\n    color: 'red',\n    'background-color': 'white'\n  })\n  .show()\n```\n\nPaired with a Selector Engine\n-----------------------------\nA great way to use Bonzo is with a selector engine (like [Qwery](https://github.com/ded/qwery) for example). You could wrap bonzo up and augment your wrapper to inherit the same methods. That looks like this:\n\n``` js\nfunction $(selector) {\n  return bonzo(qwery(selector));\n}\n```\n\nThis now allows you to write the following code:\n\n``` js\n$('#content a[rel~=\"bookmark\"]').after('√').css('text-decoration', 'none');\n```\n\nBonzo Extension API\n-------------------\nOne of the greatest parts about Bonzo is its simplicity to hook into the internal chain to create custom methods. For example you can create a method called **color** like this:\n\n``` js\nbonzo.aug({\n  color: function (c) {\n    return this.css('color', c);\n  }\n})\n\n// you can now do the following\n$('p').color('aqua')\n```\n\nBonzo Full API\n---------------------\n\n  * each(callback)\n    - callback (element, index)\n  * map(callback, reject)\n    - callback (element, index)\n    - reject (element)\n  * html\n    - html() get\n    - html(str) set\n  * text\n    - text() get\n    - text(str) set\n  * addClass(c)\n  * removeClass(c)\n  * hasClass(c)\n  * toggleClass(c)\n  * show()\n  * hide()\n  * first()\n  * last()\n  * focus()\n  * blur()\n  * next()\n  * previous()\n  * parent()\n  * append(html || node)\n  * appendTo(target || selector)\n  * prepend(html || node)\n  * prependTo(target || selector)\n  * before(html || node)\n  * insertBefore(target || selector)\n  * after(html || node)\n  * insertAfter(target || selector)\n  * replaceWith(html || node)\n  * css()\n    - css(prop) get\n    - css(prop, val) set\n    - css({properties}) set\n  * offset()\n    - offset(x, y) set\n    - offset() get\n      - top\n      - left\n      - width\n      - height\n  * dim()\n    - width\n    - height\n  * attr\n    - attr(k) get\n    - attr(k, v) set\n    - attr(obj) set\n  * removeAttr(k)\n  * val\n    - val() get\n    - val(s) set\n  * data\n    - data() get all\n    - data(k) get\n    - data(k, v) set\n  * remove()\n  * empty()\n  * detach()\n  * scrollLeft\n    - scrollLeft() get\n    - scrollLeft(x) set\n  * scrollTop\n    - scrollTop() get\n    - scrollTop(y) set\n  * bonzo.aug({ properties })\n  * bonzo.doc()\n    - width\n    - height\n  * bonzo.viewport()\n    - width\n    - height\n  * bonzo.isAncestor(container, child)\n  * bonzo.noConflict\n\nAdded in the Ender bridge\n\n  * parents(selector)\n  * closest(selector)\n  * siblings()\n  * children()\n  * width()\n  * height()\n\nSetting a query engine host\n------------------\nFor the insertion methods you can set a query selector host (like [qwery](https://github.com/ded/qwery)).\n\n``` js\nbonzo.setQueryEngine(qwery)\nbonzo(bonzo.create('<div>')).insertAfter('.boosh a')\n```\n\nThe name Bonzo\n--------------\nBonzo Madrid was a malicious battle school commander of whom eventually is killed by [Ender Wiggin](http://en.wikipedia.org/wiki/Ender_Wiggin). Bonzo represents the DOM, of whom we'd all love to slay.\n\nBuilding\n--------\n\n    $ npm install -d\n    $ make\n\nTests\n-----\n\n    $ open tests/tests.html\n\nBrowser support\n---------------\n  * IE6+\n  * Chrome\n  * Safari 4+\n  * Firefox 3+\n  * Opera\n\nEnder integration\n----------\nBonzo is a registered npm package and fits in nicely with the [Ender](http://ender.no.de) framework. If you don't have Ender, you should install now, and never look back, ever. As a side note the *query engine host* is set for you when you include it with Ender.\n\n    $ npm install ender -g\n\nTo combine Bonzo to your Ender build, you can add it as such:\n\n    $ ender build bonzo[,modb, modc,...]\n\nor, add it to your existing ender package\n\n    $ ender add bonzo\n\nContributors\n-----\n\n  * [Dustin Diaz](https://github.com/ded/bonzo/commits/master?author=ded)\n  * [Rod Vagg](https://github.com/ded/bonzo/commits/master?author=rvagg)\n  * [Jacob Thornton](https://github.com/ded/bonzo/commits/master?author=fat)\n","_id":"bonzo@1.2.1","dist":{"shasum":"bcf83c2b0d8c5a57c9c666312fcb6231e409bc50","tarball":"http://registry.npmjs.org/bonzo/-/bonzo-1.2.1.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}]}},"maintainers":[{"name":"ded","email":"polvero@gmail.com"},{"name":"fat","email":"jacobthornton@gmail.com"},{"name":"rvagg","email":"rod@vagg.org"}],"time":{"modified":"2012-08-11T08:45:50.194Z","created":"2011-04-09T23:38:10.734Z","0.0.1":"2011-04-09T23:38:11.082Z","0.0.2":"2011-04-12T08:57:17.288Z","0.0.3":"2011-04-14T02:53:44.491Z","0.0.4":"2011-04-14T08:20:55.212Z","0.0.5":"2011-04-14T16:42:45.130Z","0.0.7":"2011-04-15T17:39:04.289Z","0.0.8":"2011-04-15T23:16:15.284Z","0.0.9":"2011-04-16T00:55:47.583Z","0.0.10":"2011-04-16T21:32:54.279Z","0.0.11":"2011-04-17T04:27:11.171Z","0.0.12":"2011-04-19T00:42:30.501Z","0.0.13":"2011-04-19T23:09:24.918Z","0.0.14":"2011-04-20T07:26:16.420Z","0.0.15":"2011-04-20T08:06:57.393Z","0.0.16":"2011-04-20T19:22:53.251Z","0.0.17":"2011-04-20T20:13:58.780Z","0.1.0":"2011-04-21T16:57:13.473Z","0.1.1":"2011-04-24T17:29:23.336Z","0.1.2":"2011-04-25T00:56:48.213Z","0.1.3":"2011-04-25T01:45:13.673Z","0.1.4":"2011-04-25T22:37:33.871Z","0.1.5":"2011-04-25T22:40:04.555Z","0.1.6":"2011-04-26T18:09:52.907Z","0.1.7":"2011-04-26T18:17:47.504Z","0.1.8":"2011-04-26T18:27:11.002Z","0.1.9":"2011-04-26T18:38:27.302Z","0.1.10":"2011-04-26T19:34:43.897Z","0.1.11":"2011-04-26T19:47:35.021Z","0.1.12":"2011-04-26T20:36:50.544Z","0.1.13":"2011-04-26T20:55:32.687Z","0.1.14":"2011-04-26T21:09:39.633Z","0.1.15":"2011-04-26T21:57:22.202Z","0.1.16":"2011-04-26T22:09:46.543Z","0.1.17":"2011-04-27T01:08:10.932Z","0.1.18":"2011-04-27T04:33:49.023Z","0.2.0":"2011-04-28T01:06:15.129Z","0.2.1":"2011-04-28T05:45:47.491Z","0.2.2":"2011-04-28T06:08:55.854Z","0.3.0":"2011-04-28T21:27:11.833Z","0.3.1":"2011-04-28T23:04:33.953Z","0.3.2":"2011-04-30T19:51:46.267Z","0.3.3":"2011-04-30T21:18:51.543Z","0.4.0":"2011-05-01T22:39:53.610Z","0.4.1":"2011-05-02T17:50:53.395Z","0.4.2":"2011-05-02T20:44:42.931Z","0.4.3":"2011-05-03T22:11:42.687Z","0.4.4":"2011-05-03T23:30:32.769Z","0.4.5":"2011-05-05T06:28:38.821Z","0.5.0":"2011-05-10T05:37:50.981Z","0.5.1":"2011-05-10T07:03:27.532Z","0.5.2":"2011-05-11T01:51:24.063Z","0.5.3":"2011-05-11T03:37:05.598Z","0.5.4":"2011-05-16T03:07:26.755Z","0.5.5":"2011-05-17T18:49:15.527Z","0.5.6":"2011-05-29T00:05:18.691Z","0.5.7":"2011-06-04T08:32:46.307Z","0.5.8":"2011-06-10T23:18:19.253Z","0.5.9":"2011-06-13T07:57:36.572Z","0.6.0":"2011-06-13T08:03:37.273Z","0.6.1":"2011-06-21T18:45:54.169Z","0.6.2":"2011-07-16T17:43:02.186Z","0.6.3":"2011-08-02T04:38:31.542Z","0.6.4":"2011-08-18T23:17:23.132Z","0.6.5":"2011-09-07T03:48:54.896Z","0.6.6":"2011-09-07T21:09:20.941Z","0.6.7":"2011-09-07T21:15:27.582Z","0.6.8":"2011-09-11T03:11:10.726Z","0.6.9":"2011-09-12T18:22:08.160Z","0.6.10":"2011-09-13T17:47:19.832Z","0.7.0":"2011-09-19T22:58:48.077Z","0.7.1":"2011-09-29T02:35:42.879Z","0.7.2":"2011-09-29T02:51:41.261Z","0.7.3":"2011-09-30T01:06:41.246Z","0.7.4":"2011-10-04T21:32:59.357Z","0.7.5":"2011-10-11T08:38:01.625Z","0.7.6":"2011-10-17T05:15:00.264Z","0.7.7":"2011-11-02T20:56:58.048Z","0.7.8":"2011-11-02T21:08:20.288Z","0.7.9":"2011-11-02T21:11:32.144Z","0.8.0":"2011-11-16T02:47:15.805Z","0.8.1":"2011-12-12T23:22:04.052Z","0.8.2":"2011-12-19T22:40:53.002Z","0.9.0":"2012-01-09T19:19:46.648Z","1.0.0":"2012-02-21T17:23:16.502Z","1.0.1":"2012-02-22T18:51:42.398Z","1.0.2":"2012-03-27T18:03:45.920Z","1.0.3":"2012-04-24T04:58:29.596Z","1.0.4":"2012-04-24T19:34:38.442Z","1.0.5":"2012-04-24T20:41:25.678Z","1.0.6":"2012-04-24T21:38:25.440Z","1.0.7":"2012-06-08T21:12:39.175Z","1.0.8":"2012-06-08T21:45:24.628Z","1.0.9":"2012-06-09T00:39:01.995Z","1.1.0":"2012-06-09T00:42:00.263Z","1.2.0":"2012-07-12T01:40:13.250Z","1.2.0-1":"2012-07-25T06:54:26.308Z","1.2.1":"2012-08-02T04:10:51.776Z"},"repository":{"type":"git","url":"https://github.com/ded/bonzo.git"},"author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"users":{"fgribreau":true,"tahu":true},"_attachments":{"bonzo-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":197,"digest":"md5-IacjvNf/Xib0qkpBT700wA==","length":57047,"stub":true},"bonzo-1.2.0-1.tgz":{"content_type":"application/octet-stream","revpos":195,"digest":"md5-RpMFCH6Aa8M0TSZe9oE0Qw==","length":56791,"stub":true},"bonzo-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":193,"digest":"md5-lNBxKbCyMRpWOwW/blOVTw==","length":56756,"stub":true},"bonzo-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":190,"digest":"md5-Y39M3Y5lnWaqq1eSaAk5sQ==","length":49431,"stub":true},"bonzo-1.0.9.tgz":{"content_type":"application/octet-stream","revpos":188,"digest":"md5-yIAY+Qxu8gcCmuQ6OyXYvA==","length":49415,"stub":true},"bonzo-1.0.8.tgz":{"content_type":"application/octet-stream","revpos":186,"digest":"md5-aJ06mc0t4y4fstKULpOLQA==","length":49353,"stub":true},"bonzo-1.0.7.tgz":{"content_type":"application/octet-stream","revpos":184,"digest":"md5-XoccBq/agNIAoNX4LoWh2A==","length":49350,"stub":true},"bonzo-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":182,"digest":"md5-2DD+mWOEJSuCQganx+JGtg==","length":47977,"stub":true},"bonzo-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":180,"digest":"md5-9282AkW0ollVW79hAcpphw==","length":47986,"stub":true},"bonzo-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":178,"digest":"md5-zidgLH+26cULwrfRx9UTMw==","length":48009,"stub":true},"bonzo-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":176,"digest":"md5-pitbW8Ron8vw5Y0ad7VEqg==","length":48021,"stub":true},"bonzo-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":174,"digest":"md5-3ZZ9Ht43KPY1rJK1jlK/AA==","length":47748,"stub":true},"bonzo-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":172,"digest":"md5-2tbA9jO2uDBpK7TBFTRR7A==","length":47683,"stub":true},"bonzo-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":170,"digest":"md5-6WKz4h2ywcoP+Zyhk5djHQ==","length":46610,"stub":true},"bonzo-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":168,"digest":"md5-4aJ3C/7VojhHNgS+4YAmnQ==","length":40932,"stub":true},"bonzo-0.8.2.tgz":{"content_type":"application/octet-stream","revpos":166,"digest":"md5-rh55IV+L29vZL/aWTsWm2w==","length":40960,"stub":true},"bonzo-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":164,"digest":"md5-hURkDVtMaBQufclq05Esmw==","length":40960,"stub":true},"bonzo-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":162,"digest":"md5-0PVOYepBIyo/OGU0nsWnUw==","length":583680,"stub":true},"bonzo-0.7.9.tgz":{"content_type":"application/octet-stream","revpos":160,"digest":"md5-dbp149fPA5DfhRpV8dR0GQ==","length":40960,"stub":true},"bonzo-0.7.8.tgz":{"content_type":"application/octet-stream","revpos":158,"digest":"md5-EyqibNvRfkW4Y5KmBS4GVg==","length":40960,"stub":true},"bonzo-0.7.7.tgz":{"content_type":"application/octet-stream","revpos":156,"digest":"md5-EGRHo1ViOgvq0u5cORE6Mw==","length":40960,"stub":true},"bonzo-0.7.6.tgz":{"content_type":"application/octet-stream","revpos":154,"digest":"md5-ucXWhVHtAFU/yusYJdpxPw==","length":37771,"stub":true},"bonzo-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":152,"digest":"md5-Cx5xAxHqy99fw5VnQzyv5Q==","length":36443,"stub":true},"bonzo-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":150,"digest":"md5-1JZ9ElUObkfK06cUvnympQ==","length":34046,"stub":true},"bonzo-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":148,"digest":"md5-LktFN+ijaMVZR7H/7+rZ/w==","length":34021,"stub":true},"bonzo-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":146,"digest":"md5-5CFQrND4FvCYWKK2hipImw==","length":571444,"stub":true},"bonzo-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":144,"digest":"md5-RakQf/SyRUaBrZDYfTp30w==","length":570985,"stub":true},"bonzo-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":142,"digest":"md5-iYIeg8f//KBxTwSnpk4ncg==","length":33502,"stub":true},"bonzo-0.6.10.tgz":{"content_type":"application/octet-stream","revpos":140,"digest":"md5-RNZOEyoyPNAE+qoTLDONJA==","length":33691,"stub":true},"bonzo-0.6.9.tgz":{"content_type":"application/octet-stream","revpos":138,"digest":"md5-k4LwL7hFvbtFWm3LMhpJUg==","length":87359,"stub":true},"bonzo-0.6.8.tgz":{"content_type":"application/octet-stream","revpos":136,"digest":"md5-9xrM+DrCGISvZ5NABX0YPQ==","length":626247,"stub":true},"bonzo-0.6.7.tgz":{"content_type":"application/octet-stream","revpos":134,"digest":"md5-p2FchLizdoF5/3VxxPZiiA==","length":87168,"stub":true},"bonzo-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":132,"digest":"md5-hYkjSAyzX/LwRyV0cvM3Zw==","length":87157,"stub":true},"bonzo-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":130,"digest":"md5-gSI02zrmwm4FAYF7GvrFDQ==","length":626331,"stub":true},"bonzo-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":128,"digest":"md5-qgMxiwwhshnrQBps/hXzQw==","length":30525,"stub":true},"bonzo-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":126,"digest":"md5-tgMeTSKrnsBF6D18glBa8g==","length":4971826,"stub":true},"bonzo-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":124,"digest":"md5-VQvguT41FGOvxMpSToXwGg==","length":4972400,"stub":true},"bonzo-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":122,"digest":"md5-4IuqLfZ6pjf3ouogwRaM9A==","length":1395968,"stub":true},"bonzo-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":120,"digest":"md5-BR8xVCovzPF7SMf3JdHdFw==","length":1995957,"stub":true},"bonzo-0.5.9.tgz":{"content_type":"application/octet-stream","revpos":118,"digest":"md5-jZyLi9b5WRq5BLmUzsQ/gQ==","length":1994886,"stub":true},"bonzo-0.5.8.tgz":{"content_type":"application/octet-stream","revpos":116,"digest":"md5-nRJd2tgOS6L/jeFVA9F/Qw==","length":1388363,"stub":true},"bonzo-0.5.7.tgz":{"content_type":"application/octet-stream","revpos":114,"digest":"md5-ULW1booGlptjfXw9Vb/fqQ==","length":77096,"stub":true},"bonzo-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":112,"digest":"md5-J5XdMlf9bL4Iqw3ZoWPMmA==","length":76716,"stub":true},"bonzo-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":110,"digest":"md5-velGZvHYmg60zv/IztOJwA==","length":76727,"stub":true},"bonzo-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":108,"digest":"md5-0x4YcDTjuVxUz4aKKsjkMw==","length":76697,"stub":true},"bonzo-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":106,"digest":"md5-zeDLbbFYv3Ax9RpyI1iDBg==","length":1386635,"stub":true},"bonzo-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":104,"digest":"md5-xiU324D0tHN8jkr50OmP1Q==","length":1386271,"stub":true},"bonzo-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":102,"digest":"md5-G2LdZXRoauxD7wjTlk54TA==","length":1386259,"stub":true},"bonzo-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-BYeeBI2j+yA109eMfv0RWg==","length":1386280,"stub":true},"bonzo-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":98,"digest":"md5-uIvdNySc2v6yPLqWajlSHQ==","length":1388804,"stub":true},"bonzo-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":96,"digest":"md5-w30olvwKBzPM9gGP2ErWeA==","length":1386634,"stub":true},"bonzo-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":94,"digest":"md5-eKQBeuvDX8OI+f7PHQpMcg==","length":1386631,"stub":true},"bonzo-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":92,"digest":"md5-f3ww+2EsYtcBDniuxR18mg==","length":1386594,"stub":true},"bonzo-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":90,"digest":"md5-rOVtqjL9U8gO6Ia45TvSGw==","length":1386590,"stub":true},"bonzo-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":88,"digest":"md5-bEMfpsciOrH/daQhJsBWgQ==","length":1386606,"stub":true},"bonzo-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-b+/ap9OMPLF6LAfx6JGr5w==","length":1434712,"stub":true},"bonzo-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":84,"digest":"md5-/5/famyDpHnxgNWRZ3YhaA==","length":1435397,"stub":true},"bonzo-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-FbEDVc3BHxDJMc47r24fFA==","length":4248155,"stub":true},"bonzo-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":80,"digest":"md5-0EqsnkriVoA2EpeikC9GSw==","length":4248272,"stub":true},"bonzo-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":78,"digest":"md5-qPvwd8au14nCziodbV/V+g==","length":4245789,"stub":true},"bonzo-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":76,"digest":"md5-Ry45xpYILhqqms2wZUD8ig==","length":4245829,"stub":true},"bonzo-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-BY1LM5IpCjsoUIDONQkbCg==","length":4245846,"stub":true},"bonzo-0.1.18.tgz":{"content_type":"application/octet-stream","revpos":72,"digest":"md5-EzwIpg0gy6WkM2II2zswWg==","length":4245634,"stub":true},"bonzo-0.1.17.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-1PxEZffq6k82CgvCnZdfAQ==","length":4245064,"stub":true},"bonzo-0.1.16.tgz":{"content_type":"application/octet-stream","revpos":68,"digest":"md5-MpvMF7XMxQ8ulfKIGNKKfA==","length":4245040,"stub":true},"bonzo-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":66,"digest":"md5-7vjs7YR+HRKgRQeDpo2uxA==","length":4244958,"stub":true},"bonzo-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-qrAYYkU3OiRcAa3xjPdGFQ==","length":4245066,"stub":true},"bonzo-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":62,"digest":"md5-EE4v/1rpVSxP66HFDMN5kg==","length":4245054,"stub":true},"bonzo-0.1.12.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-7pcdEFITKuwEQ97llj7lww==","length":4245035,"stub":true},"bonzo-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-fT3dgzaR3idOMa++nvjxlQ==","length":2993065,"stub":true},"bonzo-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-L6nvuE13OChe9hUzxf5Wgg==","length":2993007,"stub":true},"bonzo-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-1fR5ABsop/tEsnUGRKbygQ==","length":2993033,"stub":true},"bonzo-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-0Pkv4B3BVv5ZApJgLjgNfg==","length":2993003,"stub":true},"bonzo-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-mKU9bFxmL6wFa3yApLNWmw==","length":2993035,"stub":true},"bonzo-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-gJeHOm8h10Xo0QdwsrVKSw==","length":2992500,"stub":true},"bonzo-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-0efEMDyp0FP7zx3tKeyOtA==","length":2992514,"stub":true},"bonzo-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-49+Pe7e5IBSbuTTTpCHh1Q==","length":2992512,"stub":true},"bonzo-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-dCIDPRLiYt27ZZWo+sZ/ZQ==","length":2992526,"stub":true},"bonzo-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-Z1qnVbvEVGf9+A3afIPBtg==","length":2992203,"stub":true},"bonzo-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-9q/z8IKvct51pwmdHGEPUg==","length":76797,"stub":true},"bonzo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-vg03q68QxSE3AKTOreZEkQ==","length":75516,"stub":true},"bonzo-0.0.17.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-rgEtyMvaKXcVtgJkAHLyZg==","length":76009,"stub":true},"bonzo-0.0.16.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-+wf70g/F4LhIgK+Q6vAG/Q==","length":75740,"stub":true},"bonzo-0.0.15.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-1I3UhYs109xJxzaetKkA6g==","length":75718,"stub":true},"bonzo-0.0.14.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-2ZYwQ1zv1IdKSScUNShgwg==","length":75636,"stub":true},"bonzo-0.0.13.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-CUigEbPA+qxpooje/8TThA==","length":75578,"stub":true},"bonzo-0.0.12.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-e7psZsYppv2WEgiVpZX60w==","length":75401,"stub":true},"bonzo-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-c+Z8CjzST6H3iOSM8bWfAA==","length":16571,"stub":true},"bonzo-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-QRCX0OxS16+yJY2GHn13Vg==","length":16638,"stub":true},"bonzo-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-1JRa0suSYjUrWWhWtSBf1w==","length":16508,"stub":true},"bonzo-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-wNzLtEaA1grNAVnqV4/sJQ==","length":16357,"stub":true},"bonzo-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-iHt9/+F4o3Q++Q22bAepNQ==","length":13964,"stub":true},"bonzo-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-UEh5y7bkrn37kthrzBGRhg==","length":9925,"stub":true},"bonzo-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-7EV4SgP4BdP6pqDDg5YCYw==","length":8309,"stub":true},"bonzo-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-48cTOAcmQ2LIM9GRuezjbw==","length":7613,"stub":true},"bonzo-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-Nw37tEcNxeNgfgG1tpfpGw==","length":7072,"stub":true},"bonzo-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Vx+Z4wdQ48xOQcZfjjLfzQ==","length":6942,"stub":true}}}},
{"id":"boo","key":"boo","value":{"rev":"7-672c666e1b1ed333650544cb45d124a0"},"doc":{"_id":"boo","_rev":"7-672c666e1b1ed333650544cb45d124a0","name":"boo","description":"Prototypical utilities for Object Orientation / Composition","dist-tags":{"latest":"1.2.0"},"versions":{"0.1.0":{"name":"boo","version":"0.1.0","author":{"name":"Quildreen Motta","url":"http://killdream.github.com/"},"description":"Provides utilities for prototypical OO with mixins and trait composition.","repository":{"type":"git","url":"git://github.com/killdream/boo.git"},"main":"./src/boo.js","dependencies":{},"devDependencies":{},"_id":"boo@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"8e069824f2cddc657f07a6608d569623f2a7e2ff","tarball":"http://registry.npmjs.org/boo/-/boo-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}]},"1.1.0":{"name":"boo","version":"1.1.0","author":{"name":"Quildreen Motta","url":"http://killdream.github.com/"},"description":"Prototypical utilities for Object Orientation / Composition","repository":{"type":"git","url":"git://github.com/killdream/boo.git"},"main":"./src/boo.js","_npmUser":{"name":"killdream","email":"quildreen@gmail.com"},"_id":"boo@1.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.8-pre","_defaultsLoaded":true,"dist":{"shasum":"066cee1785b45186650c69bae8c11d6e1dee6edc","tarball":"http://registry.npmjs.org/boo/-/boo-1.1.0.tgz"},"maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}]},"1.2.0":{"name":"boo","version":"1.2.0","author":{"name":"Quildreen Motta","url":"http://killdream.github.com/"},"description":"Prototypical utilities for Object Orientation / Composition","repository":{"type":"git","url":"git://github.com/killdream/boo.git"},"main":"./src/boo.js","_npmUser":{"name":"killdream","email":"quildreen@gmail.com"},"_id":"boo@1.2.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e45fba160682ebdaa9f24d04185fbb7c0041b242","tarball":"http://registry.npmjs.org/boo/-/boo-1.2.0.tgz"},"readme":"Boo\n===\n\nBoo provides utilities to structure a program by means of prototypical\nobject orientation and object composition, in an easy way. It provides\nyou with inheritance, composition and mixin facilities, all packaged in\na nice API.\n\n    var Animal = boo.Base.derive({\n      name: 'Unknow'\n    \n    , say:\n      function say(thing) {\n        return this.name + ': ' + thing }\n    })\n    \n    var Cat = Animal.derive({\n      init:\n      function init(name) {\n        if (name) this.name = name }\n    })\n    \n    var nyah = Cat.make('Nyan Cat')\n    nyah.say('Nyan nyan nyan~')\n\n\nInstalling\n----------\n\nWith Node.js and NPM, you can do the easy-modo install:\n\n    $ npm install boo\n    # then require it as usual\n    node> var boo = require('boo')\n\nIn the browser, you have to include the script tag pointing to the\n`boo.js` file:\n\n    <script src=\"/path/to/boo.js\"></script>\n    <script type=\"text/javascript\">\n      // `boo' is in the global scope now\n    </script>\n\n\nTesting\n-------\n\nBoo's test cases use [Mocha][] with the BDD assertion module\n[should.js][]. For testing on Node.js, you can just grab the module from\nNPM and run the test cases by issuing `mocha` from the command line:\n\n    $ sudo npm install -g mocha\n    $ mocha\n\n[Mocha]: visionmedia.github.com/mocha/\n[should.js]: https://github.com/visionmedia/should.js\n\n\nLearning\n--------\n\nBoo ships with a [full narrated reference manual][ref], covering the\nconcepts and designs you need to know to use the library effectively.\nYou can either read it online, or locally — from the file\n:file:`docs/build/html/index.html`. \n\nAdditionally, you can read the following introduction to Boo:\n\n- [Yay for sugary JavaScript OO][intro]\n\n\n[ref]: http://killdream.github.com/boo\n[intro]: http://killdream.github.com/blog/2011/11/for-sugary-object-oriented-js/index.html\n\n\nGetting support\n---------------\n\nBoo uses the [Github tracker][] for tracking bugs and new features.\n\n[Github tracker]: https://github.com/killdream/boo/issues\n\n\nLicence\n-------\n\nBoo is licensed under the delicious and permissive [MIT][] licence. You\ncan happily copy, share, modify, sell or whatever — refer to the actual\nlicence text for `less` information:\n\n    $ less LICENCE.txt\n\n[MIT]: https://github.com/killdream/boo/raw/master/LICENCE.txt\n","maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}]}},"maintainers":[{"name":"killdream","email":"quildreen@gmail.com"}],"time":{"modified":"2012-01-13T01:39:29.778Z","created":"2011-10-14T00:55:57.998Z","0.1.0":"2011-10-14T00:55:59.219Z","1.1.0":"2011-11-19T22:22:21.744Z","1.2.0":"2012-01-13T01:39:29.778Z"},"author":{"name":"Quildreen Motta","url":"http://killdream.github.com/"},"repository":{"type":"git","url":"git://github.com/killdream/boo.git"},"_attachments":{"boo-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+2RmjMo/JM8XC4BLYudMVg==","length":4900,"stub":true},"boo-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zAhOc6ANBR4QRGh9NnzT1g==","length":120743,"stub":true},"boo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-43IjsbUe/jjpbJOhmgtoCA==","length":5287,"stub":true}}}},
{"id":"book","key":"book","value":{"rev":"7-367196e000e17d0f00390fa134afc297"},"doc":{"_id":"book","_rev":"7-367196e000e17d0f00390fa134afc297","name":"book","description":"flexible node.js logging library","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"book","description":"flexible node.js logging library","version":"1.0.0","repository":{"type":"git","url":"git://github.com/shtylman/node-book.git"},"keywords":["logging","logger","log"],"main":"logger.js","scripts":{"test":"mocha"},"dependencies":{},"devDependencies":{"mocha":">=1.0.0"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"book@1.0.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fb8be526a3f5e616dc9b9432ef77ac5e5bc94b7c","tarball":"http://registry.npmjs.org/book/-/book-1.0.0.tgz"},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]},"1.1.0":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"book","description":"flexible node.js logging library","version":"1.1.0","repository":{"type":"git","url":"git://github.com/shtylman/node-book.git"},"keywords":["logging","logger","log"],"main":"logger.js","scripts":{"test":"mocha"},"dependencies":{},"devDependencies":{"mocha":">=1.0.0"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"book@1.1.0","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"1254d234fe90734fff3083a457fec269c771ac4c","tarball":"http://registry.npmjs.org/book/-/book-1.1.0.tgz"},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]},"1.2.0":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"book","description":"flexible node.js logging library","version":"1.2.0","repository":{"type":"git","url":"git://github.com/shtylman/node-book.git"},"keywords":["logging","logger","log"],"main":"logger.js","scripts":{"test":"mocha"},"dependencies":{},"devDependencies":{"mocha":">=1.0.0"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"book@1.2.0","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fcd119064a6cdd7d91b4e31b64187824d76e9de5","tarball":"http://registry.npmjs.org/book/-/book-1.2.0.tgz"},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]}},"readme":"[![Build Status](https://secure.travis-ci.org/shtylman/node-logger.png?branch=master)](http://travis-ci.org/shtylman/node-logger)\n\nnode-logger is a flexible and extensible logging library for node.js\n\nInstead of trying to solve the problem of figuring out what and how you want to do logging in your project, node-logger provides some basic functions for you to customize and create the logging system you want. Think of it like middleware, except for logging.\n\n## install\n\nnpm install https://github.com/shtylman/node-logger/tarball/master\n\n## quickstart\n\nTo get started with basic logging, just require and initialize the default\nlogger.\n\n```javascript\nvar log = require('logger').default();\n```\n\nYou can now log using the methods: panic, error, warn, info, debug, trace\n\n```javascript\nlog.info('haters be loggin');\n```\n\nWill output (on stdout):\n```\n[info] haters be loggin\n```\n\n## how to log\n\nBelow are the basics of logging using the default logger.\n\nThere are 6 log levels ( panic | error | warn | info | debug | trace ). See the examples.\n\nThe arguments you pass to the logging functions will determine how they are processed.\n\n```javascript\n// if the first argument is a string, it is assumed to be a format string\n// it will consume all of the remaining arguments when formatting\nlog.info('hello world');\n[info] hello world\n\nlog.info('secret: %d', 42);\n[info] secret 42\n\nlog.info('json: %j', { secret: 42 });\n[info] { \"secret\": 42 }\n```\n\n```javascript\n// if the first argument is an Error\n// the logger will capture the stacktrace into error.stack of the final log entry\nlog.error(new Error('fail!'));\n[error] fail!\n\n// any arguments after the first Error arg are processed as if they appeared as the first\n// you can capture an error and print other messages\nlog.error(new Error('again?'), 'another %s', 'cat');\n[error] another cat\n```\n\n```javascript\n// lastly, the first argument can be an object\n// this will cause the fields of the object to the added to the fields of the final log entry\n// after the first arguments, remaining arguments are again treated as if they were the first\nlog.warn({ something: 'bad' }, 'foo %s', 'bar');\n\n// will print the message, however something: 'bad' will be added to the final log item\n[warn] foo bar\n```\n\nNote: Only when a string is encountered are all of the remaining arguments consumed. Until then, each argument is processed independently as if it appeared first.\n\n## decorators\n\nThe entire functionality of the default logger is built using 'decorators'. These act just like middleware to create a pipeline of 'features' for the logger. You can customize loggers to include/exclude any features you want.\n\nThe 'default' logger is simply a certain selection of decorators provided with the library. You are not required to use it and can roll your own custom solution.\n\n### make your own\n\nA decorator is simply a function which will do some processing on the logging entry. It is passed all of the arguments of the original log call (info, error, etc) and the 'this' is set to the logging entry. Your decorator should modify the fields of 'this' to add or remove relevant entries.\n\n```javascript\n// simple decorator that adds a timestamp to the entry\nfunction sample_decorator() {\n  var entry = this;\n\n  // this is the only provided field\n  // set to [0..5] 0=panic, by the called log functions\n  // usually you won't change this\n  entry.level;\n\n  // add a new field to our entry\n  entry.timestamp = Date.now();\n}\n```\n\nDecorators are processed in the order you push them onto a logger.\n\n### using your decorators\n\n```javascript\n// logger.blank creates a logging object with no decorators\nvar log = require('logger').blank();\n\n// remember, decorators are processed in the order you push them\nlog.push_decorator(sample_decorator);\n\n// you can now call any of the logging functions\nlog.info('hello');\n\n// output will depent on your decorators\n// use any of the provided decorators to build up your own logger\n```\n\n### provided decorators\n\nThere are a number of decorators shipped with the library. You can access them with:\n\n```javascript\nvar decorators = require('logger').decorators;\n```\n\nThe default logger is composed of these builtin decorators. Use a blank logger if you want to pick and choose which ones to use.\n\n#### base\n> provides the basic argument processing outlined above\n\n#### trace\n> provides tracing where the log line was called. Adds 'filename' and 'lineno' fields to the log entry.\n  This is different from the stack trace of Errors. This is the filename and lineno of the call site of the log line.\n\n#### stdout\n> basic printing to console\n\n#### hostname\n> inserts a 'hostname' field into the entry\n\n#### timestamp\n> inserts a 'timestamp' entry (seconds using Date.now()/1000.0)\n\n#### git\n> inserts a 'git_id' field with the current active git commit id\n\n","maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}],"time":{"modified":"2012-05-26T14:22:24.853Z","created":"2012-05-09T10:54:31.715Z","1.0.0":"2012-05-09T10:54:32.045Z","1.1.0":"2012-05-10T22:32:36.390Z","1.2.0":"2012-05-26T14:22:24.853Z"},"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"repository":{"type":"git","url":"git://github.com/shtylman/node-book.git"},"_attachments":{"book-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gSvRCIaNlht0wwIfo5oy8g==","length":6622,"stub":true},"book-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-K/CmlsQiQR8zptSm6p0BIg==","length":5930,"stub":true},"book-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-g+OQH5AxDqm7pfDVE/OZSw==","length":5827,"stub":true}}}},
{"id":"book-email","key":"book-email","value":{"rev":"3-c7fbbff7b811fc8888292b7f24c19b4f"},"doc":{"_id":"book-email","_rev":"3-c7fbbff7b811fc8888292b7f24c19b4f","name":"book-email","description":"email transport for book logging framework","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"book-email","description":"email transport for book logging framework","version":"0.0.1","repository":{"type":"git","url":"git://github.com/shtylman/node-book-email.git"},"main":"./index.js","dependencies":{"emailjs":"0.2.8"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"book-email@0.0.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"835881bb5bc6415585c346330dbbb253f61da082","tarball":"http://registry.npmjs.org/book-email/-/book-email-0.0.1.tgz"},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]}},"readme":"book-email is an email transport for the [book](https://github.com/shtylman/node-book) logging framework. It will send the log message via email.\n\n## installation ##\n\n```\nnpm install book-email\n```\n\n## use ##\n\nbook-email is used like all other book middleware. Just add it to your logger object. I recommend you create a file ```log.js``` for your project where you setup the logger however you desire across your entire project.\n\n```javascript\n// some logger you have created\nvar log = require('book').default();\n\n// adds the email logging middleware to the logger\nlog.use(require('book-email')({\n    from: 'noreply@example.com',\n    to: 'problems@example.com',\n    host: 'smtp.example.com',\n    port: 587,\n\n    // optional\n    tls: true,\n    user: 'foo',\n    password: 'bar'\n});\n\n// log stuffs, it will be emailed out\nlog.info('hello world!');\n```\n\nAn email will be dispatched to the specified smtp server with the json log entry\n\n","maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}],"time":{"modified":"2012-05-10T23:09:06.275Z","created":"2012-05-10T23:09:05.944Z","0.0.1":"2012-05-10T23:09:06.275Z"},"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"repository":{"type":"git","url":"git://github.com/shtylman/node-book-email.git"},"_attachments":{"book-email-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4NZL0jhUzSbXQOVgf3FheA==","length":1355,"stub":true}}}},
{"id":"book-file","key":"book-file","value":{"rev":"3-9c1d138bd232f878eb637c16604cd81d"},"doc":{"_id":"book-file","_rev":"3-9c1d138bd232f878eb637c16604cd81d","name":"book-file","description":"file transport for book logging framework","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"book-file","description":"file transport for book logging framework","version":"0.0.1","repository":{"type":"git","url":"git://github.com/shtylman/node-book-file.git"},"main":"./index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"book-file@0.0.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"13fe52ca48471dc7ee360722d56185b049a34d53","tarball":"http://registry.npmjs.org/book-file/-/book-file-0.0.1.tgz"},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]}},"readme":"book-file is a file transport for the [book](https://github.com/shtylman/node-book) logging framework. It will write out the json contents of the log entry.\n\n## installation ##\n\n```\nnpm install book-file\n```\n\n## use ##\n\nbook-file is used like all other book middleware. Just add it to your logger object. I recommend you create a file ```log.js``` for your project where you setup the logger however you desire across your entire project.\n\n```javascript\n// some logger you have created\nvar log = require('book').default();\n\n// adds the file logging middleware to the logger\nlog.use(require('book-file')({\n    filename: '/path/to/file.log'\n});\n\n// log stuffs, it will go to the log file\nlog.info('hello world!');\n```\n\nfile.log will contain something along the lines of:\n\n```\n{ \"level\": 3, \"timestamp\": 12345, \"message\": \"hello world!\" }\n```\n","maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}],"time":{"modified":"2012-05-10T22:44:18.958Z","created":"2012-05-10T22:44:18.633Z","0.0.1":"2012-05-10T22:44:18.958Z"},"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"repository":{"type":"git","url":"git://github.com/shtylman/node-book-file.git"},"_attachments":{"book-file-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mBuoWXf7ClhG9/DGMt1XlA==","length":1126,"stub":true}}}},
{"id":"book-git","key":"book-git","value":{"rev":"3-5b50febfec5f65145c7dbfb9bbaef38e"},"doc":{"_id":"book-git","_rev":"3-5b50febfec5f65145c7dbfb9bbaef38e","name":"book-git","description":"git middleware for book logging framework","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"name":"book-git","description":"git middleware for book logging framework","version":"0.0.1","repository":{"type":"git","url":"git://github.com/shtylman/node-book-git.git"},"main":"./index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"shtylman","email":"shtylman@gmail.com"},"_id":"book-git@0.0.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"2ecc32363d3b074f6c7f2416e6ded7d055401a45","tarball":"http://registry.npmjs.org/book-git/-/book-git-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}]}},"readme":"book-git is a git version middleware for the [book](https://github.com/shtylman/node-book) logging framework. It will add a commit field with the sha hash of your projects git repository.\n\n## installation ##\n\n```\nnpm install book-git\n```\n\n## use ##\n\nbook-git is used like all other book middleware. Just add it to your logger object. I recommend you create a file ```log.js``` for your project where you setup the logger however you desire across your entire project.\n\n```javascript\n// some logger you have created\nvar log = require('book').default();\n\n// adds the git middleware to your logging stack\nlog.use(require('book-git')());\n\n// log stuffs, git sha will be added automatically for you\nlog.info('hello world!');\n```\n\nThe final log entry will have an additional field ```commit``` which will contain the sha hash. If you have a custom book transport, make sure it is writing it to whatever destination you desire. If you use other book transports like [book-email](https://github.com/shtylman/node-book-email) or [book-file](https://github.com/shtylman/node-book-file) then it will automatically be included in the stored entry.\n\n","maintainers":[{"name":"shtylman","email":"shtylman@gmail.com"}],"time":{"modified":"2012-05-23T21:03:38.872Z","created":"2012-05-23T21:03:38.487Z","0.0.1":"2012-05-23T21:03:38.872Z"},"author":{"name":"Roman Shtylman","email":"shtylman@gmail.com"},"repository":{"type":"git","url":"git://github.com/shtylman/node-book-git.git"},"_attachments":{"book-git-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9vAXKW+xRluY92OwX1t5IQ==","length":1259,"stub":true}}}},
{"id":"bookbu","key":"bookbu","value":{"rev":"3-d9a104bccc67eae8a5dc6f0f4c3ba5fc"},"doc":{"_id":"bookbu","_rev":"3-d9a104bccc67eae8a5dc6f0f4c3ba5fc","name":"bookbu","description":"Simple build script for bookmarklets","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"name":"bookbu","description":"Simple build script for bookmarklets","keywords":["bookmarklet build","favelet build"],"version":"0.1.1","homepage":"http://npmjs.org/","author":{"name":"Szymon Pilkowski","email":"szymon.pilkowski@gmail.com","url":"http://twitter.com/ard"},"repository":{"type":"git","url":"http://github.com/ardcore/bookbu.js.git"},"bugs":{"email":"szymon.pilkowski@gmail.com","url":"https://github.com/ardcore/bookbu.js/issues"},"bin":{"bookbu.js":"./bookbu.js"},"dependencies":{"uglify-js":"1.0"},"_id":"bookbu@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.4.0","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"904ecb0b495cfd794a3267d5514d1805f6603d58","tarball":"http://registry.npmjs.org/bookbu/-/bookbu-0.1.1.tgz"}}},"maintainers":[{"name":"ardcore","email":"szymon.pilkowski@gmail.com"}],"time":{"modified":"2011-04-09T00:44:00.613Z","created":"2011-04-09T00:44:00.036Z","0.1.1":"2011-04-09T00:44:00.613Z"},"author":{"name":"Szymon Pilkowski","email":"szymon.pilkowski@gmail.com","url":"http://twitter.com/ard"},"repository":{"type":"git","url":"http://github.com/ardcore/bookbu.js.git"},"_attachments":{"bookbu-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hLQ826R24KwfTs+RkQtqHw==","length":1515,"stub":true}}}},
{"id":"boot","key":"boot","value":{"rev":"41-09928124bff88d58895169332a39f3c8"},"doc":{"_id":"boot","_rev":"41-09928124bff88d58895169332a39f3c8","name":"boot","description":"An automatic reconnect mux-demux-shoe","dist-tags":{"latest":"0.8.1"},"versions":{"0.0.1":{"name":"boot","version":"0.0.1","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{},"devDependencies":{"testling":"git://github.com/Raynos/testling#master","testem":"git://github.com/Raynos/testem#master","sinon":"git://github.com/Raynos/Sinon.JS.git","tap":"0.2.5"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{"test":"make node-test"},"readme":"# boot [![build status][1]][2]\n\nAn automatic reconnect mux-demux-shoe\n\n## Example\n\n## Installation\n\n`npm install boot`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.0.1","dist":{"shasum":"a55a547801d192d7358b34bc181a8219d0e0dfd7","tarball":"http://registry.npmjs.org/boot/-/boot-0.0.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.1.0":{"name":"boot","version":"0.1.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8"},"devDependencies":{"browserify":"~1.14.4"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.1.0","dist":{"shasum":"d6201448f885e574e93e508ba6e2fa2952ecad24","tarball":"http://registry.npmjs.org/boot/-/boot-0.1.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.1.1":{"name":"boot","version":"0.1.1","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8"},"devDependencies":{"browserify":"~1.14.4"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.1.1","dist":{"shasum":"dc61dfc9dc4dbc2b58b7e403285723c4149dfb6a","tarball":"http://registry.npmjs.org/boot/-/boot-0.1.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.0":{"name":"boot","version":"0.2.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8"},"devDependencies":{"browserify":"~1.14.4","upnode":"~0.4.1","node-uuid":"~1.3.3"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.2.0","dist":{"shasum":"48139f43c332691fe24c91938925975a5091eee5","tarball":"http://registry.npmjs.org/boot/-/boot-0.2.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.4.0":{"name":"boot","version":"0.4.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8","backoff":"~0.2.0"},"devDependencies":{"browserify":"~1.14.4","upnode":"~0.4.1","node-uuid":"~1.3.3"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.4.0","dist":{"shasum":"53dff29e116298efdcbc426dd718c25415419eb6","tarball":"http://registry.npmjs.org/boot/-/boot-0.4.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.4.1":{"name":"boot","version":"0.4.1","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8","backoff":"~0.2.0"},"devDependencies":{"browserify":"~1.14.4","upnode":"~0.4.1","node-uuid":"~1.3.3"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.4.1","dist":{"shasum":"3184a4b77cfad7788f19759bfc5665f1d7115e8b","tarball":"http://registry.npmjs.org/boot/-/boot-0.4.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.5.0":{"name":"boot","version":"0.5.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8","backoff":"~0.2.0"},"devDependencies":{"browserify":"~1.14.4","upnode":"~0.4.1","node-uuid":"~1.3.3"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.5.0","dist":{"shasum":"78e9d82d499f1ec52be064f86b742619c5a28dfd","tarball":"http://registry.npmjs.org/boot/-/boot-0.5.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.0":{"name":"boot","version":"0.6.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.1.1","through":"~0.1.2","pause-stream":"0.0.3","event-stream":"~2.1.8","backoff":"~0.2.0"},"devDependencies":{"browserify":"~1.14.4","upnode":"~0.4.1","node-uuid":"~1.3.3"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n    var shoe = require('../browser.js')\n        , mdm = shoe(\"/shoe\")\n\n    var one = window.one = mdm.createStream(\"one\")\n\n    one.on(\"data\", function (data) {\n        console.log(\"message\", data)\n    })\n\n    one.write(\"hello world\")\n\n## Server Example\n\n    var shoe = require(\"..\")\n        , through = require(\"through\")\n        , echoStream = through()\n\n    var sock = shoe(function (stream) {\n        // stream from MuxDemux with the meta property set\n        if (stream.meta === \"one\") {\n            stream.on(\"data\", console.log.bind(console))\n            stream.pipe(echoStream).pipe(stream)\n        }\n    })\n\n    sock.install(server, \"/shoe\")\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.6.0","dist":{"shasum":"d0b016c857d704a011ca314a861f67dcdf9148e7","tarball":"http://registry.npmjs.org/boot/-/boot-0.6.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.1":{"name":"boot","version":"0.6.1","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.6.1","dist":{"shasum":"03218c2f201e9b7bfffe93fa7731d1544b8e0bd9","tarball":"http://registry.npmjs.org/boot/-/boot-0.6.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.2":{"name":"boot","version":"0.6.2","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.6.2","dist":{"shasum":"dbd0c01c0e22966f0854f2be12bafe172dde9479","tarball":"http://registry.npmjs.org/boot/-/boot-0.6.2.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.3":{"name":"boot","version":"0.6.3","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.6.3","dist":{"shasum":"41b32fb9244dd996dba86b035c3bb7af8ec0b9aa","tarball":"http://registry.npmjs.org/boot/-/boot-0.6.3.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.4":{"name":"boot","version":"0.6.4","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.6.4","dist":{"shasum":"a6a5c03a881d9794c3e57944eae30fd42fd7d838","tarball":"http://registry.npmjs.org/boot/-/boot-0.6.4.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.6.5":{"name":"boot","version":"0.6.5","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.6.5","dist":{"shasum":"75680414c46d87e33cf0248166ea8206349e091f","tarball":"http://registry.npmjs.org/boot/-/boot-0.6.5.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.7.0":{"name":"boot","version":"0.7.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.7.0","dist":{"shasum":"b016e85c14289ecf3cb61271dd10b39b43348de5","tarball":"http://registry.npmjs.org/boot/-/boot-0.7.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.7.1":{"name":"boot","version":"0.7.1","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.7.1","dist":{"shasum":"44a7ba72273349f66f7c638e02e9538cddd005eb","tarball":"http://registry.npmjs.org/boot/-/boot-0.7.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.7.2":{"name":"boot","version":"0.7.2","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.7.2","dist":{"shasum":"6e2f420d8e675bc5f8a45b10d7275051b1b9444f","tarball":"http://registry.npmjs.org/boot/-/boot-0.7.2.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.7.3":{"name":"boot","version":"0.7.3","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.7.3","dist":{"shasum":"72518e68314e7702c699bde8223d09d75dc55e9d","tarball":"http://registry.npmjs.org/boot/-/boot-0.7.3.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.7.4":{"name":"boot","version":"0.7.4","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.git"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.0","through":"~0.1.2","pause-stream":"0.0.3","backoff":"~0.2.0","duplexer":"0.0.1"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.7.4","dist":{"shasum":"2fc8520eeb8951247ba3c028b2ceaa56726d896d","tarball":"http://registry.npmjs.org/boot/-/boot-0.7.4.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.8.0":{"name":"boot","version":"0.8.0","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.gitn"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.4","through":"~0.1.4","pause-stream":"0.0.3","backoff":"~0.3.0","duplexer":"~0.0.2"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.8.0","dist":{"shasum":"71133e14f85659e04f1406fcea8d06e617457cf6","tarball":"http://registry.npmjs.org/boot/-/boot-0.8.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.8.1":{"name":"boot","version":"0.8.1","description":"An automatic reconnect mux-demux-shoe","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.gitn"},"main":"index","homepage":"https://github.com/Raynos/boot","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/boot/issues","email":"raynos2@gmail.com"},"dependencies":{"mux-demux-shoe":"~0.2.4","through":"~0.1.4","pause-stream":"0.0.3","backoff":"~0.3.0","duplexer":"~0.0.2"},"devDependencies":{"upnode":"~0.4.1","node-uuid":"~1.3.3","browserify-server":"~0.2.0","multi-channel-mdm":"~0.5.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/boot/raw/master/LICENSE"}],"scripts":{},"readme":"# boot\n\nAn automatic reconnect mux-demux-shoe\n\nThe mdm connection you get from shoe will magically handle reconnection\nlogic for you under the hood. You just play with streams\n\n## Client Example\n\n``` js\nvar boot = require('boot')\n    , mdm = boot(\"/boot\")\n\nvar one = mdm.createStream(\"one\")\n\none.on(\"data\", console.log.bind(console, \"client\"))\n\none.write(\"hello world\")\n```\n\n## Server Example\n\n``` js\nvar boot = require(\"boot\")\n    , through = require(\"through\")\n    , echoStream = through()\n\nvar sock = boot(function (stream) {\n    // stream from MuxDemux with the meta property set\n    if (stream.meta === \"one\") {\n        stream.on(\"data\", console.log.bind(console, \"server\"))\n        stream.pipe(echoStream, { end: false }).pipe(stream)\n    }\n})\n\nsock.install(server, \"/boot\")\n```\n\n## Installation\n\n`npm install boot`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","_id":"boot@0.8.1","dist":{"shasum":"f9cd6402f7aebc84a4f2e1201e41e75e147a3a17","tarball":"http://registry.npmjs.org/boot/-/boot-0.8.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"readme":"# boot [![build status][1]][2]\n\nAn automatic reconnect mux-demux-shoe\n\n## Example\n\n## Installation\n\n`npm install boot`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/boot.png\n  [2]: http://travis-ci.org/Raynos/boot","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2012-08-15T07:52:19.726Z","created":"2012-08-04T05:20:32.891Z","0.0.1":"2012-08-04T05:20:34.175Z","0.1.0":"2012-08-04T06:04:28.317Z","0.1.1":"2012-08-04T06:07:27.593Z","0.2.0":"2012-08-06T05:59:02.040Z","0.4.0":"2012-08-06T06:32:16.826Z","0.4.1":"2012-08-06T07:30:25.247Z","0.5.0":"2012-08-06T23:14:15.212Z","0.6.0":"2012-08-07T03:18:26.669Z","0.6.1":"2012-08-10T06:51:36.654Z","0.6.2":"2012-08-11T03:18:25.263Z","0.6.3":"2012-08-11T03:22:59.930Z","0.6.4":"2012-08-11T03:35:59.058Z","0.6.5":"2012-08-11T04:31:31.046Z","0.7.0":"2012-08-11T04:47:10.431Z","0.7.1":"2012-08-11T05:28:15.549Z","0.7.2":"2012-08-13T02:25:55.421Z","0.7.3":"2012-08-13T02:46:27.928Z","0.7.4":"2012-08-13T02:49:25.347Z","0.8.0":"2012-08-14T18:41:52.012Z","0.8.1":"2012-08-15T07:52:19.726Z"},"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/boot.gitn"},"_attachments":{"boot-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-x+tnICTDSv74FWoPBraMdQ==","length":4074,"stub":true},"boot-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-F/bTey2PC9Jde2bCuF7JZQ==","length":4058,"stub":true},"boot-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-fWk/INAgzc6p865vXM7a1A==","length":3582,"stub":true},"boot-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-7XBIaFNciPlB6dRXEFVWhQ==","length":3581,"stub":true},"boot-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-dEwDxYeR+nQG2aOyNF9Ccg==","length":3587,"stub":true},"boot-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-oWPqjiAhIDLxHbbZHRCe+Q==","length":3453,"stub":true},"boot-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-+adzXIXj0/AfLc0ZGboapw==","length":3411,"stub":true},"boot-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-zyick/0WpBBOTRjchpS1pw==","length":3369,"stub":true},"boot-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-qQkvHHEdsNeQldY9wXEI7w==","length":3390,"stub":true},"boot-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-CI0R4dHLKv2VH6rfsrjfXQ==","length":3382,"stub":true},"boot-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-Rlqhu8YL8SFQgy3sZtILFA==","length":3397,"stub":true},"boot-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-MZJ0eNF8zOtRFKrmdmItfg==","length":3321,"stub":true},"boot-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-tYiV8daQfhX0VSJLWnud/A==","length":3141,"stub":true},"boot-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-foUKnuRgw5RBtJf3E3vNTg==","length":3038,"stub":true},"boot-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-OI6TZd9gd4Wi2wVM1waWUQ==","length":2978,"stub":true},"boot-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-CKy5RXf5qBIthtyPPu03ZQ==","length":2977,"stub":true},"boot-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-8rz4m10pTFjZm9xE5vbxyg==","length":2874,"stub":true},"boot-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-CvbiOAbAmAlxnMSSPakjag==","length":2479,"stub":true},"boot-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-eAl/gAJm1jluc8b6z6KMUw==","length":2492,"stub":true},"boot-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vuWXNk+/+IVc78N8TyPRaQ==","length":1667,"stub":true}}}},
{"id":"boots","key":"boots","value":{"rev":"5-cbf8dcefb4af4f9065ca9797693eafb1"},"doc":{"_id":"boots","_rev":"5-cbf8dcefb4af4f9065ca9797693eafb1","name":"boots","description":"twitter bootstrap cli","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"homepage":"https://projects.jga.me/boots","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"name":"boots","description":"twitter bootstrap cli","version":"0.0.1","repository":{"type":"git","url":"git://github.com/jgallen23/boots.git"},"dependencies":{"aug":"*","commander":"*","jsdom":"*","mkdirp":"*","request":"*","zip":"*"},"devDependencies":{},"engines":{"node":"*"},"main":"./lib/run","bin":{"boots":"./bin/boots"},"_npmUser":{"name":"jga","email":"me@jga.me"},"_id":"boots@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c3f5c7c5f87d71f78de3f072971c2628f15f5cee","tarball":"http://registry.npmjs.org/boots/-/boots-0.0.1.tgz"},"maintainers":[{"name":"jga","email":"me@jga.me"}]},"0.1.0":{"homepage":"https://projects.jga.me/boots","author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"name":"boots","description":"twitter bootstrap cli","version":"0.1.0","repository":{"type":"git","url":"https://github.com/jgallen23/boots.git"},"dependencies":{"aug":"0.0.5","cli-table":"0.0.2","commander":"1.0.1","mkdirp":"0.3.3","request":"2.10.0","zip":"0.0.6"},"devDependencies":{"jsdom":"0.2.15"},"main":"./lib/run","bin":{"boots":"./bin/boots"},"readme":"#Boots\n\n[Boots](http://projects.jga.me/boots/) is a command line utility for Bootstrap.  It will let you build a custom instance of boostrap without leaving your terminal. \n\nFor more information, check out the [documentation](http://projects.jga.me/boots/).\n","_id":"boots@0.1.0","dist":{"shasum":"d7499dea7d19537b1dae42f285a535c83c675e13","tarball":"http://registry.npmjs.org/boots/-/boots-0.1.0.tgz"},"maintainers":[{"name":"jga","email":"me@jga.me"}]}},"readme":"#Boots\n\n[Boots](http://projects.jga.me/boots/) is a command line utility for Bootstrap.  It will let you build a custom instance of boostrap without leaving your terminal. \n\nFor more information, check out the [documentation](http://projects.jga.me/boots/).\n","maintainers":[{"name":"jga","email":"me@jga.me"}],"time":{"modified":"2012-08-12T16:10:41.651Z","created":"2012-04-23T17:01:18.194Z","0.0.1":"2012-04-23T17:01:21.886Z","0.1.0":"2012-08-12T16:10:41.651Z"},"author":{"name":"Greg Allen","email":"@jgaui","url":"http://jga.me"},"repository":{"type":"git","url":"https://github.com/jgallen23/boots.git"},"_attachments":{"boots-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Osji3/fc15sBwfydTnTSxQ==","length":3666,"stub":true},"boots-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VZHYQbO4vgoOWo3EeK51XA==","length":3208,"stub":true}}}},
{"id":"bootstrap","key":"bootstrap","value":{"rev":"19-ef2355fc0971a252ad5181665f7cccd8"},"doc":{"_id":"bootstrap","_rev":"19-ef2355fc0971a252ad5181665f7cccd8","name":"bootstrap","description":"Bootstrap your node app with some great defaults","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Andrew Gertig","email":"andrew.gertig@gmail.com","url":"http://andrewgertig.com"},"name":"bootstrap","description":"Bootstrap your node app with some great defaults","version":"0.0.1","homepage":"http://github.com/AndrewGertig/bootstrap","repository":{"url":"git://github.com/AndrewGertig/bootstrap"},"engines":{"node":">=0.4.8"},"dependencies":{"commander":"x.x.x"},"devDependencies":{},"keywords":["bootstrap","generator","express"],"bin":{"bootstrap":"./bin/bootstrap"},"_npmJsonOpts":{"file":"/Users/andrewgertig/.npm/bootstrap/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bootstrap@0.0.1","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"bdfe8a18cfc7e2b92bd9eac5049b17eb9d4a7dd4","tarball":"http://registry.npmjs.org/bootstrap/-/bootstrap-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"gertig","email":"andrew.gertig@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Andrew Gertig","email":"andrew.gertig@gmail.com","url":"http://andrewgertig.com"},"name":"bootstrap","description":"Bootstrap your node app with some great defaults","version":"0.0.2","repository":{"type":"git","url":"git://github.com/AndrewGertig/bootstrap-node.git"},"engines":{"node":">=0.4.8"},"dependencies":{"commander":"x.x.x"},"devDependencies":{},"keywords":["bootstrap","generator","express"],"bin":{"bootstrap":"./bin/bootstrap"},"_npmJsonOpts":{"file":"/Users/andrewgertig/.npm/bootstrap/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bootstrap@0.0.2","_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"3e53211a6c7a9776fa80daec407217a5bffea398","tarball":"http://registry.npmjs.org/bootstrap/-/bootstrap-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"gertig","email":"andrew.gertig@gmail.com"}]}},"maintainers":[{"name":"gertig","email":"andrew.gertig@gmail.com"}],"time":{"modified":"2012-08-07T19:57:34.743Z","created":"2011-08-28T02:47:43.832Z","0.0.1":"2011-08-28T02:47:44.043Z","0.0.2":"2011-08-28T02:52:22.830Z"},"author":{"name":"Andrew Gertig","email":"andrew.gertig@gmail.com","url":"http://andrewgertig.com"},"repository":{"type":"git","url":"git://github.com/AndrewGertig/bootstrap-node.git"},"users":{"sjonnet19":true},"_attachments":{"bootstrap-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-3F8w4Vc2/s8VcImncGxtIw==","length":3722,"stub":true},"bootstrap-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LySEKJZuxXqKs4XZdSoamw==","length":3207,"stub":true}}}},
{"id":"bootstrap-amd","key":"bootstrap-amd","value":{"rev":"3-3490f382c6dc3c64ceea137f67781f6f"},"doc":{"_id":"bootstrap-amd","_rev":"3-3490f382c6dc3c64ceea137f67781f6f","name":"bootstrap-amd","description":"Converts Twitter Bootstrap JS files into AMD","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"bootstrap-amd","version":"0.0.2","homepage":"http://github.com/clexit/bootstrap-amd","author":{"name":"Vyacheslav Kotiya","email":"clexit@clexit.com","url":"http://github.com/clexit"},"description":"Converts Twitter Bootstrap JS files into AMD","licenses":[{"type":"BSD"},{"type":"MIT"}],"main":"bootstrap-amd","bin":{"bootstrap-amd":"./bootstrap-amd.js"},"engines":{"node":">=0.6.0"},"_id":"bootstrap-amd@0.0.2","dist":{"shasum":"0c0f8e108139f6b1c8ddab1e03c6b4cd628a520e","tarball":"http://registry.npmjs.org/bootstrap-amd/-/bootstrap-amd-0.0.2.tgz"},"readme":"","maintainers":[{"name":"clexit","email":"clexit@clexit.com"}]}},"readme":"","maintainers":[{"name":"clexit","email":"clexit@clexit.com"}],"time":{"modified":"2012-08-03T08:53:27.697Z","created":"2012-08-03T08:53:25.636Z","0.0.2":"2012-08-03T08:53:27.697Z"},"author":{"name":"Vyacheslav Kotiya","email":"clexit@clexit.com","url":"http://github.com/clexit"},"_attachments":{"bootstrap-amd-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-BaeDvlfHLXZRoAGA4n9dUA==","length":1768,"stub":true}}}},
{"id":"bootstrap-carousel-animate","key":"bootstrap-carousel-animate","value":{"rev":"3-d0535abcc4dab8da2d52bf29eed436d1"},"doc":{"_id":"bootstrap-carousel-animate","_rev":"3-d0535abcc4dab8da2d52bf29eed436d1","name":"bootstrap-carousel-animate","description":"Bootstrap Carousel Animate is an extension to the Carousel plugin of Twitter's Bootstrap toolkit. It provides a jQuery animate fallback for browsers without support for CSS transitions and also adjusts and animates the carousel height for different item heights.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bootstrap-carousel-animate","version":"1.0.0","title":"Bootstrap Carousel Animate","description":"Bootstrap Carousel Animate is an extension to the Carousel plugin of Twitter's Bootstrap toolkit. It provides a jQuery animate fallback for browsers without support for CSS transitions and also adjusts and animates the carousel height for different item heights.","keywords":["bootstrap","carousel","animate","slide","transition"],"homepage":"https://github.com/blueimp/Bootstrap-Carousel-Animate","author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Carousel-Animate.git"},"bugs":{"name":"https://github.com/blueimp/Bootstrap-Carousel-Animate/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/MIT"}],"dependencies":{"jquery":">=1.7","bootstrap":">=2.0.4"},"_npmUser":{"name":"blueimp","email":"sebastian.tschan@gmail.com"},"_id":"bootstrap-carousel-animate@1.0.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"9514ba8b9febaa24e335be3fadf4480ce3d8b768","tarball":"http://registry.npmjs.org/bootstrap-carousel-animate/-/bootstrap-carousel-animate-1.0.0.tgz"}}},"readme":"# Bootstrap Carousel Animate\n\n## Demo\n[Bootstrap Carousel Animate Demo](http://blueimp.github.com/Bootstrap-Carousel-Animate/)\n\n## Description\nBootstrap Carousel Animate is an extension to the [Carousel](http://twitter.github.com/bootstrap/javascript.html#carousel) dialog of Twitter's [Bootstrap](http://twitter.github.com/bootstrap/) toolkit. It provides a jQuery animate fallback for browsers without support for CSS transitions and also adjusts and animates the carousel height for different item heights.\n\n## Requirements\n* [jQuery](http://jquery.com/) v. 1.7+\n* [Bootstrap Carousel](http://twitter.github.com/bootstrap/javascript.html#carousel) v. 2.0.4+\n\n## License\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT).\n","maintainers":[{"name":"blueimp","email":"sebastian.tschan@gmail.com"}],"time":{"modified":"2012-07-17T12:14:04.848Z","created":"2012-07-17T12:14:03.190Z","1.0.0":"2012-07-17T12:14:04.848Z"},"author":{"name":"Sebastian Tschan","url":"https://blueimp.net"},"repository":{"type":"git","url":"git://github.com/blueimp/Bootstrap-Carousel-Animate.git"},"_attachments":{"bootstrap-carousel-animate-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sWGtgFB2HD7S+lQZrwu9XA==","length":7399,"stub":true}}}},
{"id":"bootstrap-express-messages","key":"bootstrap-express-messages","value":{"rev":"3-d29505d06ce7c39a6b64b54cf6abc6b4"},"doc":{"_id":"bootstrap-express-messages","_rev":"3-d29505d06ce7c39a6b64b54cf6abc6b4","name":"bootstrap-express-messages","description":"Express flash notification message rendering for Twitter Bootstrap","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bootstrap-express-messages","description":"Express flash notification message rendering for Twitter Bootstrap","version":"0.0.1","author":{"name":"Nick Baugh","email":"niftylettuce@gmail.com"},"keywords":["express","bootstrap","bootstrap-messages"],"main":"index","devDependencies":{"express":"2.4.4","expresso":"0.8.1","ejs":"0.4.3"},"engines":{"node":">= 0.2.0"},"_npmUser":{"name":"niftylettuce","email":"nicholasbaugh@gmail.com"},"_id":"bootstrap-express-messages@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"891bfed934dadc9a213936815588a38565ee7aa9","tarball":"http://registry.npmjs.org/bootstrap-express-messages/-/bootstrap-express-messages-0.0.1.tgz"},"readme":"","maintainers":[{"name":"niftylettuce","email":"nicholasbaugh@gmail.com"}]}},"readme":"","maintainers":[{"name":"niftylettuce","email":"nicholasbaugh@gmail.com"}],"time":{"modified":"2012-04-25T09:18:09.682Z","created":"2012-04-25T09:18:08.580Z","0.0.1":"2012-04-25T09:18:09.682Z"},"author":{"name":"Nick Baugh","email":"niftylettuce@gmail.com"},"_attachments":{"bootstrap-express-messages-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/ypneblmuAXvTLrbY4qmgA==","length":6275,"stub":true}}}},
{"id":"bootstrap-form","key":"bootstrap-form","value":{"rev":"5-49e1ea91bbcbe0a21044c95e16e0689f"},"doc":{"_id":"bootstrap-form","_rev":"5-49e1ea91bbcbe0a21044c95e16e0689f","name":"bootstrap-form","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"author":{"name":"Mark Engel"},"name":"bootstrap-form","version":"1.0.0","dependencies":{"moment":"1.6.2","underscore":"1.3.3"},"main":"lib/form","_npmUser":{"name":"mren","email":"mark.c.engel@gmail.com"},"_id":"bootstrap-form@1.0.0","devDependencies":{"drykup":"0.1.2"},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"f13151d0121fa227203543c39f0a1a04d10fd272","tarball":"http://registry.npmjs.org/bootstrap-form/-/bootstrap-form-1.0.0.tgz"},"maintainers":[{"name":"mren","email":"mark.c.engel@gmail.com"}]},"1.0.1":{"author":{"name":"Mark Engel"},"name":"bootstrap-form","version":"1.0.1","dependencies":{"moment":"1.6.2","underscore":"1.3.3"},"main":"lib/form","_npmUser":{"name":"mren","email":"mark.c.engel@gmail.com"},"_id":"bootstrap-form@1.0.1","devDependencies":{"drykup":"0.1.2"},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a118973446f662f2a01db365b7dafa419aecf638","tarball":"http://registry.npmjs.org/bootstrap-form/-/bootstrap-form-1.0.1.tgz"},"maintainers":[{"name":"mren","email":"mark.c.engel@gmail.com"}]}},"readme":"bootstrap-form\n==============\n\nThis is a a utility class to create bootstrap form without writing boilerplate.\n","maintainers":[{"name":"mren","email":"mark.c.engel@gmail.com"}],"time":{"modified":"2012-06-19T16:41:01.921Z","created":"2012-06-19T16:26:18.637Z","1.0.0":"2012-06-19T16:26:24.975Z","1.0.1":"2012-06-19T16:41:01.921Z"},"author":{"name":"Mark Engel"},"_attachments":{"bootstrap-form-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+wFqRoKTB7IsTgWUBry/cw==","length":2036,"stub":true},"bootstrap-form-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2IGZkz76q+TkaKDnoQWNGA==","length":2021,"stub":true}}}},
{"id":"bootstrap-stylus","key":"bootstrap-stylus","value":{"rev":"7-42282e98239577bee46458ced7a4f18b"},"doc":{"_id":"bootstrap-stylus","_rev":"7-42282e98239577bee46458ced7a4f18b","name":"bootstrap-stylus","description":"Twitter Bootstrap CSS framework ported to stylus","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"bootstrap-stylus","description":"Twitter Bootstrap CSS framework ported to stylus","version":"0.1.0","repository":{"url":"https://github.com/shomeya/bootstrap-stylus"},"author":{"name":"Michael Prasuhn","email":"mike@mikeyp.net"},"main":"./lib","directories":{"lib":"."},"engines":{"node":"*"},"_npmUser":{"name":"mikey_p","email":"mike@mikeyp.net"},"_id":"bootstrap-stylus@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"363a763e942a336ed6a5cbb68350d5f3326b04e1","tarball":"http://registry.npmjs.org/bootstrap-stylus/-/bootstrap-stylus-0.1.0.tgz"},"maintainers":[{"name":"mikey_p","email":"mike@mikeyp.net"}]},"0.2.0":{"name":"bootstrap-stylus","description":"Twitter Bootstrap CSS framework ported to stylus","homepage":"https://github.com/shomeya/bootstrap-stylus","keywords":["server","stylus"],"repository":{"type":"git","url":"git://github.com/shomeya/bootstrap-stylus.git"},"author":{"name":"Michael Prasuhn","email":"mike@mikeyp.net"},"main":"./lib","directories":{"lib":"."},"version":"0.2.0","_npmUser":{"name":"mikey_p","email":"mike@mikeyp.net"},"_id":"bootstrap-stylus@0.2.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"592ab22353da7af3edf5d29bb3da5f7e6b49f930","tarball":"http://registry.npmjs.org/bootstrap-stylus/-/bootstrap-stylus-0.2.0.tgz"},"maintainers":[{"name":"mikey_p","email":"mike@mikeyp.net"}]},"0.2.1":{"name":"bootstrap-stylus","description":"Twitter Bootstrap CSS framework ported to stylus","homepage":"https://github.com/shomeya/bootstrap-stylus","keywords":["server","stylus"],"repository":{"type":"git","url":"git://github.com/shomeya/bootstrap-stylus.git"},"author":{"name":"Michael Prasuhn","email":"mike@mikeyp.net"},"main":"./lib","scripts":{"test":"node test/test.js"},"directories":{"lib":"."},"version":"0.2.1","_npmUser":{"name":"mikey_p","email":"mike@mikeyp.net"},"_id":"bootstrap-stylus@0.2.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"584326e509de39dbab793aa0d1deb6605a7ee7a3","tarball":"http://registry.npmjs.org/bootstrap-stylus/-/bootstrap-stylus-0.2.1.tgz"},"maintainers":[{"name":"mikey_p","email":"mike@mikeyp.net"}]}},"readme":"# bootstrap-stylus\n\nA basic port of the Twitter Bootstrap CSS framework to stylus. Ideal for node.js apps using connect or express.\n\nTo learn more about using the framework see the bootstrap docs at http://twitter.github.com/bootstrap.\n\n\n## Use\n\nJavascript - just add it to stylus's paths:\n\n    stylus(content).set('paths',[require('bootstrap-stylus')]).render(....)\n\n\nin your .style files:\n\n    @import bootstrap\n\nor set variables before importing:\n\n    $linkColor = red\n    @import bootstrap\n\nYou can also import individual files by specifying their filename:\n\n    @import reset\n\n\n## Authors\n\n### Twitter Bootstrap by:\n\n**Mark Otto**\n\n+ http://twitter.com/mdo\n+ http://github.com/markdotto\n\n**Jacob Thornton**\n\n+ http://twitter.com/fat\n+ http://github.com/fat\n\n### Port to stylus by\n\n**Michael Prasuhn**\n\n+ http://twitter.com/mikey_p\n+ https://github.com/mikeyp\n\n## License\n\nCopyright 2011 Twitter, Inc.\n\nLicensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0","maintainers":[{"name":"mikey_p","email":"mike@mikeyp.net"}],"time":{"modified":"2012-03-08T18:46:16.127Z","created":"2011-11-23T05:23:52.271Z","0.1.0":"2011-11-23T05:23:54.694Z","0.2.0":"2011-11-25T21:13:50.799Z","0.2.1":"2012-03-08T18:46:16.127Z"},"author":{"name":"Michael Prasuhn","email":"mike@mikeyp.net"},"repository":{"type":"git","url":"git://github.com/shomeya/bootstrap-stylus.git"},"_attachments":{"bootstrap-stylus-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Tyfc2WNWd9gLjN6r8qIrIg==","length":30720,"stub":true},"bootstrap-stylus-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5bk7+9poN+kONOTC9d2uuw==","length":20480,"stub":true},"bootstrap-stylus-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9k/Y6CfDDm76ebQjYZ9V5A==","length":20480,"stub":true}}}},
{"id":"bootstrap.docpad","key":"bootstrap.docpad","value":{"rev":"3-1149ef7b822db060fc8f243e9ccc1ecc"},"doc":{"_id":"bootstrap.docpad","_rev":"3-1149ef7b822db060fc8f243e9ccc1ecc","name":"bootstrap.docpad","description":"Twitter Bootstrap Skeleton for DocPad","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"bootstrap.docpad","version":"0.2.0","description":"Twitter Bootstrap Skeleton for DocPad","homepage":"https://github.com/balupton/bootstrap.docpad","keywords":["twitter","bootstrap","website","docpad","theme"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/bootstrap.docpad/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/bootstrap.docpad.git"},"dependencies":{"coffee-script":">=1.1.2","express":">=2.4.6","docpad":">=1.1.0","buildr":">=0.8.0"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/balupton/.npm/bootstrap.docpad/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":true},"_id":"bootstrap.docpad@0.2.0","scripts":{"start":"node server.js"},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"21719496adad3fcb4780de2d462788d718dbb686","tarball":"http://registry.npmjs.org/bootstrap.docpad/-/bootstrap.docpad-0.2.0.tgz"}}},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"time":{"modified":"2011-09-28T10:40:04.420Z","created":"2011-09-28T10:39:56.125Z","0.2.0":"2011-09-28T10:40:04.420Z"},"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"repository":{"type":"git","url":"git://github.com/balupton/bootstrap.docpad.git"},"_attachments":{"bootstrap.docpad-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4D9cckBV7NnDzxy617Isfw==","length":296453,"stub":true}}}},
{"id":"bootstrapify","key":"bootstrapify","value":{"rev":"3-e408eb159d37fc00b3f51343a76bc8cc"},"doc":{"_id":"bootstrapify","_rev":"3-e408eb159d37fc00b3f51343a76bc8cc","name":"bootstrapify","description":"Bootstrap npm module","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bootstrapify","description":"Bootstrap npm module","version":"0.0.1","repository":{"type":"git","url":"git://github.com/arnklint/bootstrapify.git"},"author":{"name":"Jonas Arnklint","email":"jonas.a@revrise.com"},"engines":{"node":"*"},"main":"./index.js","_npmUser":{"name":"arnklint","email":"jonas.a@revrise.com"},"_id":"bootstrapify@0.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"db19fb535cc4ea3485567ced5df8fa72f0c693fb","tarball":"http://registry.npmjs.org/bootstrapify/-/bootstrapify-0.0.1.tgz"},"readme":"","maintainers":[{"name":"arnklint","email":"jonas.a@revrise.com"}]}},"readme":"","maintainers":[{"name":"arnklint","email":"jonas.a@revrise.com"}],"time":{"modified":"2012-02-02T21:21:08.490Z","created":"2012-02-02T21:21:05.024Z","0.0.1":"2012-02-02T21:21:08.490Z"},"author":{"name":"Jonas Arnklint","email":"jonas.a@revrise.com"},"repository":{"type":"git","url":"git://github.com/arnklint/bootstrapify.git"},"_attachments":{"bootstrapify-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dE7e8QylIyejhWvH1bQffA==","length":8827,"stub":true}}}},
{"id":"bootstrapjs","key":"bootstrapjs","value":{"rev":"3-8743d82239a5573b4b71f552f5f9c2d3"},"doc":{"_id":"bootstrapjs","_rev":"3-8743d82239a5573b4b71f552f5f9c2d3","name":"bootstrapjs","description":"Bootstrap JS for Node","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"author":{"name":"Jim Hoskins","email":"jim@jimhoskins.com","url":"http://jimhoskins.com"},"name":"bootstrapjs","description":"Bootstrap JS for Node","version":"2.0.0","homepage":"http://github.com/jimrhoskins/bootstrapjs","repository":{"type":"git","url":"git://github.com/jimrhoskins/bootstrapjs.git"},"main":"index.js","engines":{"node":"~0.6.10"},"dependencies":{"jqueryify":"*"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"jimrhoskins","email":"jim@jimhoskins.com"},"_id":"bootstrapjs@2.0.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2157f89ec1feaab9dc448efefc13fcb6c96f6897","tarball":"http://registry.npmjs.org/bootstrapjs/-/bootstrapjs-2.0.0.tgz"},"maintainers":[{"name":"jimrhoskins","email":"jim@jimhoskins.com"}]}},"readme":"# BootstrapJS\nBootstrapJS is a port of the [Bootstrap JS](http://bootstrap.io) JavaScript\nlibrary for use with [jqueryify](http://github.com/maccman/jqueryify).\n\n\n## 2.0 BOOTSTRAP JS PHILOSOPHY\nThese are the high-level design rules which guide the development of Bootstrap's plugin apis.\n\n---\n\n### DATA-ATTRIBUTE API\n\nWe believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript.\n\nWe acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:\n\n    $('body').off('.data-api')\n\nTo target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:\n\n    $('body').off('.alert.data-api')\n\n---\n\n### PROGRAMATIC API\n\nWe also believe you should be able to use all plugins provided by Bootstrap purely through the JS API.\n\nAll public APIs should be single, chainable methods, and return the collection acted upon.\n\n    $(\".btn.danger\").button(\"toggle\").addClass(\"fat\")\n\nAll methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:\n\n    $(\"#myModal\").modal() // initialized with defaults\n    $(\"#myModal\").modal({ keyboard: false }) // initialized with now keyboard\n    $(\"#myModal\").modal('show') // initializes and invokes show immediately afterqwe2\n\n---\n\n### OPTIONS\n\nOptions should be sparse and add universal value. We should pick the right defaults.\n\nAll plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`.\n\n    $.fn.modal.defaults = { … }\n\nAn options definition should take the following form:\n\n    *noun*: *adjective* - describes or modifies a quality of an instance\n\nexamples:\n\n    backdrop: true\n    keyboard: false\n    placement: 'top'\n\n---\n\n### EVENTS\n\nAll events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action.\n\n    show | shown\n    hide | hidden\n\n---\n\n### CONSTRUCTORS\n\nEach plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way:\n\n\n    $.fn.popover.Constructor\n\n---\n\n### DATA ACCESSOR\n\nEach plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this:\n\n    $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor\n\n---\n\n### DATA ATTRIBUTES\n\nData attributes should take the following form:\n\n- data-{{verb}}={{plugin}} - defines main interaction\n- data-target || href^=# - defined on \"control\" element (if element controls an element other than self)\n- data-{{noun}} - defines class instance options\n\nexamples:\n\n    // control other targets\n    data-toggle=\"modal\" data-target=\"#foo\"\n    data-toggle=\"collapse\" data-target=\"#foo\" data-parent=\"#bar\"\n\n    // defined on element they control\n    data-spy=\"scroll\"\n\n    data-dismiss=\"modal\"\n    data-dismiss=\"alert\"\n\n    data-toggle=\"dropdown\"\n\n    data-toggle=\"button\"\n    data-toggle=\"buttons-checkbox\"\n    data-toggle=\"buttons-radio\"\n","maintainers":[{"name":"jimrhoskins","email":"jim@jimhoskins.com"}],"time":{"modified":"2012-02-24T16:22:53.561Z","created":"2012-02-24T16:22:53.151Z","2.0.0":"2012-02-24T16:22:53.561Z"},"author":{"name":"Jim Hoskins","email":"jim@jimhoskins.com","url":"http://jimhoskins.com"},"repository":{"type":"git","url":"git://github.com/jimrhoskins/bootstrapjs.git"},"_attachments":{"bootstrapjs-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kwLMPVWKCzZwnrj3VTfXWw==","length":11013,"stub":true}}}},
{"id":"bootstrapped-socket-express","key":"bootstrapped-socket-express","value":{"rev":"5-922ff8a95f339a941d9c86d80b4c1eea"},"doc":{"_id":"bootstrapped-socket-express","_rev":"5-922ff8a95f339a941d9c86d80b4c1eea","name":"bootstrapped-socket-express","description":"Node.js project template using express, Socket.IO, Bootstrap and CoffeeScript.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bootstrapped-socket-express","description":"Node.js project template using express, Socket.IO, Bootstrap and CoffeeScript.","version":"0.0.1","homepage":"https://github.com/mmozuras/bootstrapped-socket-express","author":{"name":"Mindaugas Mozūras","email":"mindaugas.mozuras@gmail.com"},"repository":{"type":"git","url":"git://github.com/mmozuras/bootstrapped-socket-express.git"},"dependencies":{"commander":"= 0.5.2","wrench":"= 1.3.8"},"engines":{"node":">= 0.6.0 < 0.7.0"},"bin":{"bootstrapped":"./bin/bootstrapped"},"keywords":["template","boilerplate","bootstrap"],"bugs":{"url":"https://github.com/mmozuras/bootstrapped-socket-express/issues"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/MIT"}],"_npmUser":{"name":"mmozuras","email":"mindaugas.mozuras@gmail.com"},"_id":"bootstrapped-socket-express@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"263cb0d9bc4805de6bbc7607c062eabf0294e16b","tarball":"http://registry.npmjs.org/bootstrapped-socket-express/-/bootstrapped-socket-express-0.0.1.tgz"},"maintainers":[{"name":"mmozuras","email":"mindaugas.mozuras@gmail.com"}]},"0.0.2":{"name":"bootstrapped-socket-express","description":"Node.js project template using express, Socket.IO, Bootstrap and CoffeeScript.","version":"0.0.2","homepage":"http://mmozuras.github.com/bootstrapped-socket-express/","author":{"name":"Mindaugas Mozūras","email":"mindaugas.mozuras@gmail.com"},"repository":{"type":"git","url":"git://github.com/mmozuras/bootstrapped-socket-express.git"},"dependencies":{"commander":"= 0.5.2","wrench":"= 1.3.8"},"engines":{"node":">= 0.6.0 < 0.7.0"},"bin":{"bootstrapped":"./bin/bootstrapped"},"keywords":["template","boilerplate","bootstrap"],"bugs":{"url":"https://github.com/mmozuras/bootstrapped-socket-express/issues"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/MIT"}],"_npmUser":{"name":"mmozuras","email":"mindaugas.mozuras@gmail.com"},"_id":"bootstrapped-socket-express@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7943120487488352a448047abbfe1c16d563bbb4","tarball":"http://registry.npmjs.org/bootstrapped-socket-express/-/bootstrapped-socket-express-0.0.2.tgz"},"maintainers":[{"name":"mmozuras","email":"mindaugas.mozuras@gmail.com"}]}},"readme":"# Bootstrapped Socket-Express\n\n[Node.js](http://nodejs.org) project template using [express](http://expressjs.com), [Socket.IO](http://socket.io), [Bootstrap](http://twitter.github.com/bootstrap) and [CoffeeScript](http://coffeescript.org).\n\n## Modules\n\nThis template uses:\n\n* [CoffeeScript](http://coffeescript.org/)\n* [express](http://expressjs.com/)\n* [Socket.IO](http://socket.io/)\n* [Bootstrap](http://twitter.github.com/bootstrap/)\n* [jade](http://jade-lang.com/)\n* [Stylus](http://learnboost.github.com/stylus/)\n* [connect-assets](https://github.com/TrevorBurnham/connect-assets)\n\nFor development it also includes:\n\n* [mocha](http://visionmedia.github.com/mocha/)\n* [should](https://github.com/visionmedia/should.js)\n\n## Getting Started\n\nYou can either clone this repository and copy the provided template, or:\n\n    npm install -g bootstrapped-socket-express\n    bootstrapped new your_app_name\n\nTo run it for the first time:\n\n    cd your_app_name\n    npm install\n    node server.js\n\n## License\n\nMIT - see LICENSE for more.\n","maintainers":[{"name":"mmozuras","email":"mindaugas.mozuras@gmail.com"}],"time":{"modified":"2012-04-09T09:35:09.338Z","created":"2012-04-01T18:49:24.742Z","0.0.1":"2012-04-01T18:49:27.327Z","0.0.2":"2012-04-09T09:35:09.338Z"},"author":{"name":"Mindaugas Mozūras","email":"mindaugas.mozuras@gmail.com"},"repository":{"type":"git","url":"git://github.com/mmozuras/bootstrapped-socket-express.git"},"_attachments":{"bootstrapped-socket-express-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2hx4UBCuwKxrC+67kJ72LA==","length":112640,"stub":true},"bootstrapped-socket-express-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-zC4EzYFp7QdxwKb1RhzSyg==","length":112640,"stub":true}}}},
{"id":"bootstrapper","key":"bootstrapper","value":{"rev":"11-edc74b0b33649c09441f627811584cac"},"doc":{"_id":"bootstrapper","_rev":"11-edc74b0b33649c09441f627811584cac","name":"bootstrapper","description":"Handy Node.js command line application to manage templates and boilerplates.","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"author":{"name":"Massimiliano Marcon","url":"http://marcon.me"},"name":"bootstrapper","description":"Handy Node.js command line application to manage templates and boilerplates.","version":"0.0.1","repository":{"type":"git","url":"git://github.com/mmarcon/Bootstrapper.git"},"dependencies":{"wrench":"1.3.8"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"bootstrapper":"./bin/bootstrapper"},"main":"index","_npmUser":{"name":"mmarcon","email":"emaildelmax@gmail.com"},"_id":"bootstrapper@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"bc579ff41d4932cc850feacfc5578397fcbb7ce1","tarball":"http://registry.npmjs.org/bootstrapper/-/bootstrapper-0.0.1.tgz"},"maintainers":[{"name":"mmarcon","email":"emaildelmax@gmail.com"}]},"0.1.0":{"author":{"name":"Massimiliano Marcon","url":"http://marcon.me"},"name":"bootstrapper","description":"Handy Node.js command line application to manage templates and boilerplates.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/mmarcon/Bootstrapper.git"},"dependencies":{"wrench":"1.3.8","request":"2.9.202"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"bootstrapper":"./bin/bootstrapper"},"main":"index","_npmUser":{"name":"mmarcon","email":"emaildelmax@gmail.com"},"_id":"bootstrapper@0.1.0","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9ec033dbe060b2fd460f0cfe9834db6c5ece6140","tarball":"http://registry.npmjs.org/bootstrapper/-/bootstrapper-0.1.0.tgz"},"maintainers":[{"name":"mmarcon","email":"emaildelmax@gmail.com"}]},"0.1.1":{"author":{"name":"Massimiliano Marcon","url":"http://marcon.me"},"name":"bootstrapper","description":"Handy Node.js command line application to manage templates and boilerplates.","version":"0.1.1","repository":{"type":"git","url":"git://github.com/mmarcon/Bootstrapper.git"},"dependencies":{"wrench":"1.3.8","request":"2.9.202"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"bootstrapper":"./bin/bootstrapper"},"main":"index","_npmUser":{"name":"mmarcon","email":"emaildelmax@gmail.com"},"_id":"bootstrapper@0.1.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d8bd092d964224a9b6413b4b5b58777eb16fc080","tarball":"http://registry.npmjs.org/bootstrapper/-/bootstrapper-0.1.1.tgz"},"maintainers":[{"name":"mmarcon","email":"emaildelmax@gmail.com"}]},"0.1.2":{"author":{"name":"Massimiliano Marcon","url":"http://marcon.me"},"name":"bootstrapper","description":"Handy Node.js command line application to manage templates and boilerplates.","version":"0.1.2","repository":{"type":"git","url":"git://github.com/mmarcon/Bootstrapper.git"},"dependencies":{"wrench":"1.3.8","request":"2.9.202"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"bootstrapper":"./bin/bootstrapper"},"main":"index","_npmUser":{"name":"mmarcon","email":"emaildelmax@gmail.com"},"_id":"bootstrapper@0.1.2","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"741645805c8327c8d887f54fc127af3444ee06fc","tarball":"http://registry.npmjs.org/bootstrapper/-/bootstrapper-0.1.2.tgz"},"maintainers":[{"name":"mmarcon","email":"emaildelmax@gmail.com"}]},"0.1.3":{"author":{"name":"Massimiliano Marcon","url":"http://marcon.me"},"name":"bootstrapper","description":"Handy Node.js command line application to manage templates and boilerplates.","version":"0.1.3","repository":{"type":"git","url":"git://github.com/mmarcon/Bootstrapper.git"},"dependencies":{"wrench":"1.3.8","request":"2.9.202"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"bin":{"bootstrapper":"./bin/bootstrapper"},"main":"index","_npmUser":{"name":"mmarcon","email":"emaildelmax@gmail.com"},"_id":"bootstrapper@0.1.3","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"05a0bff37728512913d3ca1b37dfd9cd0a424915","tarball":"http://registry.npmjs.org/bootstrapper/-/bootstrapper-0.1.3.tgz"},"maintainers":[{"name":"mmarcon","email":"emaildelmax@gmail.com"}]}},"readme":"# Bootstrapper\n\nBootstrapper is handy Node.js command line application to manage templates and boilerplates.\n\nBootstrapper stores user-defined templates in its template folder where they are always available every time they are needed.\n\n## How to\n\nThe semantic of the tool is very simple.\n\nShow help information:\n\n    mmarcon@wallace$ bootstrapper help\n    \nList all the available templates:\n\n    mmarcon@wallace$ bootstrapper list\n    * Just another template [My new test template for bootstrapper,  Created by Massimiliano Marcon on 14/04/2012]\n    * My new test template [Hello,  Created by mmarcon on 14/04/2012]\n    * Nokia Maps boilerplate app [A boilerplate to build a map-based application using the Nokia Maps API,  Created by Massimiliano Marcon on 14/04/2012]\n    \nCreate an empty template (the tool requests some information on the new template):\n\n    mmarcon@wallace$ bootstrapper generate\n    \nAdd a template to the template database:\n\n    mmarcon@wallace$ bootstrapper add path/to/template_directory\n    \nRemove a template from the template database:\n\n    mmarcon@wallace$ bootstrapper remove \"Template Name\"\n   \nUse a template (creates a new folder containing the template files):\n    \n    mmarcon@wallace$ bootstrapper use\n    \n## Details\nBootstrapper stores all the data into `$HOME/.bootstrapper`.\n\nThe directory contains a `log` folder (currently unused) and a `templates` folder where all the templates are stored. The structure of a template is very simple:\n\n    - template_name_lowercase\n       |- template.json\n       |- some_other_template.file\n       |- some_subfolder\n       \n`template.json` is just a little JSON file that contains name, description, author and creation date for the template.","maintainers":[{"name":"mmarcon","email":"emaildelmax@gmail.com"}],"time":{"modified":"2012-07-13T08:46:58.896Z","created":"2012-04-15T13:50:47.010Z","0.0.1":"2012-04-15T13:50:50.442Z","0.1.0":"2012-04-17T06:05:02.608Z","0.1.1":"2012-04-19T07:10:58.705Z","0.1.2":"2012-04-22T15:25:13.698Z","0.1.3":"2012-07-13T08:46:58.896Z"},"author":{"name":"Massimiliano Marcon","url":"http://marcon.me"},"repository":{"type":"git","url":"git://github.com/mmarcon/Bootstrapper.git"},"_attachments":{"bootstrapper-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0t4EyHTGkQpdVU38pQaicA==","length":5096,"stub":true},"bootstrapper-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RmTAxCMD8w0XwdcfCU+NEA==","length":4356,"stub":true},"bootstrapper-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-X0inGE4Xb2EDSNjBCLuHCw==","length":4232,"stub":true},"bootstrapper-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pslGQDEBp15y0/xovECRaw==","length":4138,"stub":true},"bootstrapper-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Q2XVCnR25lQiFvrDTDHkXQ==","length":3375,"stub":true}}}},
{"id":"bootstylus","key":"bootstylus","value":{"rev":"5-744e72da29a92920f27a99d36604a64e"},"doc":{"_id":"bootstylus","_rev":"5-744e72da29a92920f27a99d36604a64e","name":"bootstylus","description":"Twitter Bootstrap using Stylus instead of the default Less.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"edmellum.com"},"name":"bootstylus","description":"Twitter Bootstrap using Stylus instead of the default Less.","version":"0.1.0","repository":{"type":"git","url":"github.com/edmellum/bootstylus.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"bootstylus@0.1.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"1a015dac3769f2a2f2821eaec9c7c3cae5e09046","tarball":"http://registry.npmjs.org/bootstylus/-/bootstylus-0.1.0.tgz"},"maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.2.0":{"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"edmellum.com"},"name":"bootstylus","description":"Twitter Bootstrap using Stylus instead of the default Less.","version":"0.2.0","repository":{"type":"git","url":"github.com/edmellum/bootstylus.git"},"bugs":{"url":"http://github.com/edmellum/bootstylus/issues"},"licenses":[{"type":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"bootstylus@0.2.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3e698bb0de3892673b531503d6142b7f85513d3a","tarball":"http://registry.npmjs.org/bootstylus/-/bootstylus-0.2.0.tgz"},"maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]}},"readme":"Bootstylus\n=================\n\nA port of [Twitter Bootstrap](http://twitter.github.com/bootstrap) from Less to Stylus.\n\n\nInstallation\n------------\n`$ npm install bootstylus`\n\n\nJavaScript API\n--------------\n\nWith a connect compatible framework, like express:\n```javascript\nvar connect = require('connect')\n  , stylus = require('stylus')\n  , bootstrap = require('bootstylus');\n\nvar server = connect();\n\nfunction compile(str, path) {\n  return stylus(str)\n    .set('filename', path)\n    .set('compress', true)\n    .use(nib());\n}\n\nserver.use(stylus.middleware({\n    src: __dirname\n  , compile: compile\n}));\n```\n\n\nStylus API\n----------\nTo get everything(except the responsive grid)\n`@import 'bootstylus'`\nUsing individual parts:\n`@import 'bootstylus/grid'\nIf you need the responsive grid:\n`@import 'bootstylus/responsive'\n\n\nTodo\n----\n- Use Nib for gradients and the like\n- Get rid of Stylus warnings\n- Clean up the Less to Stylus converter\n\n\nCopyright and license\n---------------------\n\nCopyright 2012 Twitter, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this work except in compliance with the License.\nYou may obtain a copy of the License in the LICENSE file, or at:\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","maintainers":[{"name":"edmellum","email":"david@edmellum.com"}],"time":{"modified":"2012-04-21T14:54:45.953Z","created":"2012-04-21T14:46:21.501Z","0.1.0":"2012-04-21T14:46:23.825Z","0.2.0":"2012-04-21T14:54:45.953Z"},"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"edmellum.com"},"repository":{"type":"git","url":"github.com/edmellum/bootstylus.git"},"_attachments":{"bootstylus-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-m1PLZaTrTyK2RbrSLcn2Kg==","length":29658,"stub":true},"bootstylus-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iHFqNlVqPg8EgKWWdLmCiA==","length":29621,"stub":true}}}},
{"id":"bootware","key":"bootware","value":{"rev":"5-8604c1f24c2928b4bfc542b344de5aa3"},"doc":{"_id":"bootware","_rev":"5-8604c1f24c2928b4bfc542b344de5aa3","name":"bootware","description":"Drop Bootstrap builds into your Node.js app. Just provide a git:// url and you're all set.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Ritchie Martori"},"name":"bootware","version":"0.1.0","repository":{"type":"git","url":"git@github.com:ritch/bootware.git"},"engines":{"node":">= 0.6.x"},"main":"index","dependencies":{},"devDependencies":{},"description":"Drop Bootstrap builds into your Node.js app. Just provide a git:// url and you're all set.","_npmUser":{"name":"ritch","email":"skawful@gmail.com"},"_id":"bootware@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8791f99bf88a9846af39bf9dabb15503bac808db","tarball":"http://registry.npmjs.org/bootware/-/bootware-0.1.0.tgz"},"maintainers":[{"name":"ritch","email":"skawful@gmail.com"}]},"0.1.1":{"author":{"name":"Ritchie Martori"},"name":"bootware","version":"0.1.1","repository":{"type":"git","url":"git@github.com:ritch/bootware.git"},"engines":{"node":">= 0.6.0"},"main":"index","dependencies":{"connect":">= 1.8.0"},"devDependencies":{},"description":"Drop Bootstrap builds into your Node.js app. Just provide a git:// url and you're all set.","_npmUser":{"name":"ritch","email":"skawful@gmail.com"},"_id":"bootware@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3f7779554e823e72a67673c6d848dd501c87ba49","tarball":"http://registry.npmjs.org/bootware/-/bootware-0.1.1.tgz"},"maintainers":[{"name":"ritch","email":"skawful@gmail.com"}]}},"readme":"# bootware\n\nDrop [Bootstrap](http://twitter.github.com/bootstrap/) builds into your Node.js app. Just provide a `git://` url and you're all set.\n\n## Installation\n\n    npm install bootware\n\n## Examples\n\nBy default **bootware** will `git pull` the master [Bootstrap](http://twitter.github.com/bootstrap/) repo into `/tmp/<unique tag>`.\n\n    var express = require('express')\n      , bootware = require('bootware')\n    ;\n\n    app\n      .use(bootware())\n      .listen(3000)\n    ;\n\nYou can then reference a built version of Bootstrap like so:\n\n    <link href=\"/bootstrap/css/bootstrap.css\" rel=\"stylesheet\">\n    <link href=\"/bootstrap/css/bootstrap-responsive.css\" rel=\"stylesheet\">\n\n### Local Development\n\nIf you are building your own fork or version of bootstrap you can point **bootware** at its local path.\n\n    var express = require('express')\n      , bootware = require('bootware')\n    ;\n\n    app\n      .use(bootware({path: '~/Projects/my-bootstrap'}))\n      .listen(3000)\n    ;\n\nIf a local path is provided **bootware** will use `cp` instead of `git` to pull in the built version of bootstrap.\nThis makes it very easy to customize bootstrap in another directory while developing without having to commit files every time they change.\n\n## Best Practices\n\n### Repo\n\nThe intended use case for **bootware** is to fork bootstrap and modify it to suite your individual project needs.\nThen pull it into any given site by referencing the fork's `git://` url.\n\n    bootware({path: 'git://github.com/deployd/bootstrap.git'})\n\nThis means you will only ever have one version of your ui-kit (bootstrap) instead of building and migrating builds\ninto various projects or managing `git submodules`.\n\n### Versioning\n\nSometimes you may want to prevent an app from getting the latest version of bootstrap. In this case provide a tag or branch.\n\n    bootware({checkout: 'v2.0.1'}) // tag\n    \nor\n\n    bootware({checkout: 'my-branch'}) // branch\n\n\n    \n\n","maintainers":[{"name":"ritch","email":"skawful@gmail.com"}],"time":{"modified":"2012-02-20T21:13:02.790Z","created":"2012-02-20T20:49:47.227Z","0.1.0":"2012-02-20T20:49:48.727Z","0.1.1":"2012-02-20T21:13:02.790Z"},"author":{"name":"Ritchie Martori"},"repository":{"type":"git","url":"git@github.com:ritch/bootware.git"},"_attachments":{"bootware-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Dx/2Z7EyOVMM8jNHUf8Cpg==","length":20480,"stub":true},"bootware-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a69MwHQ1p5F3+MugF1RP6Q==","length":20480,"stub":true}}}},
{"id":"borges","key":"borges","value":{"rev":"5-a8ef0afe783c32bae66c2f9340c71dc6"},"doc":{"_id":"borges","_rev":"5-a8ef0afe783c32bae66c2f9340c71dc6","name":"borges","description":"Manage lists through a redis-like interface","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"borges","version":"0.1.0","url":"http://www.unifiedapplications.com/github/Borges","description":"Manage lists through a redis-like interface","keywords":["redis","javascript","nodejs","lists","list"],"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"main":"borges","engines":{"node":">= 0.6.1"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Borges.git"},"_npmUser":{"name":"sandropasquali","email":"spasquali@gmail.com"},"_id":"borges@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"36aa8c4b780694085e0688d5f3f7ee0192d2c07e","tarball":"http://registry.npmjs.org/borges/-/borges-0.1.0.tgz"},"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}]},"0.1.1":{"name":"borges","version":"0.1.1","url":"http://www.unifiedapplications.com/github/Borges","description":"Manage lists through a redis-like interface","keywords":["redis","javascript","nodejs","lists","list","data","data structures"],"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"main":"borges","engines":{"node":">= 0.6.1"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Borges.git"},"_npmUser":{"name":"sandropasquali","email":"spasquali@gmail.com"},"_id":"borges@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"e83178c3016e995408534fb98393db6827d9528e","tarball":"http://registry.npmjs.org/borges/-/borges-0.1.1.tgz"},"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}]}},"readme":null,"maintainers":[{"name":"sandropasquali","email":"spasquali@gmail.com"}],"time":{"modified":"2012-01-29T21:50:49.191Z","created":"2012-01-29T21:45:24.175Z","0.1.0":"2012-01-29T21:45:24.792Z","0.1.1":"2012-01-29T21:50:49.191Z"},"author":{"name":"Sandro Pasquali","email":"spasquali@gmail.com"},"repository":{"type":"git","url":"git://github.com/sandro-pasquali/Borges.git"},"_attachments":{"borges-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mYnHtkwqJrRWi9V70bul1w==","length":4436,"stub":true},"borges-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-g7AzqDXLoThkR6xYbW3J+g==","length":4399,"stub":true}}}},
{"id":"bork","key":"bork","value":{"rev":"5-8f0486ae06cc863a73ff6f27e01e8928"},"doc":{"_id":"bork","_rev":"5-8f0486ae06cc863a73ff6f27e01e8928","name":"bork","description":"A simple task queuing library, and pet project of the owner.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"bork","version":"0.0.2","description":"A simple task queuing library, and pet project of the owner.","keywords":["asynchronous","chain","sequence","sequential","parallel"],"author":{"name":"leeolayvar","email":"leeolayvar@gmail.com","url":"http://leeolayvar.com"},"repository":{"type":"git","url":"git://github.com/leeolayvar/bork.git"},"bugs":{"url":"http://github.com/leeolayvar/bork/issues"},"scripts":{"prepublish":"cake prepublish","test":"cake test:all"},"devDependencies":{"mocha":"0.14.x","should":"0.5.x","coffee-script":"1.3.x"},"engine":"node","main":"./build/lib/index.js","licenses":[{"type":"MIT","url":"https://raw.github.com/leeolayvar/bork/master/LICENSE"}],"_npmUser":{"name":"leeolayvar@gmail.com","email":"leeolayvar@gmail.com"},"_id":"bork@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"61f2aec1c0a84c4511a0b2af9a3d945b5381f3cd","tarball":"http://registry.npmjs.org/bork/-/bork-0.0.2.tgz"},"maintainers":[{"name":"leeolayvar@gmail.com","email":"leeolayvar@gmail.com"}]},"0.0.3":{"name":"bork","version":"0.0.3","description":"A simple task queuing library, and pet project of the owner.","keywords":["asynchronous","chain","sequence","sequential","parallel"],"author":{"name":"leeolayvar","email":"leeolayvar@gmail.com","url":"http://leeolayvar.com"},"repository":{"type":"git","url":"git://github.com/leeolayvar/bork.git"},"bugs":{"url":"http://github.com/leeolayvar/bork/issues"},"scripts":{"prepublish":"cake prepublish","test":"cake test:all"},"devDependencies":{"mocha":"0.14.x","should":"0.5.x","coffee-script":"1.3.x","bork":"0.0.x"},"engine":"node","main":"./build/lib/index.js","licenses":[{"type":"MIT","url":"https://raw.github.com/leeolayvar/bork/master/LICENSE"}],"_npmUser":{"name":"leeolayvar@gmail.com","email":"leeolayvar@gmail.com"},"_id":"bork@0.0.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c944f62294177e3073edd73e256110284a5ee74b","tarball":"http://registry.npmjs.org/bork/-/bork-0.0.3.tgz"},"maintainers":[{"name":"leeolayvar@gmail.com","email":"leeolayvar@gmail.com"}]}},"readme":"\r\n# Bork.js\r\n\r\nTurn away, dragons ahead.","maintainers":[{"name":"leeolayvar@gmail.com","email":"leeolayvar@gmail.com"}],"time":{"modified":"2012-06-29T00:33:10.495Z","created":"2012-06-28T17:35:29.551Z","0.0.2":"2012-06-28T17:35:32.549Z","0.0.3":"2012-06-29T00:33:10.495Z"},"author":{"name":"leeolayvar","email":"leeolayvar@gmail.com","url":"http://leeolayvar.com"},"repository":{"type":"git","url":"git://github.com/leeolayvar/bork.git"},"_attachments":{"bork-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KNHU4BsDeADIaXx6B2nL6g==","length":7410,"stub":true},"bork-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KiS4T+6nEmTlLfHIsXKY1A==","length":7447,"stub":true}}}},
{"id":"borschik","key":"borschik","value":{"rev":"35-ded6f8b5ffdc248ccf8d611a00e78fdb"},"doc":{"_id":"borschik","_rev":"35-ded6f8b5ffdc248ccf8d611a00e78fdb","name":"borschik","description":"Extendable builder for text-based file formats","dist-tags":{"latest":"0.0.11"},"versions":{"0.0.1":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.1","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":">= 0.0.1"},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"borschik@0.0.1","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.11","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e472f1a848eea3f4e04267777a005ba018b62a0b","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.1.tgz"}},"0.0.2":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.2","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":">= 0.0.1"},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"borschik@0.0.2","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.11","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cee6bc7ce44c844d632d12104067aa03bebd5124","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.2.tgz"}},"0.0.3":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.3","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":">= 0.0.6","node-inherit":">= 1.0.0","cssp":">= 1.0.0"},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_id":"borschik@0.0.3","_engineSupported":true,"_npmVersion":"0.3.16","_nodeVersion":"v0.4.11","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c84604886864b5c4c81e0b8d101008ee4606d38e","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.3.tgz"}},"0.0.4":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.4","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.2.x","inherit":"1.0.x","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"borschik@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"569d7e775a28b4b2b8a7c82e9293dd6ab2703500","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.4.tgz"}},"0.0.5":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.5","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"borschik@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"268e8b424eac8cd5046ef5baabc7654215a078d3","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.5.tgz"},"readme":"# Borschik\n\nBorschik is a extendable builder for text-based file formats.\nIt's main purpose is the assembly of static files for web projects (CSS, JS, etc.).\n"},"0.0.6":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.6","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"borschik@0.0.6","_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9911f42a2c05f4d50f8cfaf79792d0289df8bd8b","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.6.tgz"},"readme":"# Borschik\n\nBorschik is a extendable builder for text-based file formats.\nIt's main purpose is the assembly of static files for web projects (CSS, JS, etc.).\n"},"0.0.7":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.7","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"scf","email":"scf2k@yandex.ru"},"_id":"borschik@0.0.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5f06d544ff3e980f263d36dae0b639962a8d76dc","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.7.tgz"}},"0.0.8":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.8","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"scf","email":"scf2k@yandex.ru"},"_id":"borschik@0.0.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6dd668563ca51657566dfb74b001571aa51fb0d2","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.8.tgz"}},"0.0.9":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.9","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","q":"~0.8.2","q-fs":"0.1","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"borschik@0.0.9","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"927bb57083f033995fb28ed5c012036692b8c8d8","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.9.tgz"},"readme":"# Borschik\n\nBorschik is a extendable builder for text-based file formats.\nIt's main purpose is the assembly of static files for web projects (CSS, JS, etc.).\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->"},"0.0.10":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.10","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","q":"~0.8.2","q-fs":"0.1","cssp":"1.0.x"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"scf","email":"scf2k@yandex.ru"},"_id":"borschik@0.0.10","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"37f8339546439cd87f14c9907be62e2dc62e3926","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.10.tgz"}},"0.0.11":{"name":"borschik","description":"Extendable builder for text-based file formats","version":"0.0.11","homepage":"http://github.com/veged/borschik","author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"directories":{"lib":"./lib"},"main":"./lib/borschik.js","bin":{"borschik":"./bin/borschik"},"dependencies":{"coa":"0.3.x","inherit":"1.0.x","q":"~0.8.2","q-fs":"0.1","cssp":"~1.0.5"},"devDependencies":{"ometajs":"2.1.x"},"engines":["node >= 0.4.0"],"licenses":[{"type":"AS IS"}],"optionalDependencies":{},"_npmUser":{"name":"arikon","email":"peimei@ya.ru"},"_id":"borschik@0.0.11","_engineSupported":true,"_npmVersion":"1.1.25","_nodeVersion":"v0.6.20","_defaultsLoaded":true,"dist":{"shasum":"ce5a63594f198667b792f6f9fe4af6ef940a519b","tarball":"http://registry.npmjs.org/borschik/-/borschik-0.0.11.tgz"},"readme":"# Borschik\n\nBorschik is a extendable builder for text-based file formats.\nIt's main purpose is the assembly of static files for web projects (CSS, JS, etc.).\n\n<!-- Yandex.Metrika counter -->\n<img src=\"//mc.yandex.ru/watch/12831025\" style=\"position:absolute; left:-9999px;\" alt=\"\" />\n<!-- /Yandex.Metrika counter -->"}},"maintainers":[{"name":"veged","email":"veged@mail.ru"},{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},{"name":"arikon","email":"peimei@ya.ru"},{"name":"scf","email":"scf2k@yandex.ru"}],"time":{"modified":"2012-08-06T16:26:18.647Z","created":"2011-09-05T01:58:08.398Z","0.0.1":"2011-09-05T01:58:08.875Z","0.0.2":"2011-09-18T01:45:09.596Z","0.0.3":"2011-09-18T11:04:09.606Z","0.0.4":"2011-12-13T17:50:24.862Z","0.0.5":"2012-02-12T19:41:05.803Z","0.0.6":"2012-02-29T10:15:31.112Z","0.0.7":"2012-03-02T14:47:16.009Z","0.1.0":"2012-05-03T13:54:50.790Z","0.0.8":"2012-05-03T14:11:27.860Z","0.0.9":"2012-05-18T15:10:35.452Z","0.0.10":"2012-06-07T12:09:37.550Z","0.0.11":"2012-08-06T16:26:18.647Z"},"author":{"name":"Sergey Berezhnoy","email":"veged@ya.ru","url":"http://github.com/veged"},"repository":{"type":"git","url":"git://github.com/veged/borschik.git"},"_attachments":{"borschik-0.0.11.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-5IaKC+3Pe+apdihaE69VAQ==","length":8161,"stub":true},"borschik-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-mX+bVrGKwn5UjSzBKbYYTw==","length":10240,"stub":true},"borschik-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-ZdxWLEoAw3qTqdJ4ZNiSGg==","length":8395,"stub":true},"borschik-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-xulQocgRd3i7Tl1XP7KhNQ==","length":20480,"stub":true},"borschik-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-JM5hpFMbanjJzw3Dn6qn7g==","length":20480,"stub":true},"borschik-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-+1Skhf1aIaPMMsdRZkzuoA==","length":6283,"stub":true},"borschik-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IrhsKvqYAXEmJtSAPc/uoA==","length":6225,"stub":true},"borschik-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0VPvDrLf08S7b33l53zy3A==","length":10240,"stub":true},"borschik-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0DzO2xrz2C+ucjRM1fIeTQ==","length":4120,"stub":true},"borschik-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SNMlNV5RIOdLJjKwCkbDkw==","length":4101,"stub":true},"borschik-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ODKUjIDsqLmz0iCPvGGqYg==","length":4053,"stub":true}}}},
{"id":"boss","key":"boss","value":{"rev":"3-f495fe731e23e6f51faf2f3570fae263"},"doc":{"_id":"boss","_rev":"3-f495fe731e23e6f51faf2f3570fae263","name":"boss","description":"Boss provides a task queue constructor which runs asynchronous functions in serial.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"boss","version":"0.1.0","description":"Boss provides a task queue constructor which runs asynchronous functions in serial.","_npmUser":{"name":"kixxauth","email":"kris@kixx.name"},"_id":"boss@0.1.0","contributors":[{"name":"Kris Walker","email":"kris@kixx.name","url":"http://www.kixx.name"}],"dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"3947b7b239ab2beb1feec010642b26e58453b18c","tarball":"http://registry.npmjs.org/boss/-/boss-0.1.0.tgz"},"maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}]}},"readme":"BOSS\n====\n\n**Tell your JavaScript functions what to do.**\n\nBoss provides a task queue constructor which runs an array of asynchronous functions in serial.\n\nThis is cool for test, build, and deployment scripts as well as simplifying complex serial operations in your JavaScript programs.\n\nInstallation\n------------\n\nInstallation in Node.js is pretty easy if you have [npm](https://github.com/isaacs/npm) installed.\n\n    npm install boss\n\nAnd then in your program do\n\n    var STACK = require('boss/stack');\n\n**OR**\n\nyou could just clone this repo and drop it into a location of your choosing and then do\n\n    var STACK = require('./path/to/boss/stack');\n\n**OR**\n\nsimply get the `stack.js` file from this repo and drop it into your `node_modules` folder and do this\n\n    var STACK = require('stack');\n\nWhatever. You got the idea.\n\nUsage\n-----\n\n*Open up docs/stack.html in your web browser for pretty documentation.*\n\n### Simple example (but kinda pointless):\n\n    // Load the module depending on how you installed it.\n    var STACK = require('boss/stack');\n\n    // Create an optional context for 'this'\n    var context = {count: 0};\n\n    // Create an Array of functions\n    var funcs = [];\n    funcs.push(function (next) {\n        this.count += 1;\n        next();\n    });\n    funcs.push(function (next) {\n        this.foo = 'bar';\n        next();\n    });\n\n    // Create the stack\n    var stack = STACK.createStack(funcs, context);\n\n    // Run the stack, passing it a callback. The callback will only be called\n    // if each function in the stack calls next().\n    stack(function (err) {\n        console.log(this.count); // Will be 1\n        console.log(this.foo); // Will be 'bar'\n    });\n\n### Async example (more useful)\n\n    // Load the module depending on how you installed it.\n    var STACK = require('boss/stack');\n\n    // Benchmark\n    var startTime = new Date().getTime();\n    console.log('startTime', startTime);\n\n    // Create an optional context for 'this'\n    var context = {count: 0};\n\n    // Create an Array of functions\n    var funcs = [];\n    funcs.push(function (next) {\n        self = this;\n\n        setTimeout(function () {\n            self.count += 1;\n        }, 1000);\n\n        console.log(new Date().getTime()); // Will print time close to or equal to startTime\n    });\n\n    // This funciton will not be executed until the previous one calls next()\n    funcs.push(function (next) {\n        console.log(\"CheckPoint\", new Date().getTime()); // Will print ~ startTime + 1000\n        console.log(this.count) // Will print 1\n        next();\n    });\n\n    // Create the stack\n    var stack = STACK.createStack(funcs, context);\n\n    // Run the stack, passing it a callback.\n    // The callback will not be invoked until the last function in the stack\n    // calls next(). The callback will be invoked once, and only once as long as\n    // each function in the stack calls next() at some point.\n    stack(function (err) {\n        console.log(\"Done\", this.count); // Will be 'Done 1'\n    });\n\n### Each function in the stack is guaranteed be called in a new turn of the event loop.\n\n    // Load the module depending on how you installed it.\n    var STACK = require('boss/stack');\n\n    // Create a global counter\n    var gCount = 0;\n\n    // Create an Array of functions\n    var funcs = [];\n    funcs.push(function (next) {\n        next(); // The next function will not execute until this one is finished.\n        gCount += 1;\n    });\n    funcs.push(function (next) {\n        console.log(gCount); // Will print 1\n        next();\n    });\n\n    // Create the stack\n    var stack = STACK.createStack(funcs);\n\n    // Run the stack, passing it a callback\n    stack(function (err) {\n        console.log(\"I'm done!\");\n    });\n\n### Error handling\n\n    // Load the module depending on how you installed it.\n    var STACK = require('boss/stack');\n\n    // This example only uses one function:\n    function errorProne(next) {\n        // There are two ways to handle an error:\n\n        // 1. Pass it to next()\n        // This is how you should handle errors thrown asynchronously. In this\n        // case, the stack will immediately terminate and the callback passed\n        // to the stack will be called with the error on the next turn of the event loop.\n        setTimeout(function () {\n            try {\n                throw new Error('Async Error');\n            } catch (err) {\n                return next(err);\n            }\n        }, 11);\n\n        // 2. Throw it.\n        // The behavior is the same as passing it to next(); the stack will\n        // immediately terminate, and the callback passed to the stack will be\n        // called with the error on the next turn of the event loop.\n        throw new Error('Thrown Error');\n\n        // If you were to actually run the above code, the 'Thrown Error' would\n        // be passed to the stack callback, but not the 'Async Error'. This is\n        // because the stack terminates when an error is handled in both of\n        // these cases, and the thrown error will happen first.\n    }\n\n    // Create the stack\n    var stack = STACK.createStack([errorProne]);\n\n    // Run the stack, passing it a callback\n    stack(function (err) {\n        if (err) {\n            console.log(err); // Will print the Error\n        }\n    });\n\nRoadmap\n-------\n\nMaybe add constructors for 'Dict' and 'List' objects which would provide a \"bottom up\" way to run tasks in parallel and execute a callback when they all complete.\n\nCopyright and License\n---------------------\ncopyright: (c) 2011 by Kris Walker (kris@kixx.name).\n\nUnless otherwise indicated, all source code is licensed under the MIT license.\nSee MIT-LICENSE for details.\n","maintainers":[{"name":"kixxauth","email":"kris@kixx.name"}],"time":{"modified":"2011-11-12T17:34:23.393Z","created":"2011-11-12T17:34:22.882Z","0.1.0":"2011-11-12T17:34:23.393Z"},"_attachments":{"boss-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ie1HrgvNDPVKtW/0JgS3wA==","length":10240,"stub":true}}}},
{"id":"bot","key":"bot","value":{"rev":"7-3390f5d789209b96bd4abda5fc6b677c"},"doc":{"_id":"bot","_rev":"7-3390f5d789209b96bd4abda5fc6b677c","name":"bot","description":"Feeling lonely? You personal bot is here.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"bot","preferGlobal":"true","version":"0.0.1","description":"Feeling lonely? You personal bot is here.","keywords":["bot","chat bot"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"flatiron":"~0.1.7"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2","sinon":"1.3.1"},"repository":{"type":"git","url":"git://github.com/vesln/bot.git"},"homepage":"http://github.com/vesln/bot","scripts":{"test":"make test"},"bin":{"bot":"./bin/bot"},"main":"./lib/index","engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"bot@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"64202d935ae64c54061b96bcb1812fef0a88860b","tarball":"http://registry.npmjs.org/bot/-/bot-0.0.1.tgz"},"readme":"","maintainers":[{"name":"vesln","email":"hi@vesln.com"}]},"0.0.2":{"name":"bot","preferGlobal":"true","version":"0.0.2","description":"Feeling lonely? You personal bot is here.","keywords":["bot","chat bot"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"colors":"0.6.0-1"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2"},"repository":{"type":"git","url":"git://github.com/vesln/bot.git"},"homepage":"http://github.com/vesln/bot","scripts":{"test":"make test"},"bin":{"bot":"./bin/bot"},"main":"./lib/index","engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"bot@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1b75e525801cd34485cf234b9a00feff7ac25958","tarball":"http://registry.npmjs.org/bot/-/bot-0.0.2.tgz"},"readme":"[![Build Status](https://secure.travis-ci.org/vesln/bot.png)](http://travis-ci.org/vesln/bot)\n\n# Bot\n\n![screenshot](http://img535.imageshack.us/img535/4638/screenshot20120121at353.png)\n\n## Description\n\t\nBot is simple, stupid node.js chat bot that will make your day better.\n\nWhy? No idea, I just had the idea of making chat bot. It has database with more than 15 000 famous quotes and\nhaving a chat with the bot is pretty fun.\n\n## Features\n\n- You can have fun when you are bored.\n- You can make better Twitter/Facebook statuses. :D\n\n## Synopsis\n\n```\nUsage: bot\n```\n\nNow type stuff.\n\n## Requirements\n\n- NPM (http://npmjs.org/)\n- Node.js 0.6 (http://nodejs.org/)\n\n## Install\n\n```\n$ npm install bot -g\n```\n\n## Tests\n\n```\n$ npm install\n$ make test\n```\n\n## License\n\nMIT License\n\nCopyright (C) 2012 Veselin Todorov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","maintainers":[{"name":"vesln","email":"hi@vesln.com"}]},"0.0.3":{"name":"bot","preferGlobal":"true","version":"0.0.3","description":"Feeling lonely? You personal bot is here.","keywords":["bot","chat bot"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"colors":"0.6.0-1"},"devDependencies":{"mocha":"*","chai":"*"},"repository":{"type":"git","url":"http://github.com/vesln/bot.git"},"homepage":"http://github.com/vesln/bot","scripts":{"test":"make test"},"bin":{"bot":"./bin/bot"},"main":"./lib/index","engines":{"node":">= 0.6.0"},"_id":"bot@0.0.3","dist":{"shasum":"a0842e4c944a9d54047aaac5c81ba3e3c11383ab","tarball":"http://registry.npmjs.org/bot/-/bot-0.0.3.tgz"},"readme":"[![Build Status](https://secure.travis-ci.org/vesln/bot.png)](http://travis-ci.org/vesln/bot)\n\n# Bot\n\n![screenshot](http://img850.imageshack.us/img850/79/screenshot20120121at637.png)\n\n## Description\n\t\nBot is simple, stupid node.js chat bot that will make your day better.\n\nWhy? No idea, I just had the idea of making chat bot. It has database with more than 15 000 famous quotes and\nhaving a chat with the bot is pretty fun.\n\n## Features\n\n- You can have fun when you are bored.\n- Now you can have better Twitter/Facebook statuses. :D\n\n## Synopsis\n\n```\nUsage: bot\n```\n\nNow type stuff.\n\n## Requirements\n\n- NPM (http://npmjs.org/)\n- Node.js 0.6 (http://nodejs.org/)\n\n## Install\n\n```\n$ npm install bot -g\n```\n\n## Tests\n\n```\n$ npm install\n$ make test\n```\n\n## License\n\nMIT License\n\nCopyright (C) 2012 Veselin Todorov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","maintainers":[{"name":"vesln","email":"hi@vesln.com"}]}},"readme":"","maintainers":[{"name":"vesln","email":"hi@vesln.com"}],"time":{"modified":"2012-06-25T17:56:37.281Z","created":"2012-01-20T18:30:16.642Z","0.0.1":"2012-01-20T18:30:18.434Z","0.0.2":"2012-01-21T13:59:47.859Z","0.0.3":"2012-06-25T17:56:37.281Z"},"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"repository":{"type":"git","url":"http://github.com/vesln/bot.git"},"_attachments":{"bot-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-l6QKeZcyjWV0DNDgZQ9RKg==","length":1118552,"stub":true},"bot-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yqBm2rS8nLGSLJ8cVKEr9w==","length":1118565,"stub":true},"bot-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OhMvMkMcRaWs+5dKlE1K4Q==","length":759,"stub":true}}}},
{"id":"bot-js","key":"bot-js","value":{"rev":"9-b5c5daf3bb9606d5fc6f1e7e30d7ecf1"},"doc":{"_id":"bot-js","_rev":"9-b5c5daf3bb9606d5fc6f1e7e30d7ecf1","name":"bot-js","description":"Node.JS IRC Bot with 0 dependencies. Run your #channel like a Boss.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"bot-js","description":"Node.JS IRC Bot with 0 dependencies. Run your #channel like a Boss.","version":"0.0.1","repository":{"url":""},"bin":{"botjs":"./bin/bot"},"engines":{"node":">= 0.6.12 < 0.7.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"bot-js@0.0.1","_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ee36e5f4f7870e7adc3165d173287583526c39f9","tarball":"http://registry.npmjs.org/bot-js/-/bot-js-0.0.1.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}],"directories":{}},"0.0.2":{"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"name":"bot-js","description":"Node.JS IRC Bot with 0 dependencies. Run your #channel like a Boss.","version":"0.0.2","repository":{"url":"http://github.com/edwardhotchkiss/bot.js.git"},"engines":{"node":">= 0.6.X < 0.7.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"},"_id":"bot-js@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"e053a42db9e3d6107b2cec7f83ec2e6a65ac5228","tarball":"http://registry.npmjs.org/bot-js/-/bot-js-0.0.2.tgz"},"maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}]}},"readme":"\nbot.js\n======\n\nConfiguration\n=============\n\nEither use a config object, or setup config.json:\n\n```json\n{\n  \"user\"    : \"hotch_bot\",\n  \"nick\"    : \"hotch_bot\",\n  \"server\"  : \"irc.freenode.net\",\n  \"channel\" : \"#hotchkiss\",\n  \"admins\"  : [\"hotchkiss\"],\n  \"port\"    : 6667\n}\n```\n\nExample\n=======\n\n```javascript\n#!/usr/bin/env node\n\nvar irc = require('../lib/irc');\n\nvar bot = new irc.Client({\n  user    : 'hotch_bot',\n  nick    : 'hotch_bot',\n  server  : 'irc.freenode.net',\n  channel : '#hotchkiss',\n  admins  : ['hotchkiss'],\n  port    : 6667\n});\n\nbot.on('ready', function() {\n  console.log('connected to irc...');  \n});\n\nbot.on('joined', function(channel) {\n  console.log('JOINED ' + channel);\n});\n\nbot.on('privateMessage', function(from, message) {\n  console.log('PRIVATE MESSAGE > %s: %s', from, message);\n});\n\nbot.on('channelMessage', function(from, message) {\n  console.log('CHANNEL MESSAGE > %s: %s', from, message);\n});\n\nbot.on('command', function(command) {\n  console.log('COMMAND: %s', command);\n});\n\n/* EOF */\n```\n\n","maintainers":[{"name":"edwardhotchkiss","email":"edward@edwardhotchkiss.com"}],"time":{"modified":"2012-03-06T03:08:24.357Z","created":"2012-03-04T20:36:36.420Z","0.0.1":"2012-03-04T20:36:36.961Z","0.0.2":"2012-03-06T03:08:24.357Z"},"author":{"name":"Edward Hotchkiss","email":"edwardhotchkiss@me.com"},"repository":{"url":"http://github.com/edwardhotchkiss/bot.js.git"},"_attachments":{"bot-js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-7wLoiVQNeenLtI2t2Favuw==","length":10240,"stub":true},"bot-js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Tj4C4W2goTXTRLNff1vGwg==","length":10240,"stub":true}}}},
{"id":"botan","key":"botan","value":{"rev":"5-f5c93a5fc98cd2360a0c7f5d455cc95c"},"doc":{"_id":"botan","_rev":"5-f5c93a5fc98cd2360a0c7f5d455cc95c","name":"botan","description":"Fully asynchronous Botan wrapper with RSA/public-key, cipher, hash, mac, codec, PBKDF, rnd support","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"botan","author":{"name":"Justin Freitag"},"description":"Fully asynchronous Botan wrapper with RSA/public-key, cipher, hash, mac, codec, PBKDF, rnd support","version":"0.0.1","bin":{"random":"./bin/random"},"main":"build/Release/botan","dependencies":{"optimist":"~0.3"},"devDependencies":{"mocha":"~0.11","should":"~0.6"},"scripts":{"test":"mocha -t 30000 -R list -r should test/node-botan-test","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"engines":{"node":"~0.6"},"_npmUser":{"name":"justinfreitag","email":"justin.freitag@gmail.com"},"_id":"botan@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9a7c475b1f225106ce37438d2836ee3d7288c371","tarball":"http://registry.npmjs.org/botan/-/botan-0.0.1.tgz"},"maintainers":[{"name":"justinfreitag","email":"justin.freitag@gmail.com"}]},"0.0.2":{"name":"botan","author":{"name":"Justin Freitag"},"description":"Fully asynchronous Botan wrapper with RSA/public-key, cipher, hash, mac, codec, PBKDF, rnd support","version":"0.0.2","main":"build/Release/botan","devDependencies":{"mocha":"~1.2","should":"~0.6"},"scripts":{"test":"mocha -t 30000 -R list -r should test/node-botan-test","install":"node-gyp rebuild"},"engines":{"node":"~0.8"},"gypfile":true,"readme":"# node-botan\n\n A fully asynchronous wrapper of the [Botan](http://botan.randombit.net/) crypto library for Node JS.\n\n## Installation\n\nFirst, install Botan as described here http://botan.randombit.net/building.html, then simply:\n\n    npm install botan\n\n## Features\n\n  - Asynchronous public key, cipher, mac, PBKDF, hash, codec, and rand function support\n  - Wraps [Botan](http://botan.randombit.net/) version 1.10\n\n## Author\n\n  - Justin Freitag\n\n## Examples\n\nFor now, look at the tests and [Botan](http://botan.randombit.net/), but i'll be documenting the API and examples over the next week or so.\n\n## Running Tests\n\nTo run the test suite simply execute:\n\n    $ npm test\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Justin Freitag &lt;justin.freitag@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"botan@0.0.2","dist":{"shasum":"23668628aeac204a41149037582d09971272b4b3","tarball":"http://registry.npmjs.org/botan/-/botan-0.0.2.tgz"},"maintainers":[{"name":"justinfreitag","email":"justin.freitag@gmail.com"}]}},"readme":"# node-botan\n\n A fully asynchronous wrapper of the [Botan](http://botan.randombit.net/) crypto library for Node JS.\n\n## Installation\n\nFirst, install Botan as described here http://botan.randombit.net/building.html, then simply:\n\n    npm install botan\n\n## Features\n\n  - Asynchronous public key, cipher, mac, PBKDF, hash, codec, and rand function support\n  - Wraps [Botan](http://botan.randombit.net/) version 1.10\n\n## Author\n\n  - Justin Freitag\n\n## Examples\n\nFor now, look at the tests and [Botan](http://botan.randombit.net/), but i'll be documenting the API and examples over the next week or so.\n\n## Running Tests\n\nTo run the test suite simply execute:\n\n    $ npm test\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 Justin Freitag &lt;justin.freitag@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"justinfreitag","email":"justin.freitag@gmail.com"}],"time":{"modified":"2012-06-28T04:00:43.149Z","created":"2012-04-28T05:45:29.344Z","0.0.1":"2012-04-28T05:45:35.993Z","0.0.2":"2012-06-28T04:00:43.149Z"},"author":{"name":"Justin Freitag"},"_attachments":{"botan-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HBgbOaO5iTUqEjt0UUAFNQ==","length":14089,"stub":true},"botan-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-a8qbLexyyXd8ZyR8sSU5ZA==","length":14722,"stub":true}}}},
{"id":"botio","key":"botio","value":{"rev":"34-5dc27844d8e9911f4eb818d5d053006a"},"doc":{"_id":"botio","_rev":"34-5dc27844d8e9911f4eb818d5d053006a","name":"botio","description":"Github build/test bot","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1pre1":{"name":"botio","version":"0.0.1pre1","author":{"name":"Artur Adib","email":"arturadib@gmail.com"},"description":"Github build/test bot","keywords":["travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a927dd2f451f723ad55d431f248522f210468206","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre1.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre2":{"name":"botio","version":"0.0.1pre2","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a30a7609b7de3e493dedb450b266c53964c270a1","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre2.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre3":{"name":"botio","version":"0.0.1pre3","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.4"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"8210d486ea9f5b747f2324a935c7ff0565cf8ebd","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre3.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre4":{"name":"botio","version":"0.0.1pre4","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.5pre2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f37f43140c62b5b31df181c47da2d1cf622d0035","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre4.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre5":{"name":"botio","version":"0.0.1pre5","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.5pre2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c425ddce9bc0daccf2cc0aa48816f719d29dd6ae","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre5.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre6":{"name":"botio","version":"0.0.1pre6","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.5pre2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b1b15d536bcddf6436585a6422d596daf589b43b","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre6.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre7":{"name":"botio","version":"0.0.1pre7","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.5pre2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre7","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f41a2ea93091e8bf3b795ad9e900348265139046","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre7.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre8":{"name":"botio","version":"0.0.1pre8","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.5pre2"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre8","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f4e76f0339576813bf0f29dd90f9b54dba294377","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre8.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre9":{"name":"botio","version":"0.0.1pre9","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"0.0.5pre2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre9","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7bb0b2fcd80b6ab86a431d90f9190f32e1c9e9e8","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre9.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre10":{"name":"botio","version":"0.0.1pre10","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"latest"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre10","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"364abc03e3cb03eaaac83e9678b4a4b53829845e","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre10.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1pre11":{"name":"botio","version":"0.0.1pre11","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"latest"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1pre11","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"8320c0fa4bc93777ce6aff1ee6ea9b93d50c4bdb","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1pre11.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.1":{"name":"botio","version":"0.0.1","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"latest"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"44a7390ffb346e29f9565b467318e6ef1ac4c4b6","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.1.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"directories":{}},"0.0.2pre1":{"name":"botio","version":"0.0.2pre1","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"latest"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.2pre1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"61495bdcdd27becfa84bb360a9094dffe4f5bc77","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.2pre1.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}]},"0.0.2":{"name":"botio","version":"0.0.2","author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"description":"Github build/test bot","keywords":["bot","travis","CI","test","regression","build","continuous integration"],"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"homepage":"http://github.com/arturadib/botio","bin":{"botio":"./bin/botio"},"main":"./lib/botio.js","dependencies":{"commander":"0.5.2","express":"2.5.8","request":"2.9.153","shelljs":"latest"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"artur","email":"arturadib@gmail.com"},"_id":"botio@0.0.2","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3ee3ca7cec27c66412c587b8785b0c666fad7985","tarball":"http://registry.npmjs.org/botio/-/botio-0.0.2.tgz"},"maintainers":[{"name":"artur","email":"arturadib@gmail.com"}]}},"readme":"# Bot.io: Keep pull requests from breaking your master\n\nBot.io is a fully flexible build/test bot for Github projects. It is similar to [Travis-CI](https://github.com/travis-ci/travis-ci) in purpose, but most of the action happens at the pull request level. (And you have to run your own test/build servers).\n\nBot.io has been guarding the master branch of Mozilla's [pdf.js](http://github.com/mozilla/pdf.js) since late 2011.\n\n\n\n\n## How it works\n\nReviewers write [shell-like](http://github.com/arturadib/shelljs) scripts such as [on_test.js](https://github.com/arturadib/botio/blob/master/bootstrap/on_test.js). The bot listens for `/botio test` comments in pull requests, and runs the script when the command is detected.\n\nThe bot then reports back to the pull request with the result of the tests run by the script. Other commands are possible. For example, to listen for `/botio publish` simply create a new script `on_publish.js`.\n\n\n\n\n## Getting started\n\nBot.io depends on [Node.js](https://github.com/joyent/node) and `git`. To get started, create a new directory for your Botio files. In this directory, bootstrap Github hooks/configuration files, and start the server:\n\n```bash\n$ npm install -g botio\n$ botio bootstrap --repo user/repo_name --user repo_admin_name --pwd password123 --port 8877\n$ botio start --user maybe_someone_else --pwd password123\n```\n\nYou can then go to your Github repo and trigger the first Bot.io job by leaving the following comment on any pull request:\n\n```\n/botio test\n```\n\nThe bot should write back a hello world response in the PR discussion. See `on_test.js` in your bot files directory for how this is done. You will want to modify that script to fire up your own builds/tests.\n\n\n\n\n## FAQ\n\n\n#### What's a typical Bot.io workflow?\n\n1. User submits pull request\n2. Reviewers think the code is desirable, so they fire up the bot by leaving a special comment like `/botio test`\n3. Bot runs the tests/builds and writes back to PR with results\n\nReviewers can then either merge or ask for further revision based on bot results.\n\n\n#### I don't want to use Bot.io anymore. How do I uninstall the Github hooks installed by Bot.io?\n\nOn Github, go to Account Settings > Service Hooks > Post-Receive URLs and disable the URL corresponding to the IP of your machine. (Don't forget to save it).\n\n\n#### How many concurrent tests can I run?\n\nAt the moment Bot.io uses a simple queueing system, so only one test can be run at a time. This might change in the future.\n\n\n#### How does the bot handle security?\n\nBot.io only responds to white-listed users.\n","maintainers":[{"name":"artur","email":"arturadib@gmail.com"}],"time":{"modified":"2012-08-05T20:33:07.290Z","created":"2012-03-19T21:04:57.615Z","0.0.1pre1":"2012-03-19T21:04:57.893Z","0.0.1pre2":"2012-03-20T19:03:06.831Z","0.0.1pre3":"2012-03-22T19:33:23.091Z","0.0.1pre4":"2012-03-26T15:59:05.550Z","0.0.1pre5":"2012-03-26T20:57:38.041Z","0.0.1pre6":"2012-03-27T14:30:41.689Z","0.0.1pre7":"2012-03-27T14:40:57.285Z","0.0.1pre8":"2012-03-27T15:42:52.143Z","0.0.1pre9":"2012-03-27T19:42:45.250Z","0.0.1pre10":"2012-03-28T20:49:07.408Z","0.0.1pre11":"2012-03-28T21:52:36.985Z","0.0.1":"2012-03-29T14:24:23.875Z","0.0.2pre1":"2012-04-06T17:17:57.962Z","0.0.2":"2012-04-07T14:35:20.344Z"},"author":{"name":"Artur Adib","email":"aadib@mozilla.com"},"repository":{"type":"git","url":"git://github.com/arturadib/botio.git"},"users":{"sjonnet19":true},"_attachments":{"botio-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-rkfDMCrlBivFU9q3WhQs9g==","length":109173,"stub":true},"botio-0.0.2pre1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-Xhv/L5qAmPuNQbPsZNNXUw==","length":109041,"stub":true},"botio-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-ctPpEjjFmmQCg+sJkgZAhg==","length":108874,"stub":true},"botio-0.0.1pre11.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-Ej+AJL0FrPLUwtRQk/gqmA==","length":108884,"stub":true},"botio-0.0.1pre10.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-LEjU9BsU5iGnDh8ir/MYvw==","length":108868,"stub":true},"botio-0.0.1pre9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-9gqpDIryECuXQCjqUqbjDA==","length":9225,"stub":true},"botio-0.0.1pre8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-KwRbvKh/KFi0fAuSVgA1uw==","length":9077,"stub":true},"botio-0.0.1pre7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-wz6cZ7SiOm5J+WYJ0vqJ7g==","length":8983,"stub":true},"botio-0.0.1pre6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-H8s9LoU46dxuscbyA11awQ==","length":8931,"stub":true},"botio-0.0.1pre5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ChXIiXn2GweezqVq5DLd0w==","length":8820,"stub":true},"botio-0.0.1pre4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hExwLabtQ5jxbr5h1eds7A==","length":8739,"stub":true},"botio-0.0.1pre3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-5KbBO/umL7oZVyPADJ7sHA==","length":8694,"stub":true},"botio-0.0.1pre2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IRguXLkuE7of/xFwQ8LKjw==","length":7836,"stub":true},"botio-0.0.1pre1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5aAd2kKUOFtwiefvThBvQQ==","length":7449,"stub":true}}}},
{"id":"bots","key":"bots","value":{"rev":"15-c3cc1cdb92b3dadc8eb88d52118ce4e4"},"doc":{"_id":"bots","_rev":"15-c3cc1cdb92b3dadc8eb88d52118ce4e4","name":"bots","description":"Build robust networks of bots that can react to events","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["xmpp","bot","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.1","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","engines":{"node":"0.4"},"dependencies":{"node-xmpp":"0.2.9","ranger":"0.2.4"},"devDependencies":{"coffee-script":"1.1","nodeunit":"0.5.1"},"scripts":{"test":"cake test","prepublish":"cake build"},"_npmJsonOpts":{"file":"/home/chris/.npm/bots/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bots@0.0.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"73d2a486b57919597e5231a1b04684e5298e8e2a","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.1.tgz"}},"0.0.2":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["bot","xmpp","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.2","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","engines":{"node":"0.4"},"dependencies":{"node-xmpp":"0.2.9","ranger":"0.2.4"},"devDependencies":{"coffee-script":"1.1","nodeunit":"0.5.1"},"scripts":{"test":"cake test","prepublish":"cake build"},"_npmJsonOpts":{"file":"/home/chris/.npm/bots/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bots@0.0.2","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"908f6c5e3cc65b3c5e13b00b7d3fec32acec095f","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.2.tgz"}},"0.0.3":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["bot","xmpp","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.3","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","engines":{"node":"0.4"},"dependencies":{"node-xmpp":"0.2.9","ranger":"0.2.4"},"devDependencies":{"coffee-script":"1.1","nodeunit":"0.5.1"},"scripts":{"test":"cake test","prepublish":"cake build"},"_npmJsonOpts":{"file":"/home/chris/.npm/bots/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bots@0.0.3","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"eef6d5d800d58224af39bacdbc6e39f5b8130571","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.3.tgz"}},"0.0.4":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["bot","xmpp","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.4","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","bin":{"bots":"./bin/bots"},"man":["./man/bots.1"],"engines":{"node":"0.4"},"dependencies":{"node-xmpp":"0.2.9","ranger":"0.2.4","request":"1.9.8"},"devDependencies":{"coffee-script":"1.1","nodeunit":"0.5.1","ronn":""},"scripts":{"test":"cake test","doc":"ronn -r < doc/bots.md > man/bots.1","prepublish":"cake build && npm run-script doc"},"_npmJsonOpts":{"file":"/home/chris/.npm/bots/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bots@0.0.4","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"507b2b2bcf1f21f8c46e330ff8c7ee397d751017","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.4.tgz"}},"0.0.5":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["bot","xmpp","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.5","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","bin":{"bots":"./bin/bots"},"man":["./man/bots.1"],"engines":{"node":"0.4"},"dependencies":{"node-xmpp":"~> 0.2.9","ranger":"~> 0.2.4","request":"~> 2.1.1"},"devDependencies":{"coffee-script":"~> 1.1.2","nodeunit":"~> 0.5.1","ronn":""},"scripts":{"test":"cake test","doc":"ronn -r < doc/bots.md > man/bots.1","prepublish":"cake build && npm run-script doc"},"_npmUser":{"name":"hecticjeff","email":"self@hecticjeff.net"},"_id":"bots@0.0.5","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1b1faa163a241dde8cf77eba7b94a1c25fd24a26","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.5.tgz"},"maintainers":[{"name":"hecticjeff","email":"self@hecticjeff.net"}]},"0.0.6":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["bot","xmpp","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.6","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","bin":{"bots":"./bin/bots"},"man":["./man/bots.1"],"engines":{"node":"0.4"},"dependencies":{"node-xmpp":"~> 0.2.9","ranger":"~> 0.2.4","request":"~> 2.1.1"},"devDependencies":{"coffee-script":"~> 1.1.2","nodeunit":"~> 0.5.1","ronn":""},"scripts":{"test":"cake test","doc":"ronn -r < doc/bots.md > man/bots.1"},"_npmUser":{"name":"hecticjeff","email":"self@hecticjeff.net"},"_id":"bots@0.0.6","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"52650b3a5c7b01f79e826534f34f6c71d9414579","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.6.tgz"},"maintainers":[{"name":"hecticjeff","email":"self@hecticjeff.net"}]},"0.0.7":{"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"name":"bots","description":"Build robust networks of bots that can react to events","keywords":["bot","xmpp","campfire"],"homepage":"https://github.com/hecticjeff/bots","version":"0.0.7","repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"main":"./lib","bin":{"bots":"./bin/bots"},"man":["./man/bots.1"],"engines":{"node":">= 0.4.0"},"dependencies":{"node-xmpp":"0.3.1","ranger":"0.1.0","request":"2.9.150"},"devDependencies":{"coffee-script":"1.2.0","nodeunit":"0.7.3","ronn":"0.3.8"},"scripts":{"test":"cake test","doc":"ronn -r < doc/bots.md > man/bots.1"},"_npmUser":{"name":"hecticjeff","email":"self@hecticjeff.net"},"_id":"bots@0.0.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"61d62c020a9740ce970dcc4a7f271c520ddd6582","tarball":"http://registry.npmjs.org/bots/-/bots-0.0.7.tgz"},"readme":"bots\n====\n\nMake your own robot that knows how to speak many protocols, and can be\ntaught more.\n\n## Installing\n\nBy installing globally you gain access to the `bots(1)` tool which can\ngenerate bots for you.\n\n    npm -g install bots\n\n## Tutorial\n\nSo, you want to build your own 'bot. You've heard that all the cool hip\nstartups have their own office 'bot, you know, the one that monitors the\nCI system, can deploy the site, play music over the office speakers AND\nknows who's in the office based on their smartphones wi-fi presence. Well\nfollow along and you can build your very own robot servant to perform your\nnefarious deeds.\n\nFirst you need to get the parts to build the bot. You'll need to get setup\nwith [node(1)](http://nodejs.org/) and it's de-facto package manager,\n[npm(1)](http://npmjs.org/). Then create a project and get the parts.\n\n    mkdir coolbot && cd coolbot\n    npm install bots\n\nNow you'll need to give the robot some personality, try putting the following\nin a file called `coolbot.js`.\n\n``` javascript\n// Pull in the bots framework.\nvar bots = require('bots');\n\n// Create your own cool bot and give it a name.\nvar coolbot = bots.createBot('coolbot 0.0.1');\n\n// Tell this cool bot to use the CLI interface (stdin/stdout).\ncoolbot.use(bots.cli());\n\n// Add a description and it will appear when the bot hears \"help\".\ncoolbot.desc('ping', \"Test I'm working with a ping\");\n\n// Assign an action to the bot, first argument is the regex to match,\n// second is the callback to be invoked when this message is matched.\ncoolbot.hear(/ping/, function(message) {\n\n  // Respond to the person who sent the message, note that you don't\n  // *have* to call `message.say`.\n  message.say(\"PONG\");\n});\n\n// Start you cool bot listening on the interfaces you have assigned.\ncoolbot.start();\n```\n\nNow try running it:\n\n```\n$ node coolbot.js ping\nPONG\n$\n```\n\nThis example uses the `cli` interface, this can be useful for testing, and\nthe bot can take commands on stdin, so can be used in a pipe, but for other\nservices you'll need to `use` different interfaces.\n\n## Contributing\n\nGet the code and run the tests.\n\n    git clone https://github.com/hecticjeff/bots\n    cd bots\n    npm install\n    npm test\n\n## Credits\n\nParts of the dsl design were inspired by\n[defunkt/evilbot](https://github.com/defunkt/evilbot).\n\nCopyright (c) 2011 Chris Mytton\n","maintainers":[{"name":"hecticjeff","email":"self@hecticjeff.net"}]}},"maintainers":[{"name":"hecticjeff","email":"self@hecticjeff.net"}],"time":{"modified":"2012-02-24T20:46:14.354Z","created":"2011-07-12T17:43:32.700Z","0.0.1":"2011-07-12T17:43:33.632Z","0.0.2":"2011-07-12T20:56:20.383Z","0.0.3":"2011-07-12T22:26:08.863Z","0.0.4":"2011-07-16T16:24:40.302Z","0.0.5":"2011-10-13T19:04:34.026Z","0.0.6":"2011-10-13T23:00:22.800Z","0.0.7":"2012-02-24T20:46:14.354Z"},"author":{"name":"Chris Mytton","email":"self@hecticjeff.net","url":"http://hecticjeff.net"},"repository":{"type":"git","url":"git://github.com/hecticjeff/bots.git"},"_attachments":{"bots-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-dRtvLRCWGqf53KEYh5uwdg==","length":10357,"stub":true},"bots-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+vCdJ+GwhGsEKxOnUeHT6Q==","length":10240,"stub":true},"bots-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-RA46RgzGWHyoQAPxa4Tq7g==","length":10240,"stub":true},"bots-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-dM9HtRvgwAJYDBZUs6WIyA==","length":9829,"stub":true},"bots-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-O3cdwBQMGNE1n6TjXUFQ5w==","length":8232,"stub":true},"bots-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yRGSbwzQrC1ZvrpHSG+mZw==","length":8233,"stub":true},"bots-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bmd7x4h6wK6xEpz4g1LVjw==","length":13400,"stub":true}}}},
{"id":"bounce","key":"bounce","value":{"rev":"8-a3e424b2be1379743e9628c726facaa8"},"doc":{"_id":"bounce","_rev":"8-a3e424b2be1379743e9628c726facaa8","name":"bounce","description":"Restart scripts upon code changes","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bounce","version":"0.0.1","description":"Restart scripts upon code changes","author":{"name":"weepy"},"bin":{"bounce":"./bin/bounce"},"repository":"http://github.com/weepy/bounce","dependencies":{"glob":"*","growl":"*"},"engines":["node >=0.2"],"_id":"bounce@0.0.1","_nodeSupported":false,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bounce/-/bounce-0.0.1.tgz"},"mtime":"2010-11-09T23:16:55Z","ctime":"2010-11-09T23:16:55Z"},"0.0.2":{"name":"bounce","version":"0.0.2","description":"Restart scripts upon code changes","author":{"name":"weepy"},"bin":{"bounce":"./bin/bounce"},"repository":"http://github.com/weepy/bounce","dependencies":{"glob":">= 1.0.2","growl":">= 1.0.2"},"engines":{"node":">= 0.2.0"},"_id":"bounce@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bounce/-/bounce-0.0.2.tgz"},"mtime":"2010-11-09T23:16:56Z","ctime":"2010-11-09T23:16:56Z"}},"maintainers":[{"name":"weepy","email":"jonahfox@gmail.com"}],"mtime":"2010-11-09T23:16:56Z","ctime":"2010-11-09T23:16:55Z","author":{"name":"weepy"},"repository":"http://github.com/weepy/bounce","_attachments":{"bounce-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SLEtHf6+6IkMA/eYc9sacg==","length":2515,"stub":true},"bounce-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-s5ut+wN5g11v98RV3nSsIQ==","length":2780,"stub":true}}}},
{"id":"bouncer","key":"bouncer","value":{"rev":"11-c075516ec4022eab06e73563de164ad5"},"doc":{"_id":"bouncer","_rev":"11-c075516ec4022eab06e73563de164ad5","name":"bouncer","description":"A service router that uses MDNS and bouncy to do magic!","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"name":"bouncer","description":"A service router that uses MDNS and bouncy to do magic!","version":"0.0.1","repository":{"type":"git","url":"github.com/addisonj/bouncer.git"},"engines":{"node":"0.6.x"},"dependencies":{"bouncy":"1.3.1","commander":"0.6.0","mdns":"0.0.6"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"addisonj","email":"addisonj@gmail.com"},"_id":"bouncer@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3cf1eb57f23d4a1587b0b23a9269c734e18a6b12","tarball":"http://registry.npmjs.org/bouncer/-/bouncer-0.0.1.tgz"},"readme":"","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}]},"0.0.2":{"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"name":"bouncer","description":"A service router that uses MDNS and bouncy to do magic!","version":"0.0.2","repository":{"type":"git","url":"github.com/addisonj/bouncer.git"},"engines":{"node":"0.6.x"},"dependencies":{"bouncy":"1.3.1","commander":"0.6.0","mdns":"0.0.6"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"addisonj","email":"addisonj@gmail.com"},"_id":"bouncer@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"28e614c42af458d8069aaae94b5a14ed1df92032","tarball":"http://registry.npmjs.org/bouncer/-/bouncer-0.0.2.tgz"},"readme":"","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}]},"0.0.3":{"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"name":"bouncer","description":"A service router that uses MDNS and bouncy to do magic!","version":"0.0.3","repository":{"type":"git","url":"github.com/addisonj/bouncer.git"},"engines":{"node":"0.6.x"},"dependencies":{"bouncy":"1.3.1","commander":"0.6.0","mdns":"0.0.6"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"addisonj","email":"addisonj@gmail.com"},"_id":"bouncer@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"dc5e8a603a169734327c7487f078e5cea708eafd","tarball":"http://registry.npmjs.org/bouncer/-/bouncer-0.0.3.tgz"},"readme":"","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}]},"0.0.4":{"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"name":"bouncer","description":"A service router that uses MDNS and bouncy to do magic!","version":"0.0.4","repository":{"type":"git","url":"git://github.com/addisonj/bouncer.git"},"engines":{"node":"0.6.x"},"dependencies":{"bouncy":"1.3.1","commander":"0.6.0","mdns":"0.0.6"},"devDependencies":{},"optionalDependencies":{},"homepage":"https://github.com/addisonj/bouncer","main":"index.js","_npmUser":{"name":"addisonj","email":"addisonj@gmail.com"},"_id":"bouncer@0.0.4","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"58be504c10cb44e7917b105dab9819fc78fbf16d","tarball":"http://registry.npmjs.org/bouncer/-/bouncer-0.0.4.tgz"},"readme":"#Bouncer\nBouncer is a simple router that uses MDNS and substack's bouncy to magically discover your apps and services to hit and fallback when neccessary. \n\n##Install\n###Prereqs\nFor bouncy to be useful, you need to redirect a wildcard subdomain to localhost (*.dev.local for example). There are lots of methods to do this, but here is one way for OSX.\n\n(shamelessly borrowed from http://onemoredigit.com/post/2155404559/wildcard-etc-hosts-an-alternative)\n\n1. install dnsmasq\n``` \nbrew install dnsmasq\n```\n2. copy the example config\n``` \ncp /usr/local/Cellar/dnsmasq/2.55/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf\n```\n3. edit dnsmasq.conf to include the following\n\n```\naddress=/com.local/127.0.0.1\nlisten-address=127.0.0.1\n```\nwhere \"com.local\" is the domain you want to redirect on, I use dev.local\n4. (optional) Add the dnsmasq launchd config (provided by homebrew) to your system. Homebrew tells you how to do this.\n\n###Installation\n1. install it\n```\nnpm install -g bouncer\n```\n2. Advertise your services (see below)\n3. run bouncer\n```\nbouncer -c /path/to/conf.json\n```\n\nNOTE: defaults to ~/.bouncer.json if no config is passed\n\nSee below for config info\n\n##Advertising services\nBouncer relies on MDNS (aka. Bounjour, ZeroConf) to discover your services, in order for this to work however, you must create and advertisement for that service\n\napp.js\n```\nvar advertise = require('bouncer').advertise\n...\nvar options = {secret: \"cheesecake\"}\napp.listen(PORT, advertise(\"service_name\", PORT, options))\n```\n\nSee below for list of options\n\n##Config\nBouncer uses a json config file to define a secret, a list of services with fallbacks, and other options\n\nsample_config.json (obvs without the comments!)\n```\n  // port to listen on\n  \"port\" : 8000,\n  // secret to use (match with your advertisement)\n  \"secret\" : \"mysecret\",\n  // OPTIONAL - key used to encrypt\n  \"key\": \"123456789123\",\n  // OPTIONAL - a fallback if no corresponding service is found\n  \"globalFallback\" : \"http://mydomain.com\",\n  // only bind with local instances of the service, default to false\n  \"localOnly\": false,\n  // a hash of service names and the fallback url to use\n  \"services\" : {\n    \"service1\" : \"service1.mydomain.com\",\n    \"service2\" : \"service2.mydomain.com\",\n  }\n```\n\n###Advertise\nthe advertise options hash taskes a secret and a key, match to above\n\n##API\nIf you want to use Bouncer programatically, you can.\n\n```\nvar Bouncer = require('bouncer').Bouncer\nvar bouncer = new Bouncer(opts)\nbouncer.start()\n```\n\nopts takes all the same options as the json config and also a few functions\n\nonServiceUp(mdnsRecord) - fired when a service is registered\n\nonServiceDown(mdnsRecord) - fired when a service is removed\n\nonGlobalFault(request, bouncyInstance, serviceName) - handle global faults\n\nonServiceFault(request, bouncyInstance, serverObj) - handle faults for an individual services, serverObj is {name: \"service_name\", hosts; [mdnsRecord]}\n\nverifyHost(mdnsRecrd) - return true if you want to accept the service\n\n\n\n","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}]},"0.0.5":{"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"name":"bouncer","description":"A service router that uses MDNS and bouncy to do magic!","version":"0.0.5","repository":{"type":"git","url":"git://github.com/addisonj/bouncer.git"},"bin":{"bouncer":"./bin/bouncer"},"engines":{"node":"0.6.x"},"dependencies":{"bouncy":"1.3.1","commander":"0.6.0","mdns":"0.0.6"},"devDependencies":{},"optionalDependencies":{},"homepage":"https://github.com/addisonj/bouncer","main":"index.js","_npmUser":{"name":"addisonj","email":"addisonj@gmail.com"},"_id":"bouncer@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"cf482ca8bd0031e34e839ccb65b9119ceba6edd2","tarball":"http://registry.npmjs.org/bouncer/-/bouncer-0.0.5.tgz"},"readme":"#Bouncer\nBouncer is a simple router that uses MDNS and substack's bouncy to magically discover your apps and services to hit and fallback when neccessary. \n\n##Install\n###Prereqs\nFor bouncy to be useful, you need to redirect a wildcard subdomain to localhost (*.dev.local for example). There are lots of methods to do this, but here is one way for OSX.\n\n(shamelessly borrowed from http://onemoredigit.com/post/2155404559/wildcard-etc-hosts-an-alternative)\n\n1. install dnsmasq\n``` \nbrew install dnsmasq\n```\n2. copy the example config\n``` \ncp /usr/local/Cellar/dnsmasq/2.55/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf\n```\n3. edit dnsmasq.conf to include the following\n\n```\naddress=/com.local/127.0.0.1\nlisten-address=127.0.0.1\n```\nwhere \"com.local\" is the domain you want to redirect on, I use dev.local\n4. (optional) Add the dnsmasq launchd config (provided by homebrew) to your system. Homebrew tells you how to do this.\n\n###Installation\n1. install it\n```\nnpm install -g bouncer\n```\n2. Advertise your services (see below)\n3. run bouncer\n```\nbouncer -c /path/to/conf.json\n```\n\nNOTE: defaults to ~/.bouncer.json if no config is passed\n\nSee below for config info\n\n##Advertising services\nBouncer relies on MDNS (aka. Bounjour, ZeroConf) to discover your services, in order for this to work however, you must create and advertisement for that service\n\napp.js\n```\nvar advertise = require('bouncer').advertise\n...\nvar options = {secret: \"cheesecake\"}\napp.listen(PORT, advertise(\"service_name\", PORT, options))\n```\n\nSee below for list of options\n\n##Config\nBouncer uses a json config file to define a secret, a list of services with fallbacks, and other options\n\nsample_config.json (obvs without the comments!)\n```\n  // port to listen on\n  \"port\" : 8000,\n  // secret to use (match with your advertisement)\n  \"secret\" : \"mysecret\",\n  // OPTIONAL - key used to encrypt\n  \"key\": \"123456789123\",\n  // OPTIONAL - a fallback if no corresponding service is found\n  \"globalFallback\" : \"http://mydomain.com\",\n  // only bind with local instances of the service, default to false\n  \"localOnly\": false,\n  // a hash of service names and the fallback url to use\n  \"services\" : {\n    \"service1\" : \"service1.mydomain.com\",\n    \"service2\" : \"service2.mydomain.com\",\n  }\n```\n\n###Advertise\nthe advertise options hash taskes a secret and a key, match to above\n\n##API\nIf you want to use Bouncer programatically, you can.\n\n```\nvar Bouncer = require('bouncer').Bouncer\nvar bouncer = new Bouncer(opts)\nbouncer.start()\n```\n\nopts takes all the same options as the json config and also a few functions\n\nonServiceUp(mdnsRecord) - fired when a service is registered\n\nonServiceDown(mdnsRecord) - fired when a service is removed\n\nonGlobalFault(request, bouncyInstance, serviceName) - handle global faults\n\nonServiceFault(request, bouncyInstance, serverObj) - handle faults for an individual services, serverObj is {name: \"service_name\", hosts; [mdnsRecord]}\n\nverifyHost(mdnsRecrd) - return true if you want to accept the service\n\n\n\n","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}]}},"readme":"","maintainers":[{"name":"addisonj","email":"addisonj@gmail.com"}],"time":{"modified":"2012-06-14T15:01:50.293Z","created":"2012-05-30T16:37:30.541Z","0.0.1":"2012-05-30T16:37:31.588Z","0.0.2":"2012-05-30T17:43:19.089Z","0.0.3":"2012-06-04T17:46:00.424Z","0.0.4":"2012-06-04T19:16:56.913Z","0.0.5":"2012-06-14T15:01:50.293Z"},"author":{"name":"Addison Higham","email":"addisonj@gmail.com"},"repository":{"type":"git","url":"git://github.com/addisonj/bouncer.git"},"_attachments":{"bouncer-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Nr9hAEWsQLURC+Z74A2pgA==","length":4062,"stub":true},"bouncer-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-mhJh5zXk6ahOUsUHiWoPyA==","length":4040,"stub":true},"bouncer-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MEpVpKyekJ7whbYS4AKXEA==","length":2675,"stub":true},"bouncer-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-fn5rBckR+dPVGca1LrQhXQ==","length":2495,"stub":true},"bouncer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XInIJ+s8X7BQRT3YmvZ4Aw==","length":2484,"stub":true}}}},
{"id":"bouncy","key":"bouncy","value":{"rev":"53-168e06baf23ee88017de35de1c345ca9"},"doc":{"_id":"bouncy","_rev":"53-168e06baf23ee88017de35de1c345ca9","name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","dist-tags":{"latest":"1.3.1"},"versions":{"0.0.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router","version":"0.0.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","keywords":["http","parse","bounce","load","balancer","host","route","router"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.0.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b743549ff82c1de9fec8a2ed4b14624af870f6da","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.0.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0b2329a4976ddfff38e9039162fb176acc1df49c","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.0.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.2":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.0.2","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cb54665915f1df045b1ee702c2c17e3dc65f413e","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.0.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.3":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.0.3","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.0.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"55214e9a933eccbbf44a39529348b8f872c8fa3a","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.0.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.4":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.0.4","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.0.4","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e5bda06f537bdaed6eba798551b96be52b64bcaa","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.0.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.5":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.0.5","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.0.5","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d458ea04c55725ae432d390acabe02a252a35ff6","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.0.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.1.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.1.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8fae263f89364fa615abd0cc0c7e439cef84bc31","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.1.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.1.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.1.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.1.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6f729c31cad190f2150cdff1e744397c176442b2","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.1.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.2.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a745b5ffb04ee920d15b5dbd959a2021d9b8b02f","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.2.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.2.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.2.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f4b26ec3a5d4dae0776c2aa806fd8d20010c1725","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.2.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.3.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.3.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a8118c0d100656a5395f607b9073364fc1cf3321","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.3.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.3.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"0.3.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"0.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmJsonOpts":{"file":"/home/substack/.npm/bouncy/0.3.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bouncy@0.3.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1ee686428cd30b9c595f5777858cc319608990cc","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-0.3.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.0","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"53578beefdf5a3b42855ec8bce52e3f48f6cd5da","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.1","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"07dddef4de8bc2253f3ce178c07f15477ad46592","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.2":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.2","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.2","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ed8f1c64cd65a6b15874fe2e0d5a146464c788a9","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.3":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.3","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9092086e8419f7b2ab914427199c78e8e12b45a3","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.4":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.4","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1729f9e68ddf857afe6c327807da85b480cfe03a","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.5":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.5","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"55b29e026ae208e18d73f54ae3b42a968395a4fd","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.6":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.6","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8366dcadbf948f911bc60fb58c8d46fd29b8fab1","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.6.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.0.8":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.0.8","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x","chunky":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.0.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"abd8700d5c1838db00fd828b9dd9cc5f7511df90","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.0.8.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.1.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.1.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","websocket-client":"1.0.x","chunky":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e168327cee883f40ceba7f3577a318612252006d","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.1.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.1.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.1.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.0.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","wsclient":"0.2.x","chunky":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dd6c05e00749a97810ec0de192729a0a13799835","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.1.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.2.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.2.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.1.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","wsclient":"0.2.x","chunky":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2cbe1785cb7f2e7c2b7bc859a3d0ebb820c6eb84","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.2.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.3.0":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.3.0","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.1.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","wsclient":"0.2.x","chunky":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2d0c80e4b29b941d3ee9cfa5e980e74129cd83f7","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.3.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.3.1":{"name":"bouncy","description":"Bounce HTTP requests around for a load balancer or http host router completely transparently","version":"1.3.1","repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"main":"index.js","bin":{"bouncy":"bin/bouncy.js"},"keywords":["http","parse","bounce","load","balancer","host","route","router","transparent"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"parsley":"0.1.x","morestreams":"0.0.2"},"devDependencies":{"tap":"0.0.x","lazy":"1.0.x","websocket-server":"1.4.x","wsclient":"0.2.x","chunky":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bouncy@1.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"08e7d47b505ce6c84c8a531c90e160ddb4f65212","tarball":"http://registry.npmjs.org/bouncy/-/bouncy-1.3.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-08-05T00:51:10.182Z","created":"2011-10-10T08:29:28.704Z","0.0.0":"2011-10-10T08:29:30.346Z","0.0.1":"2011-10-10T10:36:18.231Z","0.0.2":"2011-10-10T11:47:59.727Z","0.0.3":"2011-10-10T12:05:00.484Z","0.0.4":"2011-10-10T12:32:44.115Z","0.0.5":"2011-10-10T13:34:28.983Z","0.1.0":"2011-10-10T22:37:02.869Z","0.1.1":"2011-10-10T22:53:03.996Z","0.2.0":"2011-10-11T01:52:02.957Z","0.2.1":"2011-10-11T06:16:13.525Z","0.3.0":"2011-10-11T07:13:34.668Z","0.3.1":"2011-10-11T22:56:36.874Z","1.0.0":"2011-10-24T04:47:14.872Z","1.0.1":"2011-10-24T22:15:28.882Z","1.0.2":"2011-10-24T23:33:51.335Z","1.0.3":"2011-11-30T14:22:06.477Z","1.0.4":"2011-11-30T20:05:56.692Z","1.0.5":"2011-12-05T19:59:18.354Z","1.0.6":"2012-01-12T07:55:47.179Z","1.0.8":"2012-01-15T08:04:11.566Z","1.1.0":"2012-01-15T08:35:25.675Z","1.1.1":"2012-02-02T21:40:27.386Z","1.2.0":"2012-02-13T01:58:44.660Z","1.3.0":"2012-02-13T02:59:48.917Z","1.3.1":"2012-02-13T03:10:14.430Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/bouncy.git"},"users":{"fgribreau":true,"pid":true},"_attachments":{"bouncy-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-QAc0NJGzHw4R/DnsArFTVg==","length":82113,"stub":true},"bouncy-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-NIe3DQ+Uo89zmDWbf33KTQ==","length":81946,"stub":true},"bouncy-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-7UrPj2cuBNow9JuPmxzmew==","length":81161,"stub":true},"bouncy-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-+9cnhDXnEABSj6nILqfwUw==","length":81532,"stub":true},"bouncy-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-qNkoOY97JdbdZp02H2T4rg==","length":81424,"stub":true},"bouncy-1.0.8.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-YWdniVVtkKLeeGU3Ny8aBA==","length":81245,"stub":true},"bouncy-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-M5+bAMZI0CP4hYgPsRfSyg==","length":79983,"stub":true},"bouncy-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ykWI0ZvsHVJXdX0RGY9vSg==","length":80554,"stub":true},"bouncy-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-QQlWsVW3SrSj0vOSoFbC5g==","length":80454,"stub":true},"bouncy-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-PHDk4bYLY72VU6nbg2g67Q==","length":80422,"stub":true},"bouncy-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-I1/SCCiTaT26LmNPmpFIug==","length":80297,"stub":true},"bouncy-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-0LKh4cfMLVSBPZEdFJKi0w==","length":80099,"stub":true},"bouncy-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-O65EKceA92lTKR1waezofQ==","length":80001,"stub":true},"bouncy-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-bF18PdIErfVxmJA7XDrIQA==","length":79024,"stub":true},"bouncy-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-/O19nBRgfHbOd1pRo2RIMQ==","length":11242,"stub":true},"bouncy-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-RIqjLrrICJR+PZ8dZ4gpZw==","length":7215,"stub":true},"bouncy-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-nSCiUYxPFs7FxFy8mM9YzQ==","length":6693,"stub":true},"bouncy-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-zlAIXvHVSAHKggge2pUw/g==","length":6461,"stub":true},"bouncy-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-FKY2qAYc080Uv5d2xhPdzw==","length":6430,"stub":true},"bouncy-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vfyFuwWrT4S+UmCkdQHSYg==","length":5310,"stub":true},"bouncy-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KuMX47IZsOAAHFZ5jxuPAw==","length":4896,"stub":true},"bouncy-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Prgi7mQmlFCgXXFCtnoKvw==","length":4251,"stub":true},"bouncy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4/O8xDIT6tf3f5hO8bbfqA==","length":4250,"stub":true},"bouncy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-wJlWzbA0eONwu/P+bCxirg==","length":3582,"stub":true},"bouncy-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-gvEnOi2NKea4edWip/5xSw==","length":1355,"stub":true}}}},
{"id":"bower","key":"bower","value":{"rev":"3-286d1ee87cbd39ced4e52cf92bfed9e4"},"doc":{"_id":"bower","_rev":"3-286d1ee87cbd39ced4e52cf92bfed9e4","name":"bower","description":"The browser package manager.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"bower","description":"The browser package manager.","version":"1.0.0","author":{"name":"some twitter nerds"},"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/MIT"}],"main":"lib","homepage":"http://twitter.github.com/bower","engines":{"node":">= 0.8.0"},"dependencies":{"tmp":"latest","vows":"latest","glob":"latest","nopt":"latest","archy":"latest","async":"latest","colors":"latest","rimraf":"latest","mkdirp":"latest","semver":"latest","request":"latest","fstream":"latest","hogan.js":"latest","underscore":"latest","read-package-json":"latest"},"devDependencies":{"mocha":"latest"},"bin":{"bower":"bin/bower"},"preferGlobal":true,"readme":"BOWER\n=====\n\n### Introduction\n\nBower is a package manager for the web. Bower lets you easily install assets such as images, CSS and JavaScript, and manages dependencies for you.\n\nFor example, to install a package, run:\n\n    bower install jquery\n\nThis will download jQuery to `./components/jquery`. That's it. The idea is that Bower does package management and package management only.\n\n### Installing Bower\n\nBower is installed using [Node](http://nodejs.org/) and [npm](http://npmjs.org/) (oh my, how meta).\n\n    npm install bower -g\n\n### Usage\n\nYour best friend at this stage is probably `bower --help`.\n\nTo install a package:\n\n    bower install jquery\n    bower install git://github.com/maccman/package-jquery.git\n    bower install http://code.jquery.com/jquery-1.7.2.js\n    bower install ./repos/jquery\n\nAs you can see, packages can be installed by name, Git endpoint, URL or local path.\n\nTo update a package, you need to reference it by name:\n\n    bower update jquery-ui\n\nTo list installed packages:\n\n    bower list\n\nTo search for packages:\n\n    bower search [name]\n\nTo list all the available packages, just call `bower search` without specifying a name.\n\n### Defining a package\n\nYou can create a `component.json` file in your project's root, specifying all of its dependencies. This is similar to Node's `package.json`, or Ruby's `Gemfile`, and is useful for locking down a project dependencies.\n\n```json\n{\n  \"name\": \"myProject\",\n  \"version\": \"1.0.0\",\n  \"dependencies\": {\n    \"jquery\": \"~1.7.2\"\n  }\n}\n```\n\nPut this under your project's root, listing all of your dependencies. When you run `bower install`, bower will read this `component.json` file, resolve all the relevant dependencies and install them.\n\n### Installing dependencies\n\nDependencies are installed locally via the `bower install` command. First they’re resolved to find conflicts. Then they’re downloaded and unpacked in a local sub directory called `./components`, for example:\n\n\n```\n/component.json\n/components/jquery/index.js\n/components/jquery/component.json\n```\n\nYou can also install packages one at a time `bower install git://my/git/thing`\n\nThere are no system wide dependencies, no dependencies are shared between different apps, and the dependency tree is flat.\n\n### Deploying\n\nThe easiest approach is to use bower statically, just reference the packages manually from a script tag:\n\n    <script src=\"components/jquery/index.js\"></script>\n\nFor more complex projects, you'll probably want to concatenate your scripts. Bower is just a package manager, but there are lots of awesome libraries out there to help you do this, such as [Sprockets](https://github.com/sstephenson/sprockets) and [RequireJS](http://requirejs.org/).\n\nFor example, to use Sprockets:\n\n```ruby\nenvironment = Sprockets::Environment.new\nenvironment.append_path 'components'\nenvironment.append_path 'public'\nrun environment\n```\n\n### Philosophy\n\nCurrently, people are managing dependencies, such as JavaScript libraries, manually. This sucks, and we want to change it.\n\nIn a nutshell, Bower is a generic tool which will resolve dependencies and lock packages down to a version. It runs over Git, and is package-agnostic. A package may contain JavaScript, CSS, images, etc., and doesn't rely on any particular transport (AMD, CommonJS, etc).\n\nBower then makes available a simple programatic api which exposes the package dependency model, so that existing build tools (like Sprockets, LoadBuilder, curls.js, Ender, etc.) can consume it and build files accordingly.\n\n### Authoring packages\n\nTo register a new package, it's as simple as specifying a `component.json`, pushing the package to a Git endpoint, say GitHub, and running:\n\n    bower register myawesomepackagename git://github.com/maccmans/face\n\nThere's no authentication or user management. It's on a first come, first served basis. Think of it like a URL shortener. Now anyone can run `bower install myawesomepackagename`, and get your library installed.\n\n### Contact\n\nHave a question? Ask on our mailing list!\n\ntwitter-bower@googlegroups.com\n\nhttp://groups.google.com/group/twitter-bower\n\n### Authors\n\n+ [@fat](http://github.com/fat)\n+ [@maccman](http://github.com/maccman)\n\nThanks for assistance and contributions:\n\n+ [@addyosmani](http://github.com/addyosmani)\n+ [@angus-c](http://github.com/angus-c)\n+ [@borismus](http://github.com/borismus)\n+ [@chriseppstein](http://github.com/chriseppstein)\n+ [@danwrong](http://github.com/danwrong)\n+ [@desandro](http://github.com/desandro)\n+ [@isaacs](http://github.com/isaacs)\n+ [@josh](http://github.com/josh)\n+ [@jrburke](http://github.com/jrburke)\n+ [@mklabs](http://github.com/mklabs)\n+ [@paulirish](http://github.com/paulirish)\n+ [@rvagg](http://github.com/rvagg)\n+ [@sindresorhus](http://github.com/sindresorhus)\n+ [@SlexAxton](http://github.com/SlexAxton)\n+ [@sstephenson](http://github.com/sstephenson)\n+ [@tomdale](http://github.com/tomdale)\n+ [@visionmedia](http://github.com/visionmedia)\n+ [@wagenet](http://github.com/wagenet)\n+ [@wycats](http://github.com/wycats)\n","_id":"bower@1.0.0","dist":{"shasum":"1018a9f9b97ea27b9d6dc25eea65cfb1b78c3d79","tarball":"http://registry.npmjs.org/bower/-/bower-1.0.0.tgz"},"maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}]}},"readme":"BOWER\n=====\n\n### Introduction\n\nBower is a package manager for the web. Bower lets you easily install assets such as images, CSS and JavaScript, and manages dependencies for you.\n\nFor example, to install a package, run:\n\n    bower install jquery\n\nThis will download jQuery to `./components/jquery`. That's it. The idea is that Bower does package management and package management only.\n\n### Installing Bower\n\nBower is installed using [Node](http://nodejs.org/) and [npm](http://npmjs.org/) (oh my, how meta).\n\n    npm install bower -g\n\n### Usage\n\nYour best friend at this stage is probably `bower --help`.\n\nTo install a package:\n\n    bower install jquery\n    bower install git://github.com/maccman/package-jquery.git\n    bower install http://code.jquery.com/jquery-1.7.2.js\n    bower install ./repos/jquery\n\nAs you can see, packages can be installed by name, Git endpoint, URL or local path.\n\nTo update a package, you need to reference it by name:\n\n    bower update jquery-ui\n\nTo list installed packages:\n\n    bower list\n\nTo search for packages:\n\n    bower search [name]\n\nTo list all the available packages, just call `bower search` without specifying a name.\n\n### Defining a package\n\nYou can create a `component.json` file in your project's root, specifying all of its dependencies. This is similar to Node's `package.json`, or Ruby's `Gemfile`, and is useful for locking down a project dependencies.\n\n```json\n{\n  \"name\": \"myProject\",\n  \"version\": \"1.0.0\",\n  \"dependencies\": {\n    \"jquery\": \"~1.7.2\"\n  }\n}\n```\n\nPut this under your project's root, listing all of your dependencies. When you run `bower install`, bower will read this `component.json` file, resolve all the relevant dependencies and install them.\n\n### Installing dependencies\n\nDependencies are installed locally via the `bower install` command. First they’re resolved to find conflicts. Then they’re downloaded and unpacked in a local sub directory called `./components`, for example:\n\n\n```\n/component.json\n/components/jquery/index.js\n/components/jquery/component.json\n```\n\nYou can also install packages one at a time `bower install git://my/git/thing`\n\nThere are no system wide dependencies, no dependencies are shared between different apps, and the dependency tree is flat.\n\n### Deploying\n\nThe easiest approach is to use bower statically, just reference the packages manually from a script tag:\n\n    <script src=\"components/jquery/index.js\"></script>\n\nFor more complex projects, you'll probably want to concatenate your scripts. Bower is just a package manager, but there are lots of awesome libraries out there to help you do this, such as [Sprockets](https://github.com/sstephenson/sprockets) and [RequireJS](http://requirejs.org/).\n\nFor example, to use Sprockets:\n\n```ruby\nenvironment = Sprockets::Environment.new\nenvironment.append_path 'components'\nenvironment.append_path 'public'\nrun environment\n```\n\n### Philosophy\n\nCurrently, people are managing dependencies, such as JavaScript libraries, manually. This sucks, and we want to change it.\n\nIn a nutshell, Bower is a generic tool which will resolve dependencies and lock packages down to a version. It runs over Git, and is package-agnostic. A package may contain JavaScript, CSS, images, etc., and doesn't rely on any particular transport (AMD, CommonJS, etc).\n\nBower then makes available a simple programatic api which exposes the package dependency model, so that existing build tools (like Sprockets, LoadBuilder, curls.js, Ender, etc.) can consume it and build files accordingly.\n\n### Authoring packages\n\nTo register a new package, it's as simple as specifying a `component.json`, pushing the package to a Git endpoint, say GitHub, and running:\n\n    bower register myawesomepackagename git://github.com/maccmans/face\n\nThere's no authentication or user management. It's on a first come, first served basis. Think of it like a URL shortener. Now anyone can run `bower install myawesomepackagename`, and get your library installed.\n\n### Contact\n\nHave a question? Ask on our mailing list!\n\ntwitter-bower@googlegroups.com\n\nhttp://groups.google.com/group/twitter-bower\n\n### Authors\n\n+ [@fat](http://github.com/fat)\n+ [@maccman](http://github.com/maccman)\n\nThanks for assistance and contributions:\n\n+ [@addyosmani](http://github.com/addyosmani)\n+ [@angus-c](http://github.com/angus-c)\n+ [@borismus](http://github.com/borismus)\n+ [@chriseppstein](http://github.com/chriseppstein)\n+ [@danwrong](http://github.com/danwrong)\n+ [@desandro](http://github.com/desandro)\n+ [@isaacs](http://github.com/isaacs)\n+ [@josh](http://github.com/josh)\n+ [@jrburke](http://github.com/jrburke)\n+ [@mklabs](http://github.com/mklabs)\n+ [@paulirish](http://github.com/paulirish)\n+ [@rvagg](http://github.com/rvagg)\n+ [@sindresorhus](http://github.com/sindresorhus)\n+ [@SlexAxton](http://github.com/SlexAxton)\n+ [@sstephenson](http://github.com/sstephenson)\n+ [@tomdale](http://github.com/tomdale)\n+ [@visionmedia](http://github.com/visionmedia)\n+ [@wagenet](http://github.com/wagenet)\n+ [@wycats](http://github.com/wycats)\n","maintainers":[{"name":"fat","email":"jacobthornton@gmail.com"}],"time":{"modified":"2012-08-14T15:33:23.506Z","created":"2012-08-14T15:33:22.342Z","1.0.0":"2012-08-14T15:33:23.506Z"},"author":{"name":"some twitter nerds"},"_attachments":{"bower-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DaJqtLgCVsrttqYMdNekPQ==","length":15069,"stub":true}}}},
{"id":"bowser","key":"bowser","value":{"rev":"23-b29fc78ad7c83f14dd46581591703c0b"},"doc":{"_id":"bowser","_rev":"23-b29fc78ad7c83f14dd46581591703c0b","name":"bowser","description":"a browser detector","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"bowser","description":"a browser detector","version":"0.0.1","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"@ded"},"repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"main":"./bowser.js","_id":"bowser@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.14","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"69155a1b2273a8cfef4c030bd4aa43f7c9d03c61","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.1.tgz"}},"0.0.2":{"name":"bowser","description":"a browser detector","version":"0.0.2","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"@ded"},"repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"main":"./bowser.js","dependencies":{},"devDependencies":{},"_id":"bowser@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.4.1","_defaultsLoaded":true,"dist":{"shasum":"9a14754d0ca6017f286e0c58bbd302ee8a09cb2c","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.2.tgz"}},"0.0.3":{"name":"bowser","description":"a browser detector","version":"0.0.3","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"@ded"},"repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"main":"./bowser.js","dependencies":{},"devDependencies":{},"_id":"bowser@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6c6adb2d969365b1058f77b34803561d2ffc22cd","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.3.tgz"},"scripts":{}},"0.0.4":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.0.4","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"@ded"},"repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"main":"./bowser.js","dependencies":{},"devDependencies":{},"_id":"bowser@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"720794fd0f32f3204af946b6ffd9dbf8c90fa3d1","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.4.tgz"},"scripts":{}},"0.0.5":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.0.5","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"@ded"},"repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"main":"./bowser.js","dependencies":{},"devDependencies":{},"_id":"bowser@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d868f7112cc67a230ed9436b6d93e777e842c654","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.5.tgz"},"scripts":{}},"0.0.6":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.0.6","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"main":"./bowser.js","repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"devDependencies":{"smoosh":"*"},"_npmJsonOpts":{"file":"/Users/dustin/.npm/bowser/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bowser@0.0.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"31cde610e746878e7453b1e20cd26cada05d1600","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.6.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"}]},"0.0.7":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.0.7","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"main":"./bowser.js","repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"devDependencies":{"smoosh":"*"},"_npmJsonOpts":{"file":"/Users/dustin/.npm/bowser/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bowser@0.0.7","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"115c146f7c684a9c90b4a0ca9d0ce9a0b951c12c","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.7.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"}]},"0.0.8":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.0.8","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"main":"./bowser.js","repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"devDependencies":{"smoosh":"*"},"_npmJsonOpts":{"file":"/Users/diaz/.npm/bowser/0.0.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bowser@0.0.8","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"c99caa666e1fb5cdb902f9f4471da9771a2392e0","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.8.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"}]},"0.0.9":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.0.9","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"main":"./bowser.js","repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"devDependencies":{"smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bowser@0.0.9","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5912ff44f638812d71c7bac7c38a4d72760badae","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.0.9.tgz"},"maintainers":[{"name":"ded","email":"polvero@gmail.com"}]},"0.1.0":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.1.0","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"main":"./bowser.js","repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"devDependencies":{"smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bowser@0.1.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f4f1ee1f331fdece9f28be980dceeef73d821131","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.1.0.tgz"},"readme":"Bowser\n------\nA Browser detector. Because sometimes, there is no other way, and not even good modern browsers always provide good feature detection mechanisms.\n\nSo... it works like this:\n\n``` js\nif (bowser.msie && bowser.version <= 6) {\n  alert('Hello China');\n}\n```\n\nDetected Browsers\n-----\n\n  * msie\n  * safari[webkit]\n  * chrome[webkit]\n  * firefox[gecko]\n  * opera\n\nNotes\n----\nSafari, Chrome, and Firefox will report that they have webkit|gecko engines\n\n``` js\nif (bowser.webkit) {\n  // do stuff with safari & chrome\n}\n```\n\nEnder installation\n-----\nIf you don't already have [Ender](http://ender.no.de) (an npm package) install it now (and don't look back)\n\n    $ npm install ender\n\nthen add bowser to your module collection\n\n    $ ender add bowser\n\nuse it like this:\n\n``` js\nif ($.browser.chrome) {\n  alert('Hello Silicon Valley');\n}\n```\n\nGraded Browser Support\n---------\nOne useful feature of Bowser is that aside from checking one browser from another -- it will keep up to date with [Yahoo's Graded Browser Support](http://developer.yahoo.com/yui/articles/gbs/) chart, giving you access to each grade on the bowser object\n\n``` js\nif (bowser.a) {\n  // support full feature set\n}\nelse if (bowser.c) {\n  // serve degraded version\n}\nelse {\n  // unsupported (bowser.x)\n}","maintainers":[{"name":"ded","email":"polvero@gmail.com"}]},"0.2.0":{"name":"bowser","description":"a browser detector","keywords":["ender","browser","sniff","detection"],"version":"0.2.0","homepage":"https://github.com/ded/bowser","author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"main":"./bowser.js","repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"devDependencies":{"smoosh":"*"},"_npmUser":{"name":"ded","email":"polvero@gmail.com"},"_id":"bowser@0.2.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3a7174e8863b5a5ccb8297218764535c4dad54d4","tarball":"http://registry.npmjs.org/bowser/-/bowser-0.2.0.tgz"},"readme":"Bowser\n------\nA Browser detector. Because sometimes, there is no other way, and not even good modern browsers always provide good feature detection mechanisms.\n\nSo... it works like this:\n\n``` js\nif (bowser.msie && bowser.version <= 6) {\n  alert('Hello China');\n}\n```\n\nDetected Browsers\n-----\n\n  * msie\n  * safari[webkit]\n  * chrome[webkit]\n  * firefox[gecko]\n  * opera\n\nNotes\n----\nSafari, Chrome, and Firefox will report that they have webkit|gecko engines\n\n``` js\nif (bowser.webkit) {\n  // do stuff with safari & chrome\n}\n```\n\nEnder installation\n-----\nIf you don't already have [Ender](http://ender.no.de) (an npm package) install it now (and don't look back)\n\n    $ npm install ender\n\nthen add bowser to your module collection\n\n    $ ender add bowser\n\nuse it like this:\n\n``` js\nif ($.browser.chrome) {\n  alert('Hello Silicon Valley');\n}\n```\n\nGraded Browser Support\n---------\nOne useful feature of Bowser is that aside from checking one browser from another -- it will keep up to date with [Yahoo's Graded Browser Support](http://developer.yahoo.com/yui/articles/gbs/) chart, giving you access to each grade on the bowser object\n\n``` js\nif (bowser.a) {\n  // support full feature set\n}\nelse if (bowser.c) {\n  // serve degraded version\n}\nelse {\n  // unsupported (bowser.x)\n}","maintainers":[{"name":"ded","email":"polvero@gmail.com"}]}},"maintainers":[{"name":"ded","email":"polvero@gmail.com"}],"time":{"modified":"2012-04-17T01:54:32.310Z","created":"2011-04-27T22:18:03.301Z","0.0.1":"2011-04-27T22:18:03.579Z","0.0.2":"2011-05-02T20:34:40.504Z","0.0.3":"2011-05-10T16:50:52.568Z","0.0.4":"2011-05-17T18:39:52.891Z","0.0.5":"2011-05-19T17:32:37.929Z","0.0.6":"2011-09-26T23:59:35.123Z","0.0.7":"2011-09-27T00:01:12.683Z","0.0.8":"2011-10-11T08:03:24.648Z","0.0.9":"2011-11-05T20:15:56.607Z","0.1.0":"2012-02-07T19:01:06.166Z","0.2.0":"2012-04-17T01:54:32.309Z"},"author":{"name":"Dustin Diaz","email":"dustin@dustindiaz.com","url":"http://dustindiaz.com"},"repository":{"type":"git","url":"git://github.com/ded/bowser.git"},"_attachments":{"bowser-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-61Cp+SsjfDA9/CBeXFuAlw==","length":3220,"stub":true},"bowser-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-p3+eCkhqwiG4+nrf/XN1Vg==","length":3099,"stub":true},"bowser-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-h30cSswH6zacOiiq/YjdKw==","length":10240,"stub":true},"bowser-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-dZatwOpZxpDgW+2MJMPpdQ==","length":2898,"stub":true},"bowser-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-XbRaayLbh44LBaH3GeoD/g==","length":2830,"stub":true},"bowser-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Eesc2wS8xsY0Dta3ylCP5w==","length":2840,"stub":true},"bowser-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-O3zs2BMwm+Ppp3a6b1e3Kg==","length":2537,"stub":true},"bowser-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-TlDYrxC3sVLsXvOq3+19Fg==","length":2528,"stub":true},"bowser-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-o/QbeIKJG2FhjaQaYChKHQ==","length":2497,"stub":true},"bowser-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-kwWupLjYRrC4UB5UbDR81w==","length":2139,"stub":true},"bowser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fGu5GjI0bJGZwy0ZgkBnCA==","length":2140,"stub":true}}}},
{"id":"box","key":"box","value":{"rev":"19-a312dab9823893de5908cc4973ffbb02"},"doc":{"_id":"box","_rev":"19-a312dab9823893de5908cc4973ffbb02","name":"box","description":"Powerful key -> value storage for the CLI.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.0":{"name":"box","version":"0.0.0","description":"Powerful key -> value storage for the CLI.","keywords":["cli storage","storage","cli"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2"},"repository":{"type":"git","url":"git://github.com/vesln/box.git"},"homepage":"http://github.com/vesln/box","scripts":{"test":"make test"},"main":"./lib/index","engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"box@0.0.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"6f7aa4292ba5a6e03b843003ce645807978375f4","tarball":"http://registry.npmjs.org/box/-/box-0.0.0.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}],"directories":{}},"0.0.1":{"name":"box","version":"0.0.1","description":"Powerful key -> value storage for the CLI.","keywords":["cli storage","storage","cli"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"flatiron":"~0.1.7"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2","sinon":"1.3.1"},"repository":{"type":"git","url":"git://github.com/vesln/box.git"},"homepage":"http://github.com/vesln/box","scripts":{"test":"make test"},"main":"./lib/cli","bin":{"box":"./bin/box"},"engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"box@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"5fd761663f3539adb7e62b617796bc46a166885b","tarball":"http://registry.npmjs.org/box/-/box-0.0.1.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}],"directories":{}},"0.0.2":{"name":"box","version":"0.0.2","description":"Powerful key -> value storage for the CLI.","keywords":["cli storage","storage","cli"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"flatiron":"~0.1.7"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2","sinon":"1.3.1"},"repository":{"type":"git","url":"git://github.com/vesln/box.git"},"homepage":"http://github.com/vesln/box","scripts":{"test":"make test"},"main":"./lib/cli","bin":{"box":"./bin/box"},"engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"box@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"b843c63adfe0b27494a97435dc73d62fae2f996a","tarball":"http://registry.npmjs.org/box/-/box-0.0.2.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}],"directories":{}},"0.0.3":{"name":"box","version":"0.0.3","description":"Powerful key -> value storage for the CLI.","keywords":["cli storage","storage","cli"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"flatiron":"~0.1.7"},"devDependencies":{"mocha":"0.3.3","should":"0.3.2","sinon":"1.3.1"},"repository":{"type":"git","url":"git://github.com/vesln/box.git"},"homepage":"http://github.com/vesln/box","scripts":{"test":"make test","postinstall":"make init"},"main":"./lib/cli","bin":{"box":"./bin/box"},"engines":{"node":">= 0.6.0 < 0.7.0"},"_npmUser":{"name":"vesln","email":"hi@vesln.com"},"_id":"box@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"1870f7f19da4636c7cd22e79fe338c376fb2fb28","tarball":"http://registry.npmjs.org/box/-/box-0.0.3.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}]},"0.0.4":{"name":"box","version":"0.0.4","description":"Powerful key -> value storage for the CLI.","keywords":["cli storage","storage","cli"],"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"dependencies":{"flatiron":"~0.1.7"},"devDependencies":{"mocha":"*","chai":"*","sinon":"1.3.1"},"repository":{"type":"git","url":"http://github.com/vesln/box.git"},"homepage":"http://github.com/vesln/box","scripts":{"test":"make test","postinstall":"make init"},"main":"./lib/cli","bin":{"box":"./bin/box"},"engines":{"node":">= 0.6.0"},"_id":"box@0.0.4","dist":{"shasum":"3143784d9c99237a637233a1b73a76e2ee31761b","tarball":"http://registry.npmjs.org/box/-/box-0.0.4.tgz"},"maintainers":[{"name":"vesln","email":"hi@vesln.com"}]}},"readme":"[![Build Status](https://secure.travis-ci.org/vesln/box.png)](http://travis-ci.org/vesln/box)\n\n# box - Powerful key -> value storage for the CLI.\n\n## Description\n\n## Features\n\n## Synopsis\n\n## Requirements\n\n- NPM (http://npmjs.org/)\n- Node.js 0.6 (http://nodejs.org/)\n\n## Install\n\n```\n$ npm install box\n```\n\n## Tests\n\n```\n$ npm install\n$ make test\n```\n\n## License\n\nMIT License\n\nCopyright (C) 2012 Veselin Todorov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","maintainers":[{"name":"vesln","email":"hi@vesln.com"}],"time":{"modified":"2012-06-25T18:12:50.191Z","created":"2012-01-28T17:07:11.838Z","0.0.0":"2012-01-28T17:07:13.629Z","0.0.1":"2012-01-28T21:45:09.163Z","0.0.2":"2012-01-28T21:49:49.139Z","0.0.3":"2012-01-28T22:09:30.435Z","0.0.4":"2012-06-25T18:12:50.191Z"},"author":{"name":"Veselin Todorov","email":"hi@vesln.com"},"repository":{"type":"git","url":"http://github.com/vesln/box.git"},"_attachments":{"box-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-B6JbvLeoBBrajiB6Ai/lWA==","length":4455,"stub":true},"box-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-HZetgwPAKfGbxfU2Tt+q1Q==","length":4487,"stub":true},"box-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-fl2wDLiyjojlmP+mBEyi4w==","length":4391,"stub":true},"box-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-+b0D0/FH3IxljRfdbCu/hg==","length":4345,"stub":true},"box-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-r09BbkoeVY94v3mSMA0scQ==","length":1488,"stub":true}}}},
{"id":"box2d","key":"box2d","value":{"rev":"6-5c920e9829764cbf904b9a59474c1672"},"doc":{"_id":"box2d","_rev":"6-5c920e9829764cbf904b9a59474c1672","name":"box2d","description":"2D physics engine","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"box2d","version":"1.0.0","description":"2D physics engine","homepage":"http://github.com/jadell/box2dnode","author":{"name":"Josh Adell","email":"josh.adell@gmail.com","url":"http://everymansoftware.blogspot.com/"},"main":"./box2dnode","engines":["node"],"_id":"box2d@1.0.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/box2d/-/box2d-1.0.0.tgz"},"mtime":"2010-11-09T23:16:56Z","ctime":"2010-11-09T23:16:56Z"}},"maintainers":[{"name":"jadell","email":"josh.adell@gmail.com"}],"mtime":"2010-11-09T23:16:56Z","ctime":"2010-11-09T23:16:56Z","author":{"name":"Josh Adell","email":"josh.adell@gmail.com","url":"http://everymansoftware.blogspot.com/"},"_attachments":{"box2d-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rXMhpRBjNHISCnzMrkTmpQ==","length":45355,"stub":true}}}},
{"id":"box2dnode","key":"box2dnode","value":{"rev":"3-12ffe24dcc1478ea0008c60c4ef7118f"},"doc":{"_id":"box2dnode","_rev":"3-12ffe24dcc1478ea0008c60c4ef7118f","name":"box2dnode","description":"2D physics engine","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"box2dnode","version":"2.0.0","description":"2D physics engine","homepage":"http://github.com/m0rph3v5/box2dnode","repository":{"type":"git","url":"git://github.com/M0rph3v5/box2dnode.git"},"author":{"name":"Benjamin de Jager","email":"m0rph3v5@gmail.com","url":"http://m0rph3v5.com/"},"main":"./Box2D","engines":["node"],"_npmJsonOpts":{"file":"/Users/m0rph3v5/.npm/box2dnode/2.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"box2dnode@2.0.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.20","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"bd76485c611ea111341714c933505101a6aab6e7","tarball":"http://registry.npmjs.org/box2dnode/-/box2dnode-2.0.0.tgz"},"scripts":{}}},"maintainers":[{"name":"m0rph3v5","email":"m0rph3v5@gmail.com"}],"time":{"modified":"2011-07-24T13:06:03.816Z","created":"2011-07-24T13:06:01.048Z","2.0.0":"2011-07-24T13:06:03.816Z"},"author":{"name":"Benjamin de Jager","email":"m0rph3v5@gmail.com","url":"http://m0rph3v5.com/"},"repository":{"type":"git","url":"git://github.com/M0rph3v5/box2dnode.git"},"_attachments":{"box2dnode-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OSkh64ZSqOn0Gq51fb1B0w==","length":62331,"stub":true}}}},
{"id":"boxcar","key":"boxcar","value":{"rev":"10-db3484e22f90a83c9175dbc252bc462b"},"doc":{"_id":"boxcar","_rev":"10-db3484e22f90a83c9175dbc252bc462b","name":"boxcar","description":"An API for the Boxcar Push Notification Service","dist-tags":{"latest":"0.9.6"},"versions":{"0.9.0":{"name":"boxcar","description":"An API for the Boxcar Push Notification Service","keywords":["boxcar","push","notifications","package.json"],"version":"0.9.0","homepage":"http://boxcar.io/","author":{"name":"Russ Bradberry","email":"rbradberry@gmail.com","url":"http://devdazed.com"},"contributors":[],"repository":{"type":"git","url":"git://github.com/devdazed/boxcar-api.git"},"bugs":{"url":"http://github.com/devdazed/boxcar-api/issues"},"directories":{"lib":"./lib"},"engines":{"node":"0.4 || 0.5"},"licenses":[{"type":"MIT","url":"http://github.com/devdazed/boxcar-api/raw/master/LICENSE"}],"_id":"boxcar@0.9.0","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"base.js":"lib/base.js","base64.js":"lib/base64.js","md5.js":"lib/md5.js","provider.js":"lib/provider.js","user.js":"lib/user.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a19c0fa6300fbf3a7a4692b7fc1e33be0e35b943","tarball":"http://registry.npmjs.org/boxcar/-/boxcar-0.9.0.tgz"}},"0.9.1":{"name":"boxcar","description":"An API for the Boxcar Push Notification Service","keywords":["boxcar","push","notifications","push notifications","iphone"],"version":"0.9.1","main":"./index","homepage":"http://boxcar.io/","author":{"name":"Russ Bradberry","email":"rbradberry@gmail.com","url":"http://devdazed.com"},"repository":{"type":"git","url":"git://github.com/devdazed/boxcar-api.git"},"bugs":{"url":"http://github.com/devdazed/boxcar-api/issues"},"engines":{"node":"0.4 || 0.5"},"licenses":[{"type":"MIT","url":"http://github.com/devdazed/boxcar-api/raw/master/LICENSE"}],"_id":"boxcar@0.9.1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","directories":{"lib":"./lib"},"modules":{"base.js":"lib/base.js","base64.js":"lib/base64.js","md5.js":"lib/md5.js","provider.js":"lib/provider.js","user.js":"lib/user.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b5df93b0629d003e8353b5059ab0bcb2c57f5b3b","tarball":"http://registry.npmjs.org/boxcar/-/boxcar-0.9.1.tgz"}},"0.9.5":{"name":"boxcar","description":"An API for the Boxcar Push Notification Service","keywords":["boxcar","push","notifications","push notifications","iphone"],"version":"0.9.5","main":"./index","homepage":"http://boxcar.io/","author":{"name":"Russ Bradberry","email":"rbradberry@gmail.com","url":"http://devdazed.com"},"repository":{"type":"git","url":"git://github.com/devdazed/boxcar-api.git"},"bugs":{"url":"http://github.com/devdazed/boxcar-api/issues"},"engines":{"node":"0.4 || 0.5"},"licenses":[{"type":"MIT","url":"http://github.com/devdazed/boxcar-api/raw/master/LICENSE"}],"_npmUser":{"name":"devdazed","email":"rbradberry@gmail.com"},"_id":"boxcar@0.9.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.10","_defaultsLoaded":true,"dist":{"shasum":"ab9170d91bc34c43e86e87dd9444daf87057fb64","tarball":"http://registry.npmjs.org/boxcar/-/boxcar-0.9.5.tgz"},"maintainers":[{"name":"devdazed","email":"rbradberry@gmail.com"}]},"0.9.6":{"name":"boxcar","description":"An API for the Boxcar Push Notification Service","keywords":["boxcar","push","notifications","push notifications","iphone"],"version":"0.9.6","main":"./index","homepage":"http://boxcar.io/","author":{"name":"Russell Bradberry","email":"rbradberry@gmail.com"},"repository":{"type":"git","url":"git://github.com/devdazed/boxcar-api.git"},"bugs":{"url":"http://github.com/devdazed/boxcar-api/issues"},"engines":{"node":">0.4"},"licenses":[{"type":"MIT","url":"http://github.com/devdazed/boxcar-api/raw/master/LICENSE"}],"_npmUser":{"name":"devdazed","email":"rbradberry@gmail.com"},"_id":"boxcar@0.9.6","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"5e4974ffa0116f335e93b8f5a1697c0535c8006e","tarball":"http://registry.npmjs.org/boxcar/-/boxcar-0.9.6.tgz"},"maintainers":[{"name":"devdazed","email":"rbradberry@gmail.com"}]}},"maintainers":[{"name":"devdazed","email":"rbradberry@gmail.com"}],"time":{"modified":"2011-11-09T23:52:15.593Z","created":"2011-02-18T18:18:08.973Z","0.9.0":"2011-02-18T18:18:09.201Z","0.9.1":"2011-02-18T18:24:40.026Z","0.9.5":"2011-11-01T19:35:19.577Z","0.9.6":"2011-11-09T23:52:15.593Z"},"author":{"name":"Russell Bradberry","email":"rbradberry@gmail.com"},"repository":{"type":"git","url":"git://github.com/devdazed/boxcar-api.git"},"users":{"devdazed":true},"_attachments":{"boxcar-0.9.6.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-82M1Gq2WiJ/5fB8roJf5Jw==","length":10240,"stub":true},"boxcar-0.9.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ACzVSrlMxUJ1XpBZLZBd0A==","length":10240,"stub":true},"boxcar-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vsAPZNpQdEuQBX/xlrxEnA==","length":7938,"stub":true},"boxcar-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nAoaTLBY6VUmlT3Ui3n+eg==","length":7945,"stub":true}}}},
{"id":"boxcars","key":"boxcars","value":{"rev":"13-b222c3012a3bb44b69c95c07cbaa60ce"},"doc":{"_id":"boxcars","_rev":"13-b222c3012a3bb44b69c95c07cbaa60ce","name":"boxcars","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"boxcars","version":"0.0.1","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"keywords":["data-structures","collections"],"directories":{"lib":"./lib"},"main":"lib/index.js","dependencies":{"functools":"1.x"},"devDependencies":{"one":"1.x","highkick":"1.x","lowkick":"0.x"},"repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_npmUser":{"name":"azer","email":"azer@kodfabrik.com"},"_id":"boxcars@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5aa515dc7cfe3a22c5bebfe8a8531504cec286e7","tarball":"http://registry.npmjs.org/boxcars/-/boxcars-0.0.1.tgz"},"maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}]},"0.0.2":{"name":"boxcars","version":"0.0.2","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"keywords":["data-structures","collections"],"directories":{"lib":"./lib"},"main":"lib/index.js","repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_npmUser":{"name":"azer","email":"azer@kodfabrik.com"},"_id":"boxcars@0.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c70c406b55e385471bcea840e260ff3667b81fdb","tarball":"http://registry.npmjs.org/boxcars/-/boxcars-0.0.2.tgz"},"maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}]},"0.0.3":{"name":"boxcars","version":"0.0.3","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"keywords":["data-structures","collections"],"main":"boxcars.js","repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_npmUser":{"name":"azer","email":"azer@kodfabrik.com"},"_id":"boxcars@0.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"b4b8adb1f2a85a49894bbd40495104e6ec10c390","tarball":"http://registry.npmjs.org/boxcars/-/boxcars-0.0.3.tgz"},"maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}]},"0.0.4":{"name":"boxcars","version":"0.0.4","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"keywords":["data-structures","collections"],"main":"boxcars.js","repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_npmUser":{"name":"azer","email":"azer@kodfabrik.com"},"_id":"boxcars@0.0.4","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"6674a70432897cdab14085c175602e0d6f685365","tarball":"http://registry.npmjs.org/boxcars/-/boxcars-0.0.4.tgz"},"maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}]},"0.0.5":{"name":"boxcars","version":"0.0.5","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"keywords":["data-structures","collections"],"main":"boxcars.js","devDependencies":{"highkick":"1.x","lowkick":"0.x"},"scripts":{"test":"node test/run_node.js"},"repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_npmUser":{"name":"azer","email":"azer@kodfabrik.com"},"_id":"boxcars@0.0.5","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"4ca1d3b892bfb6096df18578466fc8523e534bff","tarball":"http://registry.npmjs.org/boxcars/-/boxcars-0.0.5.tgz"},"maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}]},"0.0.6":{"name":"boxcars","version":"0.0.6","description":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.","author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"keywords":["data-structures","collections"],"main":"boxcars.js","devDependencies":{"highkick":"1.x","lowkick":"0.x"},"scripts":{"test":"node test/run_node.js"},"repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_npmUser":{"name":"azer","email":"azer@kodfabrik.com"},"_id":"boxcars@0.0.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"02c16eae71d77a9556ebb5c06627c90636f584bf","tarball":"http://registry.npmjs.org/boxcars/-/boxcars-0.0.6.tgz"},"maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}]}},"readme":"boxcars is a tiny collection library that comes with built-in caching for preloading contents.\n\n![](http://berraksular.com/static/beat.jpg)\n\nInstall\n=======\n```\n$ npm install boxcars\n```\n\nUsage\n=====\n```javascript\nvar boxcars  = require('boxcars'),\n    mustache = require('mustache');\n\nvar templates = boxcars();\n\ntemplates('templates/foo.html', 'templates/bar.html', 'templates/quux.html', function(error, templates){\n  if(error) throw error;\n\n  console.log( templates[0] ); // will put the content of templates/foo.html\n\n  // objects or arrays can be passed, as well\n  templates({ 'corge': 'templates/corge.html', 'eggs': 'templates/eggs.html' }, function(error, moreTemplates){\n    if(error) throw error;\n\n    console.log( moreTemplates.corge );\n\n  });\n\n});\n\n```\n\nPreloading:\n\n```javascript\ntemplates.cache({\n  'quux.json': '{}',\n  'templates/foo.html': '<strong>Hello {{ name }}!</strong>',\n  'templates/bar.html': '<strong>Hello {{ name }}!</strong>'\n});\n```\n\nReset the cache:\n\n```javascript\ntemplates.cache(undefined);\n```\n\nTesting\n=======\nPublish the tests and visit localhost:1314 with the browser you want to test.\n```\n$ make publish-tests\n```\n\nTo see the summary of the results;\n```bash\n$ make verify-tests\n```\n","maintainers":[{"name":"azer","email":"azer@kodfabrik.com"}],"time":{"modified":"2012-05-26T06:24:41.570Z","created":"2012-04-10T02:52:45.650Z","0.0.1":"2012-04-10T02:52:46.066Z","0.0.2":"2012-04-16T11:37:20.411Z","0.0.3":"2012-04-16T12:07:12.801Z","0.0.4":"2012-04-16T12:21:05.151Z","0.0.5":"2012-05-01T20:15:50.546Z","0.0.6":"2012-05-26T06:24:41.570Z"},"author":{"name":"Azer Koculu","email":"azer@kodfabrik.com"},"repository":{"type":"git","url":"git://github.com/azer/boxcars.git"},"_attachments":{"boxcars-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-epDxicRi90Te4JcP2g6CDg==","length":10894,"stub":true},"boxcars-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-xbOJxGXAn15Xa8DvpqmTHQ==","length":10855,"stub":true},"boxcars-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-JyfasfhIDD0CqWQsT9uh0Q==","length":2085,"stub":true},"boxcars-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gj0clCHp0xMJJ2dDGCbTmQ==","length":1980,"stub":true},"boxcars-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-fTJJnGcUyX/ARgskZycUFA==","length":1982,"stub":true},"boxcars-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xr+dYtuufBxHTHfmgfiWQg==","length":1833,"stub":true}}}},
{"id":"boxeen","key":"boxeen","value":{"rev":"3-299b42ea87c22d018581954bcc995e2d"},"doc":{"_id":"boxeen","_rev":"3-299b42ea87c22d018581954bcc995e2d","name":"boxeen","description":"Boxee API wrapper","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"boxeen","description":"Boxee API wrapper","version":"0.1.0","author":{"name":"S�rgio Ramos","email":"mail@sergioramos.me"},"keywords":["boxee","API","wrapper"],"repository":{"type":"git","url":"git://github.com/ramitos/boxeen.git"},"dependencies":{"xml2json":"0.2.4"},"engines":{"node":">= 0.4.0 <= 0.5.1"},"_npmUser":{"name":"ramitos","email":"mail@sergioramos.me"},"_id":"boxeen@0.1.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.0","_defaultsLoaded":true,"dist":{"shasum":"7d59b426cc3a72e2878db58f00f3ee24a1271b58","tarball":"http://registry.npmjs.org/boxeen/-/boxeen-0.1.0.tgz"},"maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}]}},"readme":"# Boxeen\nBoxee API wrapper for node\n\n# Install\n    $ npm install boxeen\n\n# Usage Example\n\n    var boxeen = require('boxeen');\n    \n    boxeen.find(1000, function(hosts) {\n        console.log('List of found hosts: \\n' + JSON.stringify(hosts));\n        \n        boxeen.GetVolume(hosts[0], function(e, volume) {\n            if(e) {\n                console.log(e);\n            } else {\n                console.log('Volume: ' + volume);\n            }\n        });\n    });\n\n# API\n\n**find**: Find hosts in the local network\n\n * @param {int} timeout in millisecons\n * @param {function(hosts)} callback (optional)\n\n\nhosts:\n\n    [\n        {\n            host: 'hostname',\n            port: 8800\n        },\n            ...\n    ]\n    \nusage:\n\n    boxeen.find(1000, function(hosts) {\n        console.log('List of found hosts: \\n' + JSON.stringify(hosts));\n    });\n\n**GetVolume**: Retrieves the current volume setting as a percentage of the maximum possible value.\n\n * @param {object} host\n * @param {function(error, volume)} callback (optional)\n\nusage:\n\n    boxeen.GetVolume(host, function(e, volume) {\n        if(e) {\n            console.log(e);\n        } else {\n            console.log('Volume: ' + volume);\n        }\n    });\n\n**SetVolume(percent)**: Sets the volume as a percentage of the maximum possible.\n\n    boxeen.SetVolume(host, 50, function(success) {\n        if(success) {\n            console.log('Volume changed');\n        } else {\n            console.log('Volume not changed');\n        }\n    });\n\n**Mute**: Toggles the sound on/off.\n\n    boxeen.Mute(host, function(success) {\n        if(success) {\n            console.log('Mute toggled');\n        } else {\n            console.log('Mute not toggled');\n        }\n    });\n\n**Pause**: Pauses the currently playing media.\n\n    boxeen.Pause(host, function(success) {\n        if(success) {\n            console.log('Pause toggled');\n        } else {\n            console.log('Pause not toggled');\n        }\n    });\n\n**Stop**: Stops the currently playing media.\n\n    boxeen.Stop(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Stoped');\n\t\t} else {\n\t\t\tconsole.log('Not Stoped');\n\t\t}\n\t});\n\n**PlayNext**: Starts playing/showing the next media/image in the current playlist or, if currently showing a slidshow, the slideshow playlist.\n\n    boxeen.PlayNext(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Playing Next');\n\t\t} else {\n\t\t\tconsole.log('Not Playing Next');\n\t\t}\n\t});\n\n**PlayPrev**: Starts playing/showing the previous media/image in the current playlist or, if currently showing a slidshow, the slideshow playlist.\n\n    boxeen.PlayPrev(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Playing Prev');\n\t\t} else {\n\t\t\tconsole.log('Not Playing Prev');\n\t\t}\n\t});\n\n\n**SeekPercentage(percentage)**: Sets the playing position of the currently playing media as a percentage of the media’s length.\n\n    boxeen.Stop(host, percentage, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Stoped');\n\t\t} else {\n\t\t\tconsole.log('Not Stoped');\n\t\t}\n\t});\n\n\n**SeekPercentageRelative(relative-percentage)**: Adds/Subtracts the current percentage on to the current postion in the song\n\n    boxeen.Stop(host, percentage, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Stoped');\n\t\t} else {\n\t\t\tconsole.log('Not Stoped');\n\t\t}\n\t});\n\n\n**GetPercentage**: Retrieves the current playing position of the currently playing media as a percentage of the media’s length.\n\n    boxeen.Back(host, function(e, percentage) {\n\t\tif(success) {\n\t\t\tconsole.log('Back');\n\t\t} else {\n\t\t\tconsole.log('!Back');\n\t\t}\n\t});\n\n\n**Up**: Click on UP button\n\n    boxeen.Up(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Up');\n\t\t} else {\n\t\t\tconsole.log('!Up');\n\t\t}\n\t});\n\n**Down**: Click on DOWN button\n\n    boxeen.Down(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Down');\n\t\t} else {\n\t\t\tconsole.log('!Down');\n\t\t}\n\t});\n\n**Left**: Click on LEFT button\n\n    boxeen.Left(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Left');\n\t\t} else {\n\t\t\tconsole.log('!Left');\n\t\t}\n\t});\n\n**Right**: Click on RIGHT button\n\n    boxeen.Right(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Right');\n\t\t} else {\n\t\t\tconsole.log('!Right');\n\t\t}\n\t});\n\n**Back**: Click on BACK button\n\n    boxeen.Back(host, function(success) {\n\t\tif(success) {\n\t\t\tconsole.log('Back');\n\t\t} else {\n\t\t\tconsole.log('!Back');\n\t\t}\n\t});\n\n**Backspace**: Sends an backspace key (used in keyboard)\n\n    boxeen.Backspace(host, function(success) {\n        if(success) {\n            console.log('Backspace Successefull');\n        } else {\n            console.log('Backspace not successefull');\n        }\n    });\n\n**SendKey()**: Sends an ASCII key (used in keyboard)\n\n    boxeen.SendKey(host, 27, function(success) {\n        if(success) {\n\t\t\tconsole.log('Key sent');\n\t\t} else {\n\t\t\tconsole.log('Key not sent');\n\t\t}\n\t});\n\n## Node Compatibility\n\nThis is only compatible with older versions of node because dgram.setBroadcast(flag) is not implemented in the newest versions.\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2009-2011 Sérgio Ramos &lt;mail@sergioramos.me&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"ramitos","email":"mail@sergioramos.me"}],"time":{"modified":"2011-12-11T04:00:57.684Z","created":"2011-12-11T04:00:55.963Z","0.1.0":"2011-12-11T04:00:57.684Z"},"author":{"name":"S�rgio Ramos","email":"mail@sergioramos.me"},"repository":{"type":"git","url":"git://github.com/ramitos/boxeen.git"},"_attachments":{"boxeen-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lqKPB9H+gmInUEvkGjWyHA==","length":10240,"stub":true}}}},
{"id":"boxer","key":"boxer","value":{"rev":"8-60c49ff8574d5a47616796ad991463ad"},"doc":{"_id":"boxer","_rev":"8-60c49ff8574d5a47616796ad991463ad","name":"boxer","description":"A Static Website Publishing Tool","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.3":{"name":"boxer","description":"A Static Website Publishing Tool","version":"0.0.3","author":{"name":"Anders Conbere","email":"aconbere@conbere.org"},"repository":{"type":"git","url":"http://github.com/aconbere/boxer.git"},"bugs":{"web":"http://github.com/aconbere/boxer/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/boxer","bin":{"boxer":"./bin/boxer.js"},"engines":{"node":">=0.1.93"},"licenses":[{"type":"MIT"}],"dependencies":{"optparse":"1.0.1","file":"0.1.0","yaml":"0.1.0","markdown":"0.1.0","mustache":"0.2.3"},"_id":"boxer@0.0.3","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/boxer/-/boxer-0.0.3.tgz"},"mtime":"2010-11-09T23:16:56Z","ctime":"2010-11-09T23:16:56Z"},"0.0.4":{"name":"boxer","description":"A Static Website Publishing Tool","version":"0.0.4","author":{"name":"Anders Conbere","email":"aconbere@conbere.org"},"repository":{"type":"git","url":"http://github.com/aconbere/boxer.git"},"bugs":{"web":"http://github.com/aconbere/boxer/issues"},"os":["linux","darwin","freebsd"],"directories":{"lib":"./lib/"},"main":"./lib/boxer","bin":{"boxer":"./bin/boxer.js"},"engines":{"node":">=0.1.93"},"licenses":[{"type":"MIT"}],"dependencies":{"optparse":"1.0.1","file":"0.1.1","yaml":"0.1.0","markdown":"0.1.2","mustache":"0.3.1-dev"},"_id":"boxer@0.0.4","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/boxer/-/boxer-0.0.4.tgz"},"mtime":"2010-11-09T23:16:57Z","ctime":"2010-11-09T23:16:57Z"}},"maintainers":[{"name":"aconbere","email":"aconbere@gmail.com"}],"mtime":"2010-11-09T23:16:57Z","ctime":"2010-11-09T23:16:56Z","author":{"name":"Anders Conbere","email":"aconbere@conbere.org"},"repository":{"type":"git","url":"http://github.com/aconbere/boxer.git"},"_attachments":{"boxer-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-l90RtOxl3w0U+LvcAkP0iw==","length":7073,"stub":true},"boxer-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SdrcmpVMRd4wKXY7sRPz+A==","length":5817,"stub":true}}}},
{"id":"boxit","key":"boxit","value":{"rev":"15-4242c1d9b246c685aaad336dd9a1d77f"},"doc":{"_id":"boxit","_rev":"15-4242c1d9b246c685aaad336dd9a1d77f","name":"boxit","description":"HTML and text file builder / collator","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.6":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.1.6","main":"index.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"*","handlebars":"*","out":"*","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/textsetter.git"},"bugs":{"url":"http://github.com/DamonOehlman/textsetter/issues"},"contributors":[],"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.1.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8f26e39b2461f9ca538a7e7d9576140b8819afc7","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.1.6.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.1.7":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.1.7","main":"index.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"*","handlebars":"1.0.5beta","out":"*","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"bugs":{"url":"http://github.com/DamonOehlman/boxit/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.1.7","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b0c38b2531cea557a084bf75050fc1f121125f5c","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.1.7.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.2.0":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.2.0","main":"lib/boxit.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"0.1.x","handlebars":"1.0.5beta","nopt":"1.0.x","out":"*","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"bugs":{"url":"http://github.com/DamonOehlman/boxit/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.2.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"909fed8563e4032e9fd8b73d470f86eb4af08c8f","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.2.0.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.2.1":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.2.1","main":"lib/boxit.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"0.1.x","handlebars":"1.0.5beta","nopt":"1.0.x","out":"*","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"bugs":{"url":"http://github.com/DamonOehlman/boxit/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.2.1","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c165583928851d0656be5bf2cdfbc87e3728f384","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.2.1.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.2.2":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.2.2","main":"lib/boxit.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"0.1.x","handlebars":"1.0.5beta","marked":"0.2.x","nopt":"1.0.x","out":"*","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"bugs":{"url":"http://github.com/DamonOehlman/boxit/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.2.2","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b237687b0d63e35b95d970eb8e0d803da945c84d","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.2.2.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.3.0":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.3.0","main":"lib/boxit.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"0.1.x","handlebars":"1.0.5beta","marked":"0.2.x","out":"0.4.x","scaffolder":"0.5.x","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"bugs":{"url":"http://github.com/DamonOehlman/boxit/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.3.0","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c14d98b77b5047bde83665bc52cfabf9c2425f20","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.3.0.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]},"0.3.1":{"name":"boxit","description":"HTML and text file builder / collator","author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"tags":["build","html"],"version":"0.3.1","main":"lib/boxit.js","bin":{"boxit":"./bin/boxit"},"engines":{"node":">= 0.4.x < 0.7.0"},"dependencies":{"async":"0.1.x","debug":"*","mkdirp":"0.3.x","findit":"0.1.x","getit":"0.1.x","handlebars":"1.0.5beta","manifest":"0.0.x","marked":"0.2.x","out":"0.4.x","scaffolder":"0.5.x","underscore":"1.3.x"},"devDependencies":{"chai":"0.3.x"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"bugs":{"url":"http://github.com/DamonOehlman/boxit/issues"},"contributors":[],"optionalDependencies":{},"_npmUser":{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"},"_id":"boxit@0.3.1","_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"fa3f0ef3181701645b8fad4fa469f563cc6e99aa","tarball":"http://registry.npmjs.org/boxit/-/boxit-0.3.1.tgz"},"maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}]}},"readme":"# BoxIt\n\nBoxIt is a command-line tool designed to make compiling a single HTML page (or even plain text) from multiple snippets locally a lot simpler.  This project was created as a follow-up project to [deckem](https://github.com/DamonOehlman/deckem) which I started as to help with creating [deck.js](https://github.com/imakewebthings/deck.js) presentations.  Deckem wasn't really the right solution though, as it was too narrow in it's focus.\n\nBy comparison, BoxIt is __incredibly flexible__ and allows you to use both __local and remote__ resources to create static local files (suitable for offline bundling).\n\nCreating a deck.js presentation is one potential use, but it could just as easily be used to assist with collating multiple HTML sections of a single page mobile app, or even possibly creating a CSV file.  \n\n## Getting Started\n\nThe first thing you need to do is to create a configuration file that defines your project file that instructs BoxIt how to behave.  A reference example has been [created in this repository](/DamonOehlman/boxit/tree/master/examples/deck.js) and the json configuration file from that example is shown below:\n\n```json\n{\n    \"title\": \"Test Presentation\",\n    \"template\": \"github://DamonOehlman/packing-instructions/deck.js\",\n    \"sources\": [\n        \"files/file1.html\",\n        \"files/file2.md\",\n        \"files/file3.jade\",\n        \"files/subdir/\"\n    ]\n}\n```\n\nThis config file is parsed and converted into a html file (by default) with the same name as the json file.  For instance, this example file is [presentation.json](/DamonOehlman/boxit/blob/master/examples/deck.js/presentation.json) so would be converted to a [presentation.html](/DamonOehlman/boxit/blob/master/examples/deck.js/output/presentation.html).\n\n## How it works\n\n### File Loading\n\nTo be completed.\n\n### Template Parsing\n\nTo be completed.\n\n## Defining a Template\n\nTo be completed, but take a look at the [packing instructions](/DamonOehlman/packing-instructions) repository for some examples.  Essentially, you have a `json` file that defines the template and an accompanying [handlebars](http://handlebarsjs.com/) template file that source files are passed through.\n\n## Feedback?\n\nBefore I start writing any code on this it would be great to get some feedback on whether there are already good tools that do this kind of thing, and/or whether this approach is worth exploring.\n","maintainers":[{"name":"damonoehlman","email":"damon.oehlman@sidelab.com"}],"time":{"modified":"2012-05-28T07:21:14.590Z","created":"2012-02-24T04:52:07.820Z","0.1.6":"2012-02-24T04:52:12.523Z","0.1.7":"2012-04-18T02:36:46.340Z","0.2.0":"2012-05-02T10:18:43.307Z","0.2.1":"2012-05-04T22:53:01.636Z","0.2.2":"2012-05-16T10:57:18.292Z","0.3.0":"2012-05-17T02:13:15.861Z","0.3.1":"2012-05-28T07:21:14.590Z"},"author":{"name":"Damon Oehlman","email":"damon.oehlman@sidelab.com"},"repository":{"type":"git","url":"git://github.com/DamonOehlman/boxit.git"},"_attachments":{"boxit-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-wlBiBRH5SiTYFpexfJtWqg==","length":11320,"stub":true},"boxit-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Pot++lgoBlU+FjfL275xIg==","length":10267,"stub":true},"boxit-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-4xAG7HuJn2chE2mHD25XPg==","length":10224,"stub":true},"boxit-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-jzlKX47DJi5AGcP+U/4Miw==","length":9887,"stub":true},"boxit-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-HoMt7pCjh5F5aUCtbqZuuw==","length":9749,"stub":true},"boxit-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-B/w3Ja/uGAo6mGEgG8/FcQ==","length":9842,"stub":true},"boxit-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Pxrs1AR2vWAZ2MK84egl6w==","length":55897,"stub":true}}}},
{"id":"boxpack","key":"boxpack","value":{"rev":"3-c47ba8e35826d62a7db150f428550a78"},"doc":{"_id":"boxpack","_rev":"3-c47ba8e35826d62a7db150f428550a78","name":"boxpack","description":"Bin packing algorithm for rectangles","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"boxpack","version":"0.1.0","description":"Bin packing algorithm for rectangles","main":"boxpack.js","scripts":{"test":"tap test.js"},"repository":{"type":"git","url":"https://github.com/munro/boxpack.git"},"keywords":["box","bin","pack","rect"],"author":{"name":"Ryan Munro"},"license":"BSD","dependencies":{},"devDependencies":{"tap":"~0.3.0"},"readme":"# Boxpack—Bin packing algorithm! [![Build Status](https://secure.travis-ci.org/munro/boxpack.png?branch=master)](http://travis-ci.org/munro/boxpack)\n\nBin packing algorithm!\n\n## Example\n\n```javascript\nvar bin = boxpack();\n\nvar boxes = bin.pack([\n    {width: 50, height: 100},\n    {width: 75, height: 75},\n    {width: 25, height: 25},\n    {width: 100, height: 100}\n]);\n\ndocument.getElementById('result').innerHTML = boxes.map(function (box) {\n    return '<div style=\"' +\n        'position:absolute;' +\n        'border:1px solid black;' +\n        'left:' + box.x + 'px;' +\n        'top:' + box.y + 'px;' +\n        /* subtract border from width & height */\n        'width:' + (box.width - 2) + 'px;' +\n        'height:' + (box.height - 2) + 'px\"></div>';\n}).join('');\n```\n\n## Data structures\n\n### {Rect} `{width: {Number}, height: {Number}}`\n\nDefines rectangles that we want to pack in a bin.\n\n### {Box} `{x: {Number}, y: {Number}, width: {Number}, height: {Number}}`\n\nDefines where a rectangle was packed in a bin.\n\n## Bin methods\n\n### var bin = boxpack({Object} options)\n\nCreates a new bin for packing rects into.\n\n### var result = bin.pack({width: 50, height: 100})\n\n`result` will return `false` if there was no room left to pack the `Rect`.\nOtherwise it will return `Box`\n\n## Weighting algorithms\n\n### boxpack.algo.dist\n\nSorts boxes based on their distance from (0, 0)\n\n### boxpack.algo.top\n\nSorts boxes based on their distance from the X-axis\n\n### boxpack.algo.left\n\nSorts boxes based on their distance from the Y-axis\n\n## Helper functions\n\n### boxpack.rectFit({Rect}, {Box}) -> {Boolean}\n### boxpack.boxFit({Box}, {Box}) -> {Boolean}\n### boxpack.intersect({Box}, {Box}) -> {Boolean}\n### boxpack.divideX({Box}, {Number}) -> {Array {Box}}\n### boxpack.divideY({Box}, {Number}) -> {Array {Box}}\n### boxpack.subtract({Box}, {Box}) -> {Array {Box}}\n\n## License\n\nMIT\n","_id":"boxpack@0.1.0","dist":{"shasum":"080734832eab86cd9ee8260d2171a5145d072d18","tarball":"http://registry.npmjs.org/boxpack/-/boxpack-0.1.0.tgz"},"maintainers":[{"name":"munro","email":"munro.github@gmail.com"}]}},"readme":"# Boxpack—Bin packing algorithm! [![Build Status](https://secure.travis-ci.org/munro/boxpack.png?branch=master)](http://travis-ci.org/munro/boxpack)\n\nBin packing algorithm!\n\n## Example\n\n```javascript\nvar bin = boxpack();\n\nvar boxes = bin.pack([\n    {width: 50, height: 100},\n    {width: 75, height: 75},\n    {width: 25, height: 25},\n    {width: 100, height: 100}\n]);\n\ndocument.getElementById('result').innerHTML = boxes.map(function (box) {\n    return '<div style=\"' +\n        'position:absolute;' +\n        'border:1px solid black;' +\n        'left:' + box.x + 'px;' +\n        'top:' + box.y + 'px;' +\n        /* subtract border from width & height */\n        'width:' + (box.width - 2) + 'px;' +\n        'height:' + (box.height - 2) + 'px\"></div>';\n}).join('');\n```\n\n## Data structures\n\n### {Rect} `{width: {Number}, height: {Number}}`\n\nDefines rectangles that we want to pack in a bin.\n\n### {Box} `{x: {Number}, y: {Number}, width: {Number}, height: {Number}}`\n\nDefines where a rectangle was packed in a bin.\n\n## Bin methods\n\n### var bin = boxpack({Object} options)\n\nCreates a new bin for packing rects into.\n\n### var result = bin.pack({width: 50, height: 100})\n\n`result` will return `false` if there was no room left to pack the `Rect`.\nOtherwise it will return `Box`\n\n## Weighting algorithms\n\n### boxpack.algo.dist\n\nSorts boxes based on their distance from (0, 0)\n\n### boxpack.algo.top\n\nSorts boxes based on their distance from the X-axis\n\n### boxpack.algo.left\n\nSorts boxes based on their distance from the Y-axis\n\n## Helper functions\n\n### boxpack.rectFit({Rect}, {Box}) -> {Boolean}\n### boxpack.boxFit({Box}, {Box}) -> {Boolean}\n### boxpack.intersect({Box}, {Box}) -> {Boolean}\n### boxpack.divideX({Box}, {Number}) -> {Array {Box}}\n### boxpack.divideY({Box}, {Number}) -> {Array {Box}}\n### boxpack.subtract({Box}, {Box}) -> {Array {Box}}\n\n## License\n\nMIT\n","maintainers":[{"name":"munro","email":"munro.github@gmail.com"}],"time":{"modified":"2012-08-12T06:00:41.395Z","created":"2012-08-12T06:00:40.042Z","0.1.0":"2012-08-12T06:00:41.395Z"},"author":{"name":"Ryan Munro"},"repository":{"type":"git","url":"https://github.com/munro/boxpack.git"},"_attachments":{"boxpack-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-SjlStGXf6Y1nREZNLWEpFQ==","length":4441,"stub":true}}}},
{"id":"boxxen.js","key":"boxxen.js","value":{"rev":"5-6eee21197f4a392047a16cd11f564dbf"},"doc":{"_id":"boxxen.js","_rev":"5-6eee21197f4a392047a16cd11f564dbf","name":"boxxen.js","description":"NodeJS library module for accessing the Boxxen API","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Adam Brady","email":"adam@volatiletechnology.com"},"name":"boxxen.js","description":"NodeJS library module for accessing the Boxxen API","version":"0.0.1","homepage":"https://boxxen.org/api/","repository":{"type":"git","url":"git://github.com/XenToolkit/boxxen.js.git"},"main":"index.js","dependencies":{"restler":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"SomeoneWeird","email":"adam@volatiletechnology.com"},"_id":"boxxen.js@0.0.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"16551b6b792bd444ee991e654a056b0ffcdd59b7","tarball":"http://registry.npmjs.org/boxxen.js/-/boxxen.js-0.0.1.tgz"},"readme":"","maintainers":[{"name":"SomeoneWeird","email":"adam@volatiletechnology.com"}]},"0.0.2":{"author":{"name":"Adam Brady","email":"adam@volatiletechnology.com"},"name":"boxxen.js","description":"NodeJS library module for accessing the Boxxen API","version":"0.0.2","homepage":"https://boxxen.org/api/","repository":{"type":"git","url":"git://github.com/XenToolkit/boxxen.js.git"},"main":"index.js","dependencies":{"restler":""},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"SomeoneWeird","email":"adam@volatiletechnology.com"},"_id":"boxxen.js@0.0.2","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"3d51213c61b57a780ba30b471974b577ef1a8d22","tarball":"http://registry.npmjs.org/boxxen.js/-/boxxen.js-0.0.2.tgz"},"readme":"","maintainers":[{"name":"SomeoneWeird","email":"adam@volatiletechnology.com"}]}},"readme":"","maintainers":[{"name":"SomeoneWeird","email":"adam@volatiletechnology.com"}],"time":{"modified":"2012-05-22T12:55:12.447Z","created":"2012-05-22T11:02:33.517Z","0.0.1":"2012-05-22T11:02:41.253Z","0.0.2":"2012-05-22T12:55:12.447Z"},"author":{"name":"Adam Brady","email":"adam@volatiletechnology.com"},"repository":{"type":"git","url":"git://github.com/XenToolkit/boxxen.js.git"},"_attachments":{"boxxen.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nSD0wq8B9OVGjHWSRizNGQ==","length":1001,"stub":true},"boxxen.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EmJpJfc7PPKK0QAoJuu1Tw==","length":928,"stub":true}}}},
{"id":"boxy","key":"boxy","value":{"rev":"3-77a20b682743036c506b71867020186d"},"doc":{"_id":"boxy","_rev":"3-77a20b682743036c506b71867020186d","name":"boxy","description":"node.js sandbox","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"boxy","description":"node.js sandbox","version":"0.0.2","homepage":"http://github.com/wearefractal/boxy","repository":{"type":"git","url":"git://github.com/wearefractal/boxy.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./domain/boxy.coffee","engines":{"node":">= 0.4.0"},"dependencies":{"coffee-script":"*","extenze":"*"},"devDependencies":{"should":"*","useless":"*"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/boxy/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"boxy@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"b93c478003cef0d1384667fedbe56dddde364a76","tarball":"http://registry.npmjs.org/boxy/-/boxy-0.0.2.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]}},"readme":"_boxy_ is a simple sandbox that adds node.js functionality to nodes 'vm' module (a v8 vm) and supports coffee script\n\n","maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"time":{"modified":"2011-12-23T13:58:47.732Z","created":"2011-12-23T13:58:41.885Z","0.0.2":"2011-12-23T13:58:47.732Z"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"repository":{"type":"git","url":"git://github.com/wearefractal/boxy.git"},"_attachments":{"boxy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-L1sIMK4S/9qui24dYmnfNw==","length":1730,"stub":true}}}},
{"id":"bplist-parser","key":"bplist-parser","value":{"rev":"5-22501de20248aeeeec225311d008027c"},"doc":{"_id":"bplist-parser","_rev":"5-22501de20248aeeeec225311d008027c","name":"bplist-parser","description":"Binary plist parser.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"bplist-parser","version":"0.0.1","description":"Binary plist parser.","main":"bplistParser.js","scripts":{"test":"./node_modules/nodeunit/bin/nodeunit test"},"keywords":["bplist","plist","parser"],"author":{"name":"Joe Ferner","email":"joe.ferner@nearinfinity.com"},"license":"MIT","devDependencies":{"nodeunit":"~0.7.4"},"repository":{"type":"git","url":"https://github.com/nearinfinity/node-bplist-parser.git"},"readme":"bplist-parser\n=============\n\nBinary Mac OS X Plist (property list) parser.\n\n## Installation\n\n```bash\n$ npm install bplist-parser\n```\n\n## Quick Examples\n\n```javascript\nvar bplist = require('bplist-parser');\n\nbplist.parseFile('myPlist.bplist', function(err, obj) {\n  if (err) throw err;\n\n  console.log(JSON.stringify(obj));\n});\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Near Infinity Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"bplist-parser@0.0.1","dist":{"shasum":"508d0064551b546918e6c5d779743813cf9ff09f","tarball":"http://registry.npmjs.org/bplist-parser/-/bplist-parser-0.0.1.tgz"},"maintainers":[{"name":"joeferner","email":"joe@fernsroth.com"}]},"0.0.2":{"name":"bplist-parser","version":"0.0.2","description":"Binary plist parser.","main":"bplistParser.js","scripts":{"test":"./node_modules/nodeunit/bin/nodeunit test"},"keywords":["bplist","plist","parser"],"author":{"name":"Joe Ferner","email":"joe.ferner@nearinfinity.com"},"license":"MIT","devDependencies":{"nodeunit":"~0.7.4"},"repository":{"type":"git","url":"https://github.com/nearinfinity/node-bplist-parser.git"},"readme":"bplist-parser\n=============\n\nBinary Mac OS X Plist (property list) parser.\n\n## Installation\n\n```bash\n$ npm install bplist-parser\n```\n\n## Quick Examples\n\n```javascript\nvar bplist = require('bplist-parser');\n\nbplist.parseFile('myPlist.bplist', function(err, obj) {\n  if (err) throw err;\n\n  console.log(JSON.stringify(obj));\n});\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Near Infinity Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","_id":"bplist-parser@0.0.2","dist":{"shasum":"de267c12abf6399c7803ec68e5e6343f86592893","tarball":"http://registry.npmjs.org/bplist-parser/-/bplist-parser-0.0.2.tgz"},"maintainers":[{"name":"joeferner","email":"joe@fernsroth.com"}]}},"readme":"bplist-parser\n=============\n\nBinary Mac OS X Plist (property list) parser.\n\n## Installation\n\n```bash\n$ npm install bplist-parser\n```\n\n## Quick Examples\n\n```javascript\nvar bplist = require('bplist-parser');\n\nbplist.parseFile('myPlist.bplist', function(err, obj) {\n  if (err) throw err;\n\n  console.log(JSON.stringify(obj));\n});\n```\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2012 Near Infinity Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"joeferner","email":"joe@fernsroth.com"}],"time":{"modified":"2012-08-14T16:20:20.621Z","created":"2012-08-06T17:03:08.165Z","0.0.1":"2012-08-06T17:03:08.795Z","0.0.2":"2012-08-14T16:20:20.621Z"},"author":{"name":"Joe Ferner","email":"joe.ferner@nearinfinity.com"},"repository":{"type":"git","url":"https://github.com/nearinfinity/node-bplist-parser.git"},"_attachments":{"bplist-parser-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-F5U9IhaH2zjKN8DPcD5UjQ==","length":15560,"stub":true},"bplist-parser-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PPKwUhmA3nw1YqtTzMmJLw==","length":14783,"stub":true}}}},
{"id":"bplus","key":"bplus","value":{"rev":"5-81bcd37d77bc07ba9ef8257fd4ab5cdc"},"doc":{"_id":"bplus","_rev":"5-81bcd37d77bc07ba9ef8257fd4ab5cdc","name":"bplus","description":"Node.js bindings for a bplus C libarary","dist-tags":{"latest":"0.0.1","stable":"0.0.1"},"versions":{"0.0.1":{"name":"bplus","version":"0.0.1","description":"Node.js bindings for a bplus C libarary","author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"main":"./lib/bplus","dependencies":{},"devDependencies":{"mocha":"0.10.x"},"scripts":{"test":"mocha --ui tdd --growl --reporter spec test/*-test.js","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"_npmUser":{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"},"_id":"bplus@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.9-pre","_defaultsLoaded":true,"dist":{"shasum":"b8946e42ebd57b516efc65406c38c3dd63762e89","bin":{"true":{"shasum":"dc1f8fcbdfd27fabe3fc1507c3dd1b0536b8ab3a"},"0.6-ares1.7.5-DEV-evundefined-openssl1.0.0e-v83.6.6.15-darwin-x64-10.8.0":{"tarball":"http://registry.npmjs.org/bplus/-/bplus-0.0.1-0.6-ares1.7.5-DEV-evundefined-openssl1.0.0e-v83.6.6.15-darwin-x64-10.8.0.tgz"}},"tarball":"http://registry.npmjs.org/bplus/-/bplus-0.0.1.tgz"},"maintainers":[{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}]}},"readme":"# Node.js bindings for a [bplus](https://github.com/indutny/bplus) C libarary [![Build Status](https://secure.travis-ci.org/indutny/node-bplus.png)](http://travis-ci.org/indutny/node-bplus)\n\n# ** Danger zone! Possible unicorns and rainbows! **\n\nBoth database engine and node.js bindings are in development now, use carefully.\n\n## Installation\n\n```bash\nnpm install bplus\n```\n\n## Usage\n\n```javascript\nvar bplus = require('bplus');\n\n\nvar db = bplus.create().open('/tmp/1.bp');\n\ndb.set('key', 'value', function(err) {\n  db.get('key', function(err, value) {\n    console.log('voila! Key is in database: %s', value);\n    db.close();\n  });\n});\n```\n\n## API\n\n### Basics\n\n#### db = bplus.create()\n\nReturns instance of database wrapper.\n\n#### db.open(filename)\n\nAssociates database with file until `.close()` will be called.\n\n#### db.close()\n\nCloses database.\n\n#### db.set('key', 'value', [callback])\n\nStores key/value pair in database. Both `key` and `value` arguments may be\ninstances of `Buffer`. If write will fail, callback will receive `err` as the\nfirst argument.\n\n**Note:** If `key` is already in database - previous value will be\nunconditionally overwritten.\n\n#### db.get('key', [callback])\n\nSearches database for `key` and invokes callback with it's value (or error).\n`key` may be a `Buffer` or a `String`.\n\n**Note:** Callback will also receive `ref` as third argument, see MVCC part\nbelow for details.\n\n#### db.remove('key', [callback])\n\nRemoves `key` from database or invokes callback with error if operation has\nfailed (callback will be called anyway upon completion).\n\n#### db.compact([callback])\n\nRuns compaction on database. Will significantly reduce database size and\nincrease speed of lookup and insertion.\n\n**Note:** For big databases may take some time (~ 30 sec for a database with\n1000000 records).\n\n### MVCC\n\n#### db.update('key', 'value', filter, [callback])\n\nSame as `.set()`, but if `key` is already in database -\n`filter(previousValue, currentValue)` will be called. Value will be replaced\nonly if return value of `filter` is not `false`.\n\n#### db.removev('key', [filter], [callback]);\n\nSame as `.remove()`, but `filter` is called before removing actual value. Should\nbe used to ensure that only specific value will be removed.\n\n#### db.getPrevious(ref, [callback])\n\nReturns previous value of `key`. `callback` will receive three arguments\n(as in `.get()`).\n\n**Note:** That after compaction\n\n### Streaming\n\n#### db.getRange('start', 'end', [filter])\n\nReturns a `promise` object that'll emit `message` event for each key/value pair\nfound in specified range. `end` will be emitted on stream finish.\n\n```javascript\nvar promise = db.getRange('start', 'end');\n\npromise.on('message', function(key, value, ref) {\n  // see `.get()` for details\n});\n\npromise.on('end', function() {\n  // Ended\n});\n```\n\n`filter` can be passed to load values only of specific keys. Value won't be\nloaded (and emitted in `message` event) only if filter returned `false` for it.\n\n```javascript\ndb.getRange('start', 'end', function(key) {\n  return key.toString() === 'somekey';\n});\n```\n\n#### db.bulk(keyValues, [callback])\n\nInserts multiple key/values in one atomic operation.\n\n```javascript\nvar kvs = [\n  {\n    key: 'a',\n    value: 'a'\n  },\n  {\n    key: 'b',\n    value: 'b'\n  }\n];\ndb.bulk(kvs, function(err) {\n  // .. your code ..\n});\n```\n\n### db.bulkUpdate(keyValues, filter, [callback])\n\nSame as `.bulk`, but with `filter` as in `.update()`.\n\n#### LICENSE\n\nThis software is licensed under the MIT License.\n\nCopyright Fedor Indutny, 2012.\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"fedor.indutny","email":"fedor.indutny@gmail.com"}],"time":{"modified":"2012-01-30T13:31:13.384Z","created":"2012-01-30T13:30:53.664Z","0.0.1":"2012-01-30T13:30:57.116Z"},"author":{"name":"Fedor Indutny","email":"fedor.indutny@gmail.com"},"_attachments":{"bplus-0.0.1-0.6-ares1.7.5-DEV-evundefined-openssl1.0.0e-v83.6.6.15-darwin-x64-10.8.0.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-uiyAvrOreSh/A9pdTvTj3w==","length":209753,"stub":true},"bplus-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hDWJI7gZsMwLeS0Q9vBRtg==","length":348237,"stub":true}}}},
{"id":"br-jquery","key":"br-jquery","value":{"rev":"7-7e3fbde178bcc0605b737b2993c445bb"},"doc":{"_id":"br-jquery","_rev":"7-7e3fbde178bcc0605b737b2993c445bb","name":"br-jquery","description":"a jQuery package for browserify","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"author":{"name":"Ben Atkin","email":"ben@benatkin.com","url":"http://benatkin.com/"},"name":"br-jquery","description":"a jQuery package for browserify","version":"0.0.1","homepage":"https://github.com/benatkin/br-jquery","repository":{"type":"git","url":"git://github.com/benatkin/br-jquery.git"},"keywords":["jquery","browserify","front-end"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"*","request":"*","tap":"*"},"scripts":{"test":"tap test/*.js"},"browserify":"browser","_npmUser":{"name":"bat","email":"ben@benatkin.com"},"_id":"br-jquery@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0ccda2414b8b69b15766776cb942bd0b5b4480b9","tarball":"http://registry.npmjs.org/br-jquery/-/br-jquery-0.0.1.tgz"},"maintainers":[{"name":"bat","email":"ben@benatkin.com"}]},"0.0.2":{"author":{"name":"Ben Atkin","email":"ben@benatkin.com","url":"http://benatkin.com/"},"name":"br-jquery","description":"a jQuery package for browserify","version":"0.0.2","homepage":"https://github.com/benatkin/br-jquery","repository":{"type":"git","url":"git://github.com/benatkin/br-jquery.git"},"keywords":["jquery","browserify","front-end"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"~> 1.10.4","request":"~> 2.9.153","mocha":"~> 0.14.1","should":"~> 0.6.0"},"scripts":{"test":"mocha -r should"},"browserify":"browser","_npmUser":{"name":"bat","email":"ben@benatkin.com"},"_id":"br-jquery@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3b6504e4357eb928c6c638c7e61495a73e4609d5","tarball":"http://registry.npmjs.org/br-jquery/-/br-jquery-0.0.2.tgz"},"maintainers":[{"name":"bat","email":"ben@benatkin.com"}]},"0.0.3":{"author":{"name":"Ben Atkin","email":"ben@benatkin.com","url":"http://benatkin.com/"},"name":"br-jquery","description":"a jQuery package for browserify","version":"0.0.3","homepage":"https://github.com/benatkin/br-jquery","repository":{"type":"git","url":"git://github.com/benatkin/br-jquery.git"},"keywords":["jquery","browserify","front-end"],"engines":{"node":">=0.6"},"dependencies":{},"devDependencies":{"browserify":"*","request":"*","mocha":"*","should":"*"},"scripts":{"test":"mocha -r should"},"browserify":"browser","_npmUser":{"name":"bat","email":"ben@benatkin.com"},"_id":"br-jquery@0.0.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"4311f9e590971bbcdd833942a6392a56b9525a24","tarball":"http://registry.npmjs.org/br-jquery/-/br-jquery-0.0.3.tgz"},"maintainers":[{"name":"bat","email":"ben@benatkin.com"}]}},"readme":"# br-jquery\n\n`br-jquery` is a node.js module for including jQuery in browserify.\nIt is currently jQuery 1.7.1.\n\n## Usage\n\nThis is published on *npm* as *br-jquery*. You can install it with `npm\ninstall br-jquery`.\n\nThe simplest way is to require the module in the call to create the\nbundle:\n\n``` javascript\nvar js = require('browserify')({require: {jquery: 'br-jquery'}}).bundle();\n```\n\nThis module follows the browserify convention of using `require()`, and\nuses [jQuery.noConflict()](http://api.jquery.com/jQuery.noConflict/)\nTo use the jQuery module from the browser, use something like\n`var $ = require('jquery');`\n\nTo include the minified version, use a middleware:\n\n``` javascript\nvar browserify = require('browserify'),\n    jq = require('br-jquery');\n\nvar bundle = browserify();\nbundle.use(jq.min); // or jq to bundle the non-minified version\n\nvar js = bundle.bundle();\n```\n\nIf you have the deps installed (*jsdom* and *htmlparser*), you can\njQuery for node.js using this package:\n\n```\nvar jquery = require('br-jquery').jquery();\n```\n\nThe *jquery* package on npm is currently a 1.6 release so that may be\none reason to use this package instead.\n\n## Verifying\n\nTo verify that this contains the original jQuery source with a simple\nwrapper around it, read and run `node build.js`, and check that the\nfiles haven't changed.\n\n## Author\n\n* Ben Atkin <ben@benatkin.com>\n\n<a rel=\"license\" href=\"http://creativecommons.org/publicdomain/zero/1.0/\">\n  <img src=\"http://i.creativecommons.org/p/zero/1.0/88x31.png\" style=\"border-style: none;\" alt=\"CC0\" />\n</a>\n\nTo the extent possible under law, I, Ben Atkin, have waived all copyright and related or neighboring rights to this work.\n","maintainers":[{"name":"bat","email":"ben@benatkin.com"}],"time":{"modified":"2012-06-07T07:04:16.766Z","created":"2012-01-22T08:06:53.375Z","0.0.1":"2012-01-22T08:06:54.347Z","0.0.2":"2012-03-24T03:55:23.215Z","0.0.3":"2012-06-07T07:04:16.766Z"},"author":{"name":"Ben Atkin","email":"ben@benatkin.com","url":"http://benatkin.com/"},"repository":{"type":"git","url":"git://github.com/benatkin/br-jquery.git"},"_attachments":{"br-jquery-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Uscg52SDtqmi9rww8kN1iw==","length":286720,"stub":true},"br-jquery-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hoaO9KgSUXm0XTuPB/0ETw==","length":184320,"stub":true},"br-jquery-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-8w6TTyFEruK3w25EbKhNOw==","length":184320,"stub":true}}}},
{"id":"bracket-matcher","key":"bracket-matcher","value":{"rev":"27-a01c946c69665629e212a0f702be1b38"},"doc":{"_id":"bracket-matcher","_rev":"27-a01c946c69665629e212a0f702be1b38","name":"bracket-matcher","description":"parser which is only concerned with matching brackets.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"testbedjs.org"},"name":"bracket-matcher","description":"parser which is only concerned with matching brackets.","version":"0.0.0","homepage":"https://github.com/dominictarr/bracket-matcher","repository":{"type":"git","url":"git://github.com/dominictarr/bracket-matcher.git"},"main":"bracket-matcher.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{},"_id":"bracket-matcher@0.0.0","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"2f29880391984c7ddfc14ab2e24cfd2156c6299b","tarball":"http://registry.npmjs.org/bracket-matcher/-/bracket-matcher-0.0.0.tgz"},"directories":{}},"0.0.1":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"testbedjs.org"},"name":"bracket-matcher","description":"parser which is only concerned with matching brackets.","version":"0.0.1","homepage":"https://github.com/dominictarr/bracket-matcher","repository":{"type":"git","url":"git://github.com/dominictarr/bracket-matcher.git"},"main":"bracket-matcher.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{"it-is":"0.0.x","render":">=0.0.3"},"_id":"bracket-matcher@0.0.1","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"d7bbec362933450a2700139473b4f3c07ef8a2ea","tarball":"http://registry.npmjs.org/bracket-matcher/-/bracket-matcher-0.0.1.tgz"}},"0.0.2":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"testbedjs.org"},"name":"bracket-matcher","description":"parser which is only concerned with matching brackets.","version":"0.0.2","homepage":"https://github.com/dominictarr/bracket-matcher","repository":{"type":"git","url":"git://github.com/dominictarr/bracket-matcher.git"},"main":"bracket-matcher.js","scripts":{"test":"meta-test test/*.js"},"engines":{"node":">= 0.2.0"},"dependencies":{},"devDependencies":{"it-is":"0.0.x","render":">=0.0.3"},"non-standard":{"key":"value","number":234235},"_id":"bracket-matcher@0.0.2","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"85b547b77a29c3142e090514c2052cc28ec1522f","tarball":"http://registry.npmjs.org/bracket-matcher/-/bracket-matcher-0.0.2.tgz"}}},"maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2011-06-10T04:46:05.953Z","created":"2011-06-10T03:23:53.412Z","0.0.0":"2011-06-10T03:23:54.145Z","0.0.1":"2011-06-10T03:41:14.702Z","0.0.2":"2011-06-10T04:46:05.953Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"testbedjs.org"},"repository":{"type":"git","url":"git://github.com/dominictarr/bracket-matcher.git"},"_attachments":{"bracket-matcher-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-djkRCtsvTYHUg1sEGvRHRA==","length":1972,"stub":true},"bracket-matcher-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-lSS/zSQyb7LMrqr/xwqDRw==","length":1938,"stub":true},"bracket-matcher-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FgUafZVpGT8PIG7YJvS+aQ==","length":1922,"stub":true}}}},
{"id":"bracketless","key":"bracketless","value":{"rev":"3-5131ed0fbfcd77ae3f72bb80d320dda2"},"doc":{"_id":"bracketless","_rev":"3-5131ed0fbfcd77ae3f72bb80d320dda2","name":"bracketless","description":"Prints json without brackets or commas","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Dan Ordille","email":"dordille@gmail.com"},"name":"bracketless","description":"Prints json without brackets or commas","version":"0.0.1","repository":{"url":""},"main":"./index.js","bin":{"bracketless":"./index.js"},"dependencies":{"commander":"*","colorize":"*"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_id":"bracketless@0.0.1","dist":{"shasum":"999f05cd7190ea07a7c05538000686d52a107565","tarball":"http://registry.npmjs.org/bracketless/-/bracketless-0.0.1.tgz"},"readme":"","maintainers":[{"name":"dordille","email":"dordille@gmail.com"}]}},"readme":"","maintainers":[{"name":"dordille","email":"dordille@gmail.com"}],"time":{"modified":"2012-08-13T21:00:44.548Z","created":"2012-08-13T21:00:44.189Z","0.0.1":"2012-08-13T21:00:44.548Z"},"author":{"name":"Dan Ordille","email":"dordille@gmail.com"},"repository":{"url":""},"_attachments":{"bracketless-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-x/XWl2r8z9BvR+0iuQdjvA==","length":893,"stub":true}}}},
{"id":"braid-auth","key":"braid-auth","value":{"rev":"3-a7fffa905e5bcb728594f437fb9ae5af"},"doc":{"_id":"braid-auth","_rev":"3-a7fffa905e5bcb728594f437fb9ae5af","name":"braid-auth","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":"","name":"braid-auth","version":"0.0.0","dependencies":{"authom":"~0.4.0","debug":"~0.7.0","express":"~3.0.0rc2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"deedubs","email":"me@deedubs.com"},"_id":"braid-auth@0.0.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.20","_defaultsLoaded":true,"dist":{"shasum":"e229d9290f6330448f881d2b7c73c8f2f35495c7","tarball":"http://registry.npmjs.org/braid-auth/-/braid-auth-0.0.0.tgz"},"readme":"","maintainers":[{"name":"deedubs","email":"me@deedubs.com"}]}},"readme":"","maintainers":[{"name":"deedubs","email":"me@deedubs.com"}],"time":{"modified":"2012-08-10T01:48:08.357Z","created":"2012-08-10T01:48:07.655Z","0.0.0":"2012-08-10T01:48:08.357Z"},"_attachments":{"braid-auth-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-y2gZYSZyiYx+TBX/rx+zTg==","length":928,"stub":true}}}},
{"id":"braid-data","key":"braid-data","value":{"rev":"3-c065e23ec2696819c49ee86d7a02392c"},"doc":{"_id":"braid-data","_rev":"3-c065e23ec2696819c49ee86d7a02392c","name":"braid-data","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Dan Williams","email":"me@deedubs.com","url":"http://deedubs.com/"},"name":"braid-data","version":"0.0.0","repository":{"url":"git://github.com/Igniter/braid-data.git"},"main":"index.js","scripts":{"test":"make test"},"dependencies":{"monk":"~0.2.1","robe":"0.0.1"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"deedubs","email":"me@deedubs.com"},"_id":"braid-data@0.0.0","_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.20","_defaultsLoaded":true,"dist":{"shasum":"0e6291e52ddd2246ef63b6f26d022e3c93ef47b7","tarball":"http://registry.npmjs.org/braid-data/-/braid-data-0.0.0.tgz"},"readme":"","maintainers":[{"name":"deedubs","email":"me@deedubs.com"}]}},"readme":"","maintainers":[{"name":"deedubs","email":"me@deedubs.com"}],"time":{"modified":"2012-08-10T01:48:04.323Z","created":"2012-08-10T01:48:03.717Z","0.0.0":"2012-08-10T01:48:04.323Z"},"author":{"name":"Dan Williams","email":"me@deedubs.com","url":"http://deedubs.com/"},"repository":{"url":"git://github.com/Igniter/braid-data.git"},"_attachments":{"braid-data-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hIbIU4ABLIJtn1UU1KKQTQ==","length":612,"stub":true}}}},
{"id":"brain","key":"brain","value":{"rev":"35-19d694fcc12840e8bb08b12005151312"},"doc":{"_id":"brain","_rev":"35-19d694fcc12840e8bb08b12005151312","name":"brain","description":"Neural network library","dist-tags":{"latest":"0.6.0"},"versions":{"0.2.0":{"name":"brain","description":"neural network library","version":"0.2.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"main":"./brain","_id":"brain@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.2.0.tgz"}},"0.2.1":{"name":"brain","description":"neural network library","version":"0.2.1","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"main":"./brain","_id":"brain@0.2.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.2.1.tgz"}},"0.2.2":{"name":"brain","description":"neural network library","version":"0.2.2","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"main":"./lib/brain","_id":"brain@0.2.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.2.2.tgz"}},"0.2.3":{"name":"brain","description":"neural network library","version":"0.2.3","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"main":"./lib/brain","_id":"brain@0.2.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.2.3.tgz"}},"0.2.4":{"name":"brain","description":"neural network library","version":"0.2.4","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"main":"./lib/brain","_id":"brain@0.2.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.2.4.tgz"}},"0.3.0":{"name":"brain","description":"neural network and classifier library","version":"0.3.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"dependencies":{"underscore":"*"},"main":"./lib/brain","_id":"brain@0.3.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.3.0.tgz"}},"0.3.1":{"name":"brain","description":"neural network and classifier library","version":"0.3.1","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/brain.git"},"directories":{"lib":"./lib"},"dependencies":{"underscore":"*"},"main":"./lib/brain","_id":"brain@0.3.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/brain/-/brain-0.3.1.tgz"}},"0.3.2":{"name":"brain","description":"neural network and classifier library","version":"0.3.2","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"dependencies":{"underscore":"*","nomnom":"*","cradle":"*","redis":"*"},"main":"./lib/brain","devDependencies":{},"_id":"brain@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"77732e89ad33e906a56f2c03abb6652d0d8375d9","tarball":"http://registry.npmjs.org/brain/-/brain-0.3.2.tgz"},"scripts":{}},"0.3.4":{"name":"brain","description":"neural network and classifier library","version":"0.3.4","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"dependencies":{"underscore":">=1.1.0","redis":">=0.6.0"},"devDependencies":{"nomnom":">=0.4.3","cradle":">=0.2.5","connect":">=1.4.0","uglify-js":">=1.0.1","colors":">=0.5.0"},"main":"./lib/brain","_id":"brain@0.3.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4e49777f22f2949740efc2bff375c67141c6b5ed","tarball":"http://registry.npmjs.org/brain/-/brain-0.3.4.tgz"},"scripts":{}},"0.3.5":{"name":"brain","description":"neural network and classifier library","version":"0.3.5","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"dependencies":{"underscore":">=1.1.0","redis":">=0.6.0"},"devDependencies":{"nomnom":">=0.4.2","cradle":">=0.2.5","connect":">=1.4.0","uglify-js":">=1.0.1","colors":">=0.5.0","browserify":">=0.4.1"},"main":"./lib/brain","_id":"brain@0.3.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"8c968d15076d9e5630823763b7b895278557d0e0","tarball":"http://registry.npmjs.org/brain/-/brain-0.3.5.tgz"},"scripts":{}},"0.3.6":{"name":"brain","description":"Neural network and classifier library","version":"0.3.6","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"dependencies":{"underscore":">=1.1.0","redis":">=0.6.0"},"devDependencies":{"nomnom":">=1.5.0","cradle":">=0.2.5","connect":">=1.4.0","uglify-js":">=1.0.1","colors":">=0.5.0","browserify":">=0.4.1"},"main":"./lib/brain","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"brain@0.3.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.4-pre","_defaultsLoaded":true,"dist":{"shasum":"9933cf2d25b398275822e48d35a67c7d82a80300","tarball":"http://registry.npmjs.org/brain/-/brain-0.3.6.tgz"},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.3.7":{"name":"brain","description":"Neural network and classifier library","version":"0.3.7","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"dependencies":{"underscore":">=1.1.0","redis":">=0.7.0"},"devDependencies":{"nomnom":">=1.5.0","cradle":">=0.2.5","connect":">=1.4.0","uglify-js":">=1.0.1","colors":">=0.5.0","browserify":">=0.4.1"},"main":"./lib/brain","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"brain@0.3.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"231cf21c5529f132ff3853491ea390d9195c14dd","tarball":"http://registry.npmjs.org/brain/-/brain-0.3.7.tgz"},"readme":"# brain\n\nbrain is a limited JavaScript supervised machine learning library. [Full API here](http://harthur.github.com/brain). Neural network example:\n\n\tvar net = new brain.NeuralNetwork();\n\tnet.train([{input: [0, 0], output: [0]},\n\t           {input: [0, 1], output: [1]},\n\t           {input: [1, 0], output: [1]},\n\t           {input: [1, 1], output: [0]}]);\n\t\n\tvar output = net.run([1, 0]);\n\nThe output will be `[0.987]` or something close like that. There's no reason to use a neural network to figure out XOR (-: so here's a more involved, realistic example:\n[Demo: training a neural network to recognize color contrast](http://harthur.github.com/brain/examples/blackorwhite.html)\n\nNaive Bayesian classifier example:\n\n\tvar bayes = new brain.BayesianClassifier();\n\t\n\tbayes.train(\"cheap replica watches\", \"spam\");\n\tbayes.train(\"I don't know if this works on Windows\", \"not\");\n\t\n\tvar category = bayes.classify(\"free watches\");\n\n\n# using in node\nIf you have [node](http://nodejs.org/) you can install with [npm](http://github.com/isaacs/npm):\n\n\tnpm install brain\n\n# using in the browser\nDownload the latest [brain.js](http://github.com/harthur/brain/downloads). If you're using `BayesianClassifier`, you can only use the `localStorage` and (default) in-memory backends. If you're using the `NeuralNetwork` you should try to train the network offline (or on a Worker) and use the `toFunction()` or `toJSON()` options to plug the pre-trained network in to your website.\n\n\n# tests\nRunning the tests requires checking out the code and installing the dev dependencies: `npm install --dev`. To run the suite of tests:\n\n\tnode test/runtests.js\n\t\nTo run the other tests: [browser and cross-validation tests](https://github.com/harthur/brain/tree/master/test)\n\n# build\nTo build a browser file from the CommonJS package you'll need [jake](https://github.com/mde/jake):\n\n\tnpm install jake -g\n\t\n\tjake build\n\tjake minify\n","maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.4.0":{"name":"brain","description":"Neural network library","version":"0.4.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"main":"./lib/brain","devDependencies":{"mocha":">=1.0.0","cradle":">=0.2.0","should":">=0.6.0","async":">=0.1.18","underscore":">=1.3.3"},"keywords":["neural network","classifier","machine learning"],"_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"brain@0.4.0","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"4a9b96d05bdc32f6789fa543f70f39ad3961ec33","tarball":"http://registry.npmjs.org/brain/-/brain-0.4.0.tgz"},"readme":"# brain\n`brain` is a JavaScript [neural network](http://en.wikipedia.org/wiki/Artificial_neural_network) library. Here's an example of using it to approximate the XOR function:\n\n```javascript\nvar net = new brain.NeuralNetwork();\n\nnet.train([{input: [0, 0], output: [0]},\n           {input: [0, 1], output: [1]},\n           {input: [1, 0], output: [1]},\n           {input: [1, 1], output: [0]}]);\n\nvar output = net.run([1, 0]);  // [0.987]\n```\n\nThere's no reason to use a neural network to figure out XOR however (-: so here's a more involved, realistic example:\n[Demo: training a neural network to recognize color contrast](http://harthur.github.com/brain/examples/blackorwhite.html)\n\n# using in node\nIf you have [node](http://nodejs.org/) you can install with [npm](http://github.com/isaacs/npm):\n\n\tnpm install brain\n\n# using in the browser\nDownload the latest [brain.js](http://github.com/harthur/brain/downloads). Training is computationally expensive, so you should try to train the network offline (or on a Worker) and use the `toFunction()` or `toJSON()` options to plug the pre-trained network in to your website.\n\n# Training\nUse `train()` to train the network with an array of training data. Each piece of training data should have an `input` and an `output`, both of which can be either an array of numbers from 0 to 1 or a hash of numbers from 0 to 1. For the [color constrast demo](http://harthur.github.com/brain/examples/blackorwhite.html) it looks something like this:\n\n```javascript\nvar net = new brain.NeuralNetwork();\n\nnet.train([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},\n           {input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},\n           {input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);\n\nvar output = net.run({ r: 1, g: 0.4, b: 0 });  // { white: 0.99 black: 0.002 }\n```\n\nThe network has to be trained with all the data in bulk in one call to `train()`. The more training data the longer it will take to train, but the better the network will be at classifiying new data.\n\n# JSON\nSerialize or load in the state of a trained network with JSON:\n\n```javascript\nvar json = net.toJSON();\n\nnet.fromJSON(json);\n```\n\nYou can also get a custom standalone function from a trained network that acts just like `run()`:\n\n```javascript\nvar run = net.toFunction();\n\nvar output = run({r: 1, g: 0.4, b: 0});\n```\n\n\n\n","maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.5.0":{"name":"brain","description":"Neural network library","version":"0.5.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"main":"./lib/brain","dependencies":{"underscore":">=1.3.3"},"devDependencies":{"mocha":">=1.0.0","canvas":">=0.10.0","cradle":">=0.2.0","should":">=0.6.0","async":">=0.1.18"},"keywords":["neural network","classifier","machine learning"],"_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"brain@0.5.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"814d32f674d354dc42f4e430677f5380d97122fd","tarball":"http://registry.npmjs.org/brain/-/brain-0.5.0.tgz"},"readme":"# brain\n`brain` is a JavaScript [neural network](http://en.wikipedia.org/wiki/Artificial_neural_network) library. Here's an example of using it to approximate the XOR function:\n\n```javascript\nvar net = new brain.NeuralNetwork();\n\nnet.train([{input: [0, 0], output: [0]},\n           {input: [0, 1], output: [1]},\n           {input: [1, 0], output: [1]},\n           {input: [1, 1], output: [0]}]);\n\nvar output = net.run([1, 0]);  // [0.987]\n```\n\nThere's no reason to use a neural network to figure out XOR however (-: so here's a more involved, realistic example:\n[Demo: training a neural network to recognize color contrast](http://harthur.github.com/brain/examples/blackorwhite.html)\n\n# Using in node\nIf you have [node](http://nodejs.org/) you can install with [npm](http://github.com/isaacs/npm):\n\n\tnpm install brain\n\n# Using in the browser\nDownload the latest [brain.js](http://github.com/harthur/brain/downloads). Training is computationally expensive, so you should try to train the network offline (or on a Worker) and use the `toFunction()` or `toJSON()` options to plug the pre-trained network in to your website.\n\n# Training\nUse `train()` to train the network with an array of training data. The network has to be trained with all the data in bulk in one call to `train()`. The more training patterns, the longer it will take to train, but the better the network will be at classifiying new patterns.\n\n#### Data format\nEach training pattern should have an `input` and an `output`, both of which can be either an array of numbers from `0` to `1` or a hash of numbers from `0` to `1`. For the [color constrast demo](http://harthur.github.com/brain/examples/blackorwhite.html) it looks something like this:\n\n```javascript\nvar net = new brain.NeuralNetwork();\n\nnet.train([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},\n           {input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},\n           {input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);\n\nvar output = net.run({ r: 1, g: 0.4, b: 0 });  // { white: 0.99, black: 0.002 }\n```\n\n#### Threshold\nThe optional second argument to `train()` is the error threshold (default `0.004`), the third is the maximum training iterations (default `20000`).\n\nThe network will train until the training error has gone below the threshold or the max number of iterations has been reached, whichever comes first.\n\n#### Output\nThe ouput of `train()` is a hash of information about how the training went:\n\n```javascript\n{\n  error: 0.0039139985510105032,  // training error\n  iterations: 406                // training iterations\n}\n```\n\n#### Failing\nIf the network failed to train, the error will be above the error threshold. This could happen because the training data is too noisy (most likely), the network doesn't have enough hidden layers or nodes to handle the complexity of the data, or it hasn't trained for enough iterations.\n\nIf the training error is still something huge like `0.4` after 20000 iterations, it's a good sign that the network can't make sense of the data you're giving it.\n\n# JSON\nSerialize or load in the state of a trained network with JSON:\n\n```javascript\nvar json = net.toJSON();\n\nnet.fromJSON(json);\n```\n\nYou can also get a custom standalone function from a trained network that acts just like `run()`:\n\n```javascript\nvar run = net.toFunction();\n\nvar output = run({ r: 1, g: 0.4, b: 0 });\n\nconsole.log(run.toString()); // copy and paste! no need to import brain.js\n```\n\n# Options\n`NeuralNetwork()` takes a hash of options:\n\n```javascript\nvar net = new NeuralNetwork({\n   hiddenLayers: [4],\n   learningRate: 0.6\n});\n```\n\n#### hiddenLayers\nSpecify the number of hidden layers in the network and the size of each layer. For example, if you want two hidden layers - the first with 3 nodes and the second with 4 nodes, you'd give:\n\n```\nhiddenLayers: [3, 4]\n```\n\nBy default `brain` uses one hidden layer with size proportionate to the size of the input array.\n\n#### learningRate\nThe learning rate is a parameter that influences how quickly the network trains. It's a number from `0` to `1`. If the learning rate is close to `0` it will take a lot longer to train. If the learning rate is closer to `1` it will train faster but it's in danger of training to a local minimum and performing badly on new data. The default learning rate is `0.3`.\n\n\n# Bayesian classifier\n\nThe Bayesian classifier that used to be here has moved to its own library, [classifier](https://github.com/harthur/classifier).\n","maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.6.0":{"name":"brain","description":"Neural network library","version":"0.6.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"main":"./lib/brain","dependencies":{"underscore":">=1.3.3"},"devDependencies":{"mocha":">=1.0.0","canvas":">=0.10.0","cradle":">=0.2.0","should":">=0.6.0","async":">=0.1.18"},"keywords":["neural network","classifier","machine learning"],"_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"brain@0.6.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"94ca34ee772b2fe111537fcc01a615d54a772d04","tarball":"http://registry.npmjs.org/brain/-/brain-0.6.0.tgz"},"readme":"# brain\n`brain` is a JavaScript [neural network](http://en.wikipedia.org/wiki/Artificial_neural_network) library. Here's an example of using it to approximate the XOR function:\n\n```javascript\nvar net = new brain.NeuralNetwork();\n\nnet.train([{input: [0, 0], output: [0]},\n           {input: [0, 1], output: [1]},\n           {input: [1, 0], output: [1]},\n           {input: [1, 1], output: [0]}]);\n\nvar output = net.run([1, 0]);  // [0.987]\n```\n\nThere's no reason to use a neural network to figure out XOR however (-: so here's a more involved, realistic example:\n[Demo: training a neural network to recognize color contrast](http://harthur.github.com/brain/examples/blackorwhite.html)\n\n# Using in node\nIf you have [node](http://nodejs.org/) you can install with [npm](http://github.com/isaacs/npm):\n\n\tnpm install brain\n\n# Using in the browser\nDownload the latest [brain.js](http://github.com/harthur/brain/downloads). Training is computationally expensive, so you should try to train the network offline (or on a Worker) and use the `toFunction()` or `toJSON()` options to plug the pre-trained network in to your website.\n\n# Training\nUse `train()` to train the network with an array of training data. The network has to be trained with all the data in bulk in one call to `train()`. The more training patterns, the longer it will take to train, but the better the network will be at classifiying new patterns.\n\n#### Data format\nEach training pattern should have an `input` and an `output`, both of which can be either an array of numbers from `0` to `1` or a hash of numbers from `0` to `1`. For the [color constrast demo](http://harthur.github.com/brain/examples/blackorwhite.html) it looks something like this:\n\n```javascript\nvar net = new brain.NeuralNetwork();\n\nnet.train([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},\n           {input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},\n           {input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);\n\nvar output = net.run({ r: 1, g: 0.4, b: 0 });  // { white: 0.99, black: 0.002 }\n```\n\n#### Options\n`train()` takes a hash of options as its second argument:\n\n```javascript\nnet.train(data, {\n  errorThresh: 0.004,  // error threshold to reach\n  iterations: 20000,   // maximum training iterations\n  log: true,           // console.log() progress periodically\n  logPeriod: 10        // number of iterations between logging\n})\n```\n\nThe network will train until the training error has gone below the threshold (default `0.004`) or the max number of iterations (default `20000`) has been reached, whichever comes first.\n\nBy default training won't let you know how its doing until the end, but set `log` to `true` to get periodic updates on the current training error of the network. The training error should decrease every time.\n\n#### Output\nThe ouput of `train()` is a hash of information about how the training went:\n\n```javascript\n{\n  error: 0.0039139985510105032,  // training error\n  iterations: 406                // training iterations\n}\n```\n\n#### Failing\nIf the network failed to train, the error will be above the error threshold. This could happen because the training data is too noisy (most likely), the network doesn't have enough hidden layers or nodes to handle the complexity of the data, or it hasn't trained for enough iterations.\n\nIf the training error is still something huge like `0.4` after 20000 iterations, it's a good sign that the network can't make sense of the data you're giving it.\n\n# JSON\nSerialize or load in the state of a trained network with JSON:\n\n```javascript\nvar json = net.toJSON();\n\nnet.fromJSON(json);\n```\n\nYou can also get a custom standalone function from a trained network that acts just like `run()`:\n\n```javascript\nvar run = net.toFunction();\n\nvar output = run({ r: 1, g: 0.4, b: 0 });\n\nconsole.log(run.toString()); // copy and paste! no need to import brain.js\n```\n\n# Options\n`NeuralNetwork()` takes a hash of options:\n\n```javascript\nvar net = new NeuralNetwork({\n   hiddenLayers: [4],\n   learningRate: 0.6\n});\n```\n\n#### hiddenLayers\nSpecify the number of hidden layers in the network and the size of each layer. For example, if you want two hidden layers - the first with 3 nodes and the second with 4 nodes, you'd give:\n\n```\nhiddenLayers: [3, 4]\n```\n\nBy default `brain` uses one hidden layer with size proportionate to the size of the input array.\n\n#### learningRate\nThe learning rate is a parameter that influences how quickly the network trains. It's a number from `0` to `1`. If the learning rate is close to `0` it will take longer to train. If the learning rate is closer to `1` it will train faster but it's in danger of training to a local minimum and performing badly on new data. The default learning rate is `0.3`.\n\n\n# Bayesian classifier\n\nThe Bayesian classifier that used to be here has moved to its own library, [classifier](https://github.com/harthur/classifier).\n","maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]}},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}],"author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"git://github.com/harthur/brain.git"},"time":{"modified":"2012-05-12T20:33:44.085Z","created":"2011-04-29T08:14:29.626Z","0.2.0":"2011-04-29T08:14:29.626Z","0.2.1":"2011-04-29T08:14:29.626Z","0.2.2":"2011-04-29T08:14:29.627Z","0.2.3":"2011-04-29T08:14:29.627Z","0.2.4":"2011-04-29T08:14:29.627Z","0.3.0":"2011-04-29T08:14:29.627Z","0.3.1":"2011-04-29T08:14:29.627Z","0.3.2":"2011-04-29T08:14:29.627Z","0.3.4":"2011-05-02T01:39:39.057Z","0.3.5":"2011-05-19T05:32:47.471Z","0.3.6":"2011-12-22T05:27:12.908Z","0.3.7":"2012-02-15T22:14:24.819Z","0.4.0":"2012-04-12T20:10:48.662Z","0.5.0":"2012-04-24T00:38:18.851Z","0.6.0":"2012-05-12T20:33:44.085Z"},"users":{"yazgazan":true},"_attachments":{"brain-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-KPhU8A/q2Ltlpq5M3wbd/g==","length":47725,"stub":true},"brain-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-9PjlST6h9X8fFIdoEqEPKg==","length":11968,"stub":true},"brain-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-GhmsO4xjWvLP9dd158XsDg==","length":7470,"stub":true},"brain-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-jL1sgLNHfwBaUO/9s/Mh+g==","length":63616,"stub":true},"brain-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-i7i6HYp00hv7HCxHflWAGg==","length":71680,"stub":true},"brain-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-yWN6kE3tNj3uJmvIFdbxYw==","length":61673,"stub":true},"brain-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-OR4vmo/QXjO7Zz54VYlKPw==","length":44379,"stub":true},"brain-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-PEJbZOFOo9N9JH5BgW2uhw==","length":19621,"stub":true},"brain-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-xjJxgY4BZI+EnX+S5A7Arg==","length":19910,"stub":true},"brain-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-8CzpQRin8DHC4lOH/bFy7Q==","length":24841,"stub":true},"brain-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-qyJKtU6F5cfMXB1AvWycSw==","length":6072,"stub":true},"brain-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-0bSVSh9+q+w0Y/V/q9LVag==","length":6061,"stub":true},"brain-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-uNEBChGklWdV1VazxSgirw==","length":5911,"stub":true},"brain-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4DQZPRdk64Y+Hb8xnFX9BA==","length":5912,"stub":true},"brain-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7yEzmb1PQlQt4H0REPNBEA==","length":5921,"stub":true}}}},
{"id":"brainbot","key":"brainbot","value":{"rev":"3-901e475fd7805f1c37277d370e0b9c8c"},"doc":{"_id":"brainbot","_rev":"3-901e475fd7805f1c37277d370e0b9c8c","name":"brainbot","description":"Services monitoring for hypertext link aggregation","dist-tags":{"latest":"0.0.1-beta"},"versions":{"0.0.1-beta":{"author":{"name":"Daroth","email":"daroth@braindead.fr","url":"http://braindead.fr/"},"name":"brainbot","description":"Services monitoring for hypertext link aggregation","version":"0.0.1-beta","homepage":"http://braindead.fr","repository":{"url":""},"main":"brainbot","bin":{"brainbot":"bin/brainbot"},"scripts":{"start":"node server.js","test":"test/brainbot-test"},"dependencies":{"hook.io":">=0.8.0","hook.io-irc":">=0.6.0","hook.io-couch":"git://github.com/Daroth/couch.git#master","felix-couchdb":">=1.0.0"},"devDependencies":{"vows":">=0.6.0"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"Debaser","email":"daroth@braindead.fr"},"_id":"brainbot@0.0.1-beta","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.7.7-pre","_defaultsLoaded":true,"dist":{"shasum":"28c3100e230785895df7e13719434120bf03583b","tarball":"http://registry.npmjs.org/brainbot/-/brainbot-0.0.1-beta.tgz"},"readme":"","maintainers":[{"name":"Debaser","email":"daroth@braindead.fr"}]}},"readme":"","maintainers":[{"name":"Debaser","email":"daroth@braindead.fr"}],"time":{"modified":"2012-04-07T18:42:22.462Z","created":"2012-04-07T18:42:19.219Z","0.0.1-beta":"2012-04-07T18:42:22.462Z"},"author":{"name":"Daroth","email":"daroth@braindead.fr","url":"http://braindead.fr/"},"repository":{"url":""},"_attachments":{"brainbot-0.0.1-beta.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2emDbI1fuZnvJpl/yCl6/g==","length":1854,"stub":true}}}},
{"id":"brainfuck","key":"brainfuck","value":{"rev":"7-adf33477ffe8640c9fdd6a0f8b349953"},"doc":{"_id":"brainfuck","_rev":"7-adf33477ffe8640c9fdd6a0f8b349953","name":"brainfuck","description":"A Brainfuck interpreter running on node.js","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"author":{"name":"Raj Kissu","email":"rajkissu@gmail.com","url":"http://www.martialcoder.com"},"name":"brainfuck","description":"A Brainfuck interpreter running on node.js","keywords":["brainfuck"],"version":"1.0.0","homepage":"http://github.com/rajkissu/brainfuck","repository":{"type":"git","url":"git://github.com/rajkissu/brainfuck.git"},"main":"./lib/brainfuck","engines":{"node":"~v0.4.10"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/rajkissu/.npm/brainfuck/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brainfuck@1.0.0","_engineSupported":true,"_npmVersion":"1.0.20","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"7bec6c5e5b6c1d2787babb30d4752ae00c1f6bad","tarball":"http://registry.npmjs.org/brainfuck/-/brainfuck-1.0.0.tgz"},"scripts":{}},"1.0.1":{"author":{"name":"Raj Kissu","email":"rajkissu@gmail.com","url":"http://www.martialcoder.com"},"name":"brainfuck","description":"A Brainfuck interpreter running on node.js","keywords":["brainfuck"],"version":"1.0.1","homepage":"http://github.com/rajkissu/brainfuck","repository":{"type":"git","url":"git://github.com/rajkissu/brainfuck.git"},"main":"./lib/brainfuck","engines":{"node":"~v0.4.10"},"dependencies":{"vows":">= 0.5.9"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/rajkissu/.npm/brainfuck/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brainfuck@1.0.1","_engineSupported":true,"_npmVersion":"1.0.20","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"f5492e09533abdd59580004113caf946b2f68548","tarball":"http://registry.npmjs.org/brainfuck/-/brainfuck-1.0.1.tgz"},"scripts":{}},"1.0.2":{"author":{"name":"Raj Kissu","email":"rajkissu@gmail.com","url":"http://www.martialcoder.com"},"name":"brainfuck","description":"A Brainfuck interpreter running on node.js","keywords":["brainfuck"],"version":"1.0.2","homepage":"http://www.martialcoder.com","repository":{"type":"git","url":"git://github.com/rajkissu/brainfuck.git"},"main":"./lib/brainfuck","engines":{"node":"~v0.4.10"},"dependencies":{"vows":">= 0.5.9"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/rajkissu/.npm/brainfuck/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brainfuck@1.0.2","_engineSupported":true,"_npmVersion":"1.0.20","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"007f4a0e7e63fc35bd83c6b01cc0024d3fb3800c","tarball":"http://registry.npmjs.org/brainfuck/-/brainfuck-1.0.2.tgz"},"scripts":{}}},"maintainers":[{"name":"rajkissu","email":"rajkissu@gmail.com"}],"time":{"modified":"2011-07-24T14:12:42.896Z","created":"2011-07-24T12:03:16.166Z","1.0.0":"2011-07-24T12:03:20.896Z","1.0.1":"2011-07-24T12:25:48.406Z","1.0.2":"2011-07-24T14:12:42.896Z"},"author":{"name":"Raj Kissu","email":"rajkissu@gmail.com","url":"http://www.martialcoder.com"},"repository":{"type":"git","url":"git://github.com/rajkissu/brainfuck.git"},"_attachments":{"brainfuck-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-fEzzUuIs6k8xuHMz1b1ejA==","length":3332,"stub":true},"brainfuck-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-e9E1clfOPV3BOSkB43lNEA==","length":3087,"stub":true},"brainfuck-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-76OLbtjOqdGf1g67fSBN/w==","length":2958,"stub":true}}}},
{"id":"brains","key":"brains","value":{"rev":"3-d7e7a95ea742f9b42fefb594c67c726a"},"doc":{"_id":"brains","_rev":"3-d7e7a95ea742f9b42fefb594c67c726a","name":"brains","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"brains","version":"0.0.0","engines":{"node":">= 0.4.4"},"author":{"name":"Adrian Cushman","email":"acushman@gmail.com"},"main":"brains.coffee","_id":"brains@0.0.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cc80e74db359705f1d29501b57dcb9b430f62e36","tarball":"http://registry.npmjs.org/brains/-/brains-0.0.0.tgz"}}},"maintainers":[{"name":"cushman","email":"acushman@gmail.com"}],"time":{"modified":"2011-05-10T20:39:28.892Z","created":"2011-05-10T20:39:28.441Z","0.0.0":"2011-05-10T20:39:28.892Z"},"author":{"name":"Adrian Cushman","email":"acushman@gmail.com"},"_attachments":{"brains-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-58JhgjFYp7CwT8iYO8j7og==","length":278,"stub":true}}}},
{"id":"braintree","key":"braintree","value":{"rev":"36-090efc112e99dcede5126cfa9bbe6eb0"},"doc":{"_id":"braintree","_rev":"36-090efc112e99dcede5126cfa9bbe6eb0","name":"braintree","description":"A library for integrating with Braintree.","dist-tags":{"latest":"1.1.2"},"versions":{"0.1.1":{"name":"braintree","description":"A library for integrating with Braintree.","engines":["node >=0.2.0"],"url":"http://github.com/braintree/braintree_node","keywords":["payments"],"author":{"name":"Braintree","email":"code@getbraintree.com"},"dependencies":{"base64":"=1.0.1","underscore":"1.1.0"},"main":"./lib/braintree","directories":{"spec":"./spec"},"version":"0.1.1","_id":"braintree@0.1.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","_npmUser":{"name":"braintree","email":"devs@getbraintree.com"},"dist":{"tarball":"http://registry.npmjs.org/braintree/-/braintree-0.1.1.tgz"}},"0.2.0":{"name":"braintree","version":"0.2.0","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","o3-xml":"~0.1.0"},"engines":{"node":"~0.4.7"},"bundledDependencies":["dateformat"],"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.8"},"_id":"braintree@0.2.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"_npmUser":{"name":"braintree","email":"devs@getbraintree.com"},"dist":{"shasum":"a9dae827e7ffff1e3ab5c90c1d40c43f40d70735","tarball":"http://registry.npmjs.org/braintree/-/braintree-0.2.0.tgz"},"scripts":{},"directories":{}},"0.3.0":{"name":"braintree","version":"0.3.0","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","o3-xml":"~0.1.0"},"engines":{"node":"~0.4.7"},"bundledDependencies":["dateformat"],"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.8"},"_npmJsonOpts":{"file":"/Users/pair/.npm/braintree/0.3.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"braintree@0.3.0","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"_npmUser":{"name":"braintree","email":"devs@getbraintree.com"},"dist":{"shasum":"d91ea193d9eb05416dbe8efdef09dbfbfae9013e","tarball":"http://registry.npmjs.org/braintree/-/braintree-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}],"directories":{}},"0.4.0":{"name":"braintree","version":"0.4.0","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","o3-xml":"~0.1.0"},"engines":{"node":"~0.4.7"},"bundledDependencies":["dateformat"],"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.11"},"_npmJsonOpts":{"file":"/Users/pair/.npm/braintree/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"braintree@0.4.0","_npmUser":{"name":"braintree","email":"devs@getbraintree.com"},"_engineSupported":true,"_npmVersion":"1.0.25","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"69f5d8f1c224140e792c9aea678c14f41edc694a","tarball":"http://registry.npmjs.org/braintree/-/braintree-0.4.0.tgz"},"scripts":{},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}],"directories":{}},"0.4.1":{"name":"braintree","version":"0.4.1","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","o3-xml":"~0.1.0"},"engines":{"node":"~0.4.7"},"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.11"},"_npmUser":{"name":"braintree","email":"devs@getbraintree.com"},"_id":"braintree@0.4.1","bundleDependencies":["dateformat"],"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5703babaab1d621f6f4ead646b5177e0af36923c","tarball":"http://registry.npmjs.org/braintree/-/braintree-0.4.1.tgz"},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}],"directories":{}},"0.5.0":{"name":"braintree","version":"0.5.0","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","xml2js":">=0.1.13"},"engines":{"node":"~0.6.6"},"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.11"},"_npmUser":{"name":"braintree","email":"devs@braintreepayments.com"},"_id":"braintree@0.5.0","bundleDependencies":["dateformat"],"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"8c3ca6031f13bcc1ef1e229300889cd13495754e","tarball":"http://registry.npmjs.org/braintree/-/braintree-0.5.0.tgz"},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}]},"0.5.1":{"name":"braintree","version":"0.5.1","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","xml2js":">=0.1.13"},"engines":{"node":"~0.6.6"},"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.11"},"_npmUser":{"name":"braintree","email":"devs@braintreepayments.com"},"_id":"braintree@0.5.1","bundleDependencies":["dateformat"],"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"c6a26db480ac824a7ab6c0f435942fe182889144","tarball":"http://registry.npmjs.org/braintree/-/braintree-0.5.1.tgz"},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}]},"1.0.0":{"name":"braintree","version":"1.0.0","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"~1.1","xml2js":">=0.1.13"},"engines":{"node":"~0.6.6"},"devDependencies":{"underscore":"=1.1.6","vows":"=0.5.11"},"_npmUser":{"name":"braintree","email":"code@getbraintree.com"},"_id":"braintree@1.0.0","bundleDependencies":["dateformat"],"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"defd4cb7c4d9693d6508b6e9d75a6dad1c0a1b9e","tarball":"http://registry.npmjs.org/braintree/-/braintree-1.0.0.tgz"},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}]},"1.1.0":{"name":"braintree","version":"1.1.0","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"=1.1.3","xml2js":"=0.1.13","underscore":"=1.3.1"},"engines":{"node":"~0.6.6"},"devDependencies":{"vows":"=0.6.1"},"_npmUser":{"name":"braintree","email":"code@getbraintree.com"},"_id":"braintree@1.1.0","bundleDependencies":["dateformat"],"_engineSupported":false,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ee24d413a964cb5e65b83aa0dd511796a611d669","tarball":"http://registry.npmjs.org/braintree/-/braintree-1.1.0.tgz"},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}]},"1.1.1":{"name":"braintree","version":"1.1.1","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"git://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"=1.1.3","xml2js":"=0.1.13","underscore":"=1.3.1"},"engines":{"node":"~0.6.6"},"devDependencies":{"vows":"=0.6.1"},"_npmUser":{"name":"braintree","email":"devs@getbraintree.com"},"_id":"braintree@1.1.1","bundleDependencies":["dateformat"],"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a8b0d4989758b7fadc74a9890b2a3d4751777b5f","tarball":"http://registry.npmjs.org/braintree/-/braintree-1.1.1.tgz"},"readme":"## Overview\n\nThis is a Node.js library for integrating with the [Braintree](http://www.braintreepayments.com) gateway.\n\n## Installing\n\n### From NPM\n\n* `npm install braintree`\n* `var braintree = require('braintree')`\n\n### From Source\n\n* clone the latest tag somewhere in your require.paths\n* `var braintree = require('braintree-node/lib/braintree')`\n\n### Dependencies\n\n* node ~0.6.6\n* coffee-script ~1.1\n* xml2js >= 0.1.13\n\n## Links\n\n* [Documentation](http://www.braintreepayments.com/docs/node)\n* [Bug Tracker](http://github.com/braintree/braintree_node/issues)\n\n## Quick Start\n```javascript\nvar util = require('util'),\n    braintree = require('braintree');\n\nvar gateway = braintree.connect({\n  environment: braintree.Environment.Sandbox,\n  merchantId: 'your_merchant_id',\n  publicKey: 'your_public_key',\n  privateKey: 'your_private_key'\n});\n\ngateway.transaction.sale({\n  amount: '5.00',\n  creditCard: {\n    number: '5105105105105100',\n    expirationDate: '05/12'\n  }\n}, function (err, result) {\n  if (err) throw err;\n\n  if (result.success) {\n    util.log('Transaction ID: ' + result.transaction.id);\n  } else {\n    util.log(result.message);\n  }\n});\n```\n\n## License\n\nSee the LICENSE file.\n","maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}]},"1.1.2":{"name":"braintree","version":"1.1.2","description":"A library for integrating with Braintree.","keywords":["payments"],"homepage":"http://github.com/braintree/braintree_node","author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"main":"./lib/braintree.js","repository":{"type":"git","url":"https://github.com/braintree/braintree_node.git"},"dependencies":{"coffee-script":"=1.1.3","xml2js":"=0.1.13","underscore":"=1.3.1"},"engines":{"node":">=0.6.6"},"devDependencies":{"vows":"=0.6.1"},"readme":"## Overview\n\nThis is a Node.js library for integrating with the [Braintree](http://www.braintreepayments.com) gateway.\n\n## Installing\n\n### From NPM\n\n* `npm install braintree`\n* `var braintree = require('braintree')`\n\n### From Source\n\n* clone the latest tag somewhere in your require.paths\n* `var braintree = require('braintree-node/lib/braintree')`\n\n### Dependencies\n\n* node ~0.6.6\n* coffee-script ~1.1\n* xml2js >= 0.1.13\n\n## Links\n\n* [Documentation](http://www.braintreepayments.com/docs/node)\n* [Bug Tracker](http://github.com/braintree/braintree_node/issues)\n\n## Quick Start\n```javascript\nvar util = require('util'),\n    braintree = require('braintree');\n\nvar gateway = braintree.connect({\n  environment: braintree.Environment.Sandbox,\n  merchantId: 'your_merchant_id',\n  publicKey: 'your_public_key',\n  privateKey: 'your_private_key'\n});\n\ngateway.transaction.sale({\n  amount: '5.00',\n  creditCard: {\n    number: '5105105105105100',\n    expirationDate: '05/12'\n  }\n}, function (err, result) {\n  if (err) throw err;\n\n  if (result.success) {\n    util.log('Transaction ID: ' + result.transaction.id);\n  } else {\n    util.log(result.message);\n  }\n});\n```\n\n## License\n\nSee the LICENSE file.\n","_id":"braintree@1.1.2","bundleDependencies":["dateformat"],"dist":{"shasum":"544c33055cb70d0638ec78b85502357717b68b48","tarball":"http://registry.npmjs.org/braintree/-/braintree-1.1.2.tgz"},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}]}},"maintainers":[{"name":"braintree","email":"devs@getbraintree.com"}],"author":{"name":"Braintree","email":"code@braintreepayments.com","url":"http://www.braintreepayments.com"},"time":{"modified":"2012-08-02T13:44:08.538Z","created":"2011-05-01T15:20:34.928Z","0.1.1":"2011-05-01T15:20:34.928Z","0.2.0":"2011-05-29T22:52:52.038Z","0.3.0":"2011-08-24T22:23:34.335Z","0.4.0":"2011-10-07T22:34:23.354Z","0.4.1":"2011-11-14T16:37:36.348Z","1.0.105":"2011-12-29T22:12:59.816Z","0.5.0":"2012-01-09T18:07:21.722Z","0.5.1":"2012-02-01T20:41:14.422Z","1.0.0":"2012-02-10T17:48:25.163Z","1.1.0":"2012-04-19T16:22:05.735Z","1.1.1":"2012-06-14T21:40:21.026Z","1.1.2":"2012-07-27T14:30:06.714Z"},"repository":{"type":"git","url":"https://github.com/braintree/braintree_node.git"},"users":{"fgribreau":true},"_attachments":{"braintree-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-PT+kMY72k7dsMwI87sRV0A==","length":39273,"stub":true},"braintree-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-wCw537qCOr+WIkaKL99F0A==","length":39812,"stub":true},"braintree-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-L1HzPLJDdQtQzC8CFeKUIQ==","length":40960,"stub":true},"braintree-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-lCXDSjw+HAJIqbiRhGAIpQ==","length":40960,"stub":true},"braintree-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-nGrv5cfzDBJ9DuTZ+sGNMQ==","length":30720,"stub":true},"braintree-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-c+9Ug3d9BNtQ3qIxPl+EsQ==","length":30720,"stub":true},"braintree-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-Dc/O6z1MoQRGaXVwb9Ikxw==","length":30720,"stub":true},"braintree-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-ncVFxgGlKYSI6BLLimm2fw==","length":27462,"stub":true},"braintree-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-cFvPzc9D/iLfJQQTcFAi8w==","length":27143,"stub":true},"braintree-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-r2843ZP6C62OTaKxIDAYmw==","length":26105,"stub":true},"braintree-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KCfcHbdEaEcZet3Xeb60RA==","length":4985,"stub":true}}}},
{"id":"brainy","key":"brainy","value":{"rev":"5-ab0d3282a67d00de456578671b35b56c"},"doc":{"_id":"brainy","_rev":"5-ab0d3282a67d00de456578671b35b56c","name":"brainy","description":"dead simple backbone synchronization server","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"catshirt","email":"caden@catshirt.org"},"name":"brainy","description":"dead simple backbone synchronization server","url":"http://github.com/catshirt/brainy","keywords":["backbone","sync","synchronization","server"],"dependencies":{"backbone":"0.5.3","connect":"1.8.5","socket.io":"0.8.7","underscore":"1.2.3"},"bin":{"brainy":"./bin/brainy"},"main":"./lib/brainy","version":"0.0.1","_npmUser":{"name":"catshirt","email":"caden@catshirt.net"},"_id":"brainy@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"15a2b51b8137e0b99f901dd77e3f963a61d947e3","tarball":"http://registry.npmjs.org/brainy/-/brainy-0.0.1.tgz"},"maintainers":[{"name":"catshirt","email":"caden@catshirt.net"}]},"0.0.2":{"author":{"name":"catshirt","email":"caden@catshirt.org"},"name":"brainy","description":"dead simple backbone synchronization server","url":"http://github.com/catshirt/brainy","keywords":["backbone","sync","synchronization","server"],"dependencies":{"backbone":"0.5.3","connect":"1.8.5","socket.io":"0.8.7","underscore":"1.2.3"},"bin":{"brainy":"./bin/brainy"},"main":"./lib/brainy","version":"0.0.2","_npmUser":{"name":"catshirt","email":"caden@catshirt.net"},"_id":"brainy@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"fdcf18f8d55bb4c307ace5d00dd59d6c7c584d11","tarball":"http://registry.npmjs.org/brainy/-/brainy-0.0.2.tgz"},"maintainers":[{"name":"catshirt","email":"caden@catshirt.net"}]}},"maintainers":[{"name":"catshirt","email":"caden@catshirt.net"}],"time":{"modified":"2012-01-03T06:31:27.329Z","created":"2011-12-30T12:45:55.685Z","0.0.1":"2011-12-30T12:45:56.050Z","0.0.2":"2012-01-03T06:31:27.329Z"},"author":{"name":"catshirt","email":"caden@catshirt.org"},"_attachments":{"brainy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-o0OYrSQaEKcEt+16Ipgh/g==","length":122880,"stub":true},"brainy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-M9XNzanc77JMG6e+leI3PA==","length":122880,"stub":true}}}},
{"id":"brake","key":"brake","value":{"rev":"6-71c6ac6122599729cd79fd1b258e34a9"},"doc":{"_id":"brake","_rev":"6-71c6ac6122599729cd79fd1b258e34a9","name":"brake","description":"throttle a stream with backpressure","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0":{"name":"brake","version":"0.0.0","description":"throttle a stream with backpressure","main":"index.js","bin":{},"directories":{"example":"example","test":"test"},"dependencies":{},"devDependencies":{"tap":"~0.2.5"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/substack/node-brake.git"},"homepage":"https://github.com/substack/node-brake","keywords":["rate","limit","stream","back-pressure","drain","pause","resume","pipe","slow","buffered"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","engine":{"node":">=0.6"},"readme":"","_id":"brake@0.0.0","dist":{"shasum":"9f5dc749bfcf6478851d10724000a577981ee7d8","tarball":"http://registry.npmjs.org/brake/-/brake-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.1.0":{"name":"brake","version":"0.1.0","description":"throttle a stream with backpressure","main":"index.js","bin":{"brake":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"dependencies":{},"devDependencies":{"tap":"~0.2.5"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/substack/node-brake.git"},"homepage":"https://github.com/substack/node-brake","keywords":["rate","limit","stream","back-pressure","drain","pause","resume","pipe","slow","buffered"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","engine":{"node":">=0.6"},"readme":"","_id":"brake@0.1.0","dist":{"shasum":"e31d8505580ddc61bbccb5b0b1a32e9da71a31da","tarball":"http://registry.npmjs.org/brake/-/brake-0.1.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-08-05T21:34:55.671Z","created":"2012-06-24T11:47:30.136Z","0.0.0":"2012-06-24T11:47:31.734Z","0.1.0":"2012-06-24T13:47:28.120Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-brake.git"},"users":{"sjonnet19":true},"_attachments":{"brake-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-OXf4umO2AD/5Ff7nxsCoSw==","length":4115,"stub":true},"brake-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YtsCM8YtDNsgg7c5M00rcA==","length":3599,"stub":true}}}},
{"id":"bread","key":"bread","value":{"rev":"53-131b73c824d78f474129a283ae06c204"},"doc":{"_id":"bread","_rev":"53-131b73c824d78f474129a283ae06c204","name":"bread","description":"file based cms/blog engine without backend","dist-tags":{"latest":"1.0.5"},"versions":{"0.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"simple blogging engine that uses bake, mongodb and markdown","version":"0.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","engines":{"node":">=0.4.0"},"dependencies":{"bake":">=0.5.2","Index":">=0.0.2","mongodb":">=0.9.6-13","marked":">=0.0.8"},"_npmJsonOpts":{"file":"/home/paul/.npm/bread/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bread@0.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"65728fb296377734a47a7c502a65838ef1d3637c","tarball":"http://registry.npmjs.org/bread/-/bread-0.0.0.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"simple blogging engine that uses bake, Index and markdown (marked)","tags":["blog","markdown"],"version":"0.0.1","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","engines":{"node":">=0.4.0"},"dependencies":{"bake":">=0.5.2","Index":">=0.1.2","marked":">=0.0.9"},"_npmJsonOpts":{"file":"/home/paul/.npm/bread/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bread@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7e69d22e3eac47a4b223c612c2248ee1f523915d","tarball":"http://registry.npmjs.org/bread/-/bread-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"simple blogging engine that uses bake, Index and markdown (marked)","tags":["blog","markdown"],"version":"0.0.2","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","engines":{"node":">=0.4.0"},"dependencies":{"bake":">=0.5.3","Index":">=0.1.2","marked":">=0.0.9","isodate":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bread/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bread@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f2cafba7c800c41538c02aa2bdae13cbf42ab684","tarball":"http://registry.npmjs.org/bread/-/bread-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"simple blogging engine that uses bake, Index and markdown (marked)","tags":["blog","markdown"],"version":"0.0.3","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","engines":{"node":">=0.4.0"},"dependencies":{"bake":">=0.5.3","Index":">=0.1.2","marked":">=0.0.9","isodate":">=0.0.1"},"_npmJsonOpts":{"file":"/home/paul/.npm/bread/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bread@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"6831bda11412d8a84a9cf95af600f6469dd01bd6","tarball":"http://registry.npmjs.org/bread/-/bread-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.0.4":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"simple blogging engine that uses bake, Index and markdown (marked)","tags":["blog","markdown"],"version":"0.0.4","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","engines":{"node":">=0.4.0"},"dependencies":{"bake":">=0.5.3","Index":">=0.1.2","marked":">=0.0.9","isodate":">=0.0.1"},"devDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"3394e66f7590b23c7ba0b56d3315b3925d6887e0","tarball":"http://registry.npmjs.org/bread/-/bread-0.0.4.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.1.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"0.1.0","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"append":">=0.1.1","async":">=0.1.15","bake":">=0.7.0","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","ejs":">=0.6.1","marked":">=0.1.9","mongodb":">=0.9.8-7","isodate":">=0.1.0","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"67ae6aa00c147a73772439100162d5d184d94711","tarball":"http://registry.npmjs.org/bread/-/bread-0.1.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"0.2.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"0.2.0","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"append":">=0.1.1","async":">=0.1.15","bake":">=0.7.0","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","marked":">=0.1.9","mongodb":">=0.9.8-7","isodate":">=0.1.0","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"27689ed700df7711854bdbaf3b1553a9c7d83523","tarball":"http://registry.npmjs.org/bread/-/bread-0.2.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.0-alpha":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.0-alpha","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.0","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.0-alpha","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"9028f7f64ba7c445f98abbaaa70e1dd9033c1713","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.0-alpha.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.0-beta":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.0-beta","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.0","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.0-beta","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"ae8030b574b0c63b4f3b5746ce95cbfcec6ddb4c","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.0-beta.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.0-RC1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.0-RC1","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.0","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.0-RC1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cc680f499f21f858dbd8e72a261ab3c046638302","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.0-RC1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.0-RC2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.0-RC2","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.0","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.0-RC2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"cad2e948c17dcac649ff3bb2fb4be5894a925acf","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.0-RC2.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.0":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.0","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.5","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","props":">=0.2.3","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.0","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"57cd03e0bcc66789881812a5d37a45fb43822f83","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.0.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.1":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.1","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.5","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","props":">=0.2.3","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.1","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e0a127d80e7705018f07a6049cc7259971a4208b","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.1.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.2":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.2","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.5","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","props":">=0.2.3","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.2","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f6490842ec3a718d9f771f38650d0a65a3895a2f","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.2.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.3":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.3","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.5","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","props":">=0.2.3","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.3","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d2bbfd52b68e43616f6a8a5f51083e4a4336816a","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.3.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.4":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.4","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.5","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">=0.9.9","pdc":">=0.0.0","props":">=0.2.3","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pvorb","email":"paul@vorb.de"},"_id":"bread@1.0.4","_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"207548a958865153a1ab9d2da85b36c0ad5b27bc","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.4.tgz"},"readme":"","maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"directories":{}},"1.0.5":{"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"name":"bread","description":"file based cms/blog engine without backend","tags":["blog","markdown"],"version":"1.0.5","repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"bugs":{"url":"https://github.com/pvorb/node-bread/issues"},"main":"bread.js","bin":{"bread":"./bin/bread.js"},"engines":{"node":">=0.6.0"},"dependencies":{"Set":">=0.1.0","append":">=0.1.1","async":">=0.1.16","bake":">=1.0.5","clone":">=0.0.4","colors":">=0.6.0","confdir":">=0.0.2","dive":">=0.2.0","ejs":">=0.6.1","esc":">=0.0.2","isodate":">=0.1.0","mongodb":">0.9.9","pdc":">=0.0.0","props":">=0.2.3","reg":">=0.1.0"},"licenses":[{"type":"MIT","url":"http://vorb.de/license/mit.html"}],"devDependencies":{},"optionalDependencies":{},"readme":"# bread\n\n![bread](https://raw.github.com/pvorb/node-bread/master/res/bread.png)\n\na file based static website/blog generator for node that uses [bake][bake],\n[mongodb][mongodb-native] and [markdown][marked].\n\nI’m using it for my personal website, [vorb.de][vorb.de]. It supports\nnormal pages (in any directory structure you like), customizable index \npages and feeds as well as tag pages. Commenting functionality can be added\nby using a service like [Disqus][disqus] or my own [comments][comments],\nwhich also supports pingbacks.\n\nSo let’s see how you can bake your bread in node.\n\n## Example\n\n```javascript\nvar bread = require(\"bread\");\n\n// configuration object\nvar conf = {\n  dbinf: { // MongoDB connection\n    host: \"localhost\",\n    port: \"27017\",\n    name: \"mywebsite\",\n    collection: \"pages\"\n  },\n\n  directories: {\n    input: \"pub\",    // Look for files in this dir.\n    output: \"pub\",   // Write files to this dir.\n    templates: \"tpl\" // Look for templates in this dir.\n  },\n\n  fileExtensions: { // Replace markdown by html\n    \"mkd\": \"html\",\n    \"md\": \"html\",\n    \"mdown\": \"html\",\n    \"markdown\": \"html\"\n  },\n\n  // Array of indexes that shall be created\n  indexes: [\n    // Blog Index\n    {\n      title: \"My Blog\",\n      pattern: /\\/log\\/[^\\/]+/, // Index files matched by this pattern.\n      path: {\n        first: \"/log/index.html\",  // first page of the index\n        pattern: \"/log/index-{{page}}.html\"  // other pages\n      },\n      template: \"index.tpl\",    // template\n      limit: 8,                 // 8 links per page\n      sort: [[\"date\", \"desc\"]]  // newest first\n    },\n    // RSS Feed\n    {\n      title: \"My Blog\",\n      pattern: /\\/log\\/[^\\/]+/, // Add files matched by this pattern to the\n                                // feed.\n      path: \"/log/feed.xml\",    // feed url\n      template: \"rss.tpl\",      // template\n      limit: 10,                // total maximum\n      sort: [[\"date\", \"desc\"]]  // newest first\n    }\n  ],\n\n  properties: {\n    siteTitle: \"My Site\"\n  }\n};\n\nbread(conf);\n```\n\nThat's it for the moment. Extended documentation will soon follow in the [wiki][wiki].\n\n\n## Bugs and Issues\n\nIf you encounter any bugs or issues, feel free to open an issue at\n[github][issues].\n\n## License\n\nCopyright © 2011-2012 Paul Vorbach\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the “Software”), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n[vorb.de]: http://vorb.de/\n[disqus]: http://disqus.com/\n[comments]: //github.com/pvorb/node-comments\n[bake]: //github.com/pvorb/node-bake\n[mongodb-native]: //github.com/christkv/node-mongodb-native\n[marked]: //github.com/chjj/marked\n[wiki]: //github.com/pvorb/node-bread/wiki\n[issues]: //github.com/pvorb/node-bread/issues\n[mit]: http://vorb.de/license/mit.html\n","_id":"bread@1.0.5","dist":{"shasum":"99f6e156264594a631d66b3b67c601028c3d1f84","tarball":"http://registry.npmjs.org/bread/-/bread-1.0.5.tgz"},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}]}},"maintainers":[{"name":"pvorb","email":"paul@vorb.de"}],"time":{"modified":"2012-08-07T23:51:15.233Z","created":"2011-08-28T01:38:44.625Z","0.0.0":"2011-08-28T01:38:47.322Z","0.0.1":"2011-09-01T18:12:54.023Z","0.0.2":"2011-09-02T23:31:18.737Z","0.0.3":"2011-09-02T23:56:17.728Z","0.0.4":"2011-12-09T16:00:24.414Z","0.1.0":"2012-02-08T16:24:01.031Z","0.2.0":"2012-02-11T11:48:36.549Z","1.0.0-rc":"2012-02-15T16:10:51.206Z","1.0.0-alpha":"2012-02-15T16:39:37.481Z","1.0.0-beta":"2012-02-15T20:46:14.417Z","1.0.0-RC1":"2012-02-16T01:17:48.169Z","1.0.0-RC2":"2012-02-16T13:22:49.885Z","1.0.0":"2012-02-17T16:57:24.895Z","1.0.1":"2012-02-28T23:44:34.327Z","1.0.2":"2012-02-29T12:19:57.240Z","1.0.3":"2012-03-06T12:40:52.149Z","1.0.4":"2012-04-17T10:11:06.102Z","1.0.5":"2012-08-07T23:51:15.233Z"},"author":{"name":"Paul Vorbach","email":"paul@vorb.de","url":"http://vorb.de"},"repository":{"type":"git","url":"git://github.com/pvorb/node-bread.git"},"users":{"fgribreau":true},"_attachments":{"bread-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-hTkiCiUpf3YSQgE2pqRYew==","length":198989,"stub":true},"bread-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-6KONmTLrECPPcYwSM3DSkg==","length":200450,"stub":true},"bread-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-2AeWeDJ2OCOlMadmehqwAg==","length":200370,"stub":true},"bread-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-J8ehx2ys4mGoavIVRDzGXw==","length":200367,"stub":true},"bread-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-o01WmKL3vzffBQUlVU5jfw==","length":200356,"stub":true},"bread-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-OO7S3g2iNgN+YfZQUe0Qzw==","length":200327,"stub":true},"bread-1.0.0-RC2.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-4594hesElFoa6tBkQzS26w==","length":200551,"stub":true},"bread-1.0.0-RC1.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-PSjausRfZF8P2f4A7lh6ag==","length":200396,"stub":true},"bread-1.0.0-beta.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-YRc1aAhM5RV6aNxhMl5Y1Q==","length":200294,"stub":true},"bread-1.0.0-alpha.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-LKigtRkg6uVkoUE8GwuGIw==","length":200184,"stub":true},"bread-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+ti12xvFfC5c66olvl8jPg==","length":200192,"stub":true},"bread-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-xV6bqihCdtq2Zatzmce45w==","length":5157,"stub":true},"bread-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZgZn5Y8NNAkL30hlyV1+dQ==","length":2526,"stub":true},"bread-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-G1qS0ArWCw2KQuMJYq1QZw==","length":2514,"stub":true},"bread-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/fntkowFaWcFa5JZ96CTKQ==","length":2372,"stub":true},"bread-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qOlOR3OWKa7+8g+NimCT0A==","length":2347,"stub":true},"bread-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-leVkUQfq/40vs2QlbP9aWQ==","length":1546,"stub":true}}}},
{"id":"breakfast","key":"breakfast","value":{"rev":"3-231e3046ede5e35e272dfab4a379015d"},"doc":{"_id":"breakfast","_rev":"3-231e3046ede5e35e272dfab4a379015d","name":"breakfast","description":"Coffee(script), HAML and a side of SASS.... a single compiler for handling multiple scripting languages.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"breakfast","description":"Coffee(script), HAML and a side of SASS.... a single compiler for handling multiple scripting languages.","keywords":["javascript","language","coffeescript","compiler","haml","sass","scss"],"author":{"name":"Roberto A. Santiago"},"version":"0.1.0","licenses":[{"type":"MIT"}],"engines":{"node":">=0.4","findit":">=0.0.4","haml":"=0.2.5","coffee-script":">=1.1.1","watch":">=0.3.2"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/breakfast","bin":{"breakfast":"./bin/breakfast-compile","brunch":"./bin/breakfast-watch"},"homepage":"http://rasantiago.github.com/breakfast","repository":{"type":"git","url":"git://github.com/rasantiago/breakfast.git"},"_id":"breakfast@0.1.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"87641c42f3fd897496537ea754138bf7bf1cb9bd","tarball":"http://registry.npmjs.org/breakfast/-/breakfast-0.1.0.tgz"}}},"maintainers":[{"name":"rasantiago","email":"roberto@rasantiago.com"}],"time":{"modified":"2011-06-14T00:01:40.445Z","created":"2011-06-14T00:01:40.057Z","0.1.0":"2011-06-14T00:01:40.445Z"},"author":{"name":"Roberto A. Santiago"},"repository":{"type":"git","url":"git://github.com/rasantiago/breakfast.git"},"_attachments":{"breakfast-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pbT//a7YzB+ZaCfkw0d50g==","length":2931,"stub":true}}}},
{"id":"breakout","key":"breakout","value":{"rev":"7-fee732a5bab4032cddb4f57446b50ed6"},"doc":{"_id":"breakout","_rev":"7-fee732a5bab4032cddb4f57446b50ed6","name":"breakout","description":"Gives you one simple way to write an API exposed over multiple transports","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"breakout","description":"Gives you one simple way to write an API exposed over multiple transports","version":"0.0.1","author":{"name":"Ian Serlin"},"repository":{"type":"git","url":"git://github.com/ianserlin/breakout.git"},"main":"./lib/index.js","dependencies":{"now":">= 0.8.1","express":">= 2.5.5"},"devDependencies":{},"engines":{"node":">= 0.4.7"},"_npmUser":{"name":"ianserlin","email":"npm@ianserlin.com"},"_id":"breakout@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"782d599072d80b2950175abb70ae36014d964423","tarball":"http://registry.npmjs.org/breakout/-/breakout-0.0.1.tgz"},"maintainers":[{"name":"ianserlin","email":"npm@ianserlin.com"}]},"0.0.2":{"name":"breakout","description":"Gives you one simple way to write an API exposed over multiple transports","version":"0.0.2","author":{"name":"Ian Serlin"},"repository":{"type":"git","url":"git://github.com/ianserlin/breakout.git"},"main":"./lib/index.js","dependencies":{"now":">= 0.8.1","express":">= 2.5.5"},"devDependencies":{},"engines":{"node":">= 0.4.7"},"_npmUser":{"name":"ianserlin","email":"npm@ianserlin.com"},"_id":"breakout@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f9125edc94e56afe0956f7ec8af43f6d9497c157","tarball":"http://registry.npmjs.org/breakout/-/breakout-0.0.2.tgz"},"maintainers":[{"name":"ianserlin","email":"npm@ianserlin.com"}]},"0.0.3":{"name":"breakout","description":"Gives you one simple way to write an API exposed over multiple transports","version":"0.0.3","author":{"name":"Ian Serlin"},"repository":{"type":"git","url":"git://github.com/ianserlin/breakout.git"},"main":"./lib/index.js","dependencies":{"now":">= 0.8.1","express":">= 2.5.5"},"devDependencies":{},"engines":{"node":">= 0.4.7"},"_npmUser":{"name":"ianserlin","email":"npm@ianserlin.com"},"_id":"breakout@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e6faff5ed56efb964fe0efed23dadf41edf2e562","tarball":"http://registry.npmjs.org/breakout/-/breakout-0.0.3.tgz"},"maintainers":[{"name":"ianserlin","email":"npm@ianserlin.com"}]}},"readme":"Breakout - API Transport Abstraction\n------------------------------------\n\nBreakout tives you one simple way to write an API across transports using NodeJS. For instance, you can write one route and one handler function and have it automatically exposed via a json http api and via the NowJS everyone pocket.\n\nOut of the Box\n--------------\n\nOut of the box you get support for an http json api via Express and a NowJS api. In your configuration simply pass in your instances for each, e.g.\n\n<pre><code>\nvar express = require('express')\n  , routes = require('./routes')\nvar app = module.exports = express.createServer();\n\nvar now = require('now');\nvar everyone = now.initialize(app);\n\nvar breakout = require('breakout');\nbreakout.use('http', app).use('now', everyone);\n</code></pre>\n\nDefining You API\n----------------\n\n<pre><code>\nbreakout.map('Fruit.read', function( args, respond ){\n  console.log( args );\n  respond( { donkey: true } );\n});\n\nbreakout.map('Fruit.save', function( args, respond ){\n  console.log( args );\n  respond( { donkey: false } );\n});\n</code></pre>\n\n\nServer-side Handler Signature\n-----------------------------\n\n<pre><code>\n\tfunction( data, respond ){\n\t\t// manipulate data\n\t\tdata  = 'wee';\n\t\t// call responder with response\t\n\t\trespond( myResponse );\n\t}\n</pre></code>\n\nTODO\n----\n* be able to handle http route params","maintainers":[{"name":"ianserlin","email":"npm@ianserlin.com"}],"time":{"modified":"2012-02-08T21:20:09.122Z","created":"2012-01-24T20:41:08.987Z","0.0.1":"2012-01-24T20:41:10.560Z","0.0.2":"2012-02-04T09:54:54.415Z","0.0.3":"2012-02-08T21:20:09.122Z"},"author":{"name":"Ian Serlin"},"repository":{"type":"git","url":"git://github.com/ianserlin/breakout.git"},"_attachments":{"breakout-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kJilmPrhunca46rEgROf3w==","length":2018,"stub":true},"breakout-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-AI4hJIPv1Y6p5pVKx5fKqw==","length":2037,"stub":true},"breakout-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Uvk1kQdBuXthJt4vrcR4/Q==","length":1963,"stub":true}}}},
{"id":"breeze","key":"breeze","value":{"rev":"20-cd7d58dc193b865d1e0c272c33ffe9df"},"doc":{"_id":"breeze","_rev":"20-cd7d58dc193b865d1e0c272c33ffe9df","name":"breeze","description":"Async flow control utility.","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.2.x"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"breeze@0.1.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"525c88fee82da3fbf22f5cd77b933a315579621a","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.1.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}],"directories":{}},"0.2.0":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.2.0","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.2.x"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"breeze@0.2.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"44f90ac82f066afce1e442bb0a4ed0133e92c7d4","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.2.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}],"directories":{}},"0.2.1":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.2.1","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.2.x"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"breeze@0.2.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"acf0d27ab6948a570ddc17caa24b9c96afa6b206","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.2.1.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.2.2":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.2.2","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.2.x"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"breeze@0.2.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"b15090d9aabd47c0d28492eaf4f57d2035002917","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.2.2.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.2.3":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.2.3","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.2.x"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"breeze@0.2.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"4ba310e5f35d977dd01b170c3def49ae38005b4a","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.2.3.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.3.0":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.3.0","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.2.x"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jakeluer","email":"jake.luer@incatern.com"},"_id":"breeze@0.3.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"70d09544bae970b38b8ba7a097e902bf4742a83c","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.3.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]},"0.4.0":{"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"name":"breeze","description":"Async flow control utility.","version":"0.4.0","repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"main":"./index","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"*","chai":"*","chai-spies":"*","folio":"0.3.x"},"optionalDependencies":{},"engines":{"node":"*"},"readme":"breeze\n======","_id":"breeze@0.4.0","dist":{"shasum":"de70bc3ab235a775f59e7d6ee97f4e9023140571","tarball":"http://registry.npmjs.org/breeze/-/breeze-0.4.0.tgz"},"maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}]}},"readme":"breeze\n======","maintainers":[{"name":"jakeluer","email":"jake.luer@incatern.com"}],"time":{"modified":"2012-08-02T13:44:25.412Z","created":"2012-06-14T09:45:03.591Z","0.1.0":"2012-06-14T09:45:04.467Z","0.2.0":"2012-06-16T22:29:11.930Z","0.2.1":"2012-06-17T00:37:58.028Z","0.2.2":"2012-06-18T02:26:13.060Z","0.2.3":"2012-06-18T09:06:47.800Z","0.3.0":"2012-06-28T15:45:44.676Z","0.4.0":"2012-07-25T05:57:26.056Z"},"author":{"name":"Jake Luer","email":"jake@alogicalparadox.com","url":"http://alogicalparadox.com"},"repository":{"type":"git","url":"git://github.com/logicalparadox/breeze.git"},"users":{"fgribreau":true},"_attachments":{"breeze-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-uDZlIyqsP/Dywe8MzOa5Lg==","length":10284,"stub":true},"breeze-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-0FbQ3asK1aY/+X6mEznLCA==","length":7866,"stub":true},"breeze-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-qcInOaQWrul73N3WhWIYpQ==","length":7323,"stub":true},"breeze-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-F8QoER72fjYfLgn3kKQQwg==","length":7271,"stub":true},"breeze-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hG+yb5Caj3BJpp36gqowww==","length":7240,"stub":true},"breeze-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Ko9KbsMC4fdu/6CxImMxCw==","length":7168,"stub":true},"breeze-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aKKvkJc5QpkAo59HOqk1lQ==","length":5033,"stub":true}}}},
{"id":"brequire","key":"brequire","value":{"rev":"18-58b386e08541b222238aa12a13119fd9"},"doc":{"_id":"brequire","_rev":"18-58b386e08541b222238aa12a13119fd9","name":"brequire","description":"Use CommonJS (require, exports) functionality in the browser","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.2":{"name":"brequire","version":"0.0.2","description":"Brings exact CommonJS (require, exports) functionality to the Browser.","author":{"name":"weepy"},"bin":{"brequire":"./bin/brequire"},"repository":"http://github.com/weepy/brequire","dependencies":{},"engines":{"node":">= 0.2.0"},"_id":"brequire@0.0.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://registry.npmjs.org/brequire/-/brequire-0.0.2.tgz"},"directories":{}},"0.0.3":{"name":"brequire","version":"0.0.3","description":"Use CommonJS (require, exports) functionality in the browser","author":{"name":"weepy"},"licenses":[{"type":"MIT","url":"http://github.com/weepy/brequire/raw/master/LICENSE"}],"directories":{"lib":"./lib","bin":"./bin"},"repository":{"type":"git","url":"git://github.com/weepy/brequire.git"},"dependencies":{"glob":">= 0.2.0"},"engines":{"node":">= 0.4.2","npm":">= 0.3"},"main":"./lib/brequire","_id":"brequire@0.0.3","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","bin":{"brequire":"bin/brequire","install":"bin/install"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2a1a8b928d717c4b98eeb783e02b86d6fd7132f1","tarball":"http://registry.npmjs.org/brequire/-/brequire-0.0.3.tgz"}},"0.0.4":{"name":"brequire","version":"0.0.4","description":"Use CommonJS (require, exports) functionality in the browser","author":{"name":"weepy"},"licenses":[{"type":"MIT","url":"http://github.com/weepy/brequire/raw/master/LICENSE"}],"directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/weepy/brequire.git"},"dependencies":{"glob":">= 0.2.0"},"engines":{"node":">= 0.4.2"},"main":"./lib/brequire","_id":"brequire@0.0.4","_engineSupported":true,"_npmVersion":"1.0.1rc4","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"7cb5f9fc36f43eb6becc2012186cf0e9002f11cb","tarball":"http://registry.npmjs.org/brequire/-/brequire-0.0.4.tgz"}},"0.0.5":{"name":"brequire","version":"0.0.5","description":"Use CommonJS (require, exports) functionality in the browser","author":{"name":"weepy"},"licenses":[{"type":"MIT","url":"http://github.com/weepy/brequire/raw/master/LICENSE"}],"directories":{"lib":"./lib","bin":"./bin"},"repository":{"type":"git","url":"git://github.com/weepy/brequire.git"},"dependencies":{"glob":">= 0.2.0"},"engines":{"node":">= 0.4.2"},"main":"./lib/brequire","_id":"brequire@0.0.5","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.3","bin":{"brequire":"bin/brequire","install":"bin/install"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f9ab80d889ef1ac25c33439a807416edd9d25717","tarball":"http://registry.npmjs.org/brequire/-/brequire-0.0.5.tgz"}},"0.0.6":{"name":"brequire","version":"0.0.6","description":"Use CommonJS (require, exports) functionality in the browser","author":{"name":"weepy"},"licenses":[{"type":"MIT","url":"http://github.com/weepy/brequire/raw/master/LICENSE"}],"directories":{"lib":"./lib"},"repository":{"type":"git","url":"git://github.com/weepy/brequire.git"},"engines":{"node":">= 0.4.2"},"main":"./lib/brequire","dependencies":{},"devDependencies":{},"_id":"brequire@0.0.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.4","_defaultsLoaded":true,"dist":{"shasum":"d0bf3165b81e1f4dd21d920be3bcf5bad993243e","tarball":"http://registry.npmjs.org/brequire/-/brequire-0.0.6.tgz"},"scripts":{}}},"maintainers":[{"name":"weepy","email":"jonahfox@gmail.com"}],"author":{"name":"weepy"},"repository":{"type":"git","url":"git://github.com/weepy/brequire.git"},"time":{"modified":"2011-06-14T14:56:21.521Z","created":"2011-03-11T11:00:36.040Z","0.0.2":"2011-03-11T11:00:36.040Z","0.0.3":"2011-03-11T11:00:36.040Z","0.0.4":"2011-03-15T10:12:40.373Z","0.0.5":"2011-04-01T15:32:08.534Z","0.0.6":"2011-06-14T14:56:21.521Z"},"_attachments":{"brequire-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-ma0bO9O6ehtllQXHTbHZVQ==","length":7472,"stub":true},"brequire-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-CC8KPLRUDyYQ5I5IvKnsKg==","length":5981,"stub":true},"brequire-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-j7u+vdDZjQ/gvLqQoMmAtA==","length":9569,"stub":true},"brequire-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-EnzTLTzRR9D6QyEGqEElMA==","length":5827,"stub":true},"brequire-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vISXzl5EYPrvaqft0+vfaw==","length":2703,"stub":true}}}},
{"id":"brewer","key":"brewer","value":{"rev":"15-2c069a17e34a70e98c1b4dd6d320c4db"},"doc":{"_id":"brewer","_rev":"15-2c069a17e34a70e98c1b4dd6d320c4db","name":"brewer","description":"Asset compilation/packaging/compression utility","dist-tags":{"latest":"0.3.7"},"versions":{"0.3.3":{"name":"brewer","version":"0.3.3","description":"Asset compilation/packaging/compression utility","keywords":["javascript","coffeescript","asset","compression","less","css","packaging","bundling"],"author":{"name":"Mathieu D'Amours","email":"mathieu@nextorms.com"},"main":"./lib/index.js","engines":{"node":">=0.6.0"},"directories":{"lib":"./lib","docs":"./docs"},"bin":{"brewer":"./bin/brewer"},"repository":{"type":"git","url":"git://github.com/matehat/brewer.js.git"},"dependencies":{"underscore":">= 0.0.1","commander":">= 0.5.0","walker":">= 1.0.0","growl":">= 1.4.0","ansi-color":">= 0.2.0","semver":">= 1.0.0","request":">= 2.9.0","coffee-script":">= 1.1.0","css-compressor":">= 1.0.0"},"devDependencies":{"jsdom":">= 0.2.10","cssom":">= 0.2.0"},"_npmUser":{"name":"matehat","email":"mathieu@nextorms.com"},"_id":"brewer@0.3.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"7979e06575deab07c6e006f9fe6e57c82f39e1f5","tarball":"http://registry.npmjs.org/brewer/-/brewer-0.3.3.tgz"},"maintainers":[{"name":"matehat","email":"mathieu@nextorms.com"}]},"0.3.4":{"name":"brewer","version":"0.3.4","description":"Asset compilation/packaging/compression utility","keywords":["javascript","coffeescript","asset","compression","less","css","packaging","bundling"],"author":{"name":"Mathieu D'Amours","email":"mathieu@nextorms.com"},"main":"./lib/index.js","engines":{"node":">=0.6.0"},"directories":{"lib":"./lib","docs":"./docs"},"bin":{"brewer":"./bin/brewer"},"repository":{"type":"git","url":"git://github.com/matehat/brewer.js.git"},"dependencies":{"underscore":">= 0.0.1","commander":">= 0.5.0","walker":">= 1.0.0","growl":">= 1.4.0","ansi-color":">= 0.2.0","semver":">= 1.0.0","request":">= 2.9.0","coffee-script":">= 1.1.0"},"devDependencies":{"jsdom":">= 0.2.10","cssom":">= 0.2.0"},"_npmUser":{"name":"matehat","email":"mathieu@nextorms.com"},"_id":"brewer@0.3.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4e96486a6c3f0161fed18c76b94b52f006af9096","tarball":"http://registry.npmjs.org/brewer/-/brewer-0.3.4.tgz"},"maintainers":[{"name":"matehat","email":"mathieu@nextorms.com"}]},"0.3.5":{"name":"brewer","version":"0.3.5","description":"Asset compilation/packaging/compression utility","keywords":["javascript","coffeescript","asset","compression","less","css","packaging","bundling"],"author":{"name":"Mathieu D'Amours","email":"mathieu@nextorms.com"},"main":"./lib/index.js","engines":{"node":">=0.6.0"},"directories":{"lib":"./lib","docs":"./docs"},"bin":{"brake":"./bin/brake"},"repository":{"type":"git","url":"git://github.com/matehat/brewer.js.git"},"dependencies":{"underscore":">= 0.0.1","commander":">= 0.5.0","walker":">= 1.0.0","growl":">= 1.4.0","ansi-color":">= 0.2.0","semver":">= 1.0.0","request":">= 2.9.0","coffee-script":">= 1.1.0"},"devDependencies":{"jsdom":">= 0.2.10","cssom":">= 0.2.0"},"_npmUser":{"name":"matehat","email":"mathieu@nextorms.com"},"_id":"brewer@0.3.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"1fd7ecd2914adde456f282c70bb7c3b216a86484","tarball":"http://registry.npmjs.org/brewer/-/brewer-0.3.5.tgz"},"maintainers":[{"name":"matehat","email":"mathieu@nextorms.com"}]},"0.3.6":{"name":"brewer","version":"0.3.6","description":"Asset compilation/packaging/compression utility","keywords":["javascript","coffeescript","asset","compression","less","css","packaging","bundling"],"author":{"name":"Mathieu D'Amours","email":"mathieu@nextorms.com"},"main":"./lib/index.js","engines":{"node":">=0.8.0"},"directories":{"lib":"./lib","docs":"./docs"},"bin":{"brake":"./bin/brake"},"repository":{"type":"git","url":"git://github.com/matehat/brewer.js.git"},"dependencies":{"underscore":">= 0.0.1","commander":">= 0.5.0","walker":">= 1.0.0","growl":">= 1.4.0","ansi-color":">= 0.2.0","semver":">= 1.0.0","request":">= 2.9.0","coffee-script":">= 1.1.0","temp":">= 0.4.0"},"devDependencies":{"jsdom":">= 0.2.10","cssom":">= 0.2.0"},"readme":"## Brewer.js\n#### Your asset management best friend.\n\n*This project is about to have a significant API change, making it leaner, simpler and ready for a few big improvements*\n\nBrewer.js is a tool that eases all sorts of tasks related to the management of \nstylesheets and javascript source files. From a single command, it takes care of :\n\n* Compilation of coffee-script source files to javascript\n* Compilation of LESS or Stylus files to CSS\n* Bundling different files (javascript or CSS) into a single file (optionally compressing it) while maintaining references and their proper ordering.\n* Watching a directory for changes, triggering any or all of the above.\n\nWatching a whole project structure of Coffee-script, LESS or Stylus source files can be as easy as :\n\n    $ brake watch\n    Info Watching project /path/to/current/working/directory\n    Compiled coffee/test.coffee\n    Compiled less/index.less\n    Packaged build/css/index.css\n    Compressed build/css/index.css\n\n### Installation\n\n#### Using a prepared package\n\nTo setup Brewer.js, make sure you have [installed Node.js](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager). When this is done, enter the terminal and type.\n\n    $ npm install -g brewer\n\nThe `-g` flag is used to make the installation global, so you get access to the `brake` executable. Then, from a project directory you wish to manage using Brewer.js\n\n    $ brake init [<template name>]\n\nThe `<template name>` part is optional. Anyway, for the moment, there is only one template available, **lesscoffee**, which is also the default. This template sets up LESS and Coffeescript support for the current directory.\n\nWhat this does is create a Brewfile in the current directory, according to the template provided and run `brake make` on it (see Usage).\n\n#### Using this repository\n\nYou need Node.js, as well as coffee-script, installed globally to get the `cake` executable. You can do so by doing :\n\n    $ npm install -g coffee-script\n    \nThen, to get brewer.js to work locally\n\n    $ git clone git@github.com:matehat/brewer.js.git brewer\n    $ cd brewer\n    $ npm install\n    $ cake build\n  \nThen, if you want the `brewer` executable, you can do\n\n    $ npm link\n\n### Brewfile\n\nA <strong>Brewfile</strong> is a file that sits at the root folder of your project, named, \nwell, \"Brewfile\", which syntax is plain [Coffeescript](http://coffeescript.org). It is used to specify the structure of the project to Brewer.js, so it knows what to do when you tell it to `make`, `watch` or `clean`. \n\n##### Packages\n\nAt the top-level of the Brewfile, the following functions are available :\n\n```coffeescript\n# In Brewfile\n\nstylesheets 'package_name', ->\n  # package body ...\n\njavascript 'other_package_name', ->\n  # package body ...\n```\n\nThose two functions can be used interchangeably with `js` or `css` to be more concise. The `package_name` is used to identify certain parts of a project, in case you would like to run `$ brake make package_name`. A **Package** is a conceptual component of a project in which you can define **bundles** and in which files can *import* each other. A file contained in a package can really be anywhere on the file system -- a package is not bound to a specific directory.\n\nPackage can receive options, which can be specified in one of two ways :\n\n````coffeescript\n# In Brewfile\n\njavascript 'package_name', {build: './build', compress: true}, ->\n  # package body\n\n# equivalent to\njavascript 'package_name', ->\n  @options {build: './build', compress: true}\n```\n\nThe `build` option specifies where to put bundles aggregated from source files, and `compress` &hellip; well, I think you can guess that one. \n\n`@options` is a method available in the package definition body, that specifies additional options for the package. Another such method is `@bundles(bundle1, bundle2, ...)` which specifies file names for bundles in the package (see **Bundles** below). These two methods are prefixed with a `@`, meaning that they are members of the package body context. Other methods of this kind are available, such as those to define **sources** in a package. \n\n##### Sources\n\nSources represent a folder on the file system, where files can be found. One or many can exist within a package, providing it with files to compile, bundle and compress. A source can be of one of many available types : *coffeescript*, *javascript*, *css*, *less* or *stylus*. One restriction about this source type is that a package can only contain sources that are either of its own type, or that can be compiled into its own type (remember a package also have a type).\n\nNow for a real-world example, so we don't get lost too quickly. Say we want to make a cool looking website using jQuery, Bootstrap and Chosen. Each of these libraries have their own source files, of different types and we want to manage all of that neatly. Here is the directory structure :\n\n```\nRoot folder\n|-- js\n|-- coffee\n|-- css\n|-- less\n|-- vendor\n    |-- bootstrap\n    |   |- less\n    |   |- js\n    |\n    |-- chosen\n    |-- jquery.js\n```\n\nSo there are files that ends up as javascript and those that ends up as css. Let's write a Brewfile that takes this structure into account.\n\n```coffeescript\njavascript 'scripts', {build: './js'} ->\n    @bundles 'home', 'products'\n    \n    @coffeescript './coffee'\n    @js './vendor'\n\nstylesheets 'styles', {build: './css'} ->\n    @bundles 'home', 'products'\n\n    @less './less'\n    @less './vendor/bootstrap/less'\n    @css './vendor'\n```\n\nSo what we're looking at now is a package for javascripts that looks for coffeescript files in `./coffee`, as well as for javascript files in `./vendor`, `./vendor/chosen` and `./vendor/bootstrap/js`. Now let's look at what a bundle would look like :\n\n```coffeescript\n# in coffee/home.coffee\n# import [\"jquery\", \"chosen/chosen.jquery.js\"]\n\n$ -> $('select').chosen()\n```\n\nIf we had been running `brake watch` while we wrote that script and saved it, we would have seen a file appear, named `./js/home.js`, containing an aggregate file of jquery, chosen and our little script compiled into javascript. Since we didn't provide the `output` option, a compiled javascript version of just `coffee/home.coffee` can be found in `./_cache`. If we wanted it to appear somewhere more meaningful, we could set the `output` option on a source directive. A more complete example of the above could be :\n\n```coffeescript\njavascript 'scripts', {build: './build/js'} ->\n    @bundles 'home', 'products'\n    \n    @coffeescript './coffee', {output: './js'}\n    @js './vendor'\n\nstylesheets 'styles', {build: './build/css'} ->\n    @bundles 'home', 'products'\n\n    @less './less', {output: './css'}\n    @css './vendor'\n```\n\nThis dedicates a directory `./build`, to contain files that would be deployed, and all source files in separate directories. You may have noticed we used `@css` and `@js` names to mean stylesheets and javascript respectively. As we said earlier, those are drop-in replacements.\n\n### Usage\n\nThe command-line interface for brewer provides a few methods to manage the asset project. \n\n* `brake init <template_name>`\n\n    This command tells brewer to make a Brewfile in the current directory, according to the template provided, and make an initial directory structure to support the project.\n\n* `brake [all|<package>*]`\n\n    This command tells brewer to look for files to compile (coffeescript, less, etc.) into their javascript or css counterparts, product bundles and compress them if necessary. This intelligently selects only the tasks that needs to be done, skipping files that haven't change.\n    \n* `brake clean [<package>*]`\n\n    This command tells brewer to delete files that strongly depends on source files, such as those that are completely derived from the compilation of another file, bundles and their compressed counterparts.\n    \n* `brake watch`\n\n    This command tells brewer to first run `brake make` on the current directory and watch for changes (file content change, new files, moved files or deleted files).\n    \n* `brake install`\n\n    This command tells Brewer.js to install all missing Node.js modules that it needs to work properly\n    with the current project. For instance, had I put a few `@coffeescript` source directives in the project's \n    Brewfile, Brewer.js will make sure the coffee-script module is available, installing it under its own \n    project directory if not.\n\n### MIT License\n\nCopyright &copy; 2012 Mathieu D'Amours\n\nPermission is hereby granted, free of charge, to any person \nobtaining a copy of this software and associated documentation \nfiles (the \"Software\"), to deal in the Software without \nrestriction, including without limitation the rights to use, \ncopy, modify, merge, publish, distribute, sublicense, \nand/or sell copies of the Software, and to permit persons to \nwhom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be \nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR \nOTHER DEALINGS IN THE SOFTWARE.","_id":"brewer@0.3.6","dist":{"shasum":"ed581719572ee978ae9d4ca52dbf1312b3c7ddd0","tarball":"http://registry.npmjs.org/brewer/-/brewer-0.3.6.tgz"},"maintainers":[{"name":"matehat","email":"mathieu@nextorms.com"}]},"0.3.7":{"name":"brewer","version":"0.3.7","description":"Asset compilation/packaging/compression utility","keywords":["javascript","coffeescript","asset","compression","less","css","packaging","bundling"],"author":{"name":"Mathieu D'Amours","email":"mathieu@nextorms.com"},"main":"./lib/index.js","engines":{"node":">=0.8.0"},"directories":{"lib":"./lib","docs":"./docs"},"bin":{"brake":"./bin/brake"},"repository":{"type":"git","url":"git://github.com/matehat/brewer.js.git"},"dependencies":{"underscore":">= 0.0.1","commander":">= 0.5.0","walker":">= 1.0.0","growl":">= 1.4.0","ansi-color":">= 0.2.0","semver":">= 1.0.0","request":">= 2.9.0","coffee-script":">= 1.1.0","temp":">= 0.4.0"},"devDependencies":{"jsdom":">= 0.2.10","cssom":">= 0.2.0"},"readme":"## Brewer.js\n#### Your asset management best friend.\n\n*This project is about to have a significant API change, making it leaner, simpler and ready for a few big improvements*\n\nBrewer.js is a tool that eases all sorts of tasks related to the management of \nstylesheets and javascript source files. From a single command, it takes care of :\n\n* Compilation of coffee-script source files to javascript\n* Compilation of LESS or Stylus files to CSS\n* Bundling different files (javascript or CSS) into a single file (optionally compressing it) while maintaining references and their proper ordering.\n* Watching a directory for changes, triggering any or all of the above.\n\nWatching a whole project structure of Coffee-script, LESS or Stylus source files can be as easy as :\n\n    $ brake watch\n    Info Watching project /path/to/current/working/directory\n    Compiled coffee/test.coffee\n    Compiled less/index.less\n    Packaged build/css/index.css\n    Compressed build/css/index.css\n\n### Installation\n\n#### Using a prepared package\n\nTo setup Brewer.js, make sure you have [installed Node.js](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager). When this is done, enter the terminal and type.\n\n    $ npm install -g brewer\n\nThe `-g` flag is used to make the installation global, so you get access to the `brake` executable. Then, from a project directory you wish to manage using Brewer.js\n\n    $ brake init [<template name>]\n\nThe `<template name>` part is optional. Anyway, for the moment, there is only one template available, **lesscoffee**, which is also the default. This template sets up LESS and Coffeescript support for the current directory.\n\nWhat this does is create a Brewfile in the current directory, according to the template provided and run `brake make` on it (see Usage).\n\n#### Using this repository\n\nYou need Node.js, as well as coffee-script, installed globally to get the `cake` executable. You can do so by doing :\n\n    $ npm install -g coffee-script\n    \nThen, to get brewer.js to work locally\n\n    $ git clone git@github.com:matehat/brewer.js.git brewer\n    $ cd brewer\n    $ npm install\n    $ cake build\n  \nThen, if you want the `brewer` executable, you can do\n\n    $ npm link\n\n### Brewfile\n\nA <strong>Brewfile</strong> is a file that sits at the root folder of your project, named, \nwell, \"Brewfile\", which syntax is plain [Coffeescript](http://coffeescript.org). It is used to specify the structure of the project to Brewer.js, so it knows what to do when you tell it to `make`, `watch` or `clean`. \n\n##### Packages\n\nAt the top-level of the Brewfile, the following functions are available :\n\n```coffeescript\n# In Brewfile\n\nstylesheets 'package_name', ->\n  # package body ...\n\njavascript 'other_package_name', ->\n  # package body ...\n```\n\nThose two functions can be used interchangeably with `js` or `css` to be more concise. The `package_name` is used to identify certain parts of a project, in case you would like to run `$ brake make package_name`. A **Package** is a conceptual component of a project in which you can define **bundles** and in which files can *import* each other. A file contained in a package can really be anywhere on the file system -- a package is not bound to a specific directory.\n\nPackage can receive options, which can be specified in one of two ways :\n\n````coffeescript\n# In Brewfile\n\njavascript 'package_name', {build: './build', compress: true}, ->\n  # package body\n\n# equivalent to\njavascript 'package_name', ->\n  @options {build: './build', compress: true}\n```\n\nThe `build` option specifies where to put bundles aggregated from source files, and `compress` &hellip; well, I think you can guess that one. \n\n`@options` is a method available in the package definition body, that specifies additional options for the package. Another such method is `@bundles(bundle1, bundle2, ...)` which specifies file names for bundles in the package (see **Bundles** below). These two methods are prefixed with a `@`, meaning that they are members of the package body context. Other methods of this kind are available, such as those to define **sources** in a package. \n\n##### Sources\n\nSources represent a folder on the file system, where files can be found. One or many can exist within a package, providing it with files to compile, bundle and compress. A source can be of one of many available types : *coffeescript*, *javascript*, *css*, *less* or *stylus*. One restriction about this source type is that a package can only contain sources that are either of its own type, or that can be compiled into its own type (remember a package also have a type).\n\nNow for a real-world example, so we don't get lost too quickly. Say we want to make a cool looking website using jQuery, Bootstrap and Chosen. Each of these libraries have their own source files, of different types and we want to manage all of that neatly. Here is the directory structure :\n\n```\nRoot folder\n|-- js\n|-- coffee\n|-- css\n|-- less\n|-- vendor\n    |-- bootstrap\n    |   |- less\n    |   |- js\n    |\n    |-- chosen\n    |-- jquery.js\n```\n\nSo there are files that ends up as javascript and those that ends up as css. Let's write a Brewfile that takes this structure into account.\n\n```coffeescript\njavascript 'scripts', {build: './js'} ->\n    @bundles 'home', 'products'\n    \n    @coffeescript './coffee'\n    @js './vendor'\n\nstylesheets 'styles', {build: './css'} ->\n    @bundles 'home', 'products'\n\n    @less './less'\n    @less './vendor/bootstrap/less'\n    @css './vendor'\n```\n\nSo what we're looking at now is a package for javascripts that looks for coffeescript files in `./coffee`, as well as for javascript files in `./vendor`, `./vendor/chosen` and `./vendor/bootstrap/js`. Now let's look at what a bundle would look like :\n\n```coffeescript\n# in coffee/home.coffee\n# import [\"jquery\", \"chosen/chosen.jquery.js\"]\n\n$ -> $('select').chosen()\n```\n\nIf we had been running `brake watch` while we wrote that script and saved it, we would have seen a file appear, named `./js/home.js`, containing an aggregate file of jquery, chosen and our little script compiled into javascript. Since we didn't provide the `output` option, a compiled javascript version of just `coffee/home.coffee` can be found in `./_cache`. If we wanted it to appear somewhere more meaningful, we could set the `output` option on a source directive. A more complete example of the above could be :\n\n```coffeescript\njavascript 'scripts', {build: './build/js'} ->\n    @bundles 'home', 'products'\n    \n    @coffeescript './coffee', {output: './js'}\n    @js './vendor'\n\nstylesheets 'styles', {build: './build/css'} ->\n    @bundles 'home', 'products'\n\n    @less './less', {output: './css'}\n    @css './vendor'\n```\n\nThis dedicates a directory `./build`, to contain files that would be deployed, and all source files in separate directories. You may have noticed we used `@css` and `@js` names to mean stylesheets and javascript respectively. As we said earlier, those are drop-in replacements.\n\n### Usage\n\nThe command-line interface for brewer provides a few methods to manage the asset project. \n\n* `brake init <template_name>`\n\n    This command tells brewer to make a Brewfile in the current directory, according to the template provided, and make an initial directory structure to support the project.\n\n* `brake [all|<package>*]`\n\n    This command tells brewer to look for files to compile (coffeescript, less, etc.) into their javascript or css counterparts, product bundles and compress them if necessary. This intelligently selects only the tasks that needs to be done, skipping files that haven't change.\n    \n* `brake clean [<package>*]`\n\n    This command tells brewer to delete files that strongly depends on source files, such as those that are completely derived from the compilation of another file, bundles and their compressed counterparts.\n    \n* `brake watch`\n\n    This command tells brewer to first run `brake make` on the current directory and watch for changes (file content change, new files, moved files or deleted files).\n    \n* `brake install`\n\n    This command tells Brewer.js to install all missing Node.js modules that it needs to work properly\n    with the current project. For instance, had I put a few `@coffeescript` source directives in the project's \n    Brewfile, Brewer.js will make sure the coffee-script module is available, installing it under its own \n    project directory if not.\n\n### MIT License\n\nCopyright &copy; 2012 Mathieu D'Amours\n\nPermission is hereby granted, free of charge, to any person \nobtaining a copy of this software and associated documentation \nfiles (the \"Software\"), to deal in the Software without \nrestriction, including without limitation the rights to use, \ncopy, modify, merge, publish, distribute, sublicense, \nand/or sell copies of the Software, and to permit persons to \nwhom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be \nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR \nOTHER DEALINGS IN THE SOFTWARE.","_id":"brewer@0.3.7","dist":{"shasum":"fa20051047fa8f0947b8f98c367441f91e03d8c0","tarball":"http://registry.npmjs.org/brewer/-/brewer-0.3.7.tgz"},"maintainers":[{"name":"matehat","email":"mathieu@nextorms.com"}]}},"readme":"## Brewer.js\n#### Your asset management best friend.\n\nBrewer.js is a tool that eases all sorts of tasks related to the management of \nstylesheets and javascript source files. From a single command, it takes care of :\n\n* Compilation of coffee-script source files to javascript\n* Compilation of LESS or Stylus files to CSS\n* Bundling different files (javascript or CSS) into a single file (optionally compressing it) while maintaining references and their proper ordering.\n* Watching a directory for changes, triggering any or all of the above.\n\nWatching a whole project structure of Coffee-script, LESS or Stylus source files can be as easy as :\n\n    $ brewer watch\n    Info Watching project /path/to/current/working/directory\n    Compiled coffee/test.coffee\n    Compiled less/index.less\n    Packaged build/css/index.css\n    Compressed build/css/index.css\n\n### Installation\n\nTo setup Brewer.js, make sure you have [installed Node.js](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager). When this is done, enter the terminal and type.\n\n    $ npm install -g brewer\n\nThe `-g` flag is used to make the installation global, so you get access to the `brewer` executable. Then, from a project directory you wish to manage using Brewer.js\n\n    $ brewer init [<template name>]\n\nThe `<template name>` part is optional. Anyway, for the moment, there is only one template available, **lesscoffee**, which is also the default. This template sets up LESS and Coffeescript support for the current directory.\n\nWhat this does is create a Brewfile in the current directory, according to the template provided and run `brewer make` on it (see Usage).\n\n### Brewfile\n\nA <strong>Brewfile</strong> is a file that sits at the root folder of your project, named, \nwell, \"Brewfile\", which syntax is plain [Coffeescript](http://coffeescript.org). It is used to specify the structure of the project to Brewer.js, so it knows what to do when you tell it to `make`, `watch` or `clean`. \n\n##### Packages\n\nAt the top-level of the Brewfile, the following functions are available :\n\n```coffeescript\n# In Brewfile\n\nstylesheets 'package_name', ->\n  # package body ...\n\njavascript 'other_package_name', ->\n  # package body ...\n```\n\nThose two functions can be used interchangeably with `js` or `css` to be more concise. The `package_name` is used to identify certain parts of a project, in case you would like to run `$ brewer make package_name`. A **Package** is a conceptual component of a project in which you can define **bundles** and in which files can *import* each other. A file contained in a package can really be anywhere on the file system -- a package is not bound to a specific directory.\n\nPackage can receive options, which can be specified in one of two ways :\n\n````coffeescript\n# In Brewfile\n\njavascript 'package_name', {build: './build', compress: true}, ->\n  # package body\n\n# equivalent to\njavascript 'package_name', ->\n  @options {build: './build', compress: true}\n```\n\nThe `build` option specifies where to put bundles aggregated from source files, and `compress` &hellip; well, I think you can guess that one. \n\n`@options` is a method available in the package definition body, that specifies additional options for the package. Another such method is `@bundles(bundle1, bundle2, ...)` which specifies file names for bundles in the package (see **Bundles** below). These two methods are prefixed with a `@`, meaning that they are members of the package body context. Other methods of this kind are available, such as those to define **sources** in a package. \n\n##### Sources\n\nSources represent a folder on the file system, where files can be found. One or many can exist within a package, providing it with files to compile, bundle and compress. A source can be of one of many available types : *coffeescript*, *javascript*, *css*, *less* or *stylus*. One restriction about this source type is that a package can only contain sources that are either of its own type, or that can be compiled into its own type (remember a package also have a type).\n\nNow for a real-world example, so we don't get lost too quickly. Say we want to make a cool looking website using jQuery, Bootstrap and Chosen. Each of these libraries have their own source files, of different types and we want to manage all of that neatly. Here is the directory structure :\n\n```\nRoot folder\n|- js\n|- coffee\n|- css\n|- less\n|- vendor\n  |- bootstrap\n  | |- less\n  | |- js\n  |- chosen\n  |- jquery.js\n```\n\nSo there are files that ends up as javascript and those that ends up as css. Let's write a Brewfile that takes this structure into account.\n\n```coffeescript\njavascript 'scripts', {build: './js'} ->\n    @bundles 'home', 'products'\n    \n    @coffeescript './coffee'\n    @js './vendor'\n\nstylesheets 'styles', {build: './css'} ->\n    @bundles 'home', 'products'\n\n    @less './less'\n    @css './vendor'\n```\n\nSo what we're looking at now is a package for javascripts that looks for coffeescript files in `./coffee`, as well as for javascript files in `./vendor`, `./vendor/chosen` and `./vendor/bootstrap/js`. Now let's look at what a bundle would look like :\n\n```coffeescript\n# in coffee/home.coffee\n# import [\"jquery\", \"chosen/chosen.jquery.js\"]\n\n$ -> $('select').chosen()\n```\n\nIf we had been running `brewer watch` while we wrote that script and saved it, we would have seen a file appear, named `./js/home.js`, containing an aggregate file of jquery, chosen and our little script compiled into javascript. Since we didn't provide the `output` option, a compiled javascript version of just `coffee/home.coffee` can be found in `./_cache`. If we wanted it to appear somewhere more meaningful, we could set the `output` option on a source directive. A more complete example of the above could be :\n\n```coffeescript\njavascript 'scripts', {build: './build/js'} ->\n    @bundles 'home', 'products'\n    \n    @coffeescript './coffee', {output: './js'}\n    @js './vendor'\n\nstylesheets 'styles', {build: './build/css'} ->\n    @bundles 'home', 'products'\n\n    @less './less', {output: './css'}\n    @css './vendor'\n```\n\nThis dedicates a directory `./build`, to contain files that would be deployed, and all source files in separate directories. You may have noticed we used `@css` and `@js` names to mean stylesheets and javascript respectively. As we said earlier, those are drop-in replacements.\n\n### Usage\n\nThe command-line interface for brewer provides a few methods to manage the asset project. \n\n* `brewer make [<package>*]`\n\n    This command tells brewer to look for files to compile (coffeescript, less, etc.) into their javascript or css counterparts, product bundles and compress them if necessary. This intelligently selects only the tasks that needs to be done, skipping files that haven't change.\n\n* `brewer watch [<package>*]`\n\n    This command tells brewer to first run `brewer make` on the current directory and watch for changes (file content change, new files, moved files or deleted files).\n    \n* `brewer clean [<package>*]`\n\n    This command tells brewer to delete files that strongly depends on source files, such as those that are completely derived from the compilation of another file, bundles and their compressed counterparts.\n    \n* `brewer init <template_name>`\n\n    This command tells brewer to make a Brewfile in the current directory, according to the template provided, and make an initial directory structure to support the project.\n    \n* `brewer install`\n\n    This command tells Brewer.js to install all missing Node.js modules that it needs to work properly\n    with the current project. For instance, had I put a few `@coffeescript` source directives in the project's \n    Brewfile, Brewer.js will make sure the coffee-script module is available, installing it under its own \n    project directory if not.\n\n### MIT License\n\nCopyright &copy; 2012 Mathieu D'Amours\n\nPermission is hereby granted, free of charge, to any person \nobtaining a copy of this software and associated documentation \nfiles (the \"Software\"), to deal in the Software without \nrestriction, including without limitation the rights to use, \ncopy, modify, merge, publish, distribute, sublicense, \nand/or sell copies of the Software, and to permit persons to \nwhom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be \nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR \nOTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"matehat","email":"mathieu@nextorms.com"}],"time":{"modified":"2012-08-13T22:51:39.015Z","created":"2012-02-17T02:03:55.475Z","0.3.3":"2012-02-17T02:03:56.006Z","0.3.4":"2012-02-17T16:02:57.618Z","0.3.5":"2012-02-20T15:19:46.877Z","0.3.6":"2012-08-13T22:03:56.067Z","0.3.7":"2012-08-13T22:51:39.015Z"},"author":{"name":"Mathieu D'Amours","email":"mathieu@nextorms.com"},"repository":{"type":"git","url":"git://github.com/matehat/brewer.js.git"},"_attachments":{"brewer-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-khZIM9aTnKTp6jOEkH+LKA==","length":462846,"stub":true},"brewer-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-h1O3DrWji/rrWkHwpCaXAw==","length":462609,"stub":true},"brewer-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-lzfLYNksfJRXG35o/a0u3w==","length":458280,"stub":true},"brewer-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SDjrIaz9cap1hOUb/RkECw==","length":457619,"stub":true},"brewer-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NL0eLKFbXoYnpEgN7MD9fQ==","length":472518,"stub":true}}}},
{"id":"brick","key":"brick","value":{"rev":"5-bbd606c426b76907acfc3a01e21ae45c"},"doc":{"_id":"brick","_rev":"5-bbd606c426b76907acfc3a01e21ae45c","name":"brick","description":"A sharp, minimal css framework","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Brian Hurlow","email":"bhurlow@gmail.com","url":"brianhurlow.com"},"name":"brick","description":"A sharp, minimal css framework","version":"0.0.1","homepage":"bhurlow.github.com/brick","repository":{"type":"git","url":"git://github.com/bhurlow/Brick.git"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bhurlow","email":"bhurlow@gmail.com"},"_id":"brick@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e54c6da31aa1a29fcbd46e2be4a87e5047b39b10","tarball":"http://registry.npmjs.org/brick/-/brick-0.0.1.tgz"},"maintainers":[{"name":"bhurlow","email":"bhurlow@gmail.com"}]},"0.0.2":{"author":{"name":"Brian Hurlow","email":"bhurlow@gmail.com","url":"brianhurlow.com"},"name":"brick","description":"A sharp, minimal css framework","version":"0.0.2","homepage":"bhurlow.github.com/brick","repository":{"type":"git","url":"git://github.com/bhurlow/Brick.git"},"engines":{"node":"~0.6.7"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bhurlow","email":"bhurlow@gmail.com"},"_id":"brick@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"cca2bb0582ddd5392afe0719cc833b7fb9ead8f7","tarball":"http://registry.npmjs.org/brick/-/brick-0.0.2.tgz"},"maintainers":[{"name":"bhurlow","email":"bhurlow@gmail.com"}]}},"readme":"Beginnings of my very own bootstrap style modular css framework \n\nstill a work in progress, though I want to keep it as a node package for a more iterative development pattern","maintainers":[{"name":"bhurlow","email":"bhurlow@gmail.com"}],"time":{"modified":"2012-05-17T07:16:38.865Z","created":"2012-05-17T06:59:16.920Z","0.0.1":"2012-05-17T06:59:18.339Z","0.0.2":"2012-05-17T07:16:38.865Z"},"author":{"name":"Brian Hurlow","email":"bhurlow@gmail.com","url":"brianhurlow.com"},"repository":{"type":"git","url":"git://github.com/bhurlow/Brick.git"},"_attachments":{"brick-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xVLlFYx8mqsU5WtLtyJ5Sw==","length":18314,"stub":true},"brick-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-l4cvweyrj7/O9fFIYI7NdA==","length":18316,"stub":true}}}},
{"id":"bricks","key":"bricks","value":{"rev":"30-6703932942689e252a321b7cd565d7b5"},"doc":{"_id":"bricks","_rev":"30-6703932942689e252a321b7cd565d7b5","name":"bricks","description":"Bricks Application Server","dist-tags":{"latest":"1.1.4"},"versions":{"1.0.1":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.1","homepage":"http://legitimatesounding.com/","repository":{"url":""},"main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":"~1.2.2","date-utils":">1.0.0","optimist":"~0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e440d3ea4d438d1671d79be3d00351d63390bcbe","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.1.tgz"}},"1.0.2":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.2","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"url":""},"main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":"~1.2.2","date-utils":">1.0.0","optimist":"~0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.2","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"2737f573a1f533b876472873e37596d2a23b91bb","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.2.tgz"}},"1.0.3":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.3","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":"~1.2.2","date-utils":">1.0.0","optimist":"~0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.3","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"c45baf84777a89b113a3245252778739a0ff5138","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.3.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.0.4":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.4","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":"~1.2.2","date-utils":">1.0.0","optimist":"~0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.4","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"2cd2d83cecb6bf62ada48e9907edfa71e89cee37","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.4.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.0.5":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.5","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":"~1.2.2","date-utils":">1.0.0","optimist":"~0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.5","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"29800045faa55d3e1198517faacb836800f8a674","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.5.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.0.6":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.6","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","date-utils":">1.0.0","optimist":">=0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.6","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"39b8efa25419b2db5f94b9dfcedc5fa1bcffc5d9","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.6.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.0.7":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.7","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.5"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","date-utils":">1.0.0","optimist":">=0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.7","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"93d8ac83a03c1c332e89441817ad9cbbaab5e8cf","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.7.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.0.8":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.8","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","date-utils":">1.0.0","optimist":">=0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.8/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.8","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"31a801f939df6b9f63bff83f66c5d9cf3799879d","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.8.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.0.9":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.0.9","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","date-utils":">1.0.0","optimist":">=0.2","node-uuid":"~1.1.0","eventemitter2":"~0.2.6"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks/1.0.9/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks@1.0.9","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"127856ca9dbd0680c9761cecc3a7a185ec4ddd1c","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.0.9.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.1.0":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.1.0","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","date-utils":">1.0.0","optimist":">=0.2","node-uuid":">1.1.0","eventemitter2":">=0.4.0"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks@1.1.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"d3ea1bd22d70184342a9632f7a8563723b2d6ab0","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.1.0.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.1.1":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.1.1","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","date-utils":">1.0.0","optimist":">=0.2","node-uuid":">1.1.0","eventemitter2":">=0.4.0"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks@1.1.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"56fe799386e7b22ac4eceda21b08527065dfff19","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.1.1.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.1.2":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.1.2","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","cromag":">0.1.0","optimist":">=0.2","node-uuid":">1.1.0","eventemitter2":">=0.4.0"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec"},"bin":{"bricks":"./bin/bricks"},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks@1.1.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"17b6de73966fc6d2b62e5258c25ddc45cc5182a0","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.1.2.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.1.3":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.1.3","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","cromag":">0.1.0","optimist":">=0.2","node-uuid":">1.1.0","eventemitter2":">=0.4.0"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec","start":"node server.js"},"bin":{"bricks":"./bin/bricks"},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks@1.1.3","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c121753643a33c084cd65b4649f114519d16b239","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.1.3.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"1.1.4":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks","description":"Bricks Application Server","version":"1.1.4","homepage":"http://bricksjs.com/","preferGlobal":"true","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"keywords":["http","webserver","appserver","framework"],"license":"MIT/X11","main":"./lib/appserver.js","engines":{"node":">0.4.3"},"dependencies":{"cookies":"~0.1.6","mime":">=1.2.2","cromag":">0.1.0","optimist":">=0.2","node-uuid":">1.1.0","eventemitter2":">=0.4.0"},"devDependencies":{"vows":">=0.5.0"},"directories":{"test":"./test","lib":"./lib","bin":"./bin"},"scripts":{"test":"vows --spec","start":"node server.js"},"bin":{"bricks":"./bin/bricks"},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks@1.1.4","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"dad7f1aaa40bbf7adb35884db1b6f0e977bc840f","tarball":"http://registry.npmjs.org/bricks/-/bricks-1.1.4.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]}},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}],"time":{"modified":"2012-02-10T00:44:22.267Z","created":"2011-08-01T04:53:32.669Z","1.0.1":"2011-08-01T04:53:33.214Z","1.0.2":"2011-08-01T04:57:40.138Z","1.0.3":"2011-08-07T18:12:39.822Z","1.0.4":"2011-08-08T01:05:10.481Z","1.0.5":"2011-08-30T00:04:31.153Z","1.0.6":"2011-09-05T18:11:48.307Z","1.0.7":"2011-09-06T01:49:39.838Z","1.0.8":"2011-10-09T23:12:37.851Z","1.0.9":"2011-10-25T14:40:56.460Z","1.1.0":"2011-11-27T22:37:58.235Z","1.1.1":"2011-12-05T03:30:29.595Z","1.1.2":"2012-01-16T22:06:38.931Z","1.1.3":"2012-01-20T04:25:49.706Z","1.1.4":"2012-02-10T00:44:22.267Z"},"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"repository":{"type":"git","url":"git://github.com/JerrySievert/bricks.git"},"users":{"JerrySievert":true},"_attachments":{"bricks-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-WdhBOw6UcEdCIydpL5BWfQ==","length":11704,"stub":true},"bricks-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-TRNf6m2B/BMdch8leBe22Q==","length":11659,"stub":true},"bricks-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-jO92T7l2pqSl1GoBuy662w==","length":11507,"stub":true},"bricks-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-x2KvD+tNcB01AfyaqZdKBQ==","length":10890,"stub":true},"bricks-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-tkHDSccbFEqoMZNgfTNzLw==","length":9679,"stub":true},"bricks-1.0.9.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-HslMnZF0TQdKSt/qQdY95A==","length":9116,"stub":true},"bricks-1.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-PqOqra04mzc3W9411enpoA==","length":9130,"stub":true},"bricks-1.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-872T37BizJEdFOClHXqx4Q==","length":8786,"stub":true},"bricks-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-9gAykR1MTvrXbmflvVpzOA==","length":8757,"stub":true},"bricks-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-D0KxJApcVPeWGvotj+crTA==","length":8170,"stub":true},"bricks-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YWOSK4HgSw+YYwwIPHBJfw==","length":8171,"stub":true},"bricks-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-GnVMDtevJX0PA8pBsKnWpQ==","length":8151,"stub":true},"bricks-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rQxYATSUKU9hVTvCsB5iDQ==","length":8094,"stub":true},"bricks-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nipAQ9ebPQxzrKrvozIc7A==","length":7334,"stub":true}}}},
{"id":"bricks-analytics","key":"bricks-analytics","value":{"rev":"5-cd9fbb0dcfe407a551c660f173239c30"},"doc":{"_id":"bricks-analytics","_rev":"5-cd9fbb0dcfe407a551c660f173239c30","name":"bricks-analytics","description":"Analytics and status package for bricks.js","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-analytics","description":"Analytics and status package for bricks.js","keywords":["analytics","bricks","bricksjs"],"version":"0.1.0","license":"MIT/X11","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-analytics.git"},"main":"./lib/bricks-analytics.js","engines":{"node":"~v0.4.7"},"dependencies":{"microtime":"~0.1.3"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks-analytics/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks-analytics@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"795cebe91ccc1c6c84d3957ecd1f9647df4d2877","tarball":"http://registry.npmjs.org/bricks-analytics/-/bricks-analytics-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"0.1.1":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-analytics","description":"Analytics and status package for bricks.js","keywords":["analytics","bricks","bricksjs"],"version":"0.1.1","license":"MIT/X11","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-analytics.git"},"main":"./lib/bricks-analytics.js","engines":{"node":">=v0.4.7"},"dependencies":{"microtime":"~0.1.3"},"devDependencies":{},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks-analytics@0.1.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-2","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"3af3df669665d23e03445ccebb44c0175c71ff00","tarball":"http://registry.npmjs.org/bricks-analytics/-/bricks-analytics-0.1.1.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]}},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}],"time":{"modified":"2011-12-01T19:40:41.190Z","created":"2011-09-06T01:53:32.774Z","0.1.0":"2011-09-06T01:53:33.320Z","0.1.1":"2011-12-01T19:40:41.190Z"},"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-analytics.git"},"_attachments":{"bricks-analytics-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-hwlel2s2fJTaNcXj+TfSVg==","length":16169,"stub":true},"bricks-analytics-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-JHHIYGa/2leGUrLdzX2xKQ==","length":15914,"stub":true}}}},
{"id":"bricks-compress","key":"bricks-compress","value":{"rev":"7-d99a044e8d374bff5aa42bfea18285f7"},"doc":{"_id":"bricks-compress","_rev":"7-d99a044e8d374bff5aa42bfea18285f7","name":"bricks-compress","description":"Compressed output from bricks.js","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-compress","description":"Compressed output from bricks.js","version":"0.1.0","homepage":"https://github.com/JerrySievert/bricks-compress","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-compress.git"},"license":"MIT/X11","main":"./lib/bricks-compress.js","engines":{"node":">=v0.4.5"},"dependencies":{"compress-buffer":"~0.3.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks-compress/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks-compress@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"edeb9b2708deab01902b65d54c3f058bfc3829bc","tarball":"http://registry.npmjs.org/bricks-compress/-/bricks-compress-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"0.1.1":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-compress","description":"Compressed output from bricks.js","version":"0.1.1","keywords":["gzip","compress","bricksjs","bricks"],"homepage":"https://github.com/JerrySievert/bricks-compress","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-compress.git"},"license":"MIT/X11","main":"./lib/bricks-compress.js","engines":{"node":">=v0.4.5"},"dependencies":{"compress-buffer":"~0.3.0"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks-compress/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks-compress@0.1.1","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0eec973eb39d28e84290d0b6adb129203c920e43","tarball":"http://registry.npmjs.org/bricks-compress/-/bricks-compress-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"0.2.0":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-compress","description":"Compressed output from bricks.js","version":"0.2.0","keywords":["gzip","compress","bricksjs","bricks"],"homepage":"https://github.com/JerrySievert/bricks-compress","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-compress.git"},"license":"MIT/X11","main":"./lib/compress.js","engines":{"node":">=v0.6.0"},"dependencies":{"bufferjs":">=1.0.0"},"devDependencies":{},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks-compress@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d6a2a4ac3cd368a63b0afc093f201be01dc7ee37","tarball":"http://registry.npmjs.org/bricks-compress/-/bricks-compress-0.2.0.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]}},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}],"time":{"modified":"2011-12-18T19:53:59.785Z","created":"2011-09-05T18:57:25.932Z","0.1.0":"2011-09-05T18:57:26.498Z","0.1.1":"2011-09-06T01:48:27.345Z","0.2.0":"2011-12-18T19:53:59.785Z"},"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-compress.git"},"_attachments":{"bricks-compress-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gfqviIeQfcJxWClYHxWe0g==","length":1870,"stub":true},"bricks-compress-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sQPc4DXX38nTmhzpoSslig==","length":1697,"stub":true},"bricks-compress-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ED8mR1X4gzVrOhv4pUvg+Q==","length":1671,"stub":true}}}},
{"id":"bricks-rewrite","key":"bricks-rewrite","value":{"rev":"7-a5c45a6b74f33a9bcea1d957c914dd47"},"doc":{"_id":"bricks-rewrite","_rev":"7-a5c45a6b74f33a9bcea1d957c914dd47","name":"bricks-rewrite","description":"A simple rewrite plugin for bricks.js","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-rewrite","description":"A simple rewrite plugin for bricks.js","version":"0.1.0","homepage":"http://bricksjs.com/","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-rewrite.git"},"main":"lib/rewrite.js","engines":{"node":"~v0.4.7"},"license":"MIT/X11","dependencies":{},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib"},"scripts":{"test":"vows --spec"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks-rewrite/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks-rewrite@0.1.0","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"634e033dc432379750d5cba3ba44bdbaa0a3f5c4","tarball":"http://registry.npmjs.org/bricks-rewrite/-/bricks-rewrite-0.1.0.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"0.1.2":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-rewrite","description":"A simple rewrite plugin for bricks.js","keywords":["rewrite","bricks","bricksjs"],"version":"0.1.2","homepage":"http://bricksjs.com/","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-rewrite.git"},"main":"lib/rewrite.js","engines":{"node":"~v0.4.7"},"license":"MIT/X11","dependencies":{},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib"},"scripts":{"test":"vows --spec"},"_npmJsonOpts":{"file":"/Users/jerry/.npm/bricks-rewrite/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bricks-rewrite@0.1.2","_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"1cf4715337024972d0074ee0ae34eeb0824a4593","tarball":"http://registry.npmjs.org/bricks-rewrite/-/bricks-rewrite-0.1.2.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]},"0.2.2":{"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"name":"bricks-rewrite","description":"A simple rewrite plugin for bricks.js","keywords":["rewrite","bricks","bricksjs"],"version":"0.2.2","homepage":"http://bricksjs.com/","repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-rewrite.git"},"main":"lib/rewrite.js","engines":{"node":">=0.6.5"},"license":"MIT/X11","dependencies":{},"devDependencies":{"vows":"~0.5.0"},"directories":{"test":"./test","lib":"./lib"},"scripts":{"test":"vows --spec"},"_npmUser":{"name":"JerrySievert","email":"code@legitimatesounding.com"},"_id":"bricks-rewrite@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"996e8834762a18b9b6be40f5ea529dbca0471ce9","tarball":"http://registry.npmjs.org/bricks-rewrite/-/bricks-rewrite-0.2.2.tgz"},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}]}},"maintainers":[{"name":"JerrySievert","email":"code@legitimatesounding.com"}],"time":{"modified":"2012-02-03T04:26:36.623Z","created":"2011-08-07T22:36:44.218Z","0.1.0":"2011-08-07T22:36:45.703Z","0.1.2":"2011-09-06T01:49:46.735Z","0.2.2":"2012-02-03T04:26:36.623Z"},"author":{"name":"Jerry Sievert","email":"code@legitimatesounding.com","url":"http://legitimatesounding.com/blog/"},"repository":{"type":"git","url":"git://github.com/JerrySievert/bricks-rewrite.git"},"_attachments":{"bricks-rewrite-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tEcTvicalkpVfYplclDlVA==","length":1576,"stub":true},"bricks-rewrite-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+IbR0tZA/bXkbw1wLNziiQ==","length":1479,"stub":true},"bricks-rewrite-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mZFfAwDYeUCoXY3wthDmoQ==","length":1449,"stub":true}}}},
{"id":"bridge","key":"bridge","value":{"rev":"11-34b577d760b4e116153bcc5c1ed2fe13"},"doc":{"_id":"bridge","_rev":"11-34b577d760b4e116153bcc5c1ed2fe13","name":"bridge","description":"Bridge for JS","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"author":{"name":"Flotype Inc."},"name":"bridge","description":"Flotype Bridge for JS","version":"0.0.1","main":"lib/bridge.js","engines":{"node":"~0.6.1"},"devDependencies":{},"_npmUser":{"name":"sridatta","email":"sridatta@flotype.com"},"_id":"bridge@0.0.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c11954ec6711e2058d8343a663181ca75a0f612e","tarball":"http://registry.npmjs.org/bridge/-/bridge-0.0.1.tgz"},"readme":"","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}]},"0.0.2":{"author":{"name":"Flotype Inc."},"name":"bridge","description":"Flotype Bridge for JS","version":"0.0.2","main":"lib/bridge.js","engines":{"node":"~0.6.1"},"devDependencies":{},"_npmUser":{"name":"sridatta","email":"sridatta@flotype.com"},"_id":"bridge@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"63c8764c50c0a80835931f9a3ce10a638e3b03af","tarball":"http://registry.npmjs.org/bridge/-/bridge-0.0.2.tgz"},"readme":"","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}]},"0.0.3":{"author":"","name":"bridge","description":"Bridge for JS","version":"0.0.3","repository":{"type":"git","url":"git://github.com/Flotype/mqb-prototype.git"},"main":"lib/bridge.js","engines":{"node":"~0.6.1"},"devDependencies":{"uglify-js":"*"},"_npmUser":{"name":"sridatta","email":"sridatta@flotype.com"},"_id":"bridge@0.0.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0d3971be7e57f488c3e49a7e1c33206fd9d92831","tarball":"http://registry.npmjs.org/bridge/-/bridge-0.0.3.tgz"},"readme":"#Flotype Bridge for Javascript\nFlotype Bridge enables cross-language RPC for interserver and client-server communication.\n\n##Installation\nQuick install: Using the [Node Package Manager](http://npmjs.org), do `npm install bridge`\n\nSource install: \n\nClone this repository using `git clone git@bitbucket.org:flotype/bridge-js.git` and install using the npm installer\n\n    npm install bridge-js/\n\n###Dependencies\nThis library has no external dependencies.\n\n##Documentation and Support\n* API Reference: http://www.flotype.com/resources/api\n* Getting Started: http://www.flotype.com/resources/gettingstarted\n* About Flotype and Flotype Bridge: http://www.flotype.com/\n\nThe `examples` directory of this library contains sample applications for Flotype Bridge.\n\nSupport is available in #flotype on Freenode IRC or the Flotype Bridge Google Group.\n\n\n##License\nFlotype Bridge is made available under the MIT/X11 license. See LICENSE file for details.\n\n","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}]},"0.1.0":{"author":"","name":"bridge","description":"Bridge for JS","version":"0.1.0","repository":{"type":"git","url":"git://github.com/Flotype/mqb-prototype.git"},"main":"lib/bridge.js","engines":{"node":"~0.6.1"},"devDependencies":{"uglify-js":"*"},"_npmUser":{"name":"sridatta","email":"sridatta@flotype.com"},"_id":"bridge@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c991a45396a09b0b913d25abce15438ff33909a6","tarball":"http://registry.npmjs.org/bridge/-/bridge-0.1.0.tgz"},"readme":"#Flotype Bridge for Javascript\nFlotype Bridge enables cross-language RPC for interserver and client-server communication.\n\n##Installation\nQuick install: Using the [Node Package Manager](http://npmjs.org), do `npm install bridge`\n\nSource install: \n\nClone this repository using `git clone git@bitbucket.org:flotype/bridge-js.git` and install using the npm installer\n\n    npm install bridge-js/\n\n###Dependencies\nThis library has no external dependencies.\n\n##Documentation and Support\n* API Reference: http://www.flotype.com/resources/api\n* Getting Started: http://www.flotype.com/resources/gettingstarted\n* About Flotype and Flotype Bridge: http://www.flotype.com/\n\nThe `examples` directory of this library contains sample applications for Flotype Bridge.\n\nSupport is available in #flotype on Freenode IRC or the Flotype Bridge Google Group.\n\n\n##License\nFlotype Bridge is made available under the MIT/X11 license. See LICENSE file for details.\n\n","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}]},"0.1.1":{"author":"","name":"bridge","description":"Bridge for JS","version":"0.1.1","repository":{"type":"git","url":"git://github.com/Flotype/mqb-prototype.git"},"main":"lib/bridge.js","engines":{"node":"~0.6.1"},"devDependencies":{"uglify-js":"*"},"_npmUser":{"name":"sridatta","email":"sridatta@flotype.com"},"_id":"bridge@0.1.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9c5734125e37b71819e8cd55e53e8c79d1e861fb","tarball":"http://registry.npmjs.org/bridge/-/bridge-0.1.1.tgz"},"readme":"#Flotype Bridge for Javascript\nFlotype Bridge is a unified messaging system that allows you to easily build cross-language services to share data and realtime updates among your servers and your clients\n\n##Node.js Installation\nQuick install: Using the [Node Package Manager](http://npmjs.org).\n\n    npm install bridge\n\nSource install: Clone this repository using `git clone git@bitbucket.org:flotype/bridge-js.git` and install using the npm installer, `npm install bridge-js/`\n\n##Browser Use\nFlotype Bridge for Javascript can be used in the browser. The javascript is hosted on Flotype servers, but can be served from your own server or CDN of your choice.\n\n    http://flotype.com/js/bridge.min.js\n    \nTo use Bridge in the browser, simply add a script tag in your html. `<script type=\"text/javascript\" src=\"    http://flotype.com/js/bridge.min.js\n\"></script>`\n###Dependencies\nThis library has no external dependencies.\n\n##Documentation and Support\n* API Reference: http://flotype.com/docs/api/js/\n* Getting Started: http://www.flotype.com/docs/gettingstarted/js/\n* About Flotype and Flotype Bridge: http://www.flotype.com/\n\nThe `examples` directory of this library contains sample applications for Flotype Bridge.\n\nSupport is available in #flotype on Freenode IRC or the Flotype Bridge Google Group.\n\n\n##License\nFlotype Bridge is made available under the MIT/X11 license. See LICENSE file for details.\n\n","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}]}},"readme":"","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}],"time":{"modified":"2012-04-20T23:10:40.597Z","created":"2012-03-09T20:49:53.397Z","0.0.1":"2012-03-09T20:49:54.850Z","0.0.2":"2012-03-09T20:50:39.060Z","0.0.3":"2012-04-06T07:28:10.876Z","0.1.0":"2012-04-06T08:15:52.072Z","0.1.1":"2012-04-20T23:10:40.597Z"},"author":{"name":"Flotype Inc."},"repository":{"type":"git","url":"git://github.com/Flotype/mqb-prototype.git"},"_attachments":{"bridge-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ZyCHe7qsu6RtDg3+5vL92Q==","length":73087,"stub":true},"bridge-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-OYIrtbyrgrPy7TICLTZb2w==","length":117636,"stub":true},"bridge-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Tdc7dPXotXx+FvqcySmf5Q==","length":117620,"stub":true},"bridge-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DQgc+Nks5hNFi2EDe13ipQ==","length":12668,"stub":true},"bridge-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KFMHq4LOi/pYe0v6KM128A==","length":12669,"stub":true}}}},
{"id":"bridge-js","key":"bridge-js","value":{"rev":"15-7b9fb3ae0cd40d284c95c304308b2749"},"doc":{"_id":"bridge-js","_rev":"15-7b9fb3ae0cd40d284c95c304308b2749","name":"bridge-js","description":"Bridge client for JS","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"author":"","name":"bridge-js","description":"Bridge client for JS","version":"0.2.0","repository":{"type":"git","url":"git://github.com/getbridge/bridge-js.git"},"main":"lib/bridge.js","engines":{"node":">= 0.6.1"},"devDependencies":{"uglify-js":"*"},"_npmUser":{"name":"sridatta","email":"sridatta@flotype.com"},"_id":"bridge-js@0.2.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0ea7ef7c4d1b8a3dc87132e4ccdb9160da4cf541","tarball":"http://registry.npmjs.org/bridge-js/-/bridge-js-0.2.0.tgz"},"maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}],"directories":{}},"0.2.1":{"author":"","name":"bridge-js","description":"Bridge client for JS","version":"0.2.1","repository":{"type":"git","url":"git://github.com/getbridge/bridge-js.git"},"main":"lib/bridge.js","engines":{"node":">=0.6.1"},"devDependencies":{"uglify-js":"*"},"readme":"# Bridge for Javascript\nBridge is a unified messaging system that allows you to easily build\ncross-language services to share data and realtime updates among your\nservers and your clients\n\n## Node.js Installation\nQuick install: Using the [Node Package Manager](http://npmjs.org).\n\n    npm install bridge\n\nSource install: Clone this repository using `git clone\ngit@github.com:getbridge/bridge-js.git` and install using the npm\ninstaller, `npm install bridge-js/`\n\n## Browser Use\n\nBridge for Javascript can be used in the browser. The javascript is hosted\non Bridge servers, but can be served from your own server or CDN of your\nchoice.\n\n    http://www.getbridge.com/js/bridge.min.js\n    \nTo use Bridge in the browser, simply add a script tag in your\nhtml. `<script type=\"text/javascript\" src=\"\nhttp://www.getbridge.com/js/bridge.min.js \"></script>`\n\n### Dependencies\nThis library has no external dependencies.\n\n## Documentation and Support\n* API Reference: http://www.getbridge.com/docs/api/js/\n* Getting Started: http://www.getbridge.com/docs/gettingstarted/js/\n* About Bridge: http://www.getbridge.com/\n\nThe `examples` directory of this library contains sample applications for Bridge.\n\nSupport is available in #getbridge on Freenode IRC or the Bridge Google Group.\n\n\n## License\nBridge is made available under the MIT/X11 license. See LICENSE file for details.\n\n","_id":"bridge-js@0.2.1","dist":{"shasum":"d42a13fc186f4fca212e744e9622c58a7bdf3984","tarball":"http://registry.npmjs.org/bridge-js/-/bridge-js-0.2.1.tgz"},"maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}],"directories":{}},"0.2.2":{"author":"","name":"bridge-js","description":"Bridge client for JS","version":"0.2.2","repository":{"type":"git","url":"git://github.com/getbridge/bridge-js.git"},"main":"lib/bridge.js","engines":{"node":">=0.6.1"},"devDependencies":{"uglify-js":"*"},"readme":"# Bridge for Javascript\nBridge is a unified messaging system that allows you to easily build\ncross-language services to share data and realtime updates among your\nservers and your clients\n\n## Node.js Installation\nQuick install: Using the [Node Package Manager](http://npmjs.org).\n\n    npm install bridge\n\nSource install: Clone this repository using `git clone\ngit@github.com:getbridge/bridge-js.git` and install using the npm\ninstaller, `npm install bridge-js/`\n\n## Browser Use\n\nBridge for Javascript can be used in the browser. The javascript is hosted\non Bridge servers, but can be served from your own server or CDN of your\nchoice.\n\n    http://www.getbridge.com/js/bridge.min.js\n    \nTo use Bridge in the browser, simply add a script tag in your\nhtml. `<script type=\"text/javascript\" src=\"\nhttp://www.getbridge.com/js/bridge.min.js \"></script>`\n\n### Dependencies\nThis library has no external dependencies.\n\n## Documentation and Support\n* API Reference: http://www.getbridge.com/docs/api/js/\n* Getting Started: http://www.getbridge.com/docs/gettingstarted/js/\n* About Bridge: http://www.getbridge.com/\n\nThe `examples` directory of this library contains sample applications for Bridge.\n\nSupport is available in #getbridge on Freenode IRC or the Bridge Google Group.\n\n\n## License\nBridge is made available under the MIT/X11 license. See LICENSE file for details.\n\n","_id":"bridge-js@0.2.2","dist":{"shasum":"e16af14ff24acad6490601b2997f54877c52abef","tarball":"http://registry.npmjs.org/bridge-js/-/bridge-js-0.2.2.tgz"},"maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}]}},"readme":"# Bridge for Javascript\nBridge is a unified messaging system that allows you to easily build\ncross-language services to share data and realtime updates among your\nservers and your clients\n\n## Node.js Installation\nQuick install: Using the [Node Package Manager](http://npmjs.org).\n\n    npm install bridge\n\nSource install: Clone this repository using `git clone\ngit@github.com:getbridge/bridge-js.git` and install using the npm\ninstaller, `npm install bridge-js/`\n\n## Browser Use\n\nBridge for Javascript can be used in the browser. The javascript is hosted\non Bridge servers, but can be served from your own server or CDN of your\nchoice.\n\n    http://www.getbridge.com/js/bridge.min.js\n    \nTo use Bridge in the browser, simply add a script tag in your\nhtml. `<script type=\"text/javascript\" src=\"\nhttp://www.getbridge.com/js/bridge.min.js \"></script>`\n\n### Dependencies\nThis library has no external dependencies.\n\n## Documentation and Support\n* API Reference: http://www.getbridge.com/docs/api/js/\n* Getting Started: http://www.getbridge.com/docs/gettingstarted/js/\n* About Bridge: http://www.getbridge.com/\n\nThe `examples` directory of this library contains sample applications for Bridge.\n\nSupport is available in #getbridge on Freenode IRC or the Bridge Google Group.\n\n\n## License\nBridge is made available under the MIT/X11 license. See LICENSE file for details.\n\n","maintainers":[{"name":"sridatta","email":"sridatta@flotype.com"}],"time":{"modified":"2012-07-09T19:36:34.884Z","created":"2012-06-28T09:22:43.067Z","0.2.0":"2012-06-28T09:22:47.529Z","0.2.1":"2012-07-07T00:40:57.970Z","0.2.2":"2012-07-09T19:36:34.884Z"},"repository":{"type":"git","url":"git://github.com/getbridge/bridge-js.git"},"_attachments":{"bridge-js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-n7ek/WXqCZ3c0V+0ziv33w==","length":472135,"stub":true},"bridge-js-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-5/9uMWq9R1mVLM/muGnYsw==","length":235770,"stub":true},"bridge-js-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-G0kN0eTLQ+QxBG6eMNpDJQ==","length":219396,"stub":true}}}},
{"id":"brief","key":"brief","value":{"rev":"11-90c737a825580c998241c1c3561a8ed4"},"doc":{"_id":"brief","_rev":"11-90c737a825580c998241c1c3561a8ed4","name":"brief","description":"Simple markdown/jade renderer","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"brief","version":"0.1.0","description":"Simple markdown/jade renderer","repository":{"type":"git","url":"git://github.com/zeekay/brief.git"},"keywords":["markdown","jade","documentation","docs"],"main":"lib/","bin":{"brief":"./bin/brief"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"dependencies":{"marked":"~0.2.5","jade":"~0.26.2"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"https://whatit.is"},"homepage":"https://github.com/zeekay/brief","licenses":[{"type":"MIT","url":"https://github.com/zeekay/brief/blob/master/LICENSE"}],"devDependencies":{"coffee-script":"~1.3.3"},"_id":"brief@0.1.0","dist":{"shasum":"d9f39c5990902b90bb23f33abff2726dac111ad9","tarball":"http://registry.npmjs.org/brief/-/brief-0.1.0.tgz"},"readme":"","maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.2.0":{"name":"brief","version":"0.2.0","description":"Simple markdown/jade renderer","repository":{"type":"git","url":"git://github.com/zeekay/brief.git"},"keywords":["markdown","jade","documentation","docs"],"main":"lib/","bin":{"brief":"./bin/brief"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"dependencies":{"marked":"~0.2.5","jade":"~0.26.2"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"https://whatit.is"},"homepage":"https://github.com/zeekay/brief","licenses":[{"type":"MIT","url":"https://github.com/zeekay/brief/blob/master/LICENSE"}],"devDependencies":{"coffee-script":"~1.3.3"},"_id":"brief@0.2.0","dist":{"shasum":"169a68b83201e0eeafd81ff1fd753bd586beef85","tarball":"http://registry.npmjs.org/brief/-/brief-0.2.0.tgz"},"readme":"","maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.2.1":{"name":"brief","version":"0.2.1","description":"Simple markdown/jade renderer","repository":{"type":"git","url":"git://github.com/zeekay/brief.git"},"keywords":["markdown","jade","documentation","docs"],"main":"lib/","bin":{"brief":"./bin/brief"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"dependencies":{"marked":"~0.2.5","jade":"~0.26.2"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"https://whatit.is"},"homepage":"https://github.com/zeekay/brief","licenses":[{"type":"MIT","url":"https://github.com/zeekay/brief/blob/master/LICENSE"}],"devDependencies":{"coffee-script":"~1.3.3"},"_id":"brief@0.2.1","dist":{"shasum":"feb3f8a9ce9d61ec0186e71e530ffc9c061accb8","tarball":"http://registry.npmjs.org/brief/-/brief-0.2.1.tgz"},"readme":"","maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.3.0":{"name":"brief","version":"0.3.0","description":"Simple markdown/jade renderer","repository":{"type":"git","url":"git://github.com/zeekay/brief.git"},"keywords":["markdown","jade","documentation","docs"],"main":"lib/","bin":{"brief":"./bin/brief"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"dependencies":{"marked":"~0.2.5","jade":"~0.26.2"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"https://whatit.is"},"homepage":"https://github.com/zeekay/brief","licenses":[{"type":"MIT","url":"https://github.com/zeekay/brief/blob/master/LICENSE"}],"devDependencies":{"coffee-script":"~1.3.3"},"readme":"# brief\n\nA simple tool for generating github pages (or other things from markdown/jade templates).\n\n## Usage\n\n- Create a gh-pages branch.\n- Add an index.jade file which will render your content:\n\n    p!= content\n\n- Make sure you have a README.md file which will be injected into your jade template and rendered as index.html\n- If you use `cake` add a new task to your `Cakefile`:\n\n    task 'gh-pages', 'Publish docs to gh-pages', ->\n      brief = require('brief')\n        quiet: false\n      brief.updateGithubPages()\n","_id":"brief@0.3.0","dist":{"shasum":"97060a86f4e4d8788e2cbc3ac52f0611ac6ccb09","tarball":"http://registry.npmjs.org/brief/-/brief-0.3.0.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]},"0.4.0":{"name":"brief","version":"0.4.0","description":"Simple markdown/jade renderer","repository":{"type":"git","url":"git://github.com/zeekay/brief.git"},"keywords":["markdown","jade","documentation","docs"],"main":"lib/","bin":{"brief":"./bin/brief"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"dependencies":{"jade":"~0.26.2","marked":"~0.2.5","highlight.js":"~7.0.1"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"https://whatit.is"},"homepage":"http://zeekay.github.com/brief","licenses":[{"type":"MIT","url":"https://github.com/zeekay/brief/blob/master/LICENSE"}],"devDependencies":{"coffee-script":"~1.3.3"},"readme":"# brief\n\nA simple tool for generating github pages (or other things from markdown/jade templates).\n\n## Usage\n\n- Create a gh-pages branch.\n- Add an index.jade file which will render your content:\n\n        p!= content\n\n- Make sure you have a README.md file which will be injected into your jade template and rendered as index.html\n- If you use `cake` add a new task to your `Cakefile`:\n\n        task 'gh-pages', 'Publish docs to gh-pages', ->\n          brief = require('brief')\n            quiet: false\n          brief.updateGithubPages()\n","_id":"brief@0.4.0","dist":{"shasum":"d23c9d6045798d74a16f24d3e37a2f551331112f","tarball":"http://registry.npmjs.org/brief/-/brief-0.4.0.tgz"},"maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}]}},"readme":"","maintainers":[{"name":"zeekay","email":"zeekay@gmail.com"}],"time":{"modified":"2012-06-27T06:30:57.195Z","created":"2012-06-25T08:51:44.823Z","0.1.0":"2012-06-25T08:51:45.567Z","0.2.0":"2012-06-25T09:17:28.134Z","0.2.1":"2012-06-25T09:19:32.669Z","0.3.0":"2012-06-26T08:10:13.618Z","0.4.0":"2012-06-27T06:30:57.195Z"},"author":{"name":"Zach Kelling","email":"zeekayy@gmail.com","url":"https://whatit.is"},"repository":{"type":"git","url":"git://github.com/zeekay/brief.git"},"_attachments":{"brief-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-U8KREzqq5O9EvvxrZGm1IQ==","length":2995,"stub":true},"brief-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-dYTOEit986p+gM1W3X36GQ==","length":2839,"stub":true},"brief-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+BHMIxE1qcQK0J+aZfRUsg==","length":1976,"stub":true},"brief-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VQUZMftjyIaoqnEKHsA91Q==","length":1351,"stub":true},"brief-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EsI5kZYUMqFVzyorbzTAxg==","length":1211,"stub":true}}}},
{"id":"brik.ipa.client","key":"brik.ipa.client","value":{"rev":"8-9a7a5284429f7b147cf34c02163dd520"},"doc":{"_id":"brik.ipa.client","_rev":"8-9a7a5284429f7b147cf34c02163dd520","name":"brik.ipa.client","description":"easy access to methods of an ipa server","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.0":{"author":{"name":"Jon Packer","email":"jon.packer@brik.no"},"name":"brik.ipa.client","description":"easy access to methods of an ipa server","version":"0.0.0","repository":{"url":""},"main":"ipa.client.js","engines":{"node":"~0.6.11"},"dependencies":{"request":"~2.9.203","naan":"~1.3.10"},"devDependencies":{},"_npmUser":{"name":"jonpacker","email":"contact@jonpacker.com"},"_id":"brik.ipa.client@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2054277ab4296a2213a3869e15d8f2fcdc85b25a","tarball":"http://registry.npmjs.org/brik.ipa.client/-/brik.ipa.client-0.0.0.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]},"0.1.1":{"author":{"name":"Jon Packer","email":"jon.packer@brik.no"},"name":"brik.ipa.client","description":"easy access to methods of an ipa server","version":"0.1.1","repository":{"url":""},"main":"ipa.client.js","engines":{"node":"~0.8.0"},"dependencies":{"request":"~2.9.203","naan":"~1.3.10"},"devDependencies":{},"readme":"__ipa.client__ is a intermediate library for [IPA](http://www.github.com/brikteknologier/ipa).\nIt provides an idiomatic node API for calling the functions exposed by IPA's\nREST API, along with some convenient shortcuts.\n\n## Usage\n\n```javascript\n// Create an client for an ipa server running on localhost:4567\nvar ipa = require('ipa.client')('http://localhost:4567');\n\n// Send a log message to ipa\nipa.log('Hello!');\n```\n\n## Function Overview\n\n* [ipa.log](#log)\n* [ipa.logImage(#logImage)\n\n## Function Documentation\n\n<a name=\"log\"/>\n### ipa.log(message, [callback]);\n\nSend a string to IPA's log function. This is not escaped, you can send HTML if\nyou wish.\n\n### ipa.logImage(imageUrl, [callback]);\n\nSend an image to IPA's log function. This just sends an image HTML element. Not\nthe image data.\n","_id":"brik.ipa.client@0.1.1","dist":{"shasum":"29ed39644a54121333283c2d47c1e47b9513acfb","tarball":"http://registry.npmjs.org/brik.ipa.client/-/brik.ipa.client-0.1.1.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]},"0.1.2":{"author":{"name":"Jon Packer","email":"jon.packer@brik.no"},"name":"brik.ipa.client","description":"easy access to methods of an ipa server","version":"0.1.2","repository":{"url":""},"main":"ipa.client.js","engines":{"node":"~0.8.0"},"dependencies":{"request":"~2.9.203","naan":"~1.3.10"},"devDependencies":{},"readme":"__ipa.client__ is a intermediate library for [IPA](http://www.github.com/brikteknologier/ipa).\nIt provides an idiomatic node API for calling the functions exposed by IPA's\nREST API, along with some convenient shortcuts.\n\n## Usage\n\n```javascript\n// Create an client for an ipa server running on localhost:4567\nvar ipa = require('ipa.client')('http://localhost:4567');\n\n// Send a log message to ipa\nipa.log('Hello!');\n```\n\n## Function Overview\n\n* [ipa.log](#log)\n* [ipa.logImage(#logImage)\n\n## Function Documentation\n\n<a name=\"log\"/>\n### ipa.log(message, [callback]);\n\nSend a string to IPA's log function. This is not escaped, you can send HTML if\nyou wish.\n\n### ipa.logImage(imageUrl, [callback]);\n\nSend an image to IPA's log function. This just sends an image HTML element. Not\nthe image data.\n","_id":"brik.ipa.client@0.1.2","dist":{"shasum":"42584882531f5dc0afc5bfb07419a32b6916e98a","tarball":"http://registry.npmjs.org/brik.ipa.client/-/brik.ipa.client-0.1.2.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]}},"readme":"__ipa.client__ is a intermediate library for [IPA](http://www.github.com/brikteknologier/ipa).\nIt provides an idiomatic node API for calling the functions exposed by IPA's\nREST API, along with some convenient shortcuts.\n\n## Usage\n\n```javascript\n// Create an client for an ipa server running on localhost:4567\nvar ipa = require('ipa.client')('http://localhost:4567');\n\n// Send a log message to ipa\nipa.log('Hello!');\n```\n\n## Function Overview\n\n* [ipa.log](#log)\n* [ipa.logImage(#logImage)\n\n## Function Documentation\n\n<a name=\"log\"/>\n### ipa.log(message, [callback]);\n\nSend a string to IPA's log function. This is not escaped, you can send HTML if\nyou wish.\n\n### ipa.logImage(imageUrl, [callback]);\n\nSend an image to IPA's log function. This just sends an image HTML element. Not\nthe image data.\n","maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}],"time":{"modified":"2012-08-02T13:43:24.256Z","created":"2012-07-02T22:17:34.157Z","0.0.0":"2012-07-02T22:17:36.924Z","0.1.1":"2012-08-02T13:02:03.292Z","0.1.2":"2012-08-02T13:08:55.858Z"},"author":{"name":"Jon Packer","email":"jon.packer@brik.no"},"repository":{"url":""},"users":{"fgribreau":true},"_attachments":{"brik.ipa.client-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+ng4asbgYcbBhR14lIJHIg==","length":1228,"stub":true},"brik.ipa.client-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-RagNHeb6wdtDtDmZqPO5og==","length":1229,"stub":true},"brik.ipa.client-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iF3VqXeLSn/9Kbf0J1FSDw==","length":10240,"stub":true}}}},
{"id":"brik.ipa.feed","key":"brik.ipa.feed","value":{"rev":"10-33e44687c1154954a19d2c5e777577a9"},"doc":{"_id":"brik.ipa.feed","_rev":"10-33e44687c1154954a19d2c5e777577a9","name":"brik.ipa.feed","description":"read a set of feeds and send their content to ipa","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"author":{"name":"Jon Packer"},"name":"brik.ipa.feed","description":"read a set of feeds and send their content to ipa","version":"0.1.0","repository":{"type":"git","url":"git://github.com/brikteknologier/ipa.git"},"engines":{"node":"~0.8.0"},"dependencies":{"feedparser":"~0.9.10","async":"~0.1.22","underscore":"~1.3.3","brik.ipa.client":"0.0.0"},"devDependencies":{},"readme":"__ipa.feed__ is a feed module for [IPA](http://www.github.com/brikteknologier/ipa).\nIt takes an array of feeds and returns a function that will read them and send\nany new articles to IPA.\n\n## Example\n\n```javascript\nvar ipaServerUrl = 'http://localhost:4567';\nvar feeds = [\n  'https://github.com/brikteknologier.atom',\n  'https://github.com/jonpacker.atom',\n  'https://github.com/deestan.atom'\n];\nvar updateFeeds = require('ipa.feed')(ipaServerUrl, feeds);\n\nupdateFeeds(function(err) {\n  if (!err) console.log('Feeds have been updated!');\n\n  // Send any new articles to the ipa server after 60 seconds (60000ms)\n  setTimeout(function() { updateFeeds() }, 60000);\n});\n```\n","_id":"brik.ipa.feed@0.1.0","dist":{"shasum":"f02049726aaa432d5e0139ce783b27c9d02b7844","tarball":"http://registry.npmjs.org/brik.ipa.feed/-/brik.ipa.feed-0.1.0.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]},"0.1.1":{"author":{"name":"Jon Packer"},"name":"brik.ipa.feed","main":"ipa.feed.js","description":"read a set of feeds and send their content to ipa","version":"0.1.1","repository":{"type":"git","url":"git://github.com/brikteknologier/ipa.git"},"engines":{"node":"~0.8.0"},"dependencies":{"feedparser":"~0.9.10","async":"~0.1.22","underscore":"~1.3.3","brik.ipa.client":"0.0.0"},"devDependencies":{},"readme":"__ipa.feed__ is a feed module for [IPA](http://www.github.com/brikteknologier/ipa).\nIt takes an array of feeds and returns a function that will read them and send\nany new articles to IPA.\n\n## Example\n\n```javascript\nvar ipaServerUrl = 'http://localhost:4567';\nvar feeds = [\n  'https://github.com/brikteknologier.atom',\n  'https://github.com/jonpacker.atom',\n  'https://github.com/deestan.atom'\n];\nvar updateFeeds = require('ipa.feed')(ipaServerUrl, feeds);\n\nupdateFeeds(function(err) {\n  if (!err) console.log('Feeds have been updated!');\n\n  // Send any new articles to the ipa server after 60 seconds (60000ms)\n  setTimeout(function() { updateFeeds() }, 60000);\n});\n```\n","_id":"brik.ipa.feed@0.1.1","dist":{"shasum":"2a8605ae6c9f576000a2f1a8b284b1140774fc56","tarball":"http://registry.npmjs.org/brik.ipa.feed/-/brik.ipa.feed-0.1.1.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]},"0.0.1":{"author":{"name":"Jon Packer"},"name":"brik.ipa.feed","description":"read a set of feeds and send their content to ipa","version":"0.0.1","repository":{"type":"git","url":"git://github.com/brikteknologier/ipa.git"},"engines":{"node":"~0.6.11"},"dependencies":{"feedparser":"~0.9.10","async":"~0.1.22","underscore":"~1.3.3","brik.ipa.client":"0.0.0"},"devDependencies":{},"readme":"__ipa.feed__ is a feed module for [IPA](http://www.github.com/brikteknologier/ipa).\nIt takes an array of feeds and returns a function that will read them and send\nany new articles to IPA.\n\n## Example\n\n```javascript\nvar ipaServerUrl = 'http://localhost:4567';\nvar feeds = [\n  'https://github.com/brikteknologier.atom',\n  'https://github.com/jonpacker.atom',\n  'https://github.com/deestan.atom'\n];\nvar updateFeeds = require('ipa.feed')(ipaServerUrl, feeds);\n\nupdateFeeds(function(err) {\n  if (!err) console.log('Feeds have been updated!');\n\n  // Send any new articles to the ipa server after 60 seconds (60000ms)\n  setTimeout(function() { updateFeeds() }, 60000);\n});\n```\n","_id":"brik.ipa.feed@0.0.1","dist":{"shasum":"11302e089579cde2a225335535e3a0af8d26bf55","tarball":"http://registry.npmjs.org/brik.ipa.feed/-/brik.ipa.feed-0.0.1.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]},"0.1.2":{"author":{"name":"Jon Packer"},"name":"brik.ipa.feed","main":"ipa.feed.js","description":"read a set of feeds and send their content to ipa","version":"0.1.2","repository":{"type":"git","url":"git://github.com/brikteknologier/ipa.git"},"engines":{"node":"~0.8.0"},"dependencies":{"feedparser":"~0.9.10","async":"~0.1.22","underscore":"~1.3.3","brik.ipa.client":"0.0.0"},"devDependencies":{},"readme":"__ipa.feed__ is a feed module for [IPA](http://www.github.com/brikteknologier/ipa).\nIt takes an array of feeds and returns a function that will read them and send\nany new articles to IPA.\n\n## Example\n\n```javascript\nvar ipaServerUrl = 'http://localhost:4567';\nvar feeds = [\n  'https://github.com/brikteknologier.atom',\n  'https://github.com/jonpacker.atom',\n  'https://github.com/deestan.atom'\n];\nvar updateFeeds = require('ipa.feed')(ipaServerUrl, feeds);\n\nupdateFeeds(function(err) {\n  if (!err) console.log('Feeds have been updated!');\n\n  // Send any new articles to the ipa server after 60 seconds (60000ms)\n  setTimeout(function() { updateFeeds() }, 60000);\n});\n```\n","_id":"brik.ipa.feed@0.1.2","dist":{"shasum":"6a5987089e30dfa4cb125478f293eeb25a6c62cd","tarball":"http://registry.npmjs.org/brik.ipa.feed/-/brik.ipa.feed-0.1.2.tgz"},"maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}]}},"readme":"__ipa.feed__ is a feed module for [IPA](http://www.github.com/brikteknologier/ipa).\nIt takes an array of feeds and returns a function that will read them and send\nany new articles to IPA.\n\n## Example\n\n```javascript\nvar ipaServerUrl = 'http://localhost:4567';\nvar feeds = [\n  'https://github.com/brikteknologier.atom',\n  'https://github.com/jonpacker.atom',\n  'https://github.com/deestan.atom'\n];\nvar updateFeeds = require('ipa.feed')(ipaServerUrl, feeds);\n\nupdateFeeds(function(err) {\n  if (!err) console.log('Feeds have been updated!');\n\n  // Send any new articles to the ipa server after 60 seconds (60000ms)\n  setTimeout(function() { updateFeeds() }, 60000);\n});\n```\n","maintainers":[{"name":"jonpacker","email":"contact@jonpacker.com"}],"time":{"modified":"2012-08-10T11:01:38.948Z","created":"2012-08-02T11:35:32.556Z","0.1.0":"2012-08-02T11:35:34.333Z","0.1.1":"2012-08-02T11:56:15.259Z","0.0.1":"2012-08-10T10:56:53.217Z","0.1.2":"2012-08-10T11:01:38.948Z"},"author":{"name":"Jon Packer"},"repository":{"type":"git","url":"git://github.com/brikteknologier/ipa.git"},"users":{"fgribreau":true},"_attachments":{"brik.ipa.feed-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-4fkN8zSrvC+QG3kyQN+r3Q==","length":1085,"stub":true},"brik.ipa.feed-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-elKQLUOt/XKMtPJ8sZ1axQ==","length":1080,"stub":true},"brik.ipa.feed-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-QsPYBwz2Y/JAaP9u4GcGbA==","length":1097,"stub":true},"brik.ipa.feed-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yzkY0CtnZJNzyPduWxd0lw==","length":1090,"stub":true}}}},
{"id":"brisk","key":"brisk","value":{"rev":"3-8ac5657e4b1df7ab7de9b2d9677d2c94"},"doc":{"_id":"brisk","_rev":"3-8ac5657e4b1df7ab7de9b2d9677d2c94","name":"brisk","description":"Automation for Express.js","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"brisk","version":"0.0.1","description":"Automation for Express.js","author":{"name":"makesites"},"contributors":[{"name":"Makis Tracend","email":"makis@makesit.es"},{"name":"Lyndel Thomas","email":"lyndelt@gmail.com"}],"homepage":"http://makesites.org/brisk","keywords":["node","express","framework","brisk"],"repository":{"type":"git","url":"git://github.com/makesites/brisk.git"},"bugs":{"url":"https://github.com/makesites/brisk/issues"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"main":"./index.js","engines":{"node":">0.6.x"},"dependencies":{"express":">2.5"},"_npmUser":{"name":"makesites","email":"makis.tracend@gmail.com"},"_id":"brisk@0.0.1","scripts":{"start":"node server.js"},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"de7213c5363ee49e09c5ff878a8ce05d555c5b90","tarball":"http://registry.npmjs.org/brisk/-/brisk-0.0.1.tgz"},"readme":"","maintainers":[{"name":"makesites","email":"makis.tracend@gmail.com"}]}},"readme":"","maintainers":[{"name":"makesites","email":"makis.tracend@gmail.com"}],"time":{"modified":"2012-08-11T09:23:29.998Z","created":"2012-08-11T09:23:28.775Z","0.0.1":"2012-08-11T09:23:29.998Z"},"author":{"name":"makesites"},"repository":{"type":"git","url":"git://github.com/makesites/brisk.git"},"_attachments":{"brisk-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-suZxkOOCsO4gpMsryxmCAg==","length":18840,"stub":true}}}},
{"id":"broadway","key":"broadway","value":{"rev":"48-ab50d30ec0e9072a695b89e6dab6c6d3"},"doc":{"_id":"broadway","_rev":"48-ab50d30ec0e9072a695b89e6dab6c6d3","name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.0","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/flatiron.git"},"dependencies":{"eventemitter2":"0.4.x","nconf":"0.4.x >=0.4.3","nconf-redis":"0.2.x","optimist":"0.2.x","winston":"0.5.x >=0.5.2","utile":"0.x.x"},"devDependencies":{"vows":"0.5.x"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.0","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"bee8427040761fede74eea74fc72d6899886c317","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.0.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.1":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.1","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.x","nconf":"0.5.x","optimist":"0.2.x","winston":"0.5.x >=0.5.2","utile":"0.x.x"},"devDependencies":{"vows":"0.5.x"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8de2ac87034e79d714182c1161fd00426de43108","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.1.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.2":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.2","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.x","nconf":"0.5.x","optimist":"0.2.x","winston":"0.5.x >=0.5.2","utile":"0.x.x"},"devDependencies":{"vows":"0.5.x"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"985c21d193f734d1c8e9c2cd3cbf9b49b92ef290","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.2.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.3":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.3","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.1","nconf":"0.5.0","optimist":"0.2.8","winston":"0.5.9","utile":"0.0.9"},"devDependencies":{"vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a3b2a711f5642d05c44f2d9073d756cfb24e8b53","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.3.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.4":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.4","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.1","nconf":"0.5.0","optimist":"0.2.8","winston":"0.5.9","utile":"0.0.9"},"devDependencies":{"vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8b89b9af179a67251ec8015b49d5e9ad975e3d1f","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.4.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.5":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.5","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.1","nconf":"0.5.0","optimist":"0.2.8","winston":"0.5.9","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","colors":"0.6.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7870c347ed9b414058a94d401912536ecf3e04c1","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.5.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.6":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.6","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.1","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.9","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","colors":"0.6.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f3de1dd451f9e6b8c4b919c47e58a19f988ecc9b","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.6.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.7":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.7","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.1","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.9","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","colors":"0.6.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f3cebc18509dc2681e1acb9da4a0cfd5a41e09bf","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.7.tgz"},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.8":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.8","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"eventemitter2":"0.4.3","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.9","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","colors":"0.6.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"2e13c0fb0a428fb64cfa8a1dbd625af562f19e6b","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.8.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.9":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.9","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.6","eventemitter2":"0.4.3","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.9","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"3e1dd9add5e851467c7681b1722ef5d7c80ebfcc","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.9.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}],"directories":{}},"0.1.10":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.10","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.3","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.9","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b25f3785a06d28a616f3351f0ea94202976055c5","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.10.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.1.11":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.11","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.8","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.10","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.0"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.1.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"56206e9512e4bac90c0057e39656e5d0efdb4e12","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.11.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"}]},"0.1.13":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.13","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.8","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.10","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"avianflu","email":"charlie@charlieistheman.com"},"_id":"broadway@0.1.13","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"761de72babc30cfc9e2b31c6c6bca3385e3b1e38","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.13.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}]},"0.1.14":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.14","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.9","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.10","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec -i"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"avianflu","email":"charlie@charlieistheman.com"},"_id":"broadway@0.1.14","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"5e6f379cf943c662f83f4eb7eb5709d5556484c0","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.14.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}]},"0.1.15":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.1.15","contributors":[{"name":"Charlie Robbins","email":"charlie@nodejitsu.com"},{"name":"Paolo Fragomeni","email":"paolo@nodejitsu.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.9","nconf":"0.5.1","optimist":"0.3.1","winston":"0.5.11","utile":"0.0.10"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec"},"main":"./lib/broadway","engines":{"node":">= 0.4.0"},"_npmUser":{"name":"avianflu","email":"charlie@charlieistheman.com"},"_id":"broadway@0.1.15","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"4b9c949af2c39373a19f91c54f8a046e131234ad","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.1.15.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  }\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}]},"0.2.0":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.2.0","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.9","nconf":"0.5.1","optimist":"0.3.4","winston":"0.5.11","utile":"0.1.0"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec"},"main":"./lib/broadway","engines":{"node":">= 0.6.4"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4d3bc98bad9192ae0b16da202edf0b99bb844768","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.2.0.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  },\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n"},"0.2.1":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.2.1","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"colors":"0.6.0-1","cliff":"0.1.7","eventemitter2":"0.4.9","nconf":"0.5.1","winston":"0.6.1","utile":"0.1.1"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec"},"main":"./lib/broadway","engines":{"node":">= 0.6.4"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"080530b336e347c342af60c13b6b582de8162cf4","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.2.1.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  }\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  },\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n"},"0.2.3":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.2.3","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"cliff":"0.1.8","eventemitter2":"0.4.9","nconf":"0.6.1","winston":"0.6.2","utile":"0.1.2"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec"},"main":"./lib/broadway","engines":{"node":">= 0.6.4"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"ba590495def78fd9aab9a66dd19d121538f8f718","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.2.3.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  };\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  },\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n"},"0.2.4":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.2.4","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"cliff":"0.1.8","eventemitter2":"0.4.9","nconf":"0.6.3","winston":"0.6.2","utile":"0.1.2"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec"},"main":"./lib/broadway","engines":{"node":">= 0.6.4"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"c75342b9f72c50bdeec242872950e6eee40d3f58","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.2.4.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  };\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  },\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n"},"0.2.5":{"name":"broadway","description":"Lightweight application extensibility and composition with a twist of feature reflection.","author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"version":"0.2.5","maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}],"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"dependencies":{"cliff":"0.1.8","eventemitter2":"0.4.9","nconf":"0.6.4","winston":"0.6.2","utile":"0.1.2"},"devDependencies":{"codesurgeon":"0.2.x","uglify-js":"1.0.6","vows":"0.6.x"},"scripts":{"test":"vows test/**/*-test.js --spec"},"main":"./lib/broadway","engines":{"node":">= 0.6.4"},"_npmUser":{"name":"indexzero","email":"charlie.robbins@gmail.com"},"_id":"broadway@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"c77c3d953862d97dde19394fe39d21b3cc17faba","tarball":"http://registry.npmjs.org/broadway/-/broadway-0.2.5.tgz"},"readme":"# broadway [![Build Status](https://secure.travis-ci.org/flatiron/broadway.png)](http://travis-ci.org/flatiron/broadway)\n\n*Lightweight application extensibility and composition with a twist of feature\nreflection.*\n\n## Example\n\n### app.js\n```js\nvar broadway = require(\"broadway\");\n\nvar app = new broadway.App();\n\n// Passes the second argument to `helloworld.attach`.\napp.use(require(\"./plugins/helloworld\"), { \"delimiter\": \"!\" } );\n\napp.init(function (err) {\n  if (err) {\n    console.log(err);\n  }\n});\n\napp.hello(\"world\");\n```\n\n### plugins/helloworld.js\n\n```js\n// `exports.attach` gets called by broadway on `app.use`\nexports.attach = function (options) {\n\n  this.hello = function (world) {\n    console.log(\"Hello \"+ world + options.delimiter || \".\");\n  };\n\n};\n\n// `exports.init` gets called by broadway on `app.init`.\nexports.init = function (done) {\n\n  // This plugin doesn't require any initialization step.\n  return done();\n\n};\n```\n\n### run it!\n\n```bash\njosh@onix:~/dev/broadway/examples$ node simple/app.js \nHello world!\njosh@onix:~/dev/broadway/examples$ \n```\n\n## Installation\n\n### Installing npm (node package manager)\n``` bash\n  $ curl http://npmjs.org/install.sh | sh\n```\n\n### Installing broadway\n``` bash \n  $ [sudo] npm install broadway\n```\n\n## API\n\n### App#init(callback)\n\nInitialize application and it's plugins, `callback` will be called with null or\ninitialization error as first argument.\n\n### App#use(plugin, options)\n\nAttach plugin to application. `plugin` should conform to following interface:\n\n```javascript\nvar plugin = {\n  \"name\": \"example-plugin\", // Plugin's name\n\n  \"attach\": function attach(options) {\n    // Called with plugin options once plugin attached to application\n    // `this` - is a reference to application\n  },\n\n  \"detach\": function detach() {\n    // Called when plugin detached from application\n    // (Only if plugin with same name was attached)\n    // `this` - is a reference to application\n  },\n\n  \"init\": function init(callback) {\n    // Called on application initialization\n    // App#init(callback) will be called once every plugin will call `callback`\n    // `this` - is a reference to application\n  }\n};\n```\n\n### App#on(event, callback) and App#emit(event, data)\n\nApp inherits from [EventEmitter2][2], and many plugins build on this\nfunctionality.\n\n#### Built-In Events:\n\n* `error:init`: Broadway emits this event when it throws an error while attempting to initialize.\n\nRead the [EventEmitter2][2] documentation for more information.\n\n## Tests\nAll tests are written with [vows][0] and should be run with [npm][1]:\n\n``` bash\n  $ npm test\n```\n\n#### [Charlie Robbins](http://nodejitsu.com)\n#### License: MIT\n\n[0]: http://vowsjs.org\n[1]: http://npmjs.org\n[2]: https://github.com/hij1nx/EventEmitter2\n"}},"maintainers":[{"name":"indexzero","email":"charlie.robbins@gmail.com"},{"name":"avianflu","email":"charlie@charlieistheman.com"}],"time":{"modified":"2012-07-31T22:45:20.646Z","created":"2011-11-09T15:41:44.236Z","0.1.0":"2011-11-09T15:41:45.769Z","0.1.1":"2011-11-28T19:57:17.003Z","0.1.2":"2011-12-02T09:46:07.951Z","0.1.3":"2011-12-06T09:49:40.177Z","0.1.4":"2011-12-09T07:17:50.375Z","0.1.5":"2011-12-23T03:27:16.876Z","0.1.6":"2012-01-15T09:06:39.167Z","0.1.7":"2012-01-18T04:23:40.951Z","0.1.8":"2012-01-23T01:19:02.620Z","0.1.9":"2012-02-08T11:28:32.966Z","0.1.10":"2012-02-09T02:10:16.679Z","0.1.11":"2012-02-23T02:07:27.159Z","0.1.13":"2012-03-02T22:09:02.553Z","0.1.14":"2012-03-21T00:09:41.479Z","0.1.15":"2012-05-06T01:48:00.908Z","0.2.0":"2012-05-23T14:08:45.766Z","0.2.1":"2012-06-08T07:51:31.311Z","0.2.3":"2012-07-08T07:06:56.343Z","0.2.4":"2012-07-10T05:53:35.885Z","0.2.5":"2012-07-10T07:34:43.410Z"},"author":{"name":"Nodejitsu Inc.","email":"info@nodejitsu.com"},"repository":{"type":"git","url":"git://github.com/flatiron/broadway.git"},"users":{"jesusabdullah":true,"blakmatrix":true},"_attachments":{"broadway-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-BCxEFLd7f51XIPUgNLrBCg==","length":13433,"stub":true},"broadway-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-0KVYByWm/XVh90g7sEiNtg==","length":13430,"stub":true},"broadway-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-sO4gi0gaE844EkDVCNRV4g==","length":13428,"stub":true},"broadway-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-7qAE/M+uRmWOkcNy1rs/Zg==","length":13426,"stub":true},"broadway-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-zpSZI+mJchMcHw8spo89wA==","length":13380,"stub":true},"broadway-0.1.15.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-fWuizoIq7o+BnGIKVTTjIw==","length":12610,"stub":true},"broadway-0.1.14.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-6Fqg+A0ryazcivMj7+L/aw==","length":13256,"stub":true},"broadway-0.1.13.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-QovhRMtlGjtpgPK03NiQgA==","length":13212,"stub":true},"broadway-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-GY7uGPFYbpa5r4TIzbydSw==","length":13248,"stub":true},"broadway-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-k2FDrCOoy0b4bp08QtzYug==","length":13200,"stub":true},"broadway-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-oFz07xksdZi5FD+dciV4gQ==","length":13189,"stub":true},"broadway-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-vtjUBviBt9mlEQtHyroyaA==","length":12458,"stub":true},"broadway-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-N3pFknOD/GP5rn4qteG8Qw==","length":20480,"stub":true},"broadway-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-rOLm4mLzn5/jLV+4tiTs8A==","length":20480,"stub":true},"broadway-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Vd3gFrRIRHYbL7mx2BUKjw==","length":20480,"stub":true},"broadway-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-4FKblcoeKvbLnNYYPJXbjw==","length":10240,"stub":true},"broadway-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-kZGLFzBY0o1dXGOLCtYctQ==","length":10240,"stub":true},"broadway-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-xWJRWIdKgny7IUlC1vjA7A==","length":10240,"stub":true},"broadway-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-xhvSFpuAaG8aUolQj+UgMg==","length":10240,"stub":true},"broadway-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oU5Z2yU8SU+a9LUbwtBw1Q==","length":10240,"stub":true}}}},
{"id":"broadway-jqtpl","key":"broadway-jqtpl","value":{"rev":"20-440cff79b659235e1ac24a5975a54f87"},"doc":{"_id":"broadway-jqtpl","_rev":"20-440cff79b659235e1ac24a5975a54f87","name":"broadway-jqtpl","description":"Plugin for flatiron/broadway for rendering with the jqtpl express view engine.","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"broadway-jqtpl","version":"0.1.0","main":"index","description":"Plugin for flatiron/broadway for rendering with the jqtpl express view engine.","keywords":["node","flatiron","broadway","jqtpl","html","render"],"author":{"name":"Tommy Messbauer","email":"tom.messbauer@gmail.com","url":"https://twitter.com/tommydudebreaux"},"license":"MIT","repository":{"type":"git","url":"git@github.com:tommydudebreaux/broadway-jqtpl.git"},"directories":{"tests":"tests"},"engines":{"node":">=0.6.0"},"scripts":{"test":"node /tests/example.js"},"dependencies":{"lodash":"*","jqtpl":"*"},"devDependencies":{"optimist":"*"},"optionalDependencies":{},"homepage":"http://vastdevblog.vast.com/","readme":"broadway-jqtpl\n==============\n\nPlugin for flatiron/broadway for rendering with the jqtpl express view engine.","_id":"broadway-jqtpl@0.1.0","dist":{"shasum":"5be520d65ebe2eb4c87323bba6d0eeddbe5c24bc","tarball":"http://registry.npmjs.org/broadway-jqtpl/-/broadway-jqtpl-0.1.0.tgz"},"maintainers":[{"name":"tommydudebreaux","email":"totally.bro@gmail.com"}]},"0.2.0":{"name":"broadway-jqtpl","version":"0.2.0","main":"index","description":"Plugin for flatiron/broadway for rendering with the jqtpl express view engine.","keywords":["node","flatiron","broadway","jqtpl","html","render"],"author":{"name":"Tommy Messbauer","email":"tom.messbauer@gmail.com","url":"https://twitter.com/tommydudebreaux"},"license":"MIT","repository":{"type":"git","url":"git@github.com:tommydudebreaux/broadway-jqtpl.git"},"directories":{"tests":"tests"},"engines":{"node":">=0.6.0"},"scripts":{"test":"node /tests/example.js"},"dependencies":{"lodash":"*","jqtpl":"*"},"devDependencies":{"optimist":"*"},"optionalDependencies":{},"homepage":"http://vastdevblog.vast.com/","readme":"broadway-jqtpl\n==============\n\nPlugin for flatiron/broadway for rendering with the jqtpl express view engine.","_id":"broadway-jqtpl@0.2.0","dist":{"shasum":"552989bce9096affd3da009f6c8bba8a624afe44","tarball":"http://registry.npmjs.org/broadway-jqtpl/-/broadway-jqtpl-0.2.0.tgz"},"maintainers":[{"name":"tommydudebreaux","email":"totally.bro@gmail.com"}]},"0.2.1":{"name":"broadway-jqtpl","version":"0.2.1","main":"index","description":"Plugin for flatiron/broadway for rendering with the jqtpl express view engine.","keywords":["node","flatiron","broadway","jqtpl","html","render"],"author":{"name":"Tommy Messbauer","email":"tom.messbauer@gmail.com","url":"https://twitter.com/tommydudebreaux"},"license":"MIT","repository":{"type":"git","url":"git@github.com:tommydudebreaux/broadway-jqtpl.git"},"directories":{"tests":"tests"},"engines":{"node":">=0.6.0"},"scripts":{"test":"node /tests/example.js"},"dependencies":{"lodash":"*","jqtpl":"*"},"devDependencies":{"optimist":"*"},"optionalDependencies":{},"homepage":"http://vastdevblog.vast.com/","readme":"broadway-jqtpl\n==============\n\nPlugin for flatiron/broadway for rendering with the jqtpl express view engine.","_id":"broadway-jqtpl@0.2.1","dist":{"shasum":"56de435d499cb05a9edbe9a44f747f61fb9a5fc7","tarball":"http://registry.npmjs.org/broadway-jqtpl/-/broadway-jqtpl-0.2.1.tgz"},"maintainers":[{"name":"tommydudebreaux","email":"totally.bro@gmail.com"}]}},"readme":"broadway-jqtpl\n==============\n\nPlugin for flatiron/broadway for rendering with the jqtpl express view engine.","maintainers":[{"name":"tommydudebreaux","email":"totally.bro@gmail.com"}],"time":{"modified":"2012-08-14T20:36:46.476Z","created":"2012-08-01T21:23:51.172Z","0.1.0":"2012-08-01T21:23:52.120Z","0.2.0":"2012-08-09T22:24:36.553Z","0.2.1":"2012-08-14T20:36:46.476Z"},"author":{"name":"Tommy Messbauer","email":"tom.messbauer@gmail.com","url":"https://twitter.com/tommydudebreaux"},"repository":{"type":"git","url":"git@github.com:tommydudebreaux/broadway-jqtpl.git"},"users":{"fgribreau":true},"_attachments":{"broadway-jqtpl-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-e8qnDUmJeU7Y+TxfnBDXWA==","length":1895,"stub":true},"broadway-jqtpl-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-eqPgksPzJlQ07g4CQH1FzQ==","length":1868,"stub":true},"broadway-jqtpl-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Pq9c5ZcW+MpwQbZdsOXobw==","length":1912,"stub":true}}}},
{"id":"broke","key":"broke","value":{"rev":"11-b382a39b4b15431c90789bf2b7cc6317"},"doc":{"_id":"broke","_rev":"11-b382a39b4b15431c90789bf2b7cc6317","name":"broke","description":"Vowsjs layer for flexible unit and integration tests.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"broke","version":"0.0.1","description":"Testing framework for functional unit tests and integration tests.","keywords":["testframework","unit tests","tests","integration tests"],"author":{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"},"contributors":[{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"}],"dependencies":{"logerize":">= 0.0.1","vows":">= 0.5.11"},"bin":{"broke":"./bin/broke"},"engines":{"node":">= 0.4.9"},"_npmUser":{"name":"zyndiecate","email":"tim.schindler@adcloud.com"},"_id":"broke@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"38b2b29ee978e552ba65ae5898a1e7cbd9e040cf","tarball":"http://registry.npmjs.org/broke/-/broke-0.0.1.tgz"},"maintainers":[{"name":"zyndiecate","email":"tim.schindler@adcloud.com"}]},"0.0.2":{"name":"broke","version":"0.0.2","description":"Vowsjs layer for flexible unit and integration tests.","keywords":["testframework","unit tests","tests","integration tests"],"author":{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"},"contributors":[{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"}],"dependencies":{"logerize":">= 0.0.1","vows":">= 0.5.11"},"bin":{"broke":"./bin/broke"},"engines":{"node":">= 0.4.9"},"_npmUser":{"name":"zyndiecate","email":"tim.schindler@adcloud.com"},"_id":"broke@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0f9780eeaf12e83e57f792bec1c8a43c03f96751","tarball":"http://registry.npmjs.org/broke/-/broke-0.0.2.tgz"},"maintainers":[{"name":"zyndiecate","email":"tim.schindler@adcloud.com"}]},"0.0.3":{"name":"broke","version":"0.0.3","description":"Vowsjs layer for flexible unit and integration tests.","keywords":["testframework","unit tests","tests","integration tests"],"author":{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"},"contributors":[{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"}],"dependencies":{"logerize":">= 0.0.1","vows":">= 0.5.11"},"bin":{"broke":"./bin/broke"},"engines":{"node":">= 0.4.9"},"_npmUser":{"name":"zyndiecate","email":"tim.schindler@adcloud.com"},"_id":"broke@0.0.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9f658ea7a43bef4a986699e972fa60ee22b14e68","tarball":"http://registry.npmjs.org/broke/-/broke-0.0.3.tgz"},"maintainers":[{"name":"zyndiecate","email":"tim.schindler@adcloud.com"}]},"0.0.4":{"name":"broke","version":"0.0.4","description":"Vowsjs layer for flexible unit and integration tests.","keywords":["testframework","unit tests","tests","integration tests"],"author":{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"},"contributors":[{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"}],"dependencies":{"logerize":">= 0.0.1","vows":">= 0.5.11"},"bin":{"broke":"./bin/broke"},"engines":{"node":">= 0.4.9"},"_npmUser":{"name":"zyndiecate","email":"tim.schindler@adcloud.com"},"_id":"broke@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5409a347901340ae69b9683df95bd1e0b48e2a2b","tarball":"http://registry.npmjs.org/broke/-/broke-0.0.4.tgz"},"maintainers":[{"name":"zyndiecate","email":"tim.schindler@adcloud.com"}]},"0.0.5":{"name":"broke","version":"0.0.5","description":"Vowsjs layer for flexible unit and integration tests.","keywords":["testframework","unit tests","tests","integration tests"],"author":{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"},"contributors":[{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"}],"dependencies":{"logerize":">= 0.0.1","vows":">= 0.5.11"},"bin":{"broke":"./bin/broke"},"engines":{"node":">= 0.4.9"},"_npmUser":{"name":"zyndiecate","email":"tim.schindler@adcloud.com"},"_id":"broke@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0d97d193540a136dc841793074353046b3452af5","tarball":"http://registry.npmjs.org/broke/-/broke-0.0.5.tgz"},"maintainers":[{"name":"zyndiecate","email":"tim.schindler@adcloud.com"}]}},"maintainers":[{"name":"zyndiecate","email":"tim.schindler@adcloud.com"}],"time":{"modified":"2011-12-07T18:08:45.138Z","created":"2011-12-03T21:06:52.748Z","0.0.1":"2011-12-03T21:06:55.394Z","0.0.2":"2011-12-05T22:40:12.397Z","0.0.3":"2011-12-05T23:01:55.751Z","0.0.4":"2011-12-07T17:55:15.221Z","0.0.5":"2011-12-07T18:08:45.138Z"},"author":{"name":"Tim Schindler","email":"tim.schindler@adcloud.com"},"_attachments":{"broke-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-DE+ZCbaVIq7G6GouWaOrOQ==","length":9608,"stub":true},"broke-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fw/GaJ33GgIZI7KIrLabiw==","length":9572,"stub":true},"broke-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-sgA+j3/8O6z+i+VtHtiFAQ==","length":9383,"stub":true},"broke-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Nffac1aSFZ+BJKlrnm1QNg==","length":9235,"stub":true},"broke-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yNialIkmKJZlgFQwSXABzQ==","length":4240,"stub":true}}}},
{"id":"brokenbin","key":"brokenbin","value":{"rev":"5-bbc7a1c9628ed9f49b6d23e80c242852"},"doc":{"_id":"brokenbin","_rev":"5-bbc7a1c9628ed9f49b6d23e80c242852","name":"brokenbin","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Andreas Lind Petersen","email":"andreas@one.com"},"name":"brokenbin","version":"0.0.1","repository":{"url":""},"engines":{"node":"~0.4.0"},"directories":{"bin":"bin"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/andreas/.npm/brokenbin/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brokenbin@0.0.1","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"binary1":"bin/binary1.js"},"dist":{"shasum":"9e747a65895f7cc80c8ee4ee1e4b6e0e579b3842","tarball":"http://registry.npmjs.org/brokenbin/-/brokenbin-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.2":{"author":{"name":"Andreas Lind Petersen","email":"andreas@one.com"},"name":"brokenbin","version":"0.0.2","repository":{"url":""},"engines":{"node":"~0.4.0"},"directories":{"bin":"bin"},"dependencies":{},"devDependencies":{},"_npmJsonOpts":{"file":"/home/andreas/.npm/brokenbin/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brokenbin@0.0.2","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11-pre","_defaultsLoaded":true,"bin":{"binary2":"bin/binary2.js"},"dist":{"shasum":"ef7f79dfd0c8ed71cc2d2f3f6b0345a7f9a7a5fa","tarball":"http://registry.npmjs.org/brokenbin/-/brokenbin-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]}},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2011-08-24T08:41:17.122Z","created":"2011-08-24T08:41:07.957Z","0.0.1":"2011-08-24T08:41:09.256Z","0.0.2":"2011-08-24T08:41:17.122Z"},"author":{"name":"Andreas Lind Petersen","email":"andreas@one.com"},"repository":{"url":""},"_attachments":{"brokenbin-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Fq2g6+8ZP9sLp6vFewivTw==","length":356,"stub":true},"brokenbin-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ArereWxeiZMoyS+DK67UUw==","length":356,"stub":true}}}},
{"id":"broker","key":"broker","value":{"rev":"9-756a097b948756e4bd7609b6f83a0847"},"doc":{"_id":"broker","_rev":"9-756a097b948756e4bd7609b6f83a0847","name":"broker","description":"A simple node.js broker for intermodule communication.","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"broker","description":"A simple node.js broker for intermodule communication.","version":"0.1.0","repository":{"type":"git","url":"git@github.com:tommedema/node-broker.git"},"author":{"name":"tmedema"},"main":"src/broker.js","directories":{"src":"src"},"engines":{"node":"*"},"_id":"broker@0.1.0","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"28497ce305b762a58e20cf87184b3fd6cd9a3683","tarball":"http://registry.npmjs.org/broker/-/broker-0.1.0.tgz"}},"0.1.1":{"name":"broker","description":"A simple node.js broker for intermodule communication.","version":"0.1.1","repository":{"type":"git","url":"git@github.com:tommedema/node-broker.git"},"author":{"name":"tmedema"},"main":"src/broker.js","directories":{"src":"src"},"engines":{"node":"*"},"_id":"broker@0.1.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d618fdf8ce1dade303b2d99441bed94a58685a78","tarball":"http://registry.npmjs.org/broker/-/broker-0.1.1.tgz"}},"0.1.2":{"name":"broker","description":"A simple node.js broker for intermodule communication.","version":"0.1.2","repository":{"type":"git","url":"git@github.com:tommedema/node-broker.git"},"author":{"name":"tmedema"},"main":"src/broker.js","directories":{"src":"src"},"engines":{"node":"*"},"_id":"broker@0.1.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2163bb1d51b600f24f46e9d9040e6fe875d69eca","tarball":"http://registry.npmjs.org/broker/-/broker-0.1.2.tgz"}},"0.1.3":{"name":"broker","description":"A simple node.js broker for intermodule communication.","version":"0.1.3","repository":{"type":"git","url":"git@github.com:tommedema/node-broker.git"},"author":{"name":"tmedema"},"main":"src/broker.js","directories":{"src":"src"},"engines":{"node":"*"},"_id":"broker@0.1.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.5","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b9fdad8b51604fc902299a4570c9a9c0a9ba371c","tarball":"http://registry.npmjs.org/broker/-/broker-0.1.3.tgz"}}},"maintainers":[{"name":"tmedema","email":"tommedema@gmail.com"}],"time":{"modified":"2011-05-21T17:12:05.936Z","created":"2011-05-16T13:12:52.621Z","0.1.0":"2011-05-16T13:12:53.191Z","0.1.1":"2011-05-16T13:25:47.492Z","0.1.2":"2011-05-16T20:31:13.992Z","0.1.3":"2011-05-21T17:12:05.936Z"},"author":{"name":"tmedema"},"repository":{"type":"git","url":"git@github.com:tommedema/node-broker.git"},"_attachments":{"broker-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-rjB0HznlHpKS/7Ds6Q+qWw==","length":5455,"stub":true},"broker-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-SToPv9pTvUj0N+Lei0bm5Q==","length":4289,"stub":true},"broker-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/uEg5SG3Z29awxjP/98qjA==","length":3170,"stub":true},"broker-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oJB9GVAs2V4a1o63VkAGLA==","length":3111,"stub":true}}}},
{"id":"bronson","key":"bronson","value":{"rev":"20-afa588f02b6c86f9417a1f198ba8dceb"},"doc":{"_id":"bronson","_rev":"20-afa588f02b6c86f9417a1f198ba8dceb","name":"bronson","description":"Bronson is a real time browser messaging framework with serverside integration.","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.1":{"name":"bronson","version":"0.0.1","dependencies":{"socket.io":"0.9.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"main":"bronson.js","_npmUser":{"name":"originate","email":"alex.david@origiante.com"},"_id":"bronson@0.0.1","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a956bb1f5becdfc29cabb219737395524c6316fe","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.1.tgz"},"readme":"","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.2":{"name":"bronson","version":"0.0.2","dependencies":{"socket.io":"0.9.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"main":"bronson.js","_npmUser":{"name":"originate","email":"alex.david@origiante.com"},"_id":"bronson@0.0.2","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"cdc0300178fdcab46902a67fe5d04eab1961c8af","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.2.tgz"},"readme":"","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.3":{"name":"bronson","version":"0.0.3","dependencies":{"socket.io":"0.9.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"main":"bronson.js","_npmUser":{"name":"originate","email":"alex.david@origiante.com"},"_id":"bronson@0.0.3","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b2bfc81ad70a2281bbf033dc7a1e84da91853857","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.3.tgz"},"readme":"","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.4":{"name":"bronson","version":"0.0.4","dependencies":{"socket.io":"0.9.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"main":"bronson.js","_npmUser":{"name":"originate","email":"alex.david@origiante.com"},"_id":"bronson@0.0.4","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"e940a1effb5087f2ba4e9d808247dc9e0bf67c3f","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.4.tgz"},"readme":"","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.5":{"name":"bronson","version":"0.0.5","dependencies":{"socket.io":"0.9.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"main":"bronson.js","_npmUser":{"name":"originate","email":"alex.david@origiante.com"},"_id":"bronson@0.0.5","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"fd7f82ded6b5e663702bacbf8d8f82a0dad23202","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.5.tgz"},"readme":"","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.6":{"name":"bronson","version":"0.0.6","dependencies":{"socket.io":"0.9.2"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"main":"lib/bronson.js","readme":"","_id":"bronson@0.0.6","dist":{"shasum":"982122c631083248cab0f441cf52cb9b686e1f72","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.6.tgz"},"maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.8":{"name":"bronson","version":"0.0.8","dependencies":{"socket.io":"0.9.2"},"devDependencies":{"mocha":"latest","coffee-script":"latest","chai":"latest","sinon":"latest","uglify-js":"latest"},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"main":"lib/bronson.js","readme":"# Browser ONline SynchrONization [![Build Status](https://secure.travis-ci.org/Originate-Inc/bronson.png)](http://travis-ci.org/#!/Originate-Inc/bronson)\n\nBronson is a real time cross-platform messaging framework for browsers as well as mobile and desktop applications. It is based on the popular Socket.IO platform.\n\n\n## Install\n```bash\nnpm install bronson\n```\n\n## Test\n```bash\nnpm test\n```\n\nYou can alternatively run tests automatically with guard:\n\n```bash\nguard\n```\n","_id":"bronson@0.0.8","dist":{"shasum":"fc7c6aa86c5c292aa00f6141ca0f04dd96e242a2","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.8.tgz"},"maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.9":{"name":"bronson","version":"0.0.9","dependencies":{"socket.io":"0.9.2"},"devDependencies":{"mocha":"latest","coffee-script":"latest","chai":"latest","sinon":"latest","uglify-js":"latest"},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"main":"lib/bronson.js","_npmUser":{"name":"originate","email":"alex.david@origiante.com"},"_id":"bronson@0.0.9","_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5d0772e876c9e5aa93985216007df7f3c704f2d5","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.9.tgz"},"readme":"# Browser ONline SynchrONization [![Build Status](https://secure.travis-ci.org/Originate-Inc/bronson.png)](http://travis-ci.org/#!/Originate-Inc/bronson)\n\nBronson is a real time cross-platform messaging framework for browsers as well as mobile and desktop applications. It is based on the popular Socket.IO platform.\n\n\n## Install\n```bash\nnpm install bronson\n```\n\n## Test\n```bash\nnpm test\n```\n\nYou can alternatively run tests automatically with guard:\n\n```bash\nguard\n```\n","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]},"0.0.10":{"name":"bronson","version":"0.0.10","dependencies":{"socket.io":"0.9.2"},"devDependencies":{"mocha":"latest","coffee-script":"latest","chai":"latest","sinon":"latest","sinon-chai":"latest","uglify-js":"latest"},"optionalDependencies":{},"engines":{"node":"*"},"author":{"name":"Alex David"},"description":"Bronson is a real time browser messaging framework with serverside integration.","homepage":"https://github.com/Originate-Inc/bronson","repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"scripts":{"test":"./node_modules/.bin/mocha --compilers coffee:coffee-script"},"main":"lib/bronson.js","readme":"# BRowser ONline SynchrONization [![Build Status](https://secure.travis-ci.org/Originate-Inc/bronson.png)](http://travis-ci.org/#!/Originate-Inc/bronson)\n\nBronson is a cross-platform real-time messaging framework for a variety of client platforms, including web browsers, native as well as HTML5 on mobile and desktop platforms. \nIt is based on Node.js and the popular [Socket.IO](http://socket.io) platform, and provides a way to broadcast arbitrary messages with data payloads to clients in a \"chat room\".\n\nBronson is developed by [Alex David](https://github.com/alexdavid) and [Kevin Goslar](https://github.com/kevgo) at [Originate Inc.](http://originate.com), and is in production use for a variety of internal and external projects.\n\n\n## Installation\n\n```bash\n$ npm install bronson\n```\n\n## Usage\n\n```CoffeeScript\nBronson = require '../..'\nbronson = new Bronson null\nbronson.listen app\n```\n\nUsage examples are given in the `examples` directory.\n\n\n## Development\n\nFork away and send us a pull request!\n\n\n### Run the unit tests\n```bash\n$ npm test\n```\n\nYou can alternatively run tests automatically with guard:\n\n```bash\n$ guard\n```\n","_id":"bronson@0.0.10","dist":{"shasum":"3fbc1454c5399a3b74fb1241a344f79ac5c39171","tarball":"http://registry.npmjs.org/bronson/-/bronson-0.0.10.tgz"},"maintainers":[{"name":"originate","email":"alex.david@origiante.com"}]}},"readme":"","maintainers":[{"name":"originate","email":"alex.david@origiante.com"}],"time":{"modified":"2012-08-04T04:17:58.917Z","created":"2012-07-24T03:09:19.206Z","0.0.1":"2012-07-24T03:09:20.563Z","0.0.2":"2012-07-24T03:37:16.688Z","0.0.3":"2012-07-25T00:55:02.196Z","0.0.4":"2012-07-25T02:43:41.635Z","0.0.5":"2012-07-25T02:50:57.160Z","0.0.6":"2012-07-31T01:37:58.017Z","0.0.8":"2012-08-02T03:33:34.657Z","0.0.9":"2012-08-03T02:53:45.360Z","0.0.10":"2012-08-04T04:17:58.917Z"},"author":{"name":"Alex David"},"repository":{"type":"git","url":"git://github.com/Originate-Inc/bronson.git"},"users":{"fgribreau":true},"_attachments":{"bronson-0.0.10.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-T/Q/MPrSoQHBba+3tRv9vg==","length":42132,"stub":true},"bronson-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-Ejg+KzxeSQOCAWXp6BqO7A==","length":45294,"stub":true},"bronson-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-6PgzetjxbgmftMCEgr8DKw==","length":44927,"stub":true},"bronson-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-AiAg0DVV0+CJsyk6OeTOvQ==","length":4642,"stub":true},"bronson-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-LlnKg8B4RozdKSMh22RwVw==","length":3648,"stub":true},"bronson-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6IsXzhyiwK89yXydX59yOQ==","length":3641,"stub":true},"bronson-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nvNz4cfa8Xk2bZGq4Ei8qw==","length":3636,"stub":true},"bronson-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/HTPRx0dTT2t5NQIeOvfwg==","length":3275,"stub":true},"bronson-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LsOBog6toFiIwgRNxx9mpA==","length":3274,"stub":true}}}},
{"id":"broom","key":"broom","value":{"rev":"47-d213f3374a7b7e7c9e4a3d471b2537a7"},"doc":{"_id":"broom","_rev":"47-d213f3374a7b7e7c9e4a3d471b2537a7","name":"broom","description":"Application level flow-control library","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.1","homepage":"https://github.com/bolgovr/node-flow-control","repository":{"type":"git","url":"git://github.com/bolgovr/node-flow-control.git"},"main":"index.js","engines":{"node":"~0.6.4"},"keywords":["control","flow","application"],"dependencies":{"async":"*","underscore":"*","vows":"*"},"devDependencies":{},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"83bbc8707f8a128e867278776c2ef71d6ab253a6","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.1.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.2","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"index.js","engines":{"node":"~0.6.4"},"keywords":["control","flow","application"],"dependencies":{"async":"*","underscore":"*","vows":"*"},"devDependencies":{},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ab2f2a700837d62995fc6b56340d96177311deba","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.2.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.0.3":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.3","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"index.js","engines":{"node":"~0.6.4"},"keywords":["control","flow","application"],"dependencies":{"async":"*","underscore":"*","vows":"*"},"devDependencies":{},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"f11aa58b62d4983e5a333c7780eb5219249e4b52","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.3.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.0.4":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.4","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"index.js","engines":{"node":"~0.6.4"},"keywords":["control","flow","application"],"dependencies":{"async":"*","underscore":"*","mocha":"*"},"devDependencies":{},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.4","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d5419fd1da3cb81e9d33b9e21482929b09ab5375","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.4.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.0.5":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.5","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"./lib/broom.js","engines":{"node":"~0.6.4"},"keywords":["control","flow","application"],"dependencies":{"async":"*","underscore":"*","mocha":"*"},"devDependencies":{},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"54b0f8ff27f5f57a004d860ff9952ee911996ad2","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.5.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.0.6":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.6","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"./lib/broom.js","engines":{"node":"~0.6.4"},"keywords":["control","flow","application"],"dependencies":{"async":"*","underscore":"*","mocha":"*"},"devDependencies":{},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"ca229fe4efe71898da3ee6d54128ac1de1511060","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.6.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.0.7":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.0.7","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"./lib/broom.js","engines":{"node":"~0.6.4"},"scripts":{"test":"make test"},"keywords":["control","flow","application"],"dependencies":{"async":"~0.1.21","underscore":"~1.3.3"},"devDependencies":{"mocha":"~1.0.3"},"_npmUser":{"name":"bolgovr","email":"bolgovr@gmail.com"},"_id":"broom@0.0.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"54d51c076b1649b7dd0ff4ebb5a463e72e1fed40","tarball":"http://registry.npmjs.org/broom/-/broom-0.0.7.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.1.0","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"./lib/broom.js","engines":{"node":"~0.8.0"},"scripts":{"test":"make test"},"keywords":["control","flow","application"],"dependencies":{"async":"~0.1.21","underscore":"~1.3.3"},"devDependencies":{"mocha":"~1.2.1"},"readme":"#Why?\nThis is yet another try to solve callback hell and 500+ LOC files. Split your codebase into small easy to test and maintain modules and feed it to Broom. It will run your code according\nto each module dependencies. Broom will handle parallel and sequental execution of your modules where it needed.\n[![Build Status](https://secure.travis-ci.org/bolgovr/broom.png)](http://travis-ci.org/bolgovr/broom)\n#How can I install it?\n\n`npm install broom`\n\n#How can I use it?\n\nassume you have directory structure like this:\n\n * app\n    * modules\n        * first\n            * index.js\n        * second\n            * index.js\n        * third\n            * index.js\n\n*yourapp.js*\n```javascript\n  var Broom = require('broom').broom;\n  var flow = new Broom({\n    'fileName': 'index.js', //Broom will hunt for only for files with this name, so you can put any other files in brooms module directory.\n    'dependenciesName': 'deps', //Broom will check this property for module dependencies\n    'entryName': 'onStart' //What function Broom should run\n  });\n  flow.setRootPath(__dirname); //pointing to modules root directory\n\n  flow.scan('./app/modules', function (err, done) { //path is relative to rootPath\n    if (!done) {\n      console.error('broom scan dirs completed with errors');\n      console.dir(err);\n      process.exit(1);\n    }\n  });\n\n  //then set root arguments, you can reach them with {'main': '/'} in deps property of your modules\n  flow.setRootArgs({'request': request, 'models': models}); //assume that we handling http request\n\n  //run it\n  flow.run(function (err, data) {\n    //if any module pass error as first parameter to callback - flow will stop immideately and call final callback\n\n    //you can reach results of your modules by path to index.js from Broom`s root\n    data['/first'];\n  });\n\n```\n\n###module example\n\n\n*first/index.js*\n```javascript\nvar MyFirstModule = function () {\n  this.deps = {\n    'main': '/',\n    'sec': '/second',\n    'third': '/third'\n  };\n  this.onStart = this.entryPoint.bind(this);\n};\nMyFirstModule.prototype.entryPoint = function (callback, data) {\n  //here you can access results of second/index.js with data.sec\n  callback(null, {});\n};\nmodule.exports = MyFirstModule;\n```\n*second/index.js*\n```javascript\nvar MySecondModule = function () {\n  this.deps = {\n    'main': '/'\n  };\n  this.onStart = this.entryPoint.bind(this);\n};\nMySecondModule.prototype.entryPoint = function (callback, data) {\n  //here you can access root args with data.main\n\n  setTimeout(function () { //all dependent modules will run only when you call callback with results\n    callback(null, {});\n  }, 1000);\n\n\n};\nmodule.exports = MySecondModule;\n```\n\n*third/index.js*\n```javascript\nvar MyThirdModule = function () {\n  this.deps = {\n    'main': '/'\n  };\n  this.onStart = this.entryPoint.bind(this);\n};\nMyThirdModule.prototype.entryPoint = function (callback, data) {\n  //here you can access root args with data.main\n  callback(null, {});\n};\nmodule.exports = MyThirdModule;\n```\n\nModules *second* and *third* will execute in parallel, and than *first* module will executed with results of *second* and *third* modules, after that final callback will be called with all results.\n\nIf any module pass error as it first parameter - Broom will stop and call final callback(passed to *run* function) with error\n\n#catching errors API\n\n###Broom.on('error', fn)\nsince 0.1.0 version Broom is [domain](http://nodejs.org/api/domain.html) instance, also every ```Broom.run```\ncall will return new domain instance. If any module passes error as it first parameter to callback or throw\nit  - domain will intercept it error.\n\n```javascript\n var flow = new Broom();\n flow.on('error', fn) //catch every error\n```\n```javascript\n  var flow = new Broom();\n  //etc\n  var d = flow.run(function (data) {});\n  d.on('error', fn) //related to this flow errors\n  d.dispose();\n```\n\n###Broom.testTree()\nvalidate all dependencies in execution tree, it will output to console all unresolved, circular dependencies and when module depends on itself situations.\n\n###Broom.debug\nif set to `true`, Broom will look for functions that executes more than Broom.timeLimit mseconds and output into console it's name and arguments.\n\n###Broom.timeLimit\nmax execution time in milliseconds for single function.\n\n\n#Licence\nMIT\n\n","_id":"broom@0.1.0","dist":{"shasum":"33be62b601ccb4655659ec685e73c3da70623765","tarball":"http://registry.npmjs.org/broom/-/broom-0.1.0.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"name":"broom","description":"Application level flow-control library","version":"0.1.1","homepage":"https://github.com/bolgovr/broom","repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"main":"./lib/broom.js","engines":{"node":"~0.8.0"},"scripts":{"test":"make test"},"keywords":["control","flow","application"],"dependencies":{"async":"~0.1.21","underscore":"~1.3.3"},"devDependencies":{"mocha":"~1.2.1"},"readme":"#Why?\nThis is yet another try to solve callback hell and 500+ LOC files. Split your codebase into small easy to test and maintain modules and feed it to Broom. It will run your code according\nto each module dependencies. Broom will handle parallel and sequental execution of your modules where it needed.\n[![Build Status](https://secure.travis-ci.org/bolgovr/broom.png)](http://travis-ci.org/bolgovr/broom)\n#How can I install it?\nIf you use node 0.6.x\n`npm install broom@0.0.7`\nIf you use node 0.8.x\n`npm install broom`\n\n#How can I use it?\n\nassume you have directory structure like this:\n\n * app\n    * modules\n        * first\n            * index.js\n        * second\n            * index.js\n        * third\n            * index.js\n\n*yourapp.js*\n```javascript\n  var Broom = require('broom').broom;\n  var flow = new Broom({\n    'fileName': 'index.js', //Broom will hunt for only for files with this name, so you can put any other files in brooms module directory.\n    'dependenciesName': 'deps', //Broom will check this property for module dependencies\n    'entryName': 'onStart' //What function Broom should run\n  });\n  flow.setRootPath(__dirname); //pointing to modules root directory\n\n  flow.scan('./app/modules', function (err, done) { //path is relative to rootPath\n    if (!done) {\n      console.error('broom scan dirs completed with errors');\n      console.dir(err);\n      process.exit(1);\n    }\n  });\n\n  //then set root arguments, you can reach them with {'main': '/'} in deps property of your modules\n  flow.setRootArgs({'request': request, 'models': models}); //assume that we handling http request\n\n  //run it\n  flow.run(function (err, data) {\n    //if any module pass error as first parameter to callback - flow will stop immideately and call final callback\n\n    //you can reach results of your modules by path to index.js from Broom`s root\n    data['/first'];\n  });\n\n```\n\n###module example\n\n\n*first/index.js*\n```javascript\nvar MyFirstModule = function () {\n  this.deps = {\n    'main': '/',\n    'sec': '/second',\n    'third': '/third'\n  };\n  this.onStart = this.entryPoint.bind(this);\n};\nMyFirstModule.prototype.entryPoint = function (callback, data) {\n  //here you can access results of second/index.js with data.sec\n  callback(null, {});\n};\nmodule.exports = MyFirstModule;\n```\n*second/index.js*\n```javascript\nvar MySecondModule = function () {\n  this.deps = {\n    'main': '/'\n  };\n  this.onStart = this.entryPoint.bind(this);\n};\nMySecondModule.prototype.entryPoint = function (callback, data) {\n  //here you can access root args with data.main\n\n  setTimeout(function () { //all dependent modules will run only when you call callback with results\n    callback(null, {});\n  }, 1000);\n\n\n};\nmodule.exports = MySecondModule;\n```\n\n*third/index.js*\n```javascript\nvar MyThirdModule = function () {\n  this.deps = {\n    'main': '/'\n  };\n  this.onStart = this.entryPoint.bind(this);\n};\nMyThirdModule.prototype.entryPoint = function (callback, data) {\n  //here you can access root args with data.main\n  callback(null, {});\n};\nmodule.exports = MyThirdModule;\n```\n\nModules *second* and *third* will execute in parallel, and than *first* module will executed with results of *second* and *third* modules, after that final callback will be called with all results.\n\nIf any module pass error as it first parameter - Broom will stop and call final callback(passed to *run* function) with error\n\n#catching errors API\n\n###Broom.testTree()\nvalidate all dependencies in execution tree, it will output to console all unresolved, circular dependencies and when module depends on itself situations.\n\n###Broom.debug\nif set to `true`, Broom will look for functions that executes more than Broom.timeLimit mseconds and output into console it's name and arguments.\n####Broom.beforeEach\nArray with functions that called before every module, all that function returns will passed to `Broom.afterEach` functions\n####Broom.afterEach\nArray with functions that called after every module with results that returned from beforeEach functions.\n####beforeEach and afterEach example\n\n```javascript\n  var flow = new Broom();\n  flow.debug = true;\n  flow.beforeEach.push(function (pathToModule, moduleArguments) {\n    return Date.now();\n  });\n  flow.afterEach.push(function (pathToModule, beforeEachArgs) {\n    console.log(pathToModule + ' executes ' + (Date.now() - beforeEachArgs[0]) + ' ms');\n  });\n```\n####Broom.timeLimit\nmax execution time in milliseconds for single function.\n\n\n#Licence\nMIT\n\n","_id":"broom@0.1.1","dist":{"shasum":"1b0adf3194ca0ee64e999d32ffa439918b3519f9","tarball":"http://registry.npmjs.org/broom/-/broom-0.1.1.tgz"},"maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}]}},"readme":"Why?\n=======\n\nTo prevent node.js devs from making applications with over 9k LOC in one file.\n\nInstallation\n=======\n  npm install broom\n\n\nHow can I use it?\n=======\n\n* Split your code into small pieces with single responsibility.\n* From each piece of code make module.\n* Name it.\n* Declare module dependencies.\n* Run broom\n\nExample:\n\n\tvar Broom = require('broom');\n\n\tvar flow = new Broom();\n\n\tflow.setRoot(__dirname);\n\n\tflow.registerPath('global', './dirWithModules', function () {\n            var user = {\n                 'login':'r00t',\n                    'password':'12345'\n             };\n    \t\tflow.run('global', function (callback) {\n    \t \t   callback(null, {'user':user});\n    \t\t}, function (err, data) {\n    \t \t   console.log(arguments);\n    \t\t});\n        });\n\n\nbroom.run method expect:\n\n* Declared namespace.\n* First function(to put in closure variables).\n* Last function which called when all done or any error occured(execution model build on top of async.auto).\n\nExample with express:\n\n\tvar Broom = require('broom');\n\tvar app = require('express').createServer();\n\tvar flow = new Broom();\n\n\tflow.setRoot(__dirname);\n\n\tflow.registerPath('global', './dirWithModules');\n\n\tapp.get('/path/:var1/var2', function (req, res) {\n  \t  flow.run('global', function (callback) {\n   \t     callback(null, {'req':req}); //any module can access to req params through data.start.req\n     }, function (err, data) {\n   \t if (err) {\n      \t  res.end('error'); //if any error occured - that function will be called immediately\n  \t  } else {\n     \t   res.end(data.renderHTML); //if you have module with name renderHTML and it passes rendered template in callback\n   \t }\n\t});\n\n\n\nModule example\n\n        var UserAuth = function () {\n            this.name = 'userAuthorization'; //name of the module\n            this.deps = ['start']; //dependency declaration\n            this.onStart = this.entryPoint.bind(this); //module start point\n        };\n        UserAuth.prototype.entryPoint = function (callback, data) { //method will be called when \"start\" function is done\n            var typicalUser = {\n                'login':'r00t',\n                'password':'12345'\n            };\n            var user = data.start.user || null;\n            if (user && user.password == typicalUser.password && user.login == typicalUser.login) {\n                callback(null, true);\n            } else {\n                callback(new Error('I dont know you'));\n            }\n        };\n\n\n        module.exports = UserAuth;\n\nFor more check out example.js and test folder\n\n\n\nTests\n=======\n    vows test/test.js\n\n\n\n\n\nLicence\n=======\nMIT\n","maintainers":[{"name":"bolgovr","email":"bolgovr@gmail.com"}],"time":{"modified":"2012-07-17T07:18:50.891Z","created":"2011-12-17T10:01:10.970Z","0.0.1":"2011-12-17T10:01:12.921Z","0.0.2":"2012-01-12T15:30:02.780Z","0.0.3":"2012-01-18T14:11:46.542Z","0.0.4":"2012-02-01T09:55:32.578Z","0.0.5":"2012-02-01T10:12:48.628Z","0.0.6":"2012-04-04T11:43:12.962Z","0.0.7":"2012-06-02T11:10:58.471Z","0.1.0":"2012-06-26T17:31:45.836Z","0.1.1":"2012-07-17T07:18:50.891Z"},"author":{"name":"Bolgov Roman","email":"bolgovr@gmail.com","url":"https://twitter.com/#!/rbolgov"},"repository":{"type":"git","url":"git://github.com/bolgovr/broom.git"},"_attachments":{"broom-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-PcFpF2fQIT7qDLAjZ/ORIg==","length":6071,"stub":true},"broom-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-VGn8tq7BZGYMPKm3TKK32w==","length":6055,"stub":true},"broom-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-HrtQyFgIzxzAfMyNHcEDKg==","length":4214,"stub":true},"broom-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-KFb0+e8urWULJbp3Q8VTQQ==","length":2741,"stub":true},"broom-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-k4aGwKgAUhRGbz31KUz73A==","length":2480,"stub":true},"broom-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-YsoLH0iVQVQ18h9b5rs3ug==","length":2481,"stub":true},"broom-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-2LbeTWa0SwT4WJW4Y4oFkQ==","length":5178,"stub":true},"broom-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zkCEt+w8hW+HLXsF205CiQ==","length":5104,"stub":true},"broom-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PameqPA1c0Xg1phWR+oxJQ==","length":10240,"stub":true}}}},
{"id":"broomstick","key":"broomstick","value":{"rev":"15-961ceaa23a06f624621cce2588500b30"},"doc":{"_id":"broomstick","_rev":"15-961ceaa23a06f624621cce2588500b30","name":"broomstick","description":"Lightweight streaming and in-memory caching static file middleware for Director","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"broomstick","description":"Lightweight streaming and in-memory caching static file middleware for Director","version":"0.0.0","repository":{"type":"git","url":"git://github.com/ecto/broomstick.git"},"main":"broomstick.js","engines":{"node":"*"},"dependencies":{"colors":"*","mime":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"broomstick@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"dc7d884c8123d2a65dd43c068fc210a5002c8314","tarball":"http://registry.npmjs.org/broomstick/-/broomstick-0.0.0.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.0.1":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"broomstick","description":"Lightweight streaming and in-memory caching static file middleware for Director","version":"0.0.1","repository":{"type":"git","url":"git://github.com/ecto/broomstick.git"},"main":"broomstick.js","engines":{"node":"*"},"dependencies":{"colors":"*","mime":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"broomstick@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"26de44b3a7c9b963cf8ff4669aec81b81ae03f63","tarball":"http://registry.npmjs.org/broomstick/-/broomstick-0.0.1.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"directories":{}},"0.0.2":{"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"name":"broomstick","description":"Lightweight streaming and in-memory caching static file middleware for Director","version":"0.0.2","repository":{"type":"git","url":"git://github.com/ecto/broomstick.git"},"main":"broomstick.js","engines":{"node":"*"},"dependencies":{"colors":"*","mime":"*"},"devDependencies":{},"_npmUser":{"name":"ecto","email":"diffference@gmail.com"},"_id":"broomstick@0.0.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a409f79308c2a08e0468f8f4dded37db1a77ea6b","tarball":"http://registry.npmjs.org/broomstick/-/broomstick-0.0.2.tgz"},"maintainers":[{"name":"ecto","email":"diffference@gmail.com"}]}},"readme":"#broomstick\n\nLightweight streaming and in-memory caching static file middleware for Director\n\n![broomstick](http://i.imgur.com/B2UpG.jpg)\n\n##install\n\n    npm install broomstick\n\n##usage\n\n````javascript\nvar director = require('director'),\n    broomstick = require('broomstick'),\n    router = new director.http.Router();\n\nvar broom = new broomstick({ path: 'public' });\n\nrouter.get('*', broom);\nrouter.get('/', broom);\n\nvar server = http.createServer(router.dispatch);\n\nserver.listen(8080);\n````\n\n##configuration\n\nWhen creating a `new broomstick()` object, you can specify options. These are the defaults:\n\n````javascript\nvar broom = new broomstick({\n  path: 'public',\n  verbose: false,\n  index: 'index.html' // default file to load on ./ paths\n});\n````\n\n##license\n\n(The MIT License)\n\nCopyright (c) 2011 Cam Pedersen <cam@onswipe.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"ecto","email":"diffference@gmail.com"}],"time":{"modified":"2012-01-13T00:09:05.556Z","created":"2012-01-12T18:06:36.867Z","0.0.0":"2012-01-12T18:06:37.248Z","0.0.1":"2012-01-12T18:31:29.737Z","0.0.2":"2012-01-13T00:09:05.556Z"},"author":{"name":"Cam Pedersen","email":"diffference@gmail.com","url":"http://campedersen.com/"},"repository":{"type":"git","url":"git://github.com/ecto/broomstick.git"},"_attachments":{"broomstick-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-0x0TdPc1E7k7ueHqZl5hEg==","length":10240,"stub":true},"broomstick-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RLQFoa6g8wK6Z9tKJR9dUA==","length":10240,"stub":true},"broomstick-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GWBBPrwt5uJnH0BLuiaGuw==","length":10240,"stub":true}}}},
{"id":"brow","key":"brow","value":{"rev":"11-4878e87edfa553ec1695c5f667055794"},"doc":{"_id":"brow","_rev":"11-4878e87edfa553ec1695c5f667055794","name":"brow","description":"෴ A browserver proxy for node.js ෴","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.0":{"name":"brow","version":"0.0.0","description":"Coming soon...","main":"server.js","repository":{"type":"git","url":"git://github.com/jed/browserver.git"},"author":{"name":"Jed Schmidt"},"license":"BSD","scripts":{"start":"node server.js"},"readme":"browserver\n==========\n\nComing soon...","_id":"brow@0.0.0","dist":{"shasum":"91ab38c4cebede3c7fdacb70befb75eb6582df12","tarball":"http://registry.npmjs.org/brow/-/brow-0.0.0.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.0.1":{"name":"brow","version":"0.0.1","description":"෴ A browserver proxy for node.js ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-node.git"},"keywords":["websocket","http","server","browser","webhook"],"author":{"name":"Jed Schmidt"},"license":"BSD","dependencies":{"brow-client":"0.0.x"},"devDependencies":{"ws":"~0.4.21","tap":"~0.3.0"},"scripts":{"test":"tap --tap test/server.js"},"readme":"browserver-node\n===============\n\n෴ A browserver proxy for node.js ෴\n","_id":"brow@0.0.1","dist":{"shasum":"51f218dfe90ddfbff55584c6d309cd30b80fba96","tarball":"http://registry.npmjs.org/brow/-/brow-0.0.1.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.0.2":{"name":"brow","version":"0.0.2","description":"෴ A browserver proxy for node.js ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-node.git"},"keywords":["websocket","http","server","browser","webhook"],"author":{"name":"Jed Schmidt"},"license":"BSD","dependencies":{"brow-client":"0.0.x"},"devDependencies":{"ws":"~0.4.21","tap":"~0.3.0"},"scripts":{"test":"tap --tap test/server.js"},"readme":"෴ browserver-node ෴\n======================\n\nThis is a [browserver](http://browserver.org) proxy for [node.js](http://nodejs.org).\n\nUse browserver-node to create servers that act as a two-way proxies between an HTTP server and a WebSocket server, by\n\n- forwarding incoming HTTP requests on to WebSocket connected clients, and back.\n- forwarding incoming WebSocket messages to other HTTP servers, and back.\n\nThis library, along with [browserver-client](https://github.com/jed/browserver-client), is all the code you need to set up your own browserver.\n\nExample\n-------\n\n```javascript\n// http, websocket, and browservers\nvar http   = require(\"http\")\nvar engine = require(\"engine.io\")\nvar brow   = require(\"brow\")\n\nfunction handler(req, res) {\n  // your usual HTTP server logic\n}\n\n// instantiate http and websocket servers\nvar httpServer = http.createServer(handler)\nvar wsServer   = engine.attach(httpServer)\n\n// pass each to a new browserver...\nvar browServer = new brow.Server({\n  http: httpServer,\n  ws: wsServer,\n  host: \"*.mydomain.org\"\n})\n\n// ... and start listening!\nhttpServer.listen(80, function() {\n  // wait for incoming/outgoing browser connections...\n})\n```\n\nInstallation\n------------\n\nbrowserver is available through npm.\n\n`npm install brow`\n\nAPI\n---\n\n### browserver = new brow.Server(options)\n\nThis joins a WebSocket server and HTTP server, returning a new browserver instance. The `options` argument accepts the following properties:\n\n- `ws`: Required. Must be an instance of a WebSocket server (such as [ws](https://github.com/einaros/ws)) or compatible shim (such as [socket.io](https://github.com/learnboost/socket.io), [engine.io](https://github.com/learnboost/engine.io)) that emits socket instances through `connection` events.\n\n- `http`: Optional. If specified, must be an instance of `http.Server`. If omitted, an instance will be instantiated and bound to port `3572` (the Unicode codepoint for the brow `෴`).\n\n- `host` Optional. If specified, must be a string containing one and only one asterisk (`*`), which is replaced with a socket id when a WebSocket connection is established. Note that this means you will need a wildcard CNAME or A record in your DNS settings that resolves to the appropriate domain or IP address. If omitted, CloudFoundry's [*.vcap.me](https://github.com/cloudfoundry/vcap/) domain is used, which resolves all domains/subdomains to `127.0.0.1`.\n\n### browserver.on(\"connection\", function(client){ ... })\n\nThe browserver server emits a `connection` event with a WebSocket-connected browserver client, whenever one connects. Each client is an instance of `brow.Client`, with an `id` property that defaults to a random lowercase alphanumeric string generated upon instantiation. How these ids are generated can be customized by overriding the static `brow.Client.id` method.\n\n### client.on(\"close\", function(){ ... })\n\nbrowserver clients emit a `close` event when their underlying WebSocket is closed.\n\nTODO\n----\n\n- Add integrated hooks for authorization and authentication of requests, both incoming and outgoing.\n- Finish filling out phantomjs tests, and put them on travis-ci.\n- Consider using the standard HTTP format instead of JSON for communication.\n","_id":"brow@0.0.2","dist":{"shasum":"c0ec2dbcea240d54330add93e7125346ed4600e5","tarball":"http://registry.npmjs.org/brow/-/brow-0.0.2.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.0.3":{"name":"brow","version":"0.0.3","description":"෴ A browserver proxy for node.js ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-node.git"},"keywords":["websocket","http","server","browser","webhook"],"author":{"name":"Jed Schmidt"},"license":"BSD","dependencies":{"brow-client":"0.0.x"},"devDependencies":{"ws":"~0.4.21","tap":"~0.3.0"},"scripts":{"test":"tap --tap test/server.js"},"readme":"෴ browserver-node ෴\n======================\n\nThis is a [browserver](http://browserver.org) proxy for [node.js](http://nodejs.org).\n\nUse browserver-node to create servers that act as a two-way proxies between an HTTP server and a WebSocket server, by\n\n- forwarding incoming HTTP requests on to WebSocket connected clients, and back.\n- forwarding incoming WebSocket messages to other HTTP servers, and back.\n\nThis library, along with [browserver-client](https://github.com/jed/browserver-client), is all the code you need to set up your own browserver.\n\nExample\n-------\n\n```javascript\n// http, websocket, and browservers\nvar http   = require(\"http\")\nvar engine = require(\"engine.io\")\nvar brow   = require(\"brow\")\n\nfunction handler(req, res) {\n  // your usual HTTP server logic\n}\n\n// instantiate http and websocket servers\nvar httpServer = http.createServer(handler)\nvar wsServer   = engine.attach(httpServer)\n\n// pass each to a new browserver...\nvar browServer = new brow.Server({\n  http: httpServer,\n  ws: wsServer,\n  host: \"*.mydomain.org\"\n})\n\n// ... and start listening!\nhttpServer.listen(80, function() {\n  // wait for incoming/outgoing browser connections...\n})\n```\n\nInstallation\n------------\n\nbrowserver is available through npm.\n\n`npm install brow`\n\nAPI\n---\n\n### browserver = new brow.Server(options)\n\nThis joins a WebSocket server and HTTP server, returning a new browserver instance. The `options` argument accepts the following properties:\n\n- `ws`: Required. Must be an instance of a WebSocket server (such as [ws](https://github.com/einaros/ws)) or compatible shim (such as [socket.io](https://github.com/learnboost/socket.io), [engine.io](https://github.com/learnboost/engine.io)) that emits socket instances through `connection` events.\n\n- `http`: Optional. If specified, must be an instance of `http.Server`. If omitted, an instance will be instantiated and bound to port `3572` (the Unicode codepoint for the brow `෴`).\n\n- `host` Optional. If specified, must be a string containing one and only one asterisk (`*`), which is replaced with a socket id when a WebSocket connection is established. Note that this means you will need a wildcard CNAME or A record in your DNS settings that resolves to the appropriate domain or IP address. If omitted, CloudFoundry's [*.vcap.me](https://github.com/cloudfoundry/vcap/) domain is used, which resolves all domains/subdomains to `127.0.0.1`.\n\n### browserver.on(\"connection\", function(client){ ... })\n\nThe browserver server emits a `connection` event with a WebSocket-connected browserver client, whenever one connects. Each client is an instance of `brow.Client`, with an `id` property that defaults to a random lowercase alphanumeric string generated upon instantiation. How these ids are generated can be customized by overriding the static `brow.Client.id` method.\n\n### client.on(\"close\", function(){ ... })\n\nbrowserver clients emit a `close` event when their underlying WebSocket is closed.\n\nTODO\n----\n\n- Add integrated hooks for authorization and authentication of requests, both incoming and outgoing.\n- Finish filling out phantomjs tests, and put them on travis-ci.\n- Consider using the standard HTTP format instead of JSON for communication.\n","_id":"brow@0.0.3","dist":{"shasum":"f8648207d7eace71d13796dab4b7d95055426b9a","tarball":"http://registry.npmjs.org/brow/-/brow-0.0.3.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.0.4":{"name":"brow","version":"0.0.4","description":"෴ A browserver proxy for node.js ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-node.git"},"keywords":["websocket","http","server","browser","webhook"],"author":{"name":"Jed Schmidt"},"license":"BSD","dependencies":{"brow-client":"*"},"devDependencies":{"ws":"~0.4.21","mocha":"~1.3.2"},"scripts":{"test":"mocha test/server.js"},"readme":"෴ browserver-node ෴\n======================\n\n[![Build Status](https://secure.travis-ci.org/jed/browserver-node.png?branch=master)](http://travis-ci.org/jed/browserver-node)\n\nThis is a [browserver](http://browserver.org) proxy for [node.js](http://nodejs.org).\n\nUse browserver-node to create servers that act as a two-way proxies between an HTTP server and a WebSocket server, by\n\n- forwarding incoming HTTP requests on to WebSocket connected clients, and back.\n- forwarding incoming WebSocket messages to other HTTP servers, and back.\n\nThis library, along with [browserver-client](https://github.com/jed/browserver-client), is all the code you need to set up your own browserver.\n\nExample\n-------\n\n```javascript\n// http, websocket, and browservers\nvar http   = require(\"http\")\nvar engine = require(\"engine.io\")\nvar brow   = require(\"brow\")\n\nfunction handler(req, res) {\n  // your usual HTTP server logic\n}\n\n// instantiate http and websocket servers\nvar httpServer = http.createServer(handler)\nvar wsServer   = engine.attach(httpServer)\n\n// pass each to a new browserver...\nvar browServer = new brow.Server({\n  http: httpServer,\n  ws: wsServer,\n  host: \"*.mydomain.org\"\n})\n\n// ... and start listening!\nhttpServer.listen(80, function() {\n  // wait for incoming/outgoing browser connections...\n})\n```\n\nInstallation\n------------\n\nbrowserver is available through npm.\n\n`npm install brow`\n\nAPI\n---\n\n### browserver = new brow.Server(options)\n\nThis joins a WebSocket server and HTTP server, returning a new browserver instance. The `options` argument accepts the following properties:\n\n- `ws`: Required. Must be an instance of a WebSocket server (such as [ws](https://github.com/einaros/ws)) or compatible shim (such as [socket.io](https://github.com/learnboost/socket.io), [engine.io](https://github.com/learnboost/engine.io)) that emits socket instances through `connection` events.\n\n- `http`: Optional. If specified, must be an instance of `http.Server`. If omitted, an instance will be instantiated and bound to port `3572` (the Unicode codepoint for the brow `෴`).\n\n- `host` Optional. If specified, must be a string containing one and only one asterisk (`*`), which is replaced with a socket id when a WebSocket connection is established. Note that this means you will need a wildcard CNAME or A record in your DNS settings that resolves to the appropriate domain or IP address. If omitted, CloudFoundry's [*.vcap.me](https://github.com/cloudfoundry/vcap/) domain is used, which resolves all domains/subdomains to `127.0.0.1`.\n\n### browserver.on(\"connection\", function(client){ ... })\n\nThe browserver server emits a `connection` event with a WebSocket-connected browserver client, whenever one connects. Each client is an instance of `brow.Client`, with an `id` property that defaults to a random lowercase alphanumeric string generated upon instantiation. How these ids are generated can be customized by overriding the static `brow.Client.id` method.\n\n### client.on(\"close\", function(){ ... })\n\nbrowserver clients emit a `close` event when their underlying WebSocket is closed.\n\nTODO\n----\n\n- Add integrated hooks for authorization and authentication of requests, both incoming and outgoing.\n","_id":"brow@0.0.4","dist":{"shasum":"5ee2df07ba6f4814a973e6ce575a831744fd8168","tarball":"http://registry.npmjs.org/brow/-/brow-0.0.4.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]}},"readme":"browserver\n==========\n\nComing soon...","maintainers":[{"name":"jed","email":"tr@nslator.jp"}],"time":{"modified":"2012-08-14T13:08:34.733Z","created":"2012-08-05T11:43:11.931Z","0.0.0":"2012-08-05T11:43:16.633Z","0.0.1":"2012-08-08T00:20:57.458Z","0.0.2":"2012-08-10T17:09:30.290Z","0.0.3":"2012-08-10T17:42:07.196Z","0.0.4":"2012-08-14T13:08:34.733Z"},"author":{"name":"Jed Schmidt"},"repository":{"type":"git","url":"git://github.com/jed/browserver-node.git"},"_attachments":{"brow-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9SWUFLat6Uu1O+XqaHlJiQ==","length":4911,"stub":true},"brow-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-EHnGWipijTwGGjnBZxsPCw==","length":4465,"stub":true},"brow-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pFMue3QOuXbbxbKpE9kFAQ==","length":4454,"stub":true},"brow-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0lxJeTwNxF+vwfEc8rK5yQ==","length":3123,"stub":true},"brow-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-h+UExAN1Nl1Wu5NcN5ZSGg==","length":463,"stub":true}}}},
{"id":"brow-client","key":"brow-client","value":{"rev":"8-ed8ab43beaea88a0b715713ec4ac28d6"},"doc":{"_id":"brow-client","_rev":"8-ed8ab43beaea88a0b715713ec4ac28d6","name":"brow-client","description":"෴ A node.js HTTP server in your browser ෴","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"brow-client","version":"0.0.1","description":"෴ A node.js HTTP server in your browser ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-client.git"},"author":{"name":"Jed Schmidt"},"license":"BSD","readme":"browserver-client\n=================\n\n෴ A node.js HTTP server in your browser ෴","_id":"brow-client@0.0.1","dist":{"shasum":"f14eba765eac45882da1ed3b51a7c62b519430b4","tarball":"http://registry.npmjs.org/brow-client/-/brow-client-0.0.1.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.0.2":{"name":"brow-client","version":"0.0.2","description":"෴ A node.js HTTP server in your browser ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-client.git"},"author":{"name":"Jed Schmidt"},"license":"BSD","readme":"෴ browserver-client ෴\n========================\n\nThis is a [browserver](http://browserver.org) client, for the browser.\n\nbrowserver-client exposes the important bits of the [node.js](http://nodejs.org) [http API](http://nodejs.org/docs/latest/api/all.html#all_http) in the browser, allowing it to receive incoming HTTP requests and make outgoing HTTP requests via WebSockets.\n\nThis library, along with [browserver-node](https://github.com/jed/browserver-node), is all the code you need to set up your own browserver.\n\nExample\n-------\n\nIn `index.html`:\n\n```html\n<!doctype html>\n<html>\n  <head>\n    <title>My Browserver App</title>\n    <script src=\"/path/to/websocket-shim\"></script>\n    <script src=\"/path/to/browserver\"></script>\n    <script src=\"/app.js\"></script>\n  </head>\n</html>\n```\n\nIn `app.js`:\n\n```javascript\n// to handle incoming HTTP requests,\n// use the standard node.js http.Server API\nvar server = http.createServer(function(req, res) {\n  if (req.method != \"GET\") {\n    res.writeHead(405, {\"Content-Type\": \"text/plain\"})\n    return res.end(\"Method not allowed\")\n  }\n\n  var pathname = req.url.split(\"?\")[0]\n\n  if (pathname != \"/hello\") {\n    res.writeHead(404, {\"Content-Type\": \"text/plain\"})\n    return res.end(\"Not found.\")\n  }\n\n  res.writeHead(200, {\"Content-Type\": \"text/plain\"})\n  res.end(\"Hello, world!\")\n})\n\n// establish a WebSocket (or compatible) connection,\n// in this case using engine.io\nvar ws = new eio.Socket({host: \"myserver.com\"})\n\n// bind the browserver HTTP server to the WebSocket\n// and wait for connections from the browserver proxy!\nserver.listen(ws)\n\n// to make outgoing HTTP requests w/o cross-domain issues,\n// use http.get or http.request\nhttp.get(\"http://www.google.com/index.html\", function(res) {\n  console.log(\"Google answered back!\")\n})\n```\n\nAPI\n---\n\nThe browserver-client API is basically a port of the node.js [http API](http://nodejs.org/docs/latest/api/all.html#all_http), with a few caveats:\n\n- Streaming is not supported. This means a `ServerRequest` or `ClientResponse` will only emit one `data` event, and that multiple calls to the `write` method of a `ServerResponse` or `ClientRequest` will be buffered locally and sent when `end` is called. The `data` events are provided for compatibility, but aren't technically needed, since the body itself is stored on the `body` property of the `ServerRequest` or `ClientResponse`.\n\n- The aspects of the node.js implementation that don't map well to the browser (such as `writeContinue` and `addTrailers` methods, and client agents) have been omitted.\n\nOtherwise, if there is a method or behavior that differs from what you'd expect on node.js, please [file an issue](https://github.com/jed/browser-client/issues).\n\nTODO\n----\n\n- Include more client tests in the phantomjs tests run for [browserver-node](https://github.com/jed/browserver-node)\n- Make an exhaustive list of the HTTP APIs supported and not supported.\n- Consider enabling support for `addEventListener` events.\n","_id":"brow-client@0.0.2","dist":{"shasum":"a9360551a231602216c0f01286c1565525aff477","tarball":"http://registry.npmjs.org/brow-client/-/brow-client-0.0.2.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]},"0.0.3":{"name":"brow-client","version":"0.0.3","description":"෴ A node.js HTTP server in your browser ෴","main":"browserver.js","repository":{"type":"git","url":"git://github.com/jed/browserver-client.git"},"author":{"name":"Jed Schmidt"},"license":"BSD","readme":"෴ browserver-client ෴\n========================\n\nThis is a [browserver](http://browserver.org) client, for the browser.\n\nbrowserver-client exposes the important bits of the [node.js](http://nodejs.org) [http API](http://nodejs.org/docs/latest/api/all.html#all_http) in the browser, allowing it to receive incoming HTTP requests and make outgoing HTTP requests via WebSockets.\n\nThis library, along with [browserver-node](https://github.com/jed/browserver-node), is all the code you need to set up your own browserver.\n\nExample\n-------\n\nIn `index.html`:\n\n```html\n<!doctype html>\n<html>\n  <head>\n    <title>My Browserver App</title>\n    <script src=\"/path/to/websocket-shim\"></script>\n    <script src=\"/path/to/browserver\"></script>\n    <script src=\"/app.js\"></script>\n  </head>\n</html>\n```\n\nIn `app.js`:\n\n```javascript\n// to handle incoming HTTP requests,\n// use the standard node.js http.Server API\nvar server = http.createServer(function(req, res) {\n  if (req.method != \"GET\") {\n    res.writeHead(405, {\"Content-Type\": \"text/plain\"})\n    return res.end(\"Method not allowed\")\n  }\n\n  var pathname = req.url.split(\"?\")[0]\n\n  if (pathname != \"/hello\") {\n    res.writeHead(404, {\"Content-Type\": \"text/plain\"})\n    return res.end(\"Not found.\")\n  }\n\n  res.writeHead(200, {\"Content-Type\": \"text/plain\"})\n  res.end(\"Hello, world!\")\n})\n\n// establish a WebSocket (or compatible) connection,\n// in this case using engine.io\nvar ws = new eio.Socket({host: \"myserver.com\"})\n\n// bind the browserver HTTP server to the WebSocket\n// and wait for connections from the browserver proxy!\nserver.listen(ws)\n\n// to make outgoing HTTP requests w/o cross-domain issues,\n// use http.get or http.request\nhttp.get(\"http://www.google.com/index.html\", function(res) {\n  console.log(\"Google answered back!\")\n})\n```\n\nAPI\n---\n\nThe browserver-client API is basically a port of the node.js [http API](http://nodejs.org/docs/latest/api/all.html#all_http), with a few caveats:\n\n- Streaming is not supported. This means a `ServerRequest` or `ClientResponse` will only emit one `data` event, and that multiple calls to the `write` method of a `ServerResponse` or `ClientRequest` will be buffered locally and sent when `end` is called. The `data` events are provided for compatibility, but aren't technically needed, since the body itself is stored on the `body` property of the `ServerRequest` or `ClientResponse`.\n\n- The aspects of the node.js implementation that don't map well to the browser (such as `writeContinue` and `addTrailers` methods, and client agents) have been omitted.\n\nOtherwise, if there is a method or behavior that differs from what you'd expect on node.js, please [file an issue](https://github.com/jed/browser-client/issues).\n\nTODO\n----\n\n- Include more client tests in the phantomjs tests run for [browserver-node](https://github.com/jed/browserver-node)\n- Make an exhaustive list of the HTTP APIs supported and not supported.\n- Consider enabling support for `addEventListener` events.\n","_id":"brow-client@0.0.3","dist":{"shasum":"4866b5f73d8b8f63ec27fe1283ba6149fca31df6","tarball":"http://registry.npmjs.org/brow-client/-/brow-client-0.0.3.tgz"},"maintainers":[{"name":"jed","email":"tr@nslator.jp"}]}},"readme":"browserver-client\n=================\n\n෴ A node.js HTTP server in your browser ෴","maintainers":[{"name":"jed","email":"tr@nslator.jp"}],"time":{"modified":"2012-08-14T13:08:36.842Z","created":"2012-08-08T00:21:32.096Z","0.0.1":"2012-08-08T00:21:35.842Z","0.0.2":"2012-08-10T17:09:40.085Z","0.0.3":"2012-08-14T13:08:36.842Z"},"author":{"name":"Jed Schmidt"},"repository":{"type":"git","url":"git://github.com/jed/browserver-client.git"},"users":{"sjonnet19":true},"_attachments":{"brow-client-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-8Vj++ErFqMc7hwiGXLi4jg==","length":3711,"stub":true},"brow-client-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WQfxZqtTcV18+Q8ZooBQrQ==","length":3412,"stub":true},"brow-client-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6dezOMowTBjO+fAxlXYPyw==","length":2201,"stub":true}}}},
{"id":"browscap","key":"browscap","value":{"rev":"12-c6fed16796d1ad84913f2617c66f0c7b"},"doc":{"_id":"browscap","_rev":"12-c6fed16796d1ad84913f2617c66f0c7b","name":"browscap","description":"PHP's get_browser/browscap.ini for Node","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"browscap","description":"PHP's get_browser/browscap.ini for Node","version":"0.1.0","author":{"name":"Dan Grossman"},"repository":{"type":"git","url":"http://github.com/dangrossman/node-browscap.git"},"bugs":{"web":"http://github.com/dangrossman/node-browscap/issues"},"bin":{"browscap":"./browscap.js"},"main":"browscap","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://github.com/dangrossman/node-browscap/README.markdown"}],"_id":"browscap@0.1.0","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/browscap/-/browscap-0.1.0.tgz"}},"0.1.1":{"name":"browscap","description":"PHP's get_browser/browscap.ini for Node","version":"0.1.1","author":{"name":"Dan Grossman"},"repository":{"type":"git","url":"http://github.com/dangrossman/node-browscap.git"},"bugs":{"web":"http://github.com/dangrossman/node-browscap/issues"},"bin":{"browscap":"./browscap.js"},"main":"browscap","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://github.com/dangrossman/node-browscap/README.markdown"}],"_id":"browscap@0.1.1","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/browscap/-/browscap-0.1.1.tgz"}},"0.1.2":{"name":"browscap","description":"PHP's get_browser/browscap.ini for Node","version":"0.1.2","author":{"name":"Dan Grossman"},"contributors":[{"name":"Tor Valamo","email":"tor.valamo@gmail.com","url":"http://github.com/torvalamo"}],"repository":{"type":"git","url":"http://github.com/dangrossman/node-browscap.git"},"bugs":{"web":"http://github.com/dangrossman/node-browscap/issues"},"bin":{"browscap":"./browscap.js"},"main":"browscap","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://github.com/dangrossman/node-browscap/README.markdown"}],"_id":"browscap@0.1.2","_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/browscap/-/browscap-0.1.2.tgz"}},"0.1.3":{"name":"browscap","description":"PHP's get_browser/browscap.ini for Node","version":"0.1.3","author":{"name":"Dan Grossman"},"contributors":[{"name":"Tor Valamo","email":"tor.valamo@gmail.com","url":"http://github.com/torvalamo"}],"repository":{"type":"git","url":"http://github.com/dangrossman/node-browscap.git"},"bugs":{"url":"http://github.com/dangrossman/node-browscap/issues"},"bin":{"browscap":"./browscap.js"},"main":"browscap","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://github.com/dangrossman/node-browscap/README.markdown"}],"_id":"browscap@0.1.3","_engineSupported":true,"_npmVersion":"0.2.14-3","_nodeVersion":"v0.3.4","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"04f42c95ac1b926a0370cd31ba0e81fd25b5bdc1","tarball":"http://registry.npmjs.org/browscap/-/browscap-0.1.3.tgz"}}},"maintainers":[{"name":"dangrossman","email":"dan@awio.com"}],"author":{"name":"Dan Grossman"},"repository":{"type":"git","url":"http://github.com/dangrossman/node-browscap.git"},"time":{"modified":"2011-01-10T07:52:18.354Z","created":"2011-01-10T07:52:18.354Z","0.1.0":"2011-01-10T07:52:18.354Z","0.1.1":"2011-01-10T07:52:18.354Z","0.1.2":"2011-01-10T07:52:18.354Z","0.1.3":"2011-01-10T07:52:18.354Z"},"_attachments":{"browscap-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-8YAB3F1MNatMSSK2urYyxg==","length":2866,"stub":true},"browscap-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qASjd95o1ydLmBNi7IVk1A==","length":42480,"stub":true},"browscap-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qYS4VkCLh4YWebXOekbtPw==","length":2864,"stub":true},"browscap-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-N6uGhoPC+xDr9v9D+JnPOA==","length":2792,"stub":true}}}},
{"id":"browser","key":"browser","value":{"rev":"25-41dbfcd869fa8ee7221457622b1d10a2"},"doc":{"_id":"browser","_rev":"25-41dbfcd869fa8ee7221457622b1d10a2","name":"browser","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"name":"browser","version":"0.1.0","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":"0.1.0","termcolor":"0.1.1","u2r":"0.1.2"},"_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"e35aeb6a75d58f23fb34c73f5e9a911a31f1b735","tarball":"http://registry.npmjs.org/browser/-/browser-0.1.0.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.1.1":{"name":"browser","version":"0.1.1","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":"0.1.0","termcolor":"0.1.1","u2r":"0.1.3"},"_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"71f44edc2e4bca034f71867ab73d0d0a078dfaa4","tarball":"http://registry.npmjs.org/browser/-/browser-0.1.1.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.1.2":{"name":"browser","version":"0.1.2","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":"0.1.0","termcolor":"0.1.1","u2r":"0.1.3"},"_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"6049d3a82c26c4ab29fda74afb691b7c124a993f","tarball":"http://registry.npmjs.org/browser/-/browser-0.1.2.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.1.3":{"name":"browser","version":"0.1.3","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":"0.1.0","termcolor":"0.1.1","u2r":"0.1.3"},"_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"b2c60e77c31bc46f864f26808beb9bf03d118f37","tarball":"http://registry.npmjs.org/browser/-/browser-0.1.3.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.2.0":{"name":"browser","version":"0.2.0","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":">=0.1.0","termcolor":"x.x.x","u2r":"x.x.x","jquery":"x.x.x","jsdom":"x.x.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"542ec073afaf42bcf45f0de46304a2c83bfcfe31","tarball":"http://registry.npmjs.org/browser/-/browser-0.2.0.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.2.1":{"name":"browser","version":"0.2.1","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":">=0.1.0","termcolor":"x.x.x","u2r":"x.x.x","jquery":"x.x.x","jsdom":"x.x.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"d3df819bc645bec8b695c4691b585ea2f4a2ddd3","tarball":"http://registry.npmjs.org/browser/-/browser-0.2.1.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.2.2":{"name":"browser","version":"0.2.2","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":">=0.1.0","termcolor":"x.x.x","u2r":"x.x.x","jquery":"x.x.x","jsdom":"x.x.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.2.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"40fccb53d29898091c5545b5ede0c94b829196be","tarball":"http://registry.npmjs.org/browser/-/browser-0.2.2.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.2.3":{"name":"browser","version":"0.2.3","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":">=0.2.0","termcolor":"x.x.x","u2r":"x.x.x","jquery":"x.x.x","jsdom":"x.x.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"4e2b4fa48949629bb33cb47b9c066752df4c81a2","tarball":"http://registry.npmjs.org/browser/-/browser-0.2.3.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"directories":{}},"0.2.4":{"name":"browser","version":"0.2.4","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":">=0.2.6","termcolor":"x.x.x","u2r":"x.x.x","jquery":"x.x.x","jsdom":"x.x.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.2.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.7","_defaultsLoaded":true,"dist":{"shasum":"b94cebced0101d5d1a57ac6387a9d8038421b5a3","tarball":"http://registry.npmjs.org/browser/-/browser-0.2.4.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]},"0.2.5":{"name":"browser","version":"0.2.5","description":"browsing urls with cookies, that is, we can scrape with authenticated pages!","tags":["scraping","browse","url","cookie","crawling","login","sign-in"],"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"bugs":{"url":"https://github.com/shinout/browser/issues"},"licences":[{"type":"MIT","url":"https://github.com/shinout/browser/raw/master/LICENCE"}],"main":"./browser.js","dependencies":{"junjo":">=0.2.6","termcolor":"x.x.x","u2r":"x.x.x","jquery":"x.x.x","jsdom":"x.x.x"},"engine":"node >= 0.4.1","_npmUser":{"name":"shinout","email":"shinout310@gmail.com"},"_id":"browser@0.2.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"24d9d97d64202a6e25ad2d24cb5dc63d4895c34e","tarball":"http://registry.npmjs.org/browser/-/browser-0.2.5.tgz"},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}]}},"maintainers":[{"name":"shinout","email":"shinout310@gmail.com"}],"time":{"modified":"2011-11-15T12:19:15.492Z","created":"2011-10-17T10:25:46.299Z","0.1.0":"2011-10-17T10:25:48.949Z","0.1.1":"2011-10-17T12:11:44.012Z","0.1.2":"2011-10-19T14:34:20.213Z","0.1.3":"2011-10-20T13:12:21.654Z","0.2.0":"2011-10-20T14:14:19.131Z","0.2.1":"2011-10-20T17:27:49.123Z","0.2.2":"2011-10-20T20:52:07.330Z","0.2.3":"2011-10-24T14:26:52.957Z","0.2.4":"2011-11-13T14:14:06.351Z","0.2.5":"2011-11-15T12:19:15.492Z"},"author":{"name":"SHIN Suzuki","email":"shinout310@gmail.com"},"repository":{"type":"git","url":"git://github.com/shinout/browser.git"},"_attachments":{"browser-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-PseLVVgVdzabfBrCliZ3yg==","length":8035,"stub":true},"browser-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-aBl/xOp3w3Lj6ZuqC/xLIw==","length":8028,"stub":true},"browser-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-YRJdIuQuZG3XJGAahyBK0A==","length":7993,"stub":true},"browser-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-fJ3tIDz5IQN8nTBld6tDOw==","length":7878,"stub":true},"browser-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-qTGaecNiE7NTeiE/7JapRA==","length":6829,"stub":true},"browser-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0V7UIASYn7oNt0Bt3zWMpw==","length":6676,"stub":true},"browser-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-NETgjsKOfRxtvDtFBLBmYA==","length":6144,"stub":true},"browser-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OaJoovkABtx9x7wY2QZ3vg==","length":6041,"stub":true},"browser-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-G4RABvTYVl8o104CS/cRew==","length":5538,"stub":true},"browser-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-xBBYq1tsOLIkuoLK5CqqIw==","length":5530,"stub":true}}}},
{"id":"browser-driver","key":"browser-driver","value":{"rev":"3-aed172898223bafa19345e86b999581a"},"doc":{"_id":"browser-driver","_rev":"3-aed172898223bafa19345e86b999581a","name":"browser-driver","description":"a server to capture and manage browsers","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.3":{"name":"browser-driver","version":"0.1.3","author":{"name":"PHG","email":"techies@performancehorizon.com"},"description":"a server to capture and manage browsers","contributors":[{"name":"Georgi Kostov","email":"georgi.kostov@performancehorizon.com"}],"bin":{"browser-driver":"./bin/server"},"main":"./server/server","repository":{"type":"git","url":"git://github.com/PerformanceHorizonGroup/JS-Browser-Driver.git"},"keywords":["test","browser","driver"],"dependencies":{"connect":"*","socket.io":">=0.7.x"},"license":"MIT","engine":{"node":">=0.5.3"},"_npmUser":{"name":"phg","email":"georgi.kostov@performancehorizon.com"},"_id":"browser-driver@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-7","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d97e64403cfb9df1dee61078a9b76c7190e0f4a9","tarball":"http://registry.npmjs.org/browser-driver/-/browser-driver-0.1.3.tgz"},"maintainers":[{"name":"phg","email":"georgi.kostov@performancehorizon.com"}]}},"readme":"# JS Browser Driver\r\nThe JS Browser Driver is a Node.JS project aiming to simplify writing and running automated UI tests in JS.\r\n\r\n_(more info can be found in the [Wiki](https://github.com/PerformanceHorizonGroup/JS-Browser-Driver/wiki) pages)_\r\n\r\n## Installation\r\n\r\n    npm install browser-driver\r\n    \r\nNote, if the above command growls at you, you probably don't have npm installed. Go grab that at http://npmjs.org/ or simply run:\r\n\r\n    curl http://npmjs.org/install.sh | sh\r\n\r\n## How to use\r\nTest files are organized in suites and for each suite there needs to be a [configuration file](https://github.com/PerformanceHorizonGroup/JS-Browser-Driver/wiki/Configuration-file) written so the server will know how to prepare the resources that tests will need.\r\n\r\nIf you have installed the npm package globally (with `-g`) then you can do:\r\n\r\n    browser-driver configFileName=\"path/to/xxx.conf.json\"\r\n    \r\nor if not then go to the package directory and start it with node like:\r\n\r\n    node server/server.js configFileName=\"path/to/xxx.conf.json\"\r\n\r\n### Setting up the browsers\r\nWithin the conf.json config file, you need to provide an absolute link to each browser. Predictably, this isn't particularly easy as there can be various conflicts with browser windows that are already open. We have gone through this pain many times, so here's a guide for the major browsers:\r\n\r\n- **Chrome**\r\n\r\n    Thankfully Chrome is relatively straightforward, you just need to direct the user data to temp. \r\n    \r\n    - **OS X**, simply point the user data dir to /tmp\r\n        \r\n            {\r\n                \"name\":\"Chrome\",\r\n                \"app\":\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\r\n                \"args\":[\"--user-data-dir=/tmp\"]\r\n            }\r\n        \r\n    - **Windows**\r\n    \r\n            {\r\n                \"name\":\"Chrome\",\r\n                \"app\":\"C:\\\\Program Files (x86)\\\\GoogleChromePortable\\\\GoogleChromePortable.exe\",\r\n                \"args\":[]\r\n            }\r\n\r\n    - **Ubuntu**\r\n    \r\n            {\r\n                \"name\":\"Chrome\",\r\n                \"app\":\"chromium-browser\",\r\n                \"args\":[]\r\n            }\r\n\r\n- **Firefox**\r\n\r\n    \r\n    - **OS X**\r\n        \r\n        With Firefox, you unfortunately need to create a new profile first, via their Profile Manager. You can do this through the settings, or from the command line you pass the `-ProfileManager` switch to the executable. Lets assume that the profile name you allocate is something really original like \"test\":\r\n    \r\n            {\r\n                \"name\":\"Firefox\",\r\n                \"app\":\"/Applications/Firefox.app/Contents/MacOS/firefox\",\r\n                \"args\":[\"-P test\"]\r\n            }\r\n        \r\n    - **Windows**\r\n    \r\n            {\r\n                \"name\":\"Firefox\",\r\n                \"app\":\"C:\\\\Program Files (x86)\\\\Mozilla Firefox\\\\firefox.exe\",\r\n                \"args\":[]\r\n            }\r\n\r\n    - **Ubuntu**\r\n    \r\n            {\r\n                \"name\":\"Firefox\",\r\n                \"app\":\"firefox\",\r\n                \"args\":[]\r\n            }\r\n\r\n## Examples\r\nOk, so enough with all the waffle, lets run some pre-baked tests included in the project! Depending on how your `npm` is set up, you need to direct the browser driver to the location of the example tests config file. Before you try to action this, please ensure that you have set up at least 1 browser inside that config file - see above for the gory details. \r\n\r\nOk, so in this example, we will fire up the BrowserDriver on OS X, by pointing to the example tests config:\r\n\r\n    browser-driver configFileName=\"/usr/local/lib/node_modules/browser-driver/examples/sampleTestSuite/testing.conf.json\"\r\n    \r\nIf all is well, you should see the BrowserDriver start up:\r\n\r\n    testing server started\r\n    reading configuration file /usr/local/lib/node_modules/browser-driver/examples/sampleTestSuite/testing.conf.json\r\n    Server listening on port 8090 at localhost\r\n    Go to http://localhost:8090/manager/manager.html to manage and run tests\r\n\r\nTime to go to the location it tells you in the above message, `http://localhost:8090/manager/manager.html`, and see the shiny manager page. From here, you can select the browser(s) that you set up and connect to, pick the tests you want to run, and you will see the feedback in real-time in the console. \r\n\r\n## License\r\nThe MIT License, because it rules.\r\n","maintainers":[{"name":"phg","email":"georgi.kostov@performancehorizon.com"}],"time":{"modified":"2012-02-15T10:46:31.030Z","created":"2012-02-15T10:46:28.878Z","0.1.3":"2012-02-15T10:46:31.030Z"},"author":{"name":"PHG","email":"techies@performancehorizon.com"},"repository":{"type":"git","url":"git://github.com/PerformanceHorizonGroup/JS-Browser-Driver.git"},"_attachments":{"browser-driver-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-MqU3efCKplPXlRtdSZWS4A==","length":1092574,"stub":true}}}},
{"id":"browser-launcher","key":"browser-launcher","value":{"rev":"8-f9da9cea7a6ddf37a495b6a81f605f9e"},"doc":{"_id":"browser-launcher","_rev":"8-f9da9cea7a6ddf37a495b6a81f605f9e","name":"browser-launcher","description":"detect and launch browser versions, headlessly or otherwise","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.0":{"name":"browser-launcher","version":"0.0.0","description":"detect and launch browser versions, headlessly or otherwise","main":"index.js","bin":{},"directories":{"example":"example","test":"test"},"dependencies":{"headless":"~0.1.0","merge":"~1.0.0","mkdirp":"~0.3.3"},"repository":{"type":"git","url":"git://github.com/substack/browser-launcher.git"},"homepage":"https://github.com/substack/browser-launcher","keywords":["browser","headless","phantom","chrome","firefox","chromium"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","engine":{"node":">=0.6"},"readme":"","_id":"browser-launcher@0.0.0","dist":{"shasum":"40973c2a9cf193089c22bd27e6185cc6bd5a3337","tarball":"http://registry.npmjs.org/browser-launcher/-/browser-launcher-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.1":{"name":"browser-launcher","version":"0.0.1","description":"detect and launch browser versions, headlessly or otherwise","main":"index.js","bin":{},"directories":{"example":"example","test":"test"},"dependencies":{"headless":"~0.1.0","merge":"~1.0.0","mkdirp":"~0.3.3"},"repository":{"type":"git","url":"git://github.com/substack/browser-launcher.git"},"homepage":"https://github.com/substack/browser-launcher","keywords":["browser","headless","phantom","chrome","firefox","chromium"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","engine":{"node":">=0.6"},"readme":"","_id":"browser-launcher@0.0.1","dist":{"shasum":"8d92c73938fa29c853ed32713b635b70a8a06974","tarball":"http://registry.npmjs.org/browser-launcher/-/browser-launcher-0.0.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.0.2":{"name":"browser-launcher","version":"0.0.2","description":"detect and launch browser versions, headlessly or otherwise","main":"index.js","bin":{},"directories":{"example":"example","test":"test"},"dependencies":{"headless":"~0.1.0","merge":"~1.0.0","mkdirp":"~0.3.3"},"repository":{"type":"git","url":"git://github.com/substack/browser-launcher.git"},"homepage":"https://github.com/substack/browser-launcher","keywords":["browser","headless","phantom","chrome","firefox","chromium"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","engine":{"node":">=0.6"},"readme":"","_id":"browser-launcher@0.0.2","dist":{"shasum":"6064790e39e6a71a09e2fc61cdefcbb8ce0df67f","tarball":"http://registry.npmjs.org/browser-launcher/-/browser-launcher-0.0.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-08-06T14:28:46.235Z","created":"2012-06-28T07:18:36.141Z","0.0.0":"2012-06-28T07:18:37.682Z","0.0.1":"2012-06-28T09:16:04.473Z","0.0.2":"2012-06-30T16:23:04.699Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/browser-launcher.git"},"users":{"sjonnet19":true},"_attachments":{"browser-launcher-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ubd8wt23rq/amFLEy9jVFg==","length":5151,"stub":true},"browser-launcher-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yeWJgDoiRg2V4ananWDdPw==","length":5095,"stub":true},"browser-launcher-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TVDndj35yMnANrX6xZhC3Q==","length":4881,"stub":true}}}},
{"id":"browser-request","key":"browser-request","value":{"rev":"9-5aef526b6c42ff727e00fff4341a64bf"},"doc":{"_id":"browser-request","_rev":"9-5aef526b6c42ff727e00fff4341a64bf","name":"browser-request","description":"Browser port of the Node.js 'request' package","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0-beta1":{"name":"browser-request","version":"0.1.0-beta1","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Browser port of the Node.js 'request' package","keywords":["request","http","browser","ender"],"homepage":"http://github.com/iriscouch/browser-request","repository":{"type":"git","url":"git://github.com/iriscouch/browser-request.git"},"dependencies":{},"devDependencies":{"tap":"0.1.3"},"engines":["node"],"ender":"./build/ender/ender.js","_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"browser-request@0.1.0-beta1","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"9db4fb96f089356f3024c65850867dc44f85be5a","tarball":"http://registry.npmjs.org/browser-request/-/browser-request-0.1.0-beta1.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}]},"0.1.0-beta2":{"name":"browser-request","version":"0.1.0-beta2","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Browser port of the Node.js 'request' package","keywords":["request","http","browser","ender"],"homepage":"http://github.com/iriscouch/browser-request","repository":{"type":"git","url":"git://github.com/iriscouch/browser-request.git"},"dependencies":{},"devDependencies":{"tap":"0.1.3"},"engines":["node"],"ender":"./release/ender/ender.js","_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"browser-request@0.1.0-beta2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"48e942ec27b23e4149515d9aac3b44525e560e34","tarball":"http://registry.npmjs.org/browser-request/-/browser-request-0.1.0-beta2.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}]},"0.1.0":{"name":"browser-request","version":"0.1.0","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Browser port of the Node.js 'request' package","keywords":["request","http","browser","ender"],"homepage":"http://github.com/iriscouch/browser-request","repository":{"type":"git","url":"git://github.com/iriscouch/browser-request.git"},"dependencies":{},"devDependencies":{"tap":"0.1.3","ender":"~0.8.2"},"engines":["node"],"ender":"./dist/ender/ender.js","_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"browser-request@0.1.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"db0f71781ee7467e7562697209f4a7392526bcb5","tarball":"http://registry.npmjs.org/browser-request/-/browser-request-0.1.0.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}]},"0.2.0":{"name":"browser-request","version":"0.2.0","author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"description":"Browser port of the Node.js 'request' package","keywords":["request","http","browser","ender","browserify"],"homepage":"http://github.com/iriscouch/browser-request","repository":{"type":"git","url":"git://github.com/iriscouch/browser-request.git"},"dependencies":{},"devDependencies":{"tap":"0.1.3","ender":"~0.8.2","static-plus":"~0.2.4","uglify-js":"~1.2.5","browserify":"~1.10.6"},"engines":["node"],"ender":"./dist/ender/ender.js","browserify":"./dist/ender/request.js","_npmUser":{"name":"jhs","email":"jhs@iriscouch.com"},"_id":"browser-request@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0ab38f5a42cebfed72edcaf992a0701deb0223b3","tarball":"http://registry.npmjs.org/browser-request/-/browser-request-0.2.0.tgz"},"maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}]}},"readme":"# Browser Request: The easiest HTTP library you'll ever see\n\nBrowser Request is a port of Mikeal Rogers's ubiquitous and excellent [request][req] package to the browser.\n\nJealous of Node.js? Pining for clever callbacks? Request is for you.\n\nDon't care about Node.js? Looking for less tedium and a no-nonsense API? Request is for you too.\n\n# Examples\n\nFetch a resource:\n\n```javascript\nrequest('/some/resource.txt', function(er, response, body) {\n  if(er)\n    throw er;\n  console.log(\"I got: \" + body);\n})\n```\n\nSend a resource:\n\n```javascript\nrequest.put({uri:'/some/resource.xml', body:'<foo><bar/></foo>'}, function(er, response) {\n  if(er)\n    throw new Error(\"XML PUT failed (\" + er + \"): HTTP status was \" + response.status);\n  console.log(\"Stored the XML\");\n})\n```\n\nTo work with JSON, set `options.json` to `true`. Request will set the `Content-Type` and `Accept` headers, and handle parsing and serialization.\n\n```javascript\nrequest({method:'POST', url:'/db', body:'{\"relaxed\":true}', json:true}, on_response)\n\nfunction on_response(er, response, body) {\n  if(er)\n    throw er\n  if(result.ok)\n    console.log('Server ok, id = ' + result.id)\n}\n```\n\nOr, use this shorthand version (pass data into the `json` option directly):\n\n```javascript\nrequest({method:'POST', url:'/db', json:{relaxed:true}}, on_response)\n```\n\n## Convenient CouchDB\n\nBrowser Request provides a CouchDB wrapper. It is the same as the JSON wrapper, however it will indicate an error if the HTTP query was fine, but there was a problem at the database level. The most common example is `409 Conflict`.\n\n```javascript\nrequest.couch({method:'PUT', url:'/db/existing_doc', body:{\"will_conflict\":\"you bet!\"}}, function(er, resp, result) {\n  if(er.error === 'conflict')\n    return console.error(\"Couch said no: \" + er.reason); // Output: Couch said no: Document update conflict.\n\n  if(er)\n    throw er;\n\n  console.log(\"Existing doc stored. This must have been the first run.\");\n})\n```\n\nSee the [Node.js Request README][req] for several more examples. Request intends to maintain feature parity with Node request (except what the browser disallows). If you find a discrepancy, please submit a bug report. Thanks!\n\n# Usage\n\n## Ender\n\nBrowser Request is an [Ender][ender] package. If you don't have Ender, install it, and don't ever look back.\n\n    $ npm install -g ender\n\nTo include Request in an Ender build:\n\n    $ ender build request[,mod2, mod3,...]\n\nOr to add it to an existing Ender build:\n\n    $ ender add request\n\n## RequireJS\n\nBrowser Request also supports [RequireJS][rjs]. Add `build/request.js` and `build/xmlhttprequest.js` to your web application and use it from your code.\n\n```javascript\ndefine(['request'], function(request) {\n  // `request` is ready\n})\n```\n\n## Traditional\n\nThe traditional way is to use it like any other Javascript library. Add `build/browser/request.js` to your web application and use it from your page.\n\n```html\n<script src=\"request-browser.js\"></script>\n<script>\n    request(\"/motd.html\", function(er, res) {\n        if(er)\n            return console.error('Failed to get the message of the day')\n        console.log('Got the message of the day')\n    })\n</script>\n```\n\n## License\n\nBrowser Request is licensed under the Apache 2.0 license.\n\nBrowser Request uses Sergey Ilinsky's [XMLHttpRequest][xhr] package, licended under the terms of the LGPL 2.1 or later.\n\n[req]: https://github.com/mikeal/request\n[rjs]: http://requirejs.org/\n[xhr]: https://github.com/ilinsky/xmlhttprequest\n[ender]: http://ender.no.de\n","maintainers":[{"name":"jhs","email":"jhs@iriscouch.com"}],"time":{"modified":"2012-03-30T06:16:19.613Z","created":"2011-12-21T16:05:20.203Z","0.1.0-beta1":"2011-12-21T16:05:28.968Z","0.1.0-beta2":"2011-12-21T16:26:29.624Z","0.1.0":"2011-12-29T08:08:00.535Z","0.2.0":"2012-03-30T06:16:19.613Z"},"author":{"name":"Jason Smith","email":"jhs@iriscouch.com"},"repository":{"type":"git","url":"git://github.com/iriscouch/browser-request.git"},"_attachments":{"browser-request-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-HmKm27ZNY7NGio1IX7FWfQ==","length":53973,"stub":true},"browser-request-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2PZ0gMp/BEtr/m86942cCA==","length":92573,"stub":true},"browser-request-0.1.0-beta2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NV18URUaOW+AvAfsMPeVOQ==","length":63594,"stub":true},"browser-request-0.1.0-beta1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7XS0eQtmsvHY4u7F6JivSA==","length":57247,"stub":true}}}},
{"id":"browser-require","key":"browser-require","value":{"rev":"27-99f61fb3036ebc643282625649cc674f"},"doc":{"_id":"browser-require","_rev":"27-99f61fb3036ebc643282625649cc674f","name":"browser-require","description":"Use CommonJS and NPM modules from the browser","dist-tags":{"latest":"0.1.6"},"versions":{"0.0.1":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.0.1","homepage":"https://github.com/bnoguchi/browser-require","repository":"https://github.com/bnoguchi/browser-require.git","author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./browser-require","directories":{"lib":""},"scripts":{"test":"make test"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.0.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a1b6d9baf056caa65a47523cd20da22240474a4d","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.0.1.tgz"}},"0.0.2":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.0.2","homepage":"https://github.com/bnoguchi/browser-require","repository":"https://github.com/bnoguchi/browser-require.git","author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./browser-require","directories":{"lib":""},"scripts":{"test":"make test"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.0.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a37a785f892e1d3e8c0a3b1f5a3433f946ef1d36","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.0.2.tgz"}},"0.0.3":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.0.3","homepage":"https://github.com/bnoguchi/browser-require","repository":"https://github.com/bnoguchi/browser-require.git","author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./browser-require","directories":{"lib":""},"scripts":{"test":"make test"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.0.3","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.2.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"064ec2774869918109d60f3f9dd1a0deb8e3dbf9","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.0.3.tgz"}},"0.1.1":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.1.1","homepage":"https://github.com/bnoguchi/browser-require","repository":{"type":"git","url":"git://github.com/bnoguchi/browser-require.git"},"author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./lib/browser-require.js","directories":{"lib":"./lib","bin":"./bin"},"bin":{"browser-require":"./bin/browser-require"},"scripts":{"test":"make test"},"dependencies":{"expresso":">= 0.7.2","dependency-promise":">=0.2.0"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.1.1","_engineSupported":true,"_npmVersion":"0.3.0-9","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2be4f1f6f8d0c0482522faf182f6ecff6b574223","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.1.1.tgz"}},"0.1.2":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.1.2","homepage":"https://github.com/bnoguchi/browser-require","repository":{"type":"git","url":"git://github.com/bnoguchi/browser-require.git"},"author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./lib/browser-require.js","directories":{"lib":"./lib","bin":"./bin"},"bin":{"browser-require":"./bin/browser-require"},"scripts":{"test":"make test"},"dependencies":{"expresso":">= 0.7.2","dependency-promise":">=0.2.0"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.1.2","_engineSupported":true,"_npmVersion":"0.3.0-9","_nodeVersion":"v0.4.1","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"3c94e97c1518d01cd1d2a24829f4ead823db1678","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.1.2.tgz"}},"0.1.4":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.1.4","homepage":"https://github.com/bnoguchi/browser-require","repository":{"type":"git","url":"git://github.com/bnoguchi/browser-require.git"},"author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./lib/browser-require.js","directories":{"lib":"./lib","bin":"./bin"},"bin":{"browser-require":"./bin/browser-require"},"scripts":{"test":"make test"},"devDependencies":{"expresso":">= 0.7.2"},"dependencies":{"dependency-promise":">=0.2.0"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.1.4","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0bd5505b74901d38f9ad439ce62fa12352b76082","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.1.4.tgz"}},"0.1.6":{"name":"browser-require","description":"Use CommonJS and NPM modules from the browser","version":"0.1.6","homepage":"https://github.com/bnoguchi/browser-require","repository":{"type":"git","url":"git://github.com/bnoguchi/browser-require.git"},"author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"main":"./lib/browser-require.js","directories":{"lib":"./lib","bin":"./bin"},"bin":{"browser-require":"./bin/browser-require"},"scripts":{"test":"make test"},"devDependencies":{"expresso":">= 0.7.2"},"dependencies":{"dependency-promise":">=0.2.0"},"engines":{"node":">=0.2.6"},"_id":"browser-require@0.1.6","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c10f12de992f2316174227532f98ba047bd30bed","tarball":"http://registry.npmjs.org/browser-require/-/browser-require-0.1.6.tgz"}}},"maintainers":[{"name":"bnoguchi","email":"brian.noguchi@gmail.com"}],"time":{"modified":"2011-03-29T20:06:59.237Z","created":"2011-02-10T04:27:47.354Z","0.0.1":"2011-02-10T04:27:47.836Z","0.0.2":"2011-02-10T06:48:28.906Z","0.0.3":"2011-02-10T12:26:31.475Z","0.1.0":"2011-02-25T10:11:38.741Z","0.1.1":"2011-02-25T22:09:42.630Z","0.1.2":"2011-02-25T22:12:04.983Z","0.1.4":"2011-03-14T23:25:55.646Z","0.1.5":"2011-03-29T19:42:49.249Z","0.1.6":"2011-03-29T20:06:59.237Z"},"author":{"name":"Brian N Noguchi","email":"brian.noguchi@gmail.com","url":"https://github.com/bnoguchi"},"repository":{"type":"git","url":"git://github.com/bnoguchi/browser-require.git"},"_attachments":{"browser-require-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-ljhYXvH1Jb8MYikmuhAhBQ==","length":24912,"stub":true},"browser-require-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-SHcEKor8U0GU0uHIryHA4A==","length":24905,"stub":true},"browser-require-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-5ZxjavyjwE08AhuJxe7kPA==","length":24621,"stub":true},"browser-require-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-6fujXM4/P7IUL+3CmGXqAg==","length":31074,"stub":true},"browser-require-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nNio6d06Hg1eb8oCVs32mw==","length":9138,"stub":true},"browser-require-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-s1Ky7Lg5Pa32/FIaWY0Mng==","length":8822,"stub":true},"browser-require-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FJXwyxrbAryIdgNtJIv6HA==","length":8382,"stub":true}}}},
{"id":"browser-soupselect","key":"browser-soupselect","value":{"rev":"5-c6a68404789bb778158b07a215c6192d"},"doc":{"_id":"browser-soupselect","_rev":"5-c6a68404789bb778158b07a215c6192d","name":"browser-soupselect","description":"Adds CSS selector support to htmlparser for scraping activities - port of soupselect (python). Browser package contains htmlparser and soupselect","dist-tags":{"latest":"0.2.1"},"versions":{"0.2.0":{"name":"browser-soupselect","version":"0.2.0","engines":{"node":">=0.2.0"},"author":{"name":"Harry Fuecks","email":"hfuecks@gmail.com","url":"http://twitter.com/hfuecks"},"contributors":[{"name":"Simon Willison https://github.com/simonw"},{"name":"Harry Fuecks https://github.com/harryf"},{"name":"Chris O'Hara https://github.com/chriso"}],"dependencies":{"htmlparser":">= 1.6.2","nodeunit":">= 0.3.0"},"repository":[{"type":"git","url":"git://github.com/jsmarkus/browser-soupselect.git"}],"main":"./lib/soupselect","license":"MIT","description":"Adds CSS selector support to htmlparser for scraping activities - port of soupselect (python). Browser package contains htmlparser and soupselect","_npmJsonOpts":{"file":"/home/mrak/.npm/browser-soupselect/0.2.0/package/package.json","wscript":false,"serverjs":false,"contributors":["Simon Willison https://github.com/simonw","Harry Fuecks https://github.com/harryf","Chris O'Hara https://github.com/chriso"]},"_id":"browser-soupselect@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f8e2a2a40a24858e6e4eec06a6fe1b7dcaef944c","tarball":"http://registry.npmjs.org/browser-soupselect/-/browser-soupselect-0.2.0.tgz"},"maintainers":[{"name":"jsmarkus","email":"nixmrak@gmail.com"}]},"0.2.1":{"name":"browser-soupselect","version":"0.2.1","engines":{"node":">=0.2.0"},"author":{"name":"Harry Fuecks","email":"hfuecks@gmail.com","url":"http://twitter.com/hfuecks"},"contributors":[{"name":"Simon Willison https://github.com/simonw"},{"name":"Harry Fuecks https://github.com/harryf"},{"name":"Chris O'Hara https://github.com/chriso"}],"dependencies":{"htmlparser":">= 1.6.2","nodeunit":">= 0.3.0"},"repository":[{"type":"git","url":"git://github.com/jsmarkus/browser-soupselect.git"}],"main":"./lib/soupselect","license":"MIT","description":"Adds CSS selector support to htmlparser for scraping activities - port of soupselect (python). Browser package contains htmlparser and soupselect","_npmJsonOpts":{"file":"/home/mrak/.npm/browser-soupselect/0.2.1/package/package.json","wscript":false,"serverjs":false,"contributors":["Simon Willison https://github.com/simonw","Harry Fuecks https://github.com/harryf","Chris O'Hara https://github.com/chriso"]},"_id":"browser-soupselect@0.2.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"911f236c4beb44953259e72b3d6ca2884d476b2c","tarball":"http://registry.npmjs.org/browser-soupselect/-/browser-soupselect-0.2.1.tgz"},"maintainers":[{"name":"jsmarkus","email":"nixmrak@gmail.com"}]}},"maintainers":[{"name":"jsmarkus","email":"nixmrak@gmail.com"}],"time":{"modified":"2012-02-27T16:59:21.422Z","created":"2012-02-27T16:49:19.576Z","0.2.0":"2012-02-27T16:49:23.375Z","0.2.1":"2012-02-27T16:59:21.422Z"},"author":{"name":"Harry Fuecks","email":"hfuecks@gmail.com","url":"http://twitter.com/hfuecks"},"repository":[{"type":"git","url":"git://github.com/jsmarkus/browser-soupselect.git"}],"_attachments":{"browser-soupselect-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Cjvy3q/EoesdH0XB6NgXpA==","length":52631,"stub":true},"browser-soupselect-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hPWFyRThHCr5GroDvfviJg==","length":147721,"stub":true}}}},
{"id":"browser-stream","key":"browser-stream","value":{"rev":"35-7ce134ddb3ecdc3cf1bfa82fb6a2ca27"},"doc":{"_id":"browser-stream","_rev":"35-7ce134ddb3ecdc3cf1bfa82fb6a2ca27","name":"browser-stream","description":"pipe streams through Socket.io","dist-tags":{"latest":"0.1.10"},"versions":{"0.0.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.0.0","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.0.0","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c81efaf6b98bc03dabe9ef6c86d29b1e34eb3044","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.0.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.1":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.0.1","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"1383a1cc4768e9c99b272c527ac15760b77904b8","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.0.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.2":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.0.2","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d7388f2a3bc1fbc67902ac83e708afa6e9898cb4","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.0.2.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.3":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.0.3","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6c63deb1c040df2ad777947efbbd81ceb3419e18","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.0.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.4":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.0.4","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.0.4","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"797ed785e1d5ab3cfb2c2e7e0000407dac11b389","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.0.4.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.5":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.0.5","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.0.5","_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6de5c158ea08e5598bd8f5d585c18778aea5e41f","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.0.5.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.0":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.0","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"fcb91a7f428e6726c73ae77eb200ff3b9994c32c","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.0.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.1":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.1","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"da499095226286b5ba9b322c43ca4dccaa08af31","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.2":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.2","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"84b30d855e74acbbf46e07df5c3be4678105dada","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.2.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.3":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.3","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8d1a1b8e10624f57aa57e8fb383c529a73628354","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.4":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.4","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10","domready":"~0.2.11","skates":"0.0.1"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.4","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c66d0cad3dd48c82e802656d55ee841959c8922f","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.4.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.5":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.5","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10","domready":"~0.2.11","skates":"0.0.1"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.5","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"c26a1e6ac8607b53803b0364141ba007019f074a","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.5.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.6":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.6","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{"event-stream":"~2.0.0"},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10","domready":"~0.2.11","skates":"0.0.1"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.6","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"4c7db20101ba225c2b2351e0b4bb21efefe74c05","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.6.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.7":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.7","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{"event-stream":"~2.0.0"},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10","domready":"~0.2.11","skates":"0.0.1"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.7","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"61a73dd07ea250bddcc9c72834e70e459e2400e3","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.7.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.8":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.8","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{"event-stream":"~2.0.0"},"devDependencies":{"socket.io":"0.9","express":"2.5","dominode":"0","browserify":"1.10","domready":"~0.2.11","skates":"0.0.1"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.8","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a029ffb8acac8ca6975c19012cb1873c4191d6a6","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.8.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.9":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.9","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{"event-stream":"~2.0.0"},"devDependencies":{"socket.io":"0.9","express":"2.5","domnode":"0","browserify":"~1.13","domready":"~0.2.11","skates":"0.0.1","tap":"~0.2.5"},"scripts":{"test":"tap test/*.js"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.9","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d08101c56280da20d274efe8a5d1af34ad320019","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.9.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.1.10":{"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"name":"browser-stream","description":"pipe streams through Socket.io","version":"0.1.10","homepage":"https://github.com/dominictarr/browser-stream","repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"engines":{"node":"0.6"},"dependencies":{"event-stream":"~2.0.0"},"devDependencies":{"socket.io":"0.9","express":"2.5","domnode":"0","browserify":"~1.13","domready":"~0.2.11","skates":"0.0.1","tap":"~0.2.5","remote-events":"0.0.0"},"scripts":{"test":"tap test/*.js"},"optionalDependencies":{},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"browser-stream@0.1.10","_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"deb3a3e4919412c41288147ded719cef9f4f514c","tarball":"http://registry.npmjs.org/browser-stream/-/browser-stream-0.1.10.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-06-23T15:20:45.675Z","created":"2012-04-16T13:05:25.952Z","0.0.0":"2012-04-16T13:05:31.053Z","0.0.1":"2012-04-16T13:27:31.083Z","0.0.2":"2012-04-16T13:40:23.648Z","0.0.3":"2012-04-25T07:03:51.000Z","0.0.4":"2012-04-25T08:41:43.670Z","0.0.5":"2012-04-27T05:03:00.567Z","0.1.0":"2012-05-20T07:39:21.132Z","0.1.1":"2012-05-25T19:22:03.092Z","0.1.2":"2012-05-30T18:44:17.731Z","0.1.3":"2012-05-30T18:57:31.669Z","0.1.4":"2012-06-05T06:28:51.143Z","0.1.5":"2012-06-05T07:31:36.260Z","0.1.6":"2012-06-08T17:27:25.761Z","0.1.7":"2012-06-13T12:47:15.067Z","0.1.8":"2012-06-13T15:13:47.146Z","0.1.9":"2012-06-23T06:48:28.694Z","0.1.10":"2012-06-23T15:20:45.675Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/browser-stream.git"},"_attachments":{"browser-stream-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-pRcrDhD9ii3IiffdJBRGhg==","length":6530,"stub":true},"browser-stream-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-yiaCU3xCp1DAOJLp3m1YdA==","length":6921,"stub":true},"browser-stream-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-HLpwGAGqGQWCdzhKHAd3Ng==","length":6856,"stub":true},"browser-stream-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-5EhCd2RqvdxD50iKh1bIew==","length":6880,"stub":true},"browser-stream-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-tFpoMN9dgfBCbLpxNU5e/A==","length":6814,"stub":true},"browser-stream-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-SEg6I42Kq3Om7JLdDIfZYA==","length":6763,"stub":true},"browser-stream-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-EfVvI/+DjbqzWF5/kj1K5A==","length":6753,"stub":true},"browser-stream-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-eEOGnYHMv73HZV/NUnTWng==","length":4581,"stub":true},"browser-stream-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-hb7kYECuFbNdKWS3PCkbeA==","length":4580,"stub":true},"browser-stream-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-96yoONQBsXjUSIM/N3CcOg==","length":4352,"stub":true},"browser-stream-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-h5VlNFQs14bw9ZkZOCXcVw==","length":2583,"stub":true},"browser-stream-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-wsMSdR2eOpYjsGH7fU/KjQ==","length":2524,"stub":true},"browser-stream-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-yn3LMK2J5JIwqxceuJrBqA==","length":2463,"stub":true},"browser-stream-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-gH6ALxXlwemPYHPXXrGF+A==","length":2427,"stub":true},"browser-stream-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-pZNrspoToIL+YuGdaZi47A==","length":2406,"stub":true},"browser-stream-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-JbSSw4QXr4xTW1GnxFuu8w==","length":2366,"stub":true},"browser-stream-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+t+9YWg1Fan4naYMZwC8NQ==","length":2237,"stub":true}}}},
{"id":"browser-stream-server","key":"browser-stream-server","value":{"rev":"15-79bdf3d0ad3c131611ad5c864270f7a1"},"doc":{"_id":"browser-stream-server","_rev":"15-79bdf3d0ad3c131611ad5c864270f7a1","name":"browser-stream-server","description":"A stream server in the browser","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.1":{"name":"browser-stream-server","version":"0.0.1","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"0.0.3","node-uuid":"~1.3.3","stream-store":"~0.2.0","stream-router":"0.0.2"},"devDependencies":{"browserify-server":"~0.2.0","boot":"~0.6.1","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server [![build status][1]][2]\n\nA stream server in the browser\n\n## Example\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server","_id":"browser-stream-server@0.0.1","dist":{"shasum":"939e233ded7bc2e03ca19db4b4ee9ce2dc1aa0ef","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.0.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.0.2":{"name":"browser-stream-server","version":"0.0.2","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"0.0.3","node-uuid":"~1.3.3","stream-store":"~0.2.0","stream-router":"0.0.2"},"devDependencies":{"browserify-server":"~0.2.0","boot":"~0.6.1","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server [![build status][1]][2]\n\nA stream server in the browser\n\n## Example\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server","_id":"browser-stream-server@0.0.2","dist":{"shasum":"a95e10efeeb7ce9d7c2e5d3518bbd7400dca6616","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.0.2.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.1.0":{"name":"browser-stream-server","version":"0.1.0","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"0.0.3","node-uuid":"~1.3.3","stream-store":"~0.2.0","stream-router":"0.0.2","pause-stream":"0.0.3","through":"~0.1.4","duplexer":"0.0.1"},"devDependencies":{"browserify-server":"~0.2.0","boot":"~0.6.1","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server\n\nA stream server in the browser\n\nCreate streaming servers in your browser. Emulating peer to peer connections through a central proxy server\n\n## Example browser server (In a seperate browser)\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a Stream server and listen on a server name\nStreamServer(mdm, function (stream) {\n    // Called every time a client opens up a stream connection to you\n    stream.on(\"data\", function (data) {\n        console.log(\"[SERVER]\", data)\n    })\n    stream.write(\"from server\")\n}).listen(\"SERVER_NAME\")\n```\n\n## Example browser client (In a seperate browser)\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a connection to a named stream server\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\nstream.on(\"data\", function (data) {\n    console.log(\"[CLIENT]\", data)\n})\nstream.write(\"from client\")\n```\n\n## Example proxy server\n\n``` js\nvar boot = require(\"boot\")\n    , StreamServerProxy = require(\"browser-stream-server\")\n    , StreamRouter = require(\"stream-router\")\n\n// route stream traffic from boot through a stream router\nvar streamRouter = StreamRouter()\n    , sock = boot(streamRouter)\n\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/browser-server/*\"\n    , StreamServerProxy(\"/browser-server\"))\n\nsock.install(someHttpServer, \"/boot\")\n```\n\n## Motivation\n\nThis a pre-runner to real P2P experiments that will be done once we can create [data channels][3] with WebRTC\n\nThis is the smallest piece necessary to spawn arbitary stream servers in browsers.\n\n## Documentation\n\n### `StreamClient(mdm, options).connect(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\n```\n\nReturns a stream connection to that server name. It assumes the server is running somewhere else. If it's not then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\n### `StreamServer(mdm, options, callback).listen(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\nvar server = StreamServer(mdm, options, function (stream) {\n    // handle stream\n}).listen(\"SERVER_NAME\")\n```\n\nCreates a server stream connection. It assumes that named server is not already running somewhere else. If it is then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions are optional, you can pass a callback as the second parameter. The callback get's called every time someone else calls `.connect(serverName)` and you get passed a stream connection to them\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\nTo close the server just `.end()` the returned server\n\n### `StreamServerProxy(prefix)`\n\nTo be used in the server\n\n``` js\nvar StreamServerProxy = require(\"browser-stream-server\")\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/somePrefix/*\"\n    , StreamServerProxy(\"/somePrefix\"))\n```\n\nSet up a steam route handler to allow the stream servers and clients to be proxied through your central server.\n\nOptionally pass in a prefix which defaults to `\"/browser-server\"`. If you pass in a different prefix make sure that your browser code matches the prefix.\n\n## How it works\n\nWhen you call `StreamServer(...).listen(SERVER_NAME)` you open a server stream to the `StreamServerProxy` and tell the server \"redirect all connect SERVER_NAME traffic to me\"\n\nWhen you call `StreamClient(...).connect(SERVER_NAME)` you open a client stream to the `StreamServerProxy` saying \"connect me to SERVER_NAME\". The `StreamProxyServer` then sends a message to `StreamServer` identified by SERVER_NAME. The message contains a unique identifier, UNIQUE_ID for this client stream. The proxy server stores this client stream in memory.\n\nThe `StreamServer` receives this message and opens another connection to the `StreamServerProxy` saying \"hi I'm server SERVER_NAME and want to connect to client UNIQUE_ID\". The `StreamServerProxy` then gets the client stream out of memory and connects it to the new server connection which allows the client to talk to the server\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server\n  [3]: http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCPeerConnection-createDataChannel-DataChannel-DOMString-label-DataChannelInit-dataChannelDict\n  [4]: https://github.com/dominictarr/mux-demux#muxdemuxoptions","_id":"browser-stream-server@0.1.0","dist":{"shasum":"e64dd20490f3b82f5a4748f0187bd599db3d1743","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.1.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.0":{"name":"browser-stream-server","version":"0.2.0","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"0.0.3","node-uuid":"~1.3.3","stream-store":"~0.2.0","stream-router":"0.0.2","pause-stream":"0.0.3","through":"~0.1.4","duplexer":"0.0.1","boot":"~0.7.0","ap":"~0.1.0"},"devDependencies":{"browserify-server":"~0.2.0","boot":"~0.6.1","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server\n\nA stream server in the browser\n\nCreate streaming servers in your browser. Emulating peer to peer connections through a central proxy server\n\n## Example browser server (In a seperate browser)\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a Stream server and listen on a server name\nStreamServer(mdm, function (stream) {\n    // Called every time a client opens up a stream connection to you\n    stream.on(\"data\", function (data) {\n        console.log(\"[SERVER]\", data)\n    })\n    stream.write(\"from server\")\n}).listen(\"SERVER_NAME\")\n```\n\n## Example browser client (In a seperate browser)\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a connection to a named stream server\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\nstream.on(\"data\", function (data) {\n    console.log(\"[CLIENT]\", data)\n})\nstream.write(\"from client\")\n```\n\n## Example proxy server\n\n``` js\nvar boot = require(\"boot\")\n    , StreamServerProxy = require(\"browser-stream-server\")\n    , StreamRouter = require(\"stream-router\")\n\n// route stream traffic from boot through a stream router\nvar streamRouter = StreamRouter()\n    , sock = boot(streamRouter)\n\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/browser-server/*\"\n    , StreamServerProxy(\"/browser-server\"))\n\nsock.install(someHttpServer, \"/boot\")\n```\n\n## Motivation\n\nThis a pre-runner to real P2P experiments that will be done once we can create [data channels][3] with WebRTC\n\nThis is the smallest piece necessary to spawn arbitary stream servers in browsers.\n\n## Documentation\n\n### `StreamClient(mdm, options).connect(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\n```\n\nReturns a stream connection to that server name. It assumes the server is running somewhere else. If it's not then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\n### `StreamServer(mdm, options, callback).listen(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\nvar server = StreamServer(mdm, options, function (stream) {\n    // handle stream\n}).listen(\"SERVER_NAME\")\n```\n\nCreates a server stream connection. It assumes that named server is not already running somewhere else. If it is then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions are optional, you can pass a callback as the second parameter. The callback get's called every time someone else calls `.connect(serverName)` and you get passed a stream connection to them\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\nTo close the server just `.end()` the returned server\n\n### `StreamServerProxy(prefix)`\n\nTo be used in the server\n\n``` js\nvar StreamServerProxy = require(\"browser-stream-server\")\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/somePrefix/*\"\n    , StreamServerProxy(\"/somePrefix\"))\n```\n\nSet up a steam route handler to allow the stream servers and clients to be proxied through your central server.\n\nOptionally pass in a prefix which defaults to `\"/browser-server\"`. If you pass in a different prefix make sure that your browser code matches the prefix.\n\n## How it works\n\nWhen you call `StreamServer(...).listen(SERVER_NAME)` you open a server stream to the `StreamServerProxy` and tell the server \"redirect all connect SERVER_NAME traffic to me\"\n\nWhen you call `StreamClient(...).connect(SERVER_NAME)` you open a client stream to the `StreamServerProxy` saying \"connect me to SERVER_NAME\". The `StreamProxyServer` then sends a message to `StreamServer` identified by SERVER_NAME. The message contains a unique identifier, UNIQUE_ID for this client stream. The proxy server stores this client stream in memory.\n\nThe `StreamServer` receives this message and opens another connection to the `StreamServerProxy` saying \"hi I'm server SERVER_NAME and want to connect to client UNIQUE_ID\". The `StreamServerProxy` then gets the client stream out of memory and connects it to the new server connection which allows the client to talk to the server\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server\n  [3]: http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCPeerConnection-createDataChannel-DataChannel-DOMString-label-DataChannelInit-dataChannelDict\n  [4]: https://github.com/dominictarr/mux-demux#muxdemuxoptions","_id":"browser-stream-server@0.2.0","dist":{"shasum":"9156c0a761eac983e6333a4250612b6cb344c07c","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.2.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.3.0":{"name":"browser-stream-server","version":"0.3.0","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"0.0.3","node-uuid":"~1.3.3","stream-store":"~0.2.0","stream-router":"0.0.2","pause-stream":"0.0.3","through":"~0.1.4","duplexer":"0.0.1","boot":"~0.7.0","ap":"~0.1.0"},"devDependencies":{"browserify-server":"~0.2.0","boot":"~0.6.1","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server\n\nA stream server in the browser\n\nCreate streaming servers in your browser. Emulating peer to peer connections through a central proxy server\n\n## Example browser server (In a seperate browser)\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a Stream server and listen on a server name\nStreamServer(mdm, function (stream) {\n    // Called every time a client opens up a stream connection to you\n    stream.on(\"data\", function (data) {\n        console.log(\"[SERVER]\", data)\n    })\n    stream.write(\"from server\")\n}).listen(\"SERVER_NAME\")\n```\n\n## Example browser client (In a seperate browser)\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a connection to a named stream server\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\nstream.on(\"data\", function (data) {\n    console.log(\"[CLIENT]\", data)\n})\nstream.write(\"from client\")\n```\n\n## Example proxy server\n\n``` js\nvar boot = require(\"boot\")\n    , StreamServerProxy = require(\"browser-stream-server\")\n    , StreamRouter = require(\"stream-router\")\n\n// route stream traffic from boot through a stream router\nvar streamRouter = StreamRouter()\n    , sock = boot(streamRouter)\n\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/browser-server/*\"\n    , StreamServerProxy(\"/browser-server\"))\n\nsock.install(someHttpServer, \"/boot\")\n```\n\n## Motivation\n\nThis a pre-runner to real P2P experiments that will be done once we can create [data channels][3] with WebRTC\n\nThis is the smallest piece necessary to spawn arbitary stream servers in browsers.\n\n## Documentation\n\n### `StreamClient(mdm, options).connect(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\n```\n\nReturns a stream connection to that server name. It assumes the server is running somewhere else. If it's not then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\n### `StreamServer(mdm, options, callback).listen(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\nvar server = StreamServer(mdm, options, function (stream) {\n    // handle stream\n}).listen(\"SERVER_NAME\")\n```\n\nCreates a server stream connection. It assumes that named server is not already running somewhere else. If it is then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions are optional, you can pass a callback as the second parameter. The callback get's called every time someone else calls `.connect(serverName)` and you get passed a stream connection to them\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\nTo close the server just `.end()` the returned server\n\n### `StreamServerProxy(prefix)`\n\nTo be used in the server\n\n``` js\nvar StreamServerProxy = require(\"browser-stream-server\")\n    , proxy = StreamServerProxy(\"/somePrefix\")\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/somePrefix/*\", proxy)\n```\n\nSet up a steam route handler to allow the stream servers and clients to be proxied through your central server.\n\nOptionally pass in a prefix which defaults to `\"/browser-server\"`. If you pass in a different prefix make sure that your browser code matches the prefix.\n\n#### proxy events\n\nThe returned proxy object emits `server-created` and `server-destroyed` events when a server stream connects and claims to own the SERVER_NAME\n\n``` js\nproxy.on(\"server-created\", function (serverName) {\n    createSomeSpecialResources(serverName)\n})\n\nproxy.on(\"server-destroyed\", function (serverName) {\n    destroySpecialResources(serverName)\n})\n```\n\n#### `proxy.connect(\"serverName\")`\n\n``` js\nvar stream = proxy.connect(serverName)\n```\n\nYou can manually connect directly to a stream server. This runs similar logic to `StreamClient(...).connect(serverName)`\n\n## How it works\n\nWhen you call `StreamServer(...).listen(SERVER_NAME)` you open a server stream to the `StreamServerProxy` and tell the server \"redirect all connect SERVER_NAME traffic to me\"\n\nWhen you call `StreamClient(...).connect(SERVER_NAME)` you open a client stream to the `StreamServerProxy` saying \"connect me to SERVER_NAME\". The `StreamProxyServer` then sends a message to `StreamServer` identified by SERVER_NAME. The message contains a unique identifier, UNIQUE_ID for this client stream. The proxy server stores this client stream in memory.\n\nThe `StreamServer` receives this message and opens another connection to the `StreamServerProxy` saying \"hi I'm server SERVER_NAME and want to connect to client UNIQUE_ID\". The `StreamServerProxy` then gets the client stream out of memory and connects it to the new server connection which allows the client to talk to the server\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server\n  [3]: http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCPeerConnection-createDataChannel-DataChannel-DOMString-label-DataChannelInit-dataChannelDict\n  [4]: https://github.com/dominictarr/mux-demux#muxdemuxoptions","_id":"browser-stream-server@0.3.0","dist":{"shasum":"577c256619ab635e947404dae17cbca80f9adb08","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.3.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.3.1":{"name":"browser-stream-server","version":"0.3.1","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"0.0.3","node-uuid":"~1.3.3","stream-store":"~0.2.0","stream-router":"0.0.2","pause-stream":"0.0.3","through":"~0.1.4","duplexer":"0.0.1","ap":"~0.1.0","xtend":"~1.0.3"},"devDependencies":{"boot":"~0.6.1","browserify-server":"~0.2.0","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server\n\nA stream server in the browser\n\nCreate streaming servers in your browser. Emulating peer to peer connections through a central proxy server\n\n## Example browser server (In a seperate browser)\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a Stream server and listen on a server name\nStreamServer(mdm, function (stream) {\n    // Called every time a client opens up a stream connection to you\n    stream.on(\"data\", function (data) {\n        console.log(\"[SERVER]\", data)\n    })\n    stream.write(\"from server\")\n}).listen(\"SERVER_NAME\")\n```\n\n## Example browser client (In a seperate browser)\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a connection to a named stream server\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\nstream.on(\"data\", function (data) {\n    console.log(\"[CLIENT]\", data)\n})\nstream.write(\"from client\")\n```\n\n## Example proxy server\n\n``` js\nvar boot = require(\"boot\")\n    , StreamServerProxy = require(\"browser-stream-server\")\n    , StreamRouter = require(\"stream-router\")\n\n// route stream traffic from boot through a stream router\nvar streamRouter = StreamRouter()\n    , sock = boot(streamRouter)\n\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/browser-server/*\"\n    , StreamServerProxy(\"/browser-server\"))\n\nsock.install(someHttpServer, \"/boot\")\n```\n\n## Motivation\n\nThis a pre-runner to real P2P experiments that will be done once we can create [data channels][3] with WebRTC\n\nThis is the smallest piece necessary to spawn arbitary stream servers in browsers.\n\n## Documentation\n\n### `StreamClient(mdm, options).connect(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\n```\n\nReturns a stream connection to that server name. It assumes the server is running somewhere else. If it's not then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\n### `StreamServer(mdm, options, callback).listen(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\nvar server = StreamServer(mdm, options, function (stream) {\n    // handle stream\n}).listen(\"SERVER_NAME\")\n```\n\nCreates a server stream connection. It assumes that named server is not already running somewhere else. If it is then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions are optional, you can pass a callback as the second parameter. The callback get's called every time someone else calls `.connect(serverName)` and you get passed a stream connection to them\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\nTo close the server just `.end()` the returned server\n\n### `StreamServerProxy(prefix)`\n\nTo be used in the server\n\n``` js\nvar StreamServerProxy = require(\"browser-stream-server\")\n    , proxy = StreamServerProxy(\"/somePrefix\")\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/somePrefix/*\", proxy)\n```\n\nSet up a steam route handler to allow the stream servers and clients to be proxied through your central server.\n\nOptionally pass in a prefix which defaults to `\"/browser-server\"`. If you pass in a different prefix make sure that your browser code matches the prefix.\n\n#### proxy events\n\nThe returned proxy object emits `server-created` and `server-destroyed` events when a server stream connects and claims to own the SERVER_NAME\n\n``` js\nproxy.on(\"server-created\", function (serverName) {\n    createSomeSpecialResources(serverName)\n})\n\nproxy.on(\"server-destroyed\", function (serverName) {\n    destroySpecialResources(serverName)\n})\n```\n\n#### `proxy.connect(\"serverName\")`\n\n``` js\nvar stream = proxy.connect(serverName)\n```\n\nYou can manually connect directly to a stream server. This runs similar logic to `StreamClient(...).connect(serverName)`\n\n## How it works\n\nWhen you call `StreamServer(...).listen(SERVER_NAME)` you open a server stream to the `StreamServerProxy` and tell the server \"redirect all connect SERVER_NAME traffic to me\"\n\nWhen you call `StreamClient(...).connect(SERVER_NAME)` you open a client stream to the `StreamServerProxy` saying \"connect me to SERVER_NAME\". The `StreamProxyServer` then sends a message to `StreamServer` identified by SERVER_NAME. The message contains a unique identifier, UNIQUE_ID for this client stream. The proxy server stores this client stream in memory.\n\nThe `StreamServer` receives this message and opens another connection to the `StreamServerProxy` saying \"hi I'm server SERVER_NAME and want to connect to client UNIQUE_ID\". The `StreamServerProxy` then gets the client stream out of memory and connects it to the new server connection which allows the client to talk to the server\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server\n  [3]: http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCPeerConnection-createDataChannel-DataChannel-DOMString-label-DataChannelInit-dataChannelDict\n  [4]: https://github.com/dominictarr/mux-demux#muxdemuxoptions","_id":"browser-stream-server@0.3.1","dist":{"shasum":"35163c82cbb3e1a2e7b079316c024b4c002d3ba2","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.3.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.4.0":{"name":"browser-stream-server","version":"0.4.0","description":"A stream server in the browser","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"main":"index","homepage":"https://github.com/Colingo/browser-stream-server","browserify":"browser.js","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Colingo/browser-stream-server/issues","email":"raynos2@gmail.com"},"dependencies":{"hat":"~0.0.3","stream-store":"~0.2.0","stream-router":"~0.1.0","pause-stream":"~0.0.3","through":"~0.1.4","duplexer":"~0.0.2","ap":"~0.1.0","xtend":"~1.0.3"},"devDependencies":{"boot":"~0.8.0","browserify-server":"~0.2.1","lazynode":"~0.1.0"},"licenses":[{"type":"MIT","url":"http://github.com/Colingo/browser-stream-server/raw/master/LICENSE"}],"scripts":{},"readme":"# browser-stream-server\n\nA stream server in the browser\n\nCreate streaming servers in your browser. Emulating peer to peer connections through a central proxy server\n\n## Example browser server (In a seperate browser)\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a Stream server and listen on a server name\nStreamServer(mdm, function (stream) {\n    // Called every time a client opens up a stream connection to you\n    stream.on(\"data\", function (data) {\n        console.log(\"[SERVER]\", data)\n    })\n    stream.write(\"from server\")\n}).listen(\"SERVER_NAME\")\n```\n\n## Example browser client (In a seperate browser)\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\n    , boot = require(\"boot\")\n    , mdm = boot(\"/boot\")\n\n// Open a connection to a named stream server\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\nstream.on(\"data\", function (data) {\n    console.log(\"[CLIENT]\", data)\n})\nstream.write(\"from client\")\n```\n\n## Example proxy server\n\n``` js\nvar boot = require(\"boot\")\n    , StreamServerProxy = require(\"browser-stream-server\")\n    , StreamRouter = require(\"stream-router\")\n\n// route stream traffic from boot through a stream router\nvar streamRouter = StreamRouter()\n    , sock = boot(streamRouter)\n\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/browser-server/*\"\n    , StreamServerProxy(\"/browser-server\"))\n\nsock.install(someHttpServer, \"/boot\")\n```\n\n## Motivation\n\nThis a pre-runner to real P2P experiments that will be done once we can create [data channels][3] with WebRTC\n\nThis is the smallest piece necessary to spawn arbitary stream servers in browsers.\n\n## Documentation\n\n### `StreamClient(mdm, options).connect(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamClient = require(\"browser-stream-server\")\nvar stream = StreamClient(mdm).connect(\"SERVER_NAME\")\n```\n\nReturns a stream connection to that server name. It assumes the server is running somewhere else. If it's not then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\n### `StreamServer(mdm, options, callback).listen(serverName)`\n\nTo be used in the browser\n\n``` js\nvar StreamServer = require(\"browser-stream-server\")\nvar server = StreamServer(mdm, options, function (stream) {\n    // handle stream\n}).listen(\"SERVER_NAME\")\n```\n\nCreates a server stream connection. It assumes that named server is not already running somewhere else. If it is then the stream is closed.\n\nThe `mdm` value is a [MuxDemux][4] stream. This can be got from mux-demux, mux-demux-shoe or boot.\n\noptions are optional, you can pass a callback as the second parameter. The callback get's called every time someone else calls `.connect(serverName)` and you get passed a stream connection to them\n\noptions include a prefix option which allows you to set a custom prefix if the StreamServerProxy uses a custom prefix.\n\nTo close the server just `.end()` the returned server\n\n### `StreamServerProxy(prefix)`\n\nTo be used in the server\n\n``` js\nvar StreamServerProxy = require(\"browser-stream-server\")\n    , proxy = StreamServerProxy(\"/somePrefix\")\n// for every request to /browser-server let the StreamServer proxy handle it\nstreamRouter.addRoute(\"/somePrefix/*\", proxy)\n```\n\nSet up a steam route handler to allow the stream servers and clients to be proxied through your central server.\n\nOptionally pass in a prefix which defaults to `\"/browser-server\"`. If you pass in a different prefix make sure that your browser code matches the prefix.\n\n#### proxy events\n\nThe returned proxy object emits `server-created` and `server-destroyed` events when a server stream connects and claims to own the SERVER_NAME\n\n``` js\nproxy.on(\"server-created\", function (serverName) {\n    createSomeSpecialResources(serverName)\n})\n\nproxy.on(\"server-destroyed\", function (serverName) {\n    destroySpecialResources(serverName)\n})\n```\n\n#### `proxy.connect(\"serverName\")`\n\n``` js\nvar stream = proxy.connect(serverName)\n```\n\nYou can manually connect directly to a stream server. This runs similar logic to `StreamClient(...).connect(serverName)`\n\n## How it works\n\nWhen you call `StreamServer(...).listen(SERVER_NAME)` you open a server stream to the `StreamServerProxy` and tell the server \"redirect all connect SERVER_NAME traffic to me\"\n\nWhen you call `StreamClient(...).connect(SERVER_NAME)` you open a client stream to the `StreamServerProxy` saying \"connect me to SERVER_NAME\". The `StreamProxyServer` then sends a message to `StreamServer` identified by SERVER_NAME. The message contains a unique identifier, UNIQUE_ID for this client stream. The proxy server stores this client stream in memory.\n\nThe `StreamServer` receives this message and opens another connection to the `StreamServerProxy` saying \"hi I'm server SERVER_NAME and want to connect to client UNIQUE_ID\". The `StreamServerProxy` then gets the client stream out of memory and connects it to the new server connection which allows the client to talk to the server\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server\n  [3]: http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCPeerConnection-createDataChannel-DataChannel-DOMString-label-DataChannelInit-dataChannelDict\n  [4]: https://github.com/dominictarr/mux-demux#muxdemuxoptions","_id":"browser-stream-server@0.4.0","dist":{"shasum":"dba07898e6349da34bf4999f8976ab669290b617","tarball":"http://registry.npmjs.org/browser-stream-server/-/browser-stream-server-0.4.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"readme":"# browser-stream-server [![build status][1]][2]\n\nA stream server in the browser\n\n## Example\n\n## Installation\n\n`npm install browser-stream-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browser-stream-server.png\n  [2]: http://travis-ci.org/Raynos/browser-stream-server","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2012-08-14T21:27:50.015Z","created":"2012-08-11T00:43:46.980Z","0.0.1":"2012-08-11T00:43:48.261Z","0.0.2":"2012-08-11T00:59:30.007Z","0.1.0":"2012-08-11T01:59:44.857Z","0.2.0":"2012-08-11T05:29:39.981Z","0.3.0":"2012-08-11T06:17:40.964Z","0.3.1":"2012-08-11T07:05:43.116Z","0.4.0":"2012-08-14T21:27:50.015Z"},"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Colingo/browser-stream-server.git"},"_attachments":{"browser-stream-server-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-4RKM2L2NL0ZD/nfMKiGudA==","length":6059,"stub":true},"browser-stream-server-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Qs0HepvtBV2TOMzB+DYgSA==","length":5613,"stub":true},"browser-stream-server-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-rwRO6oDqBc3bjPd+Q2sUqA==","length":5605,"stub":true},"browser-stream-server-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-mgsD5HbRfgV548Kva8lhXg==","length":5317,"stub":true},"browser-stream-server-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-hk+/as16Qd+KvA3H23+SaA==","length":5037,"stub":true},"browser-stream-server-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-5mIN1tZDAqwRNBAPYQJePw==","length":3237,"stub":true},"browser-stream-server-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LJja69WcZ0p87OHMmHhiGA==","length":3232,"stub":true}}}},
{"id":"browserType","key":"browserType","value":{"rev":"5-8cc3f40b3b771372c6bc95f3752d6cfc"},"doc":{"_id":"browserType","_rev":"5-8cc3f40b3b771372c6bc95f3752d6cfc","name":"browserType","description":"to determine the browser type, this is a middleware of connect.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"author":{"name":"brighthas","email":"brighthas@gmail.com","url":"www.w667.com"},"name":"browserType","description":"to determine the browser type, this is a middleware of connect.","version":"0.1.0","homepage":"https://github.com/brighthas/browserType-connect","repository":{"url":"git@github.com:brighthas/browserType-connect.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brighthas","email":"brighthas@gmail.com"},"_id":"browserType@0.1.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"33b6d3c48d63453c11e33b13c17af96654ebb6f4","tarball":"http://registry.npmjs.org/browserType/-/browserType-0.1.0.tgz"},"maintainers":[{"name":"brighthas","email":"brighthas@gmail.com"}]},"0.2.0":{"author":{"name":"brighthas","email":"brighthas@gmail.com","url":"www.w667.com"},"name":"browserType","description":"to determine the browser type, this is a middleware of connect.","version":"0.2.0","homepage":"https://github.com/brighthas/browserType-connect","repository":{"url":"git@github.com:brighthas/browserType-connect.git"},"main":"index.js","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brighthas","email":"brighthas@gmail.com"},"_id":"browserType@0.2.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"6f1bce5b48a11f10305342779fda31e67936f742","tarball":"http://registry.npmjs.org/browserType/-/browserType-0.2.0.tgz"},"maintainers":[{"name":"brighthas","email":"brighthas@gmail.com"}]}},"readme":"browserType-connet\r\n==================\r\n\r\nto determine the browser type, this is a middleware of connect.\r\n\r\n# install\r\n\r\n    cd node_modules\r\n    git clone https://github.com/brighthas/browserType-connect.git browserType\r\n    \r\n\r\n# Example:\r\n\r\n    var express = require('express')\r\n    var app = express.createServer(\r\n        require('browserType')()\r\n    )\r\n\r\n    app.get('/',function(req,res){\r\n      res.send(req.browserType)\r\n    })\r\n\r\n# result:\r\n    if IE6 open localhost:3000 , the result is \"ie6\"\r\n    if IE9 open localhost:3000 , the result is \"ie9\"\r\n    if Chrome open localhost:3000 , the result is \"chrome\"\r\n    if Opera open localhost:3000 , the result is \"opera\"\r\n    if Safari open localhost:3000 , the result is \"safari\"\r\n    if Firefox open localhost:3000 , the result is \"firefox\"\r\n    if Maxthon open localhost:3000 , the result is \"chrome\"\r\n\r\n\r\n","maintainers":[{"name":"brighthas","email":"brighthas@gmail.com"}],"time":{"modified":"2012-06-16T08:40:00.558Z","created":"2012-06-16T07:09:30.775Z","0.1.0":"2012-06-16T07:09:38.640Z","0.2.0":"2012-06-16T08:40:00.558Z"},"author":{"name":"brighthas","email":"brighthas@gmail.com","url":"www.w667.com"},"repository":{"url":"git@github.com:brighthas/browserType-connect.git"},"_attachments":{"browserType-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-vJbGKKVZkw+BsvPAhP9ifA==","length":1870,"stub":true},"browserType-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1jPQSeyP7Gi59/T4zc0UQQ==","length":1695,"stub":true}}}},
{"id":"browserbuild","key":"browserbuild","value":{"rev":"36-0a931f50df44038898d34c9c781377af"},"doc":{"_id":"browserbuild","_rev":"36-0a931f50df44038898d34c9c781377af","name":"browserbuild","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"browserbuild","version":"0.1.0","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.4.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d065d2c39b6d666976c9dadcc8d379ea28d08f54","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.1.0.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.1.1":{"name":"browserbuild","version":"0.1.1","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.4.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ce705ce31d1324d1b70ae5e1778f5632596f4383","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.1.1.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.2.0":{"name":"browserbuild","version":"0.2.0","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.4.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2a82b14c6e5899d6fd52aeb6b87ba79cfca94e75","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.2.0.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.2.1":{"name":"browserbuild","version":"0.2.1","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.4.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6925d5ca412baaabcb016ef6b05538751b906a0c","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.2.1.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.3.0":{"name":"browserbuild","version":"0.3.0","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.4.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b028837ff2bff612e30efe01609445a4ee54cf29","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.3.0.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.3.1":{"name":"browserbuild","version":"0.3.1","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.4.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.3.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"35c6c891db126e3455a9c2fe0013d0ec1eae7840","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.3.1.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.0":{"name":"browserbuild","version":"0.4.0","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"86aace43d679a295a417cc89eb988a89ec1a9c09","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.0.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.1":{"name":"browserbuild","version":"0.4.1","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a602184f6b46c85b167671334777725b71f83099","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.1.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.2":{"name":"browserbuild","version":"0.4.2","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"f8212941ab808eb132e48165a4c903d533d79417","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.2.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.3":{"name":"browserbuild","version":"0.4.3","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.3","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"56118307d13d8982c23a2ba1848af5af0e44c70c","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.3.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.4":{"name":"browserbuild","version":"0.4.4","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"953e994daba1d4167a64ab8d4f457faac03a567c","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.4.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.5":{"name":"browserbuild","version":"0.4.5","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"18c94379a5ce2c76eb1690ee04062efa00fe9b8f","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.5.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.6":{"name":"browserbuild","version":"0.4.6","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"*"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"a6d36dc8e870eb882308323fc898987199357e8a","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.6.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.7":{"name":"browserbuild","version":"0.4.7","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"0.6.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.7","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"38de07376d53507850b8f9053c41b85536941b64","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.7.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.8":{"name":"browserbuild","version":"0.4.8","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"0.6.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.8","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"3240500df82472ebd52d89e5b2eeb96e454b1157","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.8.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.4.9":{"name":"browserbuild","version":"0.4.9","bin":{"browserbuild":"./bin/browserbuild"},"dependencies":{"commander":"0.5.x","debug":"0.6.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.4.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"55d593dd510790ee55babd749eddc5ee6f9df9ba","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.4.9.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.5.0":{"name":"browserbuild","version":"0.5.0","bin":{"browserbuild":"./bin/browserbuild"},"main":"./lib/browserbuild.js","dependencies":{"commander":"0.5.x","debug":"0.6.0"},"_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"browserbuild@0.5.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"92f2bfa18f14408e348b5f31448c7de202ec5b6c","tarball":"http://registry.npmjs.org/browserbuild/-/browserbuild-0.5.0.tgz"},"maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}]}},"readme":"\n# Browserbuild\n\n## The simple solution to Node.JS/browser interoperatibility\n\nBrowserbuild solves the same problem everyone wants to solve: how do I make a\nmodule interoperable between the server and client?\n\nIt takes 3 easy steps\n\n### Step 1: write for Node\n\n```js\n/**\n * Module dependencies.\n */\n\nvar a = require('./b')\n\n/**\n * Module exports.\n */\n\nexports.hello = function () { };\n```\n\n### Step 2: build for browser\n\n```bash\n$ browserbuild world.js\n# outputs dist/world.js\n```\n\n### Step 3: use\n\nOn the server-side:\n\n```js\nrequire('./world').hello();\n```\n\nOn the client side:\n\n```html\n<script src=\"/js/world.js\"></script>\n<script>\n  world.hello();\n</script>\n```\n\n## Features\n\n- Write code like you would write for Node.JS. \n  - No wrappers\n  - No `undefined` type checking for `module` or `window`.\n- No new patterns\n  - No AMD, no `require.async`, no CommonJS transport proposals.\n  - Doesn't depend on `require` implementations on the client.\n  - It exposes your module as a single global, like `jQuery`, `io`, `_`. Just\n    like everyone is used to.\n- No code bloat.\n  - The conversion for the browser only adds a few lines of code.\n  - No trouble debugging.\n\n## Credits\n\n- `require` functions by [Jonah Fox](https://github.com/weepy), with\n  modifications by TJ Holowaychuk &lt;tj@learnboost.com&gt;\n- inspired by `browserify`\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Guillermo Rauch &lt;guillermo@learnboost.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"rauchg","email":"rauchg@gmail.com"}],"time":{"modified":"2012-08-06T12:25:01.873Z","created":"2011-12-03T22:22:34.635Z","0.1.0":"2011-12-03T22:22:35.914Z","0.1.1":"2011-12-15T23:18:34.195Z","0.2.0":"2011-12-22T00:00:47.906Z","0.2.1":"2012-01-16T15:41:02.791Z","0.3.0":"2012-01-18T16:46:54.132Z","0.3.1":"2012-03-09T15:40:51.608Z","0.4.0":"2012-03-20T18:30:00.455Z","0.4.1":"2012-03-20T19:36:28.331Z","0.4.2":"2012-03-20T19:43:42.522Z","0.4.3":"2012-03-20T19:50:44.484Z","0.4.4":"2012-03-25T14:43:31.736Z","0.4.5":"2012-03-25T14:52:29.551Z","0.4.6":"2012-04-02T18:56:45.855Z","0.4.7":"2012-04-03T12:31:46.419Z","0.4.8":"2012-04-03T12:45:30.688Z","0.4.9":"2012-05-23T01:23:23.527Z","0.5.0":"2012-07-07T21:54:25.519Z"},"users":{"sjonnet19":true},"_attachments":{"browserbuild-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-yxegy1Og9v6JQ8aSfGaClA==","length":8248,"stub":true},"browserbuild-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-uF/h278HZrbWQ2JKorfBcw==","length":8464,"stub":true},"browserbuild-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-Wn6CRx0FdIKPQcXFit9SpA==","length":8391,"stub":true},"browserbuild-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-HF/ONsIzEwu6fjFSwg2xrA==","length":8363,"stub":true},"browserbuild-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-t3y4RIvYp3fYNpdRGuSTCQ==","length":4303,"stub":true},"browserbuild-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-m66LEJvpAYc+/fRIZYuVYg==","length":4257,"stub":true},"browserbuild-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-QIhYvlGRVis5vmfnLFDW5A==","length":4243,"stub":true},"browserbuild-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-Jg9bddlIIZdchbGy7m0bRQ==","length":4002,"stub":true},"browserbuild-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-TBhOnGmpsiyUTInfb0iLrg==","length":3972,"stub":true},"browserbuild-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-x+ALs9FqFPXhp1E4jmgcCw==","length":3939,"stub":true},"browserbuild-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ReGzpJmKVPdulsv6vEfq1Q==","length":3866,"stub":true},"browserbuild-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zUDWC5DFcGmcmgHpThJIVQ==","length":4560,"stub":true},"browserbuild-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-BfLoz58dnchh5T4xu3fFBw==","length":10240,"stub":true},"browserbuild-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-xuO94VjmIPSq6SRrvcB0dQ==","length":10240,"stub":true},"browserbuild-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OfEBiGPIiCMHuVX7u2JKqA==","length":10240,"stub":true},"browserbuild-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-41uhLf1oEryDHxKJYNIqYg==","length":10240,"stub":true},"browserbuild-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/+ZmByvgplZVbq0lVrQ7xg==","length":10240,"stub":true}}}},
{"id":"browserchannel","key":"browserchannel","value":{"rev":"37-2dd17c201dde7d0ac01a109a90db46e8"},"doc":{"_id":"browserchannel","_rev":"37-2dd17c201dde7d0ac01a109a90db46e8","name":"browserchannel","description":"Google BrowserChannel server for NodeJS","dist-tags":{"latest":"0.4.2"},"versions":{"0.0.0":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.0.0","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"~0.4"},"scripts":{"test":"nodeunit tests.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/josephg/.npm/browserchannel/0.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browserchannel@0.0.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"4c9d7cf74e656b0d1edfd6ea565844d2f395aac9","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.0.0.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.0.1":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.0.1","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"~0.4"},"scripts":{"test":"nodeunit tests.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/josephg/.npm/browserchannel/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browserchannel@0.0.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"3a6be3a02cb422c7153ed0c8c3d30ba51efd64a8","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.0.1.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.1.0":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.1.0","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"~0.4"},"scripts":{"test":"nodeunit tests.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*"},"devDependencies":{},"_npmJsonOpts":{"file":"/Users/josephg/.npm/browserchannel/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browserchannel@0.1.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d033e8696e1e5aefe810773b2a31d3e27113c15a","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.1.0.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.2.0","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"~0.4"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.2.0","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8c2268ca066e4564dbca02656e72d347511dbea6","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.2.0.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.3.0":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.3.0","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"~0.4"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.3.0","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"fb5a0b54be5f3a67339fca661939e65c24b671e1","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.3.0.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.3.1":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.3.1","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"~0.4"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.3.1","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b983d72052aa0836767ad821a19c658a3a660de6","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.3.1.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.3.2":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.3.2","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"0.4 || 0.6"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.3.2","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"925ff28b49f1e4dfb49da4946eea1cd6acecbead","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.3.2.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.3.3":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.3.3","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"0.4 || 0.6"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.3.3","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"d3d014d94ba2e1cffaf5df75069ebcc849c29350","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.3.3.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.3.4":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.3.4","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"0.4 || 0.6"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.3.4","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"c562a63ae4460cdfbf1cb2ebce307f36119f5fb0","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.3.4.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.4.0":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.4.0","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"0.4 || 0.6"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.4.0","_engineSupported":true,"_npmVersion":"1.0.98","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4c67c2657a84cdd585bf8c4e1ad694aef22ad215","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.4.0.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.4.1":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.4.1","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engines":{"node":"0.4 || 0.6"},"scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1.7","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"_npmUser":{"name":"josephg","email":"josephg@gmail.com"},"_id":"browserchannel@0.4.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"79c2e655ee4066689f5860ed8581c00896751175","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.4.1.tgz"},"readme":"A [BrowserChannel](http://closure-library.googlecode.com/svn/trunk/closure/goog/net/browserchannel.js) server.\n\n**tldr;** Its like socket.io, but it scales better and it has fewer bugs. It\njust does long polling. It doesn't support websockets and doesn't work cross-domain.\n\nBrowserChannel is google's version of [socket.io](http://socket.io) from when they first put\nchat in gmail. Unlike socket.io, browserchannel provides much better guarantees about message\ndelivery and state. It has better reconnection logic and error handling. With browserchannel,\n**you know whats going on**.\n\n[![Build Status](https://secure.travis-ci.org/josephg/node-browserchannel.png)](http://travis-ci.org/josephg/node-browserchannel)\n\nnode-browserchannel:\n\n- Is compatible with the closure library's browserchannel implementation\n- Is super thoroughly tested\n- Works in IE5.5+, iOS, Safari, Chrome, Firefox, and probably others.\n- Works in any network environment (incl. behind buffering proxies)\n\n---\n\n# Use it\n\n    # npm install browserchannel\n\nBrowserchannel is implemented as connect middleware. Here's an echo server:\n\n```coffeescript\nbrowserChannel = require('browserchannel').server\nconnect = require 'connect'\n\nserver = connect(\n  connect.static \"#{__dirname}/public\"\n  browserChannel (session) ->\n    console.log \"New session: #{session.id} from #{session.address} with cookies #{session.headers.cookie}\"\n\n    session.on 'message', (data) ->\n      console.log \"#{session.id} sent #{JSON.stringify data}\"\n      session.send data\n\n    session.on 'close', (reason) ->\n      console.log \"Session #{session.id} disconnected (#{reason})\"\n      \n    # This tells the session to stop trying to connect\n    session.stop()\n    \n    # This just kills the session.\n    session.abort()\n).listen(4321)\n\nconsole.log 'Echo server listening on localhost:4321'\n```\n\nThe client emulates the [websocket API](http://dev.w3.org/html5/websockets/). Here is a simple client:\n\n```coffeescript\n{BCSocket} = require 'browserchannel'\n\nsocket = new BCSocket 'http://localhost:4321/channel'\nsocket.onopen = ->\n  socket.send {hi:'there'}\nsocket.onmessage = (message) ->\n  console.log 'got message', message\n\n# later...\nsocket.close()\n```\n\n... Or from a website:\n\n```html\n<html><head>\n<script src='/channel/bcsocket.js'></script>\n<script>\nsocket = new BCSocket('/channel');\nsocket.onopen = function() {\n  socket.send({hi:'there'});\n  socket.close();\n};\nsocket.onmessage = function(message) {\n  // ...\n};\n</script>\n```\n\nYou can also ask the client to automatically reconnect whenever its been disconnected. - Which is\nsuper useful.\n\n```coffeescript\n{BCSocket} = require 'browserchannel'\nsocket = new BCSocket 'http://localhost:4321/channel', reconnect:true\nsocket.onopen = ->\n  socket.send \"I just connected!\"\n```\n\n---\n\n# Caveats\n\n- It doesn't do RPC.\n- It doesn't work in cross-origin environments. Put it behind \n  [nginx](http://nginx.net/) or [varnish](https://www.varnish-cache.org/) if you aren't using nodejs\n  to host your whole site.\n- Currently there's no websocket support. So, its higher bandwidth than socket.io running on modern\n  browsers.\n\n---\n\n### License\n\nLicensed under the standard MIT license:\n\nCopyright 2011 Joseph Gentle.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"directories":{}},"0.4.2":{"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"name":"browserchannel","description":"Google BrowserChannel server for NodeJS","version":"0.4.2","homepage":"https://github.com/josephg/node-browserchannel","repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"main":"index.js","engine":"node >= 0.4.4","scripts":{"test":"nodeunit test/server.coffee"},"dependencies":{"coffee-script":"~1","hat":"*","connect":"~1","timerstub":"*","request":"~2"},"devDependencies":{"browserify":"~1","nodeunit":"*"},"readme":"A [BrowserChannel](http://closure-library.googlecode.com/svn/trunk/closure/goog/net/browserchannel.js) server.\n\n**tldr;** Its like socket.io, but it scales better and it has fewer bugs. It\njust does long polling. It doesn't support websockets and doesn't work cross-domain.\n\nBrowserChannel is google's version of [socket.io](http://socket.io) from when they first put\nchat in gmail. Unlike socket.io, browserchannel provides much better guarantees about message\ndelivery and state. It has better reconnection logic and error handling. With browserchannel,\n**you know whats going on**.\n\n[![Build Status](https://secure.travis-ci.org/josephg/node-browserchannel.png)](http://travis-ci.org/josephg/node-browserchannel)\n\nnode-browserchannel:\n\n- Is compatible with the closure library's browserchannel implementation\n- Is super thoroughly tested\n- Works in IE5.5+, iOS, Safari, Chrome, Firefox, and probably others.\n- Works in any network environment (incl. behind buffering proxies)\n\n---\n\n# Use it\n\n    # npm install browserchannel\n\nBrowserchannel is implemented as connect middleware. Here's an echo server:\n\n```coffeescript\nbrowserChannel = require('browserchannel').server\nconnect = require 'connect'\n\nserver = connect(\n  connect.static \"#{__dirname}/public\"\n  browserChannel (session) ->\n    console.log \"New session: #{session.id} from #{session.address} with cookies #{session.headers.cookie}\"\n\n    session.on 'message', (data) ->\n      console.log \"#{session.id} sent #{JSON.stringify data}\"\n      session.send data\n\n    session.on 'close', (reason) ->\n      console.log \"Session #{session.id} disconnected (#{reason})\"\n      \n    # This tells the session to stop trying to connect\n    session.stop()\n    \n    # This just kills the session.\n    session.abort()\n).listen(4321)\n\nconsole.log 'Echo server listening on localhost:4321'\n```\n\nThe client emulates the [websocket API](http://dev.w3.org/html5/websockets/). Here is a simple client:\n\n```coffeescript\n{BCSocket} = require 'browserchannel'\n\nsocket = new BCSocket 'http://localhost:4321/channel'\nsocket.onopen = ->\n  socket.send {hi:'there'}\nsocket.onmessage = (message) ->\n  console.log 'got message', message\n\n# later...\nsocket.close()\n```\n\n... Or from a website:\n\n```html\n<html><head>\n<script src='/channel/bcsocket.js'></script>\n<script>\nsocket = new BCSocket('/channel');\nsocket.onopen = function() {\n  socket.send({hi:'there'});\n  socket.close();\n};\nsocket.onmessage = function(message) {\n  // ...\n};\n</script>\n```\n\nYou can also ask the client to automatically reconnect whenever its been disconnected. - Which is\nsuper useful.\n\n```coffeescript\n{BCSocket} = require 'browserchannel'\nsocket = new BCSocket 'http://localhost:4321/channel', reconnect:true\nsocket.onopen = ->\n  socket.send \"I just connected!\"\n```\n\n---\n\n# Caveats\n\n- It doesn't do RPC.\n- It doesn't work in cross-origin environments. Put it behind \n  [nginx](http://nginx.net/) or [varnish](https://www.varnish-cache.org/) if you aren't using nodejs\n  to host your whole site.\n- Currently there's no websocket support. So, its higher bandwidth than socket.io running on modern\n  browsers.\n\n---\n\n### License\n\nLicensed under the standard MIT license:\n\nCopyright 2011 Joseph Gentle.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","_id":"browserchannel@0.4.2","dist":{"shasum":"22b5f43f4c2e0183b8cabc22a3acb07c66b29fc7","tarball":"http://registry.npmjs.org/browserchannel/-/browserchannel-0.4.2.tgz"},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}]}},"maintainers":[{"name":"josephg","email":"josephg@gmail.com"}],"time":{"modified":"2012-07-14T03:13:33.532Z","created":"2011-10-05T22:46:06.214Z","0.0.0":"2011-10-05T22:46:08.146Z","0.0.1":"2011-10-06T09:04:11.959Z","0.1.0":"2011-10-07T05:23:09.640Z","0.2.0":"2011-10-20T10:27:45.069Z","0.3.0":"2011-10-27T11:06:50.641Z","0.3.1":"2011-11-01T15:29:01.640Z","0.3.2":"2011-11-05T12:50:57.869Z","0.3.3":"2012-01-17T22:20:41.920Z","0.3.4":"2012-01-23T12:33:17.723Z","0.4.0":"2012-03-06T07:25:14.463Z","0.4.1":"2012-05-12T01:50:22.743Z","0.4.2":"2012-07-14T03:13:33.532Z"},"author":{"name":"Joseph Gentle","email":"josephg@gmail.com","url":"http://josephg.com/"},"repository":{"type":"git","url":"git://github.com/josephg/node-browserchannel.git"},"_attachments":{"browserchannel-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-YQvXnvP6BkFG0j6liz1koA==","length":165841,"stub":true},"browserchannel-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-W6OhoMzKMkKrS8kzGazWJw==","length":165496,"stub":true},"browserchannel-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Sm/IZyvH0gBclPVGoqyfsg==","length":245760,"stub":true},"browserchannel-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-GGGL9kMNmZMYJgrHaKzeaQ==","length":133120,"stub":true},"browserchannel-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-kto6xG08JXonuWLZXKyRrQ==","length":133120,"stub":true},"browserchannel-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-a8YAXExzX7VXIMWEsqbXGQ==","length":133120,"stub":true},"browserchannel-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-z8kPULUJcoZXP1Gum5AelA==","length":122880,"stub":true},"browserchannel-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-+1nixVP65LMjVLwfi6Xl7Q==","length":122880,"stub":true},"browserchannel-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-q9GN+jrImzwg7KBSkbki6A==","length":3246080,"stub":true},"browserchannel-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-pIEuLCtG2qzd/E8wHcFcGA==","length":603293,"stub":true},"browserchannel-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mSKtjHh+GSXijz6w0kct7A==","length":4583209,"stub":true},"browserchannel-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-m/DjVIUgT16U3Eu9Z2Hh+w==","length":4583805,"stub":true}}}},
{"id":"browserid-service-verify","key":"browserid-service-verify","value":{"rev":"3-9ba96528ffcf842de4a26f14d286930a"},"doc":{"_id":"browserid-service-verify","_rev":"3-9ba96528ffcf842de4a26f14d286930a","name":"browserid-service-verify","description":"Verifies BrowserID assertion by using free verification service in browserid.org","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"author":{"name":"Henri Tuhola","email":"henri.tuhola@gmail.com","url":"boxbase.org"},"name":"browserid-service-verify","description":"Verifies BrowserID assertion by using free verification service in browserid.org","version":"1.0.0","homepage":"browserid.org","repository":{"type":"git","url":"git@github.com:cheery/browserid-service-verify.git"},"main":"verify.js","engines":{"node":"~0.6.14"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"Cheery","email":"henri.tuhola@gmail.com"},"_id":"browserid-service-verify@1.0.0","_engineSupported":false,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0cb6f9be04799b9a8467c2cdd90b05260876bd19","tarball":"http://registry.npmjs.org/browserid-service-verify/-/browserid-service-verify-1.0.0.tgz"},"maintainers":[{"name":"Cheery","email":"henri.tuhola@gmail.com"}]}},"readme":"This library makes deploying BrowserID easy in node.js projects.\n\nPlain standalone browserid verifier will be better method to implement BrowserID, but a stable one wasn't available when I wrote this library.\n\nThe example should be clear enough, but API is so simple that I will describe it.\n\n\n    var browserid_verify = require('browserid-service-verify');\n\n    var on_login = function (assertion, logged_in) {\n        browserid_verify(\n            {\"assertion\": assertion, \"audience\": \"http://example.org\"},\n            function (verification) {\n                logged_in(verification.status == \"okay\", verification);\n            }\n        );\n    };\n\n## api\n\n`browserid_verify(options, callback)`\n\noptions should contain two parameters:\n\n- `assertion` the encoded assertion from client\n- `audience` the hostname and optional port of your site. The client-side MUST NOT be allowed fill this, for security reasons.\n\nThe verification will be returned by the callback. It is an ordinary browserid verification.\n","maintainers":[{"name":"Cheery","email":"henri.tuhola@gmail.com"}],"time":{"modified":"2012-04-13T00:08:02.616Z","created":"2012-04-13T00:08:00.266Z","1.0.0":"2012-04-13T00:08:02.616Z"},"author":{"name":"Henri Tuhola","email":"henri.tuhola@gmail.com","url":"boxbase.org"},"repository":{"type":"git","url":"git@github.com:cheery/browserid-service-verify.git"},"_attachments":{"browserid-service-verify-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-grpTLXM+78MiaK85kCbqOQ==","length":1425,"stub":true}}}},
{"id":"browserid-verifier","key":"browserid-verifier","value":{"rev":"7-20d2c8ff6ddf81e2c683ed4d17fcc720"},"doc":{"_id":"browserid-verifier","_rev":"7-20d2c8ff6ddf81e2c683ed4d17fcc720","name":"browserid-verifier","description":"A node library to verify assertions","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"browserid-verifier","description":"A node library to verify assertions","version":"0.0.1","homepage":"http://github.com/mozilla/node-browserid","repository":{"type":"git","url":"git://github.com/mozila/node-browserid.git"},"main":"src/browserid","engines":{"node":">=0.4.7"},"dependencies":{"jwcrypto":"0.0.1","express":"2.5.1"},"devDependencies":{},"scripts":{"test":"node test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"browserid-verifier@0.0.1","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7be3e0a0781ff635ecd14d39b1679e647f1ebfb0","tarball":"http://registry.npmjs.org/browserid-verifier/-/browserid-verifier-0.0.1.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.2":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"browserid-verifier","description":"A node library to verify assertions","version":"0.0.2","homepage":"http://github.com/lloyd/node-browserid","repository":{"type":"git","url":"git://github.com/lloyd/node-browserid.git"},"main":"lib/browserid","engines":{"node":">=0.4.7"},"dependencies":{"jwcrypto":"0.0.1","express":"2.5.1"},"devDependencies":{},"scripts":{"test":"node test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"browserid-verifier@0.0.2","_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"eb5214bd2a1e88f5ad65a373dffeb955be6e380d","tarball":"http://registry.npmjs.org/browserid-verifier/-/browserid-verifier-0.0.2.tgz"},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]},"0.0.4":{"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"name":"browserid-verifier","description":"A node library to verify assertions","version":"0.0.4","homepage":"http://github.com/lloyd/node-browserid","repository":{"type":"git","url":"git://github.com/lloyd/node-browserid.git"},"main":"lib/browserid","engines":{"node":">=0.4.7"},"dependencies":{"jwcrypto":"0.1.1","express":"2.5.1"},"devDependencies":{},"scripts":{"test":"node test/run.js"},"_npmUser":{"name":"lloyd","email":"lloyd@hilaiel.com"},"_id":"browserid-verifier@0.0.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"f9eb0e4a94134b5862b8541d4186d85b1dd7a77c","tarball":"http://registry.npmjs.org/browserid-verifier/-/browserid-verifier-0.0.4.tgz"},"readme":"**WARNING:** This is alpha quality code, and shouldn't\nreally be used in production quality systems until this\nnotice is removed.\n\nA nodejs library for validating BrowserID Assertions.\n\n## Overview\n\nBrowserID is a email based distributed authentication system\nfor the web, supported by Mozilla.  Using BrowserID you can\nallow users to sign into your website with a \"verified email address\"\nrather than a traditional username and password.  For users\nsign-in is easier, and for site maintainers it becomes unnecessary\nto implement password storage and email verification functions.\n\n## The BrowserID Verification library\n\nThis library verifies BrowserID assertions on a node server locally.\nThe only network requests it makes are to obtain public keys for\nidentity providers, and these keys are aggressively cached.  This\nlibrary is preferred over the mozilla BrowserID service because it\ncan reduce your external dependencies and decrease network latency\nduring sign in.  And it's really easy to use.\n\n## Getting Started\n\nFirst, check out the full example client and server in `example/`.\nJust `npm install && example/main.js`, then visit\n`http://127.0.0.1:8080` in your browser.\n\nTo install:\n\n    npm install browserid-verifier\n\nThen implement client code that calls includes\n`https://browserid.org/include.js` and calls\n`navigator.id.getVerifiedEmail()` when a user clicks your sign-in\nbutton.  Send the assertion returned from that function up to your\nserver, and verify it in node:\n\n    var browseridVerify = require('browserid-verifier');\n\n    browseridVerify({\n      assertion: theAssertion,\n      audience: \"http://mysite.com\"\n    }, function (err, r) {\n      // if err is non-falsey, then something went wrong.\n      // otherwise, r looks like this:\n      //\n      //   { email: 'lloyd@mozilla.com',\n      //     audience: 'http://127.0.0.1:8080',\n      //     expires: Fri, 25 Nov 2011 19:55:36 GMT,\n      //     issuer: 'browserid.org' }\n      //   \n\n    });\n\nThat is all.\n","maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}]}},"maintainers":[{"name":"lloyd","email":"lloyd@hilaiel.com"}],"time":{"modified":"2012-03-02T22:58:35.119Z","created":"2011-11-25T20:00:09.335Z","0.0.1":"2011-11-25T20:00:10.230Z","0.0.2":"2011-11-25T21:35:15.864Z","0.0.4":"2012-03-02T22:58:35.119Z"},"author":{"name":"Lloyd Hilaiel","email":"lloyd@hilaiel.com","url":"http://lloyd.io"},"repository":{"type":"git","url":"git://github.com/lloyd/node-browserid.git"},"_attachments":{"browserid-verifier-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-lmK/2iFv1Qbsf5Q0IYgzDQ==","length":33689,"stub":true},"browserid-verifier-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-STqtnmy/lVf/+bADVhZYXQ==","length":40960,"stub":true},"browserid-verifier-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Lg+32+TYMcAuBaoSVwwIjg==","length":40960,"stub":true}}}},
{"id":"browserify","key":"browserify","value":{"rev":"298-299567b358b9f4d889a1b969d86f852a"},"doc":{"_id":"browserify","_rev":"298-299567b358b9f4d889a1b969d86f852a","name":"browserify","description":"browser-side require() for js directories and npm modules","dist-tags":{"latest":"1.14.5"},"versions":{"0.0.1":{"name":"browserify","version":"0.0.1","description":"Browser-side require() for js directories and npm modules","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","npm":">=0.2.16"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":["node >=0.2.0"],"_id":"browserify@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d3f2e476a7c91ee4664a77d92a88328f16a4b51c","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.0.1.tgz"}},"0.0.2":{"name":"browserify","version":"0.0.2","description":"Browser-side require() for js directories and npm modules","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","npm":">=0.2.16"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":["node >=0.3.0"],"_id":"browserify@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c93d7d08f3c5acd570d2895d6c83093154afce3e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.0.2.tgz"}},"0.0.3":{"name":"browserify","version":"0.0.3","description":"Browser-side require() for js directories and npm modules","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","npm":">=0.2.16"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":["node >=0.3.0"],"_id":"browserify@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e05a0a029a413378439e90559efdbc47c55e4c3e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.0.3.tgz"}},"0.0.4":{"name":"browserify","version":"0.0.4","description":"Browser-side require() for js directories and npm modules","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","npm":">=0.2.16","es5-shim":">=1.0.0"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":["node >=0.3.0"],"_id":"browserify@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"24c86b71754f9091d4b7fe68151ab5ad1296083a","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.0.4.tgz"}},"0.0.5":{"name":"browserify","version":"0.0.5","description":"Browser-side require() for js directories and npm modules","main":"./index","repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","npm":">=0.2.16","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":["node >=0.3.0"],"_id":"browserify@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"7a69b80ff5e5ffb2c291737f61a2b1d25e741b3e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.0.5.tgz"}},"0.1.0":{"name":"browserify","version":"0.1.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","source":">=0.0.1","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8393d4967771d499587b255b6ab0badd91958849","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.1.0.tgz"}},"0.1.1":{"name":"browserify","version":"0.1.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","npm"],"dependencies":{"findit":">=0.0.1","source":">=0.0.1","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e52e2b5ea18823f63b4eb30afbfc246bea4fbe79","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.1.1.tgz"}},"0.1.2":{"name":"browserify","version":"0.1.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.1","source":">=0.0.1","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f8e9c1988f7c2db75c1d1148cf3d169deb7515fe","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.1.2.tgz"}},"0.1.3":{"name":"browserify","version":"0.1.3","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.1","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a8b8960fd5cbbaeb7dddc188f249a631c2e8a2c5","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.1.3.tgz"}},"0.1.4":{"name":"browserify","version":"0.1.4","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.1","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cf8a9cc30f71b049716faeefc12d2de197afdf4e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.1.4.tgz"}},"0.1.5":{"name":"browserify","version":"0.1.5","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.1","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.1.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"34464655d71c55897a13f5be6cadb32180f592cb","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.1.5.tgz"}},"0.2.0":{"name":"browserify","version":"0.2.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"212bafa8cf9574cd0c9c8e2e2c846024b4714f01","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.0.tgz"}},"0.2.1":{"name":"browserify","version":"0.2.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"eeb769bd5dfef07acfc5f4e40317a5664796bb5a","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.1.tgz"}},"0.2.2":{"name":"browserify","version":"0.2.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8fcaa3411298c94f6737b6f51f896f57e07f2436","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.2.tgz"}},"0.2.3":{"name":"browserify","version":"0.2.3","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"expresso":">=0.6.0","seq":">=0.1.8","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.7","_nodeVersion":"v0.5.0-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cd8f0f3908b5fd12165082b481ed9845ebc59fd6","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.3.tgz"}},"0.2.4":{"name":"browserify","version":"0.2.4","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"57c3ffcc3071d72a97789b55aca7c70a1ff4579e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.4.tgz"}},"0.2.5":{"name":"browserify","version":"0.2.5","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"bf38d5f4084dd965e540786325eb87d85e039d20","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.5.tgz"}},"0.2.6":{"name":"browserify","version":"0.2.6","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1efd2a754f6e20258d953b6d48b140a0304d65c0","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.6.tgz"}},"0.2.7":{"name":"browserify","version":"0.2.7","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1078e6cfbbafdbeaf21e523f73705487f20d8256","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.7.tgz"}},"0.2.8":{"name":"browserify","version":"0.2.8","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"261765f7997cb5e58a27a3798d66a41f5a8d75bb","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.8.tgz"}},"0.2.9":{"name":"browserify","version":"0.2.9","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":["node >=0.4.0"],"_id":"browserify@0.2.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e4945cc3e5dbc56c85f30fd17b8c9cbb72a23b96","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.9.tgz"}},"0.2.10":{"name":"browserify","version":"0.2.10","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.2.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1a7bd2a49538358337c5aa2a66e52d2e2aeea82d","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.10.tgz"}},"0.2.11":{"name":"browserify","version":"0.2.11","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.2.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"cd1336a2b6d73f2a9d201c6d629d9e427ef1a8eb","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.2.11.tgz"}},"0.3.0":{"name":"browserify","version":"0.3.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"32ddfbb2b467e9af1b1aade67a533da678a36aef","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.0.tgz"}},"0.3.1":{"name":"browserify","version":"0.3.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.2","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"71878b037bfb4dec67df82715f78cc23560ea0bd","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.1.tgz"}},"0.3.2":{"name":"browserify","version":"0.3.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e2b91efd2f487363a08bf1986c3aa45386fd3c8c","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.2.tgz"}},"0.3.3":{"name":"browserify","version":"0.3.3","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"53fc53b044fbb5a8bf3f9f628d77f5dc148eee88","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.3.tgz"}},"0.3.4":{"name":"browserify","version":"0.3.4","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7aa6e423eb1b1202a099b257cb32c92b45d96dc3","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.4.tgz"}},"0.3.5":{"name":"browserify","version":"0.3.5","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"a34a042dd6a009e7ad80b1088789b913a9647452","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.5.tgz"}},"0.3.6":{"name":"browserify","version":"0.3.6","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"9b4ce54ad68837b9c41462ed4cbd5f8a4b175e47","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.6.tgz"}},"0.3.7":{"name":"browserify","version":"0.3.7","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3","source":">=0.0.3","es5-shim":">=1.0.0","coffee-script":">=1.0.0","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.0.0","seq":">=0.1.8","traverse":">=0.3.1","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.3.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e8c33fc5868eb69a8fdd957b1d5b562326092fb0","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.3.7.tgz"}},"0.4.0":{"name":"browserify","version":"0.4.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"86bd2120238d72a954a4008c34b318afdae027bb","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.0.tgz"}},"0.4.1":{"name":"browserify","version":"0.4.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f2a52484b57aa1412dcc79e52b901f3c2d5f434e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.1.tgz"}},"0.4.2":{"name":"browserify","version":"0.4.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0a87b5370972d7e9a510806f6704063f77143882","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.2.tgz"}},"0.4.3":{"name":"browserify","version":"0.4.3","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0b6141138b5695c9dad3c385d77f5ea7319d1892","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.3.tgz"}},"0.4.4":{"name":"browserify","version":"0.4.4","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1584bcac34f71c797b4119ea5ac41ed7096085f2","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.4.tgz"}},"0.4.5":{"name":"browserify","version":"0.4.5","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e2ed2f246571883c008da981d71e9920bf9e4b70","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.5.tgz"}},"0.4.6":{"name":"browserify","version":"0.4.6","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"43364bcc3c7bcac253e8d1aeece710435d03041e","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.6.tgz"}},"0.4.7":{"name":"browserify","version":"0.4.7","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"dc85003d848583fed4c4465a900ca288f3140e64","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.7.tgz"}},"0.4.8":{"name":"browserify","version":"0.4.8","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ca8dffc314163268f44d84e5065833578c6246d4","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.8.tgz"}},"0.4.9":{"name":"browserify","version":"0.4.9","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5d0bcd8d4eee35761719208f90b5aaafa060fa18","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.9.tgz"}},"0.4.10":{"name":"browserify","version":"0.4.10","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.10","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"138a80a85c60639bb0390fed80270225206067ad","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.10.tgz"}},"0.4.11":{"name":"browserify","version":"0.4.11","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.11","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"36650c215b5ba1c9af7cac5620c3f7eb57da2484","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.11.tgz"}},"0.4.12":{"name":"browserify","version":"0.4.12","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.12","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"a5ae15c1fcd716e2ab1df211a1dd73d110f4aacc","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.12.tgz"}},"0.4.13":{"name":"browserify","version":"0.4.13","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.13","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"b511bd15982524c2aacdc3b481a195ea10f6bdff","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.13.tgz"}},"0.4.14":{"name":"browserify","version":"0.4.14","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.14","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"122f273f8989dbee28533bd50ba99da063c419fa","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.14.tgz"}},"0.4.15":{"name":"browserify","version":"0.4.15","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.4.15","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"0302c3955fb3811e8044b1cff238ac243fa2616b","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.4.15.tgz"}},"0.5.0":{"name":"browserify","version":"0.5.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"b16d407246d578df2d64e029f8e5004297f0a8cb","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.5.0.tgz"}},"0.5.1":{"name":"browserify","version":"0.5.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":">=1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7d7c1c3a0071d4bd11366cc92d477e6b827b4a91","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.5.1.tgz"}},"0.5.2":{"name":"browserify","version":"0.5.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"./examples"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.2.5 <0.3","source":">=0.0.3 <0.1","es5-shim":"1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2"},"devDependencies":{"connect":">=1.4.1 <1.5","seq":">=0.2.5 <0.3","hashish":"*","traverse":">=0.3.1 <0.4","backbone":">=0.3.3","dnode":">=0.6.2","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"fe21067a2cb22e3285927d88254ce14afb9f3e6a","tarball":"http://registry.npmjs.org/browserify/-/browserify-0.5.2.tgz"}},"1.0.0":{"name":"browserify","version":"1.0.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"findit":">=0.0.3 <0.1","seq":">=0.3.1 <0.4","source":">=0.0.3 <0.1","es5-shim":"1.0.0","coffee-script":">=1.1.1 <1.2","hashish":">=0.0.2","semver":">=1.0.6 <1.1","file":"0.1.1"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":"0.7.x","jade":"=0.10.4","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4e6d9ab84c1e06c1e45583298d00ef314f1a4240","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.0.0.tgz"}},"1.1.0":{"name":"browserify","version":"1.1.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"45f1ba28c712c43b54f9a77bc6c5281718b61dac","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.1.0.tgz"}},"1.1.1":{"name":"browserify","version":"1.1.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7fc5ecc5a34342748aefe3e1134f67af1dfb8603","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.1.1.tgz"}},"1.1.2":{"name":"browserify","version":"1.1.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.1.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"49ce5b24ca9c9f5ce5e2b9a3932da603997c4e8f","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.1.2.tgz"}},"1.1.3":{"name":"browserify","version":"1.1.3","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.1.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"53ccff501164b70e6acf752afbad409b5edf4563","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.1.3.tgz"}},"1.1.4":{"name":"browserify","version":"1.1.4","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.1.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5f05396f54ca99945f4d2e04e0c97ffb636732d9","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.1.4.tgz"}},"1.2.0":{"name":"browserify","version":"1.2.0","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7ad6bf69714d50ab41a136319e8580b0f0cc52b7","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.0.tgz"}},"1.2.1":{"name":"browserify","version":"1.2.1","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"3f8ceea715c37239a81f7f11d7465870ba66d31a","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.1.tgz"}},"1.2.2":{"name":"browserify","version":"1.2.2","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f2da0256751a793d4ddbc84260ac7d89de92b051","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.2.tgz"}},"1.2.3":{"name":"browserify","version":"1.2.3","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"414394758ade6369b81a65172bae248dc57e070d","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.3.tgz"}},"1.2.4":{"name":"browserify","version":"1.2.4","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"45e43246147fc94730b6422f183f4b6992e56a45","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.4.tgz"}},"1.2.5":{"name":"browserify","version":"1.2.5","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"80e1893a5aa37ee1c8bae8f076eecabecc2bff41","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.5.tgz"}},"1.2.6":{"name":"browserify","version":"1.2.6","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1dcf2f38b28a4ae36e6c7e8a3420bf1d7698bc4d","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.6.tgz"}},"1.2.7":{"name":"browserify","version":"1.2.7","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"8d95abe1cd503e9cc422937064472e664d76d0a9","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.7.tgz"}},"1.2.8":{"name":"browserify","version":"1.2.8","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d29a56138ec1b0aad7c59af1e90651f808b544d6","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.8.tgz"}},"1.2.9":{"name":"browserify","version":"1.2.9","description":"Browser-side require() for js directories and npm modules","main":"./index.js","directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.2.9","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f28fbbe374684773ee73b3095988ea9b03c2495f","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.2.9.tgz"}},"1.3.0":{"name":"browserify","version":"1.3.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/build.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e38cbceeaf0516e0b87c8ba2ee13d559a42f6992","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.3.0.tgz"}},"1.4.0":{"name":"browserify","version":"1.4.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"8e38ecf6f56dc955e2a14d1a79e1060ef6d6884c","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.0.tgz"}},"1.4.1":{"name":"browserify","version":"1.4.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"856841dd90ebf8ebd4169249d59b9f85b09eb8b8","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.2":{"name":"browserify","version":"1.4.2","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"e89716e8485b961327cf023f71ed7face37ebc65","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.3":{"name":"browserify","version":"1.4.3","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"9eaf37881066e1646e6571c0163b9f14ca092532","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.4":{"name":"browserify","version":"1.4.4","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c2e6e5e3b66cf8b9ad2bc2dc36df910517ba7ecc","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.5":{"name":"browserify","version":"1.4.5","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5f09c89d3d172db9528d02fdc55c787c54555b30","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.6":{"name":"browserify","version":"1.4.6","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"87fda134824bb71fc798ff7a564ceaa4ae24f423","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.6.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.7":{"name":"browserify","version":"1.4.7","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f00c5a4623efa88878d3d84aa456ebe2a3dc172e","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.7.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.4.8":{"name":"browserify","version":"1.4.8","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","expresso":"=0.7.x","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"expresso"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.4.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"8243878bfcdcac830554d108eb18b9ba509eaa0a","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.4.8.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.5.0":{"name":"browserify","version":"1.5.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_id":"browserify@1.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5fe874ad1b0726d8a7d3d1fe953058e5a2442cba","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.5.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.6.0":{"name":"browserify","version":"1.6.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/home/substack/.npm/browserify/1.6.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browserify@1.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1c34d9f8218caf952eaae31da6e0c84e619afe80","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.6.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.6.1":{"name":"browserify","version":"1.6.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9198e3b6b32055d47a95442bc0001b1032679627","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.6.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.0":{"name":"browserify","version":"1.7.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"011d8ac0dec5443b55cd8d7d598d108f6d23afc7","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.1":{"name":"browserify","version":"1.7.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"267da4c564c3f932f9db3574574330250a765a61","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.2":{"name":"browserify","version":"1.7.2","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bb5691a3e7b6d5b3ef412205ced7708e7c216419","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.3":{"name":"browserify","version":"1.7.3","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ef0aed36b51d53993abd02dea5c30a39b7ede5a1","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.4":{"name":"browserify","version":"1.7.4","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"193357217fc54641f233bf11f9b0595b98558f0c","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.5":{"name":"browserify","version":"1.7.5","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ac617925a5cf80865007c8171fd614c1dfc3c95a","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.6":{"name":"browserify","version":"1.7.6","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7fbd2cde0c16abca2c8904ba32373867e7af9954","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.6.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.7.7":{"name":"browserify","version":"1.7.7","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":">=0.0.1 <0.1","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"=0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"=0.10.4","seq":"=0.3.3","jquery-browserify":"*","jsdom":"=0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.7.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b81d4a7f8456f443c9c22d400c4abed53a686d37","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.7.7.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.8.0":{"name":"browserify","version":"1.8.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.10.4","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.8.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1889e5b1dde61a73ee1f5d2a7b92adb5ae8057f2","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.8.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.8.1":{"name":"browserify","version":"1.8.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.10.4","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.8.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b87edabbdc8571981e4aab4335102fd0e32389f0","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.8.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.8.2":{"name":"browserify","version":"1.8.2","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.10.4","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.8.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b136fe6e689e8e1059ba9f8448a274feb6240697","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.8.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.8.3":{"name":"browserify","version":"1.8.3","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.0.x","connect":">=1.4.1 <1.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.10.4","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.8.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"11babfe215253a11061dcd1b54a9e23b2a96fc62","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.8.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.9.0":{"name":"browserify","version":"1.9.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.0.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x","lazy":"1.0.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.9.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"dc729efba36cc9dbd6f96f7b877d203d8d4aab08","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.9.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.9.1":{"name":"browserify","version":"1.9.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.0.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x","lazy":"1.0.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.9.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1a2617e45915a0e61b5c1afa2936dd99137ddd88","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.9.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.9.2":{"name":"browserify","version":"1.9.2","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x","lazy":"1.0.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.9.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"edf73d15f39726671d8bb612bf5a3a795ee6ef80","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.9.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.9.3":{"name":"browserify","version":"1.9.3","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x","lazy":"1.0.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.9.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"23f3205a5e46b84e108a2aad6a683aca9e9774d2","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.9.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.9.4":{"name":"browserify","version":"1.9.4","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":">=0.0.4 <0.1","nub":"0.0.x","commondir":"0.0.x","coffee-script":">=1.1.1 <1.2","optimist":">=0.2.6 <0.3"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","jsdom":"0.2.x","lazy":"1.0.x"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.9.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b59e14cb104319f0dc5f8c82fc01a8966402119b","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.9.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.0":{"name":"browserify","version":"1.10.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.0","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"8365232613a872fbc302abca05282e1cbfadaa83","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.1":{"name":"browserify","version":"1.10.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.0","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a371a8c3af75dad7b887faa1967a4cedc5ad11af","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.2":{"name":"browserify","version":"1.10.2","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"0ec20cb71d3303171dd915e62360fe8584658298","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.3":{"name":"browserify","version":"1.10.3","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"0.0.x","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f130c4f71cd6f493a7c3f7d3a54d11fd76b7c328","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.4":{"name":"browserify","version":"1.10.4","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a59f1a6c2b2e01b309b4c1358b7836a431e03037","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.5":{"name":"browserify","version":"1.10.5","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"68ba1806c1485105408cf29ddf8dfee75c5239af","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.5.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.6":{"name":"browserify","version":"1.10.6","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"20953ed36fa6be18c8e4c575237760f71936eb93","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.6.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.7":{"name":"browserify","version":"1.10.7","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5491bbc0df5f0c4de2add934e4a7b92b14ea99da","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.7.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.8":{"name":"browserify","version":"1.10.8","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.8","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c05bbfb121071644b095cc545b0af6dec605ed73","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.8.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.9":{"name":"browserify","version":"1.10.9","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.9","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"80e1ed58689e9be3b388eedf5352a5084dfe0c42","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.9.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.11":{"name":"browserify","version":"1.10.11","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.11","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"982e061ccfce8bcd28969b0d5847f6ac5d3508c2","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.11.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.12":{"name":"browserify","version":"1.10.12","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.12","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"7a8cd89783d484d98e74eb11c5eca6716d427a13","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.12.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.13":{"name":"browserify","version":"1.10.13","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.13","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a3d25f82d1b7e85da02f850502bd72770c2c358e","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.13.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.14":{"name":"browserify","version":"1.10.14","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"~1.1.1","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.14","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9fd1bd5ff4e336dedb8e1573c13eed90268d03ef","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.14.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.15":{"name":"browserify","version":"1.10.15","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"1.x.x","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"0.2.x","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":">=0.3.3","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.15","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"077cea3a926ca5dac95f09d008cfe1ebc2a330c9","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.15.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.16":{"name":"browserify","version":"1.10.16","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"1.x.x","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":">=0.7.1 <0.8","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.16","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6b2d766b7ce4356614147f6ae2ad8411837cb27b","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.16.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.10.17":{"name":"browserify","version":"1.10.17","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"1.x.x","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.10.17","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a14902b68d68e8f72de917e99aa3a4d387c5725d","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.10.17.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.11.0":{"name":"browserify","version":"1.11.0","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cli.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.0","deputy":"0.0.x","resolve":"~0.2.0","nub":"0.0.x","commondir":"0.0.x","coffee-script":"1.x.x","optimist":"~0.2.6","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.11.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4d43d900389446f83d4cbe83803a617b21d3a559","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.11.0.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.11.1":{"name":"browserify","version":"1.11.1","description":"Browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.11.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"449f5f7b35f0431bdef227d3e310d16a24224618","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.11.1.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.12.0":{"name":"browserify","version":"1.12.0","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.12.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a374c24ea9cfabf54a4e42c645eb398e7240fe36","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.12.0.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.12.1":{"name":"browserify","version":"1.12.1","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.12.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9f04d8c4b4a7371aec64e1ce056f2d2a2d8382ec","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.12.1.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.12.2":{"name":"browserify","version":"1.12.2","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"browserify@1.12.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"da4bb44ada88c4e39104429896e9e35c5ae9277e","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.12.2.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.12.3":{"name":"browserify","version":"1.12.3","description":"browserify ==========","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.12.3","dist":{"shasum":"c8850edd1bf6c44d9c37a8fd521c063fe93b4328","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.12.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.0":{"name":"browserify","version":"1.13.0","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.0","dist":{"shasum":"ee17441300f7c0e7593cc82d83199e316a5a584d","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.1":{"name":"browserify","version":"1.13.1","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.1","dist":{"shasum":"4b98c36536e22314bc303bfc576a9566f1e4d8ae","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.2":{"name":"browserify","version":"1.13.2","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.2","dist":{"shasum":"9cc260629bcb9f5ee36bfa3758c0a08c980f9346","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.3":{"name":"browserify","version":"1.13.3","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.3","dist":{"shasum":"3c62b639b3b715340a2d7e3bf1dac465760f37ff","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.4":{"name":"browserify","version":"1.13.4","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.4","dist":{"shasum":"a9f96684b70de0f8ecbd937df7e4c412bb2eebae","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.5":{"name":"browserify","version":"1.13.5","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.1.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.5","dist":{"shasum":"b5f0a160733779d27547885dfb598a65ef6fdaad","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.6":{"name":"browserify","version":"1.13.6","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.6","dist":{"shasum":"f692fbe770d954d39f783703c331ba7b320ca34c","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.6.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.8":{"name":"browserify","version":"1.13.8","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.8","dist":{"shasum":"03c39fa48c3e791d0bac27dfac5107f516774568","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.8.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.9":{"name":"browserify","version":"1.13.9","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.9","dist":{"shasum":"d96dc39b51e4e6aa659fbcb5b704b02009931df3","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.9.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.13.10":{"name":"browserify","version":"1.13.10","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.13.10","dist":{"shasum":"aa78cb87a49c214898dee088dde147e14141c20a","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.13.10.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.14.0":{"name":"browserify","version":"1.14.0","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.14.0","dist":{"shasum":"36dfe0eb62becd3af862bf24bd26f10388b1400b","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.14.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.14.1":{"name":"browserify","version":"1.14.1","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.14.1","dist":{"shasum":"33f62eb18f2e6ac73fa190bc7d340e29a24edc60","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.14.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.14.2":{"name":"browserify","version":"1.14.2","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.14.2","dist":{"shasum":"a302bc43d321a6ac3dddcc9d2e33c671e71f0fdf","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.14.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.14.3":{"name":"browserify","version":"1.14.3","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.14.3","dist":{"shasum":"574805c47c4ab707e657accc4858a103d296b448","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.14.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.14.4":{"name":"browserify","version":"1.14.4","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.3","syntax-error":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.14.4","dist":{"shasum":"70cefd6c05b3d8ffa4c631113b8907a7941efbb7","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.14.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"1.14.5":{"name":"browserify","version":"1.14.5","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.3","syntax-error":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"readme":"","_id":"browserify@1.14.5","dist":{"shasum":"4958cab5794b950096ac6c3d72069e9a66446e9f","tarball":"http://registry.npmjs.org/browserify/-/browserify-1.14.5.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-08-11T08:43:53.529Z","created":"2011-02-03T11:58:51.125Z","0.0.1":"2011-02-03T11:58:51.469Z","0.0.2":"2011-02-08T00:40:14.492Z","0.0.3":"2011-02-14T09:32:19.495Z","0.0.4":"2011-02-14T11:21:48.432Z","0.0.5":"2011-02-16T08:32:13.712Z","0.1.0":"2011-02-22T17:19:57.245Z","0.1.1":"2011-02-23T02:54:52.755Z","0.1.2":"2011-02-23T21:49:04.558Z","0.1.3":"2011-02-24T00:10:38.860Z","0.1.4":"2011-02-25T09:15:22.525Z","0.1.5":"2011-02-25T12:03:59.028Z","0.2.0":"2011-02-26T13:45:07.970Z","0.2.1":"2011-02-26T15:15:40.880Z","0.2.2":"2011-02-26T16:00:37.306Z","0.2.3":"2011-03-02T11:13:59.791Z","0.2.4":"2011-03-15T23:53:03.063Z","0.2.5":"2011-03-17T00:12:53.011Z","0.2.6":"2011-03-24T08:54:51.811Z","0.2.7":"2011-03-28T14:13:57.164Z","0.2.8":"2011-03-28T14:31:29.163Z","0.2.9":"2011-03-28T23:00:46.335Z","0.2.10":"2011-03-30T08:24:24.130Z","0.2.11":"2011-03-30T15:53:53.727Z","0.3.0":"2011-03-30T16:48:19.353Z","0.3.1":"2011-04-01T11:53:25.987Z","0.3.2":"2011-04-24T06:19:27.148Z","0.3.3":"2011-04-27T23:50:39.960Z","0.3.4":"2011-04-28T00:09:45.480Z","0.3.5":"2011-04-28T00:18:42.408Z","0.3.6":"2011-04-28T09:56:55.846Z","0.3.7":"2011-05-17T17:52:45.918Z","0.4.0":"2011-05-17T21:01:05.790Z","0.4.1":"2011-05-18T12:39:29.251Z","0.4.2":"2011-05-24T06:51:13.492Z","0.4.3":"2011-05-24T23:55:34.388Z","0.4.4":"2011-05-25T01:05:53.376Z","0.4.5":"2011-05-25T20:36:19.663Z","0.4.6":"2011-05-27T21:09:08.834Z","0.4.7":"2011-05-27T21:54:34.480Z","0.4.8":"2011-05-28T00:39:24.789Z","0.4.9":"2011-05-28T02:45:13.421Z","0.4.10":"2011-05-28T03:20:18.434Z","0.4.11":"2011-05-28T03:36:13.126Z","0.4.12":"2011-05-28T05:17:34.964Z","0.4.13":"2011-05-28T20:17:21.800Z","0.4.14":"2011-06-03T00:21:06.661Z","0.4.15":"2011-06-05T00:05:19.011Z","0.5.0":"2011-06-05T05:29:50.699Z","0.5.1":"2011-06-05T05:59:21.770Z","0.5.2":"2011-06-07T05:59:18.846Z","1.0.0":"2011-06-09T05:45:42.682Z","1.1.0":"2011-06-21T11:06:25.034Z","1.1.1":"2011-06-21T23:30:34.278Z","1.1.2":"2011-06-22T00:26:49.625Z","1.1.3":"2011-06-22T01:00:20.410Z","1.1.4":"2011-06-22T03:24:10.178Z","1.2.0":"2011-06-22T11:43:12.205Z","1.2.1":"2011-06-25T10:27:58.545Z","1.2.2":"2011-06-27T08:22:17.020Z","1.2.3":"2011-06-27T23:11:43.510Z","1.2.4":"2011-06-28T09:28:37.367Z","1.2.5":"2011-07-03T01:07:38.803Z","1.2.6":"2011-07-03T01:38:40.801Z","1.2.7":"2011-07-05T01:44:06.159Z","1.2.8":"2011-07-05T07:09:24.992Z","1.2.9":"2011-07-11T21:23:42.382Z","1.3.0":"2011-07-15T01:22:59.467Z","1.4.0":"2011-07-30T23:06:02.322Z","1.4.1":"2011-08-06T10:00:24.332Z","1.4.2":"2011-08-06T11:31:37.140Z","1.4.3":"2011-08-19T12:16:13.018Z","1.4.4":"2011-08-30T11:39:57.096Z","1.4.5":"2011-08-30T23:58:05.448Z","1.4.6":"2011-09-01T09:37:01.879Z","1.4.7":"2011-09-05T12:54:28.365Z","1.4.8":"2011-09-09T09:44:03.936Z","1.5.0":"2011-09-10T04:48:19.290Z","1.6.0":"2011-10-13T07:08:47.174Z","1.6.1":"2011-10-20T07:07:18.507Z","1.7.0":"2011-10-20T07:26:15.583Z","1.7.1":"2011-10-20T08:51:13.607Z","1.7.2":"2011-10-20T09:02:35.645Z","1.7.3":"2011-10-20T10:54:02.735Z","1.7.4":"2011-10-27T01:04:46.469Z","1.7.5":"2011-10-27T06:07:43.927Z","1.7.6":"2011-10-29T04:08:59.644Z","1.7.7":"2011-11-11T00:29:56.928Z","1.8.0":"2011-11-16T10:04:52.496Z","1.8.1":"2011-11-26T02:43:41.207Z","1.8.2":"2011-12-31T00:26:01.645Z","1.8.3":"2012-01-04T00:25:40.319Z","1.9.0":"2012-01-17T07:40:54.841Z","1.9.1":"2012-01-17T08:40:38.746Z","1.9.2":"2012-01-19T05:19:59.814Z","1.9.3":"2012-01-26T00:21:36.096Z","1.9.4":"2012-02-13T12:06:45.272Z","1.10.0":"2012-02-27T07:36:38.183Z","1.10.1":"2012-02-27T07:48:18.500Z","1.10.2":"2012-02-27T08:19:08.221Z","1.10.3":"2012-03-02T04:03:22.855Z","1.10.4":"2012-03-05T22:34:35.021Z","1.10.5":"2012-03-28T06:01:33.000Z","1.10.6":"2012-03-28T06:35:34.693Z","1.10.7":"2012-04-06T17:15:39.109Z","1.10.8":"2012-04-15T01:02:11.479Z","1.10.9":"2012-04-30T07:05:30.159Z","1.10.11":"2012-04-30T07:57:06.035Z","1.10.12":"2012-04-30T22:28:13.505Z","1.10.13":"2012-05-17T18:32:20.775Z","1.10.14":"2012-05-17T20:27:35.524Z","1.10.15":"2012-05-18T20:27:33.120Z","1.10.16":"2012-05-23T10:54:20.533Z","1.10.17":"2012-05-30T04:09:02.291Z","1.11.0":"2012-05-31T03:12:27.287Z","1.11.1":"2012-05-31T08:02:32.025Z","1.12.0":"2012-06-05T23:27:02.882Z","1.12.1":"2012-06-06T00:53:03.842Z","1.12.2":"2012-06-13T18:18:26.338Z","1.12.3":"2012-06-21T03:28:05.170Z","1.13.0":"2012-06-22T09:03:57.020Z","1.13.1":"2012-06-23T12:38:32.850Z","1.13.2":"2012-06-23T23:57:19.306Z","1.13.3":"2012-06-24T14:11:04.843Z","1.13.4":"2012-06-27T16:10:07.069Z","1.13.5":"2012-06-27T18:57:26.298Z","1.13.6":"2012-07-30T14:43:53.436Z","1.13.8":"2012-08-01T07:15:30.357Z","1.13.9":"2012-08-01T07:19:32.003Z","1.13.10":"2012-08-01T07:32:25.541Z","1.14.0":"2012-08-01T07:44:25.115Z","1.14.1":"2012-08-01T07:54:09.200Z","1.14.2":"2012-08-01T08:15:50.692Z","1.14.3":"2012-08-01T22:08:51.546Z","1.14.4":"2012-08-02T08:40:49.409Z","1.14.5":"2012-08-05T23:27:35.932Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"http://github.com/substack/node-browserify.git"},"users":{"coverslide":true,"dodo":true,"jxson":true,"bat":true,"soldair":true,"tellnes":true,"fgribreau":true,"hughsk":true,"sjonnet19":true,"gillesruppert":true,"tahu":true},"_attachments":{"browserify-1.14.5.tgz":{"content_type":"application/octet-stream","revpos":296,"digest":"md5-s4cE0CPmB13c5MLDqa2Lxw==","length":48850,"stub":true},"browserify-1.14.4.tgz":{"content_type":"application/octet-stream","revpos":290,"digest":"md5-qLpA958lURIyeR2PrW6tgg==","length":48485,"stub":true},"browserify-1.14.3.tgz":{"content_type":"application/octet-stream","revpos":288,"digest":"md5-atPP/7BKc10fXwA8s5eahg==","length":48453,"stub":true},"browserify-1.14.2.tgz":{"content_type":"application/octet-stream","revpos":285,"digest":"md5-tBZpmYtfhwxo0X7v/rktpw==","length":48442,"stub":true},"browserify-1.14.1.tgz":{"content_type":"application/octet-stream","revpos":283,"digest":"md5-vB0rsNCg+VsO/diFnVe8rQ==","length":48430,"stub":true},"browserify-1.14.0.tgz":{"content_type":"application/octet-stream","revpos":281,"digest":"md5-ObM0WGTDDcCwMTO2QZqfwA==","length":48194,"stub":true},"browserify-1.13.10.tgz":{"content_type":"application/octet-stream","revpos":279,"digest":"md5-HXrQS4pqFnf2OzsDmLzdVA==","length":54676,"stub":true},"browserify-1.13.9.tgz":{"content_type":"application/octet-stream","revpos":277,"digest":"md5-047sGG7yKFxQaNBjMC3ekA==","length":54657,"stub":true},"browserify-1.13.8.tgz":{"content_type":"application/octet-stream","revpos":275,"digest":"md5-3TRepLdOxvej56LCTpqgxw==","length":54644,"stub":true},"browserify-1.13.6.tgz":{"content_type":"application/octet-stream","revpos":273,"digest":"md5-wWrLXznACNorClt9FpEtcg==","length":54520,"stub":true},"browserify-1.13.5.tgz":{"content_type":"application/octet-stream","revpos":271,"digest":"md5-vUdfzJO0k1z2E5W32QIH6A==","length":54507,"stub":true},"browserify-1.13.4.tgz":{"content_type":"application/octet-stream","revpos":269,"digest":"md5-PqlRmY8PuopWMPudms/jsg==","length":54454,"stub":true},"browserify-1.13.3.tgz":{"content_type":"application/octet-stream","revpos":267,"digest":"md5-40O6wkq1zi+mWiR1w0WfNA==","length":54408,"stub":true},"browserify-1.13.2.tgz":{"content_type":"application/octet-stream","revpos":265,"digest":"md5-JqEWEKPlrobhcwdZs/KHyg==","length":54001,"stub":true},"browserify-1.13.1.tgz":{"content_type":"application/octet-stream","revpos":263,"digest":"md5-BecVlI9m+if9+WKB4vEgYg==","length":53900,"stub":true},"browserify-1.13.0.tgz":{"content_type":"application/octet-stream","revpos":261,"digest":"md5-D22tX7seWO3+g++V9a0vqg==","length":53779,"stub":true},"browserify-1.12.3.tgz":{"content_type":"application/octet-stream","revpos":255,"digest":"md5-jkBOcZRPiqYOH9wtUpLZYg==","length":52893,"stub":true},"browserify-1.12.2.tgz":{"content_type":"application/octet-stream","revpos":253,"digest":"md5-qAguBOjBcRHcXA/dWTCxmA==","length":52329,"stub":true},"browserify-1.12.1.tgz":{"content_type":"application/octet-stream","revpos":251,"digest":"md5-PbmZ2H2igMNSTsmzq1Pd0Q==","length":52272,"stub":true},"browserify-1.12.0.tgz":{"content_type":"application/octet-stream","revpos":249,"digest":"md5-hvzzKRzid294OdxgjlD8HA==","length":52274,"stub":true},"browserify-1.11.1.tgz":{"content_type":"application/octet-stream","revpos":247,"digest":"md5-Np5h2DZ4zGC7ob8qRKBbDQ==","length":51713,"stub":true},"browserify-1.11.0.tgz":{"content_type":"application/octet-stream","revpos":245,"digest":"md5-RpmNc/gUIq1ekT36pHhsLQ==","length":51973,"stub":true},"browserify-1.10.17.tgz":{"content_type":"application/octet-stream","revpos":243,"digest":"md5-SrGJhl+vPxLUozehgJSMZg==","length":52224,"stub":true},"browserify-1.10.16.tgz":{"content_type":"application/octet-stream","revpos":241,"digest":"md5-9aMpfWMmLCt6Mtu7P4iQRw==","length":52230,"stub":true},"browserify-1.10.15.tgz":{"content_type":"application/octet-stream","revpos":239,"digest":"md5-WHm0dIUyZgoZHcpyHfndTw==","length":52176,"stub":true},"browserify-1.10.14.tgz":{"content_type":"application/octet-stream","revpos":237,"digest":"md5-jtt0ITe8aNlxyLBdS5Pfrg==","length":52175,"stub":true},"browserify-1.10.13.tgz":{"content_type":"application/octet-stream","revpos":235,"digest":"md5-khhXTa9czjjI6ikiLmjf5A==","length":52176,"stub":true},"browserify-1.10.12.tgz":{"content_type":"application/octet-stream","revpos":233,"digest":"md5-1/sv67laVOjbhkzxkz9PtQ==","length":51896,"stub":true},"browserify-1.10.11.tgz":{"content_type":"application/octet-stream","revpos":231,"digest":"md5-wj3M4Fun1K6+O0aa93p1MQ==","length":54011,"stub":true},"browserify-1.10.9.tgz":{"content_type":"application/octet-stream","revpos":229,"digest":"md5-rhJJAKWgOSyMmzXbHlNL6g==","length":54046,"stub":true},"browserify-1.10.8.tgz":{"content_type":"application/octet-stream","revpos":227,"digest":"md5-JzdKn1yLewnS3mmCejdvNg==","length":53859,"stub":true},"browserify-1.10.7.tgz":{"content_type":"application/octet-stream","revpos":225,"digest":"md5-ZgPxJnIOe5d4yrfdO79Sqg==","length":53841,"stub":true},"browserify-1.10.6.tgz":{"content_type":"application/octet-stream","revpos":223,"digest":"md5-dQCZ9CWeF5s6OMzfbBLV/A==","length":53685,"stub":true},"browserify-1.10.5.tgz":{"content_type":"application/octet-stream","revpos":221,"digest":"md5-HxJ/SvjWxgSS+U7/yDJjUQ==","length":53105,"stub":true},"browserify-1.10.4.tgz":{"content_type":"application/octet-stream","revpos":219,"digest":"md5-K3Pc3MlZax5aAX/cUglj6A==","length":47252,"stub":true},"browserify-1.10.3.tgz":{"content_type":"application/octet-stream","revpos":217,"digest":"md5-FWQpcPfEmgcBxJvG+32WHg==","length":47217,"stub":true},"browserify-1.10.2.tgz":{"content_type":"application/octet-stream","revpos":215,"digest":"md5-ryJ1Ys9Yu4thXQmayHbj0A==","length":47221,"stub":true},"browserify-1.10.1.tgz":{"content_type":"application/octet-stream","revpos":213,"digest":"md5-QcjvW5l3fzXtxEK69w+47w==","length":43837,"stub":true},"browserify-1.10.0.tgz":{"content_type":"application/octet-stream","revpos":211,"digest":"md5-qmzGy5z99nnJjW3VCLJmzg==","length":41839,"stub":true},"browserify-1.9.4.tgz":{"content_type":"application/octet-stream","revpos":209,"digest":"md5-EB2piygt8OJjEzcSwwVBfQ==","length":30444,"stub":true},"browserify-1.9.3.tgz":{"content_type":"application/octet-stream","revpos":206,"digest":"md5-1Xz4iXj43c4F/i5U5ZSnmA==","length":31748,"stub":true},"browserify-1.9.2.tgz":{"content_type":"application/octet-stream","revpos":203,"digest":"md5-En+ABE73OFc5iu2PF1YAdQ==","length":29852,"stub":true},"browserify-1.9.1.tgz":{"content_type":"application/octet-stream","revpos":201,"digest":"md5-8p1cA8fadAe/itBhIlA49Q==","length":29789,"stub":true},"browserify-1.9.0.tgz":{"content_type":"application/octet-stream","revpos":199,"digest":"md5-9Jd6jC7idoMMziuvwlXpuw==","length":29026,"stub":true},"browserify-1.8.3.tgz":{"content_type":"application/octet-stream","revpos":195,"digest":"md5-RS7vtpD4+DHvsgqKhmSDIg==","length":25550,"stub":true},"browserify-1.8.2.tgz":{"content_type":"application/octet-stream","revpos":190,"digest":"md5-PGUbG/6DGahKuG7k4tQFbg==","length":25483,"stub":true},"browserify-1.8.1.tgz":{"content_type":"application/octet-stream","revpos":188,"digest":"md5-aom/1hxigTuCkaice5Yieg==","length":24636,"stub":true},"browserify-1.8.0.tgz":{"content_type":"application/octet-stream","revpos":186,"digest":"md5-iAWq6WmwvWtvubn0dya30A==","length":24575,"stub":true},"browserify-1.7.7.tgz":{"content_type":"application/octet-stream","revpos":184,"digest":"md5-+WMalPtIZFiokiaUEZXElg==","length":24917,"stub":true},"browserify-1.7.6.tgz":{"content_type":"application/octet-stream","revpos":182,"digest":"md5-bqQQQM6DA6B/zMk1VRbPLg==","length":23962,"stub":true},"browserify-1.7.5.tgz":{"content_type":"application/octet-stream","revpos":180,"digest":"md5-l9/uPC2KyAIPVpVlhcT6Sw==","length":26365,"stub":true},"browserify-1.7.4.tgz":{"content_type":"application/octet-stream","revpos":178,"digest":"md5-SerSGf1x32AYkRTVhAyKMA==","length":26198,"stub":true},"browserify-1.7.3.tgz":{"content_type":"application/octet-stream","revpos":176,"digest":"md5-UveQwBPmefrjPRbMlUV/3w==","length":24363,"stub":true},"browserify-1.7.2.tgz":{"content_type":"application/octet-stream","revpos":174,"digest":"md5-3YOR4fzbjAUWIY8agUS2Gg==","length":22374,"stub":true},"browserify-1.7.1.tgz":{"content_type":"application/octet-stream","revpos":172,"digest":"md5-P9d1QTynFRox09S3tRtu4A==","length":23519,"stub":true},"browserify-1.7.0.tgz":{"content_type":"application/octet-stream","revpos":170,"digest":"md5-WFwW6IekQTExObkrD8PpWA==","length":23518,"stub":true},"browserify-1.6.1.tgz":{"content_type":"application/octet-stream","revpos":168,"digest":"md5-Ib98xyP55f160D/9fSFLtQ==","length":23488,"stub":true},"browserify-1.6.0.tgz":{"content_type":"application/octet-stream","revpos":166,"digest":"md5-H9Za5BuA5mQAUQHzIqO6hg==","length":23238,"stub":true},"browserify-1.5.0.tgz":{"content_type":"application/octet-stream","revpos":163,"digest":"md5-Iq/wjWKvVb8Ry0IqDuA59g==","length":21722,"stub":true},"browserify-1.4.8.tgz":{"content_type":"application/octet-stream","revpos":161,"digest":"md5-kVMznIK8rVkp6UJu/PtzOQ==","length":21387,"stub":true},"browserify-1.4.7.tgz":{"content_type":"application/octet-stream","revpos":159,"digest":"md5-LxCMWUx+YhLuMqMXPzT/7Q==","length":21336,"stub":true},"browserify-1.4.6.tgz":{"content_type":"application/octet-stream","revpos":157,"digest":"md5-LxMoglA4lHSB+6jJ9YIlrQ==","length":21321,"stub":true},"browserify-1.4.5.tgz":{"content_type":"application/octet-stream","revpos":155,"digest":"md5-1Plb12sNh/SgFgg5zCjugA==","length":21352,"stub":true},"browserify-1.4.4.tgz":{"content_type":"application/octet-stream","revpos":153,"digest":"md5-0T3IW+fddherLRgaSNA2eQ==","length":19683,"stub":true},"browserify-1.4.3.tgz":{"content_type":"application/octet-stream","revpos":151,"digest":"md5-i1j47XUxziABzaQ+83BjIg==","length":20647,"stub":true},"browserify-1.4.2.tgz":{"content_type":"application/octet-stream","revpos":149,"digest":"md5-bidhe5/tWwpHYhptBKCfZg==","length":18747,"stub":true},"browserify-1.4.1.tgz":{"content_type":"application/octet-stream","revpos":147,"digest":"md5-mI0d3jfHLa7VLUnKdwVRIw==","length":18747,"stub":true},"browserify-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":145,"digest":"md5-x2E24KfovRJbxh9bcu441w==","length":18745,"stub":true},"browserify-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":143,"digest":"md5-1DXrwNFiRudkmlgoXpADPA==","length":18539,"stub":true},"browserify-1.2.9.tgz":{"content_type":"application/octet-stream","revpos":141,"digest":"md5-V8DB3RluXa+alLHB/p3jjg==","length":17516,"stub":true},"browserify-1.2.8.tgz":{"content_type":"application/octet-stream","revpos":139,"digest":"md5-hYJ1dqIwtMCQAP5/OAe+hg==","length":17544,"stub":true},"browserify-1.2.7.tgz":{"content_type":"application/octet-stream","revpos":137,"digest":"md5-XyiS0EVBRdm2gs0/z1PuTA==","length":17503,"stub":true},"browserify-1.2.6.tgz":{"content_type":"application/octet-stream","revpos":135,"digest":"md5-rZKP0ZF/ZMcn301yUBAHxA==","length":17413,"stub":true},"browserify-1.2.5.tgz":{"content_type":"application/octet-stream","revpos":133,"digest":"md5-5Ft2E1bGEJZhselbmiIQPg==","length":17431,"stub":true},"browserify-1.2.4.tgz":{"content_type":"application/octet-stream","revpos":131,"digest":"md5-XkQ6D8jY8DT0E0ZJuvB6Ww==","length":17071,"stub":true},"browserify-1.2.3.tgz":{"content_type":"application/octet-stream","revpos":129,"digest":"md5-e4OI38QW4N5Ig/aQDi5V7g==","length":16920,"stub":true},"browserify-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":127,"digest":"md5-fqMI/yZV9YbWN0e8jYJYGg==","length":16911,"stub":true},"browserify-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":125,"digest":"md5-3CdfFYG+XEpiopm5QQlIOA==","length":16644,"stub":true},"browserify-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":123,"digest":"md5-flsSmOrllIwA4hRQ7E07OQ==","length":16573,"stub":true},"browserify-1.1.4.tgz":{"content_type":"application/octet-stream","revpos":121,"digest":"md5-Zqv1hxzAvAKniaar0jE4nQ==","length":16449,"stub":true},"browserify-1.1.3.tgz":{"content_type":"application/octet-stream","revpos":119,"digest":"md5-f75m8ToY5T5zwQt1T8rO7A==","length":16455,"stub":true},"browserify-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":113,"digest":"md5-DN57FgbgZsmCFNmOc343Hg==","length":16430,"stub":true},"browserify-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-He1E75iDsvKGJJfrBpuKyg==","length":16311,"stub":true},"browserify-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-KY63cu3ujTBxBtI4baDobA==","length":16058,"stub":true},"browserify-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-LmobsGfV6jviEdEb6dOZfw==","length":26104,"stub":true},"browserify-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-XU082AaN/ypMcb0A8VTjkQ==","length":23183,"stub":true},"browserify-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":103,"digest":"md5-ZLzftTvaJxt3jUicZ0NQTw==","length":23095,"stub":true},"browserify-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":101,"digest":"md5-LrvRtynFDwbjZT7Yhz4QGA==","length":23070,"stub":true},"browserify-0.4.15.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-CWU+e5uh0jlcrqxadbLUAw==","length":21697,"stub":true},"browserify-0.4.14.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-Xd7apG7C/zpJeBXWPY/m9A==","length":21633,"stub":true},"browserify-0.4.13.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-+QsPIjOTFcpid9BjrXQK9Q==","length":21565,"stub":true},"browserify-0.4.12.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-pA7dvZDOtEBDSrEmVLHw8w==","length":21290,"stub":true},"browserify-0.4.11.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-1jNNkl1uZanYdrTBWJnwRA==","length":21245,"stub":true},"browserify-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-BDwJqEUXdc+uJZ/bfd++oA==","length":21257,"stub":true},"browserify-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-ewUMhw0IcD/mtvBjS2InUw==","length":21223,"stub":true},"browserify-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-3WVnUWyKGaK/SjAbdTbGag==","length":21190,"stub":true},"browserify-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-DcXQun/9D6sICogJh/E0CA==","length":20481,"stub":true},"browserify-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-pVoPy1cdPELZ6+iAHmjT9Q==","length":20220,"stub":true},"browserify-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-8VcrtxSgqxVgLIFUlFlVyg==","length":19864,"stub":true},"browserify-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-jyiBBX413+EbgLsMWT6D0g==","length":19554,"stub":true},"browserify-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-T+D8G19Eo+5YfTSlNdLqeA==","length":19512,"stub":true},"browserify-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-8WlTviDhQg7jj1fEOG5ZSg==","length":18587,"stub":true},"browserify-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-kPt4V+ep+6HKyRyLqsohwA==","length":18469,"stub":true},"browserify-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-9knKuuYKq/4cbGM60CTGRQ==","length":18448,"stub":true},"browserify-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-ofOrUStTi8vgP2zzDO9dHg==","length":17883,"stub":true},"browserify-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-gNPj7tetzHdduYM4SnVvGQ==","length":17388,"stub":true},"browserify-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-nQGcnrX7r32k1DOpauMK0g==","length":17408,"stub":true},"browserify-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-CHaj8v6BN7/vwXhvbV5X8w==","length":17408,"stub":true},"browserify-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-GB4S5bVHvuP0BAfroyXBHg==","length":17342,"stub":true},"browserify-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-T9k+lGeI86WO+W+3VQfG4A==","length":16536,"stub":true},"browserify-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-LYKKYQPOz20EHDye2Kj/6g==","length":17057,"stub":true},"browserify-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-EubKMYBOnLql/MasE0QZKQ==","length":13595,"stub":true},"browserify-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-hEbiFxT9ltJZCNyWpioCsA==","length":12674,"stub":true},"browserify-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-6hnXt87hu+m7untSixn1AA==","length":12390,"stub":true},"browserify-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-DF7aWF2VJ8v2nLMn/jrsGA==","length":12085,"stub":true},"browserify-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-jlV8hkcBIxbtuNYIUTX3oQ==","length":11879,"stub":true},"browserify-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-xEIpAmqSq/0hsFXUBwcCcQ==","length":10543,"stub":true},"browserify-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-GVX0nDj++Xtb9QfETmU/ag==","length":10387,"stub":true},"browserify-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-OvYGw1x00/D4uTmhSgQm8A==","length":10235,"stub":true},"browserify-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-PN/guKkMbplfP1cZ3ErRQA==","length":9969,"stub":true},"browserify-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-lw/6zCGzwTybsHUtG4NoRw==","length":9970,"stub":true},"browserify-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-mpf1N6j5VCFev5KFvPgegQ==","length":9589,"stub":true},"browserify-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-FTfa726XHDVsHP/Kr+8irg==","length":9457,"stub":true},"browserify-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-ATS/lC3mqmiuvN6P6kNE+w==","length":9485,"stub":true},"browserify-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-sZx7lIC+6MSTiQcVjdfquA==","length":7929,"stub":true},"browserify-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-gTAWdtIQdWsdX7zMRlCJiA==","length":7821,"stub":true},"browserify-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-OxVvadUKnzEFatsVsj5t1w==","length":7708,"stub":true},"browserify-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-r3Bd0D66InQjN3kfuh3jUw==","length":7296,"stub":true},"browserify-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-9WDum1R+MR88S4TKBIWJ6g==","length":7004,"stub":true},"browserify-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-061XUNkWwr6cYaCxGIdLcA==","length":6913,"stub":true},"browserify-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-pupvR6WbEYio9Ah+RMogsQ==","length":6161,"stub":true},"browserify-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-VnRBDekv/NlqDyCRIXinwQ==","length":5960,"stub":true},"browserify-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-FuwA0Q3XCV0lwJDRfVDrdQ==","length":6234,"stub":true},"browserify-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-/UY3mUoZDuKOKGSSpbRpMw==","length":3577,"stub":true},"browserify-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ddlOMy9bd12RZCyEJrQqyQ==","length":3574,"stub":true}}}},
{"id":"browserify-0.6","key":"browserify-0.6","value":{"rev":"3-4c4d97d9d3f6811d8097c2c94fccfa61"},"doc":{"_id":"browserify-0.6","_rev":"3-4c4d97d9d3f6811d8097c2c94fccfa61","name":"browserify-0.6","description":"browser-side require() for js directories and npm modules","dist-tags":{"latest":"1.14.5"},"versions":{"1.14.5":{"name":"browserify-0.6","version":"1.14.5","description":"browser-side require() for js directories and npm modules","main":"index.js","bin":{"browserify":"bin/cmd.js"},"directories":{"example":"example","test":"test"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"keywords":["browser","require","middleware","bundle","npm","coffee","javascript"],"dependencies":{"detective":"~0.2.0","buffer-browserify":"~0.0.1","deputy":"~0.0.3","syntax-error":"~0.0.0","resolve":"~0.2.0","nub":"~0.0.0","commondir":"~0.0.1","coffee-script":"1.x.x","optimist":"~0.3.4","http-browserify-0.6":"~0.1.1","vm-browserify":"~0.0.0","crypto-browserify":"~0"},"devDependencies":{"tap":"~0.2.5","connect":"1.8.5","hashish":">=0.0.2 <0.1","traverse":">=0.3.8 <0.4","backbone":"~0.9.2","dnode":"~0.9.11","jade":"0.20.0","seq":"0.3.3","jquery-browserify":"*","lazy":"1.0.x","ecstatic":"~0.1.4","mkdirp":"~0.3.3"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"prabhakhar","email":"prabhakhar@ebaysf.com"},"_id":"browserify-0.6@1.14.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"32f4f8cf2b6bb31225aa226d2490ca831885bd78","tarball":"http://registry.npmjs.org/browserify-0.6/-/browserify-0.6-1.14.5.tgz"},"readme":"","maintainers":[{"name":"prabhakhar","email":"prabhakhar@ebaysf.com"}]}},"readme":"","maintainers":[{"name":"prabhakhar","email":"prabhakhar@ebaysf.com"}],"time":{"modified":"2012-08-08T22:39:39.460Z","created":"2012-08-08T22:39:38.238Z","1.14.5":"2012-08-08T22:39:39.460Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-browserify.git"},"_attachments":{"browserify-0.6-1.14.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yXBJGzSgvWpj7whxXE5yRw==","length":43472,"stub":true}}}},
{"id":"browserify-bypass","key":"browserify-bypass","value":{"rev":"3-334e00903579c178b4f522955ab252b4"},"doc":{"_id":"browserify-bypass","_rev":"3-334e00903579c178b4f522955ab252b4","name":"browserify-bypass","description":"browserify middleware to declare alternative requires for the browser","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"browserify-bypass","version":"0.1.0","description":"browserify middleware to declare alternative requires for the browser","keywords":["browserify","middleware","alternative","conditional","require","browser"],"author":{"name":"Johannes Ewald","email":"mail@johannesewald.de","url":"http://johannesewald.de"},"main":"lib/bypass.js","bugs":{"email":"mail@johannesewald.de"},"repositories":{"type":"git","url":"https://github.com/jhnns/browserify-bypass"},"engines":{"node":"<=0.8.x"},"devDependencies":{"mocha":"1.2.x","expect.js":"0.1.x","browserify":"1.12.x"},"scripts":{"test":"mocha"},"_npmUser":{"name":"jhnns","email":"mail@johannesewald.de"},"_id":"browserify-bypass@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"424ca38611bc7bd2a15da90dd3cfd0105eb39fc8","tarball":"http://registry.npmjs.org/browserify-bypass/-/browserify-bypass-0.1.0.tgz"},"maintainers":[{"name":"jhnns","email":"mail@johannesewald.de"}]}},"readme":"browserify-bypass\r\n=================\r\n\r\nA node.js [browserify](https://github.com/substack/node-browserify) middleware to declare alternative requires for\r\nthe browser.\r\n\r\n<br />\r\n\r\nInstallation\r\n------------\r\n\r\n`npm install browserify-bypass`\r\n\r\nExample\r\n--------\r\n\r\nTo declare an alternative require for the browser write `// @browser ./path/to/browserModule.js` one line above the\r\n require statement:\r\n\r\n```javascript\r\n\r\n// @browser ./browserModule.js\r\nvar myModule = require(\"./nodeModule.js\"),\r\n// @browser ./anotherBrowserModule.js\r\n    anotherModule = require(\"./anotherNodeModule.js\");\r\n```\r\n\r\nTo generate the browserified module just do this:\r\n\r\n```javascript\r\n\r\nvar b = require(\"browserify\");\r\n\r\nb(); // init browserify with default options\r\nb.use(require(\"browserify-bypass\"));\r\nb.require(\"./testModule.js\");\r\n```\r\n\r\nThe browserified module will now look like this:\r\n\r\n```javascript\r\n\r\nvar myModule = require(\"./browserModule.js\"),\r\n    anotherModule = require(\"./anotherBrowserModule.js\");\r\n```","maintainers":[{"name":"jhnns","email":"mail@johannesewald.de"}],"time":{"modified":"2012-06-18T16:45:07.753Z","created":"2012-06-18T16:45:03.940Z","0.1.0":"2012-06-18T16:45:07.753Z"},"author":{"name":"Johannes Ewald","email":"mail@johannesewald.de","url":"http://johannesewald.de"},"_attachments":{"browserify-bypass-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-kOV1PlgGNb5Qr22SG00B6Q==","length":9415,"stub":true}}}},
{"id":"browserify-cache","key":"browserify-cache","value":{"rev":"14-f5305aec8af0a87a01fbccd2fa9580d5"},"doc":{"_id":"browserify-cache","_rev":"14-f5305aec8af0a87a01fbccd2fa9580d5","name":"browserify-cache","description":"Easily cache Browserify bundles","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"browserify-cache","description":"Easily cache Browserify bundles","version":"0.1.0","repository":{"type":"git","url":"git://github.com/bminer/browserify-cache.git"},"main":"index.js","engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"browserify-cache@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"6681818f37ce725ca6f9c5a816cde3f2a6a25249","tarball":"http://registry.npmjs.org/browserify-cache/-/browserify-cache-0.1.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"This project has been replaced by static-asset"},"0.1.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"browserify-cache","description":"Easily cache Browserify bundles","version":"0.1.1","repository":{"type":"git","url":"git://github.com/bminer/browserify-cache.git"},"main":"index.js","engines":{"node":">0.4.9"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"browserify-cache@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9c1d8373e6aba34385ec5ebe60569d651206d646","tarball":"http://registry.npmjs.org/browserify-cache/-/browserify-cache-0.1.1.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"This project has been replaced by static-asset"},"0.2.0":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"browserify-cache","description":"Easily cache Browserify bundles","version":"0.2.0","repository":{"type":"git","url":"git://github.com/bminer/browserify-cache.git"},"main":"index.js","engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"browserify-cache@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"83167b11ea0a5b839fc07c7e9b1f5fba3cb5343b","tarball":"http://registry.npmjs.org/browserify-cache/-/browserify-cache-0.2.0.tgz"},"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"This project has been replaced by static-asset"},"0.2.1":{"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"name":"browserify-cache","description":"Easily cache Browserify bundles","version":"0.2.1","repository":{"type":"git","url":"git://github.com/bminer/browserify-cache.git"},"main":"index.js","engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"bminer","email":"miner.blake@gmail.com"},"_id":"browserify-cache@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"21e3a0638f01d9569235a1f700750f923387a43c","tarball":"http://registry.npmjs.org/browserify-cache/-/browserify-cache-0.2.1.tgz"},"readme":"browserify-cache - Strong and weak caching for Browserify bundles\n\n##Background\n\n\"Last-Modified\" and \"If-Modified-Since\" are \"weak\" caching. If the \"If-Modified-Since\" header is set, then Browserify can send 304 Not Modified, if appropriate, which saves bandwidth.\n\n\"Expires\" or \"Cache-Control: max-age\" are \"strong\" caching. The browser can simply pull from its own cache in certain cases to save an entire HTTP request.\n\nIn the client HTML, your Browserify bundle URL should contain the UNIX timestamp that matches the last modified date of the bundle.\n\nhttps://github.com/substack/node-browserify\n\nhttp://code.google.com/speed/page-speed/docs/caching.html\n\n##Usage\n\n```javascript\n//Create Express app and config...\n\n//Setup browserify\nvar browserify = require('browserify');\nvar browserifyCache = require('browserify-cache');\nvar browserifyMiddleware = browserify(config.browserify);\napp.use(express.browserifyCache(config.browserify, browserifyMiddleware) );\n\n//Now you can expose this URL to your views using Express\napp.helpers({\n\t'browserifyMount': function() {\n\t\treturn config.browserify.mount + '.' + browserifyMiddleware.modified.getTime() + '.js';\n\t}\n});\n```\n","maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"directories":{},"deprecated":"This project has been replaced by static-asset"}},"readme":null,"maintainers":[{"name":"bminer","email":"miner.blake@gmail.com"}],"time":{"modified":"2012-06-28T13:39:01.757Z","created":"2011-11-18T13:27:20.540Z","0.1.0":"2011-11-18T13:27:20.690Z","0.1.1":"2011-11-21T17:14:59.630Z","0.2.0":"2011-12-08T23:12:55.433Z","0.2.1":"2012-02-15T15:53:50.936Z"},"author":{"name":"Blake Miner","email":"miner.blake@gmail.com","url":"http://www.blakeminer.com/"},"repository":{"type":"git","url":"git://github.com/bminer/browserify-cache.git"},"_attachments":{"browserify-cache-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-CqM0YAya+z/Lfsn4sk0W6w==","length":1598,"stub":true},"browserify-cache-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-QyxB61M8kx+69Wbkdv1KVw==","length":1832,"stub":true},"browserify-cache-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-p6cmgs0l7dWOxUSUeDR7qA==","length":1578,"stub":true},"browserify-cache-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vb2FsYTkEtjPIADNfRa70Q==","length":1370,"stub":true}}}},
{"id":"browserify-jquery","key":"browserify-jquery","value":{"rev":"3-ee92119613cc08691a3a7f437bf90f12"},"doc":{"_id":"browserify-jquery","_rev":"3-ee92119613cc08691a3a7f437bf90f12","name":"browserify-jquery","description":"jQuery: The Write Less, Do More, JavaScript Library (packaged for Node.JS)","dist-tags":{"latest":"1.6.3"},"versions":{"1.6.3":{"name":"browserify-jquery","description":"jQuery: The Write Less, Do More, JavaScript Library (packaged for Node.JS)","url":"http://jquery.com","keywords":["util","dom","jquery"],"author":{"name":"John Resig","email":"jeresig@gmail.com"},"contributors":[],"dependencies":{"jsdom":">=0.2.0","htmlparser":">= 1.7.3"},"lib":".","main":"./node-jquery.js","version":"1.6.3","_npmJsonOpts":{"file":"/Users/cjroebuck/.npm/browserify-jquery/1.6.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browserify-jquery@1.6.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.24","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"42a0fed8d2680b7f2742435ca4f7d4cf197df16c","tarball":"http://registry.npmjs.org/browserify-jquery/-/browserify-jquery-1.6.3.tgz"},"scripts":{},"maintainers":[{"name":"cjroebuck","email":"tophtfc@gmail.com"}]}},"maintainers":[{"name":"cjroebuck","email":"tophtfc@gmail.com"}],"time":{"modified":"2011-10-07T20:35:53.202Z","created":"2011-10-07T20:35:51.915Z","1.6.3":"2011-10-07T20:35:53.202Z"},"author":{"name":"John Resig","email":"jeresig@gmail.com"},"_attachments":{"browserify-jquery-1.6.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NWM8R+YvRytlxuhvTDtpUQ==","length":13126,"stub":true}}}},
{"id":"browserify-server","key":"browserify-server","value":{"rev":"9-ec5991b7901fe7668e6412c650b4881e"},"doc":{"_id":"browserify-server","_rev":"9-ec5991b7901fe7668e6412c650b4881e","name":"browserify-server","description":"Spin up a quick & easy browserify server","dist-tags":{"latest":"0.2.1"},"versions":{"0.0.1":{"name":"browserify-server","version":"0.0.1","description":"Spin up a quick & easy browserify server","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/browserify-server.git"},"main":"index","homepage":"https://github.com/Raynos/browserify-server","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/browserify-server/issues","email":"raynos2@gmail.com"},"dependencies":{"ecstatic":"~0.1.6","routes":"~0.1.1"},"devDependencies":{"testling":"git://github.com/Raynos/testling#master","testem":"git://github.com/Raynos/testem#master","sinon":"git://github.com/Raynos/Sinon.JS.git","tap":"~0.3.0","test-server":"0.0.1"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/browserify-server/raw/master/LICENSE"}],"scripts":{"test":"make test"},"readme":"# browserify-server [![build status][1]][2]\n\nSpin up a quick & easy browserify server\n\n## Example Server\n\n``` js\nvar handler = require(\"browserify-server\")(\"./static\")\n    , http = require(\"http\")\n    , server = http.createServer(handler).listen(8080)\n```\n\nYou now have a HTTP server listening on port 8080 that will server the `index.html` file in the static folder when you got to `/` and server the index.js file browserified when you go to `/bundle.js`\n\nNo more browserify boilerplate ever again!\n\n## Installation\n\n`npm install browserify-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browserify-server.png\n  [2]: http://travis-ci.org/Raynos/browserify-server","_id":"browserify-server@0.0.1","dist":{"shasum":"d8bca703e1889638b35e9eb8ba3f2cd4b6e9f36c","tarball":"http://registry.npmjs.org/browserify-server/-/browserify-server-0.0.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.1.0":{"name":"browserify-server","version":"0.1.0","description":"Spin up a quick & easy browserify server","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/browserify-server.git"},"main":"index","homepage":"https://github.com/Raynos/browserify-server","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/browserify-server/issues","email":"raynos2@gmail.com"},"dependencies":{"ecstatic":"~0.1.6","routes":"~0.1.1","browserify":"~1.14.5"},"devDependencies":{"tap":"~0.3.0","test-server":"0.0.1"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/browserify-server/raw/master/LICENSE"}],"scripts":{"test":"make test"},"readme":"# browserify-server [![build status][1]][2]\n\nSpin up a quick & easy browserify server\n\n## Example Server\n\n``` js\nvar handler = require(\"browserify-server\")(\"./static\")\n    , http = require(\"http\")\n    , server = http.createServer(handler).listen(8080)\n```\n\nYou now have a HTTP server listening on port 8080 that will server the `index.html` file in the static folder when you got to `/` and server the index.js file browserified when you go to `/bundle.js`\n\nNo more browserify boilerplate ever again!\n\n## Installation\n\n`npm install browserify-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browserify-server.png\n  [2]: http://travis-ci.org/Raynos/browserify-server","_id":"browserify-server@0.1.0","dist":{"shasum":"c80f8ccde50481e9014dcb0aaf8a3c5ea71f0d05","tarball":"http://registry.npmjs.org/browserify-server/-/browserify-server-0.1.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.0":{"name":"browserify-server","version":"0.2.0","description":"Spin up a quick & easy browserify server","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/browserify-server.git"},"main":"index","homepage":"https://github.com/Raynos/browserify-server","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/browserify-server/issues","email":"raynos2@gmail.com"},"dependencies":{"ecstatic":"~0.1.6","routes":"~0.1.1","browserify":"~1.14.5","optimist":"~0.3.4"},"devDependencies":{"tap":"~0.3.0","test-server":"0.0.1"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/browserify-server/raw/master/LICENSE"}],"scripts":{"test":"make test"},"bin":{"browserify-server":"bin/browserify-server.js"},"readme":"# browserify-server [![build status][1]][2]\n\nSpin up a quick & easy browserify server\n\n## Example CLI\n\n```\n$ browserify-server --folder=example/static --port=4000\n\nbrowserify server listening on 8080 and serving folder example/static/\n```\n\nYou now have a HTTP server listening on port 8080 that will server the `index.html` file in the static folder when you got to `/` and server the index.js file browserified when you go to `/bundle.js`\n\n## Example Server\n\n``` js\nvar handler = require(\"browserify-server\")(\"./static\")\n    , http = require(\"http\")\n    , server = http.createServer(handler).listen(8080)\n```\n\nNo more browserify boilerplate ever again!\n\n## Installation\n\n`npm install browserify-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browserify-server.png\n  [2]: http://travis-ci.org/Raynos/browserify-server","_id":"browserify-server@0.2.0","dist":{"shasum":"a9b009a4a0500c7eca0e35651bdfe807d67fa333","tarball":"http://registry.npmjs.org/browserify-server/-/browserify-server-0.2.0.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]},"0.2.1":{"name":"browserify-server","version":"0.2.1","description":"Spin up a quick & easy browserify server","keywords":[],"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/browserify-server.git"},"main":"index","homepage":"https://github.com/Raynos/browserify-server","contributors":[{"name":"Jake Verbaten"}],"bugs":{"url":"https://github.com/Raynos/browserify-server/issues","email":"raynos2@gmail.com"},"dependencies":{"ecstatic":"~0.1.6","routes":"~0.1.1","browserify":"~1.14.5","optimist":"~0.3.4"},"devDependencies":{"tap":"~0.3.0","test-server":"0.0.1"},"licenses":[{"type":"MIT","url":"http://github.com/Raynos/browserify-server/raw/master/LICENSE"}],"scripts":{"test":"make test"},"bin":{"browserify-server":"bin/browserify-server.js"},"readme":"# browserify-server [![build status][1]][2]\n\nSpin up a quick & easy browserify server\n\n## Example CLI\n\n```\n$ browserify-server --folder=example/static --port=4000\n\nbrowserify server listening on 4000 and serving folder example/static\n```\n\nYou now have a HTTP server listening on port 8080 that will server the `index.html` file in the static folder when you got to `/` and server the index.js file browserified when you go to `/bundle.js`\n\n## Example Server\n\n``` js\nvar handler = require(\"browserify-server\")(\"./static\")\n    , http = require(\"http\")\n    , server = http.createServer(handler).listen(8080)\n```\n\nNo more browserify boilerplate ever again!\n\n## Installation\n\n`npm install browserify-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browserify-server.png\n  [2]: http://travis-ci.org/Raynos/browserify-server","_id":"browserify-server@0.2.1","dist":{"shasum":"9da0d0808fe6acbe6d7dc362e357aaff94776a0f","tarball":"http://registry.npmjs.org/browserify-server/-/browserify-server-0.2.1.tgz"},"maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}]}},"readme":"# browserify-server [![build status][1]][2]\n\nSpin up a quick & easy browserify server\n\n## Example Server\n\n``` js\nvar handler = require(\"browserify-server\")(\"./static\")\n    , http = require(\"http\")\n    , server = http.createServer(handler).listen(8080)\n```\n\nYou now have a HTTP server listening on port 8080 that will server the `index.html` file in the static folder when you got to `/` and server the index.js file browserified when you go to `/bundle.js`\n\nNo more browserify boilerplate ever again!\n\n## Installation\n\n`npm install browserify-server`\n\n## Tests\n\n`make test`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n  [1]: https://secure.travis-ci.org/Raynos/browserify-server.png\n  [2]: http://travis-ci.org/Raynos/browserify-server","maintainers":[{"name":"raynos","email":"raynos2@gmail.com"}],"time":{"modified":"2012-08-13T02:26:45.128Z","created":"2012-08-08T05:11:51.192Z","0.0.1":"2012-08-08T05:11:52.665Z","0.1.0":"2012-08-08T06:26:18.281Z","0.2.0":"2012-08-08T07:13:39.633Z","0.2.1":"2012-08-13T02:26:45.128Z"},"author":{"name":"Raynos","email":"raynos2@gmail.com"},"repository":{"type":"git","url":"git://github.com/Raynos/browserify-server.git"},"_attachments":{"browserify-server-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-PHr2cZmDMP1Pv1YZXPV2ww==","length":3054,"stub":true},"browserify-server-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FRnTU9L10cRhWYxCwfWFuw==","length":2925,"stub":true},"browserify-server-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7vymxa65RLeViRgCJveUAQ==","length":2683,"stub":true},"browserify-server-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-l7qTw3+KnaozFYintJZxtg==","length":2706,"stub":true}}}},
{"id":"browserijade","key":"browserijade","value":{"rev":"15-84fee5f8830629db6c8b5a273b210d85"},"doc":{"_id":"browserijade","_rev":"15-84fee5f8830629db6c8b5a273b210d85","name":"browserijade","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","dist-tags":{"latest":"0.5.6"},"versions":{"0.1.0":{"name":"browserijade","version":"0.1.0","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"*","glob":"*"},"devDependencies":{"coffee-script":"*"},"main":"./lib/middleware","browserify":"./lib/browserijade","_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f56ae669129359a5973cb7cf0c000d37e09f2a8a","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.1.0.tgz"},"maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.2.0":{"name":"browserijade","version":"0.2.0","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"*","glob":"*"},"devDependencies":{"coffee-script":"*"},"main":"./lib/middleware","browserify":"./lib/browserijade","_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.95","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"18bd01147cf5bbb4055cdcc4f77f18b32a4b42bd","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.2.0.tgz"},"maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.3.0":{"name":"browserijade","version":"0.3.0","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"0.20.x","glob":"3.1.x","underscore":"*"},"main":"./lib/server","browserify":"./lib/browser","_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.3.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"59ce994ec5aa3d0eb8e341d7484752c009c76db0","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.3.0.tgz"},"readme":"# Browserijade\n\nA Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client. Can be used to include jade files in the Browserify bundle or just to render pre-compiled templates on the client if for example templates are being AJAXed to the client.\n\n# Example\n\n## Including all Jade templates with a connect-based framework like Express.\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\"),\n\tbrowserijade = require(\"browserijade\")\n\nvar bundle = browserify()\nbundle.use(browserijade(__dirname + \"/views\"))\n\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\").renderFile\n\nvar article = browserijade(\"article\", {title: \"NEWS!\"})\n$(\"body\").html(article)\n```\n\n## Just rendering templates on the client-side without including any templates.\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\")\nvar bundle = browserify()\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\").renderString\n\n// articleTemplate is a pre-compiled Jade template that could\n// have been AJAXed to the client.\nvar article = browserijade(articleTemplate, {title: \"NEWS!\"})\n$(\"body\").html(article)\n```","maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.5.0":{"name":"browserijade","version":"0.5.0","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"0.20.x","glob":"3.1.x","underscore":"*"},"main":"./lib/server","browserify":"./lib/browser","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.5.0","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"10b5ea91656dadbc23d5e63fc1ffaf86f1ae3e91","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.5.0.tgz"},"readme":"# Browserijade\n\nA Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client. Can be used to include jade files in the Browserify bundle or just to render pre-compiled templates on the client if for example templates are being AJAXed to the client.\n\n# Example\n\n## Including all Jade templates with a connect-based framework like Express.\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\"),\n\tbrowserijade = require(\"browserijade\")\n\nvar bundle = browserify()\nbundle.use(browserijade(__dirname + \"/views\"))\n\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\")\n\nvar article = browserijade(\"article\", {title: \"NEWS!\"})\n$(\"body\").html(article)\n```\n\n## Just rendering templates on the client-side without including any templates.\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\")\nvar bundle = browserify()\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\").renderString\n\n// articleTemplate is a pre-compiled Jade template that could\n// have been AJAXed to the client.\nvar article = browserijade(articleTemplate, {title: \"NEWS!\"})\n$(\"body\").html(article)\n```","maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.5.1":{"name":"browserijade","version":"0.5.1","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"0.25.x","glob":"3.1.x","underscore":"*"},"main":"./lib/middleware","scripts":{"test":"node ./test/tests.js"},"browserify":"./lib/browserijade","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.5.1","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7ecf4a8da669502d03a92f9987dd42f33629ce8a","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.5.1.tgz"},"readme":"# Browserijade\n\nA Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client. Can be used to include jade files in the Browserify bundle or just to render pre-compiled templates on the client if for example templates are being AJAXed to the client.\n\n# Example\n\n## Including all Jade templates with a connect-based framework like Express.\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\"),\n\tbrowserijade = require(\"browserijade\")\n\nvar bundle = browserify()\nbundle.use(browserijade(__dirname + \"/views\"))\n\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\")\n\nvar article = browserijade(\"article\", {title: \"NEWS!\"})\n$(\"body\").html(article)\n```\n\n## Just rendering templates on the client-side without including any templates.\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\")\nvar bundle = browserify()\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\").renderString\n\n// articleTemplate is a pre-compiled Jade template that could\n// have been AJAXed to the client.\nvar article = browserijade(articleTemplate, {title: \"NEWS!\"})\n$(\"body\").html(article)\n```","maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.5.5":{"name":"browserijade","version":"0.5.5","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"0.25.x","glob":"3.1.x","underscore":"*"},"devDependencies":{"browserify":"1.10.x"},"optionalDependencies":{},"main":"./lib/middleware","scripts":{"test":"node ./test/tests.js"},"browserify":"./lib/browserijade","engines":{"node":"*"},"_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.5.5","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"5890ad392d43620efe896aeb35a87c73e6c45d5c","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.5.5.tgz"},"readme":"# Browserijade\n\nA Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client. Can be used to include jade files in the Browserify bundle or just to render pre-compiled templates on the client if for example templates are being AJAXed to the client.\n\n[![Build Status](https://secure.travis-ci.org/edmellum/browserijade.png)](http://travis-ci.org/edmellum/browserijade)\n\n## Installation\n`$ npm install browserijade`\n\n## Running the tests\n`$ npm test`\n\n# Example\n\n## Including all Jade templates with a connect-based framework like Express\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\"),\n\tbrowserijade = require(\"browserijade\")\n\nvar bundle = browserify()\nbundle.use(browserijade(__dirname + \"/views\"), ['serverThing.jade'], {debug: true})\n\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\")\n\nvar article = browserijade(\"article\", {title: \"NEWS!\"})\n$(\"body\").html(article)\n```\n\n## Just rendering templates on the client-side without including any templates\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\")\nvar bundle = browserify()\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\").renderString\n\n// articleTemplate is a pre-compiled Jade template that could\n// have been AJAXed to the client.\nvar article = browserijade(articleTemplate, {title: \"NEWS!\"})\n$(\"body\").html(article)\n```","maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]},"0.5.6":{"name":"browserijade","version":"0.5.6","description":"A Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client.","keywords":["browserify","middleware","jade","template","view"],"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"bugs":{"url":"http://github.com/edmellum/browserijade/issues"},"licenses":[{"type":"MIT","url":"http://github.com/edmellum/raw/master/LICENSE"}],"dependencies":{"jade":"0.25.x","glob":"3.1.x","underscore":"*"},"devDependencies":{"browserify":"1.10.x"},"optionalDependencies":{},"main":"./lib/middleware","scripts":{"test":"node ./test/tests.js"},"browserify":"./lib/browserijade","engines":{"node":"*"},"_npmUser":{"name":"edmellum","email":"david@edmellum.com"},"_id":"browserijade@0.5.6","_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b9e3ea5c6b121d0ab7d28751eda0f2b13a32df09","tarball":"http://registry.npmjs.org/browserijade/-/browserijade-0.5.6.tgz"},"readme":"# Browserijade\n\nA Browserify middleware that pre-compiles Jade templates on the server and uses the light-weight Jade runtime made for the browser to render them on the client. Can be used to include jade files in the Browserify bundle or just to render pre-compiled templates on the client if for example templates are being AJAXed to the client.\n\n[![Build Status](https://secure.travis-ci.org/edmellum/browserijade.png)](http://travis-ci.org/edmellum/browserijade)\n\n## Installation\n```bash\n$ npm install browserijade\n```\n\n## Running the tests\n```bash\n$ npm test\n```\n\n# Example\n\n## Including all Jade templates with a connect-based framework like Express\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\"),\n\tbrowserijade = require(\"browserijade\")\n\nvar bundle = browserify()\nbundle.use(browserijade(__dirname + \"/views\"), ['serverThing.jade'], {debug: true})\n\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\")\n\nvar article = browserijade(\"article\", {title: \"NEWS!\"})\n$(\"body\").html(article)\n```\n\n## Just rendering templates on the client-side without including any templates\n**Server-side:**\n\n```javascript\nvar browserify = require(\"browserify\")\nvar bundle = browserify()\napp.use(bundle)\n```\n\n**Client-side:**\n\n```javascript\nvar browserijade = require(\"browserijade\").renderString\n\n// articleTemplate is a pre-compiled Jade template that could\n// have been AJAXed to the client.\nvar article = browserijade(articleTemplate, {title: \"NEWS!\"})\n$(\"body\").html(article)\n```","maintainers":[{"name":"edmellum","email":"david@edmellum.com"}]}},"maintainers":[{"name":"edmellum","email":"david@edmellum.com"}],"time":{"modified":"2012-05-08T12:34:08.288Z","created":"2011-10-23T03:25:47.557Z","0.1.0":"2011-10-23T03:25:49.697Z","0.2.0":"2011-10-29T17:34:37.567Z","0.3.0":"2012-02-25T00:39:09.872Z","0.5.0":"2012-05-01T01:34:45.637Z","0.5.1":"2012-05-01T01:38:22.819Z","0.5.5":"2012-05-01T19:41:48.132Z","0.5.6":"2012-05-08T12:34:08.288Z"},"author":{"name":"David Ed Mellum","email":"david@edmellum.com","url":"http://edmellum.com"},"repository":{"type":"git","url":"git://github.com/edmellum/browserijade.git"},"_attachments":{"browserijade-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+MkY6oiV+sZzALfGU6/MdA==","length":3204,"stub":true},"browserijade-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-w3XynY2CmlyIfYB+c9UTnA==","length":3153,"stub":true},"browserijade-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-31C8x90Sm8aicmcudHqacg==","length":2654,"stub":true},"browserijade-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-m3KluoteHMAENOh1t3r/fw==","length":2413,"stub":true},"browserijade-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-2nRgrcqk+fLQPMOtnpNYOA==","length":6938,"stub":true},"browserijade-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sqMX4octbHAGkyNaKKo54g==","length":10240,"stub":true},"browserijade-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Xs/C3DYVQOvLIdMoruzFxQ==","length":10240,"stub":true}}}},
{"id":"browserjet","key":"browserjet","value":{"rev":"3-a386ab8911c410362eb8fceab5a998fe"},"doc":{"_id":"browserjet","_rev":"3-a386ab8911c410362eb8fceab5a998fe","name":"browserjet","description":"headless webkit browser","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Brian Kirchoff","email":"briankircho@gmail.com","url":"http://bkirchoff.com/"},"name":"browserjet","description":"headless webkit browser","version":"0.1.0","homepage":"https://github.com/briankircho/browserjet","repository":{"type":"git","url":"git://github.com/briankircho/browserjet.git"},"engines":{"node":">= 0.4.0"},"scripts":{"install":"./install.py"},"dependencies":{},"devDependencies":{"expresso":">= 0.7"},"_npmJsonOpts":{"file":"/root/.npm/browserjet/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browserjet@0.1.0","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"ade0aafccb8bedc59001295bfc33485ee814be7f","tarball":"http://registry.npmjs.org/browserjet/-/browserjet-0.1.0.tgz"}}},"maintainers":[{"name":"briankircho","email":"briankircho@gmail.com"}],"time":{"modified":"2011-07-18T01:18:11.900Z","created":"2011-07-18T01:18:11.461Z","0.1.0":"2011-07-18T01:18:11.900Z"},"author":{"name":"Brian Kirchoff","email":"briankircho@gmail.com","url":"http://bkirchoff.com/"},"repository":{"type":"git","url":"git://github.com/briankircho/browserjet.git"},"_attachments":{"browserjet-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-clHKLi89ioUEhi+0ZUiwZw==","length":11788,"stub":true}}}},
{"id":"browsermob-proxy","key":"browsermob-proxy","value":{"rev":"11-e51c8b34d71e3eb3d331cf0622153b42"},"doc":{"_id":"browsermob-proxy","_rev":"11-e51c8b34d71e3eb3d331cf0622153b42","name":"browsermob-proxy","description":"Javascript bindings for the browsermob-proxy","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"browsermob-proxy","description":"Javascript bindings for the browsermob-proxy","keywords":["selenium","test","testing","proxy","tests","har"],"version":"1.0.0","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/zzo/browsermob-node.git"},"homepage":"https://github.com/zzo/browsermob-node","dependencies":{"webdriverjs":""},"_npmJsonOpts":{"file":"/Users/trostler/.npm/browsermob-proxy/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browsermob-proxy@1.0.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"01b07b8da43fcb28bcfd615f07a6db026a0bf16c","tarball":"http://registry.npmjs.org/browsermob-proxy/-/browsermob-proxy-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"Mark Ethan Trostler","email":"mark@zzo.com"}]},"1.0.2":{"name":"browsermob-proxy","description":"Javascript bindings for the browsermob-proxy","keywords":["selenium","test","testing","proxy","tests","har"],"version":"1.0.2","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"repository":{"type":"git","url":"git://github.com/zzo/browsermob-node.git"},"homepage":"https://github.com/zzo/browsermob-node","main":"./browsermob.js","dependencies":{"webdriverjs":""},"_npmJsonOpts":{"file":"/Users/trostler/.npm/browsermob-proxy/1.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browsermob-proxy@1.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"01d7f102dfcba82868f60f1da7ac2e28adc28d26","tarball":"http://registry.npmjs.org/browsermob-proxy/-/browsermob-proxy-1.0.2.tgz"},"scripts":{},"maintainers":[{"name":"Mark Ethan Trostler","email":"mark@zzo.com"}]},"1.0.3":{"name":"browsermob-proxy","description":"Javascript bindings for the browsermob-proxy","keywords":["selenium","test","testing","proxy","tests","har"],"version":"1.0.3","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"repository":{"type":"git","url":"git://github.com/zzo/browsermob-node.git"},"homepage":"https://github.com/zzo/browsermob-node","main":"./browsermob.js","dependencies":{"webdriverjs":""},"_npmJsonOpts":{"file":"/Users/trostler/.npm/browsermob-proxy/1.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browsermob-proxy@1.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8e259401d157240d08bb1be0d8cac5a95cd1904d","tarball":"http://registry.npmjs.org/browsermob-proxy/-/browsermob-proxy-1.0.3.tgz"},"scripts":{},"maintainers":[{"name":"Mark Ethan Trostler","email":"mark@zzo.com"}]},"1.0.4":{"name":"browsermob-proxy","description":"Javascript bindings for the browsermob-proxy","keywords":["selenium","test","testing","proxy","tests","har"],"version":"1.0.4","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"repository":{"type":"git","url":"git://github.com/zzo/browsermob-node.git"},"homepage":"https://github.com/zzo/browsermob-node","main":"./browsermob.js","dependencies":{"webdriverjs":""},"_npmJsonOpts":{"file":"/Users/trostler/.npm/browsermob-proxy/1.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browsermob-proxy@1.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d2d299d1b1718c1d427b6210a3135dcfc9784d60","tarball":"http://registry.npmjs.org/browsermob-proxy/-/browsermob-proxy-1.0.4.tgz"},"scripts":{},"maintainers":[{"name":"Mark Ethan Trostler","email":"mark@zzo.com"}]},"1.0.5":{"name":"browsermob-proxy","description":"Javascript bindings for the browsermob-proxy","keywords":["selenium","test","testing","proxy","tests","har"],"version":"1.0.5","author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"repository":{"type":"git","url":"git://github.com/zzo/browsermob-node.git"},"homepage":"https://github.com/zzo/browsermob-node","main":"./browsermob.js","dependencies":{"webdriverjs":""},"_npmJsonOpts":{"file":"/Users/trostler/.npm/browsermob-proxy/1.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"browsermob-proxy@1.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"19cf0c9274b18dd381278c8d6c13bcdb013a8d2a","tarball":"http://registry.npmjs.org/browsermob-proxy/-/browsermob-proxy-1.0.5.tgz"},"scripts":{},"maintainers":[{"name":"Mark Ethan Trostler","email":"mark@zzo.com"}]}},"maintainers":[{"name":"Mark Ethan Trostler","email":"mark@zzo.com"}],"time":{"modified":"2012-04-02T21:17:21.628Z","created":"2012-03-30T05:48:25.502Z","1.0.0":"2012-03-30T05:48:27.085Z","1.0.2":"2012-03-30T14:02:26.247Z","1.0.3":"2012-03-30T16:50:00.532Z","1.0.4":"2012-03-30T17:17:54.846Z","1.0.5":"2012-04-02T21:17:21.628Z"},"author":{"name":"Mark Ethan Trostler","email":"mark@zzo.com"},"repository":{"type":"git","url":"git://github.com/zzo/browsermob-node.git"},"_attachments":{"browsermob-proxy-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-iVux27FMsq3jvkyYl4TKEg==","length":4849,"stub":true},"browsermob-proxy-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-oQoKnRnkD2aKIZ8OhYY+yw==","length":1783,"stub":true},"browsermob-proxy-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-iIuD0eog2PUpIzoVmLC9aA==","length":1773,"stub":true},"browsermob-proxy-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-bz7n/njG7zUUcxncd8kC1A==","length":1581,"stub":true},"browsermob-proxy-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Yo3BxaD1fiFy2kTUySfqew==","length":1608,"stub":true}}}},
{"id":"browserstack","key":"browserstack","value":{"rev":"7-b18e3ecdd06bb446e2bceafcdb31a116"},"doc":{"_id":"browserstack","_rev":"7-b18e3ecdd06bb446e2bceafcdb31a116","name":"browserstack","description":"A client for working with the BrowserStack API.","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"author":{"name":"Scott González","email":"scott.gonzalez@gmail.com","url":"http://scottgonzalez.com"},"name":"browserstack","description":"A client for working with the BrowserStack API.","version":"0.0.1","homepage":"https://github.com/scottgonzalez/node-browserstack","repository":{"type":"git","url":"git://github.com/scottgonzalez/node-browserstack.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"main":"browserstack.js","_npmUser":{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"},"_id":"browserstack@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"8f7c7bf6a3f3283ad3017099490e17a38f3b6157","tarball":"http://registry.npmjs.org/browserstack/-/browserstack-0.0.1.tgz"},"maintainers":[{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"}]},"0.0.2":{"author":{"name":"Scott González","email":"scott.gonzalez@gmail.com","url":"http://scottgonzalez.com"},"name":"browserstack","description":"A client for working with the BrowserStack API.","version":"0.0.2","homepage":"https://github.com/scottgonzalez/node-browserstack","repository":{"type":"git","url":"git://github.com/scottgonzalez/node-browserstack.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"main":"lib/browserstack.js","_npmUser":{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"},"_id":"browserstack@0.0.2","_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.4","_defaultsLoaded":true,"dist":{"shasum":"00bf49539019e743c8e3ea719f3c9b2f2d079484","tarball":"http://registry.npmjs.org/browserstack/-/browserstack-0.0.2.tgz"},"maintainers":[{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"}]},"0.1.0":{"author":{"name":"Scott González","email":"scott.gonzalez@gmail.com","url":"http://scottgonzalez.com"},"name":"browserstack","description":"A client for working with the BrowserStack API.","version":"0.1.0","homepage":"https://github.com/scottgonzalez/node-browserstack","repository":{"type":"git","url":"git://github.com/scottgonzalez/node-browserstack.git"},"engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{"grunt":"0.3.x"},"main":"lib/browserstack.js","_npmUser":{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"},"_id":"browserstack@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5cf9d95ce7d116190bb713651cb5ef65fae4c766","tarball":"http://registry.npmjs.org/browserstack/-/browserstack-0.1.0.tgz"},"maintainers":[{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"}]}},"readme":"# node-browserstack\n\nA node.js JavaScript client for working with [BrowserStack](http://browserstack.com) through its [API](https://github.com/browserstack/api).\n\n## Usage\n\n```javascript\nvar BrowserStack = require( \"browserstack\" );\nvar client = BrowserStack.createClient({\n\tusername: \"foo\",\n\tpassword: \"p455w0rd!!1\"\n});\n\nclient.getBrowsers(function( error, browsers ) {\n\tconsole.log( \"The following browsers are available for testing\" );\n\tconsole.log( browsers );\n});\n```\n\n## API\n\n### BrowserStack.createClient( settings )\n\nCreates a new client instance.\n\n* `settings`: A hash of settings that apply to all requests for the new client.\n  * `username`: The username for the BrowserStack account.\n  * `password`: The password for the BrowserStack account.\n  * `version` (optional; default: `1`): Which version of the BrowserStack API to use.\n\n### client.getBrowsers( callback )\n\nGets the list of available browsers.\n\n* `callback` (`function( error, browsers )`): A callback to invoke when the API call is complete.\n  * `browsers`: An array of objects with `browser` and `version` properties. \n\n### client.createWorker( settings, callback )\n\nCreates a worker.\n\n* `settings`: A hash of settings for the worker.\n  * `browser`: Which browser to use in the new worker.\n  * `version`: Which version of the specified browser to use.\n  * `url` (optional): Which URL to navigate to upon creation.\n  * `timeout` (optional): Maximum life of the worker (in seconds). Use 0 for \"forever\" (BrowserStack will kill the worker after 1,800 seconds).\n* `callback` (`function( error, worker )`): A callback to invoke when the API call is complete.\n  * `worker` An object with an `id` property for the worker that was created.\n\n### client.getWorker( id, callback )\n\nGets the status of a worker.\n\n* `id`: The id of the worker.\n* `callback` (`function( error, worker )`): A callback to invoke when the API call is complete.\n  * `worker`: An object with `id`, `browser`, and `status` properties for the worker.\n\n### client.terminateWorker( id, callback )\n\nTerminates an active worker.\n\n* `id`: The id of the worker to terminate.\n* `callback` (`function( error, data )`): A callback to invoke when the API call is complete.\n  * `data`: An object with a `time` property indicating how long the worker was alive.\n\n### client.getWorkers( callback )\n\nGets the status of all workers.\n\n* `callback` (`function( error, workers )`): A callback to invoke when the API call is complete.\n  * `workers`: An array of objects containing with `id`, `browser`, and `status` properties.\n\n## License\n\nnode-browserstack is licensed under the MIT license.\n","maintainers":[{"name":"scott.gonzalez","email":"scott.gonzalez@gmail.com"}],"time":{"modified":"2012-05-09T17:08:14.706Z","created":"2012-01-26T15:27:38.962Z","0.0.1":"2012-01-26T15:27:39.632Z","0.0.2":"2012-02-23T02:46:56.459Z","0.1.0":"2012-05-09T17:08:14.706Z"},"author":{"name":"Scott González","email":"scott.gonzalez@gmail.com","url":"http://scottgonzalez.com"},"repository":{"type":"git","url":"git://github.com/scottgonzalez/node-browserstack.git"},"_attachments":{"browserstack-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gUPAvgR4Rpo5aiEuVCatOw==","length":5326,"stub":true},"browserstack-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-L/vNmj85at7k+45aE6j0RA==","length":4520,"stub":true},"browserstack-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bK1T0F59QiTQYyXUKy/HSA==","length":3161,"stub":true}}}},
{"id":"browserx","key":"browserx","value":{"rev":"3-f9a70dbddb5e0b0847e9231f0d1617bf"},"doc":{"_id":"browserx","_rev":"3-f9a70dbddb5e0b0847e9231f0d1617bf","name":"browserx","description":"Web browser for node.js","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"browserx","version":"1.0.1","description":"Web browser for node.js","main":"./browser.js","keywords":["browser","http","html","web"],"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"license":{"type":"MIT"},"repository":{"type":"git","url":"git://github.com/pkrumins/node-browser.git"},"engines":{"node":">=0.2.0"},"dependencies":{"bufferlist":"*","hashish":"*"},"_npmUser":{"name":"pkrumins","email":"peteris.krumins@gmail.com"},"_id":"browserx@1.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"194ca49190ec74b5589115a2731610e442346ea1","tarball":"http://registry.npmjs.org/browserx/-/browserx-1.0.1.tgz"},"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}]}},"readme":null,"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}],"time":{"modified":"2012-02-01T23:04:08.808Z","created":"2012-02-01T23:04:07.945Z","1.0.1":"2012-02-01T23:04:08.808Z"},"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"repository":{"type":"git","url":"git://github.com/pkrumins/node-browser.git"},"_attachments":{"browserx-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-15i5UX962w74AVlQE3k7fQ==","length":2736,"stub":true}}}},
{"id":"brt","key":"brt","value":{"rev":"3-b8452659a92039571ff1f877c8f874c7"},"doc":{"_id":"brt","_rev":"3-b8452659a92039571ff1f877c8f874c7","name":"brt","description":"Browser Tools: command-line tools for browsers","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"brt","version":"0.0.1","description":"Browser Tools: command-line tools for browsers","keywords":["command-line","browsers","browser extensions","utilities"],"maintainers":[{"name":"Ben Atkin","email":"ben@benatkin.com","url":"http://benatkin.com/"}],"licenses":[{"type":"MIT","url":"http://opensource.org/licenses/mit-license.php"}],"main":"./lib/brt","bin":{"brt":"./lib/cli.js"},"dependencies":{"optimist":">=0.1.6","seq":">=0.2.5","underscore":">=1.1.6"},"devDependencies":{},"_id":"brt@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"06f5ad881a6a7bec2923a3fb7b11f9b938f1ff3d","tarball":"http://registry.npmjs.org/brt/-/brt-0.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"bat","email":"ben@benatkin.com"}],"time":{"modified":"2011-05-16T02:20:06.514Z","created":"2011-05-16T02:20:06.200Z","0.0.1":"2011-05-16T02:20:06.514Z"},"_attachments":{"brt-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0mczFVbfBDyveHy/Hoxu2A==","length":1631,"stub":true}}}},
{"id":"brunch","key":"brunch","value":{"rev":"266-c31a1d49dca142cb4f71c06b53ddae14"},"doc":{"_id":"brunch","_rev":"266-c31a1d49dca142cb4f71c06b53ddae14","name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","dist-tags":{"latest":"1.4.1"},"versions":{"0.0.1":{"name":"brunch","description":"with coffee","version":"0.0.1","keywords":["jst","templates","rest","backbone"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/deck/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"fusion":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.1","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"24ca01e75fee5d7205da43c2e00b6b97247929c2","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.1.tgz"}},"0.0.2":{"name":"brunch","description":"with coffee","version":"0.0.2","keywords":["jst","templates","rest","backbone"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.2","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"3c5f1cbff0d4ba3a5635ef6dbb17a76bd26efdaa","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.2.tgz"}},"0.0.3":{"name":"brunch","description":"with coffee","version":"0.0.3","keywords":["jst","templates","rest","backbone"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.3","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"c9add09e6a3fdbffc44a177e3085564c0ae85420","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.3.tgz"}},"0.0.4":{"name":"brunch","description":"with coffee","version":"0.0.4","keywords":["jst","templates","rest","backbone"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.4","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"76e7ac9f39a01f27ca8645ea568c95046cbb746e","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.4.tgz"}},"0.0.5":{"name":"brunch","description":"with coffee","version":"0.0.5","keywords":["jst","templates","rest","backbone"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.5","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"4298a5eac1530aed72a984265cbc968a6c842d09","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.5.tgz"}},"0.0.6":{"name":"brunch","description":"with coffee","version":"0.0.6","keywords":["jst","templates","rest","backbone"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.6","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"54a064fb9f90a7d4d87ea4bd5fc64486e8270f85","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.6.tgz"}},"0.0.7":{"name":"brunch","description":"with coffee","version":"0.0.7","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.7","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"7245a69f897a5d62098cbf0b30f5eed9c7c2646e","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.7.tgz"}},"0.0.8":{"name":"brunch","description":"with coffee","version":"0.0.8","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.0.8","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"feb0afc3962539f55439a866783b7d3f3b7b9e79","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.0.8.tgz"}},"0.1.0":{"name":"brunch","description":"with coffee","version":"0.1.0","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"watch":"0.3.0","yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/deck/brunch.git"},"bugs":{"url":"http://github.com/deck/brunch/issues"},"_id":"brunch@0.1.0","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"40fa7b643d2e5888a2e812274f3f37ce7ae6bab8","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.0.tgz"}},"0.1.1":{"name":"brunch","description":"with coffee","version":"0.1.1","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz @__tosh"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch-cli/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.1","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"8ec585c8176c5bde084b2809a442c770922d03ba","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.1.tgz"}},"0.1.3":{"name":"brunch","description":"~ with coffee","version":"0.1.3","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.3","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"4f099426ff24621d334efd7ddc2162d7a94844e1","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.3.tgz"}},"0.1.4":{"name":"brunch","description":"~ with coffee","version":"0.1.4","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.4","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"38d72c86935a21e463141b8c2a76a2286d904fc2","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.4.tgz"}},"0.1.5":{"name":"brunch","description":"~ with coffee","version":"0.1.5","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.5","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"fb0363aa74470979f8ccc1ed66f4b2ba14e2b34a","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.5.tgz"}},"0.1.6":{"name":"brunch","description":"~ with coffee","version":"0.1.6","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.6","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"9ffbad61326232b168a6e18348001119e3d2c622","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.6.tgz"}},"0.1.7":{"name":"brunch","description":"~ with coffee","version":"0.1.7","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.7","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"5460e38a49f516e2694cb72707d97ee63b3580ef","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.7.tgz"}},"0.1.8":{"name":"brunch","description":"~ with coffee","version":"0.1.8","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.8","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"bb6b3917e2ac8fe3586635be13cd08c80d4d35ef","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.8.tgz"}},"0.1.9":{"name":"brunch","description":"~ with coffee","version":"0.1.9","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.1.9","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"96f2a6c5592a34a3bb653814227ae07e9eddfaf0","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.1.9.tgz"}},"0.2.0":{"name":"brunch","description":"~ with coffee","version":"0.2.0","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.0.2"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.0","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"771be6688505d4ef9deff879835cea99cf45f40e","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.0.tgz"}},"0.2.1":{"name":"brunch","description":"~ with coffee","version":"0.2.1","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.0.2"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.1","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"ec135577f5cbf70d9167824d6aeb7fe60b017292","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.1.tgz"}},"0.2.2":{"name":"brunch","description":"~ with coffee","version":"0.2.2","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.0.2"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.2","_engineSupported":true,"_npmVersion":"0.2.13-1","_nodeVersion":"v0.2.6","dist":{"shasum":"809675ad4ae9380c269c08ce97e2e42c8efa65af","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.2.tgz"}},"0.2.3":{"name":"brunch","description":"~ with coffee","version":"0.2.3","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.0.2"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.3","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","optparse.js":"lib/optparse.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4934a7961a7f599acb078a4c9de6ac10ddd601c0","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.3.tgz"}},"0.2.4":{"name":"brunch","description":"~ with coffee","version":"0.2.4","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.0.2"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.4","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","optparse.js":"lib/optparse.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"55ed33ac9f95760cea234e33aebcc1ca63792dec","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.4.tgz"}},"0.2.6":{"name":"brunch","description":"~ with coffee","version":"0.2.6","keywords":["jst","templates","rest","backbone","fusion","jquery","json2","framework","brunch","coffee","coffeescript","sass"],"homepage":"http://brunchwithcoffee.org/","author":{"name":"Thomas Schranz","email":"tosh@deck.cc"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.3","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.0.2"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.6","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","optparse.js":"lib/optparse.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d5c3c14f610b43a40aade04b52ec66fa5394b19d","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.6.tgz"}},"0.2.7":{"name":"brunch","description":"~ with coffee","version":"0.2.7","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.5","glob":">= 1.1.0","eco":">= 1.0.1","stylus":">= 0.2.1","watch":">=0.1.8"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.7","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","optparse.js":"lib/optparse.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"777c7958fa46d9727ba715bf191399f88a5fc194","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.7.tgz"}},"0.2.8":{"name":"brunch","description":"~ with coffee","version":"0.2.8","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.5","glob":">= 1.1.0","eco":">= 1.0.1","watch":">=0.1.8","nomnom":">=0.1.2","stylus":">= 0.3.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":"0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.2.8","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.2.6","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","optparse.js":"lib/optparse.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ed131c36c4a4269f755f4ed23f69a437fe1a4e4d","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.2.8.tgz"}},"0.3.0":{"name":"brunch","description":"~ with coffee","version":"0.3.0","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.5","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">= 0.3.1","async":">=0.1.8","file":">=0.1.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.3.0","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","helpers.js":"lib/helpers.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"46e7a262a628ff1fa8236089a31dcb62f908c8f0","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.0.tgz"}},"0.3.1":{"name":"brunch","description":"~ with coffee","version":"0.3.1","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunchwithcoffee/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">= 0.3.1","async":">=0.1.8","file":">=0.1.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"https://github.com/brunchwithcoffee/brunch.git"},"bugs":{"url":"http://github.com/brunchwithcoffee/brunch/issues"},"_id":"brunch@0.3.1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","helpers.js":"lib/helpers.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"53d671a10c33158227f4b9253c34fa8de5a63b1d","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.1.tgz"}},"0.3.2":{"name":"brunch","description":"~ with coffee","version":"0.3.2","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">= 0.5.2","async":">=0.1.8","file":">=0.1.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.3.2","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","helpers.js":"lib/helpers.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ff07dbcff8e31e31368a0134f510a2676e27e67e","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.2.tgz"}},"0.3.4":{"name":"brunch","description":"~ with coffee","version":"0.3.4","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">= 0.5.2","async":">=0.1.8","file":">=0.1.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.3.4","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","helpers.js":"lib/helpers.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"1ed4fc52ba950946faa2e5548910f4d0cbbd05cb","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.4.tgz"}},"0.3.5":{"name":"brunch","description":"~ with coffee","version":"0.3.5","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">= 0.5.2","async":">=0.1.8","file":">=0.1.1"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.3.5","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.4.0","modules":{"brunch.js":"lib/brunch.js","command.js":"lib/command.js","helpers.js":"lib/helpers.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"657adb1c424ba93e3b647a6f93da0743c1144aa7","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.5.tgz"}},"0.3.6":{"name":"brunch","description":"~ with coffee","version":"0.3.6","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">= 0.5.2","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.3.6","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4ff0c6c9fb576e5249eed6a1122e948ff4a98a12","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.6.tgz"}},"0.3.7":{"name":"brunch","description":"~ with coffee","version":"0.3.7","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.3","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.3.7","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"9d8ebfacf4edd582ad5c1e4fda9ecb333b59385a","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.3.7.tgz"}},"0.4.0":{"name":"brunch","description":"~ with coffee","version":"0.4.0","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.3","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.4.0","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0323173e5ec18e22583c60881eaba4ae11b9fb09","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.4.0.tgz"}},"0.4.1":{"name":"brunch","description":"~ with coffee","version":"0.4.1","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.3","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.4.1","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b803a7f28adb069905c93703e0e5c93c7d8c09e1","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.4.1.tgz"}},"0.4.2":{"name":"brunch","description":"~ with coffee","version":"0.4.2","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.3","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.4.2","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8d628cffdb06923bc6fa5001b40372b225e19dcd","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.4.2.tgz"}},"0.4.3":{"name":"brunch","description":"~ with coffee","version":"0.4.3","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.5","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.4.3","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a3c82e7c7b283a47f7605dc9f9ff096284703ad2","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.4.3.tgz"}},"0.4.4":{"name":"brunch","description":"~ with coffee","version":"0.4.4","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.5","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.4.4","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"031d7ef80c1f9866b8ec41a559eaf91d8240e19f","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.4.4.tgz"}},"0.4.5":{"name":"brunch","description":"~ with coffee","version":"0.4.5","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.5","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.4.5","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"657ac20793485109a532ed9c7eb793ed9fddef41","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.4.5.tgz"}},"0.5.1":{"name":"brunch","description":"~ with coffee","version":"0.5.1","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.6.5","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.5.1","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e314eb4ef89e1a5109ee6a61611524d4c7e3fc57","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.5.1.tgz"}},"0.5.2":{"name":"brunch","description":"~ with coffee","version":"0.5.2","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.0","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.7.0","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.5.2","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"35a82cd14b24a91fed41a2b604a308edb19b17a7","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.5.2.tgz"}},"0.5.3":{"name":"brunch","description":"~ with coffee","version":"0.5.3","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.7.0","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.5.3","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"548cbadc28280751fbf144ee0b80e9dcdfe03216","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.5.3.tgz"}},"0.5.4":{"name":"brunch","description":"~ with coffee","version":"0.5.4","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.7.0","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.5.4","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"12f3ddb35e388a4c57d300c9bef2c110203d0c42","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.5.4.tgz"}},"0.5.5":{"name":"brunch","description":"~ with coffee","version":"0.5.5","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.7.4","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.5.5","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"4996afc31385baf515d2542d0ab3877222928b51","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.5.5.tgz"}},"0.5.6":{"name":"brunch","description":"~ with coffee","version":"0.5.6","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.0.6","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.7.4","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=1.0.7"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.5.6","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.0","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"53884cb4d94de9877fdb7caf1a81e44bcf473e1a","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.5.6.tgz"}},"0.6.0":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.6.0","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.1.0","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.9.2","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=2.0.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.6.0","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"114803b0854c71818f093cde086faf9060050ef1","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.6.0.tgz"}},"0.6.1":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.6.1","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.1.0","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.9.2","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=2.0.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.6.1","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.3","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2a9ea910e8d5c6a2e47047d99bda631d7e2fe4f9","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.6.1.tgz"}},"0.6.2":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.6.2","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"yaml":"0.1.1","coffee-script":">= 1.0.1","underscore":">= 1.1.4","fusion":">= 0.1.0","glob":">= 1.1.0","eco":">= 1.0.1","nomnom":">=0.1.2","stylus":">=0.11.1","async":">=0.1.8","file":">=0.1.1","docco":">=0.3.0","express":">=2.0.0"},"devDependencies":{"coffee-script":">= 1.0.0","vows":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.6.2","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.4","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0d2e62c89692061162502ba5297af2515e216ae8","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.6.2.tgz"}},"0.7.0":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.7.0","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.0.1","underscore":">= 1.1.4","eco":">= 1.0.3","nomnom":">=0.1.2","stylus":">=0.11.10","async":">=0.1.8","file":">=0.1.1","express":">=2.0.0","stitch":"0.3.1"},"devDependencies":{"coffee-script":">= 1.0.1","nodeunit":">= 0.5.1"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.7.0","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.6","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"655ea29c889311b602723ee8d98ec6a691863aab","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.7.0.tgz"}},"0.7.1":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.7.1","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.0.1","underscore":">= 1.1.6","eco":">= 1.0.3","nomnom":">=0.1.2","stylus":">=0.12.3","async":">=0.1.8","yaml":">=0.1.2","file":">=0.1.1","express":">=2.0.0","stitch":"0.3.1"},"devDependencies":{"coffee-script":">= 1.0.1","nodeunit":">= 0.5.1"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.7.1","_engineSupported":true,"_npmVersion":"0.3.3","_nodeVersion":"v0.4.7","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"dc04ab25d238addbb8e914614278e6e3e267c0a6","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.7.1.tgz"}},"0.7.2":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.7.2","keywords":["jst","templates","rest","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore","localstorage"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":["node"],"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.1.1","underscore":">= 1.1.6","eco":">= 1.0.3","nomnom":">=0.1.2","stylus":">=0.13.0","async":">=0.1.8","yaml":">=0.1.2","file":">=0.1.1","express":">=2.0.0","stitch":"0.3.1"},"devDependencies":{"coffee-script":">= 1.1.1","nodeunit":">= 0.5.1"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.7.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.3","dist":{"shasum":"7864c88f5df776bafb7fcee4a9bca10b50b11012","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.7.2.tgz"}},"0.7.3":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.7.3","keywords":["jst","templates","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.1.1","underscore":">= 1.1.6","eco":">= 1.0.3","nomnom":">= 0.4.8","stylus":">= 0.13.3","async":">= 0.1.9","yaml":">= 0.2.1","file":">= 0.1.1","express":">= 2.3.10","stitch":">= 0.3.2","uglify-js":">= 1.0.2"},"devDependencies":{"coffee-script":">= 1.1.1","nodeunit":">= 0.5.1"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_id":"brunch@0.7.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.8","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c65b923f4199f2231a926bad1fde10a0915806e9","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.7.3.tgz"}},"0.7.4":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.7.4","keywords":["jst","templates","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.1.1","underscore":">= 1.1.6","eco":">= 1.0.3","nomnom":">= 0.4.8","stylus":">= 0.13.3","async":">= 0.1.9","yaml":">= 0.2.1","file":">= 0.1.1","express":">= 2.3.10","stitch":">= 0.3.2","uglify-js":">= 1.0.2"},"devDependencies":{"coffee-script":">= 1.1.1","nodeunit":">= 0.5.1"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_npmJsonOpts":{"file":"/Users/nik/.npm/brunch/0.7.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brunch@0.7.4","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e20d8b6b254ba7e1b0a39f56233bdc0b7ed77527","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.7.4.tgz"},"scripts":{}},"0.8.0":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.8.0","keywords":["jst","templates","backbone","fusion","jquery","zepto","json2","framework","brunch","coffeescript","stylus","eco","underscore"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.1.1","underscore":">= 1.1.7","eco":">= 1.0.3","nomnom":">= 0.6.1","stylus":">= 0.13.7","async":">= 0.1.9","yaml":">= 0.2.1","file":">= 0.1.1","stitch":">= 0.3.2","uglify-js":">= 1.0.6"},"devDependencies":{"coffee-script":">= 1.1.1","express":">= 2.4.3","nodeunit":">= 0.5.3"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_npmJsonOpts":{"file":"/Users/nik/.npm/brunch/0.8.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"brunch@0.8.0","_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"17638e2e1e5697ab1c0c5b2792b783767d0a6d19","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.8.0.tgz"},"scripts":{},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"}]},"0.8.1":{"name":"brunch","description":"~ with coffee … is a lightweight client side framework on top of backbone.js, eco and stylus using coffee-script","version":"0.8.1","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunchwithcoffee.com/","author":{"name":"brunch","email":"brunch@blossom.io"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"engines":{"node":">= 0.4.8"},"directories":{"lib":"./lib"},"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"dependencies":{"coffee-script":">= 1.1.1","underscore":">= 1.1.7","eco":">= 1.0.3","nomnom":"1.0.0","stylus":">= 0.13.7","async":">= 0.1.9","yaml":">= 0.2.1","file":">= 0.1.1","stitch":">= 0.3.2","uglify-js":">= 1.0.6"},"devDependencies":{"coffee-script":">= 1.1.1","express":">= 2.4.3","nodeunit":">= 0.5.3","zombie":">= 0.9.7"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@0.8.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0031f5bbf8c9187ec8f356a1db26150555ae4630","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.8.1.tgz"},"readme":"brunch is lightweight client side framework on top of backbone, eco and stylus using coffee-script\n\n## How to Install\n\nyou can get brunch using the node package manager (npm 1.0+)\n\n    npm install brunch -g\n\n## Getting Started\n\nCreate a new project by\n\n    brunch new\n\nThen you can start the file watcher. It will compile your .coffee, .styl and .eco files on the fly after every change so you don't have to do it manually.\n\n    brunch watch\n\nOpen `brunch/index.html` and see you first running brunch application\n\n## Documentation\n\nfor more information ckeck out [brunchwithcoffee.com](http://brunchwithcoffee.com)\n\n## Standing on the Shoulders of Giants\n\nInstead of reinventing the wheel, brunch assembles awesome wheels.\n\n* [CoffeeScript](http://jashkenas.github.com/coffee-script/)\n* [Stitch](https://github.com/sstephenson/stitch)\n* [Backbone](http://documentcloud.github.com/backbone/)\n* [Underscore](http://documentcloud.github.com/underscore/)\n* [jQuery](http://jquery.com/) or [Zepto](http://zeptojs.com/)\n* [Stylus](https://github.com/LearnBoost/stylus)\n* [Eco](https://github.com/sstephenson/eco)\n\n## Development\n\nInstall dependencies to `node_modules` directory\n\n    cake setup\n\nInstall brunch in your local npm repository\n\n    cake install\n\nWatch coffeescript files and continously compile them via\n\n    cake watch\n\nand run test suite via\n\n    cake test\n\n## Contact\n\nFeel free to contact us at Freenode #brunch in the IRC client of your choice.\n\n## Future plans\n\n* add phonegap support\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}]},"0.9.0-beta1":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"0.9.0-beta1","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.6"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.5.0","async":"0.1.15","mkdirp":"0.2.1","growl":"1.4.1","express":"2.5.1"},"devDependencies":{"mocha":"0.8.0","expect.js":"0.1.1","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@0.9.0-beta1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"6b8b3f30c65907fd0f228a9860e6eee144820d44","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.9.0-beta1.tgz"},"readme":"# Brunch\nBrunch is client side framework on top of backbone, eco and\nstylus using CoffeeScript.\n\n## Installation\nYou'll need [node.js](http://nodejs.org/) 0.4 / 0.6. Type:\n\n    npm install -g brunch\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"0.9.0":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"0.9.0","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.6"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.5.0","async":"0.1.15","mkdirp":"0.2.1","growl":"1.4.1","express":"2.5.1"},"devDependencies":{"mocha":"0.8.0","expect.js":"0.1.1","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@0.9.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5a79e824e5e9dd7ae76f1932bbdc1cdc612efc4a","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.9.0.tgz"},"readme":"# Brunch\nBrunch is client side framework on top of backbone, eco and\nstylus using CoffeeScript.\n\n## Installation\nYou'll need [node.js](http://nodejs.org/) 0.4 / 0.6. Type:\n\n    npm install -g brunch\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"0.9.1":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"0.9.1","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.6"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.5.0","async":"0.1.15","mkdirp":"0.2.1","growl":"1.4.1","express":"2.5.1"},"devDependencies":{"mocha":"0.8.0","expect.js":"0.1.1","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@0.9.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"3ddbfefc253ab2188d73c39c764cb5d5bee2bf9e","tarball":"http://registry.npmjs.org/brunch/-/brunch-0.9.1.tgz"},"readme":"# Brunch\nBrunch is client side framework on top of backbone, eco and\nstylus using CoffeeScript.\n\n## Installation\nYou'll need [node.js](http://nodejs.org/) 0.4 / 0.6. Type:\n\n    npm install -g brunch\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"1.0.0":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.0.0","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.6.0","async":"0.1.15","mkdirp":"0.2.1","ncp":"0.2.3","growl":"1.4.1","express":"2.5.1","winston":"0.5.10"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"70456b6d76b3f0bcf2844f68294efdcb1c5768ab","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.0.0.tgz"},"readme":"# Brunch\nA lightweight approach to building HTML5 applications with emphasis on \nelegance and simplicity.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"1.0.1":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.0.1","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.6.0","async":"0.1.18","mkdirp":"0.3.0","ncp":"0.2.6","growl":"1.5.0","express":"2.5.8","winston":"0.5.11"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"7e87b0294d9e74740a1cf6176a6918384f6648d3","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.0.1.tgz"},"readme":"# Brunch\nA lightweight approach to building HTML5 applications with emphasis on \nelegance and simplicity.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"1.0.2":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.0.2","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.6.0","async":"0.1.18","mkdirp":"0.3.0","ncp":"0.2.6","growl":"1.5.0","express":"2.5.8","winston":"0.5.11"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"13dd7af181d403a3fd777286c147c2e45d065bb8","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.0.2.tgz"},"readme":"# Brunch\nA lightweight approach to building HTML5 applications with emphasis on \nelegance and simplicity.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"1.0.3":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.0.3","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/brunch","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha --reporter spec"},"engines":{"node":"~0.6.10"},"dependencies":{"coffee-script":"1.2.0","argumentum":"0.6.0","async":"0.1.18","mkdirp":"0.3.0","ncp":"0.2.6","growl":"1.5.0","express":"2.5.8","winston":"0.5.11"},"devDependencies":{"mocha":"0.14.0","expect.js":"0.1.2","zombie":"0.12.7"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.0.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d0959f693c9101ed94350f24c5fa4cc975ad7f43","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.0.3.tgz"},"readme":"# Brunch\nA lightweight approach to building HTML5 applications with emphasis on \nelegance and simplicity.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n- IRC: #brunch @ Freenode\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"1.1.0":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.1.0","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.1","argumentum":"0.6.0","async":"0.1.18","mkdirp":"0.3.0","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.8","date-utils":"1.2.10","ansi-color":"0.2.1"},"devDependencies":{"mocha":"1.0.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"fdd807fcb30f7beff120c9a15c29e38ec3c91241","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.1.0.tgz"},"readme":"# Brunch\nHTML5 applications made easy.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"1.1.1":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.1.1","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.1","argumentum":"0.6.0","async":"0.1.18","mkdirp":"0.3.0","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.8","date-utils":"1.2.10","ansi-color":"0.2.1"},"devDependencies":{"mocha":"1.0.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"dba0173f3f80fa3c7103f4b941cf6950cda68aa7","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.1.1.tgz"},"readme":"# Brunch\nHTML5 applications made easy.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.1.2":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.1.2","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.1","argumentum":"0.6.0","async":"0.1.18","mkdirp":"0.3.0","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.8","date-utils":"1.2.10","ansi-color":"0.2.1"},"devDependencies":{"mocha":"1.0.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.15","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"610dae578973654eb8d947df73d807b48c78d65c","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.1.2.tgz"},"readme":"# Brunch\nHTML5 applications made easy.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.2.0":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.2.0","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.1","argumentum":"0.6.0","async":"0.1.18","chokidar":"0.2.2","mkdirp":"0.3.0","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.8","date-utils":"1.2.10","ansi-color":"0.2.1"},"devDependencies":{"mocha":"1.0.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"f506f071dba7156c182587344f4443edd224e096","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.2.0.tgz"},"readme":"# Brunch\nHTML5 applications made easy.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.2.1":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.2.1","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.1","argumentum":"0.6.0","async":"0.1.18","chokidar":"0.2.3","mkdirp":"0.3.0","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.8","date-utils":"1.2.10","ansi-color":"0.2.1"},"devDependencies":{"mocha":"1.0.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"585c0674364c21f18d17cdcefe960166c05c5579","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.2.1.tgz"},"readme":"# Brunch\nHTML5 applications made easy.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.2.2":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.2.2","keywords":["backbone","coffeescript","jst","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.1","argumentum":"0.6.0","async":"0.1.18","chokidar":"0.2.3","mkdirp":"0.3.0","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.8","date-utils":"1.2.10","ansi-color":"0.2.1","inflection":"1.2.0"},"devDependencies":{"mocha":"1.0.1","expect.js":"0.1.2"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch@1.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"802d4a9133266ecfea492ed47d19d3911d1d9c2b","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.2.2.tgz"},"readme":"# Brunch\nHTML5 applications made easy.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing ![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\nInstall dependencies to `node_modules` directory\n\n    npm install\n\nand run test suite via\n\n    npm test\n\n## Contact\n- Website: [brunch.io](http://brunch.io).\n- Project twitter: [@brunch](http://twitter.com/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.3.0":{"name":"brunch","description":"HTML5 applications made easy","version":"1.3.0","keywords":["backbone","coffeescript","chaplin","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.3","argumentum":"0.6.0","async":"0.1.22","chokidar":"0.2.6","mkdirp":"0.3.3","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.9","date-utils":"1.2.10","ansi-color":"0.2.1","inflection":"1.2.0","mocha":"1.2.0"},"devDependencies":{},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.3.0","dist":{"shasum":"671212a6ee40231f0564225dee30a6e5f6072a24","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.3.0.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.3.1":{"name":"brunch","description":"HTML5 applications made easy","version":"1.3.1","keywords":["backbone","coffeescript","chaplin","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.3","argumentum":"0.6.0","async":"0.1.22","chokidar":"0.2.6","mkdirp":"0.3.3","ncp":"0.2.6","rimraf":"2.0.1","growl":"1.5.0","express":"2.5.9","date-utils":"1.2.10","ansi-color":"0.2.1","inflection":"1.2.0","mocha":"1.2.0"},"devDependencies":{},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n* Use `git pull` to update to latest brunch.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.3.1","dist":{"shasum":"1aab4e55d1597aea1eb24d4f4bb6047c1c55134c","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.3.1.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.3.2":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.3.2","keywords":["backbone","coffeescript","chaplin","jquery","zepto","framework","brunch","stylus","eco","underscore"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.7 || 0.8"},"dependencies":{"coffee-script":"1.3.3","argumentum":"0.6.0","chokidar":"0.3.0","async":"0.1.22","mkdirp":"0.3.3","ncp":"0.2.6","rimraf":"2.0.2","growl":"1.5.1","express":"2.5.10","date-utils":"1.2.11","ansi-color":"0.2.1","inflection":"1.2.1","mocha":"1.2.0"},"devDependencies":{},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n* Use `git pull` to update to latest brunch.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.3.2","dist":{"shasum":"726cbedbdea55a297de32bb1cf5b39f94b0b481c","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.3.2.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.3.3":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.3.3","keywords":["assembler","builder","stack","chaplin","backbone","ember","html5"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.x","argumentum":"0.6.x","chokidar":"0.3.x","async":"0.1.x","mkdirp":"0.3.x","ncp":"0.2.x","rimraf":"2.0.x","growl":"1.5.x","express":"2.5.x","date-utils":"1.2.x","ansi-color":"0.2.x","inflection":"1.2.x","mocha":"1.2.x"},"devDependencies":{},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n* Use `git pull` to update to latest brunch.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.3.3","dist":{"shasum":"ae1b23f6b7f33f8732af29b26d41ee4f56114526","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.3.3.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.3.4":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.3.4","keywords":["assembler","builder","stack","chaplin","backbone","ember","html5"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"1.3.x","argumentum":"0.6.x","chokidar":"0.3.x","async":"0.1.x","mkdirp":"0.3.x","ncp":"0.2.x","rimraf":"2.0.x","growl":"1.5.x","express":"2.5.x","date-utils":"1.2.x","ansi-color":"0.2.x","inflection":"1.2.x","mocha":"1.2.x"},"devDependencies":{},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n* Use `git pull` to update to latest brunch.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.3.4","dist":{"shasum":"96f4bc3c024f27822ad056808c50448d53aa671c","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.3.4.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.4.0":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.4.0","keywords":["assembler","builder","stack","chaplin","backbone","ember","html5"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"~1.3.3","argumentum":"~0.6.0","chokidar":"~0.4.0","async":"~0.1.22","mkdirp":"~0.3.3","ncp":"~0.2.6","walk":"~2.2.1","rimraf":"~2.0.2","growl":"~1.5.1","express":"~2.5.11","date-utils":"~1.2.11","ansi-color":"~0.2.1","inflection":"~1.2.2","mocha":"~1.3.0","handlebars":"~1.0.6"},"devDependencies":{"chai":"~1.1.1"},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n* Use `git pull` to update to latest brunch.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.4.0","dist":{"shasum":"557f2849790567ad1d12fed26002a9bd25c7b3e8","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.4.0.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"directories":{}},"1.4.1":{"name":"brunch","description":"A lightweight approach to building HTML5 applications with emphasis on elegance and simplicity","version":"1.4.1","keywords":["assembler","builder","stack","chaplin","backbone","ember","html5"],"homepage":"http://brunch.io/","author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"bugs":{"url":"http://github.com/brunch/brunch/issues"},"licenses":[{"type":"MIT","url":"http://github.com/brunch/brunch/raw/master/LICENSE"}],"main":"./lib/index","bin":{"brunch":"./bin/brunch"},"scripts":{"prepublish":"coffee -o lib/ src/","postinstall":"node setup.js postinstall","test":"node setup.js test"},"engines":{"node":"~0.6.10 || 0.8 || 0.9"},"dependencies":{"coffee-script":"~1.3.3","argumentum":"~0.6.0","chokidar":"~0.4.0","async":"~0.1.22","mkdirp":"~0.3.3","ncp":"~0.2.6","walk":"~2.2.1","growl":"~1.5.1","express":"~2.5.11","date-utils":"~1.2.11","ansi-color":"~0.2.1","inflection":"~1.2.2","mocha":"~1.3.2","handlebars":"~1.0.6"},"devDependencies":{"chai":"~1.2.0"},"readme":"# Brunch\nHTML5 applications made easy.\n\nBrunch is an assembler for HTML5 applications. It's agnostic to frameworks,\nlibraries, programming, stylesheet & templating languages and backend\ntechnology.\n\nTo simplify app development, brunch watches your files for changes and\nautomatically wraps your scripts and templates in common.js modules.\nAll build errors are printed to console. If you have growl / libnotify,\nbrunch will use them too.\n\nIt's like LiveReload or CodeKit plus Grunt, but much more faster,\nrobust and universal.\n\n## Getting started\nYou'll need [node.js](http://nodejs.org/) 0.6.10+. Type:\n\n    npm install -g brunch\n\nYou're done!\n\nTo create a new project, execute `brunch new <project name>`.\n\nTo build it, execute `brunch build` in project directory.\n\nTo continuously rebuild the project on every change, run `brunch watch`.\n\nTo run a simple http server, execute `brunch watch --server`.\n\n## Contributing\n![build status](https://secure.travis-ci.org/brunch/brunch.png?branch=master)\n\nYou can install the latest `master` version of brunch by following these\nsimple steps:\n\n* Clone the repo, navigate to its directory.\n* Change `bin/brunch` in `package.json` to `bin/brunchcoffee`.\nIt will allow you not to compile the source every time you change it.\n* Execute `npm install` to install packages.\n* Execute `npm uninstall -g brunch && npm link`\n* Change `package.json` `bin/brunchcoffee` back to `bin/brunch`.\n* Use `git pull` to update to latest brunch.\n\nTest suite can be run via `npm test`.\n\n## Contact\n* Website: [brunch.io](http://brunch.io).\n* Project twitter: [@brunch](http://twitter.com/brunch)\n* Project forum: [ost.io/brunch/brunch](http://ost.io/brunch/brunch)\n\n## License\nBrunch is released under the MIT License (see LICENSE for details).\n","_id":"brunch@1.4.1","dist":{"shasum":"278d41376998891b0e1ceec202da6a56a6c0d65b","tarball":"http://registry.npmjs.org/brunch/-/brunch-1.4.1.tgz"},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}]}},"maintainers":[{"name":"tosh","email":"tosh@blossom.io"},{"name":"nikgraf","email":"nik@deck.cc"},{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-08-07T23:57:37.718Z","created":"2011-01-21T01:12:22.161Z","0.0.1":"2011-01-21T01:12:22.755Z","0.0.2":"2011-01-21T01:23:44.041Z","0.0.3":"2011-01-21T02:45:40.315Z","0.0.4":"2011-01-25T17:52:42.105Z","0.0.5":"2011-01-25T18:03:54.389Z","0.0.6":"2011-01-25T19:27:40.807Z","0.0.7":"2011-01-26T17:07:35.192Z","0.0.8":"2011-01-26T23:15:24.930Z","0.1.0":"2011-01-27T15:17:10.690Z","0.1.1":"2011-01-27T16:43:27.647Z","0.1.3":"2011-01-29T17:01:53.199Z","0.1.4":"2011-01-29T19:17:22.271Z","0.1.5":"2011-01-29T20:11:37.076Z","0.1.6":"2011-01-31T15:52:19.158Z","0.1.7":"2011-01-31T15:57:02.566Z","0.1.8":"2011-01-31T18:02:08.208Z","0.1.9":"2011-01-31T18:58:46.231Z","0.2.0":"2011-02-01T14:28:38.286Z","0.2.1":"2011-02-01T15:02:09.618Z","0.2.2":"2011-02-01T15:47:01.225Z","0.2.3":"2011-02-01T17:28:17.203Z","0.2.4":"2011-02-02T10:18:09.114Z","0.2.6":"2011-02-02T10:53:21.874Z","0.2.7":"2011-02-04T00:10:21.789Z","0.2.8":"2011-02-07T17:15:31.234Z","0.3.0":"2011-02-15T15:45:23.653Z","0.3.1":"2011-02-16T12:43:41.146Z","0.3.2":"2011-02-17T11:37:33.965Z","0.3.4":"2011-02-21T13:56:46.379Z","0.3.5":"2011-02-21T15:48:49.729Z","0.3.6":"2011-02-21T21:06:03.166Z","0.3.7":"2011-02-23T12:11:26.550Z","0.4.0":"2011-02-23T17:39:49.576Z","0.4.1":"2011-02-23T17:48:07.229Z","0.4.2":"2011-02-24T15:12:54.624Z","0.4.3":"2011-02-25T10:13:21.208Z","0.4.4":"2011-02-28T09:09:08.802Z","0.4.5":"2011-03-03T21:27:53.292Z","0.5.1":"2011-03-07T21:12:36.614Z","0.5.2":"2011-03-07T21:14:38.553Z","0.5.3":"2011-03-07T21:17:51.720Z","0.5.4":"2011-03-07T22:23:07.165Z","0.5.5":"2011-03-12T03:03:51.231Z","0.5.6":"2011-03-14T12:53:17.078Z","0.6.0":"2011-03-22T16:49:14.172Z","0.6.1":"2011-03-22T17:25:53.840Z","0.6.2":"2011-04-05T10:18:28.830Z","0.7.0":"2011-04-21T14:57:40.354Z","0.7.1":"2011-05-08T20:05:32.056Z","0.7.2":"2011-05-18T23:50:52.143Z","0.7.3":"2011-06-07T12:52:52.750Z","0.7.4":"2011-07-22T14:45:22.296Z","0.8.0":"2011-08-01T10:59:53.685Z","0.8.1":"2012-01-09T02:31:16.554Z","0.9.0-beta1":"2012-01-10T14:26:36.504Z","0.9.0":"2012-02-21T19:27:57.835Z","0.9.1":"2012-02-21T21:14:38.471Z","1.0.0":"2012-03-18T17:49:21.683Z","1.0.1":"2012-03-26T20:22:41.200Z","1.0.2":"2012-03-28T20:16:28.316Z","1.0.3":"2012-04-02T21:57:36.886Z","1.1.0":"2012-04-15T18:24:22.175Z","1.1.1":"2012-04-19T20:58:51.645Z","1.1.2":"2012-04-20T15:58:56.271Z","1.2.0":"2012-05-12T14:15:26.087Z","1.2.1":"2012-05-12T18:47:40.228Z","1.2.2":"2012-05-24T01:46:39.123Z","1.3.0":"2012-06-18T21:43:10.438Z","1.3.1":"2012-06-22T14:16:46.031Z","1.3.2":"2012-06-27T11:28:48.563Z","1.3.3":"2012-06-29T15:04:49.416Z","1.3.4":"2012-07-08T09:29:26.646Z","1.4.0-pre":"2012-08-03T21:05:55.547Z","1.4.0":"2012-08-03T21:13:08.389Z","1.4.1":"2012-08-07T23:57:37.718Z"},"author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"https://github.com/brunch/brunch.git"},"_attachments":{"brunch-1.4.1.tgz":{"content_type":"application/octet-stream","revpos":266,"digest":"md5-0vHgbcaDneBEjBj+9KqtWg==","length":250029,"stub":true},"brunch-1.4.0.tgz":{"content_type":"application/octet-stream","revpos":262,"digest":"md5-tqybkJcZ7L1+2g5eZ+wxwA==","length":244008,"stub":true},"brunch-1.3.4.tgz":{"content_type":"application/octet-stream","revpos":238,"digest":"md5-+MpU2GMk8qhGTXFdL8uSeA==","length":417432,"stub":true},"brunch-1.3.3.tgz":{"content_type":"application/octet-stream","revpos":228,"digest":"md5-j1U3wQhcOGsQYwJ4uCgvcA==","length":237565,"stub":true},"brunch-1.3.2.tgz":{"content_type":"application/octet-stream","revpos":226,"digest":"md5-Lc2CVcWs637NEClIBOA88g==","length":235934,"stub":true},"brunch-1.3.1.tgz":{"content_type":"application/octet-stream","revpos":224,"digest":"md5-H009JDo16m2TETThy6vJnQ==","length":240605,"stub":true},"brunch-1.3.0.tgz":{"content_type":"application/octet-stream","revpos":222,"digest":"md5-+22ajH3/GJKoOaqfhf9P6A==","length":235247,"stub":true},"brunch-1.2.2.tgz":{"content_type":"application/octet-stream","revpos":216,"digest":"md5-FWLDIPWNx4C6AnVeADsuPQ==","length":135152,"stub":true},"brunch-1.2.1.tgz":{"content_type":"application/octet-stream","revpos":214,"digest":"md5-aVF3JqLPS98eT6tE7uwjgA==","length":134307,"stub":true},"brunch-1.2.0.tgz":{"content_type":"application/octet-stream","revpos":212,"digest":"md5-N2gFxlfJx+b3705UIEUZwA==","length":134241,"stub":true},"brunch-1.1.2.tgz":{"content_type":"application/octet-stream","revpos":198,"digest":"md5-C6Y+UO1UhZ1cOPzoKjOLSw==","length":132078,"stub":true},"brunch-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":196,"digest":"md5-gqCs/iy58hghLT5BLT5P4A==","length":132012,"stub":true},"brunch-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":190,"digest":"md5-4YNT9nbnfUFQwJNd1I3obg==","length":132407,"stub":true},"brunch-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":180,"digest":"md5-MWzugDDSEAK6+IBP25wFNQ==","length":124700,"stub":true},"brunch-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":178,"digest":"md5-KnVKVzskqG0oGPuRHCNGHg==","length":229750,"stub":true},"brunch-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":176,"digest":"md5-yZf/RN0WHY/LZDh6Zb0nEg==","length":125233,"stub":true},"brunch-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":174,"digest":"md5-SZxYUrjZZ1cap5sIk9E88A==","length":125513,"stub":true},"brunch-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":148,"digest":"md5-OqFazPtIArljui66MFWD7g==","length":123905,"stub":true},"brunch-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":146,"digest":"md5-+i3Kt6OVGQMRVJIoyX9DlA==","length":123873,"stub":true},"brunch-0.9.0-beta1.tgz":{"content_type":"application/octet-stream","revpos":144,"digest":"md5-7njiL/agnEGgt5Grp02MnA==","length":123662,"stub":true},"brunch-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":138,"digest":"md5-/fIfL4IGpIujXmsyPzUlFg==","length":105869,"stub":true},"brunch-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":111,"digest":"md5-UEis4vGvw/ouv6lP50gBvg==","length":104644,"stub":true},"brunch-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":109,"digest":"md5-0gmQ8OAI2XgKRY6/BtEFxA==","length":182743,"stub":true},"brunch-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":107,"digest":"md5-Cn9wdnN+vpiomu+ulwE95w==","length":2127305,"stub":true},"brunch-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":105,"digest":"md5-to13KWJ3tRi17pNzvnZwSQ==","length":182424,"stub":true},"brunch-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":99,"digest":"md5-9HlC1CjJ52N+HEEKz/CLYA==","length":181163,"stub":true},"brunch-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":97,"digest":"md5-8njfhUTG/OT+xTDnB3x0Dg==","length":180928,"stub":true},"brunch-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":95,"digest":"md5-ld8tZSuBBWwwGWyq49lsbg==","length":52835,"stub":true},"brunch-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":93,"digest":"md5-04AaHNGpNn0NmA3v+IO3wA==","length":52832,"stub":true},"brunch-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":91,"digest":"md5-BtSZ58hbQ+WrOuFFushLfQ==","length":52830,"stub":true},"brunch-0.5.6.tgz":{"content_type":"application/octet-stream","revpos":89,"digest":"md5-xAWm4/n/WSgSWxnHgpfZqA==","length":51341,"stub":true},"brunch-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":87,"digest":"md5-fyJ2JpzljZv9xLgw3EmaoA==","length":51308,"stub":true},"brunch-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":85,"digest":"md5-A1ivo0u3ezVS8HRSICZHXw==","length":51279,"stub":true},"brunch-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-I7dJfCXWPbNVWajkfC1c/Q==","length":53702,"stub":true},"brunch-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-TJO4O3l0aQw0kn4V6+6Mjg==","length":53700,"stub":true},"brunch-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-a3fNZPBz1Ks+GjpBKQNzow==","length":53700,"stub":true},"brunch-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-zrb20FcG2JxYkLhDPJuiuA==","length":50898,"stub":true},"brunch-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-lbrqAf5EhSKOMa4HeMLHzw==","length":50367,"stub":true},"brunch-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-TvijfFA0OktVNjjp0sMb5w==","length":52007,"stub":true},"brunch-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-dh3kiwVNFMXXBM4USQu34g==","length":52642,"stub":true},"brunch-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-McBTce077TtpSQrmgaXF3w==","length":51595,"stub":true},"brunch-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-8CSit4XXNBVBL3Tk6/gBpQ==","length":49853,"stub":true},"brunch-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-gxkNw1k/nTN/2G5R/prwiw==","length":91046,"stub":true},"brunch-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-lpyapymQoyKGtv4rvJb5uQ==","length":93126,"stub":true},"brunch-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-XnvfcQ/aLEA2xKcXBpL8Eg==","length":94293,"stub":true},"brunch-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-Uh7VQ0OhQfmDRioj43YnxQ==","length":91101,"stub":true},"brunch-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-GcilLzwin4rzz+iYjzmVoQ==","length":92787,"stub":true},"brunch-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-69tTqhOLg+GKUQFvYS6Duw==","length":92780,"stub":true},"brunch-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-nLwNSiQ7D3PejGm/hczCBQ==","length":71942,"stub":true},"brunch-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-ABssvNIqBovIJBcXcqFHxg==","length":71931,"stub":true},"brunch-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-yOSDH+HdBLfpKSXZKAVlBw==","length":71671,"stub":true},"brunch-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-AfHaOMPdMZN56dI0U3MiFQ==","length":11124,"stub":true},"brunch-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-czuekpUdC0KolR/jPD3v/g==","length":10740,"stub":true},"brunch-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-YeP/5l2A63Gu+PK+OY3aig==","length":8862,"stub":true},"brunch-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-3FVeq0iIDtOBhcg+z6WnNQ==","length":10391,"stub":true},"brunch-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-jT6OAFYywD9CUqYDIKpSRA==","length":10555,"stub":true},"brunch-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-CTRVg7G4utN65Yk7qRz6ZA==","length":10553,"stub":true},"brunch-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-txKYFKxz7QyYcDJGJ52yJQ==","length":8580,"stub":true},"brunch-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-C5YZO944lHW2DyU8B3EWmg==","length":8570,"stub":true},"brunch-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-IG/Y/hh+EgQkk3r3OLUEww==","length":9115,"stub":true},"brunch-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-9KcBCR/a4GfncLyZ4014TQ==","length":10310,"stub":true},"brunch-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-i/mXzvQw6EsSVnAm043qSA==","length":8923,"stub":true},"brunch-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-+w7anXeA7ZuU3PFOGc7fNw==","length":8930,"stub":true},"brunch-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-mw1sjRMVZVUEB0pmY1LcTw==","length":10037,"stub":true},"brunch-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-c8cHBiHwV63251nsX5HlYQ==","length":8542,"stub":true},"brunch-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-Of8KwveeUS1DpQO5MmdNlg==","length":9410,"stub":true},"brunch-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-r/RcI1tYh59XsZ0ZAHC+Yg==","length":8956,"stub":true},"brunch-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-/xFifNOvGxkw1mnC02wjrg==","length":8534,"stub":true},"brunch-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-n+xR0WBxXuEdi6OoHzaZPA==","length":7113,"stub":true},"brunch-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-gpta7T6pNyfR472qrrz0Nw==","length":7567,"stub":true},"brunch-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-2MTqPfbe8J7hj2yMNSSC2Q==","length":7552,"stub":true},"brunch-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Djbvhs2avsQGDj6ouqoW/Q==","length":7692,"stub":true},"brunch-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CZ9K8CMkIHiulfjuXGEBZA==","length":8254,"stub":true},"brunch-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-U3LABFW1N8h5HW82TggkYA==","length":7351,"stub":true}}}},
{"id":"brunch-extensions","key":"brunch-extensions","value":{"rev":"17-9cac29bcfef95da8fdcb92b0b29f6a95"},"doc":{"_id":"brunch-extensions","_rev":"17-9cac29bcfef95da8fdcb92b0b29f6a95","name":"brunch-extensions","description":"Official brunch extensions. Adds support of many languages to brunch.","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"author":{"name":"brunch"},"name":"brunch-extensions","description":"Official brunch extensions. Adds support of many languages to brunch.","version":"0.1.0","homepage":"https://github.com/brunch/brunch-extensions","repository":{"type":"git","url":"git@github.com:brunch/brunch-extensions.git"},"main":"./lib/index","scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha"},"engines":{"node":"~0.6.6"},"dependencies":{"async":"0.1.15","mkdirp":"0.2.1","coffee-script":"1.2.0","roy":"0.1.3","eco":"1.0.3","jade":"0.19.0","stylus":"0.21.2","less":"1.1.6"},"devDependencies":{"mocha":"0.3.6","expect.js":"0.1.1"},"_npmUser":{"name":"paulmillr","email":"paulmillr@me.com"},"_id":"brunch-extensions@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"586af079d5097bb0face543de02bd9305601b88f","tarball":"http://registry.npmjs.org/brunch-extensions/-/brunch-extensions-0.1.0.tgz"},"maintainers":[{"name":"paulmillr","email":"paulmillr@me.com"}],"directories":{}},"0.2.0":{"name":"brunch-extensions","version":"0.2.0","description":"Official brunch extensions. Adds support of many languages to brunch.","author":{"name":"Brunch team","url":"http://brunch.io"},"homepage":"https://github.com/brunch/brunch-extensions","repository":{"type":"git","url":"git@github.com:brunch/brunch-extensions.git"},"main":"./lib/index","scripts":{"prepublish":"coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha"},"engines":{"node":"~0.6.6"},"dependencies":{"async":"0.1.15","mkdirp":"0.2.1","coffee-script":"1.2.0","roy":"0.1.3","eco":"1.0.3","jade":"0.19.0","stylus":"0.21.2","less":"1.1.6"},"devDependencies":{"mocha":"0.3.6","expect.js":"0.1.1"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch-extensions@0.2.0","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7e3e895cdf5503617b52024c50ebe4207c4da020","tarball":"http://registry.npmjs.org/brunch-extensions/-/brunch-extensions-0.2.0.tgz"},"readme":"","maintainers":[{"name":"paulmillr","email":"paulmillr@me.com"}]},"0.2.1":{"name":"brunch-extensions","version":"0.2.1","description":"Official brunch extensions. Adds support of many languages to brunch.","author":{"name":"Brunch team","url":"http://brunch.io"},"homepage":"https://github.com/brunch/brunch-extensions","repository":{"type":"git","url":"git@github.com:brunch/brunch-extensions.git"},"main":"./lib/index","scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha"},"engines":{"node":"~0.6.6"},"dependencies":{"async":"0.1.15","mkdirp":"0.2.1","coffee-script":"1.2.0","roy":"0.1.3","eco":"1.0.3","jade":"0.19.0","stylus":"0.21.2","less":"1.1.6"},"devDependencies":{"mocha":"0.3.6","expect.js":"0.1.1"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch-extensions@0.2.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"881a8dbd7036bb5ccefdb47ecc5c1ad4bf0c7c69","tarball":"http://registry.npmjs.org/brunch-extensions/-/brunch-extensions-0.2.1.tgz"},"readme":"","maintainers":[{"name":"paulmillr","email":"paulmillr@me.com"}]},"0.2.2":{"name":"brunch-extensions","version":"0.2.2","description":"Official brunch extensions. Adds support of many languages to brunch.","author":{"name":"Brunch team","url":"http://brunch.io"},"homepage":"https://github.com/brunch/brunch-extensions","repository":{"type":"git","url":"git@github.com:brunch/brunch-extensions.git"},"main":"./lib/index","scripts":{"postinstall":"./node_modules/coffee-script/bin/coffee -o lib/ src/","test":"./node_modules/mocha/bin/mocha"},"engines":{"node":"~0.6.6"},"dependencies":{"async":"0.1.15","mkdirp":"0.2.1","coffee-script":"1.2.0","roy":"0.1.4","eco":"1.0.3","jade":"0.19.0","stylus":"0.21.2","less":"1.1.6"},"devDependencies":{"mocha":"0.3.6","expect.js":"0.1.1"},"_npmUser":{"name":"paulmillr","email":"paul@paulmillr.com"},"_id":"brunch-extensions@0.2.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"15d216efaf4d0f4ac772b0ceddf1026c26a89c8c","tarball":"http://registry.npmjs.org/brunch-extensions/-/brunch-extensions-0.2.2.tgz"},"readme":"","maintainers":[{"name":"paulmillr","email":"paulmillr@me.com"}]}},"readme":"","maintainers":[{"name":"paulmillr","email":"paul@paulmillr.com"}],"time":{"modified":"2012-04-16T04:36:56.193Z","created":"2011-12-27T05:19:49.529Z","0.1.0":"2011-12-27T05:19:51.410Z","0.2.0":"2012-01-09T21:28:21.648Z","0.2.1":"2012-01-17T06:50:44.408Z","0.2.2":"2012-01-23T11:24:06.827Z"},"author":{"name":"Brunch team","url":"http://brunch.io"},"repository":{"type":"git","url":"git@github.com:brunch/brunch-extensions.git"},"_attachments":{"brunch-extensions-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-+NgqHPAMmeyWf0wjT6mmOg==","length":2608,"stub":true},"brunch-extensions-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-SvwGC/zElKvo3u9JNJg0UA==","length":2597,"stub":true},"brunch-extensions-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-YoiAEbo1k35BN5py2jgXHA==","length":2618,"stub":true},"brunch-extensions-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sKkAzugBKYsaPyPIAsDwIA==","length":10240,"stub":true}}}},
{"id":"bruno","key":"bruno","value":{"rev":"3-177036fc7580f4ac0064680a631ceb20"},"doc":{"_id":"bruno","_rev":"3-177036fc7580f4ac0064680a631ceb20","name":"bruno","description":"A little CMS with speed of creation in mind","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"Cameron Bytheway","email":"bytheway.cameron@gmail.com"},"name":"bruno","description":"A little CMS with speed of creation in mind","version":"0.0.0","repository":{"type":"git","url":"git://github.com/CamShaft/bruno.js.git"},"dependencies":{"ansi-color":"0.2.1","coffee-script":"1.3.3","argumentum":"0.6.0","date-utils":"1.2.10","express":"2.5.9"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"CamShaft","email":"bytheway.cameron@gmail.com"},"_id":"bruno@0.0.0","_engineSupported":true,"_npmVersion":"1.1.13","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a7a5221d6ba7a253173f6a2c8486e11f681223f5","tarball":"http://registry.npmjs.org/bruno/-/bruno-0.0.0.tgz"},"maintainers":[{"name":"CamShaft","email":"bytheway.cameron@gmail.com"}]}},"readme":"Bruno\n=====\n\nA little CMS with speed of creation in mind","maintainers":[{"name":"CamShaft","email":"bytheway.cameron@gmail.com"}],"time":{"modified":"2012-06-20T03:37:29.864Z","created":"2012-06-20T03:37:28.964Z","0.0.0":"2012-06-20T03:37:29.864Z"},"author":{"name":"Cameron Bytheway","email":"bytheway.cameron@gmail.com"},"repository":{"type":"git","url":"git://github.com/CamShaft/bruno.js.git"},"_attachments":{"bruno-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OBrdT+g156GW6AV2sd9zmg==","length":2132,"stub":true}}}},
{"id":"bruno_hubot-scripts","key":"bruno_hubot-scripts","value":{"rev":"5-5ac68c803b8a6360c01f1157f6dd89a9"},"doc":{"_id":"bruno_hubot-scripts","_rev":"5-5ac68c803b8a6360c01f1157f6dd89a9","name":"bruno_hubot-scripts","description":"Allows you to opt in to a variety of scripts","dist-tags":{"latest":"2.0.6"},"versions":{"2.0.5":{"name":"bruno_hubot-scripts","version":"2.0.5","author":{"name":"hubot"},"keywords":["hubot plugin scripts campfire bot robot"],"description":"Allows you to opt in to a variety of scripts","licenses":[{"type":"MIT","url":"http://github.com/github/hubot-scripts/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/bruno/hubot-scripts.git"},"dependencies":{"hubot":">= 2.0.4","optparse":"1.0.3","redis":"0.6.7","jsdom":"==0.2.0","xml2js":"0.1.x","soupselect":"0.2.0","htmlparser":"1.7.x","wolfram":"0.1.1","sprintf":"0.1.1","wwwdude":"0.1.0","pypi":"0.1.0","underscore":">= 1.2.1","underscore.string":">= 1.1.6","cradle":"0.5.7","clark":">= 0.0.3","bang":"0.2.x","shellwords":"0.0.x","nodepie":"0.4.0","mailer":"0.6.7","scribe-node":"0.0.24"},"directories":{"lib":"./src"},"engine":"node >= 0.4.1","_npmUser":{"name":"bruno","email":"bruno@southern-path.com"},"_id":"bruno_hubot-scripts@2.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"80e5dccffaaa1e33befa4bce6589311595437b12","tarball":"http://registry.npmjs.org/bruno_hubot-scripts/-/bruno_hubot-scripts-2.0.5.tgz"},"maintainers":[{"name":"bruno","email":"bruno@southern-path.com"}]},"2.0.6":{"name":"bruno_hubot-scripts","version":"2.0.6","author":{"name":"hubot"},"keywords":["hubot plugin scripts campfire bot robot"],"description":"Allows you to opt in to a variety of scripts","licenses":[{"type":"MIT","url":"http://github.com/github/hubot-scripts/raw/master/LICENSE"}],"repository":{"type":"git","url":"git://github.com/bruno/hubot-scripts.git"},"dependencies":{"hubot":">= 2.0.4","optparse":"1.0.3","redis":"0.6.7","jsdom":"==0.2.0","xml2js":"0.1.x","soupselect":"0.2.0","htmlparser":"1.7.x","wolfram":"0.2.0","sprintf":"0.1.1","wwwdude":"0.1.0","pypi":"0.1.0","underscore":">= 1.2.1","underscore.string":">= 1.1.6","cradle":"0.5.7","clark":">= 0.0.3","bang":"0.2.x","shellwords":"0.0.x","nodepie":"0.4.0","mailer":"0.6.7","scribe-node":"0.0.24"},"directories":{"lib":"./src"},"engine":"node >= 0.4.1","_npmUser":{"name":"bruno","email":"bruno@southern-path.com"},"_id":"bruno_hubot-scripts@2.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"7050e8eaf7976e381276d17ef4196494f0d68343","tarball":"http://registry.npmjs.org/bruno_hubot-scripts/-/bruno_hubot-scripts-2.0.6.tgz"},"maintainers":[{"name":"bruno","email":"bruno@southern-path.com"}]}},"readme":"# hubot-scripts\n\nThese are a collection of community scripts for\n[Hubot](https://github.com/github/hubot), a chat bot for your company.\n\n## Installing\n\nOnce you have Hubot installed, you can drop new scripts from this repository\nright into your generated Hubot installation. Just put them in `scripts`,\nrestart your robot, and you're good to go.\n\nAll the scripts in this repository are located in\n[`src/scripts`](https://github.com/github/hubot-scripts/tree/master/src/scripts).\n\n## Writing\n\nWant to write your own Hubot script? The best way is to take a look at an\n[existing script](https://github.com/github/hubot-scripts/blob/master/src/scripts/tweet.coffee)\nand see how things are set up. Hubot scripts are written in CoffeeScript, a\nhigher-level implementation of JavaScript.\n\nYou'll also want to [add tests](https://github.com/github/hubot-scripts/blob/master/test/tests.coffee)\nfor your script; no one likes untested code. It makes Hubot sad.\n\nAdditionally, it's extremely helpful to add [TomDoc](http://tomdoc.org) to the\ntop of each file. (Check out [an example](https://github.com/github/hubot-scripts/blob/master/src/scripts/speak.coffee#L1-5)).\nWe'll pull out the commands from those lines and display them in the generic,\nrobot-wide `hubot help` command.\n\n## Scripts\n\n## spin.coffee\n\n### Spin me\n\n__Format:__\n\n    (@yourbot )spin me <query> - Returns a spun version of the input.\n\n__Input:__\n\n    spin me {Hi there|Greetings|Hi|Hello|Hello There}{!|,}\n\n    I {really|simply|totally} {love|respect|admire} your {blog|article|post|opinion} and {will tell all my friends about it|will be back again tomorrow|also the design of your website}.\n\n    {Thanks|Thank you|Cheers|Bye for now}!\n\n__Output:__\n\n    Greetings!\n\n    I simply admire your blog and also the design of your website.\n\n    Cheers!\n\n### Spun me\n\n__Format:__\n\n    (@yourbot )spun me <query> - Returns a spintax version of the input using articlemanager.us spinner API.\n\n__Input:__\n\n    spun me Below it sat a wooden case of trophies and other awards. Several more were stacked into other corners, joining marble statues, weapon stands and a flat screen television. They all shined in the fire’s light. At least he knew his mother and sister, who were overseas visiting the Queen of England, would be proud. He settled on calling them later, envisioning how they would congratulate him on bringing even more fame and wealth to the family. The invention cooking up in his basement right now was going to make him bigger than the internet.\n\n__Output:__\n\n    Below it sat {a|the} wooden case of trophies {and other|along with other|as well as other} awards. Several more {were|had been} stacked into other {corners|edges}, joining marble statues, weapon stands {and a|along with a} flat screen television. {They all|All of them} shined in the fire’s {light|lighting|mild}. At least he {knew|realized} his mother and {sister}, who were overseas {visiting|going to} the Queen of {England|Britain}, would be proud. {He|This individual|He or she} settled on calling {them|all of them} later, envisioning how {they would|they might} congratulate him on bringing {even more|much more} fame and wealth {to the|towards the} family. The invention cooking {up|upward} in his basement right now {was going to|would definitely} make him bigger {than the|compared to} internet.\n\n### Spin the last spun\n\n__Format:__\n\n    (@yourbot )spun the last spun - Returns a spun version of the input generated by the last spun me call.\n\n__Output:__\n\nAfter previous spun me command output could be for example:\n\n    Below it sat a wooden case of trophies and other awards. Several more had been stacked into other corners, joining marble statues, weapon stands along with a flat screen television. They all shined in the fire’s mild. At least he realized his mother and sister, who were overseas visiting the Queen of Britain, would be proud. He or she settled on calling all of them later, envisioning how they would congratulate him on bringing much more fame and wealth towards the family. The invention cooking upward in his basement right now would definitely make him bigger compared to internet.\n\nOr if storage is empty: `Nothing so spin. Please use spun first.`\n\n### Spun and spin me\n\n__Format:__\n\n    (@yourbot )spun and spin me <query> - Returns a spun version of the input using spun me command first.\n\n__Input:__\n\n    spun and spin me And please do not expect anything like Goethe or Schiller from my work, no expect everything, everything, but please no niveau! Because I am orientating myself way more direction Charles Bukowski and Hank was according to common knowledge born in a German town on the left river bank of the Rhine. I myself do live coincidentally in a small town along the Rhine, where triumphantly wins of the Handball team and disturbances in the local chemical plants are holding each other in suspense. Happily or sadly, both of them happen rather seldom.\n\n__Output:__\n\nFor example:\n\n    And please do not expect anything like Goethe or Schiller from my work, no expect everything, everything, but please no niveau! Because I am orientating myself way more direction Charles Bukowski and Hank was according to common knowledge born in a German town on the left river bank of the Rhine. I myself do live coincidentally in a small town along the Rhine, where triumphantly wins of the Handball team and disturbances in the local chemical plants are holding each other in suspense. Happily or sadly, both of them happen rather seldom.\n\n## oauth.coffee\n\n__Get authorization URL__\n\n    get <api> authorization url - get a link to authorization place\n\n__Set verifier__\n\n    set <api> verifier <verification_code> - set verification code and access token after first step\n\n__Set access token__\n\n    set <api> access token <code> - set access token manually, for OAuth 2.0 (Facebook) only\n\n__Refresh token__\n\n    refresh <api> token - refresh access token if it expires, for OAuth 2.0 only\n\n__Get request token__\n\n    get <api> request token - retrieves request token public value\n\n__Get access token__\n\n    get <api> access token - retrieves access token public value\n\n__Get verifier__\n\n    get <api> verifier - retrieves verification code\n\n__Remove authorization__\n\n    remove <api> authorization - clears tokens from memory if user is same who verified the last authorization","maintainers":[{"name":"bruno","email":"bruno@southern-path.com"}],"time":{"modified":"2011-12-22T23:30:10.343Z","created":"2011-12-22T23:25:40.048Z","2.0.5":"2011-12-22T23:25:44.311Z","2.0.6":"2011-12-22T23:30:10.343Z"},"author":{"name":"hubot"},"repository":{"type":"git","url":"git://github.com/bruno/hubot-scripts.git"},"_attachments":{"bruno_hubot-scripts-2.0.6.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ssbQzcfLxeal9rTFHbuXgg==","length":71680,"stub":true},"bruno_hubot-scripts-2.0.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Bgs1xEOsKcbRRy5OHmqeLg==","length":71680,"stub":true}}}},
{"id":"brushes.js","key":"brushes.js","value":{"rev":"5-6161820ce30afc6bf4ca90ee0e365a8a"},"doc":{"_id":"brushes.js","_rev":"5-6161820ce30afc6bf4ca90ee0e365a8a","name":"brushes.js","description":"HTML5 canvas brushes","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Jim Schubert","email":"james.schubert@gmail.com","url":"http://github.com/jimschubert"},"name":"brushes.js","description":"HTML5 canvas brushes","version":"0.0.1","repository":{"type":"git","url":"git://github.com/jimschubert/brushes.js.git"},"engines":{"node":">= 0.4.4"},"dependencies":{},"devDependencies":{"canvas":"*","nodeunit":"*","uglify-js":"*"},"scripts":{"test":"node test/run.js","minify":"node_modules/uglify-js/bin/uglifyjs -o src/brushes.min.js src/brushes.js"},"_id":"brushes.js@0.0.1","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c8fe11b522c071ec8025a424ada23fd2ca32acbf","tarball":"http://registry.npmjs.org/brushes.js/-/brushes.js-0.0.1.tgz"},"maintainers":[{"name":"jimschubert","email":"james.schubert@gmail.com"}]},"0.0.2":{"author":{"name":"Jim Schubert","email":"james.schubert@gmail.com","url":"http://github.com/jimschubert"},"name":"brushes.js","description":"HTML5 canvas brushes","version":"0.0.2","repository":{"type":"git","url":"git://github.com/jimschubert/brushes.js.git"},"engines":{"node":">= 0.4.4"},"dependencies":{},"devDependencies":{"canvas":"*","nodeunit":"*","uglify-js":"*"},"scripts":{},"_id":"brushes.js@0.0.2","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"73880f1e1b0ca26cd860a904b1df4e86086b77a3","tarball":"http://registry.npmjs.org/brushes.js/-/brushes.js-0.0.2.tgz"},"maintainers":[{"name":"jimschubert","email":"james.schubert@gmail.com"}]}},"maintainers":[{"name":"jimschubert","email":"james.schubert@gmail.com"}],"time":{"modified":"2011-10-04T22:58:57.040Z","created":"2011-09-21T01:08:19.869Z","0.0.1":"2011-09-21T01:08:24.507Z","0.0.2":"2011-10-04T22:58:57.040Z"},"author":{"name":"Jim Schubert","email":"james.schubert@gmail.com","url":"http://github.com/jimschubert"},"repository":{"type":"git","url":"git://github.com/jimschubert/brushes.js.git"},"_attachments":{"brushes.js-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HhnUn2wfINQp/lXShxKMpQ==","length":9905,"stub":true},"brushes.js-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HzlEObhfnGzAmb7xCMv3rg==","length":9193,"stub":true}}}},
{"id":"brz","key":"brz","value":{"rev":"7-63112bfe8185b9984faaa0bbe3b8e11b"},"doc":{"_id":"brz","_rev":"7-63112bfe8185b9984faaa0bbe3b8e11b","name":"brz","description":"simple wrapper around npm that automagically updates package.json dependencies","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"brz","version":"0.0.0","description":"simple wrapper around npm that automagically updates package.json dependencies","bin":{"brz":"index.js"},"repository":{"type":"git","url":"git://github.com/mintplant/brz.git"},"keywords":["npm","wrapper","dependency","dependencies","package.json","command","tool"],"author":{"name":"Michael Smith","url":"@mintplant"},"license":"MIT","dependencies":{"npm":"1.1.35"},"devDependencies":{"coffee-script":"1.3.3"},"readme":"# brz\n\n## what\n\nbrz (pronounced \"breeze\") is a simple wrapper over npm which can install,\nupdate, and remove packages, automagically updating your project's package.json\nfile at the same time.\n\n## how\n\n### install brz\n\n    [sudo] npm install -g brz\n\n### install jade, step, and express\n\n    brz install jade step express\n\n### install coffee-script as a dev dependency\n\n    brz dev install coffee-script\n\n### update all non-dev dependencies\n\n    brz update\n\n### update all dev dependencies\n\n    brz dev update\n\n### remove non-dev dependencies jade and express\n\n    brz remove jade express\n\n### remove coffee-script from the dev dependencies\n\n    brz dev rm coffee-script\n\n### rebuild brz from the coffeescript sources\n\n    cd ./brz\n    cake build\n\n## tests\n\nnone are currently written. if someone wants to write some, that'd be great.\n\n## license\n\n[MIT License](https://en.wikipedia.org/wiki/MIT_License)\n","_id":"brz@0.0.0","dist":{"shasum":"5763ff152c69a2570c1ba9b5bf98be576381a5cb","tarball":"http://registry.npmjs.org/brz/-/brz-0.0.0.tgz"},"maintainers":[{"name":"mintplant","email":"mdsmtp@gmail.com"}],"directories":{}}},"readme":"# brz\n\n## what\n\nbrz (pronounced \"breeze\") is a simple wrapper over npm which can install,\nupdate, and remove packages, automagically updating your project's package.json\nfile at the same time.\n\n## how\n\n### install brz\n\n    [sudo] npm install -g brz\n\n### install jade, step, and express\n\n    brz install jade step express\n\n### install coffee-script as a dev dependency\n\n    brz dev install coffee-script\n\n### update all non-dev dependencies\n\n    brz update\n\n### update all dev dependencies\n\n    brz dev update\n\n### remove non-dev dependencies jade and express\n\n    brz remove jade express\n\n### remove coffee-script from the dev dependencies\n\n    brz dev rm coffee-script\n\n### rebuild brz from the coffeescript sources\n\n    cd ./brz\n    cake build\n\n## tests\n\nnone are currently written. if someone wants to write some, that'd be great.\n\n## license\n\n[MIT License](https://en.wikipedia.org/wiki/MIT_License)\n","maintainers":[{"name":"mintplant","email":"mdsmtp@gmail.com"}],"time":{"modified":"2012-08-01T07:16:36.926Z","created":"2012-07-02T04:55:25.274Z","0.0.0":"2012-07-02T04:55:27.067Z","0.0.1":"2012-08-01T05:07:15.482Z"},"author":{"name":"Michael Smith","url":"@mintplant"},"repository":{"type":"git","url":"git://github.com/mintplant/brz.git"},"_attachments":{"brz-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qeeRPeiAKoSPfuS7bWSwcA==","length":3914,"stub":true}}}},
{"id":"bs-oauth","key":"bs-oauth","value":{"rev":"5-e17afd4e3f64259e84ef6891388eb19e"},"doc":{"_id":"bs-oauth","_rev":"5-e17afd4e3f64259e84ef6891388eb19e","name":"bs-oauth","description":"Narrowed version of node-oauth that fits my needs for interacting with Twitter","dist-tags":{"latest":"0.9.8"},"versions":{"0.9.7":{"name":"bs-oauth","description":"Narrowed version of node-oauth that fits my needs for interacting with Twitter","version":"0.9.7","directories":{"lib":"./lib"},"main":"index.js","author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"contributors":[{"name":"Ciaran Jessup","email":"ciaranj@gmail.com"}],"repository":{"type":"git","url":"git://github.com/bsgbryan/bs-oauth.git"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"bs-oauth@0.9.7","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"942aaf534bf54d9ac29a5f3370865b03cd11356b","tarball":"http://registry.npmjs.org/bs-oauth/-/bs-oauth-0.9.7.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]},"0.9.8":{"name":"bs-oauth","description":"Narrowed version of node-oauth that fits my needs for interacting with Twitter","version":"0.9.8","directories":{"lib":"./lib"},"main":"index.js","author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"contributors":[{"name":"Ciaran Jessup","email":"ciaranj@gmail.com"}],"repository":{"type":"git","url":"git://github.com/bsgbryan/bs-oauth.git"},"_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"bs-oauth@0.9.8","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ddc577eeb8a208b77ee9837b0617aef8f21f0bea","tarball":"http://registry.npmjs.org/bs-oauth/-/bs-oauth-0.9.8.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]}},"readme":"node-oauth\n===========\nA simple oauth API for node.js .  This API allows users to authenticate against OAUTH providers, and thus act as OAuth consumers. It also has support for OAuth Echo, which is used for communicating with 3rd party media providers such as TwitPic and yFrog.\n\nTested against Twitter (http://twitter.com), term.ie (http://term.ie/oauth/example/), TwitPic, and Yahoo!\n\nAlso provides rudimentary OAuth2 support, tested against facebook, github, foursquare, google and Janrain.   For more complete usage examples please take a look at connect-auth (http://github.com/ciaranj/connect-auth)\n\n\nChange History\n============== \n\n* 0.9.7\n    - OAuth2:   Pass back any extra response data for calls to getOAuthAccessToken (Thanks to Tang Bo Hao)\n    - OAuth2:   Don't force a https request if given a http url (Thanks to Damien Mathieu)\n    - OAuth2:   Supports specifying a grant-type of 'refresh-token' (Thanks to Luke Baker)\n* 0.9.6\n    - OAuth2:   Support for 302 redirects (Thanks Patrick Negri). \n    - OAuth1/2: Some code tidying. ( Thanks to Raoul Millais )  \n* 0.9.5\n    - OAuth1:   Allow usage of HTTP verbs other than GET for retrieving the access and request tokens (Thanks to Raoul Millais)  \n* 0.9.4\n    - OAuth1/2: Support for OAuth providers that drop connections (don't send response lengths? [Google]) \n    - OAuth2:   Change getOAuthAccessToken to POST rather than GET ( Possible Breaking change!!! ... re-tested against Google, Github, Facebook, FourSquare and Janrain and seems ok .. is closer to the spec (v20) )  \n* 0.9.3\n    - OAuth1:   Adds support for following 301 redirects (Thanks bdickason) \n* 0.9.2 \n    - OAuth1:   Correct content length calculated for non-ascii post bodies (Thanks selead)  \n    - OAuth1:   Allowed for configuration of the 'access token' name used when requesting protected resources (OAuth2)  \n* 0.9.1\n    - OAuth1:   Added support for automatically following 302 redirects (Thanks neyric) \n    - OAuth1:   Added support for OAuth Echo (Thanks Ryan LeFevre). \n    - OAuth1:   Improved handling of 2xx responses (Thanks Neil Mansilla).  \n* 0.9.0\n    - OAuth1/2: Compatibility fixes to bring node-oauth up to speed with node.js 0.4x [thanks to Rasmus Andersson for starting the work ]  \n* 0.8.4\n    - OAuth1:   Fixed issue #14 (Parameter ordering ignored encodings).\n    - OAuth1:   Added support for repeated parameter names.\n    - OAuth1/2: Implements issue #15 (Use native SHA1 if available, 10x speed improvement!).\n    - OAuth2:   Fixed issue #16 (Should use POST when requesting access tokens.).\n    - OAuth2:   Fixed Issue #17 (OAuth2 spec compliance).  \n    - OAuth1:   Implemented enhancement #13 (Adds support for PUT & DELETE http verbs). \n    - OAuth1:   Fixes issue #18 (Complex/Composite url arguments [thanks novemberborn])  \n* 0.8.3\n    - OAuth1:   Fixed an issue where the auth header code depended on the Array's toString method (Yohei Sasaki) Updated the getOAuthRequestToken method so we can access google's OAuth secured methods. Also re-implemented and fleshed out the test suite.  \n* 0.8.2\n    - OAuth1:   The request returning methods will now write the POST body if provided (Chris Anderson), the code responsible for manipulating the headers is a bit safe now when working with other code (Paul McKellar)\n    - Package:  Tweaked the package.json to use index.js instead of main.js  \n* 0.8.1\n    - OAuth1:   Added mechanism to get hold of a signed Node Request object, ready for attaching response listeners etc. (Perfect for streaming APIs)  \n* 0.8.0\n    - OAuth1:   Standardised method capitalisation, the old getOauthAccessToken is now getOAuthAccessToken (Breaking change to existing code)  \n* 0.7.7\n    - OAuth1:   Looks like non oauth_ parameters where appearing within the Authorization headers, which I believe to be incorrect.  \n* 0.7.6\n    - OAuth1:   Added in oauth_verifier property to getAccessToken required for 1.0A  \n* 0.7.5\n    - Package:  Added in a main.js to simplify the require'ing of OAuth  \n* 0.7.4\n    - OAuth1:   Minor change to add an error listener to the OAuth client (thanks troyk)  \n* 0.7.3\n    - OAuth2:   Now sends a Content-Length Http header to keep nginx happy :)  \n* 0.7.2\n    - OAuth1:   Fixes some broken unit tests!  \n* 0.7.0\n    - OAuth1/2: Introduces support for HTTPS end points and callback URLS for OAuth 1.0A and Oauth 2 (Please be aware that this was a breaking change to the constructor arguments order)  \n\nContributors\n============\n\n* Ciaran Jessup - ciaranj@gmail.com\n* Mark Wubben - http://equalmedia.com/\n* Ryan LeFevre - http://meltingice.net\n* Raoul Millais\n* Patrick Negri - http://github.com/pnegri\n* Tang Bo Hao - http://github.com/btspoony\n* Damien Mathieu - http://42.dmathieu.com\n* Luke Baker - http://github.com/lukebaker\n","maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}],"time":{"modified":"2012-06-11T05:15:02.052Z","created":"2012-06-11T04:50:34.247Z","0.9.7":"2012-06-11T04:50:34.928Z","0.9.8":"2012-06-11T05:15:02.052Z"},"author":{"name":"Bryan Maynard","email":"bsgbryan@gmail.com"},"repository":{"type":"git","url":"git://github.com/bsgbryan/bs-oauth.git"},"_attachments":{"bs-oauth-0.9.8.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-k9ozE/WnOyjjXCWiZwkBng==","length":22427,"stub":true},"bs-oauth-0.9.7.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-LJa1R7gK/RkIDWTSH/mbIw==","length":22464,"stub":true}}}},
{"id":"bsdiff","key":"bsdiff","value":{"rev":"3-1f860269385ded14d7c23900abb6d04f"},"doc":{"_id":"bsdiff","_rev":"3-1f860269385ded14d7c23900abb6d04f","name":"bsdiff","description":"Bindings to bsdiff","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bsdiff","description":"Bindings to bsdiff","homepage":"https://github.com/mikepb/node-bsdiff","version":"0.0.1","main":"lib","engines":{"node":">= 0.6.x < 0.7.0"},"scripts":{"prepublish":"make coffee","preinstall":"make distclean build clean","postinstall":"if [ ! -f ./lib/index.js ]; then make coffee; fi","test":"make test"},"repository":{"type":"git","url":"git://github.com/mikepb/node-bsdiff.git"},"bugs":{"url":"https://github.com/mikepb/node-bsdiff/issues"},"dependencies":{},"devDependencies":{"coffee-script":"~1.2.0","mocha":"~0.11.0"},"contributors":[{"name":"Michael Phan-Ba","email":"michael@mikepb.com"}],"_npmUser":{"name":"mikepb","email":"michael@mikepb.com"},"_id":"bsdiff@0.0.1","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"7d6724f957e6fde7a7292b1dcb5aa7af47283cf6","tarball":"http://registry.npmjs.org/bsdiff/-/bsdiff-0.0.1.tgz"},"maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}]}},"readme":"[![Build Status](https://secure.travis-ci.org/mikepb/node-bsdiff.png)](http://travis-ci.org/mikepb/node-bsdiff)\n\n\n# node-bsdiff\n\n`node-bsdiff` implements a port of the `bsdiff` binary diff tool. Internally,\nthe implementation uses 32-bit integers instead of 64-bit integers in the\noriginal. As such, `node-bsdiff` is meant for use on smaller datasets, such\nas reducing the size of maintaining document revision history.\n\n\n## Usage\n\n```js\nvar assert = require('assert')\n  , bsdiff = require('bsdiff')\n  , crypto = require('crypto');\n\nvar cur = crypto.randomBytes(1024)\n  , ref = crypto.randomBytes(1024);\n\nbsdiff.diff(cur, ref, function(err, ctrl, diff, xtra) {\n  if (err) throw err;\n  bsdiff.patch(cur.length, ref, ctrl, diff, xtra, function(err, out) {\n    if (err) throw err;\n    for (var i = 0; i < cur.length; i++) {\n      if (cur[i] !== out[i]) throw 'Patch did not work';\n    }\n    console.log('Patch worked!');\n  });\n});\n```\n\n\n## Installing\n\nTo compile native code and CoffeeScript do:\n\n    npm install\n\n\n## Testing\n\nTo run tests do:\n\n    npm test\n\nYou can also view the current build status on\n[Travis-CI](http://travis-ci.org/mikepb/node-bsdiff).\n\n\n## Licenses\n\n### node-bsdiff\n\n    Copyright 2012 Michael Phan-Ba\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n\n### bsdiff\n\n    Copyright 2003-2005 Colin Percival\n    All rights reserved\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted providing that the following conditions\n    are met:\n    1. Redistributions of source code must retain the above copyright\n       notice, this list of conditions and the following disclaimer.\n    2. Redistributions in binary form must reproduce the above copyright\n       notice, this list of conditions and the following disclaimer in the\n       documentation and/or other materials provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n    IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n    POSSIBILITY OF SUCH DAMAGE.\n\n\n### Boost\n\n    Copyright 2005 Caleb Epstein\n    Copyright 2006 John Maddock\n    Copyright 2010 Rene Rivera\n    Distributed under the Boost Software License, Version 1.0. (See\n    accompany-ing file LICENSE_1_0.txt or copy at\n    http://www.boost.org/LICENSE_1_0.txt)\n\n    Copyright (c) 1997\n    Silicon Graphics Computer Systems, Inc.\n\n    Permission to use, copy, modify, distribute and sell this software\n    and its documentation for any purpose is hereby granted without fee,\n    provided that the above copyright notice appear in all copies and\n    that both that copyright notice and this permission notice appear\n    in supporting documentation.  Silicon Graphics makes no\n    representations about the suitability of this software for any\n    purpose.  It is provided \"as is\" without express or implied warranty.\n\n    Copyright notice reproduced from <boost/detail/limits.hpp>, from\n    which this code was originally taken.\n\n    Modified by Caleb Epstein to use <endian.h> with GNU libc and to\n    defined the BOOST_ENDIAN macro.\n\n\n### GNU C Library\n\n    Copyright (C) 1997 Free Software Foundation, Inc.\n    This file is part of the GNU C Library.\n\n    The GNU C Library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    The GNU C Library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with the GNU C Library; if not, see\n    <http://www.gnu.org/licenses/>.\n","maintainers":[{"name":"mikepb","email":"michael@mikepb.com"}],"time":{"modified":"2012-02-23T20:50:00.800Z","created":"2012-02-23T20:49:58.688Z","0.0.1":"2012-02-23T20:50:00.800Z"},"repository":{"type":"git","url":"git://github.com/mikepb/node-bsdiff.git"},"_attachments":{"bsdiff-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Qh9aycpaSmMcWAog9hgq0g==","length":13620,"stub":true}}}},
{"id":"bsdiff4","key":"bsdiff4","value":{"rev":"3-dc6e437af8d128fdce91c2eb01107913"},"doc":{"_id":"bsdiff4","_rev":"3-dc6e437af8d128fdce91c2eb01107913","name":"bsdiff4","description":"BSDiff/BSPatch port for node.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"bsdiff4","description":"BSDiff/BSPatch port for node.js","version":"0.0.2","homepage":"https://github.com/bacchusrx/bsdiff4","contributors":[{"name":"Erik Rothwell","email":"bacchusrx@eightstar.ca"}],"repository":{"type":"git","url":"git://github.com/bacchusrx/bsdiff4.git"},"engines":{"node":"0.6.x"},"main":"./lib/bsdiff4","devDependencies":{"tap":"0.2.x"},"scripts":{"test":"tap test/*-test.js","preinstall":"node-waf clean || (exit 0); node-waf configure build"},"license":{"type":"BSD","url":"https://github.com/bacchusrx/bsdiff4/raw/master/LICENSE"},"keywords":["bsdiff","bspatch","diff","patch"],"_npmUser":{"name":"bacchusrx","email":"bacchusrx@eightstar.ca"},"_id":"bsdiff4@0.0.2","dependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"fb1ea09697e8cccc4978b46c549eea91c56f3ddf","tarball":"http://registry.npmjs.org/bsdiff4/-/bsdiff4-0.0.2.tgz"},"maintainers":[{"name":"bacchusrx","email":"bacchusrx@eightstar.ca"}]}},"readme":"# bsdiff4 port for node.js\n\nThis port was derived from a number of sources including: the Python library\nbsdiff4 (https://github.com/ilanschnell/bsdiff4), which was itself derived\nfrom cx_bsdiff (http://cx-bsdiff.sf.net); the original BSD version BSDiff\n(http://www.daemonology.net/bsdiff); and the existing node.js port,\nnode-bsdiff (https://github.com/mikepb/node-bsdiff).\n\nThis port implements the bsdiff and bspatch algorithms, but it does not parse\nor generate BSDIFF 4 patch files or provide compression. The functions exported\noperate on the raw control, diff and extra blocks. Operation is asynchronous.\n\n## Usage\n\n```javascript\nvar fs = require('fs');\nvar bsdiff4 = require('bsdiff4');\n\nvar origData = fs.readFileSync('oldfile');\nvar newData  = fs.readFileSync('newfile');\n\nbsdiff4.diff(origData, newData, function(err, control, diff, extra) {\n  bsdiff4.patch(origData, newData.length, control, diff, extra, function(err, out) {\n    ...\n  });\n});\n```\n\n## Functions\n\n* `bsdiff4.diff(origData, newData, callback)` - generate a BSDiff patch\n    * `origData` - a `Buffer` containing the original (source) data\n    * `newData` - a `Buffer` containing the new (target) data\n    * `callback` - a function to call once a patch has been generated\n        * `err` - null on success,` an `Error` object on error\n        * `control` - an `Array` containing the control block\n        * `diffBlock` - a `Buffer` containing the diff block\n        * `extraBlock` - a `Buffer` containing the extra block\n\n* `bsdiff4.patch(origData, newDataLength, control, diffBlock, extraBlock, callback)` - apply a BSDiff patch\n    * `origData` - a `Buffer` containing the original (source) data\n    * `newDataLength` - the size of the new (target) data in bytes\n    * `control` - an `Array` of integers representing the control block\n    * `diffBlock` - a `Buffer` containing the diff block\n    * `extraBlock` - a `Buffer` containing the extra block\n    * `callback` - a function to call once a patch has been applied\n        * `err` - null on success, an `Error` object on error\n        * `out` - a `Buffer` containing the new (target) data\n\n## Other versions\n\n* [node-bsdiff](https://github.com/mikepb/node-bsdiff)\n* [BSDiff](http://www.daemonology.net/bsdiff)\n* [bsdiff4](https://github.com/ilanschnell/bsdiff4)\n* [cx_bsdiff](http://cx-bsdiff.sf.net)\n","maintainers":[{"name":"bacchusrx","email":"bacchusrx@eightstar.ca"}],"time":{"modified":"2012-04-24T20:49:22.859Z","created":"2012-04-24T20:49:15.469Z","0.0.2":"2012-04-24T20:49:22.859Z"},"repository":{"type":"git","url":"git://github.com/bacchusrx/bsdiff4.git"},"_attachments":{"bsdiff4-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fOo5JuIFleJgZpn1mYfsBA==","length":3876713,"stub":true}}}},
{"id":"bson","key":"bson","value":{"rev":"113-39ab6ae3533c6e8e8e4c1c09e4616c8c"},"doc":{"_id":"bson","_rev":"113-39ab6ae3533c6e8e8e4c1c09e4616c8c","name":"bson","description":"A bson parser for node.js and the browser","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"bson","version":"0.0.1","description":"BSON library for node","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[{"name":"Yuriy Bogdanov","email":"chinsay@gmail.com"}],"main":"bson.node","engines":{"node":">=0.4.0"},"scripts":{"install":"node-waf configure clean build"},"dependencies":{},"devDependencies":{},"_id":"bson@0.0.1","_engineSupported":true,"_npmVersion":"1.0.1rc7","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"6acbeb2b8538032ddc4f15e79b49dd51a44a3d07","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.1.tgz"},"directories":{}},"0.0.2":{"name":"bson","version":"0.0.2","repository":{"type":"git","url":"git://github.com/0ctave/node-bson.git"},"description":"BSON library for node","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[{"name":"Yuriy Bogdanov","email":"chinsay@gmail.com"}],"scripts":{"install":"make all"},"main":"./bson.node","engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_id":"bson@0.0.2","_engineSupported":true,"_npmVersion":"1.0.1rc7","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"e49c84d6521ca63b45cfdaf4c892517be932b6c2","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.2.tgz"},"directories":{}},"0.0.3":{"name":"bson","version":"0.0.3","repository":{"type":"git","url":"git://github.com/0ctave/node-bson.git"},"description":"BSON library for node","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[{"name":"Yuri Bogdanov","email":"chinsay@gmail.com"}],"scripts":{"install":"make all"},"main":"./bson.node","engines":{"node":">=0.4.0"},"dependencies":{},"devDependencies":{},"_id":"bson@0.0.3","_engineSupported":true,"_npmVersion":"1.0.1rc7","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"b32bee9b60099274fec2359d93057c3c0f69741e","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.3.tgz","bin":{"0.4-sunos-5.11":{"shasum":"122e6a4522771ed3a23af4f069c3c4e2551028c2","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.3-0.4-sunos-5.11.tgz"}}},"directories":{}},"0.0.4":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.0.4","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.0.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"601968e2a916ab58a82d5f5763a4f2ea84db448a","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.4.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.0.5":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.0.5","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.0.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e01bb8d673bebf118cbd6223f901ce82a7be2b34","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.5.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.0.6":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.0.6","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.0.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"25039e789a2b813dc993bd3e6c31a3de31d08120","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.6.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.0.7":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.0.7","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.0.7","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"aaac9fd032bad5d023a1839dc6fa93df77ac1557","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.7.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.0.8":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.0.8","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.0.8","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"969c9b0ca84fe2f87d41b66cf6fabac9f4b1e6db","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.8.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.0.9":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.0.9","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.0.9","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"49a841c05c07a71cbba46c981fc5e2c57272ea30","tarball":"http://registry.npmjs.org/bson/-/bson-0.0.9.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.1.0":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.1.0","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"email":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"_npmUser":{"name":"christkv","email":"christkv@gmail.com"},"_id":"bson@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d20ff63df674d002a77b506e391c3fc1903d02a0","tarball":"http://registry.npmjs.org/bson/-/bson-0.1.0.tgz"},"readme":"","maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]},"0.1.1":{"name":"bson","description":"A bson parser for node.js and the browser","keywords":["mongodb","bson","parser"],"version":"0.1.1","author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"contributors":[],"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"bugs":{"mail":"node-mongodb-native@googlegroups.com","url":"https://github.com/christkv/bson/issues"},"devDependencies":{"nodeunit":"0.7.3","gleak":"0.2.3"},"config":{"native":false},"main":"./lib/bson/index","directories":{"lib":"./lib/bson"},"engines":{"node":">=0.4.0"},"scripts":{"install":"node install.js","test":"make test"},"licenses":[{"type":"Apache License, Version 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0"}],"readme":"","_id":"bson@0.1.1","dist":{"shasum":"2bc8d871a545cd23bc35a4e42a47b107296d7bf9","tarball":"http://registry.npmjs.org/bson/-/bson-0.1.1.tgz"},"maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}]}},"maintainers":[{"name":"octave","email":"chinsay@gmail.com"},{"name":"christkv","email":"christkv@gmail.com"}],"time":{"modified":"2012-08-02T13:44:09.968Z","created":"2011-04-13T11:47:38.022Z","0.0.1":"2011-04-13T11:47:38.760Z","0.0.2":"2011-04-13T12:06:25.170Z","0.0.3":"2011-04-13T12:12:14.821Z","0.0.4":"2012-04-19T16:41:52.546Z","0.0.5":"2012-05-11T20:02:53.246Z","0.0.6":"2012-05-15T09:55:36.799Z","0.0.7":"2012-05-21T07:15:12.948Z","0.0.8":"2012-05-25T15:02:57.985Z","0.0.9":"2012-05-25T15:15:03.743Z","0.1.0":"2012-05-25T15:56:48.550Z","0.1.1":"2012-07-27T08:07:32.989Z"},"author":{"name":"Christian Amor Kvalheim","email":"christkv@gmail.com"},"repository":{"type":"git","url":"git@github.com:christkv/bson.git"},"users":{"fgribreau":true},"_attachments":{"bson-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":112,"digest":"md5-huAvmXZHj1ueqzda40dQtA==","length":135942,"stub":true},"bson-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":106,"digest":"md5-GuKOF6o2fmUyO6pOWpcm3w==","length":138794,"stub":true},"bson-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-WHUuf3Q9NUlHkqRpBD7Org==","length":138438,"stub":true},"bson-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":98,"digest":"md5-x+D8qZ6mgVmph3D3yvZOQw==","length":138495,"stub":true},"bson-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":96,"digest":"md5-RgFD6LNQuKXu6yL2wCRXOg==","length":138690,"stub":true},"bson-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":90,"digest":"md5-ObH3TSqtGsuyWYdXRcamyg==","length":138440,"stub":true},"bson-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":88,"digest":"md5-WKDHEpCuHzbcAohG5xwsAw==","length":138986,"stub":true},"bson-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":74,"digest":"md5-bTZWbURsLpDSX+5OWxgtbA==","length":139295,"stub":true},"bson-0.0.3-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-wuh4NKj2LMu4QYbtYlKb0w==","length":764370,"stub":true},"bson-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-Wq+iaIZUj+7mZPaRSPhmBA==","length":31978,"stub":true},"bson-0.0.2-0.4-darwin-10.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-5+R7kJFxzlgU7a0Qqr7niw==","length":543073,"stub":true},"bson-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-lf9EAG6wjflb0cHhShf52A==","length":33565,"stub":true},"bson-0.0.1-0.4-darwin-10.3.0.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-bWBVWyGREmPfvhouQpvgng==","length":475151,"stub":true},"bson-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ME06dMdJ97JNF2wVLPzp/w==","length":476822,"stub":true}}}},
{"id":"bson-ton","key":"bson-ton","value":{"rev":"3-afc81054726f542898f9bb52a37285e4"},"doc":{"_id":"bson-ton","_rev":"3-afc81054726f542898f9bb52a37285e4","name":"bson-ton","description":"BSON/MongoDB types for ton","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bson-ton","description":"BSON/MongoDB types for ton","version":"0.0.1","homepage":"http://github.com/wearefractal/bson-ton","repository":{"type":"git","url":"git://github.com/wearefractal/bson-ton.git"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"main":"./index.js","dependencies":{"coffee-script":"*","bson":"*","ton":"*"},"devDependencies":{"mocha":"*","should":"*"},"scripts":{"test":"mocha --compilers coffee:coffee-script"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"MIT","url":"http://github.com/wearefractal/bson-ton/raw/master/LICENSE"}],"_npmUser":{"name":"fractal","email":"contact@wearefractal.com"},"_id":"bson-ton@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e390c83170dfae9a02cfc3a1772275b2a82604a5","tarball":"http://registry.npmjs.org/bson-ton/-/bson-ton-0.0.1.tgz"},"maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}]}},"readme":"![status](https://secure.travis-ci.org/wearefractal/bson-ton.png?branch=master)\n\n## Information\n\n<table>\n<tr> \n<td>Package</td><td>bson-ton</td>\n</tr>\n<tr>\n<td>Description</td>\n<td>BSON/MongoDB types for ton</td>\n</tr>\n<tr>\n<td>Node Version</td>\n<td>>= 0.4</td>\n</tr>\n</table>\n\n## Usage\n\n```coffee-script\nton = require 'ton'\nrequire 'bson-ton'\n\nstr = ton.stringify {bson doc}\ndoc = ton.parse str\n```\n\n## Comparison\n\n### Initial document\n\n```javascript\n{\n    _id: new ObjectID(\"4fa202c54cc3da640c000001\"),\n    string: \"test\",\n    regex: /test/,\n    date: new Date('1/2/1978'),\n    int: 42,\n    float: 33.3333,\n    bool: true,\n    code: new Code('console.log(i);', {\n        i: 1\n    }),\n    long: Long.fromNumber(20),\n    binary: new Binary(new Buffer(\"test\")),\n    minkey: new MinKey,\n    maxkey: new MaxKey,\n    double: new Double(100),\n    ref: new DBRef('space', new ObjectID(\"4fa202c54cc3da640c000002\"), 'stuff'),\n    arr: [1, 2, 3]\n}\n```\n\n### ton.stringify\n\nAll types and data preserved.\n\n```javascript\n{\n    \"_id\": new ObjectID(\"4fa202c54cc3da640c000001\"),\n    \"string\": \"test\",\n    \"regex\": /test/,\n    \"date\": new Date(\"1978-01-02T07:00:00.000Z\"),\n    \"int\": 42,\n    \"float\": 33.3333,\n    \"bool\": true,\n    \"code\": new Code(\"console.log(i);\", {\n        \"i\": 1\n    }),\n    \"long\": new Long(20, 0),\n    \"binary\": new Binary(new Buffer(\"test\"), \"0\"),\n    \"minkey\": new MinKey(),\n    \"maxkey\": new MaxKey(),\n    \"double\": new Double(100),\n    \"ref\": new DBRef(\"space\", new ObjectID(\"4fa202c54cc3da640c000002\"), \"stuff\"),\n    \"arr\": [1, 2, 3]\n}\n```\n\n### JSON.stringify\n\nAll types and some data lost - you would have to reconstruct this manually.\n\n```javascript\n{\n    \"_id\": \"4fa202c54cc3da640c000001\",\n    \"string\": \"test\",\n    \"regex\": {},\n    \"date\": \"1978-01-02T07:00:00.000Z\",\n    \"int\": 42,\n    \"float\": 33.3333,\n    \"bool\": true,\n    \"code\": {\n        \"scope\": {\n            \"i\": 1\n        },\n        \"code\": \"console.log(i);\"\n    },\n    \"long\": \"20\",\n    \"binary\": \"dGVzdA==\",\n    \"minkey\": {\n        \"_bsontype\": \"MinKey\"\n    },\n    \"maxkey\": {\n        \"_bsontype\": \"MaxKey\"\n    },\n    \"double\": 100,\n    \"ref\": {\n        \"$ref\": \"space\",\n        \"$id\": \"4fa202c54cc3da640c000002\",\n        \"$db\": \"stuff\"\n    },\n    \"arr\": [1, 2, 3]\n}\n```\n\n## LICENSE\n\n(MIT License)\n\nCopyright (c) 2012 Fractal <contact@wearefractal.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"fractal","email":"contact@wearefractal.com"}],"time":{"modified":"2012-05-20T21:27:06.097Z","created":"2012-05-20T21:27:04.672Z","0.0.1":"2012-05-20T21:27:06.097Z"},"author":{"name":"Fractal","email":"contact@wearefractal.com","url":"http://wearefractal.com/"},"repository":{"type":"git","url":"git://github.com/wearefractal/bson-ton.git"},"_attachments":{"bson-ton-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-k55z+KvCHsD824DUHIn2eg==","length":2816,"stub":true}}}},
{"id":"bstwitter","key":"bstwitter","value":{"rev":"3-5868c41019b5abaff471c9d643a25283"},"doc":{"_id":"bstwitter","_rev":"3-5868c41019b5abaff471c9d643a25283","name":"bstwitter","description":"Asynchronous Twitter REST/stream/search client API for node.js.","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"bstwitter","version":"0.3.0","description":"Asynchronous Twitter REST/stream/search client API for node.js.","keywords":["twitter","streaming","oauth"],"homepage":"https://github.com/AvianFlu/ntwitter","author":{"name":"jdub, changes by AvianFlu"},"licenses":{"type":"MIT","url":"http://github.com/bsgbryan/ntwitter/raw/master/LICENSE"},"repository":{"type":"git","url":"git://github.com/bsgbryan/ntwitter.git"},"dependencies":{"oauth":">=0.8.4","cookies":"0.1.x","keygrip":"0.1.x"},"engines":{"node":">=0.4.0 < 0.7.0"},"main":"./lib/twitter","_npmUser":{"name":"bsgbryan","email":"bsgbryan@gmail.com"},"_id":"bstwitter@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"6cca92abea8c30150e3f20e0c79247887815846f","tarball":"http://registry.npmjs.org/bstwitter/-/bstwitter-0.3.0.tgz"},"maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}]}},"readme":"Asynchronous Twitter client API for node.js\n===========================================\n\n[ntwitter](http://github.com/AvianFlu/ntwitter) is an upgraded version of jdub's [node-twitter](http://github.com/jdub/node-twitter), which in turn was inspired by, and uses some code from, technoweenie's [twitter-node](http://github.com/technoweenie/twitter-node).\n\n## Installation\n\nYou can install ntwitter and its dependencies with npm: `npm install ntwitter`.\n\n\n## Getting started\n\nThis library is, for the most part, the same API as `node-twitter`. Much of the documentation below is straight from `node-twitter` - credit goes to [jdub](http://github.com/jdub) for putting all this together in the first place. \n\nThe most significant API change involves error handling in callbacks.  Callbacks should now look something like this:\n\n         function (err, result) {\n           if (err) {return callback(err)}\n           // Do something with 'result' here\n         }\n\nWhere `callback` is the parent function's callback.  (Or any other function you want to call on error.)\n\n### Setup API \n\nThe keys listed below can be obtained from [dev.twitter.com](http://dev.twitter.com) after setting up a new App.\n\n        var twitter = require('ntwitter');\n\n        var twit = new twitter({\n          consumer_key: 'Twitter',\n          consumer_secret: 'API',\n          access_token_key: 'keys',\n          access_token_secret: 'go here'\n        });\n\n\n### REST API \n\n\nInteraction with other parts of Twitter is accomplished through their RESTful API.\nThe best documentation for this exists at [dev.twitter.com](http://dev.twitter.com).  Convenience methods exist\nfor many of the available methods, but some may be more up-to-date than others.\nIf your Twitter interaction is very important, double-check the parameters in the code with \nTwitter's current documentation.\n\nNote that all functions may be chained:\n\n        twit\n          .verifyCredentials(function (err, data) {\n            console.log(data);\n          })\n          .updateStatus('Test tweet from ntwitter/' + twitter.VERSION,\n            function (err, data) {\n              console.log(data);\n            }\n          );\n\n### Search API \n\n\t\ttwit.search('nodejs OR #node', {}, function(err, data) {\n\t\t  console.log(data);\n\t\t});\n\n### Streaming API \n\nThe stream() callback receives a Stream-like EventEmitter:\n\nHere is an example of how to call the 'statuses/sample' method:\n\n        twit.stream('statuses/sample', function(stream) {\n          stream.on('data', function (data) {\n            console.log(data);\n          });\n        });\n        \nHere is an example of how to call the 'statuses/filter' method with a bounding box over San Fransisco and New York City ( see streaming api for more details on [locations](https://dev.twitter.com/docs/streaming-api/methods#locations) ):\n\n        twit.stream('statuses/filter', {'locations':'-122.75,36.8,-121.75,37.8,-74,40,-73,41'}, function(stream) {\n          stream.on('data', function (data) {\n            console.log(data);\n          });\n        });\n\nntwitter also supports user and site streams:\n\n        twit.stream('user', {track:'nodejs'}, function(stream) {\n          stream.on('data', function (data) {\n            console.log(data);\n          });\n          stream.on('end', function (response) {\n            // Handle a disconnection\n          });\n          stream.on('destroy', function (response) {\n            // Handle a 'silent' disconnection from Twitter, no end/error event fired\n          });\n          // Disconnect stream after five seconds\n          setTimeout(stream.destroy, 5000);\n        });\n\n## Contributors\n\n- [AvianFlu](http://github.com/AvianFlu) - Upgrades and current support\n- [Jeff Waugh](http://github.com/jdub) (primary author)\n- [rick](http://github.com/technoweenie) (parser.js and, of course, twitter-node!)\n- [Cole Gillespie](http://github.com/coleGillespie) (additional documentation)\n- [Tim Cameron Ryan](http://github.com/timcameronryan)\n- [Jonathan Griggs](https://github.com/boatmeme)\n- [pwagener](https://github.com/pwagener)\n- [fatshotty](https://github.com/fatshotty)\n- [Ian Babrou](https://github.com/bobrik)\n\nIf you contribute and would like to see your name here, please add it with your changes!\n\n## TODO\n\n- Complete the convenience functions, preferably generated\n- Support [recommended reconnection behaviour](http://dev.twitter.com/pages/user_streams_suggestions) for the streaming APIs\n\n","maintainers":[{"name":"bsgbryan","email":"bsgbryan@gmail.com"}],"time":{"modified":"2012-06-21T06:23:11.852Z","created":"2012-06-21T06:23:11.170Z","0.3.0":"2012-06-21T06:23:11.852Z"},"author":{"name":"jdub, changes by AvianFlu"},"repository":{"type":"git","url":"git://github.com/bsgbryan/ntwitter.git"},"_attachments":{"bstwitter-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DgnIqC4B0VBkH+GJK2LyTg==","length":12316,"stub":true}}}},
{"id":"btc-ex-api","key":"btc-ex-api","value":{"rev":"3-cabbf284cb01af79ee183d8023106762"},"doc":{"_id":"btc-ex-api","_rev":"3-cabbf284cb01af79ee183d8023106762","name":"btc-ex-api","description":"API for interacting with Bitcoin exchanges","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"Sean Lavine","email":"sean@eternalrise.com"},"name":"btc-ex-api","description":"API for interacting with Bitcoin exchanges","version":"0.0.1","homepage":"https://github.com/er88/btc-ex-api","repository":{"type":"git","url":"git://github.com/er88/btc-ex-api.git"},"engines":{"node":">=0.4.0"},"dependencies":{"jsdom":"0.2.x"},"devDependencies":{},"main":"lib/index.js","_npmJsonOpts":{"file":"/home/sean/.npm/btc-ex-api/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"btc-ex-api@0.0.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"dc1675fc484e951aae30c2e2b9cf8953654284ae","tarball":"http://registry.npmjs.org/btc-ex-api/-/btc-ex-api-0.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"er88","email":"sean@eternalrise.com"}],"time":{"modified":"2011-07-16T22:28:20.412Z","created":"2011-07-16T22:28:20.133Z","0.0.1":"2011-07-16T22:28:20.412Z"},"author":{"name":"Sean Lavine","email":"sean@eternalrise.com"},"repository":{"type":"git","url":"git://github.com/er88/btc-ex-api.git"},"_attachments":{"btc-ex-api-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-hI3hDkUmBHU2vudpMKIFvw==","length":38666,"stub":true}}}},
{"id":"btoa","key":"btoa","value":{"rev":"5-492a3e523e65a34829d72d8d400c3535"},"doc":{"_id":"btoa","_rev":"5-492a3e523e65a34829d72d8d400c3535","name":"btoa","description":"btoa for Node.JS (it's a one-liner)","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"btoa","homepage":"https://github.com/coolaj86/node-browser-compat","description":"btoa for Node.JS (it's a one-liner)","repository":{"type":"git","url":"git://github.com/coolaj86/node-browser-compat.git"},"keywords":["btoa","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"engines":{"node":">= 0.4.0"},"dependencies":{},"main":"index","version":"1.0.0","_npmJsonOpts":{"file":"/Users/coolaj86/.npm/btoa/1.0.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"btoa@1.0.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"554b62c2c2d837f71b9959f1b42a37fec8d02fcb","tarball":"http://registry.npmjs.org/btoa/-/btoa-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"1.0.1":{"name":"btoa","homepage":"https://github.com/coolaj86/node-browser-compat","description":"btoa for Node.JS (it's a one-liner)","repository":{"type":"git","url":"git://github.com/coolaj86/node-browser-compat.git"},"keywords":["btoa","browser"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"engines":{"node":">= 0.4.0"},"bin":{"btoa":"bin/btoa.js"},"main":"index","version":"1.0.1","_id":"btoa@1.0.1","dist":{"shasum":"e224ea2d66a29086b06a1c846c79e588b3accaa2","tarball":"http://registry.npmjs.org/btoa/-/btoa-1.0.1.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2012-06-26T19:28:20.687Z","created":"2011-09-09T20:52:25.639Z","1.0.0":"2011-09-09T20:52:26.042Z","1.0.1":"2012-06-26T19:28:20.687Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"http://coolaj86.info"},"repository":{"type":"git","url":"git://github.com/coolaj86/node-browser-compat.git"},"_attachments":{"btoa-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yvNvh/7zrXxYOKjk8NV0wg==","length":779,"stub":true},"btoa-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fQeGSG+O4wwvOFtRPFJHVg==","length":688,"stub":true}}}},
{"id":"btoa-atob","key":"btoa-atob","value":{"rev":"5-5beffb5ce1486a4f2e5227b0616abc1b"},"doc":{"_id":"btoa-atob","_rev":"5-5beffb5ce1486a4f2e5227b0616abc1b","name":"btoa-atob","description":"CLI tools to convert files and stdin into and from base64.","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"btoa-atob","version":"0.1.0","description":"CLI tools to convert files into and from base64.","homepage":"https://github.com/jussi-kalliokoski/btoa-atob","keywords":["base64","btoa","atob","convert","cli","tools"],"author":{"name":"Jussi Kalliokoski","url":"http://niiden.com/jussi/"},"repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/btoa-atob.git"},"bin":{"btoa":"btoa","atob":"atob"},"dependencies":{},"devDependencies":{},"_id":"btoa-atob@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"3283c8596616cb41ecc89ef91b888b763f49af87","tarball":"http://registry.npmjs.org/btoa-atob/-/btoa-atob-0.1.0.tgz"},"scripts":{}},"0.1.2":{"name":"btoa-atob","version":"0.1.2","description":"CLI tools to convert files and stdin into and from base64.","homepage":"https://github.com/jussi-kalliokoski/btoa-atob","keywords":["base64","btoa","atob","convert","cli","tools"],"author":{"name":"Jussi Kalliokoski","url":"http://niiden.com/jussi/"},"repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/btoa-atob.git"},"bin":{"btoa":"btoa","atob":"atob"},"_npmUser":{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"},"_id":"btoa-atob@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"3edd5902bc839d99975ab2e1ea9955a1bd0887e2","tarball":"http://registry.npmjs.org/btoa-atob/-/btoa-atob-0.1.2.tgz"},"readme":"","maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}]}},"maintainers":[{"name":"jussi-kalliokoski","email":"jussi.kalliokoski@gmail.com"}],"time":{"modified":"2012-02-13T11:33:48.826Z","created":"2011-05-31T16:06:29.278Z","0.1.0":"2011-05-31T16:06:30.340Z","0.1.2":"2012-02-13T11:33:48.826Z"},"author":{"name":"Jussi Kalliokoski","url":"http://niiden.com/jussi/"},"repository":{"type":"git","url":"git://github.com/jussi-kalliokoski/btoa-atob.git"},"_attachments":{"btoa-atob-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NcVtBX9pZGgyblaJy03oOQ==","length":1931,"stub":true},"btoa-atob-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VUYwcMn4aQaYVtp5d3FTmg==","length":1263,"stub":true}}}},
{"id":"bubble","key":"bubble","value":{"rev":"13-fb200693107be649123b49d5929697cc"},"doc":{"_id":"bubble","_rev":"13-fb200693107be649123b49d5929697cc","name":"bubble","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"bubble","version":"0.0.1","author":{"name":"Pedro Teixeira"},"tags":["flow control","error handling","domains"],"main":"./hickup.js","devDependencies":{"tap":"*"},"scripts":{"test":"node node_modules/tap/bin/tap.js test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"bubble@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"fb2d7b1c128bf4e32d4c9695c16ba402f8c6686b","tarball":"http://registry.npmjs.org/bubble/-/bubble-0.0.1.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.0.2":{"name":"bubble","version":"0.0.2","author":{"name":"Pedro Teixeira"},"tags":["flow control","error handling","domains"],"main":"./bubble.js","devDependencies":{"tap":"*"},"scripts":{"test":"node node_modules/tap/bin/tap.js test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"bubble@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2accf8f7759c6d938609c6dc80d8f10deafaaf8f","tarball":"http://registry.npmjs.org/bubble/-/bubble-0.0.2.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.0.3":{"name":"bubble","version":"0.0.3","author":{"name":"Pedro Teixeira"},"tags":["flow control","error handling","domains"],"main":"./bubble.js","devDependencies":{"tap":"*"},"scripts":{"test":"node node_modules/tap/bin/tap.js test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"bubble@0.0.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"5b2bc503197775a464acbf6a0df04ce10952f8d0","tarball":"http://registry.npmjs.org/bubble/-/bubble-0.0.3.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.0.4":{"name":"bubble","description":"Domains for the poor man","version":"0.0.4","author":{"name":"Pedro Teixeira"},"repository":{"type":"git","url":"git://github.com/pgte/bubble.git"},"tags":["flow control","error handling","domains"],"main":"./bubble.js","engines":{"node":">= 0.4.0"},"devDependencies":{"tap":"*"},"scripts":{"test":"node node_modules/tap/bin/tap.js test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"bubble@0.0.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"a30aa7effaa8a6d1d12f31ac48bea406216ca523","tarball":"http://registry.npmjs.org/bubble/-/bubble-0.0.4.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.0.5":{"name":"bubble","description":"Domains for the poor man. Flow-control for cascading callbacks. Error handling. Aborts groups of callbacks. With timeouts.","version":"0.0.5","author":{"name":"Pedro Teixeira"},"repository":{"type":"git","url":"git://github.com/pgte/bubble.git"},"tags":["flow control","error handling","domains","timeout","callbacks"],"main":"./bubble.js","engines":{"node":">= 0.4.0"},"devDependencies":{"tap":"*"},"scripts":{"test":"node node_modules/tap/bin/tap.js test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"bubble@0.0.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"9fa2d4635975b3604c9d3e44307d0df8fd205279","tarball":"http://registry.npmjs.org/bubble/-/bubble-0.0.5.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]},"0.1.0":{"name":"bubble","description":"Domains for the poor man. Flow-control for cascading callbacks. Error handling. Aborts groups of callbacks. With timeouts.","version":"0.1.0","author":{"name":"Pedro Teixeira"},"repository":{"type":"git","url":"git://github.com/pgte/bubble.git"},"tags":["flow control","error handling","domains","timeout","callbacks"],"main":"./bubble.js","engines":{"node":">= 0.4.0"},"devDependencies":{"tap":"*"},"scripts":{"test":"node node_modules/tap/bin/tap.js test.js"},"_npmUser":{"name":"pgte","email":"pedro.teixeira@gmail.com"},"_id":"bubble@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6f61365e3e2a653e40dcc0fabcb44ff14a74fd03","tarball":"http://registry.npmjs.org/bubble/-/bubble-0.1.0.tgz"},"maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}]}},"readme":"# Bubble\n\nAborts groups of callbacks.\n\nDomains for the poor man.\n\nWith timeouts (if you will).\n\nInspired by substack/node-toss.\n\n## Example:\n\n\n```javascript\nvar bubble = require('bubble')\nvar timeout = 2000\n\nrequire('http').createServer(function(req, res) {\n\n  var b = bubble(timeout, function(err, file_c_data) {\n    if (err) {\n      res.writeHead(500)\n      res.write(err.message)\n    } else {\n      res.end(file_c_data)\n    }\n  });\n\n  fs.readFile('./file_a', h(function(file_a_data) {\n    fs.readFile('./file_b', h(function(file_b_data) {\n      fs.readFile('./file_c', h())\n    })\n  }))\n})\n```\n\n## You can also leave out the timeout:\n\n```javascript\nvar b = bubble(timeout, function(err, file_c_data) {\n  // ...\n});\n```","maintainers":[{"name":"pgte","email":"pedro.teixeira@gmail.com"}],"time":{"modified":"2012-03-21T09:29:21.342Z","created":"2012-03-20T16:55:32.784Z","0.0.1":"2012-03-20T16:55:34.597Z","0.0.2":"2012-03-20T17:06:46.357Z","0.0.3":"2012-03-20T17:12:19.871Z","0.0.4":"2012-03-20T17:23:57.477Z","0.0.5":"2012-03-21T09:04:21.336Z","0.1.0":"2012-03-21T09:29:21.342Z"},"author":{"name":"Pedro Teixeira"},"description":"Domains for the poor man. Flow-control for cascading callbacks. Error handling. Aborts groups of callbacks. With timeouts.","repository":{"type":"git","url":"git://github.com/pgte/bubble.git"},"_attachments":{"bubble-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-Dce5FMIzepWpk2aMn6kBdg==","length":2208,"stub":true},"bubble-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-oidqLZldPM6518X3nFtDFw==","length":2092,"stub":true},"bubble-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-sdTlBCUCUfjQU2DJPP6ryg==","length":1835,"stub":true},"bubble-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9Cxyib7tvDe9KUt+L6TdvQ==","length":1665,"stub":true},"bubble-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Wi2noIUvoUtQ0sgHy8NA5A==","length":1665,"stub":true},"bubble-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pWStLGtGZucTK7Rn+SiNFw==","length":1660,"stub":true}}}},
{"id":"bubpubsub","key":"bubpubsub","value":{"rev":"5-e36fac7a04aca46578a876a4701194d3"},"doc":{"_id":"bubpubsub","_rev":"5-e36fac7a04aca46578a876a4701194d3","name":"bubpubsub","description":"a pubsub system with bubbling, replies and persistence","dist-tags":{"latest":"0.7.1"},"versions":{"0.7.0":{"name":"bubpubsub","description":"a pubsub system with bubbling, replies and persistence","url":"http://github.com/itsatony/bubpubsub","keywords":["pubsub","events","publish","subscribe","bubbling","persistence","VisualWeb"],"author":{"name":"Toni Wagner","email":"i@itsatony.com"},"contributors":[],"licenses":["MIT"],"dependencies":{},"main":"./lib/bubpubsub","version":"0.7.0","directories":{"lib":"./lib"},"engines":{"node":"> 0.1.90"},"_npmUser":{"name":"itsatony","email":"i@itsatony.com"},"_id":"bubpubsub@0.7.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"6ac8703413a54c58a1a64f993a731be6b6e6e889","tarball":"http://registry.npmjs.org/bubpubsub/-/bubpubsub-0.7.0.tgz"},"scripts":{},"maintainers":[{"name":"itsatony","email":"i@itsatony.com"}]},"0.7.1":{"name":"bubpubsub","description":"a pubsub system with bubbling, replies and persistence","url":"http://github.com/itsatony/bubpubsub","keywords":["pubsub","events","publish","subscribe","bubbling","persistence","VisualWeb"],"author":{"name":"Toni Wagner","email":"i@itsatony.com"},"contributors":[],"licenses":["free"],"dependencies":{},"main":"./lib/bubpubsub","version":"0.7.1","directories":{"lib":"./lib"},"engines":{"node":"> 0.1.90"},"_npmUser":{"name":"itsatony","email":"i@itsatony.com"},"_id":"bubpubsub@0.7.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"91a60d20e9aaba9a2cbfdb1588f0365f0c026769","tarball":"http://registry.npmjs.org/bubpubsub/-/bubpubsub-0.7.1.tgz"},"maintainers":[{"name":"itsatony","email":"i@itsatony.com"}]}},"readme":"\n# bubPubSub\n\nbubPubSub (VisualWeb's PubSub) is a publish/subscribe system for communication between objects/modules of your code. It's rather similar to the event system of node, however with two additions:\n\n-- (optional) BUBBLING along a topic-tree \n \n-- (optional) PERSISTANCE of publications for later retrieval/reference\n\nIt contains utilitiary functions that were copied (and adapted) from the jQuery (http://www.jquery.com) library. \n\nIt is developed, used and sponsored by K.lab (http://www.klab-berlin.com), LinkCloud (http://www.linkcloud.org) and ViSERiON (http://www.viserion.com) .\n\n## compatibility\n\n    bubPubSub works on both the client (e.g. with jQuery - or without it) and the server (nodeJS).\n\n## Installation with nodeJS\n\n\t  $ npm install bubpubsub\n\n## Test (server-side)\n\n\tcd to node_modules/bubpubsub\n\tmake\n\n## Usage\n\n\tthere is a detailed description of all functions in the source-code ... \n\n## examples (more in the source JS)\n\n\t\t// SUBSCRIPTION TO a deep branch WITHOUT PICKING UP BUBBLES \n \t\tvar myEuropeSubscription = aBubPubSub.subscribe(\n \t\t\t'/politics/europe', \n \t\t\tfunction(data, currentBranch, publisher, replyCall, subscriptionIdObject) { \n \t\t\t\tconsole.log('original publication branch: ' + data.originalTopic);  \n\t\t\t\tconsole.log('i subscribed to : ' + currentBranch);  \n \t\t\t\treplyCall('I am [' + myEuropeSubscription.id + '] and I am only interested in european politics');\n \t\t\t}, \n \t\t\t{ getBubbles: false } \n \t\t\t'myEuropeSubscriber'\n \t\t);\n\t   \n\t   // SUBSCRIPTION TO ROOT WITH BUBBLING\n\t    var myRootSubscription = aBubPubSub.subscribe(\n \t\t\t'/', \n \t\t\tfunction(data, currentBranch, publisher, replyCall, subscriptionIdObject) { \n \t\t\t\tconsole.log('original publication branch: ' + data.originalTopic);  \n\t\t\t\tconsole.log('i subscribed to : ' + currentBranch);  \n \t\t\t\treplyCall('I am [' + myRootSubscription.id + '] and I pick up any publication');\n \t\t\t}, \n \t\t\t{ getBubbles: true } \n \t\t\t'myRootSubscriber'\n \t\t);\n\n   \t\t// PUBLISH WITH PERSISTANCE AND BUBBLING\n\t\taBubPubSub.publish(\n \t\t\t'/politics/europe/germany/pipa', \n \t\t\t{ \n \t\t\t\tcontent: 'this is wonderfool',  \n\t\t\t},\n\t\t\t{ \n\t\t\t\tbubble:true, \n\t\t\t\tpersist:true \n\t\t\t}, \n\t\t\t'myTestPublisher1',\n\t\t\tfunction(replyCallParametersOfYourChoice) {\n\t\t\t\tconsole.dir(replyCallParametersOfYourChoice);\n\t\t\t\treturn true;\n\t\t\t}\n \t\t);\n\t\t\n\t\t// PUBLISH WITH PERSISTANCE AND BUBBLING\n\t\taBubPubSub.publish(\n \t\t\t'/politics/europe/germany/pipa/legislation', \n \t\t\t{ \n \t\t\t\tcontent: 'this can not be picked up by the nonBubbler or the persistence check (below)',  \n\t\t\t},\n\t\t\t{ \n\t\t\t\tbubble:true, \n\t\t\t\tpersist:false \n\t\t\t}, \n\t\t\t'myTestPublisher2',\n\t\t\tfunction(replyCallParametersOfYourChoice) {\n\t\t\t\tconsole.dir(replyCallParametersOfYourChoice);\n\t\t\t\treturn true;\n\t\t\t}\n \t\t);\n\t\t\n\t\t\n\t\t// PERSISTANCE\n\t\tvar persistentPublicationObjectArrayOnPolitics = aBubPubSub.wasPublishedOnTopic('/politics', true);\n\t\n\t\t// UNSUBSCRIBE\n\t\taBubPubSub.unsubscribe(myRootSubscription);\n\t","maintainers":[{"name":"itsatony","email":"i@itsatony.com"}],"time":{"modified":"2012-06-15T21:28:45.260Z","created":"2012-03-21T11:07:40.364Z","0.7.0":"2012-03-21T11:07:41.971Z","0.7.1":"2012-06-15T21:28:45.260Z"},"author":{"name":"Toni Wagner","email":"i@itsatony.com"},"_attachments":{"bubpubsub-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-dk2BsX08kDtIlbQ6Gp932A==","length":8756,"stub":true},"bubpubsub-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eAZKgo14vhRGnHU7emmqqw==","length":8790,"stub":true}}}},
{"id":"bucket","key":"bucket","value":{"rev":"3-5c2da8f67e29de1c29adbf51ad7d7299"},"doc":{"_id":"bucket","_rev":"3-5c2da8f67e29de1c29adbf51ad7d7299","name":"bucket","description":"a s3 library that uses deferred callbacks","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bucket","description":"a s3 library that uses deferred callbacks","author":{"name":"Alex Bosworth","email":"alex.bosworth@gmail.com"},"version":"0.0.1","repository":{"type":"git","url":"git://github.com/alexbosworth/bucket.git"},"dependencies":{"xml2js":"0.1.10"},"main":"index.js","engine":"node >= 0.4.1","_npmJsonOpts":{"file":"/Users/alex/.npm/bucket/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bucket@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"d09ac2c33052dd23d68cc7029f11d076a0c4f362","tarball":"http://registry.npmjs.org/bucket/-/bucket-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"alexbosworth","email":"alex.bosworth+npm@gmail.com"}]}},"maintainers":[{"name":"alexbosworth","email":"alex.bosworth+npm@gmail.com"}],"time":{"modified":"2011-09-10T08:05:14.449Z","created":"2011-09-10T08:05:09.652Z","0.0.1":"2011-09-10T08:05:14.449Z"},"author":{"name":"Alex Bosworth","email":"alex.bosworth@gmail.com"},"repository":{"type":"git","url":"git://github.com/alexbosworth/bucket.git"},"_attachments":{"bucket-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YELP4KgbzW/KQWCXuGzxXQ==","length":4784,"stub":true}}}},
{"id":"bucketful","key":"bucketful","value":{"rev":"15-c11448c6177a4798b2878f775566e1b4"},"doc":{"_id":"bucketful","_rev":"15-c11448c6177a4798b2878f775566e1b4","name":"bucketful","description":"Deploys opra-apps to S3 buckets","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.0.1","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.9.6","powerfs":"0.0.4","knox":"0.0.9","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7559fd4574c4b9373f7bb289122e8faa0341e655","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.0.1.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.1.0":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.1.0","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.9.6","powerfs":"0.1.0","knox":"0.0.9","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"d9462df8e79d4cf26e77e1ab993c3a80c7ac412b","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.1.0.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.1.1":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.1.1","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.10.4","powerfs":"0.1.0","knox":"0.0.9","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"15b726c07851c0ecc55432d0a700f44a06ec2211","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.1.1.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.1.2":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.1.2","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.10.5","powerfs":"0.1.0","knox":"0.0.9","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.1.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"73b1fd82b6d13b85de19ce889f58293395ff6928","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.1.2.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.1.3":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.1.3","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.10.6","powerfs":"0.1.0","knox":"0.0.9","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.1.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a4142bbb079a76d57a0dce7fce2b736e9d7567d9","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.1.3.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.1.4":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.1.4","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.10.7","powerfs":"0.1.0","knox":"0.0.9","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.1.4","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"994097ae7f0dcd918f8b8f87e5d2eb51e7111c2b","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.1.4.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]},"0.2.0":{"name":"bucketful","description":"Deploys opra-apps to S3 buckets","main":"./src/bucketful.js","bin":{"bucketful":"./bin/bucketful"},"version":"0.2.0","author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"preferGlobal":true,"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"engines":{"node":">=0.6.0"},"dependencies":{"opra":"0.10.7","powerfs":"0.1.0","knox":"0.0.9","optimist":"0.3.4","async":"0.1.22","wrench":"1.3.9","underscore":"1.3.3","nconf":"0.6.0","underscore.string":"2.2.0rc"},"scripts":{"start":"node app.js public","deploy":"node deploy.js"},"_npmUser":{"name":"jakobm","email":"jakob.mattsson@gmail.com"},"_id":"bucketful@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"8445662e79a248ee9b06b5f378df864305161564","tarball":"http://registry.npmjs.org/bucketful/-/bucketful-0.2.0.tgz"},"maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}]}},"readme":"bucketful\n=========","maintainers":[{"name":"jakobm","email":"jakob.mattsson@gmail.com"}],"time":{"modified":"2012-07-21T10:25:08.354Z","created":"2012-06-19T07:14:17.891Z","0.0.1":"2012-06-19T07:14:21.838Z","0.1.0":"2012-07-17T22:29:31.641Z","0.1.1":"2012-07-18T12:00:53.231Z","0.1.2":"2012-07-18T13:24:17.145Z","0.1.3":"2012-07-18T13:41:12.960Z","0.1.4":"2012-07-18T13:57:20.315Z","0.2.0":"2012-07-21T10:25:08.354Z"},"author":{"name":"Jakob Mattsson","email":"jakob.mattsson@gmail.com","url":"jakobmattsson.se"},"repository":{"type":"git","url":"git://github.com/jakobmattsson/bucketful.git"},"_attachments":{"bucketful-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-4L90Q8kwijxqSyqTDQAWwQ==","length":2146,"stub":true},"bucketful-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-HN/nhsN10y9oYyo4fMs2Rw==","length":1766,"stub":true},"bucketful-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dXehKalBmv0sHUnpmuZmMg==","length":1763,"stub":true},"bucketful-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6t4Bmljb22cXEaAix+tf1g==","length":1765,"stub":true},"bucketful-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-cQ45677oPUnOMdT5p1txBg==","length":1765,"stub":true},"bucketful-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-TqYsrvx3EJRl64xuB5mPPQ==","length":1759,"stub":true},"bucketful-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0QmyJaYl4Yy8G9HoNHO9Ww==","length":1535,"stub":true}}}},
{"id":"buddha","key":"buddha","value":{"rev":"7-9dfb7747e1f5f44d3ebd7aa4a10a57e8"},"doc":{"_id":"buddha","_rev":"7-9dfb7747e1f5f44d3ebd7aa4a10a57e8","name":"buddha","description":"Simple interface with zendesk.","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"buddha","description":"Interface with zendesk.","version":"0.0.1","licenses":[{"type":"MIT","url":"https://github.com/roylines/node-buddha/raw/master/LICENSE"}],"author":{"name":"Roy Lines","url":"https://roylines.co.uk"},"repository":{"type":"git","url":"http://github.com/roylines/node-buddha.git"},"keywords":["zendesk"],"dependencies":{"async":"0.1.x"},"devDependencies":{"should":"0.5.x","sinon":"1.3.x","vows":"0.6.x"},"main":"./lib/buddha","scripts":{"test":"vows test/*_test.js --spec"},"engines":{"node":">= 0.6.0"},"_id":"buddha@0.0.1","_engineSupported":false,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.9","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"0a53ef4801cd8634c8fb6aeec93393faa0ea8908","tarball":"http://registry.npmjs.org/buddha/-/buddha-0.0.1.tgz"},"maintainers":[{"name":"roylines","email":"roy@roylines.co.uk"}]},"0.0.2":{"name":"buddha","description":"Simple interface with zendesk (alpha).","version":"0.0.2","licenses":[{"type":"MIT","url":"https://github.com/roylines/node-buddha/raw/master/LICENSE"}],"author":{"name":"Roy Lines","url":"https://roylines.co.uk"},"repository":{"type":"git","url":"http://github.com/roylines/node-buddha.git"},"keywords":["zendesk"],"dependencies":{"async":"0.1.x"},"devDependencies":{"should":"0.5.x","sinon":"1.3.x","vows":"0.6.x"},"main":"./lib/buddha","scripts":{"test":"vows test/*_test.js --spec"},"engines":{"node":">= 0.4.0"},"_id":"buddha@0.0.2","_engineSupported":true,"_npmVersion":"0.2.19","_nodeVersion":"v0.4.9","directories":{"lib":"./lib","bin":"./bin"},"bin":{"buddha":"bin/buddha"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"92893c3b0d5b0f8be7526d345ad3d9b47491cb8c","tarball":"http://registry.npmjs.org/buddha/-/buddha-0.0.2.tgz"},"maintainers":[{"name":"roylines","email":"roy@roylines.co.uk"}]},"1.0.0":{"name":"buddha","description":"Simple interface with zendesk.","version":"1.0.0","licenses":[{"type":"MIT","url":"https://github.com/roylines/node-buddha/raw/master/LICENSE"}],"author":{"name":"Roy Lines","url":"https://roylines.co.uk"},"repository":{"type":"git","url":"git://github.com/roylines/node-buddha.git"},"keywords":["zendesk"],"dependencies":{"async":"0.1.x"},"devDependencies":{"commander":"0.5.x","should":"0.5.x","sinon":"1.3.x","vows":"0.6.x"},"main":"./lib/buddha","scripts":{"test":"vows test/*_test.js --spec"},"engines":{"node":">= 0.4.0"},"_npmUser":{"name":"roylines","email":"roy@roylines.co.uk"},"_id":"buddha@1.0.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"3ae1e97b90460e7febb745b9c893c85f05f8ddb7","tarball":"http://registry.npmjs.org/buddha/-/buddha-1.0.0.tgz"},"readme":"# buddha\n_buddha_ is a [node](http://nodejs.org) interface into zendesk.\n\n[![Build Status](https://secure.travis-ci.org/roylines/node-buddha.png)](http://travis-ci.org/roylines/node-buddha)","maintainers":[{"name":"roylines","email":"roy@roylines.co.uk"}]}},"maintainers":[{"name":"roylines","email":"roy@roylines.co.uk"}],"time":{"modified":"2012-03-22T23:45:58.121Z","created":"2012-02-20T19:22:40.522Z","0.0.1":"2012-02-20T19:22:42.708Z","0.0.2":"2012-03-01T19:32:40.962Z","1.0.0":"2012-03-22T23:45:58.121Z"},"author":{"name":"Roy Lines","url":"https://roylines.co.uk"},"repository":{"type":"git","url":"git://github.com/roylines/node-buddha.git"},"_attachments":{"buddha-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-BpeqcnK6DfsW40tSRnKL/w==","length":48753,"stub":true},"buddha-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-P00OJv52/O33qutCqA91Cw==","length":2529,"stub":true},"buddha-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rVY8hjisoGjhs4voDkKkgA==","length":1955,"stub":true}}}},
{"id":"buddy","key":"buddy","value":{"rev":"52-a0823fc40b3f4dd2969b9398911d2234"},"doc":{"_id":"buddy","_rev":"52-a0823fc40b3f4dd2969b9398911d2234","name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","dist-tags":{"latest":"0.4.0"},"versions":{"0.3.0":{"name":"buddy","description":"A tooling framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.0","author":{"name":"Alexander Pope","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","underscore":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engine":"node >= 0.6.0","repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alexander.pope@gmail.com"},"_id":"buddy@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"89849be36fb5d28872c9c16cd9661b70a394c62b","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.0.tgz"},"maintainers":[{"name":"popeindustries","email":"alexander.pope@gmail.com"}]},"0.3.1":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.1","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a1a4704eb55c02966c4bde46d39393819f004d6b","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.1.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.2":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.2","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"c7dfc35cc445ceb60ed9942ec6aa1d2785257514","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.2.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.3":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.3","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"7636dffa8b9cf25ca6b3a1543915f4b0c7220e59","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.3.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.4":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.4","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a2cbb50f1f4abf0db02b824f80150b7dc4b667d9","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.4.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.5":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.5","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"f6306bc6c4ece77fb25944a8855ae4e369b44382","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.5.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.6":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.6","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"15921329a0f16bb1ce0460b94b5ad5ca72824065","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.6.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.7":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.7","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"a0a75736d41443da6f7ed980117331b684ddf962","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.7.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.8":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.8","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.1.x","growl":"1.1.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.1.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.8","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d91d02f157a273375ab96b13e9b7ebc254b788c3","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.8.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.3.9":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.3.9","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.x.x","growl":"1.x.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.x.x","commander":"0.x.x"},"devDependencies":{"vows":">=0.5.13"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"vows --spec"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.3.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"85f6adb1fe206aa31e82077b36a7bb7264f14e91","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.3.9.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]},"0.4.0":{"name":"buddy","description":"A build framework for the compilation of higher order js/css languages (coffeescript/stylus/less).","version":"0.4.0","author":{"name":"popeindustries","email":"alex@pope-industries.com"},"keywords":["javascript","coffeescript","styus","less"],"dependencies":{"coffee-script":"1.x.x","growl":"1.x.x","stylus":"0.x.x","less":"1.x.x","uglify-js":"1.x.x","commander":"0.x.x"},"devDependencies":{"rimraf":"*","should":"*","mocha":"1.x.x"},"directories":{"lib":"./lib"},"main":"./index","bin":{"buddy":"./bin/buddy"},"scripts":{"test":"mocha --compilers coffee:coffee-script --reporter spec --require should"},"engines":{"node":">=0.6.0"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"_npmUser":{"name":"popeindustries","email":"alex@pope-industries.com"},"_id":"buddy@0.4.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.22","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7bf8b70eb55ddc6a3f3444a2ed9dc70156e4f6e5","tarball":"http://registry.npmjs.org/buddy/-/buddy-0.4.0.tgz"},"maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}]}},"readme":"# Buddy\n\nBuddy is primarily a tooling framework for the compilation of higher order js/css languages (coffeescript/stylus/less). \nAdditionally, by enabling Node.js-style module wrapping and syntax, it promotes better js code organization, \nand provides automatic concatenation of code for more efficient delivery to the browser.\n\n## Installation\n\nUse the *-g* global flag to make the **buddy** command available system-wide:\n\n```bash\n$ npm -g install buddy\n```\n\n## Usage\n\n```bash\n$ cd path/to/my/project\n# compile all source files\n$ buddy compile\n# watch for source changes and compile\n$ buddy watch\n# compile and minify for production\n$ buddy deploy\n# view usage, examples, and options\n$ buddy --help\n```\n\n### Configuration\n\nThe only requirement for adding Buddy support to a project is the presence of a **buddy.json** file:\n\n```json\n{\n  \"js\": {\n    \"sources\": [\"a/coffeescript/folder\", \"a/js/folder\"],\n    \"targets\": [\n      {\n        \"in\": \"a/coffeescript/or/js/file\",\n        \"out\": \"a/js/file/or/folder\"\n      },\n      {\n        \"in\": \"a/coffeescript/folder\",\n        \"out\": \"a/folder\"\n      }\n    ]\n  },\n  \"css\": {\n    \"sources\": [\"a/stylus/folder\", \"a/less/folder\"],\n    \"targets\": [\n      {\n        \"in\": \"a/stylus/or/less/file\",\n        \"out\": \"a/css/file/or/folder\"\n      },\n      {\n        \"in\": \"a/stylus/or/less/folder\",\n        \"out\": \"a/folder\"\n      }\n    ]\n  }\n}\n```\n\nFor each build type (js/css), you begin by specifying source paths from which your build targets are referenced.\nEach build target should specify an input and corresponding output file or folder. \nTargets are run in sequence enabling you to chain builds together.\nAs an example, you could compile a library, then reference some library files in your project:\n\n```json\n\"js\": {\n  \"sources\": [\"lib/src/coffee\", \"lib/js\", \"src\"],\n  \"targets\": [\n    {\n      \"in\": \"lib/src/coffee\",  <--a folder of coffee-script files (including nested folders)\n      \"out\": \"lib/js\"          <--a folder of compiled js files\n    },\n    {\n      \"in\": \"src/main.js\",  <--the application entry point referencing library dependencies\n      \"out\": \"js/main.js\"   <--a concatenation of referenced dependencies\n    }\n  ]\n}\n```\n\n### Modules\n\nBuddy wraps each coffee-script/js file in a module declaration based on the file location. \nDependencies (and concatenation order) are determined by the use of ***require*** statements:\n\n```javascript\nvar lib = require('./my/lib'); // in current package\nvar SomeClass = require('../some_class'); // in parent package\n\nlib.doSomething();\nvar something = new SomeClass();\n```\n\nSpecifying a module's public behaviour is achieved by decorating an *exports* object:\n\n```javascript\nvar myModuleVar = 'my module';\n\nexports.myModuleMethod = function() { \n  return myModuleVar;\n};\n```\n\nor overwriting the *exports* object completely:\n\n```javascript\nfunction MyModule() {\n  this.myVar = 'my instance var';\n};\n\nMyModule.prototype.myMethod = function() {\n  return this.myVar;\n};\n\nmodule.exports = MyModule;\n```\n\nEach module is provided with a ***module***, ***exports***, and ***require*** reference.\n\nWhen *require*-ing a module, keep in mind that the module id is resolved based on the following rules:\n\n - packages begin at the root folder specified in buddy.json > js > sources:\n```\n'Users/alex/project/src/package/main.js' > 'package/main'\n```\n - uppercase filenames are converted to lowercase module ids: \n```\n'my/package/Class.js' > 'my/package/class'\n```\n - camelcase filenames are converted to lowercase/underscore module ids: \n```\n'my/package/ClassCamelCase.js' > 'my/package/class_camel_case'\n```\n\nSee [node.js modules](http://nodejs.org/docs/v0.6.0/api/modules.html) for more info on modules.\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 Pope-Industries &lt;alex@pope-industries.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"popeindustries","email":"alex@pope-industries.com"}],"time":{"modified":"2012-05-24T09:08:01.974Z","created":"2011-11-21T11:37:33.612Z","0.3.0":"2011-11-21T11:37:35.346Z","0.3.1":"2011-11-22T13:39:28.943Z","0.3.2":"2011-11-23T11:36:39.948Z","0.3.3":"2011-11-25T10:56:41.918Z","0.3.4":"2011-11-30T12:21:28.028Z","0.3.5":"2011-12-01T14:55:19.494Z","0.3.6":"2011-12-02T11:51:54.389Z","0.3.7":"2011-12-02T13:40:26.531Z","0.3.8":"2011-12-05T12:16:40.952Z","0.3.9":"2012-03-06T08:34:52.887Z","0.4.0":"2012-05-24T09:08:01.974Z"},"author":{"name":"popeindustries","email":"alex@pope-industries.com"},"repository":{"type":"git","url":"git://github.com/popeindustries/buddy.git"},"users":{"moonpyk":true},"_attachments":{"buddy-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-gl1L7HG+LywTTHXRBIMU4A==","length":15653,"stub":true},"buddy-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-sTPJJwlkoXlq86qP/16LjA==","length":16620,"stub":true},"buddy-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-X+VOSH72v0XsLfLD4sdrrA==","length":20480,"stub":true},"buddy-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-goAFNxxtCRet2JirrYymeQ==","length":20480,"stub":true},"buddy-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-nxWjpuVJrOxCOkRnT5sHfQ==","length":20480,"stub":true},"buddy-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-arz+9BBijKF+ThD072VAfg==","length":20480,"stub":true},"buddy-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-1cIwOkRz98OknHTpSiXwKg==","length":20480,"stub":true},"buddy-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-WongHHug5r+F0lbSReh53w==","length":20480,"stub":true},"buddy-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-hUL0FaorpoZBS1uH/H+iXg==","length":20480,"stub":true},"buddy-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-znW05meN4pW0nWGK8EvXgw==","length":20480,"stub":true},"buddy-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DTsXR4czhgEqC5NYcbIpiw==","length":20480,"stub":true}}}},
{"id":"buddycloud-server","key":"buddycloud-server","value":{"rev":"18-a8bc4720e11e5d037e6d1ed3b9512584"},"doc":{"_id":"buddycloud-server","_rev":"18-a8bc4720e11e5d037e6d1ed3b9512584","name":"buddycloud-server","description":"buddycloud channels service for XMPP","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.10":{"name":"buddycloud-server","version":"0.1.10","bin":{"buddycloud-server":"./bin/buddycloud-server"},"description":"buddycloud channels service for XMPP","author":{"name":"Stephan Maka"},"dependencies":{"node-xmpp":">=0.3.1","node-stringprep":">=0.1.1","node-expat":">=1.2.0","ltx":">=0.0.4","jsconfig":">=0.0.1","async":">=0.1.9","node-uuid":">=1.1.0","pg":">=0.2.6","underscore.logger":">=0.3.1","ain2":">=0.2.1"},"devDependencies":{"muffin":">=0.2.6","coffee-script":">=1.2.0"},"repositories":[{"type":"git","path":"git://github.com/buddycloud/buddycloud-server.git"}],"scripts":{"start":"./bin/buddycloud-server --nobuild"},"homepage":"http://buddycloud.org","bugs":{"name":"http://github.com/buddycloud/buddycloud-server/issues"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}],"contributors":[{"name":"Stephan Maka"}],"licenses":[{"type":"APL2"}],"engines":{"node":">= 0.4"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"buddycloud-server@0.1.10","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"ebcbe72b3a77fce77ed7863189f614f73aef9f6b","tarball":"http://registry.npmjs.org/buddycloud-server/-/buddycloud-server-0.1.10.tgz"},"directories":{}},"0.1.11":{"name":"buddycloud-server","version":"0.1.11","bin":{"buddycloud-server":"./bin/buddycloud-server"},"description":"buddycloud channels service for XMPP","dependencies":{"node-xmpp":">=0.3.1","node-stringprep":">=0.1.1","node-expat":">=1.2.0","ltx":">=0.0.4","jsconfig":">=0.2.0","async":">=0.1.9","node-uuid":">=1.1.0","pg":">=0.2.6","underscore.logger":">=0.3.1","ain2":">=1.0.0","glob":"<3"},"devDependencies":{"muffin":">=0.2.6","coffee-script":">=1.2.0"},"repositories":[{"type":"git","path":"git://github.com/buddycloud/buddycloud-server.git"}],"scripts":{"start":"./bin/buddycloud-server --nobuild"},"homepage":"http://buddycloud.org","bugs":{"name":"http://github.com/buddycloud/buddycloud-server/issues"},"maintainer":{"name":"Astro","email":"astro@spaceboyz.net","web":"http://spaceboyz.net/~astro/"},"contributors":[{"name":"Stephan Maka"}],"licenses":[{"type":"APL2"}],"engines":{"node":">= 0.4"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"buddycloud-server@0.1.11","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"d2be422edab2687dc5015bc31e6aaa506f5088a5","tarball":"http://registry.npmjs.org/buddycloud-server/-/buddycloud-server-0.1.11.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}],"directories":{}},"0.2.3":{"name":"buddycloud-server","version":"0.2.3","bin":{"buddycloud-server":"./bin/buddycloud-server"},"description":"buddycloud channels service for XMPP","dependencies":{"node-xmpp":">=0.3.1","node-stringprep":">=0.1.1","node-expat":">=1.2.0","ltx":">=0.0.4","jsconfig":">=0.2.0","async":">=0.1.9","node-uuid":">=1.1.0","pg":">=0.2.6","underscore.logger":">=0.3.1","ain2":">=1.0.0","glob":"<3","muffin":">=0.2.6","coffee-script":">=1.2.0"},"repositories":[{"type":"git","path":"git://github.com/buddycloud/buddycloud-server.git"}],"scripts":{"install":"cake build","start":"./bin/buddycloud-server --nobuild"},"homepage":"http://buddycloud.org","bugs":{"name":"http://github.com/buddycloud/buddycloud-server/issues"},"maintainer":{"name":"Astro","email":"astro@spaceboyz.net","web":"http://spaceboyz.net/~astro/"},"contributors":[{"name":"Stephan Maka"}],"licenses":[{"type":"APL2"}],"engines":{"node":">= 0.4"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"buddycloud-server@0.2.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"8769ee20fb6eef5abf01f59d141c6a2f4ad86776","tarball":"http://registry.npmjs.org/buddycloud-server/-/buddycloud-server-0.2.3.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}],"directories":{}},"0.3.0":{"name":"buddycloud-server","version":"0.3.0","bin":{"buddycloud-server":"./bin/buddycloud-server"},"description":"buddycloud channels service for XMPP","dependencies":{"node-xmpp":">=0.3.2","node-stringprep":">=0.1.4","node-expat":">=1.4.4","ltx":">=0.1.3","jsconfig":">=0.2.0","async":">=0.1.18","node-uuid":">=1.3.3","pg":">=0.6.14","underscore.logger":">=0.3.1","ain2":">=1.1.0","glob":"<3","muffin":">=0.2.7","coffee-script":">=1.2.0"},"repositories":[{"type":"git","path":"git://github.com/buddycloud/buddycloud-server.git"}],"scripts":{"install":"cake build","start":"./bin/buddycloud-server --nobuild"},"homepage":"http://buddycloud.org","bugs":{"name":"http://github.com/buddycloud/buddycloud-server/issues"},"maintainer":{"name":"Astro","email":"astro@spaceboyz.net","web":"http://spaceboyz.net/~astro/"},"contributors":[{"name":"Stephan Maka"}],"licenses":[{"type":"APL2"}],"engines":{"node":">= 0.4"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"buddycloud-server@0.3.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"565a9c9cbfe250766198161fe67c09498b41cb33","tarball":"http://registry.npmjs.org/buddycloud-server/-/buddycloud-server-0.3.0.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}],"directories":{}},"0.3.1":{"name":"buddycloud-server","version":"0.3.1","bin":{"buddycloud-server":"./bin/buddycloud-server"},"description":"buddycloud channels service for XMPP","dependencies":{"node-xmpp":">=0.3.2","node-stringprep":">=0.1.4","node-expat":">=1.4.4","ltx":">=0.1.3","jsconfig":">=0.2.0","async":">=0.1.18","node-uuid":">=1.3.3","pg":">=0.6.14","underscore.logger":">=0.3.1","ain2":">=1.1.0","glob":"<3","muffin":">=0.2.7","coffee-script":">=1.2.0"},"repositories":[{"type":"git","path":"git://github.com/buddycloud/buddycloud-server.git"}],"scripts":{"install":"cake build","start":"./bin/buddycloud-server --nobuild"},"homepage":"http://buddycloud.org","bugs":{"name":"http://github.com/buddycloud/buddycloud-server/issues"},"maintainer":{"name":"Astro","email":"astro@spaceboyz.net","web":"http://spaceboyz.net/~astro/"},"contributors":[{"name":"Stephan Maka"},{"name":"Jonas Smedegaard"},{"name":"Simon Tennant"},{"name":"dodo"},{"name":"James Tait"},{"name":"Thomas Jost"}],"licenses":[{"type":"APL2"}],"engines":{"node":">= 0.4"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"buddycloud-server@0.3.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"2779919f935fa580dcc1e2c46df76f3ce32e4d02","tarball":"http://registry.npmjs.org/buddycloud-server/-/buddycloud-server-0.3.1.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}]},"0.3.2":{"name":"buddycloud-server","version":"0.3.2","bin":{"buddycloud-server":"./bin/buddycloud-server"},"description":"buddycloud channels service for XMPP","dependencies":{"node-xmpp":">=0.3.2","node-stringprep":">=0.1.4","node-expat":">=1.4.4","ltx":">=0.1.3","jsconfig":">=0.2.0","async":">=0.1.18","node-uuid":">=1.3.3","pg":">=0.6.14","underscore.logger":">=0.3.1","ain2":">=1.1.0","glob":"<3","muffin":">=0.2.7","coffee-script":">=1.2.0"},"repositories":[{"type":"git","path":"git://github.com/buddycloud/buddycloud-server.git"}],"scripts":{"install":"cake build","start":"./bin/buddycloud-server --nobuild"},"homepage":"http://buddycloud.org","bugs":{"name":"http://github.com/buddycloud/buddycloud-server/issues"},"maintainer":{"name":"Astro","email":"astro@spaceboyz.net","web":"http://spaceboyz.net/~astro/"},"contributors":[{"name":"Stephan Maka"},{"name":"Jonas Smedegaard"},{"name":"Simon Tennant"},{"name":"dodo"},{"name":"James Tait"},{"name":"Thomas Jost"}],"licenses":[{"type":"APL2"}],"engines":{"node":">= 0.4"},"_npmUser":{"name":"astro","email":"astro@spaceboyz.net"},"_id":"buddycloud-server@0.3.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"17d1eab4154bfbff0a22746a040dbf8b5defc0c6","tarball":"http://registry.npmjs.org/buddycloud-server/-/buddycloud-server-0.3.2.tgz"},"maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}]}},"readme":"# buddycloud-server\n\nSocial network users who are concerned about privacy and censorship\nwant to run their own decentralized instances, yielding full control\nover own data. buddycloud-server is a building block for a bright future:\nit exposes your data to the network, featuring access control and\nreal-time update notification.\n\nThe primary network protocol is\n[buddycloud channels](http://buddycloud.org/).\n\nbuddycloud-server is distributed under the Apache License 2.0. See the\n`LICENSE` file.\n\n## Installation\n\nAt this early stage you should be prepared to upgrade this software in\nthe future.\n\nInstructions are located at https://buddycloud.org/wiki/Install\n\n\n## Hacking\n\nThe most important concept with Node is asynchronous event\nhandlers. We try to flatten the code flow by using the\n[Step](http://github.com/creationix/step) library. Pay attention to\nalways call a callback in success as well as error cases. Lost control\nflows may result in hanging requests and unfinished database\ntransactions.\n\n### Design\n\n### Frontends\n\n#### XEP-0060 Publish-Subscribe w/ buddycloud conventions\n\nTop priority\n\n#### OStatus\n\nFuture\n\n### Backends\n\n#### PostgreSQL\n\nSporting real transactions and a normalized database schema, this SQL\nbackend is expected to yield high performance.\n\n\n## TODO\n\n* `grep TODO *.js`\n* More configurability (channel presets)\n* Topic channels\n* More backends (MySQL? SQLite?)\n* Further frontends: Web, oStatus","maintainers":[{"name":"astro","email":"astro@spaceboyz.net"}],"time":{"modified":"2012-03-15T09:43:58.223Z","created":"2012-01-19T00:40:13.865Z","0.1.10":"2012-01-19T00:40:15.579Z","0.1.11":"2012-01-31T00:33:45.580Z","0.2.3":"2012-03-03T15:15:53.092Z","0.3.0":"2012-03-14T22:35:56.914Z","0.3.1":"2012-03-14T22:57:40.209Z","0.3.2":"2012-03-15T09:43:58.223Z"},"author":{"name":"Stephan Maka"},"users":{"astro":true},"_attachments":{"buddycloud-server-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-+ax0n2F+JObokPTuIRPD1g==","length":48658,"stub":true},"buddycloud-server-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-sYZe60JM1OXKMIwwydS25A==","length":58540,"stub":true},"buddycloud-server-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-zv9OG8wMMbXEbxjsk4hFpw==","length":58398,"stub":true},"buddycloud-server-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-351PDkEBPCqS2IDoDhw/yw==","length":54225,"stub":true},"buddycloud-server-0.1.11.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-peoP535/ix0yYP2BrYwDRg==","length":51928,"stub":true},"buddycloud-server-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-P5TLTN1430SzY0wFsNu31w==","length":44033,"stub":true}}}},
{"id":"buffalo","key":"buffalo","value":{"rev":"13-e2fdd3b4b96152bbf3b58ecda29f7067"},"doc":{"_id":"buffalo","_rev":"13-e2fdd3b4b96152bbf3b58ecda29f7067","name":"buffalo","description":"Buffalo is a lightweight BSON and Mongo Wire Protocol library for Node.js","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"buffalo","description":"Buffalo is a lightweight BSON library for Node.js","version":"0.1.0","homepage":"https://github.com/marcello3d/node-buffalo","repository":{"type":"git","url":"git://github.com/marcello3d/node-buffalo.git"},"author":{"name":"Marcello Bastéa-Forte","email":"marcello@cellosoft.com","url":"http://marcello.cellosoft.com/"},"main":"buffalo.js","keywords":["mongo","mongodb","bson","binary","binary json"],"dependencies":{"tosource":"0.1.1"},"devDependencies":{"vows":"~0.5"},"scripts":{"test":"node_modules/.bin/vows --spec"},"engines":{"node":">=0.4.0"},"_id":"buffalo@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"f30fc4e64c066415adc869573b84097432e7efe4","tarball":"http://registry.npmjs.org/buffalo/-/buffalo-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"buffalo","description":"Buffalo is a lightweight BSON library for Node.js","version":"0.1.1","homepage":"https://github.com/marcello3d/node-buffalo","repository":{"type":"git","url":"git://github.com/marcello3d/node-buffalo.git"},"author":{"name":"Marcello Bastéa-Forte","email":"marcello@cellosoft.com","url":"http://marcello.cellosoft.com/"},"main":"buffalo.js","keywords":["mongo","mongodb","bson","binary","binary json"],"dependencies":{"tosource":"0.1.1"},"devDependencies":{"vows":"~0.5"},"scripts":{"test":"node_modules/.bin/vows --spec"},"engines":{"node":">=0.4.0"},"_npmJsonOpts":{"file":"/Users/marcello/.npm/buffalo/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buffalo@0.1.1","_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"083fd27a4303b3c22899edfe9017bb3479ba807e","tarball":"http://registry.npmjs.org/buffalo/-/buffalo-0.1.1.tgz"},"maintainers":[{"name":"marcello","email":"marcello@cellosoft.com"}]},"0.1.2":{"name":"buffalo","description":"Buffalo is a lightweight BSON and Mongo Wire Protocol library for Node.js","version":"0.1.2","homepage":"https://github.com/marcello3d/node-buffalo","repository":{"type":"git","url":"git://github.com/marcello3d/node-buffalo.git"},"author":{"name":"Marcello Bastéa-Forte","email":"marcello@cellosoft.com","url":"http://marcello.cellosoft.com/"},"main":"buffalo.js","keywords":["mongo","mongodb","mongo wire protocol","bson","binary","binary json"],"dependencies":{"tosource":"0.1.1"},"devDependencies":{"nodeunit":"0.6.4"},"scripts":{"test":"node_modules/.bin/nodeunit test/bson-test.js test/mongo-test.js"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"marcello","email":"marcello@cellosoft.com"},"_id":"buffalo@0.1.2","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"0cb54096edf2980fa0c9a364f6eb57a236119658","tarball":"http://registry.npmjs.org/buffalo/-/buffalo-0.1.2.tgz"},"readme":"Buffalo\n==================\nBuffalo is a lightweight [BSON][1] and [Mongo Wire Protocol][2] library for [Node.js][3]. It was built as the underlying\nengine for [Mongolian DeadBeef][4].\n\nThe motivation is to make a fast and simple parser and serializer for BSON.\n\n[![Build Status](https://secure.travis-ci.org/marcello3d/node-buffalo.png)](http://travis-ci.org/marcello3d/node-buffalo)\n\nInstallation\n------------\n**DISCLAIMER: The API is experimental. I will be adding, removing, and changing the API in the\ninterest of a solid API. Use at your own risk**\n\nYou can either clone the source and install with `npm link`, or install the latest published version from npm with\n`npm install buffalo`.\n\nRunning Tests\n-------------\nRun the tests with `npm test`.\n\nAPI\n---\nBuffalo exposes two methods:\n\n    exports.parse = function(buffer) { ... }\n    exports.serialize = function(object) { ... }\n\nAnd several types:\n\n    exports.Long // goog.math.Long - http://closure-library.googlecode.com/svn/docs/class_goog_math_Long.html\n    exports.ObjectId = function(buffer) // buffer must be a 12-byte Buffer, accessible via the bytes property\n    exports.ObjectId = function(string) // string must be a 24-char hex string\n    exports.ObjectId = function() // generates an ObjectId\n    exports.Timestamp // under construction\n\nThe BSON types are mapped as follows:\n\n+ <code>0x01</code> - Floating point - mapped to <code>Number</code>\n+ <code>0x02</code> - UTF-8 string - mapped to <code>String</code>\n+ <code>0x03</code> - Embedded document - mapped to <code>Object</code>\n+ <code>0x04</code> - Array - mapped to <code>Array</code>\n+ <code>0x05</code> - Binary data - mapped to Node.js <code>Buffer</code> (with property <code>subtype</code>)\n+ <code>0x06</code> - Undefined - mapped to <code>undefined</code>\n+ <code>0x07</code> - ObjectId - mapped to <code>exports.ObjectId</code>\n+ <code>0x08</code> - Boolean - mapped to <code>true</code> or <code>false</code>\n+ <code>0x09</code> - UTC datetime - mapped to <code>Date</code>\n+ <code>0x0A</code> - Null value - mapped to <code>null</code>\n+ <code>0x0B</code> - Regular expression - mapped to <code>RegExp</code> (Note: only flags g, i, and m are supported)\n+ <code>0x0C</code> - DBPointer - currently unmapped\n+ <code>0x0D</code> - JavaScript code - mapped to <code>Function</code> or <code>Object</code> with property <code>code</code>\n+ <code>0x0E</code> - Symbol - mapped to <code>String</code>\n+ <code>0x0F</code> - JavaScript code w/ scope - mapped to <code>Function</code> or <code>Object</code> with properties <code>code</code> and <code>scope</code>\n+ <code>0x10</code> - 32-bit Integer - mapped to <code>Number</code>\n+ <code>0x11</code> - Timestamp - mapped to <code>exports.Timestamp</code>\n+ <code>0x12</code> - 64-bit integer - mapped to <code>exports.Long</code>\n+ <code>0xFF</code> - Min key - currently unmapped\n+ <code>0x7F</code> - Max key - currently unmapped\n\nExamples\n--------\n\n    var BSON = require('buffalo')\n\n    // Parse a Buffer\n    var object = BSON.parse(buffer)\n\n    // Serialize an object\n    var buffer = BSON.serialize(object)\n\nContributing\n------------\nTry it out and send me feedback! Unit tests and documentation are good, too.\n\nLicense\n-------\nBuffalo is open source software under the [zlib license][5].\n\n[1]: http://bsonspec.org/#/specification\n[2]: http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol\n[3]: http://nodejs.org/\n[4]: https://github.com/marcello3d/node-mongolian\n[5]: https://github.com/marcello3d/node-buffalo/blob/master/LICENSE\n","maintainers":[{"name":"marcello","email":"marcello@cellosoft.com"}]},"0.1.3":{"name":"buffalo","description":"Buffalo is a lightweight BSON and Mongo Wire Protocol library for Node.js","version":"0.1.3","homepage":"https://github.com/marcello3d/node-buffalo","repository":{"type":"git","url":"git://github.com/marcello3d/node-buffalo.git"},"author":{"name":"Marcello Bastéa-Forte","email":"marcello@cellosoft.com","url":"http://marcello.cellosoft.com/"},"main":"buffalo.js","keywords":["mongo","mongodb","mongo wire protocol","bson","binary","binary json"],"dependencies":{"tosource":"0.1.1"},"devDependencies":{"nodeunit":"0.6.4"},"scripts":{"test":"node_modules/.bin/nodeunit test/bson-test.js test/mongo-test.js"},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"marcello","email":"marcello@cellosoft.com"},"_id":"buffalo@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"aa7f661b7c7d91b989b81e4e01fc1345aa9005fe","tarball":"http://registry.npmjs.org/buffalo/-/buffalo-0.1.3.tgz"},"readme":"Buffalo\n==================\nBuffalo is a lightweight [BSON][1] and [Mongo Wire Protocol][2] library for [Node.js][3]. It was built as the underlying\nengine for [Mongolian DeadBeef][4].\n\nThe motivation is to make a fast and simple parser and serializer for BSON.\n\n[![Build Status](https://secure.travis-ci.org/marcello3d/node-buffalo.png)](http://travis-ci.org/marcello3d/node-buffalo)\n\nInstallation\n------------\n**DISCLAIMER: The API is experimental. I will be adding, removing, and changing the API in the\ninterest of a solid API. Use at your own risk**\n\nYou can either clone the source and install with `npm link`, or install the latest published version from npm with\n`npm install buffalo`.\n\nRunning Tests\n-------------\nRun the tests with `npm test`.\n\nAPI\n---\nBuffalo exposes two methods:\n\n    exports.parse = function(buffer) { ... }\n    exports.serialize = function(object) { ... }\n\nAnd several types:\n\n    exports.Long // goog.math.Long - http://closure-library.googlecode.com/svn/docs/class_goog_math_Long.html\n    exports.ObjectId = function(buffer) // buffer must be a 12-byte Buffer, accessible via the bytes property\n    exports.ObjectId = function(string) // string must be a 24-char hex string\n    exports.ObjectId = function() // generates an ObjectId\n    exports.Timestamp // under construction\n\nThe BSON types are mapped as follows:\n\n+ <code>0x01</code> - Floating point - mapped to <code>Number</code>\n+ <code>0x02</code> - UTF-8 string - mapped to <code>String</code>\n+ <code>0x03</code> - Embedded document - mapped to <code>Object</code>\n+ <code>0x04</code> - Array - mapped to <code>Array</code>\n+ <code>0x05</code> - Binary data - mapped to Node.js <code>Buffer</code> (with property <code>subtype</code>)\n+ <code>0x06</code> - Undefined - mapped to <code>undefined</code>\n+ <code>0x07</code> - ObjectId - mapped to <code>exports.ObjectId</code>\n+ <code>0x08</code> - Boolean - mapped to <code>true</code> or <code>false</code>\n+ <code>0x09</code> - UTC datetime - mapped to <code>Date</code>\n+ <code>0x0A</code> - Null value - mapped to <code>null</code>\n+ <code>0x0B</code> - Regular expression - mapped to <code>RegExp</code> (Note: only flags g, i, and m are supported)\n+ <code>0x0C</code> - DBPointer - currently unmapped\n+ <code>0x0D</code> - JavaScript code - mapped to <code>Function</code> or <code>Object</code> with property <code>code</code>\n+ <code>0x0E</code> - Symbol - mapped to <code>String</code>\n+ <code>0x0F</code> - JavaScript code w/ scope - mapped to <code>Function</code> or <code>Object</code> with properties <code>code</code> and <code>scope</code>\n+ <code>0x10</code> - 32-bit Integer - mapped to <code>Number</code>\n+ <code>0x11</code> - Timestamp - mapped to <code>exports.Timestamp</code>\n+ <code>0x12</code> - 64-bit integer - mapped to <code>exports.Long</code>\n+ <code>0xFF</code> - Min key - currently unmapped\n+ <code>0x7F</code> - Max key - currently unmapped\n\nExamples\n--------\n\n    var BSON = require('buffalo')\n\n    // Parse a Buffer\n    var object = BSON.parse(buffer)\n\n    // Serialize an object\n    var buffer = BSON.serialize(object)\n\nContributing\n------------\nTry it out and send me feedback! Unit tests and documentation are good, too.\n\nLicense\n-------\nBuffalo is open source software under the [zlib license][5].\n\n[1]: http://bsonspec.org/#/specification\n[2]: http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol\n[3]: http://nodejs.org/\n[4]: https://github.com/marcello3d/node-mongolian\n[5]: https://github.com/marcello3d/node-buffalo/blob/master/LICENSE\n","maintainers":[{"name":"marcello","email":"marcello@cellosoft.com"}]}},"maintainers":[{"name":"marcello","email":"marcello@cellosoft.com"}],"time":{"modified":"2012-02-01T04:49:47.172Z","created":"2011-06-21T03:30:17.907Z","0.1.0":"2011-06-21T03:30:18.138Z","0.1.1":"2011-09-08T02:03:26.438Z","0.1.2":"2011-12-22T04:35:15.720Z","0.1.3":"2012-02-01T04:49:47.172Z"},"author":{"name":"Marcello Bastéa-Forte","email":"marcello@cellosoft.com","url":"http://marcello.cellosoft.com/"},"repository":{"type":"git","url":"git://github.com/marcello3d/node-buffalo.git"},"_attachments":{"buffalo-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-qranTQVNIwIRMm9BRpbxAQ==","length":27624,"stub":true},"buffalo-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+Z2BXJVrg8eafOfq8Gv4Og==","length":23958,"stub":true},"buffalo-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-W31e/IBGXGp0VNhlF8bZIw==","length":437924,"stub":true},"buffalo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NRwZf0NleR3F2KF9hA0AIg==","length":13608,"stub":true}}}},
{"id":"buffer-browserify","key":"buffer-browserify","value":{"rev":"5-dc4fc806a128bc4d4248a72c00e87b51"},"doc":{"_id":"buffer-browserify","_rev":"5-dc4fc806a128bc4d4248a72c00e87b51","name":"buffer-browserify","description":"buffer module compatibility for browserify","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"buffer-browserify","version":"0.0.1","description":"buffer module compatibility for browserify","main":"index.js","browserify":"index.js","directories":{"test":"test"},"dependencies":{"base64-js":"0.0.2"},"devDependencies":{"tap":"0.2.x"},"repository":{"type":"git","url":"git://github.com/toots/buffer-browserify.git"},"keywords":["buffer","browserify","compatible","meatless","browser"],"author":{"name":"Romain Beauxis","email":"toots@rastageeks.org"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.4"},"_npmUser":{"name":"toots","email":"toots@rastageeks.org"},"_id":"buffer-browserify@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"412f60330a8b8be999a00aeab89481dc54f933b4","tarball":"http://registry.npmjs.org/buffer-browserify/-/buffer-browserify-0.0.1.tgz"},"maintainers":[{"name":"toots","email":"toots@rastageeks.org"}]},"0.0.2":{"name":"buffer-browserify","version":"0.0.2","description":"buffer module compatibility for browserify","main":"index.js","browserify":"index.js","directories":{"test":"test"},"dependencies":{"base64-js":"0.0.2"},"devDependencies":{"tap":"0.2.x"},"repository":{"type":"git","url":"http://github.com/toots/buffer-browserify.git"},"keywords":["buffer","browserify","compatible","meatless","browser"],"author":{"name":"Romain Beauxis","email":"toots@rastageeks.org"},"scripts":{"test":"node node_modules/tap/bin/tap.js test/*.js"},"license":"MIT/X11","engine":{"node":">=0.6"},"readme":"buffer-browserify\n===============\n\nThe buffer module from [node.js](http://nodejs.org/),\nbut for browsers.\n\nWhen you `require('buffer')` in\n[browserify](http://github.com/substack/node-browserify),\nthis module will be loaded.\n\nIt will also be loaded if you use the global `Buffer` variable.\n","_id":"buffer-browserify@0.0.2","dist":{"shasum":"f5b0a8366ea76905623d8b6bc8ea70d4e2563971","tarball":"http://registry.npmjs.org/buffer-browserify/-/buffer-browserify-0.0.2.tgz"},"maintainers":[{"name":"toots","email":"toots@rastageeks.org"}]}},"readme":"buffer-browserify\n===============\n\nThe buffer module from [node.js](http://nodejs.org/),\nbut for browsers.\n\nWhen you `require('buffer')` in\n[browserify](http://github.com/substack/node-browserify),\nthis module will be loaded.\n\nIt will also be loaded if you use the global `Buffer` variable.\n","maintainers":[{"name":"toots","email":"toots@rastageeks.org"}],"time":{"modified":"2012-07-15T23:15:50.997Z","created":"2012-06-07T13:02:10.143Z","0.0.1":"2012-06-07T13:02:11.965Z","0.0.2":"2012-07-15T23:15:50.997Z"},"author":{"name":"Romain Beauxis","email":"toots@rastageeks.org"},"repository":{"type":"git","url":"http://github.com/toots/buffer-browserify.git"},"_attachments":{"buffer-browserify-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qCrLDPqr4pp63wy/O/R1Aw==","length":8008,"stub":true},"buffer-browserify-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-CQ3O8L0UoTMQP2pO5ZJIVA==","length":10240,"stub":true}}}},
{"id":"buffer-builder","key":"buffer-builder","value":{"rev":"3-e7eeed2383b1e4c4d296fc4b2fbc5327"},"doc":{"_id":"buffer-builder","_rev":"3-e7eeed2383b1e4c4d296fc4b2fbc5327","name":"buffer-builder","description":"Build a buffer without knowing its size beforehand","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"buffer-builder","version":"0.1.0","description":"Build a buffer without knowing its size beforehand","main":"buffer-builder","repository":{"type":"git","url":"git://github.com/PeterReid/buffer-builder.git"},"keywords":["buffer-builder","buffer"],"author":{"name":"Peter Reid","email":"peter.d.reid@gmail.com"},"license":"MIT/X11","engine":{"node":">=0.6.0"},"_npmUser":{"name":"peterreid","email":"peter.d.reid@gmail.com"},"_id":"buffer-builder@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"a8d24d91d5086abe07c239274a7d27832ee1cc12","tarball":"http://registry.npmjs.org/buffer-builder/-/buffer-builder-0.1.0.tgz"},"maintainers":[{"name":"peterreid","email":"peter.d.reid@gmail.com"}]}},"readme":"# buffer-builder.js\r\n\r\nBufferBuilder accumulates pieces of data into a buffer, appending each onto the end. The data can be Buffers, strings, a repetition of a byte, or any of the types such as UInt32LE or FloatBE that can be written into Buffers.\r\n\r\nIf you are thinking about using this, you should probably have considered streaming your data instead of putting it into a buffer.\r\n\r\n## Usage\r\n\r\n``` js\r\nvar BufferBuilder = require('buffer-builder');\r\nvar helloWorld = new BufferBuilder();\r\n\r\n// Append a string, utf8 encoded by default.\r\nhelloWorld.appendString('hello');\r\n\r\n// Append any type that Buffer has read and write functions for.\r\nhelloWorld.appendUInt16LE(0x7720);\r\n\r\n// Append a buffer\r\nhelloWorld.appendBuffer(new Buffer([111, 114, 108, 100]));\r\n\r\n// Appended a repetition of a byte\r\nhelloWorld.appendFill(33, 3);\r\n\r\n// Convert to an ordinary buffer\r\nvar buffer = helloWorld.get();\r\n\r\nbuffer.toString(); // hello world!!!\r\n```\r\n\r\n## API\r\n\r\n### new BufferBuilder([initialCapacity])\r\nAllocate an empty BufferBuilder. If you know approximately what size the Buffer will end up being and are trying to squeeze out more performance, you can set the initial size of the backing buffer.\r\n\r\n### appendBuffer(source)\r\nAppend a buffer. Use [slice](http://nodejs.org/docs/latest/api/buffers.html#buffer.slice) if you want to append just part of one.\r\n\r\n### appendString(string, [encoding])\r\nAppend a string, encoded by utf8 by default. No trailing 0 is appended.\r\n\r\n### appendUInt8(value)\r\nAppend 8-bit unsigned integer.\r\n\r\n### appendUInt16LE(value)\r\nAppend 16-bit unsigned integer, little endian. 1 is encoded as 01 00.\r\n\r\n### appendUInt16BE(value)\r\nAppend 16-bit unsigned integer, big endian. 1 is encoded as 00 01.\r\n\r\n### appendUInt32LE(value)\r\nAppend 32-bit unsigned integer, little endian. 1 is encoded as 01 00 00 00.\r\n\r\n### appendUInt32BE(value)\r\nAppend 32-bit unsigned integer, big endian. 1 is encoded as 00 00 00 01.\r\n\r\n### appendInt8(value)\r\nAppend 8-bit signed integer.\r\n\r\n### appendInt16LE(value)\r\nAppend 16-bit signed integer, little endian. 1 is encoded as 01 00.\r\n\r\n### appendInt16BE(value)\r\nAppend 16-bit signed integer, big endian. 1 is encoded as 00 01.\r\n\r\n### appendInt32LE(value)\r\nAppend 32-bit signed integer, little endian. 1 is encoded as 01 00 00 00.\r\n\r\n### appendInt32BE(value)\r\nAppend 32-bit signed integer, big endian. 1 is encoded as 00 00 00 01.\r\n\r\n### appendFloatLE(value)\r\nLittle-endian float. Occupies 4 bytes.\r\n\r\n### appendFloatBE(value)\r\nBig-endian float. Occupies 4 bytes.\r\n\r\n### appendDoubleLE(value)\r\nLittle-endian double. Occupies 8 bytes.\r\n\r\n### appendDoubleBE(value)\r\nBig-endian double. Occupies 8 bytes.\r\n\r\n### appendFill(value, count)\r\nAppend _count_ repetitions of _value_ (a byte).\r\n\r\n### get()\r\nConvert to a buffer. This is a deep copy; modifications to the returned buffer will not affect the BufferBuilder.\r\n\r\n### copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])\r\nCopy bytes from the BufferBuilder into _targetBuffer_. _targetStart_ and _sourceStart_ default to 0. _sourceEnd_ defaults to the BufferBuilder's length.\r\n\r\n### length\r\nNumber of bytes appended so far.\r\n","maintainers":[{"name":"peterreid","email":"peter.d.reid@gmail.com"}],"time":{"modified":"2012-02-27T00:43:45.507Z","created":"2012-02-27T00:43:44.102Z","0.1.0":"2012-02-27T00:43:45.507Z"},"author":{"name":"Peter Reid","email":"peter.d.reid@gmail.com"},"repository":{"type":"git","url":"git://github.com/PeterReid/buffer-builder.git"},"_attachments":{"buffer-builder-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uO4n3+lFrJDrEHBJUrOHEQ==","length":5601,"stub":true}}}},
{"id":"buffer-crc32","key":"buffer-crc32","value":{"rev":"5-c7df71d1040d85ecd9ccbd58894104ed"},"doc":{"_id":"buffer-crc32","_rev":"5-c7df71d1040d85ecd9ccbd58894104ed","name":"buffer-crc32","description":"A pure javascript CRC32 algorithm that plays nice with binary data","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"buffer-crc32","description":"A CRC32 algorithm that works with buffers and is cool with unicode.","version":"0.1.0","homepage":"https://github.com/brianloveswords/buffer-crc32","repository":{"type":"git","url":"git://github.com/brianloveswords/buffer-crc32.git"},"main":"index.js","scripts":{"test":"tap tests/*.test.js"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brianloveswords","email":"brian@nyhacker.org"},"_id":"buffer-crc32@0.1.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"aaf375a949dea411fa2b39b41e808f9543224e3f","tarball":"http://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.1.0.tgz"},"readme":"","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]},"0.1.1":{"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"name":"buffer-crc32","description":"A pure javascript CRC32 algorithm that plays nice with binary data","version":"0.1.1","homepage":"https://github.com/brianloveswords/buffer-crc32","repository":{"type":"git","url":"git://github.com/brianloveswords/buffer-crc32.git"},"main":"index.js","scripts":{"test":"./node_modules/.bin/tap tests/*.test.js"},"dependencies":{},"devDependencies":{"tap":"~0.2.5"},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"brianloveswords","email":"brian@nyhacker.org"},"_id":"buffer-crc32@0.1.1","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.8.1","_defaultsLoaded":true,"dist":{"shasum":"7e110dc9953908ab7c32acdc70c9f945b1cbc526","tarball":"http://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.1.1.tgz"},"readme":"# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> <Buffer 94 5a ab 4a>\n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> <Buffer cb 03 1a c5>\n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}]}},"readme":"","maintainers":[{"name":"brianloveswords","email":"brian@nyhacker.org"}],"time":{"modified":"2012-07-11T18:52:29.048Z","created":"2012-07-11T17:53:46.260Z","0.1.0":"2012-07-11T17:53:46.688Z","0.1.1":"2012-07-11T18:52:29.048Z"},"author":{"name":"Brian J. Brennan","email":"brianloveswords@gmail.com","url":"http://bjb.io"},"repository":{"type":"git","url":"git://github.com/brianloveswords/buffer-crc32.git"},"_attachments":{"buffer-crc32-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0hFpgithGqBZJTrAWKgK3g==","length":3486,"stub":true},"buffer-crc32-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-1w9vcR/HOZc9ZVRdKnyv8w==","length":2783,"stub":true}}}},
{"id":"buffer-equal","key":"buffer-equal","value":{"rev":"3-9e01f1676899b08e0973e73e5bae4308"},"doc":{"_id":"buffer-equal","_rev":"3-9e01f1676899b08e0973e73e5bae4308","name":"buffer-equal","description":"return whether two buffers are equal","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"name":"buffer-equal","description":"return whether two buffers are equal","version":"0.0.0","repository":{"type":"git","url":"git://github.com/substack/node-buffer-equal.git"},"main":"index.js","keywords":["buffer","equal"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"~0.2.4"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"buffer-equal@0.0.0","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4a68196ac33522daa17ec99858b302a636b62cf1","tarball":"http://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.0.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-05-11T11:50:02.384Z","created":"2012-05-11T11:50:01.065Z","0.0.0":"2012-05-11T11:50:02.384Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-buffer-equal.git"},"_attachments":{"buffer-equal-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fenelcyAmnbeLc2rAh/o9A==","length":1193,"stub":true}}}},
{"id":"buffer_socket","key":"buffer_socket","value":{"rev":"3-e1183b951da4c04841d4e52e875cd232"},"doc":{"_id":"buffer_socket","_rev":"3-e1183b951da4c04841d4e52e875cd232","name":"buffer_socket","description":"collect outgoing socket events and send as a group.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.0":{"author":{"name":"mercury","email":"alexcgilliland@gmail.com"},"name":"buffer_socket","description":"collect outgoing socket events and send as a group.","version":"0.0.0","readme":"","repository":{"url":"https://github.com/mercuryt/buffer_socket"},"main":"index.coffee","engines":{"node":"~0.6.1 || 0.6.1-pre"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"mercury","email":"alexcgilliland@gmail.com"},"_id":"buffer_socket@0.0.0","_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.1-pre","_defaultsLoaded":true,"dist":{"shasum":"33d84544dbe4b43cfb7bdf2abe6f754b5cbb4e12","tarball":"http://registry.npmjs.org/buffer_socket/-/buffer_socket-0.0.0.tgz"},"maintainers":[{"name":"mercury","email":"alexcgilliland@gmail.com"}]}},"readme":"","maintainers":[{"name":"mercury","email":"alexcgilliland@gmail.com"}],"time":{"modified":"2012-02-27T14:50:53.472Z","created":"2012-02-27T14:50:46.315Z","0.0.0":"2012-02-27T14:50:53.472Z"},"author":{"name":"mercury","email":"alexcgilliland@gmail.com"},"repository":{"url":"https://github.com/mercuryt/buffer_socket"},"_attachments":{"buffer_socket-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FrbmeGtpBs2Ohm+CQ3/n0A==","length":5158,"stub":true}}}},
{"id":"buffercursor","key":"buffercursor","value":{"rev":"7-f2aa6845075b5abb48b735df83eb6496"},"doc":{"_id":"buffercursor","_rev":"7-f2aa6845075b5abb48b735df83eb6496","name":"buffercursor","description":"A simple way to traverse a Buffer like a cursor, updating position along the way","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"buffercursor","version":"0.0.1","author":{"name":"Timothy J Fontaine","email":"tjfontaine@gmail.com","url":"http://atxconsulting.com"},"description":"A simple way to traverse a Buffer like a cursor, updating position along the way","keywords":["buffer","cursor","stream"],"homepage":"http://github.com/tjfontaine/node-buffercursor","bugs":{"url":"http://github.com/tjfontaine/node-buffercursor/issues"},"repository":{"type":"git","url":"http://github.com/tjfontaine/node-buffercursor.git"},"main":"buffercursor.js","engines":{"node":">= 0.5.0"},"readme":"BufferCursor\n============\n\nThis is a simple module that allows you to traverse a Buffer iteratively. You\ncan read and write different types and the cursor's position will update with\nthe proper size, which you can see through `.tell()` you can also\n`.seek()`\n\n```javascript\nvar bc = new BufferCursor(buffer);\nbc.readUInt16BE();\nbc.readUInt8();\nbc.readUInt32BE();\nconsole.log(bc.tell());\n```\n\nWill output `7`\n\nMethods\n-------\n\nFor the most part `BufferCursor` and `Buffer` share the same methods, there's\njust a slight alteration in method signature, none of the methods take an\noffset.\n\nSo `.readUInt16LE(10)` in `Buffer` is equivalent to `bs.seek(10); bs.readUInt16LE();`\n\nAll `read[U]Int` and `write[U]Int` methods are reproduced, as are `toString`,\n`write`, `fill`, and `slice`. All of these methods will move the cursor through\nthe stream and do not take an offset parameter, where an `end` parameter would\nnormaly be used, here you supply a `length`.\n\nThe following are additional methods:\n\n * `seek(value)` -- Seek to an arbitrary position in the stream\n * `tell()` -- Return the current location in the stream\n * `eof()` -- Return true if at the end of the stream\n * `toByteArray([method])` -- This is a special helper method which will return\nthe *entire* stream (i.e. from the start) as an array of numbers.\n  - By default it will use `readUInt8` but you can pass in any\n`read[U]Int[8,16,32][LE,BE]` to change what the array is made of\n\nProperties\n----------\n\n * `.buffer` -- Access to the raw buffer\n * `.length` -- The size of the buffer\n","_id":"buffercursor@0.0.1","dist":{"shasum":"6536d6c4986b05b90745b991d7a3565defb9b4f7","tarball":"http://registry.npmjs.org/buffercursor/-/buffercursor-0.0.1.tgz"},"maintainers":[{"name":"tjfontaine","email":"tjfontaine@gmail.com"}]},"0.0.2":{"name":"buffercursor","version":"0.0.2","author":{"name":"Timothy J Fontaine","email":"tjfontaine@gmail.com","url":"http://atxconsulting.com"},"description":"A simple way to traverse a Buffer like a cursor, updating position along the way","keywords":["buffer","cursor","stream"],"homepage":"http://github.com/tjfontaine/node-buffercursor","bugs":{"url":"http://github.com/tjfontaine/node-buffercursor/issues"},"repository":{"type":"git","url":"http://github.com/tjfontaine/node-buffercursor.git"},"main":"buffercursor.js","engines":{"node":">= 0.5.0"},"readme":"BufferCursor\n============\n\nThis is a simple module that allows you to traverse a Buffer iteratively. You\ncan read and write different types and the cursor's position will update with\nthe proper size, which you can see through `.tell()` you can also\n`.seek()`\n\n```javascript\nvar bc = new BufferCursor(buffer);\nbc.readUInt16BE();\nbc.readUInt8();\nbc.readUInt32BE();\nconsole.log(bc.tell());\n```\n\nWill output `7`\n\nMethods\n-------\n\nFor the most part `BufferCursor` and `Buffer` share the same methods, there's\njust a slight alteration in method signature, none of the methods take an\noffset.\n\nSo `.readUInt16LE(10)` in `Buffer` is equivalent to `bs.seek(10); bs.readUInt16LE();`\n\nAll `read[U]Int` and `write[U]Int` methods are reproduced, as are `toString`,\n`write`, `fill`, and `slice`. All of these methods will move the cursor through\nthe stream and do not take an offset parameter, where an `end` parameter would\nnormaly be used, here you supply a `length`.\n\nThe following are additional methods:\n\n * `seek(value)` -- Seek to an arbitrary position in the stream\n * `tell()` -- Return the current location in the stream\n * `eof()` -- Return true if at the end of the stream\n * `toByteArray([method])` -- This is a special helper method which will return\nthe *entire* stream (i.e. from the start) as an array of numbers.\n  - By default it will use `readUInt8` but you can pass in any\n`read[U]Int[8,16,32][LE,BE]` to change what the array is made of\n\nProperties\n----------\n\n * `.buffer` -- Access to the raw buffer\n * `.length` -- The size of the buffer\n","_id":"buffercursor@0.0.2","dist":{"shasum":"31815f9919830fcac1f025c8c4df2e9b571f6ae2","tarball":"http://registry.npmjs.org/buffercursor/-/buffercursor-0.0.2.tgz"},"maintainers":[{"name":"tjfontaine","email":"tjfontaine@gmail.com"}]},"0.0.3":{"name":"buffercursor","version":"0.0.3","author":{"name":"Timothy J Fontaine","email":"tjfontaine@gmail.com","url":"http://atxconsulting.com"},"description":"A simple way to traverse a Buffer like a cursor, updating position along the way","keywords":["buffer","cursor","stream"],"homepage":"http://github.com/tjfontaine/node-buffercursor","bugs":{"url":"http://github.com/tjfontaine/node-buffercursor/issues"},"repository":{"type":"git","url":"http://github.com/tjfontaine/node-buffercursor.git"},"main":"buffercursor.js","engines":{"node":">= 0.5.0"},"readme":"BufferCursor\n============\n\nThis is a simple module that allows you to traverse a Buffer iteratively. You\ncan read and write different types and the cursor's position will update with\nthe proper size, which you can see through `.tell()` you can also\n`.seek()`\n\n```javascript\nvar bc = new BufferCursor(buffer);\nbc.readUInt16BE();\nbc.readUInt8();\nbc.readUInt32BE();\nconsole.log(bc.tell());\n```\n\nWill output `7`\n\nMethods\n-------\n\nFor the most part `BufferCursor` and `Buffer` share the same methods, there's\njust a slight alteration in method signature, none of the methods take an\noffset.\n\nSo `.readUInt16LE(10)` in `Buffer` is equivalent to `bs.seek(10); bs.readUInt16LE();`\n\nAll `read[U]Int` and `write[U]Int` methods are reproduced, as are `toString`,\n`write`, `fill`, and `slice`. All of these methods will move the cursor through\nthe stream and do not take an offset parameter, where an `end` parameter would\nnormaly be used, here you supply a `length`.\n\nThe following are additional methods:\n\n * `seek(value)` -- Seek to an arbitrary position in the stream\n * `tell()` -- Return the current location in the stream\n * `eof()` -- Return true if at the end of the stream\n * `toByteArray([method])` -- This is a special helper method which will return\nthe *entire* stream (i.e. from the start) as an array of numbers.\n  - By default it will use `readUInt8` but you can pass in any\n`read[U]Int[8,16,32][LE,BE]` to change what the array is made of\n\nProperties\n----------\n\n * `.buffer` -- Access to the raw buffer\n * `.length` -- The size of the buffer\n","_id":"buffercursor@0.0.3","dist":{"shasum":"ff1f474ee6aaa095f5d5baaa75190d71d3da4bff","tarball":"http://registry.npmjs.org/buffercursor/-/buffercursor-0.0.3.tgz"},"maintainers":[{"name":"tjfontaine","email":"tjfontaine@gmail.com"}]}},"readme":"BufferCursor\n============\n\nThis is a simple module that allows you to traverse a Buffer iteratively. You\ncan read and write different types and the cursor's position will update with\nthe proper size, which you can see through `.tell()` you can also\n`.seek()`\n\n```javascript\nvar bc = new BufferCursor(buffer);\nbc.readUInt16BE();\nbc.readUInt8();\nbc.readUInt32BE();\nconsole.log(bc.tell());\n```\n\nWill output `7`\n\nMethods\n-------\n\nFor the most part `BufferCursor` and `Buffer` share the same methods, there's\njust a slight alteration in method signature, none of the methods take an\noffset.\n\nSo `.readUInt16LE(10)` in `Buffer` is equivalent to `bs.seek(10); bs.readUInt16LE();`\n\nAll `read[U]Int` and `write[U]Int` methods are reproduced, as are `toString`,\n`write`, `fill`, and `slice`. All of these methods will move the cursor through\nthe stream and do not take an offset parameter, where an `end` parameter would\nnormaly be used, here you supply a `length`.\n\nThe following are additional methods:\n\n * `seek(value)` -- Seek to an arbitrary position in the stream\n * `tell()` -- Return the current location in the stream\n * `eof()` -- Return true if at the end of the stream\n * `toByteArray([method])` -- This is a special helper method which will return\nthe *entire* stream (i.e. from the start) as an array of numbers.\n  - By default it will use `readUInt8` but you can pass in any\n`read[U]Int[8,16,32][LE,BE]` to change what the array is made of\n\nProperties\n----------\n\n * `.buffer` -- Access to the raw buffer\n * `.length` -- The size of the buffer\n","maintainers":[{"name":"tjfontaine","email":"tjfontaine@gmail.com"}],"time":{"modified":"2012-07-02T21:52:14.948Z","created":"2012-07-01T18:23:51.629Z","0.0.1":"2012-07-01T18:23:52.229Z","0.0.2":"2012-07-02T13:53:22.075Z","0.0.3":"2012-07-02T21:52:14.948Z"},"author":{"name":"Timothy J Fontaine","email":"tjfontaine@gmail.com","url":"http://atxconsulting.com"},"repository":{"type":"git","url":"http://github.com/tjfontaine/node-buffercursor.git"},"_attachments":{"buffercursor-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8cdZmN3hz7WHFTukpy8Tag==","length":2714,"stub":true},"buffercursor-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CJe6NM+fQ+v+FqnG1K/XAg==","length":2726,"stub":true},"buffercursor-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-5k3eIDarsIhqqV17PNta5Q==","length":2720,"stub":true}}}},
{"id":"bufferdiff","key":"bufferdiff","value":{"rev":"3-5a8817a1526c288c09f2baa55ad856a4"},"doc":{"_id":"bufferdiff","_rev":"3-5a8817a1526c288c09f2baa55ad856a4","name":"bufferdiff","description":"A C++ module for node-js to test if two buffers are equal, fast (could add diff later).","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"bufferdiff","version":"1.0.1","main":"bufferdiff","description":"A C++ module for node-js to test if two buffers are equal, fast (could add diff later).","keywords":["buffers","buffer","diff"],"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"license":"MIT","repository":{"type":"git","url":"git://github.com/pkrumins/node-bufferdiff.git"},"directories":{"tests":"tests"},"engines":{"node":">=0.1.93"},"scripts":{"install":"node-waf configure build"},"_npmUser":{"name":"pkrumins","email":"peteris.krumins@gmail.com"},"_id":"bufferdiff@1.0.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"b9f181bf556205235e8758b6afc00da855ebf9d2","tarball":"http://registry.npmjs.org/bufferdiff/-/bufferdiff-1.0.1.tgz"},"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}]}},"readme":null,"maintainers":[{"name":"pkrumins","email":"peteris.krumins@gmail.com"}],"time":{"modified":"2012-02-01T22:41:45.905Z","created":"2012-02-01T22:41:44.986Z","1.0.1":"2012-02-01T22:41:45.905Z"},"author":{"name":"Peteris Krumins","email":"peteris.krumins@gmail.com","url":"http://www.catonmat.net"},"repository":{"type":"git","url":"git://github.com/pkrumins/node-bufferdiff.git"},"_attachments":{"bufferdiff-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vblg60PJ3wX0zP5tOYJnfA==","length":3380,"stub":true}}}},
{"id":"buffered","key":"buffered","value":{"rev":"3-0a24f9745e389dd6aa8963ea84ebc36a"},"doc":{"_id":"buffered","_rev":"3-0a24f9745e389dd6aa8963ea84ebc36a","name":"buffered","description":"Buffered stream","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"buffered","author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"version":"0.0.1","description":"Buffered stream","repository":{"type":"git","url":"git://github.com/mmalecki/buffered.git"},"main":"./lib/buffered","engines":{"node":">= 0.6"},"devDependencies":{"tap":"0.2.x"},"scripts":{"test":"tap test/*-test.js"},"_npmUser":{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"},"_id":"buffered@0.0.1","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.7.6-pre","_defaultsLoaded":true,"dist":{"shasum":"8da474783abd419c60dfc922aa4b698b153b477e","tarball":"http://registry.npmjs.org/buffered/-/buffered-0.0.1.tgz"},"maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}]}},"readme":"# buffered [![Build Status](https://secure.travis-ci.org/mmalecki/buffered.png)](http://travis-ci.org/mmalecki/buffered)\n`buffered` stream is a implementation of a buffered stream, heavily based on\n[@mikeal](https://github.com/mikeal)'s [`morestreams`](https://github.com/mikeal/morestreams).\n\n## Installation\n\n    npm install buffered\n\n## Usage\n```js\nvar fs = require('fs'),\n    http = require('http'),\n    BufferedStream = require('buffered').BufferedStream;\n\nhttp.createServer(function (req, res) {\n  var buffer = new BufferedStream();\n  req.pipe(buffer);\n  setTimeout(function () {\n    buffer.pipe(fs.createWriteStream('req'));\n  }, 500);\n}).listen(8000);\n```\n","maintainers":[{"name":"mmalecki","email":"maciej.malecki@notimplemented.org"}],"time":{"modified":"2012-03-12T14:33:02.294Z","created":"2012-03-12T14:33:00.098Z","0.0.1":"2012-03-12T14:33:02.294Z"},"author":{"name":"Maciej Małecki","email":"maciej.malecki@notimplemented.org"},"repository":{"type":"git","url":"git://github.com/mmalecki/buffered.git"},"_attachments":{"buffered-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-DD2Xlewlsp4r6ma9ZvWqQQ==","length":2852,"stub":true}}}},
{"id":"buffered-reader","key":"buffered-reader","value":{"rev":"64-895647ca7021a6b26a1ee3db4d1f7d71"},"doc":{"_id":"buffered-reader","_rev":"64-895647ca7021a6b26a1ee3db4d1f7d71","name":"buffered-reader","description":"Fully configurable buffered reader.","dist-tags":{"latest":"0.2.6"},"versions":{"0.0.2":{"name":"buffered-reader","author":{"name":"Gabriel Llamas"},"version":"0.0.2","description":"Fully configurable buffered reader.","repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"keywords":["buffer","reader","line","read line","read file","read text file","file"],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"665cd477c63652892e37a7f5befa28cd6001b8c8","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.0.2.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.0.3":{"name":"buffered-reader","author":{"name":"Gabriel Llamas"},"version":"0.0.3","description":"Fully configurable buffered reader.","repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"keywords":["buffer","reader","line","read line","read file","read text file","file"],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"35c947679cee6e98b99f8d609fedb18836404643","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.0.3.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.0.4":{"name":"buffered-reader","author":{"name":"Gabriel Llamas"},"version":"0.0.4","description":"Fully configurable buffered reader.","repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"keywords":["buffer","reader","line","read line","read file","read text file","file"],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"b35c10f926610d5b7c7ae2fae62af26bb735de73","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.0.4.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.0.5":{"name":"buffered-reader","author":{"name":"Gabriel Llamas"},"version":"0.0.5","description":"Fully configurable buffered reader.","repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"keywords":["buffer","reader","line","read line","read file","read text file","file"],"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.0.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"9351c219978bc0459a59420dc86c1be2a64b40fd","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.0.5.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.0.6":{"name":"buffered-reader","version":"0.0.6","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","read file","read text file","file"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.0.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"a7f5939cd162dd780581fb654bb1ecb7298e8d81","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.0.6.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.0":{"name":"buffered-reader","version":"0.1.0","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"c0b3e4d97b796fb01dbc9b465aa1b373892dc72b","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.1.0.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.1":{"name":"buffered-reader","version":"0.1.1","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"35d0422b1522fc6d9f9111a0147fd017798a35a3","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.1.1.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.2":{"name":"buffered-reader","version":"0.1.2","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c2a4306396d7b566f8ccbc478dc5a01cc19bcb16","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.1.2.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.0":{"name":"buffered-reader","version":"0.2.0","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ecc48b96bd9a5ec00fc5320030caffa9f9bdc138","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.0.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.1":{"name":"buffered-reader","version":"0.2.1","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.2.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"dd31e4f6c8e7b07a4967429a8db36ebc04be6745","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.1.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.2":{"name":"buffered-reader","version":"0.2.2","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-reader@0.2.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"d981068a217114f2aa115068bd3e3d8b5d069751","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.2.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.3":{"name":"buffered-reader","version":"0.2.3","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedReader\r\n===================\r\n\r\n#### Fully configurable buffered reader for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.2.4\r\n\r\nWhen you need to read a file you typically read a chunk of bytes called \"buffer\" to avoid multiple calls to the underlying I/O layer, so instead of reading directly from the disk, you read from the previous filled buffer. Doing this you win performance.\r\n\r\nThis library allows you to read files using internal buffers, so you don't have to worry about them. In addition, you can read a text file line by line.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-reader\r\n```\r\n\r\nOr simply copying `build/buffered-reader.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedReader/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedReader/tree/master/examples)  \r\n[Change log](https://github.com/Gagle/Node-BufferedReader/wiki/Change-log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedReader/blob/master/LICENSE)","_id":"buffered-reader@0.2.3","dist":{"shasum":"96fef116ebddb96e82d51fba6c0f84c53053c103","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.3.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.4":{"name":"buffered-reader","version":"0.2.4","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedReader\r\n===================\r\n\r\n#### Fully configurable buffered reader for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.2.4\r\n\r\nWhen you need to read a file you typically read a chunk of bytes called \"buffer\" to avoid multiple calls to the underlying I/O layer, so instead of reading directly from the disk, you read from the previous filled buffer. Doing this you win performance.\r\n\r\nThis library allows you to read files using internal buffers, so you don't have to worry about them. In addition, you can read a text file line by line.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-reader\r\n```\r\n\r\nOr simply copying `build/buffered-reader.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedReader/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedReader/tree/master/examples)  \r\n[Change log](https://github.com/Gagle/Node-BufferedReader/wiki/Change-log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedReader/blob/master/LICENSE)","_id":"buffered-reader@0.2.4","dist":{"shasum":"4a160064577f47d38f60eddf8b7644c592ed7db1","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.4.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.5":{"name":"buffered-reader","version":"0.2.5","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedReader\r\n===================\r\n\r\n#### Fully configurable buffered reader for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.2.5\r\n\r\nWhen you need to read a file you typically read a chunk of bytes called \"buffer\" to avoid multiple calls to the underlying I/O layer, so instead of reading directly from the disk, you read from the previous filled buffer. Doing this you win performance.\r\n\r\nThis library allows you to read files using internal buffers, so you don't have to worry about them. In addition, you can read a text file line by line.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-reader\r\n```\r\n\r\nOr simply copying `build/buffered-reader.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedReader/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedReader/tree/master/examples)  \r\n[Change log](https://github.com/Gagle/Node-BufferedReader/wiki/Change-log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedReader/blob/master/LICENSE)","_id":"buffered-reader@0.2.5","dist":{"shasum":"16e09ba78ccbff328c29aceadcb65dc986d7d82b","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.5.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.2.6":{"name":"buffered-reader","version":"0.2.6","description":"Fully configurable buffered reader.","keywords":["buffer","reader","line","read line","file","read file","read text file","read binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"engines":{"node":"*"},"dependencies":{"errno-codes":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-reader","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedReader\r\n===================\r\n\r\n#### Fully configurable buffered reader for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.2.6\r\n\r\nWhen you need to read a file you typically read a chunk of bytes called \"buffer\" to avoid multiple calls to the underlying I/O layer, so instead of reading directly from the disk, you read from the previous filled buffer. Doing this you win performance.\r\n\r\nThis library allows you to read files using internal buffers, so you don't have to worry about them. In addition, you can read a text file line by line.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-reader\r\n```\r\n\r\nOr simply copying `build/buffered-reader.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node *\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedReader/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedReader/tree/master/examples)  \r\n[Change Log](https://github.com/Gagle/Node-BufferedReader/wiki/Change-Log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedReader/blob/master/LICENSE)","_id":"buffered-reader@0.2.6","dist":{"shasum":"68b2dc9cb49e022a361d53c790564ea30b7c7c51","tarball":"http://registry.npmjs.org/buffered-reader/-/buffered-reader-0.2.6.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}]}},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"time":{"modified":"2012-08-05T12:17:16.738Z","created":"2012-04-11T12:11:26.658Z","0.0.2":"2012-04-11T12:11:30.428Z","0.0.3":"2012-04-12T05:26:29.703Z","0.0.4":"2012-04-12T11:37:27.860Z","0.0.5":"2012-04-15T22:22:32.171Z","0.0.6":"2012-04-21T21:08:59.059Z","0.1.0":"2012-04-25T12:09:26.231Z","0.1.1":"2012-04-25T18:05:44.704Z","0.1.2":"2012-04-29T09:51:55.238Z","0.2.0":"2012-05-02T10:12:21.569Z","0.2.1":"2012-05-13T09:24:38.418Z","0.2.2":"2012-05-13T17:35:21.791Z","0.2.3":"2012-07-25T15:15:44.434Z","0.2.4":"2012-07-25T15:20:45.517Z","0.2.5":"2012-07-25T16:34:14.382Z","0.2.6":"2012-08-05T12:17:16.738Z"},"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedReader.git"},"users":{"fgribreau":true},"_attachments":{"buffered-reader-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":64,"digest":"md5-N3G6ja4LVN5O+Ao351sKWg==","length":2999,"stub":true},"buffered-reader-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-/KWqeV5EHrIANpZuQW+8KQ==","length":2937,"stub":true},"buffered-reader-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-MSUpez2dM7x2l0U6kxZcwQ==","length":2894,"stub":true},"buffered-reader-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-Y0/F4V9Wp+xEQoXwbfLl0g==","length":2893,"stub":true},"buffered-reader-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-CPtvYkmG89izUUA5KsrkuQ==","length":2212,"stub":true},"buffered-reader-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-78YENJKRnywDowiTOIqltQ==","length":2191,"stub":true},"buffered-reader-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-VF3cbfwpM8Dmi2giZ1bORw==","length":2173,"stub":true},"buffered-reader-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-wl/hGmMYGjkOm2RsQk8+gQ==","length":1825,"stub":true},"buffered-reader-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-onpustRojQSuKrX+XtOfnQ==","length":1778,"stub":true},"buffered-reader-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-Ait4Q6xlxU9Hul6AwIUl2A==","length":1717,"stub":true},"buffered-reader-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-24tLSCXdOCPl9ZGrs4FOqw==","length":978,"stub":true},"buffered-reader-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-vBAOwWn84pkhusKPy0Ojxg==","length":1012,"stub":true},"buffered-reader-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+mKi3z5U8f9iC0gShTRhyA==","length":1095,"stub":true},"buffered-reader-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-4YmRDV1Tifxwdy3p0vagaw==","length":1094,"stub":true},"buffered-reader-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Mvmv8jwoLZXP0YZpOmajcQ==","length":1086,"stub":true}}}},
{"id":"buffered-request","key":"buffered-request","value":{"rev":"9-9eaf741651227b7ec2b0cd2418229ee2"},"doc":{"_id":"buffered-request","_rev":"9-9eaf741651227b7ec2b0cd2418229ee2","name":"buffered-request","description":"request.pause() fix. Hack/patch that makes The request object buffered.","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"buffered-request","description":"request.pause() fix. Hack/patch that makes The request object buffered.","keywords":["request","pause","resume","buffer","stream","buffered"],"version":"0.1.0","homepage":"https://github.com/kilianc/node-buffered-request","repository":{"type":"git","url":"git://github.com/kilianc/node-buffered-request.git"},"main":"./","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"1.0.x","should":"0.6.1","request":"2.9.x"},"engines":{"node":"v0.6.x"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"buffered-request@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"f47d1637bd93c455c909daba81ee3ad216915efc","tarball":"http://registry.npmjs.org/buffered-request/-/buffered-request-0.1.0.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"directories":{}},"0.1.1":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"buffered-request","description":"request.pause() fix. Hack/patch that makes The request object buffered.","keywords":["request","pause","resume","buffer","stream","buffered"],"version":"0.1.1","homepage":"https://github.com/kilianc/node-buffered-request","repository":{"type":"git","url":"git://github.com/kilianc/node-buffered-request.git"},"main":"./","scripts":{"test":"make test"},"dependencies":{},"devDependencies":{"mocha":"1.0.x","should":"0.6.1","request":"2.9.x"},"engines":{"node":"< v0.9.x"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"buffered-request@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"58ef064e5e9645cfc1da266a1f13d74700a11808","tarball":"http://registry.npmjs.org/buffered-request/-/buffered-request-0.1.1.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]}},"readme":"# buffered-request [![build status](https://secure.travis-ci.org/kilianc/node-buffered-request.png?branch=master)](http://travis-ci.org/kilianc/node-buffered-request)\n\n__Hack/patch for the Request Object that makes it buffered.__\n\nIt solves the pause/resume unbuffered behaviorin node <= 0.6.x [related topic](https://groups.google.com/forum/?fromgroups#!topic/nodejs/pzhtOO6ePZ0)\n\nThe patch adds a `makeBuffered` method to the request object (who is `instanceof IncomingMessage`) and\ndoesn't break any functionality of the actual `IncomingMessage` Object. It still works well with `pipes` and `data` events.\n\nTake a look ad the test suite for some example.\n\n## Installation\n\n    ⚡ npm install buffered-request\n\n```javascript\nrequire('buffered-request')\n```\n\n## Syntax\n\n```javascript\nIncomingMessage.makeBuffered()\n```\n\n## Example\n\n```javascript\nvar server = http.createServer(function (request, response) {\n  request.makeBuffered() // ensure that you will never lose packets\n  request.pause()\n  setTimeout(function () {\n    request.on('data', function (chunk) {\n      // data event will be emitted for all previous buffered chunks\n    })\n    request.resume()\n  }, 1000)\n  ...\n}).listen(8080)\n```\n\n## Test\n\n    ⚡ npm install\n    ⚡ npm test\n\n## Test Coverage\n\n    ⚡ npm install -g jscoverage\n    ⚡ make test-cov\n    \n## License\n\n_This software is released under the MIT license cited below_.\n\n    Copyright (c) 2010 Kilian Ciuffolo, me@nailik.org. All Rights Reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the 'Software'), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n    \n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"time":{"modified":"2012-05-22T17:35:07.835Z","created":"2012-04-25T00:02:02.462Z","0.1.0":"2012-04-25T00:02:03.752Z","0.1.1":"2012-05-22T17:35:07.835Z"},"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"repository":{"type":"git","url":"git://github.com/kilianc/node-buffered-request.git"},"_attachments":{"buffered-request-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-RLFMHGfiXR/ZiHsRuIMA2w==","length":17441,"stub":true},"buffered-request-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-tAK//X3liApqNHqmeAqp/Q==","length":17378,"stub":true}}}},
{"id":"buffered-response","key":"buffered-response","value":{"rev":"9-a73d1daae665850ffeafdad9b5f2bbe4"},"doc":{"_id":"buffered-response","_rev":"9-a73d1daae665850ffeafdad9b5f2bbe4","name":"buffered-response","description":"Utility library for line-by-line reading from any readable text stream","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1alpha":{"name":"buffered-response","version":"0.0.1alpha","description":"Utility library for line-by-line reading from an HTTP response","main":"buffered-response","keywords":["javascript","http","utils"],"author":{"name":"Alex Kalderimis","email":"alex@intermine.org"},"license":"LGPL","repository":{"type":"git","url":"git://github.com/alexkalderimis/node-buffered-reader.git"},"engines":{"node":">= 0.4.0"},"directories":{"example":"examples","test":"test"},"bugs":{"email":"project@hostname.com","url":"http://github.com/alexkalderimis/buffered-response/issues"},"_npmUser":{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"},"_id":"buffered-response@0.0.1alpha","contributors":[{"name":"Alex Kalderimis alex@intermine.org"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"577ebee2d3a4620dff7cbbcd1e7257e8e1255f05","tarball":"http://registry.npmjs.org/buffered-response/-/buffered-response-0.0.1alpha.tgz"},"maintainers":[{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"}]},"0.0.1alpha-1":{"name":"buffered-response","version":"0.0.1alpha-1","description":"Utility library for line-by-line reading from an HTTP response","main":"buffered-response","keywords":["javascript","http","utils"],"author":{"name":"Alex Kalderimis","email":"alex@intermine.org"},"license":"LGPL","repository":{"type":"git","url":"git://github.com/alexkalderimis/node-buffered-reader.git"},"engines":{"node":">= 0.4.0"},"directories":{"example":"examples","test":"test"},"bugs":{"email":"alex@intermine.org","url":"http://github.com/alexkalderimis/node-buffered-response/issues"},"_npmUser":{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"},"_id":"buffered-response@0.0.1alpha-1","contributors":[{"name":"Alex Kalderimis alex@intermine.org"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"1ac95ad17d5f7d60b5e1c0393fa04a18c5f001bb","tarball":"http://registry.npmjs.org/buffered-response/-/buffered-response-0.0.1alpha-1.tgz"},"maintainers":[{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"}]},"0.0.1beta-1":{"name":"buffered-response","version":"0.0.1beta-1","description":"Utility library for line-by-line reading from any readable text stream","main":"lib/buffered-response","keywords":["javascript","http","utils"],"scripts":{"test":"expresso test/tests.js"},"author":{"name":"Alex Kalderimis","email":"alex@intermine.org"},"license":"LGPL","repository":{"type":"git","url":"git://github.com/alexkalderimis/node-buffered-reader.git"},"engines":{"node":">= 0.4.0"},"directories":{"example":"examples","test":"test","lib":"lib"},"dependencies":{"jquery-deferred":">= 0.2.0"},"devDependencies":{"expresso":">= 0.9.2"},"bugs":{"email":"alex@intermine.org","url":"http://github.com/alexkalderimis/node-buffered-response/issues"},"_npmUser":{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"},"_id":"buffered-response@0.0.1beta-1","contributors":[{"name":"Alex Kalderimis alex@intermine.org"}],"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"db64b8682757cb902611dc1783c5655c007008ab","tarball":"http://registry.npmjs.org/buffered-response/-/buffered-response-0.0.1beta-1.tgz"},"maintainers":[{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"}]},"0.0.1":{"name":"buffered-response","version":"0.0.1","description":"Utility library for line-by-line reading from any readable text stream","main":"lib/buffered-response","keywords":["javascript","http","utils"],"scripts":{"test":"expresso test/tests.js"},"author":{"name":"Alex Kalderimis","email":"alex@intermine.org"},"license":"LGPL","repository":{"type":"git","url":"git://github.com/alexkalderimis/node-buffered-reader.git"},"engines":{"node":">= 0.4.0"},"directories":{"example":"examples","test":"test","lib":"lib"},"dependencies":{"jquery-deferred":">= 0.2.0"},"devDependencies":{"expresso":">= 0.9.2"},"bugs":{"email":"alex@intermine.org","url":"http://github.com/alexkalderimis/node-buffered-response/issues"},"_npmUser":{"name":"alexkalderimis","email":"alex@intermine.org"},"_id":"buffered-response@0.0.1","contributors":[{"name":"Alex Kalderimis alex@intermine.org"}],"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"dcd399a20dbd21e4e8517ee794d17a2cc9f9d199","tarball":"http://registry.npmjs.org/buffered-response/-/buffered-response-0.0.1.tgz"},"maintainers":[{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"}]}},"readme":"Buffered Response Reader for Node.js\n====================================\n\nA small utility class to wrap response objects\nfrom the http module, and provide line-by-line\niteration.\n\nSYNOPSIS\n========\n\n```javascript\n    var http = require('http');\n    var BufferedResponse = require('buffered-response').BufferedResponse;\n\n    var options = {\n        host: 'foo',\n        path: '/a/b?q=3',\n        method: 'GET'\n    };\n\n    var req = http.request(options, function(resp) {\n        var reader = new BufferedResponse(resp);\n        reader.setEncoding('utf8');\n        var lineno = 1;\n        reader.on('line', function(line) {\n            console.log(\"LINE \" + lineno++ + \": \" + line);\n        });\n    });\n\n    req.end();\n```\n\n","maintainers":[{"name":"alexkalderimis","email":"alex.kalderimis@gmail.com"}],"time":{"modified":"2012-05-28T12:24:20.836Z","created":"2012-05-26T04:05:41.269Z","0.0.1alpha":"2012-05-26T04:05:42.795Z","0.0.1alpha-1":"2012-05-26T04:07:44.717Z","0.0.1beta-1":"2012-05-28T11:12:11.482Z","0.0.1":"2012-05-28T12:24:20.836Z"},"author":{"name":"Alex Kalderimis","email":"alex@intermine.org"},"repository":{"type":"git","url":"git://github.com/alexkalderimis/node-buffered-reader.git"},"_attachments":{"buffered-response-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-pf6zxnbqq7dhwUjbPPQbmQ==","length":4079,"stub":true},"buffered-response-0.0.1beta-1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Gjf9gJEFbuPt+UNVixzwBg==","length":3856,"stub":true},"buffered-response-0.0.1alpha-1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1Qz9FXyQg0AT5HtKoGCI9A==","length":1480,"stub":true},"buffered-response-0.0.1alpha.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yh9A/ZUOLKCi3cqjlQm77w==","length":1492,"stub":true}}}},
{"id":"buffered-writer","key":"buffered-writer","value":{"rev":"70-c513ff586d4ee1c5caa464c96cad0734"},"doc":{"_id":"buffered-writer","_rev":"70-c513ff586d4ee1c5caa464c96cad0734","name":"buffered-writer","description":"Fully configurable buffered writer.","dist-tags":{"latest":"0.1.10"},"versions":{"0.0.1":{"name":"buffered-writer","version":"0.0.1","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"e3ef347b8eafe0c3c2d600bda9391b992440d2ec","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.0.1.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.0":{"name":"buffered-writer","version":"0.1.0","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"c706cd4dc8e2cf6f36ff700942eb920d062d9d94","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.0.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.1":{"name":"buffered-writer","version":"0.1.1","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"b488450e4efe4c58da0cafe9a5ce2328ae2ccc3f","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.1.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.2":{"name":"buffered-writer","version":"0.1.2","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"0ed585332d276cc4d4d0b13c6d55cc93d509f338","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.2.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.3":{"name":"buffered-writer","version":"0.1.3","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"1d804a4b53b95d92cbfdcfcdc9294575ef6c6c41","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.3.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.4":{"name":"buffered-writer","version":"0.1.4","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4232b24f46d3205a01d3af8280be7d562986ed43","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.4.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.5":{"name":"buffered-writer","version":"0.1.5","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.5","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"4fc96811742984f076d81358a28f786cc990db91","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.5.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.6":{"name":"buffered-writer","version":"0.1.6","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.6","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.16","_defaultsLoaded":true,"dist":{"shasum":"da18d5c301779fcb6b547f01b896b46f4fd68ed5","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.6.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.7":{"name":"buffered-writer","version":"0.1.7","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","_npmUser":{"name":"Gagle","email":"gaglekas@gmail.com"},"_id":"buffered-writer@0.1.7","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"86da60cca6d69bc2249dd4e1ad74ffa34965a717","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.7.tgz"},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.8":{"name":"buffered-writer","version":"0.1.8","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedWriter\r\n===================\r\n\r\n#### Fully configurable buffered writer for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.1.8\r\n\r\nWhen you need to write a file you typically write the content in little chunks at a time. To avoid multiple calls to the underlying I/O layer you need to use a piece of memory called \"buffer\", so instead of writting directly to the disk, you write to the buffer and when it is filled the content is written to disk. Doing this you win performance.\r\n\r\nThis library allows you to write files using internal buffers, so you don't have to worry about them.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-writer\r\n```\r\n\r\nOr simply copying `build/buffered-writer.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node 0.4.10+\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedWriter/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedWriter/tree/master/examples)  \r\n[Change log](https://github.com/Gagle/Node-BufferedWriter/wiki/Change-log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedWriter/blob/master/LICENSE)","_id":"buffered-writer@0.1.8","dist":{"shasum":"32701a8ff04805a2f0b79ee5ba1f4479b3784647","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.8.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.9":{"name":"buffered-writer","version":"0.1.9","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedWriter\r\n===================\r\n\r\n#### Fully configurable buffered writer for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.1.9\r\n\r\nWhen you need to write a file you typically write the content in little chunks at a time. To avoid multiple calls to the underlying I/O layer you need to use a piece of memory called \"buffer\", so instead of writting directly to the disk, you write to the buffer and when it is filled the content is written to disk. Doing this you win performance.\r\n\r\nThis library allows you to write files using internal buffers, so you don't have to worry about them.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-writer\r\n```\r\n\r\nOr simply copying `build/buffered-writer.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node 0.4.10+\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedWriter/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedWriter/tree/master/examples)  \r\n[Change Log](https://github.com/Gagle/Node-BufferedWriter/wiki/Change-Log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedWriter/blob/master/LICENSE)","_id":"buffered-writer@0.1.9","dist":{"shasum":"ca02c434f005716083577169ca103aea660c5862","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.9.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"directories":{}},"0.1.10":{"name":"buffered-writer","version":"0.1.10","description":"Fully configurable buffered writer.","keywords":["buffer","writer","line","write line","file","write file","write text file","write binary file","binary"],"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"engines":{"node":">=0.4.10"},"dependencies":{"errno-codes":"*"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"main":"buffered-writer","readme":"<a name=\"start\"></a>\r\n\r\nNode BufferedWriter\r\n===================\r\n\r\n#### Fully configurable buffered writer for node.js ####\r\n\r\n[Availability](#availability) | [Compatibility](#compatibility) | [Documentation](#documentation)\r\n\r\nVersion: 0.1.10\r\n\r\nWhen you need to write a file you typically write the content in little chunks at a time. To avoid multiple calls to the underlying I/O layer you need to use a piece of memory called \"buffer\", so instead of writting directly to the disk, you write to the buffer and when it is filled the content is written to disk. Doing this you win performance.\r\n\r\nThis library allows you to write files using internal buffers, so you don't have to worry about them.\r\n\r\n<a name=\"availability\"></a>\r\n#### Availability [↑](#start) ####\r\n\r\nVia npm:\r\n\r\n```\r\nnpm install buffered-writer\r\n```\r\n\r\nOr simply copying `build/buffered-writer.js` into your project's directory and `require()` accordingly.\r\n\r\n***\r\n\r\n<a name=\"compatibility\"></a>\r\n#### Compatibility [↑](#start) ####\r\n\r\n✔ Node 0.4.10+\r\n\r\n***\r\n\r\n<a name=\"documentation\"></a>\r\n#### Documentation [↑](#start) ####\r\n \r\n[Reference](https://github.com/Gagle/Node-BufferedWriter/wiki/Reference)  \r\n[Examples](https://github.com/Gagle/Node-BufferedWriter/tree/master/examples)  \r\n[Change Log](https://github.com/Gagle/Node-BufferedWriter/wiki/Change-Log)  \r\n[MIT License](https://github.com/Gagle/Node-BufferedWriter/blob/master/LICENSE)","_id":"buffered-writer@0.1.10","dist":{"shasum":"e0830ccf09ab047286244791274f6df0f81ca434","tarball":"http://registry.npmjs.org/buffered-writer/-/buffered-writer-0.1.10.tgz"},"maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}]}},"readme":"","maintainers":[{"name":"Gagle","email":"gaglekas@gmail.com"}],"time":{"modified":"2012-08-05T12:16:48.084Z","created":"2012-04-28T14:05:59.670Z","0.0.1":"2012-04-28T14:06:03.044Z","0.1.0":"2012-04-28T18:11:04.993Z","0.1.1":"2012-04-28T19:30:26.348Z","0.1.2":"2012-04-29T17:07:40.934Z","0.1.3":"2012-04-30T07:46:44.581Z","0.1.4":"2012-05-02T08:43:49.237Z","0.1.5":"2012-05-04T09:49:38.315Z","0.1.6":"2012-05-04T11:26:41.050Z","0.1.7":"2012-05-24T13:21:42.932Z","0.1.8":"2012-07-22T10:07:06.104Z","0.1.9":"2012-07-30T11:03:29.989Z","0.1.10":"2012-08-05T12:16:48.084Z"},"author":{"name":"Gabriel Llamas"},"repository":{"type":"git","url":"git://github.com/Gagle/Node-BufferedWriter.git"},"users":{"fgribreau":true},"_attachments":{"buffered-writer-0.1.10.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-bmVk5BbSA2UIv/YYJm/0GQ==","length":1973,"stub":true},"buffered-writer-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-bT6VWB48WJ0uycgt3GPJhw==","length":1915,"stub":true},"buffered-writer-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-uy1m2Yrd51w6qEvw8F5sXQ==","length":1898,"stub":true},"buffered-writer-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-n6T7rK3R/pp61Bb08R/Huw==","length":1287,"stub":true},"buffered-writer-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-z4c+6/BK6vBNQAZUWhHVug==","length":1286,"stub":true},"buffered-writer-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-9LsCzHv7zH1iGMrmCMZpyQ==","length":1284,"stub":true},"buffered-writer-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-g6A2ja2mDgjcsr89vkIvwg==","length":1281,"stub":true},"buffered-writer-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-8B/YEqHLuh08nAdgbKRoLQ==","length":1317,"stub":true},"buffered-writer-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-mGvMGUMh5XCgccmPf1QT9A==","length":1334,"stub":true},"buffered-writer-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6ysBT//ryCeGbHivFJC9rQ==","length":1300,"stub":true},"buffered-writer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VV/JDgPD8mFYSqAVY9q3yg==","length":1305,"stub":true},"buffered-writer-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2GgHm77tfELp5nD0K/F0SA==","length":1330,"stub":true}}}},
{"id":"bufferedstream","key":"bufferedstream","value":{"rev":"11-a94d46cd93d7498395342b35b7b85fa3"},"doc":{"_id":"bufferedstream","_rev":"11-a94d46cd93d7498395342b35b7b85fa3","name":"bufferedstream","description":"A base stream class for node that reliably buffers until next tick","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"name":"bufferedstream","description":"A base stream class for node that reliably buffers until next tick","version":"1.0.0","repository":{"type":"git","url":"git://github.com/mjijackson/bufferedstream.git"},"main":"./bufferedstream.js","scripts":{"test":"vows bufferedstream_test.js"},"engines":{"node":"~0.4.12"},"dependencies":{},"devDependencies":{"vows":"0.5.13"},"_npmUser":{"name":"mjijackson","email":"mjijackson@gmail.com"},"_id":"bufferedstream@1.0.0","_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b7a2f4bfa7e26dc020b5570311ab5698b052f3ad","tarball":"http://registry.npmjs.org/bufferedstream/-/bufferedstream-1.0.0.tgz"},"maintainers":[{"name":"mjijackson","email":"mjijackson@gmail.com"}],"directories":{}},"1.0.1":{"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"name":"bufferedstream","description":"A base stream class for node that reliably buffers until next tick","version":"1.0.1","repository":{"type":"git","url":"git://github.com/mjijackson/bufferedstream.git"},"main":"./bufferedstream.js","scripts":{"test":"vows bufferedstream_test.js"},"engines":{"node":">=0.4.7"},"dependencies":{},"devDependencies":{"vows":"0.5.13"},"_npmUser":{"name":"mjijackson","email":"mjijackson@gmail.com"},"_id":"bufferedstream@1.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"8aa0851ab9b2573493a19b1b06278c4e9376ea54","tarball":"http://registry.npmjs.org/bufferedstream/-/bufferedstream-1.0.1.tgz"},"maintainers":[{"name":"mjijackson","email":"mjijackson@gmail.com"}]}},"maintainers":[{"name":"mjackson","email":"mjijackson@gmail.com"}],"time":{"modified":"2012-04-12T04:25:32.007Z","created":"2011-11-15T18:33:57.239Z","1.0.0":"2011-11-15T18:33:58.254Z","1.0.1":"2011-12-23T04:19:13.944Z"},"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"repository":{"type":"git","url":"git://github.com/mjijackson/bufferedstream.git"},"_attachments":{"bufferedstream-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ufrkAS8Vh1tzjfWSwX4x/g==","length":10240,"stub":true},"bufferedstream-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-be5DtVelAiuiyDbzznmvng==","length":10240,"stub":true}}}},
{"id":"bufferfly","key":"bufferfly","value":{"rev":"3-0859399195823faf9ab2aeb6cbbefae7"},"doc":{"_id":"bufferfly","_rev":"3-0859399195823faf9ab2aeb6cbbefae7","name":"bufferfly","description":"Bufferfly is a tiny module that generates flowers from buffers, it is not addictive like LSD, but at least is useful to break up or reassemble the data that could be sent or received over UDP","dist-tags":{"latest":"0.2.4"},"versions":{"0.2.4":{"name":"bufferfly","version":"0.2.4","description":"Bufferfly is a tiny module that generates flowers from buffers, it is not addictive like LSD, but at least is useful to break up or reassemble the data that could be sent or received over UDP","homepage":"https://github.com/rootslab/bufferfly","repository":{"type":"git","url":"git://github.com/rootslab/bufferfly.git"},"keywords":["udp","datagram","mtu","buffer","bufferfly"],"tags":["udp","datagram","mtu","buffer","bufferfly"],"author":{"name":"Guglielmo Ferri","email":"44gatti@gmail.com"},"dependencies":{"butter":">= 0.1.4"},"main":"index","engines":{"node":">=0.4.x"},"_id":"bufferfly@0.2.4","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.12","directories":{"lib":"./lib"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2f4a8eb8fc5b4f3ab0d17bbad482288ce7c9ce7f","tarball":"http://registry.npmjs.org/bufferfly/-/bufferfly-0.2.4.tgz"},"maintainers":[{"name":"rootslab","email":"44gatti@gmail.com"}]}},"maintainers":[{"name":"rootslab","email":"44gatti@gmail.com"}],"time":{"modified":"2011-10-11T20:34:12.723Z","created":"2011-10-11T20:34:12.187Z","0.2.4":"2011-10-11T20:34:12.723Z"},"author":{"name":"Guglielmo Ferri","email":"44gatti@gmail.com"},"repository":{"type":"git","url":"git://github.com/rootslab/bufferfly.git"},"_attachments":{"bufferfly-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-o3f5Jzc7G15t8OgStMt/YA==","length":6646,"stub":true}}}},
{"id":"bufferhelper","key":"bufferhelper","value":{"rev":"3-74ab7dcc036a606f26302f49c864cadb"},"doc":{"_id":"bufferhelper","_rev":"3-74ab7dcc036a606f26302f49c864cadb","name":"bufferhelper","description":"Concat buffer correctly.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"author":{"name":"Jackson Tian","email":"shyvo1987@gmail.com","url":"http://weibo.com/shyvo"},"name":"bufferhelper","description":"Concat buffer correctly.","version":"0.1.0","homepage":"https://github.com/JacksonTian/bufferhelper","repository":{"type":"git","url":"git://github.com/JacksonTian/bufferhelper.git"},"main":"bufferhelper.js","engines":{"node":">= 0.4.0"},"dependencies":{},"devDependencies":{},"_npmUser":{"name":"jacksontian","email":"shyvo1987@gmail.com"},"_id":"bufferhelper@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"3ffdb893e648c5278737324ad66efcc5f90d7d9c","tarball":"http://registry.npmjs.org/bufferhelper/-/bufferhelper-0.1.0.tgz"},"maintainers":[{"name":"jacksontian","email":"shyvo1987@gmail.com"}]}},"readme":"Reason of written `bufferhelper`: [小心data事件里的chunk拼接](http://cnodejs.org/blog/?p=5425).\n\nInstall it via NPM:\n  \n    npm install bufferhelper\n\nUsage:\n\n    var http = require('http');\n    var BufferHelper = require('bufferhelper');\n  \n    http.createServer(function (request, response) {\n        var bufferHelper = new BufferHelper();\n    \n        request.on(\"data\", function (chunk) {\n            bufferHelper.concat(chunk);\n        });\n        request.on('end', function () {\n            var html = bufferHelper.toBuffer().toString();\n            response.writeHead(200);\n            response.end(html);\n        });\n  \n    }).listen(8001);\n\n","maintainers":[{"name":"jacksontian","email":"shyvo1987@gmail.com"}],"time":{"modified":"2012-06-15T15:00:35.655Z","created":"2012-06-15T15:00:30.844Z","0.1.0":"2012-06-15T15:00:35.655Z"},"author":{"name":"Jackson Tian","email":"shyvo1987@gmail.com","url":"http://weibo.com/shyvo"},"repository":{"type":"git","url":"git://github.com/JacksonTian/bufferhelper.git"},"_attachments":{"bufferhelper-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+GEGwpLNgCCFhLpE8tgSew==","length":1119,"stub":true}}}},
{"id":"bufferjoiner","key":"bufferjoiner","value":{"rev":"9-40cab832b99d9dff4f8abe0cdcd3777f"},"doc":{"_id":"bufferjoiner","_rev":"9-40cab832b99d9dff4f8abe0cdcd3777f","name":"bufferjoiner","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"bufferjoiner","main":"./lib/bufferjoiner.js","version":"0.1.0","repository":{"type":"git","url":"git://github.com/kilianc/node-bufferjoiner.git"},"author":"","_npmJsonOpts":{"file":"/Users/kilian/.npm/bufferjoiner/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bufferjoiner@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5d6766123f5d123075b56e320cc13f331df5d40d","tarball":"http://registry.npmjs.org/bufferjoiner/-/bufferjoiner-0.1.0.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.1.1":{"name":"bufferjoiner","main":"./lib/bufferjoiner.js","version":"0.1.1","repository":{"type":"git","url":"git://github.com/kilianc/node-bufferjoiner.git"},"author":"","_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"bufferjoiner@0.1.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.3","_defaultsLoaded":true,"dist":{"shasum":"bed982b63e2e020aa621657e544962e98dfa9b17","tarball":"http://registry.npmjs.org/bufferjoiner/-/bufferjoiner-0.1.1.tgz"},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.1.2":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"bufferjoiner","main":"./","description":"A nodejs binary buffer utility","keywords":["buffer","merge","join","binary"],"version":"0.1.2","repository":{"type":"git","url":"http://github.com/kilianc/node-bufferjoiner.git"},"devDependencies":{"mocha":"1.0.x","chai":"1.0.x"},"_id":"bufferjoiner@0.1.2","dist":{"shasum":"6c6205a7a9d4deefdbdea160dce1b41acb47cf5a","tarball":"http://registry.npmjs.org/bufferjoiner/-/bufferjoiner-0.1.2.tgz"},"readme":"","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.1.3":{"author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"name":"bufferjoiner","main":"./","description":"A nodejs binary buffer utility","keywords":["buffer","merge","join","binary"],"version":"0.1.3","repository":{"type":"git","url":"http://github.com/kilianc/node-bufferjoiner.git"},"devDependencies":{"mocha":"1.3.x","chai":"1.0.x"},"_id":"bufferjoiner@0.1.3","dist":{"shasum":"3fa544cc5728b455fefbc708218bfca900eb9481","tarball":"http://registry.npmjs.org/bufferjoiner/-/bufferjoiner-0.1.3.tgz"},"readme":"","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]}},"maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"time":{"modified":"2012-07-06T19:23:36.649Z","created":"2011-10-15T10:51:03.326Z","0.1.0":"2011-10-15T10:51:05.310Z","0.1.1":"2011-11-30T12:33:20.730Z","0.1.2":"2012-07-06T18:58:20.511Z","0.1.3":"2012-07-06T19:23:36.649Z"},"repository":{"type":"git","url":"http://github.com/kilianc/node-bufferjoiner.git"},"description":"A nodejs binary buffer utility","author":{"name":"Kilian Ciuffolo","email":"me@nailik.org","url":"http://nailik.org"},"_attachments":{"bufferjoiner-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-L+D1MHYeVzEOYG6ke+JJBw==","length":1953,"stub":true},"bufferjoiner-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-/gbpNSeFZZIDN0HqzNi6kA==","length":1887,"stub":true},"bufferjoiner-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Lq+9Y8l3SVNGD6CzMTmnbw==","length":10240,"stub":true},"bufferjoiner-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7morp42QB1wWDqJ/3porEg==","length":1630,"stub":true}}}},
{"id":"bufferjs","key":"bufferjs","value":{"rev":"20-828afad01c88f13c95f91a50e618c60d"},"doc":{"_id":"bufferjs","_rev":"20-828afad01c88f13c95f91a50e618c60d","name":"bufferjs","description":"Pure JavaScript Buffer utils.","dist-tags":{"latest":"1.1.0"},"versions":{"0.2.0":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"lib":"lib","main":"./lib/index","version":"0.2.0","_id":"bufferjs@0.2.0","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.3-6","_nodeVersion":"v0.2.0","dist":{"tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-0.2.0.tgz"},"directories":{}},"0.2.1":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[],"dependencies":{},"main":"./bufferjs/index","version":"0.2.1","_id":"bufferjs@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.18","_nodeVersion":"v0.4.1","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"debf8d102045266eeea77e530490faaa9ce1cc88","tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-0.2.1.tgz"}},"0.2.3":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"}],"dependencies":{},"version":"0.2.3","main":"./index","engines":{"node":">=0.2.0 <0.5.0"},"_id":"bufferjs@0.2.3","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"41226dd48542a5ff9c349ea34d932aa4e01e880d","tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-0.2.3.tgz"}},"1.0.0":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk","indexOf"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"}],"dependencies":{},"version":"1.0.0","main":"./index","engines":{"node":">=0.2.0 <0.5.0"},"_id":"bufferjs@1.0.0","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.2","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"242e9e2bffa964478edb21c87306e0023902e53d","tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-1.0.0.tgz"}},"1.0.1":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk","indexOf"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"}],"dependencies":{},"version":"1.0.1","main":"./index","engines":{"node":">=0.2.0"},"_id":"bufferjs@1.0.1","_engineSupported":true,"_npmVersion":"0.3.15","_nodeVersion":"v0.4.7","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8ec83e03e5e33d69023887a41de7f7b39f1683a8","tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-1.0.1.tgz"}},"1.0.2":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk","indexOf"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"}],"dependencies":{},"version":"1.0.2","main":"./index","engines":{"node":">=0.2.0"},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"bufferjs@1.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"25393a96bcbcf14aa3d5cbe99301d4af31a77737","tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-1.0.2.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]},"1.1.0":{"name":"bufferjs","description":"Pure JavaScript Buffer utils.","url":"http://github.com/coolaj86/node-bufferjs/","keywords":["util","buffer","concat","chunk","indexOf"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"contributors":[{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"Justin Freitag @justinfreitag"}],"dependencies":{},"version":"1.1.0","main":"./index","engines":{"node":">=0.2.0"},"_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"_id":"bufferjs@1.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"095ffa39c5e6b40a2178a1169c9effc584a73201","tarball":"http://registry.npmjs.org/bufferjs/-/bufferjs-1.1.0.tgz"},"readme":"","maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}]}},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"time":{"modified":"2012-08-02T13:34:18.895Z","created":"2011-01-11T21:55:28.998Z","0.2.0":"2011-01-11T21:55:29.328Z","0.2.1":"2011-02-27T17:59:45.532Z","0.2.3":"2011-03-23T02:33:51.054Z","1.0.0":"2011-03-28T19:43:36.109Z","1.0.1":"2011-05-18T22:08:42.296Z","1.0.2":"2012-02-16T17:04:42.236Z","1.1.0":"2012-03-05T03:29:05.577Z"},"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com"},"users":{"fgribreau":true},"_attachments":{"bufferjs-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-AYNFARQsOCwTZZqLZWy2Xg==","length":1289,"stub":true},"bufferjs-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-HRI34tZGGDTPLuIdhe9LAA==","length":1265,"stub":true},"bufferjs-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-xKBGKb7UJcDNf4wxJsR6AQ==","length":1303,"stub":true},"bufferjs-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hr8991CR0z2xmTpfTbTgWw==","length":1305,"stub":true},"bufferjs-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-O1BVSit27RPb9QwDir63cA==","length":1233,"stub":true},"bufferjs-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-yq5VkkVCR0fGkvvbXgIiHw==","length":963,"stub":true},"bufferjs-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yzgSYtp9cqcOquW2BSO07g==","length":2032,"stub":true}}}},
{"id":"bufferlib","key":"bufferlib","value":{"rev":"16-d48d96815fc7709d6b7d0a8bfc67f053"},"doc":{"_id":"bufferlib","_rev":"16-d48d96815fc7709d6b7d0a8bfc67f053","name":"bufferlib","description":"Set of classes to simplify reading and creating of Buffers","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"bufferlib","version":"0.0.1","description":"Set of classes to simplify reading and creating of Buffers","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"directories":{"lib":"./lib"},"main":"./lib/BufferLib","_id":"bufferlib@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlib/-/bufferlib-0.0.1.tgz"},"mtime":"2010-11-09T23:17:02Z","ctime":"2010-11-09T23:17:02Z"},"0.0.2":{"name":"bufferlib","version":"0.0.2","description":"Set of classes to simplify reading and creating of Buffers","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"directories":{"lib":"./lib"},"main":"./lib/BufferLib","_id":"bufferlib@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlib/-/bufferlib-0.0.2.tgz"},"mtime":"2010-11-09T23:17:02Z","ctime":"2010-11-09T23:17:02Z"},"0.0.3":{"name":"bufferlib","version":"0.0.3","description":"Set of classes to simplify reading and creating of Buffers","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"directories":{"lib":"./lib"},"main":"./lib/BufferLib","_id":"bufferlib@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlib/-/bufferlib-0.0.3.tgz"},"mtime":"2010-11-09T23:17:02Z","ctime":"2010-11-09T23:17:02Z"},"0.0.4":{"name":"bufferlib","version":"0.0.4","description":"Set of classes to simplify reading and creating of Buffers","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"directories":{"lib":"./lib"},"main":"./lib/BufferLib","_id":"bufferlib@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlib/-/bufferlib-0.0.4.tgz"},"mtime":"2010-11-09T23:17:02Z","ctime":"2010-11-09T23:17:02Z"},"0.0.5":{"name":"bufferlib","version":"0.0.5","description":"Set of classes to simplify reading and creating of Buffers","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"directories":{"lib":"./lib"},"main":"./lib/BufferLib","_id":"bufferlib@0.0.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlib/-/bufferlib-0.0.5.tgz"},"mtime":"2010-11-09T23:17:03Z","ctime":"2010-11-09T23:17:03Z"},"0.0.6":{"name":"bufferlib","version":"0.0.6","description":"Set of classes to simplify reading and creating of Buffers","engine":["node >=0.1.90"],"author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"directories":{"lib":"./lib"},"main":"./lib/BufferLib","_id":"bufferlib@0.0.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlib/-/bufferlib-0.0.6.tgz"},"mtime":"2010-11-09T23:17:03Z","ctime":"2010-11-09T23:17:03Z"}},"maintainers":[{"name":"frans-willem","email":"fw@hardijzer.nl"}],"mtime":"2010-11-09T23:17:03Z","ctime":"2010-11-09T23:17:02Z","author":{"name":"Frans-Willem Hardijzer","email":"fw@hardijzer.nl"},"repository":{"type":"git","url":"http://github.com/Frans-Willem/node-BufferLib.git"},"_attachments":{"bufferlib-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-aE8OFPEoE8UdjjYkF8RXcw==","length":4383,"stub":true},"bufferlib-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-PkkaCNYxxF8wHcGTsAyJOg==","length":4381,"stub":true},"bufferlib-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-a3/LBDc7rAxx7tZRN864FA==","length":4377,"stub":true},"bufferlib-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DT8yPOCmugE/eq1romhHsg==","length":4378,"stub":true},"bufferlib-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qDXJQ06En2XnjJmPtwIbnw==","length":4376,"stub":true},"bufferlib-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qloHLYKmXc8ACenOyI2eEw==","length":4345,"stub":true}}}},
{"id":"bufferlist","key":"bufferlist","value":{"rev":"19-8ff10468a8a80b31cfec198f589dae04"},"doc":{"_id":"bufferlist","_rev":"19-8ff10468a8a80b31cfec198f589dae04","name":"bufferlist","description":"Create linked lists of Buffer objects","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"bufferlist","version":"0.0.1","description":"Create linked lists of Buffer objects","author":{"name":"James Halliday","url":"mail@substack.net"},"directories":{"lib":"./lib"},"main":"bufferlist","repository":{"type":"git","url":"http://github.com/substack/node-bufferlist.git"},"engine":["node >=0.1.97"],"_id":"bufferlist@0.0.1","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlist/-/bufferlist-0.0.1.tgz"}},"0.0.2":{"name":"bufferlist","version":"0.0.2","description":"Create linked lists of Buffer objects","directories":{"lib":"./lib"},"main":"./bufferlist","repository":{"type":"git","url":"http://github.com/substack/node-bufferlist.git"},"engine":["node >=0.1.97"],"_id":"bufferlist@0.0.2","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlist/-/bufferlist-0.0.2.tgz"}},"0.0.3":{"name":"bufferlist","version":"0.0.3","description":"Create linked lists of Buffer objects","directories":{"lib":"./lib"},"main":"./bufferlist","repository":{"type":"git","url":"http://github.com/substack/node-bufferlist.git"},"engine":["node >=0.1.97"],"_id":"bufferlist@0.0.3","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlist/-/bufferlist-0.0.3.tgz"}},"0.0.4":{"name":"bufferlist","version":"0.0.4","description":"Create linked lists of Buffer objects","directories":{"lib":"./lib"},"main":"./bufferlist","repository":{"type":"git","url":"http://github.com/substack/node-bufferlist.git"},"engine":["node >=0.1.97"],"_id":"bufferlist@0.0.4","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.7-2","_nodeVersion":"v0.3.1-pre","dist":{"tarball":"http://packages:5984/bufferlist/-/bufferlist-0.0.4.tgz"}},"0.0.5":{"name":"bufferlist","version":"0.0.5","description":"Create linked lists of Buffer objects","directories":{"lib":"./lib"},"main":"./bufferlist","repository":{"type":"git","url":"http://github.com/substack/node-bufferlist.git"},"engine":["node >=0.1.97"],"_id":"bufferlist@0.0.5","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.10-1","_nodeVersion":"v0.2.5","dist":{"shasum":"cc80be28e406844af774ad186eb4147ccf926667","tarball":"http://registry.npmjs.org/bufferlist/-/bufferlist-0.0.5.tgz"}},"0.0.6":{"name":"bufferlist","version":"0.0.6","description":"Create linked lists of Buffer objects","directories":{"lib":"./lib"},"main":"./bufferlist","repository":{"type":"git","url":"http://github.com/substack/node-bufferlist.git"},"devDependencies":{"expresso":">= 0.7.2"},"scripts":{"test":"expresso"},"engine":["node >=0.1.97"],"_id":"bufferlist@0.0.6","engines":{"node":"*"},"_nodeSupported":true,"_npmVersion":"0.2.12-1","_nodeVersion":"v0.2.5","dist":{"shasum":"6206331ab3e23091b703e1fbfe7796a90e615320","tarball":"http://registry.npmjs.org/bufferlist/-/bufferlist-0.0.6.tgz"}},"0.1.0":{"name":"bufferlist","version":"0.1.0","description":"Create linked lists of Buffer objects","directories":{"lib":"."},"main":"./bufferlist","repository":{"type":"git","url":"git://github.com/substack/node-bufferlist.git"},"devDependencies":{"expresso":">= 0.7.2"},"scripts":{"test":"expresso"},"engine":["node >=0.1.97"],"dependencies":{},"_id":"bufferlist@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"42bef2d89573b40fa1086bb39e0f5310170d1ddd","tarball":"http://registry.npmjs.org/bufferlist/-/bufferlist-0.1.0.tgz"}}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"author":{"name":"James Halliday","url":"mail@substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-bufferlist.git"},"time":{"modified":"2011-11-14T21:33:28.024Z","created":"2010-12-31T13:10:52.685Z","0.0.1":"2010-12-31T13:10:52.685Z","0.0.2":"2010-12-31T13:10:52.685Z","0.0.3":"2010-12-31T13:10:52.685Z","0.0.4":"2010-12-31T13:10:52.685Z","0.0.5":"2010-12-31T13:10:52.685Z","0.0.6":"2010-12-31T13:10:52.685Z","0.1.0":"2011-04-17T23:30:33.283Z"},"users":{"astro":true},"_attachments":{"bufferlist-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-i2aaWN63hz89OOGghsmlsg==","length":10426,"stub":true},"bufferlist-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-f3WI9ZLxuM4oKCUcA9QR5A==","length":10768,"stub":true},"bufferlist-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-gg3HforMlR6TyqiOERcNuw==","length":10455,"stub":true},"bufferlist-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Mvf4zPpSINqyxF4UAZ36Ag==","length":16019,"stub":true},"bufferlist-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-eVQwpdIJhwasIjDuW83CgA==","length":10371,"stub":true},"bufferlist-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WukXEa1UCSX5mTC3sn8abw==","length":11573,"stub":true},"bufferlist-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qtSt3H7g8jHpyqGFu0FooA==","length":11532,"stub":true}}}},
{"id":"bufferpack","key":"bufferpack","value":{"rev":"13-abcadaf24c62e42dd9b73e2c5785af0a"},"doc":{"_id":"bufferpack","_rev":"13-abcadaf24c62e42dd9b73e2c5785af0a","name":"bufferpack","description":"Module to pack/unpack primitives and c strings into/out of a Node.js buffer","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"author":{"name":"https://github.com/pgriess"},"name":"bufferpack","description":"Module to pack primitives and c strings to a Node.js buffer","version":"0.0.1","keywords":["jspack","buffer","octet","primitive","c string"],"homepage":"https://github.com/ryanrolds/node-jspack","repository":{"type":"git","url":"git://github.com/ryanrolds/node-jspack.git"},"main":"./jspack.js","maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"devDependencies":{"mocha":"= 0.10.2","should":"= 0.5.1"},"scripts":{"test":"./node_modules/.bin/mocha test/*.test.js --reporter spec"},"_npmUser":{"name":"ryanrolds","email":"ryanrolds@gmail.com"},"_id":"bufferpack@0.0.1","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"d0895b8876fe887b4bf08ddcea6ece8dc373d7c5","tarball":"http://registry.npmjs.org/bufferpack/-/bufferpack-0.0.1.tgz"},"readme":""},"0.0.2":{"author":{"name":"https://github.com/pgriess"},"name":"bufferpack","description":"Module to pack primitives and c strings to a Node.js buffer","version":"0.0.2","keywords":["jspack","buffer","octet","primitive","c string"],"homepage":"https://github.com/ryanrolds/bufferpack","repository":{"type":"git","url":"git://github.com/ryanrolds/bufferpack.git"},"main":"./jspack.js","maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"devDependencies":{"mocha":"= 0.10.2","should":"= 0.5.1"},"scripts":{"test":"./node_modules/.bin/mocha test/*.test.js --reporter spec"},"_npmUser":{"name":"ryanrolds","email":"ryanrolds@gmail.com"},"_id":"bufferpack@0.0.2","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"adde45c85be07b32131b644f27797c42a878aa5a","tarball":"http://registry.npmjs.org/bufferpack/-/bufferpack-0.0.2.tgz"},"readme":""},"0.0.3":{"name":"bufferpack","description":"Module to pack/unpack primitives and c strings into/out of a Node.js buffer","version":"0.0.3","keywords":["jspack","buffer","octet","primitive","string"],"homepage":"https://github.com/ryanrolds/bufferpack","repository":{"type":"git","url":"git://github.com/ryanrolds/bufferpack.git"},"main":"./bufferpack.js","author":{"name":"Ryan Olds","email":"ryanrolds@gmail.com"},"maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"devDependencies":{"mocha":"= 0.10.2","should":"= 0.5.1"},"scripts":{"test":"./node_modules/.bin/mocha test/*.test.js --reporter spec"},"_npmUser":{"name":"ryanrolds","email":"ryanrolds@gmail.com"},"_id":"bufferpack@0.0.3","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"c81c450bdf1f1cd47412d5f630dcc87eeed0e6fd","tarball":"http://registry.npmjs.org/bufferpack/-/bufferpack-0.0.3.tgz"},"readme":""},"0.0.4":{"name":"bufferpack","description":"Module to pack/unpack primitives and c strings into/out of a Node.js buffer","version":"0.0.4","keywords":["jspack","buffer","octet","primitive","string"],"homepage":"https://github.com/ryanrolds/bufferpack","repository":{"type":"git","url":"git://github.com/ryanrolds/bufferpack.git"},"main":"./bufferpack.js","author":{"name":"Ryan Olds","email":"ryanrolds@gmail.com"},"maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"devDependencies":{"mocha":"= 0.10.2","should":"= 0.5.1"},"scripts":{"test":"./node_modules/.bin/mocha test/*.test.js --reporter spec"},"_npmUser":{"name":"ryanrolds","email":"ryanrolds@gmail.com"},"_id":"bufferpack@0.0.4","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"270a34cd108510d4ede9c5bfd7fb47f395885f46","tarball":"http://registry.npmjs.org/bufferpack/-/bufferpack-0.0.4.tgz"},"readme":""},"0.0.5":{"name":"bufferpack","description":"Module to pack/unpack primitives and c strings into/out of a Node.js buffer","version":"0.0.5","keywords":["jspack","buffer","octet","primitive","string"],"homepage":"https://github.com/ryanrolds/bufferpack","repository":{"type":"git","url":"git://github.com/ryanrolds/bufferpack.git"},"main":"./bufferpack.js","author":{"name":"Ryan Olds","email":"ryanrolds@gmail.com"},"maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"devDependencies":{"mocha":"= 0.10.2","should":"= 0.5.1"},"scripts":{"test":"./node_modules/.bin/mocha test/*.test.js --reporter spec"},"_npmUser":{"name":"ryanrolds","email":"ryanrolds@gmail.com"},"_id":"bufferpack@0.0.5","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"bd54c19806b0958169902bb50b901038a24aa288","tarball":"http://registry.npmjs.org/bufferpack/-/bufferpack-0.0.5.tgz"},"readme":""},"0.0.6":{"name":"bufferpack","description":"Module to pack/unpack primitives and c strings into/out of a Node.js buffer","version":"0.0.6","keywords":["jspack","buffer","octet","primitive","string"],"homepage":"https://github.com/ryanrolds/bufferpack","repository":{"type":"git","url":"git://github.com/ryanrolds/bufferpack.git"},"main":"./bufferpack.js","author":{"name":"Ryan Olds","email":"ryanrolds@gmail.com"},"maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"devDependencies":{"mocha":"= 0.10.2","should":"= 0.5.1"},"scripts":{"test":"./node_modules/.bin/mocha test/*.test.js --reporter spec"},"_npmUser":{"name":"ryanrolds","email":"ryanrolds@gmail.com"},"_id":"bufferpack@0.0.6","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fb3d8738a0e1e4e03bcff99f9a75f9ec18a9d73e","tarball":"http://registry.npmjs.org/bufferpack/-/bufferpack-0.0.6.tgz"},"readme":""}},"readme":"","maintainers":[{"name":"ryanrolds","email":"ryanrolds@gmail.com"}],"time":{"modified":"2012-01-25T22:11:17.609Z","created":"2012-01-23T00:57:36.112Z","0.0.1":"2012-01-23T00:57:36.929Z","0.0.2":"2012-01-23T01:08:54.263Z","0.0.3":"2012-01-23T05:05:45.011Z","0.0.4":"2012-01-23T05:20:24.077Z","0.0.5":"2012-01-23T05:31:40.309Z","0.0.6":"2012-01-25T22:11:17.609Z"},"author":{"name":"Ryan Olds","email":"ryanrolds@gmail.com"},"repository":{"type":"git","url":"git://github.com/ryanrolds/bufferpack.git"},"_attachments":{"bufferpack-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-bxwXtcFaCmDOVOgCesE79A==","length":4455,"stub":true},"bufferpack-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-qznW4T5FP47ypNyuDLcY5Q==","length":4321,"stub":true},"bufferpack-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ZHJdFnHAHbfjkHDcS8pYpg==","length":4315,"stub":true},"bufferpack-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0P2yXaujIXDoDnEIFmmBdA==","length":4312,"stub":true},"bufferpack-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SxQqhr+JvlKyZHAafZVHdg==","length":4133,"stub":true},"bufferpack-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6VnrvpEqLS5GalCBnOslEQ==","length":4139,"stub":true}}}},
{"id":"buffers","key":"buffers","value":{"rev":"13-a25a1488a55a342e6f0e156fb7656984"},"doc":{"_id":"buffers","_rev":"13-a25a1488a55a342e6f0e156fb7656984","name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.1":{"name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","version":"0.0.1","repository":"http://github.com/substack/node-buffers.git","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"main":"./index","scripts":{"test":"expresso"},"engines":{"node":">=0.2.0"},"_id":"buffers@0.0.1","_engineSupported":true,"_npmVersion":"0.2.16","_nodeVersion":"v0.3.8-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"af02dd9d29723db67bf69ade28b6881e5ae1b39a","tarball":"http://registry.npmjs.org/buffers/-/buffers-0.0.1.tgz"}},"0.0.2":{"name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","version":"0.0.2","repository":{"type":"git","url":"git://github.com/substack/node-buffers.git"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"main":"./index","scripts":{"test":"expresso"},"engines":{"node":">=0.2.0"},"dependencies":{},"devDependencies":{},"_id":"buffers@0.0.2","_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"4d5db52dd754c66105f811eba0aa03f1438f1076","tarball":"http://registry.npmjs.org/buffers/-/buffers-0.0.2.tgz"}},"0.0.3":{"name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","version":"0.0.3","repository":{"type":"git","url":"git://github.com/substack/node-buffers.git"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"main":"./index","scripts":{"test":"expresso"},"engines":{"node":">=0.2.0"},"dependencies":{},"devDependencies":{},"_id":"buffers@0.0.3","_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"bf9038fda7cad84ab178bfbdae294f7a68da449b","tarball":"http://registry.npmjs.org/buffers/-/buffers-0.0.3.tgz"}},"0.0.4":{"name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","version":"0.0.4","repository":{"type":"git","url":"git://github.com/substack/node-buffers.git"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"main":"./index","scripts":{"test":"expresso"},"engines":{"node":">=0.2.0"},"dependencies":{},"devDependencies":{},"_id":"buffers@0.0.4","_engineSupported":true,"_npmVersion":"1.0.1rc9","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f30f1b236cc4760fb3ce26f15d0d41bb137568d4","tarball":"http://registry.npmjs.org/buffers/-/buffers-0.0.4.tgz"}},"0.1.0":{"name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/substack/node-buffers.git"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"main":"./index","scripts":{"test":"expresso"},"engines":{"node":">=0.2.0"},"_id":"buffers@0.1.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5a08e9366c9d160e4c135e77064393a5c0d8db73","tarball":"http://registry.npmjs.org/buffers/-/buffers-0.1.0.tgz"}},"0.1.1":{"name":"buffers","description":"Treat a collection of Buffers as a single contiguous partially mutable Buffer.","version":"0.1.1","repository":{"type":"git","url":"git://github.com/substack/node-buffers.git"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"main":"./index","scripts":{"test":"expresso"},"engines":{"node":">=0.2.0"},"_npmJsonOpts":{"file":"/home/substack/.npm/buffers/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buffers@0.1.1","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb","tarball":"http://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2011-10-12T23:33:33.118Z","created":"2011-02-06T12:28:07.644Z","0.0.1":"2011-02-06T12:28:07.983Z","0.0.2":"2011-04-28T04:36:43.582Z","0.0.3":"2011-05-01T07:59:03.851Z","0.0.4":"2011-05-01T08:37:09.246Z","0.1.0":"2011-06-30T01:24:43.791Z","0.1.1":"2011-10-12T23:33:33.118Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-buffers.git"},"_attachments":{"buffers-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-gzyrdOzqV5Au2Hth8acvtg==","length":4195,"stub":true},"buffers-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-uWI7t1ROT3yP0Eoo8HfYaQ==","length":4092,"stub":true},"buffers-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-9wm85vqjIqKWi672eK5lQQ==","length":3313,"stub":true},"buffers-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-asvMPi0nan31qstGxc9mBA==","length":3272,"stub":true},"buffers-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NyL8dl+YW+PbWLtVyMHWFw==","length":2965,"stub":true},"buffers-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-92e39TrA847X2ctzpPnsjw==","length":2984,"stub":true}}}},
{"id":"bufferstream","key":"bufferstream","value":{"rev":"100-dd49477dce4d7ea3242734c4c550ff44"},"doc":{"_id":"bufferstream","_rev":"100-dd49477dce4d7ea3242734c4c550ff44","name":"bufferstream","description":"painless stream buffering and cutting","dist-tags":{"latest":"0.5.1"},"versions":{"0.0.2":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.0.2","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"node-waf configure","install":"node-waf build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"4247e2d10d6288a63a694a1a9cd6a1589ded5137","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.38-2-amd64":{"shasum":"52d72294884ca6f3d514469e78c95333da293aa0","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.0.2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.38-2-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.0.2.tgz"},"directories":{}},"0.0.3":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.0.3","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"node-waf configure build","install":"node-waf build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.0.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"ecb7438ba50ba07a2bbdc038756a998c1b163677","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.38-2-amd64":{"shasum":"c78f022bd5b8874860420baafa8f7b8e97700691","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.0.3-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.38-2-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.0.3.tgz"},"directories":{}},"0.1.0":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.0","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"node-waf configure","install":"node-waf build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"1960dd9c5ca0334c2c23419add9012e9f2c65af8","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.0.tgz"},"directories":{}},"0.1.1":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.1","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e75a4ee9ff46abd9542e295f0ce5fe8f7fb87d05","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"bbea932ebcc14d65982307d20aeac6f520e5b0a8","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.1-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.1.tgz"},"directories":{}},"0.1.2":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"347cd6af0514cab5df2c1cf2ebd06d3b4ae539ac","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"8ab968f124cd456bd8e24d5b7b4a86fd7cd239d8","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2.tgz"},"directories":{}},"0.1.2-1":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2-1","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"postinstall":"node-waf configure build","update":"node-waf build","preinstall":"node-waf clean || true; node-waf configure build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2-1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"ccc5bc4f2847d779451a8d8a217c35924579779a","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-1.tgz"},"directories":{}},"0.1.2-2":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2-2","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2-2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"d77b7e26b9b26f4fbe5a3e0f3cf992ab6ecb5d40","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"db0c830aa050b5daa73be660e91f6b879f0972d7","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-2.tgz"},"directories":{}},"0.1.2-3":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2-3","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","postinstall":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2-3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"706dd63589e24f7887aefc37ea551d726fd0c2c6","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"928101f9f18f594ce902ade94f5ee70bf27ea615","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-3-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-3.tgz"},"directories":{}},"0.1.2-4":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2-4","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2-4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"6f28408b9aefdf09a2e7274727291c677ebc0a94","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"954aba896fd1e1f3c93c37e9189c8176f686fc59","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-4-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-4.tgz"},"directories":{}},"0.1.2-5":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2-5","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"config":{"force":true},"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2-5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0e961477a8372205875c5ad4007593fd2de3fa9f","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"3b2c6b0135f9da24614b27fdd5419b3a526bd861","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-5-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-5.tgz"},"directories":{}},"0.1.2-6":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.2-6","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","postinstall":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.2-6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"36a87e1c07846f6786c543e6c4bc36bed1bb1fdf","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"3f2c7f4f5593d89e97efef95632ea1c9153ea04f","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-6-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.2-6.tgz"},"directories":{}},"0.1.3":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.3","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"devDependencies":{},"_id":"bufferstream@0.1.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"df1546fd70dd40ec0e23b8ddfcbe839ca42c4f9e","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"1450ce53b165336d60c1b44a896bd454f5beaf89","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.3-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.3.tgz"},"directories":{}},"0.1.4":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.4","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"_id":"bufferstream@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"1ee5ea5eae1c5c2ef083e4f3e09d417b5a3a5827","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"dc51d64f288f59ddee79791b9b256cf1da937d0c","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.4-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.4.tgz"},"directories":{}},"0.1.5":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.5","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"_id":"bufferstream@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"184c7fd10122f5f8acb9f58ea789e5f0a5079187","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"d329e4b30be09273c84b9deb6d88998a5e50148d","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.5-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.5.tgz"},"directories":{}},"0.1.6":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.1.6","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"_id":"bufferstream@0.1.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"a643888f1a830558f48278e7d4a8f0a5e2ea4931","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"9a3078065236c27ee0798dbbba77cd151b0bcb77","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.6-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.1.6.tgz"},"directories":{}},"0.2.0":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.2.0","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"_id":"bufferstream@0.2.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"38b0e7d30d37d25a4cc58567bb6cba66ec483591","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"ebdb6860594c7c2e97d983a7a7eb44d38ad40b80","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.2.0-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.2.0.tgz"},"directories":{}},"0.3.0":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.3.0","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.1"},"_id":"bufferstream@0.3.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"8af55a44783918767716a586a3d151a86489a418","bin":{"0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64":{"shasum":"c1678f3ff7622bfad6ffa45bd524473b33d4e14d","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.3.0-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz"}},"tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.3.0.tgz"},"directories":{}},"0.4.0":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.0","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.0","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"3a2394dc0d7f4db8ea936af7f5dbc421141aea4e","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.0.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.1":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.1","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.1","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"1e5688e87416d373c678318fa98f7fef435908bd","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.1.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.2":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.2","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.2","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"06542b70ca5b7508d5b35602b8f94ba2750ce7a1","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.2.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.3":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.3","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.3","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"66e4c9a7e8a7d4ce4d5e2bba03f87c667e163252","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.3.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.4":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.4","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.4","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"db4eeabb40881dc92be4ab45382c8d5c3ec9bf65","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.4.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.5":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.5","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.5","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"f51f0d514693585835e20f01c8f5f9d25f48bf0e","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.5.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.6":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.6","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.6","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"ef889c61a5e43d32166c0b184c959d0617bbd0ff","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.6.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.7":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.7","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_id":"bufferstream@0.4.7","_engineSupported":true,"_npmVersion":"1.0.11","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d5451c527af0ad471e380afea1f0502226bf6333","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.7.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.8":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.8","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.4.8","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"59fcea1329e6aeeb7fc6d2c283d035974c661a47","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.8.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.9":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.9","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":"0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"./benchmark","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.4.9","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2056d7add1ffeed642f3cb0899a5b71952d54620","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.9.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"directories":{}},"0.4.10":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.4.10","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":">= 0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"node-waf build && nodeunit test","preinstall":"#preinstall DO NOTHING","install":"node-waf configure build","update":"node-waf build"},"dependencies":{"buffertools":">= 1.0.3","coffee-script":">= 1.1.2"},"devDependencies":{"nodeunit":">= 0.6.4","cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.4.10","_engineSupported":true,"_npmVersion":"1.0.101","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"7eb6b686566591cfd2e4b4921aa8715728ec6c09","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.4.10.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.5.0-pre":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.5.0-pre","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":">= 0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"dependencies":{"buffertools":">= 1.0.3","valvestream":">= 0.0.0"},"devDependencies":{"nodeunit":">= 0.5.4","muffin":">= 0.2.6","coffee-script":">= 1.1.2","cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.5.0-pre","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d190f63d142f1f32dea87af1afa770f3c8e34003","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.5.0-pre.tgz"},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.5.0-pre2":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.5.0-pre2","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":">= 0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"dependencies":{"buffertools":">= 1.0.3","valvestream":">= 0.0.1"},"devDependencies":{"nodeunit":">= 0.5.4","muffin":">= 0.2.6","coffee-script":">= 1.1.2","cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.5.0-pre2","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8ad9a58ca9e08729e2cef7d299b25a8436eb7cbb","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.5.0-pre2.tgz"},"readme":"# BufferStream\n\npainless stream buffering, cutting and piping.\n\n## install\n\n    npm install bufferstream\n\n## api\n\nBufferStream is a full node.js [Stream](http://nodejs.org/docs/v0.4.7/api/streams.html) so it has apis of both [Writeable Stream](http://nodejs.org/docs/v0.4.7/api/streams.html#writable_Stream) and [Readable Stream](http://nodejs.org/docs/v0.4.7/api/streams.html#readable_Stream).\n\n### BufferStream\n\n```javascript\nBufferStream = require('bufferstream')\nstream = new BufferStream([{encoding:'utf8', size:'none'}]) // default\n```\n * `encoding` default encoding for writing strings\n * `size` defines buffer level or sets buffer to given size (see ↓`setSize` for more)\n * `disabled` immediately call disable\n * `split` short form for:\n\n```javascript\nstream.split(token, function (chunk) {stream.emit('data', chunk)})\n```\n\n### stream.setSize\n\n```javascript\nstream.setSize(size) // can be one of ['none', 'flexible', <number>]\n```\n\ndifferent buffer behaviors can be triggered by size:\n\n * `none` when output drains, bufferstream drains too\n * `flexible` buffers everthing that it gets and not piping out\n * `<number>` `TODO` buffer has given size. buffers everthing until buffer is full. when buffer is full then  the stream will drain\n\n### stream.enable\n\n```javascript\nstream.enable()\n```\n\nenables stream buffering __default__\n\n### stream.disable\n\n```javascript\nstream.disable()\n```\n\nflushes buffer and disables stream buffering.\nBufferStream now pipes all data as long as the output accepting data.\nwhen the output is draining BufferStream will buffer all input temporary.\n\n```javascript\nstream.disable(token, ...)\nstream.disable(tokens) // Array\n```\n * `token[s]` buffer splitters (should be String or Buffer)\n\ndisables given tokens. wont flush until no splitter tokens are left.\n\n### stream.split\n\n```javascript\nstream.split(token, ...)\nstream.split(tokens) // Array\n```\n * `token[s]` buffer splitters (should be String or Buffer)\n\neach time BufferStream finds a splitter token in the input data it will emit a __split__ event.\nthis also works for binary data.\n\n### Event: 'split'\n\n```javascript\nstream.on('split', function (chunk, token) {…})\nstream.split(token, function (chunk, token) {…}) // only get called for this particular token\n```\n\nwhenever the stream is enabled it will try to find all splitter token in `stream.buffer`,\ncut it off and emit the chunk (without token) as __split__ event.\nthis data will be lost when not handled.\n\nthe chunk is the cut off of `stream.buffer` without the token.\n\n__Warning:__ try to avoid calling `stream.emit('data', newchunk)` more than one time, because this will likely throw `Error: Offset is out of bounds`.\n\n### stream.getBuffer\n\n```javascript\nstream.getBuffer()\n// or just\nstream.buffer\n```\n\nreturns its [Buffer](http://nodejs.org/docs/v0.4.7/api/buffers.html).\n\n### stream.toString\n\n```javascript\nstream.toString()\n```\n\nshortcut for `stream.buffer.toString()`\n\n### stream.length\n\n```javascript\nstream.length\n```\n\nshortcut for `stream.buffer.length`\n\n### PostBuffer\n\n```javascript\nPostBuffer = require('bufferstream/postbuffer')\npost = new PostBuffer(req)\n```\n * `req` http.ServerRequest\n\nfor if you want to get all the post data from a http server request and do some db reqeust before.\n\nbuffer http client\n\n### post.onEnd\n\n```javascript\npost.onEnd(function (data) {…});\n```\n\nset a callback to get all post data from a http server request\n\n### post.pipe\n\n```javascript\npost.pipe(stream, options);\n```\n\npumps data into another stream to allow incoming streams\ngiven options will be passed to Stream.pipe\n\n## example\n\n```javascript\nBufferStream = require('bufferstream')\nstream = new BufferStream({encoding:'utf8', size:'flexible'})\nstream.split('//', ':')\nstream.on('split', function (chunk, token) {\n    console.log(\"got '%s' by '%s'\", chunk.toString(), token.toString())\n})\nstream.write(\"buffer:stream//23\")\nconsole.log(stream.toString())\n```\n\nresults in\n\n    got 'buffer' by ':'\n    got 'stream' by '//'\n    23\n\n* https://github.com/dodo/node-bufferstream/blob/master/example/split.js\n\n## FAQ\n\n> I'm not sure from your readme what the split event emits?\n\nyou can specify more than one split token .. so it's emitted whenever\na token is found.\n\n> does it emit the buffer up to the just before the token starts?\n\nyes.\n\n> also, does it join buffers together if they do not already end in a token?\n\nwhen size is `flexible` it joins everything together what it gets to\none buffer (accessible through `stream.buffer` or\n`stream.getBuffer()`)\nwhenever it gets data, it will try to find all tokens\n\n> in other words, can I use this to rechunk a stream so that the chunks always break on newlines, for example?\n\nyes.\n\n```javascript\nstream = new BufferStream({size:'flexible'});\nstream.split('\\n', function (line) { // line doesn't have a '\\n' anymore\n    stream.emit('data', line); // Buffer.isBuffer(line) === true\n});\n```\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-bufferstream.png)](http://travis-ci.org/dodo/node-bufferstream)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.5.0":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.5.0","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":">= 0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"dependencies":{"buffertools":">= 1.0.3"},"devDependencies":{"nodeunit":">= 0.5.4","muffin":">= 0.2.6","coffee-script":">= 1.1.2","cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.5.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"14f3481074fbf176f4959b3a50d0d475fda41a3f","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.5.0.tgz"},"readme":"# BufferStream\n\npainless stream buffering, cutting and piping.\n\n## install\n\n    npm install bufferstream\n\n## api\n\nBufferStream is a full node.js [Stream](http://nodejs.org/docs/v0.4.7/api/streams.html) so it has apis of both [Writeable Stream](http://nodejs.org/docs/v0.4.7/api/streams.html#writable_Stream) and [Readable Stream](http://nodejs.org/docs/v0.4.7/api/streams.html#readable_Stream).\n\n### BufferStream\n\n```javascript\nBufferStream = require('bufferstream')\nstream = new BufferStream([{encoding:'utf8', size:'none'}]) // default\n```\n * `encoding` default encoding for writing strings\n * `size` defines buffer level or sets buffer to given size (see ↓`setSize` for more)\n * `disabled` immediately call disable\n * `split` short form for:\n\n```javascript\nstream.split(token, function (chunk) {stream.emit('data', chunk)})\n```\n\n### stream.setSize\n\n```javascript\nstream.setSize(size) // can be one of ['none', 'flexible', <number>]\n```\n\ndifferent buffer behaviors can be triggered by size:\n\n * `none` when output drains, bufferstream drains too\n * `flexible` buffers everthing that it gets and not piping out\n * `<number>` `TODO` buffer has given size. buffers everthing until buffer is full. when buffer is full then  the stream will drain\n\n### stream.enable\n\n```javascript\nstream.enable()\n```\n\nenables stream buffering __default__\n\n### stream.disable\n\n```javascript\nstream.disable()\n```\n\nflushes buffer and disables stream buffering.\nBufferStream now pipes all data as long as the output accepting data.\nwhen the output is draining BufferStream will buffer all input temporary.\n\n```javascript\nstream.disable(token, ...)\nstream.disable(tokens) // Array\n```\n * `token[s]` buffer splitters (should be String or Buffer)\n\ndisables given tokens. wont flush until no splitter tokens are left.\n\n### stream.split\n\n```javascript\nstream.split(token, ...)\nstream.split(tokens) // Array\n```\n * `token[s]` buffer splitters (should be String or Buffer)\n\neach time BufferStream finds a splitter token in the input data it will emit a __split__ event.\nthis also works for binary data.\n\n### Event: 'split'\n\n```javascript\nstream.on('split', function (chunk, token) {…})\nstream.split(token, function (chunk, token) {…}) // only get called for this particular token\n```\n\nwhenever the stream is enabled it will try to find all splitter token in `stream.buffer`,\ncut it off and emit the chunk (without token) as __split__ event.\nthis data will be lost when not handled.\n\nthe chunk is the cut off of `stream.buffer` without the token.\n\n__Warning:__ try to avoid calling `stream.emit('data', newchunk)` more than one time, because this will likely throw `Error: Offset is out of bounds`.\n\n### stream.getBuffer\n\n```javascript\nstream.getBuffer()\n// or just\nstream.buffer\n```\n\nreturns its [Buffer](http://nodejs.org/docs/v0.4.7/api/buffers.html).\n\n### stream.toString\n\n```javascript\nstream.toString()\n```\n\nshortcut for `stream.buffer.toString()`\n\n### stream.length\n\n```javascript\nstream.length\n```\n\nshortcut for `stream.buffer.length`\n\n### PostBuffer\n\n```javascript\nPostBuffer = require('bufferstream/postbuffer')\npost = new PostBuffer(req)\n```\n * `req` http.ServerRequest\n\nfor if you want to get all the post data from a http server request and do some db reqeust before.\n\nbuffer http client\n\n### post.onEnd\n\n```javascript\npost.onEnd(function (data) {…});\n```\n\nset a callback to get all post data from a http server request\n\n### post.pipe\n\n```javascript\npost.pipe(stream, options);\n```\n\npumps data into another stream to allow incoming streams\ngiven options will be passed to Stream.pipe\n\n## example\n\n```javascript\nBufferStream = require('bufferstream')\nstream = new BufferStream({encoding:'utf8', size:'flexible'})\nstream.split('//', ':')\nstream.on('split', function (chunk, token) {\n    console.log(\"got '%s' by '%s'\", chunk.toString(), token.toString())\n})\nstream.write(\"buffer:stream//23\")\nconsole.log(stream.toString())\n```\n\nresults in\n\n    got 'buffer' by ':'\n    got 'stream' by '//'\n    23\n\n* https://github.com/dodo/node-bufferstream/blob/master/example/split.js\n\n## FAQ\n\n> I'm not sure from your readme what the split event emits?\n\nyou can specify more than one split token .. so it's emitted whenever\na token is found.\n\n> does it emit the buffer up to the just before the token starts?\n\nyes.\n\n> also, does it join buffers together if they do not already end in a token?\n\nwhen size is `flexible` it joins everything together what it gets to\none buffer (accessible through `stream.buffer` or\n`stream.getBuffer()`)\nwhenever it gets data, it will try to find all tokens\n\n> in other words, can I use this to rechunk a stream so that the chunks always break on newlines, for example?\n\nyes.\n\n```javascript\nstream = new BufferStream({size:'flexible'});\nstream.split('\\n', function (line) { // line doesn't have a '\\n' anymore\n    stream.emit('data', line); // Buffer.isBuffer(line) === true\n});\n```\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-bufferstream.png)](http://travis-ci.org/dodo/node-bufferstream)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]},"0.5.1":{"name":"bufferstream","description":"painless stream buffering and cutting","version":"0.5.1","homepage":"https://github.com/dodo/node-bufferstream","author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"main":"bufferstream.js","engines":{"node":">= 0.4.x"},"keywords":["buffer","buffers","stream","streams"],"scripts":{"test":"cake build && nodeunit test","prepublish":"cake build"},"dependencies":{"buffertools":">= 1.0.3"},"devDependencies":{"nodeunit":">= 0.5.4","muffin":">= 0.2.6","coffee-script":">= 1.1.2","cli":">= 0.3.7","express":">= 2.4.5"},"_npmUser":{"name":"dodo","email":"dodo@blacksec.org"},"_id":"bufferstream@0.5.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"6208e711a2439ed306d1ae3d2ae9471a880390bf","tarball":"http://registry.npmjs.org/bufferstream/-/bufferstream-0.5.1.tgz"},"readme":"# BufferStream\n\npainless stream buffering, cutting and piping.\n\n## install\n\n    npm install bufferstream\n\n## api\n\nBufferStream is a full node.js [Stream](http://nodejs.org/docs/v0.4.7/api/streams.html) so it has apis of both [Writeable Stream](http://nodejs.org/docs/v0.4.7/api/streams.html#writable_Stream) and [Readable Stream](http://nodejs.org/docs/v0.4.7/api/streams.html#readable_Stream).\n\n### BufferStream\n\n```javascript\nBufferStream = require('bufferstream')\nstream = new BufferStream([{encoding:'utf8', size:'none'}]) // default\n```\n * `encoding` default encoding for writing strings\n * `blocking` if true and the source is a child_process the stream will block the entire process (timeouts wont work anymore, but splitting and listening on data still works, because they work sync)\n * `size` defines buffer level or sets buffer to given size (see ↓`setSize` for more)\n * `disabled` immediately call disable\n * `split` short form for:\n\n```javascript\nstream.split(token, function (chunk) {stream.emit('data', chunk)})\n```\n\n### stream.setSize\n\n```javascript\nstream.setSize(size) // can be one of ['none', 'flexible', <number>]\n```\n\ndifferent buffer behaviors can be triggered by size:\n\n * `none` when output drains, bufferstream drains too\n * `flexible` buffers everthing that it gets and not piping out\n * `<number>` `TODO` buffer has given size. buffers everthing until buffer is full. when buffer is full then  the stream will drain\n\n### stream.enable\n\n```javascript\nstream.enable()\n```\n\nenables stream buffering __default__\n\n### stream.disable\n\n```javascript\nstream.disable()\n```\n\nflushes buffer and disables stream buffering.\nBufferStream now pipes all data as long as the output accepting data.\nwhen the output is draining BufferStream will buffer all input temporary.\n\n```javascript\nstream.disable(token, ...)\nstream.disable(tokens) // Array\n```\n * `token[s]` buffer splitters (should be String or Buffer)\n\ndisables given tokens. wont flush until no splitter tokens are left.\n\n### stream.split\n\n```javascript\nstream.split(token, ...)\nstream.split(tokens) // Array\n```\n * `token[s]` buffer splitters (should be String or Buffer)\n\neach time BufferStream finds a splitter token in the input data it will emit a __split__ event.\nthis also works for binary data.\n\n### Event: 'split'\n\n```javascript\nstream.on('split', function (chunk, token) {…})\nstream.split(token, function (chunk, token) {…}) // only get called for this particular token\n```\n\nwhenever the stream is enabled it will try to find all splitter token in `stream.buffer`,\ncut it off and emit the chunk (without token) as __split__ event.\nthis data will be lost when not handled.\n\nthe chunk is the cut off of `stream.buffer` without the token.\n\n__Warning:__ try to avoid calling `stream.emit('data', newchunk)` more than one time, because this will likely throw `Error: Offset is out of bounds`.\n\n### stream.getBuffer\n\n```javascript\nstream.getBuffer()\n// or just\nstream.buffer\n```\n\nreturns its [Buffer](http://nodejs.org/docs/v0.4.7/api/buffers.html).\n\n### stream.toString\n\n```javascript\nstream.toString()\n```\n\nshortcut for `stream.buffer.toString()`\n\n### stream.length\n\n```javascript\nstream.length\n```\n\nshortcut for `stream.buffer.length`\n\n### PostBuffer\n\n```javascript\nPostBuffer = require('bufferstream/postbuffer')\npost = new PostBuffer(req)\n```\n * `req` http.ServerRequest\n\nfor if you want to get all the post data from a http server request and do some db reqeust before.\n\nbuffer http client\n\n### post.onEnd\n\n```javascript\npost.onEnd(function (data) {…});\n```\n\nset a callback to get all post data from a http server request\n\n### post.pipe\n\n```javascript\npost.pipe(stream, options);\n```\n\npumps data into another stream to allow incoming streams\ngiven options will be passed to Stream.pipe\n\n## example\n\n```javascript\nBufferStream = require('bufferstream')\nstream = new BufferStream({encoding:'utf8', size:'flexible'})\nstream.split('//', ':')\nstream.on('split', function (chunk, token) {\n    console.log(\"got '%s' by '%s'\", chunk.toString(), token.toString())\n})\nstream.write(\"buffer:stream//23\")\nconsole.log(stream.toString())\n```\n\nresults in\n\n    got 'buffer' by ':'\n    got 'stream' by '//'\n    23\n\n* https://github.com/dodo/node-bufferstream/blob/master/example/split.js\n\n## FAQ\n\n> I'm not sure from your readme what the split event emits?\n\nyou can specify more than one split token .. so it's emitted whenever\na token is found.\n\n> does it emit the buffer up to the just before the token starts?\n\nyes.\n\n> also, does it join buffers together if they do not already end in a token?\n\nwhen size is `flexible` it joins everything together what it gets to\none buffer (accessible through `stream.buffer` or\n`stream.getBuffer()`)\nwhenever it gets data, it will try to find all tokens\n\n> in other words, can I use this to rechunk a stream so that the chunks always break on newlines, for example?\n\nyes.\n\n```javascript\nstream = new BufferStream({size:'flexible'});\nstream.split('\\n', function (line) { // line doesn't have a '\\n' anymore\n    stream.emit('data', line); // Buffer.isBuffer(line) === true\n});\n```\n\n[![Build Status](https://secure.travis-ci.org/dodo/node-bufferstream.png)](http://travis-ci.org/dodo/node-bufferstream)\n","maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}]}},"maintainers":[{"name":"dodo","email":"dodo@blacksec.org"}],"time":{"modified":"2012-03-18T15:47:12.703Z","created":"2011-05-17T22:29:35.931Z","0.0.2":"2011-05-17T22:29:36.655Z","0.0.3":"2011-05-22T13:23:15.867Z","0.1.0":"2011-05-24T21:38:16.722Z","0.1.1":"2011-05-24T21:42:47.100Z","0.1.2":"2011-05-25T22:04:48.940Z","0.1.2-1":"2011-05-29T17:18:08.954Z","0.1.2-2":"2011-05-29T19:01:48.355Z","0.1.2-3":"2011-05-29T19:30:38.040Z","0.1.2-4":"2011-05-29T20:34:19.421Z","0.1.2-5":"2011-05-29T21:01:14.782Z","0.1.2-6":"2011-05-29T21:16:35.704Z","0.1.3":"2011-05-30T06:09:28.785Z","0.1.4":"2011-06-04T20:45:22.537Z","0.1.5":"2011-06-06T19:24:32.836Z","0.1.6":"2011-06-06T19:49:07.856Z","0.2.0":"2011-06-08T12:22:34.032Z","0.3.0":"2011-06-09T00:34:16.587Z","0.4.0":"2011-08-22T01:19:35.723Z","0.4.1":"2011-08-22T01:38:09.188Z","0.4.2":"2011-08-22T01:44:38.102Z","0.4.3":"2011-08-22T02:33:07.612Z","0.4.4":"2011-08-22T12:34:23.546Z","0.4.5":"2011-08-22T16:13:00.064Z","0.4.6":"2011-08-22T21:16:13.826Z","0.4.7":"2011-09-21T01:47:30.628Z","0.4.8":"2011-10-22T03:36:09.749Z","0.4.9":"2011-11-02T18:48:24.428Z","0.4.10":"2011-11-29T14:05:01.474Z","0.5.0-pre":"2012-01-13T11:32:06.110Z","0.5.0-pre2":"2012-02-03T18:00:40.813Z","0.5.0":"2012-02-25T15:55:50.148Z","0.5.1":"2012-03-18T15:47:12.703Z"},"author":{"name":"dodo","url":"https://github.com/dodo"},"repository":{"type":"git","url":"git://github.com/dodo/node-bufferstream.git"},"_attachments":{"bufferstream-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-9UZwuEDATLiW2jjGnud0pA==","length":7892,"stub":true},"bufferstream-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":98,"digest":"md5-y4y4IWm+VQW2wqp6EDZM7Q==","length":7590,"stub":true},"bufferstream-0.5.0-pre2.tgz":{"content_type":"application/octet-stream","revpos":96,"digest":"md5-E9Xd9cJkms/JvvULlurxTA==","length":7103,"stub":true},"bufferstream-0.5.0-pre.tgz":{"content_type":"application/octet-stream","revpos":94,"digest":"md5-EUNwkNrC6XfEhu0u4W2Z4A==","length":6989,"stub":true},"bufferstream-0.4.10.tgz":{"content_type":"application/octet-stream","revpos":92,"digest":"md5-hJFeCNBVFXW2iyzghcvWtw==","length":6800,"stub":true},"bufferstream-0.4.9.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-mjq1r4eD9SP8CBumbrL6EQ==","length":5893,"stub":true},"bufferstream-0.4.8.tgz":{"content_type":"application/octet-stream","revpos":84,"digest":"md5-5OAYt9HbXHfKLpJOP00jQA==","length":5726,"stub":true},"bufferstream-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":82,"digest":"md5-8giZn/GnZ+tN/143Ya8MGA==","length":5700,"stub":true},"bufferstream-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":72,"digest":"md5-Iv72tnwTHbY68enwM3kGIw==","length":5128,"stub":true},"bufferstream-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":70,"digest":"md5-3QgzqqrmpSOA6vV+LHL0WQ==","length":5125,"stub":true},"bufferstream-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":60,"digest":"md5-fBC0gz+i29E3JTIeDgH5ng==","length":5062,"stub":true},"bufferstream-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":58,"digest":"md5-QkO8ouWbMNWQ1VrJ1PC7Xw==","length":5075,"stub":true},"bufferstream-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-iBWrGhQtTxNTEPDwMTojmQ==","length":5044,"stub":true},"bufferstream-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-hGEZLLgaKdHA7RAvY8I+Qg==","length":5041,"stub":true},"bufferstream-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-a4y+c/8lIHNu9riSZ3yVCQ==","length":5021,"stub":true},"bufferstream-0.3.0-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-ydMyI9f5eUQv5+2dsmC0dA==","length":4673,"stub":true},"bufferstream-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-+6yszqdP+opDZyKkIEEVlg==","length":3625,"stub":true},"bufferstream-0.2.0-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-MIQC7gUgzazKl4aUfhrJ1Q==","length":4240,"stub":true},"bufferstream-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-QR/aM5B3ZuhMEKEAWnB9vA==","length":3324,"stub":true},"bufferstream-0.1.6-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-ilAHQ0TKNxB/03ykmwSv6Q==","length":4087,"stub":true},"bufferstream-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-teBpwdAFImah4OU1scvrsQ==","length":3138,"stub":true},"bufferstream-0.1.5-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-DEqFizLM3/Fa0LSUA5jZDg==","length":4078,"stub":true},"bufferstream-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-l6YoMsMVr7NJDL1wgQd83w==","length":5507,"stub":true},"bufferstream-0.1.4-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-RNKnxGwOM6i7qWBMul6rEg==","length":4056,"stub":true},"bufferstream-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-ll2VuwncWTPoEVu/jmAifQ==","length":5489,"stub":true},"bufferstream-0.1.3-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-8iW6L1/tYCnO18ZlpIZHtQ==","length":5537,"stub":true},"bufferstream-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-tmByyYOsynZe1zYVckGqNw==","length":3019,"stub":true},"bufferstream-0.1.2-6-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-baA7fT1nGTuygL4I8ig+6g==","length":5541,"stub":true},"bufferstream-0.1.2-6.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-CD4usrb6YMjnGboxioD9PA==","length":3023,"stub":true},"bufferstream-0.1.2-5-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-2y0XERx4WMzAwmlXp6IOlw==","length":5551,"stub":true},"bufferstream-0.1.2-5.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-3X6NOVT/k1v2tudeLMCOLg==","length":3036,"stub":true},"bufferstream-0.1.2-4-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-UfqsCkmX7gWa4gJNToQ19w==","length":5543,"stub":true},"bufferstream-0.1.2-4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-HFa4us5lxfW/6EOB2HDyyQ==","length":3027,"stub":true},"bufferstream-0.1.2-3-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-sYphQ1frWBSZScW9WSjTQg==","length":5535,"stub":true},"bufferstream-0.1.2-3.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-N6llJW7DqcLr5qrxDWGzjQ==","length":3023,"stub":true},"bufferstream-0.1.2-2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-UdtdFu3aYYE3t2ZwuKF8Fg==","length":5492,"stub":true},"bufferstream-0.1.2-2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-22yzRuVFkxkfhoHlJgGSgQ==","length":2983,"stub":true},"bufferstream-0.1.2-1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-dP6UC1esCvcJJp7Y/zLWCg==","length":2955,"stub":true},"bufferstream-0.1.2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-5UcCeP22V6RYGIN791kP1A==","length":5480,"stub":true},"bufferstream-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-nRBAI7Xu2Rc0TRESFVkcgw==","length":2951,"stub":true},"bufferstream-0.1.1-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.39-1-amd64.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-G4HpmNVUhqZlVq3jo/Y2NA==","length":4623,"stub":true},"bufferstream-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-KkSl3/LLUZlvEGWb/t6aTg==","length":2133,"stub":true},"bufferstream-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-PL6YXA1lSDQGPvSf8rTYYg==","length":2135,"stub":true},"bufferstream-0.0.3-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.38-2-amd64.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-J/7bquIGGyptznaY6EdxzA==","length":4566,"stub":true},"bufferstream-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-0r7wGVqEt1lamgMq7SNcQA==","length":2092,"stub":true},"bufferstream-0.0.2-0.4-ares1.7.4-ev4.4-openssl1.0.0d-v83.1.8.10-linux-2.6.38-2-amd64.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-NQS4wypqcKk482Gitqjzqw==","length":4566,"stub":true},"bufferstream-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uadiTDfF5Yvx6fwWTjYffg==","length":2104,"stub":true}}}},
{"id":"buffertools","key":"buffertools","value":{"rev":"36-2a2fe0177616f5a1f0b21eaf649aecce"},"doc":{"_id":"buffertools","_rev":"36-2a2fe0177616f5a1f0b21eaf649aecce","name":"buffertools","description":"Working with node.js buffers made easy.","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"buffertools","main":"build/default/buffertools","version":"1.0.0","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"node-waf configure","install":"node-waf build install"},"repository":{"type":"git","url":"https://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_id":"buffertools@1.0.0","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.3.5-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"62e9db1a4d0fa8ad749a41e5f3a20c1a9db1dcfb","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.0.tgz"}},"1.0.1":{"name":"buffertools","main":"build/default/buffertools","version":"1.0.1","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"node-waf configure","install":"node-waf build install"},"repository":{"type":"git","url":"https://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_id":"buffertools@1.0.1","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b8d77681c4de8a845e706ecedbd4b9b7f456839a","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.1.tgz"}},"1.0.2":{"name":"buffertools","main":"build/default/buffertools","version":"1.0.2","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"node-waf configure","install":"node-waf build install"},"repository":{"type":"git","url":"https://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_id":"buffertools@1.0.2","_engineSupported":true,"_npmVersion":"0.2.14-6","_nodeVersion":"v0.5.0-pre","directories":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8b37baa12a4e59281712c41dc6bb0aca7744ed55","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.2.tgz","bin":{"0.4-sunos-5.11":{"shasum":"19bf5aee3269fe96bd8fb36af93b69ab0cff012e","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.2-0.4-sunos-5.11.tgz"}}}},"1.0.3":{"name":"buffertools","main":"buffertools","version":"1.0.3","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"node-waf configure build"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"dependencies":{},"devDependencies":{},"_id":"buffertools@1.0.3","_engineSupported":true,"_npmVersion":"1.0.5","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"bc9d79a76d463e7c23e9dcec203f18659fa63b24","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.3.tgz"},"directories":{}},"1.0.4":{"name":"buffertools","main":"buffertools","version":"1.0.4","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"./build-wrapper"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_npmJsonOpts":{"file":"/home/bnoordhuis/.npm/buffertools/1.0.4/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"buffertools@1.0.4","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.3-pre","_defaultsLoaded":true,"dist":{"shasum":"d30db88db4f12f6286949739405e07b15996025b","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.4.tgz"},"maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"directories":{}},"1.0.5":{"name":"buffertools","main":"buffertools","version":"1.0.5","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"./build-wrapper"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_npmJsonOpts":{"file":"/home/bnoordhuis/.npm/buffertools/1.0.5/package/package.json","contributors":false,"serverjs":false,"wscript":true},"_id":"buffertools@1.0.5","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.5.7-pre","_defaultsLoaded":true,"dist":{"shasum":"7afb518406a615e91e7b36879eed7f3034227c47","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.5.tgz"},"maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"directories":{}},"1.0.6":{"name":"buffertools","main":"buffertools","version":"1.0.6","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"./build-wrapper"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"bnoordhuis","email":"info@bnoordhuis.nl"},"_id":"buffertools@1.0.6","contributors":[{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"Stefan Thomas","email":"justmoon@members.fsf.org"}],"dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.7.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f2c12d0e5aa6704e086aea2f8ba9ccd82e7120ab","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.6.tgz"},"maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"directories":{}},"1.0.7":{"name":"buffertools","main":"buffertools","version":"1.0.7","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"scripts":{"preinstall":"./build-wrapper"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"bnoordhuis","email":"info@bnoordhuis.nl"},"_id":"buffertools@1.0.7","contributors":[{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"Stefan Thomas","email":"justmoon@members.fsf.org"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10-pre","_defaultsLoaded":true,"dist":{"shasum":"22d21e4da022a77507e2b50f3bafe048820e8210","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.7.tgz"},"readme":"# node-buffertools\n\nUtilities for manipulating buffers.\n\n## Installing the module\n\nEasy! With [npm](http://npmjs.org/):\n\n\tnpm install buffertools\n\nFrom source:\n\n\tnode-waf configure build install\n\nNow you can include the module in your project.\n\n\trequire('buffertools');\n\tnew Buffer(42).clear();\n\n## Methods\n\nNote that most methods that take a buffer as an argument, will also accept a string.\n\n### Buffer.clear()\n\nClear the buffer. This is equivalent to `Buffer.fill(0)`.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.compare(buffer|string)\n\nLexicographically compare two buffers. Returns a number smaller than 1\nif a < b, zero if a == b or a number larger than 1 if a > b.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nSmaller buffers are considered to be less than larger ones. Some buffers\nfind this hurtful.\n\n### Buffer.concat(a, b, c, ...)\n### buffertools.concat(a, b, c, ...)\n\nConcatenate two or more buffers/strings and return the result. Example:\n\n\t// identical to new Buffer('foobarbaz')\n\ta = new Buffer('foo');\n\tb = new Buffer('bar');\n\tc = a.concat(b, 'baz');\n\tconsole.log(a, b, c); // \"foo bar foobarbaz\"\n\n\t// static variant\n\tbuffertools.concat('foo', new Buffer('bar'), 'baz');\n\n### Buffer.equals(buffer|string)\n\nReturns true if this buffer equals the argument, false otherwise.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nCaveat emptor: If your buffers contain strings with different character encodings,\nthey will most likely *not* be equal.\n\n### Buffer.fill(integer|string|buffer)\n\nFill the buffer (repeatedly if necessary) with the argument.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.fromHex()\n\nAssumes this buffer contains hexadecimal data (packed, no whitespace)\nand decodes it into binary data. Returns a new buffer with the decoded\ncontent. Throws an exception if non-hexadecimal data is encountered.\n\n### Buffer.indexOf(buffer|string)\n\nSearch this buffer for the first occurrence of the argument.\nReturns the zero-based index or -1 if there is no match.\n\n### Buffer.reverse()\n\nReverse the content of the buffer in place. Example:\n\n\tb = new Buffer('live');\n\tb.reverse();\n\tconsole.log(b); // \"evil\"\n\n### Buffer.toHex()\n\nReturns the contents of this buffer encoded as a hexadecimal string.\n\n## Classes\n\nSingular, actually. To wit:\n\n## WritableBufferStream\n\nThis is a regular node.js [writable stream](http://nodejs.org/docs/v0.3.4/api/streams.html#writable_Stream)\nthat accumulates the data it receives into a buffer.\n\nExample usage:\n\n\t// slurp stdin into a buffer\n\tprocess.stdin.resume();\n\tostream = new WritableBufferStream();\n\tutil.pump(process.stdin, ostream);\n\tconsole.log(ostream.getBuffer());\n\nThe stream never emits 'error' or 'drain' events.\n\n### WritableBufferStream.getBuffer()\n\nReturn the data accumulated so far as a buffer.\n\n## TODO\n\n* Logical operations on buffers (AND, OR, XOR).\n* Add lastIndexOf() functions.\n","maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"directories":{}},"1.0.8":{"name":"buffertools","main":"buffertools","version":"1.0.8","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"bnoordhuis","email":"info@bnoordhuis.nl"},"_id":"buffertools@1.0.8","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"contributors":[{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"Stefan Thomas","email":"justmoon@members.fsf.org"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.7.6-pre","_defaultsLoaded":true,"dist":{"shasum":"0f92f426c59418032647bbaefc28177a35d09368","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.8.tgz"},"readme":"# node-buffertools\n\nUtilities for manipulating buffers.\n\n## Installing the module\n\nEasy! With [npm](http://npmjs.org/):\n\n\tnpm install buffertools\n\nFrom source:\n\n\tnode-gyp configure\n\tnode-gyp build\n\nNow you can include the module in your project.\n\n\trequire('buffertools');\n\tnew Buffer(42).clear();\n\n## Methods\n\nNote that most methods that take a buffer as an argument, will also accept a string.\n\n### Buffer.clear()\n\nClear the buffer. This is equivalent to `Buffer.fill(0)`.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.compare(buffer|string)\n\nLexicographically compare two buffers. Returns a number smaller than 1\nif a < b, zero if a == b or a number larger than 1 if a > b.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nSmaller buffers are considered to be less than larger ones. Some buffers\nfind this hurtful.\n\n### Buffer.concat(a, b, c, ...)\n### buffertools.concat(a, b, c, ...)\n\nConcatenate two or more buffers/strings and return the result. Example:\n\n\t// identical to new Buffer('foobarbaz')\n\ta = new Buffer('foo');\n\tb = new Buffer('bar');\n\tc = a.concat(b, 'baz');\n\tconsole.log(a, b, c); // \"foo bar foobarbaz\"\n\n\t// static variant\n\tbuffertools.concat('foo', new Buffer('bar'), 'baz');\n\n### Buffer.equals(buffer|string)\n\nReturns true if this buffer equals the argument, false otherwise.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nCaveat emptor: If your buffers contain strings with different character encodings,\nthey will most likely *not* be equal.\n\n### Buffer.fill(integer|string|buffer)\n\nFill the buffer (repeatedly if necessary) with the argument.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.fromHex()\n\nAssumes this buffer contains hexadecimal data (packed, no whitespace)\nand decodes it into binary data. Returns a new buffer with the decoded\ncontent. Throws an exception if non-hexadecimal data is encountered.\n\n### Buffer.indexOf(buffer|string)\n\nSearch this buffer for the first occurrence of the argument.\nReturns the zero-based index or -1 if there is no match.\n\n### Buffer.reverse()\n\nReverse the content of the buffer in place. Example:\n\n\tb = new Buffer('live');\n\tb.reverse();\n\tconsole.log(b); // \"evil\"\n\n### Buffer.toHex()\n\nReturns the contents of this buffer encoded as a hexadecimal string.\n\n## Classes\n\nSingular, actually. To wit:\n\n## WritableBufferStream\n\nThis is a regular node.js [writable stream](http://nodejs.org/docs/v0.3.4/api/streams.html#writable_Stream)\nthat accumulates the data it receives into a buffer.\n\nExample usage:\n\n\t// slurp stdin into a buffer\n\tprocess.stdin.resume();\n\tostream = new WritableBufferStream();\n\tutil.pump(process.stdin, ostream);\n\tconsole.log(ostream.getBuffer());\n\nThe stream never emits 'error' or 'drain' events.\n\n### WritableBufferStream.getBuffer()\n\nReturn the data accumulated so far as a buffer.\n\n## TODO\n\n* Logical operations on buffers (AND, OR, XOR).\n* Add lastIndexOf() functions.\n","maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"directories":{}},"1.0.9":{"name":"buffertools","main":"buffertools","version":"1.0.9","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"repository":{"type":"git","url":"git://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"_npmUser":{"name":"bnoordhuis","email":"info@bnoordhuis.nl"},"_id":"buffertools@1.0.9","scripts":{"preinstall":"node-waf clean || (exit 0); node-waf configure build"},"contributors":[{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"Stefan Thomas","email":"justmoon@members.fsf.org"}],"dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.7.6-pre","_defaultsLoaded":true,"dist":{"shasum":"91528bbc927d80843bbdd9741748f10af7a9f4e8","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.0.9.tgz"},"readme":"# node-buffertools\n\nUtilities for manipulating buffers.\n\n## Installing the module\n\nEasy! With [npm](http://npmjs.org/):\n\n\tnpm install buffertools\n\nFrom source:\n\n\tnode-gyp configure\n\tnode-gyp build\n\nNow you can include the module in your project.\n\n\trequire('buffertools');\n\tnew Buffer(42).clear();\n\n## Methods\n\nNote that most methods that take a buffer as an argument, will also accept a string.\n\n### Buffer.clear()\n\nClear the buffer. This is equivalent to `Buffer.fill(0)`.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.compare(buffer|string)\n\nLexicographically compare two buffers. Returns a number smaller than 1\nif a < b, zero if a == b or a number larger than 1 if a > b.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nSmaller buffers are considered to be less than larger ones. Some buffers\nfind this hurtful.\n\n### Buffer.concat(a, b, c, ...)\n### buffertools.concat(a, b, c, ...)\n\nConcatenate two or more buffers/strings and return the result. Example:\n\n\t// identical to new Buffer('foobarbaz')\n\ta = new Buffer('foo');\n\tb = new Buffer('bar');\n\tc = a.concat(b, 'baz');\n\tconsole.log(a, b, c); // \"foo bar foobarbaz\"\n\n\t// static variant\n\tbuffertools.concat('foo', new Buffer('bar'), 'baz');\n\n### Buffer.equals(buffer|string)\n\nReturns true if this buffer equals the argument, false otherwise.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nCaveat emptor: If your buffers contain strings with different character encodings,\nthey will most likely *not* be equal.\n\n### Buffer.fill(integer|string|buffer)\n\nFill the buffer (repeatedly if necessary) with the argument.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.fromHex()\n\nAssumes this buffer contains hexadecimal data (packed, no whitespace)\nand decodes it into binary data. Returns a new buffer with the decoded\ncontent. Throws an exception if non-hexadecimal data is encountered.\n\n### Buffer.indexOf(buffer|string)\n\nSearch this buffer for the first occurrence of the argument.\nReturns the zero-based index or -1 if there is no match.\n\n### Buffer.reverse()\n\nReverse the content of the buffer in place. Example:\n\n\tb = new Buffer('live');\n\tb.reverse();\n\tconsole.log(b); // \"evil\"\n\n### Buffer.toHex()\n\nReturns the contents of this buffer encoded as a hexadecimal string.\n\n## Classes\n\nSingular, actually. To wit:\n\n## WritableBufferStream\n\nThis is a regular node.js [writable stream](http://nodejs.org/docs/v0.3.4/api/streams.html#writable_Stream)\nthat accumulates the data it receives into a buffer.\n\nExample usage:\n\n\t// slurp stdin into a buffer\n\tprocess.stdin.resume();\n\tostream = new WritableBufferStream();\n\tutil.pump(process.stdin, ostream);\n\tconsole.log(ostream.getBuffer());\n\nThe stream never emits 'error' or 'drain' events.\n\n### WritableBufferStream.getBuffer()\n\nReturn the data accumulated so far as a buffer.\n\n## TODO\n\n* Logical operations on buffers (AND, OR, XOR).\n* Add lastIndexOf() functions.\n","maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"directories":{}},"1.1.0":{"name":"buffertools","main":"buffertools","version":"1.1.0","keywords":["buffer","buffers"],"description":"Working with node.js buffers made easy.","homepage":"https://github.com/bnoordhuis/node-buffertools","author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"repository":{"type":"git","url":"https://github.com/bnoordhuis/node-buffertools.git"},"engines":{"node":">=0.3.0"},"scripts":{"install":"node-gyp rebuild"},"gypfile":true,"contributors":[{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl"},{"name":"Nathan Rajlich","email":"nathan@tootallnate.net"},{"name":"Stefan Thomas","email":"justmoon@members.fsf.org"}],"readme":"# node-buffertools\n\nUtilities for manipulating buffers.\n\n## Installing the module\n\nEasy! With [npm](http://npmjs.org/):\n\n\tnpm install buffertools\n\nFrom source:\n\n\tnode-gyp configure\n\tnode-gyp build\n\nNow you can include the module in your project.\n\n\trequire('buffertools');\n\tnew Buffer(42).clear();\n\n## Methods\n\nNote that most methods that take a buffer as an argument, will also accept a string.\n\n### Buffer.clear()\n\nClear the buffer. This is equivalent to `Buffer.fill(0)`.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.compare(buffer|string)\n\nLexicographically compare two buffers. Returns a number less than zero\nif a < b, zero if a == b or greater than zero if a > b.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nSmaller buffers are considered to be less than larger ones. Some buffers\nfind this hurtful.\n\n### Buffer.concat(a, b, c, ...)\n### buffertools.concat(a, b, c, ...)\n\nConcatenate two or more buffers/strings and return the result. Example:\n\n\t// identical to new Buffer('foobarbaz')\n\ta = new Buffer('foo');\n\tb = new Buffer('bar');\n\tc = a.concat(b, 'baz');\n\tconsole.log(a, b, c); // \"foo bar foobarbaz\"\n\n\t// static variant\n\tbuffertools.concat('foo', new Buffer('bar'), 'baz');\n\n### Buffer.equals(buffer|string)\n\nReturns true if this buffer equals the argument, false otherwise.\n\nBuffers are considered equal when they are of the same length and contain\nthe same binary data.\n\nCaveat emptor: If your buffers contain strings with different character encodings,\nthey will most likely *not* be equal.\n\n### Buffer.fill(integer|string|buffer)\n\nFill the buffer (repeatedly if necessary) with the argument.\nReturns the buffer object so you can chain method calls.\n\n### Buffer.fromHex()\n\nAssumes this buffer contains hexadecimal data (packed, no whitespace)\nand decodes it into binary data. Returns a new buffer with the decoded\ncontent. Throws an exception if non-hexadecimal data is encountered.\n\n### Buffer.indexOf(buffer|string, [start=0])\n\nSearch this buffer for the first occurrence of the argument, starting at\noffset `start`. Returns the zero-based index or -1 if there is no match.\n\n### Buffer.reverse()\n\nReverse the content of the buffer in place. Example:\n\n\tb = new Buffer('live');\n\tb.reverse();\n\tconsole.log(b); // \"evil\"\n\n### Buffer.toHex()\n\nReturns the contents of this buffer encoded as a hexadecimal string.\n\n## Classes\n\nSingular, actually. To wit:\n\n## WritableBufferStream\n\nThis is a regular node.js [writable stream](http://nodejs.org/docs/v0.3.4/api/streams.html#writable_Stream)\nthat accumulates the data it receives into a buffer.\n\nExample usage:\n\n\t// slurp stdin into a buffer\n\tprocess.stdin.resume();\n\tostream = new WritableBufferStream();\n\tutil.pump(process.stdin, ostream);\n\tconsole.log(ostream.getBuffer());\n\nThe stream never emits 'error' or 'drain' events.\n\n### WritableBufferStream.getBuffer()\n\nReturn the data accumulated so far as a buffer.\n\n## TODO\n\n* Logical operations on buffers (AND, OR, XOR).\n* Add lastIndexOf() functions.\n","_id":"buffertools@1.1.0","dist":{"shasum":"c1bc946a3cce722c9adaaed505e9896aa171be9c","tarball":"http://registry.npmjs.org/buffertools/-/buffertools-1.1.0.tgz"},"maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}]}},"maintainers":[{"name":"bnoordhuis","email":"info@bnoordhuis.nl"}],"time":{"modified":"2012-08-12T19:53:08.169Z","created":"2011-01-13T22:55:03.943Z","1.0.0":"2011-01-13T22:55:04.551Z","1.0.1":"2011-03-15T12:57:55.374Z","1.0.2":"2011-04-01T11:25:23.462Z","1.0.3":"2011-05-04T16:38:26.402Z","1.0.4":"2011-08-30T21:41:52.170Z","1.0.5":"2011-09-20T11:16:41.192Z","1.0.6":"2011-12-18T22:47:05.184Z","1.0.7":"2012-02-06T19:28:40.149Z","1.0.8":"2012-04-10T20:54:26.558Z","1.0.9":"2012-04-16T11:49:43.127Z","1.1.0":"2012-08-12T19:53:08.169Z"},"author":{"name":"Ben Noordhuis","email":"info@bnoordhuis.nl","url":"http://bnoordhuis.nl/"},"repository":{"type":"git","url":"https://github.com/bnoordhuis/node-buffertools.git"},"users":{"dodo":true,"fgribreau":true},"_attachments":{"buffertools-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-pLQLNHV9cZ0GAb1rvZJNeQ==","length":8065,"stub":true},"buffertools-1.0.9.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-FZdnB7gFZHzbwxX4N860Tw==","length":8039,"stub":true},"buffertools-1.0.8.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-auxrPsCKZZJSeUTBXPNwdA==","length":9648,"stub":true},"buffertools-1.0.7.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-UlJVkjrgA7NXsRQq5VnzUw==","length":8130,"stub":true},"buffertools-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-t2HajGMRfPwBsmoBdziv1w==","length":8161,"stub":true},"buffertools-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-zOLiLjiXUkX5dyhQI+dOrw==","length":58612,"stub":true},"buffertools-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-Dq/1CcuvyfIPKzUpi+xCGQ==","length":7861,"stub":true},"buffertools-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-qcNFOeTuMrfVBm23QCxJVA==","length":7619,"stub":true},"buffertools-1.0.2-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-ySWlMwBl7aK/FRMwwzkA3g==","length":111757,"stub":true},"buffertools-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hObqNWbUmnaSWvRWI8AkGQ==","length":9395,"stub":true},"buffertools-1.0.1-0.4-sunos-5.11.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-CJLSqAmsTZ0Y0WcHGDp5rA==","length":110728,"stub":true},"buffertools-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-S9Bz/z6Q7EAzbavZ0BH59Q==","length":109821,"stub":true},"buffertools-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ST4kIm4OZD5+oBYVAV/BHg==","length":8374,"stub":true}}}},
{"id":"buffet","key":"buffet","value":{"rev":"32-f17270a2da16ac364abf313c375955db"},"doc":{"_id":"buffet","_rev":"32-f17270a2da16ac364abf313c375955db","name":"buffet","description":"Performance-oriented static file server","dist-tags":{"latest":"0.3.9"},"versions":{"0.0.0":{"name":"buffet","version":"0.0.0","description":"Treat already-buffered data as a stream","main":"index.js","scripts":{"test":"make test"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"keywords":["buffer","stream","memory","pipe"],"author":{"name":"Carlos Rodriguez"},"license":"MIT","devDpendencies":{"mocha":"*"},"readme":"node-buffet\n===========\n\nTreat already-buffered data as a stream","_id":"buffet@0.0.0","dist":{"shasum":"980175b70c985f4012f1c17beb9b49d94404b1c6","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.0.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.2.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.2.0","main":"./lib","repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"dependencies":{"mime":"~1.2.6","diveSync":"~0.2.0","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.2.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"b77ade1b69507d4aafd3c328c4cf295ca52ef983","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.2.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.2.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.2.1","main":"./lib","repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.2.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"3cb068e9b24762075855ad996c72c32850b868a6","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.2.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.2.2":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.2.2","main":"./lib","repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.2.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"7bdfe3a7ade2feb4d9d4cf657ad861894cfc7b91","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.2.2.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.2.3":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.2.3","main":"./lib","repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.2.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"19b160fd9e3306b629289a9a31924baabff447a0","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.2.3.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.0":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.0","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.3.0","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"01d4241f0665c096e6067cb760fab01e90647a1a","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.0.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.1":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.1","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.3.1","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"ad21d4f55116fa0d4bef147879122eb627a0403e","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.1.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.2":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.2","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.3.2","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"7c0a533845158ae7dc88b2b4aadf4a8999837a46","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.2.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.3":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.3","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.3.3","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"f03a713da61df5fa415f2696ef46aa3c36c802fb","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.3.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.4":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.4","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.3.4","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"9221bceece878c0d5bffd43b3ad88f305a43f9a3","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.4.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.5":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.5","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"readme":"buffet\n------\n\nPerformance-oriented static file server\n\nIdea\n====\n\nBuffet was borne out of frustration. Serving static files should be the most\nefficient thing that a Node.js app can do. Turns out, runtime syscalls to the\nfilesystem can really hang your page loads, especially if you're getting that\nhumongous burst of traffic you've been dreaming of, and your filesystem is\nnetworked or unreliable in some other way.\n\nBuffet takes a fully-bufferred approach (hence the name, hehe) -- all files are\nfully loaded into memory when your app boots, so you will never feel the burn of\nthe filesystem. In practice, this is immensely efficient. So much so that putting\n[Varnish](https://www.varnish-cache.org/) in front of your app might even make it\nslower!\n\nContinuous deployment is also becoming all the rage, and restarting Varnish is\na pain, so consider using Buffet instead, so your pages are always fresh and\nzesty.\n\nUsage\n=====\n\nEasy built-in server:\n\n```bash\n$ npm install -g buffet\n$ cd /var/www/html\n$ buffet\nbuffet 0.2.3 listening on port 8080\n```\n\nMiddleware version (compatible with [connect](http://www.senchalabs.org/connect/),\n[union/flatiron](http://flatironjs.org/), etc.)\n\n```javascript\nvar buffetMiddlware = buffet(root, {options...});\n// also available to serve 404 pages:\nbuffetMiddleware.notFound(req, res);\n```\n\nOptions\n=======\n\n- `indexes`: True to look for `options.index` and serve it for directory requests.\n  (Default: true)\n- `index`: Name of index file to look for. (Default: `index.html`)\n- `gzip`: True to enable gzip when clients can accept it. (Default: `true`)\n- `watch`: True to auto-update the buffer when files change. (Default: `true`)\n- `poweredBy`: True to add the `X-Powered-By` header. (Default: `true`)\n- `maxAge`: Number of max-age seconds to set `Cache-Control` header. Set to\n  `false` or `0` to disable. (Default: `300`)\n- `notFoundPath`: Path to be rendered on `buffetMiddleware.notFound`. (Default:\n  `/404.html`)\n- `keepAlive`: Send `Connection: keep-alive` header. (Default: true)\n\nExample\n=======\n\n```javascript\nvar buffet = require('buffet')('/var/www/html', {maxAge: 86400})\n  , http = require('http')\n  , port = 9000\n  ;\n\nhttp.createServer(function(req, res) {\n  buffet(req, res, buffet.notFound.bind(null, req, res));\n}).listen(port, function() {\n  console.log('test server running on port 9000');\n});\n```\n\nLicense\n=======\n\nMIT","_id":"buffet@0.3.5","dist":{"shasum":"0f1f12175bcbb86b6dbcb7054c46c177bbdc124b","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.5.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.6":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.6","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"_npmUser":{"name":"carlos8f","email":"carlos@s8f.org"},"_id":"buffet@0.3.6","_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"7203d87083ff2c9843e4a746d2522feef545a948","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.6.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.7":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.7","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"readme":"buffet\n------\n\nPerformance-oriented static file server\n\nIdea\n====\n\nServing static files should be the most efficient thing that a Node.js app can\ndo. Turns out, runtime syscalls to the filesystem can really hang your page\nloads, especially if your filesystem is networked or unreliable in some other way.\n\nBuffet takes a fully-bufferred approach -- all files are fully loaded into\nmemory when your app boots, so you will never feel the burn of the filesystem.\nIn practice, this is immensely efficient. So much so that putting\n[Varnish](https://www.varnish-cache.org/) in front of your app might even make it\nslower!\n\nContinuous deployment is also becoming all the rage, and restarting Varnish is\na pain, so consider using Buffet instead, so your pages are always fresh and\nzesty.\n\nUsage\n=====\n\nEasy built-in server:\n\n```bash\n$ npm install -g buffet\n$ cd /var/www/html\n$ buffet\nbuffet 0.2.3 listening on port 8080\n```\n\nMiddleware version (compatible with [connect](http://www.senchalabs.org/connect/),\n[union/flatiron](http://flatironjs.org/), etc.)\n\n```javascript\nvar buffetMiddlware = buffet(root, {options...});\n// also available to serve 404 pages:\nbuffetMiddleware.notFound(req, res);\n```\n\nOptions\n=======\n\n- `indexes`: True to look for `options.index` and serve it for directory requests.\n  (Default: true)\n- `index`: Name of index file to look for. (Default: `index.html`)\n- `gzip`: True to enable gzip when clients can accept it. (Default: `true`)\n- `watch`: True to auto-update the buffer when files change. (Default: `true`)\n- `poweredBy`: True to add the `X-Powered-By` header. (Default: `true`)\n- `maxAge`: Number of max-age seconds to set `Cache-Control` header. Set to\n  `false` or `0` to disable. (Default: `300`)\n- `notFoundPath`: Path to be rendered on `buffetMiddleware.notFound`. (Default:\n  `/404.html`)\n\nExample\n=======\n\n```javascript\nvar buffet = require('buffet')('/var/www/html', {maxAge: 86400})\n  , http = require('http')\n  , port = 9000\n  ;\n\nhttp.createServer(function(req, res) {\n  buffet(req, res, buffet.notFound.bind(null, req, res));\n}).listen(port, function() {\n  console.log('test server running on port 9000');\n});\n```\n\nLicense\n=======\n\nMIT","_id":"buffet@0.3.7","dist":{"shasum":"9c67afe91c0ee5c9008c1b2316e9ef5fa8e2aabc","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.7.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.8":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.8","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"readme":"buffet\n------\n\nPerformance-oriented static file server\n\nIdea\n====\n\nServing static files should be the most efficient thing that a Node.js app can\ndo. Turns out, runtime syscalls to the filesystem can really hang your page\nloads, especially if your filesystem is networked or unreliable in some other way.\n\nBuffet takes a fully-bufferred approach -- all files are fully loaded into\nmemory when your app boots, so you will never feel the burn of the filesystem.\nIn practice, this is immensely efficient. So much so that putting\n[Varnish](https://www.varnish-cache.org/) in front of your app might even make it\nslower!\n\nContinuous deployment is also becoming all the rage, and restarting Varnish is\na pain, so consider using Buffet instead, so your pages are always fresh and\nzesty.\n\nUsage\n=====\n\nEasy built-in server:\n\n```bash\n$ npm install -g buffet\n$ cd /var/www/html\n$ buffet\nbuffet 0.2.3 listening on port 8080\n```\n\nMiddleware version (compatible with [connect](http://www.senchalabs.org/connect/),\n[union/flatiron](http://flatironjs.org/), etc.)\n\n```javascript\nvar buffetMiddlware = buffet(root, {options...});\n// also available to serve 404 pages:\nbuffetMiddleware.notFound(req, res);\n```\n\nOptions\n=======\n\n- `indexes`: True to look for `options.index` and serve it for directory requests.\n  (Default: true)\n- `index`: Name of index file to look for. (Default: `index.html`)\n- `gzip`: True to enable gzip when clients can accept it. (Default: `true`)\n- `watch`: True to auto-update the buffer when files change. (Default: `true`)\n- `poweredBy`: True to add the `X-Powered-By` header. (Default: `true`)\n- `maxAge`: Number of max-age seconds to set `Cache-Control` header. Set to\n  `false` or `0` to disable. (Default: `300`)\n- `notFoundPath`: Path to be rendered on `buffetMiddleware.notFound`. (Default:\n  `/404.html`)\n- `keepAlive`: Timeout (in milliseconds) for HTTP keep-alive. (Default: `5000`)\n\nExample\n=======\n\n```javascript\nvar buffet = require('buffet')('/var/www/html', {maxAge: 86400})\n  , http = require('http')\n  , port = 9000\n  ;\n\nhttp.createServer(function(req, res) {\n  buffet(req, res, buffet.notFound.bind(null, req, res));\n}).listen(port, function() {\n  console.log('test server running on port 9000');\n});\n```\n\nLicense\n=======\n\nMIT","_id":"buffet@0.3.8","dist":{"shasum":"67896534346ad4296281397a52077131055ba688","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.8.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]},"0.3.9":{"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"name":"buffet","description":"Performance-oriented static file server","version":"0.3.9","main":"./lib","scripts":{"test":"make test"},"bin":{"buffet":"./bin/buffet.js"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"license":"MIT","dependencies":{"mime":"~1.2.6","node_hash":"~0.2.0","gzip-buffer":"0.0.2","fs-watch-tree":"~0.2.2","glob":"~3.1.10","optimist":"~0.3.4","accesslog":"~0.0.1"},"keywords":["static","middleware","server","file","buffer"],"devDependencies":{"mocha":"*","idgen":"1.x","rimraf":"2.x","ncp":"~0.2.6"},"optionalDependencies":{},"engines":{"node":">= 0.6.0"},"readme":"buffet\n------\n\nPerformance-oriented static file server\n\nIdea\n====\n\nServing static files should be the most efficient thing that a Node.js app can\ndo. Turns out, runtime syscalls to the filesystem can really hang your page\nloads, especially if your filesystem is networked or unreliable in some other way.\n\nBuffet takes a fully-bufferred approach -- all files are fully loaded into\nmemory when your app boots, so you will never feel the burn of the filesystem.\nIn practice, this is immensely efficient. So much so that putting\n[Varnish](https://www.varnish-cache.org/) in front of your app might even make it\nslower!\n\nContinuous deployment is also becoming all the rage, and restarting Varnish is\na pain, so consider using Buffet instead, so your pages are always fresh and\nzesty.\n\nUsage\n=====\n\nEasy built-in server:\n\n```bash\n$ npm install -g buffet\n$ cd /var/www/html\n$ buffet\nbuffet 0.2.3 listening on port 8080\n```\n\nMiddleware version (compatible with [connect](http://www.senchalabs.org/connect/),\n[union/flatiron](http://flatironjs.org/), etc.)\n\n```javascript\nvar buffetMiddlware = buffet(root, {options...});\n// also available to serve 404 pages:\nbuffetMiddleware.notFound(req, res);\n```\n\nOptions\n=======\n\n- `indexes`: True to look for `options.index` and serve it for directory requests.\n  (Default: true)\n- `index`: Name of index file to look for. (Default: `index.html`)\n- `gzip`: True to enable gzip when clients can accept it. (Default: `true`)\n- `watch`: True to auto-update the buffer when files change. (Default: `true`)\n- `poweredBy`: True to add the `X-Powered-By` header. (Default: `true`)\n- `maxAge`: Number of max-age seconds to set `Cache-Control` header. Set to\n  `false` or `0` to disable. (Default: `300`)\n- `notFoundPath`: Path to be rendered on `buffetMiddleware.notFound`. (Default:\n  `/404.html`)\n- `keepAlive`: Timeout (in milliseconds) for HTTP keep-alive. (Default: `5000`)\n\nExample\n=======\n\n```javascript\nvar buffet = require('buffet')('/var/www/html', {maxAge: 86400})\n  , http = require('http')\n  , port = 9000\n  ;\n\nhttp.createServer(function(req, res) {\n  buffet(req, res, buffet.notFound.bind(null, req, res));\n}).listen(port, function() {\n  console.log('test server running on port 9000');\n});\n```\n\nLicense\n=======\n\nMIT","_id":"buffet@0.3.9","dist":{"shasum":"07df006102c75d7e593d9c2a04095b6016e2462b","tarball":"http://registry.npmjs.org/buffet/-/buffet-0.3.9.tgz"},"maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}]}},"readme":"node-buffet\n===========\n\nTreat already-buffered data as a stream","maintainers":[{"name":"carlos8f","email":"carlos@s8f.org"}],"time":{"modified":"2012-08-14T18:32:43.015Z","created":"2012-07-20T05:43:11.224Z","0.0.0":"2012-07-20T05:43:12.646Z","0.2.0":"2012-07-20T22:22:51.237Z","0.2.1":"2012-07-21T00:09:28.884Z","0.2.2":"2012-07-22T02:47:16.306Z","0.2.3":"2012-07-22T04:15:56.543Z","0.3.0":"2012-07-22T05:57:20.284Z","0.3.1":"2012-07-22T05:58:43.533Z","0.3.2":"2012-07-22T06:00:36.729Z","0.3.3":"2012-07-22T21:32:34.931Z","0.3.4":"2012-07-22T22:23:06.811Z","0.3.5":"2012-07-29T23:01:32.972Z","0.3.6":"2012-08-04T02:13:01.149Z","0.3.7":"2012-08-13T18:29:00.663Z","0.3.8":"2012-08-14T04:48:00.987Z","0.3.9":"2012-08-14T18:32:43.015Z"},"author":{"name":"Carlos Rodriguez","email":"carlos@s8f.org","url":"http://s8f.org/"},"repository":{"type":"git","url":"git://github.com/carlos8f/node-buffet.git"},"users":{"fgribreau":true},"_attachments":{"buffet-0.3.9.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-q7VhhNOeRA8Gq2K3l7xE1A==","length":568711,"stub":true},"buffet-0.3.8.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-r1Rmwt8GlOY8/jpRlhK4OA==","length":568704,"stub":true},"buffet-0.3.7.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-rl1n0PkEh0cINhkKGeXKQg==","length":568521,"stub":true},"buffet-0.3.6.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-7rKq4s/13t8GLGZ8wZGidQ==","length":568930,"stub":true},"buffet-0.3.5.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-/F2G3PlWSVWCps9cyzmDAQ==","length":568620,"stub":true},"buffet-0.3.4.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-6VLQt1NXfnHIu5sHeNPhNg==","length":568767,"stub":true},"buffet-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-z5HKskoxClznl68GMK92UA==","length":568731,"stub":true},"buffet-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-wYXfp1wqYVnIaT1Y1OJ8AQ==","length":568605,"stub":true},"buffet-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-T0S4uXgCse8QM/maGNr5tw==","length":568607,"stub":true},"buffet-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-On37cQm/TzmwcTBEGx2A0Q==","length":568602,"stub":true},"buffet-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-S6nZGVm+iqFZi9OyG4KKTQ==","length":566677,"stub":true},"buffet-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-VDxjHohaPyHtSMkqPtMp6Q==","length":566633,"stub":true},"buffet-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-bmsPldZz0tw61C171S2iTA==","length":566395,"stub":true},"buffet-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-O4+Ykr5/cEg40EcSKGVrOA==","length":566315,"stub":true},"buffet-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VfEsaFoYtqnD9d3TRutGIQ==","length":1661,"stub":true}}}},
{"id":"buffoon","key":"buffoon","value":{"rev":"11-0577f475b3d913a92f827ed3cb452823"},"doc":{"_id":"buffoon","_rev":"11-0577f475b3d913a92f827ed3cb452823","name":"buffoon","description":"buffer streams into strings, buffers, json or queries","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"buffoon","version":"0.1.0","description":"buffer streams into strings, buffers, json or queries","keywords":["buffering","streams","parsing"],"dependencies":{"common":">=0.2.0"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/maf/.npm/buffoon/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buffoon@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"f107b5f2a25a8ebdd2d29b279d0741cf1effc3d5","tarball":"http://registry.npmjs.org/buffoon/-/buffoon-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"buffoon","version":"0.1.1","description":"buffer streams into strings, buffers, json or queries","keywords":["buffering","streams","parsing"],"dependencies":{"common":">=0.2.0"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/maf/.npm/buffoon/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buffoon@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"0b42fc074525f30a117c06fb2d3ee9e92d7205f2","tarball":"http://registry.npmjs.org/buffoon/-/buffoon-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"buffoon","version":"0.1.2","description":"buffer streams into strings, buffers, json or queries","keywords":["buffering","streams","parsing"],"dependencies":{"common":">=0.1.0"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/maf/.npm/buffoon/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buffoon@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"a9b63fe079482f80f4a9d22dfda6f815706663c1","tarball":"http://registry.npmjs.org/buffoon/-/buffoon-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"buffoon","version":"0.1.3","description":"buffer streams into strings, buffers, json or queries","keywords":["buffering","streams","parsing"],"dependencies":{"common":">=0.1.0"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"main":"./index.js","_npmJsonOpts":{"file":"/Users/maf/.npm/buffoon/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buffoon@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"c3177deb949e7da82099d7fcd30ef2eb09c0a3c4","tarball":"http://registry.npmjs.org/buffoon/-/buffoon-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"buffoon","version":"0.1.4","description":"buffer streams into strings, buffers, json or queries","keywords":["buffering","streams","parsing"],"dependencies":{"common":">=0.1.0"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"main":"./index.js","_npmUser":{"name":"mafintosh","email":"m@ge.tt"},"_id":"buffoon@0.1.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.6.0","_defaultsLoaded":true,"dist":{"shasum":"d1895812ff27284bbca9dc30ec7dd6d30c273d22","tarball":"http://registry.npmjs.org/buffoon/-/buffoon-0.1.4.tgz"},"maintainers":[{"name":"mafintosh","email":"m@ge.tt"}]}},"maintainers":[{"name":"mafintosh","email":"m@ge.tt"}],"time":{"modified":"2011-11-08T17:58:23.163Z","created":"2011-07-29T22:36:38.169Z","0.1.0":"2011-07-29T22:36:38.845Z","0.1.1":"2011-07-29T23:12:15.471Z","0.1.2":"2011-07-31T18:48:50.938Z","0.1.3":"2011-07-31T19:31:53.993Z","0.1.4":"2011-11-08T17:58:23.163Z"},"author":{"name":"Mathias Buus Madsen","email":"mathiasbuus@gmail.com"},"_attachments":{"buffoon-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-mXej58qH5uNqV4YDtNL3Uw==","length":10240,"stub":true},"buffoon-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-i+q2WMLw2ehvFAWJt5IWSw==","length":1057,"stub":true},"buffoon-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4rH3ZGQ+UY8y2PPg3kGigA==","length":1059,"stub":true},"buffoon-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zULHoH2hyZPiaLgukbQQWA==","length":1059,"stub":true},"buffoon-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-yzXVzKl9UGUi6cGv5+DTZA==","length":1055,"stub":true}}}},
{"id":"bugsense","key":"bugsense","value":{"rev":"3-a7a84f983a8512540593afa038cdb9dc"},"doc":{"_id":"bugsense","_rev":"3-a7a84f983a8512540593afa038cdb9dc","name":"bugsense","description":"bugsense API","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bugsense","description":"bugsense API","author":{"name":"Craig Condon"},"version":"0.0.1","dependencies":{},"devDependencies":{},"main":"./lib/node/index.js","directories":{"mesh-src":"./src","lib":"./lib"},"_npmUser":{"name":"architectd","email":"craig.j.condon@gmail.com"},"_id":"bugsense@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"34c2071409c7c289f141642e96aa25313f2a99e6","tarball":"http://registry.npmjs.org/bugsense/-/bugsense-0.0.1.tgz"},"maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}]}},"readme":"Bugsense API for node & web\n\n## Web Usage\n\nAssuming you're using [catchall](/crcn/catchall), just drop-in a one liner.\n\n```html\n<html>\n  <head>\n    <script type=\"text/javascript\" src=\"https://raw.github.com/crcn/mesh-bugsense/master/bugsense.min.js?apiKey=[KEY_HERE]\"></script>\n  </head>\n  <body>\n  </body>\n</html>\n```\n\n## Node Usage\n\n```javascript\n//TODO\n```","maintainers":[{"name":"architectd","email":"craig.j.condon@gmail.com"}],"time":{"modified":"2012-02-18T22:01:21.682Z","created":"2012-02-18T22:01:20.274Z","0.0.1":"2012-02-18T22:01:21.682Z"},"author":{"name":"Craig Condon"},"_attachments":{"bugsense-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-MXySRKtAUand0fpkvnwXvA==","length":20480,"stub":true}}}},
{"id":"bugsnag","key":"bugsnag","value":{"rev":"21-38b2dde0a3dedc192edd008bc7ac203b"},"doc":{"_id":"bugsnag","_rev":"21-38b2dde0a3dedc192edd008bc7ac203b","name":"bugsnag","description":"Bugsnag notifier for node.js scripts","dist-tags":{"latest":"0.1.9"},"versions":{"0.1.0":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.0","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmJsonOpts":{"file":"/Users/simon/.npm/bugsnag/0.1.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bugsnag@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"e991c9551a3bd0086a95c2091d6ae95389c510f4","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.1":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.1","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmJsonOpts":{"file":"/Users/simon/.npm/bugsnag/0.1.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bugsnag@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"9164e41814caa2f1a08901cacfb8487cd4f1cee1","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.1.tgz"},"scripts":{},"maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.2":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.2","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmJsonOpts":{"file":"/Users/simon/.npm/bugsnag/0.1.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bugsnag@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5e222059f3460ba85f1b59c424aa8afd0a940358","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.2.tgz"},"scripts":{},"maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.3":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.3","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmJsonOpts":{"file":"/Users/simon/.npm/bugsnag/0.1.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bugsnag@0.1.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"8e39a87db26d976a752f22d44f1792789d0cc109","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.3.tgz"},"scripts":{},"maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.4":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.4","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmUser":{"name":"snmaynard","email":"simon@snmaynard.com"},"_id":"bugsnag@0.1.4","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5f844ff2d787431deefc46cced99ea50f5f58b31","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.4.tgz"},"readme":"# Bugsnag Node Plugin\n\nNode.js client for [bugsnag](http://www.bugsnag.com).\n\n## Install\n\n``` bash\nnpm install bugsnag\n```\n\n## Usage\n\nTypically you will register for all uncaught exceptions to be sent to bugsnag. The following code will send all uncaught exceptions to bugsnag.\n\n``` javascript\nvar bugsnag = require('bugsnag').register(\"your api key\");\nbugsnag.handleExceptions();\n\nthrow new Error('Uncaught exception');\n```\n\nYou can also send an individual error to bugsnag in the following manner.\n\n``` javascript\nvar bugsnag = require('bugsnag').register(\"your api key\");\nbugsnag.handleExceptions();\n\ntry {\n  throw new Error('Uncaught exception');\n} catch(e) {\n  bugsnag.notify(e);\n}\n```\n\n## Advanced Usage\n\n### Application Version\n\nThe application version is derived from the package.json associated with your project. If that isn't\nsufficient for your needs, it can be set manually using the following API call.\n\n``` javascript\nbugsnag.setApplicationVersion(\"1.1.1\");\n```\n\n### Uncaught Exception Handler\n\nWhen bugsnag catches an uncaught exception, by default it logs the exception and exits the process. If\nyou would prefer different functionality, you can change this behavior by passing a function to bugsnag.\nThis function will be run after bugsnag has notified bugsnag.com and the exception has been processed.\n\n``` javascript\nbugsnag.setUncaughtExceptionHandler(function(){\n  exit(1);\n});\n```","maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.5":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.5","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmUser":{"name":"snmaynard","email":"simon@snmaynard.com"},"_id":"bugsnag@0.1.5","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"aa76585258554b0ed5fe666aaaff0cf534f96e90","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.5.tgz"},"readme":"# Bugsnag Node Plugin\n\nThe Node client is currently in development.","maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.6":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.6","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmUser":{"name":"snmaynard","email":"simon@snmaynard.com"},"_id":"bugsnag@0.1.6","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"c62b31b53aa9da6a9033bcdd8e4b7f1428607987","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.6.tgz"},"readme":"# Bugsnag Node Plugin\n\nThe Node client is currently in development.","maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.7":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.7","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmUser":{"name":"snmaynard","email":"simon@snmaynard.com"},"_id":"bugsnag@0.1.7","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"6490d7add2425b14d87421de1fd2e9a71e9ab17c","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.7.tgz"},"readme":"Official Bugsnag Notifier for Node.js\n=====================================\n\nThe Bugsnag Notifier for Node.js is designed to give you\ninstant notification of exceptions from your Node.js applications. \nBy default, the notifier hooks into `uncaughtException` event, which means any \nuncaught exceptions will trigger a notification to be sent to your Bugsnag\nproject.\n\n\nWhat is Bugsnag?\n----------------\n\n[Bugsnag](http://bugsnag.com) captures exceptions in real-time from your web, \nmobile and desktop applications, helping you to understand and resolve them \nas fast as possible. [Create a free account](http://bugsnag.com).\n\n\nFeatures\n--------\n\n-   Automatic notification of uncaught exceptions\n-   Send your own [non-fatal exceptions](#send-non-fatal-exceptions-to-bugsnag)\n    to Bugsnag\n-   Minimal CPU and memory footprint.\n-   Track which users and urls were affected by an exception.\n-   Optional integration with connect/express middleware to give your exceptions\n    context from the request.\n-   Send additional meta-data along with your exceptions using \n    [`setExtraData`](#setextradata)\n-   Filter sensitive data before sending exceptions with\n    [`setFilters`](#setfilters)\n\n\nInstallation & Setup\n--------------------\n\nAdd bugsnag to your package.json dependencies.\n\n```javascript\n\"dependencies\": {\n    \"bugsnag\": \"latest\"\n}\n```\n\nRun npm install to install the latest bugsnag notifier version.\n\n```bash\nnpm install\n```\n\nRequire bugsnag in your node.js script.\n\n```javascript\nbugsnag = requre(\"bugsnag\");\n```\n\nRegister the bugsnag notifier.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\");\n```\n\nSee the full documentation for the [register](#register) function for more details.\n\n\nUsing Express or Connect Middleware\n-----------------------------------------\n\nIn order to have bugsnag report on any exceptions in your express\nor connect app, you need to configure bugsnag to handle exceptions\nfrom within those libraries. In order to do that, simply pass\nthe bugsnag register call into app.use().\n\n```javascript\napp.use(bugsnag.register(\"your-api-key-goes-here\"))\n```\n\n\nSend Non-Fatal Exceptions to Bugsnag\n------------------------------------\n\nIf you would like to send non-fatal exceptions to Bugsnag, you can pass any\n`Error` object or string to the `notify` method:\n\n```javascript\nbugsnag.notify(new Error(\"Non-fatal\"));\n```\n\nYou can also send additional meta-data with your exception:\n\n```javascript\nbugsnag.notify(new Error(\"Non-fatal\"), {extraData:{username:\"bob-hoskins\"}});\n```\n\n###Manual Error Class\n\nIf you would like to set the class of error that has occurred,\nyou can call the `notifyWithClass` method:\n\n```javascript\nbugsnag.notifyWithClass(\"RuntimeError\", new Error(\"Non-fatal\"));\n```\n\n\nRegister\n-------------\n\nThe bugsnag.register takes an optional second parameter, containing an object of\noptions. The options can be a combination of any of the following.\n\n###releaseStage\n\nBy default, bugsnag looks at the NODE_ENV environment variable to see what releaseStage\nthe script is running in. If that is not set, bugsnag assumes you are running in production.\nIf you want to override this behavior, set the releaseStage as part of the call to register.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{releaseStage:\"development\"});\n```\n\n###appVersion\n\nThe bugsnag notifier will look for a package.json file in the root of the project and pull\nthe application version from that file. If this behavior is incorrect, you can pass an appVersion\ninto register to set your own custom version.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{appVersion:\"1.0.0\"});\n```\n\n###projectRoot\n\nBugsnag highlights stacktrace lines that are in your project for you, and automatically hides code that \nis in third party libraries. If bugsnag is not hiding stacktrace lines in third party libraries, it is\nlikely that the projectRoot is being incorrectly calculated. You can set it when calling register to\na path relative to the bugsnag.js file or an absolute path.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{projectRoot:\"../../../\"});\n```\n\n###packageJSON\n\nIf the bugsnag notifier is unable to locate your package JSON file, you can pass in either a fully\nqualified path, or a path relative to the location of the bugsnag.js file to the register method.\nIf your package.json file is in your project root, this is usually unnecessary.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{packageJSON:\"../../../package.json\"});\n```\n\n###autoNotify\n\nBugsnag will automatically register for the uncaughtexception event. If you do not wish for this\nto happen, you can disable the functionality as part of the register call.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{autoNotify:false});\n```\n\n###notifyReleaseStages\n\nBy default the notifier will only notify bugsnag of production exceptions. If you wish to be notified\nabout development exceptions, then you can set the notifyReleaseStages option.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{notifyReleaseStages:[\"development\", \"production\"]});\n```\n\n###useSSL\n\nBugsnag supports the SSL encryption of exception reports. If you require this level of security, you can\nenable SSL support within the notifier.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{useSSL:true});\n```\n\n\nNotify\n-------------\n\nBoth `notify` and `notifyWithClass` take an optional final object parameter that provides bugsnag with more\ninformation as to what was happening in the node script when the exception occurred.\n\n###context\n\nBugsnag will use any context passed into the notify method when notifying bugsnag of the exception. You can\nset this option to any string value, and you will be able to see the context aggregated in the web dashboard.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {context:\"/users/new\"});\n```\n\n###userId\n\nBugsnag will use any userId passed into the notify method when notifying bugsnag of the exception. You can\nset this option to any string value and bugsnag will use that to count users affected.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {userId: \"bob-hoskins\"});\n```\n\n###req\n\nBugsnag can also pull the context (URL) and userID (remote IP address) from the node.js request object\nif you pass that in to the notify method.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {req: req});\n```\n\n###extraData\n\nBugsnag can also send any extra data you want to be sent along with the exception report to bugsnag. To\ndo this just set the extraData option to an object containing the information you want to send.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {extraData: {username:\"bob-hoskins\"}});\n```\n\n\nConfiguration\n-------------\n\n###setContext\n\nBugsnag uses the concept of \"contexts\" to help display and group your\nexceptions. Contexts represent what was happening in your application at the\ntime an exception occurs. In a network based node app, this would typically\nbe the URL requested. If you provide access to the node.js request object, \nbugsnag will use the URL for you.\n\nIf you would like to set the bugsnag context manually, you can call \n`setContext`:\n\n```javascript\nbugsnag.setContext(\"/images/1.png\");\n```\n\n**Note:** The context here can be overridden when calling bugsnag.notify or\nbugsnag.notifyWithClass.\n\n###setUserId\n\nBugsnag helps you understand how many of your users are affected by each\nexception. In order to do this, we send along a userId with every exception. \nIf you provide access to the node.js request object, bugsnag will use the\nremote IP address to identify the user.\n    \nIf you would like to override this `userId`, for example to set it to be a\nusername of your currently logged in user, you can call `setUserId`:\n\n```javascript\nbugsnag.setUserId(\"leeroy-jenkins\");\n```\n\n**Note:** The userId here can be overridden when calling bugsnag.notify or\nbugsnag.notifyWithClass.\n\n###setExtraData\n\nIt is often very useful to send some extra application or user specific \ndata along with every exception. To do this, you can call the\n`setExtraData` method:\n    \n```javascript\nbugsnag.setExtraData({username: \"bob-hoskins\"});\n```\n\n\nReporting Bugs or Feature Requests\n----------------------------------\n\nPlease report any bugs or feature requests on the github issues page for this\nproject here:\n\n<https://github.com/bugsnag/bugsnag-node/issues>\n\n\nContributing\n------------\n \n-   Check out the latest master to make sure the feature hasn't been \n    implemented or the bug hasn't been fixed yet\n-   Check out the issue tracker to make sure someone already hasn't requested\n    it and/or contributed it\n-   Fork the project\n-   Start a feature/bugfix branch\n-   Commit and push until you are happy with your contribution\n-   Thanks!\n\n\nLicense\n-------\n\nThe Bugsnag node.js notifier is released under the \nMIT License. Read the full license here:\n\n<https://github.com/bugsnag/bugsnag-node/blob/master/LICENSE>","maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.8":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.8","main":"./bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmUser":{"name":"snmaynard","email":"simon@snmaynard.com"},"_id":"bugsnag@0.1.8","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"a494a8a08494b357007f72faa65a060be82329af","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.8.tgz"},"readme":"Official Bugsnag Notifier for Node.js\n=====================================\n\nThe Bugsnag Notifier for Node.js is designed to give you\ninstant notification of exceptions from your Node.js applications. \nBy default, the notifier hooks into `uncaughtException` event, which means any \nuncaught exceptions will trigger a notification to be sent to your Bugsnag\nproject.\n\n\nWhat is Bugsnag?\n----------------\n\n[Bugsnag](http://bugsnag.com) captures exceptions in real-time from your web, \nmobile and desktop applications, helping you to understand and resolve them \nas fast as possible. [Create a free account](http://bugsnag.com).\n\n\nFeatures\n--------\n\n-   Automatic notification of uncaught exceptions\n-   Send your own [non-fatal exceptions](#send-non-fatal-exceptions-to-bugsnag)\n    to Bugsnag\n-   Minimal CPU and memory footprint.\n-   Track which users and urls were affected by an exception.\n-   Optional integration with connect/express middleware to give your exceptions\n    context from the request.\n-   Send additional meta-data along with your exceptions using \n    [`setExtraData`](#setextradata)\n-   Filter sensitive data before sending exceptions with\n    [`setFilters`](#setfilters)\n\n\nInstallation & Setup\n--------------------\n\nAdd bugsnag to your package.json dependencies.\n\n```javascript\n\"dependencies\": {\n    \"bugsnag\": \"latest\"\n}\n```\n\nRun npm install to install the latest bugsnag notifier version.\n\n```bash\nnpm install\n```\n\nRequire bugsnag in your node.js script.\n\n```javascript\nbugsnag = requre(\"bugsnag\");\n```\n\nRegister the bugsnag notifier.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\");\n```\n\nSee the full documentation for the [register](#register) function for more details.\n\n\nUsing Express or Connect Middleware\n-----------------------------------------\n\nIn order to have bugsnag report on any exceptions in your express\nor connect app, you need to configure bugsnag to handle exceptions\nfrom within those libraries. In order to do that, simply pass\nthe bugsnag register call into app.use().\n\n```javascript\napp.use(bugsnag.register(\"your-api-key-goes-here\"))\n```\n\n\nSend Non-Fatal Exceptions to Bugsnag\n------------------------------------\n\nIf you would like to send non-fatal exceptions to Bugsnag, you can pass any\n`Error` object or string to the `notify` method:\n\n```javascript\nbugsnag.notify(new Error(\"Non-fatal\"));\n```\n\nYou can also send additional meta-data with your exception:\n\n```javascript\nbugsnag.notify(new Error(\"Non-fatal\"), {extraData:{username:\"bob-hoskins\"}});\n```\n\n###Manual Error Class\n\nIf you would like to set the class of error that has occurred,\nyou can call the `notifyWithClass` method:\n\n```javascript\nbugsnag.notifyWithClass(\"RuntimeError\", new Error(\"Non-fatal\"));\n```\n\n\nRegister\n-------------\n\nThe bugsnag.register takes an optional second parameter, containing an object of\noptions. The options can be a combination of any of the following.\n\n###releaseStage\n\nBy default, bugsnag looks at the NODE_ENV environment variable to see what releaseStage\nthe script is running in. If that is not set, bugsnag assumes you are running in production.\nIf you want to override this behavior, set the releaseStage as part of the call to register.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{releaseStage:\"development\"});\n```\n\n###appVersion\n\nThe bugsnag notifier will look for a package.json file in the root of the project and pull\nthe application version from that file. If this behavior is incorrect, you can pass an appVersion\ninto register to set your own custom version.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{appVersion:\"1.0.0\"});\n```\n\n###projectRoot\n\nBugsnag highlights stacktrace lines that are in your project for you, and automatically hides code that \nis in third party libraries. If bugsnag is not hiding stacktrace lines in third party libraries, it is\nlikely that the projectRoot is being incorrectly calculated. You can set it when calling register to\na path relative to the bugsnag.js file or an absolute path.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{projectRoot:\"../../../\"});\n```\n\n###packageJSON\n\nIf the bugsnag notifier is unable to locate your package JSON file, you can pass in either a fully\nqualified path, or a path relative to the location of the bugsnag.js file to the register method.\nIf your package.json file is in your project root, this is usually unnecessary.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{packageJSON:\"../../../package.json\"});\n```\n\n###autoNotify\n\nBugsnag will automatically register for the uncaughtexception event. If you do not wish for this\nto happen, you can disable the functionality as part of the register call.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{autoNotify:false});\n```\n\n###notifyReleaseStages\n\nBy default the notifier will only notify bugsnag of production exceptions. If you wish to be notified\nabout development exceptions, then you can set the notifyReleaseStages option.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{notifyReleaseStages:[\"development\", \"production\"]});\n```\n\n###useSSL\n\nBugsnag supports the SSL encryption of exception reports. If you require this level of security, you can\nenable SSL support within the notifier.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{useSSL:true});\n```\n\n\nNotify\n-------------\n\nBoth `notify` and `notifyWithClass` take an optional final object parameter that provides bugsnag with more\ninformation as to what was happening in the node script when the exception occurred.\n\n###context\n\nBugsnag will use any context passed into the notify method when notifying bugsnag of the exception. You can\nset this option to any string value, and you will be able to see the context aggregated in the web dashboard.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {context:\"/users/new\"});\n```\n\n###userId\n\nBugsnag will use any userId passed into the notify method when notifying bugsnag of the exception. You can\nset this option to any string value and bugsnag will use that to count users affected.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {userId: \"bob-hoskins\"});\n```\n\n###req\n\nBugsnag can also pull the context (URL) and userID (remote IP address) from the node.js request object\nif you pass that in to the notify method.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {req: req});\n```\n\nThe notifier will also pull out extra information about the request to help you diagnose the exception\nif you pass the request to the notify method.\n\n###extraData\n\nBugsnag can also send any extra data you want to be sent along with the exception report to bugsnag. To\ndo this just set the extraData option to an object containing the information you want to send.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {extraData: {username:\"bob-hoskins\"}});\n```\n\n\nConfiguration\n-------------\n\n###setContext\n\nBugsnag uses the concept of \"contexts\" to help display and group your\nexceptions. Contexts represent what was happening in your application at the\ntime an exception occurs. In a network based node app, this would typically\nbe the URL requested. If you provide access to the node.js request object, \nbugsnag will use the URL for you.\n\nIf you would like to set the bugsnag context manually, you can call \n`setContext`:\n\n```javascript\nbugsnag.setContext(\"/images/1.png\");\n```\n\n**Note:** The context here can be overridden when calling bugsnag.notify or\nbugsnag.notifyWithClass.\n\n###setUserId\n\nBugsnag helps you understand how many of your users are affected by each\nexception. In order to do this, we send along a userId with every exception. \nIf you provide access to the node.js request object, bugsnag will use the\nremote IP address to identify the user.\n    \nIf you would like to override this `userId`, for example to set it to be a\nusername of your currently logged in user, you can call `setUserId`:\n\n```javascript\nbugsnag.setUserId(\"leeroy-jenkins\");\n```\n\n**Note:** The userId here can be overridden when calling bugsnag.notify or\nbugsnag.notifyWithClass.\n\n###setExtraData\n\nIt is often very useful to send some extra application or user specific \ndata along with every exception. To do this, you can call the\n`setExtraData` method:\n    \n```javascript\nbugsnag.setExtraData({username: \"bob-hoskins\"});\n```\n\n\nReporting Bugs or Feature Requests\n----------------------------------\n\nPlease report any bugs or feature requests on the github issues page for this\nproject here:\n\n<https://github.com/bugsnag/bugsnag-node/issues>\n\n\nContributing\n------------\n \n-   Check out the latest master to make sure the feature hasn't been \n    implemented or the bug hasn't been fixed yet\n-   Check out the issue tracker to make sure someone already hasn't requested\n    it and/or contributed it\n-   Fork the project\n-   Start a feature/bugfix branch\n-   Commit and push until you are happy with your contribution\n-   Thanks!\n\n\nLicense\n-------\n\nThe Bugsnag node.js notifier is released under the \nMIT License. Read the full license here:\n\n<https://github.com/bugsnag/bugsnag-node/blob/master/LICENSE>","maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]},"0.1.9":{"name":"bugsnag","description":"Bugsnag notifier for node.js scripts","version":"0.1.9","main":"./lib/bugsnag.js","homepage":"http://bugsnag.com","dependencies":{"tracejs":">=0.1.0"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_npmUser":{"name":"snmaynard","email":"simon@snmaynard.com"},"_id":"bugsnag@0.1.9","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.8.0","_defaultsLoaded":true,"dist":{"shasum":"f56b924016261b843db659b9763979f9d8ca4c5b","tarball":"http://registry.npmjs.org/bugsnag/-/bugsnag-0.1.9.tgz"},"readme":"Bugsnag Notifier for Node.js\n============================\n\nThe Bugsnag Notifier for Node.js gives you instant notification of exceptions\nfrom your Node.js applications. \nBy default, the notifier hooks into `uncaughtException` event, which means any \nuncaught exceptions will trigger a notification to be sent to your Bugsnag\nproject.\n\n[Bugsnag](http://bugsnag.com) captures errors in real-time from your web, \nmobile and desktop applications, helping you to understand and resolve them \nas fast as possible. [Create a free account](http://bugsnag.com) to start \ncapturing exceptions from your applications.\n\n\nInstallation & Setup\n--------------------\n\nAdd bugsnag to your package.json dependencies.\n\n```javascript\n\"dependencies\": {\n    \"bugsnag\": \"latest\"\n}\n```\n\nRun npm install to install the latest bugsnag notifier version.\n\n```bash\nnpm install\n```\n\nRequire bugsnag in your node.js script.\n\n```javascript\nbugsnag = requre(\"bugsnag\");\n```\n\nRegister the bugsnag notifier.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\");\n```\n\nSee the full documentation for the [register](#register) function for more details.\n\n\nUsing Express or Connect Middleware\n-----------------------------------\n\nIn order to have bugsnag report on any exceptions in your express\nor connect app, you need to configure bugsnag to handle exceptions\nfrom within those libraries. In order to do that, simply pass\nthe bugsnag register call into app.use().\n\n```javascript\napp.use(bugsnag.register(\"your-api-key-goes-here\"))\n```\n\n\nSend Non-Fatal Exceptions to Bugsnag\n------------------------------------\n\nIf you would like to send non-fatal exceptions to Bugsnag, you can pass any\n`Error` object or string to the `notify` method:\n\n```javascript\nbugsnag.notify(new Error(\"Non-fatal\"));\n```\n\nYou can also send additional meta-data with your exception:\n\n```javascript\nbugsnag.notify(new Error(\"Non-fatal\"), {extraData:{username:\"bob-hoskins\"}});\n```\n\n###Manual Error Class\n\nIf you would like to set the class of error that has occurred,\nyou can call the `notifyWithClass` method:\n\n```javascript\nbugsnag.notifyWithClass(\"RuntimeError\", new Error(\"Non-fatal\"));\n```\n\n\nRegister\n-------------\n\nThe bugsnag.register takes an optional second parameter, containing an object of\noptions. The options can be a combination of any of the following.\n\n###releaseStage\n\nBy default, bugsnag looks at the NODE_ENV environment variable to see what releaseStage\nthe script is running in. If that is not set, bugsnag assumes you are running in production.\nIf you want to override this behavior, set the releaseStage as part of the call to register.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{releaseStage:\"development\"});\n```\n\n###appVersion\n\nThe bugsnag notifier will look for a package.json file in the root of the project and pull\nthe application version from that file. If this behavior is incorrect, you can pass an appVersion\ninto register to set your own custom version.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{appVersion:\"1.0.0\"});\n```\n\n###projectRoot\n\nBugsnag highlights stacktrace lines that are in your project for you, and automatically hides code that \nis in third party libraries. If bugsnag is not hiding stacktrace lines in third party libraries, it is\nlikely that the projectRoot is being incorrectly calculated. You can set it when calling register to\na path relative to the bugsnag.js file or an absolute path.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{projectRoot:\"../../../\"});\n```\n\n###packageJSON\n\nIf the bugsnag notifier is unable to locate your package JSON file, you can pass in either a fully\nqualified path, or a path relative to the location of the bugsnag.js file to the register method.\nIf your package.json file is in your project root, this is usually unnecessary.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{packageJSON:\"../../../package.json\"});\n```\n\n###autoNotify\n\nBugsnag will automatically register for the uncaughtexception event. If you do not wish for this\nto happen, you can disable the functionality as part of the register call.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{autoNotify:false});\n```\n\n###notifyReleaseStages\n\nBy default the notifier will only notify bugsnag of production exceptions. If you wish to be notified\nabout development exceptions, then you can set the notifyReleaseStages option.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{notifyReleaseStages:[\"development\", \"production\"]});\n```\n\n###useSSL\n\nBugsnag supports the SSL encryption of exception reports. If you require this level of security, you can\nenable SSL support within the notifier.\n\n```javascript\nbugsnag.register(\"your-api-key-goes-here\",{useSSL:true});\n```\n\n\nNotify\n-------------\n\nBoth `notify` and `notifyWithClass` take an optional final object parameter that provides bugsnag with more\ninformation as to what was happening in the node script when the exception occurred.\n\n###context\n\nBugsnag will use any context passed into the notify method when notifying bugsnag of the exception. You can\nset this option to any string value, and you will be able to see the context aggregated in the web dashboard.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {context:\"/users/new\"});\n```\n\n###userId\n\nBugsnag will use any userId passed into the notify method when notifying bugsnag of the exception. You can\nset this option to any string value and bugsnag will use that to count users affected.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {userId: \"bob-hoskins\"});\n```\n\n###req\n\nBugsnag can also pull the context (URL) and userID (remote IP address) from the node.js request object\nif you pass that in to the notify method.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {req: req});\n```\n\nThe notifier will also pull out extra information about the request to help you diagnose the exception\nif you pass the request to the notify method.\n\n###extraData\n\nBugsnag can also send any extra data you want to be sent along with the exception report to bugsnag. To\ndo this just set the extraData option to an object containing the information you want to send.\n\n```javascript\nbugsnag.notify(new Error(\"Something went badly wrong\"), {extraData: {username:\"bob-hoskins\"}});\n```\n\n\nConfiguration\n-------------\n\n###setContext\n\nBugsnag uses the concept of \"contexts\" to help display and group your\nexceptions. Contexts represent what was happening in your application at the\ntime an exception occurs. In a network based node app, this would typically\nbe the URL requested. If you provide access to the node.js request object, \nbugsnag will use the URL for you.\n\nIf you would like to set the bugsnag context manually, you can call \n`setContext`:\n\n```javascript\nbugsnag.setContext(\"/images/1.png\");\n```\n\n**Note:** The context here can be overridden when calling bugsnag.notify or\nbugsnag.notifyWithClass.\n\n###setUserId\n\nBugsnag helps you understand how many of your users are affected by each\nexception. In order to do this, we send along a userId with every exception. \nIf you provide access to the node.js request object, bugsnag will use the\nremote IP address to identify the user.\n    \nIf you would like to override this `userId`, for example to set it to be a\nusername of your currently logged in user, you can call `setUserId`:\n\n```javascript\nbugsnag.setUserId(\"leeroy-jenkins\");\n```\n\n**Note:** The userId here can be overridden when calling bugsnag.notify or\nbugsnag.notifyWithClass.\n\n###setExtraData\n\nIt is often very useful to send some extra application or user specific \ndata along with every exception. To do this, you can call the\n`setExtraData` method:\n    \n```javascript\nbugsnag.setExtraData({username: \"bob-hoskins\"});\n```\n\n\nReporting Bugs or Feature Requests\n----------------------------------\n\nPlease report any bugs or feature requests on the github issues page for this\nproject here:\n\n<https://github.com/bugsnag/bugsnag-node/issues>\n\n\nContributing\n------------\n\n-   [Fork](https://help.github.com/articles/fork-a-repo) the [notifier on github](https://github.com/bugsnag/bugsnag-node)\n-   Commit and push until you are happy with your contribution\n-   [Make a pull request](https://help.github.com/articles/using-pull-requests)\n-   Thanks!\n\n\nLicense\n-------\n\nThe Bugsnag Node.js notifier is free software released under the MIT License. \nSee [LICENSE.txt](https://github.com/bugsnag/bugsnag-node/blob/master/LICENSE.txt) for details.\n","maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}]}},"maintainers":[{"name":"snmaynard","email":"simon@snmaynard.com"}],"time":{"modified":"2012-07-02T03:52:10.191Z","created":"2012-01-16T01:45:48.893Z","0.1.0":"2012-01-16T01:45:52.859Z","0.1.1":"2012-01-16T02:35:14.265Z","0.1.2":"2012-01-16T03:06:22.989Z","0.1.3":"2012-01-16T03:09:24.280Z","0.1.4":"2012-02-13T08:38:52.814Z","0.1.5":"2012-06-30T19:43:19.636Z","0.1.6":"2012-07-01T08:00:09.569Z","0.1.7":"2012-07-02T02:44:58.126Z","0.1.8":"2012-07-02T03:02:39.487Z","0.1.9":"2012-07-02T03:52:10.191Z"},"repository":{"type":"git","url":"git@github.com:bugsnag/bugsnag-node.git"},"_attachments":{"bugsnag-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-8hLE71yPEObOhhkieNbmVA==","length":6211,"stub":true},"bugsnag-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-GSlzB1YDOEZZZhYP/nhzPA==","length":6418,"stub":true},"bugsnag-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-nWXO7YmRN56HNRJwCw4Kaw==","length":6352,"stub":true},"bugsnag-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-BlWTbxCKaS8sLOZ5vs6JXw==","length":2599,"stub":true},"bugsnag-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-KzNHv4eYxs2va/IUK8Gvsw==","length":1890,"stub":true},"bugsnag-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-ehaiEcAI7zgR8YgpTNGqCQ==","length":2395,"stub":true},"bugsnag-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-vBt91LANf0JHPWVT0GPPPg==","length":1762,"stub":true},"bugsnag-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-LlBYU8uzFTKGgIDv56L6wA==","length":1767,"stub":true},"bugsnag-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-UgdYeDi3AzNuN4v+Q+23Tg==","length":1760,"stub":true},"bugsnag-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i6OR05jW00kCrZJy2wWvNw==","length":1556,"stub":true}}}},
{"id":"bugswarm-cfg","key":"bugswarm-cfg","value":{"rev":"44-94f6b5ca7b5cd05adfa4ac2a0a7bcaa1"},"doc":{"_id":"bugswarm-cfg","_rev":"44-94f6b5ca7b5cd05adfa4ac2a0a7bcaa1","name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.0","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6"},"dependencies":{"superagent":"0.1.3"},"main":"bugswarm-cfg","_npmUser":{"name":"buglabs","email":"camilo@buglabs.net"},"_id":"bugswarm-cfg@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f0d35463161ea46117b2aeef35dbe0e02b6e51bb","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.1.0.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.4":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.4","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6"},"dependencies":{"superagent":"0.1.2"},"main":"bugswarm-cfg","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-cfg@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"354f46d10654972aa95cc361eb4e3d7987869aaf","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.1.4.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.5":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.5","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"mocha":"0.3.6"},"dependencies":{"superagent":"0.1.2"},"main":"bugswarm-cfg","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-cfg@0.1.5","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"95a1f8ceaad97607245a1ff925eccc1136200ace","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.1.5.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.6":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.6","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"mocha":"0.10.0"},"dependencies":{"superagent":"0.1.3"},"main":"bugswarm-cfg","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-cfg@0.1.6","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"607b44351b4ef8d9455285d23a77db83c7661451","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.1.6.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.2.0":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.2.0","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"should":"0.5.1","mocha":"0.10.0"},"dependencies":{"superagent":"0.3.0"},"main":"bugswarm-cfg","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-cfg@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6ff84643e29cab1a4d7be854c68653bb0f56a82f","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.2.0.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.2.1":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.2.1","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"should":"0.5.1","mocha":"0.10.0","bugswarm-prt":"0.2.0"},"dependencies":{"superagent":"0.3.0"},"main":"bugswarm-cfg","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-cfg@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"870864d2a46db7bb2a8327b6bc04ff804755a6ff","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.2.1.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.2.2":{"name":"bugswarm-cfg","description":"[Configuration] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.2.2","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"should":"0.5.1","mocha":"0.10.0","bugswarm-prt":"0.2.2"},"dependencies":{"superagent":"0.3.0"},"main":"bugswarm-cfg","_npmUser":{"name":"c4milo","email":"camilo.aguilar@gmail.com"},"_id":"bugswarm-cfg@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"3197b355a42802f50ed71fb797159e56f082d1e6","tarball":"http://registry.npmjs.org/bugswarm-cfg/-/bugswarm-cfg-0.2.2.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"},{"name":"c4milo","email":"camilo.aguilar@gmail.com"}]}},"readme":"# BUGswarm NodeJS library\n\nThis library has two main modules: participation and configuration. Use the\nthe configuration module to set up your swarms, resources as well as to manage \ninvitations and API keys. Use the participation module to send and receive\nmessages and binary data.\n\nThis library is an implementation of \n[BUGswarm API](http://developer.bugswarm.net/).\n\n### Features\n* Manages swarms, resources, invitations and apikeys.\n* Sends and receives private and public messages, as well as presence, \n  between swarms and resources.\n* Sends and receives binary files.\n\n### Installation\n`npm install bugswarm`\n\n### Usage example\n\nProducing data:\n\n```javascript\n//TODO\n```\n\nConsuming:\n\n```javascript\n//TODO\n```\n\nTake a look at the [documentation]() for details about the library API and, \nfor more comprehensive examples, at the [examples]() directory. \n\n### Fork it, improve it and send us pull requests.\n```shell\ngit clone git@github.com:buglabs/bugswarm-api.git && cd bugswarm-api/nodejs\n```\n\n## License\n(The MIT License)\n\nCopyright 2011 BugLabs. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\n\n","maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"},{"name":"c4milo","email":"camilo.aguilar@gmail.com"}],"time":{"modified":"2012-03-23T19:07:55.093Z","created":"2011-12-13T22:57:10.754Z","0.1.0":"2011-12-13T22:57:11.065Z","0.1.4":"2012-01-05T01:51:52.980Z","0.1.5":"2012-01-13T20:26:23.081Z","0.1.6":"2012-01-13T22:27:06.032Z","0.2.0":"2012-02-16T16:27:10.699Z","0.2.1":"2012-02-24T23:40:32.499Z","0.2.2":"2012-03-23T19:07:55.093Z"},"author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"_attachments":{"bugswarm-cfg-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-k+gZ6RKtHL38IdafeMuLqQ==","length":9336,"stub":true},"bugswarm-cfg-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-o7D2tL/8/q6C4xcBjfh/Pw==","length":9271,"stub":true},"bugswarm-cfg-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-oi9TtsDzS2knY2zcba1Edw==","length":7560,"stub":true},"bugswarm-cfg-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-psPmNQd/IhW2p0zuAJ2P5w==","length":7626,"stub":true},"bugswarm-cfg-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-X2LZn065BFRKV/e9zz1QMA==","length":7621,"stub":true},"bugswarm-cfg-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ezc5rrd8WM/JJ6COU0yE5w==","length":10240,"stub":true},"bugswarm-cfg-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OYBD9AMtzQ8BND6XsaAVMg==","length":10240,"stub":true}}}},
{"id":"bugswarm-prt","key":"bugswarm-prt","value":{"rev":"42-28d2217ceb59f2a9880e0480ca325860"},"doc":{"_id":"bugswarm-prt","_rev":"42-28d2217ceb59f2a9880e0480ca325860","name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.0","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.0"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"camilo@buglabs.net"},"_id":"bugswarm-prt@0.1.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"af8b0c16cea7510bfb2ea0bb4584d079ae581bdd","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.0.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.4":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.4","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.4"},"dependencies":{"superagent":"https://github.com/downloads/c4milo/superagent/7714da.tgz"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5e1a3302b6a0f3085c792525bc2907ef314aabb6","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.4.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.5":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.5","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.4"},"dependencies":{"superagent":"https://github.com/downloads/c4milo/superagent/7714da.tgz"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.1.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"e79409c6e41919cdfcc25b50104023eae66cdd14","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.5.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.6":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.6","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.4"},"dependencies":{"superagent":"https://github.com/downloads/c4milo/superagent/7714da.tgz"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.1.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d8617a79b130a769d907c2669b9fb44a5ac8c52a","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.6.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.7":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.7","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":">= 0.4.3 < 0.6.2"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.4"},"dependencies":{"superagent":"https://github.com/downloads/c4milo/superagent/7714da.tgz"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.1.7","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b719cf67f5cb5e31b88e18176c1d5557e448a0ed","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.7.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.8":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.8","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.5"},"dependencies":{"superagent":"https://github.com/downloads/c4milo/superagent/7714da.tgz"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.1.8","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"9728b12daee9c3951319f07d418931eebab8c33b","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.8.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.1.9":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.1.9","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"mocha":"0.3.6","bugswarm-cfg":"0.1.5"},"dependencies":{"superagent":"https://github.com/c4milo/superagent/tarball/v0.1.5"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.1.9","_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"0ae5a10374b713d2e6fa0f8c264fd07cafb0a310","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.1.9.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.2.0":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.2.0","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"should":"0.5.1","mocha":"0.11.0","bugswarm-cfg":"0.2.0"},"dependencies":{"superagent":"https://github.com/c4milo/superagent/tarball/v0.1.5"},"main":"bugswarm-prt","_npmUser":{"name":"buglabs","email":"eng@buglabs.net"},"_id":"bugswarm-prt@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"e31e1c55f393f114c5ea67ae706662188a85c4ea","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.2.0.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"}],"directories":{}},"0.2.1":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.2.1","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"should":"0.5.1","mocha":"0.11.0","bugswarm-cfg":"0.2.0"},"dependencies":{"superagent":"https://github.com/c4milo/superagent/tarball/v0.1.5"},"main":"bugswarm-prt","_npmUser":{"name":"c4milo","email":"camilo.aguilar@gmail.com"},"_id":"bugswarm-prt@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"9bda4df87ed298ef65dc3d89b015ee18cc02100b","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.2.1.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"},{"name":"c4milo","email":"camilo.aguilar@gmail.com"}],"directories":{}},"0.2.2":{"name":"bugswarm-prt","description":"[Participation] BUGswarm is platform that allows you to share and access your hardware sensor data easily and effortlessly.","version":"0.2.2","keywords":["m2m","IoT","realtime","messaging","sensor","hardware","socket","configuration"],"homepage":"http://developer.bugswarm.net","author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"engines":{"node":"0.6"},"devDependencies":{"should":"0.6.0","mocha":"0.14.1","bugswarm-cfg":"0.2.2"},"dependencies":{"superagent":"https://github.com/c4milo/superagent/tarball/v0.1.5"},"main":"bugswarm-prt","_npmUser":{"name":"c4milo","email":"camilo.aguilar@gmail.com"},"_id":"bugswarm-prt@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"665bda7ae705d4f2ec8d027b8603dd34958006ed","tarball":"http://registry.npmjs.org/bugswarm-prt/-/bugswarm-prt-0.2.2.tgz"},"maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"},{"name":"c4milo","email":"camilo.aguilar@gmail.com"}]}},"readme":"# BUGswarm NodeJS library\n\nThis library has two main modules: participation and configuration. Use the\nthe configuration module to set up your swarms, resources as well as to manage \ninvitations and API keys. Use the participation module to send and receive\nmessages and binary data.\n\nThis library is an implementation of \n[BUGswarm API](http://developer.bugswarm.net/).\n\n### Features\n* Manages swarms, resources, invitations and apikeys.\n* Sends and receives private and public messages, as well as presence, \n  between swarms and resources.\n* Sends and receives binary files.\n\n### Installation\n`npm install bugswarm`\n\n### Usage example\n\nProducing data:\n\n```javascript\n//TODO\n```\n\nConsuming:\n\n```javascript\n//TODO\n```\n\nTake a look at the [documentation]() for details about the library API and, \nfor more comprehensive examples, at the [examples]() directory. \n\n### Fork it, improve it and send us pull requests.\n```shell\ngit clone git@github.com:buglabs/bugswarm-api.git && cd bugswarm-api/nodejs\n```\n\n## License\n(The MIT License)\n\nCopyright 2011 BugLabs. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\n\n","maintainers":[{"name":"buglabs","email":"camilo@buglabs.net"},{"name":"c4milo","email":"camilo.aguilar@gmail.com"}],"time":{"modified":"2012-03-23T19:06:50.325Z","created":"2011-12-13T23:02:56.186Z","0.1.0":"2011-12-13T23:02:56.532Z","0.1.4":"2012-01-04T20:39:14.425Z","0.1.5":"2012-01-05T18:04:00.544Z","0.1.6":"2012-01-10T21:12:40.986Z","0.1.7":"2012-01-12T06:01:41.486Z","0.1.8":"2012-01-13T20:28:26.574Z","0.1.9":"2012-01-14T01:34:33.449Z","0.2.0":"2012-02-05T17:55:35.966Z","0.2.1":"2012-03-13T14:49:47.821Z","0.2.2":"2012-03-23T19:06:50.325Z"},"author":{"name":"BugLabs Inc."},"repository":{"type":"git","url":"git://github.com/buglabs/bugswarm-api.git"},"_attachments":{"bugswarm-prt-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-Hoixc5fVJGixb1prW5AikA==","length":41556,"stub":true},"bugswarm-prt-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-SW/TZ4Udj6wL/Z6WADVOXg==","length":41539,"stub":true},"bugswarm-prt-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-W18qaokOw0LpiXAdN+z7/A==","length":41499,"stub":true},"bugswarm-prt-0.1.9.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-ZwxBcOcGF/GmSxF1vM3Ebg==","length":41421,"stub":true},"bugswarm-prt-0.1.8.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-C3ZixehYMa9uSzC8a79opw==","length":41430,"stub":true},"bugswarm-prt-0.1.7.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-kPP+X3kSdiu2FSJOQtVDWQ==","length":40960,"stub":true},"bugswarm-prt-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ipay3EqGdj7mqeoW5Xs2Hw==","length":40960,"stub":true},"bugswarm-prt-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-nfYLtfdt6hxC2R2vZTO5BA==","length":40960,"stub":true},"bugswarm-prt-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WyZaKDsDgjyfhYmYjzfYgw==","length":40960,"stub":true},"bugswarm-prt-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mXpecO3R4OvRAIodSs2i4A==","length":10240,"stub":true}}}},
{"id":"build","key":"build","value":{"rev":"13-64e95bb589705be3f8c5adca1f52eb34"},"doc":{"_id":"build","_rev":"13-64e95bb589705be3f8c5adca1f52eb34","name":"build","description":"An ant-like build program for node","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.1":{"author":{"name":"Jonathan Bomgardner","email":"jon@solagratiadesigns.com","url":"http://solagratiadesigns.com"},"name":"build","description":"An ant-like build program for node","version":"0.1.1","repository":{"type":"git","url":"git://github.com/jonlb/node-build.git"},"main":"./builder.js","engines":{"node":"~v0.4.12"},"dependencies":{"jxLoader":"*","moo-server":"*","promised-io":"*","walker":"1.x","winston":"*","jsmin":"1.x","cssmin":"0.3.x","uglify-js":"1.x","wrench":"1.3.x","timespan":"2.x"},"devDependencies":{},"_npmUser":{"name":"jonlb","email":"jon@solagratiadesigns.com"},"_id":"build@0.1.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b5cc49021d38008ca052ea9b22e101f1f41e4c9d","tarball":"http://registry.npmjs.org/build/-/build-0.1.1.tgz"},"maintainers":[{"name":"jonlb","email":"jon@solagratiadesigns.com"}],"directories":{}},"0.1.2":{"author":{"name":"Jonathan Bomgardner","email":"jon@solagratiadesigns.com","url":"http://solagratiadesigns.com"},"name":"build","description":"An ant-like build program for node","version":"0.1.2","repository":{"type":"git","url":"git://github.com/jonlb/node-build.git"},"main":"./builder.js","engines":{"node":">v0.4.12"},"dependencies":{"jxLoader":"*","moo-server":"*","promised-io":"*","walker":"1.x","winston":"*","jsmin":"1.x","cssmin":"0.3.x","uglify-js":"1.x","wrench":"1.3.x","timespan":"2.x"},"devDependencies":{},"_npmUser":{"name":"jonlb","email":"jon@solagratiadesigns.com"},"_id":"build@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"9857c7f08435034269cbdf684942d49510369c0d","tarball":"http://registry.npmjs.org/build/-/build-0.1.2.tgz"},"maintainers":[{"name":"jonlb","email":"jon@solagratiadesigns.com"}],"directories":{}},"0.1.3":{"author":{"name":"Jonathan Bomgardner","email":"jon@solagratiadesigns.com","url":"http://solagratiadesigns.com"},"name":"build","description":"An ant-like build program for node","version":"0.1.3","repository":{"type":"git","url":"git://github.com/jonlb/node-build.git"},"main":"./builder.js","engines":{"node":">v0.4.12"},"dependencies":{"jxLoader":"*","moo-server":"*","promised-io":"*","walker":"1.x","winston":"*","jsmin":"1.x","cssmin":"0.3.x","uglify-js":"1.x","wrench":"1.3.x","timespan":"2.x"},"devDependencies":{},"_npmUser":{"name":"jonlb","email":"jon@solagratiadesigns.com"},"_id":"build@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"69f98cf44ea9d7aaca210558a942339a8d275838","tarball":"http://registry.npmjs.org/build/-/build-0.1.3.tgz"},"maintainers":[{"name":"jonlb","email":"jon@solagratiadesigns.com"}]},"0.1.4":{"author":{"name":"Jonathan Bomgardner","email":"jon@solagratiadesigns.com","url":"http://solagratiadesigns.com"},"name":"build","description":"An ant-like build program for node","version":"0.1.4","repository":{"type":"git","url":"git://github.com/jonlb/node-build.git"},"main":"./builder.js","engines":{"node":">v0.4.12"},"dependencies":{"jxLoader":"*","moo-server":"*","promised-io":"*","walker":"1.x","winston":"*","jsmin":"1.x","cssmin":"0.3.x","uglify-js":"1.x","wrench":"1.3.x","timespan":"2.x"},"devDependencies":{},"_npmUser":{"name":"jonlb","email":"jon@solagratiadesigns.com"},"_id":"build@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"707fe026ffceddcacbfdcdf356eafda64f151046","tarball":"http://registry.npmjs.org/build/-/build-0.1.4.tgz"},"maintainers":[{"name":"jonlb","email":"jon@solagratiadesigns.com"}]}},"readme":null,"maintainers":[{"name":"jonlb","email":"jon@solagratiadesigns.com"}],"time":{"modified":"2012-02-05T06:23:06.797Z","created":"2011-11-12T17:36:43.229Z","0.1.1":"2011-11-12T17:36:44.683Z","0.1.2":"2011-12-17T18:54:06.172Z","0.1.3":"2012-02-05T06:15:28.430Z","0.1.4":"2012-02-05T06:23:06.797Z"},"author":{"name":"Jonathan Bomgardner","email":"jon@solagratiadesigns.com","url":"http://solagratiadesigns.com"},"repository":{"type":"git","url":"git://github.com/jonlb/node-build.git"},"_attachments":{"build-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-eNOh1+Tx3//2LpF/KMfVcQ==","length":5240,"stub":true},"build-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-dBxVPZYuVKfGSyq16cyZJw==","length":5238,"stub":true},"build-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1YOpGBGXfRwBD8W/HgQWDA==","length":4564,"stub":true},"build-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-e3rQKO7dfQXjyX7j68fibQ==","length":4570,"stub":true}}}},
{"id":"build-tasks","key":"build-tasks","value":{"rev":"9-cb7cf30a4c20e03acd68411b74bc0b1c"},"doc":{"_id":"build-tasks","_rev":"9-cb7cf30a4c20e03acd68411b74bc0b1c","name":"build-tasks","description":"Build tasks for Backbone Boilerplate","dist-tags":{"latest":"0.1.1"},"versions":{"0.0.0":{"author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"name":"build-tasks","description":"Build tasks for Backbone Boilerplate","version":"0.0.0","repository":{"type":"git","url":"git://github.com/tbranyen/build-tasks.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"build-tasks@0.0.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"89da9a56674b5d327a2cf6b4f30cd52437c01391","tarball":"http://registry.npmjs.org/build-tasks/-/build-tasks-0.0.0.tgz"},"readme":"","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.0.1":{"author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"name":"build-tasks","description":"Build tasks for Backbone Boilerplate","version":"0.0.1","repository":{"type":"git","url":"git://github.com/tbranyen/build-tasks.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"build-tasks@0.0.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"bab8a279464fa6ba14a560a43db62149b8294098","tarball":"http://registry.npmjs.org/build-tasks/-/build-tasks-0.0.1.tgz"},"readme":"","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.1.0":{"author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"name":"build-tasks","description":"Build tasks for Backbone Boilerplate","version":"0.1.0","repository":{"type":"git","url":"git://github.com/tbranyen/build-tasks.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"build-tasks@0.1.0","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"19f43f86a272f0777b1bf766ab95cc54b2cf6710","tarball":"http://registry.npmjs.org/build-tasks/-/build-tasks-0.1.0.tgz"},"readme":"","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]},"0.1.1":{"author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"name":"build-tasks","description":"Build tasks for Backbone Boilerplate","version":"0.1.1","repository":{"type":"git","url":"git://github.com/tbranyen/build-tasks.git"},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"tbranyen","email":"tim@tabdeveloper.com"},"_id":"build-tasks@0.1.1","_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"68060d641bb7b146e88502f90316a41310b88bb2","tarball":"http://registry.npmjs.org/build-tasks/-/build-tasks-0.1.1.tgz"},"readme":"","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}]}},"readme":"","maintainers":[{"name":"tbranyen","email":"tim@tabdeveloper.com"}],"time":{"modified":"2012-03-29T03:01:11.509Z","created":"2012-03-28T03:30:04.997Z","0.0.0":"2012-03-28T03:30:05.694Z","0.0.1":"2012-03-29T02:33:23.453Z","0.1.0":"2012-03-29T02:47:31.418Z","0.1.1":"2012-03-29T03:01:11.509Z"},"author":{"name":"Tim Branyen","email":"tim@tabdeveloper.com","url":"@tbranyen"},"repository":{"type":"git","url":"git://github.com/tbranyen/build-tasks.git"},"_attachments":{"build-tasks-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-44HVH3zQ7NtHL+NSazjH4A==","length":1180768,"stub":true},"build-tasks-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-6BcM3TUxUNlPuXHloxkjbQ==","length":1180731,"stub":true},"build-tasks-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-V/+qjzJLof8Q47Bq9K8rLQ==","length":1180752,"stub":true},"build-tasks-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-WmghlBx1WJ0JtTzUxqPJaw==","length":1178969,"stub":true}}}},
{"id":"build.js","key":"build.js","value":{"rev":"19-968fda365ccfa8f4f01171c096151497"},"doc":{"_id":"build.js","_rev":"19-968fda365ccfa8f4f01171c096151497","name":"build.js","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.3":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.1.3","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"engines":{"node":"~0.6.2"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.1.3","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"7a9f11a51a617260c4500f8e07999502c93075c8","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.1.3.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.1.4":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.1.4","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"engines":{"node":"~0.6.2"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.1.4","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"d1abdb112e42b8afda712fd76e6f341402b80117","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.1.4.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.2.0":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.2.0","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"engines":{"node":"~0.6.2"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.2.0","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"9616d3311e70df3f424db07635982135069c8e8a","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.2.0.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.2.1":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.2.1","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"8dd3d07766321d78c0176d938f84624becc80600","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.2.1.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.2.2":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.2.2","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"9ec56ab5ad941379a2450c51e0ab9e155adb4821","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.2.2.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.2.3":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.2.3","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"2437db48ea3c045bdb0880fa495dc130c33c489d","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.2.3.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.2.4":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.2.4","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"85ae917ae2d7d3225f1e76a9fdcf5397048b5ab8","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.2.4.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.2.5":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.2.5","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.2.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"fe9bcde5e5fa40bbeea31c4efda9a36d8315aa08","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.2.5.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]},"0.3.0":{"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"name":"build.js","version":"0.3.0","repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"dependencies":{"walk":"*"},"devDependencies":{"jasmine-node":"*"},"main":"lib/main.js","_npmUser":{"name":"petrjanda","email":"petrjanda@me.com"},"_id":"build.js@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"2504688c79f2b868189016222c33eb39b9df41d0","tarball":"http://registry.npmjs.org/build.js/-/build.js-0.3.0.tgz"},"maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}]}},"readme":"# Basement = node.js web pipeline\n\nBasement target is to simpify life to frontend developers. Idea comes from Ruby driven project called rake pipeline.\nYou are allowed to define your file processing in a declarative way, in order to automate your build system for your\nfrontend application.\n\nBecause basement, can be integrated to any node.js application, its target is to extend your reach within your one and\nonly development server, without need to spawn any other tool.\n\n## How does it work?\n\nThe system watch in a given location, once you specify in your pipeline configuration. Each time you create / update / delete the file, its content is reloaded and together with other loaded files pipeline processing is invoked. In order\nto customize its behavior, you are able to build it up from couple predefined filters.\n\n## How to start?\n\nInstallation with npm is easy as:\n\n    npm install basement\n\nThen anywhere in your application create a pipeline definition. If you write Ember.js app with handlebars templates, it\nmight look like this:\n\n```javascript\nPipeline = require('basement').Pipeline;\nClosureFilter = require('basement').ClosureFilter;\nConcatFilter = require('basement').ConcatFilter;\nHandlebarsCompileFilter = require('basement').HandlebarsCompileFilter;\n\nnew Pipeline({\n  input: 'frontend/lib',\n  output: 'application.js',\n  pattern: '*.js',\n\n  filters: [\n    new ClosureFilter(),\n    new ConcatFilter({\n      separator: '\\n\\n'\n    })\n  ]\n})\n\nnew Pipeline({\n  input: 'frontend/lib/templates/',\n  output: 'application.templates.js',\n  pattern: '*.handlebars',\n\n  filters: [\n    new HandlebarsCompileFilter(),\n    new ConcatFilter({\n      separator: '\\n'\n    })\n  ]\n})\n```\n\nThe definition should be self descripting. Per pipeline you specify input folder and output file and a pattern, which is\nused to filter only specific files. Pattern might also look for instance like ```*_test.js``` to compile your tests together.\n\nThe list of filters is executed in a specific order. \n\n## Extend with your own filters\n\nThe simpliest filter which just proxy content, without any modification might look like this.\n\n```javascript\nmodule.exports = MyFilter = function(options) {}\n\nMyFilter.prototype.process = function(data) {\n  for(var i in data) {\n    data[i] = data[i]\n  }\n\n  return data;\n}\n```","maintainers":[{"name":"petrjanda","email":"petrjanda@me.com"}],"time":{"modified":"2012-05-20T20:57:54.133Z","created":"2012-02-05T19:55:20.194Z","0.1.3":"2012-02-05T19:55:23.808Z","0.1.4":"2012-02-05T20:00:17.013Z","0.2.0":"2012-02-06T21:04:00.072Z","0.2.1":"2012-02-20T18:15:43.099Z","0.2.2":"2012-05-17T06:10:42.534Z","0.2.3":"2012-05-19T17:56:45.044Z","0.2.4":"2012-05-20T20:42:23.667Z","0.2.5":"2012-05-20T20:44:46.725Z","0.3.0":"2012-05-20T20:57:54.133Z"},"author":{"name":"Petr Janda","email":"petr@ngneers.com","url":"http://twitter.com/petrjanda"},"repository":{"type":"git","url":"git://github.com/petrjanda/build.js.git"},"_attachments":{"build.js-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-LRq8XzMQ9UEIHeRbyW3AAQ==","length":10240,"stub":true},"build.js-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-IM0c+EppTvUHdiwAjCWlCA==","length":10240,"stub":true},"build.js-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Fivwfde8BqhO5OX5RLwpcQ==","length":10240,"stub":true},"build.js-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-68WN0ZFTlP0JitpWwW0YEw==","length":10240,"stub":true},"build.js-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-8pJwysu0Q7sKByIl92+xxQ==","length":10240,"stub":true},"build.js-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-671ZHINPaABX1Lcwb+8myA==","length":10240,"stub":true},"build.js-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-U+dTsYgTYWJVLSCIEH6WMQ==","length":10240,"stub":true},"build.js-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-1Er90+jznQps/KV6CV+Qpg==","length":10240,"stub":true},"build.js-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-X3QZB3xCdilqdtLFMo0R2A==","length":10240,"stub":true}}}},
{"id":"buildbot-github","key":"buildbot-github","value":{"rev":"11-607eec5ed404d8efa2ee46acd0505288"},"doc":{"_id":"buildbot-github","_rev":"11-607eec5ed404d8efa2ee46acd0505288","name":"buildbot-github","description":"A module which listens for Github webhook events and triggers a Buildbot build when a comment with trigger string defined in a config is found in a pull request.","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"name":"buildbot-github","description":"A module which listens for Github webhook events and triggers a Buildbot build when a comment with trigger string defined in a config is found in a pull request.","version":"0.2.0","author":{"name":"Tomaz Muraus","email":"tomaz+npm@cloudkick.com"},"keywords":["github","git","buildbot"],"homepage":"https://github.com/Kami/node-buildbot-github","repository":{"type":"git","url":"git://github.com/Kami/node-buildbot-github.git"},"directories":{"lib":"./lib","bin":"./bin"},"scripts":{},"dependencies":{"github":"= 0.0.6","logmagic":">= 0.1.4","optimist":"= 0.2.8","async":">= 0.1.4","sprintf":">= 0.1.1"},"devDependencies":{"node-dev":"0.1.5"},"engines":{"node":">= 0.4.0"},"main":"./index","bin":{"buildbot-github":"./bin/buildbot-github"},"_npmJsonOpts":{"file":"/home/vagrant/.npm/buildbot-github/0.2.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildbot-github@0.2.0","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"7e03b962b55138643fcaee6bed417dbff6196105","tarball":"http://registry.npmjs.org/buildbot-github/-/buildbot-github-0.2.0.tgz"},"maintainers":[{"name":"kami","email":"tomaz@tomaz.me"}]},"0.2.1":{"name":"buildbot-github","description":"A module which listens for Github webhook events and triggers a Buildbot build when a comment with trigger string defined in a config is found in a pull request.","version":"0.2.1","author":{"name":"Tomaz Muraus","email":"tomaz+npm@cloudkick.com"},"keywords":["github","git","buildbot"],"homepage":"https://github.com/Kami/node-buildbot-github","repository":{"type":"git","url":"git://github.com/Kami/node-buildbot-github.git"},"directories":{"lib":"./lib","bin":"./bin"},"scripts":{},"dependencies":{"github":"= 0.0.6","logmagic":">= 0.1.4","optimist":"= 0.2.8","async":">= 0.1.4","sprintf":">= 0.1.1"},"devDependencies":{"node-dev":"0.1.5"},"engines":{"node":">= 0.4.0"},"main":"./index","bin":{"buildbot-github":"./bin/buildbot-github"},"_npmJsonOpts":{"file":"/home/vagrant/.npm/buildbot-github/0.2.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildbot-github@0.2.1","_engineSupported":true,"_npmVersion":"1.0.27","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"d38d359f33a1d5f8284acd476f3592793b1d91ce","tarball":"http://registry.npmjs.org/buildbot-github/-/buildbot-github-0.2.1.tgz"},"maintainers":[{"name":"kami","email":"tomaz@tomaz.me"}]},"0.2.2":{"name":"buildbot-github","description":"A module which listens for Github webhook events and triggers a Buildbot build when a comment with trigger string defined in a config is found in a pull request.","version":"0.2.2","author":{"name":"Tomaz Muraus","email":"tomaz+npm@cloudkick.com"},"keywords":["github","git","buildbot"],"homepage":"https://github.com/Kami/node-buildbot-github","repository":{"type":"git","url":"git://github.com/Kami/node-buildbot-github.git"},"directories":{"lib":"./lib","bin":"./bin"},"scripts":{},"dependencies":{"github":"= 0.0.6","logmagic":">= 0.1.4","optimist":"= 0.2.8","async":">= 0.1.4","sprintf":">= 0.1.1"},"devDependencies":{"node-dev":"0.1.5"},"engines":{"node":">= 0.4.0"},"licenses":[{"type":"Apache","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}],"main":"./index","bin":{"buildbot-github":"./bin/buildbot-github"},"_npmUser":{"name":"kami","email":"tomaz+npm@tomaz.me"},"_id":"buildbot-github@0.2.2","_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.13-pre","_defaultsLoaded":true,"dist":{"shasum":"a367e349433b67a7c39004b3aac188c4eed50f13","tarball":"http://registry.npmjs.org/buildbot-github/-/buildbot-github-0.2.2.tgz"},"maintainers":[{"name":"kami","email":"tomaz@tomaz.me"}]}},"maintainers":[{"name":"kami","email":"tomaz@tomaz.me"}],"time":{"modified":"2012-01-04T03:12:00.278Z","created":"2011-10-21T16:37:56.957Z","0.2.0":"2011-10-21T16:37:58.699Z","0.2.1":"2011-10-23T01:02:15.890Z","0.2.2":"2012-01-04T03:12:00.278Z"},"author":{"name":"Tomaz Muraus","email":"tomaz+npm@cloudkick.com"},"repository":{"type":"git","url":"git://github.com/Kami/node-buildbot-github.git"},"_attachments":{"buildbot-github-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hFWNeeHWPVrdnxGMk+4FcQ==","length":26745,"stub":true},"buildbot-github-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6e58bvnwPeqmkWNByl9gUQ==","length":23957,"stub":true},"buildbot-github-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-U+o3ybyfJo7wSZBhDc0jKA==","length":23877,"stub":true}}}},
{"id":"builder","key":"builder","value":{"rev":"25-b9679e2aaffec1ac6d59fdd259d9590c"},"doc":{"_id":"builder","_rev":"25-b9679e2aaffec1ac6d59fdd259d9590c","name":"builder","description":"Liberal JavaScript DOM builder","dist-tags":{"latest":"1.0.1"},"versions":{"0.0.1":{"name":"builder","description":"Liberal JavaScript DOM builder","version":"0.0.1","author":{"name":"Ryan Eastridge","email":"ryan@syntacticx.com"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/syntacticx/builder.git"},"bugs":{"url":"http://github.com/syntacticx/builder/issues"},"main":"./builder.js","dependencies":{},"devDependencies":{},"_id":"builder@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"c99cc23eaad3fbea25d7e9669f37c3c84ca57ffd","tarball":"http://registry.npmjs.org/builder/-/builder-0.0.1.tgz"},"scripts":{},"directories":{}},"0.0.2":{"name":"builder","description":"Liberal JavaScript DOM builder","version":"0.0.2","author":{"name":"Ryan Eastridge","email":"ryan@syntacticx.com"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/syntacticx/builder.git"},"bugs":{"url":"http://github.com/syntacticx/builder/issues"},"main":"./builder.js","dependencies":{},"devDependencies":{},"_id":"builder@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"d1a6cc249ea08367617358d5743f7f27c9140a5c","tarball":"http://registry.npmjs.org/builder/-/builder-0.0.2.tgz"},"scripts":{},"directories":{}},"1.0.0":{"name":"builder","description":"Liberal JavaScript DOM builder","version":"1.0.0","author":{"name":"Ryan Eastridge","email":"ryan@syntacticx.com"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/syntacticx/builder.git"},"bugs":{"url":"http://github.com/syntacticx/builder/issues"},"main":"./builder.js","dependencies":{},"devDependencies":{},"_id":"builder@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ae0cd647a6005a1b0f02605f8c001a1469f65068","tarball":"http://registry.npmjs.org/builder/-/builder-1.0.0.tgz"},"scripts":{},"directories":{}},"1.0.1":{"name":"builder","description":"Liberal JavaScript DOM builder","version":"1.0.1","url":"https://github.com/syntacticx/builder/","homepage":"https://github.com/syntacticx/builder/","author":{"name":"Ryan Eastridge","email":"ryan@syntacticx.com"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/syntacticx/builder.git"},"bugs":{"url":"http://github.com/syntacticx/builder/issues"},"main":"./builder.js","dependencies":{},"devDependencies":{},"_id":"builder@1.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"48f03fdae4555830949060f0f0b6a784d470d833","tarball":"http://registry.npmjs.org/builder/-/builder-1.0.1.tgz"},"scripts":{}}},"maintainers":[{"name":"syntacticx","email":"ryan@syntacticx.com"}],"time":{"modified":"2011-06-22T17:41:55.459Z","created":"2011-06-10T20:48:25.210Z","0.0.1":"2011-06-10T20:48:25.845Z","0.0.2":"2011-06-10T21:11:12.666Z","1.0.0":"2011-06-10T21:54:28.213Z","1.0.1":"2011-06-10T21:55:17.871Z"},"author":{"name":"Ryan Eastridge","email":"ryan@syntacticx.com"},"repository":{"type":"git","url":"git://github.com/syntacticx/builder.git"},"_attachments":{"builder-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-FXG5O2SdxZtQyVYcIyPOtg==","length":4694,"stub":true},"builder-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-0/KtVhelksSq7RSt5MZ5YA==","length":4590,"stub":true},"builder-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KRS0it6IWM58zTCSGYYdbw==","length":3895,"stub":true},"builder-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-J6PTs1AMmRE8fPHoD643jg==","length":2147,"stub":true}}}},
{"id":"buildfu","key":"buildfu","value":{"rev":"17-dd0ffdd4001126502856198501311220"},"doc":{"_id":"buildfu","_rev":"17-dd0ffdd4001126502856198501311220","name":"buildfu","description":"A collection of CLI web build tools","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"buildfu","description":"A collection of CLI web build tools","repository":{"type":"git","url":"git://github.com/Munter/buildfu.git"},"version":"0.0.1","keywords":["web","build","build system","single page","web application","static html","html","css","javascript","jsdom"],"maintainers":[{"name":"munter","email":"munter@fumle.dk"}],"dependencies":{"assetgraph":"latest","optimist":"latest","underscore":"latest","seq":"latest","temp":"latest","bufferjs":"latest","uglify-js":"latest","colors":"latest"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"munter","email":"munter@fumle.dk"},"_id":"buildfu@0.0.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6-pre","_defaultsLoaded":true,"bin":{"inline":"bin/inline"},"dist":{"shasum":"25cd4488b80eca5c596d7a9ac3749bdd11acfbbc","tarball":"http://registry.npmjs.org/buildfu/-/buildfu-0.0.1.tgz"}},"0.0.2":{"name":"buildfu","description":"A collection of CLI web build tools","repository":{"type":"git","url":"git://github.com/Munter/buildfu.git"},"version":"0.0.2","keywords":["web","build","build system","single page","web application","static html","html","css","javascript","jsdom"],"maintainers":[{"name":"munter","email":"munter@fumle.dk"}],"dependencies":{"assetgraph-buildfu":"latest","optimist":"latest","underscore":"latest","seq":"latest","temp":"latest","bufferjs":"latest","uglify-js":"latest","colors":"latest"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"munter","email":"munter@fumle.dk"},"_id":"buildfu@0.0.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6-pre","_defaultsLoaded":true,"bin":{"inline":"bin/inline"},"dist":{"shasum":"99b0183e891dfc3c1900acf786f3a06669333cf1","tarball":"http://registry.npmjs.org/buildfu/-/buildfu-0.0.2.tgz"}},"0.0.3":{"name":"buildfu","description":"A collection of CLI web build tools","repository":{"type":"git","url":"git://github.com/Munter/buildfu.git"},"version":"0.0.3","keywords":["web","build","build system","single page","web application","static html","html","css","javascript","jsdom"],"maintainers":[{"name":"munter","email":"munter@fumle.dk"}],"dependencies":{"assetgraph-buildfu":"latest","optimist":"latest","underscore":"latest","seq":"latest","temp":"latest","bufferjs":"latest","uglify-js":"latest","colors":"latest"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"munter","email":"munter@fumle.dk"},"_id":"buildfu@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"inline":"bin/inline"},"dist":{"shasum":"8d4bd981010f0460f2fb394330b6716bee6e6f8e","tarball":"http://registry.npmjs.org/buildfu/-/buildfu-0.0.3.tgz"},"readme":""},"0.0.4":{"name":"buildfu","description":"A collection of CLI web build tools","repository":{"type":"git","url":"git://github.com/Munter/buildfu.git"},"version":"0.0.4","keywords":["web","build","build system","single page","web application","static html","html","css","javascript","jsdom"],"maintainers":[{"name":"munter","email":"munter@fumle.dk"}],"dependencies":{"assetgraph":"latest","histogram":">=0.1.1","optimist":"latest","underscore":"latest","seq":"latest","temp":"latest","bufferjs":"latest","uglify-js":"latest","colors":"latest"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"munter","email":"munter@fumle.dk"},"_id":"buildfu@0.0.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.6-pre","_defaultsLoaded":true,"bin":{"errors":"bin/errors","inline":"bin/inline"},"dist":{"shasum":"3482dae331efc2703cb6272b3f556032ac542def","tarball":"http://registry.npmjs.org/buildfu/-/buildfu-0.0.4.tgz"}},"0.0.5":{"name":"buildfu","description":"A collection of CLI web build tools","repository":{"type":"git","url":"git://github.com/Munter/buildfu.git"},"version":"0.0.5","keywords":["web","build","build system","single page","web application","static html","html","css","javascript","jsdom"],"maintainers":[{"name":"munter","email":"munter@fumle.dk"}],"dependencies":{"assetgraph":"latest","optimist":"latest","underscore":"latest","seq":"latest","temp":"latest","bufferjs":"latest","uglify-js":"latest","colors":"latest","histogram":">=0.1.1"},"optionalDependencies":{"histogram":">=0.1.1"},"engines":{"node":">=0.4.8"},"directories":{"lib":"./lib","bin":"./bin"},"publishConfig":{"registry":"http://registry.npmjs.org/"},"_npmUser":{"name":"munter","email":"munter@fumle.dk"},"_id":"buildfu@0.0.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"errors":"bin/errors","inline":"bin/inline"},"dist":{"shasum":"9f61ef2d9c92531f497b9ca21b70ae65071aded5","tarball":"http://registry.npmjs.org/buildfu/-/buildfu-0.0.5.tgz"},"readme":""}},"readme":null,"maintainers":[{"name":"munter","email":"munter@fumle.dk"}],"time":{"modified":"2012-06-29T08:26:28.999Z","created":"2012-06-18T19:52:52.616Z","0.0.1":"2012-06-18T19:52:53.818Z","0.0.2":"2012-06-19T22:23:32.841Z","0.0.3":"2012-06-20T12:07:11.850Z","0.0.4":"2012-06-28T22:12:16.574Z","0.0.5":"2012-06-29T08:26:28.999Z"},"repository":{"type":"git","url":"git://github.com/Munter/buildfu.git"},"_attachments":{"buildfu-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-FjgejD8NsHf7lP3fdnPP7Q==","length":1714631,"stub":true},"buildfu-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-z/xAwcW1+DLAqCvyGQUjwg==","length":2154496,"stub":true},"buildfu-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-GMufrcktAmuDKsYHE5OL9A==","length":28920060,"stub":true},"buildfu-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-qJy0EEHOErlqzsqg0zj1Ww==","length":3331,"stub":true},"buildfu-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0r3jf+ZWlWvFsx6NRHC8Jw==","length":631406,"stub":true}}}},
{"id":"buildify","key":"buildify","value":{"rev":"5-ae8ca4e2cd6e5be38518f7ee03c0d297"},"doc":{"_id":"buildify","_rev":"5-ae8ca4e2cd6e5be38518f7ee03c0d297","name":"buildify","description":"Builder for creating distributable JavaScript files from source. Concatenate, wrap, uglify.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"author":{"name":"Charles Davison","email":"charlie@powmedia.co.uk"},"name":"buildify","description":"Builder for creating distributable JavaScript files from source. Concatenate, wrap, uglify.","version":"0.1.0","repository":{"type":"git","url":"git://github.com/powmedia/buildify.git"},"main":"index.js","dependencies":{"mkdirp":"0.3.2","uglify-js":"1.3.0","underscore":"1.3.3"},"devDependencies":{},"optionalDependencies":{},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"powmedia","email":"charlie@powmedia.co.uk"},"_id":"buildify@0.1.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"6e6d79050dd4a1376179d566e588c23d8765752b","tarball":"http://registry.npmjs.org/buildify/-/buildify-0.1.0.tgz"},"maintainers":[{"name":"powmedia","email":"charlie@powmedia.co.uk"}]},"0.2.0":{"author":{"name":"Charles Davison","email":"charlie@powmedia.co.uk"},"name":"buildify","description":"Builder for creating distributable JavaScript files from source. Concatenate, wrap, uglify.","version":"0.2.0","repository":{"type":"git","url":"git://github.com/powmedia/buildify.git"},"main":"index.js","dependencies":{"mkdirp":"0.3.2","uglify-js":"1.3.0","underscore":"1.3.3"},"devDependencies":{"nodeunit":"latest","sinon":"latest"},"optionalDependencies":{},"engines":{"node":">=0.4.0"},"_npmUser":{"name":"powmedia","email":"charlie@powmedia.co.uk"},"_id":"buildify@0.2.0","_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"5547961f95430cfd9c85aed2aba683bf9ce41106","tarball":"http://registry.npmjs.org/buildify/-/buildify-0.2.0.tgz"},"maintainers":[{"name":"powmedia","email":"charlie@powmedia.co.uk"}]}},"readme":"buildify\n===\n\nBuilder for creating distributable JavaScript files from source. Concatenate, wrap, uglify.\n\n\n##Usage\n\n    var buildify = require('buildify');\n    \n    buildify()\n      .setDir(__dirname + '/src')\n      .load('base.js')\n      .concat(['part1.js', 'part2.js'])\n      .wrap('../lib/template.js', { version: '1.0' })\n      .save('../distribution/output.js')\n      .uglify()\n      .save('../distribution/output.min.js');\n\n\n##API\n\n###buildify([options])\nCreate a new Builder instance.\n\nOptions:\n- `dir`           Base directory file operations start in.\n- `interpolate`   Underscore template settings. Default to mustache {{var}} style interpolation tags.\n- `encoding`      File encoding (Default 'utf-8')\n- `eol`           End of line character (Default '\\n')\n- `quiet`         Whether to silence console output\n\n\n###setDir(absolutePath)\nSet the current working directory.\n\n\n###changeDir(relativePath)\nChange the current working directory.\n\n\n###setContent(content)\nSet the content to work with.\n\n\n###getContent()\nGet the current content. Note: breaks the chain.\n\n\n###load(file)\nLoad file contents.\n\n\n###concat(files, [eol])\nConcatenate file contents.\n\n\n###wrap(template, [data])\nWrap the contents in a template.\n\nUseful for creating AMD/CommonJS compatible versions of code, adding notes/comments to the top of the file etc.\n\n\n###uglify()\nMinimise your JS using uglifyJS.\n\n\n###save(file)\nSave the contents to a file.\n\n\n###clear()\nReset/clear contents.\n","maintainers":[{"name":"powmedia","email":"charlie@powmedia.co.uk"}],"time":{"modified":"2012-08-09T23:59:04.837Z","created":"2012-05-31T16:56:27.955Z","0.1.0":"2012-05-31T16:56:31.250Z","0.2.0":"2012-08-09T23:59:04.837Z"},"author":{"name":"Charles Davison","email":"charlie@powmedia.co.uk"},"repository":{"type":"git","url":"git://github.com/powmedia/buildify.git"},"_attachments":{"buildify-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HFWoRuC1M/yNk/ICwOo5nw==","length":4584,"stub":true},"buildify-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-44FK1MqppKrmYJAPk+Fw1w==","length":2261,"stub":true}}}},
{"id":"buildit","key":"buildit","value":{"rev":"5-813ac1b6e8466d0d4bb90a7abd174b64"},"doc":{"_id":"buildit","_rev":"5-813ac1b6e8466d0d4bb90a7abd174b64","name":"buildit","description":"The form building companion of checkit.js","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"buildit","version":"0.0.1","description":"The form building companion of checkit.js","main":"index.js","directories":{"test":"test"},"dependencies":{"underscore":">=1.3.1"},"scripts":{"test":"jshint ./lib/buildit.js"},"devDependencies":{"jshint":">=0.7.2","should":">=0.6.0","mocha":"1.0.x","chai":"1.1.x"},"keywords":["forms","form","building"],"author":{"name":"Tim Griesser"},"license":"MIT","readme":"# BuildIt\n\nA library for building forms, integrating nicely with [CheckIt](https://github.com/tgriesser/checkit)\n\n## Intro\n\nBuildit is an attempt to come up with a standardized structure for forms generation, \nrendering, and validation, with sane defaults and consistent patterns for creating forms.\n\nThe library is initialized by taking a \"blueprint\"; a javascript object which  \ncontains six items used in building forms:\n\n\t// The buildit blueprint\n\tvar blueprint = {\n\t\t'forms' : {\n\t\t\t// The structure of forms that we wish to build\n\t\t},\n\t\t'fields' : {\n\t\t\t// The individual fields that make up fieldsets or forms\n\t\t},\n\t\t'fieldsets' : {\n\t\t\t// Fieldsets for the forms, if desired\n\t\t},\n\t\t'buttons' : {\n\t\t\t// Buttons that may be used in forms or fieldsets\n\t\t},\n\t\t'validations' : {\n\t\t\t// Validations, applicable to fieldsets, fields, or forms\n\t\t},\n\t\t'decorators' : {\n\t\t\t// Decorator functions, to help make the form construction more flexible and modular\n\t\t}\n\t};\n\nEach of the seven top level items will then have a `'key' : 'value'` pairings, where the `key`\nis the name of the item, and the item is all of the attributes that are applicable to the item.\nThe value objects are detailed below.\n\n## All objects\n\nAll objects will optionally contain a \"meta\" object, which can be utilized in the validation,\ndecorator functions, or templates, and can contain any relevant information about the form which is\nrelevant to the form item. The value of a meta item can be a function, array, javascript object, or string.\n\nExample:\n\n\t'forms' : {\n\t\t'login' : {\n\t\t\tmeta : {\n\t\t\t\t'help' : 'This form is used to login to an account.',\n\t\t\t}\n\t\t}\n\t}\n\n\n## Form, Field, Fieldset, Button\n \nThese four objects will utilize `validation` and `decorator` objects, both of which contain functions\nor references to function items in the decorator &amp; validation blueprint.\n\nExample:\n\t\n\t'fields' : {\n\t\t'email' : {\n\t\t\t'validations' : ['required', 'validEmail'],\n\t\t\t'decorators' : [function(){\n\t\t\t\tthis.$el.append('<div class=\"help-box>Email Help?</div>');\n\t\t\t}, 'form']\n\t\t}\n\t},\n\t'decorators' : {\n\t\t'baseForm' : function() {\n\t\t\tthis.el = Templates('')\n\t\t}\n\t}\n\n\n## Fieldset\n\n  id : name of the fieldset that is being posted\n\n## Button\n\n  id : name of the button that is being posted\n\n## Decorator\n\n  id : name of the decorator that is being used\n\n\n\n## Using the BuildIt Library\n\n\t// Creates a new BuildIt instance, which is  \n\t// used to create new form components\n\tvar app = BuildIt.init(blueprint);\n\n\t// Creating a new instance of the login form\n\tvar login = new app('form', 'login');\n\n\tvar html = login.build();\n\t\n\n","_id":"buildit@0.0.1","dist":{"shasum":"517b1ff68f1c22cd7465a41928272cd1c6ea4ab0","tarball":"http://registry.npmjs.org/buildit/-/buildit-0.0.1.tgz"},"maintainers":[{"name":"tgriesser","email":"tgriesser10@gmail.com"}]},"0.0.2":{"name":"buildit","version":"0.0.2","description":"The form building companion of checkit.js","main":"index.js","directories":{"test":"test"},"dependencies":{"underscore":">=1.3.1"},"scripts":{"test":"jshint ./lib/buildit.js"},"devDependencies":{"jshint":">=0.7.2"},"keywords":["forms","form","building"],"author":{"name":"Tim Griesser"},"license":"MIT","readme":"# BuildIt\n\nA library for building forms, integrating nicely with [CheckIt](https://github.com/tgriesser/checkit)\n\n## Intro\n\nBuildit is an attempt to come up with a standardized structure for forms generation, \nrendering, and validation, with sane defaults and consistent patterns for creating forms.\n\nThe library is initialized by taking a \"blueprint\"; a javascript object which  \ncontains six items used in building forms:\n\n\t// The buildit blueprint\n\tvar blueprint = {\n\t\t'forms' : {\n\t\t\t// The structure of forms that we wish to build\n\t\t},\n\t\t'fields' : {\n\t\t\t// The individual fields that make up fieldsets or forms\n\t\t},\n\t\t'fieldsets' : {\n\t\t\t// Fieldsets for the forms, if desired\n\t\t},\n\t\t'buttons' : {\n\t\t\t// Buttons that may be used in forms or fieldsets\n\t\t},\n\t\t'validations' : {\n\t\t\t// Validations, applicable to fieldsets, fields, or forms\n\t\t},\n\t\t'decorators' : {\n\t\t\t// Decorator functions, to help make the form construction more flexible and modular\n\t\t}\n\t};\n\nEach of the seven top level items will then have a `'key' : 'value'` pairings, where the `key`\nis the name of the item, and the item is all of the attributes that are applicable to the item.\nThe value objects are detailed below.\n\n## All objects\n\nAll objects will optionally contain a \"meta\" object, which can be utilized in the validation,\ndecorator functions, or templates, and can contain any relevant information about the form which is\nrelevant to the form item. The value of a meta item can be a function, array, javascript object, or string.\n\nExample:\n\n\t'forms' : {\n\t\t'login' : {\n\t\t\tmeta : {\n\t\t\t\t'help' : 'This form is used to login to an account.',\n\t\t\t}\n\t\t}\n\t}\n\n\n## Form, Field, Fieldset, Button\n \nThese four objects will utilize `validation` and `decorator` objects, both of which contain functions\nor references to function items in the decorator &amp; validation blueprint.\n\nExample:\n\t\n\t'fields' : {\n\t\t'email' : {\n\t\t\t'validations' : ['required', 'validEmail'],\n\t\t\t'decorators' : [function(){\n\t\t\t\tthis.$el.append('<div class=\"help-box>Email Help?</div>');\n\t\t\t}, 'form']\n\t\t}\n\t},\n\t'decorators' : {\n\t\t'baseForm' : function() {\n\t\t\tthis.el = Templates('')\n\t\t}\n\t}\n\n\n## Fieldset\n\n  id : name of the fieldset that is being posted\n\n## Button\n\n  id : name of the button that is being posted\n\n## Decorator\n\n  id : name of the decorator that is being used\n\n\n\n## Using the BuildIt Library\n\n\t// Creates a new BuildIt instance, which is  \n\t// used to create new form components\n\tvar app = BuildIt.init(blueprint);\n\n\t// Creating a new instance of the login form\n\tvar login = new app('form', 'login');\n\n\tvar html = login.build();\n\t\n\n","_id":"buildit@0.0.2","_from":"buildit","dist":{"shasum":"4e7102f8d4aa083647bacf49ab9bf97869491d06","tarball":"http://registry.npmjs.org/buildit/-/buildit-0.0.2.tgz"},"maintainers":[{"name":"tgriesser","email":"tgriesser10@gmail.com"}]}},"readme":"# BuildIt\n\nA library for building forms, integrating nicely with [CheckIt](https://github.com/tgriesser/checkit)\n\n## Intro\n\nBuildit is an attempt to come up with a standardized structure for forms generation, \nrendering, and validation, with sane defaults and consistent patterns for creating forms.\n\nThe library is initialized by taking a \"blueprint\"; a javascript object which  \ncontains six items used in building forms:\n\n\t// The buildit blueprint\n\tvar blueprint = {\n\t\t'forms' : {\n\t\t\t// The structure of forms that we wish to build\n\t\t},\n\t\t'fields' : {\n\t\t\t// The individual fields that make up fieldsets or forms\n\t\t},\n\t\t'fieldsets' : {\n\t\t\t// Fieldsets for the forms, if desired\n\t\t},\n\t\t'buttons' : {\n\t\t\t// Buttons that may be used in forms or fieldsets\n\t\t},\n\t\t'validations' : {\n\t\t\t// Validations, applicable to fieldsets, fields, or forms\n\t\t},\n\t\t'decorators' : {\n\t\t\t// Decorator functions, to help make the form construction more flexible and modular\n\t\t}\n\t};\n\nEach of the seven top level items will then have a `'key' : 'value'` pairings, where the `key`\nis the name of the item, and the item is all of the attributes that are applicable to the item.\nThe value objects are detailed below.\n\n## All objects\n\nAll objects will optionally contain a \"meta\" object, which can be utilized in the validation,\ndecorator functions, or templates, and can contain any relevant information about the form which is\nrelevant to the form item. The value of a meta item can be a function, array, javascript object, or string.\n\nExample:\n\n\t'forms' : {\n\t\t'login' : {\n\t\t\tmeta : {\n\t\t\t\t'help' : 'This form is used to login to an account.',\n\t\t\t}\n\t\t}\n\t}\n\n\n## Form, Field, Fieldset, Button\n \nThese four objects will utilize `validation` and `decorator` objects, both of which contain functions\nor references to function items in the decorator &amp; validation blueprint.\n\nExample:\n\t\n\t'fields' : {\n\t\t'email' : {\n\t\t\t'validations' : ['required', 'validEmail'],\n\t\t\t'decorators' : [function(){\n\t\t\t\tthis.$el.append('<div class=\"help-box>Email Help?</div>');\n\t\t\t}, 'form']\n\t\t}\n\t},\n\t'decorators' : {\n\t\t'baseForm' : function() {\n\t\t\tthis.el = Templates('')\n\t\t}\n\t}\n\n\n## Fieldset\n\n  id : name of the fieldset that is being posted\n\n## Button\n\n  id : name of the button that is being posted\n\n## Decorator\n\n  id : name of the decorator that is being used\n\n\n\n## Using the BuildIt Library\n\n\t// Creates a new BuildIt instance, which is  \n\t// used to create new form components\n\tvar app = BuildIt.init(blueprint);\n\n\t// Creating a new instance of the login form\n\tvar login = new app('form', 'login');\n\n\tvar html = login.build();\n\t\n\n","maintainers":[{"name":"tgriesser","email":"tgriesser10@gmail.com"}],"time":{"modified":"2012-08-14T03:18:41.006Z","created":"2012-08-14T03:06:03.604Z","0.0.1":"2012-08-14T03:06:04.161Z","0.0.2":"2012-08-14T03:18:41.006Z"},"author":{"name":"Tim Griesser"},"_attachments":{"buildit-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-sGVqIZj/w0nrNf/eco2OEg==","length":4576,"stub":true},"buildit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Ze28h9qxntlMB8t9b2itXg==","length":4196,"stub":true}}}},
{"id":"buildjs","key":"buildjs","value":{"rev":"7-8a169fc16c482025cd2c748b40f4b9d6"},"doc":{"_id":"buildjs","_rev":"7-8a169fc16c482025cd2c748b40f4b9d6","name":"buildjs","description":"JS/CSS files compress/optimizer","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.1":{"name":"buildjs","homepage":"http://github.com/konteck/buildjs","author":{"name":"Alex Movsisyan","url":"http://github.com/konteck/buildjs"},"repository":{"type":"git","url":"git://github.com/konteck/buildjs.git"},"dependencies":{"uglify-js":"1.2.x","uglifycss":"0.0.x"},"description":"JS/CSS files compress/optimizer","keywords":["production","javascript","css","minify","build"],"version":"1.0.1","main":"./lib/index.js","_npmUser":{"name":"konteck","email":"node@movsisyan.com"},"_id":"buildjs@1.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"8f9cf98ade8ead7143aeac8b0b82989e2e0a404c","tarball":"http://registry.npmjs.org/buildjs/-/buildjs-1.0.1.tgz"},"maintainers":[{"name":"konteck","email":"node@movsisyan.com"}]},"1.0.2":{"name":"buildjs","homepage":"http://github.com/konteck/buildjs","author":{"name":"Alex Movsisyan","url":"http://github.com/konteck/buildjs"},"repository":{"type":"git","url":"git://github.com/konteck/buildjs.git"},"dependencies":{"uglify-js":"1.2.x","uglifycss":"0.0.x"},"description":"JS/CSS files compress/optimizer","keywords":["production","javascript","css","minify","build"],"version":"1.0.2","main":"./lib/index.js","_npmUser":{"name":"konteck","email":"node@movsisyan.com"},"_id":"buildjs@1.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"05a5ab46ac5b7e587aef571f8b29105715b87199","tarball":"http://registry.npmjs.org/buildjs/-/buildjs-1.0.2.tgz"},"maintainers":[{"name":"konteck","email":"node@movsisyan.com"}]},"1.0.3":{"name":"buildjs","homepage":"http://github.com/konteck/buildjs","author":{"name":"Alex Movsisyan","url":"http://github.com/konteck/buildjs"},"repository":{"type":"git","url":"git://github.com/konteck/buildjs.git"},"dependencies":{"uglify-js":"1.2.x","uglifycss":"0.0.x"},"description":"JS/CSS files compress/optimizer","keywords":["production","javascript","css","minify","build"],"version":"1.0.3","main":"./lib/index.js","_npmUser":{"name":"konteck","email":"node@movsisyan.com"},"_id":"buildjs@1.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f1ce36433f24813c1c6a17e89c93e7b85d98d1c1","tarball":"http://registry.npmjs.org/buildjs/-/buildjs-1.0.3.tgz"},"maintainers":[{"name":"konteck","email":"node@movsisyan.com"}]}},"readme":"# BuildJS\n\nUse this tool to compress all your assets to single file eg. all.js.\n\nJust include it into your Node.JS project as usual module.\n\n### How to use\n\nAdd build.json file to you app's root folder\n\n```js\n{\n    \"watch\": true,\n    \"compress\": true,\n    \"scripts\": {\n        \"output\": \"media/scripts/all.js\",\n        \"input\": [\n            \"media/scripts/jquery.min.js\",\n            \"media/scripts/jquery.tools.min.js\",\n            \"media/scripts/underscore.min.js\",\n            \"media/scripts/backbone.min.js\",\n            \"media/scripts/main.js\"\n        ]\n    },\n    \"styles\": {\n        \"output\": \"media/styles/all.css\",\n        \"input\": [\n            \"media/styles/bootstrap.min.css\",\n            \"media/styles/main.css\"\n        ]\n    }\n}\n```\n\nThen include BuildJS from your app.js\n\n```js\nrequire('buildjs')(__dirname);\n```\n\nOr if you use ExpressJS\n\n```js\napp.configure('production', function () {\n    require('buildjs')(__dirname);\n});\n```\n\nThen... that's all ;)\n\n","maintainers":[{"name":"konteck","email":"node@movsisyan.com"}],"time":{"modified":"2012-01-23T21:46:13.123Z","created":"2012-01-17T20:34:58.078Z","1.0.1":"2012-01-17T20:35:01.483Z","1.0.2":"2012-01-19T22:41:51.419Z","1.0.3":"2012-01-23T21:46:13.123Z"},"author":{"name":"Alex Movsisyan","url":"http://github.com/konteck/buildjs"},"repository":{"type":"git","url":"git://github.com/konteck/buildjs.git"},"_attachments":{"buildjs-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+elMnWbV1B9wrY8QV69uKg==","length":2732,"stub":true},"buildjs-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-0zP2/pYchRGJJO67mTEQHg==","length":2332,"stub":true},"buildjs-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HLc0Pwsx2dDa/161mhItjw==","length":2299,"stub":true}}}},
{"id":"buildlocale","key":"buildlocale","value":{"rev":"18-5f0c902c5a50ac33d1c948464984d30c"},"doc":{"_id":"buildlocale","_rev":"18-5f0c902c5a50ac33d1c948464984d30c","name":"buildlocale","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"buildlocale","version":"0.0.1","dependencies":{"cjson":"=0.0.6","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"1eaf26c09627e469df81b37b544101591d8f4f5c","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.1.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.2":{"name":"buildlocale","version":"0.0.2","dependencies":{"cjson":"=0.0.6","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"f2fb13edcb514c7076e764ebecc112436705f22c","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.2.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.3":{"name":"buildlocale","version":"0.0.3","dependencies":{"cjson":"=0.0.6","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"e26cac6feeec196ca76bbd06ebd39f9a05db8edd","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.3.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.4":{"name":"buildlocale","version":"0.0.4","dependencies":{"cjson":"=0.0.6","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"14709dc3bf3c8d10deac28c06e27840bfb27e5bc","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.4.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.5":{"name":"buildlocale","version":"0.0.5","dependencies":{"cjson":"=0.0.6","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"57feed111c611c0a27af243452d0916f1b766b17","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.5.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.6":{"name":"buildlocale","version":"0.0.6","dependencies":{"cjson":"=0.0.6","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.18","_nodeVersion":"v0.6.15-pre","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"5bb1faa008402f2320f12473bf32c61777e197ce","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.6.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.7":{"name":"buildlocale","version":"0.0.7","dependencies":{"cjson-papandreou":"=0.0.6-patch1","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"becb694877d26b6d2e425cdf345c4ea63bbf7758","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.7.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]},"0.0.8":{"name":"buildlocale","version":"0.0.8","dependencies":{"cjson-papandreou":"=0.0.6-patch1","libxmljs":"=0.5.4","optimist":"=0.3.4","passerror":"=0.0.1","pegjs":"=0.7.0","seq":"=0.3.5","time":"=0.8.2","uglifyast":"=0.0.3","uglify-js":"=1.3.3","underscore":"=1.3.3"},"directories":{"bin":"bin"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"papandreou","email":"andreas@one.com"},"_id":"buildlocale@0.0.8","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"bin":{"buildLocale":"bin/buildLocale"},"dist":{"shasum":"4106c6a2e66a37e2dd8669da83c60083adc5f00f","tarball":"http://registry.npmjs.org/buildlocale/-/buildlocale-0.0.8.tgz"},"maintainers":[{"name":"papandreou","email":"andreas@one.com"}]}},"readme":"buildlocale\n===========\n\nA module that extracts a bunch of information from the CLDR database\nand builds a JavaScript object that can be used to render dates,\ndate intervals, numbers, lists, and more.\n\nVery alpha and undocumented right now.\n\n\nLicense\n-------\n\nbuildlocale is licensed under a standard 3-clause BSD license -- see the\n``LICENSE``-file for details.\n","maintainers":[{"name":"papandreou","email":"andreas@one.com"}],"time":{"modified":"2012-08-08T14:42:48.581Z","created":"2012-07-25T15:44:01.932Z","0.0.1":"2012-07-25T15:44:03.567Z","0.0.2":"2012-07-26T10:00:55.071Z","0.0.3":"2012-07-26T15:06:48.145Z","0.0.4":"2012-07-27T12:28:49.993Z","0.0.5":"2012-07-28T13:47:08.147Z","0.0.6":"2012-07-28T13:51:36.877Z","0.0.7":"2012-08-06T12:13:10.236Z","0.0.8":"2012-08-08T14:42:48.581Z"},"users":{"fgribreau":true},"_attachments":{"buildlocale-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-vTYx5iNjADXHaY5ihMLIbg==","length":14606,"stub":true},"buildlocale-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-Nrd0FuNByTWHwo47pXdHHA==","length":14321,"stub":true},"buildlocale-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-iiDUau3a+N+uC3DoUTQHcQ==","length":14417,"stub":true},"buildlocale-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-h/RU2rTFytoSlV+z3YAXZg==","length":14389,"stub":true},"buildlocale-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-9BZJ+EOd4CY+vg1xhkBC+A==","length":14201,"stub":true},"buildlocale-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-5jXuSUop3fg6cwSJpe4HCw==","length":14300,"stub":true},"buildlocale-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-bVsEuWvTXA7WnbzG7wEZyA==","length":13941,"stub":true},"buildlocale-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VKABqsL7GskQUE6HgALDPA==","length":13930,"stub":true}}}},
{"id":"buildproject","key":"buildproject","value":{"rev":"13-8b9a5c986337e8d2f059b960d7fb6e6c"},"doc":{"_id":"buildproject","_rev":"13-8b9a5c986337e8d2f059b960d7fb6e6c","name":"buildproject","description":"Tools to build a project from almost any source to an output structure","dist-tags":{"latest":"0.0.6"},"versions":{"0.0.1":{"name":"buildproject","description":"Tools to build a project from almost any source to an output structure","author":{"name":"Steve King","email":"steve@mydev.co"},"contributors":[{"name":"Steve King","email":"steve@mydev.co"}],"version":"0.0.1","main":"./src/builder.js","bin":{"buildproject":"./bin/buildproject"},"engines":{"node":">= 0.6.0"},"dependencies":{"commands":"","hogan":"","less":"","readdir":"","task-runner":"","uglify-js":"","xhrequest":""},"devDependencies":{"nodeunit":">=0.6.4","sinon":">=1.3.1"},"_npmUser":{"name":"steveukx","email":"steve@mydev.co"},"_id":"buildproject@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"f331325cfec5f347df6e3b8380c585ab161d6dd0","tarball":"http://registry.npmjs.org/buildproject/-/buildproject-0.0.1.tgz"},"maintainers":[{"name":"steveukx","email":"steve@mydev.co"}]},"0.0.2":{"name":"buildproject","description":"Tools to build a project from almost any source to an output structure","author":{"name":"Steve King","email":"steve@mydev.co"},"contributors":[{"name":"Steve King","email":"steve@mydev.co"}],"version":"0.0.2","main":"./src/builder.js","bin":{"buildproject":"./bin/buildproject"},"engines":{"node":">= 0.6.0"},"dependencies":{"commands":"","hogan":"","less":"","readdir":"","task-runner":"","uglify-js":"","xhrequest":""},"devDependencies":{"nodeunit":">=0.6.4","sinon":">=1.3.1"},"_npmUser":{"name":"steveukx","email":"steve@mydev.co"},"_id":"buildproject@0.0.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"dc8dc621e52e7cc067dcd55aa420b06634aff22c","tarball":"http://registry.npmjs.org/buildproject/-/buildproject-0.0.2.tgz"},"maintainers":[{"name":"steveukx","email":"steve@mydev.co"}]},"0.0.3":{"name":"buildproject","description":"Tools to build a project from almost any source to an output structure","author":{"name":"Steve King","email":"steve@mydev.co"},"contributors":[{"name":"Steve King","email":"steve@mydev.co"}],"version":"0.0.3","main":"./src/builder.js","bin":{"buildproject":"./bin/buildproject"},"engines":{"node":">= 0.6.0"},"dependencies":{"commands":"","hogan":"","less":"","readdir":"","task-runner":"","uglify-js":"","xhrequest":""},"devDependencies":{"nodeunit":">=0.6.4","sinon":">=1.3.1"},"_npmUser":{"name":"steveukx","email":"steve@mydev.co"},"_id":"buildproject@0.0.3","_engineSupported":true,"_npmVersion":"1.1.0-beta-4","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"71f3ce0259175474b86b0b5df06957bc8dc0dcc3","tarball":"http://registry.npmjs.org/buildproject/-/buildproject-0.0.3.tgz"},"maintainers":[{"name":"steveukx","email":"steve@mydev.co"}]},"0.0.4":{"name":"buildproject","description":"Tools to build a project from almost any source to an output structure","author":{"name":"Steve King","email":"steve@mydev.co"},"contributors":[{"name":"Steve King","email":"steve@mydev.co"}],"version":"0.0.4","main":"./src/builder.js","bin":{"buildproject":"./bin/buildproject"},"engines":{"node":">= 0.6.0"},"dependencies":{"commands":"","hogan":"","less":"","readdir":"","task-runner":"","uglify-js":"","xhrequest":""},"devDependencies":{"nodeunit":">=0.6.4","sinon":">=1.3.1"},"_npmUser":{"name":"steveukx","email":"steve@mydev.co"},"_id":"buildproject@0.0.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"4c461746f4c6207471a551bb205ab369cf64cd14","tarball":"http://registry.npmjs.org/buildproject/-/buildproject-0.0.4.tgz"},"maintainers":[{"name":"steveukx","email":"steve@mydev.co"}]},"0.0.5":{"name":"buildproject","description":"Tools to build a project from almost any source to an output structure","author":{"name":"Steve King","email":"steve@mydev.co"},"contributors":[{"name":"Steve King","email":"steve@mydev.co"}],"version":"0.0.5","main":"./src/builder.js","bin":{"buildproject":"./bin/buildproject"},"engines":{"node":">= 0.6.0"},"dependencies":{"commands":"","hogan":"","less":"","readdir":"","task-runner":"","uglify-js":"","xhrequest":""},"devDependencies":{"nodeunit":">=0.6.4","sinon":">=1.3.1"},"_npmUser":{"name":"steveukx","email":"steve@mydev.co"},"_id":"buildproject@0.0.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"69c06f2e3dabccfbe3b9610a6747db555794dcbc","tarball":"http://registry.npmjs.org/buildproject/-/buildproject-0.0.5.tgz"},"maintainers":[{"name":"steveukx","email":"steve@mydev.co"}]},"0.0.6":{"name":"buildproject","description":"Tools to build a project from almost any source to an output structure","author":{"name":"Steve King","email":"steve@mydev.co"},"contributors":[{"name":"Steve King","email":"steve@mydev.co"}],"version":"0.0.6","main":"./src/builder.js","bin":{"buildproject":"./bin/buildproject"},"engines":{"node":">= 0.6.0"},"dependencies":{"commands":"","hogan":"","less":"","readdir":"","task-runner":"","uglify-js":"","xhrequest":""},"devDependencies":{"nodeunit":">=0.6.4","sinon":">=1.3.1"},"_npmUser":{"name":"steveukx","email":"steve@mydev.co"},"_id":"buildproject@0.0.6","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"fd524d6eba1602b4d0df33e5c0982eebcad97c97","tarball":"http://registry.npmjs.org/buildproject/-/buildproject-0.0.6.tgz"},"maintainers":[{"name":"steveukx","email":"steve@mydev.co"}]}},"readme":"buildproject.js\n===============\n\nSeries of tools to build source content into a web app.\n\nInstallation\n============\n\nInstall using npm: `npm install buildproject` or check out the latest version from Git.\n\nUsage\n=====\n\nOnce installed, run using the binary: `buildproject` optional commands can be used to add features. The most useful are:\n\n`-profile profilename` used to run a specific profile, by default will run the profile called \"full\" or when that isn't found, runs the first profile found.\n\n`-config fullpath` used to set the path to the configuration JSON file, either to the JSON file itself or to the container directory so long as the file is called `buildproject.json`\n\nAdditional configuration can be either set in the command line or in the JSON file as part of a profile / settings:\n\n`-sourcePath fullpath` sets the path of the source files, will be prepended to all source content paths in the configuration JSON. If omitted the default is the 'src' directory at the same level as the `buildproject.json` file\n\n`-targetPath fullpath` sets the path of the output files, will be prepended to all output content paths in the configuration JSON. If omitted the default is the 'web' directory at the same level as the `buildproject.json` file\n\n`--verbose` prints a lot of information to the console as the build is running\n\n\n\n","maintainers":[{"name":"steveukx","email":"steve@mydev.co"}],"time":{"modified":"2012-06-24T09:12:54.094Z","created":"2012-06-04T15:48:26.802Z","0.0.1":"2012-06-04T15:48:28.441Z","0.0.2":"2012-06-04T16:22:18.323Z","0.0.3":"2012-06-09T09:42:11.955Z","0.0.4":"2012-06-23T08:05:07.442Z","0.0.5":"2012-06-24T08:15:25.840Z","0.0.6":"2012-06-24T09:12:54.094Z"},"author":{"name":"Steve King","email":"steve@mydev.co"},"_attachments":{"buildproject-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/F3cORZO5rhWnWE4kL+V5w==","length":20480,"stub":true},"buildproject-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-yHrNYxXBqkVU5MingNF2iw==","length":204800,"stub":true},"buildproject-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-yx7kNjaFt95MjGhet3gFng==","length":317440,"stub":true},"buildproject-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FGvjqu8aLrPwYQ5DSQWyRw==","length":6401,"stub":true},"buildproject-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-H7MvQM8Uz1sqh+AVHB13Lg==","length":20480,"stub":true},"buildproject-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OC4Qfjwpopy3Ch3YytaG6g==","length":20480,"stub":true}}}},
{"id":"buildr","key":"buildr","value":{"rev":"75-ecd8c9981b12a31b9fb2a3f7dd0ab942"},"doc":{"_id":"buildr","_rev":"75-ecd8c9981b12a31b9fb2a3f7dd0ab942","name":"buildr","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","dist-tags":{"latest":"0.8.2"},"versions":{"0.1.0":{"name":"buildr","version":"0.1.0","description":"The JavaScript Project Buildr","author":{"name":"Benjamin Lupton","email":"b@lupton.cc"},"keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repositories":[{"type":"git","url":"http://github.com/balupton/buildr.git"}],"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1"},"engines":{"node":">=0.1.9"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.1.0","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"de5edd66627c632017e5b2a1d3d211083d7075c1","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.1.0.tgz"}},"0.1.1":{"name":"buildr","version":"0.1.1","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repositories":[{"type":"git","url":"http://github.com/balupton/buildr.git"}],"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.1.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c84c8550009aa5f01f6f3312907ae21b53b695b0","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.1.1.tgz"}},"0.1.2":{"name":"buildr","version":"0.1.2","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.1.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"2f3a21b6ab3aafdddecf03407a074c03ae7346a7","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.1.2.tgz"}},"0.2.0":{"name":"buildr","version":"0.2.0","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","pulverizr":">=0.5.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.0","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b8bce70d77d961d064fb7602c38f96631f198fef","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.0.tgz"}},"0.2.1":{"name":"buildr","version":"0.2.1","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","pulverizr":">=0.5.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.1","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"d667791916e904762bb91d75a88de5341da38f44","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.1.tgz"}},"0.2.2":{"name":"buildr","version":"0.2.2","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","pulverizr":">=0.5.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.2","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"f671a8c2833e4d8952a3563dd9ea63eea437fa58","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.2.tgz"}},"0.2.3":{"name":"buildr","version":"0.2.3","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","pulverizr-bal":">=0.5.2"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.3","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"c1c2160c2c2e3c18dfabbf4a7ac09cde08a0ac25","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.3.tgz"}},"0.2.4":{"name":"buildr","version":"0.2.4","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","pulverizr-bal":">=0.5.2"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.4","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"603b6f2e29203b707d723cb76c60409e94846606","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.4.tgz"}},"0.2.5":{"name":"buildr","version":"0.2.5","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","jshint":">=0.0.1","pulverizr-bal":">=0.5.2"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.5","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b608ff9234cf2eb99849046832be0fc1989d4b50","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.5.tgz"}},"0.2.6":{"name":"buildr","version":"0.2.6","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","jshint":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr"},"main":"./lib/buildr","_id":"buildr@0.2.6","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"ed6beec5eb8f1b7e549a3c95c9385679717d92cc","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.6.tgz"}},"0.2.7":{"name":"buildr","version":"0.2.7","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","jshint":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr.js"},"main":"./lib/buildr","_id":"buildr@0.2.7","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a02798d50d377d94e0a7c1bd22b62bd80c2215d1","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.7.tgz"}},"0.2.8":{"name":"buildr","version":"0.2.8","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"http://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","jshint":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr","bin":"./bin"},"bin":{"buildr":"./bin/buildr.js"},"main":"./lib/buildr","_id":"buildr@0.2.8","_engineSupported":true,"_npmVersion":"0.2.15","_nodeVersion":"v0.5.0-pre","modules":{},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8ab43c96597a4bdba5a64eba2729fb03c440ac15","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.8.tgz"}},"0.2.9":{"name":"buildr","version":"0.2.9","description":"The JavaScript Project Buildr. Built with Node.js and used by Aloha Editor and History.js","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","jshint":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"./lib/buildr"},"bin":{"buildr":"./bin/buildr.js"},"main":"./lib/buildr","devDependencies":{},"_id":"buildr@0.2.9","_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"8d11af127002bddc4bd46b74be5fb8bb681d8927","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.2.9.tgz"},"scripts":{}},"0.4.0":{"name":"buildr","version":"0.4.0","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","buildr","package","compile","compress","minify","bundle"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"uglify-js":">=0.0.1","less":">=0.0.1","jshint":">=0.0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.4.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.4.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"8374a2a5758baa2804f52de6ae3c51b4993ed895","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.4.0.tgz"},"scripts":{}},"0.4.1":{"name":"buildr","version":"0.4.1","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"=1.1","coffee-script":"=1.1","bal-util":"=0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.4.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.4.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"0c938597c108bf293bd36a269e1786cfeff89cd0","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.4.1.tgz"},"scripts":{}},"0.4.2":{"name":"buildr","version":"0.4.2","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"=1.1","coffee-script":"=1.1","bal-util":"=0.4","cson":"=0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.4.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.4.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"e509561ebe2e347fe0b25456d5d0013cca65898c","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.4.2.tgz"},"scripts":{}},"0.4.3":{"name":"buildr","version":"0.4.3","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"=1.1","coffee-script":"=1.1","bal-util":"=0.4","cson":"=0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.4.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.4.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"ad7ef85140a6351deb8501da068a7321c57e876b","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.4.3.tgz"},"scripts":{}},"0.4.4":{"name":"buildr","version":"0.4.4","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"1.1","coffee-script":"1.1","bal-util":"0.4","cson":"0.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.4.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.4.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"db11e6532fb4afde3243fa18b2a84ae1c7764667","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.4.4.tgz"},"scripts":{}},"0.4.5":{"name":"buildr","version":"0.4.5","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.4.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.4.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"7f10ad652ab0d481e2afd012e949e1cb70701285","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.4.5.tgz"},"scripts":{}},"0.5.0":{"name":"buildr","version":"0.5.0","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.5.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.5.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"e2d947337ab41451ede4179ace978532329bfc6d","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.5.0.tgz"},"scripts":{}},"0.5.1":{"name":"buildr","version":"0.5.1","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.5.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.5.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"edd298baa046e037686f5dbfcd278b5424379fdd","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.5.1.tgz"},"scripts":{}},"0.5.2":{"name":"buildr","version":"0.5.2","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.5.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.5.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"5c0229ca1f0d270957474cada819916d8d863e9c","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.5.2.tgz"},"scripts":{}},"0.5.3":{"name":"buildr","version":"0.5.3","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.5.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.5.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"b0805b44fb2427e54d50a6cf96fe6866173957d9","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.5.3.tgz"},"scripts":{}},"0.5.4":{"name":"buildr","version":"0.5.4","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.5.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.5.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"98014e081c6f05fa5f4cc9cbd3f5cdf67e46ec49","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.5.4.tgz"},"scripts":{}},"0.5.5":{"name":"buildr","version":"0.5.5","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"1.1","coffee-script":"1.1","bal-util":"0.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.5.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.5.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.15","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"9de7e8d565444f7d8fb7c6973a7af1c27f0ff287","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.5.5.tgz"},"scripts":{}},"0.6.1":{"name":"buildr","version":"0.6.1","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.4","jshint":"=0.2.3","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.6.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.6.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"325ea8053ab6718bd493751c67c0db1b2c22b2b5","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.6.1.tgz"},"scripts":{}},"0.6.2":{"name":"buildr","version":"0.6.2","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.6.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.6.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"06e471f47306bd0ef6570b4b3ff4ff2e3b7d1f4b","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.6.2.tgz"},"scripts":{}},"0.6.3":{"name":"buildr","version":"0.6.3","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.6.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.6.3","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"63840bab73b2314f26fd48bf417809427442b301","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.6.3.tgz"},"scripts":{}},"0.6.4":{"name":"buildr","version":"0.6.4","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.6.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.6.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.18","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6d67827241a1569c1b222026fd25e765cee23d07","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.6.4.tgz"},"scripts":{}},"0.6.5":{"name":"buildr","version":"0.6.5","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4","cson":"=0.2.0"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.6.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.6.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"decd24d0747b947abd28f0b7986931cd6d9ed88e","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.6.5.tgz"},"scripts":{}},"0.6.6":{"name":"buildr","version":"0.6.6","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4","cson":"=0.2.0"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.6.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.6.6","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"04668e52ba7adaa57727f7139d836ef7d134c131","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.6.6.tgz"},"scripts":{}},"0.7.0":{"name":"buildr","version":"0.7.0","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.1","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4","cson":"=0.2.0","watch-tree":"=0.1.1"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.7.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.7.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"27934f87906ec954cf11b2c683621f8661a6016b","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.7.0.tgz"},"scripts":{}},"0.8.0":{"name":"buildr","version":"0.8.0","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.2","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.5.4","cson":"=0.2.0","watch-tree":"=0.1.1","caterpillar":"=0.1.2"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.8.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.8.0","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"e028cb9d949e7a49f3ff22293de17a52d6b73ce5","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.8.0.tgz"}},"0.8.1":{"name":"buildr","version":"0.8.1","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"=1.1.4","coffee-script":"=1.1.2","bal-util":"=0.5","jshint":"=0.2.3","csslint":"=0.4.0","uglify-js":"=1.0.6","pulverizr-bal":"=0.6.3","cson":"=0.2.0","watch-tree":"=0.1.1","caterpillar":"=0.1.2"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmJsonOpts":{"file":"/Users/balupton/.npm/buildr/0.8.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"buildr@0.8.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.30","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"deacd61f7c34253fe5e6d384abe1dc227ffe3f96","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.8.1.tgz"}},"0.8.2":{"name":"buildr","version":"0.8.2","description":"The (Java|Coffee)Script and (CSS|Less) (Builder|Bundler|Packer|Minifier|Merger|Checker)","homepage":"https://github.com/balupton/buildr.npm","keywords":["javascript","coffee","lesscss","less","css","builder","package","compile","compress","minify","bundle","merge","lint"],"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"contributors":[{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"}],"bugs":{"url":"https://github.com/balupton/buildr.npm/issues"},"licenses":[{"type":"MIT","url":"http://creativecommons.org/licenses/MIT/"}],"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"dependencies":{"less-bal":"1.1.x","coffee-script":"1.1.x","bal-util":"0.7.x","jshint":"0.2.x","csslint":"0.4.x","uglify-js":"1.0.x","pulverizr-bal":"0.6.x","cson":"0.2.x","watch-tree":"0.1.x","caterpillar":"0.1.x"},"engines":{"node":">=0.4.0"},"directories":{"lib":"lib"},"bin":{"buildr":"./bin/buildr.coffee"},"main":"./lib/buildr.coffee","_npmUser":{"name":"balupton","email":"b@lupton.cc"},"_id":"buildr@0.8.2","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.90","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"c9757f723846f8848c130013e859af2c4587dfac","tarball":"http://registry.npmjs.org/buildr/-/buildr-0.8.2.tgz"}}},"maintainers":[{"name":"balupton","email":"b@lupton.cc"}],"time":{"modified":"2011-10-05T10:01:20.510Z","created":"2011-03-23T12:12:02.025Z","0.1.0":"2011-03-23T12:12:02.465Z","0.1.1":"2011-03-23T12:17:23.983Z","0.1.2":"2011-03-23T12:19:37.140Z","0.2.0":"2011-03-25T11:24:13.130Z","0.2.1":"2011-03-27T13:34:31.744Z","0.2.2":"2011-03-30T18:22:41.060Z","0.2.3":"2011-04-02T23:35:33.502Z","0.2.4":"2011-04-02T23:45:42.343Z","0.2.5":"2011-04-03T02:02:21.302Z","0.2.6":"2011-04-05T11:21:25.315Z","0.2.7":"2011-04-05T12:28:12.427Z","0.2.8":"2011-04-05T12:44:32.897Z","0.2.9":"2011-04-20T10:46:10.708Z","0.4.0":"2011-07-01T12:09:56.623Z","0.4.1":"2011-07-01T12:26:53.262Z","0.4.2":"2011-07-01T12:28:37.790Z","0.4.3":"2011-07-01T12:33:47.273Z","0.4.4":"2011-07-01T12:49:22.032Z","0.4.5":"2011-07-09T01:18:36.441Z","0.5.0":"2011-07-09T03:40:28.525Z","0.5.1":"2011-07-09T03:41:52.551Z","0.5.2":"2011-07-09T04:09:24.169Z","0.5.3":"2011-07-09T07:07:32.241Z","0.5.4":"2011-07-09T07:08:43.227Z","0.5.5":"2011-07-18T14:47:35.630Z","0.6.1":"2011-07-23T01:23:19.005Z","0.6.2":"2011-07-23T01:28:53.140Z","0.6.3":"2011-07-23T01:43:05.797Z","0.6.4":"2011-07-23T01:55:33.824Z","0.6.5":"2011-08-12T02:32:28.917Z","0.6.6":"2011-08-16T06:43:13.859Z","0.7.0":"2011-08-22T04:58:46.149Z","0.8.0":"2011-09-27T07:04:23.257Z","0.8.1":"2011-09-27T09:31:16.548Z","0.8.2":"2011-10-05T10:01:20.510Z"},"author":{"name":"Benjamin Lupton","email":"b@lupton.cc","url":"http://balupton.com"},"repository":{"type":"git","url":"git://github.com/balupton/buildr.npm.git"},"_attachments":{"buildr-0.8.2.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-usPkUuHIDATwz5NPIyhtEA==","length":20480,"stub":true},"buildr-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-DSo+RLxp3ANDvd6cfnK04w==","length":10357,"stub":true},"buildr-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-qWAM36aeBJxVX0H284ByKg==","length":10353,"stub":true},"buildr-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-WsJSv4u978CcLoUfJjq7sQ==","length":9909,"stub":true},"buildr-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-B65lG0v0A+mb7JYA8MmfNA==","length":9036,"stub":true},"buildr-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":65,"digest":"md5-YnDNVnODvKkQZYaVobAMaQ==","length":8779,"stub":true},"buildr-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":63,"digest":"md5-8zAMVsv+6iEdbJ6J69xtog==","length":8619,"stub":true},"buildr-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-QJw+6YLoQ6wfzHSQxOVLIA==","length":8587,"stub":true},"buildr-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-9AzlvFUS3bisbD+PXZVJWQ==","length":8588,"stub":true},"buildr-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":57,"digest":"md5-QNx6h+NwDnloTLPehPKakg==","length":8568,"stub":true},"buildr-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":55,"digest":"md5-tcVGo6QAFzMGp8NX7YWJSA==","length":5376,"stub":true},"buildr-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":53,"digest":"md5-jLBASY0xn5eyXZNDtmMqhQ==","length":5381,"stub":true},"buildr-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":51,"digest":"md5-5yA0KW1JuPeSeWMVdCiFWQ==","length":5381,"stub":true},"buildr-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":49,"digest":"md5-UplxHJ8//OhDKiv7pzlApw==","length":6811,"stub":true},"buildr-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-hHJqNwCdbaYYMRnkO5XyFA==","length":6667,"stub":true},"buildr-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":45,"digest":"md5-HH9tljtc6a/ssAuQKQotrw==","length":6667,"stub":true},"buildr-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-pXRBrq7bpTPB28Lu8ZQQCw==","length":5411,"stub":true},"buildr-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-PyELf/crO+MTcUheR1A/8w==","length":3895,"stub":true},"buildr-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-ss/Ctq/aTAHon5K1CL9PHg==","length":3900,"stub":true},"buildr-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-lvDV35eFR0o795ewvBIobg==","length":3900,"stub":true},"buildr-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-eKt4huSbjMMgFWa8tZu8ug==","length":3887,"stub":true},"buildr-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-0Xg4qQJ5LC+VER7OWQuqbg==","length":3862,"stub":true},"buildr-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-rNgvRXkfvJcrh4qmgKMvtA==","length":8876,"stub":true},"buildr-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-7tO2YrU4afByMW/XzSEOlw==","length":8779,"stub":true},"buildr-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-OnwXtHmqEdlO8mkz8yH9UQ==","length":8772,"stub":true},"buildr-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-YffJgru7F5Bh8TshVa4i0Q==","length":8764,"stub":true},"buildr-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-A9OiQ5UuMEvkir0gdSa85w==","length":8719,"stub":true},"buildr-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-PVMUpjHU7RXxfVL8RfM/Dg==","length":8291,"stub":true},"buildr-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-WjQ1iYKeFzGN1dS4zZ8Opg==","length":8278,"stub":true},"buildr-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-gItKe87F9d7OI0b/cKguLw==","length":8276,"stub":true},"buildr-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Mp0MS6YnozQOuXHiPQxiVA==","length":8273,"stub":true},"buildr-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-y9b7HuJI8uvonZUhkjz84w==","length":8267,"stub":true},"buildr-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-JQio1HjWDHm8pAFQrwahzQ==","length":6412,"stub":true},"buildr-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Q0rZJRP3j5D9tFfFyxuElA==","length":6407,"stub":true},"buildr-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-HOA46rfOU7qu/JilrNfNbA==","length":6358,"stub":true}}}},
{"id":"buildserver","key":"buildserver","value":{"rev":"5-c18aa75e3f09c086be721aaad7e5ea07"},"doc":{"_id":"buildserver","_rev":"5-c18aa75e3f09c086be721aaad7e5ea07","name":"buildserver","description":"configurable build server with hook.io integration","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"buildserver","version":"0.0.2","description":"configurable build server with hook.io integration","main":"buildserver","homepage":"https://github.com/fshost","author":{"name":"Nathan Cartwright","email":"fshost@yahoo.com","url":"https://github.com/fshost"},"directories":{"lib":"lib"},"engines":{"node":">= 0.5.0"},"licenses":["MIT"],"dependencies":{"hook.io":">= 0.8.10","watch":">= 0.0.3"},"keywords":["build","server","events","buildserver","hook","hookio","hook.io","framework","web","router","app","api"],"settings":{"name":"buildServer","hook-port":5000,"local":true,"autoheal":true},"_npmUser":{"name":"mashdraggin","email":"fshost@yahoo.com"},"_id":"buildserver@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"24f8e73841f12c511fe04321a484c3dced3fa324","tarball":"http://registry.npmjs.org/buildserver/-/buildserver-0.0.2.tgz"},"readme":"","maintainers":[{"name":"mashdraggin","email":"fshost@yahoo.com"}]},"0.0.3":{"name":"buildserver","version":"0.0.3","description":"configurable build server with hook.io integration","main":"buildserver","homepage":"https://github.com/fshost","author":{"name":"Nathan Cartwright","email":"fshost@yahoo.com","url":"https://github.com/fshost"},"directories":{"lib":"lib"},"engines":{"node":">= 0.5.0"},"licenses":["MIT"],"dependencies":{"hook.io":">= 0.8.10","watch":">= 0.0.3","jade":">= 0.26.1"},"keywords":["build","server","events","buildserver","hook","hookio","hook.io","framework","web","router","app","api"],"settings":{"name":"buildServer","hook-port":5000,"local":true,"autoheal":true},"_npmUser":{"name":"mashdraggin","email":"fshost@yahoo.com"},"_id":"buildserver@0.0.3","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"0466ab29e5b47eb4ca0b8865f6cbd3eccd2154f9","tarball":"http://registry.npmjs.org/buildserver/-/buildserver-0.0.3.tgz"},"readme":"","maintainers":[{"name":"mashdraggin","email":"fshost@yahoo.com"}]}},"readme":"","maintainers":[{"name":"mashdraggin","email":"fshost@yahoo.com"}],"time":{"modified":"2012-08-08T06:13:39.459Z","created":"2012-08-08T05:58:34.520Z","0.0.2":"2012-08-08T05:58:36.113Z","0.0.3":"2012-08-08T06:13:39.459Z"},"author":{"name":"Nathan Cartwright","email":"fshost@yahoo.com","url":"https://github.com/fshost"},"_attachments":{"buildserver-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-28WDL5b0OFh5NuOeaNnUHg==","length":10573,"stub":true},"buildserver-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-PHMkbF1aIbF3I6XWzEpWww==","length":10564,"stub":true}}}},
{"id":"buildumb","key":"buildumb","value":{"rev":"13-239c8449a4d1aad693fd62b6813eeee2"},"doc":{"_id":"buildumb","_rev":"13-239c8449a4d1aad693fd62b6813eeee2","name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.1":{"name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","version":"0.0.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["build","export","browser","modules"],"main":"./lib/buildumb","repository":{"type":"git","url":"git://github.com/insin/buildumb.git"},"dependencies":{"isomorph":"0.1.x","request":"2.9.x"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"buildumb@0.0.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"e8d5f7f8cd1bf283c81a8227f6e2ba2dddb4e639","tarball":"http://registry.npmjs.org/buildumb/-/buildumb-0.0.1.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"0.1.0":{"name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","version":"0.1.0","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["build","export","browser","modules"],"main":"./lib/buildumb","repository":{"type":"git","url":"git://github.com/insin/buildumb.git"},"dependencies":{"isomorph":"0.1.x","request":"2.9.x"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"buildumb@0.1.0","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"42cd4e8254684fb6c4d0b3a3b3cc31eb058de3d0","tarball":"http://registry.npmjs.org/buildumb/-/buildumb-0.1.0.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"0.1.1":{"name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","version":"0.1.1","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["build","export","browser","modules"],"main":"./lib/buildumb","repository":{"type":"git","url":"git://github.com/insin/buildumb.git"},"dependencies":{"isomorph":"0.1.x","request":"2.9.x"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"buildumb@0.1.1","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"c37c9ae7ebaee101ff8cf8441ecc4649d6651017","tarball":"http://registry.npmjs.org/buildumb/-/buildumb-0.1.1.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"0.1.2":{"name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","version":"0.1.2","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["build","export","browser","modules"],"main":"./lib/buildumb","repository":{"type":"git","url":"git://github.com/insin/buildumb.git"},"dependencies":{"isomorph":"0.1.x","request":"2.9.x"},"_npmUser":{"name":"insin","email":"jonathan.buchanan@gmail.com"},"_id":"buildumb@0.1.2","devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b9f28a2927dbc73ef126cc4b02dabc203feb4e92","tarball":"http://registry.npmjs.org/buildumb/-/buildumb-0.1.2.tgz"},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"0.1.3":{"name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","version":"0.1.3","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com","url":"https://github.com/insin"},"tags":["build","export","browser","modules"],"main":"./lib/buildumb","repository":{"type":"git","url":"http://github.com/insin/buildumb.git"},"dependencies":{"isomorph":"0.2.x","request":"2.9.x"},"readme":"","_id":"buildumb@0.1.3","dist":{"shasum":"73069561d9f713b575e1b490b4ffd34c1c51d7ff","tarball":"http://registry.npmjs.org/buildumb/-/buildumb-0.1.3.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]},"0.1.4":{"name":"buildumb","description":"Ultra-dumb exporter of Node.js modules for use in the browser","version":"0.1.4","author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com"},"keywords":["build","export","browser","modules","require"],"main":"./lib/buildumb","repository":{"type":"git","url":"http://github.com/insin/buildumb.git"},"dependencies":{"isomorph":"0.2.x","request":"2.9.x"},"license":"MIT","readme":"","_id":"buildumb@0.1.4","dist":{"shasum":"c5854248a2e076e7948a5da5fce4c7541464b7b1","tarball":"http://registry.npmjs.org/buildumb/-/buildumb-0.1.4.tgz"},"maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}]}},"readme":"","maintainers":[{"name":"insin","email":"jonathan.buchanan@gmail.com"}],"time":{"modified":"2012-07-15T18:53:56.773Z","created":"2012-01-18T02:39:19.672Z","0.0.1":"2012-01-18T02:39:22.911Z","0.1.0":"2012-01-18T03:57:25.847Z","0.1.1":"2012-01-30T06:29:13.228Z","0.1.2":"2012-02-04T20:52:36.613Z","0.1.3":"2012-06-29T05:13:35.874Z","0.1.4":"2012-07-15T18:53:56.773Z"},"author":{"name":"Jonathan Buchanan","email":"jonathan.buchanan@gmail.com"},"repository":{"type":"git","url":"http://github.com/insin/buildumb.git"},"_attachments":{"buildumb-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-fmyq9Z+/JhuaNnumoDZF8g==","length":3265,"stub":true},"buildumb-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-pQns7II7Z0HN+Tzn3dtACg==","length":3115,"stub":true},"buildumb-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-ec+d84atMduWX6EQHKW9tw==","length":3164,"stub":true},"buildumb-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kRvk4hCDG691xeU9X4I1Ig==","length":2939,"stub":true},"buildumb-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KgTXkSO2YhyMldQmSIQoaw==","length":2693,"stub":true},"buildumb-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pyvMbc2M6lXxL3yEK/fPNg==","length":2508,"stub":true}}}},
{"id":"buildy","key":"buildy","value":{"rev":"9-9031d61050c5b06e4f7524699e1a6521"},"doc":{"_id":"buildy","_rev":"9-9031d61050c5b06e4f7524699e1a6521","name":"buildy","description":"A build framework with chaining syntax","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.5":{"name":"buildy","version":"0.0.5","description":"A build framework with chaining syntax","keywords":["build","builder"],"author":{"name":"mosen","url":"https://github.com/mosen"},"main":"./lib/buildy","directories":{"lib":"lib","example":"example"},"repository":{"type":"git","url":"git://github.com/mosen/buildy.git"},"dependencies":{"mkdirp":"0.0.x","jslint":"0.1.x","csslint":"0.9.x","less":"1.2.x","uglify-js":"1.2.x","handlebars":"1.0.x","winston":"0.5.x"},"devDependencies":{"expresso":"0.9.x","temp":"0.4.x"},"preferGlobal":true,"_npmUser":{"name":"mosen","email":"mosen1@gmail.com"},"_id":"buildy@0.0.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"79a05585f17a1b73bc954de37025b84480e67cf8","tarball":"http://registry.npmjs.org/buildy/-/buildy-0.0.5.tgz"},"maintainers":[{"name":"mosen","email":"mosen1@gmail.com"}]},"0.0.6":{"name":"buildy","version":"0.0.6","description":"A build framework with chaining syntax","keywords":["build","builder"],"author":{"name":"mosen","url":"https://github.com/mosen"},"main":"./lib/buildy","directories":{"lib":"lib","example":"example"},"repository":{"type":"git","url":"git://github.com/mosen/buildy.git"},"dependencies":{"mkdirp":"0.0.x","jslint":"0.1.x","csslint":"0.9.x","less":"1.2.x","uglify-js":"1.2.x","handlebars":"1.0.x","winston":"0.5.x"},"devDependencies":{"expresso":"0.9.x","temp":"0.4.x"},"preferGlobal":true,"_npmUser":{"name":"mosen","email":"mosen1@gmail.com"},"_id":"buildy@0.0.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"310fb1ea6f7e34e5356d197d0f4c520b693cc217","tarball":"http://registry.npmjs.org/buildy/-/buildy-0.0.6.tgz"},"maintainers":[{"name":"mosen","email":"mosen1@gmail.com"}]},"0.0.7":{"name":"buildy","version":"0.0.7","description":"A build framework with chaining syntax","keywords":["build","builder"],"author":{"name":"mosen","url":"https://github.com/mosen"},"main":"./lib/buildy","directories":{"lib":"lib","example":"example"},"repository":{"type":"git","url":"git://github.com/mosen/buildy.git"},"dependencies":{"mkdirp":"0.0.x","jslint":"0.1.x","csslint":"0.9.x","less":"1.2.x","uglify-js":"1.2.x","handlebars":"1.0.x","winston":"0.5.x"},"devDependencies":{"expresso":"0.9.x","temp":"0.4.x"},"preferGlobal":true,"_npmUser":{"name":"mosen","email":"mosen1@gmail.com"},"_id":"buildy@0.0.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"4e638e7530811f9a4239c935ed67ee4dc2342aa0","tarball":"http://registry.npmjs.org/buildy/-/buildy-0.0.7.tgz"},"maintainers":[{"name":"mosen","email":"mosen1@gmail.com"}]},"0.0.8":{"name":"buildy","version":"0.0.8","description":"A build framework with chaining syntax","keywords":["build","builder"],"author":{"name":"mosen","url":"https://github.com/mosen"},"main":"./lib/buildy","directories":{"lib":"lib","example":"example"},"repository":{"type":"git","url":"git://github.com/mosen/buildy.git"},"dependencies":{"mkdirp":"0.0.x","jslint":"0.1.x","csslint":"0.9.x","less":"1.2.x","uglify-js":"1.2.x","handlebars":"1.0.x","winston":"0.5.x","mime":"1.2.x"},"devDependencies":{"expresso":"0.9.x","temp":"0.4.x"},"engines":{"node":">=0.6.0"},"preferGlobal":true,"_npmUser":{"name":"mosen","email":"mosen1@gmail.com"},"_id":"buildy@0.0.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"43d6f856023b736330e1f6ab61d824d5d1a817ca","tarball":"http://registry.npmjs.org/buildy/-/buildy-0.0.8.tgz"},"maintainers":[{"name":"mosen","email":"mosen1@gmail.com"}]}},"readme":"What\n====\n\nBuildy is a build system for web/javascript/node.js projects.\nIt acts like a sequence of 'piped' commands.\n\nMain features:\n    - relatively brief syntax.\n    - can use asynchronous api where practical.\n    - tasks and task queues can execute in serial or parallel.\n    - extend the built in build tasks with your own tools, or 3rd party tools.\n\n*WARNING: API still in development, and may change without notice until v1.0.0*\n\nBuild things\n============\n\nConcatenate scripts, minify, and write to release directory\n-----------------------------------------------------------\n\n```javascript\nnew Queue('release version')\n    .task('files', ['./js/test1.js', './js/test2.js'])\n    .task('concat')\n    .task('minify')\n    .task('write', { name: './build/test-min.js' })\n    .run();\n```\n\nMake a minified version and a non minified version in parallel using the 'fork' task\n------------------------------------------------------------------------------------\n\n```javascript\nnew Queue('build process')\n    .task('files', ['./js/test1.js', './js/test2.js'])\n    .task('concat')\n    .task('fork', {\n        'raw version' : function() {\n            this.task('write', { name: './build/test.js' }).run();\n        },\n        'minified version' : function() {\n            this.task('minify').task('write', { name: './build/test-min.js' }).run();\n        }\n    }).run();\n```\n\nThe fork task changes the flow of the build from serial to parallel when you need to take a single input and do\na number of independent things with it.\n\nWrite a raw version to the release directory and lint the stylesheets simultaneously\n------------------------------------------------------------------------------------\n\n```javascript\nnew Queue('release version')\n    .task('files', ['./js/test1.js', './js/test2.js'])\n    .task('concat')\n    .task('minify')\n    .task('write', { name: './build/test-min.js' })\n    .run();\n\nnew Queue('lint stylesheets')\n    .task('files', ['./css/test1.css', './css/test2.css'])\n    .task('csslint')\n    .run();\n```\n\nYou can have as many queues as you like. They will run independently and in parallel. This is the best situation for\ntwo or more build processes that have nothing to do with each other.\n\nHow it works\n============\n\n- Construct a `Queue` object with a name (for the logger output).\n- Add a chain of tasks to the `Queue` using the `.task(name, options)` method. The input of each task is the output of\nthe previous one. Some tasks, like `files`, generate output.\n- At the end of the `Queue` chain, call the `.run()` method. The `Queue` will then be automatically run as soon as node\nexecutes the queue file.\n\nFlow Control\n------------\n\nThe `fork` task splits the queue into sub-queues. These are run in parallel.\n\nEach time you add a fork task, it becomes a new Queue with the name specified ('raw version' \nin the last example). The new queue inherits its state from the parent, but acts independently from then on.\n\n\nBuilt in tasks\n==============\n\nThe built in tasks are as follows:\n\n`concat`\n\nConcatenate the input from the previous task.\n\n***\n\n`csslint` (async)\n\nCSSLint the input (Note: doesn't try to detect if you are actually supplying CSS).\n\n***\n\n`cssminify`\n\nReformat/Minify the CSS using Less.js (Also doesn't attempt to detect if you are supplying CSS).\n\n***\n\n`files`\n\nGenerate a files list, commonly used as the start of a queue.\n\n***\n\n`fork`\n\nSplit the build process into two or more parallel build processes.\n\nThe fork function takes a hash of new child queue name to function.\n\nThe function is executed in the context of the queue, so you may use this.task() to continue\nadding tasks to the child queue.\n\n*Known limitation* : you cannot chain to the end of a fork task (as in, going from parallel tasks back to serial).\n\n***\n\n`inspect`\n\nLog the output of the previous task.\n\n***\n\n`jslint` (async)\n\nJSLint the input.\n\n***\n\n`minify`\n\nMinify the input using uglify-js.\n\n***\n\n`replace`\n\nApply a regular expression to replace strings in the input.\n\n***\n\n`template`\n\nApply a handlebars template to the input.\n\n***\n\n`write`\n\nWrite the input to the specified file name.\n\nKnown bugs\n----------\n\nThe globbing module doesn't interpret relative paths using . or ..\n\nCustom tasks\n============\n\nIf you need to add to the available tasks (because a 3rd party tool isn't listed in the built in tasks, for example),\nyou can write your own tasks to be loaded before queues are executed.\n\n*WARNING: API Still in development, may change*\n\nBasic guidelines\n----------------\n\nTake a look at some of the built in tasks (in ./lib/tasks) to see how a custom task should be structured.\n\n* Each task has its own source file, but you can publish many tasks in one file if you like.\n* The task file must export a property called `tasks`, which is an object.\n* The `tasks` object contains a property name, which the user supplies when invoking the task, and a function.\n* The task function is called with options, and an event emitter. The queue expects you to emit `complete` or `failed`\nfrom the emitter, to let it know the result of your asynchronous (or synchronous) task.\n\nHello.js - a custom task example\n--------------------------------\n\nhello.js\n\n```javascript\nvar State = require('buildy/lib/state'); // Required to use State.TYPES.*, see switch statement later...\n\nfunction hello() {\n    return 'hello world';\n}\n\nfunction helloHandler(options, promise) {\n    switch (this._state.get().type) { /* What type of input are we handling? we should handle every pseudo constant in\n                                         State.TYPES.* */\n\n        case State.TYPES.STRING:\n            var myStringValue = hello(), // Call another function to handle the functionality of the task\n                myStatusMessage = 'Set new value to ' + myStringValue;\n\n            this._state.set(State.TYPES.STRING, myStringValue); // We set a new value 'hello world' of type string\n            promise.emit('complete', 'hello', myStatusMessage); // Tell the queue we are done successfully\n\n            break;\n\n        case State.TYPES.STRINGS:\n            // Iterate through strings\n            // Set all of them to 'hello world'\n            // Set the new state value from that array\n            break;\n\n        case State.TYPES.FILES:\n            // Behaviour is up to you...\n            break;\n\n        default:\n            promise.emit('failed', 'hello', 'Unrecognized input type: ' + this._state.get().type);\n\n    }\n}\n\nexports.tasks = {\n    'hello' : helloHandler\n}\n```\n\nThis task is now registered as the `hello` task. We can use it now as a part of our build process, like so:\n\ntestqueue.js\n\n```javascript\nvar Registry = require('buildy/lib/registry'),\n    Queue = require('buildy/lib/queue').Queue,\n    customRegistry, testq;\n\ncustomRegistry.add('/path/to/tasks/hello.js'); // Add the custom task OR\n// customRegistry.load('/path/to/tasks/directory'); // Load *.js from this directory\n\ntestq = new Queue('Testing queue', { registry: customRegistry }); // Set up a new queue with custom registry.\n\ntestq.task('hello'); // The current state will be set to 'hello world'\ntestq.write({ dest: './hello.txt' }) // The string will be written out to a file, ./hello.txt\ntestq.run(); // Run the task chain, the hello.txt file is created.\n```\n\nTODO\n====\n\n* Separate task logging from the status object.\n* Clarify the custom task autoloading method.\n* 100% test coverage of each task.\n* Standardise an option for producing .json formatted reports from tasks that produce that kind of output. (probably use\nwinston metadata/custom transports).\n* Determine a strategy for dealing with tasks that operate on a batch of files where the output is also files. Use\ndestination dir, file prefix, file suffix options.\n* Establish a defaults system, so that a task option can be defaulted for the entire queue or set of queues.\n* Files that are cast into strings should retain filename throughout the process, so that they may be written out based upon the original name.\n* Dont use an inspect task in the unit tests, the unit test might expose a problem with inspect instead of the subject.\n\nnon piped file output should take these options:\n{ dir: '/output/directory', prefix: 'prepended-to-filename', suffix: 'appended-to-filename' }\nthis is to handle a multiple-string or multiple-file operation","maintainers":[{"name":"mosen","email":"mosen1@gmail.com"}],"time":{"modified":"2012-05-07T06:50:49.078Z","created":"2012-02-23T06:23:35.955Z","0.0.5":"2012-02-23T06:23:39.296Z","0.0.6":"2012-03-12T06:19:57.355Z","0.0.7":"2012-04-11T02:02:11.954Z","0.0.8":"2012-05-07T06:50:49.078Z"},"author":{"name":"mosen","url":"https://github.com/mosen"},"repository":{"type":"git","url":"git://github.com/mosen/buildy.git"},"_attachments":{"buildy-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Peu0PdgdIMfVHPIwV6B4WA==","length":78571,"stub":true},"buildy-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AiqDFGmhNdSluibyJHclsQ==","length":74021,"stub":true},"buildy-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ed55QxhYg7y5eNrIsjGWyA==","length":35547,"stub":true},"buildy-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pxFLOUiY0DVZRy362PwmPQ==","length":34678,"stub":true}}}},
{"id":"bulk-hogan","key":"bulk-hogan","value":{"rev":"4-e11191dc1bad50d3a8374efee7df5a1f"},"doc":{"_id":"bulk-hogan","_rev":"4-e11191dc1bad50d3a8374efee7df5a1f","name":"bulk-hogan","description":"Produces html from some view object by rendering it via some mustache implementation.","dist-tags":{"latest":"0.2.0-dev"},"versions":{"0.2.0-dev":{"author":{"name":"Myles Byrne","email":"myles@myles.id.au"},"name":"bulk-hogan","description":"Produces html from some view object by rendering it via some mustache implementation.","version":"0.2.0-dev","license":"MIT","homepage":"https://github.com/quackingduck/bulk-hogan","engines":{"node":">=0.6"},"main":"lib/bulk_hogan.js","repository":{"type":"git","url":"https://github.com/quackingduck/bulk-hogan.git"},"dependencies":{"async":"~0.1.18","glob":"~3.1.9","hogan.js":"2.0.0"},"devDependencies":{"coffee-script":"~1.2.0","fs-extra":"~0.1.1"},"scripts":{"test":"./node_modules/.bin/coffee src/bulk_hogan.coffee"},"readme":"bulk-hogan\n==========\n\nBulk-Hogan will search your directory structure for two kinds\nof folders, `templates` and `modules`. Then you can access compiled\nversions of your templates like\n\n````coffeescript\n# renders /templates/home.html.mustache\ntemplates.render 'home', { body: \"body html\" }, (err, html) ->\n  throw err if err?\n  console.log html\n\n# renders /modules/footer/module.html.mustache\ntemplates.render 'footer', {} (err, html) ->\n\n# renders /modules/footer/links.html.mustache\ntemplates.render 'footer_links', {} (err, html) ->\n````\n\nThis is an early beta release. Use at your own risk etc.\n\n","_id":"bulk-hogan@0.2.0-dev","dist":{"shasum":"a786ab079a74a03fb6d03aef1f8b80bd99a1ef68","tarball":"http://registry.npmjs.org/bulk-hogan/-/bulk-hogan-0.2.0-dev.tgz"},"maintainers":[{"name":"mcculloughsean","email":"mcculloughsean@gmail.com"}]}},"readme":"bulk-hogan\n==========\n\nBulk-Hogan will search your directory structure for two kinds\nof folders, `templates` and `modules`. Then you can access compiled\nversions of your templates like\n\n````coffeescript\n# renders /templates/home.html.mustache\ntemplates.render 'home', { body: \"body html\" }, (err, html) ->\n  throw err if err?\n  console.log html\n\n# renders /modules/footer/module.html.mustache\ntemplates.render 'footer', {} (err, html) ->\n\n# renders /modules/footer/links.html.mustache\ntemplates.render 'footer_links', {} (err, html) ->\n````\n\nThis is an early beta release. Use at your own risk etc.\n\n","maintainers":[{"name":"mcculloughsean","email":"mcculloughsean@gmail.com"},{"name":"quackingduck","email":"myles@myles.id.au"}],"time":{"modified":"2012-08-14T18:07:16.758Z","created":"2012-08-14T18:07:00.729Z","0.2.0-dev":"2012-08-14T18:07:02.063Z"},"author":{"name":"Myles Byrne","email":"myles@myles.id.au"},"repository":{"type":"git","url":"https://github.com/quackingduck/bulk-hogan.git"},"_attachments":{"bulk-hogan-0.2.0-dev.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-eCi1KJ4pUCr9ZAAomeGyBw==","length":5836,"stub":true}}}},
{"id":"bullet","key":"bullet","value":{"rev":"3-8d6a1767f4ca68fcfec91fb788af0b4d"},"doc":{"_id":"bullet","_rev":"3-8d6a1767f4ca68fcfec91fb788af0b4d","name":"bullet","description":"A simple lightweight MVC with express","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"bullet","version":"0.1.0","author":{"name":"Pavan Kumar Sunkara","email":"pavan.sss1991@gmail.com","url":"http://pksunkara.github.com"},"description":"A simple lightweight MVC with express","main":"./lib/bullet","repository":{"type":"git","url":"git://github.com/pksunkara/bullet.git"},"keywords":["bullet","express","mvc","simple","rails"],"homepage":"http://pksunkara.github.com/bullet","scripts":{"test":"./node_modules/.bin/vows --spec $(find test -type f -name *-test.js)"},"contributors":[{"name":"Pavan Kumar Sunkara","email":"pavan.sss1991@gmail.com"}],"dependencies":{"connect":"2.3.x","utile":"0.1.x","nconf":"0.6.x","resourceful":"0.3.x","director":"1.1.x"},"devDependencies":{"api-easy":"0.3.x","express":"3.0.x","jade":"*","vows":"0.6.x"},"engines":{"node":">0.6.x"},"bugs":{"url":"https://github.com/pksunkara/bullet/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pksunkara/bullet/raw/master/LICENSE"}],"_npmUser":{"name":"pksunkara","email":"pavan.sss1991@gmail.com"},"_id":"bullet@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.8.2","_defaultsLoaded":true,"dist":{"shasum":"ba67f34fec39ae142ee6fd8b81f658a4b8865ed2","tarball":"http://registry.npmjs.org/bullet/-/bullet-0.1.0.tgz"},"maintainers":[{"name":"pksunkara","email":"pavan.sss1991@gmail.com"}]}},"readme":"# bullet\n\nbullet is a very simple and lightweight MVC over [express](http://expressjs.com)\n\n## Installation\n```\nnpm install bullet\n```\n\n## Usage\n\n```js\nvar github = require('bullet');\n```\n\n## Testing\n```\nnpm test\n```\n\nIf you like this project, please watch this and follow me.\n\n## Contributors\nHere is a list of [Contributors](http://github.com/pksunkara/bullet/contributors)\n\n### TODO\n\n__I accept pull requests and guarantee a reply back within a day__\n\n## License\nMIT/X11\n\n## Bug Reports\nReport [here](http://github.com/pksunkara/bullet/issues). __Guaranteed reply within a day__.\n\n## Contact\nPavan Kumar Sunkara (pavan.sss1991@gmail.com)\n\nFollow me on [github](https://github.com/users/follow?target=pksunkara), [twitter](http://twitter.com/pksunkara)\n","maintainers":[{"name":"pksunkara","email":"pavan.sss1991@gmail.com"}],"time":{"modified":"2012-07-11T19:30:42.221Z","created":"2012-07-11T19:30:40.914Z","0.1.0":"2012-07-11T19:30:42.221Z"},"author":{"name":"Pavan Kumar Sunkara","email":"pavan.sss1991@gmail.com","url":"http://pksunkara.github.com"},"repository":{"type":"git","url":"git://github.com/pksunkara/bullet.git"},"_attachments":{"bullet-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TYyRpn881KQfx1orFGCloA==","length":163007,"stub":true}}}},
{"id":"bullettrain","key":"bullettrain","value":{"rev":"253-06f6e657bcbb1bd3b4904eaece6552f5"},"doc":{"_id":"bullettrain","_rev":"253-06f6e657bcbb1bd3b4904eaece6552f5","name":"bullettrain","description":"Simple Ecommerce","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.0":{"name":"bullettrain","version":"1.0.0","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.0","dist":{"shasum":"4e2fbd6d28ba73f3b891f8c54bfccd3c64afb895","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.0.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}],"directories":{}},"1.0.1":{"name":"bullettrain","version":"1.0.1","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.1","dist":{"shasum":"736db506f6bfc2e3303af32dbcf72a1d29f6749a","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.1.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}],"directories":{}},"1.0.2":{"name":"bullettrain","version":"1.0.2","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.2","dist":{"shasum":"6297ed98d232325504fbab829f37e64587b73a47","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.2.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}],"directories":{}},"1.0.3":{"name":"bullettrain","version":"1.0.3","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.3","dist":{"shasum":"812b5a89a5c9d65e158608b26834fcf93c87fdd2","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.3.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}],"directories":{}},"1.0.4":{"name":"bullettrain","version":"1.0.4","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.4","dist":{"shasum":"66673a4d056d9c5d34198730efc4eb371aa38c98","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.4.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}]},"1.0.5":{"name":"bullettrain","version":"1.0.5","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.5","dist":{"shasum":"f1dc787e40304a982c0f7f150f7718aecf9cd7ed","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.5.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}]},"1.0.6":{"name":"bullettrain","version":"1.0.6","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.6","dist":{"shasum":"4c708e4084b70725c95b09010966f9f58db47013","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.6.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}]},"1.0.7":{"name":"bullettrain","version":"1.0.7","description":"Simple Ecommerce","keywords":["OpenShift","Node.js","application","openshift"],"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"homepage":"http://jackiergleason.com/","repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"engines":{"node":">= 0.6.0","npm":">= 1.0.0"},"dependencies":{"express":"3.0.0beta4","jade":"*","stylus":"*","paynode":"*","mongodb":"*","gridfs-stream":"*","node-uuid":"*"},"devDependencies":{},"bundleDependencies":[],"main":"./lib/bullettrain.js","readme":"","_id":"bullettrain@1.0.7","dist":{"shasum":"8d85daa532d62ec8c2e6c54149c65c724993c16b","tarball":"http://registry.npmjs.org/bullettrain/-/bullettrain-1.0.7.tgz"},"maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}]}},"readme":"","maintainers":[{"name":"jackie","email":"jackiegleason@gmail.com"}],"time":{"modified":"2012-08-15T01:50:38.640Z","created":"2012-07-14T17:13:45.885Z","1.0.0":"2012-07-14T17:13:47.090Z","1.0.1":"2012-07-14T17:38:13.879Z","1.0.2":"2012-07-15T15:20:39.181Z","1.0.3":"2012-07-15T20:29:13.135Z","1.0.4":"2012-07-19T02:09:06.415Z","1.0.5":"2012-08-06T20:13:21.286Z","1.0.6":"2012-08-08T22:17:58.224Z","1.0.7":"2012-08-15T01:50:38.640Z"},"author":{"name":"Jackie Gleason","email":"jackiegleason@gmail.com","url":"http://jackiergleason.com"},"repository":{"type":"git","url":"https://github.com/jrgleason/node-bullettrain"},"_attachments":{"bullettrain-1.0.7.tgz":{"content_type":"application/octet-stream","revpos":253,"digest":"md5-NLmhDtTr36GKEO+V3TMD1w==","length":7475,"stub":true},"bullettrain-1.0.6.tgz":{"content_type":"application/octet-stream","revpos":251,"digest":"md5-nRC70shZAT6pW6tr87VqVg==","length":6810,"stub":true},"bullettrain-1.0.5.tgz":{"content_type":"application/octet-stream","revpos":249,"digest":"md5-NW9f9vpCDmYjRdB51crO+Q==","length":6146,"stub":true},"bullettrain-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":247,"digest":"md5-b9NPacKGxoXt8BEC1rHICw==","length":5398,"stub":true},"bullettrain-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-YqbED4PR/S5Pq96U17ZLuQ==","length":3856,"stub":true},"bullettrain-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-YzOp71DIxsL7fFIU15wcAg==","length":3824,"stub":true},"bullettrain-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-XVeWnDEOcN8rm6B0d8cj0g==","length":3607,"stub":true},"bullettrain-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-p753C26+sxpSS3Khki238w==","length":3605,"stub":true}}}},
{"id":"bump","key":"bump","value":{"rev":"5-422d0d9ed964c7ec11f33203c00fef1f"},"doc":{"_id":"bump","_rev":"5-422d0d9ed964c7ec11f33203c00fef1f","name":"bump","dist-tags":{"latest":"0.2.3"},"versions":{"0.0.1":{"author":{"name":"Kilian Ciuffolo","email":"kilian.ciuffolo@gmail.org","url":"http://nailik.org"},"name":"bump","main":"./bump","bin":{"bump":"./bump.js"},"version":"0.0.1","repository":{"type":"git","url":"git://github.com/kilianc/node-bump.git"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"bump@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"2900c9b5e2c741fa18293dd99174d76d9303a172","tarball":"http://registry.npmjs.org/bump/-/bump-0.0.1.tgz"},"_from":".","readme":"","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]},"0.2.3":{"author":{"name":"Kilian Ciuffolo","email":"kilian.ciuffolo@gmail.org","url":"http://nailik.org"},"name":"bump","main":"./bump","bin":{"bump":"./bump.js"},"version":"0.2.3","repository":{"type":"git","url":"git://github.com/kilianc/node-bump.git"},"_npmUser":{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"},"_id":"bump@0.2.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"d618c905f8df3b2a463552926d7deeb723f10b6d","tarball":"http://registry.npmjs.org/bump/-/bump-0.2.3.tgz"},"_from":".","readme":"","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}]}},"readme":"","maintainers":[{"name":"kilianc","email":"kilian.ciuffolo@gmail.com"}],"time":{"modified":"2012-06-05T12:23:30.725Z","created":"2012-06-04T12:38:35.123Z","0.0.1":"2012-06-04T12:38:37.210Z","0.2.3":"2012-06-05T12:23:30.725Z"},"author":{"name":"Kilian Ciuffolo","email":"kilian.ciuffolo@gmail.org","url":"http://nailik.org"},"repository":{"type":"git","url":"git://github.com/kilianc/node-bump.git"},"_attachments":{"bump-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-nMBvAfeT3C9KR2DVF4plbA==","length":770,"stub":true},"bump-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-o2IFaa5NSJ34I90/8Foc+w==","length":754,"stub":true}}}},
{"id":"bumper","key":"bumper","value":{"rev":"3-1e8d17aa3b29815e4069294cc9ce572c"},"doc":{"_id":"bumper","_rev":"3-1e8d17aa3b29815e4069294cc9ce572c","name":"bumper","description":"Simple release management for npm packages using git","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.4":{"author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"name":"bumper","description":"Simple release management for npm packages using git","version":"0.0.4","homepage":"https://github.com/agnoster/bumper","main":"./index.js","repository":{"type":"git","url":"git://github.com/agnoster/bumper.git"},"engines":{"node":"~0.4.8"},"dependencies":{"semver":"~1.0.7"},"devDependencies":{},"license":{"type":"MIT","url":"https://github.com/agnoster/bumper/raw/master/LICENSE"},"bin":{"bumper":"./bin/bumper"},"_id":"bumper@0.0.4","_engineSupported":true,"_npmVersion":"1.0.8","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"4f3fff223f0f72e7d2f6890867c04da7822ab871","tarball":"http://registry.npmjs.org/bumper/-/bumper-0.0.4.tgz"},"scripts":{}}},"maintainers":[{"name":"agnoster","email":"agnoster@gmail.com"}],"time":{"modified":"2011-06-21T17:05:36.936Z","created":"2011-06-21T17:05:36.095Z","0.0.4":"2011-06-21T17:05:36.936Z"},"author":{"name":"Isaac Wolkerstorfer","email":"agnoster@gmail.com","url":"http://agnoster.net/"},"repository":{"type":"git","url":"git://github.com/agnoster/bumper.git"},"_attachments":{"bumper-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-fIl46+eTZl8sq3e6hUTq2g==","length":1991,"stub":true}}}},
{"id":"bunch","key":"bunch","value":{"rev":"7-1c80aa4ae0768c15f8040b90500bc041"},"doc":{"_id":"bunch","_rev":"7-1c80aa4ae0768c15f8040b90500bc041","name":"bunch","description":"A stand-alone, manifest-driven JS/CSS bundler.","dist-tags":{"latest":"0.5.1"},"versions":{"0.4.0":{"author":{"name":"Adam Miller","email":"adam@barbariangroup.com","url":"http://www.barbariangroup.com"},"name":"bunch","description":"A stand-alone, manifest-driven JS/CSS bundler.","version":"0.4.0","homepage":"https://github.com/thebarbariangroup/bunch.js","repository":{"type":"git","url":"git@github.com:thebarbariangroup/bunch.js.git"},"main":"./lib/bunch.js","engines":{"node":">=0.4.6"},"dependencies":{"yui-compressor":"0.1.3","less":"1.2.0"},"devDependencies":{"vows":"0.5.x","wrench":"1.3.x","underscore":"1.2.x"},"bin":{"bunch":"./bin/bunch-cli.js"},"scripts":{"test":"vows test/test_bunch_* -i"},"_npmUser":{"name":"adammiller","email":"adam@heyadammiller.com"},"_id":"bunch@0.4.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"4fb1df247fe44d809868b526be6336004635f416","tarball":"http://registry.npmjs.org/bunch/-/bunch-0.4.0.tgz"},"maintainers":[{"name":"adammiller","email":"adam@heyadammiller.com"}]},"0.5.0":{"author":{"name":"Adam Miller","email":"adam@barbariangroup.com","url":"http://www.barbariangroup.com"},"name":"bunch","description":"A stand-alone, manifest-driven JS/CSS bundler.","version":"0.5.0","homepage":"https://github.com/thebarbariangroup/bunch.js","repository":{"type":"git","url":"git@github.com:thebarbariangroup/bunch.js.git"},"main":"./lib/bunch.js","engines":{"node":">=0.4.6"},"dependencies":{"yui-compressor":"0.1.3","less":"1.2.0"},"devDependencies":{"vows":"0.5.x","wrench":"1.3.x","underscore":"1.2.x"},"bin":{"bunch":"./bin/bunch-cli.js"},"scripts":{"test":"vows test/test_bunch_* -i"},"_npmUser":{"name":"adammiller","email":"adam@heyadammiller.com"},"_id":"bunch@0.5.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"68ad2343070da2540223a7e4d10491430be67b9f","tarball":"http://registry.npmjs.org/bunch/-/bunch-0.5.0.tgz"},"maintainers":[{"name":"adammiller","email":"adam@heyadammiller.com"}]},"0.5.1":{"author":{"name":"Adam Miller","email":"adam@barbariangroup.com","url":"http://www.barbariangroup.com"},"name":"bunch","description":"A stand-alone, manifest-driven JS/CSS bundler.","version":"0.5.1","homepage":"https://github.com/thebarbariangroup/bunch.js","repository":{"type":"git","url":"git@github.com:thebarbariangroup/bunch.js.git"},"main":"./lib/bunch.js","engines":{"node":">=0.4.6"},"dependencies":{"yui-compressor":"0.1.3","less":"1.2.0"},"devDependencies":{"vows":"0.5.x","wrench":"1.3.x","underscore":"1.2.x"},"bin":{"bunch":"./bin/bunch-cli.js"},"scripts":{"test":"vows test/test_bunch_* -i"},"_id":"bunch@0.5.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"182536e40b07d2d2ca671f2066d957053b356008","tarball":"http://registry.npmjs.org/bunch/-/bunch-0.5.1.tgz"},"maintainers":[{"name":"adammiller","email":"adam@heyadammiller.com"}]}},"readme":"# bunch.js\n\nBunch.js is a manifest-driven CSS and Javascript packaging utility. Here's what makes bunch.js awesome:\n\n- He's a stand-alone program. No server-side code or framework required. \n- He packages AND minifies your JS and CSS files for you. \n- He's manifest driven. With one configuration file, he makes it easy to see what JS and CSS files are in use on your site, and what needs retired.\n- He runs all your CSS through [Less](http://lesscss.org/) for you.\n- He lets you provide global variables to your CSS and JS.\n- He's got a monitor mode that will automatically rebuild your bundles when they change. \n\n## Installation\n\nYou can install bunch.js from npm: \n\n\tnpm install bunch --global\n\t\nOr if you wish to build from source, checkout the repository, and run:\n\n\tnpm install --global\n\n## Usage\n\nTo generate a new Bunch file for your project, run:\n\n\tbunch init\n\nTo pack your bundles, run:\n\n\tbunch pack\n\nTo start monitoring the source files for changes, run:\n\n\tbunch monitor\n\t\n## The Bunchfile\n\nAs stated above, bunch.js is manifest driven. All your instructions to bunch.js should live in a Bunchfile. A Bunchfile is simply a JSON document with a few specific variables that allow you to control how bunch.js will bundle your code. \n\n\t{\n\t\t\"jsDir\": \"js\", // This is a relative path to where your JS files live\n\t\t\"cssDir\": \"css\", // This is a relative path to where your CSS files live\n\t\t\"sourceDir\": \"src\", // This is the name of the dir inside jsDir and cssDir where your source files will live.\n\t\t\"buildDir\": \"bin\", // This is the name of the dir inside jsDir and cssDir where your built files will live.\n\t\t\"bundles\": { // List each bundle in here like so...\n\t\t\t\"example_base.js\": [\n\t\t\t\t\"vendor/jquery.js\",\n\t\t\t\t\"app.js\"\n\t\t\t],\n\t\t\t\"example_base.css\": [\n\t\t\t\t\"reset.css\",\n\t\t\t\t\"app.css\"\n\t\t\t]\n\t\t},\n\t\t\"variables\": { // You can specify variables here. Objects are not supported in CSS, and will simply be ignored.\n\t\t\t\"baseURL\": \"/staging/bunchShop/\",\n\t\t\t\"mainColor\": \"#385903\",\n\t\t\t\"bunches\": [\"Bananas\", \"Flowers\", \"Grapes\", \"Carrots\", \"Bradys\"]\n\t\t}\n\t}\n\t\n# Upgrading an existing project from pickle.js\n\nBunch used to be called pickle.js. If you're upgrading from pickle.js, simply rename Pickler to Bunchfile and you should be good to go. \n\n\n# Running the tests\n\nBunch.js is tested with [Vows](http://vowsjs.org/), and each path expects to be run in it's own process. This much change in the future, but for now it means passing the isolate parameter to vows when running the test suite. \n\n\tvows test/test_bunch* -i\n\n\n# License\n\nBunch.js is released under the [Modified BSD License](https://github.com/thebarbariangroup/bunch.js/blob/master/LICENSE).","maintainers":[{"name":"adammiller","email":"adam@heyadammiller.com"}],"time":{"modified":"2012-01-31T21:08:54.474Z","created":"2012-01-24T19:17:42.756Z","0.4.0":"2012-01-24T19:17:43.231Z","0.5.0":"2012-01-24T20:40:46.879Z","0.5.1":"2012-01-31T21:08:54.474Z"},"author":{"name":"Adam Miller","email":"adam@barbariangroup.com","url":"http://www.barbariangroup.com"},"repository":{"type":"git","url":"git@github.com:thebarbariangroup/bunch.js.git"},"_attachments":{"bunch-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Kr4zC56OD+JDlHkOVQ1hdg==","length":12214,"stub":true},"bunch-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-IkFsSpvd9oulK2kWcuFMtw==","length":20480,"stub":true},"bunch-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RqZO1qrtGUsd58sKbLGDDg==","length":20480,"stub":true}}}},
{"id":"bundle","key":"bundle","value":{"rev":"49-12fa6da90769055056065086a8cccf18"},"doc":{"_id":"bundle","_rev":"49-12fa6da90769055056065086a8cccf18","name":"bundle","description":"generates a files package through template engine (such as jade) and then compress them into a zip file ready to use it.","dist-tags":{"latest":"0.2.3"},"versions":{"0.0.1":{"name":"bundle","version":"0.0.1","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.10.7","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"2952bf1d0be4f938f67cc1bb85135e64e676aedc","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.1.tgz"},"scripts":{},"directories":{}},"0.0.2":{"name":"bundle","version":"0.0.2","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.10.7","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"c60024a5dee8c6f5a6701df240511109390a701a","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.2.tgz"},"scripts":{},"directories":{}},"0.0.3":{"name":"bundle","version":"0.0.3","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.10.7","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"f50ec9dfb6b7ec353beb8519e25476d7fbdf1a71","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.3.tgz"},"scripts":{},"directories":{}},"0.0.4":{"name":"bundle","version":"0.0.4","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.10.7","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.4","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"0b0f41d62251fd9d4bd9c0dd8810f1645f53412a","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.4.tgz"},"scripts":{},"directories":{}},"0.0.5":{"name":"bundle","version":"0.0.5","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.10.7","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.5","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"c37f4cebedcdf953d78826882e67bd8144f2d709","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.5.tgz"},"scripts":{},"directories":{}},"0.0.6":{"name":"bundle","version":"0.0.6","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.10.7","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.6","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"14159ddd67b6f5df511da356b0938b234db72edf","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.6.tgz"},"scripts":{}},"0.0.7":{"name":"bundle","version":"0.0.7","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.7","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"a15479421c3985ad2151a9d6dddae9b76ccea015","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.7.tgz"},"scripts":{}},"0.0.8":{"name":"bundle","version":"0.0.8","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.8","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"344295f52c17dc8b84aff2c2dee6b8e1e9e25064","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.8.tgz"},"scripts":{}},"0.0.9":{"name":"bundle","version":"0.0.9","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.0.9","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"c1c0f92b029b522b9f45b1a7134018112d65783f","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.0.9.tgz"},"scripts":{}},"0.1.0":{"name":"bundle","version":"0.1.0","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"ba066a936e0c0f3ecee5c8bf2d2b1d5674310bcb","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.0.tgz"},"scripts":{}},"0.1.1":{"name":"bundle","version":"0.1.1","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"f358e01951f4bfdadad0519c77e1f06cc27a9426","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.1.tgz"},"scripts":{}},"0.1.2":{"name":"bundle","version":"0.1.2","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"39ee6530cceec2e97e01b01f75d782d63509703e","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.2.tgz"},"scripts":{}},"0.1.3":{"name":"bundle","version":"0.1.3","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"bundle@0.1.3","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"5cdd643486389c4b6f932a78e1dcd0f090457940","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.3.tgz"},"scripts":{}},"0.1.4":{"name":"bundle","version":"0.1.4","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/root/.npm/bundle/0.1.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bundle@0.1.4","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"423823fa8c78d7ced6c5a3576193330292830f26","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.4.tgz"},"scripts":{},"maintainers":[{"name":"damian","email":"damian@learnboost.com"}]},"0.1.5":{"name":"bundle","version":"0.1.5","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","engines":{"node":"0.4.x"},"_npmJsonOpts":{"file":"/root/.npm/bundle/0.1.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bundle@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.22","_nodeVersion":"v0.4.3","_defaultsLoaded":true,"dist":{"shasum":"7ebc90f33735d2ca50d1a15221c9cb010c43f114","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.5.tgz"},"scripts":{},"maintainers":[{"name":"damian","email":"damian@learnboost.com"}]},"0.1.6":{"name":"bundle","version":"0.1.6","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.11.0","log":"1.1.1"},"main":"index","_npmUser":{"name":"rauchg","email":"rauchg@gmail.com"},"_id":"bundle@0.1.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"52bb48b123062ece2728fe5d224c2ffeb9fc11bd","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.1.6.tgz"},"maintainers":[{"name":"damian","email":"damian@learnboost.com"},{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.2.1":{"name":"bundle","version":"0.2.1","description":"Bundle generator","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.25.x"},"devDependencies":{"expresso":"x.x.x","log":"x.x.x"},"main":"index","_npmUser":{"name":"damian","email":"damian@learnboost.com"},"_id":"bundle@0.2.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"3ecc7b41befad58073a581a4f22de55697a1343f","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.2.1.tgz"},"readme":"\n# bundle\n\n  `bundle` generates html files from views and gzips the result, creating a\n  bundle.\n\n## Usage\n\n    var Bundle = require('bundle');\n\n    // define a bundle\n    var bundle = Bundle.createBundle({\n      views: 'views/bundles/teacher/'\n    });\n\n    // add a file to our bundle\n    bundle.file('index', function (id, render) {\n      UserModel.findById(id, function (err, user) {\n        render('index.jade', { name: name });\n      })\n    });\n\n    // other into custom folder\n    bundle.file('misc/students', function (id, render) {\n      // will create a students.html file into a misc/ folder\n    });\n\n    // create one using a layout\n    bundle.file('main', { layout: 'layout.jade' }, function (id, render) {\n    });\n\n    // add file passing html as parameter\n    teacher.file('list', '<ul><li>apple</li><li>orange</li><li>banana</li></ul>');\n\n    // generate a bundle\n    app.get('/generate-bundle-example/:id', function (req, req, next) {\n      teacher.generate(req.param('id'), function (zip) {\n          knox.upload(zip, function (err, url) {\n            res.send('Download your bundle here: ' + url);\n          });\n      });\n    });\n\n## API\n\n### `createBundle`\n\n### `features`\n\n- supports layout and partials\n\n\n#### Options\n\n- views: directory where template files are located\n- gzip: gzip command (defaults to 'zip')\n- 'view engine': defaults to 'jade'\n- extension: defaults to 'html'\n\n\n### Authors\n  - Guillermo Rauch - guillermo@learnboost.com - [guille](http://github.com/guille)\n  - Damian Suarez - damian@learnboost.com - [retrofox](http://github.com/retrofox)\n\n## License \n\n(The MIT License)\n\nCopyright(c) 2011 LearnBoost <damian@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"damian","email":"damian@learnboost.com"},{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.2.2":{"name":"bundle","version":"0.2.2","description":"generates a files package through template engine (such as jade) and then compress them into a zip file ready to use it.","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.25.x"},"devDependencies":{"expresso":"x.x.x","log":"x.x.x"},"main":"index","_npmUser":{"name":"damian","email":"damian@learnboost.com"},"_id":"bundle@0.2.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"41930da798c968f07bfb67cf7cd43357fa9e3e54","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.2.2.tgz"},"readme":"\n# bundle\n\n  `bundle` generates html files from views and gzips the result, creating a\n  bundle.\n\n## Usage\n\n    var Bundle = require('bundle');\n\n    // define a bundle\n    var bundle = Bundle.createBundle({\n      views: 'views/bundles/teacher/'\n    });\n\n    // add a file to our bundle\n    bundle.file('index', function (id, render) {\n      UserModel.findById(id, function (err, user) {\n        render('index.jade', { name: name });\n      })\n    });\n\n    // other into custom folder\n    bundle.file('misc/students', function (id, render) {\n      // will create a students.html file into a misc/ folder\n    });\n\n    // create one using a layout\n    bundle.file('main', { layout: 'layout.jade' }, function (id, render) {\n    });\n\n    // add file passing html as parameter\n    teacher.file('list', '<ul><li>apple</li><li>orange</li><li>banana</li></ul>');\n\n    // generate a bundle\n    app.get('/generate-bundle-example/:id', function (req, req, next) {\n      teacher.generate(req.param('id'), function (zip) {\n          knox.upload(zip, function (err, url) {\n            res.send('Download your bundle here: ' + url);\n          });\n      });\n    });\n\n## API\n\n### `createBundle`\n\n### `features`\n\n- supports layout and partials\n\n\n#### Options\n\n- views: directory where template files are located\n- gzip: gzip command (defaults to 'zip')\n- 'view engine': defaults to 'jade'\n- extension: defaults to 'html'\n\n\n### Authors\n  - Guillermo Rauch - guillermo@learnboost.com - [guille](http://github.com/guille)\n  - Damian Suarez - damian@learnboost.com - [retrofox](http://github.com/retrofox)\n\n## License \n\n(The MIT License)\n\nCopyright(c) 2011 LearnBoost <damian@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"damian","email":"damian@learnboost.com"},{"name":"rauchg","email":"rauchg@gmail.com"}]},"0.2.3":{"name":"bundle","version":"0.2.3","description":"generates a files package through template engine (such as jade) and then compress them into a zip file ready to use it.","keywords":[],"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"dependencies":{"jade":"0.25.x"},"devDependencies":{"expresso":"x.x.x"},"main":"index","_npmUser":{"name":"damian","email":"damian@learnboost.com"},"_id":"bundle@0.2.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"87d5fe1c19172d0bbef7856d06d7d19fefaf6767","tarball":"http://registry.npmjs.org/bundle/-/bundle-0.2.3.tgz"},"readme":"\n# bundle\n\n  `bundle` generates html files from views and gzips the result, creating a\n  bundle.\n\n## Usage\n\n    var Bundle = require('bundle');\n\n    // define a bundle\n    var bundle = Bundle.createBundle({\n      views: 'views/bundles/teacher/'\n    });\n\n    // add a file to our bundle\n    bundle.file('index', function (id, render) {\n      UserModel.findById(id, function (err, user) {\n        render('index.jade', { name: name });\n      })\n    });\n\n    // other into custom folder\n    bundle.file('misc/students', function (id, render) {\n      // will create a students.html file into a misc/ folder\n    });\n\n    // create one using a layout\n    bundle.file('main', { layout: 'layout.jade' }, function (id, render) {\n    });\n\n    // add file passing html as parameter\n    teacher.file('list', '<ul><li>apple</li><li>orange</li><li>banana</li></ul>');\n\n    // generate a bundle\n    app.get('/generate-bundle-example/:id', function (req, req, next) {\n      teacher.generate(req.param('id'), function (zip) {\n          knox.upload(zip, function (err, url) {\n            res.send('Download your bundle here: ' + url);\n          });\n      });\n    });\n\n## API\n\n### `createBundle`\n\n### `features`\n\n- supports layout and partials\n\n\n#### Options\n\n- views: directory where template files are located\n- gzip: gzip command (defaults to 'zip')\n- 'view engine': defaults to 'jade'\n- extension: defaults to 'html'\n\n\n### Authors\n  - Guillermo Rauch - guillermo@learnboost.com - [guille](http://github.com/guille)\n  - Damian Suarez - damian@learnboost.com - [retrofox](http://github.com/retrofox)\n\n## License \n\n(The MIT License)\n\nCopyright(c) 2011 LearnBoost <damian@learnboost.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"damian","email":"damian@learnboost.com"},{"name":"rauchg","email":"rauchg@gmail.com"}]}},"maintainers":[{"name":"damian","email":"damian@learnboost.com"},{"name":"rauchg","email":"rauchg@gmail.com"},{"name":"retrofox","email":"damian@learnboost.com"}],"time":{"modified":"2012-08-09T15:17:29.761Z","created":"2011-05-27T00:15:55.776Z","0.0.1":"2011-05-27T00:15:57.080Z","0.0.2":"2011-05-27T19:32:53.702Z","0.0.3":"2011-05-27T22:45:25.045Z","0.0.4":"2011-05-28T00:42:52.096Z","0.0.5":"2011-05-30T14:14:29.230Z","0.0.6":"2011-05-30T20:41:12.055Z","0.0.7":"2011-05-31T14:08:28.587Z","0.0.8":"2011-06-06T18:08:46.137Z","0.0.9":"2011-06-10T03:32:48.505Z","0.1.0":"2011-06-10T18:17:54.315Z","0.1.1":"2011-06-15T04:37:00.511Z","0.1.2":"2011-06-17T18:21:33.347Z","0.1.3":"2011-06-23T04:53:14.215Z","0.1.4":"2011-09-21T16:58:03.803Z","0.1.5":"2011-09-21T17:45:13.323Z","0.1.6":"2012-01-19T00:05:03.591Z","0.2.1":"2012-04-23T20:34:01.317Z","0.2.2":"2012-04-23T22:44:28.248Z","0.2.3":"2012-04-24T13:58:58.288Z"},"author":{"name":"Damian Suarez","email":"damian@learnboost.com"},"_attachments":{"bundle-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":48,"digest":"md5-zI7uSAN0rLtDWdpnzJWBZQ==","length":4753,"stub":true},"bundle-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":46,"digest":"md5-uvGfkDmcnvqiQvA8/US3PQ==","length":4459,"stub":true},"bundle-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-0rwA1laZfneP8YHvE1PIsA==","length":4398,"stub":true},"bundle-0.1.6.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-wKJEM5lan5e6gGhkVT8/cQ==","length":20480,"stub":true},"bundle-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-d/4fXbBcKiEUFgwmluNDQQ==","length":61851,"stub":true},"bundle-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-I35Q+QH6Q0rPW5Li8DhNsQ==","length":61684,"stub":true},"bundle-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-jefjXyW1u7UW3KM4jbxksA==","length":4857,"stub":true},"bundle-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":33,"digest":"md5-Hxz4rOJ1OWDn9mi8c3XWvA==","length":4798,"stub":true},"bundle-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-SUEb9oVYqAQ84Gmg440RFQ==","length":4787,"stub":true},"bundle-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-bKLZgf55sodVoJT7RsCrRA==","length":4787,"stub":true},"bundle-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-uijATE9wGfTdtaaCh+I4xg==","length":4759,"stub":true},"bundle-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-jMcqv5lMMP2rnusYMOjIfw==","length":4750,"stub":true},"bundle-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-tTQUrfqQvNFwv/awBQ9uKQ==","length":4743,"stub":true},"bundle-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-mdlGRTpAOpVYQpoBBlhxjg==","length":4741,"stub":true},"bundle-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-RNFtiZe0AhB0kTTgMLlBTg==","length":4732,"stub":true},"bundle-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6VMHiaSj6JtkIz7Vf5yFgg==","length":4539,"stub":true},"bundle-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Z7g7Ulve5RHrfaG+3S/yjA==","length":4453,"stub":true},"bundle-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-FLCKMmeAuluJqnHxn5BGSQ==","length":4126,"stub":true},"bundle-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-vr29T1K3nMcOl3D/R1YpTQ==","length":3839,"stub":true}}}},
{"id":"bundle-loader","key":"bundle-loader","value":{"rev":"9-30c67ad7aae48c217b64b234a2a03c13"},"doc":{"_id":"bundle-loader","_rev":"9-30c67ad7aae48c217b64b234a2a03c13","name":"bundle-loader","description":"bundle loader module for webpack","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"bundle-loader","version":"0.1.0","author":{"name":"Tobias Koppers @sokra"},"description":"bundle loader module for webpack","licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"license":"MIT","_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"bundle-loader@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"0b15a6319db0b7df94e07138b0773cb7a0933e11","tarball":"http://registry.npmjs.org/bundle-loader/-/bundle-loader-0.1.0.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.1.1":{"name":"bundle-loader","version":"0.1.1","author":{"name":"Tobias Koppers @sokra"},"description":"bundle loader module for webpack","licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"license":"MIT","_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"bundle-loader@0.1.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"b421250d0d6849f1c4e1e244aae346fcfe4d7672","tarball":"http://registry.npmjs.org/bundle-loader/-/bundle-loader-0.1.1.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.1.2":{"name":"bundle-loader","version":"0.1.2","author":{"name":"Tobias Koppers @sokra"},"description":"bundle loader module for webpack","licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"license":"MIT","_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"bundle-loader@0.1.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"2303e85645c221ec8a558b6d096efeeb2e592b52","tarball":"http://registry.npmjs.org/bundle-loader/-/bundle-loader-0.1.2.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]},"0.1.3":{"name":"bundle-loader","version":"0.1.3","author":{"name":"Tobias Koppers @sokra"},"description":"bundle loader module for webpack","licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"license":"MIT","_npmUser":{"name":"sokra","email":"tobias.koppers@googlemail.com"},"_id":"bundle-loader@0.1.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"a184798d9d845369b42670fd3957b5dd07cf03c8","tarball":"http://registry.npmjs.org/bundle-loader/-/bundle-loader-0.1.3.tgz"},"maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}]}},"readme":"# bundle loader for webpack\r\n\r\n## Usage\r\n\r\n``` javascript\r\nrequire(\"bundle!./file.js\")(function(file) {\r\n\t// use file like is was required with\r\n\t// var file = require(\"./file.js\");\r\n});\r\n// wraps the require in a requre.ensure block\r\n```\r\n\r\n## License\r\n\r\nMIT (http://www.opensource.org/licenses/mit-license.php)","maintainers":[{"name":"sokra","email":"tobias.koppers@googlemail.com"}],"time":{"modified":"2012-06-25T11:09:16.699Z","created":"2012-05-04T14:36:22.611Z","0.1.0":"2012-05-04T14:36:26.098Z","0.1.1":"2012-05-05T17:01:00.567Z","0.1.2":"2012-05-20T21:57:06.823Z","0.1.3":"2012-06-25T11:09:16.699Z"},"author":{"name":"Tobias Koppers @sokra"},"_attachments":{"bundle-loader-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Wdj+AlekFPEPCXvRkGDUGA==","length":1026,"stub":true},"bundle-loader-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-aFVIIlgEbjqKgUaHWWukXQ==","length":899,"stub":true},"bundle-loader-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-LQh0E2peEOuTbocnmbil5A==","length":873,"stub":true},"bundle-loader-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-t5GsvnS47sHngnk5hkcj9Q==","length":872,"stub":true}}}},
{"id":"bundle-up","key":"bundle-up","value":{"rev":"31-cbd40b4338f15264bd9b7dfddbbfb113"},"doc":{"_id":"bundle-up","_rev":"31-cbd40b4338f15264bd9b7dfddbbfb113","name":"bundle-up","description":"A simple asset manager middleware for connect","dist-tags":{"latest":"0.3.3"},"versions":{"0.1.0":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager as middleware","version":"0.1.0","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e458bc42ce8d219589e506c45909acb0278fbf52","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.1.0.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.1.1":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager as middleware","version":"0.1.1","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ff6ea88e16b17268b014394f49ac5ca233485d75","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.1.1.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.1.2":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager as middleware","version":"0.1.2","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.1.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1373deb7c7bfea0bf8a10b5befd8fcacd9fef21d","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.1.2.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.1.3":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager as middleware","version":"0.1.3","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.1.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"bc7a2fea7cf62f84d6dfe6529d328f924f79ff5c","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.1.3.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.1.4":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.1.4","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.1.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"eb636dfd0bf7f8942bfda1abb075cfbbd62a4994","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.1.4.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.1.5":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.1.5","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.1.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3e550a8303c8439c66a6c55792497b909af88f5c","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.1.5.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.2.0":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.2.0","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"d0c0501e590d201eaa6a7173dc7d3a027cf281eb","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.2.0.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.2.1":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.2.1","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.2.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"80a59d0335bc433f5d9d2d0885a4c374ff170ca2","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.2.1.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.2.2":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.2.2","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.2.2","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"76e47f86b20afa189d57d742f1b5d7322e3a8d35","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.2.2.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.2.3":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.2.3","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.2.3","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"dc99e6f7d6d05bf4e4713a017ebe731a8f5ccbd6","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.2.3.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.2.4":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.2.4","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.2.4","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"28222164a31795a04f339eb5948c8ba2e77ae7a7","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.2.4.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.2.5":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.2.5","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/jasmine-node --coffee specs/"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7"},"devDependencies":{"jasmine-node":">= 1.0.11","sinon":">= 1.2.0","rimraf":">= 1.0.8","express":">= 2.0.0","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.2.5","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"5892cf60efd68a559cb4265bd53a7acd6c6cee58","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.2.5.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.3.0":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.3.0","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.4.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7","uglify-js":">= 1.2.5"},"devDependencies":{"mocha":">= 0.11.0","expect.js":">= 0.1.1","rimraf":">= 1.0.8","express":"2.x","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.3.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.6","_defaultsLoaded":true,"dist":{"shasum":"3efe9231138ad34b92ccd29eb51115abbfd0bd94","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.3.0.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.3.2":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.3.2","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.6.x < 0.7.0"},"scripts":{"test":"node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7","uglify-js":">= 1.2.5"},"devDependencies":{"mocha":">= 0.11.0","expect.js":">= 0.1.1","rimraf":">= 1.0.8","express":"2.x","request":">= 2.2.9","jade":">= 0.19.0"},"_npmUser":{"name":"freddan","email":"fredriklindin@gmail.com"},"_id":"bundle-up@0.3.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"d0280a8d9dbcbefe367c159ff00a1a1cda597e4c","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.3.2.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]},"0.3.3":{"name":"bundle-up","author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"description":"A simple asset manager middleware for connect","version":"0.3.3","repository":{"url":""},"main":"index.js","engines":{"node":">= 0.6.x < 0.9.0"},"scripts":{"test":"node_modules/.bin/mocha --compilers coffee:coffee-script"},"dependencies":{"coffee-script":">= 1.1.3","csso":">= 1.2.8","async":">= 0.1.15","stylus":">= 0.19.0","mkdirp":">= 0.0.7","uglify-js":">= 1.2.5"},"devDependencies":{"mocha":">= 0.11.0","expect.js":">= 0.1.1","rimraf":">= 1.0.8","express":"2.x","request":">= 2.2.9","jade":">= 0.19.0"},"readme":"Bundle up!  [![Build Status](https://secure.travis-ci.org/Cowboy-coder/bundle-up.png)](https://secure.travis-ci.org/Cowboy-coder/bundle-up)\n==========\n\nBundle up is a middleware for connect to manage all client-side assets in an organized way.\n\nInstallation\n------------\n\n    $ npm install bundle-up\n\nUsage\n-----\n\n``` js\nvar BundleUp = require('bundle-up');\n\nBundleUp(app, __dirname + '/assets', {\n  staticRoot: __dirname + '/public/',\n  staticUrlRoot:'/',\n  bundle:true,\n  minifyCss: true,\n  minifyJs: true\n});\n\n// To actually serve the files a static file\n// server needs to be added after Bundle Up\napp.use(express.static(__dirname + '/public/'))\n```\n\nThe first parameter to the BundleUp middleware is the app object and the second is the path to the assets file. Through the assets file all client-side assets needs to get added.\n\n``` js\n// assets.js\nmodule.exports = function(assets) {\n  assets.root = __dirname;\n  assets.addJs('/public/js/jquery-1.6.4.min.js');\n  assets.addJs('/public/js/jquery.placeholder.min.js');\n  assets.addJs('/app/client/main.coffee');\n\n  assets.addCss('/public/bootstrap/bootstrap.min.css');\n  assets.addCss('/app/styles/screen.styl');\n}\n```\n\nJust point to a file (.js, .css, .coffee or .styl are currently supported) anywhere in your app directory. In your view you can then just render all the css or javascript files by calling `renderStyles` and `renderJs` like this:\n\n``` jade\n!!!\nhtml\n  head\n    != renderStyles()\n  body!= body\n    != renderJs()\n```\n\nBy default this will render\n\n``` html\n<link href='/bootstrap/bootstrap.min.css' media='screen' rel='stylesheet' type='text/css'/>\n<link href='/generated/app/styles/screen.css' media='screen' rel='stylesheet' type='text/css'/>\n\n<script src='/js/jquery-1.6.4.min.js' type='text/javascript'></script>\n<script src='/js/jquery.placeholder.min.js' type='text/javascript'></script>\n<script src='/generated/app/client/main.js' type='text/javascript'></script>\n```\n\nAll assets will be compiled on-the-fly when `bundle:false` is set. Therefore the server never\nneeds to be restarted when editing the different assets.\n\nTo render bundles `bundle:true` needs to be passed as a parameter to the middleware. This will concatenate all javascript and css files into bundles and render this:\n\n``` html\n<link href='/generated/bundle/d7aa56c_global.css' media='screen' rel='stylesheet' type='text/css'/>\n<script src='/generated/bundle/1e4b515_global.js' type='text/javascript'></script>\n```\n\nAll bundles are generated during startup. The filename will change with the content so you should configure your web server with far future expiry headers.\n\n### generated/\n\nAll files that needs to be compiled, copied (if you are bundling up a file that doesn't reside in your `public/` directory) or bundled will end up in `public/generated/` directory. This is to have an organized way to separate whats actually *your code* and whats *generated code*.\n\n### Filtered paths\n\nAll files can be added in a directory by using a \"filtered path\" like this\n\n``` js\n// assets.js\nmodule.exports = function(assets) {\n  assets.addJs(__dirname + '/public/js/**'); //adds all files in /public/js (subdirectories included)\n  assets.addJs(__dirname + '/public/*.js'); //adds all js files in /public\n  assets.addJs(__dirname + '/cs/**.coffee'); //adds all coffee files in /cs (subdirectories included)\n});\n```\n### Namespaces\n\nSometimes all javascript or css files cannot be bundled into the same bundle. In that case\nnamespaces can be used\n\n``` js\n// assets.js\nmodule.exports = function(assets) {\n  assets.addJs(__dirname + '/public/js/1.js');\n  assets.addJs(__dirname + '/public/js/2.js');\n  assets.addJs(__dirname + '/public/locales/en_US.js', 'en_US');\n\n  assets.addJs(__dirname + '/public/css/1.css');\n  assets.addJs(__dirname + '/public/css/2.css');\n  assets.addJs(__dirname + '/public/css/ie.css', 'ie');\n});\n```\n\n``` jade\n!!!\nhtml\n  head\n    != renderStyles()\n    != renderStyles('ie')\n  body!= body\n    != renderJs()\n    != renderJs('en_US')\n```\n\nwhich will render this with `bundle:false`:\n\n``` html\n<link href='/css/1.css' media='screen' rel='stylesheet' type='text/css'/>\n<link href='/css/2.css' media='screen' rel='stylesheet' type='text/css'/>\n<link href='/css/ie.css' media='screen' rel='stylesheet' type='text/css'/>\n\n<script src='/js/1.js' type='text/javascript'></script>\n<script src='/js/2.js' type='text/javascript'></script>\n<script src='/locales/en_US.js' type='text/javascript'></script>\n```\n\nand this with `bundle:true`:\n\n``` html\n<link href='/generated/bundle/d7aa56c_global.css' media='screen' rel='stylesheet' type='text/css'/>\n<link href='/generated/bundle/d7aa56c_ie.css' media='screen' rel='stylesheet' type='text/css'/>\n<script src='/generated/bundle/1e4b515_global.js' type='text/javascript'></script>\n<script src='/generated/bundle/1e4b515_en_US.js' type='text/javascript'></script>\n```\n\nLicense\n-------\n\nMIT licensed\n","_id":"bundle-up@0.3.3","dist":{"shasum":"699b916514a298f52e9065f59ce297f9bf0754a1","tarball":"http://registry.npmjs.org/bundle-up/-/bundle-up-0.3.3.tgz"},"maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}]}},"readme":"Bundle up!\n==========\n\nBundle up is a middleware for connect to manage all client-side assets in an organized way. Everything is manged using an assets file\n\n    // assets.js\n    module.exports = function(assets) {\n        assets.root = __dirname\n    \tassets.addJs(\"/public/js/jquery-1.6.4.min.js\");\n    \tassets.addJs(\"/public/js/jquery.placeholder.min.js\");\n    \tassets.addJs(\"/app/client/main.coffee\");\n    \n    \tassets.addCss(\"/public/bootstrap/bootstrap.min.css\");\n    \tassets.addCss(\"/app/styles/screen.styl\");\n    }\n\nJust point to a file (.js, .css, .coffee or .styl are currently supported) anywhere in your app directory. In your view you can then just render all the css or javascript files by calling `renderStyles` and `renderJs` like this:\n\n    !!!\n    html\n      head\n        != renderStyles\n      body!= body\n      != renderJs\n\nBy default this will render\n\n    <link href='/bootstrap/bootstrap.min.css' media='screen' rel='stylesheet' type='text/css'/>\n    <link href='/generated/app/styles/screen.css' media='screen' rel='stylesheet' type='text/css'/>\n\n    <script src='/js/jquery-1.6.4.min.js' type='text/javascript'></script>\n    <script src='/js/jquery.placeholder.min.js' type='text/javascript'></script>\n    <script src='/generated/app/client/main.js' type='text/javascript'></script>\n\nAll assets will be compiled on-the-fly when `bundle:false` is set. Therefore the server never\nneeds to be restarted when editing the different assets.\n\nTo render bundles `bundle:true` needs to be passed as a parameter to the middleware. This will concatenate all javascript and css files into bundles and render this:\n\n    <link href='/generated/bundle/d7aa56c_global.css' media='screen' rel='stylesheet' type='text/css'/>\n    <script src='/generated/bundle/1e4b515_global.js' type='text/javascript'></script>\n\nAll bundles are generated during startup. The filename will change with the content so you should configure your web server with far future expiry headers.\n\n### generated/\n\nAll files that needs to be compiled, copied (if you are bundling up a file that doesn't reside in your `public/` directory) or bundled will end up in `public/generated/` directory. This is to have an organized way to separate whats actually *your code* and whats *generated code*.\n\nUsage\n-----\n\n    BundleUp(app, __dirname + \"/assets\", {\n      staticRoot: __dirname + \"/public/\",\n      staticUrlRoot:\"/\",\n      bundle:true\n    });\n\nThe first parameter is the app object and the second is the path to the assets file\n\nTODO\n----\n\n * Add support for addCss(\"folder/\\*.css\") and addJs(\"**.coffee\") etc.\n * Add support for namespaced assets\n\nLICENSE\n-------\n\nMIT licensed\n","maintainers":[{"name":"freddan","email":"fredriklindin@gmail.com"}],"time":{"modified":"2012-06-26T20:39:13.852Z","created":"2011-12-12T17:55:56.547Z","0.1.0":"2011-12-12T17:55:58.601Z","0.1.1":"2011-12-12T19:16:42.291Z","0.1.2":"2011-12-12T19:24:31.302Z","0.1.3":"2011-12-12T21:08:28.197Z","0.1.4":"2011-12-13T20:40:52.326Z","0.1.5":"2011-12-14T22:05:16.257Z","0.2.0":"2011-12-16T20:22:25.448Z","0.2.1":"2011-12-17T15:18:16.091Z","0.2.2":"2011-12-18T16:55:13.805Z","0.2.3":"2011-12-18T22:51:18.306Z","0.2.4":"2011-12-28T13:12:18.957Z","0.2.5":"2011-12-29T22:09:32.633Z","0.3.0":"2012-04-18T11:11:18.895Z","0.3.2":"2012-06-20T10:25:35.181Z","0.3.3":"2012-06-26T20:39:13.852Z"},"author":{"name":"Fredrik Lindin","email":"fredriklindin@gmail.com"},"repository":{"url":""},"_attachments":{"bundle-up-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":31,"digest":"md5-kNr4hRStuiysPrFG4gtEeQ==","length":10707,"stub":true},"bundle-up-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-Gy1egHHmtLXuFvr4l0sCxw==","length":10667,"stub":true},"bundle-up-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-gASF3AMPNaC44FlomwtZSw==","length":20480,"stub":true},"bundle-up-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-mDJ5L0W5leWH/C/OjHtoug==","length":20480,"stub":true},"bundle-up-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-LWEDyBUVcUtqg7ZsHWUSUg==","length":20480,"stub":true},"bundle-up-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-GKRc+a9n3uqMsSmRcX8h4Q==","length":20480,"stub":true},"bundle-up-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-PYbzq87UbHCKu8IQ6H1NCg==","length":20480,"stub":true},"bundle-up-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-rBZoLCyk+qFrqJjJ5gJy6Q==","length":20480,"stub":true},"bundle-up-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Z/Fuz0cASsyT9kqg2Iw4Vg==","length":10240,"stub":true},"bundle-up-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-cbrOS+uQxnrO6gQ8ocYYrw==","length":10240,"stub":true},"bundle-up-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-9ZOSnQNK+8Zq1AqN9HNOWQ==","length":10240,"stub":true},"bundle-up-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-601EbbYmiSYpSnaVftS7kw==","length":10240,"stub":true},"bundle-up-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-lAgh+EZPVovuA2uiYE8Lng==","length":10240,"stub":true},"bundle-up-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-f7qk+ZgH9Fdd5G/uGAl3vQ==","length":10240,"stub":true},"bundle-up-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-pMukU2ON726yl0ncJzQ8Cw==","length":10240,"stub":true}}}},
{"id":"bundled","key":"bundled","value":{"rev":"5-8209dd5935d3af8be250667cb8b477d0"},"doc":{"_id":"bundled","_rev":"5-8209dd5935d3af8be250667cb8b477d0","name":"bundled","description":"A standalone bundle manage which can add an extendable plugin system to any application","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Paul Serby","email":"paul@serby.net"},"name":"bundled","description":"A standalone bundle manage which can add an extendable plugin system to any application","version":"0.0.1","repository":{"type":"git","url":"git@github.com:serby/bundled"},"main":"lib/bundled.js","scripts":{"test":"mocha -r should -R List "},"engines":{"node":">0.4.0"},"dependencies":{"async":"~0.1","semver":"~1.0","underscore":"~1.3"},"devDependencies":{"mocha":"*","should":"*"},"_npmUser":{"name":"serby","email":"paul@serby.net"},"_id":"bundled@0.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"119d5990f4ab90a917e9e93518678c42e6527385","tarball":"http://registry.npmjs.org/bundled/-/bundled-0.0.1.tgz"},"maintainers":[{"name":"serby","email":"paul@serby.net"}]},"0.0.2":{"author":{"name":"Paul Serby","email":"paul@serby.net"},"name":"bundled","description":"A standalone bundle manage which can add an extendable plugin system to any application","version":"0.0.2","repository":{"type":"git","url":"git@github.com:serby/bundled"},"main":"lib/bundled.js","scripts":{"test":"./node_modules/.bin/mocha -r should"},"engines":{"node":">0.4.0"},"dependencies":{"async":"~0.1","semver":"~1.0","underscore":"~1.3"},"devDependencies":{"mocha":"*","should":"*"},"_npmUser":{"name":"serby","email":"paul@serby.net"},"_id":"bundled@0.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"fc1e1852519be00cc90f37e78fda16b038772701","tarball":"http://registry.npmjs.org/bundled/-/bundled-0.0.2.tgz"},"maintainers":[{"name":"serby","email":"paul@serby.net"}]}},"readme":"# Bundled - A standalone bundle manager\n\nBundled allows you to add a standalone extension system any application.\n\n[![build status](https://secure.travis-ci.org/serby/bundled.png)](http://travis-ci.org/serby/bundled)\n\n## Installation\n\n      npm install bundled\n\n## Usage\n\n* Create a folder to house all of your bundles\n* Create a bundle folder\n* Create bundle.js which must have the following:\n\nbundle.js\n\n      modules.exports = {\n        name: 'Hoozit',\n        version: '0.0.1',\n        description: 'This is a very cool hoozit', // Optional\n        nav: { title: 'Hoozit', url: 'http://hoozit.com' } // Custom properties can be added\n      };\n\n* Then add to your application like so:\n\napp.js\n\n      var bundled = require('bundled')(app);\n      bundled.addPath('bundle/hoozit');\n\n* You can add as unlimited properties to a bundle and retrieve them later using:\n\napp.js\n\n      var bundled = require('bundled')(app);\n      bundled.addPath('bundle/hoozit');\n      bundled.get('nav'); // Returns an array of all the bundles value for **nav**\n\n* If you need to initialize code for your bundle you can add an initialize function or even an array of functions.\n\nSingle initialize function example:\n\n      modules.exports = {\n        name: 'Hoozit',\n        version: '0.0.1',\n        description: 'This is a very cool hoozit',\n        nav: { title: 'Hoozit', url: 'http://hoozit.com' },\n        initialize: function(app, done) {\n          app.hoozit = 'I am a hoozit';\n          done();\n        }\n      };\n\nMultiple initialize function example:\n\n      modules.exports = {\n        name: 'Hoozit',\n        version: '0.0.1',\n        description: 'This is a very cool hoozit',\n        nav: { title: 'Hoozit', url: 'http://hoozit.com' },\n        initialize: [function(app, done) {\n          // Do something first. All first level initialization will be executed.\n          done();\n        }, function(app, done) {\n          // Then all second level initialization will be executed. This is handy for circular references.\n          app.hoozit = 'I am a hoozit';\n          done();\n        }]\n      };\n\nFor more information take a look at the tests.\n\n## Credits\n[Paul Serby](https://github.com/serby/) follow me on [twitter](http://twitter.com/PabloSerbo)\n\n## Licence\nLicenced under the [New BSD License](http://opensource.org/licenses/bsd-license.php)\n","maintainers":[{"name":"serby","email":"paul@serby.net"}],"time":{"modified":"2012-06-25T21:13:29.960Z","created":"2012-03-15T01:09:58.723Z","0.0.1":"2012-03-15T01:10:00.520Z","0.0.2":"2012-06-25T21:13:29.960Z"},"author":{"name":"Paul Serby","email":"paul@serby.net"},"repository":{"type":"git","url":"git@github.com:serby/bundled"},"_attachments":{"bundled-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-WKwxqV/Nwc7iAJiGPRp0Kg==","length":5120,"stub":true},"bundled-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZR0Vgcj4M+17ZzwVECtySw==","length":5135,"stub":true}}}},
{"id":"bundlejs","key":"bundlejs","value":{"rev":"3-9958d0609c026bd9ff4a06647e74ae72"},"doc":{"_id":"bundlejs","_rev":"3-9958d0609c026bd9ff4a06647e74ae72","name":"bundlejs","description":"simplistic tool for bundling javascripts and css files","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bundlejs","description":"simplistic tool for bundling javascripts and css files","version":"0.0.1","keywords":["js","bundle","pack","package"],"author":{"name":"torgeir thoresen","email":"@torgeir"},"dependencies":{"uglify-js":"1.2.x","debug":"0.1.x"},"devDependencies":{"buster":"0.3.x"},"scripts":{"test":"make test"},"engines":{"node":"0.6.x"},"main":"index","_npmUser":{"name":"torgeir","email":"torgeir.thoresen@gmail.com"},"_id":"bundlejs@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.2","_defaultsLoaded":true,"dist":{"shasum":"8ec29c0d8bb4b91bf7c539fddbd0151366279e40","tarball":"http://registry.npmjs.org/bundlejs/-/bundlejs-0.0.1.tgz"},"maintainers":[{"name":"torgeir","email":"torgeir.thoresen@gmail.com"}]}},"readme":null,"maintainers":[{"name":"torgeir","email":"torgeir.thoresen@gmail.com"}],"time":{"modified":"2011-12-28T16:59:24.820Z","created":"2011-12-28T16:59:22.607Z","0.0.1":"2011-12-28T16:59:24.820Z"},"author":{"name":"torgeir thoresen","email":"@torgeir"},"_attachments":{"bundlejs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EHrysEjnBMcicFcZOtiWow==","length":10240,"stub":true}}}},
{"id":"bundler","key":"bundler","value":{"rev":"3-6c0b45b9d3075b6f1f8c086723e20a06"},"doc":{"_id":"bundler","_rev":"3-6c0b45b9d3075b6f1f8c086723e20a06","name":"bundler","description":"Bundler. It is better for you to not know what it is.","dist-tags":{"latest":"0.8.0"},"versions":{"0.8.0":{"name":"bundler","description":"Bundler. It is better for you to not know what it is.","version":"0.8.0","homepage":"https://github.com/mihaild/ybundler","author":{"name":"Mikhail Dektyarev","email":"mihail.dektyarow@gmail.com","url":"https://github.com/mihaild/"},"maintainers":[{"name":"mihaild","email":"mihail.dektyarow@gmail.com"}],"directories":{"lib":"./lib","bin":"./bin"},"main":"./lib/bundler.js","bin":{"bundler":"./bin/bundler"},"dependencies":{"coa":">= 0.1.1"},"devDependencies":{"vows":">= 0.0.0"},"engines":["node ~0.4.0"],"licenses":[{"type":"AS IS"}],"_npmJsonOpts":{"file":"/home/mihaild/.npm/bundler/0.8.0/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bundler@0.8.0","_engineSupported":true,"_npmVersion":"1.0.26","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"72ee1537720eb0877ee0bbc8cc2ad5ba9261c24e","tarball":"http://registry.npmjs.org/bundler/-/bundler-0.8.0.tgz"},"scripts":{}}},"maintainers":[{"name":"mihaild","email":"mihail.dektyarow@gmail.com"}],"time":{"modified":"2011-10-21T11:07:35.608Z","created":"2011-10-21T11:07:33.172Z","0.8.0":"2011-10-21T11:07:35.608Z"},"author":{"name":"Mikhail Dektyarev","email":"mihail.dektyarow@gmail.com","url":"https://github.com/mihaild/"},"_attachments":{"bundler-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-dtfVueR82oOG0XhMvohHkQ==","length":11081,"stub":true}}}},
{"id":"bunker","key":"bunker","value":{"rev":"9-a073cc29e00930699d2b786faf705917"},"doc":{"_id":"bunker","_rev":"9-a073cc29e00930699d2b786faf705917","name":"bunker","description":"code coverage in native javascript","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.0":{"name":"bunker","version":"0.0.0","description":"code coverage in native javascript","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"dependencies":{"burrito":">=0.2.5 <0.3"},"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso"},"repository":{"type":"git","url":"git://github.com/substack/node-bunker.git"},"keywords":["code","coverage"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_id":"bunker@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"9eae72bc4d0a2b5b1695179c1be754327b8bf6f1","tarball":"http://registry.npmjs.org/bunker/-/bunker-0.0.0.tgz"}},"0.1.0":{"name":"bunker","version":"0.1.0","description":"code coverage in native javascript","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"dependencies":{"burrito":">=0.2.5 <0.3"},"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso"},"repository":{"type":"git","url":"git://github.com/substack/node-bunker.git"},"keywords":["code","coverage"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_id":"bunker@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"eaf152b929d7152b155b0e7695ed98e82b3681e4","tarball":"http://registry.npmjs.org/bunker/-/bunker-0.1.0.tgz"}},"0.1.1":{"name":"bunker","version":"0.1.1","description":"code coverage in native javascript","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"dependencies":{"burrito":">=0.2.5 <0.3"},"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso"},"repository":{"type":"git","url":"git://github.com/substack/node-bunker.git"},"keywords":["code","coverage"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_id":"bunker@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"ca8e0f695a9e67318f07d16b972d85d5d186daad","tarball":"http://registry.npmjs.org/bunker/-/bunker-0.1.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.1.2":{"name":"bunker","version":"0.1.2","description":"code coverage in native javascript","main":"index.js","directories":{"lib":".","example":"example","test":"test"},"dependencies":{"burrito":">=0.2.5 <0.3"},"devDependencies":{"tap":"~0.2.4"},"scripts":{"test":"tap test/*.js"},"repository":{"type":"git","url":"git://github.com/substack/node-bunker.git"},"keywords":["code","coverage"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT/X11","engine":{"node":">=0.4"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"bunker@0.1.2","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"c88992464a8e2a6ede86930375f92b58077ef97c","tarball":"http://registry.npmjs.org/bunker/-/bunker-0.1.2.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-04-30T08:49:55.506Z","created":"2011-07-18T08:05:47.685Z","0.0.0":"2011-07-18T08:05:48.472Z","0.1.0":"2011-07-18T08:10:20.108Z","0.1.1":"2011-08-07T04:46:14.546Z","0.1.2":"2012-04-30T08:49:55.506Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-bunker.git"},"_attachments":{"bunker-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-6uwyJHFIktia6Fst2AdupA==","length":3227,"stub":true},"bunker-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-oiJ/+e1aHmgQ8k0VPYamMQ==","length":2713,"stub":true},"bunker-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+17Tz22uOpPK1MWWFAvP2Q==","length":2419,"stub":true},"bunker-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bc0U0E3VumUBLu+AUCTPPw==","length":2447,"stub":true}}}},
{"id":"bunyan","key":"bunyan","value":{"rev":"106-0aec71380f558b75177b793a06dfe63e"},"doc":{"_id":"bunyan","_rev":"106-0aec71380f558b75177b793a06dfe63e","name":"bunyan","dist-tags":{"latest":"0.13.0"},"versions":{"0.1.0":{"name":"bunyan","version":"0.1.0","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.1.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"584f78c15d9f4e7c209ca3721f5d6f0c0e8817f7","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.1.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.2.0":{"name":"bunyan","version":"0.2.0","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"ddb15743d2daf9945fa83ea693a0ba6c124d8b94","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.2.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.3.0":{"name":"bunyan","version":"0.3.0","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.3.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"ab3a7cc0d44c76ed69df581686341aa9bab00f77","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.3.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.4.0":{"name":"bunyan","version":"0.4.0","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.4.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"45346c01053a17ad4bc52e61b87395b22ea38239","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.4.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.5.0":{"name":"bunyan","version":"0.5.0","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.5.0","dependencies":{},"devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"d9ae4de308f26c8c78c9c560cbbb4fd88be0aebc","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.5.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.5.1":{"name":"bunyan","version":"0.5.1","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.5.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"c9cae71eb52d3519a405ca9983e7576078773fa2","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.5.1.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.5.2":{"name":"bunyan","version":"0.5.2","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.5.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"94b503de0a951a753656a4139ede8b9a6cf4fda7","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.5.2.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.5.3":{"name":"bunyan","version":"0.5.3","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.5.3","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c0f668ed76df03c1d670c7d9bd325fb8b9762a35","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.5.3.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.0":{"name":"bunyan","version":"0.6.0","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.0","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"9fd65b5b1e37aa5a690d2790f22ed2f96ff9ca60","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.1":{"name":"bunyan","version":"0.6.1","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.1","dependencies":{},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"2d6888cd24b91e4d3847ed5550dc4ee4e1f3e5a6","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.1.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.2":{"name":"bunyan","version":"0.6.2","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.2","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b1518a07ca12823ff84dee24a8ecfe82601309b7","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.2.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.3":{"name":"bunyan","version":"0.6.3","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.3","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d61c35b33caa0843b2094f5a6b51cb5cd41703fa","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.3.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.4":{"name":"bunyan","version":"0.6.4","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.4","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d9a0e4e550854f2fc558a856f92b40e411c62d14","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.4.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.5":{"name":"bunyan","version":"0.6.5","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.5","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"0ab61747c49f1b99385f6cdca3614c367a4b1070","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.5.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.6":{"name":"bunyan","version":"0.6.6","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.6","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"c3006fdddbbb4f86728a8eb32f1eb2493a47866e","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.6.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.7":{"name":"bunyan","version":"0.6.7","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.7","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"b75e6ed301ea330b0a3ae821b98318c7d6a452bc","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.7.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.8":{"name":"bunyan","version":"0.6.8","description":"a JSON Logger library for node.js servers","main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.8","dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"d64d19ce20d780a2ef237f3dd67bcf9ee9fc50e9","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.8.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.6.9":{"name":"bunyan","version":"0.6.9","description":"a JSON Logger library for node.js servers","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.6.9","contributors":[{"name":"Trent Mick","email":"trentm@gmail.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com"}],"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"21d90de09b2248f68d8a2dfd42aaa33e8d8b13b1","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.6.9.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.7.0":{"name":"bunyan","version":"0.7.0","description":"a JSON Logger library for node.js servers","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.7.0","contributors":[{"name":"Trent Mick","email":"trentm@gmail.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com"}],"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"921065e70c936fe302a740e2c5605775beea2f42","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.7.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.8.0":{"name":"bunyan","version":"0.8.0","description":"a JSON Logger library for node.js servers","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.4.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.8.0","contributors":[{"name":"Trent Mick","email":"trentm@gmail.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com"}],"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"911f2df1841827e33d496241c56f387696a90c9a","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.8.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.9.0":{"name":"bunyan","version":"0.9.0","description":"a JSON Logger library for node.js servers","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.9.0","contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"}],"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"048c92ac2fc18670307a186318fd4c70bfe1fe56","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.9.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.10.0":{"name":"bunyan","version":"0.10.0","description":"a JSON Logger library for node.js services","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"_npmUser":{"name":"trentm","email":"trentm@gmail.com"},"_id":"bunyan@0.10.0","contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"},{"name":"Michael Hart","url":"https://github.com/mhart"}],"dependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"51b6270f4e6f151a6eaf9a9f188acaebec2101eb","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.10.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.11.0":{"name":"bunyan","version":"0.11.0","description":"a JSON Logger library for node.js services","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"scripts":{"test":"tap test/*.js"},"contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"},{"name":"Michael Hart","url":"https://github.com/mhart"}],"readme":"Bunyan is **a simple and fast a JSON logging library** for node.js services and\n**a `bunyan` CLI tool** for nicely viewing those logs).\n\n![bunyan CLI screenshot](https://raw.github.com/trentm/node-bunyan/master/tools/screenshot1.png)\n\nServer logs should be structured. JSON's a good format. Let's do that: a log\nrecord is one line of `JSON.stringify`'d output. Let's also specify some common\nnames for the requisite and common fields for a log record (see below).\n\nAlso: log4j is way more than you need.\n\n\n# Current Status\n\nSolid core functionality is there. Joyent is using this for a number of\nproduction services. Bunyan supports node 0.6 and greater.\n\nFollow <a href=\"https://twitter.com/intent/user?screen_name=trentmick\" target=\"_blank\">@trentmick</a>\nfor updates to Bunyan.\n\nSee also: [Bunyan for Bash](https://github.com/trevoro/bash-bunyan).\n\n\n# Installation\n\n    npm install bunyan\n\n\n# Usage\n\n**The usual.** All loggers must provide a \"name\". This is somewhat akin\nto log4j logger \"name\", but Bunyan doesn't do hierarchical logger names.\n\n    $ cat hi.js\n    var Logger = require('bunyan');\n    var log = new Logger({name: \"myapp\"});\n    log.info(\"hi\");\n\nAlternatively, bunyan 0.7.0 and up supports a more node.js-land typical\nstyle (which might become the preferred form over time):\n\n    var bunyan = require('bunyan');\n    var log = bunyan.createLogger({name: \"myapp\"});\n\n**Log records are JSON.** \"hostname\", \"time\" and \"v\" (the Bunyan log\nformat version) are added for you.\n\n    $ node hi.js\n    {\"name\":\"myapp\",\"hostname\":\"banana.local\",\"pid\":123,\"level\":2,\"msg\":\"hi\",\"time\":\"2012-01-31T00:07:44.216Z\",\"v\":0}\n\nThe full `log.{trace|debug|...|fatal}(...)` API is:\n\n    log.info();     // Returns a boolean: is the \"info\" level enabled?\n\n    log.info('hi');                     // Log a simple string message.\n    log.info('hi %s', bob, anotherVar); // Uses `util.format` for msg formatting.\n\n    log.info({foo: 'bar'}, 'hi');       // Adds \"foo\" field to log record.\n\n    log.info(err);  // Special case to log an `Error` instance, adds \"err\"\n                    // key with exception details (including the stack) and\n                    // sets \"msg\" to the exception message.\n    log.info(err, 'more on this: %s', more);\n                    // ... or you can specify the \"msg\".\n\nNote that this implies **you cannot pass any object as the first argument\nto log it**. IOW, `log.info(myobject)` isn't going to work the way you\nexpect. Adding support for this API would necessitate (a) JSON-ifying safely\nthat given object (sometimes hard, and probably slow) and (b) putting all its\nattribs under a top-level 'x' field name or something to avoid field name\ncollisions.\n\n\n## bunyan tool\n\nA `bunyan` tool is provided **for pretty-printing bunyan logs** and, eventually,\nfor filtering (e.g. `| bunyan -c 'level>3'`). This shows the default output\n(which is fluid right now) and indented-JSON output. More output formats will\nbe added, including support for custom formats.\n\n    $ node hi.js | ./bin/bunyan  # CLI tool to filter/pretty-print JSON logs.\n    [2012-01-31T00:08:11.387Z] INFO: myapp on banana.local/123: hi\n\n    $ node hi.js | ./bin/bunyan -o json\n    {\n      \"name\": \"myapp\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"level\": 2,\n      \"msg\": \"hi\",\n      \"time\": \"2012-01-31T00:10:00.676Z\",\n      \"v\": 0\n    }\n\n\n## streams\n\nBy default, log output is to stdout (**stream**) and at the \"info\" level.\nExplicitly that looks like:\n\n    var log = new Logger({name: \"myapp\", stream: process.stdout,\n      level: \"info\"});\n\nThat is an abbreviated form for a single stream. **You can define multiple\nstreams at different levels**.\n\n    var log = new Logger({\n      name: \"amon\",\n      streams: [\n        {\n          level: \"info\",\n          stream: process.stdout, // log INFO and above to stdout\n        },\n        {\n          level: \"error\",\n          path: \"tmp/error.log\"   // log ERROR and above to a file\n        }\n      ]\n    });\n\nMore on streams in the \"Streams\" section below.\n\n\n## log.child\n\nA `log.child(...)` is provided to **specialize a logger for a sub-component**.\nThe following will have log records from \"Wuzzle\" instances use exactly the\nsame config as its parent, plus include the \"component\" field.\n\n    var log = new Logger(...);\n\n    ...\n\n    function Wuzzle(options) {\n      this.log = options.log;\n      this.log.info(\"creating a wuzzle\")\n    }\n    Wuzzle.prototype.woos = function () {\n      this.log.warn(\"This wuzzle is woosey.\")\n    }\n\n    var wuzzle = new Wuzzle({log: log.child({component: \"wuzzle\"})});\n    wuzzle.woos();\n    log.info(\"done with the wuzzle\")\n\nThe [node-restify](https://github.com/mcavage/node-restify)\nframework integrates bunyan. One feature of its integration, is that each\nrestify request handler includes a `req.log` logger that is:\n\n    log.child({req_id: <unique request id>}, true)\n\nApps using restify can then use `req.log` and have all such log records\ninclude the unique request id (as \"req_id\"). Handy.\n\n\n## serializers\n\nBunyan has a concept of **\"serializers\" to produce a JSON-able object from a\nJavaScript object**, so you can easily do the following:\n\n    log.info({req: <request object>}, \"something about handling this request\");\n\nAssociation is by log record field name, \"req\" in this example, so this\nrequires a registered serializer something like this:\n\n    function reqSerializer(req) {\n      return {\n        method: req.method,\n        url: req.url,\n        headers: req.headers\n      }\n    }\n    var log = new Logger({\n      ...\n      serializers: {\n        req: reqSerializer\n      }\n    });\n\nOr this:\n\n    var log = new Logger({\n      ...\n      serializers: {req: Logger.stdSerializers.req}\n    });\n\nbecause Buyan includes a small set of standard serializers. To use all the\nstandard serializers you can use:\n\n    var log = new Logger({\n      ...\n      serializers: Logger.stdSerializers\n    });\n\n*Note: Your own serializers should never throw, otherwise you'll get an\nugly message on stderr from Bunyan (along with the traceback) and the field\nin your log record will be replaced with a short error message.*\n\n## src\n\nThe **source file, line and function of the log call site** can be added to\nlog records by using the `src: true` config option:\n\n    var log = new Logger({src: true, ...});\n\nThis adds the call source info with the 'src' field, like this:\n\n    {\n      \"name\": \"src-example\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"component\": \"wuzzle\",\n      \"level\": 4,\n      \"msg\": \"This wuzzle is woosey.\",\n      \"time\": \"2012-02-06T04:19:35.605Z\",\n      \"src\": {\n        \"file\": \"/Users/trentm/tm/node-bunyan/examples/src.js\",\n        \"line\": 20,\n        \"func\": \"Wuzzle.woos\"\n      },\n      \"v\": 0\n    }\n\n**WARNING: Determining the call source info is slow. Never use this option\nin production.**\n\n\n# Levels\n\nThe log levels in bunyan are:\n\n- \"fatal\" (60): the service/app is going to stop or become unusable now\n- \"error\" (50): fatal for a particular request, but the service/app continues servicing other requests\n- \"warn\" (40): a note on something that should probably be looked at by an operator\n- \"info\" (30): detail on regular operation\n- \"debug\" (20): anything else, i.e. too verbose to be included in \"info\" level.\n- \"trace\" (10): logging from external libraries used by your app\n\nGeneral level usage suggestions: \"debug\" should be used sparingly.\nInformation that will be useful to debug errors *post mortem* should usually\nbe included in \"info\" messages if it's generally relevant or else with the\ncorresponding \"error\" event. Don't rely on spewing mostly irrelevant debug\nmessages all the time and sifting through them when an error occurs.\n\nIntegers are used for the actual level values (10 for \"trace\", ..., 60 for\n\"fatal\") and constants are defined for the (Logger.TRACE ... Logger.DEBUG).\nThe lowercase level names are aliases supported in the API.\n\nHere is the API for changing levels in an existing logger:\n\n    log.level() -> INFO   // gets current level (lowest level of all streams)\n\n    log.level(INFO)       // set all streams to level INFO\n    log.level(\"info\")     // set all streams to level INFO\n\n    log.levels() -> [DEBUG, INFO]   // get array of levels of all streams\n    log.levels(0) -> DEBUG          // get level of stream at index 0\n    log.levels(\"foo\")               // get level of stream with name \"foo\"\n\n    log.levels(0, INFO)             // set level of stream 0 to INFO\n    log.levels(0, \"info\")           // can use \"info\" et al aliases\n    log.levels(\"foo\", WARN)         // set stream named \"foo\" to WARN\n\n\n\n# Log Record Fields\n\nThis section will describe *rules* for the Bunyan log format: field names,\nfield meanings, required fields, etc. However, a Bunyan library doesn't\nstrictly enforce all these rules while records are being emitted. For example,\nBunyan will add a `time` field with the correct format to your log records,\nbut you can specify your own. It is the caller's responsibility to specify\nthe appropriate format.\n\nThe reason for the above leniency is because IMO logging a message should\nnever break your app. This leads to this rule of logging: **a thrown\nexception from `log.info(...)` or equivalent (other than for calling with the\nincorrect signature) is always a bug in Bunyan.**\n\n\nA typical Bunyan log record looks like this:\n\n    {\"name\":\"myserver\",\"hostname\":\"banana.local\",\"pid\":123,\"req\":{\"method\":\"GET\",\"url\":\"/path?q=1#anchor\",\"headers\":{\"x-hi\":\"Mom\",\"connection\":\"close\"}},\"level\":3,\"msg\":\"start request\",\"time\":\"2012-02-03T19:02:46.178Z\",\"v\":0}\n\nPretty-printed:\n\n    {\n      \"name\": \"myserver\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"req\": {\n        \"method\": \"GET\",\n        \"url\": \"/path?q=1#anchor\",\n        \"headers\": {\n          \"x-hi\": \"Mom\",\n          \"connection\": \"close\"\n        },\n        \"remoteAddress\": \"120.0.0.1\",\n        \"remotePort\": 51244\n      },\n      \"level\": 3,\n      \"msg\": \"start request\",\n      \"time\": \"2012-02-03T19:02:57.534Z\",\n      \"v\": 0\n    }\n\n\nCore fields:\n\n- `v`: Required. Integer. Added by Bunion. Cannot be overriden.\n  This is the Bunyan log format version (`require('bunyan').LOG_VERSION`).\n  The log version is a single integer. `0` is until I release a version\n  \"1.0.0\" of node-bunyan. Thereafter, starting with `1`, this will be\n  incremented if there is any backward incompatible change to the log record\n  format. Details will be in \"CHANGES.md\" (the change log).\n- `level`: Required. Integer. Added by Bunion. Cannot be overriden.\n  See the \"Levels\" section.\n- `name`: Required. String. Provided at Logger creation.\n  You must specify a name for your logger when creating it. Typically this\n  is the name of the service/app using Bunyan for logging.\n- `hostname`: Required. String. Provided or determined at Logger creation.\n  You can specify your hostname at Logger creation or it will be retrieved\n  vi `os.hostname()`.\n- `pid`: Required. Integer. Filled in automatically at Logger creation.\n- `time`: Required. String. Added by Bunion. Can be overriden.\n  The date and time of the event in [ISO 8601\n  Extended Format](http://en.wikipedia.org/wiki/ISO_8601) format and in UTC,\n  as from\n  [`Date.toISOString()`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString).\n- `msg`: Required. String.\n  Every `log.debug(...)` et al call must provide a log message.\n- `src`: Optional. Object giving log call source info. This is added\n  automatically by Bunyan if the \"src: true\" config option is given to the\n  Logger. Never use in production as this is really slow.\n\n\nGo ahead and add more fields, and nest ones are fine (and recommended) as\nwell. This is why we're using JSON. Some suggestions and best practices\nfollow (feedback from actual users welcome).\n\n\nRecommended/Best Practice Fields:\n\n-   `err`: Object. A caught JS exception. Log that thing with `log.info(err)`\n    to get:\n\n        ...\n        \"err\": {\n          \"message\": \"boom\",\n          \"name\": \"TypeError\",\n          \"stack\": \"TypeError: boom\\n    at Object.<anonymous> ...\"\n        },\n        \"msg\": \"boom\",\n        ...\n\n    Or use the `Logger.stdSerializers.err` serializer in your Logger and\n    do this `log.error({err: err}, \"oops\")`. See \"examples/err.js\".\n\n- `req_id`: String. A request identifier. Including this field in all logging\n  tied to handling a particular request to your server is strongly suggested.\n  This allows post analysis of logs to easily collate all related logging\n  for a request. This really shines when you have a SOA with multiple services\n  and you carry a single request ID from the top API down through all APIs\n  (as [node-restify](https://github.com/mcavage/node-restify) facilitates\n  with its 'X-Request-Id' header).\n\n- `req`: An HTTP server request. Bunyan provides `Logger.stdSerializers.req`\n  to serialize a request with a suggested set of keys. Example:\n\n        {\n          \"method\": \"GET\",\n          \"url\": \"/path?q=1#anchor\",\n          \"headers\": {\n            \"x-hi\": \"Mom\",\n            \"connection\": \"close\"\n          },\n          \"remoteAddress\": \"120.0.0.1\",\n          \"remotePort\": 51244\n        }\n\n- `res`: An HTTP server response. Bunyan provides `Logger.stdSerializers.res`\n  to serialize a response with a suggested set of keys. Example:\n\n        {\n          \"statusCode\": 200,\n          \"header\": \"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nConnection: keep-alive\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\"\n        }\n\n\nOther fields to consider:\n\n- `req.username`: Authenticated user (or for a 401, the user attempting to\n  auth).\n- Some mechanism to calculate response latency. \"restify\" users will have\n  a \"X-Response-Time\" header. A `latency` custom field would be fine.\n- `req.body`: If you know that request bodies are small (common in APIs,\n  for example), then logging the request body is good.\n\n\n# Streams\n\nA \"stream\" is Bunyan's name for an output for log messages (the equivalent\nto a log4j Appender). Ultimately Bunyan uses a\n[Writable Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream)\ninterface, but there are some additional attributes used to create and\nmanage the stream. A Bunyan Logger instance has one or more streams.\nIn general streams are specified with the \"streams\" option:\n\n    var Logger = require('bunyan');\n    var log = new Logger({\n      name: \"foo\",\n      streams: [\n        {\n            stream: process.stderr,\n            level: \"debug\"\n        },\n        ...\n      ]\n    })\n\nFor convenience, if there is only one stream, it can specified with the\n\"stream\" and \"level\" options (internal converted to a `Logger.streams`):\n\n    var log = new Logger({\n      name: \"foo\",\n      stream: process.stderr,\n      level: \"debug\"\n    })\n\nIf none are specified, the default is a stream on `process.stdout` at the\n\"info\" level.\n\n`Logger.streams` is an array of stream objects with the following attributes:\n\n- `type`: One of \"stream\", \"file\" or \"raw\". See below. Often this is\n  implied from the other arguments.\n- `path`: A file path for a file stream. If `path` is given and `type` is\n  not specified, then `type` will be set to \"file\".\n- `stream`: This is the \"Writable Stream\", e.g. a std handle or an open\n  file write stream. If `stream` is given and `type` is not specified, then\n  `type` will be set to \"stream\".\n- `level`: The level at which logging to this stream is enabled. If not\n  specified it defaults to INFO.\n\nSupported stream types are:\n\n- `stream`: A plain ol' node.js [Writable\n  Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream).\n  A \"stream\" (the writeable stream) value is required.\n\n- `file`: A \"path\" argument is given. Bunyan will open this file for\n  appending. E.g.:\n\n        {\n          \"path\": \"/var/log/foo.log\",\n          \"level\": \"warn\"\n        }\n\n  Bunyan re-emits error events from the created `WriteStream`. So you can\n  do this:\n\n        var log = new Logger({name: 'mylog', streams: [{path: LOG_PATH}]});\n        log.on('error', function (err, stream) {\n            // Handle stream write or create error here.\n        });\n\n- `raw`: Similar to a \"stream\" writeable stream, except that the write method\n  is given raw log record *Object*s instead of a JSON-stringified string.\n  This can be useful for hooking on further processing to all Bunyan logging:\n  pushing to an external service, a RingBuffer (see below), etc.\n\n\n## RingBuffer Stream\n\nBunyan comes with a special stream called a RingBuffer which keeps the last N\nrecords in memory and does *not* write the data anywhere else.  One common\nstrategy is to log 'info' and higher to a normal log file but log all records\n(including 'trace') to a ringbuffer that you can access via a debugger, or your\nown HTTP interface, or a post-mortem facility like MDB or node-panic.\n\nTo use a RingBuffer:\n\n    /* Create a ring buffer that stores the last 100 records. */\n    var bunyan = require('bunyan');\n    var ringbuffer = new bunyan.RingBuffer({ limit: 100 });\n    var log = new bunyan({\n        name: 'foo',\n        streams: [\n            {\n                level: 'info',\n                stream: process.stdout\n            },\n            {\n                level: 'trace',\n                type: 'raw',    // use 'raw' to get raw log record objects\n                stream: ringbuffer\n            }\n        ]\n    });\n\n    log.info('hello world');\n    console.log(ringbuffer.records);\n\nThis example emits:\n\n    [ { name: 'foo',\n        hostname: '912d2b29',\n        pid: 50346,\n        level: 30,\n        msg: 'hello world',\n        time: '2012-06-19T21:34:19.906Z',\n        v: 0 } ]\n\n\n# Versioning\n\nThe scheme I follow is most succintly described by the bootstrap guys\n[here](https://github.com/twitter/bootstrap#versioning). \n\ntl;dr: All versions are `<major>.<minor>.<patch>` which will be incremented for\nbreaking backward compat and major reworks, new features without breaking\nchange, and bug fixes, respectively.\n\n\n\n# License\n\nMIT.\n\n\n\n# Future\n\nSee \"TODO.md\".\n","_id":"bunyan@0.11.0","dist":{"shasum":"522dcd7ef6e097ce0c62d54737cfee31e056b0a9","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.11.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"directories":{}},"0.11.2":{"name":"bunyan","version":"0.11.2","description":"a JSON Logger library for node.js services","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"scripts":{"test":"tap test/*.js"},"contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"},{"name":"Michael Hart","url":"https://github.com/mhart"},{"name":"Isaac Schlueter","url":"https://github.com/isaacs"}],"readme":"Bunyan is **a simple and fast a JSON logging library** for node.js services and\n**a `bunyan` CLI tool** for nicely viewing those logs).\n\n![bunyan CLI screenshot](https://raw.github.com/trentm/node-bunyan/master/tools/screenshot1.png)\n\nServer logs should be structured. JSON's a good format. Let's do that: a log\nrecord is one line of `JSON.stringify`'d output. Let's also specify some common\nnames for the requisite and common fields for a log record (see below).\n\nAlso: log4j is way more than you need.\n\n\n# Current Status\n\nSolid core functionality is there. Joyent is using this for a number of\nproduction services. Bunyan supports node 0.6 and greater.\n\nFollow <a href=\"https://twitter.com/intent/user?screen_name=trentmick\" target=\"_blank\">@trentmick</a>\nfor updates to Bunyan.\n\nSee also: [Bunyan for Bash](https://github.com/trevoro/bash-bunyan).\n\n\n# Installation\n\n    npm install bunyan\n\n\n# Usage\n\n**The usual.** All loggers must provide a \"name\". This is somewhat akin\nto log4j logger \"name\", but Bunyan doesn't do hierarchical logger names.\n\n    $ cat hi.js\n    var Logger = require('bunyan');\n    var log = new Logger({name: \"myapp\"});\n    log.info(\"hi\");\n\nAlternatively, bunyan 0.7.0 and up supports a more node.js-land typical\nstyle (which might become the preferred form over time):\n\n    var bunyan = require('bunyan');\n    var log = bunyan.createLogger({name: \"myapp\"});\n\n**Log records are JSON.** \"hostname\", \"time\" and \"v\" (the Bunyan log\nformat version) are added for you.\n\n    $ node hi.js\n    {\"name\":\"myapp\",\"hostname\":\"banana.local\",\"pid\":123,\"level\":2,\"msg\":\"hi\",\"time\":\"2012-01-31T00:07:44.216Z\",\"v\":0}\n\nThe full `log.{trace|debug|...|fatal}(...)` API is:\n\n    log.info();     // Returns a boolean: is the \"info\" level enabled?\n\n    log.info('hi');                     // Log a simple string message.\n    log.info('hi %s', bob, anotherVar); // Uses `util.format` for msg formatting.\n\n    log.info({foo: 'bar'}, 'hi');       // Adds \"foo\" field to log record.\n\n    log.info(err);  // Special case to log an `Error` instance, adds \"err\"\n                    // key with exception details (including the stack) and\n                    // sets \"msg\" to the exception message.\n    log.info(err, 'more on this: %s', more);\n                    // ... or you can specify the \"msg\".\n\nNote that this implies **you cannot pass any object as the first argument\nto log it**. IOW, `log.info(myobject)` isn't going to work the way you\nexpect. Adding support for this API would necessitate (a) JSON-ifying safely\nthat given object (sometimes hard, and probably slow) and (b) putting all its\nattribs under a top-level 'x' field name or something to avoid field name\ncollisions.\n\n\n## bunyan tool\n\nA `bunyan` tool is provided **for pretty-printing bunyan logs** and, eventually,\nfor filtering (e.g. `| bunyan -c 'level>3'`). This shows the default output\n(which is fluid right now) and indented-JSON output. More output formats will\nbe added, including support for custom formats.\n\n    $ node hi.js | ./bin/bunyan  # CLI tool to filter/pretty-print JSON logs.\n    [2012-01-31T00:08:11.387Z] INFO: myapp on banana.local/123: hi\n\n    $ node hi.js | ./bin/bunyan -o json\n    {\n      \"name\": \"myapp\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"level\": 2,\n      \"msg\": \"hi\",\n      \"time\": \"2012-01-31T00:10:00.676Z\",\n      \"v\": 0\n    }\n\n\n## streams\n\nBy default, log output is to stdout (**stream**) and at the \"info\" level.\nExplicitly that looks like:\n\n    var log = new Logger({name: \"myapp\", stream: process.stdout,\n      level: \"info\"});\n\nThat is an abbreviated form for a single stream. **You can define multiple\nstreams at different levels**.\n\n    var log = new Logger({\n      name: \"amon\",\n      streams: [\n        {\n          level: \"info\",\n          stream: process.stdout, // log INFO and above to stdout\n        },\n        {\n          level: \"error\",\n          path: \"tmp/error.log\"   // log ERROR and above to a file\n        }\n      ]\n    });\n\nMore on streams in the \"Streams\" section below.\n\n\n## log.child\n\nA `log.child(...)` is provided to **specialize a logger for a sub-component**.\nThe following will have log records from \"Wuzzle\" instances use exactly the\nsame config as its parent, plus include the \"component\" field.\n\n    var log = new Logger(...);\n\n    ...\n\n    function Wuzzle(options) {\n      this.log = options.log;\n      this.log.info(\"creating a wuzzle\")\n    }\n    Wuzzle.prototype.woos = function () {\n      this.log.warn(\"This wuzzle is woosey.\")\n    }\n\n    var wuzzle = new Wuzzle({log: log.child({component: \"wuzzle\"})});\n    wuzzle.woos();\n    log.info(\"done with the wuzzle\")\n\nThe [node-restify](https://github.com/mcavage/node-restify)\nframework integrates bunyan. One feature of its integration, is that each\nrestify request handler includes a `req.log` logger that is:\n\n    log.child({req_id: <unique request id>}, true)\n\nApps using restify can then use `req.log` and have all such log records\ninclude the unique request id (as \"req_id\"). Handy.\n\n\n## serializers\n\nBunyan has a concept of **\"serializers\" to produce a JSON-able object from a\nJavaScript object**, so you can easily do the following:\n\n    log.info({req: <request object>}, \"something about handling this request\");\n\nAssociation is by log record field name, \"req\" in this example, so this\nrequires a registered serializer something like this:\n\n    function reqSerializer(req) {\n      return {\n        method: req.method,\n        url: req.url,\n        headers: req.headers\n      }\n    }\n    var log = new Logger({\n      ...\n      serializers: {\n        req: reqSerializer\n      }\n    });\n\nOr this:\n\n    var log = new Logger({\n      ...\n      serializers: {req: Logger.stdSerializers.req}\n    });\n\nbecause Buyan includes a small set of standard serializers. To use all the\nstandard serializers you can use:\n\n    var log = new Logger({\n      ...\n      serializers: Logger.stdSerializers\n    });\n\n*Note: Your own serializers should never throw, otherwise you'll get an\nugly message on stderr from Bunyan (along with the traceback) and the field\nin your log record will be replaced with a short error message.*\n\n## src\n\nThe **source file, line and function of the log call site** can be added to\nlog records by using the `src: true` config option:\n\n    var log = new Logger({src: true, ...});\n\nThis adds the call source info with the 'src' field, like this:\n\n    {\n      \"name\": \"src-example\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"component\": \"wuzzle\",\n      \"level\": 4,\n      \"msg\": \"This wuzzle is woosey.\",\n      \"time\": \"2012-02-06T04:19:35.605Z\",\n      \"src\": {\n        \"file\": \"/Users/trentm/tm/node-bunyan/examples/src.js\",\n        \"line\": 20,\n        \"func\": \"Wuzzle.woos\"\n      },\n      \"v\": 0\n    }\n\n**WARNING: Determining the call source info is slow. Never use this option\nin production.**\n\n\n# Levels\n\nThe log levels in bunyan are:\n\n- \"fatal\" (60): the service/app is going to stop or become unusable now\n- \"error\" (50): fatal for a particular request, but the service/app continues servicing other requests\n- \"warn\" (40): a note on something that should probably be looked at by an operator\n- \"info\" (30): detail on regular operation\n- \"debug\" (20): anything else, i.e. too verbose to be included in \"info\" level.\n- \"trace\" (10): logging from external libraries used by your app\n\nGeneral level usage suggestions: \"debug\" should be used sparingly.\nInformation that will be useful to debug errors *post mortem* should usually\nbe included in \"info\" messages if it's generally relevant or else with the\ncorresponding \"error\" event. Don't rely on spewing mostly irrelevant debug\nmessages all the time and sifting through them when an error occurs.\n\nIntegers are used for the actual level values (10 for \"trace\", ..., 60 for\n\"fatal\") and constants are defined for the (Logger.TRACE ... Logger.DEBUG).\nThe lowercase level names are aliases supported in the API.\n\nHere is the API for changing levels in an existing logger:\n\n    log.level() -> INFO   // gets current level (lowest level of all streams)\n\n    log.level(INFO)       // set all streams to level INFO\n    log.level(\"info\")     // set all streams to level INFO\n\n    log.levels() -> [DEBUG, INFO]   // get array of levels of all streams\n    log.levels(0) -> DEBUG          // get level of stream at index 0\n    log.levels(\"foo\")               // get level of stream with name \"foo\"\n\n    log.levels(0, INFO)             // set level of stream 0 to INFO\n    log.levels(0, \"info\")           // can use \"info\" et al aliases\n    log.levels(\"foo\", WARN)         // set stream named \"foo\" to WARN\n\n\n\n# Log Record Fields\n\nThis section will describe *rules* for the Bunyan log format: field names,\nfield meanings, required fields, etc. However, a Bunyan library doesn't\nstrictly enforce all these rules while records are being emitted. For example,\nBunyan will add a `time` field with the correct format to your log records,\nbut you can specify your own. It is the caller's responsibility to specify\nthe appropriate format.\n\nThe reason for the above leniency is because IMO logging a message should\nnever break your app. This leads to this rule of logging: **a thrown\nexception from `log.info(...)` or equivalent (other than for calling with the\nincorrect signature) is always a bug in Bunyan.**\n\n\nA typical Bunyan log record looks like this:\n\n    {\"name\":\"myserver\",\"hostname\":\"banana.local\",\"pid\":123,\"req\":{\"method\":\"GET\",\"url\":\"/path?q=1#anchor\",\"headers\":{\"x-hi\":\"Mom\",\"connection\":\"close\"}},\"level\":3,\"msg\":\"start request\",\"time\":\"2012-02-03T19:02:46.178Z\",\"v\":0}\n\nPretty-printed:\n\n    {\n      \"name\": \"myserver\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"req\": {\n        \"method\": \"GET\",\n        \"url\": \"/path?q=1#anchor\",\n        \"headers\": {\n          \"x-hi\": \"Mom\",\n          \"connection\": \"close\"\n        },\n        \"remoteAddress\": \"120.0.0.1\",\n        \"remotePort\": 51244\n      },\n      \"level\": 3,\n      \"msg\": \"start request\",\n      \"time\": \"2012-02-03T19:02:57.534Z\",\n      \"v\": 0\n    }\n\n\nCore fields:\n\n- `v`: Required. Integer. Added by Bunion. Cannot be overriden.\n  This is the Bunyan log format version (`require('bunyan').LOG_VERSION`).\n  The log version is a single integer. `0` is until I release a version\n  \"1.0.0\" of node-bunyan. Thereafter, starting with `1`, this will be\n  incremented if there is any backward incompatible change to the log record\n  format. Details will be in \"CHANGES.md\" (the change log).\n- `level`: Required. Integer. Added by Bunion. Cannot be overriden.\n  See the \"Levels\" section.\n- `name`: Required. String. Provided at Logger creation.\n  You must specify a name for your logger when creating it. Typically this\n  is the name of the service/app using Bunyan for logging.\n- `hostname`: Required. String. Provided or determined at Logger creation.\n  You can specify your hostname at Logger creation or it will be retrieved\n  vi `os.hostname()`.\n- `pid`: Required. Integer. Filled in automatically at Logger creation.\n- `time`: Required. String. Added by Bunion. Can be overriden.\n  The date and time of the event in [ISO 8601\n  Extended Format](http://en.wikipedia.org/wiki/ISO_8601) format and in UTC,\n  as from\n  [`Date.toISOString()`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString).\n- `msg`: Required. String.\n  Every `log.debug(...)` et al call must provide a log message.\n- `src`: Optional. Object giving log call source info. This is added\n  automatically by Bunyan if the \"src: true\" config option is given to the\n  Logger. Never use in production as this is really slow.\n\n\nGo ahead and add more fields, and nest ones are fine (and recommended) as\nwell. This is why we're using JSON. Some suggestions and best practices\nfollow (feedback from actual users welcome).\n\n\nRecommended/Best Practice Fields:\n\n-   `err`: Object. A caught JS exception. Log that thing with `log.info(err)`\n    to get:\n\n        ...\n        \"err\": {\n          \"message\": \"boom\",\n          \"name\": \"TypeError\",\n          \"stack\": \"TypeError: boom\\n    at Object.<anonymous> ...\"\n        },\n        \"msg\": \"boom\",\n        ...\n\n    Or use the `Logger.stdSerializers.err` serializer in your Logger and\n    do this `log.error({err: err}, \"oops\")`. See \"examples/err.js\".\n\n- `req_id`: String. A request identifier. Including this field in all logging\n  tied to handling a particular request to your server is strongly suggested.\n  This allows post analysis of logs to easily collate all related logging\n  for a request. This really shines when you have a SOA with multiple services\n  and you carry a single request ID from the top API down through all APIs\n  (as [node-restify](https://github.com/mcavage/node-restify) facilitates\n  with its 'X-Request-Id' header).\n\n- `req`: An HTTP server request. Bunyan provides `Logger.stdSerializers.req`\n  to serialize a request with a suggested set of keys. Example:\n\n        {\n          \"method\": \"GET\",\n          \"url\": \"/path?q=1#anchor\",\n          \"headers\": {\n            \"x-hi\": \"Mom\",\n            \"connection\": \"close\"\n          },\n          \"remoteAddress\": \"120.0.0.1\",\n          \"remotePort\": 51244\n        }\n\n- `res`: An HTTP server response. Bunyan provides `Logger.stdSerializers.res`\n  to serialize a response with a suggested set of keys. Example:\n\n        {\n          \"statusCode\": 200,\n          \"header\": \"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nConnection: keep-alive\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\"\n        }\n\n\nOther fields to consider:\n\n- `req.username`: Authenticated user (or for a 401, the user attempting to\n  auth).\n- Some mechanism to calculate response latency. \"restify\" users will have\n  a \"X-Response-Time\" header. A `latency` custom field would be fine.\n- `req.body`: If you know that request bodies are small (common in APIs,\n  for example), then logging the request body is good.\n\n\n# Streams\n\nA \"stream\" is Bunyan's name for an output for log messages (the equivalent\nto a log4j Appender). Ultimately Bunyan uses a\n[Writable Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream)\ninterface, but there are some additional attributes used to create and\nmanage the stream. A Bunyan Logger instance has one or more streams.\nIn general streams are specified with the \"streams\" option:\n\n    var Logger = require('bunyan');\n    var log = new Logger({\n      name: \"foo\",\n      streams: [\n        {\n            stream: process.stderr,\n            level: \"debug\"\n        },\n        ...\n      ]\n    })\n\nFor convenience, if there is only one stream, it can specified with the\n\"stream\" and \"level\" options (internal converted to a `Logger.streams`):\n\n    var log = new Logger({\n      name: \"foo\",\n      stream: process.stderr,\n      level: \"debug\"\n    })\n\nIf none are specified, the default is a stream on `process.stdout` at the\n\"info\" level.\n\n`Logger.streams` is an array of stream objects with the following attributes:\n\n- `type`: One of \"stream\", \"file\" or \"raw\". See below. Often this is\n  implied from the other arguments.\n- `path`: A file path for a file stream. If `path` is given and `type` is\n  not specified, then `type` will be set to \"file\".\n- `stream`: This is the \"Writable Stream\", e.g. a std handle or an open\n  file write stream. If `stream` is given and `type` is not specified, then\n  `type` will be set to \"stream\".\n- `level`: The level at which logging to this stream is enabled. If not\n  specified it defaults to INFO.\n\nSupported stream types are:\n\n- `stream`: A plain ol' node.js [Writable\n  Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream).\n  A \"stream\" (the writeable stream) value is required.\n\n- `file`: A \"path\" argument is given. Bunyan will open this file for\n  appending. E.g.:\n\n        {\n          \"path\": \"/var/log/foo.log\",\n          \"level\": \"warn\"\n        }\n\n  Bunyan re-emits error events from the created `WriteStream`. So you can\n  do this:\n\n        var log = new Logger({name: 'mylog', streams: [{path: LOG_PATH}]});\n        log.on('error', function (err, stream) {\n            // Handle stream write or create error here.\n        });\n\n- `raw`: Similar to a \"stream\" writeable stream, except that the write method\n  is given raw log record *Object*s instead of a JSON-stringified string.\n  This can be useful for hooking on further processing to all Bunyan logging:\n  pushing to an external service, a RingBuffer (see below), etc.\n\n\n## RingBuffer Stream\n\nBunyan comes with a special stream called a RingBuffer which keeps the last N\nrecords in memory and does *not* write the data anywhere else.  One common\nstrategy is to log 'info' and higher to a normal log file but log all records\n(including 'trace') to a ringbuffer that you can access via a debugger, or your\nown HTTP interface, or a post-mortem facility like MDB or node-panic.\n\nTo use a RingBuffer:\n\n    /* Create a ring buffer that stores the last 100 records. */\n    var bunyan = require('bunyan');\n    var ringbuffer = new bunyan.RingBuffer({ limit: 100 });\n    var log = new bunyan({\n        name: 'foo',\n        streams: [\n            {\n                level: 'info',\n                stream: process.stdout\n            },\n            {\n                level: 'trace',\n                type: 'raw',    // use 'raw' to get raw log record objects\n                stream: ringbuffer\n            }\n        ]\n    });\n\n    log.info('hello world');\n    console.log(ringbuffer.records);\n\nThis example emits:\n\n    [ { name: 'foo',\n        hostname: '912d2b29',\n        pid: 50346,\n        level: 30,\n        msg: 'hello world',\n        time: '2012-06-19T21:34:19.906Z',\n        v: 0 } ]\n\n\n# Versioning\n\nThe scheme I follow is most succintly described by the bootstrap guys\n[here](https://github.com/twitter/bootstrap#versioning). \n\ntl;dr: All versions are `<major>.<minor>.<patch>` which will be incremented for\nbreaking backward compat and major reworks, new features without breaking\nchange, and bug fixes, respectively.\n\n\n\n# License\n\nMIT.\n\n\n\n# Future\n\nSee \"TODO.md\".\n","_id":"bunyan@0.11.2","dist":{"shasum":"309222a8070ebf71acb41e332727e3748ec23caf","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.11.2.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}]},"0.11.3":{"name":"bunyan","version":"0.11.3","description":"a JSON Logger library for node.js services","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"scripts":{"test":"tap test/*.js"},"contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"},{"name":"Michael Hart","url":"https://github.com/mhart"},{"name":"Isaac Schlueter","url":"https://github.com/isaacs"}],"readme":"Bunyan is **a simple and fast a JSON logging library** for node.js services and\n**a `bunyan` CLI tool** for nicely viewing those logs).\n\n![bunyan CLI screenshot](https://raw.github.com/trentm/node-bunyan/master/tools/screenshot1.png)\n\nServer logs should be structured. JSON's a good format. Let's do that: a log\nrecord is one line of `JSON.stringify`'d output. Let's also specify some common\nnames for the requisite and common fields for a log record (see below).\n\nAlso: log4j is way more than you need.\n\n\n# Current Status\n\nSolid core functionality is there. Joyent is using this for a number of\nproduction services. Bunyan supports node 0.6 and greater.\n\nFollow <a href=\"https://twitter.com/intent/user?screen_name=trentmick\" target=\"_blank\">@trentmick</a>\nfor updates to Bunyan.\n\nSee also: [Bunyan for Bash](https://github.com/trevoro/bash-bunyan).\n\n\n# Installation\n\n    npm install bunyan\n\n\n# Usage\n\n**The usual.** All loggers must provide a \"name\". This is somewhat akin\nto log4j logger \"name\", but Bunyan doesn't do hierarchical logger names.\n\n    $ cat hi.js\n    var Logger = require('bunyan');\n    var log = new Logger({name: \"myapp\"});\n    log.info(\"hi\");\n\nAlternatively, bunyan 0.7.0 and up supports a more node.js-land typical\nstyle (which might become the preferred form over time):\n\n    var bunyan = require('bunyan');\n    var log = bunyan.createLogger({name: \"myapp\"});\n\n**Log records are JSON.** \"hostname\", \"time\" and \"v\" (the Bunyan log\nformat version) are added for you.\n\n    $ node hi.js\n    {\"name\":\"myapp\",\"hostname\":\"banana.local\",\"pid\":123,\"level\":2,\"msg\":\"hi\",\"time\":\"2012-01-31T00:07:44.216Z\",\"v\":0}\n\nThe full `log.{trace|debug|...|fatal}(...)` API is:\n\n    log.info();     // Returns a boolean: is the \"info\" level enabled?\n\n    log.info('hi');                     // Log a simple string message.\n    log.info('hi %s', bob, anotherVar); // Uses `util.format` for msg formatting.\n\n    log.info({foo: 'bar'}, 'hi');       // Adds \"foo\" field to log record.\n\n    log.info(err);  // Special case to log an `Error` instance, adds \"err\"\n                    // key with exception details (including the stack) and\n                    // sets \"msg\" to the exception message.\n    log.info(err, 'more on this: %s', more);\n                    // ... or you can specify the \"msg\".\n\nNote that this implies **you cannot pass any object as the first argument\nto log it**. IOW, `log.info(myobject)` isn't going to work the way you\nexpect. Adding support for this API would necessitate (a) JSON-ifying safely\nthat given object (sometimes hard, and probably slow) and (b) putting all its\nattribs under a top-level 'x' field name or something to avoid field name\ncollisions.\n\n\n## bunyan tool\n\nA `bunyan` tool is provided **for pretty-printing bunyan logs** and, eventually,\nfor filtering (e.g. `| bunyan -c 'level>3'`). This shows the default output\n(which is fluid right now) and indented-JSON output. More output formats will\nbe added, including support for custom formats.\n\n    $ node hi.js | ./bin/bunyan  # CLI tool to filter/pretty-print JSON logs.\n    [2012-01-31T00:08:11.387Z] INFO: myapp on banana.local/123: hi\n\n    $ node hi.js | ./bin/bunyan -o json\n    {\n      \"name\": \"myapp\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"level\": 2,\n      \"msg\": \"hi\",\n      \"time\": \"2012-01-31T00:10:00.676Z\",\n      \"v\": 0\n    }\n\n\n## streams\n\nBy default, log output is to stdout (**stream**) and at the \"info\" level.\nExplicitly that looks like:\n\n    var log = new Logger({name: \"myapp\", stream: process.stdout,\n      level: \"info\"});\n\nThat is an abbreviated form for a single stream. **You can define multiple\nstreams at different levels**.\n\n    var log = new Logger({\n      name: \"amon\",\n      streams: [\n        {\n          level: \"info\",\n          stream: process.stdout, // log INFO and above to stdout\n        },\n        {\n          level: \"error\",\n          path: \"tmp/error.log\"   // log ERROR and above to a file\n        }\n      ]\n    });\n\nMore on streams in the \"Streams\" section below.\n\n\n## log.child\n\nA `log.child(...)` is provided to **specialize a logger for a sub-component**.\nThe following will have log records from \"Wuzzle\" instances use exactly the\nsame config as its parent, plus include the \"component\" field.\n\n    var log = new Logger(...);\n\n    ...\n\n    function Wuzzle(options) {\n      this.log = options.log;\n      this.log.info(\"creating a wuzzle\")\n    }\n    Wuzzle.prototype.woos = function () {\n      this.log.warn(\"This wuzzle is woosey.\")\n    }\n\n    var wuzzle = new Wuzzle({log: log.child({component: \"wuzzle\"})});\n    wuzzle.woos();\n    log.info(\"done with the wuzzle\")\n\nThe [node-restify](https://github.com/mcavage/node-restify)\nframework integrates bunyan. One feature of its integration, is that each\nrestify request handler includes a `req.log` logger that is:\n\n    log.child({req_id: <unique request id>}, true)\n\nApps using restify can then use `req.log` and have all such log records\ninclude the unique request id (as \"req_id\"). Handy.\n\n\n## serializers\n\nBunyan has a concept of **\"serializers\" to produce a JSON-able object from a\nJavaScript object**, so you can easily do the following:\n\n    log.info({req: <request object>}, \"something about handling this request\");\n\nAssociation is by log record field name, \"req\" in this example, so this\nrequires a registered serializer something like this:\n\n    function reqSerializer(req) {\n      return {\n        method: req.method,\n        url: req.url,\n        headers: req.headers\n      }\n    }\n    var log = new Logger({\n      ...\n      serializers: {\n        req: reqSerializer\n      }\n    });\n\nOr this:\n\n    var log = new Logger({\n      ...\n      serializers: {req: Logger.stdSerializers.req}\n    });\n\nbecause Buyan includes a small set of standard serializers. To use all the\nstandard serializers you can use:\n\n    var log = new Logger({\n      ...\n      serializers: Logger.stdSerializers\n    });\n\n*Note: Your own serializers should never throw, otherwise you'll get an\nugly message on stderr from Bunyan (along with the traceback) and the field\nin your log record will be replaced with a short error message.*\n\n## src\n\nThe **source file, line and function of the log call site** can be added to\nlog records by using the `src: true` config option:\n\n    var log = new Logger({src: true, ...});\n\nThis adds the call source info with the 'src' field, like this:\n\n    {\n      \"name\": \"src-example\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"component\": \"wuzzle\",\n      \"level\": 4,\n      \"msg\": \"This wuzzle is woosey.\",\n      \"time\": \"2012-02-06T04:19:35.605Z\",\n      \"src\": {\n        \"file\": \"/Users/trentm/tm/node-bunyan/examples/src.js\",\n        \"line\": 20,\n        \"func\": \"Wuzzle.woos\"\n      },\n      \"v\": 0\n    }\n\n**WARNING: Determining the call source info is slow. Never use this option\nin production.**\n\n\n# Levels\n\nThe log levels in bunyan are:\n\n- \"fatal\" (60): the service/app is going to stop or become unusable now\n- \"error\" (50): fatal for a particular request, but the service/app continues servicing other requests\n- \"warn\" (40): a note on something that should probably be looked at by an operator\n- \"info\" (30): detail on regular operation\n- \"debug\" (20): anything else, i.e. too verbose to be included in \"info\" level.\n- \"trace\" (10): logging from external libraries used by your app\n\nGeneral level usage suggestions: \"debug\" should be used sparingly.\nInformation that will be useful to debug errors *post mortem* should usually\nbe included in \"info\" messages if it's generally relevant or else with the\ncorresponding \"error\" event. Don't rely on spewing mostly irrelevant debug\nmessages all the time and sifting through them when an error occurs.\n\nIntegers are used for the actual level values (10 for \"trace\", ..., 60 for\n\"fatal\") and constants are defined for the (Logger.TRACE ... Logger.DEBUG).\nThe lowercase level names are aliases supported in the API.\n\nHere is the API for changing levels in an existing logger:\n\n    log.level() -> INFO   // gets current level (lowest level of all streams)\n\n    log.level(INFO)       // set all streams to level INFO\n    log.level(\"info\")     // set all streams to level INFO\n\n    log.levels() -> [DEBUG, INFO]   // get array of levels of all streams\n    log.levels(0) -> DEBUG          // get level of stream at index 0\n    log.levels(\"foo\")               // get level of stream with name \"foo\"\n\n    log.levels(0, INFO)             // set level of stream 0 to INFO\n    log.levels(0, \"info\")           // can use \"info\" et al aliases\n    log.levels(\"foo\", WARN)         // set stream named \"foo\" to WARN\n\n\n\n# Log Record Fields\n\nThis section will describe *rules* for the Bunyan log format: field names,\nfield meanings, required fields, etc. However, a Bunyan library doesn't\nstrictly enforce all these rules while records are being emitted. For example,\nBunyan will add a `time` field with the correct format to your log records,\nbut you can specify your own. It is the caller's responsibility to specify\nthe appropriate format.\n\nThe reason for the above leniency is because IMO logging a message should\nnever break your app. This leads to this rule of logging: **a thrown\nexception from `log.info(...)` or equivalent (other than for calling with the\nincorrect signature) is always a bug in Bunyan.**\n\n\nA typical Bunyan log record looks like this:\n\n    {\"name\":\"myserver\",\"hostname\":\"banana.local\",\"pid\":123,\"req\":{\"method\":\"GET\",\"url\":\"/path?q=1#anchor\",\"headers\":{\"x-hi\":\"Mom\",\"connection\":\"close\"}},\"level\":3,\"msg\":\"start request\",\"time\":\"2012-02-03T19:02:46.178Z\",\"v\":0}\n\nPretty-printed:\n\n    {\n      \"name\": \"myserver\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"req\": {\n        \"method\": \"GET\",\n        \"url\": \"/path?q=1#anchor\",\n        \"headers\": {\n          \"x-hi\": \"Mom\",\n          \"connection\": \"close\"\n        },\n        \"remoteAddress\": \"120.0.0.1\",\n        \"remotePort\": 51244\n      },\n      \"level\": 3,\n      \"msg\": \"start request\",\n      \"time\": \"2012-02-03T19:02:57.534Z\",\n      \"v\": 0\n    }\n\n\nCore fields:\n\n- `v`: Required. Integer. Added by Bunion. Cannot be overriden.\n  This is the Bunyan log format version (`require('bunyan').LOG_VERSION`).\n  The log version is a single integer. `0` is until I release a version\n  \"1.0.0\" of node-bunyan. Thereafter, starting with `1`, this will be\n  incremented if there is any backward incompatible change to the log record\n  format. Details will be in \"CHANGES.md\" (the change log).\n- `level`: Required. Integer. Added by Bunion. Cannot be overriden.\n  See the \"Levels\" section.\n- `name`: Required. String. Provided at Logger creation.\n  You must specify a name for your logger when creating it. Typically this\n  is the name of the service/app using Bunyan for logging.\n- `hostname`: Required. String. Provided or determined at Logger creation.\n  You can specify your hostname at Logger creation or it will be retrieved\n  vi `os.hostname()`.\n- `pid`: Required. Integer. Filled in automatically at Logger creation.\n- `time`: Required. String. Added by Bunion. Can be overriden.\n  The date and time of the event in [ISO 8601\n  Extended Format](http://en.wikipedia.org/wiki/ISO_8601) format and in UTC,\n  as from\n  [`Date.toISOString()`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString).\n- `msg`: Required. String.\n  Every `log.debug(...)` et al call must provide a log message.\n- `src`: Optional. Object giving log call source info. This is added\n  automatically by Bunyan if the \"src: true\" config option is given to the\n  Logger. Never use in production as this is really slow.\n\n\nGo ahead and add more fields, and nest ones are fine (and recommended) as\nwell. This is why we're using JSON. Some suggestions and best practices\nfollow (feedback from actual users welcome).\n\n\nRecommended/Best Practice Fields:\n\n-   `err`: Object. A caught JS exception. Log that thing with `log.info(err)`\n    to get:\n\n        ...\n        \"err\": {\n          \"message\": \"boom\",\n          \"name\": \"TypeError\",\n          \"stack\": \"TypeError: boom\\n    at Object.<anonymous> ...\"\n        },\n        \"msg\": \"boom\",\n        ...\n\n    Or use the `Logger.stdSerializers.err` serializer in your Logger and\n    do this `log.error({err: err}, \"oops\")`. See \"examples/err.js\".\n\n- `req_id`: String. A request identifier. Including this field in all logging\n  tied to handling a particular request to your server is strongly suggested.\n  This allows post analysis of logs to easily collate all related logging\n  for a request. This really shines when you have a SOA with multiple services\n  and you carry a single request ID from the top API down through all APIs\n  (as [node-restify](https://github.com/mcavage/node-restify) facilitates\n  with its 'X-Request-Id' header).\n\n- `req`: An HTTP server request. Bunyan provides `Logger.stdSerializers.req`\n  to serialize a request with a suggested set of keys. Example:\n\n        {\n          \"method\": \"GET\",\n          \"url\": \"/path?q=1#anchor\",\n          \"headers\": {\n            \"x-hi\": \"Mom\",\n            \"connection\": \"close\"\n          },\n          \"remoteAddress\": \"120.0.0.1\",\n          \"remotePort\": 51244\n        }\n\n- `res`: An HTTP server response. Bunyan provides `Logger.stdSerializers.res`\n  to serialize a response with a suggested set of keys. Example:\n\n        {\n          \"statusCode\": 200,\n          \"header\": \"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nConnection: keep-alive\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\"\n        }\n\n\nOther fields to consider:\n\n- `req.username`: Authenticated user (or for a 401, the user attempting to\n  auth).\n- Some mechanism to calculate response latency. \"restify\" users will have\n  a \"X-Response-Time\" header. A `latency` custom field would be fine.\n- `req.body`: If you know that request bodies are small (common in APIs,\n  for example), then logging the request body is good.\n\n\n# Streams\n\nA \"stream\" is Bunyan's name for an output for log messages (the equivalent\nto a log4j Appender). Ultimately Bunyan uses a\n[Writable Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream)\ninterface, but there are some additional attributes used to create and\nmanage the stream. A Bunyan Logger instance has one or more streams.\nIn general streams are specified with the \"streams\" option:\n\n    var Logger = require('bunyan');\n    var log = new Logger({\n      name: \"foo\",\n      streams: [\n        {\n            stream: process.stderr,\n            level: \"debug\"\n        },\n        ...\n      ]\n    })\n\nFor convenience, if there is only one stream, it can specified with the\n\"stream\" and \"level\" options (internal converted to a `Logger.streams`):\n\n    var log = new Logger({\n      name: \"foo\",\n      stream: process.stderr,\n      level: \"debug\"\n    })\n\nIf none are specified, the default is a stream on `process.stdout` at the\n\"info\" level.\n\n`Logger.streams` is an array of stream objects with the following attributes:\n\n- `type`: One of \"stream\", \"file\" or \"raw\". See below. Often this is\n  implied from the other arguments.\n- `path`: A file path for a file stream. If `path` is given and `type` is\n  not specified, then `type` will be set to \"file\".\n- `stream`: This is the \"Writable Stream\", e.g. a std handle or an open\n  file write stream. If `stream` is given and `type` is not specified, then\n  `type` will be set to \"stream\".\n- `level`: The level at which logging to this stream is enabled. If not\n  specified it defaults to INFO.\n\nSupported stream types are:\n\n- `stream`: A plain ol' node.js [Writable\n  Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream).\n  A \"stream\" (the writeable stream) value is required.\n\n- `file`: A \"path\" argument is given. Bunyan will open this file for\n  appending. E.g.:\n\n        {\n          \"path\": \"/var/log/foo.log\",\n          \"level\": \"warn\"\n        }\n\n  Bunyan re-emits error events from the created `WriteStream`. So you can\n  do this:\n\n        var log = new Logger({name: 'mylog', streams: [{path: LOG_PATH}]});\n        log.on('error', function (err, stream) {\n            // Handle stream write or create error here.\n        });\n\n- `raw`: Similar to a \"stream\" writeable stream, except that the write method\n  is given raw log record *Object*s instead of a JSON-stringified string.\n  This can be useful for hooking on further processing to all Bunyan logging:\n  pushing to an external service, a RingBuffer (see below), etc.\n\n\n## RingBuffer Stream\n\nBunyan comes with a special stream called a RingBuffer which keeps the last N\nrecords in memory and does *not* write the data anywhere else.  One common\nstrategy is to log 'info' and higher to a normal log file but log all records\n(including 'trace') to a ringbuffer that you can access via a debugger, or your\nown HTTP interface, or a post-mortem facility like MDB or node-panic.\n\nTo use a RingBuffer:\n\n    /* Create a ring buffer that stores the last 100 records. */\n    var bunyan = require('bunyan');\n    var ringbuffer = new bunyan.RingBuffer({ limit: 100 });\n    var log = new bunyan({\n        name: 'foo',\n        streams: [\n            {\n                level: 'info',\n                stream: process.stdout\n            },\n            {\n                level: 'trace',\n                type: 'raw',    // use 'raw' to get raw log record objects\n                stream: ringbuffer\n            }\n        ]\n    });\n\n    log.info('hello world');\n    console.log(ringbuffer.records);\n\nThis example emits:\n\n    [ { name: 'foo',\n        hostname: '912d2b29',\n        pid: 50346,\n        level: 30,\n        msg: 'hello world',\n        time: '2012-06-19T21:34:19.906Z',\n        v: 0 } ]\n\n\n# Versioning\n\nThe scheme I follow is most succintly described by the bootstrap guys\n[here](https://github.com/twitter/bootstrap#versioning). \n\ntl;dr: All versions are `<major>.<minor>.<patch>` which will be incremented for\nbreaking backward compat and major reworks, new features without breaking\nchange, and bug fixes, respectively.\n\n\n\n# License\n\nMIT.\n\n\n\n# Future\n\nSee \"TODO.md\".\n","_id":"bunyan@0.11.3","dist":{"shasum":"4fd81c9981970564865e085f6fe7b17e0d62d8d5","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.11.3.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}]},"0.12.0":{"name":"bunyan","version":"0.12.0","description":"a JSON Logger library for node.js services","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"scripts":{"test":"tap test/*.js"},"contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"},{"name":"Michael Hart","url":"https://github.com/mhart"},{"name":"Isaac Schlueter","url":"https://github.com/isaacs"}],"readme":"Bunyan is **a simple and fast a JSON logging library** for node.js services and\n**a `bunyan` CLI tool** for nicely viewing those logs).\n\n![bunyan CLI screenshot](https://raw.github.com/trentm/node-bunyan/master/tools/screenshot1.png)\n\nServer logs should be structured. JSON's a good format. Let's do that: a log\nrecord is one line of `JSON.stringify`'d output. Let's also specify some common\nnames for the requisite and common fields for a log record (see below).\n\nAlso: log4j is way more than you need.\n\n\n# Current Status\n\nSolid core functionality is there. Joyent is using this for a number of\nproduction services. Bunyan supports node 0.6 and greater.\n\nFollow <a href=\"https://twitter.com/intent/user?screen_name=trentmick\" target=\"_blank\">@trentmick</a>\nfor updates to Bunyan.\n\nSee also: [Bunyan for Bash](https://github.com/trevoro/bash-bunyan).\n\n\n# Installation\n\n    npm install bunyan\n\n\n# Usage\n\n**The usual.** All loggers must provide a \"name\". This is somewhat akin\nto log4j logger \"name\", but Bunyan doesn't do hierarchical logger names.\n\n    $ cat hi.js\n    var Logger = require('bunyan');\n    var log = new Logger({name: \"myapp\"});\n    log.info(\"hi\");\n\nAlternatively, bunyan 0.7.0 and up supports a more node.js-land typical\nstyle (which might become the preferred form over time):\n\n    var bunyan = require('bunyan');\n    var log = bunyan.createLogger({name: \"myapp\"});\n\n**Log records are JSON.** \"hostname\", \"time\" and \"v\" (the Bunyan log\nformat version) are added for you.\n\n    $ node hi.js\n    {\"name\":\"myapp\",\"hostname\":\"banana.local\",\"pid\":123,\"level\":2,\"msg\":\"hi\",\"time\":\"2012-01-31T00:07:44.216Z\",\"v\":0}\n\nThe full `log.{trace|debug|...|fatal}(...)` API is:\n\n    log.info();     // Returns a boolean: is the \"info\" level enabled?\n\n    log.info('hi');                     // Log a simple string message.\n    log.info('hi %s', bob, anotherVar); // Uses `util.format` for msg formatting.\n\n    log.info({foo: 'bar'}, 'hi');       // Adds \"foo\" field to log record.\n\n    log.info(err);  // Special case to log an `Error` instance, adds \"err\"\n                    // key with exception details (including the stack) and\n                    // sets \"msg\" to the exception message.\n    log.info(err, 'more on this: %s', more);\n                    // ... or you can specify the \"msg\".\n\nNote that this implies **you cannot pass any object as the first argument\nto log it**. IOW, `log.info(myobject)` isn't going to work the way you\nexpect. Adding support for this API would necessitate (a) JSON-ifying safely\nthat given object (sometimes hard, and probably slow) and (b) putting all its\nattribs under a top-level 'x' field name or something to avoid field name\ncollisions.\n\n\n## bunyan tool\n\nA `bunyan` tool is provided **for pretty-printing bunyan logs** and, eventually,\nfor filtering (e.g. `| bunyan -c 'level>3'`). This shows the default output\n(which is fluid right now) and indented-JSON output. More output formats will\nbe added, including support for custom formats.\n\n    $ node hi.js | ./bin/bunyan  # CLI tool to filter/pretty-print JSON logs.\n    [2012-01-31T00:08:11.387Z] INFO: myapp on banana.local/123: hi\n\n    $ node hi.js | ./bin/bunyan -o json\n    {\n      \"name\": \"myapp\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"level\": 2,\n      \"msg\": \"hi\",\n      \"time\": \"2012-01-31T00:10:00.676Z\",\n      \"v\": 0\n    }\n\n\n## streams\n\nBy default, log output is to stdout (**stream**) and at the \"info\" level.\nExplicitly that looks like:\n\n    var log = new Logger({name: \"myapp\", stream: process.stdout,\n      level: \"info\"});\n\nThat is an abbreviated form for a single stream. **You can define multiple\nstreams at different levels**.\n\n    var log = new Logger({\n      name: \"amon\",\n      streams: [\n        {\n          level: \"info\",\n          stream: process.stdout, // log INFO and above to stdout\n        },\n        {\n          level: \"error\",\n          path: \"tmp/error.log\"   // log ERROR and above to a file\n        }\n      ]\n    });\n\nMore on streams in the \"Streams\" section below.\n\n\n## log.child\n\nA `log.child(...)` is provided to **specialize a logger for a sub-component**.\nThe following will have log records from \"Wuzzle\" instances use exactly the\nsame config as its parent, plus include the \"component\" field.\n\n    var log = new Logger(...);\n\n    ...\n\n    function Wuzzle(options) {\n      this.log = options.log;\n      this.log.info(\"creating a wuzzle\")\n    }\n    Wuzzle.prototype.woos = function () {\n      this.log.warn(\"This wuzzle is woosey.\")\n    }\n\n    var wuzzle = new Wuzzle({log: log.child({component: \"wuzzle\"})});\n    wuzzle.woos();\n    log.info(\"done with the wuzzle\")\n\nThe [node-restify](https://github.com/mcavage/node-restify)\nframework integrates bunyan. One feature of its integration, is that each\nrestify request handler includes a `req.log` logger that is:\n\n    log.child({req_id: <unique request id>}, true)\n\nApps using restify can then use `req.log` and have all such log records\ninclude the unique request id (as \"req_id\"). Handy.\n\n\n## serializers\n\nBunyan has a concept of **\"serializers\" to produce a JSON-able object from a\nJavaScript object**, so you can easily do the following:\n\n    log.info({req: <request object>}, \"something about handling this request\");\n\nAssociation is by log record field name, \"req\" in this example, so this\nrequires a registered serializer something like this:\n\n    function reqSerializer(req) {\n      return {\n        method: req.method,\n        url: req.url,\n        headers: req.headers\n      }\n    }\n    var log = new Logger({\n      ...\n      serializers: {\n        req: reqSerializer\n      }\n    });\n\nOr this:\n\n    var log = new Logger({\n      ...\n      serializers: {req: Logger.stdSerializers.req}\n    });\n\nbecause Buyan includes a small set of standard serializers. To use all the\nstandard serializers you can use:\n\n    var log = new Logger({\n      ...\n      serializers: Logger.stdSerializers\n    });\n\n*Note: Your own serializers should never throw, otherwise you'll get an\nugly message on stderr from Bunyan (along with the traceback) and the field\nin your log record will be replaced with a short error message.*\n\n## src\n\nThe **source file, line and function of the log call site** can be added to\nlog records by using the `src: true` config option:\n\n    var log = new Logger({src: true, ...});\n\nThis adds the call source info with the 'src' field, like this:\n\n    {\n      \"name\": \"src-example\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"component\": \"wuzzle\",\n      \"level\": 4,\n      \"msg\": \"This wuzzle is woosey.\",\n      \"time\": \"2012-02-06T04:19:35.605Z\",\n      \"src\": {\n        \"file\": \"/Users/trentm/tm/node-bunyan/examples/src.js\",\n        \"line\": 20,\n        \"func\": \"Wuzzle.woos\"\n      },\n      \"v\": 0\n    }\n\n**WARNING: Determining the call source info is slow. Never use this option\nin production.**\n\n\n# Levels\n\nThe log levels in bunyan are:\n\n- \"fatal\" (60): the service/app is going to stop or become unusable now\n- \"error\" (50): fatal for a particular request, but the service/app continues servicing other requests\n- \"warn\" (40): a note on something that should probably be looked at by an operator\n- \"info\" (30): detail on regular operation\n- \"debug\" (20): anything else, i.e. too verbose to be included in \"info\" level.\n- \"trace\" (10): logging from external libraries used by your app\n\nGeneral level usage suggestions: \"debug\" should be used sparingly.\nInformation that will be useful to debug errors *post mortem* should usually\nbe included in \"info\" messages if it's generally relevant or else with the\ncorresponding \"error\" event. Don't rely on spewing mostly irrelevant debug\nmessages all the time and sifting through them when an error occurs.\n\nIntegers are used for the actual level values (10 for \"trace\", ..., 60 for\n\"fatal\") and constants are defined for the (Logger.TRACE ... Logger.DEBUG).\nThe lowercase level names are aliases supported in the API.\n\nHere is the API for changing levels in an existing logger:\n\n    log.level() -> INFO   // gets current level (lowest level of all streams)\n\n    log.level(INFO)       // set all streams to level INFO\n    log.level(\"info\")     // set all streams to level INFO\n\n    log.levels() -> [DEBUG, INFO]   // get array of levels of all streams\n    log.levels(0) -> DEBUG          // get level of stream at index 0\n    log.levels(\"foo\")               // get level of stream with name \"foo\"\n\n    log.levels(0, INFO)             // set level of stream 0 to INFO\n    log.levels(0, \"info\")           // can use \"info\" et al aliases\n    log.levels(\"foo\", WARN)         // set stream named \"foo\" to WARN\n\n\n\n# Log Record Fields\n\nThis section will describe *rules* for the Bunyan log format: field names,\nfield meanings, required fields, etc. However, a Bunyan library doesn't\nstrictly enforce all these rules while records are being emitted. For example,\nBunyan will add a `time` field with the correct format to your log records,\nbut you can specify your own. It is the caller's responsibility to specify\nthe appropriate format.\n\nThe reason for the above leniency is because IMO logging a message should\nnever break your app. This leads to this rule of logging: **a thrown\nexception from `log.info(...)` or equivalent (other than for calling with the\nincorrect signature) is always a bug in Bunyan.**\n\n\nA typical Bunyan log record looks like this:\n\n    {\"name\":\"myserver\",\"hostname\":\"banana.local\",\"pid\":123,\"req\":{\"method\":\"GET\",\"url\":\"/path?q=1#anchor\",\"headers\":{\"x-hi\":\"Mom\",\"connection\":\"close\"}},\"level\":3,\"msg\":\"start request\",\"time\":\"2012-02-03T19:02:46.178Z\",\"v\":0}\n\nPretty-printed:\n\n    {\n      \"name\": \"myserver\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"req\": {\n        \"method\": \"GET\",\n        \"url\": \"/path?q=1#anchor\",\n        \"headers\": {\n          \"x-hi\": \"Mom\",\n          \"connection\": \"close\"\n        },\n        \"remoteAddress\": \"120.0.0.1\",\n        \"remotePort\": 51244\n      },\n      \"level\": 3,\n      \"msg\": \"start request\",\n      \"time\": \"2012-02-03T19:02:57.534Z\",\n      \"v\": 0\n    }\n\n\nCore fields:\n\n- `v`: Required. Integer. Added by Bunion. Cannot be overriden.\n  This is the Bunyan log format version (`require('bunyan').LOG_VERSION`).\n  The log version is a single integer. `0` is until I release a version\n  \"1.0.0\" of node-bunyan. Thereafter, starting with `1`, this will be\n  incremented if there is any backward incompatible change to the log record\n  format. Details will be in \"CHANGES.md\" (the change log).\n- `level`: Required. Integer. Added by Bunion. Cannot be overriden.\n  See the \"Levels\" section.\n- `name`: Required. String. Provided at Logger creation.\n  You must specify a name for your logger when creating it. Typically this\n  is the name of the service/app using Bunyan for logging.\n- `hostname`: Required. String. Provided or determined at Logger creation.\n  You can specify your hostname at Logger creation or it will be retrieved\n  vi `os.hostname()`.\n- `pid`: Required. Integer. Filled in automatically at Logger creation.\n- `time`: Required. String. Added by Bunion. Can be overriden.\n  The date and time of the event in [ISO 8601\n  Extended Format](http://en.wikipedia.org/wiki/ISO_8601) format and in UTC,\n  as from\n  [`Date.toISOString()`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString).\n- `msg`: Required. String.\n  Every `log.debug(...)` et al call must provide a log message.\n- `src`: Optional. Object giving log call source info. This is added\n  automatically by Bunyan if the \"src: true\" config option is given to the\n  Logger. Never use in production as this is really slow.\n\n\nGo ahead and add more fields, and nest ones are fine (and recommended) as\nwell. This is why we're using JSON. Some suggestions and best practices\nfollow (feedback from actual users welcome).\n\n\nRecommended/Best Practice Fields:\n\n-   `err`: Object. A caught JS exception. Log that thing with `log.info(err)`\n    to get:\n\n        ...\n        \"err\": {\n          \"message\": \"boom\",\n          \"name\": \"TypeError\",\n          \"stack\": \"TypeError: boom\\n    at Object.<anonymous> ...\"\n        },\n        \"msg\": \"boom\",\n        ...\n\n    Or use the `Logger.stdSerializers.err` serializer in your Logger and\n    do this `log.error({err: err}, \"oops\")`. See \"examples/err.js\".\n\n- `req_id`: String. A request identifier. Including this field in all logging\n  tied to handling a particular request to your server is strongly suggested.\n  This allows post analysis of logs to easily collate all related logging\n  for a request. This really shines when you have a SOA with multiple services\n  and you carry a single request ID from the top API down through all APIs\n  (as [node-restify](https://github.com/mcavage/node-restify) facilitates\n  with its 'X-Request-Id' header).\n\n- `req`: An HTTP server request. Bunyan provides `Logger.stdSerializers.req`\n  to serialize a request with a suggested set of keys. Example:\n\n        {\n          \"method\": \"GET\",\n          \"url\": \"/path?q=1#anchor\",\n          \"headers\": {\n            \"x-hi\": \"Mom\",\n            \"connection\": \"close\"\n          },\n          \"remoteAddress\": \"120.0.0.1\",\n          \"remotePort\": 51244\n        }\n\n- `res`: An HTTP server response. Bunyan provides `Logger.stdSerializers.res`\n  to serialize a response with a suggested set of keys. Example:\n\n        {\n          \"statusCode\": 200,\n          \"header\": \"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nConnection: keep-alive\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\"\n        }\n\n\nOther fields to consider:\n\n- `req.username`: Authenticated user (or for a 401, the user attempting to\n  auth).\n- Some mechanism to calculate response latency. \"restify\" users will have\n  a \"X-Response-Time\" header. A `latency` custom field would be fine.\n- `req.body`: If you know that request bodies are small (common in APIs,\n  for example), then logging the request body is good.\n\n\n# Streams\n\nA \"stream\" is Bunyan's name for an output for log messages (the equivalent\nto a log4j Appender). Ultimately Bunyan uses a\n[Writable Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream)\ninterface, but there are some additional attributes used to create and\nmanage the stream. A Bunyan Logger instance has one or more streams.\nIn general streams are specified with the \"streams\" option:\n\n    var Logger = require('bunyan');\n    var log = new Logger({\n      name: \"foo\",\n      streams: [\n        {\n            stream: process.stderr,\n            level: \"debug\"\n        },\n        ...\n      ]\n    })\n\nFor convenience, if there is only one stream, it can specified with the\n\"stream\" and \"level\" options (internal converted to a `Logger.streams`):\n\n    var log = new Logger({\n      name: \"foo\",\n      stream: process.stderr,\n      level: \"debug\"\n    })\n\nIf none are specified, the default is a stream on `process.stdout` at the\n\"info\" level.\n\n`Logger.streams` is an array of stream objects with the following attributes:\n\n- `type`: One of \"stream\", \"file\" or \"raw\". See below. Often this is\n  implied from the other arguments.\n- `path`: A file path for a file stream. If `path` is given and `type` is\n  not specified, then `type` will be set to \"file\".\n- `stream`: This is the \"Writable Stream\", e.g. a std handle or an open\n  file write stream. If `stream` is given and `type` is not specified, then\n  `type` will be set to \"stream\".\n- `level`: The level at which logging to this stream is enabled. If not\n  specified it defaults to INFO.\n\nSupported stream types are:\n\n- `stream`: A plain ol' node.js [Writable\n  Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream).\n  A \"stream\" (the writeable stream) value is required.\n\n- `file`: A \"path\" argument is given. Bunyan will open this file for\n  appending. E.g.:\n\n        {\n          \"path\": \"/var/log/foo.log\",\n          \"level\": \"warn\"\n        }\n\n  Bunyan re-emits error events from the created `WriteStream`. So you can\n  do this:\n\n        var log = new Logger({name: 'mylog', streams: [{path: LOG_PATH}]});\n        log.on('error', function (err, stream) {\n            // Handle stream write or create error here.\n        });\n\n- `raw`: Similar to a \"stream\" writeable stream, except that the write method\n  is given raw log record *Object*s instead of a JSON-stringified string.\n  This can be useful for hooking on further processing to all Bunyan logging:\n  pushing to an external service, a RingBuffer (see below), etc.\n\n\n## RingBuffer Stream\n\nBunyan comes with a special stream called a RingBuffer which keeps the last N\nrecords in memory and does *not* write the data anywhere else.  One common\nstrategy is to log 'info' and higher to a normal log file but log all records\n(including 'trace') to a ringbuffer that you can access via a debugger, or your\nown HTTP interface, or a post-mortem facility like MDB or node-panic.\n\nTo use a RingBuffer:\n\n    /* Create a ring buffer that stores the last 100 records. */\n    var bunyan = require('bunyan');\n    var ringbuffer = new bunyan.RingBuffer({ limit: 100 });\n    var log = new bunyan({\n        name: 'foo',\n        streams: [\n            {\n                level: 'info',\n                stream: process.stdout\n            },\n            {\n                level: 'trace',\n                type: 'raw',    // use 'raw' to get raw log record objects\n                stream: ringbuffer\n            }\n        ]\n    });\n\n    log.info('hello world');\n    console.log(ringbuffer.records);\n\nThis example emits:\n\n    [ { name: 'foo',\n        hostname: '912d2b29',\n        pid: 50346,\n        level: 30,\n        msg: 'hello world',\n        time: '2012-06-19T21:34:19.906Z',\n        v: 0 } ]\n\n\n# Versioning\n\nThe scheme I follow is most succintly described by the bootstrap guys\n[here](https://github.com/twitter/bootstrap#versioning). \n\ntl;dr: All versions are `<major>.<minor>.<patch>` which will be incremented for\nbreaking backward compat and major reworks, new features without breaking\nchange, and bug fixes, respectively.\n\n\n\n# License\n\nMIT.\n\n\n\n# Future\n\nSee \"TODO.md\".\n","_id":"bunyan@0.12.0","dist":{"shasum":"54e921ffc366b64aba9bcb0cfbd39da33390cf06","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.12.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}]},"0.13.0":{"name":"bunyan","version":"0.13.0","description":"a JSON Logger library for node.js services","author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"main":"./lib/bunyan.js","bin":{"bunyan":"./bin/bunyan"},"repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"engines":["node >=0.6.0"],"keywords":["log","logging","log4j","json"],"devDependencies":{"tap":"0.2.0","ben":"0.0.0"},"scripts":{"test":"tap test/*.js"},"contributors":[{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},{"name":"Mark Cavage","email":"mcavage@gmail.com","url":"https://github.com/mcavage"},{"name":"Dave Pacheco","email":"dap@joyent.com","url":"https://github.com/davepacheco"},{"name":"Michael Hart","url":"https://github.com/mhart"},{"name":"Isaac Schlueter","url":"https://github.com/isaacs"}],"readme":"Bunyan is **a simple and fast a JSON logging library** for node.js services and\n**a `bunyan` CLI tool** for nicely viewing those logs).\n\n![bunyan CLI screenshot](https://raw.github.com/trentm/node-bunyan/master/tools/screenshot1.png)\n\nServer logs should be structured. JSON's a good format. Let's do that: a log\nrecord is one line of `JSON.stringify`'d output. Let's also specify some common\nnames for the requisite and common fields for a log record (see below).\n\nAlso: log4j is way more than you need.\n\n\n# Current Status\n\nSolid core functionality is there. Joyent is using this for a number of\nproduction services. Bunyan supports node 0.6 and greater.\n\nFollow <a href=\"https://twitter.com/intent/user?screen_name=trentmick\" target=\"_blank\">@trentmick</a>\nfor updates to Bunyan.\n\nSee also: [Bunyan for Bash](https://github.com/trevoro/bash-bunyan).\n\n\n# Installation\n\n    npm install bunyan\n\n\n# Usage\n\n**The usual.** All loggers must provide a \"name\". This is somewhat akin\nto log4j logger \"name\", but Bunyan doesn't do hierarchical logger names.\n\n    $ cat hi.js\n    var Logger = require('bunyan');\n    var log = new Logger({name: \"myapp\"});\n    log.info(\"hi\");\n\nAlternatively, bunyan 0.7.0 and up supports a more node.js-land typical\nstyle (which might become the preferred form over time):\n\n    var bunyan = require('bunyan');\n    var log = bunyan.createLogger({name: \"myapp\"});\n\n**Log records are JSON.** \"hostname\", \"time\" and \"v\" (the Bunyan log\nformat version) are added for you.\n\n    $ node hi.js\n    {\"name\":\"myapp\",\"hostname\":\"banana.local\",\"pid\":123,\"level\":2,\"msg\":\"hi\",\"time\":\"2012-01-31T00:07:44.216Z\",\"v\":0}\n\nThe full `log.{trace|debug|...|fatal}(...)` API is:\n\n    log.info();     // Returns a boolean: is the \"info\" level enabled?\n\n    log.info('hi');                     // Log a simple string message.\n    log.info('hi %s', bob, anotherVar); // Uses `util.format` for msg formatting.\n\n    log.info({foo: 'bar'}, 'hi');       // Adds \"foo\" field to log record.\n\n    log.info(err);  // Special case to log an `Error` instance, adds \"err\"\n                    // key with exception details (including the stack) and\n                    // sets \"msg\" to the exception message.\n    log.info(err, 'more on this: %s', more);\n                    // ... or you can specify the \"msg\".\n\nNote that this implies **you cannot pass any object as the first argument\nto log it**. IOW, `log.info(myobject)` isn't going to work the way you\nexpect. Adding support for this API would necessitate (a) JSON-ifying safely\nthat given object (sometimes hard, and probably slow) and (b) putting all its\nattribs under a top-level 'x' field name or something to avoid field name\ncollisions.\n\n\n## bunyan tool\n\nA `bunyan` tool is provided **for pretty-printing bunyan logs** and, eventually,\nfor filtering (e.g. `| bunyan -c 'level>3'`). This shows the default output\n(which is fluid right now) and indented-JSON output. More output formats will\nbe added, including support for custom formats.\n\n    $ node hi.js | ./bin/bunyan  # CLI tool to filter/pretty-print JSON logs.\n    [2012-01-31T00:08:11.387Z] INFO: myapp on banana.local/123: hi\n\n    $ node hi.js | ./bin/bunyan -o json\n    {\n      \"name\": \"myapp\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"level\": 2,\n      \"msg\": \"hi\",\n      \"time\": \"2012-01-31T00:10:00.676Z\",\n      \"v\": 0\n    }\n\n\n## streams\n\nBy default, log output is to stdout (**stream**) and at the \"info\" level.\nExplicitly that looks like:\n\n    var log = new Logger({name: \"myapp\", stream: process.stdout,\n      level: \"info\"});\n\nThat is an abbreviated form for a single stream. **You can define multiple\nstreams at different levels**.\n\n    var log = new Logger({\n      name: \"amon\",\n      streams: [\n        {\n          level: \"info\",\n          stream: process.stdout, // log INFO and above to stdout\n        },\n        {\n          level: \"error\",\n          path: \"tmp/error.log\"   // log ERROR and above to a file\n        }\n      ]\n    });\n\nMore on streams in the \"Streams\" section below.\n\n\n## log.child\n\nA `log.child(...)` is provided to **specialize a logger for a sub-component**.\nThe following will have log records from \"Wuzzle\" instances use exactly the\nsame config as its parent, plus include the \"component\" field.\n\n    var log = new Logger(...);\n\n    ...\n\n    function Wuzzle(options) {\n      this.log = options.log;\n      this.log.info(\"creating a wuzzle\")\n    }\n    Wuzzle.prototype.woos = function () {\n      this.log.warn(\"This wuzzle is woosey.\")\n    }\n\n    var wuzzle = new Wuzzle({log: log.child({component: \"wuzzle\"})});\n    wuzzle.woos();\n    log.info(\"done with the wuzzle\")\n\nThe [node-restify](https://github.com/mcavage/node-restify)\nframework integrates bunyan. One feature of its integration, is that each\nrestify request handler includes a `req.log` logger that is:\n\n    log.child({req_id: <unique request id>}, true)\n\nApps using restify can then use `req.log` and have all such log records\ninclude the unique request id (as \"req_id\"). Handy.\n\n\n## serializers\n\nBunyan has a concept of **\"serializers\" to produce a JSON-able object from a\nJavaScript object**, so you can easily do the following:\n\n    log.info({req: <request object>}, \"something about handling this request\");\n\nAssociation is by log record field name, \"req\" in this example, so this\nrequires a registered serializer something like this:\n\n    function reqSerializer(req) {\n      return {\n        method: req.method,\n        url: req.url,\n        headers: req.headers\n      }\n    }\n    var log = new Logger({\n      ...\n      serializers: {\n        req: reqSerializer\n      }\n    });\n\nOr this:\n\n    var log = new Logger({\n      ...\n      serializers: {req: Logger.stdSerializers.req}\n    });\n\nbecause Buyan includes a small set of standard serializers. To use all the\nstandard serializers you can use:\n\n    var log = new Logger({\n      ...\n      serializers: Logger.stdSerializers\n    });\n\n*Note: Your own serializers should never throw, otherwise you'll get an\nugly message on stderr from Bunyan (along with the traceback) and the field\nin your log record will be replaced with a short error message.*\n\n## src\n\nThe **source file, line and function of the log call site** can be added to\nlog records by using the `src: true` config option:\n\n    var log = new Logger({src: true, ...});\n\nThis adds the call source info with the 'src' field, like this:\n\n    {\n      \"name\": \"src-example\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"component\": \"wuzzle\",\n      \"level\": 4,\n      \"msg\": \"This wuzzle is woosey.\",\n      \"time\": \"2012-02-06T04:19:35.605Z\",\n      \"src\": {\n        \"file\": \"/Users/trentm/tm/node-bunyan/examples/src.js\",\n        \"line\": 20,\n        \"func\": \"Wuzzle.woos\"\n      },\n      \"v\": 0\n    }\n\n**WARNING: Determining the call source info is slow. Never use this option\nin production.**\n\n\n# Levels\n\nThe log levels in bunyan are:\n\n- \"fatal\" (60): the service/app is going to stop or become unusable now\n- \"error\" (50): fatal for a particular request, but the service/app continues servicing other requests\n- \"warn\" (40): a note on something that should probably be looked at by an operator\n- \"info\" (30): detail on regular operation\n- \"debug\" (20): anything else, i.e. too verbose to be included in \"info\" level.\n- \"trace\" (10): logging from external libraries used by your app\n\nGeneral level usage suggestions: \"debug\" should be used sparingly.\nInformation that will be useful to debug errors *post mortem* should usually\nbe included in \"info\" messages if it's generally relevant or else with the\ncorresponding \"error\" event. Don't rely on spewing mostly irrelevant debug\nmessages all the time and sifting through them when an error occurs.\n\nIntegers are used for the actual level values (10 for \"trace\", ..., 60 for\n\"fatal\") and constants are defined for the (Logger.TRACE ... Logger.DEBUG).\nThe lowercase level names are aliases supported in the API.\n\nHere is the API for changing levels in an existing logger:\n\n    log.level() -> INFO   // gets current level (lowest level of all streams)\n\n    log.level(INFO)       // set all streams to level INFO\n    log.level(\"info\")     // set all streams to level INFO\n\n    log.levels() -> [DEBUG, INFO]   // get array of levels of all streams\n    log.levels(0) -> DEBUG          // get level of stream at index 0\n    log.levels(\"foo\")               // get level of stream with name \"foo\"\n\n    log.levels(0, INFO)             // set level of stream 0 to INFO\n    log.levels(0, \"info\")           // can use \"info\" et al aliases\n    log.levels(\"foo\", WARN)         // set stream named \"foo\" to WARN\n\n\n\n# Log Record Fields\n\nThis section will describe *rules* for the Bunyan log format: field names,\nfield meanings, required fields, etc. However, a Bunyan library doesn't\nstrictly enforce all these rules while records are being emitted. For example,\nBunyan will add a `time` field with the correct format to your log records,\nbut you can specify your own. It is the caller's responsibility to specify\nthe appropriate format.\n\nThe reason for the above leniency is because IMO logging a message should\nnever break your app. This leads to this rule of logging: **a thrown\nexception from `log.info(...)` or equivalent (other than for calling with the\nincorrect signature) is always a bug in Bunyan.**\n\n\nA typical Bunyan log record looks like this:\n\n    {\"name\":\"myserver\",\"hostname\":\"banana.local\",\"pid\":123,\"req\":{\"method\":\"GET\",\"url\":\"/path?q=1#anchor\",\"headers\":{\"x-hi\":\"Mom\",\"connection\":\"close\"}},\"level\":3,\"msg\":\"start request\",\"time\":\"2012-02-03T19:02:46.178Z\",\"v\":0}\n\nPretty-printed:\n\n    {\n      \"name\": \"myserver\",\n      \"hostname\": \"banana.local\",\n      \"pid\": 123,\n      \"req\": {\n        \"method\": \"GET\",\n        \"url\": \"/path?q=1#anchor\",\n        \"headers\": {\n          \"x-hi\": \"Mom\",\n          \"connection\": \"close\"\n        },\n        \"remoteAddress\": \"120.0.0.1\",\n        \"remotePort\": 51244\n      },\n      \"level\": 3,\n      \"msg\": \"start request\",\n      \"time\": \"2012-02-03T19:02:57.534Z\",\n      \"v\": 0\n    }\n\n\nCore fields:\n\n- `v`: Required. Integer. Added by Bunion. Cannot be overriden.\n  This is the Bunyan log format version (`require('bunyan').LOG_VERSION`).\n  The log version is a single integer. `0` is until I release a version\n  \"1.0.0\" of node-bunyan. Thereafter, starting with `1`, this will be\n  incremented if there is any backward incompatible change to the log record\n  format. Details will be in \"CHANGES.md\" (the change log).\n- `level`: Required. Integer. Added by Bunion. Cannot be overriden.\n  See the \"Levels\" section.\n- `name`: Required. String. Provided at Logger creation.\n  You must specify a name for your logger when creating it. Typically this\n  is the name of the service/app using Bunyan for logging.\n- `hostname`: Required. String. Provided or determined at Logger creation.\n  You can specify your hostname at Logger creation or it will be retrieved\n  vi `os.hostname()`.\n- `pid`: Required. Integer. Filled in automatically at Logger creation.\n- `time`: Required. String. Added by Bunion. Can be overriden.\n  The date and time of the event in [ISO 8601\n  Extended Format](http://en.wikipedia.org/wiki/ISO_8601) format and in UTC,\n  as from\n  [`Date.toISOString()`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toISOString).\n- `msg`: Required. String.\n  Every `log.debug(...)` et al call must provide a log message.\n- `src`: Optional. Object giving log call source info. This is added\n  automatically by Bunyan if the \"src: true\" config option is given to the\n  Logger. Never use in production as this is really slow.\n\n\nGo ahead and add more fields, and nest ones are fine (and recommended) as\nwell. This is why we're using JSON. Some suggestions and best practices\nfollow (feedback from actual users welcome).\n\n\nRecommended/Best Practice Fields:\n\n-   `err`: Object. A caught JS exception. Log that thing with `log.info(err)`\n    to get:\n\n        ...\n        \"err\": {\n          \"message\": \"boom\",\n          \"name\": \"TypeError\",\n          \"stack\": \"TypeError: boom\\n    at Object.<anonymous> ...\"\n        },\n        \"msg\": \"boom\",\n        ...\n\n    Or use the `Logger.stdSerializers.err` serializer in your Logger and\n    do this `log.error({err: err}, \"oops\")`. See \"examples/err.js\".\n\n- `req_id`: String. A request identifier. Including this field in all logging\n  tied to handling a particular request to your server is strongly suggested.\n  This allows post analysis of logs to easily collate all related logging\n  for a request. This really shines when you have a SOA with multiple services\n  and you carry a single request ID from the top API down through all APIs\n  (as [node-restify](https://github.com/mcavage/node-restify) facilitates\n  with its 'X-Request-Id' header).\n\n- `req`: An HTTP server request. Bunyan provides `Logger.stdSerializers.req`\n  to serialize a request with a suggested set of keys. Example:\n\n        {\n          \"method\": \"GET\",\n          \"url\": \"/path?q=1#anchor\",\n          \"headers\": {\n            \"x-hi\": \"Mom\",\n            \"connection\": \"close\"\n          },\n          \"remoteAddress\": \"120.0.0.1\",\n          \"remotePort\": 51244\n        }\n\n- `res`: An HTTP server response. Bunyan provides `Logger.stdSerializers.res`\n  to serialize a response with a suggested set of keys. Example:\n\n        {\n          \"statusCode\": 200,\n          \"header\": \"HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\nConnection: keep-alive\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\"\n        }\n\n\nOther fields to consider:\n\n- `req.username`: Authenticated user (or for a 401, the user attempting to\n  auth).\n- Some mechanism to calculate response latency. \"restify\" users will have\n  a \"X-Response-Time\" header. A `latency` custom field would be fine.\n- `req.body`: If you know that request bodies are small (common in APIs,\n  for example), then logging the request body is good.\n\n\n# Streams\n\nA \"stream\" is Bunyan's name for an output for log messages (the equivalent\nto a log4j Appender). Ultimately Bunyan uses a\n[Writable Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream)\ninterface, but there are some additional attributes used to create and\nmanage the stream. A Bunyan Logger instance has one or more streams.\nIn general streams are specified with the \"streams\" option:\n\n    var Logger = require('bunyan');\n    var log = new Logger({\n      name: \"foo\",\n      streams: [\n        {\n            stream: process.stderr,\n            level: \"debug\"\n        },\n        ...\n      ]\n    })\n\nFor convenience, if there is only one stream, it can specified with the\n\"stream\" and \"level\" options (internal converted to a `Logger.streams`):\n\n    var log = new Logger({\n      name: \"foo\",\n      stream: process.stderr,\n      level: \"debug\"\n    })\n\nIf none are specified, the default is a stream on `process.stdout` at the\n\"info\" level.\n\n`Logger.streams` is an array of stream objects with the following attributes:\n\n- `type`: One of \"stream\", \"file\" or \"raw\". See below. Often this is\n  implied from the other arguments.\n- `path`: A file path for a file stream. If `path` is given and `type` is\n  not specified, then `type` will be set to \"file\".\n- `stream`: This is the \"Writable Stream\", e.g. a std handle or an open\n  file write stream. If `stream` is given and `type` is not specified, then\n  `type` will be set to \"stream\".\n- `level`: The level at which logging to this stream is enabled. If not\n  specified it defaults to INFO.\n\nSupported stream types are:\n\n- `stream`: A plain ol' node.js [Writable\n  Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream).\n  A \"stream\" (the writeable stream) value is required.\n\n- `file`: A \"path\" argument is given. Bunyan will open this file for\n  appending. E.g.:\n\n        {\n          \"path\": \"/var/log/foo.log\",\n          \"level\": \"warn\"\n        }\n\n  Bunyan re-emits error events from the created `WriteStream`. So you can\n  do this:\n\n        var log = new Logger({name: 'mylog', streams: [{path: LOG_PATH}]});\n        log.on('error', function (err, stream) {\n            // Handle stream write or create error here.\n        });\n\n- `raw`: Similar to a \"stream\" writeable stream, except that the write method\n  is given raw log record *Object*s instead of a JSON-stringified string.\n  This can be useful for hooking on further processing to all Bunyan logging:\n  pushing to an external service, a RingBuffer (see below), etc.\n\n\n## RingBuffer Stream\n\nBunyan comes with a special stream called a RingBuffer which keeps the last N\nrecords in memory and does *not* write the data anywhere else.  One common\nstrategy is to log 'info' and higher to a normal log file but log all records\n(including 'trace') to a ringbuffer that you can access via a debugger, or your\nown HTTP interface, or a post-mortem facility like MDB or node-panic.\n\nTo use a RingBuffer:\n\n    /* Create a ring buffer that stores the last 100 records. */\n    var bunyan = require('bunyan');\n    var ringbuffer = new bunyan.RingBuffer({ limit: 100 });\n    var log = new bunyan({\n        name: 'foo',\n        streams: [\n            {\n                level: 'info',\n                stream: process.stdout\n            },\n            {\n                level: 'trace',\n                type: 'raw',    // use 'raw' to get raw log record objects\n                stream: ringbuffer\n            }\n        ]\n    });\n\n    log.info('hello world');\n    console.log(ringbuffer.records);\n\nThis example emits:\n\n    [ { name: 'foo',\n        hostname: '912d2b29',\n        pid: 50346,\n        level: 30,\n        msg: 'hello world',\n        time: '2012-06-19T21:34:19.906Z',\n        v: 0 } ]\n\n\n# Versioning\n\nThe scheme I follow is most succintly described by the bootstrap guys\n[here](https://github.com/twitter/bootstrap#versioning). \n\ntl;dr: All versions are `<major>.<minor>.<patch>` which will be incremented for\nbreaking backward compat and major reworks, new features without breaking\nchange, and bug fixes, respectively.\n\n\n\n# License\n\nMIT.\n\n\n\n# Future\n\nSee \"TODO.md\".\n","_id":"bunyan@0.13.0","dist":{"shasum":"2834fc7949ffa410547fe4286618707685f7f73c","tarball":"http://registry.npmjs.org/bunyan/-/bunyan-0.13.0.tgz"},"maintainers":[{"name":"trentm","email":"trentm@gmail.com"}]}},"readme":"Bunyan -- a JSON Logger for node.js servers.\n\nServer logs should be structured. JSON's a good format. Let's do that: a log\nrecord is one line of `JSON.stringify`'d output. Let's also specify some common\nnames for the requisite and common fields for a log record (see below).\n\nAlso: log4j is way more than you need.\n\n\n# Current Status\n\nJust play stuff here. Don't try to use this for realz yet.\n\n\n# Usage\n\n**The usual.** All loggers must provide a \"service\" name. This is somewhat akin\nto log4j logger \"name\", but Bunyan doesn't so hierarchical logger names.\n\n    $ cat hi.js\n    var Logger = require('bunyan');\n    var log = new Logger({service: \"myapp\"});\n    log.info(\"hi\");\n\n**Log records are JSON.** \"hostname\", \"time\" and \"v\" (the Bunyan log\nformat version) are added for you.\n\n    $ node hi.js\n    {\"service\":\"myapp\",\"hostname\":\"banana.local\",\"level\":2,\"msg\":\"hi\",\"time\":\"2012-01-31T00:07:44.216Z\",\"v\":0}\n\nA **`bunyan` tool is provided for pretty-printing** bunyan logs and, eventually,\nfor filtering (e.g. `| bunyan -c 'level>3'`). This shows the default output\n(which is fluid right now) and indented-JSON output. More output formats will\nbe added, including support for custom formats.\n\n    $ node hi.js | ./bin/bunyan  # CLI tool to filter/pretty-print JSON logs.\n    [2012-01-31T00:08:11.387Z] INFO: myapp on banana.local: hi\n    \n    $ node hi.js | ./bin/bunyan -o json\n    {\n      \"service\": \"myapp\",\n      \"hostname\": \"banana.local\",\n      \"level\": 2,\n      \"msg\": \"hi\",\n      \"time\": \"2012-01-31T00:10:00.676Z\",\n      \"v\": 0\n    }\n\nBy default, log output is to stdout (**stream**) and at the \"info\" level.\nExplicitly that looks like:\n\n    var log = new Logger({service: \"myapp\", stream: process.stdout, \n      level: \"info\"});\n\nThat is an abbreviated form for a single stream. **You can defined multiple\nstreams at different levels**.\n\n    var log = new Logger({\n      service: \"amon\",\n      streams: [\n        {\n          level: \"info\",\n          stream: process.stdout, // log INFO and above to stdout\n        },\n        {\n          level: \"error\",\n          path: \"tmp/error.log\"   // log ERROR and above to a file\n        }\n      ]\n    });\n\nA **`log.clone(...)`** is provided to specialize a logger for a sub-component.\nThe following will have log records from \"Wuzzle\" instances use exactly the\nsame config as its parent, plus include the \"component\" field.\n\n    var log = new Logger(...);\n\n    ...\n    \n    function Wuzzle(options) {\n      this.log = options.log;\n      this.log.info(\"creating a wuzzle\")\n    }\n    Wuzzle.prototype.woos = function () {\n      this.log.warn(\"This wuzzle is woosey.\")\n    }\n    \n    var wuzzle = new Wuzzle({log: log.clone({component: \"wuzzle\"})});\n    wuzzle.woos();\n    log.info(\"done with the wuzzle\")\n\n\nBack to the `log.{trace|debug|...|fatal}(...)` API:\n\n    log.info();     // returns a boolean: is the \"info\" level enabled?\n    log.info(\"hi\"); // log a simple string message\n    log.info(\"hi %s\", bob, anotherVar); // uses `util.format` for msg formatting\n    log.info({foo: \"bar\"}, \"hi\");       // adds \"foo\" field to log record\n\nBunyan has a concept of **\"serializers\" to produce a JSON-able object from a\nJavaScript object**, so your can easily do the following:\n\n    log.info({req: <request object>}, \"something about handling this request\");\n\nAssociation is by log record field name, \"req\" in this example, so this\nrequires a registered serializer something like this:\n\n    function reqSerializer(req) {\n      return {\n        method: req.method,\n        url: req.url,\n        headers: req.headers\n      }\n    }\n    var log = new Logger({\n      ...\n      serializers: {\n        req: reqSerializer\n      }\n    });\n\nOr this:\n\n    var log = new Logger({\n      ...\n      serializers: {req: Logger.stdSerializers.req}\n    });\n\nbecause Buyan includes a small set of standard serializers. To use all the\nstandard serializers you can use:\n\n    var log = new Logger({\n      ...\n      serializers: Logger.stdSerializers\n    });\n\n*Note: Your own serializers should never throw, otherwise you'll get an\nugly message on stderr from Bunyan (along with the traceback) and the field\nin your log record will be replaced with a short error message.*\n\n\n\n# Future\n\nSee \"TODO.md\", but basically:\n\n- More std serializers. See TODO.md.\n\n- Spec'ing and enforcing the fields (from dap's section in eng guide).\n\n- Syslog support. Ring-buffer support for storing last N debug messages\n  (or whatever) in memory to support debugability without too much log load.\n\n- More `bunyan` output formats and filtering features.\n\n- Think about a bunyan dashboard that supports organizing and viewing logs\n  from multiple hosts and services.\n\n\n\n# Levels\n\n- \"fatal\": the service is going to stop or become unusable now\n- \"error\": fatal for a particular request, but the service continues servicing other requests\n- \"warn\": a note on something that should probably be looked at by an operator\n- \"info\": detail on regular operation\n- \"debug\": anything else, i.e. too verbose to be included in \"info\" level.\n- \"trace\": logging from external libraries used by your app\n\n\"debug\" should be used sparingly. Information that will be useful to debug\nerrors *post mortem* should usually be included in \"info\" messages if it's\ngenerally relevant or else with the corresponding \"error\" event. Don't rely on\nspewing mostly irrelevant debug messages all the time and sifting through them\nwhen an error occurs.\n\nIntegers are used for the actual level values (1 for \"trace\", ..., 6 for \"fatal\") and\nconstants are defined for the (Logger.TRACE ... Logger.DEBUG). The lowercase\nlevel names are aliases supported in the API.\n\n\n# Log Record Fields\n\nTODO: from dap and enforce these\n\n- \"request\\_id\" (better name?) can't be required because some things don't\n  happen in a per-request context. Startup and background processing stuff\n  for example. Tho for request-y things, it is strongly encouraged because it\n  allows collating logs from multiple services for the same request.\n\n\n# Streams\n\nA \"stream\" is Bunyan's name for an output for log messages. It expects a\n[Writable Stream](http://nodejs.org/docs/latest/api/all.html#writable_Stream)\ninterface. See above for some examples of specifying streams. Supported streams\nare:\n\n- A writable \"stream\". Often this is one of the std handles (`process.stdout` or\n  `process.stderr`), but it can be anything you want supporting the node\n  writable stream interface, e.g. `fs.createWriteStream`.\n- A file. Will append to the given \"path\". \n\n\n# License\n\nMIT.\n\n","maintainers":[{"name":"trentm","email":"trentm@gmail.com"}],"time":{"modified":"2012-08-14T03:16:13.668Z","created":"2012-02-02T23:01:57.171Z","0.1.0":"2012-02-02T23:01:58.548Z","0.2.0":"2012-02-04T01:05:29.710Z","0.3.0":"2012-02-05T05:43:03.645Z","0.4.0":"2012-02-06T04:34:38.293Z","0.5.0":"2012-02-06T23:27:48.404Z","0.5.1":"2012-02-07T05:35:37.080Z","0.5.2":"2012-02-08T18:30:34.812Z","0.5.3":"2012-02-08T23:28:15.344Z","0.6.0":"2012-02-10T05:10:50.477Z","0.6.1":"2012-02-10T08:16:21.270Z","0.6.2":"2012-02-11T05:52:10.111Z","0.6.3":"2012-02-17T00:54:08.175Z","0.6.4":"2012-02-20T05:42:55.894Z","0.6.5":"2012-02-23T21:01:22.059Z","0.6.6":"2012-02-24T05:20:56.246Z","0.6.7":"2012-02-24T20:20:03.175Z","0.6.8":"2012-02-28T00:48:20.959Z","0.6.9":"2012-04-27T23:16:28.526Z","0.7.0":"2012-04-27T23:21:21.617Z","0.8.0":"2012-06-05T06:31:07.635Z","0.9.0":"2012-06-22T03:06:07.542Z","0.10.0":"2012-06-22T05:49:21.548Z","0.11.0":"2012-08-08T05:36:37.712Z","0.11.1":"2012-08-08T18:58:39.296Z","0.11.2":"2012-08-09T05:28:36.463Z","0.11.3":"2012-08-09T16:30:29.310Z","0.12.0":"2012-08-13T23:43:56.355Z","0.13.0":"2012-08-14T03:16:13.668Z"},"description":"a JSON Logger library for node.js services","repository":{"type":"git","url":"git://github.com/trentm/node-bunyan.git"},"author":{"name":"Trent Mick","email":"trentm@gmail.com","url":"http://trentm.com"},"users":{"pureppl":true,"fgribreau":true,"sjonnet19":true},"_attachments":{"bunyan-0.13.0.tgz":{"content_type":"application/octet-stream","revpos":106,"digest":"md5-6A00BMpNub+iMmLNS6Znkg==","length":154520,"stub":true},"bunyan-0.12.0.tgz":{"content_type":"application/octet-stream","revpos":104,"digest":"md5-FER9TTb3MYl4NErqhHm6Hg==","length":154885,"stub":true},"bunyan-0.11.3.tgz":{"content_type":"application/octet-stream","revpos":102,"digest":"md5-4bVLtupdxwpF2l5a5Ksvlg==","length":154565,"stub":true},"bunyan-0.11.2.tgz":{"content_type":"application/octet-stream","revpos":100,"digest":"md5-FuKOxYWpzfQF0VdrHef/7Q==","length":154311,"stub":true},"bunyan-0.11.0.tgz":{"content_type":"application/octet-stream","revpos":94,"digest":"md5-Jaxc18eSVBkicXCrAcc15g==","length":156446,"stub":true},"bunyan-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":90,"digest":"md5-PCHR7zbLFcL3xkX08ZH0zg==","length":51206,"stub":true},"bunyan-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":88,"digest":"md5-OuVBaOlr4/Ds6gCTCMZMlQ==","length":50635,"stub":true},"bunyan-0.8.0.tgz":{"content_type":"application/octet-stream","revpos":86,"digest":"md5-sM9+30DOeLE5gspUVIsXFw==","length":44875,"stub":true},"bunyan-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":83,"digest":"md5-PVJ4coYkwq4BbfooCInOUw==","length":45578,"stub":true},"bunyan-0.6.9.tgz":{"content_type":"application/octet-stream","revpos":81,"digest":"md5-d1p0Mh3EwpHU5MdqBsSJ6g==","length":45317,"stub":true},"bunyan-0.6.8.tgz":{"content_type":"application/octet-stream","revpos":79,"digest":"md5-JnK2lIkixK+ujEFiduvV+A==","length":42188,"stub":true},"bunyan-0.6.7.tgz":{"content_type":"application/octet-stream","revpos":77,"digest":"md5-GF1B1YIJjyIso8ktpjNfAQ==","length":41866,"stub":true},"bunyan-0.6.6.tgz":{"content_type":"application/octet-stream","revpos":75,"digest":"md5-ciiB/AldQcz01SUel9w7sw==","length":41819,"stub":true},"bunyan-0.6.5.tgz":{"content_type":"application/octet-stream","revpos":73,"digest":"md5-TECmAAGwiADqesA51ljW1g==","length":40334,"stub":true},"bunyan-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":71,"digest":"md5-7yfEZTkRpAxlhOMhF10slQ==","length":39541,"stub":true},"bunyan-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":69,"digest":"md5-g14SabYGBR65UWNdrUaraw==","length":39065,"stub":true},"bunyan-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":67,"digest":"md5-qxLIunzZUxDisUH4D3wl9A==","length":38647,"stub":true},"bunyan-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-FUzfCDGayaAu7oK74XPInQ==","length":2088960,"stub":true},"bunyan-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-HiOHv9IVRi/kOkXV8xhw0Q==","length":2078720,"stub":true},"bunyan-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-qoiYfqK5bBPqj+/OdCu6WA==","length":2078720,"stub":true},"bunyan-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-bv8L1O4vms2bOztoTwdWKA==","length":692234,"stub":true},"bunyan-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-G3+L5jpN1+fct9VNCxyG4A==","length":59304,"stub":true},"bunyan-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-n+emCs17DzHDH3v0snOLoQ==","length":61440,"stub":true},"bunyan-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-S9A/FhD5ucwZmosZCTgQ4w==","length":61440,"stub":true},"bunyan-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-V9EnIF+TkZ6FFcwdBGw61Q==","length":54979,"stub":true},"bunyan-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Bx+KjUReLoLnxyD1vXfOJA==","length":53005,"stub":true},"bunyan-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Bhxm1s3wcQhseXm1iqoRFA==","length":51200,"stub":true}}}},
{"id":"bunyan-socket","key":"bunyan-socket","value":{"rev":"9-0b4c813aec5af50f6c7d91e9c1002817"},"doc":{"_id":"bunyan-socket","_rev":"9-0b4c813aec5af50f6c7d91e9c1002817","name":"bunyan-socket","description":"Bundle up all of your bunyan log messages by streaming them to one bunyan-server.","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.0":{"name":"bunyan-socket","version":"0.0.0","description":"Bundle up all of your bunyan log messages by streaming them to one bunyan-server.","author":{"name":"Oliver Leics","email":"oliver.leics@gmail.com"},"repository":{"type":"git","url":"git://github.com/oleics/node-bunyan-socket.git"},"bugs":{"url":"https://github.com/oleics/node-bunyan-socket/issues"},"keywords":["bunyan","log","logger","server","stream"],"main":"./lib/client.js","bin":{"bunyan-server":"./bin/bunyan-server","bunyan-listener":"./bin/bunyan-listener"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"bunyan":"0.6.x","lazy":"1.0.x"},"_npmUser":{"name":"pureppl","email":"pureppl@gmail.com"},"_id":"bunyan-socket@0.0.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"508cb41895a0dc56633e0173e4768e3ad1ce92de","tarball":"http://registry.npmjs.org/bunyan-socket/-/bunyan-socket-0.0.0.tgz"},"maintainers":[{"name":"pureppl","email":"pureppl@gmail.com"}]},"0.0.1":{"name":"bunyan-socket","version":"0.0.1","description":"Bundle up all of your bunyan log messages by streaming them to one bunyan-server.","author":{"name":"Oliver Leics","email":"oliver.leics@gmail.com"},"repository":{"type":"git","url":"git://github.com/oleics/node-bunyan-socket.git"},"bugs":{"url":"https://github.com/oleics/node-bunyan-socket/issues"},"keywords":["bunyan","log","logger","server","stream"],"main":"./lib/client.js","bin":{"bunyan-server":"./bin/bunyan-server","bunyan-listener":"./bin/bunyan-listener"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"bunyan":"0.6.x","lazy":"1.0.x"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pureppl","email":"pureppl@gmail.com"},"_id":"bunyan-socket@0.0.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"7c7f75a4e044a765f973a7e020eb8c69b98b4339","tarball":"http://registry.npmjs.org/bunyan-socket/-/bunyan-socket-0.0.1.tgz"},"maintainers":[{"name":"pureppl","email":"pureppl@gmail.com"}]},"0.0.2":{"name":"bunyan-socket","version":"0.0.2","description":"Bundle up all of your bunyan log messages by streaming them to one bunyan-server.","author":{"name":"Oliver Leics","email":"oliver.leics@gmail.com"},"repository":{"type":"git","url":"git://github.com/oleics/node-bunyan-socket.git"},"bugs":{"url":"https://github.com/oleics/node-bunyan-socket/issues"},"keywords":["bunyan","log","logger","server","stream"],"main":"./lib/client.js","bin":{"bunyan-server":"./bin/bunyan-server","bunyan-listener":"./bin/bunyan-listener"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"bunyan":"0.6.x","lazy":"1.0.x"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pureppl","email":"pureppl@gmail.com"},"_id":"bunyan-socket@0.0.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"179f345da627919aa813164e72f72ff54a32da72","tarball":"http://registry.npmjs.org/bunyan-socket/-/bunyan-socket-0.0.2.tgz"},"maintainers":[{"name":"pureppl","email":"pureppl@gmail.com"}]},"0.0.3":{"name":"bunyan-socket","version":"0.0.3","description":"Bundle up all of your bunyan log messages by streaming them to one bunyan-server.","author":{"name":"Oliver Leics","email":"oliver.leics@gmail.com"},"repository":{"type":"git","url":"git://github.com/oleics/node-bunyan-socket.git"},"bugs":{"url":"https://github.com/oleics/node-bunyan-socket/issues"},"keywords":["bunyan","log","logger","server","stream"],"main":"./lib/client.js","bin":{"bunyan-server":"./bin/bunyan-server","bunyan-listener":"./bin/bunyan-listener"},"directories":{"lib":"./lib"},"engines":{"node":">= 0.6.0"},"dependencies":{"bunyan":"0.6.x","lazy":"1.0.x"},"devDependencies":{},"optionalDependencies":{},"_npmUser":{"name":"pureppl","email":"pureppl@gmail.com"},"_id":"bunyan-socket@0.0.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"16a0a65b99c120003cc90ff9ca0858f54f825adc","tarball":"http://registry.npmjs.org/bunyan-socket/-/bunyan-socket-0.0.3.tgz"},"maintainers":[{"name":"pureppl","email":"pureppl@gmail.com"}]}},"readme":"\nBunyan Socket\n=============\n\nBundle up all of your [bunyan](https://github.com/trentm/node-bunyan) log messages by streaming them to one bunyan-server.\n\nInstallation\n------------\n\n``npm install -g bunyan-socket``\n\nUsage Examples\n--------------\n\n### Start the server\n\n``bunyan-server``\n\n### Create a logger\n\nMake sure to install bunyan-socket via npm inside your project-  \ndirectory:\n```sh\ncd path/to/your/project\nnpm install bunyan-socket\n```\n\nThen, in your app.js:\n\n```js\nvar log = require('bunyan-socket')('OnePartOfMyApp')\n\n// log is an instance of a bunyan-logger\nlog.info('hello!') // log-message goes to the bunyan-server\n```\n\nAnd in - for example - in boom.js:\n\n```js\nvar log = require('bunyan-socket')('AnotherPartOfMyApp')\nlog.info('hello!')\n\nvar sublog = log.child({component: 'SubPart'})\nsublog.debug(process)\n```\n\nEverything you log will go now to the bunyan-server.\n\nThe messages will be buffered if the server is temporarily down.\n\n### Listen to the bunyan-server\n\nRead the logs of all our process as a real-time-stream:\n\n``bunyan-listener``\n\nFor all you humans with nice colors:\n\n``bunyan-listener | bunyan``\n\n#### Programmatically listen to the bunyan-server\n\n```js\nvar listener = require('bunyan-socket/listener')(port, host)\n\nlistener\n  .on('connection', function(conn) {\n    log.info('connection', conn.remoteAddress, conn.remotePort, conn.address())\n  })\n  .on('close', function(conn) {\n    log.info('close')\n  })\n  .on('data', function(d) {\n    process.stdout.write(d.toString())\n  })\n```\n\nMIT License\n-----------\n\nCopyright (c) 2012 Oliver Leics <oliver.leics@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","maintainers":[{"name":"pureppl","email":"pureppl@gmail.com"}],"time":{"modified":"2012-05-28T13:16:21.268Z","created":"2012-05-14T20:33:29.617Z","0.0.0":"2012-05-14T20:33:30.973Z","0.0.1":"2012-05-15T20:36:23.383Z","0.0.2":"2012-05-19T22:29:28.583Z","0.0.3":"2012-05-28T13:16:21.268Z"},"author":{"name":"Oliver Leics","email":"oliver.leics@gmail.com"},"repository":{"type":"git","url":"git://github.com/oleics/node-bunyan-socket.git"},"_attachments":{"bunyan-socket-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-MEO+7iZzZTtQflpyX3Y1bA==","length":3852,"stub":true},"bunyan-socket-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-H/IuQM1huyXoTVmulZpgJQ==","length":3835,"stub":true},"bunyan-socket-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mt58GTFFgaie9nxhN7NQ4w==","length":3832,"stub":true},"bunyan-socket-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iwvjUgogu2RT1MAGpUM+TA==","length":3822,"stub":true}}}},
{"id":"bunyip","key":"bunyip","value":{"rev":"10-2ab733c2b90c79770ceae40e3bb284b6"},"doc":{"_id":"bunyip","_rev":"10-2ab733c2b90c79770ceae40e3bb284b6","name":"bunyip","description":"Automate client-side unit testing in real browsers using the cli","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"bunyip","description":"Automate client-side unit testing in real browsers using the cli","version":"0.1.0","homepage":"http://ryanseddon.github.com/bunyip","author":{"name":"Ryan Seddon","url":"http://www.thecssninja.com/"},"repository":{"type":"git","url":"git://github.com:ryanseddon/bunyip.git"},"bugs":{"url":"https://github.com/ryanseddon/bunyip/issues"},"licenses":[{"type":"MIT","url":"http://ryanseddon.github.com/bunyip/blob/master/LICENSE-MIT"}],"main":"lib/bunyip","bin":{"bunyip":"./cli.js"},"engines":{"node":"~0.6.18"},"scripts":{"test":"vows test/*.js"},"dependencies":{"commander":"0.6.x","browserstack":"0.1.x","yeti":"0.2.x"},"devDependencies":{"grunt":"~0.3.9","cli-easy":"0.1.x","vows":">= 0.5.8","mockery":">= 1.1.2"},"keywords":[],"_npmUser":{"name":"ryanseddon","email":"seddon.ryan@gmail.com"},"_id":"bunyip@0.1.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"8aa3552ffb9e76f4add11db15c612d8dda7b3fc5","tarball":"http://registry.npmjs.org/bunyip/-/bunyip-0.1.0.tgz"},"maintainers":[{"name":"ryanseddon","email":"seddon.ryan@gmail.com"}]},"0.1.1":{"name":"bunyip","description":"Automate client-side unit testing in real browsers using the cli","version":"0.1.1","homepage":"http://ryanseddon.github.com/bunyip","author":{"name":"Ryan Seddon","url":"http://www.thecssninja.com/"},"repository":{"type":"git","url":"git://github.com:ryanseddon/bunyip.git"},"bugs":{"url":"https://github.com/ryanseddon/bunyip/issues"},"licenses":[{"type":"MIT","url":"http://ryanseddon.github.com/bunyip/blob/master/LICENSE-MIT"}],"main":"lib/bunyip","bin":{"bunyip":"./cli.js"},"engines":{"node":"~0.6.18"},"scripts":{"test":"vows test/*.js"},"dependencies":{"commander":"0.6.x","browserstack":"0.1.x","yeti":"0.2.x"},"devDependencies":{"grunt":"~0.3.9","cli-easy":"0.1.x","vows":">= 0.5.8","mockery":">= 1.1.2"},"keywords":["unit tests","bunyip","browserstack","mobile","cli"],"_npmUser":{"name":"ryanseddon","email":"seddon.ryan@gmail.com"},"_id":"bunyip@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7db05bea17949fdd4811793574a95872b7adbe8d","tarball":"http://registry.npmjs.org/bunyip/-/bunyip-0.1.1.tgz"},"maintainers":[{"name":"ryanseddon","email":"seddon.ryan@gmail.com"}]},"0.1.2":{"name":"bunyip","description":"Automate client-side unit testing in real browsers using the cli","version":"0.1.2","homepage":"http://ryanseddon.github.com/bunyip","author":{"name":"Ryan Seddon","url":"http://www.thecssninja.com/"},"repository":{"type":"git","url":"git://github.com:ryanseddon/bunyip.git"},"bugs":{"url":"https://github.com/ryanseddon/bunyip/issues"},"licenses":[{"type":"MIT","url":"http://ryanseddon.github.com/bunyip/blob/master/LICENSE-MIT"}],"main":"lib/bunyip","bin":{"bunyip":"./cli.js"},"engines":{"node":"~0.8.x"},"scripts":{"test":"vows test/*.js"},"dependencies":{"commander":"0.6.x","browserstack":"0.1.x","yeti":"0.2.x"},"devDependencies":{"grunt":"~0.3.9","cli-easy":"0.1.x","vows":">= 0.5.8","mockery":">= 1.1.2"},"keywords":["unit tests","bunyip","browserstack","mobile","cli"],"readme":"# bunyip\n\nAutomate client-side unit testing in real browsers using the CLI\n\n## Getting Started\nInstall the module with: `npm install -g bunyip`. This is a CLI tool so it needs to be globally installed.\n\n### BrowserStack account\nIn order for bunyip to flex its real muscle I recommend you get a paid [BrowserStack account](http://www.browserstack.com/pricing) as all paid accounts have access to their API. Without the API you'll need to connect your own slave browsers to bunyip.\n\n### localhost sharing service\nIf you wish to test on devices that are not part of your local network you'll be required to setup a tunneling service. I recommend [pagekite](https://pagekite.net/support/quickstart/) as it gives you a nice free chunk of data and allows you to specify a reusable subdomain. [Showoff.io](https://showoff.io/) is another good option.\n\n### Setup the config.js file\nIf you don't wish to use BrowserStack or a localhost sharing service you can skip this step. If you look inside the lib folder you'll see a `config-template.js` file, copy it and rename to config.js. Edit the values to whatever you need it to be.\n\n```js\nvar config = config || {};\n\nconfig.browserstack = {\n\tusername: \"foo\", // Your BrowserStack username\n\tpassword: \"bar\", // Your BrowserStack password\n\tversion: 2\n};\n\n// The tunneling service I use is https://pagekite.net/support/quickstart/ \n// You can easily use another service lke showoff.io only requirement is that you can specify a fixed url name\nconfig.port = \" 9000 \";\nconfig.tunnellink = \"bunyip.pagekite.me/\"; // The subdomain that the tunnel can be access by\n// This is the command that nodejs will execute using child_process.exec\n// If you were using showoff.io the below command would be \"show\" + config.port\nconfig.tunnel = \"pagekite.py\" + config.port + config.tunnellink;\n\nmodule.exports = config;\n```\n\n_(Can this be done in an easier fashion? Do a pull request!)_\n\n## Test suite adaptors\n\nBehind the scenes bunyip uses a tool called Yeti unfortunately Yeti only works with YUI Test. However I have written some [adaptors](https://github.com/ryanseddon/yeti-adaptors) for QUnit and jasmine, go check out my other repo for examples on using them with your current test suites.\n\nIf you use another client-side testsuite please feel free to contribute it to my [yeti-adaptors](https://github.com/ryanseddon/yeti-adaptors) repo.\n\n## Examples\n\n```bash\nbunyip -f index.html\n```\n\nThe above command will launch a simple Yeti hub on port 9000 and use the `index.html` inside your current working directory.\n\n```bash\nbunyip -f index.html -p 1337\n```\n\nThis will change the port that is used. The global config value will be updated for you so don't worry.\n\n### BrowserStack workers\n\n```bash\nbunyip -f index.html -b ios\n```\n\nAssuming you have a BrowserStack paid account and have setup a localhost sharing service the `-b ios` will send off a command to launch all iOS devices (3 iPhones and 3 iPads) on BrowserStack and once they're connected you can run your test suite.\n\n```bash\nbunyip -s\n```\n\nThis will query the BrowserStack API for any device or browsers that are currently running on your account.\n\n```bash\nbunyip -k <id> or all\n```\n\nIf you no longer need a specific worker or you wish to destroy all of them you can either specify a single worker id or `all` and it will destroy said worker(s).\n\n```bash\nbunyip -h\n```\n\nFor more info specify the help flag to get more info about each command flag available.\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt](https://github.com/cowboy/grunt).\n\n## Release History\n_(Nothing yet)_\n\n## License\nCopyright (c) 2012 Ryan Seddon  \nLicensed under the MIT license.\n","_id":"bunyip@0.1.2","dist":{"shasum":"f5c97f53280614f25d31bd8e6564efbe1ac1c1f3","tarball":"http://registry.npmjs.org/bunyip/-/bunyip-0.1.2.tgz"},"maintainers":[{"name":"ryanseddon","email":"seddon.ryan@gmail.com"}]},"0.1.3":{"name":"bunyip","description":"Automate client-side unit testing in real browsers using the cli","version":"0.1.3","homepage":"http://ryanseddon.github.com/bunyip","author":{"name":"Ryan Seddon","url":"http://www.thecssninja.com/"},"repository":{"type":"git","url":"git://github.com:ryanseddon/bunyip.git"},"bugs":{"url":"https://github.com/ryanseddon/bunyip/issues"},"licenses":[{"type":"MIT","url":"http://ryanseddon.github.com/bunyip/blob/master/LICENSE-MIT"}],"main":"lib/bunyip","bin":{"bunyip":"./cli.js"},"engines":{"node":"~0.8.x"},"scripts":{"test":"vows test/*.js"},"dependencies":{"commander":"0.6.x","browserstack":"0.1.x","yeti":"0.2.x"},"devDependencies":{"grunt":"~0.3.9","cli-easy":"0.1.x","vows":">= 0.5.8","mockery":">= 1.1.2"},"keywords":["unit tests","bunyip","browserstack","mobile","cli"],"readme":"# bunyip\n\nAutomate client-side unit testing in real browsers using the CLI\n\n## Getting Started\nInstall the module with: `npm install -g bunyip`. This is a CLI tool so it needs to be globally installed.\n\n### BrowserStack account\nIn order for bunyip to flex its real muscle I recommend you get a paid [BrowserStack account](http://www.browserstack.com/pricing) as all paid accounts have access to their API. Without the API you'll need to connect your own slave browsers to bunyip.\n\n### localhost sharing service\nIf you wish to test on devices that are not part of your local network you'll be required to setup a tunneling service. I recommend [pagekite](https://pagekite.net/support/quickstart/) as it gives you a nice free chunk of data and allows you to specify a reusable subdomain. [Showoff.io](https://showoff.io/) is another good option.\n\n### Setup the config.js file\nIf you don't wish to use BrowserStack or a localhost sharing service you can skip this step.\n\nTo generate a config file you can run this command:\n\n`bunyip config path/to/config.js`\n\nThis will take you through a multistep process to setup your username, password, tunnel url and tunnel command.\n\nSo I if wanted to save a config file to my home directory I would do the following.\n\n`bunyip config ~/config.js`\n\n### Specify config file to use\n\nIf I want to specify a specific config file to use the `-c, --cdir` flag lets you do that.\n\n`bunyip -f test/tests.html -c path/to/config.js`\n\nIf you do not specify a config file to use it will look in your current working directory for a file name `config.js` otherwise it will not require one in.\n\n## Test suite adaptors\n\nBehind the scenes bunyip uses a tool called Yeti unfortunately Yeti only works with YUI Test. However I have written some [adaptors](https://github.com/ryanseddon/yeti-adaptors) for QUnit and jasmine, go check out my other repo for examples on using them with your current test suites.\n\nIf you use another client-side testsuite please feel free to contribute it to my [yeti-adaptors](https://github.com/ryanseddon/yeti-adaptors) repo.\n\n## Examples\n\n```bash\nbunyip -f index.html\n```\n\nThe above command will launch a simple Yeti hub on port 9000 and use the `index.html` inside your current working directory.\n\n```bash\nbunyip -f index.html -p 1337\n```\n\nThis will change the port that is used. The global config value will be updated for you so don't worry.\n\n### BrowserStack workers\n\n```bash\nbunyip -f index.html -b ios\n```\n\nAssuming you have a BrowserStack paid account and have setup a localhost sharing service the `-b ios` will send off a command to launch all iOS devices (3 iPhones and 3 iPads) on BrowserStack and once they're connected you can run your test suite.\n\n```bash\nbunyip -s\n```\n\nThis will query the BrowserStack API for any device or browsers that are currently running on your account.\n\n```bash\nbunyip -k <id> or all\n```\n\nIf you no longer need a specific worker or you wish to destroy all of them you can either specify a single worker id or `all` and it will destroy said worker(s).\n\n```bash\nbunyip -h\n```\n\nFor more info specify the help flag to get more info about each command flag available.\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt](https://github.com/cowboy/grunt).\n\n## Release History\n_(Nothing yet)_\n\n## License\nCopyright (c) 2012 Ryan Seddon  \nLicensed under the MIT license.\n","_id":"bunyip@0.1.3","dist":{"shasum":"4713676d85d45d50753660883f67da80ad61f9cd","tarball":"http://registry.npmjs.org/bunyip/-/bunyip-0.1.3.tgz"},"maintainers":[{"name":"ryanseddon","email":"seddon.ryan@gmail.com"}]}},"readme":"# bunyip\r\n\r\nAutomate client-side unit testing in real browsers using the CLI\r\n\r\n## Getting Started\r\nInstall the module with: `npm install -g bunyip`. This is a CLI tool so it needs to be globally installed.\r\n\r\n### BrowserStack account\r\nIn order for bunyip to flex its real muscle I recommend you get a paid [BrowserStack account])(http://www.browserstack.com/pricing) as all paid accounts have access to their API. Without the API you'll need to connect your own slave browsers to bunyip.\r\n\r\n### localhost sharing service\r\nIf you wish to test on devices that are not part of your local network you'll be required to setup a tunneling service. I recommend [pagekite](https://pagekite.net/support/quickstart/) as it gives you a nice free chunk of data and allows you to specify a reusable subdomain. [Showoff.io](https://showoff.io/) is another good option.\r\n\r\n### Setup the config.js file\r\nIf you don't wish to use BrowserStack or a localhost sharing service you can skip this step. If you look inside the lib folder you'll see a `config-template.js` file, copy it and rename to config.js. Edit the values to whatever you need it to be.\r\n\r\n```js\r\nvar config = config || {};\r\n\r\nconfig.browserstack = {\r\n\tusername: \"foo\", // Your BrowserStack username\r\n\tpassword: \"bar\", // Your BrowserStack password\r\n\tversion: 2\r\n};\r\n\r\n// The tunneling service I use is https://pagekite.net/support/quickstart/ \r\n// You can easily use another service lke showoff.io only requirement is that you can specify a fixed url name\r\nconfig.port = \" 9000 \";\r\nconfig.tunnellink = \"bunyip.pagekite.me/\"; // The subdomain that the tunnel can be access by\r\n// This is the command that nodejs will execute using child_process.exec\r\n// If you were using showoff.io the below command would be \"show\" + config.port\r\nconfig.tunnel = \"pagekite.py\" + config.port + config.tunnellink;\r\n\r\nmodule.exports = config;\r\n```\r\n\r\n_(Can this be done in an easier fashion? Do a pull request!)_\r\n\r\n## Test suite adaptors\r\n\r\nBehind the scenes bunyip uses a tool called Yeti unfortunately Yeti only works with YUI Test. However I have written some [adaptors](https://github.com/ryanseddon/yeti-adaptors) for QUnit and jasmine, go check out my other repo for examples on using them with your current test suites.\r\n\r\nIf you use another client-side testsuite please feel free to contribute it to my [yeti-adaptors](https://github.com/ryanseddon/yeti-adaptors) repo.\r\n\r\n## Examples\r\n\r\n```bash\r\nbunyip -f index.html\r\n```\r\n\r\nThe above command will launch a simple Yeti hub on port 9000 and use the `index.html` inside your current working directory.\r\n\r\n```bash\r\nbunyip -f index.html -p 1337\r\n```\r\n\r\nThis will change the port that is used. The global config value will be updated for you so don't worry.\r\n\r\n### BrowserStack workers\r\n\r\n```bash\r\nbunyip -f index.html -b ios\r\n```\r\n\r\nAssuming you have a BrowserStack paid account and have setup a localhost sharing service the `-b ios` will send off a command to launch all iOS devices (3 iPhones and 3 iPads) on BrowserStack and once they're connected you can run your test suite.\r\n\r\n```bash\r\nbunyip -s\r\n```\r\n\r\nThis will query the BrowserStack API for any device or browsers that are currently running on your account.\r\n\r\n```bash\r\nbunyip -k <id> or all\r\n```\r\n\r\nIf you no longer need a specific worker or you wish to destroy all of them you can either specify a single worker id or `all` and it will destroy said worker(s).\r\n\r\n```bash\r\nbunyip -h\r\n```\r\n\r\nFor more info specify the help flag to get more info about each command flag available.\r\n\r\n## Contributing\r\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt](https://github.com/cowboy/grunt).\r\n\r\n## Release History\r\n_(Nothing yet)_\r\n\r\n## License\r\nCopyright (c) 2012 Ryan Seddon  \r\nLicensed under the MIT license.\r\n","maintainers":[{"name":"ryanseddon","email":"seddon.ryan@gmail.com"}],"time":{"modified":"2012-08-06T15:27:24.755Z","created":"2012-06-03T02:32:05.647Z","0.1.0":"2012-06-03T02:32:13.930Z","0.1.1":"2012-06-03T02:33:33.827Z","0.1.2":"2012-06-30T00:55:26.642Z","0.1.3":"2012-07-15T02:30:09.748Z"},"author":{"name":"Ryan Seddon","url":"http://www.thecssninja.com/"},"repository":{"type":"git","url":"git://github.com:ryanseddon/bunyip.git"},"users":{"sjonnet19":true},"_attachments":{"bunyip-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-60sVA4aQ9E7BR04OG4pGHA==","length":6449,"stub":true},"bunyip-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-+s36wFEq4hcWHTInb4gxww==","length":5865,"stub":true},"bunyip-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-KexWo8yFiy9IseyOgQKK7Q==","length":6624,"stub":true},"bunyip-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-bD2+xD7t7uhcs0fqmXz31g==","length":6604,"stub":true}}}},
{"id":"burari","key":"burari","value":{"rev":"11-08b61073d6ad0ef0c7449a574dc8f54b"},"doc":{"_id":"burari","_rev":"11-08b61073d6ad0ef0c7449a574dc8f54b","name":"burari","description":"A JavaScript EJS Files to avoid too much client-side js wrappers.","dist-tags":{"latest":"0.0.0"},"versions":{"0.0.1":{"name":"burari","description":"A JavaScript Avoiding Client-Side Wrapper Script System","version":"0.0.1","author":{"name":"yuitest","email":"yuitest@cjhat.net"},"keywords":["template","engine","ejs"],"main":"./index.js","dependencies":{"ejs":">= 0.4.3","useragent":">= 0.1.2"},"devDependencies":{},"_id":"burari@0.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"13e3169448d240986d340d81dff73449df4c9b26","tarball":"http://registry.npmjs.org/burari/-/burari-0.0.1.tgz"},"scripts":{},"directories":{}},"0.0.2":{"name":"burari","description":"A JavaScript Avoiding Client-Side Wrapper Script System","version":"0.0.2","author":{"name":"yuitest","email":"yuitest@cjhat.net"},"keywords":["template","engine","ejs"],"main":"./index.js","dependencies":{"ejs":">= 0.4.3","useragent":">= 0.1.2"},"devDependencies":{},"_id":"burari@0.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"8aab20f9b33d4f4c5852679835f44a8317f9b223","tarball":"http://registry.npmjs.org/burari/-/burari-0.0.2.tgz"},"scripts":{}},"0.0.0":{"author":{"name":"yuitest","email":"yuitest@cjhat.net","url":"http://cjhat.net/"},"name":"burari","description":"A JavaScript EJS Files to avoid too much client-side js wrappers.","version":"0.0.0","repository":{"url":""},"main":"./index.js","dependencies":{"ejs":">= 0.4.3","useragent":">= 0.1.2"},"devDependencies":{},"_id":"burari@0.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.3","_nodeVersion":"v0.4.9","_defaultsLoaded":true,"dist":{"shasum":"4ff48aa7bec79f986823ec4bb8d62aedea219584","tarball":"http://registry.npmjs.org/burari/-/burari-0.0.0.tgz"},"scripts":{}}},"maintainers":[{"name":"yuitest","email":"yuitest@cjhat.net"}],"time":{"modified":"2011-07-27T00:28:18.807Z","created":"2011-07-26T23:48:59.206Z","0.0.1":"2011-07-26T23:49:00.640Z","0.0.2":"2011-07-26T23:51:27.175Z","0.0.0":"2011-07-27T00:28:18.807Z"},"author":{"name":"yuitest","email":"yuitest@cjhat.net","url":"http://cjhat.net/"},"repository":{"url":""},"_attachments":{"burari-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-fDwkg1kK+H+Eo6BdD0R/1w==","length":1128,"stub":true},"burari-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-KZ6Q0Tq/n6S30JQI4df+cA==","length":1119,"stub":true},"burari-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0iADehwS7IYucxmSuG6nPA==","length":1119,"stub":true}}}},
{"id":"burnout","key":"burnout","value":{"rev":"5-1ae49d05e5e03b399b1ce31f8b8690d3"},"doc":{"_id":"burnout","_rev":"5-1ae49d05e5e03b399b1ce31f8b8690d3","name":"burnout","description":"Burnout is a asynchronous, chainable Selenium 2 WebDriver interface.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"author":{"name":"Chris Joel","email":"chris@scriptolo.gy","url":"http://scriptolo.gy"},"name":"burnout","description":"Burnout is a asynchronous, chainable Selenium 2 WebDriver interface.","version":"0.0.1","main":"./lib/burnout.js","repository":{"type":"git","url":"git://github.com/cdata/burnout.git"},"dependencies":{"q":"~0.8","wd":"0.0.12","request":"~2.9"},"engines":{"node":"~0.6"},"_npmUser":{"name":"cdata","email":"chris@scriptolo.gy"},"_id":"burnout@0.0.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"2cc91ddf1d4f7da57740add6e79284845d0fc073","tarball":"http://registry.npmjs.org/burnout/-/burnout-0.0.1.tgz"},"maintainers":[{"name":"cdata","email":"chris@scriptolo.gy"}]},"0.0.2":{"author":{"name":"Chris Joel","email":"chris@scriptolo.gy","url":"http://scriptolo.gy"},"name":"burnout","description":"Burnout is a asynchronous, chainable Selenium 2 WebDriver interface.","version":"0.0.2","main":"./lib/burnout.js","repository":{"type":"git","url":"git://github.com/cdata/burnout.git"},"dependencies":{"q":"~0.8","wd":"0.0.17","request":"~2.9"},"engines":{"node":"~0.6"},"_npmUser":{"name":"cdata","email":"chris@scriptolo.gy"},"_id":"burnout@0.0.2","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"8850e85a5186efd02d4232baf57d98d5681f50c3","tarball":"http://registry.npmjs.org/burnout/-/burnout-0.0.2.tgz"},"maintainers":[{"name":"cdata","email":"chris@scriptolo.gy"}]}},"readme":"# Burnout\n\nBurnout is an asynchronous, chainable and DRY interface for building Selenium 2 WebDriver scripts in Node. It was written primarily for interfacing with Sauce Labs, but it should work with most Selenium 2 setups. Burnout builds on top of the excellent Selenium 2 WebDriver library [wd][1].\n\n## Installing\n\n```sh\nnpm install burnout\n```\n\n## Using\n\nBurnout's API strives to map as closely as possible to the interface exposed by [wd][1], which in turn maps closely to the Selenium [JSON Wire Protocol][2].\n\nAn example test:\n\n```javascript\nvar burnout = require('burnout'),\n    assert = require('assert'); // Your assertion utility of choice here\n\nburnout\n    .initialize({ \n        name: \"CloudFlare - Rocket Loader Optimization\" // Test name\n    })\n    // Start chaining commands..\n    .eval(\"document.title\", function(title) {\n    \n        assert(title == '');\n    })\n    // Chained commands are guaranteed to run synchronously\n    .elementByCss(\"#NextPageLink\", function(link) {\n\n        // The context of callbacks can be used to promise sub-commands\n        return this.moveTo(link, 2, 2, function() {\n\n            return this.click(link)\n        });\n    })\n    // End the test. Status automatically posted to Sauce Labs.\n    .quit();\n```\n\n## API\n\nThese are the methods currently exposed by Burnout:\n\n```javascript\nvar seleniumMethods = [\n    'init',\n    'get',\n    'eval',\n    'element',\n    'elementById',\n    'elementByName',\n    'elementByCss',\n    'getAttribute',\n    'execute',\n    'executeAsync',\n    'click',\n    'doubleClick',\n    'close',\n    'setImplicitWaitTimeout',\n    'setAsyncScriptTimeout',\n    'moveTo',\n    'scroll',\n    'text',\n    'buttonDown',\n    'buttonUp',\n    'active',\n    'keyToggle'\n];\n```\n\n## Browsers\n\nBurnout uses a hardcoded selection of browsers when running tests. Exclusions to this selection are currently supported, but not additions. This will change as I get a feel for how people are using the library, but for my immediate purposes I wanted tests to be inclusive by default.\n\nThese are the browsers that Burnout tests by default:\n\n```javascript\nvar seleniumBrowsers = [\n    {\n        browserName: \"googlechrome\"\n    },\n    {\n        browserName: \"firefox\",\n        version: \"11\",\n        platform: \"XP\"\n    },\n    {\n        browserName: \"firefox\",\n        version: \"3.6\",\n        platform: \"XP\"\n    },\n    {\n        browserName: \"iexplore\",\n        version: \"6\",\n        platform: \"XP\"\n    },\n    {\n        browserName: \"iexplore\",\n        version: \"7\",\n        platform: \"XP\"\n    },\n    {\n        browserName: \"iexplore\",\n        version: \"8\",\n        platform: \"XP\"\n    },\n    {\n        browserName: \"iexplore\",\n        version: \"9\"\n    },\n    {\n        browserName: \"opera\",\n        version: \"11\",\n        platform: \"LINUX\"\n    }\n];\n```\n\nIf you want to exclude specific browsers from you test, you can specify them when you initialize Burnout:\n\n```javascript\nburnout\n    .initialize({\n        name: \"Foo test.\",\n        exclude: [\n            \"iexplore 6\",\n            \"firefox 3.6\"\n        ]\n    })\n    // etc..\n```\n\nIf you just want to sanity check your code, you can set an environment variable when running your tests:\n\n```sh\n# If $ENV is set to test, only Google Chrome will be tested\nENV=test node ./path/to/selenium-suite.js\n```\n\nAlternatively, you can set 'debug' to true when initializing Burnout:\n\n```javascript\nburnout\n    .initialize({ \n        name: \"Foo test.\", \n        debug: true \n    })\n    // etc..\n```\n\n## Sauce Labs\n\nBurnout accepts Sauce Labs account information as environment variables:\n\n```sh\nSAUCE_USER=foo SAUCE_KEY=123-456-789 node ./path/to/selenium-suite.js\n```\n\nOr as options in the call to initialize:\n\n```javascript\nburnout\n    .initialize({\n        name: \"Foo test.\",\n        sauceUser: \"foo\",\n        sauceKey: \"123-456-789\"\n    })\n    // etc..\n```\n\n## Non-Sauce Labs Environments\n\nBurnout also accepts\n\n```javascript\nburnout\n    .initialize({\n        name: \"Foo test.\",\n        remoteHost: \"ondemand.saucelabs.com\",\n        remotePort: 80\n    })\n    // etc..\n```\n\n[1]: http://github.com/admc/wd\n[2]: http://code.google.com/p/selenium/wiki/JsonWireProtocol\n","maintainers":[{"name":"cdata","email":"chris@scriptolo.gy"}],"time":{"modified":"2012-05-15T22:40:34.086Z","created":"2012-05-09T00:07:39.178Z","0.0.1":"2012-05-09T00:07:40.525Z","0.0.2":"2012-05-15T22:40:34.086Z"},"author":{"name":"Chris Joel","email":"chris@scriptolo.gy","url":"http://scriptolo.gy"},"repository":{"type":"git","url":"git://github.com/cdata/burnout.git"},"_attachments":{"burnout-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VCRhbhe239Ac7REBXLejTg==","length":3895,"stub":true},"burnout-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qQwYJaG5aulJykl+c1qeLA==","length":3840,"stub":true}}}},
{"id":"burrito","key":"burrito","value":{"rev":"45-3cbad8aae25945e0c51baebdd67334c0"},"doc":{"_id":"burrito","_rev":"45-3cbad8aae25945e0c51baebdd67334c0","name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","dist-tags":{"latest":"0.2.12"},"versions":{"0.0.0":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.0.0","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.0.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"7eb47c19e0f440339fc9a617809f1463abfd1aaf","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.0.0.tgz"}},"0.1.0":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.1.0","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":"0.4.x"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.1.0","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"cf2d13ded5f763059f10c6225bea3289f551f278","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.1.0.tgz"}},"0.1.1":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.1.1","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":"0.4.x"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.1.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"69a6c4e13c0a77cc661aaa0437054bd49d8cc8ee","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.1.1.tgz"}},"0.1.2":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.1.2","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"https://github.com/isaacs/UglifyJS/tarball/v1.0.2"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.1.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1bfe414a94436b69bb30fca4f47ad53a2bb92217","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.1.2.tgz"}},"0.1.3":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.1.3","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"https://github.com/isaacs/UglifyJS/tarball/v1.0.2"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.1.3","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f54509452637f5f982f5e8dcc0732ff3f5560c17","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.1.3.tgz"}},"0.1.4":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.1.4","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"https://github.com/isaacs/UglifyJS/tarball/v1.0.2"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.1.4","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"987355053eb42a1b1ec1a80e993e23e56d0013ae","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.1.4.tgz"}},"0.2.0":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.0","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"https://github.com/isaacs/UglifyJS/tarball/v1.0.2"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.0","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"841a94975188a3ccf7399aac4291f299a39d76df","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.0.tgz"}},"0.2.1":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.1","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"https://github.com/isaacs/UglifyJS/tarball/v1.0.2"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.1","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"5210f581ad56efbe6936f593a9429e0ded16e28f","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.1.tgz"}},"0.2.2":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.2","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"https://github.com/isaacs/UglifyJS/tarball/v1.0.2"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.2","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"598c6b222fa0da26925909e5f5ca7d0cc4285d9d","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.2.tgz"}},"0.2.3":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.3","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.3","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"f68c0f5c3e555480d216c5ffbbf3d849944a2e0c","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.3.tgz"}},"0.2.4":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.4","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.4","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"41284bc64ffa04070cb1fb4dd498052a83775310","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.4.tgz"}},"0.2.5":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.5","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.5","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"03ee0de3dced8459212df3b5a8575f226efc559c","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.5.tgz"}},"0.2.6":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.6","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.6","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"1cd510e2222b25eefc2bea61fc1e2f323ab8d651","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.6.tgz"}},"0.2.7":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.7","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.4.2 <0.5","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.7","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"46837dbab0be12a5ca5599c640a5b94b923b4845","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.7.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.8":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.8","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso","start":"node server.js"},"dependencies":{"traverse":">=0.5.1 <0.6","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.8","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"81a0c833f5c64abe6fa6f8bdc238b631322cc5cd","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.8.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.9":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.9","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso","start":"node server.js"},"dependencies":{"traverse":">=0.5.1 <0.6","uglify-js":"1.0.7"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.9","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"adfc4901d09d9b6854a4d122795dbf425ea94964","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.9.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.10":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.10","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso","start":"node server.js"},"dependencies":{"traverse":">=0.5.1 <0.6","uglify-js":"1.0.7"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"burrito@0.2.10","_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.5.0-pre","_defaultsLoaded":true,"dist":{"shasum":"945023d94ff1747ced83a246c80246bc32507b75","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.10.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.11":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.11","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso","start":"node server.js"},"dependencies":{"traverse":">=0.5.1 <0.6.0","uglify-js":"1.0.7"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"burrito@0.2.11","_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"ea28850cf439ddcc8c487a7afdef78c044015616","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.11.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}]},"0.2.12":{"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.12","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"traverse":"~0.5.1","uglify-js":"~1.1.1"},"devDependencies":{"tap":"~0.2.5"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"burrito@0.2.12","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d0d6e6ac81d5e99789c6fa4accb0b0031ea54f6b","tarball":"http://registry.npmjs.org/burrito/-/burrito-0.2.12.tgz"},"readme":"","maintainers":[{"name":"substack","email":"mail@substack.net"}]}},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"time":{"modified":"2012-08-02T13:34:21.089Z","created":"2011-06-04T11:27:33.316Z","0.0.0":"2011-06-04T11:27:33.919Z","0.1.0":"2011-06-11T02:59:59.541Z","0.1.1":"2011-06-11T22:35:56.902Z","0.1.2":"2011-06-12T02:32:07.858Z","0.1.3":"2011-06-13T09:47:09.834Z","0.1.4":"2011-06-13T11:43:47.834Z","0.2.0":"2011-06-15T07:00:56.615Z","0.2.1":"2011-06-15T21:28:47.056Z","0.2.2":"2011-07-05T20:00:18.436Z","0.2.3":"2011-07-09T23:44:47.530Z","0.2.4":"2011-07-16T06:03:58.266Z","0.2.5":"2011-07-18T05:22:26.195Z","0.2.6":"2011-07-23T00:19:19.223Z","0.2.7":"2011-08-08T00:37:40.065Z","0.2.8":"2011-08-23T13:58:34.285Z","0.2.9":"2011-09-09T12:49:57.982Z","0.2.10":"2011-09-18T06:03:06.225Z","0.2.11":"2011-10-19T19:34:02.094Z","0.2.12":"2012-05-27T01:09:29.707Z"},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"users":{"chrisdickinson":true,"kevinohara80":true,"fgribreau":true},"_attachments":{"burrito-0.2.12.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-QxLB4HtJ9CrQXZeGJtD4/g==","length":45104,"stub":true},"burrito-0.2.11.tgz":{"content_type":"application/octet-stream","revpos":40,"digest":"md5-z1UjohJLFeeI3A7zDRiXeQ==","length":78355,"stub":true},"burrito-0.2.10.tgz":{"content_type":"application/octet-stream","revpos":38,"digest":"md5-RbxxJiSZ7dI0/+xNx1zI0w==","length":78356,"stub":true},"burrito-0.2.9.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-gEphELMB/AFfZSIwKdfjJw==","length":77921,"stub":true},"burrito-0.2.8.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-mXc1gAPO89yPwBsmma55RQ==","length":39080,"stub":true},"burrito-0.2.7.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-7xrejzdK6wC8o14UtcoEMw==","length":5074,"stub":true},"burrito-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-fbJb4nh0NFGJVDBPV1BEKQ==","length":4919,"stub":true},"burrito-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-tPI1527/vV09YKen8cuHjA==","length":4704,"stub":true},"burrito-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-1Ec/+4+1x4pI70argrKvAQ==","length":4304,"stub":true},"burrito-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-SVLZ7dqjSDEP26VePlEM9w==","length":4303,"stub":true},"burrito-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-fPxLxpElSLWeTAa3BGwaYw==","length":4299,"stub":true},"burrito-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-A1lfcylQcIwKRd9HMgLtGg==","length":4086,"stub":true},"burrito-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-cq2msGFUBJiFeymesPdyZg==","length":4074,"stub":true},"burrito-0.1.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-5dXAV2jikUNNWKBqpXHJDg==","length":3934,"stub":true},"burrito-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-CGwk3WmdXaB1B9nDJJ3ilw==","length":3889,"stub":true},"burrito-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-rU2qyDkQNShe45e8CZ9oqQ==","length":3407,"stub":true},"burrito-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-c9qPglqT9av+1TIZUPXDcg==","length":79282,"stub":true},"burrito-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ycHWKHa8p59UlE7sFz+RQg==","length":78908,"stub":true},"burrito-0.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7fJDcO8QcCC5LJehKF9mcA==","length":56056,"stub":true}}}},
{"id":"burst","key":"burst","value":{"rev":"7-15c58fa8ebd27ce6ae2820b6d1d07cd1"},"doc":{"_id":"burst","_rev":"7-15c58fa8ebd27ce6ae2820b6d1d07cd1","name":"burst","description":"A command-line file sharing tool","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"burst","preferGlobal":true,"version":"0.0.1","dependencies":{"optimist":"0.3.1","redis":"0.7.1"},"devDependencies":{},"scripts":{},"bin":{"burst":"./bin/burst.js"},"engines":{"node":">= 0.4.1"},"author":{"name":"Andrew Peace","email":"apeace@gmail.com","url":"http://github.com/apeace"},"description":"A command-line file sharing tool","homepage":"https://github.com/apeace/burst","repository":{"type":"git","url":"git://github.com/apeace/burst.git"},"main":"./lib/burst","licenses":[{"type":"MIT","url":"http://raw.github.com/apeace/burst/master/LICENSE"}],"_npmUser":{"name":"apeace","email":"apeace@gmail.com"},"_id":"burst@0.0.1","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"292539dff1efa5e05964e1c14e20ae9457a099b3","tarball":"http://registry.npmjs.org/burst/-/burst-0.0.1.tgz"},"maintainers":[{"name":"apeace","email":"apeace@gmail.com"}]},"0.0.2":{"name":"burst","preferGlobal":true,"version":"0.0.2","dependencies":{"optimist":"0.3.1","redis":"0.7.1","colors":"0.6.x"},"devDependencies":{},"scripts":{},"bin":{"burst":"./bin/burst.js"},"engines":{"node":">= 0.4.1"},"author":{"name":"Andrew Peace","email":"apeace@gmail.com","url":"http://github.com/apeace"},"description":"A command-line file sharing tool","homepage":"https://github.com/apeace/burst","repository":{"type":"git","url":"git://github.com/apeace/burst.git"},"main":"./lib/burst","licenses":[{"type":"MIT","url":"http://raw.github.com/apeace/burst/master/LICENSE"}],"_npmUser":{"name":"apeace","email":"apeace@gmail.com"},"_id":"burst@0.0.2","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"08f86eee31d0a97bcf58b593f69337095044c1f4","tarball":"http://registry.npmjs.org/burst/-/burst-0.0.2.tgz"},"maintainers":[{"name":"apeace","email":"apeace@gmail.com"}]},"0.0.3":{"name":"burst","preferGlobal":true,"version":"0.0.3","dependencies":{"optimist":"0.3.1","redis":"0.7.1","colors":"0.6.x"},"devDependencies":{},"scripts":{},"bin":{"burst":"./bin/burst.js"},"engines":{"node":">= 0.4.1"},"author":{"name":"Andrew Peace","email":"apeace@gmail.com","url":"http://github.com/apeace"},"description":"A command-line file sharing tool","homepage":"https://github.com/apeace/burst","repository":{"type":"git","url":"git://github.com/apeace/burst.git"},"main":"./lib/burst","licenses":[{"type":"MIT","url":"http://raw.github.com/apeace/burst/master/LICENSE"}],"_npmUser":{"name":"apeace","email":"apeace@gmail.com"},"_id":"burst@0.0.3","_engineSupported":true,"_npmVersion":"1.0.105","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"04f6ba7bd9d0ce4220fce53f91546ec7eecb6476","tarball":"http://registry.npmjs.org/burst/-/burst-0.0.3.tgz"},"maintainers":[{"name":"apeace","email":"apeace@gmail.com"}]}},"readme":"# Burst\n\nSimple command-line file sharing for developers on the same network.\n\n## Install\n\n````bash\n$ npm install burst -g\n````\n\n## Example\n\nAndrew wants to send Cam a file. He connects to the office's Redis server\nand bursts the file to Cam:\n\n````bash\n$ burst into 10.0.0.123:6379\n$ burst to cam ./funny_picture.jpg\n````\n\nCam wants to receive the file, so he connects to Redis and accepts:\n\n````bash\n$ burst into 10.0.0.123:6379\n$ burst as cam\n[===========>] 1.0/1.0mb (100%) funny_picture.jpg\n^C\n```\n\n## Setup\n\nYou need a Redis server to use Burst. IPs are exchanged through pub-sub and\nfiles are sent via sockets. No other configuration is necessary&mdash;just a\nvanilla Redis server.\n\nIf you don't have a Redis server in the office already, you're probably not\ncool enough to use burst.\n\n## Commands\n\n````bash\n# connect to given redis server\nburst into 10.0.0.123:6379\n\n# transfer files on the given port\nburst on 4567\n\n# accept files sent to the given name\nburst as andrew\n\n# send a file to the given name\nburst to andrew ./path/to/file\n````\n\n## Magic Ponies\n\nLet me tell you a story.\n\nOnce upon a time, the boss said he was going to send an important file\nto everyone in the office. Gregg and Nancy wanted to see the file. So Gregg\nhopped on his Macbook Air and Nancy grabbed her Ubuntu netbook, and they\nboth fired up the terminal:\n\n````bash\n$ burst as everyone\n\n````\n\nGregg quickly pounded into iTerm. Nancy did the same in her GNOME-Terminal:\n\n````bash\n$ burst as everyone\n\n````\n\nAnd they waited.\n\nThe clock struck 2:15 and, right on queue, the boss returned from his lunch\nbreak. He wrote into his own terminal:\n\n````bash\n$ burst to everyone /var/www/pony_identities.sql\n````\n\nAnd like pony magic, our heros' terminals came to life! They began to\ndownload the important file:\n\n````bash\n$ burst as everyone\n[===>      ] 0.2/1.9mb (10%) pony_identities.sql\n````\n\nAs soon as the progress bar showed 100%, Gregg and Nancy `^C`ed and\nbegan using their favorite command-line tools to parse their new files.\n\nMeanwhile, the boss was waiting for the rest of the office to get the file:\n\n````bash\n$ burst to everyone /var/www/pony_identities.sql\n[====>     ] 3/10 (30%)\n````\n\nWhen *his* progress bar showed 100%, *he `^C`ed too*, and went back\nto his important work.\n\nSo you see, there really was no moon landing.\n\n## License\n\nCopyright (c) 2011 Andrew Peace\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n","maintainers":[{"name":"apeace","email":"apeace@gmail.com"}],"time":{"modified":"2012-01-31T00:09:55.607Z","created":"2012-01-29T20:52:24.800Z","0.0.1":"2012-01-29T20:52:25.237Z","0.0.2":"2012-01-29T22:27:40.967Z","0.0.3":"2012-01-31T00:09:55.607Z"},"author":{"name":"Andrew Peace","email":"apeace@gmail.com","url":"http://github.com/apeace"},"repository":{"type":"git","url":"git://github.com/apeace/burst.git"},"_attachments":{"burst-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-qCZXeDnJYnR74PwwTDxN6w==","length":10240,"stub":true},"burst-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9ykJyIwmKXZkRi9RI3Z5kw==","length":10240,"stub":true},"burst-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-O8tmVBOWEFzETnlsUme8sw==","length":10240,"stub":true}}}},
{"id":"burst-queue","key":"burst-queue","value":{"rev":"5-ff7e0e95e8a5fba9dac35b36da67020d"},"doc":{"_id":"burst-queue","_rev":"5-ff7e0e95e8a5fba9dac35b36da67020d","name":"burst-queue","description":"a queue that executes callbacks in predefined bursts","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"author":{"name":"Mike Maelzer","email":"mmaelzer@gmail.com"},"name":"burst-queue","description":"a queue that executes callbacks in predefined bursts","version":"0.1.0","repository":{"type":"git","url":"git://github.com/mmaelzer/burst-queue.git"},"main":"index","engines":{"node":"*"},"dependencies":{},"devDependencies":{"mocha":"*","should":"*","coffee-script":">=1.2"},"scripts":{"build":"cake build","test":"cake test"},"optionalDependencies":{},"_npmUser":{"name":"mmaelzer","email":"mmaelzer@gmail.com"},"_id":"burst-queue@0.1.0","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"7267390bb57960cd75dad387878a284c74bd0d30","tarball":"http://registry.npmjs.org/burst-queue/-/burst-queue-0.1.0.tgz"},"maintainers":[{"name":"mmaelzer","email":"mmaelzer@gmail.com"}]},"0.1.1":{"author":{"name":"Mike Maelzer","email":"mmaelzer@gmail.com"},"name":"burst-queue","description":"a queue that executes callbacks in predefined bursts","version":"0.1.1","repository":{"type":"git","url":"git://github.com/mmaelzer/burst-queue.git"},"main":"index","engines":{"node":"*"},"dependencies":{},"devDependencies":{"mocha":"*","should":"*","coffee-script":">=1.2"},"scripts":{"build":"cake build","test":"cake test"},"optionalDependencies":{},"_npmUser":{"name":"mmaelzer","email":"mmaelzer@gmail.com"},"_id":"burst-queue@0.1.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"e0409acfd638c598a6983902522897cd11ae04df","tarball":"http://registry.npmjs.org/burst-queue/-/burst-queue-0.1.1.tgz"},"maintainers":[{"name":"mmaelzer","email":"mmaelzer@gmail.com"}]}},"readme":"burst-queue\r\n===========\r\nA simple queue that takes functions and executes those functions on a specified interval. Optionally a maximum number of functions to execute per interval can be specified when creating a burst-queue.\r\n\r\nMethods\r\n-------\r\n### createQueue(period, [functionsPerPeriod]) ###\r\n__Returns__: a burst-queue that will execute passed in functions every `period` (milliseconds). The optional `functionsPerPeriod` value denotes a maximum number of functions to be executed at each interval.\r\n\r\n\r\n### add(fn) / add([fn1, fn2, ...]) ###\r\nAdds functions to the queue. The `add` method takes both single functions or arrays of functions. \r\n\r\n__Returns__: the queue's internal id(s) of the passed in functions. The internal ids can be later used to `remove` items from the queue. If an array of functions is passed to `add`, an array of ids is returned in the same order as the functions that were passed in.\r\n\r\n### availableCalls ###\r\nOnly valid when `functionsPerPeriod` is defined.\r\n\r\n__Returns__: the number of calls available in the current period. In other words, any function passed in when `availableCalls()` returns a value greater than 0 will be executed immediately.\r\n\r\n### clear ###\r\nClears the queue of all functions. Sets the `availableCalls` back to the original value of `functionsPerPeriod` that was specified on creation of the queue. If no value was given for `functionsPerPeriod`, `availableCalls` remains at 0.\r\n\r\n__Returns__: nothing\r\n\r\n### counter ###\r\n__Returns__: the current value of the counter used for generating the queue's internal ids for functions. This value increments by one each time a function is added to the queue.\r\n\r\n### enqueued ###\r\n__Returns__: the current count of items in the queue.\r\n\r\n### remove(id) ###\r\nTakes an id returned from an `add` call and removes that function from the queue, if it is still in the queue.\r\n\r\n__Returns__: a bool that designates whether the `remove` call successfully found and removed the function from the queue. If a function no longer exists in the queue when `remove` is called on its id, `remove` returns `false`.\r\n\r\n","maintainers":[{"name":"mmaelzer","email":"mmaelzer@gmail.com"}],"time":{"modified":"2012-08-11T17:58:01.849Z","created":"2012-08-11T17:54:50.587Z","0.1.0":"2012-08-11T17:54:52.912Z","0.1.1":"2012-08-11T17:58:01.849Z"},"author":{"name":"Mike Maelzer","email":"mmaelzer@gmail.com"},"repository":{"type":"git","url":"git://github.com/mmaelzer/burst-queue.git"},"_attachments":{"burst-queue-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VXjzYrc2KvciJT25i5Urew==","length":3638,"stub":true},"burst-queue-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-rpE1OIeQbpvB59t5ITCEvQ==","length":3588,"stub":true}}}},
{"id":"burst-trie","key":"burst-trie","value":{"rev":"3-a774b18ef5bce13cd21ed937c6a63643"},"doc":{"_id":"burst-trie","_rev":"3-a774b18ef5bce13cd21ed937c6a63643","name":"burst-trie","description":"burst trie impl in js","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"burst-trie","description":"burst trie impl in js","version":"0.1.0","author":{"name":"Ariel Jakobovits","email":"arieljake@yahoo.com"},"contributors":[{"name":"Ariel Jakobovits","email":"arieljake@yahoo.com"}],"keywords":["burst","trie","tree","bst","binary search tree"],"engines":{"node":">= 0.6"},"dependencies":{"underscore.string":"~2.2.0rc"},"devDependencies":{},"repository":{"type":"git","url":"git://github.com/arieljake/burst-trie.git"},"license":"MIT","_id":"burst-trie@0.1.0","dist":{"shasum":"818b148d870e1debf91e903354c220d7cb274b29","tarball":"http://registry.npmjs.org/burst-trie/-/burst-trie-0.1.0.tgz"},"readme":"","maintainers":[{"name":"arieljake","email":"arieljake@yahoo.com"}]}},"readme":"","maintainers":[{"name":"arieljake","email":"arieljake@yahoo.com"}],"time":{"modified":"2012-07-03T09:14:48.294Z","created":"2012-07-03T09:14:28.816Z","0.1.0":"2012-07-03T09:14:48.294Z"},"author":{"name":"Ariel Jakobovits","email":"arieljake@yahoo.com"},"repository":{"type":"git","url":"git://github.com/arieljake/burst-trie.git"},"_attachments":{"burst-trie-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-FNsMFzqYmmQ/A4xNYBezkA==","length":6268,"stub":true}}}},
{"id":"bus","key":"bus","value":{"rev":"7-20c2ea86faefe5631832a0c45f25e159"},"doc":{"_id":"bus","_rev":"7-20c2ea86faefe5631832a0c45f25e159","name":"bus","description":"Application-wide event bus","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bus","description":"Application-wide event bus","version":"0.0.1","dependencies":{"emitter-component":"*"},"devDependencies":{"mocha":"*","should":"*"},"component":{"scripts":{"bus":"index.js"}},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"bus@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"d3dce2b6a21726a5f3231dd42d9f68500a810caa","tarball":"http://registry.npmjs.org/bus/-/bus-0.0.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"\n# Bus\n\n  Application-wide event bus component (a Singleton `Emitter`).\n\n## Installation\n\n```\n$ npm install bus\n```\n\n## API\n  \n```js\nvar bus = require('bus');\nbus.emit('stuff');\n```","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-13T17:43:34.512Z","created":"2012-05-03T17:57:45.160Z","0.0.1":"2012-05-03T17:57:46.776Z"},"users":{"sjonnet19":true},"_attachments":{"bus-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oKEFyBGjRF30E4r5KMTolQ==","length":537,"stub":true}}}},
{"id":"bus-component","key":"bus-component","value":{"rev":"3-b6f4dcf46556ad8b3add115751f331ef"},"doc":{"_id":"bus-component","_rev":"3-b6f4dcf46556ad8b3add115751f331ef","name":"bus-component","description":"Application-wide event bus","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bus-component","description":"Application-wide event bus","version":"0.0.1","dependencies":{"emitter-component":"*"},"devDependencies":{"mocha":"*","should":"*"},"component":{"scripts":{"bus":"index.js"}},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"bus-component@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"98536d16e81988ac99c769626aa003c041f69e32","tarball":"http://registry.npmjs.org/bus-component/-/bus-component-0.0.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"\n# Bus\n\n  Application-wide event bus component (a Singleton `Emitter`).\n\n## Installation\n\n```\n$ npm install bus-component\n```\n\n## API\n  \n```js\nvar bus = require('bus');\nbus.emit('stuff');\n```","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-05-03T17:55:50.207Z","created":"2012-05-03T17:55:48.690Z","0.0.1":"2012-05-03T17:55:50.207Z"},"_attachments":{"bus-component-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KoL22w4Jj1BA0w2RdVQ+SA==","length":545,"stub":true}}}},
{"id":"busbuddy","key":"busbuddy","value":{"rev":"5-298ec29f6307351cf7a19bceebe957c7"},"doc":{"_id":"busbuddy","_rev":"5-298ec29f6307351cf7a19bceebe957c7","name":"busbuddy","description":"BusBuddy js api for node and the browser","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"busbuddy","version":"0.0.1","description":"BusBuddy js api for node","keywords":["busbuddy","buss","trondheim","atb","api"],"author":{"name":"Torgeir Thoresen","email":"@torgeir"},"dependencies":{},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"busbuddy@0.0.1","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"701de50dd41d6e1ca4a3b38370e3f6c438d497ab","tarball":"http://registry.npmjs.org/busbuddy/-/busbuddy-0.0.1.tgz"},"scripts":{}},"0.0.2":{"name":"busbuddy","version":"0.0.2","description":"BusBuddy js api for node and the browser","keywords":["busbuddy","buss","trondheim","atb","api"],"author":{"name":"Torgeir Thoresen","email":"@torgeir"},"dependencies":{},"main":"index","engines":{"node":"0.4.x"},"devDependencies":{},"_id":"busbuddy@0.0.2","_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"3cafa75c7f22a102263c1e300caf4370709cfc88","tarball":"http://registry.npmjs.org/busbuddy/-/busbuddy-0.0.2.tgz"},"scripts":{}}},"maintainers":[{"name":"torgeir","email":"torgeir.thoresen@gmail.com"}],"time":{"modified":"2011-05-29T17:52:04.699Z","created":"2011-05-29T16:12:43.704Z","0.0.1":"2011-05-29T16:12:44.488Z","0.0.2":"2011-05-29T17:52:04.699Z"},"author":{"name":"Torgeir Thoresen","email":"@torgeir"},"_attachments":{"busbuddy-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4Pb1UMLcluSFHNc+SSvVyQ==","length":3116,"stub":true},"busbuddy-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-YC3V48LWBMYb6aPW07DzIg==","length":2112,"stub":true}}}},
{"id":"buster","key":"buster","value":{"rev":"62-b77d1b392b7b55cf411a8b57b329b8b1"},"doc":{"_id":"buster","_rev":"62-b77d1b392b7b55cf411a8b57b329b8b1","name":"buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","dist-tags":{"latest":"0.6.2"},"versions":{"0.2.0":{"name":"buster","version":"0.2.0","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":"~>0.3","buster-test":"~>0.2","buster-assertions":"~>0.6","buster-format":"~>0.4","buster-evented-logger":"~>0.3","buster-test-cli":"~>0.1","sinon-buster":"~>0.3.0"},"devDependencies":{},"_id":"buster@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"49678802110a6ab9f7d5622d344f0a1cce585e0f","tarball":"http://registry.npmjs.org/buster/-/buster-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.1":{"name":"buster","version":"0.2.1","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":"~0.3","buster-test":"~0.2","buster-assertions":"~0.6","buster-format":"~0.4","buster-evented-logger":"~0.3","buster-test-cli":"~0.1","sinon-buster":"~0.3.0"},"devDependencies":{},"_id":"buster@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"cec1a0619c8281016a52d7c3db1223b44665aaf2","tarball":"http://registry.npmjs.org/buster/-/buster-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.2":{"name":"buster","version":"0.2.2","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":"~>0.3","buster-test":"~>0.2","buster-assertions":"~>0.6","buster-format":"~>0.4","buster-evented-logger":"~>0.3","buster-test-cli":"~>0.1","sinon-buster":"~>0.3.0"},"devDependencies":{},"_id":"buster@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"4d570fc3b8b546fd7fc567f051b245440f8ec7f0","tarball":"http://registry.npmjs.org/buster/-/buster-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.3":{"name":"buster","version":"0.2.3","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":"~0.3","buster-test":"~0.2","buster-assertions":"~0.6","buster-format":"~0.4","buster-evented-logger":"~0.3","buster-test-cli":">=0.1","sinon-buster":"~0.3.0"},"devDependencies":{},"_id":"buster@0.2.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5c1eb895b82df4dd153b23da2a03132092a2c007","tarball":"http://registry.npmjs.org/buster/-/buster-0.2.3.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.4":{"name":"buster","version":"0.2.4","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.3","buster-test":"~0.2","buster-assertions":">=0.6","buster-format":"~0.4","buster-evented-logger":"~0.3","buster-test-cli":">=0.2","sinon-buster":"~0.3.0"},"devDependencies":{},"_id":"buster@0.2.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"dd8e49f8f4fbe5ea6f159ea9b679d61ebf99e8d3","tarball":"http://registry.npmjs.org/buster/-/buster-0.2.4.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.3.0":{"name":"buster","version":"0.3.0","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":"~0.5","buster-test":"~0.3","buster-assertions":"~0.8","buster-format":"~0.5","buster-evented-logger":"~0.4","buster-test-cli":"~0.3","sinon-buster":"~0.4","buster-static":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"37725ea322045925779c276fbab90ce26c45b3bc","tarball":"http://registry.npmjs.org/buster/-/buster-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.0":{"name":"buster","version":"0.4.0","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.1","buster-test-cli":">=0.4","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1c807681ef69f1ad9526f0bd968c2061de8fa2ab","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.1":{"name":"buster","version":"0.4.1","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.1","buster-test-cli":">=0.4","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d78d796a0db4fa6dd39addad10dfab7edb6916ae","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.2":{"name":"buster","version":"0.4.2","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.1","buster-test-cli":">=0.4.1","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e9ffa4f62837fdbd553a0475bccfb2329a6c0a29","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.3":{"name":"buster","version":"0.4.3","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.1","buster-test-cli":">=0.4.1","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"af41d9e276bf79d9663b38906b56a6675c035241","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.4":{"name":"buster","version":"0.4.4","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.1","buster-test-cli":">=0.4.1","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c3379f57c704058c70e73015f6ee90f0dafaa353","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.5":{"name":"buster","version":"0.4.5","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.2","buster-test-cli":">=0.4.4","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"38f5514593fdd3175c3f24ff2bbf7fedf90799d1","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.5.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.6":{"name":"buster","version":"0.4.6","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.5.1","buster-test":">=0.4","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-evented-logger":">=0.4.2","buster-test-cli":">=0.4.6","sinon":">=1.3.1","sinon-buster":">=0.4.1","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.4.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"66daa0ce261c6711686c44edbc06eca3834cbb63","tarball":"http://registry.npmjs.org/buster/-/buster-0.4.6.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.0":{"name":"buster","version":"0.5.0","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.6.0","buster-test":">=0.5","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-evented-logger":">=0.4.3","buster-test-cli":">=0.4.7","buster-autotest":">=0.1.0","sinon":">=1.3.1","sinon-buster":">=0.5.0","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ebc81ba1cc5077a6a011828a7050e4666dde2ce2","tarball":"http://registry.npmjs.org/buster/-/buster-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.1":{"name":"buster","version":"0.5.1","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.6.0","buster-test":">=0.5","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-evented-logger":">=0.4.3","buster-test-cli":">=0.5.0","buster-autotest":">=0.1.0","sinon":">=1.3.1","sinon-buster":">=0.5.0","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b02f245c7de2ab84691a574efb718cb3230afca8","tarball":"http://registry.npmjs.org/buster/-/buster-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.2":{"name":"buster","version":"0.5.2","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.6.0","buster-test":">=0.5","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-evented-logger":">=0.4.3","buster-test-cli":">=0.5.1","buster-autotest":">=0.1.1","sinon":">=1.3.1","sinon-buster":">=0.5.0","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2004e61ea66ec334b2055b7746906afba688c259","tarball":"http://registry.npmjs.org/buster/-/buster-0.5.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.3":{"name":"buster","version":"0.5.3","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.6.1","buster-test":">=0.5.2","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-evented-logger":">=0.4.3","buster-test-cli":">=0.5.2","buster-autotest":">=0.1.1","sinon":">=1.3.1","sinon-buster":">=0.5.0","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.5.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8ad2055613c9a41cde6f97cb77c2371173f71571","tarball":"http://registry.npmjs.org/buster/-/buster-0.5.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.4":{"name":"buster","version":"0.5.4","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.6.1","buster-test":">=0.5.2","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-evented-logger":">=0.4.3","buster-test-cli":">=0.5.2","buster-autotest":">=0.1.1","sinon":">=1.3.1","sinon-buster":">=0.5.0","buster-static":">=0.3"},"devDependencies":{"when":"https://github.com/cujojs/when/tarball/1.0.2","uglify-js":"~1.2.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.5.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6423bbd103820d08df7f0e9ea0448259d082e518","tarball":"http://registry.npmjs.org/buster/-/buster-0.5.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.0":{"name":"buster","version":"0.6.0","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2","buster-evented-logger":">=0.4.4","buster-assertions":">=0.10.2","buster-format":">=0.5.4","sinon":">=1.3.4","buster-test":">=0.6.0","buster-sinon":">=0.5.1","buster-test-cli":">=0.6.0","buster-server-cli":">=0.1.0","buster-autotest":">=0.2.0","buster-static":">=0.5","buster-syntax":"~0.4","when":"~1.3"},"devDependencies":{"uglify-js":"~1.2.5","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"100aa884188c1c99be98be112d579794aa9d4798","tarball":"http://registry.npmjs.org/buster/-/buster-0.6.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.1":{"name":"buster","version":"0.6.1","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.3","buster-evented-logger":">=0.4.4","buster-assertions":">=0.10.3","buster-format":">=0.5.5","sinon":">=1.4","buster-test":">=0.6.1","buster-sinon":">=0.6.0","buster-test-cli":">=0.6.1","buster-server-cli":">=0.1.0","buster-autotest":">=0.2.0","buster-static":">=0.5","buster-syntax":"~0.4","when":"https://github.com/cujojs/when/tarball/1.3.0"},"devDependencies":{"uglify-js":"~1.2.5","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2b7a48ddce6312ee0d389ee2638bac7dc2059e88","tarball":"http://registry.npmjs.org/buster/-/buster-0.6.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]},"0.6.2":{"name":"buster","version":"0.6.2","main":"./lib/buster","description":"Buster.JS JavaScript Test framework. Meta package that pieces together various sub-projects.","homepage":"http://busterjs.org/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"bin":{"buster":"./bin/buster","buster-test":"./bin/buster-test","buster-server":"./bin/buster-server","buster-autotest":"./bin/buster-autotest","buster-static":"./bin/buster-static"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.3","buster-evented-logger":">=0.4.4","buster-assertions":">=0.10.3","buster-format":">=0.5.5","sinon":">=1.4","buster-test":">=0.6.1","buster-sinon":">=0.6.0","buster-test-cli":">=0.6.2","buster-server-cli":">=0.1.0","buster-autotest":">=0.2.0","buster-static":">=0.5","buster-syntax":"~0.4","when":"https://github.com/cujojs/when/tarball/1.3.0"},"devDependencies":{"uglify-js":"~1.2.5","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster@0.6.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"bbfaff61325e5f486fe18204a5dee2e76ef2f501","tarball":"http://registry.npmjs.org/buster/-/buster-0.6.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-08-05T00:05:31.404Z","created":"2011-08-09T19:57:25.460Z","0.2.0":"2011-08-09T19:57:30.856Z","0.2.1":"2011-08-23T22:43:45.824Z","0.2.2":"2011-09-07T21:39:22.421Z","0.2.3":"2011-09-07T21:45:11.466Z","0.2.4":"2011-10-18T21:21:24.312Z","0.3.0":"2011-12-05T23:14:46.594Z","0.4.0":"2012-02-16T19:49:43.303Z","0.4.1":"2012-02-16T21:06:39.903Z","0.4.2":"2012-02-17T22:49:57.242Z","0.4.3":"2012-02-19T09:16:20.146Z","0.4.4":"2012-02-20T22:55:27.406Z","0.4.5":"2012-02-21T22:24:13.891Z","0.4.6":"2012-03-07T22:57:50.066Z","0.5.0":"2012-04-17T22:07:39.896Z","0.5.1":"2012-04-25T21:02:58.591Z","0.5.2":"2012-05-02T21:31:11.102Z","0.5.3":"2012-05-04T21:14:45.536Z","0.5.4":"2012-05-28T11:23:30.427Z","0.6.0":"2012-06-20T21:23:50.779Z","0.6.1":"2012-07-09T22:33:02.506Z","0.6.2":"2012-07-10T11:42:19.298Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster.git"},"users":{"magnars":true,"pid":true},"_attachments":{"buster-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":61,"digest":"md5-DaSiZoaRhfiBqU1/G90nDg==","length":71064,"stub":true},"buster-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":59,"digest":"md5-VCncwCU/3NM1R90RE+wIww==","length":70976,"stub":true},"buster-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":56,"digest":"md5-5aNkZvWe04dmooR+HedmTA==","length":70876,"stub":true},"buster-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":54,"digest":"md5-jbxxWXpiD1hXwX6GPDWAYg==","length":66105,"stub":true},"buster-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-8aKbYcGc/TGmB1LRF92OqA==","length":63500,"stub":true},"buster-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-FyIYGD726i/vZ47mBNLvPA==","length":63499,"stub":true},"buster-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":44,"digest":"md5-fDxZcYq8uUPzpoMDRPu2qw==","length":63253,"stub":true},"buster-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":42,"digest":"md5-Q637zhCQTWfL0cOskmjn2g==","length":63210,"stub":true},"buster-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":36,"digest":"md5-CQdHlLqWkpE0hWlpo1HJ5A==","length":62271,"stub":true},"buster-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":34,"digest":"md5-9e8WY8WJJuS5VkuWfi5Hyw==","length":44002,"stub":true},"buster-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":32,"digest":"md5-57yA2AYB17vPWyly8icLRQ==","length":43875,"stub":true},"buster-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-LBNt9l/iD7ugyPnuPzJAKw==","length":43853,"stub":true},"buster-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-ky/HgTkt8HhjFSIRgl7z2w==","length":43839,"stub":true},"buster-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-B9xA8ylqgVUTJ5GZjkQnVQ==","length":43839,"stub":true},"buster-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":24,"digest":"md5-6lL8SRlAeGSs0sqygs9qdw==","length":43842,"stub":true},"buster-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-9wgK7cXaF4zppkEPsO19ug==","length":52200,"stub":true},"buster-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-AI7gE+yzBh1I2TOEp5fi8g==","length":36413,"stub":true},"buster-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-7f3RPdQ99szQC6bgGcrkww==","length":35421,"stub":true},"buster-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-15nJg7Ooy4ElAsE5SM8+RQ==","length":35417,"stub":true},"buster-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-g8eXAgDm7E/tGH5rnw/YNw==","length":35244,"stub":true},"buster-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-nNlg7gjd9dVmEHTcDJWbjw==","length":35358,"stub":true}}}},
{"id":"buster-amd","key":"buster-amd","value":{"rev":"3-c6bc83dc517c854162b3cc24dba6e3cc"},"doc":{"_id":"buster-amd","_rev":"3-c6bc83dc517c854162b3cc24dba6e3cc","name":"buster-amd","description":"Extension for testing AMD modules","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"buster-amd","version":"0.2.0","description":"Extension for testing AMD modules","homepage":"http://busterjs.org/docs/buster-amd","author":{"name":"Joakim Ohlrogge"},"contributors":[{"name":"Joakim Ohlrogge","url":"http://johlrogge.wordpress.com"},{"name":"Christian Johansen","url":"http://cjohansen.no"}],"main":"./lib/buster-amd","repository":{"type":"git","url":"git://github.com/busterjs/buster-amd.git"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-amd/blobs/master/LICENSE"},"dependencies":{"buster-core":">=0.5.1"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"lstrojny","email":"lars@strojny.net"},"_id":"buster-amd@0.2.0","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"77a426cfa9aa5020da5f0f305f6703f7e3148575","tarball":"http://registry.npmjs.org/buster-amd/-/buster-amd-0.2.0.tgz"},"readme":"","maintainers":[{"name":"lstrojny","email":"lars@strojny.net"}]}},"readme":"","maintainers":[{"name":"lstrojny","email":"lars@strojny.net"}],"time":{"modified":"2012-04-29T14:28:36.201Z","created":"2012-04-29T14:28:34.655Z","0.2.0":"2012-04-29T14:28:36.200Z"},"author":{"name":"Joakim Ohlrogge"},"repository":{"type":"git","url":"git://github.com/busterjs/buster-amd.git"},"_attachments":{"buster-amd-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-E3ADcX9esAzAEaaf6echzQ==","length":95414,"stub":true}}}},
{"id":"buster-analyzer","key":"buster-analyzer","value":{"rev":"10-bd11c099b67626a0db82fc5e7bf7bada"},"doc":{"_id":"buster-analyzer","_rev":"10-bd11c099b67626a0db82fc5e7bf7bada","name":"buster-analyzer","description":"","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"buster-analyzer","version":"0.1.0","description":"","homepage":"http://busterjs.org/docs/buster-analyzer","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-analyzer","repository":{"type":"git","url":"git://github.com/busterjs/buster-analyzer.git"},"dependencies":{"buster-core":">=0.5.1","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-analyzer@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d69e36e0241bb0c574ef75c2d188609928d91a63","tarball":"http://registry.npmjs.org/buster-analyzer/-/buster-analyzer-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.0":{"name":"buster-analyzer","version":"0.2.0","description":"","homepage":"http://busterjs.org/docs/buster-analyzer","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-analyzer","repository":{"type":"git","url":"git://github.com/busterjs/buster-analyzer.git"},"dependencies":{"buster-core":">=0.6.0","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-terminal":"~0.4"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-analyzer@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"13a9f7e4ee71734bf9827c29bf1d2df44d9710ac","tarball":"http://registry.npmjs.org/buster-analyzer/-/buster-analyzer-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-analyzer","version":"0.3.0","description":"","homepage":"http://busterjs.org/docs/buster-analyzer","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-analyzer","repository":{"type":"git","url":"git://github.com/busterjs/buster-analyzer.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","when":"~1.3","buster-terminal":">=0.4.1"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-analyzer@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ee995c8bc52a8d7fe933d2e6b252426d90ab7f48","tarball":"http://registry.npmjs.org/buster-analyzer/-/buster-analyzer-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-analyzer","version":"0.3.1","description":"","homepage":"http://busterjs.org/docs/buster-analyzer","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-analyzer","repository":{"type":"git","url":"git://github.com/busterjs/buster-analyzer.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","when":"https://github.com/cujojs/when/tarball/1.3.0","buster-terminal":">=0.4.1"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-analyzer@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"60fdd6090ba6b516af0525def282c8d00db0b14a","tarball":"http://registry.npmjs.org/buster-analyzer/-/buster-analyzer-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:14:53.927Z","created":"2012-02-16T19:00:44.033Z","0.1.0":"2012-02-16T19:00:46.763Z","0.2.0":"2012-04-17T22:06:00.348Z","0.3.0":"2012-06-20T20:32:19.217Z","0.3.1":"2012-07-09T22:14:53.927Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://github.com/busterjs/buster-analyzer.git"},"_attachments":{"buster-analyzer-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-w5+h3zFTx46c4svMg566vA==","length":4172,"stub":true},"buster-analyzer-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-j92wzw1FArOmPrSDDqV5TA==","length":4152,"stub":true},"buster-analyzer-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-rIJO/vrBaMUznwAIBxp34A==","length":3887,"stub":true},"buster-analyzer-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-XoU+CHEYx4op8h+RyNZhxQ==","length":2071,"stub":true}}}},
{"id":"buster-args","key":"buster-args","value":{"rev":"11-8567cd7ec97edbbf4d560d827b6db5b3"},"doc":{"_id":"buster-args","_rev":"11-8567cd7ec97edbbf4d560d827b6db5b3","name":"buster-args","description":"Parser for CLI arguments.","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.0":{"name":"buster-args","version":"0.2.0","description":"Parser for CLI arguments.","homepage":"http://busterjs.org/docs/buster-args","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-args","repository":{"type":"git","url":"git://gitorious.org/buster/buster-args"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-args/blobs/master/LICENSE"},"dependencies":{"buster-promise":"~>0.3"},"devDependencies":{},"_id":"buster-args@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5a09d7aa9b41e08abb85dd38c5731db6047f2295","tarball":"http://registry.npmjs.org/buster-args/-/buster-args-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-args","version":"0.2.1","description":"Parser for CLI arguments.","homepage":"http://busterjs.org/docs/buster-args","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-args","repository":{"type":"git","url":"git://gitorious.org/buster/buster-args"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-args/blobs/master/LICENSE"},"dependencies":{"buster-core":"*","buster-promise":"~0.3"},"devDependencies":{},"_id":"buster-args@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"ac1f4b1c04ddbe8789b1a4034292e7f782f0e58d","tarball":"http://registry.npmjs.org/buster-args/-/buster-args-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.2":{"name":"buster-args","version":"0.2.2","description":"Parser for CLI arguments.","homepage":"http://busterjs.org/docs/buster-args","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-args","repository":{"type":"git","url":"git://gitorious.org/buster/buster-args"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-args/blobs/master/LICENSE"},"dependencies":{"buster-core":"*","buster-promise":"~0.3"},"devDependencies":{},"_id":"buster-args@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"f2fb5398f28474adf9d1091f239b9a39aefb393d","tarball":"http://registry.npmjs.org/buster-args/-/buster-args-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-args","version":"0.3.0","description":"Parser for CLI arguments.","homepage":"http://busterjs.org/docs/buster-args","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-args","repository":{"type":"git","url":"git://gitorious.org/buster/buster-args"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-args/blobs/master/LICENSE"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4"},"devDependencies":{"buster":""},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-args@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"41baea9670625fbeee13cb9ca72b0b2ff83526db","tarball":"http://registry.npmjs.org/buster-args/-/buster-args-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-args","version":"0.3.1","description":"Parser for CLI arguments.","homepage":"http://busterjs.org/docs/buster-args","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-args","repository":{"type":"git","url":"git://gitorious.org/buster/buster-args"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-args/blobs/master/LICENSE"},"dependencies":{"buster-core":"~0.6","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster":""},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-args@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ddc4318cb67afcedfb9567a807bf94557f8b4dc7","tarball":"http://registry.npmjs.org/buster-args/-/buster-args-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2012-04-17T21:30:53.211Z","created":"2011-08-08T21:35:32.973Z","0.2.0":"2011-08-08T21:35:35.561Z","0.2.1":"2011-08-23T22:33:59.961Z","0.2.2":"2011-08-25T11:26:09.192Z","0.3.0":"2011-12-05T21:22:34.264Z","0.3.1":"2012-04-17T21:30:53.211Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-args"},"_attachments":{"buster-args-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-hH6e3DAtuh1P/ZBYpKqdIQ==","length":9334,"stub":true},"buster-args-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-J2HG3h8zD/YnQEJEcefQSA==","length":9287,"stub":true},"buster-args-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-3tLxKgU65lp3aCI9o9v1FQ==","length":9120,"stub":true},"buster-args-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-4DTBNgsMnRagAdRBl7C+3Q==","length":9320,"stub":true},"buster-args-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2uuQjj4flzwSSfiCtbAorw==","length":9257,"stub":true}}}},
{"id":"buster-assertions","key":"buster-assertions","value":{"rev":"30-0c7f7293a04d250f47a5500f0c350ca9"},"doc":{"_id":"buster-assertions","_rev":"30-0c7f7293a04d250f47a5500f0c350ca9","name":"buster-assertions","description":"Assertions for any JavaScript test framework and environment","dist-tags":{"latest":"0.10.3"},"versions":{"0.6.0":{"name":"buster-assertions","version":"0.6.0","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~>0.3"},"devDependencies":{"sinon":"~1.1","buster-util":"~>0.3"},"_id":"buster-assertions@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"0f45cdac7149804922a98ca9a6748727da48595e","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.6.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.1":{"name":"buster-assertions","version":"0.6.1","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.3.1"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"f2495ac533882bbf62f2094e34e0eb6debdeaf25","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.6.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.7.0":{"name":"buster-assertions","version":"0.7.0","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.4"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.7.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"d743c64d4f6f300b195620230fa9e26d44d8d907","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.7.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.7.1":{"name":"buster-assertions","version":"0.7.1","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.4"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.7.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"d9d296502dfaed9323f2b19f1ee8e514a40fdffc","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.7.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.7.2":{"name":"buster-assertions","version":"0.7.2","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.4"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.7.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"cf2c591cff09bca76010831a22ece07c975cbe4c","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.7.2.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.7.3":{"name":"buster-assertions","version":"0.7.3","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.4"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.7.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"058136eddd73315482ecf67510e2ae4049cca33e","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.7.3.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.7.4":{"name":"buster-assertions","version":"0.7.4","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.4"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.7.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5e4d49bea37521a6c6bacbbebbbda88872f600c7","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.7.4.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.7.5":{"name":"buster-assertions","version":"0.7.5","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.4"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-assertions@0.7.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"b72d89ca71918be85fefb742575b2d2ca20ed9dc","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.7.5.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.8.1":{"name":"buster-assertions","version":"0.8.1","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":"~0.5"},"devDependencies":{"sinon":"~1.2","buster-util":"~0.4"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-assertions@0.8.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a9d72e98887b5f3e1d6cf9a660597d283b68b81c","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.8.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.9.0":{"name":"buster-assertions","version":"0.9.0","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":">=0.5.1"},"devDependencies":{"sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-assertions@0.9.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b21cb9ccf820f6db4e157b069bbc5838533a4f2c","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.9.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.10.0":{"name":"buster-assertions","version":"0.10.0","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":">=0.6.0"},"devDependencies":{"sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-assertions@0.10.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ad3cefea5bdfd6f765de6bce56c5c735b03867eb","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.10.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.10.1":{"name":"buster-assertions","version":"0.10.1","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"dependencies":{"buster-core":">=0.6.0"},"devDependencies":{"sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-assertions@0.10.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3e9d59bdeffb40a13160eadca57210d48ac969e1","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.10.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.10.2":{"name":"buster-assertions","version":"0.10.2","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2"},"devDependencies":{"sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-assertions@0.10.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"76ea8a0a44a68cf4d361847868877f4edf1eab22","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.10.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.10.3":{"name":"buster-assertions","version":"0.10.3","description":"Assertions for any JavaScript test framework and environment","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Assertions was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-assertions","repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2"},"devDependencies":{"sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-assertions@0.10.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f8279ea6aa66a4786a0b066e372681df97b3cff7","tarball":"http://registry.npmjs.org/buster-assertions/-/buster-assertions-0.10.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:16:13.403Z","created":"2011-08-08T20:18:02.792Z","0.6.0":"2011-08-08T20:18:03.635Z","0.6.1":"2011-08-23T22:13:56.866Z","0.7.0":"2011-10-17T19:21:08.259Z","0.7.1":"2011-10-18T10:02:01.982Z","0.7.2":"2011-10-19T18:10:27.321Z","0.7.3":"2011-10-19T18:58:26.088Z","0.7.4":"2011-10-19T19:18:05.412Z","0.7.5":"2011-10-19T19:19:54.275Z","0.8.1":"2011-12-05T21:17:18.746Z","0.9.0":"2012-02-16T19:35:25.448Z","0.10.0":"2012-04-17T20:25:56.690Z","0.10.1":"2012-04-25T20:56:54.669Z","0.10.2":"2012-06-20T20:33:31.740Z","0.10.3":"2012-07-09T22:16:13.403Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-assertions.git"},"_attachments":{"buster-assertions-0.10.3.tgz":{"content_type":"application/octet-stream","revpos":30,"digest":"md5-QCKA4D+N70d58GNnvMr5XQ==","length":17914,"stub":true},"buster-assertions-0.10.2.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-/cxns7FYPZqLrynI8JtoeA==","length":17888,"stub":true},"buster-assertions-0.10.1.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-E+RbslSc3cPl83RssVC+zA==","length":17655,"stub":true},"buster-assertions-0.10.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-rG7L6Wa8isDvy6lV2y9T2Q==","length":17363,"stub":true},"buster-assertions-0.9.0.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-IkASNnNZvDjYBWs9uDRLIQ==","length":16944,"stub":true},"buster-assertions-0.8.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-kugcbu0sTnkmvy1ATYzM3g==","length":15826,"stub":true},"buster-assertions-0.7.5.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-qv/hY2E5ivCMddKi5h6dNQ==","length":17143,"stub":true},"buster-assertions-0.7.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-dP8uj3S96lepLvZjFgeGOg==","length":17133,"stub":true},"buster-assertions-0.7.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-xgUx1u13f4CJ9SIK+fsmmQ==","length":17115,"stub":true},"buster-assertions-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-PrxOt7TUhSEOXvCqVC6dGA==","length":17024,"stub":true},"buster-assertions-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-zmsrWzJvGr5Irz826vFORQ==","length":16534,"stub":true},"buster-assertions-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7m1nQUIsVHlSW67ofESpOw==","length":16534,"stub":true},"buster-assertions-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GHpNevUMOysRrQi3PJ8pMQ==","length":15669,"stub":true},"buster-assertions-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-uPF1p5cenW7O58gGtQtEPQ==","length":15662,"stub":true}}}},
{"id":"buster-autotest","key":"buster-autotest","value":{"rev":"8-f7de2a3a9c42f5495e8e15d30ddb660f"},"doc":{"_id":"buster-autotest","_rev":"8-f7de2a3a9c42f5495e8e15d30ddb660f","name":"buster-autotest","description":"Watch files and run buster tests on save","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"buster-autotest","version":"0.1.0","description":"Watch files and run buster tests on save","homepage":"http://busterjs.org/docs/autotest","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-autotest","repository":{"type":"git","url":"git://github.com/busterjs/buster-autotest.git"},"dependencies":{"fs-watch-tree":">=0.1","buster-glob":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-autotest@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"790bb281e4f4ce5c447fb57d3ef83db4e722d574","tarball":"http://registry.npmjs.org/buster-autotest/-/buster-autotest-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.1.1":{"name":"buster-autotest","version":"0.1.1","description":"Watch files and run buster tests on save","homepage":"http://busterjs.org/docs/autotest","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-autotest","repository":{"type":"git","url":"git://github.com/busterjs/buster-autotest.git"},"dependencies":{"fs-watch-tree":">=0.1","buster-glob":">=0.3.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-autotest@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ffaa752d246100845a685fe4db0464482183ebdf","tarball":"http://registry.npmjs.org/buster-autotest/-/buster-autotest-0.1.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.0":{"name":"buster-autotest","version":"0.2.0","description":"Watch files and run buster tests on save","homepage":"http://busterjs.org/docs/autotest","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-autotest","repository":{"type":"git","url":"git://github.com/busterjs/buster-autotest.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"fs-watch-tree":">=0.2.1","buster-glob":">=0.3.2"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-autotest@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"686707f8820b3ecc7042c5faa76009c74135fa3e","tarball":"http://registry.npmjs.org/buster-autotest/-/buster-autotest-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:42:07.575Z","created":"2012-04-17T20:23:38.785Z","0.1.0":"2012-04-17T20:23:40.960Z","0.1.1":"2012-05-02T21:13:46.089Z","0.2.0":"2012-06-20T21:16:28.530Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://github.com/busterjs/buster-autotest.git"},"_attachments":{"buster-autotest-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-OJ8aRLu2xEzz1uFNTuTgXQ==","length":3160,"stub":true},"buster-autotest-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-x43kLcxVSdHvSJ/sTl5MVA==","length":2724,"stub":true},"buster-autotest-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZP/2Umg8mO+JaFF662B65g==","length":2721,"stub":true}}}},
{"id":"buster-bayeux-emitter","key":"buster-bayeux-emitter","value":{"rev":"5-4ef9b5bb824b67af02618e22c27b39e0"},"doc":{"_id":"buster-bayeux-emitter","_rev":"5-4ef9b5bb824b67af02618e22c27b39e0","name":"buster-bayeux-emitter","description":"Allows event-emitter events travel safely over a bayeux transport","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"buster-bayeux-emitter","version":"0.1.0","description":"Allows event-emitter events travel safely over a bayeux transport","homepage":"http://busterjs.org/buster-bayeux-emitter","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-bayeux-emitter","repository":{"type":"git","url":"git://gitorious.org/buster/buster-bayeux-emitter.git"},"dependencies":{"buster-core":"~0.5"},"devDependencies":{"buster":"*","faye":"~0.7"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-bayeux-emitter@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"175407c829dc71c5b86d2a60bc509e7a89e8ee40","tarball":"http://registry.npmjs.org/buster-bayeux-emitter/-/buster-bayeux-emitter-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.1.1":{"name":"buster-bayeux-emitter","version":"0.1.1","description":"Allows event-emitter events travel safely over a bayeux transport","homepage":"http://busterjs.org/buster-bayeux-emitter","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-bayeux-emitter","repository":{"type":"git","url":"git://gitorious.org/buster/buster-bayeux-emitter.git"},"dependencies":{"buster-core":"~0.6"},"devDependencies":{"buster":"*","faye":"~0.7"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-bayeux-emitter@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"9a5c94cb85a7bf5b57c717d0bbd01aa1b0cbfb13","tarball":"http://registry.npmjs.org/buster-bayeux-emitter/-/buster-bayeux-emitter-0.1.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2012-04-17T21:26:08.920Z","created":"2011-12-05T21:21:16.630Z","0.1.0":"2011-12-05T21:21:20.502Z","0.1.1":"2012-04-17T21:26:08.920Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-bayeux-emitter.git"},"_attachments":{"buster-bayeux-emitter-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9kZ49kTvTN91xNyPo8V1Jg==","length":2082,"stub":true},"buster-bayeux-emitter-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-qwNV/PkWHuGxJkcZNy+kaA==","length":2064,"stub":true}}}},
{"id":"buster-capture-server","key":"buster-capture-server","value":{"rev":"16-7d76fe733fef6956466928ca03af3be8"},"doc":{"_id":"buster-capture-server","_rev":"16-7d76fe733fef6956466928ca03af3be8","name":"buster-capture-server","description":"Buster capture server","dist-tags":{"latest":"0.5.1"},"versions":{"0.3.0":{"name":"buster-capture-server","version":"0.3.0","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4","buster-resources":"~0.1","faye":"~0.7","ejs":"~0.4","node-uuid":"~1"},"devDependencies":{"buster":""},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d065fb180bd1a53b041482fd3495acb6ffafc12d","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-capture-server","version":"0.3.1","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4","buster-resources":"~0.1","faye":"~0.7","ejs":"~0.4","node-uuid":"~1"},"devDependencies":{"buster":""},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"5b411b2ae82cc6eadf9927c8466905ea76e438dd","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-capture-server","version":"0.4.0","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"dependencies":{"buster-core":">=0.5.1","buster-resources":">=0.2","faye":"~0.7","ejs":"~0.4","node-uuid":"~1","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster":"*","htmlparser":"~1.7","soupselect":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c69503b560c48777867bd242ef0dc711a4ca2e51","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.1":{"name":"buster-capture-server","version":"0.4.1","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"dependencies":{"buster-core":">=0.5.1","buster-resources":">=0.2","buster-faye":"~0.7","ejs":"~0.4","node-uuid":"~1","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster":"*","htmlparser":"~1.7","soupselect":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"427a4fdaa5d92765c024e76f9879a7ae1a894855","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.2":{"name":"buster-capture-server","version":"0.4.2","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"dependencies":{"buster-core":">=0.6.0","buster-resources":">=0.3","buster-faye":"~0.7","ejs":"~0.4","node-uuid":"~1","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster":"*","htmlparser":"~1.7","soupselect":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"abe9f495e4ca813261897fbed809b14c5eaf3883","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-capture-server","version":"0.5.0","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","ramp-resources":">=0.4","faye":"~0.8","ejs":"~0.4","node-uuid":"~1","when":"~1"},"devDependencies":{"buster":"*","sinon":">=1.3","htmlparser":"~1.7","soupselect":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"5c4acd2f3d53c4403c7b400b06f82f612dcb7db7","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-capture-server","version":"0.5.1","description":"Buster capture server","homepage":"http://busterjs.org/docs/buster-capture-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-capture-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","ramp-resources":">=0.4","faye":"~0.8","ejs":"~0.4","node-uuid":"~1","when":"https://github.com/cujojs/when/tarball/1.3.0"},"devDependencies":{"buster":"*","sinon":">=1.4","htmlparser":"~1.7","soupselect":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-capture-server@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"98f621764a67136687aa577c40470cfb1e503cb6","tarball":"http://registry.npmjs.org/buster-capture-server/-/buster-capture-server-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:19:13.576Z","created":"2011-12-05T21:20:57.627Z","0.3.0":"2011-12-05T21:21:01.477Z","0.3.1":"2011-12-12T12:51:28.058Z","0.4.0":"2012-02-16T19:42:22.451Z","0.4.1":"2012-02-18T10:39:25.769Z","0.4.2":"2012-04-17T21:24:55.762Z","0.5.0":"2012-06-20T21:21:27.348Z","0.5.1":"2012-07-09T22:19:13.576Z"},"author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-capture-server.git"},"_attachments":{"buster-capture-server-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-SIKHJPMGqcpg76sqUSyhLA==","length":39956,"stub":true},"buster-capture-server-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/OfUma9mIRh+ady8Ho+sFw==","length":39867,"stub":true},"buster-capture-server-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Q53VDfcaOVAOkYSUh7NGRg==","length":26415,"stub":true},"buster-capture-server-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-b7kedGlKg1TMhcTYHzGT5A==","length":26571,"stub":true},"buster-capture-server-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-bZKdtI31LKV9Bu3+/jwfqQ==","length":26257,"stub":true},"buster-capture-server-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-USr33OQBfY9H7HjQXFqXUA==","length":33650,"stub":true},"buster-capture-server-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3Nd5vDp7Pen89ow2ReXZ/A==","length":33796,"stub":true}}}},
{"id":"buster-cli","key":"buster-cli","value":{"rev":"24-0b9624072d9f9b86fb63002ddaae0c85"},"doc":{"_id":"buster-cli","_rev":"24-0b9624072d9f9b86fb63002ddaae0c85","name":"buster-cli","description":"Internal wrapper and util for creating CLIs in the buster project.","dist-tags":{"latest":"0.5.0"},"versions":{"0.2.1":{"name":"buster-cli","version":"0.2.1","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":"~0.2","buster-terminal":"~0.2","buster-evented-logger":"~0.3","buster-configuration":"~0.1","rimraf":"~1"},"devDependencies":{},"_id":"buster-cli@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"eff2b0ff8407462f85af5da203b67b6036dd7203","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.2":{"name":"buster-cli","version":"0.2.2","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":"~0.2","buster-terminal":"~0.2","buster-evented-logger":"~0.3","buster-configuration":"~0.1","rimraf":"~1"},"devDependencies":{},"_id":"buster-cli@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"5fc41c82a86bd0839eba9e6311fd5d501f83e584","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.3.0":{"name":"buster-cli","version":"0.3.0","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":"~0.3","buster-terminal":"~0.3","buster-stdio-logger":"~0.2","buster-configuration":"~0.2","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.3.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"88fd9d17ceeef3415995746c282eaa2c1ec4d463","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.0":{"name":"buster-cli","version":"0.4.0","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":">=0.3","buster-terminal":">=0.3","buster-stdio-logger":">=0.2.1","buster-configuration":">=0.3","rimraf":"~1","minimatch":"~0.1.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.4.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"481cc5e12313a58653d4bb2b0640d1fa05cc6846","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.1":{"name":"buster-cli","version":"0.4.1","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":">=0.3","buster-terminal":">=0.3","buster-stdio-logger":">=0.2.1","buster-configuration":">=0.3","rimraf":"~1","minimatch":"~0.1.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.4.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c9e69078de9c5bc233309a5be5b751140c93c602","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.2":{"name":"buster-cli","version":"0.4.2","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":">=0.3.1","buster-terminal":">=0.4","buster-stdio-logger":">=0.2.2","buster-configuration":">=0.3","rimraf":"~1","minimatch":"~0.1.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.4.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"0a7ce30028b53b95c2459cbd09c9e07aad781994","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.3":{"name":"buster-cli","version":"0.4.3","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":">=0.3.1","buster-terminal":">=0.4","buster-stdio-logger":">=0.2.2","buster-configuration":">=0.4.1","rimraf":"~1","minimatch":"~0.1.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.4.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"54d1843d22568c0f5d8d0d8d01ed23270f5781d3","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.4.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.4":{"name":"buster-cli","version":"0.4.4","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"dependencies":{"buster-args":">=0.3.1","buster-terminal":">=0.4","buster-stdio-logger":">=0.2.2","buster-configuration":">=0.4.1","rimraf":"~1","minimatch":"~0.1.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.4.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"9e4859a124abc7f70151e9dc9faf93960156cb7d","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.4.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.0":{"name":"buster-cli","version":"0.5.0","description":"Internal wrapper and util for creating CLIs in the buster project.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-cli/blobs/master/LICENSE"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2","posix-argv-parser":">=0.4","buster-terminal":">=0.4.1","stream-logger":">=0.3.0","buster-configuration":">=0.5.0","rimraf":"~1","minimatch":">=0.2"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-cli@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"fa5c9d4dd9ba11d0a067b5f2cf27ee894111c76e","tarball":"http://registry.npmjs.org/buster-cli/-/buster-cli-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:42:19.721Z","created":"2011-08-23T22:35:44.897Z","0.2.1":"2011-08-23T22:35:45.703Z","0.2.2":"2011-08-25T11:54:11.366Z","0.3.0":"2011-12-05T21:23:17.566Z","0.4.0":"2012-02-16T19:47:02.840Z","0.4.1":"2012-02-19T10:59:02.447Z","0.4.2":"2012-04-17T21:35:45.912Z","0.4.3":"2012-04-17T21:49:16.909Z","0.4.4":"2012-05-02T21:27:17.077Z","0.5.0":"2012-06-20T21:37:15.371Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-cli"},"_attachments":{"buster-cli-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-2jT0+ECgV71RMweNowBU/w==","length":9083,"stub":true},"buster-cli-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-IJ32b2E8Ocg9c4BKq/cPhQ==","length":8621,"stub":true},"buster-cli-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-SBX6p9IHxy020niVBAr2YA==","length":8289,"stub":true},"buster-cli-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-bA8MgLKlpmYvMVlHdllS6w==","length":8294,"stub":true},"buster-cli-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-+4TfiaP1I1PAOwpq9ivTXg==","length":8253,"stub":true},"buster-cli-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-hvWhPrundZydH6KVdwMQxg==","length":8270,"stub":true},"buster-cli-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-whTZMIxlAs4RVOuLaiT+Yg==","length":7806,"stub":true},"buster-cli-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-h5sl84F4tVV43mJQd9qm3A==","length":7055,"stub":true},"buster-cli-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-+K9mem2+BLPFAVOCdUExLw==","length":7025,"stub":true}}}},
{"id":"buster-client","key":"buster-client","value":{"rev":"19-cbaefbdbcd304964383296c3b7c8daf2"},"doc":{"_id":"buster-client","_rev":"19-cbaefbdbcd304964383296c3b7c8daf2","name":"buster-client","description":"Client libraries to interact with a buster-capture-server","dist-tags":{"latest":"0.5.4"},"versions":{"0.3.0":{"name":"buster-client","version":"0.3.0","description":"Client libraries to interact with buster-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":"~>0.3","buster-promise":"~>0.3","glob":"~2.0","coffee-script":"~1","buster-module-loader":"~>0.2","buster-multicast":"~>0.1","rimraf":"~1","kaffeine":"0.0.6"},"devDependencies":{},"_id":"buster-client@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"e10304cd1818a754af4f5a58138ecae390ef015d","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-client","version":"0.3.1","description":"Client libraries to interact with buster-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":"~0.3","buster-promise":"~0.3","buster-configuration":"~0.1","buster-multicast":"~0.1","coffee-script":"~1","kaffeine":"0.0.6"},"devDependencies":{"glob":"~2.0"},"_id":"buster-client@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"1f8143582b9db9091faf45d1dadc75d151f44e35","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.2":{"name":"buster-client","version":"0.3.2","description":"Client libraries to interact with buster-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":"~0.3","buster-promise":"~0.3","buster-configuration":"~0.1","buster-multicast":"~0.1","coffee-script":"~1","kaffeine":"0.0.6"},"devDependencies":{"glob":"~2.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"1c1e6a17457576762906361a7b6e42224d65dae6","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.3.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-client","version":"0.4.0","description":"Client libraries to interact with a buster-capture-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4","buster-configuration":"~0.2","buster-bayeux-emitter":"~0.1","faye":"~0.7"},"devDependencies":{"buster-resources":"~0.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a438f2177605fb309382b612cf7baa8d7eb83610","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-client","version":"0.5.0","description":"Client libraries to interact with a buster-capture-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":">=0.5.1","buster-configuration":">=0.3","buster-bayeux-emitter":">=0.1","faye":"~0.7","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-resources":">=0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"83890af28bba219724c2e294d6e3c9fc2c588a8c","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-client","version":"0.5.1","description":"Client libraries to interact with a buster-capture-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":">=0.5.1","buster-configuration":">=0.3","buster-bayeux-emitter":">=0.1","faye":"~0.7","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-resources":">=0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1cf30856764b68e946606b3750b88a726444d72d","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.2":{"name":"buster-client","version":"0.5.2","description":"Client libraries to interact with a buster-capture-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":">=0.5.1","buster-configuration":">=0.3","buster-bayeux-emitter":">=0.1","buster-faye":"~0.7","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-resources":">=0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c9f55319cf4779f25d98006f2d7c0a475fc995a3","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.5.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.3":{"name":"buster-client","version":"0.5.3","description":"Client libraries to interact with a buster-capture-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":">=0.6.0","buster-configuration":">=0.3","buster-bayeux-emitter":">=0.1.1","buster-faye":"~0.7","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-resources":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.5.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4b3c19eae9fa39f39afe89b8f6692539fe17cf75","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.5.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.4":{"name":"buster-client","version":"0.5.4","description":"Client libraries to interact with a buster-capture-server","homepage":"http://busterjs.org/buster-client","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Client was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-client","repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"dependencies":{"buster-core":">=0.6.0","buster-configuration":">=0.4.1","buster-bayeux-emitter":">=0.1.1","buster-faye":"~0.7","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-resources":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-client@0.5.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d084afc0d7c3434abc8cc02174432beb16c8782a","tarball":"http://registry.npmjs.org/buster-client/-/buster-client-0.5.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2012-04-17T21:47:57.191Z","created":"2011-08-08T23:02:26.007Z","0.3.0":"2011-08-08T23:02:26.868Z","0.3.1":"2011-08-23T22:31:28.526Z","0.3.2":"2011-10-19T19:12:30.759Z","0.4.0":"2011-12-05T21:22:15.944Z","0.5.0":"2012-02-16T19:45:21.531Z","0.5.1":"2012-02-17T22:44:13.654Z","0.5.2":"2012-02-18T11:05:52.268Z","0.5.3":"2012-04-17T21:30:00.620Z","0.5.4":"2012-04-17T21:47:57.191Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-client.git"},"_attachments":{"buster-client-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-BMAgcbnII9U+iXkqJIa5Og==","length":7848,"stub":true},"buster-client-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-qtt7SJnl3TVuBnQAqlOaWA==","length":7847,"stub":true},"buster-client-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-Usqh/PUIxUgM4JUqMPxr4w==","length":7717,"stub":true},"buster-client-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-IpZ9UC9eZQfq67jiF/S87A==","length":7715,"stub":true},"buster-client-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MFBW6ArroXHG50douXrrOA==","length":7687,"stub":true},"buster-client-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-nayGH+3hO8PVyHLRniUD8A==","length":7911,"stub":true},"buster-client-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QH0hW2tGhfByB902OktXAQ==","length":8179,"stub":true},"buster-client-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-zlt4XJtXommc7b4E90AQmg==","length":8130,"stub":true},"buster-client-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lZf2xCIkLJChv0kRmFv/og==","length":16749,"stub":true}}}},
{"id":"buster-coffee","key":"buster-coffee","value":{"rev":"9-7f7639d0075072a38759882116c1040d"},"doc":{"_id":"buster-coffee","_rev":"9-7f7639d0075072a38759882116c1040d","name":"buster-coffee","description":"Buster.JS extension: Automatically compile CoffeeScript files before running tests","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"buster-coffee","version":"0.1.0","description":"Buster extension: Compiles CoffeeScript files before running tests","homepage":"https://github.com/jodal/buster-coffee","author":{"name":"Stein Magnus Jodal","email":"stein.magnus@jodal.no","url":"http://www.jodal.no"},"repository":{"url":"git://github.com/jodal/buster-coffee.git"},"main":"lib/buster-coffee.js","scripts":{"test":"buster test"},"dependencies":{"coffee-script":"","when":"https://github.com/cujojs/when/tarball/1.2.0"},"devDependencies":{"buster":"","buster-resources":"","buster-lint":""},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jodal","email":"stein.magnus@jodal.no"},"_id":"buster-coffee@0.1.0","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"0c28df30c32441a3fc323cb096d4c5c2a3dbc438","tarball":"http://registry.npmjs.org/buster-coffee/-/buster-coffee-0.1.0.tgz"},"maintainers":[{"name":"jodal","email":"stein.magnus@jodal.no"}]},"0.1.1":{"name":"buster-coffee","version":"0.1.1","description":"Buster extension: Compiles CoffeeScript files before running tests","homepage":"https://github.com/jodal/buster-coffee","author":{"name":"Stein Magnus Jodal","email":"stein.magnus@jodal.no","url":"http://www.jodal.no"},"repository":{"type":"git","url":"git://github.com/jodal/buster-coffee.git"},"main":"lib/buster-coffee.js","scripts":{"test":"buster test"},"dependencies":{"coffee-script":"","when":"https://github.com/cujojs/when/tarball/1.2.0"},"devDependencies":{"buster":"","buster-resources":"","buster-lint":""},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jodal","email":"stein.magnus@jodal.no"},"_id":"buster-coffee@0.1.1","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"649c44c17cb3afc08f287dc3a834537f9c5a0d07","tarball":"http://registry.npmjs.org/buster-coffee/-/buster-coffee-0.1.1.tgz"},"maintainers":[{"name":"jodal","email":"stein.magnus@jodal.no"}]},"0.1.2":{"name":"buster-coffee","version":"0.1.2","description":"Buster extension: Compiles CoffeeScript files before running tests","homepage":"https://github.com/jodal/buster-coffee","author":{"name":"Stein Magnus Jodal","email":"stein.magnus@jodal.no","url":"http://www.jodal.no"},"repository":{"type":"git","url":"git://github.com/jodal/buster-coffee.git"},"main":"lib/buster-coffee.js","scripts":{"test":"buster test"},"dependencies":{"coffee-script":""},"devDependencies":{"buster":"","buster-resources":"","buster-lint":""},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jodal","email":"stein.magnus@jodal.no"},"_id":"buster-coffee@0.1.2","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"91e526a19f47814f8ea8fd16ba0e49258771f496","tarball":"http://registry.npmjs.org/buster-coffee/-/buster-coffee-0.1.2.tgz"},"maintainers":[{"name":"jodal","email":"stein.magnus@jodal.no"}]},"0.1.3":{"name":"buster-coffee","version":"0.1.3","description":"Buster.JS extension: Automatically compile CoffeeScript files before running tests","homepage":"https://github.com/jodal/buster-coffee","author":{"name":"Stein Magnus Jodal","email":"stein.magnus@jodal.no","url":"http://www.jodal.no"},"repository":{"type":"git","url":"git://github.com/jodal/buster-coffee.git"},"main":"lib/buster-coffee.js","scripts":{"test":"buster test"},"dependencies":{"coffee-script":""},"devDependencies":{"buster":"","buster-resources":"","buster-lint":""},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"jodal","email":"stein.magnus@jodal.no"},"_id":"buster-coffee@0.1.3","_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"5d540f2ecaf88da862bb03d470c0541c2a70937f","tarball":"http://registry.npmjs.org/buster-coffee/-/buster-coffee-0.1.3.tgz"},"maintainers":[{"name":"jodal","email":"stein.magnus@jodal.no"}]}},"readme":"# buster-coffee\n\nAn extension for [buster.js](http://busterjs.org) to automatically compile your\n[CoffeeScript](http://coffeescript.org) files before running tests.\n\n\n## Installation\n\nInstall from npm:\n\n    npm install buster-coffee\n\nThen add it to your `buster.js` config file:\n\n    config[\"My tests\"] = {\n      // ...\n      extensions: [require(\"buster-coffee\")]\n      // ...\n    };\n\n\n## Configuration\n\nThe extension has no configuration options.\n\n\n## Example web project\n\nSee the `demo/` dir for an example project using Buster.js and buster-coffee to\ntest a function that is implemented in CoffeeScript, using tests written in\nCoffeeScript.\n\n\n## Node.js and `require()`\n\nCurrently, buster-coffee does not work with files that are to be included using\n`require()`. buster-coffee never writes any files to disk, while `require()`\nexplictly looks for the files it will include on disk. Because of this,\nbuster-coffee has limited use for Node.js developement in CoffeeScript.\n\n\n## Changelog\n\n### 0.1.0 (2012-05-20)\n\n- Initial release.\n\n\n## License\n\nCopyright 2012, Stein Magnus Jodal.\n\nReleased under the Simplified BSD license. See the `LICENSE` file for details.\n","maintainers":[{"name":"jodal","email":"stein.magnus@jodal.no"}],"time":{"modified":"2012-05-24T18:45:46.807Z","created":"2012-05-20T18:47:03.262Z","0.1.0":"2012-05-20T18:47:05.173Z","0.1.1":"2012-05-20T19:28:58.390Z","0.1.2":"2012-05-21T06:37:08.794Z","0.1.3":"2012-05-24T18:45:46.807Z"},"author":{"name":"Stein Magnus Jodal","email":"stein.magnus@jodal.no","url":"http://www.jodal.no"},"repository":{"type":"git","url":"git://github.com/jodal/buster-coffee.git"},"_attachments":{"buster-coffee-0.1.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-eWAfVDWfoqo10ChwzXMcnA==","length":3616,"stub":true},"buster-coffee-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Phs51/Z9uE3sDDy9eaLtag==","length":3477,"stub":true},"buster-coffee-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-8OzQ5vQSbIkaU01qZOHpiA==","length":3507,"stub":true},"buster-coffee-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-f078DQ+pXqigsRUKQMOAZg==","length":3873,"stub":true}}}},
{"id":"buster-configuration","key":"buster-configuration","value":{"rev":"26-4d5d231fb1aab2b986d232a8d19b9838"},"doc":{"_id":"buster-configuration","_rev":"26-4d5d231fb1aab2b986d232a8d19b9838","name":"buster-configuration","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","dist-tags":{"latest":"0.5.1"},"versions":{"0.1.0":{"name":"buster-configuration","version":"0.1.0","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":"~0.3","buster-promise":"~0.3","glob":"~2.0","buster-module-loader":"~0.2"},"devDependencies":{"buster":"~0.2.0","rimraf":"~1"},"_id":"buster-configuration@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"cf3c35269f7d48544a09125dd20d49a92950fe4e","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.0":{"name":"buster-configuration","version":"0.2.0","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4","buster-resources":"~0.1","buster-module-loader":"~0.3","glob":"~2.1","buster-evented-logger":"~0.4","buster-assertions":"~0.8","buster-format":"~0.5","buster-bayeux-emitter":"~0.1","sinon":"~1.2","sinon-buster":"~0.4","buster-test":"~0.3"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2a6d16e7c5fb0284ad957741956571fcedece17d","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.1":{"name":"buster-configuration","version":"0.2.1","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4","buster-resources":"~0.1","buster-module-loader":"~0.3","glob":"~2.1","buster-evented-logger":"~0.4","buster-assertions":"~0.8","buster-format":"~0.5","buster-bayeux-emitter":"~0.1","sinon":"~1.2","sinon-buster":"~0.4","buster-test":"~0.3"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"694435b2ea09d7cb75ac34b9b67d73dbf4844592","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.2.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.3.0":{"name":"buster-configuration","version":"0.3.0","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":">=0.5.1","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-resources":">=0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-bayeux-emitter":">=0.1","sinon":">=1.3","sinon-buster":">=0.4.1","buster-test":">=0.4"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8c3a4aed54282bd4cfe94d777c54a2d3fa8bced0","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.3.1":{"name":"buster-configuration","version":"0.3.1","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":">=0.5.1","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-resources":">=0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-bayeux-emitter":">=0.1","sinon":">=1.3","sinon-buster":">=0.4.1","buster-test":">=0.4.1"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"0c317771a64c603b739a52489a33d9139597fdbd","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-configuration","version":"0.4.0","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":">=0.6.0","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-resources":">=0.3","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-bayeux-emitter":">=0.1.1","sinon":">=1.3","sinon-buster":">=0.5.0","buster-test":">=0.5.0"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"60cb732a320c7bb53f46045362f2f41702671ebd","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.1":{"name":"buster-configuration","version":"0.4.1","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":">=0.6.0","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-resources":">=0.3","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-bayeux-emitter":">=0.1.1","sinon":">=1.3","sinon-buster":">=0.5.0","buster-test":">=0.5.0"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1479a035c52b7ee68692f6d4656a67dcc09aa07c","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.2":{"name":"buster-configuration","version":"0.4.2","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"dependencies":{"buster-core":">=0.6.0","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-resources":">=0.3","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-bayeux-emitter":">=0.1.1","sinon":">=1.3","sinon-buster":">=0.5.0","buster-test":">=0.5.0"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6171c54a73b904a91acd3c456509790608d2b9d9","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-configuration","version":"0.5.0","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","when":"~1.3","ramp-resources":">=0.4","buster-evented-logger":">=0.4.4","async":"~0.1","glob":"~3.1"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"de2da87204a5f8ebdbc3e53fb32602eac67a357d","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-configuration","version":"0.5.1","description":"Implements the buster.js configuration file, including resource loading, file globbing, grouped test configs and more","homepage":"http://busterjs.org/buster-configuration","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-configuration","repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","when":"https://github.com/cujojs/when/tarball/1.3.0","ramp-resources":">=0.4","buster-evented-logger":">=0.4.4","async":"~0.1","glob":"~3.1"},"devDependencies":{"buster":"*","rimraf":"~1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-configuration@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4159998d88ffcc41fc6e13b16650f123ad23c0e1","tarball":"http://registry.npmjs.org/buster-configuration/-/buster-configuration-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:20:17.908Z","created":"2011-08-23T22:27:27.763Z","0.1.0":"2011-08-23T22:27:28.714Z","0.2.0":"2011-12-05T21:21:40.200Z","0.2.1":"2011-12-10T11:23:02.067Z","0.3.0":"2012-02-16T19:44:43.734Z","0.3.1":"2012-02-21T22:31:14.157Z","0.4.0":"2012-04-17T21:28:38.586Z","0.4.1":"2012-04-17T21:46:21.043Z","0.4.2":"2012-06-18T11:41:10.956Z","0.5.0":"2012-06-20T21:07:45.469Z","0.5.1":"2012-07-09T22:20:17.908Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-configuration.git"},"_attachments":{"buster-configuration-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":26,"digest":"md5-Uh4keaEafjdIltG11nKHVg==","length":10228,"stub":true},"buster-configuration-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-twGFRqvzDWiX4BjyuM7/yQ==","length":10196,"stub":true},"buster-configuration-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-xkt36Pua+vPy4ZvMn0yDmQ==","length":9404,"stub":true},"buster-configuration-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-g0U2E/sZB7WXB4/QVEYjPQ==","length":9511,"stub":true},"buster-configuration-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-tdXixevc9MdaY5waU0LGSQ==","length":9527,"stub":true},"buster-configuration-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-6L7N4z7r3UhCxERaNb8VnA==","length":9136,"stub":true},"buster-configuration-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-8eNH18cu+tywDOgqvFxsTg==","length":9131,"stub":true},"buster-configuration-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-RQqJBIznhiVox58UY4FoUQ==","length":8223,"stub":true},"buster-configuration-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-VYp/PI7MMgz0WRK9sSIHIw==","length":8142,"stub":true},"buster-configuration-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-TeFQWuZ9z5L/etimQljyBA==","length":10304,"stub":true}}}},
{"id":"buster-core","key":"buster-core","value":{"rev":"23-aee1ad7ef4f2738986458592a481db19"},"doc":{"_id":"buster-core","_rev":"23-aee1ad7ef4f2738986458592a481db19","name":"buster-core","description":"Buster core utilities","dist-tags":{"latest":"0.6.4"},"versions":{"0.3.0":{"name":"buster-core","version":"0.3.0","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.3","sinon":"~>1.1"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"dependencies":{},"_id":"buster-core@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"76a5fbcc660df4d197c512a6f8af50be2d5c3823","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-core","version":"0.3.1","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.3","sinon":"~>1.1"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"dependencies":{},"_id":"buster-core@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"99de91efd0d62c1e90c2b44169bac568a0dcce87","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-core","version":"0.4.0","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.3","sinon":"~>1.1"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"dependencies":{},"_id":"buster-core@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"93ae800d457c0ff7a871fb5eb829649c74a80aba","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.4.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-core","version":"0.5.0","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.4","sinon":"~1.2"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.5.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"dbe6f9036c5545b117d169ef2116bc6e44e17d04","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-core","version":"0.5.1","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.5","sinon":">=1.3"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.5.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f193590dbfa55341213cb7276b8f3ec2a1106adf","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.0":{"name":"buster-core","version":"0.6.0","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.5","sinon":">=1.3"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.6.0","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"013f58f6228d7373dd44eaf27d3fe090a7573be0","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.6.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.1":{"name":"buster-core","version":"0.6.1","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"devDependencies":{"buster-util":"0.5","sinon":">=1.3"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.6.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ee341566eb50eca271441668a82fab755c916a9b","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.6.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.2":{"name":"buster-core","version":"0.6.2","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"scripts":{"test":"./run-tests"},"devDependencies":{"buster-util":"0.5","sinon":">=1.3"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.6.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"25c3934fccf7e3905dedb1c5388d60a6030b8a71","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.6.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.3":{"name":"buster-core","version":"0.6.3","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"scripts":{"test":"./run-tests"},"devDependencies":{"buster-util":"0.5","sinon":">=1.3"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.6.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f27880d65f988d83b423852ab96b0449fe25fc9a","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.6.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]},"0.6.4":{"name":"buster-core","version":"0.6.4","description":"Buster core utilities","homepage":"http://busterjs.org/docs/buster-core","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Core was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"scripts":{"test":"./run-tests"},"devDependencies":{"buster-util":"0.5","sinon":">=1.3"},"main":"./lib/buster-core","repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-core@0.6.4","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"27bf6bad674244ea720f311d900a0ca1cb786050","tarball":"http://registry.npmjs.org/buster-core/-/buster-core-0.6.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-08-02T13:34:18.937Z","created":"2011-08-08T20:05:20.077Z","0.3.0":"2011-08-08T20:05:20.751Z","0.3.1":"2011-08-23T22:10:32.103Z","0.4.0":"2011-10-18T09:58:00.708Z","0.5.0":"2011-12-05T21:16:00.133Z","0.5.1":"2012-02-16T19:30:09.682Z","0.6.0":"2012-04-17T20:20:40.083Z","0.6.1":"2012-05-04T21:11:37.947Z","0.6.2":"2012-06-20T20:25:24.666Z","0.6.3":"2012-07-09T22:21:19.465Z","0.6.4":"2012-07-11T20:29:59.906Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-core.git"},"users":{"fgribreau":true},"_attachments":{"buster-core-0.6.4.tgz":{"content_type":"application/octet-stream","revpos":22,"digest":"md5-glsn3YaNBCix3m5LyLanag==","length":244235,"stub":true},"buster-core-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":20,"digest":"md5-SiiZ/er3SByadCtRqliuvg==","length":244203,"stub":true},"buster-core-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-yCW5F1A46+a+QdiSyaJGWg==","length":229716,"stub":true},"buster-core-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-bSgvGDUXp3ydGOmW+60viA==","length":228808,"stub":true},"buster-core-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-vurHpQnNIHx+Jn9hCLIYtA==","length":228825,"stub":true},"buster-core-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-l/yKiARWW9WJWHkZ0gxFNw==","length":228560,"stub":true},"buster-core-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-5+ZNJkIKVZ6+80YFIT1iVw==","length":224578,"stub":true},"buster-core-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mn9ukviB+BBFjUdisFxa/Q==","length":5330,"stub":true},"buster-core-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-7YyLHdAoIlRqSkJ8rnWyMQ==","length":5908,"stub":true},"buster-core-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-EtLyCz6dZAsypTiPBUtPyA==","length":5813,"stub":true}}}},
{"id":"buster-dev-tools","key":"buster-dev-tools","value":{"rev":"5-1970cae5ef2c4e0ee687936375e804ec"},"doc":{"_id":"buster-dev-tools","_rev":"5-1970cae5ef2c4e0ee687936375e804ec","name":"buster-dev-tools","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"buster-dev-tools","version":"0.1.0","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"bin":{"buster-dev-tools":"./bin/buster-dev-tools"},"_npmUser":{"name":"augustl","email":"agust@augustl.com"},"_id":"buster-dev-tools@0.1.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"84a6707f56d5c01164df3d3b3a746fe91f82f131","tarball":"http://registry.npmjs.org/buster-dev-tools/-/buster-dev-tools-0.1.0.tgz"},"readme":"","maintainers":[{"name":"augustl","email":"agust@augustl.com"}]},"0.2.0":{"name":"buster-dev-tools","version":"0.2.0","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"bin":{"buster-dev-tools":"./bin/buster-dev-tools"},"_npmUser":{"name":"augustl","email":"august@augustl.com"},"_id":"buster-dev-tools@0.2.0","dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.4","_nodeVersion":"v0.6.12","_defaultsLoaded":true,"dist":{"shasum":"e2bc90de7efd24d3ebc9b559bd0ce5f5a0a85968","tarball":"http://registry.npmjs.org/buster-dev-tools/-/buster-dev-tools-0.2.0.tgz"},"readme":"","maintainers":[{"name":"augustl","email":"agust@augustl.com"}]}},"readme":"","maintainers":[{"name":"augustl","email":"agust@augustl.com"}],"time":{"modified":"2012-03-21T20:06:33.086Z","created":"2012-03-13T21:47:53.294Z","0.1.0":"2012-03-13T21:47:54.831Z","0.2.0":"2012-03-21T20:06:33.086Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"_attachments":{"buster-dev-tools-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-6gmn7Zspia9KtzqTYVKUVw==","length":2091,"stub":true},"buster-dev-tools-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-C1ntOVyTC1pqNtCRnjhbhw==","length":1959,"stub":true}}}},
{"id":"buster-evented-logger","key":"buster-evented-logger","value":{"rev":"16-3aea0fc3bd4a45bb44b22b9c041e584f"},"doc":{"_id":"buster-evented-logger","_rev":"16-3aea0fc3bd4a45bb44b22b9c041e584f","name":"buster-evented-logger","description":"An evented console logger","dist-tags":{"latest":"0.4.4"},"versions":{"0.3.0":{"name":"buster-evented-logger","version":"0.3.0","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"dependencies":{"buster-core":"~>0.3"},"devDependencies":{"sinon":"~>1.1","buster-assertions":"~>0.6","buster-format":"~>0.4","buster-util":"~>0.3"},"_id":"buster-evented-logger@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"0d58990ade6b0715053a93146ba6238fa4057ab0","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-evented-logger","version":"0.3.1","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"dependencies":{"buster-core":"~0.3"},"devDependencies":{"sinon":"~1.1","buster-assertions":"~0.6","buster-format":"~0.4","buster-util":"~0.3"},"_id":"buster-evented-logger@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"70d81dad90f412380e4ed424c33fda72e59b7186","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-evented-logger","version":"0.4.0","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"dependencies":{"buster-core":"~0.5"},"devDependencies":{"sinon":"~1.2","buster-assertions":"~0.8","buster-format":"~0.5","buster-util":"~0.4"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-evented-logger@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"030bf91a74febd5529e93188590a75f04ec1b3ed","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.1":{"name":"buster-evented-logger","version":"0.4.1","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"dependencies":{"buster-core":">=0.5.1"},"devDependencies":{"sinon":">=1.3","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-evented-logger@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"7ee8dc1fbfe90c3ead8199b0de9a118d9f113700","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.2":{"name":"buster-evented-logger","version":"0.4.2","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"dependencies":{"buster-core":">=0.5.1"},"devDependencies":{"sinon":">=1.3","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-evented-logger@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"245bb4a3ad398b17e63e5bc392bc5198a606c16f","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.3":{"name":"buster-evented-logger","version":"0.4.3","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"dependencies":{"buster-core":">=0.6.0"},"devDependencies":{"sinon":">=1.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-evented-logger@0.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"83f704e07e3c17bde22f05b328b3bac8645aca29","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.4.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.4":{"name":"buster-evented-logger","version":"0.4.4","description":"An evented console logger","homepage":"http://busterjs.org/docs/buster-evented-logger","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Evented logger was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-evented-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.0"},"devDependencies":{"sinon":">=1.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-evented-logger@0.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"687ed5b16e47cf47928f3d9e0f5cd04bdd2834cb","tarball":"http://registry.npmjs.org/buster-evented-logger/-/buster-evented-logger-0.4.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:42:46.089Z","created":"2011-08-08T22:02:31.718Z","0.3.0":"2011-08-08T22:02:32.745Z","0.3.1":"2011-08-23T22:19:38.174Z","0.4.0":"2011-12-05T21:19:50.711Z","0.4.1":"2012-02-16T19:35:56.849Z","0.4.2":"2012-02-21T22:06:52.964Z","0.4.3":"2012-04-17T20:29:13.659Z","0.4.4":"2012-06-20T20:20:04.220Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-evented-logger.git"},"_attachments":{"buster-evented-logger-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-oDqYy+LAb1a8ScWCoVAGSA==","length":20119,"stub":true},"buster-evented-logger-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zXHU3TO/4CsMjdVISPoRZQ==","length":16507,"stub":true},"buster-evented-logger-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-0xa1y2Xk93km4xkIDrF66A==","length":16494,"stub":true},"buster-evented-logger-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-QOR+i992szOqPn/4tdNrZw==","length":16428,"stub":true},"buster-evented-logger-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-EwUyssmsJVAuPZmkDiXYzQ==","length":20226,"stub":true},"buster-evented-logger-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-d4N+7RzblX/kSU1v1RF8pQ==","length":3717,"stub":true},"buster-evented-logger-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-74m+KF0OyF+LgsN8/J8ynQ==","length":3721,"stub":true}}}},
{"id":"buster-faye","key":"buster-faye","value":{"rev":"3-60c359c57099ac6609eb93d9a4b507af"},"doc":{"_id":"buster-faye","_rev":"3-60c359c57099ac6609eb93d9a4b507af","name":"buster-faye","description":"Temporary fork of Faye without redis","dist-tags":{"latest":"0.7.1"},"versions":{"0.7.1":{"name":"buster-faye","description":"Temporary fork of Faye without redis","homepage":"http://faye.jcoglan.com","author":{"name":"Hacked by August Lilleaas, original author: James Coglan","email":"jcoglan@gmail.com","url":"http://jcoglan.com/"},"keywords":["comet","websocket","pubsub","bayeux","ajax","http"],"version":"0.7.1","engines":{"node":">=0.1.96"},"main":"./faye-node","dependencies":{"cookiejar":""},"bugs":{"name":"http://github.com/faye/faye/issues"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.php"}],"repositories":[{"type":"git","url":"git://github.com/faye/faye.git"}],"_npmUser":{"name":"augustl","email":"august@augustl.com"},"_id":"buster-faye@0.7.1","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"59ae5aee68877daac4b87c4bd17fdf088ec8ae36","tarball":"http://registry.npmjs.org/buster-faye/-/buster-faye-0.7.1.tgz"},"readme":"","maintainers":[{"name":"augustl","email":"august@augustl.com"}]}},"readme":"","maintainers":[{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-02-18T10:34:09.419Z","created":"2012-02-18T10:34:07.714Z","0.7.1":"2012-02-18T10:34:09.419Z"},"author":{"name":"Hacked by August Lilleaas, original author: James Coglan","email":"jcoglan@gmail.com","url":"http://jcoglan.com/"},"_attachments":{"buster-faye-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6yTSG04UioR1oLCdHgdpkQ==","length":47903,"stub":true}}}},
{"id":"buster-format","key":"buster-format","value":{"rev":"18-9d353be45cffa870fb61b715dc13e69b"},"doc":{"_id":"buster-format","_rev":"18-9d353be45cffa870fb61b715dc13e69b","name":"buster-format","description":"Tools for formatting JavaScript objects in a human-readable way","dist-tags":{"latest":"0.5.5"},"versions":{"0.4.0":{"name":"buster-format","version":"0.4.0","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"dependencies":{"buster-core":"~>0.3"},"devDependencies":{"buster-assertions":"~>0.6","buster-util":"~>0.3","sinon":"~>1.1"},"_id":"buster-format@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"07b8fcea9b3cd21fba59cd2c10354cb1ca6f7ad5","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.4.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.1":{"name":"buster-format","version":"0.4.1","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"dependencies":{"buster-core":"~0.3.1"},"devDependencies":{"buster-assertions":"~0.6","buster-util":"~0.3","sinon":"~1.1"},"_id":"buster-format@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"ce3ee7e005e7f978d38e6def88c66abfc08ef091","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.4.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-format","version":"0.5.0","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"dependencies":{"buster-core":"~0.5"},"devDependencies":{"buster-assertions":"~0.8","buster-util":"~0.4","sinon":"~1.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-format@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"077738a68944e8e27542364a0ac7681d399f7e57","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-format","version":"0.5.1","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"dependencies":{"buster-core":">=0.5.1"},"devDependencies":{"buster-assertions":">=0.9","buster-util":">=0.5","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-format@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"288128e98dbde540d6a8eed91be224813c43d263","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.2":{"name":"buster-format","version":"0.5.2","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"dependencies":{"buster-core":">=0.5.1"},"devDependencies":{"buster-assertions":">=0.9","buster-util":">=0.5","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-format@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c4a7c5567a71883d7fccb0979b277f041de462d0","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.5.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.3":{"name":"buster-format","version":"0.5.3","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"dependencies":{"buster-core":">=0.6.0"},"devDependencies":{"buster-assertions":">=0.10","buster-util":">=0.5","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-format@0.5.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"85621ccd75d325f130dfe0edc912248aec6fb823","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.5.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.4":{"name":"buster-format","version":"0.5.4","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2"},"devDependencies":{"buster-assertions":">=0.10.2","buster-util":">=0.5","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-format@0.5.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a78096c0880b4dfa85852adc0f37ebb25a3e8ab0","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.5.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.5":{"name":"buster-format","version":"0.5.5","description":"Tools for formatting JavaScript objects in a human-readable way","homepage":"http://busterjs.org/docs/buster-format","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Format was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-format","repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2"},"devDependencies":{"buster-assertions":">=0.10.2","buster-util":">=0.5","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-format@0.5.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1bb62ac8260c4caa36c19ad37342ce194d62da6f","tarball":"http://registry.npmjs.org/buster-format/-/buster-format-0.5.5.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:22:27.758Z","created":"2011-08-08T20:34:33.908Z","0.4.0":"2011-08-08T20:34:36.485Z","0.4.1":"2011-08-23T22:15:13.343Z","0.5.0":"2011-12-05T21:18:55.573Z","0.5.1":"2012-02-16T19:35:42.301Z","0.5.2":"2012-04-14T20:57:06.157Z","0.5.3":"2012-04-17T20:27:51.825Z","0.5.4":"2012-06-20T20:34:53.519Z","0.5.5":"2012-07-09T22:22:27.758Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-format.git"},"_attachments":{"buster-format-0.5.5.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-9Hsk3K6Ld8mYvOtop8Qo6A==","length":5639,"stub":true},"buster-format-0.5.4.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-+oOJ7FA3h+tPX09lnFxQlA==","length":5559,"stub":true},"buster-format-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-dJ9cA96gm7vY14etLPb9Mg==","length":5084,"stub":true},"buster-format-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-Dmh5ytWguS6SV8YwflrvjQ==","length":5078,"stub":true},"buster-format-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-txe+T+MWAjZxYr5muVEtIA==","length":5040,"stub":true},"buster-format-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-zQXY8dw7V2OFCvcOuYUbjw==","length":4997,"stub":true},"buster-format-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-HgR5hoM4x5r7TqACKC2s7w==","length":4889,"stub":true},"buster-format-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-R6RS9Xm9WdYHUzzSesNG6g==","length":4892,"stub":true}}}},
{"id":"buster-glob","key":"buster-glob","value":{"rev":"10-00e977e24b59419e73fe65a2bb69a306"},"doc":{"_id":"buster-glob","_rev":"10-00e977e24b59419e73fe65a2bb69a306","name":"buster-glob","description":"Small wrapper around the glob module that allows globbing for multiple patterns at once","dist-tags":{"latest":"0.3.2"},"versions":{"0.2.0":{"name":"buster-glob","version":"0.2.0","description":"Small wrapper around the glob module that allows globbing for multiple patterns at once","homepage":"http://busterjs.org/buster-glob","contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-glob","repository":{"type":"git","url":"git://gitorious.org/buster/buster-glob.git"},"dependencies":{"glob":">=3.0","buster-core":">=0.5.1"},"devDependencies":{"buster":"*","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-glob@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8d5e292f92948213168d7e0a8d8a4f521791c4a9","tarball":"http://registry.npmjs.org/buster-glob/-/buster-glob-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-glob","version":"0.3.0","description":"Small wrapper around the glob module that allows globbing for multiple patterns at once","homepage":"http://busterjs.org/buster-glob","contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-glob","repository":{"type":"git","url":"git://gitorious.org/buster/buster-glob.git"},"dependencies":{"glob":">=3.0","buster-core":">=0.6.0"},"devDependencies":{"buster":"*","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-glob@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"1b41f7d8d0b448c65a7461a179380a5a4b753dbd","tarball":"http://registry.npmjs.org/buster-glob/-/buster-glob-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-glob","version":"0.3.1","description":"Small wrapper around the glob module that allows globbing for multiple patterns at once","homepage":"http://busterjs.org/buster-glob","contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-glob","repository":{"type":"git","url":"git://gitorious.org/buster/buster-glob.git"},"dependencies":{"glob":">=3.1.9","buster-core":">=0.6.0"},"devDependencies":{"buster":"*","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-glob@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f64bf39a936b75bb5a5882fb70a1fa1892c1bafc","tarball":"http://registry.npmjs.org/buster-glob/-/buster-glob-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.2":{"name":"buster-glob","version":"0.3.2","description":"Small wrapper around the glob module that allows globbing for multiple patterns at once","homepage":"http://busterjs.org/buster-glob","contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-glob","repository":{"type":"git","url":"git://gitorious.org/buster/buster-glob.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"glob":">=3.1.9","buster-core":">=0.6.2"},"devDependencies":{"buster":"*","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-glob@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"fa7657702516ada76229ed823c8c53c9b3cb3b36","tarball":"http://registry.npmjs.org/buster-glob/-/buster-glob-0.3.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:43:03.453Z","created":"2012-02-16T19:39:10.929Z","0.2.0":"2012-02-16T19:39:13.339Z","0.3.0":"2012-04-17T20:22:18.446Z","0.3.1":"2012-05-02T21:14:34.914Z","0.3.2":"2012-06-20T20:36:27.783Z"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-glob.git"},"_attachments":{"buster-glob-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-Ca90EjMIUlYCHySAtMUnSA==","length":2275,"stub":true},"buster-glob-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-r2V1gt6TCa/MRvh1ZXwmdQ==","length":2008,"stub":true},"buster-glob-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-NvgcFEAyyfJzM5TyXQAZhA==","length":2004,"stub":true},"buster-glob-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-4isYGAK3BIyrrNsIWsL5dA==","length":1844,"stub":true}}}},
{"id":"buster-html-doc","key":"buster-html-doc","value":{"rev":"10-2888044c0d624af39e722e12fb1925cb"},"doc":{"_id":"buster-html-doc","_rev":"10-2888044c0d624af39e722e12fb1925cb","name":"buster-html-doc","description":"HTML doc feature (as found in JsTestDriver) as a Buster.JS extension","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"buster-html-doc","version":"0.1.0","description":"HTML doc feature (as found in JsTestDriver) as a Buster.JS extension","homepage":"http://busterjs.org/docs/html-doc/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/extension","repository":{"type":"git","url":"git://gitorious.org/buster/buster-html-doc.git"},"dependencies":{"zeparser":">=0.0.5"},"devDependencies":{"buster":"*","jsdom":"~0.2.10","buster-configuration":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-html-doc@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c4640fd50d1a7518561b9562131ecc5c30ce8c9b","tarball":"http://registry.npmjs.org/buster-html-doc/-/buster-html-doc-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.1.1":{"name":"buster-html-doc","version":"0.1.1","description":"HTML doc feature (as found in JsTestDriver) as a Buster.JS extension","homepage":"http://busterjs.org/docs/html-doc/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Dominykas Blyžė","url":"http://www.dominykas.com"}],"main":"./lib/extension","repository":{"type":"git","url":"git://gitorious.org/buster/buster-html-doc.git"},"dependencies":{"zeparser":">=0.0.5"},"devDependencies":{"buster":"*","jsdom":"~0.2.10","buster-configuration":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-html-doc@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"05fc48e52e6c0772f6ecfa036e2e780b5705c895","tarball":"http://registry.npmjs.org/buster-html-doc/-/buster-html-doc-0.1.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.0":{"name":"buster-html-doc","version":"0.2.0","description":"HTML doc feature (as found in JsTestDriver) as a Buster.JS extension","homepage":"http://busterjs.org/docs/html-doc/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Dominykas Blyžė","url":"http://www.dominykas.com"}],"main":"./lib/extension","repository":{"type":"git","url":"git://gitorious.org/buster/buster-html-doc.git"},"dependencies":{"zeparser":">=0.0.5"},"devDependencies":{"buster":"*","jsdom":"~0.2.14","buster-configuration":">=0.4.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-html-doc@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"94c25be75d48f720e82e9a352c2c8bc169c60520","tarball":"http://registry.npmjs.org/buster-html-doc/-/buster-html-doc-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-html-doc","version":"0.2.1","description":"HTML doc feature (as found in JsTestDriver) as a Buster.JS extension","homepage":"http://busterjs.org/docs/html-doc/","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Dominykas Blyžė","url":"http://www.dominykas.com"}],"main":"./lib/extension","repository":{"type":"git","url":"git://gitorious.org/buster/buster-html-doc.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"zeparser":">=0.0.5"},"devDependencies":{"buster":"*","jsdom":"~0.2.14","buster-configuration":">=0.5.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-html-doc@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"56dea17e10b35c8592bd4af943ca36f0e070f5a8","tarball":"http://registry.npmjs.org/buster-html-doc/-/buster-html-doc-0.2.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:43:16.830Z","created":"2012-02-27T09:44:27.930Z","0.1.0":"2012-02-27T09:44:29.659Z","0.1.1":"2012-02-28T06:42:33.852Z","0.2.0":"2012-04-18T08:27:11.257Z","0.2.1":"2012-06-20T21:12:00.112Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-html-doc.git"},"_attachments":{"buster-html-doc-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-oToDeHBRJ3tT+Z1Cl9mYWw==","length":3129,"stub":true},"buster-html-doc-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-tkaneV0r+ZLMy58ElNnppg==","length":2862,"stub":true},"buster-html-doc-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-M8iQc8Vwb5neShUc5UKIWA==","length":2860,"stub":true},"buster-html-doc-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-VJQMLQt/PbUBtxMivcLvAQ==","length":2661,"stub":true}}}},
{"id":"buster-jstestdriver","key":"buster-jstestdriver","value":{"rev":"10-37ecda523b765392b9e0b366d3458f9b"},"doc":{"_id":"buster-jstestdriver","_rev":"10-37ecda523b765392b9e0b366d3458f9b","name":"buster-jstestdriver","description":"Run JsTestDriver tests with Buster.JS","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"buster-jstestdriver","version":"0.1.0","description":"Run JsTestDriver tests with Buster.JS","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-jstestdriver","repository":{"type":"git","url":"git://gitorious.org/buster/buster-jstestdriver.git"},"dependencies":{"buster":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-jstestdriver@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"79d0ae77c9566dd5855b3a3ec7cebdb5eb15a790","tarball":"http://registry.npmjs.org/buster-jstestdriver/-/buster-jstestdriver-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.0":{"name":"buster-jstestdriver","version":"0.2.0","description":"Run JsTestDriver tests with Buster.JS","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-jstestdriver","repository":{"type":"git","url":"git://gitorious.org/buster/buster-jstestdriver.git"},"dependencies":{"buster":"~0.4"},"devDependencies":{"buster-configuration":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-jstestdriver@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"35cfd8f9d63628ada02a8b2f44c85c46fe3a2b5b","tarball":"http://registry.npmjs.org/buster-jstestdriver/-/buster-jstestdriver-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-jstestdriver","version":"0.2.1","description":"Run JsTestDriver tests with Buster.JS","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-jstestdriver","repository":{"type":"git","url":"git://gitorious.org/buster/buster-jstestdriver.git"},"dependencies":{"buster":">=0.4.5","buster-html-doc":">=0.1"},"devDependencies":{"buster-configuration":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-jstestdriver@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3f5c66d1adfa660a57868d3a6cb4a5c61b88b90b","tarball":"http://registry.npmjs.org/buster-jstestdriver/-/buster-jstestdriver-0.2.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.2":{"name":"buster-jstestdriver","version":"0.2.2","description":"Run JsTestDriver tests with Buster.JS","homepage":"http://busterjs.org/docs/buster-assertions","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-jstestdriver","repository":{"type":"git","url":"git://gitorious.org/buster/buster-jstestdriver.git"},"dependencies":{"buster":">=0.4.5","buster-html-doc":">=0.1"},"devDependencies":{"buster-configuration":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-jstestdriver@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"00bd7d01ffeeb55c46f4e132c7d8efc85b86c09a","tarball":"http://registry.npmjs.org/buster-jstestdriver/-/buster-jstestdriver-0.2.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:43:23.038Z","created":"2011-12-13T11:17:31.493Z","0.1.0":"2011-12-13T11:17:33.187Z","0.2.0":"2012-02-16T19:50:57.529Z","0.2.1":"2012-02-27T09:45:44.301Z","0.2.2":"2012-03-04T21:36:37.291Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-jstestdriver.git"},"_attachments":{"buster-jstestdriver-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-BRDTVnCEnSczC70Xym0Olg==","length":7493,"stub":true},"buster-jstestdriver-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-4Q6LG/M+8ZoGIfH3BOCxNQ==","length":7343,"stub":true},"buster-jstestdriver-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-iM0ZqvW7NJbigbgJ8sBvOw==","length":6196,"stub":true},"buster-jstestdriver-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-GqF29rsQ4vEfmH/9xDLW7A==","length":5736,"stub":true}}}},
{"id":"buster-lint","key":"buster-lint","value":{"rev":"13-d782bed56fb263cefc095383d4ca3238"},"doc":{"_id":"buster-lint","_rev":"13-d782bed56fb263cefc095383d4ca3238","name":"buster-lint","description":"Buster-extension: jslint/jshint your files as part of test run.","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"buster-lint","version":"0.1.0","description":"Buster-extension: jslint/jshint your files as part of test run.","homepage":"http://busterjs.org/docs/buster-lint","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"main":"./lib/buster-lint","repository":{"type":"git","url":"git://github.com/magnars/buster-lint.git"},"dependencies":{"autolint":">=1.0.3"},"devDependencies":{"buster":"*","buster-analyzer":">=0.1","buster-configuration":">=0.3"},"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"buster-lint@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"5e54b3420327d11f691296026eada7b2ca59ee8d","tarball":"http://registry.npmjs.org/buster-lint/-/buster-lint-0.1.0.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.1.1":{"name":"buster-lint","version":"0.1.1","description":"Buster-extension: jslint/jshint your files as part of test run.","homepage":"http://busterjs.org/docs/buster-lint","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"main":"./lib/buster-lint","repository":{"type":"git","url":"git://github.com/magnars/buster-lint.git"},"dependencies":{"autolint":">=1.0.3"},"devDependencies":{"buster":"*","buster-analyzer":">=0.1","buster-configuration":">=0.3"},"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"buster-lint@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ee991bb7d864a44c5d6182558c1f083f1a5f3dcf","tarball":"http://registry.npmjs.org/buster-lint/-/buster-lint-0.1.1.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.2.0":{"name":"buster-lint","version":"0.2.0","description":"Buster-extension: jslint/jshint your files as part of test run.","homepage":"http://busterjs.org/docs/buster-lint","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"main":"./lib/buster-lint","repository":{"type":"git","url":"git://github.com/magnars/buster-lint.git"},"dependencies":{"autolint":">=1.0.3"},"devDependencies":{"buster":"*","buster-analyzer":">=0.2","buster-configuration":">=0.3"},"_npmUser":{"name":"magnars","email":"magnars@gmail.com"},"_id":"buster-lint@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"14bf018c2c895677d0638753dfaf0f7b6456de9c","tarball":"http://registry.npmjs.org/buster-lint/-/buster-lint-0.2.0.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"}]},"0.3.0":{"name":"buster-lint","version":"0.3.0","description":"Buster-extension: jslint/jshint your files as part of test run.","homepage":"http://busterjs.org/docs/buster-lint","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"main":"./lib/buster-lint","repository":{"type":"git","url":"git://github.com/magnars/buster-lint.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"autolint":">=1.0.3"},"devDependencies":{"buster":"*","buster-analyzer":">=0.3","buster-configuration":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-lint@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f050191cb97e45dc1c4b14e31f20fce056c1769b","tarball":"http://registry.npmjs.org/buster-lint/-/buster-lint-0.3.0.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"},{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-lint","version":"0.3.1","description":"Buster-extension: jslint/jshint your files as part of test run.","homepage":"http://busterjs.org/docs/buster-lint","author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"main":"./lib/buster-lint","repository":{"type":"git","url":"git://github.com/magnars/buster-lint.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"autolint":">=1.0.3"},"devDependencies":{"buster":"*","buster-analyzer":">=0.3","buster-configuration":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-lint@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"493e51f81e4752c707eb6e5d3f06176b64982686","tarball":"http://registry.npmjs.org/buster-lint/-/buster-lint-0.3.1.tgz"},"maintainers":[{"name":"magnars","email":"magnars@gmail.com"},{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"magnars","email":"magnars@gmail.com"},{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:43:27.988Z","created":"2012-02-15T08:35:10.258Z","0.1.0":"2012-02-15T08:36:30.814Z","0.1.1":"2012-02-16T20:01:07.789Z","0.2.0":"2012-04-18T19:33:05.201Z","0.3.0":"2012-06-20T21:12:54.922Z","0.3.1":"2012-06-20T21:49:25.391Z"},"author":{"name":"Magnar Sveen","email":"magnars@gmail.com"},"repository":{"type":"git","url":"git://github.com/magnars/buster-lint.git"},"_attachments":{"buster-lint-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-Pdnp/8uhK9YWf/9wlgeSYA==","length":5473,"stub":true},"buster-lint-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-r7bjOquFj14G9kzN+Mbi/g==","length":5469,"stub":true},"buster-lint-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-w3tJHSLtU2Q9CqJb/Gml8A==","length":5977,"stub":true},"buster-lint-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-mc6NXGeJJSt77XU3xpXmSQ==","length":3639,"stub":true},"buster-lint-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-A7vZLhR8E+RHfg1wm2rMjQ==","length":3444,"stub":true}}}},
{"id":"buster-module-loader","key":"buster-module-loader","value":{"rev":"7-05e17349a33360de19bda1ac4e148354"},"doc":{"_id":"buster-module-loader","_rev":"7-05e17349a33360de19bda1ac4e148354","name":"buster-module-loader","description":"Simple module loader for node. Allows loading objects from inside modules through a simple string.","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"buster-module-loader","version":"0.2.0","description":"Simple module loader for node. Allows loading objects from inside modules through a simple string.","homepage":"http://busterjs.org/docs/buster-module-loader","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-module-loader","repository":{"type":"git","url":"git://gitorious.org/buster/buster-module-loader.git"},"dependencies":{},"devDependencies":{},"_id":"buster-module-loader@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"05e1d0a99cc9fddaa52e481ff224a269aeb64006","tarball":"http://registry.npmjs.org/buster-module-loader/-/buster-module-loader-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-module-loader","version":"0.2.1","description":"Simple module loader for node. Allows loading objects from inside modules through a simple string.","homepage":"http://busterjs.org/docs/buster-module-loader","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-module-loader","repository":{"type":"git","url":"git://gitorious.org/buster/buster-module-loader.git"},"dependencies":{},"devDependencies":{},"_id":"buster-module-loader@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"2d5b141fc6154d634bb102cf5986f3765f5cb03d","tarball":"http://registry.npmjs.org/buster-module-loader/-/buster-module-loader-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-module-loader","version":"0.3.0","description":"Simple module loader for node. Allows loading objects from inside modules through a simple string.","homepage":"http://busterjs.org/docs/buster-module-loader","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-module-loader","repository":{"type":"git","url":"git://gitorious.org/buster/buster-module-loader.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-module-loader@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"0582e0e4526fd08511721ebad9d46d17b8842382","tarball":"http://registry.npmjs.org/buster-module-loader/-/buster-module-loader-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2011-12-05T21:19:31.784Z","created":"2011-08-08T21:39:34.860Z","0.2.0":"2011-08-08T21:39:35.739Z","0.2.1":"2011-08-23T22:18:34.248Z","0.3.0":"2011-12-05T21:19:31.784Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-module-loader.git"},"_attachments":{"buster-module-loader-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-7eQy8/6f7kx6BJ/PXN8nRw==","length":2214,"stub":true},"buster-module-loader-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-jbya/5TWO8VeXV4zCNVHAg==","length":2158,"stub":true},"buster-module-loader-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Lsa6cIGwqpbdfs0BjMErCg==","length":2162,"stub":true}}}},
{"id":"buster-multicast","key":"buster-multicast","value":{"rev":"3-79480b5be761d243b274cb1e77375afc"},"doc":{"_id":"buster-multicast","_rev":"3-79480b5be761d243b274cb1e77375afc","name":"buster-multicast","description":"Multicasting server and client for node and browsers","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"buster-multicast","version":"0.1.0","description":"Multicasting server and client for node and browsers","homepage":"http://busterjs.org/docs/buster-multicast","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-multicast","repository":{"type":"git","url":"git://gitorious.org/buster/buster-multicast.git"},"dependencies":{"buster-core":"~>0.3","buster-promise":"~>0.3","node-uuid":"~1","buster-user-agent-parser":"~>0.2"},"devDependencies":{"buster-assertions":"~>0.6","buster-util":"~>0.3","buster-format":"~>0.4","sinon":"~>1.1","glob":"~>2"},"_id":"buster-multicast@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"7af861758338add2c4c4bf753659a0ac45940217","tarball":"http://registry.npmjs.org/buster-multicast/-/buster-multicast-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2011-08-08T22:56:03.636Z","created":"2011-08-08T22:56:01.327Z","0.1.0":"2011-08-08T22:56:03.636Z"},"author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-multicast.git"},"_attachments":{"buster-multicast-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-/5sBbf5Fl+eCKmyGePsLzQ==","length":22456,"stub":true}}}},
{"id":"buster-promise","key":"buster-promise","value":{"rev":"7-20bf94d0475267af9cba12c290de7b5d"},"doc":{"_id":"buster-promise","_rev":"7-20bf94d0475267af9cba12c290de7b5d","name":"buster-promise","description":"Lightweight implementation of thenable promises","dist-tags":{"latest":"0.4.0"},"versions":{"0.3.0":{"name":"buster-promise","version":"0.3.0","description":"Lightweight implementation of thenable promises","homepage":"http://busterjs.org/docs/buster-promise","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Promise was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-promise","repository":{"type":"git","url":"git://gitorious.org/buster/buster-promise.git"},"dependencies":{"buster-core":"~>0.3"},"devDependencies":{"buster-util":"~>0.3","buster-assertions":"~>0.6","buster-format":"~>0.4","sinon":"~1.1"},"_id":"buster-promise@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"ab72d3ebba783ab9c81ad43e73b4716d738c6483","tarball":"http://registry.npmjs.org/buster-promise/-/buster-promise-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-promise","version":"0.3.1","description":"Lightweight implementation of thenable promises","homepage":"http://busterjs.org/docs/buster-promise","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Promise was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-promise","repository":{"type":"git","url":"git://gitorious.org/buster/buster-promise.git"},"dependencies":{"buster-core":"~0.3"},"devDependencies":{"buster-util":"~0.3","buster-assertions":"~0.6","buster-format":"~0.4","sinon":"~1.1"},"_id":"buster-promise@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"19755f403a878939d8f099c4d64a9a6e03776655","tarball":"http://registry.npmjs.org/buster-promise/-/buster-promise-0.3.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-promise","version":"0.4.0","description":"Lightweight implementation of thenable promises","homepage":"http://busterjs.org/docs/buster-promise","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Promise was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-promise","repository":{"type":"git","url":"git://gitorious.org/buster/buster-promise.git"},"dependencies":{"buster-core":"~0.5"},"devDependencies":{"buster-util":"~0.4","buster-assertions":"~0.8","buster-format":"~0.5","sinon":"~1.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-promise@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"98e1d2af5dd8cfaad022b12a72194f30879200f3","tarball":"http://registry.npmjs.org/buster-promise/-/buster-promise-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2011-12-05T21:19:16.366Z","created":"2011-08-08T20:48:50.717Z","0.3.0":"2011-08-08T20:48:53.373Z","0.3.1":"2011-08-23T22:16:17.917Z","0.4.0":"2011-12-05T21:19:16.366Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-promise.git"},"_attachments":{"buster-promise-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-gVkTGIy05Y7BoZydznGkFQ==","length":4418,"stub":true},"buster-promise-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-x+NyGi5RvrMyDSrl93fTAA==","length":4327,"stub":true},"buster-promise-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-w5SgnBroooX4VYq602INXw==","length":4328,"stub":true}}}},
{"id":"buster-resources","key":"buster-resources","value":{"rev":"11-f0a0fbaffb704a1dd11a01e25f72f0db"},"doc":{"_id":"buster-resources","_rev":"11-f0a0fbaffb704a1dd11a01e25f72f0db","name":"buster-resources","description":"Virtual file systems for exposing files and other resources on e.g. web servers","dist-tags":{"latest":"0.3.2"},"versions":{"0.1.0":{"name":"buster-resources","version":"0.1.0","description":"","homepage":"http://busterjs.org/buster-resources","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-resources","repository":{"type":"git","url":"git://gitorious.org/buster/buster-resources.git"},"dependencies":{"buster-promise":"~0.4","mime":"~1","uglify-js":"~1"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-resources@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b333e635d917928a430b3849dfb756154f7981e2","tarball":"http://registry.npmjs.org/buster-resources/-/buster-resources-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.0":{"name":"buster-resources","version":"0.2.0","description":"Virtual file systems for exposing files and other resources on e.g. web servers","homepage":"http://busterjs.org/buster-resources","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-resources","repository":{"type":"git","url":"git://gitorious.org/buster/buster-resources.git"},"dependencies":{"buster-core":">=0.5.1","mime":"~1","buster-glob":">=0.2","when":"https://github.com/cujojs/when/tarball/1.0.2","minimatch":"~0.1.5"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-resources@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"5f520dde537c96da93f908729406180c5a407fdc","tarball":"http://registry.npmjs.org/buster-resources/-/buster-resources-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-resources","version":"0.3.0","description":"Virtual file systems for exposing files and other resources on e.g. web servers","homepage":"http://busterjs.org/buster-resources","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-resources","repository":{"type":"git","url":"git://gitorious.org/buster/buster-resources.git"},"dependencies":{"buster-core":">=0.6.0","mime":"~1","buster-glob":">=0.3","when":"https://github.com/cujojs/when/tarball/1.0.2","minimatch":"~0.1.5"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-resources@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ab4e49dae4d7ca0ccb60489b6e084c020ead6f18","tarball":"http://registry.npmjs.org/buster-resources/-/buster-resources-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-resources","version":"0.3.1","description":"Virtual file systems for exposing files and other resources on e.g. web servers","homepage":"http://busterjs.org/buster-resources","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-resources","repository":{"type":"git","url":"git://gitorious.org/buster/buster-resources.git"},"dependencies":{"buster-core":">=0.6.0","mime":"~1","buster-glob":">=0.3.1","when":"https://github.com/cujojs/when/tarball/1.0.2","minimatch":"~0.1.5"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-resources@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"a71115c3ab58a2cfe5acbfeb2130ffb3aef093e6","tarball":"http://registry.npmjs.org/buster-resources/-/buster-resources-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.2":{"name":"buster-resources","version":"0.3.2","description":"Virtual file systems for exposing files and other resources on e.g. web servers","homepage":"http://busterjs.org/buster-resources","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-resources","repository":{"type":"git","url":"git://gitorious.org/buster/buster-resources.git"},"dependencies":{"buster-core":">=0.6.0","mime":"~1","buster-glob":">=0.3.1","when":"https://github.com/cujojs/when/tarball/1.0.2","minimatch":"~0.1.5"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-resources@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4677ff9ad813d164175d40cf980a14ea4af7b513","tarball":"http://registry.npmjs.org/buster-resources/-/buster-resources-0.3.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2012-05-28T11:05:40.245Z","created":"2011-12-05T22:22:26.558Z","0.1.0":"2011-12-05T22:22:28.244Z","0.2.0":"2012-02-16T19:39:58.615Z","0.3.0":"2012-04-17T21:21:37.183Z","0.3.1":"2012-05-02T21:17:31.603Z","0.3.2":"2012-05-28T11:05:40.245Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-resources.git"},"_attachments":{"buster-resources-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-MHoI88J0C+/B8ZAIgbimYg==","length":77921,"stub":true},"buster-resources-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-igu1XoHNVW2q9IrIsBerXw==","length":78104,"stub":true},"buster-resources-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-AGELsr7pdImWks5b7IrPYA==","length":78083,"stub":true},"buster-resources-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-2u4S6qkha9G8SeiwLW2AJw==","length":77446,"stub":true},"buster-resources-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-QpDs/LnywDapgwMJTIHbqw==","length":11593,"stub":true}}}},
{"id":"buster-script-loader","key":"buster-script-loader","value":{"rev":"3-85af28b5bc4e647f27514fede19a144e"},"doc":{"_id":"buster-script-loader","_rev":"3-85af28b5bc4e647f27514fede19a144e","name":"buster-script-loader","description":"Simple script loader that helps run unmodified browser scripts on node by providing a shared 'global' context object","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"buster-script-loader","version":"0.2.0","main":"./lib/buster-script-loader","description":"Simple script loader that helps run unmodified browser scripts on node by providing a shared 'global' context object","homepage":"http://busterjs.org/docs/buster-script-loader","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"Buster.JS Script loader was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-script-loader.git"},"devDependencies":{"buster":"~>0.2"},"dependencies":{},"_id":"buster-script-loader@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"c5e507853e6ff17518203fcc0ef74da1b245dcba","tarball":"http://registry.npmjs.org/buster-script-loader/-/buster-script-loader-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2011-08-08T22:25:13.246Z","created":"2011-08-08T22:25:11.564Z","0.2.0":"2011-08-08T22:25:13.246Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-script-loader.git"},"_attachments":{"buster-script-loader-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-7/1tu1J6479eMmUL/YCxCg==","length":2750,"stub":true}}}},
{"id":"buster-server","key":"buster-server","value":{"rev":"7-57b8b43047504818322018d2bbfee1f1"},"doc":{"_id":"buster-server","_rev":"7-57b8b43047504818322018d2bbfee1f1","name":"buster-server","description":"Buster server","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"name":"buster-server","version":"0.2.0","description":"Buster server","homepage":"http://busterjs.org/docs/buster-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-server.git"},"dependencies":{"buster-core":"~>0.3","buster-promise":"~>0.3","buster-multicast":"~>0.1","ejs":"~0.4","glob":"~2","mime":"~1","node-uuid":"~1","uglify-js":"~1"},"devDependencies":{},"_id":"buster-server@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"2dd3b478e369b5c70bc31150fea2a2d32a71ea12","tarball":"http://registry.npmjs.org/buster-server/-/buster-server-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-server","version":"0.2.1","description":"Buster server","homepage":"http://busterjs.org/docs/buster-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-server.git"},"dependencies":{"buster-core":"~0.3","buster-promise":"~0.3","buster-multicast":"~0.1","ejs":"~0.4","glob":"~2","mime":"~1","node-uuid":"~1","uglify-js":"~1"},"devDependencies":{},"_id":"buster-server@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"23b7a5f05031d61220b2ddaf10d226346f456153","tarball":"http://registry.npmjs.org/buster-server/-/buster-server-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.2":{"name":"buster-server","version":"0.2.2","description":"Buster server","homepage":"http://busterjs.org/docs/buster-server","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-server","repository":{"type":"git","url":"git://gitorious.org/buster/buster-server.git"},"dependencies":{"buster-core":"~0.3","buster-promise":"~0.3","buster-multicast":"~0.1","ejs":"~0.4","glob":"~2","mime":"~1","node-uuid":"~1","uglify-js":"~1"},"devDependencies":{},"_id":"buster-server@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"81f5aaae9d373b669a738151e9d34fda246a3e0b","tarball":"http://registry.npmjs.org/buster-server/-/buster-server-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2011-09-10T08:48:37.591Z","created":"2011-08-08T22:58:29.403Z","0.2.0":"2011-08-08T22:58:32.111Z","0.2.1":"2011-08-23T22:37:33.896Z","0.2.2":"2011-09-10T08:48:37.591Z"},"author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-server.git"},"_attachments":{"buster-server-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Q3x9wRR1HnSrll7SPlHoVg==","length":34068,"stub":true},"buster-server-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-GqgfrCcGi6x1CAU7LFerYg==","length":17822,"stub":true},"buster-server-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-lWCeipab2QNLtaXuKXKKNw==","length":17841,"stub":true}}}},
{"id":"buster-server-cli","key":"buster-server-cli","value":{"rev":"4-a83dcba7f766f1841abb4399d8923318"},"doc":{"_id":"buster-server-cli","_rev":"4-a83dcba7f766f1841abb4399d8923318","name":"buster-server-cli","description":"buster-server CLI library","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"buster-server-cli","version":"0.1.0","description":"buster-server CLI library","homepage":"http://busterjs.org/docs/buster-server-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/server-cli","repository":{"type":"git","url":"git://github.com/busterjs/buster-server-cli.git"},"dependencies":{"buster-core":">=0.6.2","buster-cli":">=0.5.0","buster-capture-server":">=0.5.0","buster-user-agent-parser":">=0.3.1","ramp-resources":">=0.4","paperboy":"~0","ejs":"~0.4"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-server-cli@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"79bf1e6cffa0bdd7c420bf0729da7a56ae6b1a68","tarball":"http://registry.npmjs.org/buster-server-cli/-/buster-server-cli-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:43:36.904Z","created":"2012-06-20T21:22:16.689Z","0.1.0":"2012-06-20T21:22:18.675Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://github.com/busterjs/buster-server-cli.git"},"_attachments":{"buster-server-cli-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-E7pZfUU1X/yDIlAT/gAq2A==","length":326639,"stub":true}}}},
{"id":"buster-sinon","key":"buster-sinon","value":{"rev":"8-dff220533940b57b76f65bb0a0186416"},"doc":{"_id":"buster-sinon","_rev":"8-dff220533940b57b76f65bb0a0186416","name":"buster-sinon","description":"Sinon spies, stubs and mocks for buster-test","dist-tags":{"latest":"0.6.0"},"versions":{"0.5.0":{"name":"buster-sinon","version":"0.5.0","description":"Sinon spies, stubs and mocks for buster-test","homepage":"http://busterjs.org/sinon","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-sinon","repository":{"type":"git","url":"git://gitorious.org/buster/buster-sinon.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.0","buster-assertions":">=0.10","buster-test":">=0.5","buster-format":">=0.5.3","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-sinon@0.5.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"c37d5ca3bf6c1e078feaefc20a53e6db6bf8e041","tarball":"http://registry.npmjs.org/buster-sinon/-/buster-sinon-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-sinon","version":"0.5.1","description":"Sinon spies, stubs and mocks for buster-test","homepage":"http://busterjs.org/sinon","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-sinon","repository":{"type":"git","url":"git://gitorious.org/buster/buster-sinon.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2","buster-assertions":">=0.10.2","buster-test":">=0.6","buster-format":">=0.5.4","sinon":">=1.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-sinon@0.5.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"8838003c9b480d0d36abc2189cde6ecf397c112e","tarball":"http://registry.npmjs.org/buster-sinon/-/buster-sinon-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.0":{"name":"buster-sinon","version":"0.6.0","description":"Sinon spies, stubs and mocks for buster-test","homepage":"http://busterjs.org/sinon","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-sinon","repository":{"type":"git","url":"git://gitorious.org/buster/buster-sinon.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2","buster-assertions":">=0.10.2","buster-test":">=0.6","buster-format":">=0.5.4","sinon":">=1.4"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-sinon@0.6.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4ed8c50e4e3d1bbdc172668601e50733d75980ed","tarball":"http://registry.npmjs.org/buster-sinon/-/buster-sinon-0.6.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:25:43.640Z","created":"2012-05-27T20:16:55.924Z","0.5.0":"2012-05-27T20:16:57.982Z","0.5.1":"2012-06-20T21:10:47.799Z","0.6.0":"2012-07-09T22:25:43.640Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-sinon.git"},"_attachments":{"buster-sinon-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-0vmMeDe+4pH7noR9ZDJLfg==","length":4292,"stub":true},"buster-sinon-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-usOOXtHPss6S3/jJcn5LWg==","length":4177,"stub":true},"buster-sinon-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-6tHRzlesi/AW1t3Dz9H/2A==","length":4174,"stub":true}}}},
{"id":"buster-static","key":"buster-static","value":{"rev":"16-c9ac1dc67720769f25657e2691280c51"},"doc":{"_id":"buster-static","_rev":"16-c9ac1dc67720769f25657e2691280c51","name":"buster-static","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"buster-static","version":"0.1.0","bin":{"buster-static":"./bin/buster-static"},"dependencies":{"buster-core":"*","buster-test-cli":"*","buster-cli":"*","buster-test":"*","ejs":"~0.4","mime":"~1.2"},"devDependencies":{},"_id":"buster-static@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"d36bc31b4e88eb2b72d7aef0a45f6207240f7387","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.0":{"name":"buster-static","version":"0.2.0","description":"QUnit style browser based test runner","homepage":"http://busterjs.org/docs/buster-static","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"bin":{"buster-static":"./bin/buster-static"},"dependencies":{"buster-core":"~0.5","buster-cli":"~0.3","buster-test":"~0.3"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-static@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e95c7a3cde8f1927ffdc04b1a629206183269e1b","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-static","version":"0.3.0","description":"QUnit style browser based test runner","homepage":"http://busterjs.org/docs/buster-static","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"bin":{"buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.5.1","buster-cli":">=0.4","buster-test":">=0.4","buster-resources":">=0.2"},"devDependencies":{"buster":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-static@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"468e54807141bac1e1b5e272fc9dedd87b064417","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-static","version":"0.3.1","description":"QUnit style browser based test runner","homepage":"http://busterjs.org/docs/buster-static","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"bin":{"buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.5.1","buster-cli":">=0.4","buster-test":">=0.4.1","buster-resources":">=0.2"},"devDependencies":{"buster":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-static@0.3.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d72cb878864e6ca7f035cea4d7189a100867961c","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.2":{"name":"buster-static","version":"0.3.2","description":"QUnit style browser based test runner","homepage":"http://busterjs.org/docs/buster-static","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"main":"./lib/cli","bin":{"buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.5.1","buster-cli":">=0.4","buster-test":">=0.4.2","buster-resources":">=0.2"},"devDependencies":{"buster":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-static@0.3.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6bba6f0fb8e53aabd8deb1a24359bde2f06f5a33","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.3.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.3":{"name":"buster-static","version":"0.3.3","description":"QUnit style browser based test runner","homepage":"http://busterjs.org/docs/buster-static","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"main":"./lib/cli","bin":{"buster-static":"./bin/buster-static"},"dependencies":{"buster-core":">=0.6.0","buster-cli":">=0.4.2","buster-test":">=0.5.0","buster-resources":">=0.3"},"devDependencies":{"buster":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-static@0.3.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d6c56b05a9e23440760b56303937185ded582492","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.3.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-static","version":"0.5.0","description":"QUnit style browser based test runner","homepage":"http://busterjs.org/docs/buster-static","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"main":"./lib/buster-static","bin":{"buster-static":"./bin/buster-static"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"buster-core":">=0.6.2","buster-cli":">=0.5","buster-test":">=0.6","ramp-resources":">=0.4","mkdirp":"~0.3"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-static@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b67317095fb74a00bf250054804d942576d999b1","tarball":"http://registry.npmjs.org/buster-static/-/buster-static-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:44:18.970Z","created":"2011-09-07T21:52:38.693Z","0.1.0":"2011-09-07T21:52:39.440Z","0.2.0":"2011-12-05T22:55:04.045Z","0.3.0":"2012-02-16T19:48:54.307Z","0.3.1":"2012-02-20T22:54:27.495Z","0.3.2":"2012-02-21T22:16:21.847Z","0.3.3":"2012-04-17T21:57:34.040Z","0.5.0":"2012-06-20T21:15:39.496Z"},"description":"QUnit style browser based test runner","author":{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-static.git"},"_attachments":{"buster-static-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-qd4cn5Ly/+xELw9r51smgQ==","length":3355,"stub":true},"buster-static-0.3.3.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-zMBZjeMdqUsxlpFGul9XDg==","length":2976,"stub":true},"buster-static-0.3.2.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-pNqysIUjJlus+UQkcVPMIw==","length":2941,"stub":true},"buster-static-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-PG5D1M39E6b7uRmbV9pIyA==","length":2932,"stub":true},"buster-static-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-E2p2p7E38d7UEK3/HD1vQw==","length":2936,"stub":true},"buster-static-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-M+rbX3ijbO2Gp4ha7P9rcQ==","length":2599,"stub":true},"buster-static-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-Kv42upzOIUdhxUnTLxICFQ==","length":3134,"stub":true}}}},
{"id":"buster-stdio-logger","key":"buster-stdio-logger","value":{"rev":"7-318083ce6bec4bba6bac00453aaea680"},"doc":{"_id":"buster-stdio-logger","_rev":"7-318083ce6bec4bba6bac00453aaea680","name":"buster-stdio-logger","description":"Wrapper on top of buster-evented-logger that does pretty outout to stdout and stderr.","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"name":"buster-stdio-logger","version":"0.2.0","description":"Wrapper on top of buster-evented-logger that does pretty outout to stdout and stderr.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-stdio-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-stdio-logger"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-stdio-logger/blobs/master/LICENSE"},"dependencies":{"buster-evented-logger":"~0.4"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-stdio-logger@0.2.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d978aad2ed3ba1cbb18fff71d76b2196575b1c62","tarball":"http://registry.npmjs.org/buster-stdio-logger/-/buster-stdio-logger-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-stdio-logger","version":"0.2.1","description":"Wrapper on top of buster-evented-logger that does pretty outout to stdout and stderr.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-stdio-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-stdio-logger"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-stdio-logger/blobs/master/LICENSE"},"dependencies":{"buster-evented-logger":">=0.4.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-stdio-logger@0.2.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"934d2ec9939ee4bf7a6c17369dfc0f7217d2a5fb","tarball":"http://registry.npmjs.org/buster-stdio-logger/-/buster-stdio-logger-0.2.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.2":{"name":"buster-stdio-logger","version":"0.2.2","description":"Wrapper on top of buster-evented-logger that does pretty outout to stdout and stderr.","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},{"name":"August Lilleaas","email":"august@augustl.com","url":"http://augustl.com"}],"main":"./lib/buster-stdio-logger","repository":{"type":"git","url":"git://gitorious.org/buster/buster-stdio-logger"},"license":{"type":"BSD","url":"http://gitorious.org/buster/buster-stdio-logger/blobs/master/LICENSE"},"dependencies":{"buster-evented-logger":">=0.4.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-stdio-logger@0.2.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"ee898e73e370c7604fa9e88bd18fdf53434edb02","tarball":"http://registry.npmjs.org/buster-stdio-logger/-/buster-stdio-logger-0.2.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"time":{"modified":"2012-04-17T21:32:00.085Z","created":"2011-12-05T21:22:50.373Z","0.2.0":"2011-12-05T21:22:53.441Z","0.2.1":"2012-02-16T19:46:22.256Z","0.2.2":"2012-04-17T21:32:00.085Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-stdio-logger"},"_attachments":{"buster-stdio-logger-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-rR7AFyTfaVRSVdoMJcba4Q==","length":3075,"stub":true},"buster-stdio-logger-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-9cq4uVFzflpR607F7AArSQ==","length":3080,"stub":true},"buster-stdio-logger-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-9/KqH6obi0jHKZczEejjrw==","length":2902,"stub":true}}}},
{"id":"buster-syntax","key":"buster-syntax","value":{"rev":"19-5e57d1748321347308caea2485ab9995"},"doc":{"_id":"buster-syntax","_rev":"19-5e57d1748321347308caea2485ab9995","name":"buster-syntax","description":"","dist-tags":{"latest":"0.4.2"},"versions":{"0.1.0":{"name":"buster-syntax","version":"0.1.0","description":"","homepage":"http://busterjs.org/docs/buster-syntax","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-syntax","repository":{"type":"git","url":"git://github.com/busterjs/buster-syntax.git"},"dependencies":{"jsdom":"~0.2.10","uglify-js":"~1.2.5"},"devDependencies":{"buster":"*","buster-analyzer":">=0.1","buster-configuration":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-syntax@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"142e49e106ca1efb78001e5fb66c8cbeea9dc88a","tarball":"http://registry.npmjs.org/buster-syntax/-/buster-syntax-0.1.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.1.1":{"name":"buster-syntax","version":"0.1.1","description":"","homepage":"http://busterjs.org/docs/buster-syntax","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-syntax","repository":{"type":"git","url":"git://github.com/busterjs/buster-syntax.git"},"dependencies":{"uglify-js":"~1.2.5"},"optionalDependencies":{"jsdom":"~0.2.10"},"devDependencies":{"buster":"*","buster-analyzer":">=0.1","buster-configuration":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-syntax@0.1.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"eb102d13dc299676b87d30d40fe9479c318c667c","tarball":"http://registry.npmjs.org/buster-syntax/-/buster-syntax-0.1.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.0":{"name":"buster-syntax","version":"0.2.0","description":"","homepage":"http://busterjs.org/docs/buster-syntax","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-syntax","repository":{"type":"git","url":"git://github.com/busterjs/buster-syntax.git"},"dependencies":{"uglify-js":"~1.2.5"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster":"*","buster-analyzer":">=0.1","buster-configuration":">=0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-syntax@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"6f6d729f340c26a209948e16f79e418941ddd1c8","tarball":"http://registry.npmjs.org/buster-syntax/-/buster-syntax-0.2.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.0":{"name":"buster-syntax","version":"0.4.0","description":"","homepage":"http://busterjs.org/docs/buster-syntax","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-syntax","repository":{"type":"git","url":"git://github.com/busterjs/buster-syntax.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"uglify-js":"~1.2.5"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster":"*","buster-analyzer":">=0.3","buster-configuration":">=0.5.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-syntax@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"24e925e7c28761ed60247d764a8c84ff0ebb5c14","tarball":"http://registry.npmjs.org/buster-syntax/-/buster-syntax-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.2":{"name":"buster-syntax","version":"0.4.2","description":"","homepage":"http://busterjs.org/docs/buster-syntax","author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"}],"main":"./lib/buster-syntax","repository":{"type":"git","url":"git://github.com/busterjs/buster-syntax.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"dependencies":{"uglify-js":"~1.2.5"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster":"*","buster-analyzer":">=0.3","buster-configuration":">=0.5.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-syntax@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b2e15fd5a6fa771ea5d22936e39274486cbb96fb","tarball":"http://registry.npmjs.org/buster-syntax/-/buster-syntax-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"readme":null,"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:26:43.798Z","created":"2012-02-16T19:47:28.305Z","0.1.0":"2012-02-16T19:47:30.386Z","0.1.1":"2012-03-03T22:29:17.432Z","0.2.0":"2012-04-17T21:36:55.854Z","0.4.0":"2012-06-20T21:51:10.538Z","0.4.1":"2012-07-09T22:26:15.893Z","0.4.2":"2012-07-09T22:26:43.798Z"},"author":{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"},"repository":{"type":"git","url":"git://github.com/busterjs/buster-syntax.git"},"_attachments":{"buster-syntax-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-8nzz61DFq2RnjBh1qHFapA==","length":3414,"stub":true},"buster-syntax-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-VsYwcY9Owi+4EheQ1xcaPA==","length":3409,"stub":true},"buster-syntax-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-FvlzBxEWf/pfA5C2bT+fGw==","length":3199,"stub":true},"buster-syntax-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qPLo5wx7JUnm17gyNv3vIA==","length":3296,"stub":true},"buster-syntax-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-3P5qYz44SK7v3iNnvdqrfA==","length":3235,"stub":true}}}},
{"id":"buster-terminal","key":"buster-terminal","value":{"rev":"12-82d1ed2300650b064bfbb7ea8a7a8388"},"doc":{"_id":"buster-terminal","_rev":"12-82d1ed2300650b064bfbb7ea8a7a8388","name":"buster-terminal","description":"String tools for terminal formatting","dist-tags":{"latest":"0.4.1"},"versions":{"0.2.0":{"name":"buster-terminal","version":"0.2.0","description":"String tools for terminal formatting","homepage":"http://busterjs.org/docs/buster-terminal","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Terminal was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-terminal","repository":{"type":"git","url":"git://gitorious.org/buster/buster-terminal.git"},"dependencies":{},"devDependencies":{},"_id":"buster-terminal@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"43abb1aefe7ea6fece66987bbaef6de620bbbb6c","tarball":"http://registry.npmjs.org/buster-terminal/-/buster-terminal-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-terminal","version":"0.2.1","description":"String tools for terminal formatting","homepage":"http://busterjs.org/docs/buster-terminal","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Terminal was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-terminal","repository":{"type":"git","url":"git://gitorious.org/buster/buster-terminal.git"},"dependencies":{},"devDependencies":{},"_id":"buster-terminal@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"c6f6509d8a3d2bfb9586bbcfe280c536cb55536f","tarball":"http://registry.npmjs.org/buster-terminal/-/buster-terminal-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-terminal","version":"0.3.0","description":"String tools for terminal formatting","homepage":"http://busterjs.org/docs/buster-terminal","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Terminal was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-terminal","repository":{"type":"git","url":"git://gitorious.org/buster/buster-terminal.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-terminal@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"d02fd0e765149fb30ba210a6c460baa13300f347","tarball":"http://registry.npmjs.org/buster-terminal/-/buster-terminal-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-terminal","version":"0.4.0","description":"String tools for terminal formatting","homepage":"http://busterjs.org/docs/buster-terminal","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Terminal was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-terminal","repository":{"type":"git","url":"git://github.com/busterjs/buster-terminal.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-terminal@0.4.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cdf13a3cce2b2b72455121b81804eae0c40d571b","tarball":"http://registry.npmjs.org/buster-terminal/-/buster-terminal-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.1":{"name":"buster-terminal","version":"0.4.1","description":"String tools for terminal formatting","homepage":"http://busterjs.org/docs/buster-terminal","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Terminal was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-terminal","repository":{"type":"git","url":"git://github.com/busterjs/buster-terminal.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test"},"devDependencies":{"buster":""},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-terminal@0.4.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"61e9ceb7928a21a61f2acc9b31f885bffc25c8d1","tarball":"http://registry.npmjs.org/buster-terminal/-/buster-terminal-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:44:34.749Z","created":"2011-08-08T21:23:53.715Z","0.2.0":"2011-08-08T21:23:55.983Z","0.2.1":"2011-08-23T22:17:30.349Z","0.3.0":"2011-12-05T21:15:37.807Z","0.4.0":"2012-04-17T20:15:02.969Z","0.4.1":"2012-06-20T20:30:17.112Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://github.com/busterjs/buster-terminal.git"},"_attachments":{"buster-terminal-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-anyiGQ5Bg0cxnd9OHdOI4A==","length":8577,"stub":true},"buster-terminal-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-syj5Ql6nvL3vv/Wg3zOR7Q==","length":8088,"stub":true},"buster-terminal-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-UbcdRYO8W97GRrhcunra2Q==","length":3732,"stub":true},"buster-terminal-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-SdRFCI6S8K2Ae+Z4KflXnQ==","length":3583,"stub":true},"buster-terminal-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-aco9SdCQdNVjKu1TD2/frg==","length":3561,"stub":true}}}},
{"id":"buster-test","key":"buster-test","value":{"rev":"28-e16d79649996e3d8071a5bdadfbd91cd"},"doc":{"_id":"buster-test","_rev":"28-e16d79649996e3d8071a5bdadfbd91cd","name":"buster-test","description":"Promised based evented xUnit and BDD style test runner for JavaScript","dist-tags":{"latest":"0.6.1"},"versions":{"0.2.0":{"name":"buster-test","version":"0.2.0","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-assertions":"~>0.6","buster-format":"~>0.4","buster-core":"~>0.3","buster-promise":"~>0.3","buster-terminal":"~>0.2","buster-module-loader":"~>0.2"},"devDependencies":{"sinon":"~>1.1","buster-util":"~>0.3"},"_id":"buster-test@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"b96d14c53d91e7fc12b5cb771c54e79eac0793d0","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-test","version":"0.2.1","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-assertions":"~0.6","buster-format":"~0.4","buster-core":"~0.3","buster-promise":"~0.3","buster-terminal":"~0.2","buster-module-loader":"~0.2"},"devDependencies":{"sinon":"~1.1","buster-util":"~0.3"},"_id":"buster-test@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"1baf3cb7ba3c0e3e06e261425fc515084d449509","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-test","version":"0.3.0","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":"~0.5","buster-promise":"~0.4","buster-terminal":"~0.3","buster-module-loader":"~0.3","jsdom":"~0.2.10"},"devDependencies":{"buster-assertions":"~0.8","buster-format":"~0.5","sinon":"~1.2","buster-util":"~0.4"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"28683ab3bba93e8bfbdac2b001f44e351da5f975","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-test","version":"0.4.0","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.5.1","buster-terminal":">=0.3","buster-module-loader":">=0.3","jsdom":"~0.2.10","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-assertions":">=0.9","buster-format":">=0.5.1","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"603333e2961f7fcb74f9818b70346b5dcb2db529","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.1":{"name":"buster-test","version":"0.4.1","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.5.1","buster-terminal":">=0.3","buster-module-loader":">=0.3","jsdom":"~0.2.10","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-assertions":">=0.9","buster-format":">=0.5.1","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3dc4146269b61bd938663e1f3b0a153d58a43c56","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.2":{"name":"buster-test","version":"0.4.2","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.5.1","buster-terminal":">=0.3","buster-module-loader":">=0.3","jsdom":"~0.2.10","when":"https://github.com/cujojs/when/tarball/1.0.2"},"devDependencies":{"buster-assertions":">=0.9","buster-format":">=0.5.1","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"7c4db8b06d4d32401a0db1572190c987fe0511bb","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.3":{"name":"buster-test","version":"0.4.3","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.5.1","buster-terminal":">=0.3","when":"https://github.com/cujojs/when/tarball/1.0.2"},"optionalDependencies":{"jsdom":"~0.2.10"},"devDependencies":{"buster-assertions":">=0.9","buster-format":">=0.5.1","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"04edc7e956409d1f159615c7f20850068b99eccf","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.4.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-test","version":"0.5.0","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.6.0","buster-terminal":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster-assertions":">=0.10","buster-format":">=0.5.3","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"4d8713832615c8e1d86e28a31d5dae771e5c31f4","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.1":{"name":"buster-test","version":"0.5.1","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.6.0","buster-terminal":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster-assertions":">=0.10","buster-format":">=0.5.3","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"27086f488ce5c8337cb60d870186d0850235c009","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.2":{"name":"buster-test","version":"0.5.2","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"dependencies":{"buster-core":">=0.6.0","buster-terminal":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster-assertions":">=0.10","buster-format":">=0.5.3","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"795e53fde1833ce8d00a2463f785120e35706fc0","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.5.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.3":{"name":"buster-test","version":"0.5.3","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.0","buster-terminal":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster-assertions":">=0.10","buster-format":">=0.5.3","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.5.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"fc83d279c02f2637e252ca2be622e411bed8d08c","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.5.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.0":{"name":"buster-test","version":"0.6.0","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2","buster-terminal":">=0.4.1","when":"1.3"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster-assertions":">=0.10.2","buster-format":">=0.5.4","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"296869d0e5b014f660e8787e993a69d2208a30fd","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.6.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.1":{"name":"buster-test","version":"0.6.1","description":"Promised based evented xUnit and BDD style test runner for JavaScript","homepage":"http://busterjs.org/docs/buster-test","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Test was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-test","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"scripts":{"test":"./run-tests"},"dependencies":{"buster-core":">=0.6.2","buster-terminal":">=0.4.1","when":"https://github.com/cujojs/when/tarball/1.3.0"},"optionalDependencies":{"jsdom":"~0.2.14"},"devDependencies":{"buster-assertions":">=0.10.2","buster-format":">=0.5.4","sinon":">=1.3","buster-util":">=0.5"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test@0.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"cbdb6ddcb9df4c15fe24f0617228997c6da2e69f","tarball":"http://registry.npmjs.org/buster-test/-/buster-test-0.6.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-09T22:28:39.726Z","created":"2011-08-08T21:51:27.828Z","0.2.0":"2011-08-08T21:51:30.500Z","0.2.1":"2011-08-23T22:39:46.635Z","0.3.0":"2011-12-05T21:20:06.697Z","0.4.0":"2012-02-16T19:36:58.501Z","0.4.1":"2012-02-20T22:49:47.305Z","0.4.2":"2012-02-21T22:21:05.123Z","0.4.3":"2012-03-03T22:30:39.453Z","0.5.0":"2012-04-17T20:30:41.792Z","0.5.1":"2012-04-25T20:59:04.741Z","0.5.2":"2012-05-04T21:11:57.316Z","0.5.3":"2012-06-03T21:14:26.543Z","0.6.0":"2012-06-20T21:29:00.251Z","0.6.1":"2012-07-09T22:28:39.726Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-test.git"},"_attachments":{"buster-test-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":28,"digest":"md5-4sOp/6T8kB1lJ+py/0Mlyw==","length":61695,"stub":true},"buster-test-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-iGeV+eDoP8bVTTik33agqg==","length":61264,"stub":true},"buster-test-0.5.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-+BRZSTRI1GahPW8KG+Zrsg==","length":60061,"stub":true},"buster-test-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-OEX/eiRr9AwTndU27/F9hA==","length":60166,"stub":true},"buster-test-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-FBK2KDs/eIXfszJxmC6PLg==","length":60158,"stub":true},"buster-test-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-2q9zHbsxJ0q/KTHwVLxmQQ==","length":59948,"stub":true},"buster-test-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-aadhh/43U7vG4Sye3APv2g==","length":56889,"stub":true},"buster-test-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-/GXn7kr6ziN8RWlypK84yA==","length":56745,"stub":true},"buster-test-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-NO70eWRggAFcHnAhTxavfA==","length":55954,"stub":true},"buster-test-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-FK3N3LpfNEMiKqObOrJZ+A==","length":55717,"stub":true},"buster-test-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-mFkU9sZ5Y3WbXqzb7927hQ==","length":51226,"stub":true},"buster-test-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-J7bhOc2d9PkCeLTd5rN8Lg==","length":35593,"stub":true},"buster-test-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-RkBCv2vb8PD2hTRwmamUiQ==","length":35522,"stub":true}}}},
{"id":"buster-test-cli","key":"buster-test-cli","value":{"rev":"52-63e7afaac8bfa674db0cb4a3ce6b2678"},"doc":{"_id":"buster-test-cli","_rev":"52-63e7afaac8bfa674db0cb4a3ce6b2678","name":"buster-test-cli","description":"Cli tools for Buster.JS test runners","dist-tags":{"latest":"0.6.2"},"versions":{"0.1.0":{"name":"buster-test-cli","version":"0.1.0","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.3","buster-client":"~0.3","buster-multicast":"~0.1","buster-terminal":"~0.2","buster-server":"~0.2","buster-promise":"~0.3","buster-evented-logger":"~0.3","buster-assertions":"~0.6","buster-format":"~0.4","buster-test":"~0.2","buster-args":"~0.2","buster-user-agent-parser":"~0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.1","sinon-buster":"~0.3"},"devDependencies":{},"_id":"buster-test-cli@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"8079e69ad1b3b235122980b418ee0dfa826f662c","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.1.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.0":{"name":"buster-test-cli","version":"0.2.0","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.3","buster-client":"~0.3","buster-cli":"~0.2","buster-configuration":"~0.1","buster-multicast":"~0.1","buster-terminal":"~0.2","buster-server":"~0.2","buster-promise":"~0.3","buster-evented-logger":"~0.3","buster-assertions":"~0.6","buster-format":"~0.4","buster-test":"~0.2","buster-args":"~0.2","buster-user-agent-parser":"~0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.1","sinon-buster":"~0.3"},"devDependencies":{},"_id":"buster-test-cli@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"b696ada298b22406071d59a2f116f9fb103937a3","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.1":{"name":"buster-test-cli","version":"0.2.1","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.3","buster-client":"~0.3","buster-cli":"~0.2","buster-configuration":"~0.1","buster-multicast":"~0.1","buster-terminal":"~0.2","buster-server":"~0.2","buster-promise":"~0.3","buster-evented-logger":"~0.3","buster-assertions":"~0.6","buster-format":"~0.4","buster-test":"~0.2","buster-args":"~0.2","buster-user-agent-parser":"~0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.1","sinon-buster":"~0.3"},"devDependencies":{},"_id":"buster-test-cli@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"0625bc8e8e5ccd4fa8785a828a6e2390ec7db919","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.2":{"name":"buster-test-cli","version":"0.2.2","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.3","buster-client":"~0.3","buster-cli":"~0.2","buster-configuration":"~0.1","buster-multicast":"~0.1","buster-terminal":"~0.2","buster-server":">=0.2","buster-promise":"~0.3","buster-evented-logger":"~0.3","buster-assertions":"~0.6","buster-format":"~0.4","buster-test":"~0.2","buster-args":"~0.2","buster-user-agent-parser":"~0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.1","sinon-buster":"~0.3"},"devDependencies":{},"_id":"buster-test-cli@0.2.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"6956a6916d20921358513b72e6ff53f28b986c42","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.3":{"name":"buster-test-cli","version":"0.2.3","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.3","buster-client":"~0.3","buster-cli":"~0.2","buster-configuration":"~0.1","buster-multicast":"~0.1","buster-terminal":"~0.2","buster-server":">=0.2","buster-promise":"~0.3","buster-evented-logger":"~0.3","buster-assertions":"~0.6","buster-format":"~0.4","buster-test":"~0.2","buster-args":"~0.2","buster-user-agent-parser":"~0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.1","sinon-buster":"~0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.2.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bab85978eb7da6c7f924eb385a7b9ef1fefae857","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.2.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.2.4":{"name":"buster-test-cli","version":"0.2.4","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.3","buster-client":"~0.3","buster-cli":"~0.2","buster-configuration":"~0.1","buster-multicast":"~0.1","buster-terminal":"~0.2","buster-server":">=0.2","buster-promise":"~0.3","buster-evented-logger":"~0.3","buster-assertions":"~0.7","buster-format":"~0.4","buster-test":"~0.2","buster-args":"~0.2","buster-user-agent-parser":"~0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.1","sinon-buster":"~0.3"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.2.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.99","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"5ae489e69d634e22d8f9f7685463bcabe0e63eb0","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.2.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.3.0":{"name":"buster-test-cli","version":"0.3.0","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":"~0.5","buster-client":"~0.4","buster-cli":"~0.3","buster-configuration":"~0.2","buster-terminal":"~0.3","buster-capture-server":"~0.3","buster-promise":"~0.4","buster-evented-logger":"~0.4","buster-assertions":"~0.7","buster-format":"~0.5","buster-test":"~0.3","buster-args":"~0.3","buster-user-agent-parser":"~0.2","buster-bayeux-emitter":"~0.1","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":"~1.2","sinon-buster":"~0.4"},"devDependencies":{"faye":"~0.7","buster-util":"~0.4","buster-stdio-logger":"~0.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"0bf16e5bc7fcd3b3110df14b22550370f6c29f4e","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.0":{"name":"buster-test-cli","version":"0.4.0","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"faye":"~0.7","buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"71bfcb37e3a6dbe810fb5ecc8f38bb35c65c4a9c","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.1":{"name":"buster-test-cli","version":"0.4.1","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5.1","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"faye":"~0.7","buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"7b9b390ae52979ba2f1ec049c49abdd5ae5008cd","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.2":{"name":"buster-test-cli","version":"0.4.2","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5.1","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"9d2149a3c96193716f8b40287452235d53a2e5b7","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.3":{"name":"buster-test-cli","version":"0.4.3","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5.1","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4.1","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e0ff2ee41518c4c9dfaf5ad30b6ee291393d1373","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.3.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.4":{"name":"buster-test-cli","version":"0.4.4","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5.1","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4.2","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.4","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"244a803f818df82b1cafbcad158b9a9cb1315b35","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.4.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.5":{"name":"buster-test-cli","version":"0.4.5","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5.1","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4.2","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.5","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b144a7892493e71503a088943d5dbb3a0097d708","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.5.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.6":{"name":"buster-test-cli","version":"0.4.6","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.5.1","buster-client":">=0.5.1","buster-cli":">=0.4","buster-configuration":">=0.3","buster-terminal":">=0.3","buster-capture-server":">=0.4","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.1","buster-assertions":">=0.9","buster-format":">=0.5.1","buster-test":">=0.4.2","buster-args":">=0.3","buster-analyzer":">=0.1","buster-syntax":">=0.1","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1","buster-resources":">=0.2","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.4.1"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.1"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"fe53afdde8d0310e7a8916bc98d941b3e2a1be75","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.6.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.4.7":{"name":"buster-test-cli","version":"0.4.7","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.6.0","buster-client":">=0.5.3","buster-cli":">=0.4.2","buster-configuration":">=0.4.1","buster-terminal":">=0.4","buster-capture-server":">=0.4.2","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-test":">=0.5.0","buster-args":">=0.3.1","buster-analyzer":">=0.2","buster-syntax":">=0.2","buster-user-agent-parser":">=0.2.1","buster-bayeux-emitter":">=0.1.1","buster-resources":">=0.3","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.5.0"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.4.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"78040d0be8b3559c111013120847e9fbfa668354","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.4.7.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.0":{"name":"buster-test-cli","version":"0.5.0","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.6.0","buster-client":">=0.5.3","buster-cli":">=0.4.2","buster-configuration":">=0.4.1","buster-terminal":">=0.4","buster-capture-server":">=0.4.2","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-test":">=0.5.0","buster-args":">=0.3.1","buster-analyzer":">=0.2","buster-syntax":">=0.2","buster-user-agent-parser":">=0.3.0","buster-bayeux-emitter":">=0.1.1","buster-resources":">=0.3","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.5.0"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.5.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"3173d550ec8c847acb5fc408ed5a8c006f615146","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.1":{"name":"buster-test-cli","version":"0.5.1","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.6.0","buster-client":">=0.5.4","buster-cli":">=0.4.2","buster-configuration":">=0.4.1","buster-terminal":">=0.4","buster-capture-server":">=0.4.2","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-test":">=0.5.0","buster-args":">=0.3.1","buster-analyzer":">=0.2","buster-syntax":">=0.2","buster-user-agent-parser":">=0.3.0","buster-bayeux-emitter":">=0.1.1","buster-resources":">=0.3","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.5.0"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.5.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f367b990b88833fd2378d4b43c2ec2e732bf08d4","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.5.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.5.2":{"name":"buster-test-cli","version":"0.5.2","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/buster-test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"dependencies":{"buster-core":">=0.6.1","buster-client":">=0.5.4","buster-cli":">=0.4.2","buster-configuration":">=0.4.1","buster-terminal":">=0.4","buster-capture-server":">=0.4.2","when":"https://github.com/cujojs/when/tarball/1.0.2","buster-evented-logger":">=0.4.3","buster-assertions":">=0.10","buster-format":">=0.5.3","buster-test":">=0.5.2","buster-args":">=0.3.1","buster-analyzer":">=0.2","buster-syntax":">=0.2","buster-user-agent-parser":">=0.3.0","buster-bayeux-emitter":">=0.1.1","buster-resources":">=0.3","rimraf":"~1","paperboy":"~0","ejs":"~0.4","mime":"~1.2","sinon":">=1.3.1","sinon-buster":">=0.5.0"},"devDependencies":{"buster-util":">=0.5","buster-stdio-logger":">=0.2.2"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.5.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"61516d239140046b3d4797ae6e28a7ad30d4fdf5","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.5.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}],"directories":{}},"0.6.0":{"name":"buster-test-cli","version":"0.6.0","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test -c buster-config.js"},"dependencies":{"buster-analyzer":">=0.3","buster-capture-server":"~0.5","buster-cli":">=0.5.0","buster-core":">=0.6.2","buster-terminal":">=0.4.1","buster-test":">=0.6.0","buster-user-agent-parser":">=0.3.1","ejs":"~0.4","when":"~1.2"},"devDependencies":{"buster":"","stream-logger":">=0.3.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.6.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"e4053e43487a44863f7f2212d29b6f3525929d6c","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.6.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.6.1":{"name":"buster-test-cli","version":"0.6.1","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test -c buster-config.js"},"dependencies":{"buster-analyzer":">=0.3","buster-capture-server":"~0.5","buster-cli":">=0.5.0","buster-core":">=0.6.2","buster-terminal":">=0.4.1","buster-test":">=0.6.1","buster-user-agent-parser":">=0.3.1","ejs":"~0.4","when":"https://github.com/cujojs/when/tarball/1.3.0"},"devDependencies":{"buster":"","stream-logger":">=0.3.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.6.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"741d96d73939b370fb568e6c69288ccb48a1128f","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.6.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]},"0.6.2":{"name":"buster-test-cli","version":"0.6.2","description":"Cli tools for Buster.JS test runners","homepage":"http://busterjs.org/docs/buster-test-cli","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"August Lilleaas","email":"august.lilleaas@gmail.com","url":"http://augustl.com"},{"name":"Christian Johansen","email":"christian@cjohansen.no","url":"http://cjohansen.no"}],"main":"./lib/test-cli","repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"scripts":{"test":"./node_modules/buster/bin/buster-test -c buster-config.js"},"dependencies":{"buster-analyzer":">=0.3","buster-capture-server":"~0.5","buster-cli":">=0.5.0","buster-core":">=0.6.2","buster-terminal":">=0.4.1","buster-test":">=0.6.1","buster-user-agent-parser":">=0.3.1","ejs":"~0.4","when":"https://github.com/cujojs/when/tarball/1.3.0"},"devDependencies":{"buster":"","stream-logger":">=0.3.0"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-test-cli@0.6.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"04fffc0cbed02e6ed6160f09d6205d6364430828","tarball":"http://registry.npmjs.org/buster-test-cli/-/buster-test-cli-0.6.2.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-07-10T11:39:12.454Z","created":"2011-08-09T19:44:53.613Z","0.1.0":"2011-08-09T19:44:55.357Z","0.2.0":"2011-08-23T22:42:59.376Z","0.2.1":"2011-08-25T11:55:33.864Z","0.2.2":"2011-09-10T08:49:06.515Z","0.2.3":"2011-10-19T19:11:54.547Z","0.2.4":"2011-10-19T19:15:07.754Z","0.3.0":"2011-12-05T21:24:40.507Z","0.4.0":"2012-02-16T19:48:19.026Z","0.4.1":"2012-02-17T22:49:03.648Z","0.4.2":"2012-02-18T11:04:41.347Z","0.4.3":"2012-02-20T22:51:30.220Z","0.4.4":"2012-02-21T22:22:04.659Z","0.4.5":"2012-03-03T22:36:28.799Z","0.4.6":"2012-03-07T22:57:12.044Z","0.4.7":"2012-04-17T22:07:06.675Z","0.5.0":"2012-04-25T20:55:27.525Z","0.5.1":"2012-05-02T21:29:54.449Z","0.5.2":"2012-05-04T21:13:36.970Z","0.6.0":"2012-06-20T21:35:58.507Z","0.6.1":"2012-07-09T22:29:45.283Z","0.6.2":"2012-07-10T11:39:12.454Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"git://gitorious.org/buster/buster-test-cli.git"},"_attachments":{"buster-test-cli-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":52,"digest":"md5-JD6hGfJBXcIJPnxUf8/w6Q==","length":24404,"stub":true},"buster-test-cli-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":50,"digest":"md5-1fKGRHP2goQ6etMHi5wRig==","length":24398,"stub":true},"buster-test-cli-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":47,"digest":"md5-i7mn8c0J7mTChOPSb+9Aow==","length":24134,"stub":true},"buster-test-cli-0.5.2.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-6Knnfn+Chygz+Fxk2f0PTg==","length":348227,"stub":true},"buster-test-cli-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":39,"digest":"md5-0Z7Bhzz0G3cqjaqNEIy85Q==","length":348168,"stub":true},"buster-test-cli-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":37,"digest":"md5-FH2vEIm44iQh7Q2JE0+1xg==","length":348140,"stub":true},"buster-test-cli-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":35,"digest":"md5-Tn56wElKMVRSsgPbO+Si6g==","length":281282,"stub":true},"buster-test-cli-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":29,"digest":"md5-WFu/S9r08otx/u1thP5uIQ==","length":279003,"stub":true},"buster-test-cli-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":27,"digest":"md5-WhiiJqnGspgO3Cx0+Zq5+g==","length":278881,"stub":true},"buster-test-cli-0.4.4.tgz":{"content_type":"application/octet-stream","revpos":25,"digest":"md5-nye4oOArXqiWu3WJVGTOQA==","length":278793,"stub":true},"buster-test-cli-0.4.3.tgz":{"content_type":"application/octet-stream","revpos":23,"digest":"md5-e13lAN6xxYAnKDK5KJs+Cw==","length":278614,"stub":true},"buster-test-cli-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-6yGpFygIgxLtmn51YkEZFw==","length":278517,"stub":true},"buster-test-cli-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-7EVS1WhPkAwR+XU6qwWWmg==","length":278521,"stub":true},"buster-test-cli-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-Asby345smRYOsQTNhyq0PQ==","length":278430,"stub":true},"buster-test-cli-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-jLZMQqw4wNjCv+H77CAK6w==","length":276123,"stub":true},"buster-test-cli-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-uQ4E8Nu+9z+raw92yM0tEw==","length":272567,"stub":true},"buster-test-cli-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-IWX1F347ruNu7HCkevAdKA==","length":272561,"stub":true},"buster-test-cli-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-+wuit6k/0Pns5nfnTsKvfQ==","length":272447,"stub":true},"buster-test-cli-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-MuR6KXi63FktSmfx36Z/MA==","length":272441,"stub":true},"buster-test-cli-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-CWCD3Sl3AjGEkv7IE4Tuow==","length":272359,"stub":true},"buster-test-cli-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NqdKTCNTcDJpQYfBskBOMA==","length":271609,"stub":true}}}},
{"id":"buster-user-agent-parser","key":"buster-user-agent-parser","value":{"rev":"10-133ed359a415c8acae98090064c592be"},"doc":{"_id":"buster-user-agent-parser","_rev":"10-133ed359a415c8acae98090064c592be","name":"buster-user-agent-parser","description":"Simple user agent parser that gets browser, platform and version","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.0":{"name":"buster-user-agent-parser","version":"0.2.0","description":"Simple user agent parser that gets browser, platform and version","homepage":"http://busterjs.org/docs/buster-user-agent-parser","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS User agent parser was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-user-agent-parser","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-user-agent-parser.git"},"dependencies":{},"devDependencies":{},"_id":"buster-user-agent-parser@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"07ab7328e75160d1e6a2e74da927bab559f7530a","tarball":"http://registry.npmjs.org/buster-user-agent-parser/-/buster-user-agent-parser-0.2.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.2.1":{"name":"buster-user-agent-parser","version":"0.2.1","description":"Simple user agent parser that gets browser, platform and version","homepage":"http://busterjs.org/docs/buster-user-agent-parser","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS User agent parser was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-user-agent-parser","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-user-agent-parser.git"},"dependencies":{},"devDependencies":{},"_id":"buster-user-agent-parser@0.2.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"bdcad1d80795b163906d858195f349645f290a8c","tarball":"http://registry.npmjs.org/buster-user-agent-parser/-/buster-user-agent-parser-0.2.1.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.0":{"name":"buster-user-agent-parser","version":"0.3.0","description":"Simple user agent parser that gets browser, platform and version","homepage":"http://busterjs.org/docs/buster-user-agent-parser","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS User agent parser was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-user-agent-parser","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-user-agent-parser.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-user-agent-parser@0.3.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"b8f82f16b5ff859d125ee3a19149c9a28c7f6aba","tarball":"http://registry.npmjs.org/buster-user-agent-parser/-/buster-user-agent-parser-0.3.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.3.1":{"name":"buster-user-agent-parser","version":"0.3.1","description":"Simple user agent parser that gets browser, platform and version","homepage":"http://busterjs.org/docs/buster-user-agent-parser","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS User agent parser was written by"},{"name":"Christian Johansen, christian@cjohansen.no"},{"name":"August Lilleaas, august.lilleaas@gmail.com"}],"main":"./lib/buster-user-agent-parser","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-user-agent-parser.git"},"scripts":{"test":"node test/buster-user-agent-parser-test.js"},"devDependencies":{"buster":"*"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-user-agent-parser@0.3.1","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"77381636077e2740a2c32d15e976c67222787a0e","tarball":"http://registry.npmjs.org/buster-user-agent-parser/-/buster-user-agent-parser-0.3.1.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:45:13.538Z","created":"2011-08-08T21:29:21.238Z","0.2.0":"2011-08-08T21:29:22.370Z","0.2.1":"2011-08-23T22:29:40.680Z","0.3.0":"2012-04-25T20:55:01.446Z","0.3.1":"2012-06-20T21:37:59.632Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-user-agent-parser.git"},"_attachments":{"buster-user-agent-parser-0.3.1.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-l6JYAhVZq12fEHtdovMPrQ==","length":11042,"stub":true},"buster-user-agent-parser-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-QfzOSXlt2JRB7VEjymmjqg==","length":10839,"stub":true},"buster-user-agent-parser-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-18363J9KwiQG/3MAUCa/uw==","length":8823,"stub":true},"buster-user-agent-parser-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2phUt4ZFGvOjvmcyrR2AQg==","length":8823,"stub":true}}}},
{"id":"buster-util","key":"buster-util","value":{"rev":"8-4bd25954c5691ac0051825efb91ad0a2"},"doc":{"_id":"buster-util","_rev":"8-4bd25954c5691ac0051825efb91ad0a2","name":"buster-util","description":"Buster internal utilities","dist-tags":{"latest":"0.5.0"},"versions":{"0.3.0":{"name":"buster-util","version":"0.3.0","description":"Buster internal utilities","homepage":"http://busterjs.org/docs/buster-util","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Utils was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"main":"./lib/buster-util","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-util.git"},"dependencies":{},"devDependencies":{},"_id":"buster-util@0.3.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.6","_defaultsLoaded":true,"dist":{"shasum":"27898e3182e67f951f2b16cfcabdbe2ec9e6f6e0","tarball":"http://registry.npmjs.org/buster-util/-/buster-util-0.3.0.tgz"},"scripts":{},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.4.0":{"name":"buster-util","version":"0.4.0","description":"Buster internal utilities","homepage":"http://busterjs.org/docs/buster-util","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Utils was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"main":"./lib/buster-util","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-util.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-util@0.4.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"2f75f3dfd42223b763cf6148b4cc71b07079f72d","tarball":"http://registry.npmjs.org/buster-util/-/buster-util-0.4.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]},"0.5.0":{"name":"buster-util","version":"0.5.0","description":"Buster internal utilities","homepage":"http://busterjs.org/docs/buster-util","author":{"name":"August Lilleaas and Christian Johansen"},"contributors":[{"name":"Buster.JS Utils was written by"},{"name":"August Lilleaas, augustlilleaas@gmail.com"},{"name":"Christian Johansen, christian@cjohansen.no"}],"main":"./lib/buster-util","repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-util.git"},"_npmUser":{"name":"cjohansen","email":"christian@cjohansen.no"},"_id":"buster-util@0.5.0","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-alpha-6","_nodeVersion":"v0.6.5","_defaultsLoaded":true,"dist":{"shasum":"f47f65000fd6e58a1b470c64af11c71e84f95c9a","tarball":"http://registry.npmjs.org/buster-util/-/buster-util-0.5.0.tgz"},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"}]}},"maintainers":[{"name":"cjohansen","email":"christian@cjohansen.no"},{"name":"augustl","email":"august@augustl.com"}],"time":{"modified":"2012-06-21T12:45:20.325Z","created":"2011-08-08T20:33:19.430Z","0.3.0":"2011-08-08T20:33:21.404Z","0.4.0":"2011-12-05T21:14:24.195Z","0.5.0":"2012-02-16T19:25:08.492Z"},"author":{"name":"August Lilleaas and Christian Johansen"},"repository":{"type":"git","url":"http://git.gitorious.org/buster-js/buster-util.git"},"_attachments":{"buster-util-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-ZyjmKsXBKrwDXB8d5StvNQ==","length":5134,"stub":true},"buster-util-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-ySmzli0c82G/32/mnijklQ==","length":5133,"stub":true},"buster-util-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-mB2YMxa4JWGDNWglaZd0BQ==","length":5059,"stub":true}}}},
{"id":"buster-win","key":"buster-win","value":{"rev":"21-bf10019f8f38ced6da4181ba6b07249c"},"doc":{"_id":"buster-win","_rev":"21-bf10019f8f38ced6da4181ba6b07249c","name":"buster-win","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","dist-tags":{"latest":"0.0.9"},"versions":{"0.0.1":{"name":"buster-win","version":"0.0.1","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n    npm install buster-win\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n* Write tests using busterjs (http://busterjs.org/).\r\n* Inside that folder create a file \"index.js\" with the code below.\r\n\r\n```javascript\r\n    var BusterWin = require('buster-win');\r\n    var busterWin = new BusterWin({ tests: /-test\\.js$/i });\r\n    busterWin.run(__dirname);\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```","_id":"buster-win@0.0.1","dist":{"shasum":"1010a2efb7b41899cfd05b1b907662526e515555","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.1.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"}]},"0.0.2":{"name":"buster-win","version":"0.0.2","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    env: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\", // or \"node\"\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org/).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```","_id":"buster-win@0.0.2","dist":{"shasum":"b6e5bcd28886f4fb8d3d71206442860f5c0b4499","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.2.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.3":{"name":"buster-win","version":"0.0.3","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"stayOpen\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    stayOpen: true,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at http://busterjs.org/docs/.","_id":"buster-win@0.0.3","dist":{"shasum":"7ea04d697cec9a72f0af3bfe4054cc8b38e8f8e1","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.3.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.4":{"name":"buster-win","version":"0.0.4","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"autoRun: false\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    autoRun: false,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at http://busterjs.org/docs/.","_id":"buster-win@0.0.4","dist":{"shasum":"effcfd808175ce1cea8b5c945651d2c28d27b9c4","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.4.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.5":{"name":"buster-win","version":"0.0.5","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"autoRun: false\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    autoRun: false,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n* Put a breakpoint in the test you would like to debug.\r\n* Refresh the page.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at http://busterjs.org/docs/.","_id":"buster-win@0.0.5","dist":{"shasum":"64ed55dca1cb0ff66d7f6c84867d5bc181d7fc8d","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.5.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.6":{"name":"buster-win","version":"0.0.6","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"autoRun: false\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    autoRun: false,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n* Put a breakpoint in the test you would like to debug.\r\n* Refresh the page.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at http://busterjs.org/docs/.","_id":"buster-win@0.0.6","dist":{"shasum":"3eb4bca4cd69b54be1ca68885a590725f471d89f","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.6.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.7":{"name":"buster-win","version":"0.0.7","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"autoRun: false\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    autoRun: false,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n* Put a breakpoint in the test you would like to debug.\r\n* Refresh the page.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at http://busterjs.org/docs/.","_id":"buster-win@0.0.7","dist":{"shasum":"b0cfc45d922acc71f3b328ef066ebb2a2461ab5e","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.7.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.8":{"name":"buster-win","version":"0.0.8","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"autoRun: false\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    autoRun: false,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n* Put a breakpoint in the test you would like to debug.\r\n* Refresh the page.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at the official [BusterJS Site](http://busterjs.org/docs/)","_id":"buster-win@0.0.8","dist":{"shasum":"c2e0221b52659b2e2874a1c679906d77798677b0","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.8.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]},"0.0.9":{"name":"buster-win","version":"0.0.9","description":"Temporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.","main":"lib/buster-win.js","dependencies":{"underscore":"*","glob":"*"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"contributors":[{"name":"Jon Dunn","email":"jondunndev@gmail.com"}],"keywords":["buster","busterjs","windows","test","unit"],"license":"MIT/X11","engine":{"node":">=0.4.0"},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n1. Download phantomjs from http://phantomjs.org.\r\n2. Add path to directory containing \"phantomjs.exe\" to PATH environment variable.\r\n3. Use npm to install depedencies for node.\r\n\r\n<pre>\r\nnpm install buster\r\nnpm install buster-win\r\n</pre>\r\n\r\n### Using package.json to install\r\n\r\nIf your project has a package.json, you can install by doing the following:\r\n\r\nAdd \"devDependencies\" to the package.json file as below.\r\n\r\n```javascript\r\n{\r\n    \"devDependencies\": {\r\n        \"buster\": \"*\",\r\n        \"buster-win\": \"*\"\r\n    }\r\n}\r\n```\r\n\r\nRun the npm command below.\r\n\r\n    npm install -dev\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n\r\nInside that folder create the following:\r\n\r\n\r\n    test/\r\n        buster.js\r\n        index.js\r\n        first-test.js\r\n        second-test.js\r\n\r\n* A file \"index.js\" with the code below.\r\n\r\n```javascript\r\nrequire('buster-win').execute(__dirname);\r\n```\r\n\r\n* A \"buster.js\" config file.\r\n\r\n```javascript\r\nvar config = module.exports;\r\n\r\nconfig[\"Node tests\"] = {\r\n    environment: \"node\",\r\n    tests: [\r\n        \"**/*-test.js\"\r\n    ]\r\n};\r\n\r\nconfig[\"Browser tests\"] = {\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\", // Paths are relative to config file\r\n        \"lib/**/*.js\"   // Glob patterns supported\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Tests using busterjs (http://busterjs.org).\r\n\r\n```javascript\r\nvar buster = require('buster');\r\nbuster.spec.expose();\r\n\r\ndescribe(\"My thing\", function () {\r\n    it(\"has the foo and bar\", function () {\r\n        expect(\"foo\").toEqual(\"bar\");\r\n    });\r\n\r\n    it(\"states the obvious\", function () {\r\n        expect(true).toBe(true);\r\n    });\r\n});\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```\r\n\r\n### Run With WebStorm\r\n\r\n1. Go to the \"Run\" menu and choose \"Edit configurations...\".\r\n2. Click on the \"+\" icon and choose \"Node JS\".\r\n3. Set \"Working Directory\" to the location of your \"test\" folder.\r\n4. Set \"Path to Node App JS File\" to \"index.js\" and click \"OK\".\r\n5. Click on the play icon next to your configuration in the toolbar.\r\n\r\n## Debugging\r\n\r\n### Node Debugging\r\n\r\nTo debug Node scripts in WebStorm, simply follow the steps in \"Run With WebStorm\", but run in configuration in debug mode.\r\n\r\n### Browser Debugging\r\n\r\nTo debug Browser script, do the following:\r\n\r\n* Add \"autoRun: false\" to the configuration for the browser test as below.\r\n\r\n```javascript\r\nconfig[\"Browser tests\"] = {\r\n    autoRun: false,\r\n    environment: \"browser\",\r\n    rootPath: \"../\",\r\n    sources: [\r\n        \"lib/mylib.js\",\r\n        \"lib/**/*.js\"\r\n    ],\r\n    tests: [\r\n        \"test/*-test.js\"\r\n    ]\r\n};\r\n```\r\n\r\n* Run the tests normally.\r\n* Open a Browser and go to http://localhost:1111.\r\n* Open the Browser debug tools.\r\n* Put a breakpoint in the test you would like to debug.\r\n* Refresh the page.\r\n\r\n\r\n## Additional Documentation\r\n\r\nAll additional documentation can be found at the official [BusterJS Site](http://busterjs.org/docs/)","_id":"buster-win@0.0.9","dist":{"shasum":"97a161735e2264b8afda30884966e57c1a15ea4f","tarball":"http://registry.npmjs.org/buster-win/-/buster-win-0.0.9.tgz"},"scripts":{},"maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}]}},"readme":"buster-win\r\n==========\r\n\r\nTemporary Windows harness for busterjs (A browser JavaScript testing toolkit) until v1 is released with full support.\r\n\r\n## Installation\r\n    npm install buster-win\r\n\r\n### Note\r\nInstall buster-win alongside buster. Buster-Win simply acts as a Windows test runner.\r\n\r\n## Usage\r\n\r\nbuster-win will execute all tests in a folder, matching a specified pattern.\r\n\r\n* Create a folder for your tests.  Example: \"test\".\r\n* Write tests using busterjs (http://busterjs.org/).\r\n* Inside that folder create a file \"index.js\" with the code below.\r\n\r\n```javascript\r\n    var BusterWin = require('buster-win');\r\n    var busterWin = new BusterWin({ tests: /-test\\.js$/i });\r\n    busterWin.run(__dirname);\r\n```\r\n\r\n* Run the following command where \"test\" is the name of the folder containing your tests.\r\n\r\n```\r\nnode test\r\n```","maintainers":[{"name":"jdunn2","email":"jondunndev@gmail.com"},{"name":"gjensen64","email":"gjensen64@gmail.com"}],"time":{"modified":"2012-08-08T16:26:27.587Z","created":"2012-06-29T17:38:46.033Z","0.0.1":"2012-06-29T17:38:49.163Z","0.0.2":"2012-07-12T17:34:53.593Z","0.0.3":"2012-07-12T20:12:27.099Z","0.0.4":"2012-07-12T20:19:40.721Z","0.0.5":"2012-07-13T12:39:55.109Z","0.0.6":"2012-07-13T13:24:26.150Z","0.0.7":"2012-07-13T14:30:56.039Z","0.0.8":"2012-07-30T21:03:11.579Z","0.0.9":"2012-08-08T16:26:27.587Z"},"author":{"name":"Gregg Jensen","email":"gjensen64@gmail.com","url":"https://github.com/greggjensen/buster-win"},"repository":{"type":"git","url":"https://github.com/greggjensen/buster-win.git"},"users":{"fgribreau":true},"_attachments":{"buster-win-0.0.9.tgz":{"content_type":"application/octet-stream","revpos":21,"digest":"md5-E30vaiuOmuZXGtqHDOeuBw==","length":11599,"stub":true},"buster-win-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-xOwwBOIaypsc4A2+Lx4iFw==","length":10457,"stub":true},"buster-win-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-9f2RgpRnBN3zl+KV9/h2aw==","length":9720,"stub":true},"buster-win-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-iqZ2ulJAlPHB/CkZpQLC+A==","length":47596,"stub":true},"buster-win-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-qDCvQfIMkRr/jyGIDxm9Hw==","length":47518,"stub":true},"buster-win-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-RtqzFSGSKB3CW5woc0MsLA==","length":47481,"stub":true},"buster-win-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-rLGj97PCFzErpo3unBF4og==","length":47504,"stub":true},"buster-win-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-YgECdKL83gb7FiMb3Yb8Og==","length":7917,"stub":true},"buster-win-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-sIUGtN5CUPeRuPoQw8JydQ==","length":2058,"stub":true}}}},
{"id":"butler","key":"butler","value":{"rev":"7-c964c4d213da6b0de2492ee57514d0f8"},"doc":{"_id":"butler","_rev":"7-c964c4d213da6b0de2492ee57514d0f8","name":"butler","description":"NodeJS Butler","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"butler","version":"0.0.1","description":"NodeJS Butler","keywords":["butler","async","promisse","future","fiber"],"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"engines":{"node":">= 0.4.0"},"directories":{"lib":"./lib","example":"./examples"},"main":"./lib/butler","_id":"butler@0.0.1","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.9-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"8fcf19b8d20985a81a5bc6c884d7522eac1663ab","tarball":"http://registry.npmjs.org/butler/-/butler-0.0.1.tgz"},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}]},"0.0.2":{"name":"butler","version":"0.0.2","description":"NodeJS Butler","keywords":["butler","async","promisse","future","fiber"],"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"engines":{"node":">= 0.4.0"},"directories":{"lib":"./lib","example":"./examples"},"main":"./lib/butler","_id":"butler@0.0.2","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.9-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a5caeea24daa06d02c135e4e298ad73a975d3e4d","tarball":"http://registry.npmjs.org/butler/-/butler-0.0.2.tgz"},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}]},"0.0.3":{"name":"butler","version":"0.0.3","description":"NodeJS Butler","keywords":["butler","async","promisse","future","fiber"],"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"engines":{"node":">= 0.4.0"},"directories":{"lib":"./lib","example":"./examples"},"main":"./lib/butler","_id":"butler@0.0.3","_engineSupported":true,"_npmVersion":"0.3.18","_nodeVersion":"v0.4.9-pre","files":[""],"_defaultsLoaded":true,"dist":{"shasum":"e0633e1231de7c9ace911c983d60ef0ce7d43921","tarball":"http://registry.npmjs.org/butler/-/butler-0.0.3.tgz"},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}]}},"maintainers":[{"name":"dresende","email":"dresende@thinkdigital.pt"}],"time":{"modified":"2011-08-11T23:36:00.607Z","created":"2011-08-11T12:20:34.990Z","0.0.1":"2011-08-11T12:20:35.822Z","0.0.2":"2011-08-11T18:06:55.583Z","0.0.3":"2011-08-11T23:36:00.607Z"},"author":{"name":"Diogo Resende","email":"dresende@thinkdigital.pt","url":"http://www.thinkdigital.pt"},"_attachments":{"butler-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-9hUAUlll94Wx6LAwUjZ8Tg==","length":29094,"stub":true},"butler-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-+EqBzu+cE8l03yVYAW4Gsw==","length":8813,"stub":true},"butler-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ZQX5W1dIbKczKRDnlLxAdA==","length":2435,"stub":true}}}},
{"id":"butter","key":"butter","value":{"rev":"3-3fc2fde2bd4c7ab33a3cdfc12efd0ad6"},"doc":{"_id":"butter","_rev":"3-3fc2fde2bd4c7ab33a3cdfc12efd0ad6","name":"butter","description":"Butter === nodeJS Buffer + ( some hexadecimals delights )","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.5":{"name":"butter","version":"0.1.5","description":"Butter === nodeJS Buffer + ( some hexadecimals delights )","homepage":"https://github.com/rootslab/butter","repository":{"type":"git","url":"git://github.com/rootslab/butter.git"},"keywords":["hex","parse","concat","join","butter","buffer"],"tags":["hex","parse","concat","concat","butter","buffer"],"author":{"name":"Guglielmo Ferri","email":"44gatti@gmail.com"},"dependencies":{},"main":"index","engines":{"node":">=0.4.x"},"_npmUser":{"name":"rootslab","email":"44gatti@gmail.com"},"_id":"butter@0.1.5","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.6.1-pre","_defaultsLoaded":true,"dist":{"shasum":"6926ebb4e204f226cc41705b1a3aa060d9ff0d92","tarball":"http://registry.npmjs.org/butter/-/butter-0.1.5.tgz"},"maintainers":[{"name":"rootslab","email":"44gatti@gmail.com"}]}},"maintainers":[{"name":"rootslab","email":"44gatti@gmail.com"}],"time":{"modified":"2011-11-05T18:28:09.935Z","created":"2011-11-05T18:28:06.090Z","0.1.5":"2011-11-05T18:28:09.935Z"},"author":{"name":"Guglielmo Ferri","email":"44gatti@gmail.com"},"repository":{"type":"git","url":"git://github.com/rootslab/butter.git"},"_attachments":{"butter-0.1.5.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-K5nnXgkG7dYEzgiVR1vVHQ==","length":11751,"stub":true}}}},
{"id":"buttly","key":"buttly","value":{"rev":"9-cb7e3d1326377e93a400a30302ca7445"},"doc":{"_id":"buttly","_rev":"9-cb7e3d1326377e93a400a30302ca7445","name":"buttly","description":"Jims Nightclub","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"buttly","version":"0.0.1","description":"Jims Nightclub","keywords":["jim"],"engines":{"node":">= 0.5.0"},"_npmUser":{"name":"ond","email":"no@no.com"},"_id":"buttly@0.0.1","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"ec0db970e733e83447e8a8a6a4eee9600c4e67be","tarball":"http://registry.npmjs.org/buttly/-/buttly-0.0.1.tgz"},"readme":"","maintainers":[{"name":"ond","email":"no@no.com"}]},"0.0.2":{"name":"buttly","version":"0.0.2","description":"Jims Nightclub","main":"main.js","bin":{"phonosaur":"main.js"},"keywords":["jim"],"engines":{"node":">= 0.5.0"},"_npmUser":{"name":"ond","email":"no@no.com"},"_id":"buttly@0.0.2","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"b49d664a1ac0182dad9bf9a287305c38d8f188ac","tarball":"http://registry.npmjs.org/buttly/-/buttly-0.0.2.tgz"},"readme":"","maintainers":[{"name":"ond","email":"no@no.com"}]},"0.0.3":{"name":"buttly","version":"0.0.3","description":"Jims Nightclub","main":"main.js","bin":{"butt":"node main.js"},"keywords":["jim"],"engines":{"node":">= 0.5.0"},"_npmUser":{"name":"ond","email":"no@no.com"},"_id":"buttly@0.0.3","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"222f221dc91267b94f78712dce142de2bc67acc1","tarball":"http://registry.npmjs.org/buttly/-/buttly-0.0.3.tgz"},"readme":"","maintainers":[{"name":"ond","email":"no@no.com"}]},"0.0.4":{"name":"buttly","version":"0.0.4","description":"Jims Nightclub","main":"main.js","bin":{"butt":"main.js"},"keywords":["jim"],"engines":{"node":">= 0.5.0"},"_npmUser":{"name":"ond","email":"no@no.com"},"_id":"buttly@0.0.4","dependencies":{},"devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"443744a29b92e8c7be2826f69f3fc584b2eb7a64","tarball":"http://registry.npmjs.org/buttly/-/buttly-0.0.4.tgz"},"readme":"","maintainers":[{"name":"ond","email":"no@no.com"}]}},"readme":"","maintainers":[{"name":"ond","email":"no@no.com"}],"time":{"modified":"2012-06-23T21:11:03.284Z","created":"2012-06-23T20:46:21.380Z","0.0.1":"2012-06-23T20:46:23.634Z","0.0.2":"2012-06-23T21:04:53.449Z","0.0.3":"2012-06-23T21:07:51.745Z","0.0.4":"2012-06-23T21:11:03.284Z"},"_attachments":{"buttly-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-+0DMr1Dh1gYtH//Qz+5OPw==","length":305,"stub":true},"buttly-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-Km7Y7OlXvHnPM5nLEe2yMQ==","length":290,"stub":true},"buttly-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-pgeaec583ZBWbb7ukBcTtg==","length":294,"stub":true},"buttly-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-oFo6uMW66sQcxGSbpKR3/Q==","length":249,"stub":true}}}},
{"id":"buzz","key":"buzz","value":{"rev":"11-6f55c86809a541cb54cfcd0c47a63889"},"doc":{"_id":"buzz","_rev":"11-6f55c86809a541cb54cfcd0c47a63889","name":"buzz","description":"Buzz is an app to kill an app and then restart it, over and over again. Similar to Forever.","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"buzz","version":"0.0.1","description":"Buzz is an app to kill an app and then restart it, over and over again. Similar to Forever.","homepage":["https://github.com/jprichardson/buzz"],"repository":{"type":"git","url":"git://github.com/jprichardson/kill_restart.git"},"keywords":["kill","restart","forever"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":["MIT"],"dependencies":{"coffee-script":">=1.0.1"},"bin":{"buzz":"bin/buzz"},"main":"buzz","_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"buzz@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"cb6faa069faffbe3f16e99ddebcc2689fb7b0482","tarball":"http://registry.npmjs.org/buzz/-/buzz-0.0.1.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]},"0.0.2":{"name":"buzz","version":"0.0.2","description":"Buzz is an app to kill an app and then restart it, over and over again. Similar to Forever.","homepage":["https://github.com/jprichardson/buzz"],"repository":{"type":"git","url":"git://github.com/jprichardson/buzz.git"},"keywords":["kill","restart","forever"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":["MIT"],"dependencies":{"coffee-script":">=1.0.1"},"bin":{"buzz":"bin/buzz"},"main":"buzz","_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"buzz@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"bd06e1fdb89693adeda1d7f8bc1003dc3ee5dad1","tarball":"http://registry.npmjs.org/buzz/-/buzz-0.0.2.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]},"0.0.3":{"name":"buzz","version":"0.0.3","description":"Buzz is an app to kill an app and then restart it, over and over again. Similar to Forever.","homepage":["https://github.com/jprichardson/buzz"],"repository":{"type":"git","url":"git://github.com/jprichardson/buzz.git"},"keywords":["kill","restart","forever","buzz"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":"http://github.com/jprichardson/buzz/raw/master/LICENSE"}],"dependencies":{"coffee-script":">=1.0.1"},"bin":{"buzz":"./bin/buzz","buzz_test":"./bin/buzz_test","smarty_pants":"./bin/smarty_pants"},"main":"buzz","_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"buzz@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"f56858bbf37775462260bd42bb4a3af143b52fc9","tarball":"http://registry.npmjs.org/buzz/-/buzz-0.0.3.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]},"0.0.4":{"name":"buzz","version":"0.0.4","description":"Buzz is an app to kill an app and then restart it, over and over again. Similar to Forever.","homepage":["https://github.com/jprichardson/buzz"],"repository":{"type":"git","url":"git://github.com/jprichardson/buzz.git"},"keywords":["kill","restart","forever","buzz"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":"http://github.com/jprichardson/buzz/raw/master/LICENSE"}],"dependencies":{"coffee-script":">=1.0.1"},"bin":{"buzz":"./bin/buzz","buzz_test":"./bin/buzz_test","smarty_pants":"./bin/smarty_pants"},"main":"buzz","_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"buzz@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"b9ec47c0d0ab8d4f760e05cd378bbbe48a5f609f","tarball":"http://registry.npmjs.org/buzz/-/buzz-0.0.4.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]},"0.0.5":{"name":"buzz","version":"0.0.5","description":"Buzz is an app to kill an app and then restart it, over and over again. Similar to Forever.","homepage":["https://github.com/jprichardson/buzz"],"repository":{"type":"git","url":"git://github.com/jprichardson/buzz.git"},"keywords":["kill","restart","forever","buzz"],"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"licenses":[{"type":"MIT","url":"http://github.com/jprichardson/buzz/raw/master/LICENSE"}],"dependencies":{"coffee-script":">=1.0.1"},"bin":{"buzz":"./bin/buzz","buzz_test":"./bin/buzz_test","smarty_pants":"./bin/smarty_pants"},"main":"buzz","_npmUser":{"name":"jp","email":"jprichardson@gmail.com"},"_id":"buzz@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.104","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"91a365869eadadce497986aef449e1f188b41587","tarball":"http://registry.npmjs.org/buzz/-/buzz-0.0.5.tgz"},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}]}},"maintainers":[{"name":"jp","email":"jprichardson@gmail.com"}],"time":{"modified":"2011-11-16T22:02:33.630Z","created":"2011-11-08T20:05:59.065Z","0.0.1":"2011-11-08T20:09:44.802Z","0.0.2":"2011-11-08T20:11:54.957Z","0.0.3":"2011-11-08T20:24:36.186Z","0.0.4":"2011-11-08T21:33:38.249Z","0.0.5":"2011-11-16T22:02:33.630Z"},"author":{"name":"JP Richardson","email":"jprichardson@gmail.com"},"repository":{"type":"git","url":"git://github.com/jprichardson/buzz.git"},"_attachments":{"buzz-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-6kSTDGlFvsiU6CPH4ImlCA==","length":10240,"stub":true},"buzz-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-fOvJ/eYRqC0muDNPGOriqA==","length":10240,"stub":true},"buzz-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-xmSRsXbZqQVhe26r5TQBYQ==","length":10240,"stub":true},"buzz-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-DVXMDlNrzuR+/HamkwmEYA==","length":10240,"stub":true},"buzz-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-2hZxIDQCZll1kUKFlG3/Yg==","length":10240,"stub":true}}}},
{"id":"buzzin","key":"buzzin","value":{"rev":"43-695f4b1ff2643ec79166859fd728e2c1"},"doc":{"_id":"buzzin","_rev":"43-695f4b1ff2643ec79166859fd728e2c1","name":"buzzin","description":"buzz coworkers","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"buzzin","version":"1.0.0","dependencies":{"mdns":"*","growler":">= 0.0.1"},"devDependencies":{},"engines":{"node":">= 0.6.0"},"author":"","contributors":[{"name":"Mark Bao","email":"mark@markbao.com","url":"http://github.com/markbao"}],"maintainers":[{"name":"markbao","email":"mark@markbao.com"}],"description":"buzz coworkers","_npmUser":{"name":"markbao","email":"mark@markbao.com"},"_id":"buzzin@1.0.0","scripts":{"start":"node server.js"},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4f8daaec6cb76da986ee032bfac4b35960f88164","tarball":"http://registry.npmjs.org/buzzin/-/buzzin-1.0.0.tgz"},"readme":"","directories":{}},"1.0.1":{"name":"buzzin","version":"1.0.1","dependencies":{"mdns":"*","growler":">= 0.0.1"},"devDependencies":{},"engines":{"node":">= 0.6.0"},"author":"","contributors":[{"name":"Mark Bao","email":"mark@markbao.com","url":"http://github.com/markbao"}],"bin":{"buzz":"buzz.js","buzz-server":"buzz-server.js"},"maintainers":[{"name":"markbao","email":"mark@markbao.com"}],"description":"buzz coworkers","_npmUser":{"name":"markbao","email":"mark@markbao.com"},"_id":"buzzin@1.0.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"a258ae8291cda52dcd3349a3222317e3e45064f1","tarball":"http://registry.npmjs.org/buzzin/-/buzzin-1.0.1.tgz"},"readme":""},"1.0.2":{"name":"buzzin","version":"1.0.2","dependencies":{"mdns":"*","growler":">= 0.0.1"},"devDependencies":{},"engines":{"node":">= 0.6.0"},"author":"","contributors":[{"name":"Mark Bao","email":"mark@markbao.com","url":"http://github.com/markbao"}],"bin":{"buzz":"buzz.js","buzz-server":"buzz-server.js"},"maintainers":[{"name":"markbao","email":"mark@markbao.com"}],"description":"buzz coworkers","_npmUser":{"name":"markbao","email":"mark@markbao.com"},"_id":"buzzin@1.0.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4b31b7f7dac946c1dbfa0ff7d2fd02a38cdf04e6","tarball":"http://registry.npmjs.org/buzzin/-/buzzin-1.0.2.tgz"},"readme":""}},"readme":"","maintainers":[{"name":"markbao","email":"mark@markbao.com"}],"time":{"modified":"2012-02-15T19:47:38.678Z","created":"2012-02-15T09:09:18.622Z","1.0.0":"2012-02-15T09:09:19.144Z","1.0.1":"2012-02-15T10:04:19.970Z","1.0.2":"2012-02-15T19:47:38.678Z"},"_attachments":{"buzzin-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":43,"digest":"md5-A93SGJrP0/xPrOAqAO8aeg==","length":2108,"stub":true},"buzzin-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":41,"digest":"md5-C8Fx6/h2AE0R0Rr3pxJ+6Q==","length":2097,"stub":true},"buzzin-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-OIo3tAPLEacvsebYGWcOBA==","length":1821,"stub":true}}}},
{"id":"bv","key":"bv","value":{"rev":"18-db715b5deb8a3b60ccab2d5f12a48c85"},"doc":{"_id":"bv","_rev":"18-db715b5deb8a3b60ccab2d5f12a48c85","name":"bv","description":"bump version and publish in one easy command.","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"bv","version":"0.0.1","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bumpv","repository":{"type":"git","url":"git://github.com/dominictarr/bumpv.git"},"dependencies":{},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"f902c1d52163b4bd718130873d64c4a7b0630feb","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.1.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"directories":{}},"0.0.3":{"name":"bv","version":"0.0.3","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bumpv","repository":{"type":"git","url":"git://github.com/dominictarr/bumpv.git"},"dependencies":{"semver":"~0.3.4","jsup":"~0.0.1","optimist":"~0.3.4"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.3","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"fdc50382bb4f780402ee0afccc2c55b0aee24163","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.3.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"directories":{}},"0.0.4":{"name":"bv","version":"0.0.4","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bumpv","repository":{"type":"git","url":"git://github.com/dominictarr/bumpv.git"},"dependencies":{"semver":"~0.3.4","jsup":"~0.0.1","optimist":"~0.3.4"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.4","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"229f586558373d302faadc13a537f8f93f5017dc","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.4.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"directories":{}},"0.0.5":{"name":"bv","version":"0.0.5","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bumpv","repository":{"type":"git","url":"git://github.com/dominictarr/bumpv.git"},"dependencies":{"semver":"~1.0.14","jsup":"~0.0.1","optimist":"~0.3.4"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7c828fc408409b8d94e8ab82bae8e106ba11e267","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.5.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.6":{"name":"bv","version":"0.0.6","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bumpv","repository":{"type":"git","url":"git://github.com/dominictarr/bumpv.git"},"dependencies":{"semver":"~1.0.14","jsup":"~0.0.1","optimist":"~0.3.4"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.6","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"41a78f21a347826c67463882010cc8b6befe51b4","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.6.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.7":{"name":"bv","version":"0.0.7","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bv","repository":{"type":"git","url":"git://github.com/dominictarr/bv.git"},"dependencies":{"semver":"~1.0.14","jsup":"~0.0.1","optimist":"~0.3.4"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.7","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"bfbc4689dfdc24ddb9ce3d7bdaf4b650d7ed39ff","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.7.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]},"0.0.8":{"name":"bv","version":"0.0.8","description":"bump version and publish in one easy command.","homepage":"http://github.com/dominictarr/bv","repository":{"type":"git","url":"git://github.com/dominictarr/bv.git"},"dependencies":{"semver":"~1.0.14","jsup":"~0.0.1","optimist":"~0.3.4"},"devDependencies":{},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"bin":{"bv":"./index.js"},"_npmUser":{"name":"dominictarr","email":"dominic.tarr@gmail.com"},"_id":"bv@0.0.8","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.23","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"19e31d04839303c99ed25e275fc126aa9aea3f3d","tarball":"http://registry.npmjs.org/bv/-/bv-0.0.8.tgz"},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}]}},"readme":"","maintainers":[{"name":"dominictarr","email":"dominic.tarr@gmail.com"}],"time":{"modified":"2012-06-08T12:06:00.019Z","created":"2012-06-08T10:31:41.860Z","0.0.1":"2012-06-08T10:31:52.103Z","0.0.3":"2012-06-08T11:15:30.481Z","0.0.4":"2012-06-08T11:16:19.095Z","0.0.5":"2012-06-08T11:30:22.693Z","0.0.6":"2012-06-08T11:37:17.327Z","0.0.7":"2012-06-08T11:40:37.418Z","0.0.8":"2012-06-08T12:06:00.019Z"},"author":{"name":"Dominic Tarr","email":"dominic.tarr@gmail.com","url":"dominictarr.com"},"repository":{"type":"git","url":"git://github.com/dominictarr/bv.git"},"_attachments":{"bv-0.0.8.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-MOOJsr6l2x9jBHl7c3OwEQ==","length":1839,"stub":true},"bv-0.0.7.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-WCt8IKOjkZbTnz1AFz24ZA==","length":1776,"stub":true},"bv-0.0.6.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-wciCdXOBiRwRBQkqht8GUQ==","length":1776,"stub":true},"bv-0.0.5.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-psNJOgDgfyFQYJc6BPt0Lw==","length":1759,"stub":true},"bv-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-bkuv/P43xV/WSEFVCkR13A==","length":1751,"stub":true},"bv-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-3W3BiJ9/zGPQ2F1GgGAyUg==","length":1748,"stub":true},"bv-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-87XG8knCD2Q/pAqrwYoTTw==","length":1234,"stub":true}}}},
{"id":"bxh","key":"bxh","value":{"rev":"6-f280b0d6572b1d96544eceaa9873aa84"},"doc":{"_id":"bxh","_rev":"6-f280b0d6572b1d96544eceaa9873aa84","name":"bxh","description":"Bounding interval hierarchy and bounding volume hierarchy library for nodejs","dist-tags":{"latest":"0.7.2"},"versions":{"0.7.1":{"name":"bxh","version":"0.7.1","description":"Bounding interval hierarchy and bounding volume hierarchy library for nodejs","main":"index.js","repository":{"type":"git","url":"git://github.com/imbcmdth/bxh.git"},"keywords":["bvh","bih","3d","2d","bounding","volume","interval","hierarchy","spatial","acceleration","intersection","search","javascript"],"devDependencies":{"vows":"0.6.x","mjs":"1.0.x","owldoc":"0.0.x"},"author":{"name":"Jon-Carlos Rivera","email":"jon.carlos.rivera@gmail.com","url":"http://jon-carlos.com"},"scripts":{"test":"vows"},"licenses":[{"type":"LGPL","url":"http://www.gnu.org/licenses/lgpl.html"}],"engine":{"node":">=0.6.x"},"readme":"","_id":"bxh@0.7.1","dist":{"shasum":"8a5ca90fbda70659962d282c6a7dd46758df9bee","tarball":"http://registry.npmjs.org/bxh/-/bxh-0.7.1.tgz"},"maintainers":[{"name":"imbcmdth","email":"jon.carlos.rivera@gmail.com"}]},"0.7.2":{"name":"bxh","version":"0.7.2","description":"Bounding interval hierarchy and bounding volume hierarchy library for nodejs","main":"index.js","repository":{"type":"git","url":"git://github.com/imbcmdth/bxh.git"},"keywords":["bvh","bih","3d","2d","bounding","volume","interval","hierarchy","spatial","acceleration","intersection","search","javascript"],"devDependencies":{"vows":"0.6.x","mjs":"1.0.x","owldoc":"0.0.x"},"author":{"name":"Jon-Carlos Rivera","email":"jon.carlos.rivera@gmail.com","url":"http://jon-carlos.com"},"scripts":{"test":"vows","start":"node server.js"},"licenses":[{"type":"LGPL","url":"http://www.gnu.org/licenses/lgpl.html"}],"engine":{"node":">=0.6.x"},"readme":"","_id":"bxh@0.7.2","dist":{"shasum":"cf25b6e9c115c5c68e51325d2f3cdcb1a66e9ff8","tarball":"http://registry.npmjs.org/bxh/-/bxh-0.7.2.tgz"},"maintainers":[{"name":"imbcmdth","email":"jon.carlos.rivera@gmail.com"}]}},"readme":"","maintainers":[{"name":"imbcmdth","email":"jon.carlos.rivera@gmail.com"}],"time":{"modified":"2012-08-02T13:44:06.405Z","created":"2012-07-20T22:52:37.606Z","0.7.1":"2012-07-20T22:52:39.199Z","0.7.2":"2012-07-27T22:03:17.239Z"},"author":{"name":"Jon-Carlos Rivera","email":"jon.carlos.rivera@gmail.com","url":"http://jon-carlos.com"},"repository":{"type":"git","url":"git://github.com/imbcmdth/bxh.git"},"users":{"fgribreau":true},"_attachments":{"bxh-0.7.2.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-P/Neah9PmeIiDNkmLfOSzQ==","length":78612,"stub":true},"bxh-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iEX/1yq5oHLynllIhJF8ig==","length":20469,"stub":true}}}},
{"id":"bxjs","key":"bxjs","value":{"rev":"3-bbac1a9f049311b89672a1250d8bd22c"},"doc":{"_id":"bxjs","_rev":"3-bbac1a9f049311b89672a1250d8bd22c","name":"bxjs","description":"","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"bxjs","main":"./lib/Box.js","author":{"name":"rolandpoulter"},"version":"0.0.1","keywords":[],"homepage":"https://github.com/rolandpoulter/node-box-js","repository":{"type":"git","url":"git://github.com/rolandpoulter/node-box-js.git"},"description":"","contributors":[],"dependencies":{"clss":">= 0.0.1","uglify-js":">= 1.2.5"},"devDependencies":{"spc":">= 0.0.1"},"scripts":{"test":"node ./script/test.js"},"_npmUser":{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"},"_id":"bxjs@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"7c6b70db3b97526b9fec04e0fb9fe858237ecbcb","tarball":"http://registry.npmjs.org/bxjs/-/bxjs-0.0.1.tgz"},"readme":"","maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}]}},"readme":"","maintainers":[{"name":"rolandpoulter","email":"rolandpoulter@gmail.com"}],"time":{"modified":"2012-06-18T06:27:27.806Z","created":"2012-06-18T06:27:26.651Z","0.0.1":"2012-06-18T06:27:27.806Z"},"author":{"name":"rolandpoulter"},"repository":{"type":"git","url":"git://github.com/rolandpoulter/node-box-js.git"},"_attachments":{"bxjs-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-0zlHy4YugPMqJWB+aHBX5g==","length":13398,"stub":true}}}},
{"id":"byline","key":"byline","value":{"rev":"20-1871eaf90fec237ffbc3a142357cd4a3"},"doc":{"_id":"byline","_rev":"20-1871eaf90fec237ffbc3a142357cd4a3","name":"byline","description":"super-simple line-by-line Stream reader","dist-tags":{"latest":"2.0.3"},"versions":{"1.0.0":{"name":"byline","description":"insanely simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"1.0.0","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","dependencies":{},"devDependencies":{},"_id":"byline@1.0.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"02967a21ba5a8d24922c1d2b35ac5acc60b3612b","tarball":"http://registry.npmjs.org/byline/-/byline-1.0.0.tgz"},"scripts":{},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}],"directories":{}},"1.0.1":{"name":"byline","description":"insanely simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"1.0.1","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","dependencies":{},"devDependencies":{},"_id":"byline@1.0.1","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"97a87a06713d5ac20c9c0d1dd251ffbc72d221df","tarball":"http://registry.npmjs.org/byline/-/byline-1.0.1.tgz"},"scripts":{},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}],"directories":{}},"1.0.2":{"name":"byline","description":"insanely simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"1.0.2","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","dependencies":{},"devDependencies":{},"_id":"byline@1.0.2","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.7","_defaultsLoaded":true,"dist":{"shasum":"72eaa112c6e339cea15d56371585e9ed3cc8c92c","tarball":"http://registry.npmjs.org/byline/-/byline-1.0.2.tgz"},"scripts":{},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}],"directories":{}},"1.0.3":{"name":"byline","description":"insanely simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"1.0.3","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","dependencies":{},"devDependencies":{},"_id":"byline@1.0.3","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.6","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"b9fb39cb1ddc959ef7935220aab36eeb4fb985b1","tarball":"http://registry.npmjs.org/byline/-/byline-1.0.3.tgz"},"scripts":{},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}],"directories":{}},"2.0.1":{"name":"byline","description":"super-simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"2.0.1","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","_npmUser":{"name":"jahewson","email":"johnahewson@yahoo.co.uk"},"_id":"byline@2.0.1","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.1","_defaultsLoaded":true,"dist":{"shasum":"50a2fd336df1faa50c77986b561136c722937e9d","tarball":"http://registry.npmjs.org/byline/-/byline-2.0.1.tgz"},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}]},"2.0.2":{"name":"byline","description":"super-simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"2.0.2","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","_npmUser":{"name":"jahewson","email":"johnahewson@yahoo.co.uk"},"_id":"byline@2.0.2","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"d0b37d02153fe54101fbf6a22c0a15106498cc16","tarball":"http://registry.npmjs.org/byline/-/byline-2.0.2.tgz"},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}]},"2.0.3":{"name":"byline","description":"super-simple line-by-line Stream reader","homepage":"https://github.com/jahewson/node-byline","bugs":{"url":"https://github.com/jahewson/node-byline/issues"},"version":"2.0.3","author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"engine":["node >=0.4.0"],"main":"./lib","_npmUser":{"name":"jahewson","email":"johnahewson@yahoo.co.uk"},"_id":"byline@2.0.3","dependencies":{},"devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"811b24b8749c1cdd1d26b59b77fcc19d3e0d86c9","tarball":"http://registry.npmjs.org/byline/-/byline-2.0.3.tgz"},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}]}},"maintainers":[{"name":"jahewson","email":"johnahewson@yahoo.co.uk"}],"time":{"modified":"2012-08-02T13:44:13.659Z","created":"2011-08-31T22:56:15.096Z","1.0.0":"2011-08-31T22:56:16.112Z","1.0.1":"2011-08-31T23:16:37.506Z","1.0.2":"2011-09-07T10:14:13.136Z","1.0.3":"2011-09-14T09:33:38.250Z","2.0.1":"2011-11-21T00:11:03.242Z","2.0.2":"2012-03-26T22:49:49.259Z","2.0.3":"2012-07-26T20:36:55.009Z"},"author":{"name":"John Hewson"},"repository":{"type":"git","url":"git://github.com/jahewson/node-byline.git"},"users":{"fgribreau":true},"_attachments":{"byline-2.0.3.tgz":{"content_type":"application/octet-stream","revpos":19,"digest":"md5-/GNm9/oGODLozi0uiDDQWg==","length":10240,"stub":true},"byline-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":17,"digest":"md5-xDYU3MYHRLxrIPfp2XTrWg==","length":10240,"stub":true},"byline-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-SD1QeBcmW3kQiC6vw2rbdg==","length":10240,"stub":true},"byline-1.0.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-wGKrdqYTAbTtGYnRJdStBg==","length":2297,"stub":true},"byline-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-I5GQHymrxHrQO08Cl5nyKw==","length":2284,"stub":true},"byline-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-qpCsYIMviaGMThxRoO4/tQ==","length":2279,"stub":true},"byline-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-KgypPI6kcKwsj1Dy5fO4kg==","length":2134,"stub":true}}}},
{"id":"byp","key":"byp","value":{"rev":"7-2339ee0c418792a06fedaea52103019f"},"doc":{"_id":"byp","_rev":"7-2339ee0c418792a06fedaea52103019f","name":"byp","description":"It builds your C++ code with G++ or VC++'s CL.","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"byp","description":"It builds your C++ code with G++ or VC++'s CL.","keywords":["cli","c++","build","g++","visual","studios"],"version":"0.1.0","author":{"name":"CodeRarity","email":"coderarity@gmail.com"},"repository":{"type":"git","url":"git://github.com/coderarity/byp.git"},"preferGlobal":true,"dependencies":{"colors":"0.x.x","optimist":"0.3.1"},"bin":{"byp":"./bin/byp"},"main":"./lib/index","engines":{"node":"0.6.x"},"_npmUser":{"name":"coderarity","email":"coderarity@gmail.com"},"_id":"byp@0.1.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"5fd604c8c623ea73ed1aa56e98e8ce73a12a85d1","tarball":"http://registry.npmjs.org/byp/-/byp-0.1.0.tgz"},"maintainers":[{"name":"coderarity","email":"coderarity@gmail.com"}]},"0.1.1":{"name":"byp","description":"It builds your C++ code with G++ or VC++'s CL.","keywords":["cli","c++","build","g++","visual","studios"],"version":"0.1.1","author":{"name":"CodeRarity","email":"coderarity@gmail.com"},"repository":{"type":"git","url":"git://github.com/coderarity/byp.git"},"preferGlobal":true,"dependencies":{"colors":"0.x.x","optimist":"0.3.1"},"bin":{"byp":"./bin/byp"},"main":"./lib/index","engines":{"node":"0.6.x"},"_npmUser":{"name":"coderarity","email":"coderarity@gmail.com"},"_id":"byp@0.1.1","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-2","_nodeVersion":"v0.6.8","_defaultsLoaded":true,"dist":{"shasum":"d7dca096ef2fcfd9c5d20790da5e0abfe5849913","tarball":"http://registry.npmjs.org/byp/-/byp-0.1.1.tgz"},"maintainers":[{"name":"coderarity","email":"coderarity@gmail.com"}]},"0.2.0":{"name":"byp","description":"It builds your C++ code with G++ or VC++'s CL.","keywords":["cli","c++","build","g++","visual","studios"],"version":"0.2.0","author":{"name":"CodeRarity","email":"coderarity@gmail.com"},"repository":{"type":"git","url":"git://github.com/coderarity/byp.git"},"preferGlobal":true,"dependencies":{"colors":"0.x.x","optimist":"0.3.1"},"bin":{"byp":"./bin/byp"},"main":"./lib/index","engines":{"node":"0.6.x"},"_npmUser":{"name":"coderarity","email":"coderarity@gmail.com"},"_id":"byp@0.2.0","devDependencies":{},"optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"2224c1afa982a09d22ef660e27ef36d47dce13c7","tarball":"http://registry.npmjs.org/byp/-/byp-0.2.0.tgz"},"maintainers":[{"name":"coderarity","email":"coderarity@gmail.com"}]}},"readme":"#Build Your Projects\n\nBYP is like Google's GYP, but instead of generating your projects, it just straight up builds them using GCC or Visual Studios's CL. It's mainly targeted at C/C++/Objective-C. I was looking for a lightweight build tool that could run from the Visual Studios command line, because I don't want to start up VS just to build my code.\n\nIt's pretty minimal and built on Node.js.\n\nBYP should be fairly pluggable at this point - you can define new build systems and add macro processors. There should probably be more work on this in the future.\n\nYou probably shouldn't use this yet unless you're willing to change stuff. (don't forget the pull request!) It's REALLY alpha. In fact, I'd be surprised if it just works in your code. It'll be more stable in a while, but I only just started it.","maintainers":[{"name":"coderarity","email":"coderarity@gmail.com"}],"time":{"modified":"2012-02-09T02:11:23.480Z","created":"2012-02-07T22:12:19.842Z","0.1.0":"2012-02-07T22:12:20.180Z","0.1.1":"2012-02-07T22:18:35.288Z","0.2.0":"2012-02-09T02:11:23.480Z"},"author":{"name":"CodeRarity","email":"coderarity@gmail.com"},"repository":{"type":"git","url":"git://github.com/coderarity/byp.git"},"_attachments":{"byp-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-8cRv0+StsuVVnDbxIvBcTg==","length":9824,"stub":true},"byp-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-cnjl7qz8Q5huhlG2DkDM8A==","length":3684,"stub":true},"byp-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-iLdRRbUc8OpsUhE6LqCHxw==","length":3530,"stub":true}}}},
{"id":"bytes","key":"bytes","value":{"rev":"6-fd34cbf6426ee67bf75af4a578bd4009"},"doc":{"_id":"bytes","_rev":"6-fd34cbf6426ee67bf75af4a578bd4009","name":"bytes","description":"byte string parser (5mb etc)","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"bytes","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"description":"byte string parser (5mb etc)","version":"0.0.1","main":"index.js","dependencies":{},"devDependencies":{"mocha":"*","should":"*"},"_npmUser":{"name":"tjholowaychuk","email":"tj@vision-media.ca"},"_id":"bytes@0.0.1","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.24","_nodeVersion":"v0.6.19","_defaultsLoaded":true,"dist":{"shasum":"2a76c866ba90e6fd2641ab5c9fdb6c4e8b4015f7","tarball":"http://registry.npmjs.org/bytes/-/bytes-0.0.1.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]},"0.1.0":{"name":"bytes","author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"description":"byte string parser (5mb etc)","version":"0.1.0","main":"index.js","dependencies":{},"devDependencies":{"mocha":"*","should":"*"},"_id":"bytes@0.1.0","dist":{"shasum":"91dd930e7ecafdb830391be31159fd7854b91679","tarball":"http://registry.npmjs.org/bytes/-/bytes-0.1.0.tgz"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}]}},"readme":"\n# node-bytes\n\n  Byte string parser.\n\n## Example:\n\n```js\nbytes('1kb')\n// => 1024\n\nbytes('2mb')\n// => 2097152\n\nbytes('1gb')\n// => 1073741824\n```\n\n## Installation\n\n```\n$ npm install bytes\n```","maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"}],"time":{"modified":"2012-08-06T12:48:44.483Z","created":"2012-06-11T15:44:32.849Z","0.0.1":"2012-06-11T15:44:34.095Z","0.1.0":"2012-07-04T21:57:41.679Z"},"author":{"name":"TJ Holowaychuk","email":"tj@vision-media.ca","url":"http://tjholowaychuk.com"},"users":{"sjonnet19":true},"_attachments":{"bytes-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-MSUDQbuhGLFj3iihwVq5fA==","length":1027,"stub":true},"bytes-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-MgzBEtPtGuzwkxFVV3DIog==","length":789,"stub":true}}}},
{"id":"byvoidmodule","key":"byvoidmodule","value":{"rev":"4-3d946095d734508709fb6cf289342cec"},"doc":{"_id":"byvoidmodule","_rev":"4-3d946095d734508709fb6cf289342cec","name":"byvoidmodule","description":"A module for learning perpose.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"author":{"name":"BYVoid","email":"byvoid.kcp@gmail.com","url":"http://www.byvoid.com/"},"name":"byvoidmodule","description":"A module for learning perpose.","version":"0.0.1","homepage":"http://www.byvoid.com/","repository":{"url":""},"dependencies":{},"devDependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_npmUser":{"name":"yukun","email":"esw-hrc@163.com"},"_id":"byvoidmodule@0.0.1","_engineSupported":true,"_npmVersion":"1.1.12","_nodeVersion":"v0.6.14","_defaultsLoaded":true,"dist":{"shasum":"072cf00c62742024236b4e5b1478d1892d0e3ba9","tarball":"http://registry.npmjs.org/byvoidmodule/-/byvoidmodule-0.0.1.tgz"},"readme":"","maintainers":[{"name":"yukun","email":"esw-hrc@163.com"}]}},"readme":"","maintainers":[{"name":"yukun","email":"esw-hrc@163.com"}],"time":{"modified":"2012-08-02T13:44:10.440Z","created":"2012-07-27T07:01:36.871Z","0.0.1":"2012-07-27T07:01:43.984Z"},"author":{"name":"BYVoid","email":"byvoid.kcp@gmail.com","url":"http://www.byvoid.com/"},"repository":{"url":""},"users":{"fgribreau":true},"_attachments":{"byvoidmodule-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-i66+nN9qMzzFw2n5dI9VTw==","length":298,"stub":true}}}},
{"id":"bz","key":"bz","value":{"rev":"13-a04482b2f7fc21ceea2c2915e7fdfa60"},"doc":{"_id":"bz","_rev":"13-a04482b2f7fc21ceea2c2915e7fdfa60","name":"bz","description":"Bugzilla REST API wrapper","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"name":"bz","repository":{"url":"http://github.com/harthur/bz.git","type":"git"},"author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"directories":{"lib":"./lib"},"version":"0.1.0","devDependencies":{"request":"*","connect":"*"},"main":"./lib/bz","id":"jid0-3MhY9xRVhRU80IsfUnZKLeIo5c0","description":"Bugzilla REST API wrapper","_id":"bz@0.1.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.14-5","_nodeVersion":"v0.5.0-pre","modules":{"bz.js":"lib/bz.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"b8253a7d015ae1874c903994b070f3cbe699ade1","tarball":"http://registry.npmjs.org/bz/-/bz-0.1.0.tgz"}},"0.2.0":{"name":"bz","description":"Bugzilla REST API wrapper","version":"0.2.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"keywords":["bugzilla"],"repository":{"url":"http://github.com/harthur/bz.js.git","type":"git"},"main":"./lib/bz","directories":{"lib":"./lib"},"devDependencies":{"request":"*","connect":"*"},"id":"jid0-3MhY9xRVhRU80IsfUnZKLeIo5c0","_id":"bz@0.2.0","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"0.2.14-5","_nodeVersion":"v0.5.0-pre","modules":{"bz.js":"lib/bz.js"},"files":[""],"_defaultsLoaded":true,"dist":{"shasum":"a7d7c0e2bf9680ce8f3b398cd75cfc61cc3e5148","tarball":"http://registry.npmjs.org/bz/-/bz-0.2.0.tgz"}},"0.2.2":{"name":"bz","description":"Bugzilla REST API wrapper","version":"0.2.2","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"keywords":["bugzilla"],"repository":{"url":"git://github.com/harthur/bz.js.git","type":"git"},"main":"./lib/bz","directories":{"lib":"./lib"},"devDependencies":{"request":"*","connect":"*","browserify":">=1.0.0"},"id":"jid0-3MhY9xRVhRU80IsfUnZKLeIo5c0","_npmJsonOpts":{"file":"/Users/harth/.npm/bz/0.2.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"bz@0.2.2","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.13","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"8caccf9d9c3b5468e2da38363a6bdfb22d5051bb","tarball":"http://registry.npmjs.org/bz/-/bz-0.2.2.tgz"},"scripts":{},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.2.3":{"name":"bz","description":"Bugzilla REST API wrapper","version":"0.2.3","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"keywords":["bugzilla"],"repository":{"url":"git://github.com/harthur/bz.js.git","type":"git"},"main":"./lib/bz","directories":{"lib":"./lib"},"devDependencies":{"request":"*","connect":"*","browserify":">=1.0.0"},"id":"jid0-3MhY9xRVhRU80IsfUnZKLeIo5c0","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"bz@0.2.3","dependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.5.4-pre","_defaultsLoaded":true,"dist":{"shasum":"eec4abca7ee4d07aee6622a9d9cac2dc34f00972","tarball":"http://registry.npmjs.org/bz/-/bz-0.2.3.tgz"},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.2.4":{"name":"bz","description":"Bugzilla REST API wrapper","version":"0.2.4","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"keywords":["bugzilla"],"repository":{"url":"git://github.com/harthur/bz.js.git","type":"git"},"main":"./lib/bz","directories":{"lib":"./lib"},"devDependencies":{"request":"*","connect":"*","browserify":">=1.0.0"},"id":"jid0-3MhY9xRVhRU80IsfUnZKLeIo5c0","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"bz@0.2.4","dependencies":{},"optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"a8493f7859e68cf254efe915be830ae60b31c3b5","tarball":"http://registry.npmjs.org/bz/-/bz-0.2.4.tgz"},"readme":"# bz.js\n\nA JavaScript wrapper for the [Bugzilla REST API](https://wiki.mozilla.org/Bugzilla:REST_API).\n\n# install\nFor [node](http://nodejs.org) install with [npm](http://npmjs.org):\n\n```\t\nnpm install bz --dev\n```\n\nand use with `var bz = require(\"bz\")`\n\nFor the browser, download the lastest [bz.js](http://github.com/harthur/bz.js/downloads). Or build a browser file from the source code with [browserbuild](https://github.com/LearnBoost/browserbuild): `browserbuild lib/bz.js`.\n\n# usage\n\n```javascript\nvar bugzilla = bz.createClient();\n\nbugzilla.getBug(678223, function(error, bug) {\n  if (!error) {\n    alert(bug.summary);\n  }\n});\n```\n\n# API\n`bz.createClient(options)`\ncreates a new Bugzilla API client, optionally takes options like the REST API url and username + password:\n\n```javascript\nvar bugzilla = bz.createClient({\n  url: \"https://api-dev.bugzilla.mozilla.org/test/0.9/\",\n  username: 'bugs@bugmail.com',\n  password: 'secret'\n});\n```\n\n### Client methods\nEach method takes a callback that takes an error message (if any kind of error occurs) as its first argument, and the expected return data as its second.\n\n`getBug(id, callback)`  \nretrieves a [bug](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug) given a bug id.\n\n`searchBugs(searchParams, callback)`  \nsearches with given [search parameters](https://wiki.mozilla.org/Bugzilla:REST_API:Search) and fetches an array of [bugs](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug).\n\n`countBugs(searchParams, callback)`  \nsearches with given [search parameters](https://wiki.mozilla.org/Bugzilla:REST_API:Search) and gets a integer count of bugs matching that query.\n\n`createBug(bug, callback)`  \ncreates a [bug](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug) and returns the id of the newly created bug.\n\n`updateBug(id, bug, callback)`  \nupdates a [bug](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug) with new bug info.\n\n`bugComments(id, callback)`  \nretrieves the [comments](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Comment) for a bug.\n\n`addComment(id, comment, callback)`  \nadds a [comment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Comment) to a bug.\n\n`bugHistory(id, callback)`  \nretrieves array of [changes](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#ChangeSet) for a bug.\n\n`bugFlags(id, callback)`  \nretrieves array of [flags](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Flag) for a bug.\n\n`bugAttachments(id, callback)`  \nretrieves array of [attachments](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment) for a bug.\n\n`createAttachment(bugId, attachment, callback)`  \ncreates an [attachment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment) on a bug, and returns the id of the newly created attachment.\n\n`getAttachment(attachId, callback)`  \ngets an [attachment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment) given an attachment id.\n\n`updateAttachment(attachId, attachment, callback)`  \nupdates the [attachment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment).\n\n`searchUsers(match, callback)`  \nsearches for [users](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#User) by string, matching against users' names or real names.\n \n`getUser(userId, callback)`  \nretrieves a [user](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#User) given a user id.\n\n`getConfiguration(options, callback)`  \ngets the [configuration](https://wiki.mozilla.org/Bugzilla:REST_API:Objects:Configuration) of this Bugzilla server.\n\n","maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]},"0.2.5":{"name":"bz","description":"Bugzilla REST API wrapper","version":"0.2.5","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"keywords":["bugzilla"],"repository":{"url":"git://github.com/harthur/bz.js.git","type":"git"},"main":"./lib/bz","dependencies":{"request":"1.9.x"},"devDependencies":{"connect":"*","browserify":">=1.0.0"},"id":"jid0-3MhY9xRVhRU80IsfUnZKLeIo5c0","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"_id":"bz@0.2.5","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"11098db1c013a4eb86db7179590daf6c37e9b2ea","tarball":"http://registry.npmjs.org/bz/-/bz-0.2.5.tgz"},"readme":"# bz.js\n\nA JavaScript wrapper for the [Bugzilla REST API](https://wiki.mozilla.org/Bugzilla:REST_API).\n\n# install\nFor [node](http://nodejs.org) install with [npm](http://npmjs.org):\n\n```\t\nnpm install bz\n```\n\nand use with `var bz = require(\"bz\")`\n\nFor the browser, download the lastest [bz.js](http://github.com/harthur/bz.js/downloads). Or build a browser file from the source code with [browserbuild](https://github.com/LearnBoost/browserbuild): `browserbuild lib/bz.js`.\n\n# usage\n\n```javascript\nvar bugzilla = bz.createClient();\n\nbugzilla.getBug(678223, function(error, bug) {\n  if (!error) {\n    alert(bug.summary);\n  }\n});\n```\n\n# API\n`bz.createClient(options)`\ncreates a new Bugzilla API client, optionally takes options like the REST API url and username + password:\n\n```javascript\nvar bugzilla = bz.createClient({\n  url: \"https://api-dev.bugzilla.mozilla.org/test/0.9/\",\n  username: 'bugs@bugmail.com',\n  password: 'secret'\n});\n```\n\n### Client methods\nEach method takes a callback that takes an error message (if any kind of error occurs) as its first argument, and the expected return data as its second.\n\n`getBug(id, callback)`  \nretrieves a [bug](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug) given a bug id.\n\n`searchBugs(searchParams, callback)`  \nsearches with given [search parameters](https://wiki.mozilla.org/Bugzilla:REST_API:Search) and fetches an array of [bugs](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug).\n\n`countBugs(searchParams, callback)`  \nsearches with given [search parameters](https://wiki.mozilla.org/Bugzilla:REST_API:Search) and gets a integer count of bugs matching that query.\n\n`createBug(bug, callback)`  \ncreates a [bug](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug) and returns the id of the newly created bug.\n\n`updateBug(id, bug, callback)`  \nupdates a [bug](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Bug) with new bug info.\n\n`bugComments(id, callback)`  \nretrieves the [comments](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Comment) for a bug.\n\n`addComment(id, comment, callback)`  \nadds a [comment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Comment) to a bug.\n\n`bugHistory(id, callback)`  \nretrieves array of [changes](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#ChangeSet) for a bug.\n\n`bugFlags(id, callback)`  \nretrieves array of [flags](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Flag) for a bug.\n\n`bugAttachments(id, callback)`  \nretrieves array of [attachments](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment) for a bug.\n\n`createAttachment(bugId, attachment, callback)`  \ncreates an [attachment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment) on a bug, and returns the id of the newly created attachment.\n\n`getAttachment(attachId, callback)`  \ngets an [attachment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment) given an attachment id.\n\n`updateAttachment(attachId, attachment, callback)`  \nupdates the [attachment](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#Attachment).\n\n`searchUsers(match, callback)`  \nsearches for [users](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#User) by string, matching against users' names or real names.\n \n`getUser(userId, callback)`  \nretrieves a [user](https://wiki.mozilla.org/Bugzilla:REST_API:Objects#User) given a user id.\n\n`getConfiguration(options, callback)`  \ngets the [configuration](https://wiki.mozilla.org/Bugzilla:REST_API:Objects:Configuration) of this Bugzilla server.\n\n","maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}]}},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}],"time":{"modified":"2012-03-10T01:14:48.017Z","created":"2011-04-01T22:19:59.005Z","0.1.0":"2011-04-01T22:19:59.299Z","0.2.0":"2011-04-07T07:01:16.510Z","0.2.2":"2011-09-01T21:39:56.739Z","0.2.3":"2011-12-22T05:51:45.103Z","0.2.4":"2012-03-07T05:00:53.194Z","0.2.5":"2012-03-10T01:14:48.017Z"},"author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"url":"git://github.com/harthur/bz.js.git","type":"git"},"_attachments":{"bz-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-7ME0sL8zLK3PTQu63hSofA==","length":34845,"stub":true},"bz-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":11,"digest":"md5-tjXQGKdzIyyic5MZ2vEfkA==","length":34838,"stub":true},"bz-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-oCJ6KRhi9zZjzdxwItOIAA==","length":40960,"stub":true},"bz-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-XEAPMx0QZ2So8xL/dfZKjA==","length":97772,"stub":true},"bz-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":5,"digest":"md5-Lg8jJV/EUP3BmdlqjpFGgw==","length":36535,"stub":true},"bz-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-NQ4bWDOU7LPAPnaxgx6nnw==","length":36573,"stub":true}}}},
{"id":"c","key":"c","value":{"rev":"3-d2c1e6bce815a3fb3649f1491198e115"},"doc":{"_id":"c","_rev":"3-d2c1e6bce815a3fb3649f1491198e115","name":"c","description":"Give folders or directories comments and view them easy.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"c","description":"Give folders or directories comments and view them easy.","version":"0.1.0","homepage":"https://github.com/rumpl/c","author":{"name":"rumpl","email":"lukic.djordje@gmail.com"},"repository":{"type":"git","url":"git://github.com/rumpl/c.git"},"bugs":{"url":"https://github.com/rumpl/c/issues"},"licenses":[{"type":"MIT","url":"https://github.com/rumpl/c/blob/master/LICENSE-MIT"}],"main":"bin/c","bin":{"c":"bin/c"},"engines":{"node":"~0.8.2"},"scripts":{"test":"grunt test"},"dependencies":{"colors":"0.6.0-1","underscore":"1.3.3","flatiron":"0.2.0"},"devDependencies":{"grunt":"~0.3.9"},"keywords":[],"readme":"# c\n\nGive folders or directories comments and view them easy.\n\nOriginal idea by [Jonovono](https://github.com/Jonovono/c)\n\n## Installation\nInstall the module with: `npm install c -g`\n\n## Examples\n\nRun it without any parameter to see the usage\n\n    help:\n    help:   c - Add comments to any file or directory.\n    help:\n    help:   Usage:\n    help:\n    help:        c list   [DIRECTORY]                 - Lists all the comments for the [DIRECTORY].\n    help:        c add    [FILE|DIRECTORY] [COMMENT]  - Adds a comment for the file/directory.\n    help:        c set    [FILE|DIRECTORY] [COMMENT]  - Sets a new comment for the file/directory.\n    help:        c delete [FILE|DIRECTORY]            - Deletes all the comments for the file/directory.\n    help:\n    help:   Author: Djordje Lukic <lukic.djordje@gmail.com>\n    help:   Stolen from Jonovono (https://github.com/Jonovono/c)\n\n\nList the comments\n\n    $ c l .\n\n    Comments for this directory:\n\n      .npmignore\n      bin\n\nAdd a comment to a folder/file\n\n    $ c add bin This is the bin folder\n    $ c list .\n\n    Comments for this directory:\n\n      .npmignore\n      bin               This is the bin folder\n\nRemove comments from a folder/file\n\n    $ c rm bin\n    $ c l .\n\n    Comments for this directory:\n\n      .npmignore\n      bin\n\n## TODO\n\nTests tests tests\n\n## License\n\nMIT: http://rumpl.mit-license.org\n","_id":"c@0.1.0","dist":{"shasum":"a2e2db043e43a1e5801612282c7d79976a09f592","tarball":"http://registry.npmjs.org/c/-/c-0.1.0.tgz"},"maintainers":[{"name":"rumpl","email":"lukic.djordje@gmail.com"}]}},"readme":"# c\n\nGive folders or directories comments and view them easy.\n\nOriginal idea by [Jonovono](https://github.com/Jonovono/c)\n\n## Installation\nInstall the module with: `npm install c -g`\n\n## Examples\n\nRun it without any parameter to see the usage\n\n    help:\n    help:   c - Add comments to any file or directory.\n    help:\n    help:   Usage:\n    help:\n    help:        c list   [DIRECTORY]                 - Lists all the comments for the [DIRECTORY].\n    help:        c add    [FILE|DIRECTORY] [COMMENT]  - Adds a comment for the file/directory.\n    help:        c set    [FILE|DIRECTORY] [COMMENT]  - Sets a new comment for the file/directory.\n    help:        c delete [FILE|DIRECTORY]            - Deletes all the comments for the file/directory.\n    help:\n    help:   Author: Djordje Lukic <lukic.djordje@gmail.com>\n    help:   Stolen from Jonovono (https://github.com/Jonovono/c)\n\n\nList the comments\n\n    $ c l .\n\n    Comments for this directory:\n\n      .npmignore\n      bin\n\nAdd a comment to a folder/file\n\n    $ c add bin This is the bin folder\n    $ c list .\n\n    Comments for this directory:\n\n      .npmignore\n      bin               This is the bin folder\n\nRemove comments from a folder/file\n\n    $ c rm bin\n    $ c l .\n\n    Comments for this directory:\n\n      .npmignore\n      bin\n\n## TODO\n\nTests tests tests\n\n## License\n\nMIT: http://rumpl.mit-license.org\n","maintainers":[{"name":"rumpl","email":"lukic.djordje@gmail.com"}],"time":{"modified":"2012-07-16T22:09:12.029Z","created":"2012-07-16T22:09:10.559Z","0.1.0":"2012-07-16T22:09:12.029Z"},"author":{"name":"rumpl","email":"lukic.djordje@gmail.com"},"repository":{"type":"git","url":"git://github.com/rumpl/c.git"},"_attachments":{"c-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":3,"digest":"md5-ecXmY04wwqscog/lxCCvIw==","length":4120,"stub":true}}}}
]}
